@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,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
- }