@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,76 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { highlightedOffenses, runLiquidCheck } from '../../test';
3
- import { BlockIdUsage } from './index';
4
-
5
- describe('Module: ContentForHeaderModification', () => {
6
- it('reports offense with the use of block.id in an if liquid tag', async () => {
7
- const sourceCode = `
8
- {% if block.id == '123' %}
9
- No bueno
10
- {% endif %}
11
- `;
12
-
13
- const offenses = await runLiquidCheck(BlockIdUsage, sourceCode);
14
- expect(offenses).toHaveLength(1);
15
- expect(offenses[0].message).toEqual(
16
- 'The ID is dynamically generated by Shopify and is subject to change. You should avoid relying on a literal value of this ID.',
17
- );
18
-
19
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
20
- expect(highlights).toEqual(["block.id == '123'"]);
21
- });
22
-
23
- it('reports offense with the use of block.id in an elseif liquid tag', async () => {
24
- const sourceCode = `
25
- {% if potato == '123' %}
26
- No bueno
27
- {% elsif block.id == '123' %}
28
- No bueno
29
- {% endif %}
30
- `;
31
-
32
- const offenses = await runLiquidCheck(BlockIdUsage, sourceCode);
33
- expect(offenses).toHaveLength(1);
34
- expect(offenses[0].message).toEqual(
35
- 'The ID is dynamically generated by Shopify and is subject to change. You should avoid relying on a literal value of this ID.',
36
- );
37
-
38
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
39
- expect(highlights).toEqual(["block.id == '123'"]);
40
- });
41
-
42
- it('reports offense with the use of block.id in an unless liquid tag', async () => {
43
- const sourceCode = `
44
- {% unless block.id == '123' %}
45
- No bueno
46
- {% endunless %}
47
- `;
48
-
49
- const offenses = await runLiquidCheck(BlockIdUsage, sourceCode);
50
- expect(offenses).toHaveLength(1);
51
- expect(offenses[0].message).toEqual(
52
- 'The ID is dynamically generated by Shopify and is subject to change. You should avoid relying on a literal value of this ID.',
53
- );
54
-
55
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
56
- expect(highlights).toEqual(["block.id == '123'"]);
57
- });
58
-
59
- it('reports offense with the use of block.id in a case liquid tag', async () => {
60
- const sourceCode = `
61
- {% case block.id %}
62
- {% when '123' %}
63
- No bueno
64
- {% endcase %}
65
- `;
66
-
67
- const offenses = await runLiquidCheck(BlockIdUsage, sourceCode);
68
- expect(offenses).toHaveLength(1);
69
- expect(offenses[0].message).toEqual(
70
- 'The ID is dynamically generated by Shopify and is subject to change. You should avoid relying on a literal value of this ID.',
71
- );
72
-
73
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
74
- expect(highlights).toEqual(['block.id']);
75
- });
76
- });
@@ -1,72 +0,0 @@
1
- import {
2
- Position,
3
- LiquidTagNode,
4
- NodeTypes,
5
- LiquidVariableLookup,
6
- } from '@platformos/liquid-html-parser';
7
- import { Context, LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
8
-
9
- export const BlockIdUsage: LiquidCheckDefinition = {
10
- meta: {
11
- code: 'BlockIdUsage',
12
- name: 'Do not rely on `block.id` in if/else/unless/case',
13
- docs: {
14
- description:
15
- 'The ID is dynamically generated by Shopify and is subject to change. You should avoid relying on a literal value of this ID.',
16
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/block-id-usage',
17
- recommended: true,
18
- },
19
- type: SourceCodeType.LiquidHtml,
20
- severity: Severity.WARNING,
21
- schema: {},
22
- targets: [],
23
- },
24
-
25
- create(context) {
26
- return {
27
- // BAD: {% if block.id == "123" %}
28
- // BAD: {% if block.id == some_variable %}
29
- // BAD: {% if block[id] == "id" or block.id %}
30
- // FINE: <div data-block-id="{{ block.id }}">
31
- // FINE: document.querySelector(`[data-block-id="${block.id}"]`)
32
- async Comparison(node, ancesors) {
33
- if (
34
- node.comparator === '==' &&
35
- node.left.type === NodeTypes.VariableLookup &&
36
- isUsingBlockId(node.left)
37
- ) {
38
- reportWarning(context, node.position);
39
- }
40
- },
41
-
42
- // BAD {% case block.id %}
43
- async VariableLookup(node, ancestors) {
44
- const parentNode = ancestors.at(-1);
45
- if (parentNode?.type === NodeTypes.LiquidTag && parentNode.name === 'case') {
46
- if (isUsingBlockId(node)) {
47
- reportWarning(context, node.position);
48
- }
49
- }
50
- },
51
- };
52
- },
53
- };
54
-
55
- function isUsingBlockId(node: LiquidVariableLookup) {
56
- return (
57
- node.type == NodeTypes.VariableLookup &&
58
- node.name === 'block' &&
59
- node.lookups[0] &&
60
- node.lookups[0].type === NodeTypes.String &&
61
- node.lookups[0].value === 'id'
62
- );
63
- }
64
-
65
- function reportWarning(context: any, position: Position) {
66
- context.report({
67
- message:
68
- 'The ID is dynamically generated by Shopify and is subject to change. You should avoid relying on a literal value of this ID.',
69
- startIndex: position.start,
70
- endIndex: position.end,
71
- });
72
- }
@@ -1,40 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { runLiquidCheck } from '../../test';
3
- import { CdnPreconnect } from './index';
4
-
5
- describe('Module: CdnPreconnect', () => {
6
- it('should report preconnect to cdn.shopify.com', async () => {
7
- const sourceCode = `
8
- <link rel="preconnect" href="https://cdn.shopify.com/"/>
9
- `;
10
-
11
- const offenses = await runLiquidCheck(CdnPreconnect, sourceCode);
12
- expect(offenses).to.have.length(1);
13
- expect(offenses[0].message).to.equal(
14
- 'Preconnecting to cdn.shopify.com is unnecessary and can lead to worse performance',
15
- );
16
- });
17
-
18
- it('should report crossorigin preconnect to cdn.shopify.com', async () => {
19
- const sourceCode = `
20
- <link rel="preconnect" href="https://cdn.shopify.com/" crossorigin/>
21
- `;
22
-
23
- const offenses = await runLiquidCheck(CdnPreconnect, sourceCode);
24
- expect(offenses).to.have.length(1);
25
- expect(offenses[0].message).to.equal(
26
- 'Preconnecting to cdn.shopify.com is unnecessary and can lead to worse performance',
27
- );
28
- });
29
-
30
- it('should not report other link types', async () => {
31
- const sourceCode = `
32
- <link rel="preload" href="https://example.com/foo.css" as="style"/>
33
- <link rel="stylesheet" href="https://example.com/bar.css"/>
34
- <link rel="icon"/>
35
- `;
36
-
37
- const offenses = await runLiquidCheck(CdnPreconnect, sourceCode);
38
- expect(offenses).to.have.length(0);
39
- });
40
- });
@@ -1,43 +0,0 @@
1
- import { Severity, SourceCodeType, LiquidCheckDefinition } from '../../types';
2
- import { isAttr, isValuedHtmlAttribute, valueIncludes } from '../utils';
3
-
4
- export const CdnPreconnect: LiquidCheckDefinition = {
5
- meta: {
6
- code: 'CdnPreconnect',
7
- name: 'CDN Preconnect',
8
- docs: {
9
- description: "This check is aimed at signaling the redundant preconnect to Shopify's CDN",
10
- recommended: true,
11
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/cdn-preconnect',
12
- },
13
- type: SourceCodeType.LiquidHtml,
14
- severity: Severity.ERROR,
15
- schema: {},
16
- targets: [],
17
- },
18
-
19
- create(context) {
20
- return {
21
- async HtmlVoidElement(node) {
22
- if (node.name !== 'link') return;
23
-
24
- const isPreconnect = node.attributes
25
- .filter(isValuedHtmlAttribute)
26
- .some((attr) => isAttr(attr, 'rel') && valueIncludes(attr, 'preconnect'));
27
- if (!isPreconnect) return;
28
-
29
- const isShopifyCdn = node.attributes
30
- .filter(isValuedHtmlAttribute)
31
- .some((attr) => isAttr(attr, 'href') && valueIncludes(attr, '.+cdn.shopify.com.+'));
32
- if (!isShopifyCdn) return;
33
-
34
- context.report({
35
- message:
36
- 'Preconnecting to cdn.shopify.com is unnecessary and can lead to worse performance',
37
- startIndex: node.position.start,
38
- endIndex: node.position.end,
39
- });
40
- },
41
- };
42
- },
43
- };
@@ -1,65 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { highlightedOffenses, runLiquidCheck } from '../../test';
3
- import { ContentForHeaderModification } from './index';
4
-
5
- describe('Module: ContentForHeaderModification', () => {
6
- it('reports a offense with the use of a filter', async () => {
7
- const sourceCode = "{{ content_for_header | split: ',' }}";
8
-
9
- const offenses = await runLiquidCheck(ContentForHeaderModification, sourceCode);
10
- expect(offenses).toHaveLength(1);
11
- expect(offenses[0].message).toEqual('Do not rely on the content of `content_for_header`');
12
-
13
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
14
- });
15
-
16
- it('reports offense with the use of assign', async () => {
17
- const sourceCode = '{% assign x = content_for_header %}';
18
-
19
- const offenses = await runLiquidCheck(ContentForHeaderModification, sourceCode);
20
- expect(offenses).toHaveLength(1);
21
- expect(offenses[0].message).toEqual('Do not rely on the content of `content_for_header`');
22
-
23
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
24
- expect(highlights).toEqual(['{% assign x = content_for_header %}']);
25
- });
26
-
27
- it('reports offense with the use of capture', async () => {
28
- const sourceCode = `
29
- {% capture x %}
30
- {{ content_for_header }}
31
- {% endcapture %}
32
- `;
33
-
34
- const offenses = await runLiquidCheck(ContentForHeaderModification, sourceCode);
35
- expect(offenses).toHaveLength(1);
36
- expect(offenses[0].message).toEqual('Do not rely on the content of `content_for_header`');
37
-
38
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
39
- expect(highlights).toEqual(['{{ content_for_header }}']);
40
- });
41
-
42
- it('reports offense with the use of echo', async () => {
43
- const sourceCode = `
44
- {% liquid
45
- echo content_for_header | split: ','
46
- %}
47
- `;
48
-
49
- const offenses = await runLiquidCheck(ContentForHeaderModification, sourceCode);
50
- expect(offenses).toHaveLength(1);
51
- expect(offenses[0].message).toEqual('Do not rely on the content of `content_for_header`');
52
-
53
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
54
- expect(highlights).toEqual(["echo content_for_header | split: ','"]);
55
- });
56
-
57
- it('does not report an offense with normal use', async () => {
58
- const sourceCode = '{{ content_for_header }}';
59
-
60
- const offenses = await runLiquidCheck(ContentForHeaderModification, sourceCode);
61
- expect(offenses).toHaveLength(0);
62
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
63
- expect(highlights).toHaveLength(0);
64
- });
65
- });
@@ -1,72 +0,0 @@
1
- import {
2
- LiquidTag,
3
- LiquidTagAssign,
4
- LiquidTagCapture,
5
- LiquidTagEcho,
6
- NodeTypes,
7
- Position,
8
- } from '@platformos/liquid-html-parser';
9
- import { LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
10
- import { isNodeOfType } from '../utils';
11
-
12
- function isLiquidTagAssign(node: LiquidTag): node is LiquidTagAssign {
13
- return node.name === 'assign' && typeof node.markup !== 'string';
14
- }
15
- function isLiquidTagCapture(node: LiquidTag): node is LiquidTagCapture {
16
- return node.name === 'capture' && typeof node.markup !== 'string';
17
- }
18
- function isLiquidTagEcho(node: LiquidTag): node is LiquidTagEcho {
19
- return node.name === 'echo' && typeof node.markup !== 'string';
20
- }
21
-
22
- export const ContentForHeaderModification: LiquidCheckDefinition = {
23
- meta: {
24
- code: 'ContentForHeaderModification',
25
- name: 'Do not depend on the content of content_for_header',
26
- docs: {
27
- description:
28
- 'Do not rely on the content of content_for_header as it might change in the future, which could cause your Liquid code behavior to change.',
29
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/content-for-header-modification',
30
- recommended: true,
31
- },
32
- type: SourceCodeType.LiquidHtml,
33
- severity: Severity.ERROR,
34
- schema: {},
35
- targets: [],
36
- },
37
-
38
- create(context) {
39
- function checkContentForHeader(node: any, position: Position) {
40
- if (isNodeOfType(NodeTypes.VariableLookup, node) && node.name === 'content_for_header') {
41
- context.report({
42
- message: 'Do not rely on the content of `content_for_header`',
43
- startIndex: position.start,
44
- endIndex: position.end,
45
- });
46
- }
47
- }
48
-
49
- return {
50
- async LiquidTag(node) {
51
- if (isLiquidTagAssign(node)) {
52
- checkContentForHeader(node.markup.value.expression, node.position);
53
- } else if (isLiquidTagEcho(node)) {
54
- checkContentForHeader(node.markup.expression, node.position);
55
- } else if (isLiquidTagCapture(node) && node.children) {
56
- for (const child of node.children) {
57
- if (child.type === NodeTypes.LiquidVariableOutput && typeof child.markup !== 'string') {
58
- checkContentForHeader(child.markup.expression, child.position);
59
- }
60
- }
61
- }
62
- },
63
- async LiquidVariableOutput(node) {
64
- if (typeof node.markup === 'string') return;
65
-
66
- if (node.markup.filters.length) {
67
- checkContentForHeader(node.markup.expression, node.position);
68
- }
69
- },
70
- };
71
- },
72
- };
@@ -1,41 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { DeprecateBgsizes } from './index';
3
- import { runLiquidCheck, highlightedOffenses } from '../../test';
4
-
5
- describe('Module: DeprecateBgsizes', () => {
6
- it('should report offenses for deprecated attributes', async () => {
7
- const sourceCode = `
8
- <div class="lazyload" data-bgset="image.jpg"></div>
9
- <div class="lazyload" data-bgset="image2.jpg"></div>
10
- `;
11
-
12
- const offenses = await runLiquidCheck(DeprecateBgsizes, sourceCode);
13
- expect(offenses).to.have.length(4);
14
-
15
- const errorMessages = offenses.map((offense) => offense.message);
16
- expect(errorMessages).to.deep.equal([
17
- 'Use the native loading="lazy" attribute instead of lazysizes',
18
- 'Use the CSS imageset attribute instead of data-bgset',
19
- 'Use the native loading="lazy" attribute instead of lazysizes',
20
- 'Use the CSS imageset attribute instead of data-bgset',
21
- ]);
22
-
23
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
24
- expect(highlights).to.deep.equal([
25
- 'lazyload',
26
- 'data-bgset="image.jpg"',
27
- 'lazyload',
28
- 'data-bgset="image2.jpg"',
29
- ]);
30
- });
31
-
32
- it('should not report offenses for non-deprecated attributes', async () => {
33
- const sourceCode = `
34
- <div class="non-lazyload" data-non-bgset="image.jpg"></div>
35
- <div class="non-lazyload" data-non-bgset="image2.jpg"></div>
36
- `;
37
-
38
- const offenses = await runLiquidCheck(DeprecateBgsizes, sourceCode);
39
- expect(offenses).to.have.length(0);
40
- });
41
- });
@@ -1,49 +0,0 @@
1
- import { Severity, SourceCodeType, LiquidCheckDefinition } from '../../types';
2
- import { isAttr, isValuedHtmlAttribute, ValuedHtmlAttribute, valueIncludes } from '../utils';
3
-
4
- export const DeprecateBgsizes: LiquidCheckDefinition = {
5
- meta: {
6
- code: 'DeprecateBgsizes',
7
- name: 'Deprecate Bgsizes',
8
- docs: {
9
- description: 'This check is aimed at discouraging the use of the lazySizes bgset plugin.',
10
- recommended: true,
11
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/deprecate-bgsizes',
12
- },
13
- type: SourceCodeType.LiquidHtml,
14
- severity: Severity.WARNING,
15
- schema: {},
16
- targets: [],
17
- },
18
-
19
- create(context) {
20
- return {
21
- async HtmlElement(node) {
22
- const classAttributeWithLazyload: ValuedHtmlAttribute | undefined = node.attributes
23
- .filter(isValuedHtmlAttribute)
24
- .find((attr) => isAttr(attr, 'class') && valueIncludes(attr, 'lazyload'));
25
-
26
- if (classAttributeWithLazyload) {
27
- const attr = classAttributeWithLazyload;
28
- context.report({
29
- message: 'Use the native loading="lazy" attribute instead of lazysizes',
30
- startIndex: attr.attributePosition.start,
31
- endIndex: attr.attributePosition.end,
32
- });
33
- }
34
-
35
- const dataBgsetAttr = node.attributes.find(
36
- (attr) => isValuedHtmlAttribute(attr) && isAttr(attr, 'data-bgset'),
37
- ) as ValuedHtmlAttribute | undefined;
38
-
39
- if (dataBgsetAttr) {
40
- context.report({
41
- message: 'Use the CSS imageset attribute instead of data-bgset',
42
- startIndex: dataBgsetAttr.position.start,
43
- endIndex: dataBgsetAttr.position.end,
44
- });
45
- }
46
- },
47
- };
48
- },
49
- };
@@ -1,26 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { runLiquidCheck } from '../../test';
3
- import { DeprecateLazysizes } from './index';
4
-
5
- describe('Module: DeprecateLazysizes', () => {
6
- it('should report data-srcset and data-sizes attributes', async () => {
7
- const sourceCode = `
8
- <img data-srcset="image.jpg" data-sizes="auto" class="lazyload" />
9
- `;
10
-
11
- const offenses = await runLiquidCheck(DeprecateLazysizes, sourceCode);
12
- expect(offenses).to.have.length(1);
13
- expect(offenses[0].message).to.equal(
14
- 'Use the native loading="lazy" attribute instead of lazysizes',
15
- );
16
- });
17
-
18
- it('should not report srcset and sizes attributes', async () => {
19
- const sourceCode = `
20
- <img srcset="image.jpg" sizes="auto" loading="lazy" />
21
- `;
22
-
23
- const offenses = await runLiquidCheck(DeprecateLazysizes, sourceCode);
24
- expect(offenses).to.have.length(0);
25
- });
26
- });
@@ -1,58 +0,0 @@
1
- import { Severity, SourceCodeType, LiquidCheckDefinition } from '../../types';
2
- import {
3
- ValuedHtmlAttribute,
4
- isAttr,
5
- isValuedHtmlAttribute,
6
- isHtmlAttribute,
7
- valueIncludes,
8
- } from '../utils';
9
-
10
- function showsLazysizesUsage(attr: ValuedHtmlAttribute) {
11
- return isAttr(attr, 'data-srcset') || isAttr(attr, 'data-sizes');
12
- }
13
-
14
- export const DeprecateLazysizes: LiquidCheckDefinition = {
15
- meta: {
16
- code: 'DeprecateLazysizes',
17
- name: 'Deprecate Lazysizes',
18
- docs: {
19
- description:
20
- 'This check is aimed at discouraging the use of the lazysizes JavaScript library',
21
- recommended: true,
22
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/deprecate-lazysizes',
23
- },
24
- type: SourceCodeType.LiquidHtml,
25
- severity: Severity.WARNING,
26
- schema: {},
27
- targets: [],
28
- },
29
-
30
- create(context) {
31
- return {
32
- async HtmlVoidElement(node) {
33
- if (node.name !== 'img') return;
34
-
35
- const attributes = node.attributes.filter(isHtmlAttribute);
36
- const hasSrc = attributes.some((attr) => isAttr(attr, 'src'));
37
- const hasNativeLoading = attributes.some((attr) => isAttr(attr, 'loading'));
38
- if (hasSrc && hasNativeLoading) return;
39
-
40
- const hasLazyloadClass = node.attributes
41
- .filter(isValuedHtmlAttribute)
42
- .some((attr) => isAttr(attr, 'class') && valueIncludes(attr, 'lazyload'));
43
- if (!hasLazyloadClass) return;
44
-
45
- const hasLazysizesAttribute = node.attributes
46
- .filter(isValuedHtmlAttribute)
47
- .some(showsLazysizesUsage);
48
- if (!hasLazysizesAttribute) return;
49
-
50
- context.report({
51
- message: 'Use the native loading="lazy" attribute instead of lazysizes',
52
- startIndex: node.position.start,
53
- endIndex: node.position.end,
54
- });
55
- },
56
- };
57
- },
58
- };