@platformos/platformos-check-common 0.0.7 → 0.0.8

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 (309) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/AugmentedPlatformOSDocset.d.ts +11 -0
  3. package/dist/AugmentedPlatformOSDocset.js +81 -0
  4. package/dist/AugmentedPlatformOSDocset.js.map +1 -0
  5. package/dist/JSONValidator.js +1 -1
  6. package/dist/JSONValidator.js.map +1 -1
  7. package/dist/checks/deprecated-filter/index.js +4 -41
  8. package/dist/checks/deprecated-filter/index.js.map +1 -1
  9. package/dist/checks/deprecated-tag/index.js +21 -22
  10. package/dist/checks/deprecated-tag/index.js.map +1 -1
  11. package/dist/checks/duplicate-function-arguments/index.js +1 -1
  12. package/dist/checks/duplicate-function-arguments/index.js.map +1 -1
  13. package/dist/checks/duplicate-render-partial-arguments/index.js +1 -1
  14. package/dist/checks/duplicate-render-partial-arguments/index.js.map +1 -1
  15. package/dist/checks/graphql/index.js +1 -1
  16. package/dist/checks/graphql/index.js.map +1 -1
  17. package/dist/checks/img-width-and-height/index.js +1 -1
  18. package/dist/checks/img-width-and-height/index.js.map +1 -1
  19. package/dist/checks/index.d.ts +3 -3
  20. package/dist/checks/index.js +4 -79
  21. package/dist/checks/index.js.map +1 -1
  22. package/dist/checks/json-syntax-error/index.js +1 -1
  23. package/dist/checks/json-syntax-error/index.js.map +1 -1
  24. package/dist/checks/liquid-html-syntax-error/index.js +2 -2
  25. package/dist/checks/liquid-html-syntax-error/index.js.map +1 -1
  26. package/dist/checks/matching-translations/index.d.ts +2 -2
  27. package/dist/checks/matching-translations/index.js +20 -31
  28. package/dist/checks/matching-translations/index.js.map +1 -1
  29. package/dist/checks/metadata-params/index.js +6 -3
  30. package/dist/checks/metadata-params/index.js.map +1 -1
  31. package/dist/checks/missing-asset/index.js +1 -1
  32. package/dist/checks/missing-asset/index.js.map +1 -1
  33. package/dist/checks/missing-partial/index.d.ts +6 -0
  34. package/dist/checks/missing-partial/index.js +70 -0
  35. package/dist/checks/missing-partial/index.js.map +1 -0
  36. package/dist/checks/orphaned-partial/index.js +4 -4
  37. package/dist/checks/orphaned-partial/index.js.map +1 -1
  38. package/dist/checks/parser-blocking-script/index.js +10 -36
  39. package/dist/checks/parser-blocking-script/index.js.map +1 -1
  40. package/dist/checks/parser-blocking-script/suggestions.d.ts +1 -2
  41. package/dist/checks/parser-blocking-script/suggestions.js +1 -11
  42. package/dist/checks/parser-blocking-script/suggestions.js.map +1 -1
  43. package/dist/checks/reserved-doc-param-names/index.js +6 -5
  44. package/dist/checks/reserved-doc-param-names/index.js.map +1 -1
  45. package/dist/checks/translation-key-exists/index.js +1 -1
  46. package/dist/checks/translation-key-exists/index.js.map +1 -1
  47. package/dist/checks/unclosed-html-element/index.js +5 -1
  48. package/dist/checks/unclosed-html-element/index.js.map +1 -1
  49. package/dist/checks/undefined-object/index.js +7 -30
  50. package/dist/checks/undefined-object/index.js.map +1 -1
  51. package/dist/checks/unique-doc-param-names/index.js +1 -1
  52. package/dist/checks/unique-doc-param-names/index.js.map +1 -1
  53. package/dist/checks/unknown-filter/index.js +3 -3
  54. package/dist/checks/unknown-filter/index.js.map +1 -1
  55. package/dist/checks/unknown-property/index.js +1 -1
  56. package/dist/checks/unknown-property/index.js.map +1 -1
  57. package/dist/checks/unrecognized-render-partial-arguments/index.js +2 -2
  58. package/dist/checks/unrecognized-render-partial-arguments/index.js.map +1 -1
  59. package/dist/checks/unused-assign/index.js +1 -1
  60. package/dist/checks/unused-assign/index.js.map +1 -1
  61. package/dist/checks/unused-doc-param/index.js +1 -1
  62. package/dist/checks/unused-doc-param/index.js.map +1 -1
  63. package/dist/checks/utils.js +1 -1
  64. package/dist/checks/utils.js.map +1 -1
  65. package/dist/checks/valid-content-for-arguments/index.js +1 -1
  66. package/dist/checks/valid-content-for-arguments/index.js.map +1 -1
  67. package/dist/checks/valid-doc-param-types/index.js +4 -4
  68. package/dist/checks/valid-doc-param-types/index.js.map +1 -1
  69. package/dist/checks/valid-html-translation/index.d.ts +2 -2
  70. package/dist/checks/valid-html-translation/index.js +4 -4
  71. package/dist/checks/valid-html-translation/index.js.map +1 -1
  72. package/dist/checks/valid-json/index.js +1 -1
  73. package/dist/checks/valid-json/index.js.map +1 -1
  74. package/dist/checks/valid-render-partial-argument-types/index.js +2 -2
  75. package/dist/checks/valid-render-partial-argument-types/index.js.map +1 -1
  76. package/dist/checks/variable-name/index.js +1 -1
  77. package/dist/checks/variable-name/index.js.map +1 -1
  78. package/dist/context-utils.d.ts +2 -7
  79. package/dist/context-utils.js +39 -109
  80. package/dist/context-utils.js.map +1 -1
  81. package/dist/disabled-checks/index.js +4 -2
  82. package/dist/disabled-checks/index.js.map +1 -1
  83. package/dist/doc-generator/DocBlockGenerator.d.ts +16 -0
  84. package/dist/doc-generator/DocBlockGenerator.js +464 -0
  85. package/dist/doc-generator/DocBlockGenerator.js.map +1 -0
  86. package/dist/doc-generator/index.d.ts +1 -0
  87. package/dist/doc-generator/index.js +6 -0
  88. package/dist/doc-generator/index.js.map +1 -0
  89. package/dist/find-root.d.ts +7 -10
  90. package/dist/find-root.js +10 -17
  91. package/dist/find-root.js.map +1 -1
  92. package/dist/fixes/autofix.d.ts +4 -4
  93. package/dist/fixes/autofix.js +2 -2
  94. package/dist/fixes/autofix.js.map +1 -1
  95. package/dist/fixes/correctors/index.js +4 -0
  96. package/dist/fixes/correctors/index.js.map +1 -1
  97. package/dist/index.d.ts +4 -5
  98. package/dist/index.js +34 -17
  99. package/dist/index.js.map +1 -1
  100. package/dist/jsonc/parse.d.ts +1 -1
  101. package/dist/jsonc/parse.js +1 -1
  102. package/dist/liquid-doc/arguments.d.ts +7 -8
  103. package/dist/liquid-doc/arguments.js +20 -28
  104. package/dist/liquid-doc/arguments.js.map +1 -1
  105. package/dist/liquid-doc/liquidDoc.d.ts +1 -1
  106. package/dist/liquid-doc/liquidDoc.js.map +1 -1
  107. package/dist/liquid-doc/utils.d.ts +1 -1
  108. package/dist/liquid-doc/utils.js +4 -3
  109. package/dist/liquid-doc/utils.js.map +1 -1
  110. package/dist/path.d.ts +1 -0
  111. package/dist/path.js +5 -1
  112. package/dist/path.js.map +1 -1
  113. package/dist/test/MockApp.d.ts +16 -0
  114. package/dist/test/MockApp.js +16 -0
  115. package/dist/test/MockApp.js.map +1 -0
  116. package/dist/test/MockFileSystem.d.ts +3 -3
  117. package/dist/test/MockFileSystem.js +6 -6
  118. package/dist/test/MockFileSystem.js.map +1 -1
  119. package/dist/test/index.d.ts +1 -1
  120. package/dist/test/index.js +1 -1
  121. package/dist/test/index.js.map +1 -1
  122. package/dist/test/test-helper.d.ts +10 -9
  123. package/dist/test/test-helper.js +15 -106
  124. package/dist/test/test-helper.js.map +1 -1
  125. package/dist/to-schema.d.ts +1 -1
  126. package/dist/to-source-code.d.ts +3 -2
  127. package/dist/to-source-code.js +20 -0
  128. package/dist/to-source-code.js.map +1 -1
  129. package/dist/tsconfig.tsbuildinfo +1 -1
  130. package/dist/types/platformos-liquid-docs.d.ts +128 -0
  131. package/dist/types/platformos-liquid-docs.js +3 -0
  132. package/dist/types/platformos-liquid-docs.js.map +1 -0
  133. package/dist/types/schemas/index.d.ts +0 -2
  134. package/dist/types/schemas/index.js.map +1 -1
  135. package/dist/types.d.ts +18 -67
  136. package/dist/types.js +3 -5
  137. package/dist/types.js.map +1 -1
  138. package/dist/utils/block.js.map +1 -1
  139. package/dist/utils/index.d.ts +0 -1
  140. package/dist/utils/index.js +0 -1
  141. package/dist/utils/index.js.map +1 -1
  142. package/dist/yaml/parse.d.ts +5 -0
  143. package/dist/yaml/parse.js +94 -0
  144. package/dist/yaml/parse.js.map +1 -0
  145. package/package.json +4 -3
  146. package/src/{AugmentedThemeDocset.spec.ts → AugmentedPlatformOSDocset.spec.ts} +47 -34
  147. package/src/AugmentedPlatformOSDocset.ts +89 -0
  148. package/src/JSONValidator.ts +1 -1
  149. package/src/checks/deprecated-filter/index.spec.ts +76 -248
  150. package/src/checks/deprecated-filter/index.ts +5 -53
  151. package/src/checks/deprecated-tag/index.spec.ts +85 -34
  152. package/src/checks/deprecated-tag/index.ts +27 -22
  153. package/src/checks/duplicate-function-arguments/index.ts +1 -1
  154. package/src/checks/duplicate-render-partial-arguments/index.ts +1 -1
  155. package/src/checks/graphql/index.ts +1 -1
  156. package/src/checks/img-width-and-height/index.ts +1 -1
  157. package/src/checks/index.ts +11 -80
  158. package/src/checks/invalid-hash-assign-target/index.spec.ts +14 -14
  159. package/src/checks/json-syntax-error/index.ts +1 -1
  160. package/src/checks/liquid-html-syntax-error/checks/InvalidBooleanExpression.spec.ts +0 -11
  161. package/src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.spec.ts +1 -2
  162. package/src/checks/liquid-html-syntax-error/index.spec.ts +1 -6
  163. package/src/checks/liquid-html-syntax-error/index.ts +2 -2
  164. package/src/checks/matching-translations/index.spec.ts +89 -346
  165. package/src/checks/matching-translations/index.ts +24 -35
  166. package/src/checks/metadata-params/index.ts +5 -7
  167. package/src/checks/missing-asset/index.ts +1 -1
  168. package/src/checks/{missing-template → missing-partial}/index.spec.ts +6 -6
  169. package/src/checks/{missing-template → missing-partial}/index.ts +6 -20
  170. package/src/checks/orphaned-partial/index.ts +3 -3
  171. package/src/checks/parser-blocking-script/index.spec.ts +0 -118
  172. package/src/checks/parser-blocking-script/index.ts +3 -33
  173. package/src/checks/parser-blocking-script/suggestions.ts +1 -28
  174. package/src/checks/translation-key-exists/index.ts +1 -1
  175. package/src/checks/unclosed-html-element/index.ts +5 -1
  176. package/src/checks/undefined-object/index.spec.ts +3 -109
  177. package/src/checks/undefined-object/index.ts +8 -33
  178. package/src/checks/unique-doc-param-names/index.ts +1 -1
  179. package/src/checks/unknown-filter/index.spec.ts +2 -2
  180. package/src/checks/unknown-filter/index.ts +3 -3
  181. package/src/checks/unknown-property/index.ts +1 -1
  182. package/src/checks/unrecognized-render-partial-arguments/index.spec.ts +5 -5
  183. package/src/checks/unrecognized-render-partial-arguments/index.ts +2 -5
  184. package/src/checks/unused-assign/index.spec.ts +0 -30
  185. package/src/checks/unused-assign/index.ts +1 -1
  186. package/src/checks/unused-doc-param/index.ts +1 -1
  187. package/src/checks/utils.ts +1 -1
  188. package/src/checks/valid-doc-param-types/index.ts +4 -4
  189. package/src/checks/valid-html-translation/index.spec.ts +42 -32
  190. package/src/checks/valid-html-translation/index.ts +7 -7
  191. package/src/checks/valid-json/index.ts +1 -1
  192. package/src/checks/valid-render-partial-argument-types/index.ts +2 -5
  193. package/src/checks/variable-name/index.ts +1 -1
  194. package/src/context-utils.spec.ts +49 -77
  195. package/src/context-utils.ts +39 -128
  196. package/src/disabled-checks/index.spec.ts +35 -0
  197. package/src/disabled-checks/index.ts +4 -2
  198. package/src/find-root.ts +12 -22
  199. package/src/fixes/autofix.spec.ts +2 -2
  200. package/src/fixes/autofix.ts +4 -4
  201. package/src/fixes/correctors/index.ts +4 -0
  202. package/src/ignore.spec.ts +0 -1
  203. package/src/index.ts +33 -21
  204. package/src/jsonc/parse.ts +1 -1
  205. package/src/liquid-doc/arguments.spec.ts +19 -45
  206. package/src/liquid-doc/arguments.ts +26 -39
  207. package/src/liquid-doc/liquidDoc.ts +1 -2
  208. package/src/liquid-doc/utils.ts +4 -3
  209. package/src/path.ts +1 -0
  210. package/src/test/{MockTheme.ts → MockApp.ts} +1 -1
  211. package/src/test/MockFileSystem.ts +6 -6
  212. package/src/test/index.ts +1 -1
  213. package/src/test/test-helper.ts +29 -127
  214. package/src/to-source-code.ts +20 -1
  215. package/src/types/{theme-liquid-docs.ts → platformos-liquid-docs.ts} +8 -13
  216. package/src/types/schemas/index.ts +0 -2
  217. package/src/types.ts +21 -92
  218. package/src/utils/index.ts +0 -1
  219. package/src/yaml/parse.ts +111 -0
  220. package/src/AugmentedThemeDocset.ts +0 -137
  221. package/src/checks/app-block-missing-schema/index.spec.ts +0 -121
  222. package/src/checks/app-block-missing-schema/index.ts +0 -46
  223. package/src/checks/app-block-valid-tags/index.spec.ts +0 -96
  224. package/src/checks/app-block-valid-tags/index.ts +0 -54
  225. package/src/checks/asset-preload/index.spec.ts +0 -78
  226. package/src/checks/asset-preload/index.ts +0 -65
  227. package/src/checks/asset-size-app-block-css/index.spec.ts +0 -88
  228. package/src/checks/asset-size-app-block-css/index.ts +0 -78
  229. package/src/checks/asset-size-app-block-javascript/index.spec.ts +0 -66
  230. package/src/checks/asset-size-app-block-javascript/index.ts +0 -78
  231. package/src/checks/asset-size-css/index.spec.ts +0 -166
  232. package/src/checks/asset-size-css/index.ts +0 -160
  233. package/src/checks/asset-size-javascript/index.spec.ts +0 -184
  234. package/src/checks/asset-size-javascript/index.ts +0 -144
  235. package/src/checks/block-id-usage/index.spec.ts +0 -76
  236. package/src/checks/block-id-usage/index.ts +0 -72
  237. package/src/checks/cdn-preconnect/index.spec.ts +0 -40
  238. package/src/checks/cdn-preconnect/index.ts +0 -43
  239. package/src/checks/content-for-header-modification/index.spec.ts +0 -65
  240. package/src/checks/content-for-header-modification/index.ts +0 -72
  241. package/src/checks/deprecate-bgsizes/index.spec.ts +0 -41
  242. package/src/checks/deprecate-bgsizes/index.ts +0 -49
  243. package/src/checks/deprecate-lazysizes/index.spec.ts +0 -26
  244. package/src/checks/deprecate-lazysizes/index.ts +0 -58
  245. package/src/checks/deprecated-filter/fixes.ts +0 -264
  246. package/src/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.ts +0 -1343
  247. package/src/checks/deprecated-fonts-on-sections-and-blocks/index.spec.ts +0 -613
  248. package/src/checks/deprecated-fonts-on-sections-and-blocks/index.ts +0 -284
  249. package/src/checks/deprecated-fonts-on-settings-schema/index.spec.ts +0 -102
  250. package/src/checks/deprecated-fonts-on-settings-schema/index.ts +0 -66
  251. package/src/checks/duplicate-content-for-arguments/index.spec.ts +0 -98
  252. package/src/checks/duplicate-content-for-arguments/index.ts +0 -43
  253. package/src/checks/empty-block-content/index.spec.ts +0 -117
  254. package/src/checks/empty-block-content/index.ts +0 -60
  255. package/src/checks/hardcoded-routes/index.spec.ts +0 -58
  256. package/src/checks/hardcoded-routes/index.ts +0 -100
  257. package/src/checks/json-missing-block/index.spec.ts +0 -435
  258. package/src/checks/json-missing-block/index.ts +0 -56
  259. package/src/checks/json-missing-block/missing-block-utils.ts +0 -147
  260. package/src/checks/liquid-free-settings/index.spec.ts +0 -180
  261. package/src/checks/liquid-free-settings/index.ts +0 -79
  262. package/src/checks/missing-content-for-arguments/index.spec.ts +0 -144
  263. package/src/checks/missing-content-for-arguments/index.ts +0 -46
  264. package/src/checks/pagination-size/index.spec.ts +0 -158
  265. package/src/checks/pagination-size/index.ts +0 -104
  266. package/src/checks/remote-asset/index.spec.ts +0 -280
  267. package/src/checks/remote-asset/index.ts +0 -238
  268. package/src/checks/reserved-doc-param-names/index.spec.ts +0 -62
  269. package/src/checks/reserved-doc-param-names/index.ts +0 -57
  270. package/src/checks/schema-presets-block-order/index.spec.ts +0 -344
  271. package/src/checks/schema-presets-block-order/index.ts +0 -154
  272. package/src/checks/schema-presets-static-blocks/index.spec.ts +0 -145
  273. package/src/checks/schema-presets-static-blocks/index.ts +0 -126
  274. package/src/checks/static-stylesheet-and-javascript-tags/index.spec.ts +0 -257
  275. package/src/checks/static-stylesheet-and-javascript-tags/index.ts +0 -48
  276. package/src/checks/unique-settings-id/index.spec.ts +0 -24
  277. package/src/checks/unique-settings-id/index.ts +0 -84
  278. package/src/checks/unique-settings-id/test-data.ts +0 -1191
  279. package/src/checks/unique-static-block-id/index.spec.ts +0 -55
  280. package/src/checks/unique-static-block-id/index.ts +0 -60
  281. package/src/checks/unrecognized-content-for-arguments/index.spec.ts +0 -145
  282. package/src/checks/unrecognized-content-for-arguments/index.ts +0 -55
  283. package/src/checks/valid-block-target/index.spec.ts +0 -1396
  284. package/src/checks/valid-block-target/index.ts +0 -142
  285. package/src/checks/valid-content-for-argument-types/index.spec.ts +0 -382
  286. package/src/checks/valid-content-for-argument-types/index.ts +0 -42
  287. package/src/checks/valid-content-for-arguments/index.spec.ts +0 -107
  288. package/src/checks/valid-content-for-arguments/index.ts +0 -98
  289. package/src/checks/valid-local-blocks/index.spec.ts +0 -286
  290. package/src/checks/valid-local-blocks/index.ts +0 -100
  291. package/src/checks/valid-local-blocks/valid-block-utils.ts +0 -97
  292. package/src/checks/valid-schema/index.spec.ts +0 -174
  293. package/src/checks/valid-schema/index.ts +0 -41
  294. package/src/checks/valid-schema-name/index.spec.ts +0 -112
  295. package/src/checks/valid-schema-name/index.ts +0 -75
  296. package/src/checks/valid-settings-key/index.spec.ts +0 -321
  297. package/src/checks/valid-settings-key/index.ts +0 -144
  298. package/src/checks/valid-static-block-type/index.spec.ts +0 -38
  299. package/src/checks/valid-static-block-type/index.ts +0 -58
  300. package/src/checks/valid-visible-if/index.spec.ts +0 -619
  301. package/src/checks/valid-visible-if/index.ts +0 -184
  302. package/src/checks/valid-visible-if/visible-if-utils.ts +0 -158
  303. package/src/tags/content-for.ts +0 -25
  304. package/src/to-schema.ts +0 -231
  305. package/src/types/schemas/section.ts +0 -86
  306. package/src/types/schemas/theme-block.ts +0 -34
  307. package/src/types/theme-schemas.ts +0 -80
  308. package/src/utils/block.ts +0 -300
  309. 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
- };