@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,321 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { check } from '../../test';
3
- import { ValidSettingsKey } from './index';
4
-
5
- describe('Module: ValidSettingsKey', () => {
6
- const schemaTemplate = {
7
- name: 'Example',
8
- settings: [
9
- {
10
- id: 'existent-setting',
11
- type: 'text',
12
- label: 'Example Text Setting',
13
- },
14
- ],
15
- };
16
-
17
- describe('default settings', () => {
18
- it('does not report an error when default setting exists', async () => {
19
- const theme = {
20
- 'sections/example.liquid': toLiquidFile({
21
- ...schemaTemplate,
22
- default: {
23
- settings: {
24
- 'existent-setting': 'value',
25
- },
26
- },
27
- }),
28
- };
29
-
30
- const offenses = await check(theme, [ValidSettingsKey]);
31
- expect(offenses).to.have.length(0);
32
- });
33
-
34
- it('reports an error when default setting does not exist', async () => {
35
- const theme = {
36
- 'sections/example.liquid': toLiquidFile({
37
- ...schemaTemplate,
38
- default: {
39
- settings: {
40
- 'non-existent-setting': 'value',
41
- },
42
- },
43
- }),
44
- };
45
-
46
- const offenses = await check(theme, [ValidSettingsKey]);
47
- expect(offenses).to.have.length(1);
48
- expect(offenses[0].message).to.equal(
49
- `Setting 'non-existent-setting' does not exist in schema.`,
50
- );
51
- });
52
-
53
- it('does not report an error when missing default settings is referenced from a block schema', async () => {
54
- const theme = {
55
- 'blocks/example.liquid': toLiquidFile({
56
- ...schemaTemplate,
57
- default: {
58
- settings: {
59
- 'non-existent-setting': 'value',
60
- },
61
- },
62
- }),
63
- };
64
-
65
- const offenses = await check(theme, [ValidSettingsKey]);
66
- expect(offenses).to.have.length(0);
67
- });
68
- });
69
-
70
- describe('presets settings', () => {
71
- it('does not report an error when presets setting exists', async () => {
72
- const theme = {
73
- 'sections/example.liquid': toLiquidFile({
74
- ...schemaTemplate,
75
- presets: [
76
- {
77
- settings: {
78
- 'existent-setting': 'value',
79
- },
80
- },
81
- ],
82
- }),
83
- };
84
-
85
- const offenses = await check(theme, [ValidSettingsKey]);
86
- expect(offenses).to.have.length(0);
87
- });
88
-
89
- it('reports an error when presets setting does not exist', async () => {
90
- const theme = {
91
- 'sections/example.liquid': toLiquidFile({
92
- ...schemaTemplate,
93
- presets: [
94
- {
95
- settings: {
96
- 'non-existent-setting-1': 'value',
97
- },
98
- },
99
- {
100
- settings: {
101
- 'non-existent-setting-2': 'value',
102
- },
103
- },
104
- ],
105
- }),
106
- };
107
-
108
- const offenses = await check(theme, [ValidSettingsKey]);
109
- expect(offenses).to.have.length(2);
110
- expect(offenses[0].message).to.equal(
111
- `Setting 'non-existent-setting-1' does not exist in schema.`,
112
- );
113
- expect(offenses[1].message).to.equal(
114
- `Setting 'non-existent-setting-2' does not exist in schema.`,
115
- );
116
- });
117
- });
118
-
119
- const tests = [
120
- {
121
- label: 'default',
122
- blockTemplate: (blocks: any[]) => {
123
- return {
124
- default: {
125
- blocks,
126
- },
127
- };
128
- },
129
- },
130
- {
131
- label: 'presets',
132
- blockTemplate: (blocks: any[]) => {
133
- return {
134
- presets: [
135
- {
136
- blocks,
137
- },
138
- ],
139
- };
140
- },
141
- },
142
- ];
143
-
144
- tests.forEach(({ label, blockTemplate }) => {
145
- describe(`${label} block settings`, () => {
146
- describe('referenced blocks', () => {
147
- const referencedBlock = {
148
- 'blocks/referenced.liquid': toLiquidFile(schemaTemplate),
149
- };
150
-
151
- it(`does not report an error when ${label} block setting exists in referenced file`, async () => {
152
- const fileToTest = {
153
- 'sections/example.liquid': toLiquidFile({
154
- ...schemaTemplate,
155
- ...blockTemplate([
156
- {
157
- type: 'referenced',
158
- settings: {
159
- 'existent-setting': 'value',
160
- },
161
- },
162
- ]),
163
- }),
164
- };
165
-
166
- const offenses = await check(
167
- {
168
- ...referencedBlock,
169
- ...fileToTest,
170
- },
171
- [ValidSettingsKey],
172
- );
173
- expect(offenses).to.have.length(0);
174
- });
175
-
176
- it('does not report an error when referenced file does not exist', async () => {
177
- const fileToTest = {
178
- 'sections/example.liquid': toLiquidFile({
179
- ...schemaTemplate,
180
- ...blockTemplate([
181
- {
182
- type: 'non-existent-file',
183
- settings: {
184
- 'non-existent-setting': 'value',
185
- },
186
- },
187
- ]),
188
- }),
189
- };
190
-
191
- const offenses = await check(
192
- {
193
- ...referencedBlock,
194
- ...fileToTest,
195
- },
196
- [ValidSettingsKey],
197
- );
198
- expect(offenses).to.have.length(0);
199
- });
200
-
201
- it(`reports an error when ${label} block setting does not exist in referenced file`, async () => {
202
- const fileToTest = {
203
- 'sections/example.liquid': toLiquidFile({
204
- ...schemaTemplate,
205
- ...blockTemplate([
206
- {
207
- type: 'referenced',
208
- settings: {
209
- 'non-existent-setting': 'value',
210
- },
211
- },
212
- ]),
213
- }),
214
- };
215
-
216
- const offenses = await check(
217
- {
218
- ...referencedBlock,
219
- ...fileToTest,
220
- },
221
- [ValidSettingsKey],
222
- );
223
- expect(offenses).to.have.length(1);
224
- expect(offenses[0].message).to.equal(
225
- `Setting 'non-existent-setting' does not exist in 'blocks/referenced.liquid'.`,
226
- );
227
- });
228
- });
229
-
230
- describe('local blocks', () => {
231
- const localBlocksTemplate = {
232
- blocks: [
233
- {
234
- type: 'local-block',
235
- name: 'Local block',
236
- settings: [
237
- {
238
- id: 'local-setting',
239
- type: 'text',
240
- label: 'Local Setting',
241
- },
242
- ],
243
- },
244
- ],
245
- };
246
-
247
- it(`reports an error when ${label} block setting does not exist in existing local block`, async () => {
248
- const fileToTest = {
249
- 'sections/example.liquid': toLiquidFile({
250
- ...localBlocksTemplate,
251
- ...blockTemplate([
252
- {
253
- type: 'local-block',
254
- settings: {
255
- 'non-existent-setting-1': 'value',
256
- 'non-existent-setting-2': 'value',
257
- },
258
- },
259
- ]),
260
- }),
261
- };
262
-
263
- const offenses = await check(fileToTest, [ValidSettingsKey]);
264
- expect(offenses).to.have.length(2);
265
- expect(offenses[0].message).to.equal(
266
- `Setting 'non-existent-setting-1' does not exist in schema.`,
267
- );
268
- expect(offenses[1].message).to.equal(
269
- `Setting 'non-existent-setting-2' does not exist in schema.`,
270
- );
271
- });
272
-
273
- it(`does not report an error when ${label} block setting does not exist in non-existent local block`, async () => {
274
- const fileToTest = {
275
- 'sections/example.liquid': toLiquidFile({
276
- ...localBlocksTemplate,
277
- ...blockTemplate([
278
- {
279
- type: 'non-existent-local-block',
280
- settings: {
281
- 'non-existent-setting': 'value',
282
- },
283
- },
284
- ]),
285
- }),
286
- };
287
-
288
- const offenses = await check(fileToTest, [ValidSettingsKey]);
289
- expect(offenses).to.have.length(0);
290
- });
291
-
292
- it(`does not report an error when ${label} block setting exists in local block`, async () => {
293
- const fileToTest = {
294
- 'sections/example.liquid': toLiquidFile({
295
- ...localBlocksTemplate,
296
- ...blockTemplate([
297
- {
298
- type: 'local-block',
299
- settings: {
300
- 'local-setting': 'value',
301
- },
302
- },
303
- ]),
304
- }),
305
- };
306
-
307
- const offenses = await check(fileToTest, [ValidSettingsKey]);
308
- expect(offenses).to.have.length(0);
309
- });
310
- });
311
- });
312
- });
313
- });
314
-
315
- function toLiquidFile(content: any) {
316
- return `
317
- {% schema %}
318
- ${JSON.stringify(content)}
319
- {% endschema %}
320
- `;
321
- }
@@ -1,144 +0,0 @@
1
- import {
2
- LiquidCheckDefinition,
3
- Severity,
4
- SourceCodeType,
5
- Preset,
6
- Section,
7
- ThemeBlock,
8
- JSONNode,
9
- Setting,
10
- } from '../../types';
11
- import { nodeAtPath } from '../../json';
12
- import { getSchema, isSectionSchema } from '../../to-schema';
13
- import { BlockDefNodeWithPath, getBlocks, reportWarning } from '../../utils';
14
-
15
- export const ValidSettingsKey: LiquidCheckDefinition = {
16
- meta: {
17
- code: 'ValidSettingsKey',
18
- name: 'Validate settings key in presets',
19
- docs: {
20
- description:
21
- 'Ensures settings key only references valid settings defined in its respective schema',
22
- recommended: true,
23
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/valid-settings-key',
24
- },
25
- type: SourceCodeType.LiquidHtml,
26
- severity: Severity.ERROR,
27
- schema: {},
28
- targets: [],
29
- },
30
-
31
- create(context) {
32
- return {
33
- async LiquidRawTag(node) {
34
- if (node.name !== 'schema' || node.body.kind !== 'json') return;
35
-
36
- const offset = node.blockStartPosition.end;
37
- const schema = await getSchema(context);
38
-
39
- const { validSchema, ast } = schema ?? {};
40
- if (!validSchema || validSchema instanceof Error) return;
41
- if (!ast || ast instanceof Error) return;
42
-
43
- const { rootLevelLocalBlocks, presetLevelBlocks } = getBlocks(validSchema);
44
-
45
- // Check if presets settings match schema-level settings
46
- if (validSchema.presets) {
47
- for (let i = 0; i < validSchema.presets.length; i++) {
48
- const settingsNode = nodeAtPath(ast, ['presets', i, 'settings']);
49
-
50
- validateSettingsKey(context, offset, settingsNode, validSchema.settings);
51
- }
52
- }
53
-
54
- if (isSectionSchema(schema) && 'default' in validSchema && validSchema.default) {
55
- // Check if default settings match schema-level settings
56
- const settingsNode = nodeAtPath(ast, ['default', 'settings']);
57
-
58
- validateSettingsKey(context, offset, settingsNode, validSchema.settings);
59
-
60
- // Check if default block settings match the settings defined in the block file's schema
61
- await Promise.all(
62
- validSchema.default.blocks?.map((block, i) => {
63
- const settingsNode = nodeAtPath(ast, ['default', 'blocks', i, 'settings']);
64
- return validateReferencedBlock(
65
- context,
66
- offset,
67
- settingsNode,
68
- rootLevelLocalBlocks,
69
- block,
70
- );
71
- }) || [],
72
- );
73
- }
74
-
75
- // Check if preset block settings match the settings defined in the block file's schema
76
- await Promise.all(
77
- Object.entries(presetLevelBlocks).flatMap(([_depthStr, blocks]) =>
78
- blocks.map(({ node: blockNode, path }) => {
79
- const settingsNode = nodeAtPath(ast, path.slice(0, -1).concat('settings'));
80
-
81
- return validateReferencedBlock(
82
- context,
83
- offset,
84
- settingsNode,
85
- rootLevelLocalBlocks,
86
- blockNode,
87
- );
88
- }),
89
- ),
90
- );
91
- },
92
- };
93
- },
94
- };
95
-
96
- async function validateReferencedBlock(
97
- context: any,
98
- offset: number,
99
- settingsNode: JSONNode | undefined,
100
- localBlocks: BlockDefNodeWithPath[],
101
- referencedBlock: Preset.Block | Section.Block | ThemeBlock.Block,
102
- ) {
103
- if (localBlocks.length > 0) {
104
- const localBlock = localBlocks.find(
105
- (localBlock) => localBlock.node.type === referencedBlock.type,
106
- );
107
-
108
- if (!localBlock) return;
109
-
110
- const localBlockNode = localBlock.node as Section.LocalBlock;
111
-
112
- validateSettingsKey(context, offset, settingsNode, localBlockNode.settings);
113
- } else {
114
- const blockSchema = await context.getBlockSchema?.(referencedBlock.type);
115
- const { validSchema: validBlockSchema } = blockSchema ?? {};
116
- if (!validBlockSchema || validBlockSchema instanceof Error) return;
117
-
118
- validateSettingsKey(context, offset, settingsNode, validBlockSchema.settings, referencedBlock);
119
- }
120
- }
121
-
122
- function validateSettingsKey(
123
- context: any,
124
- offset: number,
125
- settingsNode: JSONNode | undefined,
126
- validSettings: Setting.Any[] | undefined,
127
- blockNode?: Section.Block | ThemeBlock.Block | Preset.Block,
128
- ) {
129
- if (!settingsNode || settingsNode.type !== 'Object') return;
130
-
131
- for (const setting of settingsNode.children) {
132
- const settingExists = validSettings?.find(
133
- (validSetting) => validSetting?.id === setting.key.value,
134
- );
135
-
136
- if (!settingExists) {
137
- const errorMessage = blockNode
138
- ? `Setting '${setting.key.value}' does not exist in 'blocks/${blockNode.type}.liquid'.`
139
- : `Setting '${setting.key.value}' does not exist in schema.`;
140
-
141
- reportWarning(errorMessage, offset, setting.key, context);
142
- }
143
- }
144
- }
@@ -1,38 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { check, MockTheme } from '../../test';
3
- import { ValidStaticBlockType } from '.';
4
-
5
- describe('Module: ValidStaticBlockType', () => {
6
- const genericThemeBlock = {
7
- 'blocks/valid.liquid': 'Hello world!',
8
- };
9
-
10
- const validTypeBlock = {
11
- 'blocks/file.liquid': '{% content_for "block", type: "valid", id: "static-block" %}',
12
- };
13
-
14
- const invalidTypeBlock = {
15
- 'blocks/file.liquid': '{% content_for "block", type: "invalid", id: "static-block" %}',
16
- };
17
-
18
- const validExtensionFiles: MockTheme = {
19
- ...genericThemeBlock,
20
- ...validTypeBlock,
21
- };
22
-
23
- const invalidExtensionFiles: MockTheme = {
24
- ...genericThemeBlock,
25
- ...invalidTypeBlock,
26
- };
27
-
28
- it('should not report any offenses if type is valid', async () => {
29
- const offenses = await check(validExtensionFiles);
30
- expect(offenses).toHaveLength(0);
31
- });
32
-
33
- it('should report an offense if type is invalid', async () => {
34
- const offenses = await check(invalidExtensionFiles);
35
- expect(offenses).toHaveLength(1);
36
- expect(offenses[0].message).to.equal("'blocks/invalid.liquid' does not exist");
37
- });
38
- });
@@ -1,58 +0,0 @@
1
- import { NodeTypes } from '@platformos/liquid-html-parser';
2
- import { LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
3
- import { doesFileExist } from '../../utils/file-utils';
4
- import { isContentForBlock } from '../../utils/markup';
5
-
6
- export const ValidStaticBlockType: LiquidCheckDefinition = {
7
- meta: {
8
- code: 'ValidStaticBlockType',
9
- name: 'Prevent use of type that is not valid for static blocks',
10
- docs: {
11
- description:
12
- 'This check is aimed at preventing the use of an invalid type for blocks rendered statically.',
13
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/valid-static-block-type',
14
- recommended: true,
15
- },
16
- type: SourceCodeType.LiquidHtml,
17
- severity: Severity.ERROR,
18
- schema: {},
19
- targets: [],
20
- },
21
-
22
- create(context) {
23
- return {
24
- async LiquidTag(node) {
25
- if (node.name !== 'content_for') {
26
- return;
27
- }
28
-
29
- if (!isContentForBlock(node.markup)) {
30
- return;
31
- }
32
-
33
- const typeArg = node.markup.args.find((arg) => arg.name === 'type');
34
- if (!typeArg) {
35
- return; // covered by VariableContentForArguments
36
- }
37
-
38
- const typeArgValueNode = typeArg.value;
39
- if (typeArgValueNode.type !== NodeTypes.String) {
40
- return; // covered by VariableContentForArguments
41
- }
42
-
43
- const blockName = typeArgValueNode.value;
44
- const relativePath = `blocks/${blockName}.liquid`;
45
- const fileExists = await doesFileExist(context, relativePath);
46
-
47
- if (!fileExists) {
48
- context.report({
49
- message: `'blocks/${blockName}.liquid' does not exist`,
50
- startIndex: typeArgValueNode.position.start,
51
- endIndex: typeArgValueNode.position.end,
52
- suggest: [],
53
- });
54
- }
55
- },
56
- };
57
- },
58
- };