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