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