@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,180 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { LiquidFreeSettings } from './index';
3
- import { check, MockTheme } from '../../test';
4
-
5
- describe('LiquidFreeSettings validation', () => {
6
- const paths = ['sections', 'blocks'];
7
- paths.forEach((path) => {
8
- it(`should not report errors for valid settings without liquid logic in ${path} bucket`, async () => {
9
- const theme: MockTheme = {
10
- [`${path}/test-section.liquid`]: `
11
- {% schema %}
12
- {
13
- "name": "Section name",
14
- "settings": [
15
- {
16
- "id": "text_value",
17
- "type": "text",
18
- "label": "Text Value",
19
- "default": "Some text without liquid logic."
20
- }
21
- ]
22
- }
23
- {% endschema %}
24
- `,
25
- };
26
-
27
- const offenses = await check(theme, [LiquidFreeSettings]);
28
- expect(offenses).to.have.length(0);
29
- });
30
-
31
- it(`should not report errors for valid settings with dynamic source liquid logic in ${path} bucket`, async () => {
32
- const theme: MockTheme = {
33
- [`${path}/test-section.liquid`]: `
34
- {% schema %}
35
- {
36
- "name": "Section name",
37
- "settings": [
38
- {
39
- "id": "text_value",
40
- "type": "text",
41
- "label": "Text Value",
42
- "default": "Title {{ product.title }}"
43
- }
44
- ]
45
- }
46
- {% endschema %}
47
- `,
48
- };
49
-
50
- const offenses = await check(theme, [LiquidFreeSettings]);
51
- expect(offenses).to.have.length(0);
52
- });
53
-
54
- it(`should report an error when settings value contains Liquid logic in ${path} bucket`, async () => {
55
- const theme: MockTheme = {
56
- [`${path}/test-section.liquid`]: `
57
- {% schema %}
58
- {
59
- "name": "Section name",
60
- "settings": [
61
- {
62
- "id": "input_with_logic",
63
- "type": "text",
64
- "label": "Input with Logic",
65
- "default": "Hello {% if user %} User {% endif %}!"
66
- }
67
- ]
68
- }
69
- {% endschema %}
70
- `,
71
- };
72
-
73
- const offenses = await check(theme, [LiquidFreeSettings]);
74
- expect(offenses).to.have.length(1);
75
- expect(offenses[0].message).to.equal('Settings values cannot contain liquid logic.');
76
- });
77
-
78
- it(`should report an error with correct indices when settings value contains Liquid logic in ${path} bucket`, async () => {
79
- const theme: MockTheme = {
80
- [`${path}/test-section.liquid`]: `
81
- {% schema %}
82
- {
83
- "name": "Section name",
84
- "settings": [
85
- {
86
- "id": "input_with_logic",
87
- "type": "text",
88
- "label": "Input with Logic",
89
- "default": "Hello {% if user %} User {% endif %}!"
90
- }
91
- ]
92
- }
93
- {% endschema %}
94
- `,
95
- };
96
-
97
- const offenses = await check(theme, [LiquidFreeSettings]);
98
- expect(offenses).to.have.length(1);
99
- const content = theme[`${path}/test-section.liquid`];
100
- const errorContent = content.slice(offenses[0].start.index, offenses[0].end.index);
101
- expect(errorContent).to.equal('"Hello {% if user %} User {% endif %}!"');
102
- });
103
-
104
- it(`should report an error when settings value contains Liquid logic in object format in ${path} bucket`, async () => {
105
- const theme: MockTheme = {
106
- [`${path}/test-section.liquid`]: `
107
- {% schema %}
108
- {
109
- "name": "test",
110
- "settings": {
111
- "text_block": {
112
- "type": "text",
113
- "id": "text_block",
114
- "label": "Text Block",
115
- "default": "Hello {% if user %} User {% endif %}!"
116
- }
117
- }
118
- }
119
- {% endschema %}
120
- `,
121
- };
122
-
123
- const offenses = await check(theme, [LiquidFreeSettings]);
124
- expect(offenses).to.have.length(1);
125
- expect(offenses[0].message).to.equal('Settings values cannot contain liquid logic.');
126
- });
127
-
128
- it(`should report errors when preset block values contain Liquid logic in ${path} bucket`, async () => {
129
- const theme: MockTheme = {
130
- [`${path}/test-section.liquid`]: `
131
- {% schema %}
132
- {
133
- "name": "Section name",
134
- "presets": [
135
- {
136
- "name": "Default",
137
- "block": [
138
- {
139
- "type": "text",
140
- "settings": {
141
- "text": "Hello World!{% random liquid logic %}"
142
- }
143
- }
144
- ]
145
- }
146
- ]
147
- }
148
- {% endschema %}
149
- `,
150
- };
151
-
152
- const offenses = await check(theme, [LiquidFreeSettings]);
153
- expect(offenses).to.have.length(1);
154
- expect(offenses[0].message).to.equal('Settings values cannot contain liquid logic.');
155
- });
156
-
157
- it(`should not report errors when settings value is available_if and it contains liquid logic`, async () => {
158
- const theme: MockTheme = {
159
- [`${path}/test-section.liquid`]: `
160
- {% schema %}
161
- {
162
- "name": "test",
163
- "settings": {
164
- "text_block": {
165
- "type": "text",
166
- "id": "text_block",
167
- "label": "Text Block",
168
- "default": "Hello World!",
169
- "visible_if": "{% if user %} true {% endif %}"
170
- }
171
- }
172
- }
173
- {% endschema %}
174
- `,
175
- };
176
- const offenses = await check(theme, [LiquidFreeSettings]);
177
- expect(offenses).toEqual([]);
178
- });
179
- });
180
- });
@@ -1,79 +0,0 @@
1
- import { toJSONAST } from '../../to-source-code';
2
- import {
3
- JSONNode,
4
- LiquidCheckDefinition,
5
- LiteralNode,
6
- Severity,
7
- SourceCodeType,
8
- } from '../../types';
9
- import { visit } from '../../visitor';
10
-
11
- export const LiquidFreeSettings: LiquidCheckDefinition = {
12
- meta: {
13
- code: 'LiquidFreeSettings',
14
- name: 'Check for liquid free settings values',
15
- docs: {
16
- description: 'Ensures settings values are liquid free.',
17
- recommended: true,
18
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/liquid-free-settings',
19
- },
20
- type: SourceCodeType.LiquidHtml,
21
- severity: Severity.WARNING,
22
- schema: {},
23
- targets: [],
24
- },
25
-
26
- create(context) {
27
- return {
28
- async LiquidRawTag(node) {
29
- if (node.name !== 'schema' || node.body.kind !== 'json') {
30
- return;
31
- }
32
-
33
- const jsonString = node.source.slice(
34
- node.blockStartPosition.end,
35
- node.blockEndPosition.start,
36
- );
37
-
38
- const jsonFile = toJSONAST(jsonString);
39
- if (jsonFile instanceof Error) return;
40
-
41
- await visit<SourceCodeType.JSON, void>(jsonFile, {
42
- async Property(schemaNode, ancestors) {
43
- if (isInArrayWithParentKey(ancestors, 'settings') && isLiteralNode(schemaNode.value)) {
44
- const { value, loc } = schemaNode.value;
45
- const propertyValue = schemaNode.key.value;
46
- if (
47
- typeof value === 'string' &&
48
- propertyValue !== 'visible_if' &&
49
- value.includes('{%') &&
50
- value.includes('%}')
51
- ) {
52
- context.report({
53
- message: 'Settings values cannot contain liquid logic.',
54
- startIndex: node.blockStartPosition.end + loc!.start.offset,
55
- endIndex: node.blockStartPosition.end + loc!.end.offset,
56
- });
57
- }
58
- }
59
- },
60
- });
61
- },
62
- };
63
- },
64
- };
65
-
66
- function isLiteralNode(node: JSONNode): node is LiteralNode {
67
- return node.type === 'Literal';
68
- }
69
-
70
- function isInArrayWithParentKey(ancestors: JSONNode[], parentKey: string): boolean {
71
- return ancestors.some((ancestor, index) => {
72
- const parent = ancestors[index - 1];
73
- return (
74
- (ancestor.type === 'Array' || ancestor.type === 'Object') &&
75
- parent?.type === 'Property' &&
76
- parent.key?.value === parentKey
77
- );
78
- });
79
- }
@@ -1,144 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { applySuggestions, runLiquidCheck } from '../../test';
3
- import { MissingContentForArguments } from '.';
4
-
5
- function check(existingCode: string, source: string) {
6
- return runLiquidCheck(
7
- MissingContentForArguments,
8
- source,
9
- undefined,
10
- {},
11
- {
12
- 'blocks/card.liquid': existingCode,
13
- },
14
- );
15
- }
16
-
17
- const blockSourceCode = `
18
- {% doc %}
19
- @param {string} required_string - A required string
20
- @param {number} required_number - A required number
21
- @param {boolean} required_boolean - A required boolean
22
- @param {object} required_object - A required object
23
- @param {string} [optional_string] - An optional string
24
- @param {number} [optional_number] - An optional number
25
- @param {object} [optional_object] - An optional object
26
- @param {boolean} [optional_boolean] - An optional boolean
27
- {% enddoc %}
28
- `;
29
-
30
- describe('Module: MissingContentForArguments', () => {
31
- describe('missing required arguments', () => {
32
- it('should report missing required arguments', async () => {
33
- const offenses = await check(blockSourceCode, `{% content_for 'block', type: 'card' %}`);
34
-
35
- expect(offenses).toHaveLength(4);
36
- expect(offenses[0].message).toBe(
37
- "Missing required argument 'required_string' in content_for tag for static block 'card'.",
38
- );
39
- expect(offenses[1].message).toBe(
40
- "Missing required argument 'required_number' in content_for tag for static block 'card'.",
41
- );
42
- expect(offenses[2].message).toBe(
43
- "Missing required argument 'required_boolean' in content_for tag for static block 'card'.",
44
- );
45
- expect(offenses[3].message).toBe(
46
- "Missing required argument 'required_object' in content_for tag for static block 'card'.",
47
- );
48
- });
49
- });
50
-
51
- describe('suggestions', () => {
52
- it('should suggest adding missing required arguments when none already exist', async () => {
53
- const sourceCode = `{% content_for 'block', type: 'card' %}`;
54
- const offenses = await check(blockSourceCode, sourceCode);
55
-
56
- expect(offenses).toHaveLength(4);
57
- const x = applySuggestions(sourceCode, offenses[0]);
58
- expect(x).toEqual([`{% content_for 'block', type: 'card', required_string: '' %}`]);
59
- });
60
- });
61
-
62
- describe('edge cases', () => {
63
- it('should handle mixed case type annotations', async () => {
64
- const sourceCode = `{% content_for 'block', type: 'card', text: "hello", count: 5, flag: true, data: product %}`;
65
- const offenses = await runLiquidCheck(
66
- MissingContentForArguments,
67
- sourceCode,
68
- undefined,
69
- {},
70
- {
71
- 'blocks/card.liquid': `
72
- {% doc %}
73
- @param {String} text - The text
74
- @param {NUMBER} count - The count
75
- @param {BOOLEAN} flag - The flag
76
- @param {Object} data - The data
77
- {% enddoc %}
78
- <div>{{ text }}{{ count }}{{ flag }}{{ data }}</div>
79
- `,
80
- },
81
- );
82
- expect(offenses).toHaveLength(0);
83
- });
84
-
85
- it('should not report when block has no doc comment', async () => {
86
- const sourceCode = `{% content_for 'block', type: 'card', title: 'My Card' %}`;
87
- const offenses = await runLiquidCheck(
88
- MissingContentForArguments,
89
- sourceCode,
90
- undefined,
91
- {},
92
- {
93
- 'blocks/card.liquid': `<h1>This partial has no doc comment</h1>`,
94
- },
95
- );
96
-
97
- expect(offenses).toHaveLength(0);
98
- });
99
-
100
- it('should not report when LiquidDoc definition has no defined params', async () => {
101
- const sourceCode = `{% content_for 'block', type: 'card', title: 'My Card' %}`;
102
- const offenses = await runLiquidCheck(
103
- MissingContentForArguments,
104
- sourceCode,
105
- undefined,
106
- {},
107
- {
108
- 'blocks/card.liquid': `
109
- {% doc %}
110
- @description this is a description
111
- @example this is an example
112
- {% enddoc %}
113
- <div>{{ title }}</div>
114
- <div>{{ description }}</div>
115
- `,
116
- },
117
- );
118
-
119
- expect(offenses).toHaveLength(0);
120
- });
121
-
122
- it('should not report when block name is a VariableLookup', async () => {
123
- const sourceCode = `{% assign block_name = 'card' %}{% content_for 'block', type: block_name, title: 'My Card' %}`;
124
- const offenses = await runLiquidCheck(
125
- MissingContentForArguments,
126
- sourceCode,
127
- undefined,
128
- {},
129
- {
130
- 'blocks/card.liquid': `
131
- {% doc %}
132
- @param {string} title - The title of the card
133
- @param {string} description - The description of the card
134
- {% enddoc %}
135
- <div>{{ title }}</div>
136
- <div>{{ description }}</div>
137
- `,
138
- },
139
- );
140
-
141
- expect(offenses).toHaveLength(0);
142
- });
143
- });
144
- });
@@ -1,46 +0,0 @@
1
- import { LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
2
- import { ContentForMarkup } from '@platformos/liquid-html-parser';
3
- import {
4
- getBlockName,
5
- getLiquidDocParams,
6
- reportMissingArguments,
7
- } from '../../liquid-doc/arguments';
8
-
9
- export const MissingContentForArguments: LiquidCheckDefinition = {
10
- meta: {
11
- code: 'MissingContentForArguments',
12
- name: 'Missing ContentFor Arguments',
13
- docs: {
14
- description:
15
- 'This check ensures that all required arguments are provided when rendering a static block.',
16
- recommended: true,
17
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/missing-content-for-arguments',
18
- },
19
- type: SourceCodeType.LiquidHtml,
20
- severity: Severity.WARNING,
21
- schema: {},
22
- targets: [],
23
- },
24
-
25
- create(context) {
26
- return {
27
- async ContentForMarkup(node: ContentForMarkup) {
28
- const blockName = getBlockName(node);
29
-
30
- if (!blockName) return;
31
-
32
- const liquidDocParameters = await getLiquidDocParams(context, `blocks/${blockName}.liquid`);
33
-
34
- if (!liquidDocParameters) return;
35
-
36
- const providedParams = new Map(node.args.map((arg) => [arg.name, arg]));
37
-
38
- const missingRequiredParams = Array.from(liquidDocParameters.values()).filter(
39
- (p) => p.required && !providedParams.has(p.name),
40
- );
41
-
42
- reportMissingArguments(context, node, missingRequiredParams, blockName);
43
- },
44
- };
45
- },
46
- };
@@ -1,158 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { highlightedOffenses, runLiquidCheck } from '../../test';
3
- import { PaginationSize } from './index';
4
-
5
- describe('Module: PaginationSize', () => {
6
- it('should report an offense when paginate size is less than minSize', async () => {
7
- const sourceCode = `
8
- {% paginate collection.products by 0 %}
9
- {% endpaginate %}
10
- `;
11
- const offenses = await runLiquidCheck(PaginationSize, sourceCode);
12
-
13
- expect(offenses).to.have.length(1);
14
- expect(offenses[0].message).to.equal(
15
- 'Pagination size must be a positive integer between 1 and 250.',
16
- );
17
-
18
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
19
- expect(highlights).to.eql(['0']);
20
- });
21
-
22
- it('should report an offense when paginate size is greater than maxSize', async () => {
23
- const sourceCode = `
24
- {% paginate collection.products by 251 %}
25
- {% endpaginate %}
26
- `;
27
-
28
- const offenses = await runLiquidCheck(PaginationSize, sourceCode);
29
-
30
- expect(offenses).to.have.length(1);
31
- expect(offenses[0].message).to.equal(
32
- 'Pagination size must be a positive integer between 1 and 250.',
33
- );
34
-
35
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
36
- expect(highlights).to.eql(['251']);
37
- });
38
-
39
- it('should not report an offense when paginate size is within the minSize and maxSize range', async () => {
40
- const sourceCode = `
41
- {% paginate collection.products by 25 %}
42
- {% endpaginate %}
43
- `;
44
-
45
- const offenses = await runLiquidCheck(PaginationSize, sourceCode);
46
- expect(offenses).to.have.length(0);
47
-
48
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
49
- expect(highlights).to.be.empty;
50
- });
51
-
52
- it('should not report an offense when paginate size is a section setting with a valid default value', async () => {
53
- const sourceCode = `
54
- {% paginate collection.products by section.settings.products_per_page %}
55
- {% endpaginate %}
56
- {% schema %}
57
- {
58
- "name": "test",
59
- "settings": [
60
- {
61
- "type": "number",
62
- "id": "products_per_page",
63
- "label": "Products per Page",
64
- "default": 12
65
- }
66
- ]
67
- }
68
- {% endschema %}
69
- `;
70
-
71
- const offenses = await runLiquidCheck(PaginationSize, sourceCode);
72
- expect(offenses).to.have.length(0);
73
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
74
- expect(highlights).to.be.empty;
75
- });
76
-
77
- it('should report an offense when paginate size is a section setting with an invalid default value', async () => {
78
- const sourceCode = `
79
- {% paginate collection.products by section.settings.products_per_page %}
80
- {% endpaginate %}
81
- {% schema %}
82
- {
83
- "name": "test",
84
- "settings": [
85
- {
86
- "type": "number",
87
- "id": "products_per_page",
88
- "label": "Products per Page",
89
- "default": 251
90
- }
91
- ]
92
- }
93
- {% endschema %}
94
- `;
95
-
96
- const offenses = await runLiquidCheck(PaginationSize, sourceCode);
97
- expect(offenses).to.have.length(1);
98
- expect(offenses[0].message).to.equal(
99
- `This setting's default value should be between 1 and 250 but is currently 251.`,
100
- );
101
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
102
- expect(highlights).to.eql(['section.settings.products_per_page']);
103
- });
104
-
105
- it('should report an offense when paginate size is a section setting with a missing default value', async () => {
106
- const sourceCode = `
107
- {% paginate collection.products by section.settings.products_per_page %}
108
- {% endpaginate %}
109
- {% schema %}
110
- {
111
- "name": "test",
112
- "settings": [
113
- {
114
- "type": "number",
115
- "id": "products_per_page",
116
- "label": "Products per Page"
117
- }
118
- ]
119
- }
120
- {% endschema %}
121
- `;
122
-
123
- const offenses = await runLiquidCheck(PaginationSize, sourceCode);
124
- expect(offenses).to.have.length(1);
125
- expect(offenses[0].message).to.equal(
126
- 'Default pagination size should be defined in the section settings.',
127
- );
128
-
129
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
130
- expect(highlights).to.eql(['section.settings.products_per_page']);
131
- });
132
-
133
- it('should not report an offense when settings is not an array', async () => {
134
- const sourceCode = `
135
- {% paginate collection.products by section.settings.products_per_page %}
136
- {% endpaginate %}
137
- {% schema %}
138
- {
139
- "name": "test",
140
- "settings": {
141
- "products_per_page": {
142
- "type": "number",
143
- "id": "products_per_page",
144
- "label": "Products per Page",
145
- "default": 51
146
- }
147
- }
148
- }
149
- {% endschema %}
150
- `;
151
-
152
- const offenses = await runLiquidCheck(PaginationSize, sourceCode);
153
- expect(offenses).to.have.length(0);
154
-
155
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
156
- expect(highlights).to.be.empty;
157
- });
158
- });