@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,96 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { runLiquidCheck } from '../../test';
|
|
3
|
-
import { ForbiddenTag, AppBlockValidTags } from './index';
|
|
4
|
-
|
|
5
|
-
const blocksFilePath = 'blocks/app.liquid';
|
|
6
|
-
|
|
7
|
-
describe('Module: AppBlockValidTags', () => {
|
|
8
|
-
it('should report an offense when the forbidden tag is used in blocks directory liquid file', async () => {
|
|
9
|
-
const tags = ['include', 'layout', 'section', 'sections'];
|
|
10
|
-
for (const tag of tags) {
|
|
11
|
-
const sourceCode = `
|
|
12
|
-
{% ${tag} 'test' %}
|
|
13
|
-
{% schema %}
|
|
14
|
-
{ }
|
|
15
|
-
{% endschema %}
|
|
16
|
-
`;
|
|
17
|
-
|
|
18
|
-
const offenses = await runLiquidCheck(AppBlockValidTags, sourceCode, blocksFilePath);
|
|
19
|
-
|
|
20
|
-
const expectedStart = {
|
|
21
|
-
index: 9,
|
|
22
|
-
line: 1,
|
|
23
|
-
character: 8,
|
|
24
|
-
};
|
|
25
|
-
const tagEndOffset = 13;
|
|
26
|
-
const endOffset = tag.length + tagEndOffset;
|
|
27
|
-
|
|
28
|
-
const expectedEnd = {
|
|
29
|
-
index: expectedStart.index + endOffset,
|
|
30
|
-
line: expectedStart.line,
|
|
31
|
-
character: expectedStart.character + endOffset,
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
expect(offenses).to.have.length(1);
|
|
35
|
-
expect(offenses).to.containOffense({
|
|
36
|
-
check: AppBlockValidTags.meta.code,
|
|
37
|
-
message: `Theme app extension blocks cannot contain '${tag}' tags`,
|
|
38
|
-
uri: 'file:///blocks/app.liquid',
|
|
39
|
-
severity: 0,
|
|
40
|
-
start: expectedStart,
|
|
41
|
-
end: expectedEnd,
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should report an offense when the forbidden tag is used with an end tag in blocks directory liquid file', async () => {
|
|
47
|
-
const tags = ['javascript', 'stylesheet'];
|
|
48
|
-
for (const tag of tags) {
|
|
49
|
-
const sourceCode = `
|
|
50
|
-
{% ${tag} %}
|
|
51
|
-
{% end${tag} %}
|
|
52
|
-
{% schema %}
|
|
53
|
-
{ }
|
|
54
|
-
{% endschema %}
|
|
55
|
-
`;
|
|
56
|
-
|
|
57
|
-
const offenses = await runLiquidCheck(AppBlockValidTags, sourceCode, blocksFilePath);
|
|
58
|
-
|
|
59
|
-
const expectedStart = {
|
|
60
|
-
index: 9,
|
|
61
|
-
line: 1,
|
|
62
|
-
character: 8,
|
|
63
|
-
};
|
|
64
|
-
const expectedEnd = {
|
|
65
|
-
index: expectedStart.index + tag.length + 34,
|
|
66
|
-
line: 2,
|
|
67
|
-
character: expectedStart.character + tag.length + 9,
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
expect(offenses).to.have.length(1);
|
|
71
|
-
expect(offenses).to.containOffense({
|
|
72
|
-
check: AppBlockValidTags.meta.code,
|
|
73
|
-
message: `Theme app extension blocks cannot contain '${tag}' tags`,
|
|
74
|
-
uri: 'file:///blocks/app.liquid',
|
|
75
|
-
severity: 0,
|
|
76
|
-
start: expectedStart,
|
|
77
|
-
end: expectedEnd,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it('should contain specifically the following forbidden tags', async () => {
|
|
83
|
-
const actualTagValues = Object.values(ForbiddenTag);
|
|
84
|
-
const expectedTagValues = [
|
|
85
|
-
'javascript',
|
|
86
|
-
'stylesheet',
|
|
87
|
-
'include',
|
|
88
|
-
'layout',
|
|
89
|
-
'section',
|
|
90
|
-
'sections',
|
|
91
|
-
];
|
|
92
|
-
|
|
93
|
-
expectedTagValues.forEach((tag) => expect(actualTagValues).toContain(tag));
|
|
94
|
-
expect(actualTagValues.length).toBe(expectedTagValues.length);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { LiquidRawTag, LiquidTag } from '@platformos/liquid-html-parser';
|
|
2
|
-
import { ConfigTarget, LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
|
|
3
|
-
|
|
4
|
-
export enum ForbiddenTag {
|
|
5
|
-
JavaScript = 'javascript',
|
|
6
|
-
StyleSheet = 'stylesheet',
|
|
7
|
-
Include = 'include',
|
|
8
|
-
Layout = 'layout',
|
|
9
|
-
Section = 'section',
|
|
10
|
-
Sections = 'sections',
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const isForbiddenTag = (value: string): value is ForbiddenTag => {
|
|
14
|
-
return Object.values(ForbiddenTag).includes(value as ForbiddenTag);
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const buildErrorMessage = (tag: ForbiddenTag) =>
|
|
18
|
-
`Theme app extension blocks cannot contain '${tag}' tags`;
|
|
19
|
-
|
|
20
|
-
export const AppBlockValidTags: LiquidCheckDefinition = {
|
|
21
|
-
meta: {
|
|
22
|
-
code: 'AppBlockValidTags',
|
|
23
|
-
name: 'App Block Valid Tags',
|
|
24
|
-
docs: {
|
|
25
|
-
description:
|
|
26
|
-
'Identifies forbidden Liquid tags in theme app extension app block and app embed block code.',
|
|
27
|
-
url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/app-block-valid-tags',
|
|
28
|
-
recommended: false,
|
|
29
|
-
},
|
|
30
|
-
type: SourceCodeType.LiquidHtml,
|
|
31
|
-
severity: Severity.ERROR,
|
|
32
|
-
schema: {},
|
|
33
|
-
targets: [ConfigTarget.ThemeAppExtension],
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
create(context) {
|
|
37
|
-
const handleForbiddenTags = async (node: LiquidTag | LiquidRawTag) => {
|
|
38
|
-
if (isForbiddenTag(node.name)) {
|
|
39
|
-
// When a forbidden tag is used to define a block section
|
|
40
|
-
// with an end tag, highlight the whole section
|
|
41
|
-
const endIndex = node.blockEndPosition ? node.blockEndPosition.end : node.position.end;
|
|
42
|
-
const startIndex = node.blockStartPosition.start;
|
|
43
|
-
const message = buildErrorMessage(node.name);
|
|
44
|
-
|
|
45
|
-
return context.report({ message, startIndex, endIndex });
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
LiquidRawTag: handleForbiddenTags,
|
|
51
|
-
LiquidTag: handleForbiddenTags,
|
|
52
|
-
};
|
|
53
|
-
},
|
|
54
|
-
};
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { runLiquidCheck, highlightedOffenses } from '../../test';
|
|
3
|
-
import { AssetPreload } from './index';
|
|
4
|
-
|
|
5
|
-
describe('Module: AssetPreload', () => {
|
|
6
|
-
it('no offense with link element', async () => {
|
|
7
|
-
const sourceCode = `
|
|
8
|
-
<link href="a.css" rel="stylesheet">
|
|
9
|
-
<link href="b.com" rel="preconnect">
|
|
10
|
-
`;
|
|
11
|
-
|
|
12
|
-
const offenses = await runLiquidCheck(AssetPreload, sourceCode);
|
|
13
|
-
expect(offenses).to.have.lengthOf(0);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('reports stylesheet preloading', async () => {
|
|
17
|
-
const sourceCode = `
|
|
18
|
-
<link href="a.css" rel="preload" as="style">
|
|
19
|
-
`;
|
|
20
|
-
|
|
21
|
-
const offenses = await runLiquidCheck(AssetPreload, sourceCode);
|
|
22
|
-
expect(offenses).to.have.lengthOf(1);
|
|
23
|
-
expect(offenses[0].message).to.equal(
|
|
24
|
-
'For better performance, prefer using the preload argument of the stylesheet_tag filter',
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
|
|
28
|
-
expect(highlights).to.eql([`<link href="a.css" rel="preload" as="style">`]);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('reports image preloading', async () => {
|
|
32
|
-
const sourceCode = `
|
|
33
|
-
<link href="a.png" rel="preload" as="image">
|
|
34
|
-
`;
|
|
35
|
-
|
|
36
|
-
const offenses = await runLiquidCheck(AssetPreload, sourceCode);
|
|
37
|
-
expect(offenses).to.have.lengthOf(1);
|
|
38
|
-
expect(offenses[0].message).to.equal(
|
|
39
|
-
'For better performance, prefer using the preload argument of the image_tag filter',
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
|
|
43
|
-
expect(highlights).to.eql([`<link href="a.png" rel="preload" as="image">`]);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('reports general preloading', async () => {
|
|
47
|
-
const sourceCode = `
|
|
48
|
-
<link href="a.js" rel="preload" as="script">
|
|
49
|
-
`;
|
|
50
|
-
|
|
51
|
-
const offenses = await runLiquidCheck(AssetPreload, sourceCode);
|
|
52
|
-
expect(offenses).to.have.lengthOf(1);
|
|
53
|
-
expect(offenses[0].message).to.equal(
|
|
54
|
-
'For better performance, prefer using the preload_tag filter',
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
|
|
58
|
-
expect(highlights).to.eql([`<link href="a.js" rel="preload" as="script">`]);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('should report offenses for manual preloading of assets', async () => {
|
|
62
|
-
const sourceCode = `
|
|
63
|
-
<link href="{{ 'script.js' | asset_url }}" rel="preload" as="script">
|
|
64
|
-
<link href="{{ 'style.css' | asset_url }}" rel="preload" as="style">
|
|
65
|
-
<link href="{{ 'image.png' | asset_url }}" rel="preload" as="image">
|
|
66
|
-
`;
|
|
67
|
-
|
|
68
|
-
const offenses = await runLiquidCheck(AssetPreload, sourceCode);
|
|
69
|
-
expect(offenses).to.have.lengthOf(3);
|
|
70
|
-
|
|
71
|
-
const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
|
|
72
|
-
expect(highlights).to.eql([
|
|
73
|
-
`<link href="{{ 'script.js' | asset_url }}" rel="preload" as="script">`,
|
|
74
|
-
`<link href="{{ 'style.css' | asset_url }}" rel="preload" as="style">`,
|
|
75
|
-
`<link href="{{ 'image.png' | asset_url }}" rel="preload" as="image">`,
|
|
76
|
-
]);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { NodeTypes, TextNode } from '@platformos/liquid-html-parser';
|
|
2
|
-
import { LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
|
|
3
|
-
import { ValuedHtmlAttribute, isAttr, isNodeOfType, isValuedHtmlAttribute } from '../utils';
|
|
4
|
-
|
|
5
|
-
function isPreload(attr: ValuedHtmlAttribute): boolean {
|
|
6
|
-
return (
|
|
7
|
-
isAttr(attr, 'rel') &&
|
|
8
|
-
attr.value.some((node) => node.type === NodeTypes.TextNode && node.value === 'preload')
|
|
9
|
-
);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export const AssetPreload: LiquidCheckDefinition = {
|
|
13
|
-
meta: {
|
|
14
|
-
code: 'AssetPreload',
|
|
15
|
-
name: 'Prevent Manual Preloading of Assets',
|
|
16
|
-
docs: {
|
|
17
|
-
description:
|
|
18
|
-
'This check is aimed at discouraging the manual preloading of assets and encourages the use of appropriate Shopify filters.',
|
|
19
|
-
url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/asset-preload',
|
|
20
|
-
recommended: true,
|
|
21
|
-
},
|
|
22
|
-
type: SourceCodeType.LiquidHtml,
|
|
23
|
-
severity: Severity.WARNING,
|
|
24
|
-
schema: {},
|
|
25
|
-
targets: [],
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
create(context) {
|
|
29
|
-
return {
|
|
30
|
-
async HtmlVoidElement(node) {
|
|
31
|
-
const preloadLinkAttr = node.attributes.find(
|
|
32
|
-
(attr) => isValuedHtmlAttribute(attr) && isPreload(attr),
|
|
33
|
-
) as ValuedHtmlAttribute | undefined;
|
|
34
|
-
|
|
35
|
-
if (node.name === 'link' && preloadLinkAttr) {
|
|
36
|
-
const asAttr: ValuedHtmlAttribute | undefined = node.attributes
|
|
37
|
-
.filter(isValuedHtmlAttribute)
|
|
38
|
-
.find((attr) => isAttr(attr, 'as'));
|
|
39
|
-
|
|
40
|
-
const assetType = asAttr?.value.find((node): node is TextNode =>
|
|
41
|
-
isNodeOfType(NodeTypes.TextNode, node),
|
|
42
|
-
)?.value;
|
|
43
|
-
|
|
44
|
-
let message = '';
|
|
45
|
-
|
|
46
|
-
if (assetType === 'style') {
|
|
47
|
-
message =
|
|
48
|
-
'For better performance, prefer using the preload argument of the stylesheet_tag filter';
|
|
49
|
-
} else if (assetType === 'image') {
|
|
50
|
-
message =
|
|
51
|
-
'For better performance, prefer using the preload argument of the image_tag filter';
|
|
52
|
-
} else {
|
|
53
|
-
message = 'For better performance, prefer using the preload_tag filter';
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
context.report({
|
|
57
|
-
message,
|
|
58
|
-
startIndex: node.position.start,
|
|
59
|
-
endIndex: node.position.end,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
},
|
|
65
|
-
};
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { AssetSizeAppBlockCSS } from '.';
|
|
3
|
-
import { check, MockTheme } from '../../test';
|
|
4
|
-
|
|
5
|
-
describe('Module: AssetSizeAppBlockCSS', () => {
|
|
6
|
-
const extensionFiles: MockTheme = {
|
|
7
|
-
'assets/app.css': '* { color: green } ',
|
|
8
|
-
'blocks/app.liquid': `
|
|
9
|
-
{% schema %}
|
|
10
|
-
{
|
|
11
|
-
"stylesheet": "app.css"
|
|
12
|
-
}
|
|
13
|
-
{% endschema %}
|
|
14
|
-
`,
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
it('should not report any offenses if CSS is smaller than threshold', async () => {
|
|
18
|
-
const offenses = await check(extensionFiles, [AssetSizeAppBlockCSS]);
|
|
19
|
-
|
|
20
|
-
expect(offenses).toHaveLength(0);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('should report an offense if CSS is larger than threshold', async () => {
|
|
24
|
-
const offenses = await check(
|
|
25
|
-
extensionFiles,
|
|
26
|
-
[AssetSizeAppBlockCSS],
|
|
27
|
-
{},
|
|
28
|
-
{
|
|
29
|
-
AssetSizeAppBlockCSS: {
|
|
30
|
-
enabled: true,
|
|
31
|
-
thresholdInBytes: 1,
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
expect(offenses).toHaveLength(1);
|
|
37
|
-
expect(offenses[0]).toMatchObject({
|
|
38
|
-
message: `The file size for 'app.css' (19 B) exceeds the configured threshold (1 B)`,
|
|
39
|
-
uri: 'file:///blocks/app.liquid',
|
|
40
|
-
start: { index: 51 },
|
|
41
|
-
end: { index: 58 },
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('should report an offense if the CSS file does not exist', async () => {
|
|
46
|
-
const extensionFiles: MockTheme = {
|
|
47
|
-
'blocks/app.liquid': `
|
|
48
|
-
{% schema %}
|
|
49
|
-
{
|
|
50
|
-
"stylesheet": "nonexistent.css"
|
|
51
|
-
}
|
|
52
|
-
{% endschema %}
|
|
53
|
-
`,
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const offenses = await check(extensionFiles, [AssetSizeAppBlockCSS]);
|
|
57
|
-
|
|
58
|
-
expect(offenses).toHaveLength(1);
|
|
59
|
-
expect(offenses[0]).toMatchObject({
|
|
60
|
-
message: `'nonexistent.css' does not exist.`,
|
|
61
|
-
uri: 'file:///blocks/app.liquid',
|
|
62
|
-
start: { index: 57 },
|
|
63
|
-
end: { index: 72 },
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('should reports offense if the CSS file does not exist and the asset has a trailing comma', async () => {
|
|
68
|
-
const extensionFiles: MockTheme = {
|
|
69
|
-
'blocks/app.liquid': `
|
|
70
|
-
{% schema %}
|
|
71
|
-
{
|
|
72
|
-
"stylesheet": "nonexistent.css",
|
|
73
|
-
}
|
|
74
|
-
{% endschema %}
|
|
75
|
-
`,
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const offenses = await check(extensionFiles, [AssetSizeAppBlockCSS]);
|
|
79
|
-
|
|
80
|
-
expect(offenses).toHaveLength(1);
|
|
81
|
-
expect(offenses[0]).toMatchObject({
|
|
82
|
-
message: `'nonexistent.css' does not exist.`,
|
|
83
|
-
uri: 'file:///blocks/app.liquid',
|
|
84
|
-
start: { index: 57 },
|
|
85
|
-
end: { index: 72 },
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
});
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { parseJSON } from '../../json';
|
|
2
|
-
import {
|
|
3
|
-
ConfigTarget,
|
|
4
|
-
LiquidCheckDefinition,
|
|
5
|
-
SchemaProp,
|
|
6
|
-
Severity,
|
|
7
|
-
SourceCodeType,
|
|
8
|
-
} from '../../types';
|
|
9
|
-
import { isError } from '../../utils';
|
|
10
|
-
import { doesFileExceedThreshold, doesFileExist } from '../../utils/file-utils';
|
|
11
|
-
|
|
12
|
-
const schema = {
|
|
13
|
-
thresholdInBytes: SchemaProp.number(100000),
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export const AssetSizeAppBlockCSS: LiquidCheckDefinition<typeof schema> = {
|
|
17
|
-
meta: {
|
|
18
|
-
code: 'AssetSizeAppBlockCSS',
|
|
19
|
-
name: 'Asset Size App Block CSS',
|
|
20
|
-
docs: {
|
|
21
|
-
description:
|
|
22
|
-
'This check is aimed at preventing large CSS bundles from being included via Theme App Extensions.',
|
|
23
|
-
url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/asset-size-app-block-css',
|
|
24
|
-
recommended: true,
|
|
25
|
-
},
|
|
26
|
-
type: SourceCodeType.LiquidHtml,
|
|
27
|
-
severity: Severity.ERROR,
|
|
28
|
-
schema,
|
|
29
|
-
targets: [ConfigTarget.ThemeAppExtension],
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
create(context) {
|
|
33
|
-
if (!context.fileSize) {
|
|
34
|
-
return {};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return {
|
|
38
|
-
async LiquidRawTag(node) {
|
|
39
|
-
if (node.name !== 'schema') return;
|
|
40
|
-
const schema = parseJSON(node.body.value);
|
|
41
|
-
if (isError(schema)) return;
|
|
42
|
-
const stylesheet = schema.stylesheet;
|
|
43
|
-
if (!stylesheet) return;
|
|
44
|
-
|
|
45
|
-
const relativePath = `assets/${stylesheet}`;
|
|
46
|
-
const thresholdInBytes = context.settings.thresholdInBytes;
|
|
47
|
-
|
|
48
|
-
const startIndex = node.body.position.start + node.body.value.indexOf(stylesheet);
|
|
49
|
-
const endIndex = startIndex + stylesheet.length;
|
|
50
|
-
|
|
51
|
-
const fileExists = await doesFileExist(context, relativePath);
|
|
52
|
-
|
|
53
|
-
if (!fileExists) {
|
|
54
|
-
context.report({
|
|
55
|
-
message: `'${stylesheet}' does not exist.`,
|
|
56
|
-
startIndex: startIndex,
|
|
57
|
-
endIndex: endIndex,
|
|
58
|
-
});
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const [fileExceedsThreshold, fileSize] = await doesFileExceedThreshold(
|
|
63
|
-
context,
|
|
64
|
-
relativePath,
|
|
65
|
-
thresholdInBytes,
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
if (fileExceedsThreshold) {
|
|
69
|
-
context.report({
|
|
70
|
-
message: `The file size for '${stylesheet}' (${fileSize} B) exceeds the configured threshold (${thresholdInBytes} B)`,
|
|
71
|
-
startIndex: startIndex,
|
|
72
|
-
endIndex: endIndex,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
},
|
|
78
|
-
};
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { AssetSizeAppBlockJavaScript } from '.';
|
|
3
|
-
import { check, MockTheme } from '../../test';
|
|
4
|
-
|
|
5
|
-
describe('Module: AssetSizeAppBlockJavaScript', () => {
|
|
6
|
-
const extensionFiles: MockTheme = {
|
|
7
|
-
'assets/app.js': 'console.log("Hello, world!");',
|
|
8
|
-
'blocks/app.liquid': `
|
|
9
|
-
{% schema %}
|
|
10
|
-
{
|
|
11
|
-
"javascript": "app.js"
|
|
12
|
-
}
|
|
13
|
-
{% endschema %}
|
|
14
|
-
`,
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
it('should not report any offenses if JavaScript is smaller than threshold', async () => {
|
|
18
|
-
const offenses = await check(extensionFiles, [AssetSizeAppBlockJavaScript]);
|
|
19
|
-
|
|
20
|
-
expect(offenses).toHaveLength(0);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('should report an offense if JavaScript is larger than threshold', async () => {
|
|
24
|
-
const offenses = await check(
|
|
25
|
-
extensionFiles,
|
|
26
|
-
[AssetSizeAppBlockJavaScript],
|
|
27
|
-
{},
|
|
28
|
-
{
|
|
29
|
-
AssetSizeAppBlockJavaScript: {
|
|
30
|
-
enabled: true,
|
|
31
|
-
thresholdInBytes: 1,
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
expect(offenses).toHaveLength(1);
|
|
37
|
-
expect(offenses[0]).toMatchObject({
|
|
38
|
-
message: `The file size for 'app.js' (29 B) exceeds the configured threshold (1 B)`,
|
|
39
|
-
uri: 'file:///blocks/app.liquid',
|
|
40
|
-
start: { index: 51 },
|
|
41
|
-
end: { index: 57 },
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('should report an offense if the JavaScript file does not exist', async () => {
|
|
46
|
-
const extensionFiles: MockTheme = {
|
|
47
|
-
'blocks/app.liquid': `
|
|
48
|
-
{% schema %}
|
|
49
|
-
{
|
|
50
|
-
"javascript": "nonexistent.js"
|
|
51
|
-
}
|
|
52
|
-
{% endschema %}
|
|
53
|
-
`,
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const offenses = await check(extensionFiles, [AssetSizeAppBlockJavaScript]);
|
|
57
|
-
|
|
58
|
-
expect(offenses).toHaveLength(1);
|
|
59
|
-
expect(offenses[0]).toMatchObject({
|
|
60
|
-
message: `'nonexistent.js' does not exist.`,
|
|
61
|
-
uri: 'file:///blocks/app.liquid',
|
|
62
|
-
start: { index: 57 },
|
|
63
|
-
end: { index: 71 },
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
});
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { parseJSON } from '../../json';
|
|
2
|
-
import {
|
|
3
|
-
ConfigTarget,
|
|
4
|
-
LiquidCheckDefinition,
|
|
5
|
-
SchemaProp,
|
|
6
|
-
Severity,
|
|
7
|
-
SourceCodeType,
|
|
8
|
-
} from '../../types';
|
|
9
|
-
import { isError } from '../../utils';
|
|
10
|
-
import { doesFileExist, doesFileExceedThreshold } from '../../utils/file-utils';
|
|
11
|
-
|
|
12
|
-
const schema = {
|
|
13
|
-
thresholdInBytes: SchemaProp.number(10000),
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export const AssetSizeAppBlockJavaScript: LiquidCheckDefinition<typeof schema> = {
|
|
17
|
-
meta: {
|
|
18
|
-
code: 'AssetSizeAppBlockJavaScript',
|
|
19
|
-
name: 'Asset Size App Block JavaScript',
|
|
20
|
-
docs: {
|
|
21
|
-
description:
|
|
22
|
-
'This check is aimed at preventing large JavaScript bundles from being included via Theme App Extensions.',
|
|
23
|
-
url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/asset-size-app-block-javascript',
|
|
24
|
-
recommended: true,
|
|
25
|
-
},
|
|
26
|
-
type: SourceCodeType.LiquidHtml,
|
|
27
|
-
severity: Severity.ERROR,
|
|
28
|
-
schema,
|
|
29
|
-
targets: [ConfigTarget.ThemeAppExtension],
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
create(context) {
|
|
33
|
-
if (!context.fileSize) {
|
|
34
|
-
return {};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return {
|
|
38
|
-
async LiquidRawTag(node) {
|
|
39
|
-
if (node.name !== 'schema') return;
|
|
40
|
-
const schema = parseJSON(node.body.value);
|
|
41
|
-
if (isError(schema)) return;
|
|
42
|
-
const javascript = schema.javascript;
|
|
43
|
-
if (!javascript) return;
|
|
44
|
-
|
|
45
|
-
const relativePath = `assets/${javascript}`;
|
|
46
|
-
const thresholdInBytes = context.settings.thresholdInBytes;
|
|
47
|
-
|
|
48
|
-
const startIndex = node.body.position.start + node.body.value.indexOf(javascript);
|
|
49
|
-
const endIndex = startIndex + javascript.length;
|
|
50
|
-
|
|
51
|
-
const fileExists = await doesFileExist(context, relativePath);
|
|
52
|
-
|
|
53
|
-
if (!fileExists) {
|
|
54
|
-
context.report({
|
|
55
|
-
message: `'${javascript}' does not exist.`,
|
|
56
|
-
startIndex: startIndex,
|
|
57
|
-
endIndex: endIndex,
|
|
58
|
-
});
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const [fileExceedsThreshold, fileSize] = await doesFileExceedThreshold(
|
|
63
|
-
context,
|
|
64
|
-
relativePath,
|
|
65
|
-
thresholdInBytes,
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
if (fileExceedsThreshold) {
|
|
69
|
-
context.report({
|
|
70
|
-
message: `The file size for '${javascript}' (${fileSize} B) exceeds the configured threshold (${thresholdInBytes} B)`,
|
|
71
|
-
startIndex: startIndex,
|
|
72
|
-
endIndex: endIndex,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
},
|
|
78
|
-
};
|