@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,117 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { EmptyBlockContent } from '.';
3
- import { check, MockTheme } from '../../test';
4
-
5
- describe('Module: EmptyBlockContent', () => {
6
- const paths = ['sections', 'blocks'];
7
-
8
- paths.forEach((path) => {
9
- it(`should not report offenses when the blocks array is not empty in ${path}`, async () => {
10
- const theme: MockTheme = {
11
- [`${path}/test_block.liquid`]: `
12
- <div>
13
- {% content_for 'blocks' %}
14
- </div>
15
- {% schema %}
16
- {
17
- "name": "Test",
18
- "blocks": [
19
- {
20
- "type": "test-block"
21
- }
22
- ]
23
- }
24
- {% endschema %}
25
- `,
26
- };
27
-
28
- const offenses = await check(theme, [EmptyBlockContent]);
29
- expect(offenses).to.have.length(0);
30
- });
31
-
32
- it(`should report offenses when the blocks array is empty in ${path}`, async () => {
33
- const theme: MockTheme = {
34
- [`${path}/test_block.liquid`]: `
35
- <div>
36
- {% content_for 'blocks' %}
37
- </div>
38
- {% schema %}
39
- {
40
- "name": "Test",
41
- "blocks": []
42
- }
43
- {% endschema %}
44
- `,
45
- };
46
-
47
- const offenses = await check(theme, [EmptyBlockContent]);
48
- expect(offenses).to.have.length(1);
49
- expect(offenses[0].message).to.equal(
50
- `The 'content_for "blocks"' tag is present, but the blocks array is empty.`,
51
- );
52
- });
53
-
54
- it(`should report offenses when the blocks array is empty with the correct indices in ${path}`, async () => {
55
- const theme: MockTheme = {
56
- [`${path}/test_block.liquid`]: `
57
- <div>
58
- {% content_for 'blocks' %}
59
- </div>
60
- {% schema %}
61
- {
62
- "name": "Test",
63
- "blocks": []
64
- }
65
- {% endschema %}
66
- `,
67
- };
68
-
69
- const offenses = await check(theme, [EmptyBlockContent]);
70
- expect(offenses).to.have.length(1);
71
- const content = theme[`${path}/test_block.liquid`];
72
- const erroredContent = content.slice(offenses[0].start.index, offenses[0].end.index);
73
- expect(erroredContent).to.equal("{% content_for 'blocks' %}");
74
- });
75
-
76
- it(`should report offenses when the blocks array has not been defined in ${path}`, async () => {
77
- const theme: MockTheme = {
78
- [`${path}/test_block.liquid`]: `
79
- <div>
80
- {% content_for 'blocks' %}
81
- </div>
82
- {% schema %}
83
- {
84
- "name": "Test"
85
- }
86
- {% endschema %}
87
- `,
88
- };
89
-
90
- const offenses = await check(theme, [EmptyBlockContent]);
91
- expect(offenses).to.have.length(1);
92
- expect(offenses[0].message).to.equal(
93
- `The 'content_for "blocks"' tag is present, but the blocks array is not defined.`,
94
- );
95
- });
96
-
97
- it(`should not report offenses when 'content_for blocks' is not present in ${path}`, async () => {
98
- const theme: MockTheme = {
99
- [`${path}/test_block.liquid`]: `
100
- {% schema %}
101
- {
102
- "name": "Test",
103
- "blocks": [
104
- {
105
- "type": "test-block"
106
- }
107
- ]
108
- }
109
- {% endschema %}
110
- `,
111
- };
112
-
113
- const offenses = await check(theme, [EmptyBlockContent]);
114
- expect(offenses).to.be.empty;
115
- });
116
- });
117
- });
@@ -1,60 +0,0 @@
1
- import { LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
2
- import { getSchema } from '../../to-schema';
3
- import { Position } from '@platformos/liquid-html-parser';
4
-
5
- export const EmptyBlockContent: LiquidCheckDefinition = {
6
- meta: {
7
- code: 'EmptyBlockContent',
8
- name: 'Prevent empty block content',
9
- docs: {
10
- description:
11
- 'This check exists to warn you when the blocks array at the root level of the schema is empty.',
12
- recommended: true,
13
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/empty-block-content',
14
- },
15
- type: SourceCodeType.LiquidHtml,
16
- severity: Severity.WARNING,
17
- schema: {},
18
- targets: [],
19
- },
20
-
21
- create(context) {
22
- let isContentForBlocksLocationSet = false;
23
- let contentForBlocksLocation: Position = { start: 0, end: 0 };
24
-
25
- return {
26
- async LiquidTag(node) {
27
- if (node.name !== 'content_for') return;
28
-
29
- const nodeMarkup = node.markup;
30
- if (typeof nodeMarkup === 'object' && nodeMarkup.contentForType.value === 'blocks') {
31
- contentForBlocksLocation.start = node.blockStartPosition.start;
32
- contentForBlocksLocation.end = node.blockStartPosition.end;
33
- isContentForBlocksLocationSet = true;
34
- }
35
- },
36
-
37
- async onCodePathEnd() {
38
- const schema = await getSchema(context);
39
- const { validSchema, ast } = schema ?? {};
40
- if (!validSchema || validSchema instanceof Error) return;
41
- if (!ast || ast instanceof Error) return;
42
-
43
- const blocks = validSchema.blocks;
44
- if (isContentForBlocksLocationSet && !blocks) {
45
- context.report({
46
- message: `The 'content_for "blocks"' tag is present, but the blocks array is not defined.`,
47
- startIndex: contentForBlocksLocation.start,
48
- endIndex: contentForBlocksLocation.end,
49
- });
50
- } else if (isContentForBlocksLocationSet && blocks && blocks.length === 0) {
51
- context.report({
52
- message: `The 'content_for "blocks"' tag is present, but the blocks array is empty.`,
53
- startIndex: contentForBlocksLocation.start,
54
- endIndex: contentForBlocksLocation.end,
55
- });
56
- }
57
- },
58
- };
59
- },
60
- };
@@ -1,58 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { HardcodedRoutes } from './index';
3
- import { runLiquidCheck, highlightedOffenses } from '../../test';
4
-
5
- describe('Module: HardcodedRoutes', () => {
6
- it('should report offenses for hardcoded routes', async () => {
7
- const sourceCode = `
8
- <a href="/"></a>
9
- <form action="/search"></form>
10
- <a href="/account/login"></a>
11
- <a href="/collections/{{ collection.handle }}"></a>
12
- <a href="/cart/change?line={{ forloop.index }}&amp;quantity=0"></a>
13
- <li>{{ 'Socks' | link_to: '/collections/socks' }}</li>
14
- <li>{{ 'Home' | link_to: '/' }}</li>
15
- <li>{{ 'Cart (' | append: cart.item_count | append: ')' | link_to: '/cart' }}</li>
16
- `;
17
-
18
- const offenses = await runLiquidCheck(HardcodedRoutes, sourceCode);
19
- expect(offenses).to.have.length(8);
20
-
21
- const errorMessages = offenses.map((offense) => offense.message);
22
- expect(errorMessages).to.deep.equal([
23
- 'Use routes object {{ routes.root_url }} instead of hardcoding /',
24
- 'Use routes object {{ routes.search_url }} instead of hardcoding /search',
25
- 'Use routes object {{ routes.account_login_url }} instead of hardcoding /account/login',
26
- 'Use routes object {{ routes.collections_url }} instead of hardcoding /collections',
27
- 'Use routes object {{ routes.cart_change_url }} instead of hardcoding /cart/change',
28
- 'Use routes object {{ routes.collections_url }} instead of hardcoding /collections',
29
- 'Use routes object {{ routes.root_url }} instead of hardcoding /',
30
- 'Use routes object {{ routes.cart_url }} instead of hardcoding /cart',
31
- ]);
32
-
33
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
34
- expect(highlights).to.deep.equal([
35
- '/',
36
- '/search',
37
- '/account/login',
38
- '/collections',
39
- '/cart/change',
40
- '/collections',
41
- '/',
42
- '/cart',
43
- ]);
44
- });
45
-
46
- it('should not report offenses for route objects', async () => {
47
- const sourceCode = `
48
- <form action="{{ routes.search_url }}"></form>
49
- <a href="/{{ blog.url }}"></a>
50
- <a href="/admin"></a>
51
- <a href="#MainContent"></a>
52
- <li>{{ 'About' | link_to: '/pages/about' }}</li>
53
- `;
54
-
55
- const offenses = await runLiquidCheck(HardcodedRoutes, sourceCode);
56
- expect(offenses).to.have.length(0);
57
- });
58
- });
@@ -1,100 +0,0 @@
1
- import { NodeTypes } from '@platformos/liquid-html-parser';
2
- import { Severity, SourceCodeType, LiquidCheckDefinition } from '../../types';
3
- import { isAttr, isNodeOfType, isValuedHtmlAttribute, ValuedHtmlAttribute } from '../utils';
4
-
5
- const ROUTES: Record<string, string> = {
6
- '/': 'root_url',
7
- '/account': 'account_url',
8
- '/account/addresses': 'account_addresses_url',
9
- '/account/login': 'account_login_url',
10
- '/account/logout': 'account_logout_url',
11
- '/account/recover': 'account_recover_url',
12
- '/account/register': 'account_register_url',
13
- '/cart': 'cart_url',
14
- '/cart/add': 'cart_add_url',
15
- '/cart/change': 'cart_change_url',
16
- '/cart/clear': 'cart_clear_url',
17
- '/cart/update': 'cart_update_url',
18
- '/collections': 'collections_url',
19
- '/collections/all': 'all_products_collection_url',
20
- '/customer_authentication/login': 'storefront_login_url',
21
- '/recommendations/products': 'product_recommendations_url',
22
- '/search': 'search_url',
23
- '/search/suggest': 'predictive_search_url',
24
- };
25
-
26
- const HARDCODED_ROUTES = Object.keys(ROUTES).reverse();
27
-
28
- export const HardcodedRoutes: LiquidCheckDefinition = {
29
- meta: {
30
- code: 'HardcodedRoutes',
31
- name: 'Hardcoded Routes',
32
- docs: {
33
- description: 'This check encourages using the routes object instead of hardcoding URLs.',
34
- recommended: true,
35
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/hardcoded-routes',
36
- },
37
- type: SourceCodeType.LiquidHtml,
38
- severity: Severity.WARNING,
39
- schema: {},
40
- targets: [],
41
- },
42
-
43
- create(context) {
44
- return {
45
- async HtmlElement(node) {
46
- // checks for hardcoded routes in href and action attributes
47
- const attrWithHardcodedRoute: ValuedHtmlAttribute | undefined = node.attributes
48
- .filter(isValuedHtmlAttribute)
49
- .find((attr) => (isAttr(attr, 'action') || isAttr(attr, 'href')) && hardcodedRoute(attr));
50
-
51
- if (attrWithHardcodedRoute) {
52
- const attr = attrWithHardcodedRoute;
53
- const route = hardcodedRoute(attr)!;
54
- const routeURL = ROUTES[route];
55
- const startIndex = attr.attributePosition.start;
56
- const endIndex = startIndex + route.length;
57
-
58
- context.report({
59
- message: `Use routes object {{ routes.${routeURL} }} instead of hardcoding ${route}`,
60
- startIndex,
61
- endIndex,
62
- });
63
- }
64
- },
65
-
66
- async LiquidFilter(node) {
67
- // checks for hardcoded routes in link_to values {{ 'Cart' | link_to: '/cart' }}
68
- if (node.name !== 'link_to') return;
69
-
70
- const linkToArg = node.args[0];
71
- const linkToValue = linkToArg.type === 'String' ? linkToArg.value : '';
72
- const route = HARDCODED_ROUTES.find((route) =>
73
- route === '/' ? route === linkToValue : linkToValue.startsWith(route),
74
- );
75
-
76
- if (route) {
77
- const routeURL = ROUTES[route];
78
- // we add 1 to the start index to exclude the quotes
79
- const startIndex = linkToArg.position.start + 1;
80
-
81
- context.report({
82
- message: `Use routes object {{ routes.${routeURL} }} instead of hardcoding ${route}`,
83
- startIndex,
84
- endIndex: startIndex + route.length,
85
- });
86
- }
87
- },
88
- };
89
- },
90
- };
91
-
92
- function hardcodedRoute(attr: ValuedHtmlAttribute): string | undefined {
93
- if (!isNodeOfType(NodeTypes.TextNode, attr.value[0])) return;
94
-
95
- const value = attr.value[0].value;
96
-
97
- return HARDCODED_ROUTES.find((route) =>
98
- route === '/' ? route === value && attr.value.length === 1 : value.startsWith(route),
99
- );
100
- }