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