@platformos/platformos-check-common 0.0.6 → 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 (304) hide show
  1. package/CHANGELOG.md +16 -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/find-root.d.ts +7 -10
  84. package/dist/find-root.js +10 -17
  85. package/dist/find-root.js.map +1 -1
  86. package/dist/fixes/autofix.d.ts +4 -4
  87. package/dist/fixes/autofix.js +2 -2
  88. package/dist/fixes/autofix.js.map +1 -1
  89. package/dist/fixes/correctors/index.js +4 -0
  90. package/dist/fixes/correctors/index.js.map +1 -1
  91. package/dist/index.d.ts +4 -5
  92. package/dist/index.js +34 -17
  93. package/dist/index.js.map +1 -1
  94. package/dist/jsonc/parse.d.ts +1 -1
  95. package/dist/jsonc/parse.js +1 -1
  96. package/dist/liquid-doc/arguments.d.ts +7 -8
  97. package/dist/liquid-doc/arguments.js +20 -28
  98. package/dist/liquid-doc/arguments.js.map +1 -1
  99. package/dist/liquid-doc/liquidDoc.d.ts +1 -1
  100. package/dist/liquid-doc/liquidDoc.js.map +1 -1
  101. package/dist/liquid-doc/utils.d.ts +1 -1
  102. package/dist/liquid-doc/utils.js +4 -3
  103. package/dist/liquid-doc/utils.js.map +1 -1
  104. package/dist/path.d.ts +1 -0
  105. package/dist/path.js +5 -1
  106. package/dist/path.js.map +1 -1
  107. package/dist/test/MockApp.d.ts +16 -0
  108. package/dist/test/MockApp.js +16 -0
  109. package/dist/test/MockApp.js.map +1 -0
  110. package/dist/test/MockFileSystem.d.ts +3 -3
  111. package/dist/test/MockFileSystem.js +6 -6
  112. package/dist/test/MockFileSystem.js.map +1 -1
  113. package/dist/test/index.d.ts +1 -1
  114. package/dist/test/index.js +1 -1
  115. package/dist/test/index.js.map +1 -1
  116. package/dist/test/test-helper.d.ts +10 -9
  117. package/dist/test/test-helper.js +15 -106
  118. package/dist/test/test-helper.js.map +1 -1
  119. package/dist/to-source-code.d.ts +4 -3
  120. package/dist/to-source-code.js +20 -0
  121. package/dist/to-source-code.js.map +1 -1
  122. package/dist/tsconfig.tsbuildinfo +1 -1
  123. package/dist/types/platformos-liquid-docs.d.ts +128 -0
  124. package/dist/types/platformos-liquid-docs.js +3 -0
  125. package/dist/types/platformos-liquid-docs.js.map +1 -0
  126. package/dist/types/schemas/index.d.ts +0 -2
  127. package/dist/types/schemas/index.js.map +1 -1
  128. package/dist/types.d.ts +18 -67
  129. package/dist/types.js +3 -5
  130. package/dist/types.js.map +1 -1
  131. package/dist/utils/file-utils.js +1 -2
  132. package/dist/utils/file-utils.js.map +1 -1
  133. package/dist/utils/index.d.ts +0 -1
  134. package/dist/utils/index.js +0 -1
  135. package/dist/utils/index.js.map +1 -1
  136. package/dist/yaml/parse.d.ts +5 -0
  137. package/dist/yaml/parse.js +94 -0
  138. package/dist/yaml/parse.js.map +1 -0
  139. package/package.json +9 -9
  140. package/src/{AugmentedThemeDocset.spec.ts → AugmentedPlatformOSDocset.spec.ts} +47 -34
  141. package/src/AugmentedPlatformOSDocset.ts +89 -0
  142. package/src/JSONValidator.ts +1 -1
  143. package/src/checks/deprecated-filter/index.spec.ts +76 -248
  144. package/src/checks/deprecated-filter/index.ts +5 -53
  145. package/src/checks/deprecated-tag/index.spec.ts +85 -34
  146. package/src/checks/deprecated-tag/index.ts +27 -22
  147. package/src/checks/duplicate-function-arguments/index.ts +1 -1
  148. package/src/checks/duplicate-render-partial-arguments/index.ts +1 -1
  149. package/src/checks/graphql/index.ts +1 -1
  150. package/src/checks/img-width-and-height/index.ts +1 -1
  151. package/src/checks/index.ts +11 -80
  152. package/src/checks/invalid-hash-assign-target/index.spec.ts +14 -14
  153. package/src/checks/json-syntax-error/index.ts +1 -1
  154. package/src/checks/liquid-html-syntax-error/checks/InvalidBooleanExpression.spec.ts +0 -11
  155. package/src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.spec.ts +1 -2
  156. package/src/checks/liquid-html-syntax-error/index.spec.ts +1 -6
  157. package/src/checks/liquid-html-syntax-error/index.ts +2 -2
  158. package/src/checks/matching-translations/index.spec.ts +89 -346
  159. package/src/checks/matching-translations/index.ts +24 -35
  160. package/src/checks/metadata-params/index.ts +5 -7
  161. package/src/checks/missing-asset/index.ts +1 -1
  162. package/src/checks/{missing-template → missing-partial}/index.spec.ts +6 -6
  163. package/src/checks/{missing-template → missing-partial}/index.ts +6 -20
  164. package/src/checks/orphaned-partial/index.ts +3 -3
  165. package/src/checks/parser-blocking-script/index.spec.ts +0 -118
  166. package/src/checks/parser-blocking-script/index.ts +3 -33
  167. package/src/checks/parser-blocking-script/suggestions.ts +1 -28
  168. package/src/checks/translation-key-exists/index.ts +1 -1
  169. package/src/checks/unclosed-html-element/index.ts +5 -1
  170. package/src/checks/undefined-object/index.spec.ts +3 -109
  171. package/src/checks/undefined-object/index.ts +8 -33
  172. package/src/checks/unique-doc-param-names/index.ts +1 -1
  173. package/src/checks/unknown-filter/index.spec.ts +2 -2
  174. package/src/checks/unknown-filter/index.ts +3 -3
  175. package/src/checks/unknown-property/index.ts +1 -1
  176. package/src/checks/unrecognized-render-partial-arguments/index.spec.ts +5 -5
  177. package/src/checks/unrecognized-render-partial-arguments/index.ts +2 -5
  178. package/src/checks/unused-assign/index.spec.ts +0 -30
  179. package/src/checks/unused-assign/index.ts +1 -1
  180. package/src/checks/unused-doc-param/index.ts +1 -1
  181. package/src/checks/utils.ts +1 -1
  182. package/src/checks/valid-doc-param-types/index.ts +4 -4
  183. package/src/checks/valid-html-translation/index.spec.ts +42 -32
  184. package/src/checks/valid-html-translation/index.ts +7 -7
  185. package/src/checks/valid-json/index.ts +1 -1
  186. package/src/checks/valid-render-partial-argument-types/index.ts +2 -5
  187. package/src/checks/variable-name/index.ts +1 -1
  188. package/src/context-utils.spec.ts +49 -77
  189. package/src/context-utils.ts +39 -128
  190. package/src/disabled-checks/index.spec.ts +35 -0
  191. package/src/disabled-checks/index.ts +4 -2
  192. package/src/find-root.ts +12 -22
  193. package/src/fixes/autofix.spec.ts +2 -2
  194. package/src/fixes/autofix.ts +4 -4
  195. package/src/fixes/correctors/index.ts +4 -0
  196. package/src/ignore.spec.ts +0 -1
  197. package/src/index.ts +33 -21
  198. package/src/jsonc/parse.ts +1 -1
  199. package/src/liquid-doc/arguments.spec.ts +19 -45
  200. package/src/liquid-doc/arguments.ts +26 -39
  201. package/src/liquid-doc/liquidDoc.ts +1 -2
  202. package/src/liquid-doc/utils.ts +4 -3
  203. package/src/path.ts +1 -0
  204. package/src/test/{MockTheme.ts → MockApp.ts} +1 -1
  205. package/src/test/MockFileSystem.ts +9 -6
  206. package/src/test/index.ts +1 -1
  207. package/src/test/test-helper.ts +29 -127
  208. package/src/to-source-code.ts +20 -1
  209. package/src/types/{theme-liquid-docs.ts → platformos-liquid-docs.ts} +8 -13
  210. package/src/types/schemas/index.ts +0 -2
  211. package/src/types.ts +21 -92
  212. package/src/utils/file-utils.ts +0 -1
  213. package/src/utils/index.ts +0 -1
  214. package/src/yaml/parse.ts +111 -0
  215. package/src/AugmentedThemeDocset.ts +0 -137
  216. package/src/checks/app-block-missing-schema/index.spec.ts +0 -121
  217. package/src/checks/app-block-missing-schema/index.ts +0 -46
  218. package/src/checks/app-block-valid-tags/index.spec.ts +0 -96
  219. package/src/checks/app-block-valid-tags/index.ts +0 -54
  220. package/src/checks/asset-preload/index.spec.ts +0 -78
  221. package/src/checks/asset-preload/index.ts +0 -65
  222. package/src/checks/asset-size-app-block-css/index.spec.ts +0 -88
  223. package/src/checks/asset-size-app-block-css/index.ts +0 -78
  224. package/src/checks/asset-size-app-block-javascript/index.spec.ts +0 -66
  225. package/src/checks/asset-size-app-block-javascript/index.ts +0 -78
  226. package/src/checks/asset-size-css/index.spec.ts +0 -166
  227. package/src/checks/asset-size-css/index.ts +0 -160
  228. package/src/checks/asset-size-javascript/index.spec.ts +0 -184
  229. package/src/checks/asset-size-javascript/index.ts +0 -144
  230. package/src/checks/block-id-usage/index.spec.ts +0 -76
  231. package/src/checks/block-id-usage/index.ts +0 -72
  232. package/src/checks/cdn-preconnect/index.spec.ts +0 -40
  233. package/src/checks/cdn-preconnect/index.ts +0 -43
  234. package/src/checks/content-for-header-modification/index.spec.ts +0 -65
  235. package/src/checks/content-for-header-modification/index.ts +0 -72
  236. package/src/checks/deprecate-bgsizes/index.spec.ts +0 -41
  237. package/src/checks/deprecate-bgsizes/index.ts +0 -49
  238. package/src/checks/deprecate-lazysizes/index.spec.ts +0 -26
  239. package/src/checks/deprecate-lazysizes/index.ts +0 -58
  240. package/src/checks/deprecated-filter/fixes.ts +0 -264
  241. package/src/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.ts +0 -1343
  242. package/src/checks/deprecated-fonts-on-sections-and-blocks/index.spec.ts +0 -613
  243. package/src/checks/deprecated-fonts-on-sections-and-blocks/index.ts +0 -284
  244. package/src/checks/deprecated-fonts-on-settings-schema/index.spec.ts +0 -102
  245. package/src/checks/deprecated-fonts-on-settings-schema/index.ts +0 -66
  246. package/src/checks/duplicate-content-for-arguments/index.spec.ts +0 -98
  247. package/src/checks/duplicate-content-for-arguments/index.ts +0 -43
  248. package/src/checks/empty-block-content/index.spec.ts +0 -117
  249. package/src/checks/empty-block-content/index.ts +0 -60
  250. package/src/checks/hardcoded-routes/index.spec.ts +0 -58
  251. package/src/checks/hardcoded-routes/index.ts +0 -100
  252. package/src/checks/json-missing-block/index.spec.ts +0 -435
  253. package/src/checks/json-missing-block/index.ts +0 -56
  254. package/src/checks/json-missing-block/missing-block-utils.ts +0 -147
  255. package/src/checks/liquid-free-settings/index.spec.ts +0 -180
  256. package/src/checks/liquid-free-settings/index.ts +0 -79
  257. package/src/checks/missing-content-for-arguments/index.spec.ts +0 -144
  258. package/src/checks/missing-content-for-arguments/index.ts +0 -46
  259. package/src/checks/pagination-size/index.spec.ts +0 -158
  260. package/src/checks/pagination-size/index.ts +0 -104
  261. package/src/checks/remote-asset/index.spec.ts +0 -280
  262. package/src/checks/remote-asset/index.ts +0 -238
  263. package/src/checks/reserved-doc-param-names/index.spec.ts +0 -62
  264. package/src/checks/reserved-doc-param-names/index.ts +0 -57
  265. package/src/checks/schema-presets-block-order/index.spec.ts +0 -344
  266. package/src/checks/schema-presets-block-order/index.ts +0 -154
  267. package/src/checks/schema-presets-static-blocks/index.spec.ts +0 -145
  268. package/src/checks/schema-presets-static-blocks/index.ts +0 -126
  269. package/src/checks/static-stylesheet-and-javascript-tags/index.spec.ts +0 -257
  270. package/src/checks/static-stylesheet-and-javascript-tags/index.ts +0 -48
  271. package/src/checks/unique-settings-id/index.spec.ts +0 -24
  272. package/src/checks/unique-settings-id/index.ts +0 -84
  273. package/src/checks/unique-settings-id/test-data.ts +0 -1191
  274. package/src/checks/unique-static-block-id/index.spec.ts +0 -55
  275. package/src/checks/unique-static-block-id/index.ts +0 -60
  276. package/src/checks/unrecognized-content-for-arguments/index.spec.ts +0 -145
  277. package/src/checks/unrecognized-content-for-arguments/index.ts +0 -55
  278. package/src/checks/valid-block-target/index.spec.ts +0 -1396
  279. package/src/checks/valid-block-target/index.ts +0 -142
  280. package/src/checks/valid-content-for-argument-types/index.spec.ts +0 -382
  281. package/src/checks/valid-content-for-argument-types/index.ts +0 -42
  282. package/src/checks/valid-content-for-arguments/index.spec.ts +0 -107
  283. package/src/checks/valid-content-for-arguments/index.ts +0 -98
  284. package/src/checks/valid-local-blocks/index.spec.ts +0 -286
  285. package/src/checks/valid-local-blocks/index.ts +0 -100
  286. package/src/checks/valid-local-blocks/valid-block-utils.ts +0 -97
  287. package/src/checks/valid-schema/index.spec.ts +0 -174
  288. package/src/checks/valid-schema/index.ts +0 -41
  289. package/src/checks/valid-schema-name/index.spec.ts +0 -112
  290. package/src/checks/valid-schema-name/index.ts +0 -75
  291. package/src/checks/valid-settings-key/index.spec.ts +0 -321
  292. package/src/checks/valid-settings-key/index.ts +0 -144
  293. package/src/checks/valid-static-block-type/index.spec.ts +0 -38
  294. package/src/checks/valid-static-block-type/index.ts +0 -58
  295. package/src/checks/valid-visible-if/index.spec.ts +0 -619
  296. package/src/checks/valid-visible-if/index.ts +0 -184
  297. package/src/checks/valid-visible-if/visible-if-utils.ts +0 -158
  298. package/src/tags/content-for.ts +0 -25
  299. package/src/to-schema.ts +0 -231
  300. package/src/types/schemas/section.ts +0 -86
  301. package/src/types/schemas/theme-block.ts +0 -34
  302. package/src/types/theme-schemas.ts +0 -80
  303. package/src/utils/block.ts +0 -300
  304. package/src/utils/markup.ts +0 -10
@@ -1,117 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { EmptyBlockContent } from '.';
3
- import { check, MockTheme } from '../../test';
4
-
5
- describe('Module: EmptyBlockContent', () => {
6
- const paths = ['sections', 'blocks'];
7
-
8
- paths.forEach((path) => {
9
- it(`should not report offenses when the blocks array is not empty in ${path}`, async () => {
10
- const theme: MockTheme = {
11
- [`${path}/test_block.liquid`]: `
12
- <div>
13
- {% content_for 'blocks' %}
14
- </div>
15
- {% schema %}
16
- {
17
- "name": "Test",
18
- "blocks": [
19
- {
20
- "type": "test-block"
21
- }
22
- ]
23
- }
24
- {% endschema %}
25
- `,
26
- };
27
-
28
- const offenses = await check(theme, [EmptyBlockContent]);
29
- expect(offenses).to.have.length(0);
30
- });
31
-
32
- it(`should report offenses when the blocks array is empty in ${path}`, async () => {
33
- const theme: MockTheme = {
34
- [`${path}/test_block.liquid`]: `
35
- <div>
36
- {% content_for 'blocks' %}
37
- </div>
38
- {% schema %}
39
- {
40
- "name": "Test",
41
- "blocks": []
42
- }
43
- {% endschema %}
44
- `,
45
- };
46
-
47
- const offenses = await check(theme, [EmptyBlockContent]);
48
- expect(offenses).to.have.length(1);
49
- expect(offenses[0].message).to.equal(
50
- `The 'content_for "blocks"' tag is present, but the blocks array is empty.`,
51
- );
52
- });
53
-
54
- it(`should report offenses when the blocks array is empty with the correct indices in ${path}`, async () => {
55
- const theme: MockTheme = {
56
- [`${path}/test_block.liquid`]: `
57
- <div>
58
- {% content_for 'blocks' %}
59
- </div>
60
- {% schema %}
61
- {
62
- "name": "Test",
63
- "blocks": []
64
- }
65
- {% endschema %}
66
- `,
67
- };
68
-
69
- const offenses = await check(theme, [EmptyBlockContent]);
70
- expect(offenses).to.have.length(1);
71
- const content = theme[`${path}/test_block.liquid`];
72
- const erroredContent = content.slice(offenses[0].start.index, offenses[0].end.index);
73
- expect(erroredContent).to.equal("{% content_for 'blocks' %}");
74
- });
75
-
76
- it(`should report offenses when the blocks array has not been defined in ${path}`, async () => {
77
- const theme: MockTheme = {
78
- [`${path}/test_block.liquid`]: `
79
- <div>
80
- {% content_for 'blocks' %}
81
- </div>
82
- {% schema %}
83
- {
84
- "name": "Test"
85
- }
86
- {% endschema %}
87
- `,
88
- };
89
-
90
- const offenses = await check(theme, [EmptyBlockContent]);
91
- expect(offenses).to.have.length(1);
92
- expect(offenses[0].message).to.equal(
93
- `The 'content_for "blocks"' tag is present, but the blocks array is not defined.`,
94
- );
95
- });
96
-
97
- it(`should not report offenses when 'content_for blocks' is not present in ${path}`, async () => {
98
- const theme: MockTheme = {
99
- [`${path}/test_block.liquid`]: `
100
- {% schema %}
101
- {
102
- "name": "Test",
103
- "blocks": [
104
- {
105
- "type": "test-block"
106
- }
107
- ]
108
- }
109
- {% endschema %}
110
- `,
111
- };
112
-
113
- const offenses = await check(theme, [EmptyBlockContent]);
114
- expect(offenses).to.be.empty;
115
- });
116
- });
117
- });
@@ -1,60 +0,0 @@
1
- import { LiquidCheckDefinition, Severity, SourceCodeType } from '../../types';
2
- import { getSchema } from '../../to-schema';
3
- import { Position } from '@platformos/liquid-html-parser';
4
-
5
- export const EmptyBlockContent: LiquidCheckDefinition = {
6
- meta: {
7
- code: 'EmptyBlockContent',
8
- name: 'Prevent empty block content',
9
- docs: {
10
- description:
11
- 'This check exists to warn you when the blocks array at the root level of the schema is empty.',
12
- recommended: true,
13
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/empty-block-content',
14
- },
15
- type: SourceCodeType.LiquidHtml,
16
- severity: Severity.WARNING,
17
- schema: {},
18
- targets: [],
19
- },
20
-
21
- create(context) {
22
- let isContentForBlocksLocationSet = false;
23
- let contentForBlocksLocation: Position = { start: 0, end: 0 };
24
-
25
- return {
26
- async LiquidTag(node) {
27
- if (node.name !== 'content_for') return;
28
-
29
- const nodeMarkup = node.markup;
30
- if (typeof nodeMarkup === 'object' && nodeMarkup.contentForType.value === 'blocks') {
31
- contentForBlocksLocation.start = node.blockStartPosition.start;
32
- contentForBlocksLocation.end = node.blockStartPosition.end;
33
- isContentForBlocksLocationSet = true;
34
- }
35
- },
36
-
37
- async onCodePathEnd() {
38
- const schema = await getSchema(context);
39
- const { validSchema, ast } = schema ?? {};
40
- if (!validSchema || validSchema instanceof Error) return;
41
- if (!ast || ast instanceof Error) return;
42
-
43
- const blocks = validSchema.blocks;
44
- if (isContentForBlocksLocationSet && !blocks) {
45
- context.report({
46
- message: `The 'content_for "blocks"' tag is present, but the blocks array is not defined.`,
47
- startIndex: contentForBlocksLocation.start,
48
- endIndex: contentForBlocksLocation.end,
49
- });
50
- } else if (isContentForBlocksLocationSet && blocks && blocks.length === 0) {
51
- context.report({
52
- message: `The 'content_for "blocks"' tag is present, but the blocks array is empty.`,
53
- startIndex: contentForBlocksLocation.start,
54
- endIndex: contentForBlocksLocation.end,
55
- });
56
- }
57
- },
58
- };
59
- },
60
- };
@@ -1,58 +0,0 @@
1
- import { expect, describe, it } from 'vitest';
2
- import { HardcodedRoutes } from './index';
3
- import { runLiquidCheck, highlightedOffenses } from '../../test';
4
-
5
- describe('Module: HardcodedRoutes', () => {
6
- it('should report offenses for hardcoded routes', async () => {
7
- const sourceCode = `
8
- <a href="/"></a>
9
- <form action="/search"></form>
10
- <a href="/account/login"></a>
11
- <a href="/collections/{{ collection.handle }}"></a>
12
- <a href="/cart/change?line={{ forloop.index }}&amp;quantity=0"></a>
13
- <li>{{ 'Socks' | link_to: '/collections/socks' }}</li>
14
- <li>{{ 'Home' | link_to: '/' }}</li>
15
- <li>{{ 'Cart (' | append: cart.item_count | append: ')' | link_to: '/cart' }}</li>
16
- `;
17
-
18
- const offenses = await runLiquidCheck(HardcodedRoutes, sourceCode);
19
- expect(offenses).to.have.length(8);
20
-
21
- const errorMessages = offenses.map((offense) => offense.message);
22
- expect(errorMessages).to.deep.equal([
23
- 'Use routes object {{ routes.root_url }} instead of hardcoding /',
24
- 'Use routes object {{ routes.search_url }} instead of hardcoding /search',
25
- 'Use routes object {{ routes.account_login_url }} instead of hardcoding /account/login',
26
- 'Use routes object {{ routes.collections_url }} instead of hardcoding /collections',
27
- 'Use routes object {{ routes.cart_change_url }} instead of hardcoding /cart/change',
28
- 'Use routes object {{ routes.collections_url }} instead of hardcoding /collections',
29
- 'Use routes object {{ routes.root_url }} instead of hardcoding /',
30
- 'Use routes object {{ routes.cart_url }} instead of hardcoding /cart',
31
- ]);
32
-
33
- const highlights = highlightedOffenses({ 'file.liquid': sourceCode }, offenses);
34
- expect(highlights).to.deep.equal([
35
- '/',
36
- '/search',
37
- '/account/login',
38
- '/collections',
39
- '/cart/change',
40
- '/collections',
41
- '/',
42
- '/cart',
43
- ]);
44
- });
45
-
46
- it('should not report offenses for route objects', async () => {
47
- const sourceCode = `
48
- <form action="{{ routes.search_url }}"></form>
49
- <a href="/{{ blog.url }}"></a>
50
- <a href="/admin"></a>
51
- <a href="#MainContent"></a>
52
- <li>{{ 'About' | link_to: '/pages/about' }}</li>
53
- `;
54
-
55
- const offenses = await runLiquidCheck(HardcodedRoutes, sourceCode);
56
- expect(offenses).to.have.length(0);
57
- });
58
- });
@@ -1,100 +0,0 @@
1
- import { NodeTypes } from '@platformos/liquid-html-parser';
2
- import { Severity, SourceCodeType, LiquidCheckDefinition } from '../../types';
3
- import { isAttr, isNodeOfType, isValuedHtmlAttribute, ValuedHtmlAttribute } from '../utils';
4
-
5
- const ROUTES: Record<string, string> = {
6
- '/': 'root_url',
7
- '/account': 'account_url',
8
- '/account/addresses': 'account_addresses_url',
9
- '/account/login': 'account_login_url',
10
- '/account/logout': 'account_logout_url',
11
- '/account/recover': 'account_recover_url',
12
- '/account/register': 'account_register_url',
13
- '/cart': 'cart_url',
14
- '/cart/add': 'cart_add_url',
15
- '/cart/change': 'cart_change_url',
16
- '/cart/clear': 'cart_clear_url',
17
- '/cart/update': 'cart_update_url',
18
- '/collections': 'collections_url',
19
- '/collections/all': 'all_products_collection_url',
20
- '/customer_authentication/login': 'storefront_login_url',
21
- '/recommendations/products': 'product_recommendations_url',
22
- '/search': 'search_url',
23
- '/search/suggest': 'predictive_search_url',
24
- };
25
-
26
- const HARDCODED_ROUTES = Object.keys(ROUTES).reverse();
27
-
28
- export const HardcodedRoutes: LiquidCheckDefinition = {
29
- meta: {
30
- code: 'HardcodedRoutes',
31
- name: 'Hardcoded Routes',
32
- docs: {
33
- description: 'This check encourages using the routes object instead of hardcoding URLs.',
34
- recommended: true,
35
- url: 'https://shopify.dev/docs/storefronts/themes/tools/theme-check/checks/hardcoded-routes',
36
- },
37
- type: SourceCodeType.LiquidHtml,
38
- severity: Severity.WARNING,
39
- schema: {},
40
- targets: [],
41
- },
42
-
43
- create(context) {
44
- return {
45
- async HtmlElement(node) {
46
- // checks for hardcoded routes in href and action attributes
47
- const attrWithHardcodedRoute: ValuedHtmlAttribute | undefined = node.attributes
48
- .filter(isValuedHtmlAttribute)
49
- .find((attr) => (isAttr(attr, 'action') || isAttr(attr, 'href')) && hardcodedRoute(attr));
50
-
51
- if (attrWithHardcodedRoute) {
52
- const attr = attrWithHardcodedRoute;
53
- const route = hardcodedRoute(attr)!;
54
- const routeURL = ROUTES[route];
55
- const startIndex = attr.attributePosition.start;
56
- const endIndex = startIndex + route.length;
57
-
58
- context.report({
59
- message: `Use routes object {{ routes.${routeURL} }} instead of hardcoding ${route}`,
60
- startIndex,
61
- endIndex,
62
- });
63
- }
64
- },
65
-
66
- async LiquidFilter(node) {
67
- // checks for hardcoded routes in link_to values {{ 'Cart' | link_to: '/cart' }}
68
- if (node.name !== 'link_to') return;
69
-
70
- const linkToArg = node.args[0];
71
- const linkToValue = linkToArg.type === 'String' ? linkToArg.value : '';
72
- const route = HARDCODED_ROUTES.find((route) =>
73
- route === '/' ? route === linkToValue : linkToValue.startsWith(route),
74
- );
75
-
76
- if (route) {
77
- const routeURL = ROUTES[route];
78
- // we add 1 to the start index to exclude the quotes
79
- const startIndex = linkToArg.position.start + 1;
80
-
81
- context.report({
82
- message: `Use routes object {{ routes.${routeURL} }} instead of hardcoding ${route}`,
83
- startIndex,
84
- endIndex: startIndex + route.length,
85
- });
86
- }
87
- },
88
- };
89
- },
90
- };
91
-
92
- function hardcodedRoute(attr: ValuedHtmlAttribute): string | undefined {
93
- if (!isNodeOfType(NodeTypes.TextNode, attr.value[0])) return;
94
-
95
- const value = attr.value[0].value;
96
-
97
- return HARDCODED_ROUTES.find((route) =>
98
- route === '/' ? route === value && attr.value.length === 1 : value.startsWith(route),
99
- );
100
- }