@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,34 +0,0 @@
1
- import { Setting } from './setting';
2
- import { Preset } from './preset';
3
-
4
- export declare namespace ThemeBlock {
5
- /** Typed content of {% schema %} after passing validation */
6
- export interface Schema {
7
- name?: string;
8
- settings?: Setting.Any[];
9
- blocks?: Block[];
10
- presets?: Preset.Preset[];
11
- class?: string;
12
- tag?: string | null;
13
- }
14
-
15
- export type ThemeBlock = {
16
- type: '@theme';
17
- };
18
-
19
- export type AppBlock = {
20
- type: '@app';
21
- };
22
-
23
- export type SpecificThemeBlock = {
24
- /** blocks/{type}.liquid */
25
- type: string;
26
- };
27
-
28
- // prettier-ignore
29
- export type Block = (
30
- | ThemeBlock
31
- | AppBlock
32
- | SpecificThemeBlock
33
- );
34
- }
@@ -1,80 +0,0 @@
1
- import { SourceCode, SourceCodeType } from '../types';
2
- import { Section, ThemeBlock } from './schemas';
3
-
4
- export * from './schemas';
5
-
6
- export enum ThemeSchemaType {
7
- AppBlock = 'app-block',
8
- Block = 'block',
9
- Section = 'section',
10
- }
11
-
12
- /** {% content_for 'block', type: type, id: id %}*/
13
- export type StaticBlockDef = { type: string; id: string };
14
-
15
- /**
16
- * A ThemeSchema represents the `{% schema %}` contents of a block or section file.
17
- *
18
- * `ast` and `parsed` will be instances of `Error` if there was an error parsing
19
- * the Liquid file or the JSON.
20
- *
21
- * There is no guarantee that the `ast` or `parsed` fields are backend-valid.
22
- */
23
- export interface ThemeSchema<T extends ThemeSchemaType> {
24
- /** section or block */
25
- type: T;
26
-
27
- /** `section/${name}.liquid` */
28
- name: string;
29
-
30
- /** Parsed as an AST (with position information) or an Error */
31
- ast: SourceCode<SourceCodeType.JSON>['ast'] | Error;
32
-
33
- /** Parsed as a JavaScript object or an Error */
34
- parsed: any | Error;
35
-
36
- /** 0-based index of the start of JSON object in the document */
37
- offset: number;
38
-
39
- /** schema node value */
40
- value: string;
41
- }
42
-
43
- /** See {@link ThemeSchema} */
44
- export interface ThemeBlockSchema extends ThemeSchema<ThemeSchemaType.Block> {
45
- /**
46
- * @example
47
- * const schema = await context.getBlockSchema('product');
48
- * const validSchema = schema?.validSchema;
49
- * if (!validSchema || validSchema instanceof Error) return;
50
- *
51
- * for (const block of validSchema.blocks ?? []) {
52
- * // do something
53
- * }
54
- */
55
- validSchema: ThemeBlock.Schema | Error;
56
-
57
- /** type/id pairs found in the body of the file */
58
- staticBlockDefs: StaticBlockDef[];
59
- }
60
-
61
- /** See {@link ThemeSchema} */
62
- export interface SectionSchema extends ThemeSchema<ThemeSchemaType.Section> {
63
- /**
64
- * @example
65
- * const schema = await context.getSectionSchema('product');
66
- * const validSchema = schema?.validSchema;
67
- * if (!validSchema || validSchema instanceof Error) return;
68
- *
69
- * for (const block of validSchema.blocks ?? []) {
70
- * // do something
71
- * }
72
- */
73
- validSchema: Section.Schema | Error;
74
-
75
- /** type/id pairs found in the body of the file */
76
- staticBlockDefs: StaticBlockDef[];
77
- }
78
-
79
- /** TODO setup validSchema like the other ones. */
80
- export interface AppBlockSchema extends ThemeSchema<ThemeSchemaType.AppBlock> {}
@@ -1,300 +0,0 @@
1
- import {
2
- JSONNode,
3
- LiteralNode,
4
- Preset,
5
- Section,
6
- SourceCodeType,
7
- ThemeBlock,
8
- Context,
9
- StaticBlockDef,
10
- } from '../types';
11
- import { getLocEnd, getLocStart, nodeAtPath } from '../json';
12
- import { doesFileExist } from './file-utils';
13
-
14
- export type BlockDefNodeWithPath = {
15
- node: Section.Block | ThemeBlock.Block;
16
- path: string[];
17
- };
18
-
19
- export type PresetBlockNodeWithPath = {
20
- node: Preset.Block;
21
- path: string[];
22
- };
23
-
24
- export function getBlocks(validSchema: ThemeBlock.Schema | Section.Schema) {
25
- const rootLevelThemeBlocks: BlockDefNodeWithPath[] = [];
26
- const rootLevelLocalBlocks: BlockDefNodeWithPath[] = [];
27
- const presetLevelBlocks: { [key: number]: PresetBlockNodeWithPath[] } = {};
28
- const defaultLevelBlocks: BlockDefNodeWithPath[] = [];
29
-
30
- const rootLevelBlocks = validSchema.blocks;
31
- const presets = validSchema.presets;
32
-
33
- // Helper function to categorize blocks
34
- function categorizeRootLevelBlocks(block: Preset.Block, index: number) {
35
- if (!block) return;
36
- const hasName = 'name' in block;
37
-
38
- if (hasName) {
39
- rootLevelLocalBlocks.push({
40
- node: block,
41
- path: ['blocks', String(index), 'type'],
42
- });
43
- } else if (block.type !== '@app') {
44
- rootLevelThemeBlocks.push({
45
- node: block,
46
- path: ['blocks', String(index), 'type'],
47
- });
48
- }
49
- }
50
-
51
- function categorizePresetLevelBlocks(
52
- block: Preset.Block,
53
- currentPath: string[],
54
- depth: number = 0,
55
- ) {
56
- if (!block) return;
57
-
58
- if (!presetLevelBlocks[depth]) {
59
- presetLevelBlocks[depth] = [];
60
- }
61
-
62
- presetLevelBlocks[depth].push({
63
- node: block,
64
- path: currentPath.concat('type'),
65
- });
66
-
67
- if ('blocks' in block) {
68
- if (Array.isArray(block.blocks)) {
69
- block.blocks.forEach((nestedBlock: Preset.PresetBlockForArray, index: number) => {
70
- categorizePresetLevelBlocks(
71
- nestedBlock,
72
- currentPath.concat('blocks', String(index)),
73
- depth + 1,
74
- );
75
- });
76
- } else if (typeof block.blocks === 'object' && block.blocks !== null) {
77
- Object.entries(block.blocks).forEach(([key, nestedBlock]) => {
78
- categorizePresetLevelBlocks(nestedBlock, currentPath.concat('blocks', key), depth + 1);
79
- });
80
- }
81
- }
82
- }
83
-
84
- function categorizeDefaultLevelBlocks(block: Preset.Block, index: number) {
85
- const hasName = 'name' in block;
86
-
87
- if (hasName) {
88
- defaultLevelBlocks.push({
89
- node: block,
90
- path: ['default', 'blocks', String(index), 'type'],
91
- });
92
- }
93
- }
94
-
95
- if (Array.isArray(rootLevelBlocks)) {
96
- rootLevelBlocks.forEach((block, index) => {
97
- categorizeRootLevelBlocks(block, index);
98
- });
99
- }
100
-
101
- if (presets) {
102
- presets.forEach((preset: Preset.Preset, presetIndex: number) => {
103
- if ('blocks' in preset && preset.blocks) {
104
- if (Array.isArray(preset.blocks)) {
105
- preset.blocks.forEach((block, blockIndex) => {
106
- categorizePresetLevelBlocks(
107
- block,
108
- ['presets', String(presetIndex), 'blocks', String(blockIndex)],
109
- 0,
110
- );
111
- });
112
- } else if (typeof preset.blocks === 'object') {
113
- Object.entries(preset.blocks).forEach(([key, block]) => {
114
- categorizePresetLevelBlocks(block, ['presets', String(presetIndex), 'blocks', key], 0);
115
- });
116
- }
117
- }
118
- });
119
- }
120
-
121
- if ('default' in validSchema) {
122
- validSchema.default?.blocks?.forEach((block, index) => {
123
- categorizeDefaultLevelBlocks(block, index);
124
- });
125
- }
126
-
127
- return {
128
- rootLevelThemeBlocks,
129
- rootLevelLocalBlocks,
130
- presetLevelBlocks,
131
- defaultLevelBlocks,
132
- };
133
- }
134
-
135
- export function isInvalidPresetBlock(
136
- blockId: string,
137
- blockNode: Preset.Block,
138
- rootLevelThemeBlocks: BlockDefNodeWithPath[],
139
- staticBlockDefs: StaticBlockDef[],
140
- ): boolean {
141
- if (blockNode.static) {
142
- return !staticBlockDefs.some((block) => block.type === blockNode.type && block.id === blockId);
143
- }
144
-
145
- const isPrivateBlockType = blockNode.type.startsWith('_');
146
- const isThemeInRootLevel = rootLevelThemeBlocks.some((block) => block.node.type === '@theme');
147
- const needsExplicitRootBlock = isPrivateBlockType || !isThemeInRootLevel;
148
- const isPresetInRootLevel = rootLevelThemeBlocks.some(
149
- (block) => block.node.type === blockNode.type,
150
- );
151
-
152
- return !isPresetInRootLevel && needsExplicitRootBlock;
153
- }
154
-
155
- export function isInvalidDefaultBlock(
156
- blockNode: Section.Block | ThemeBlock.Block,
157
- rootLevelThemeBlocks: BlockDefNodeWithPath[],
158
- ): boolean {
159
- const isPrivateBlockType = blockNode.type.startsWith('_');
160
- const isThemeInRootLevel = rootLevelThemeBlocks.some((block) => block.node.type === '@theme');
161
- const needsExplicitRootBlock = isPrivateBlockType || !isThemeInRootLevel;
162
- const isDefaultInRootLevel = rootLevelThemeBlocks.some(
163
- (block) => block.node.type === blockNode.type,
164
- );
165
-
166
- return !isDefaultInRootLevel && needsExplicitRootBlock;
167
- }
168
-
169
- async function validateBlockTargeting(
170
- nestedBlock: Preset.PresetBlockForArray | Preset.PresetBlockForHash,
171
- nestedPath: string[],
172
- context: Context<SourceCodeType.LiquidHtml>,
173
- parentNode: Preset.PresetBlockForArray | Preset.PresetBlockForHash,
174
- rootLevelThemeBlocks: BlockDefNodeWithPath[],
175
- allowedBlockTypes: string[],
176
- offset: number,
177
- ast: JSONNode,
178
- staticBlockDefs: StaticBlockDef[] = [],
179
- ) {
180
- const typeNode = nodeAtPath(ast, nestedPath)! as LiteralNode;
181
- const blockId = 'id' in nestedBlock ? nestedBlock.id! : nestedPath.at(-2)!;
182
-
183
- if (typeNode) {
184
- if (isInvalidPresetBlock(blockId, nestedBlock, rootLevelThemeBlocks, staticBlockDefs)) {
185
- const isStaticBlock = !!nestedBlock.static;
186
- const isPrivateBlock = nestedBlock.type.startsWith('_');
187
- const errorMessage = isStaticBlock
188
- ? `Could not find a static block of type "${nestedBlock.type}" with id "${blockId}" in "blocks/${parentNode.type}.liquid".`
189
- : isPrivateBlock
190
- ? `Private block type "${nestedBlock.type}" is not allowed in "${parentNode.type}" blocks.`
191
- : `Block type "${nestedBlock.type}" is not allowed in "${
192
- parentNode.type
193
- }" blocks. Allowed types are: ${allowedBlockTypes.join(', ')}.`;
194
- reportWarning(errorMessage, offset, typeNode, context);
195
- }
196
-
197
- const exists = await validateBlockFileExistence(nestedBlock.type, context);
198
-
199
- if (!exists) {
200
- reportWarning(
201
- `Theme block 'blocks/${nestedBlock.type}.liquid' does not exist.`,
202
- offset,
203
- typeNode,
204
- context,
205
- );
206
- }
207
- }
208
-
209
- if ('blocks' in nestedBlock && nestedBlock.blocks) {
210
- validateNestedBlocks(
211
- context,
212
- nestedBlock,
213
- nestedBlock.blocks,
214
- nestedPath.slice(0, -1),
215
- offset,
216
- ast,
217
- );
218
- }
219
- }
220
-
221
- export async function validateNestedBlocks(
222
- context: Context<SourceCodeType.LiquidHtml>,
223
- parentNode: Preset.PresetBlockForHash | Preset.PresetBlockForArray,
224
- nestedBlocks: Preset.PresetBlockHash | Preset.PresetBlockForArray[],
225
- currentPath: string[],
226
- offset: number,
227
- ast: JSONNode,
228
- ) {
229
- if (!nestedBlocks) return;
230
-
231
- const parentSchema = await context.getBlockSchema?.(parentNode.type);
232
- if (!parentSchema || parentSchema instanceof Error) return;
233
-
234
- const { validSchema, staticBlockDefs } = parentSchema;
235
- if (!validSchema || validSchema instanceof Error) return;
236
-
237
- const { rootLevelThemeBlocks } = getBlocks(validSchema);
238
- const allowedBlockTypes = rootLevelThemeBlocks.map((block) => block.node.type);
239
-
240
- if (Array.isArray(nestedBlocks)) {
241
- await Promise.all(
242
- nestedBlocks.map((nestedBlock, index) => {
243
- const nestedPath = currentPath.concat(['blocks', String(index), 'type']);
244
- return validateBlockTargeting(
245
- nestedBlock,
246
- nestedPath,
247
- context,
248
- parentNode,
249
- rootLevelThemeBlocks,
250
- allowedBlockTypes,
251
- offset,
252
- ast,
253
- staticBlockDefs,
254
- );
255
- }),
256
- );
257
- } else if (typeof nestedBlocks === 'object') {
258
- await Promise.all(
259
- Object.entries(nestedBlocks).map(([key, nestedBlock]) => {
260
- const nestedPath = currentPath.concat(['blocks', key, 'type']);
261
- return validateBlockTargeting(
262
- nestedBlock,
263
- nestedPath,
264
- context,
265
- parentNode,
266
- rootLevelThemeBlocks,
267
- allowedBlockTypes,
268
- offset,
269
- ast,
270
- staticBlockDefs,
271
- );
272
- }),
273
- );
274
- }
275
- }
276
-
277
- export function reportWarning(
278
- message: string,
279
- offset: number,
280
- astNode: JSONNode,
281
- context: Context<SourceCodeType.LiquidHtml>,
282
- ) {
283
- context.report({
284
- message,
285
- startIndex: offset + getLocStart(astNode),
286
- endIndex: offset + getLocEnd(astNode),
287
- });
288
- }
289
-
290
- export async function validateBlockFileExistence(
291
- blockType: string,
292
- context: Context<SourceCodeType.LiquidHtml>,
293
- ): Promise<boolean> {
294
- if (blockType === '@theme' || blockType === '@app') {
295
- return true;
296
- }
297
-
298
- const blockPath = `blocks/${blockType}.liquid`;
299
- return await doesFileExist(context, blockPath);
300
- }
@@ -1,10 +0,0 @@
1
- import { ContentForMarkup } from '@platformos/liquid-html-parser';
2
-
3
- export function isContentForBlock(
4
- nodeMarkup: string | ContentForMarkup,
5
- ): nodeMarkup is ContentForMarkup {
6
- if (typeof nodeMarkup === 'string') {
7
- return false;
8
- }
9
- return nodeMarkup.contentForType.value === 'block';
10
- }