@platformos/platformos-check-common 0.0.6 → 0.0.8

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.
Files changed (304) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/AugmentedPlatformOSDocset.d.ts +11 -0
  3. package/dist/AugmentedPlatformOSDocset.js +81 -0
  4. package/dist/AugmentedPlatformOSDocset.js.map +1 -0
  5. package/dist/JSONValidator.js +1 -1
  6. package/dist/JSONValidator.js.map +1 -1
  7. package/dist/checks/deprecated-filter/index.js +4 -41
  8. package/dist/checks/deprecated-filter/index.js.map +1 -1
  9. package/dist/checks/deprecated-tag/index.js +21 -22
  10. package/dist/checks/deprecated-tag/index.js.map +1 -1
  11. package/dist/checks/duplicate-function-arguments/index.js +1 -1
  12. package/dist/checks/duplicate-function-arguments/index.js.map +1 -1
  13. package/dist/checks/duplicate-render-partial-arguments/index.js +1 -1
  14. package/dist/checks/duplicate-render-partial-arguments/index.js.map +1 -1
  15. package/dist/checks/graphql/index.js +1 -1
  16. package/dist/checks/graphql/index.js.map +1 -1
  17. package/dist/checks/img-width-and-height/index.js +1 -1
  18. package/dist/checks/img-width-and-height/index.js.map +1 -1
  19. package/dist/checks/index.d.ts +3 -3
  20. package/dist/checks/index.js +4 -79
  21. package/dist/checks/index.js.map +1 -1
  22. package/dist/checks/json-syntax-error/index.js +1 -1
  23. package/dist/checks/json-syntax-error/index.js.map +1 -1
  24. package/dist/checks/liquid-html-syntax-error/index.js +2 -2
  25. package/dist/checks/liquid-html-syntax-error/index.js.map +1 -1
  26. package/dist/checks/matching-translations/index.d.ts +2 -2
  27. package/dist/checks/matching-translations/index.js +20 -31
  28. package/dist/checks/matching-translations/index.js.map +1 -1
  29. package/dist/checks/metadata-params/index.js +6 -3
  30. package/dist/checks/metadata-params/index.js.map +1 -1
  31. package/dist/checks/missing-asset/index.js +1 -1
  32. package/dist/checks/missing-asset/index.js.map +1 -1
  33. package/dist/checks/missing-partial/index.d.ts +6 -0
  34. package/dist/checks/missing-partial/index.js +70 -0
  35. package/dist/checks/missing-partial/index.js.map +1 -0
  36. package/dist/checks/orphaned-partial/index.js +4 -4
  37. package/dist/checks/orphaned-partial/index.js.map +1 -1
  38. package/dist/checks/parser-blocking-script/index.js +10 -36
  39. package/dist/checks/parser-blocking-script/index.js.map +1 -1
  40. package/dist/checks/parser-blocking-script/suggestions.d.ts +1 -2
  41. package/dist/checks/parser-blocking-script/suggestions.js +1 -11
  42. package/dist/checks/parser-blocking-script/suggestions.js.map +1 -1
  43. package/dist/checks/reserved-doc-param-names/index.js +6 -5
  44. package/dist/checks/reserved-doc-param-names/index.js.map +1 -1
  45. package/dist/checks/translation-key-exists/index.js +1 -1
  46. package/dist/checks/translation-key-exists/index.js.map +1 -1
  47. package/dist/checks/unclosed-html-element/index.js +5 -1
  48. package/dist/checks/unclosed-html-element/index.js.map +1 -1
  49. package/dist/checks/undefined-object/index.js +7 -30
  50. package/dist/checks/undefined-object/index.js.map +1 -1
  51. package/dist/checks/unique-doc-param-names/index.js +1 -1
  52. package/dist/checks/unique-doc-param-names/index.js.map +1 -1
  53. package/dist/checks/unknown-filter/index.js +3 -3
  54. package/dist/checks/unknown-filter/index.js.map +1 -1
  55. package/dist/checks/unknown-property/index.js +1 -1
  56. package/dist/checks/unknown-property/index.js.map +1 -1
  57. package/dist/checks/unrecognized-render-partial-arguments/index.js +2 -2
  58. package/dist/checks/unrecognized-render-partial-arguments/index.js.map +1 -1
  59. package/dist/checks/unused-assign/index.js +1 -1
  60. package/dist/checks/unused-assign/index.js.map +1 -1
  61. package/dist/checks/unused-doc-param/index.js +1 -1
  62. package/dist/checks/unused-doc-param/index.js.map +1 -1
  63. package/dist/checks/utils.js +1 -1
  64. package/dist/checks/utils.js.map +1 -1
  65. package/dist/checks/valid-content-for-arguments/index.js +1 -1
  66. package/dist/checks/valid-content-for-arguments/index.js.map +1 -1
  67. package/dist/checks/valid-doc-param-types/index.js +4 -4
  68. package/dist/checks/valid-doc-param-types/index.js.map +1 -1
  69. package/dist/checks/valid-html-translation/index.d.ts +2 -2
  70. package/dist/checks/valid-html-translation/index.js +4 -4
  71. package/dist/checks/valid-html-translation/index.js.map +1 -1
  72. package/dist/checks/valid-json/index.js +1 -1
  73. package/dist/checks/valid-json/index.js.map +1 -1
  74. package/dist/checks/valid-render-partial-argument-types/index.js +2 -2
  75. package/dist/checks/valid-render-partial-argument-types/index.js.map +1 -1
  76. package/dist/checks/variable-name/index.js +1 -1
  77. package/dist/checks/variable-name/index.js.map +1 -1
  78. package/dist/context-utils.d.ts +2 -7
  79. package/dist/context-utils.js +39 -109
  80. package/dist/context-utils.js.map +1 -1
  81. package/dist/disabled-checks/index.js +4 -2
  82. package/dist/disabled-checks/index.js.map +1 -1
  83. package/dist/find-root.d.ts +7 -10
  84. package/dist/find-root.js +10 -17
  85. package/dist/find-root.js.map +1 -1
  86. package/dist/fixes/autofix.d.ts +4 -4
  87. package/dist/fixes/autofix.js +2 -2
  88. package/dist/fixes/autofix.js.map +1 -1
  89. package/dist/fixes/correctors/index.js +4 -0
  90. package/dist/fixes/correctors/index.js.map +1 -1
  91. package/dist/index.d.ts +4 -5
  92. package/dist/index.js +34 -17
  93. package/dist/index.js.map +1 -1
  94. package/dist/jsonc/parse.d.ts +1 -1
  95. package/dist/jsonc/parse.js +1 -1
  96. package/dist/liquid-doc/arguments.d.ts +7 -8
  97. package/dist/liquid-doc/arguments.js +20 -28
  98. package/dist/liquid-doc/arguments.js.map +1 -1
  99. package/dist/liquid-doc/liquidDoc.d.ts +1 -1
  100. package/dist/liquid-doc/liquidDoc.js.map +1 -1
  101. package/dist/liquid-doc/utils.d.ts +1 -1
  102. package/dist/liquid-doc/utils.js +4 -3
  103. package/dist/liquid-doc/utils.js.map +1 -1
  104. package/dist/path.d.ts +1 -0
  105. package/dist/path.js +5 -1
  106. package/dist/path.js.map +1 -1
  107. package/dist/test/MockApp.d.ts +16 -0
  108. package/dist/test/MockApp.js +16 -0
  109. package/dist/test/MockApp.js.map +1 -0
  110. package/dist/test/MockFileSystem.d.ts +3 -3
  111. package/dist/test/MockFileSystem.js +6 -6
  112. package/dist/test/MockFileSystem.js.map +1 -1
  113. package/dist/test/index.d.ts +1 -1
  114. package/dist/test/index.js +1 -1
  115. package/dist/test/index.js.map +1 -1
  116. package/dist/test/test-helper.d.ts +10 -9
  117. package/dist/test/test-helper.js +15 -106
  118. package/dist/test/test-helper.js.map +1 -1
  119. package/dist/to-source-code.d.ts +4 -3
  120. package/dist/to-source-code.js +20 -0
  121. package/dist/to-source-code.js.map +1 -1
  122. package/dist/tsconfig.tsbuildinfo +1 -1
  123. package/dist/types/platformos-liquid-docs.d.ts +128 -0
  124. package/dist/types/platformos-liquid-docs.js +3 -0
  125. package/dist/types/platformos-liquid-docs.js.map +1 -0
  126. package/dist/types/schemas/index.d.ts +0 -2
  127. package/dist/types/schemas/index.js.map +1 -1
  128. package/dist/types.d.ts +18 -67
  129. package/dist/types.js +3 -5
  130. package/dist/types.js.map +1 -1
  131. package/dist/utils/file-utils.js +1 -2
  132. package/dist/utils/file-utils.js.map +1 -1
  133. package/dist/utils/index.d.ts +0 -1
  134. package/dist/utils/index.js +0 -1
  135. package/dist/utils/index.js.map +1 -1
  136. package/dist/yaml/parse.d.ts +5 -0
  137. package/dist/yaml/parse.js +94 -0
  138. package/dist/yaml/parse.js.map +1 -0
  139. package/package.json +9 -9
  140. package/src/{AugmentedThemeDocset.spec.ts → AugmentedPlatformOSDocset.spec.ts} +47 -34
  141. package/src/AugmentedPlatformOSDocset.ts +89 -0
  142. package/src/JSONValidator.ts +1 -1
  143. package/src/checks/deprecated-filter/index.spec.ts +76 -248
  144. package/src/checks/deprecated-filter/index.ts +5 -53
  145. package/src/checks/deprecated-tag/index.spec.ts +85 -34
  146. package/src/checks/deprecated-tag/index.ts +27 -22
  147. package/src/checks/duplicate-function-arguments/index.ts +1 -1
  148. package/src/checks/duplicate-render-partial-arguments/index.ts +1 -1
  149. package/src/checks/graphql/index.ts +1 -1
  150. package/src/checks/img-width-and-height/index.ts +1 -1
  151. package/src/checks/index.ts +11 -80
  152. package/src/checks/invalid-hash-assign-target/index.spec.ts +14 -14
  153. package/src/checks/json-syntax-error/index.ts +1 -1
  154. package/src/checks/liquid-html-syntax-error/checks/InvalidBooleanExpression.spec.ts +0 -11
  155. package/src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.spec.ts +1 -2
  156. package/src/checks/liquid-html-syntax-error/index.spec.ts +1 -6
  157. package/src/checks/liquid-html-syntax-error/index.ts +2 -2
  158. package/src/checks/matching-translations/index.spec.ts +89 -346
  159. package/src/checks/matching-translations/index.ts +24 -35
  160. package/src/checks/metadata-params/index.ts +5 -7
  161. package/src/checks/missing-asset/index.ts +1 -1
  162. package/src/checks/{missing-template → missing-partial}/index.spec.ts +6 -6
  163. package/src/checks/{missing-template → missing-partial}/index.ts +6 -20
  164. package/src/checks/orphaned-partial/index.ts +3 -3
  165. package/src/checks/parser-blocking-script/index.spec.ts +0 -118
  166. package/src/checks/parser-blocking-script/index.ts +3 -33
  167. package/src/checks/parser-blocking-script/suggestions.ts +1 -28
  168. package/src/checks/translation-key-exists/index.ts +1 -1
  169. package/src/checks/unclosed-html-element/index.ts +5 -1
  170. package/src/checks/undefined-object/index.spec.ts +3 -109
  171. package/src/checks/undefined-object/index.ts +8 -33
  172. package/src/checks/unique-doc-param-names/index.ts +1 -1
  173. package/src/checks/unknown-filter/index.spec.ts +2 -2
  174. package/src/checks/unknown-filter/index.ts +3 -3
  175. package/src/checks/unknown-property/index.ts +1 -1
  176. package/src/checks/unrecognized-render-partial-arguments/index.spec.ts +5 -5
  177. package/src/checks/unrecognized-render-partial-arguments/index.ts +2 -5
  178. package/src/checks/unused-assign/index.spec.ts +0 -30
  179. package/src/checks/unused-assign/index.ts +1 -1
  180. package/src/checks/unused-doc-param/index.ts +1 -1
  181. package/src/checks/utils.ts +1 -1
  182. package/src/checks/valid-doc-param-types/index.ts +4 -4
  183. package/src/checks/valid-html-translation/index.spec.ts +42 -32
  184. package/src/checks/valid-html-translation/index.ts +7 -7
  185. package/src/checks/valid-json/index.ts +1 -1
  186. package/src/checks/valid-render-partial-argument-types/index.ts +2 -5
  187. package/src/checks/variable-name/index.ts +1 -1
  188. package/src/context-utils.spec.ts +49 -77
  189. package/src/context-utils.ts +39 -128
  190. package/src/disabled-checks/index.spec.ts +35 -0
  191. package/src/disabled-checks/index.ts +4 -2
  192. package/src/find-root.ts +12 -22
  193. package/src/fixes/autofix.spec.ts +2 -2
  194. package/src/fixes/autofix.ts +4 -4
  195. package/src/fixes/correctors/index.ts +4 -0
  196. package/src/ignore.spec.ts +0 -1
  197. package/src/index.ts +33 -21
  198. package/src/jsonc/parse.ts +1 -1
  199. package/src/liquid-doc/arguments.spec.ts +19 -45
  200. package/src/liquid-doc/arguments.ts +26 -39
  201. package/src/liquid-doc/liquidDoc.ts +1 -2
  202. package/src/liquid-doc/utils.ts +4 -3
  203. package/src/path.ts +1 -0
  204. package/src/test/{MockTheme.ts → MockApp.ts} +1 -1
  205. package/src/test/MockFileSystem.ts +9 -6
  206. package/src/test/index.ts +1 -1
  207. package/src/test/test-helper.ts +29 -127
  208. package/src/to-source-code.ts +20 -1
  209. package/src/types/{theme-liquid-docs.ts → platformos-liquid-docs.ts} +8 -13
  210. package/src/types/schemas/index.ts +0 -2
  211. package/src/types.ts +21 -92
  212. package/src/utils/file-utils.ts +0 -1
  213. package/src/utils/index.ts +0 -1
  214. package/src/yaml/parse.ts +111 -0
  215. package/src/AugmentedThemeDocset.ts +0 -137
  216. package/src/checks/app-block-missing-schema/index.spec.ts +0 -121
  217. package/src/checks/app-block-missing-schema/index.ts +0 -46
  218. package/src/checks/app-block-valid-tags/index.spec.ts +0 -96
  219. package/src/checks/app-block-valid-tags/index.ts +0 -54
  220. package/src/checks/asset-preload/index.spec.ts +0 -78
  221. package/src/checks/asset-preload/index.ts +0 -65
  222. package/src/checks/asset-size-app-block-css/index.spec.ts +0 -88
  223. package/src/checks/asset-size-app-block-css/index.ts +0 -78
  224. package/src/checks/asset-size-app-block-javascript/index.spec.ts +0 -66
  225. package/src/checks/asset-size-app-block-javascript/index.ts +0 -78
  226. package/src/checks/asset-size-css/index.spec.ts +0 -166
  227. package/src/checks/asset-size-css/index.ts +0 -160
  228. package/src/checks/asset-size-javascript/index.spec.ts +0 -184
  229. package/src/checks/asset-size-javascript/index.ts +0 -144
  230. package/src/checks/block-id-usage/index.spec.ts +0 -76
  231. package/src/checks/block-id-usage/index.ts +0 -72
  232. package/src/checks/cdn-preconnect/index.spec.ts +0 -40
  233. package/src/checks/cdn-preconnect/index.ts +0 -43
  234. package/src/checks/content-for-header-modification/index.spec.ts +0 -65
  235. package/src/checks/content-for-header-modification/index.ts +0 -72
  236. package/src/checks/deprecate-bgsizes/index.spec.ts +0 -41
  237. package/src/checks/deprecate-bgsizes/index.ts +0 -49
  238. package/src/checks/deprecate-lazysizes/index.spec.ts +0 -26
  239. package/src/checks/deprecate-lazysizes/index.ts +0 -58
  240. package/src/checks/deprecated-filter/fixes.ts +0 -264
  241. package/src/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.ts +0 -1343
  242. package/src/checks/deprecated-fonts-on-sections-and-blocks/index.spec.ts +0 -613
  243. package/src/checks/deprecated-fonts-on-sections-and-blocks/index.ts +0 -284
  244. package/src/checks/deprecated-fonts-on-settings-schema/index.spec.ts +0 -102
  245. package/src/checks/deprecated-fonts-on-settings-schema/index.ts +0 -66
  246. package/src/checks/duplicate-content-for-arguments/index.spec.ts +0 -98
  247. package/src/checks/duplicate-content-for-arguments/index.ts +0 -43
  248. package/src/checks/empty-block-content/index.spec.ts +0 -117
  249. package/src/checks/empty-block-content/index.ts +0 -60
  250. package/src/checks/hardcoded-routes/index.spec.ts +0 -58
  251. package/src/checks/hardcoded-routes/index.ts +0 -100
  252. package/src/checks/json-missing-block/index.spec.ts +0 -435
  253. package/src/checks/json-missing-block/index.ts +0 -56
  254. package/src/checks/json-missing-block/missing-block-utils.ts +0 -147
  255. package/src/checks/liquid-free-settings/index.spec.ts +0 -180
  256. package/src/checks/liquid-free-settings/index.ts +0 -79
  257. package/src/checks/missing-content-for-arguments/index.spec.ts +0 -144
  258. package/src/checks/missing-content-for-arguments/index.ts +0 -46
  259. package/src/checks/pagination-size/index.spec.ts +0 -158
  260. package/src/checks/pagination-size/index.ts +0 -104
  261. package/src/checks/remote-asset/index.spec.ts +0 -280
  262. package/src/checks/remote-asset/index.ts +0 -238
  263. package/src/checks/reserved-doc-param-names/index.spec.ts +0 -62
  264. package/src/checks/reserved-doc-param-names/index.ts +0 -57
  265. package/src/checks/schema-presets-block-order/index.spec.ts +0 -344
  266. package/src/checks/schema-presets-block-order/index.ts +0 -154
  267. package/src/checks/schema-presets-static-blocks/index.spec.ts +0 -145
  268. package/src/checks/schema-presets-static-blocks/index.ts +0 -126
  269. package/src/checks/static-stylesheet-and-javascript-tags/index.spec.ts +0 -257
  270. package/src/checks/static-stylesheet-and-javascript-tags/index.ts +0 -48
  271. package/src/checks/unique-settings-id/index.spec.ts +0 -24
  272. package/src/checks/unique-settings-id/index.ts +0 -84
  273. package/src/checks/unique-settings-id/test-data.ts +0 -1191
  274. package/src/checks/unique-static-block-id/index.spec.ts +0 -55
  275. package/src/checks/unique-static-block-id/index.ts +0 -60
  276. package/src/checks/unrecognized-content-for-arguments/index.spec.ts +0 -145
  277. package/src/checks/unrecognized-content-for-arguments/index.ts +0 -55
  278. package/src/checks/valid-block-target/index.spec.ts +0 -1396
  279. package/src/checks/valid-block-target/index.ts +0 -142
  280. package/src/checks/valid-content-for-argument-types/index.spec.ts +0 -382
  281. package/src/checks/valid-content-for-argument-types/index.ts +0 -42
  282. package/src/checks/valid-content-for-arguments/index.spec.ts +0 -107
  283. package/src/checks/valid-content-for-arguments/index.ts +0 -98
  284. package/src/checks/valid-local-blocks/index.spec.ts +0 -286
  285. package/src/checks/valid-local-blocks/index.ts +0 -100
  286. package/src/checks/valid-local-blocks/valid-block-utils.ts +0 -97
  287. package/src/checks/valid-schema/index.spec.ts +0 -174
  288. package/src/checks/valid-schema/index.ts +0 -41
  289. package/src/checks/valid-schema-name/index.spec.ts +0 -112
  290. package/src/checks/valid-schema-name/index.ts +0 -75
  291. package/src/checks/valid-settings-key/index.spec.ts +0 -321
  292. package/src/checks/valid-settings-key/index.ts +0 -144
  293. package/src/checks/valid-static-block-type/index.spec.ts +0 -38
  294. package/src/checks/valid-static-block-type/index.ts +0 -58
  295. package/src/checks/valid-visible-if/index.spec.ts +0 -619
  296. package/src/checks/valid-visible-if/index.ts +0 -184
  297. package/src/checks/valid-visible-if/visible-if-utils.ts +0 -158
  298. package/src/tags/content-for.ts +0 -25
  299. package/src/to-schema.ts +0 -231
  300. package/src/types/schemas/section.ts +0 -86
  301. package/src/types/schemas/theme-block.ts +0 -34
  302. package/src/types/theme-schemas.ts +0 -80
  303. package/src/utils/block.ts +0 -300
  304. 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
- };