@platformos/platformos-check-common 0.0.2

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 (708) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +92 -0
  3. package/dist/AugmentedThemeDocset.d.ts +12 -0
  4. package/dist/AugmentedThemeDocset.js +126 -0
  5. package/dist/AugmentedThemeDocset.js.map +1 -0
  6. package/dist/JSONValidator.d.ts +20 -0
  7. package/dist/JSONValidator.js +76 -0
  8. package/dist/JSONValidator.js.map +1 -0
  9. package/dist/checks/app-block-missing-schema/index.d.ts +2 -0
  10. package/dist/checks/app-block-missing-schema/index.js +46 -0
  11. package/dist/checks/app-block-missing-schema/index.js.map +1 -0
  12. package/dist/checks/app-block-valid-tags/index.d.ts +10 -0
  13. package/dist/checks/app-block-valid-tags/index.js +49 -0
  14. package/dist/checks/app-block-valid-tags/index.js.map +1 -0
  15. package/dist/checks/asset-preload/index.d.ts +2 -0
  16. package/dist/checks/asset-preload/index.js +56 -0
  17. package/dist/checks/asset-preload/index.js.map +1 -0
  18. package/dist/checks/asset-size-app-block-css/index.d.ts +6 -0
  19. package/dist/checks/asset-size-app-block-css/index.js +64 -0
  20. package/dist/checks/asset-size-app-block-css/index.js.map +1 -0
  21. package/dist/checks/asset-size-app-block-javascript/index.d.ts +6 -0
  22. package/dist/checks/asset-size-app-block-javascript/index.js +64 -0
  23. package/dist/checks/asset-size-app-block-javascript/index.js.map +1 -0
  24. package/dist/checks/asset-size-css/index.d.ts +6 -0
  25. package/dist/checks/asset-size-css/index.js +125 -0
  26. package/dist/checks/asset-size-css/index.js.map +1 -0
  27. package/dist/checks/asset-size-javascript/index.d.ts +6 -0
  28. package/dist/checks/asset-size-javascript/index.js +110 -0
  29. package/dist/checks/asset-size-javascript/index.js.map +1 -0
  30. package/dist/checks/block-id-usage/index.d.ts +2 -0
  31. package/dist/checks/block-id-usage/index.js +60 -0
  32. package/dist/checks/block-id-usage/index.js.map +1 -0
  33. package/dist/checks/cdn-preconnect/index.d.ts +2 -0
  34. package/dist/checks/cdn-preconnect/index.js +44 -0
  35. package/dist/checks/cdn-preconnect/index.js.map +1 -0
  36. package/dist/checks/content-for-header-modification/index.d.ts +2 -0
  37. package/dist/checks/content-for-header-modification/index.js +66 -0
  38. package/dist/checks/content-for-header-modification/index.js.map +1 -0
  39. package/dist/checks/deprecate-bgsizes/index.d.ts +2 -0
  40. package/dist/checks/deprecate-bgsizes/index.js +46 -0
  41. package/dist/checks/deprecate-bgsizes/index.js.map +1 -0
  42. package/dist/checks/deprecate-lazysizes/index.d.ts +2 -0
  43. package/dist/checks/deprecate-lazysizes/index.js +52 -0
  44. package/dist/checks/deprecate-lazysizes/index.js.map +1 -0
  45. package/dist/checks/deprecated-filter/fixes.d.ts +8 -0
  46. package/dist/checks/deprecated-filter/fixes.js +205 -0
  47. package/dist/checks/deprecated-filter/fixes.js.map +1 -0
  48. package/dist/checks/deprecated-filter/index.d.ts +2 -0
  49. package/dist/checks/deprecated-filter/index.js +93 -0
  50. package/dist/checks/deprecated-filter/index.js.map +1 -0
  51. package/dist/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.d.ts +1 -0
  52. package/dist/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.js +1347 -0
  53. package/dist/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.js.map +1 -0
  54. package/dist/checks/deprecated-fonts-on-sections-and-blocks/index.d.ts +2 -0
  55. package/dist/checks/deprecated-fonts-on-sections-and-blocks/index.js +156 -0
  56. package/dist/checks/deprecated-fonts-on-sections-and-blocks/index.js.map +1 -0
  57. package/dist/checks/deprecated-fonts-on-settings-schema/index.d.ts +2 -0
  58. package/dist/checks/deprecated-fonts-on-settings-schema/index.js +56 -0
  59. package/dist/checks/deprecated-fonts-on-settings-schema/index.js.map +1 -0
  60. package/dist/checks/deprecated-tag/index.d.ts +2 -0
  61. package/dist/checks/deprecated-tag/index.js +48 -0
  62. package/dist/checks/deprecated-tag/index.js.map +1 -0
  63. package/dist/checks/duplicate-content-for-arguments/index.d.ts +2 -0
  64. package/dist/checks/duplicate-content-for-arguments/index.js +39 -0
  65. package/dist/checks/duplicate-content-for-arguments/index.js.map +1 -0
  66. package/dist/checks/duplicate-function-arguments/index.d.ts +2 -0
  67. package/dist/checks/duplicate-function-arguments/index.js +40 -0
  68. package/dist/checks/duplicate-function-arguments/index.js.map +1 -0
  69. package/dist/checks/duplicate-render-partial-arguments/index.d.ts +2 -0
  70. package/dist/checks/duplicate-render-partial-arguments/index.js +43 -0
  71. package/dist/checks/duplicate-render-partial-arguments/index.js.map +1 -0
  72. package/dist/checks/empty-block-content/index.d.ts +2 -0
  73. package/dist/checks/empty-block-content/index.js +60 -0
  74. package/dist/checks/empty-block-content/index.js.map +1 -0
  75. package/dist/checks/graphql/index.d.ts +2 -0
  76. package/dist/checks/graphql/index.js +58 -0
  77. package/dist/checks/graphql/index.js.map +1 -0
  78. package/dist/checks/graphql-variables/index.d.ts +8 -0
  79. package/dist/checks/graphql-variables/index.js +91 -0
  80. package/dist/checks/graphql-variables/index.js.map +1 -0
  81. package/dist/checks/hardcoded-routes/index.d.ts +2 -0
  82. package/dist/checks/hardcoded-routes/index.js +89 -0
  83. package/dist/checks/hardcoded-routes/index.js.map +1 -0
  84. package/dist/checks/img-width-and-height/index.d.ts +2 -0
  85. package/dist/checks/img-width-and-height/index.js +46 -0
  86. package/dist/checks/img-width-and-height/index.js.map +1 -0
  87. package/dist/checks/index.d.ts +8 -0
  88. package/dist/checks/index.js +154 -0
  89. package/dist/checks/index.js.map +1 -0
  90. package/dist/checks/invalid-hash-assign-target/index.d.ts +2 -0
  91. package/dist/checks/invalid-hash-assign-target/index.js +252 -0
  92. package/dist/checks/invalid-hash-assign-target/index.js.map +1 -0
  93. package/dist/checks/json-missing-block/index.d.ts +2 -0
  94. package/dist/checks/json-missing-block/index.js +48 -0
  95. package/dist/checks/json-missing-block/index.js.map +1 -0
  96. package/dist/checks/json-missing-block/missing-block-utils.d.ts +4 -0
  97. package/dist/checks/json-missing-block/missing-block-utils.js +87 -0
  98. package/dist/checks/json-missing-block/missing-block-utils.js.map +1 -0
  99. package/dist/checks/json-syntax-error/index.d.ts +2 -0
  100. package/dist/checks/json-syntax-error/index.js +92 -0
  101. package/dist/checks/json-syntax-error/index.js.map +1 -0
  102. package/dist/checks/liquid-free-settings/index.d.ts +2 -0
  103. package/dist/checks/liquid-free-settings/index.js +64 -0
  104. package/dist/checks/liquid-free-settings/index.js.map +1 -0
  105. package/dist/checks/liquid-html-syntax-error/checks/InvalidBooleanExpressions.d.ts +3 -0
  106. package/dist/checks/liquid-html-syntax-error/checks/InvalidBooleanExpressions.js +23 -0
  107. package/dist/checks/liquid-html-syntax-error/checks/InvalidBooleanExpressions.js.map +1 -0
  108. package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNode.d.ts +3 -0
  109. package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNode.js +136 -0
  110. package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNode.js.map +1 -0
  111. package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNodeParenthesis.d.ts +3 -0
  112. package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNodeParenthesis.js +26 -0
  113. package/dist/checks/liquid-html-syntax-error/checks/InvalidConditionalNodeParenthesis.js.map +1 -0
  114. package/dist/checks/liquid-html-syntax-error/checks/InvalidEchoValue.d.ts +3 -0
  115. package/dist/checks/liquid-html-syntax-error/checks/InvalidEchoValue.js +59 -0
  116. package/dist/checks/liquid-html-syntax-error/checks/InvalidEchoValue.js.map +1 -0
  117. package/dist/checks/liquid-html-syntax-error/checks/InvalidFilterName.d.ts +3 -0
  118. package/dist/checks/liquid-html-syntax-error/checks/InvalidFilterName.js +66 -0
  119. package/dist/checks/liquid-html-syntax-error/checks/InvalidFilterName.js.map +1 -0
  120. package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.d.ts +3 -0
  121. package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.js +73 -0
  122. package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.js.map +1 -0
  123. package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopRange.d.ts +4 -0
  124. package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopRange.js +54 -0
  125. package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopRange.js.map +1 -0
  126. package/dist/checks/liquid-html-syntax-error/checks/InvalidPipeSyntax.d.ts +3 -0
  127. package/dist/checks/liquid-html-syntax-error/checks/InvalidPipeSyntax.js +71 -0
  128. package/dist/checks/liquid-html-syntax-error/checks/InvalidPipeSyntax.js.map +1 -0
  129. package/dist/checks/liquid-html-syntax-error/checks/MultipleAssignValues.d.ts +3 -0
  130. package/dist/checks/liquid-html-syntax-error/checks/MultipleAssignValues.js +69 -0
  131. package/dist/checks/liquid-html-syntax-error/checks/MultipleAssignValues.js.map +1 -0
  132. package/dist/checks/liquid-html-syntax-error/checks/utils.d.ts +15 -0
  133. package/dist/checks/liquid-html-syntax-error/checks/utils.js +58 -0
  134. package/dist/checks/liquid-html-syntax-error/checks/utils.js.map +1 -0
  135. package/dist/checks/liquid-html-syntax-error/index.d.ts +2 -0
  136. package/dist/checks/liquid-html-syntax-error/index.js +131 -0
  137. package/dist/checks/liquid-html-syntax-error/index.js.map +1 -0
  138. package/dist/checks/matching-translations/index.d.ts +2 -0
  139. package/dist/checks/matching-translations/index.js +146 -0
  140. package/dist/checks/matching-translations/index.js.map +1 -0
  141. package/dist/checks/metadata-params/index.d.ts +2 -0
  142. package/dist/checks/metadata-params/index.js +96 -0
  143. package/dist/checks/metadata-params/index.js.map +1 -0
  144. package/dist/checks/missing-asset/index.d.ts +2 -0
  145. package/dist/checks/missing-asset/index.js +44 -0
  146. package/dist/checks/missing-asset/index.js.map +1 -0
  147. package/dist/checks/missing-content-for-arguments/index.d.ts +2 -0
  148. package/dist/checks/missing-content-for-arguments/index.js +36 -0
  149. package/dist/checks/missing-content-for-arguments/index.js.map +1 -0
  150. package/dist/checks/missing-template/index.d.ts +6 -0
  151. package/dist/checks/missing-template/index.js +70 -0
  152. package/dist/checks/missing-template/index.js.map +1 -0
  153. package/dist/checks/orphaned-partial/index.d.ts +2 -0
  154. package/dist/checks/orphaned-partial/index.js +42 -0
  155. package/dist/checks/orphaned-partial/index.js.map +1 -0
  156. package/dist/checks/pagination-size/index.d.ts +7 -0
  157. package/dist/checks/pagination-size/index.js +89 -0
  158. package/dist/checks/pagination-size/index.js.map +1 -0
  159. package/dist/checks/parser-blocking-script/index.d.ts +2 -0
  160. package/dist/checks/parser-blocking-script/index.js +81 -0
  161. package/dist/checks/parser-blocking-script/index.js.map +1 -0
  162. package/dist/checks/parser-blocking-script/suggestions.d.ts +4 -0
  163. package/dist/checks/parser-blocking-script/suggestions.js +22 -0
  164. package/dist/checks/parser-blocking-script/suggestions.js.map +1 -0
  165. package/dist/checks/remote-asset/index.d.ts +6 -0
  166. package/dist/checks/remote-asset/index.js +189 -0
  167. package/dist/checks/remote-asset/index.js.map +1 -0
  168. package/dist/checks/reserved-doc-param-names/index.d.ts +2 -0
  169. package/dist/checks/reserved-doc-param-names/index.js +46 -0
  170. package/dist/checks/reserved-doc-param-names/index.js.map +1 -0
  171. package/dist/checks/schema-presets-block-order/index.d.ts +2 -0
  172. package/dist/checks/schema-presets-block-order/index.js +108 -0
  173. package/dist/checks/schema-presets-block-order/index.js.map +1 -0
  174. package/dist/checks/schema-presets-static-blocks/index.d.ts +2 -0
  175. package/dist/checks/schema-presets-static-blocks/index.js +109 -0
  176. package/dist/checks/schema-presets-static-blocks/index.js.map +1 -0
  177. package/dist/checks/static-stylesheet-and-javascript-tags/index.d.ts +2 -0
  178. package/dist/checks/static-stylesheet-and-javascript-tags/index.js +42 -0
  179. package/dist/checks/static-stylesheet-and-javascript-tags/index.js.map +1 -0
  180. package/dist/checks/translation-key-exists/index.d.ts +2 -0
  181. package/dist/checks/translation-key-exists/index.js +67 -0
  182. package/dist/checks/translation-key-exists/index.js.map +1 -0
  183. package/dist/checks/unclosed-html-element/index.d.ts +2 -0
  184. package/dist/checks/unclosed-html-element/index.js +252 -0
  185. package/dist/checks/unclosed-html-element/index.js.map +1 -0
  186. package/dist/checks/undefined-object/index.d.ts +2 -0
  187. package/dist/checks/undefined-object/index.js +255 -0
  188. package/dist/checks/undefined-object/index.js.map +1 -0
  189. package/dist/checks/unique-doc-param-names/index.d.ts +2 -0
  190. package/dist/checks/unique-doc-param-names/index.js +37 -0
  191. package/dist/checks/unique-doc-param-names/index.js.map +1 -0
  192. package/dist/checks/unique-settings-id/index.d.ts +2 -0
  193. package/dist/checks/unique-settings-id/index.js +69 -0
  194. package/dist/checks/unique-settings-id/index.js.map +1 -0
  195. package/dist/checks/unique-settings-id/test-data.d.ts +2 -0
  196. package/dist/checks/unique-settings-id/test-data.js +1194 -0
  197. package/dist/checks/unique-settings-id/test-data.js.map +1 -0
  198. package/dist/checks/unique-static-block-id/index.d.ts +2 -0
  199. package/dist/checks/unique-static-block-id/index.js +56 -0
  200. package/dist/checks/unique-static-block-id/index.js.map +1 -0
  201. package/dist/checks/unknown-filter/index.d.ts +2 -0
  202. package/dist/checks/unknown-filter/index.js +38 -0
  203. package/dist/checks/unknown-filter/index.js.map +1 -0
  204. package/dist/checks/unknown-property/index.d.ts +2 -0
  205. package/dist/checks/unknown-property/index.js +361 -0
  206. package/dist/checks/unknown-property/index.js.map +1 -0
  207. package/dist/checks/unknown-property/property-shape.d.ts +41 -0
  208. package/dist/checks/unknown-property/property-shape.js +267 -0
  209. package/dist/checks/unknown-property/property-shape.js.map +1 -0
  210. package/dist/checks/unrecognized-content-for-arguments/index.d.ts +2 -0
  211. package/dist/checks/unrecognized-content-for-arguments/index.js +43 -0
  212. package/dist/checks/unrecognized-content-for-arguments/index.js.map +1 -0
  213. package/dist/checks/unrecognized-render-partial-arguments/index.d.ts +2 -0
  214. package/dist/checks/unrecognized-render-partial-arguments/index.js +59 -0
  215. package/dist/checks/unrecognized-render-partial-arguments/index.js.map +1 -0
  216. package/dist/checks/unused-assign/index.d.ts +2 -0
  217. package/dist/checks/unused-assign/index.js +77 -0
  218. package/dist/checks/unused-assign/index.js.map +1 -0
  219. package/dist/checks/unused-doc-param/index.d.ts +2 -0
  220. package/dist/checks/unused-doc-param/index.js +55 -0
  221. package/dist/checks/unused-doc-param/index.js.map +1 -0
  222. package/dist/checks/utils.d.ts +22 -0
  223. package/dist/checks/utils.js +74 -0
  224. package/dist/checks/utils.js.map +1 -0
  225. package/dist/checks/valid-block-target/index.d.ts +2 -0
  226. package/dist/checks/valid-block-target/index.js +99 -0
  227. package/dist/checks/valid-block-target/index.js.map +1 -0
  228. package/dist/checks/valid-content-for-argument-types/index.d.ts +2 -0
  229. package/dist/checks/valid-content-for-argument-types/index.js +35 -0
  230. package/dist/checks/valid-content-for-argument-types/index.js.map +1 -0
  231. package/dist/checks/valid-content-for-arguments/index.d.ts +2 -0
  232. package/dist/checks/valid-content-for-arguments/index.js +82 -0
  233. package/dist/checks/valid-content-for-arguments/index.js.map +1 -0
  234. package/dist/checks/valid-doc-param-types/index.d.ts +2 -0
  235. package/dist/checks/valid-doc-param-types/index.js +61 -0
  236. package/dist/checks/valid-doc-param-types/index.js.map +1 -0
  237. package/dist/checks/valid-html-translation/index.d.ts +2 -0
  238. package/dist/checks/valid-html-translation/index.js +46 -0
  239. package/dist/checks/valid-html-translation/index.js.map +1 -0
  240. package/dist/checks/valid-json/index.d.ts +2 -0
  241. package/dist/checks/valid-json/index.js +36 -0
  242. package/dist/checks/valid-json/index.js.map +1 -0
  243. package/dist/checks/valid-local-blocks/index.d.ts +2 -0
  244. package/dist/checks/valid-local-blocks/index.js +66 -0
  245. package/dist/checks/valid-local-blocks/index.js.map +1 -0
  246. package/dist/checks/valid-local-blocks/valid-block-utils.d.ts +13 -0
  247. package/dist/checks/valid-local-blocks/valid-block-utils.js +74 -0
  248. package/dist/checks/valid-local-blocks/valid-block-utils.js.map +1 -0
  249. package/dist/checks/valid-render-partial-argument-types/index.d.ts +2 -0
  250. package/dist/checks/valid-render-partial-argument-types/index.js +66 -0
  251. package/dist/checks/valid-render-partial-argument-types/index.js.map +1 -0
  252. package/dist/checks/valid-schema/index.d.ts +2 -0
  253. package/dist/checks/valid-schema/index.js +40 -0
  254. package/dist/checks/valid-schema/index.js.map +1 -0
  255. package/dist/checks/valid-schema-name/index.d.ts +2 -0
  256. package/dist/checks/valid-schema-name/index.js +74 -0
  257. package/dist/checks/valid-schema-name/index.js.map +1 -0
  258. package/dist/checks/valid-settings-key/index.d.ts +2 -0
  259. package/dist/checks/valid-settings-key/index.js +90 -0
  260. package/dist/checks/valid-settings-key/index.js.map +1 -0
  261. package/dist/checks/valid-static-block-type/index.d.ts +2 -0
  262. package/dist/checks/valid-static-block-type/index.js +54 -0
  263. package/dist/checks/valid-static-block-type/index.js.map +1 -0
  264. package/dist/checks/valid-visible-if/index.d.ts +3 -0
  265. package/dist/checks/valid-visible-if/index.js +146 -0
  266. package/dist/checks/valid-visible-if/index.js.map +1 -0
  267. package/dist/checks/valid-visible-if/visible-if-utils.d.ts +14 -0
  268. package/dist/checks/valid-visible-if/visible-if-utils.js +125 -0
  269. package/dist/checks/valid-visible-if/visible-if-utils.js.map +1 -0
  270. package/dist/checks/variable-name/index.d.ts +6 -0
  271. package/dist/checks/variable-name/index.js +93 -0
  272. package/dist/checks/variable-name/index.js.map +1 -0
  273. package/dist/context-utils.d.ts +15 -0
  274. package/dist/context-utils.js +185 -0
  275. package/dist/context-utils.js.map +1 -0
  276. package/dist/create-safe-check.d.ts +2 -0
  277. package/dist/create-safe-check.js +15 -0
  278. package/dist/create-safe-check.js.map +1 -0
  279. package/dist/disabled-checks/index.d.ts +7 -0
  280. package/dist/disabled-checks/index.js +145 -0
  281. package/dist/disabled-checks/index.js.map +1 -0
  282. package/dist/disabled-checks/test-checks.d.ts +3 -0
  283. package/dist/disabled-checks/test-checks.js +59 -0
  284. package/dist/disabled-checks/test-checks.js.map +1 -0
  285. package/dist/doc-generator/DocBlockGenerator.d.ts +16 -0
  286. package/dist/doc-generator/DocBlockGenerator.js +464 -0
  287. package/dist/doc-generator/DocBlockGenerator.js.map +1 -0
  288. package/dist/doc-generator/index.d.ts +1 -0
  289. package/dist/doc-generator/index.js +6 -0
  290. package/dist/doc-generator/index.js.map +1 -0
  291. package/dist/find-root.d.ts +18 -0
  292. package/dist/find-root.js +81 -0
  293. package/dist/find-root.js.map +1 -0
  294. package/dist/fixes/apply-fix-to-string.d.ts +2 -0
  295. package/dist/fixes/apply-fix-to-string.js +50 -0
  296. package/dist/fixes/apply-fix-to-string.js.map +1 -0
  297. package/dist/fixes/autofix.d.ts +9 -0
  298. package/dist/fixes/autofix.js +30 -0
  299. package/dist/fixes/autofix.js.map +1 -0
  300. package/dist/fixes/corrector.d.ts +0 -0
  301. package/dist/fixes/corrector.js +2 -0
  302. package/dist/fixes/corrector.js.map +1 -0
  303. package/dist/fixes/correctors/base-corrector.d.ts +4 -0
  304. package/dist/fixes/correctors/base-corrector.js +3 -0
  305. package/dist/fixes/correctors/base-corrector.js.map +1 -0
  306. package/dist/fixes/correctors/graphql-corrector.d.ts +56 -0
  307. package/dist/fixes/correctors/graphql-corrector.js +78 -0
  308. package/dist/fixes/correctors/graphql-corrector.js.map +1 -0
  309. package/dist/fixes/correctors/index.d.ts +6 -0
  310. package/dist/fixes/correctors/index.js +30 -0
  311. package/dist/fixes/correctors/index.js.map +1 -0
  312. package/dist/fixes/correctors/json-corrector.d.ts +39 -0
  313. package/dist/fixes/correctors/json-corrector.js +86 -0
  314. package/dist/fixes/correctors/json-corrector.js.map +1 -0
  315. package/dist/fixes/correctors/string-corrector.d.ts +56 -0
  316. package/dist/fixes/correctors/string-corrector.js +78 -0
  317. package/dist/fixes/correctors/string-corrector.js.map +1 -0
  318. package/dist/fixes/index.d.ts +4 -0
  319. package/dist/fixes/index.js +14 -0
  320. package/dist/fixes/index.js.map +1 -0
  321. package/dist/fixes/utils.d.ts +2 -0
  322. package/dist/fixes/utils.js +9 -0
  323. package/dist/fixes/utils.js.map +1 -0
  324. package/dist/ignore.d.ts +2 -0
  325. package/dist/ignore.js +20 -0
  326. package/dist/ignore.js.map +1 -0
  327. package/dist/index.d.ts +23 -0
  328. package/dist/index.js +211 -0
  329. package/dist/index.js.map +1 -0
  330. package/dist/json.d.ts +17 -0
  331. package/dist/json.js +79 -0
  332. package/dist/json.js.map +1 -0
  333. package/dist/jsonc/parse.d.ts +25 -0
  334. package/dist/jsonc/parse.js +101 -0
  335. package/dist/jsonc/parse.js.map +1 -0
  336. package/dist/jsonc/types.d.ts +37 -0
  337. package/dist/jsonc/types.js +3 -0
  338. package/dist/jsonc/types.js.map +1 -0
  339. package/dist/liquid-doc/arguments.d.ts +36 -0
  340. package/dist/liquid-doc/arguments.js +239 -0
  341. package/dist/liquid-doc/arguments.js.map +1 -0
  342. package/dist/liquid-doc/liquidDoc.d.ts +33 -0
  343. package/dist/liquid-doc/liquidDoc.js +94 -0
  344. package/dist/liquid-doc/liquidDoc.js.map +1 -0
  345. package/dist/liquid-doc/utils.d.ts +49 -0
  346. package/dist/liquid-doc/utils.js +119 -0
  347. package/dist/liquid-doc/utils.js.map +1 -0
  348. package/dist/path.d.ts +10 -0
  349. package/dist/path.js +47 -0
  350. package/dist/path.js.map +1 -0
  351. package/dist/tags/content-for.d.ts +3 -0
  352. package/dist/tags/content-for.js +27 -0
  353. package/dist/tags/content-for.js.map +1 -0
  354. package/dist/test/MockFileSystem.d.ts +12 -0
  355. package/dist/test/MockFileSystem.js +109 -0
  356. package/dist/test/MockFileSystem.js.map +1 -0
  357. package/dist/test/MockTheme.d.ts +16 -0
  358. package/dist/test/MockTheme.js +16 -0
  359. package/dist/test/MockTheme.js.map +1 -0
  360. package/dist/test/chai-offer-fix-assertion.d.ts +22 -0
  361. package/dist/test/chai-offer-fix-assertion.js +20 -0
  362. package/dist/test/chai-offer-fix-assertion.js.map +1 -0
  363. package/dist/test/chai-suggest-assertion.d.ts +22 -0
  364. package/dist/test/chai-suggest-assertion.js +29 -0
  365. package/dist/test/chai-suggest-assertion.js.map +1 -0
  366. package/dist/test/contain-offense.d.ts +12 -0
  367. package/dist/test/contain-offense.js +36 -0
  368. package/dist/test/contain-offense.js.map +1 -0
  369. package/dist/test/index.d.ts +3 -0
  370. package/dist/test/index.js +20 -0
  371. package/dist/test/index.js.map +1 -0
  372. package/dist/test/test-helper.d.ts +14 -0
  373. package/dist/test/test-helper.js +289 -0
  374. package/dist/test/test-helper.js.map +1 -0
  375. package/dist/test/test-setup.d.ts +9 -0
  376. package/dist/test/test-setup.js +26 -0
  377. package/dist/test/test-setup.js.map +1 -0
  378. package/dist/to-schema.d.ts +16 -0
  379. package/dist/to-schema.js +218 -0
  380. package/dist/to-schema.js.map +1 -0
  381. package/dist/to-source-code.d.ts +5 -0
  382. package/dist/to-source-code.js +103 -0
  383. package/dist/to-source-code.js.map +1 -0
  384. package/dist/tsconfig.tsbuildinfo +1 -0
  385. package/dist/types/schema-prop-factory.d.ts +76 -0
  386. package/dist/types/schema-prop-factory.js +84 -0
  387. package/dist/types/schema-prop-factory.js.map +1 -0
  388. package/dist/types/schemas/index.d.ts +5 -0
  389. package/dist/types/schemas/index.js +6 -0
  390. package/dist/types/schemas/index.js.map +1 -0
  391. package/dist/types/schemas/preset.d.ts +38 -0
  392. package/dist/types/schemas/preset.js +3 -0
  393. package/dist/types/schemas/preset.js.map +1 -0
  394. package/dist/types/schemas/section.d.ts +49 -0
  395. package/dist/types/schemas/section.js +3 -0
  396. package/dist/types/schemas/section.js.map +1 -0
  397. package/dist/types/schemas/setting.d.ts +216 -0
  398. package/dist/types/schemas/setting.js +3 -0
  399. package/dist/types/schemas/setting.js.map +1 -0
  400. package/dist/types/schemas/template.d.ts +30 -0
  401. package/dist/types/schemas/template.js +3 -0
  402. package/dist/types/schemas/template.js.map +1 -0
  403. package/dist/types/schemas/theme-block.d.ts +24 -0
  404. package/dist/types/schemas/theme-block.js +3 -0
  405. package/dist/types/schemas/theme-block.js.map +1 -0
  406. package/dist/types/theme-liquid-docs.d.ts +131 -0
  407. package/dist/types/theme-liquid-docs.js +3 -0
  408. package/dist/types/theme-liquid-docs.js.map +1 -0
  409. package/dist/types/theme-schemas.d.ts +70 -0
  410. package/dist/types/theme-schemas.js +25 -0
  411. package/dist/types/theme-schemas.js.map +1 -0
  412. package/dist/types.d.ts +469 -0
  413. package/dist/types.js +55 -0
  414. package/dist/types.js.map +1 -0
  415. package/dist/utils/array.d.ts +5 -0
  416. package/dist/utils/array.js +28 -0
  417. package/dist/utils/array.js.map +1 -0
  418. package/dist/utils/block.d.ts +22 -0
  419. package/dist/utils/block.js +179 -0
  420. package/dist/utils/block.js.map +1 -0
  421. package/dist/utils/error.d.ts +2 -0
  422. package/dist/utils/error.js +44 -0
  423. package/dist/utils/error.js.map +1 -0
  424. package/dist/utils/file-utils.d.ts +6 -0
  425. package/dist/utils/file-utils.js +46 -0
  426. package/dist/utils/file-utils.js.map +1 -0
  427. package/dist/utils/index.d.ts +8 -0
  428. package/dist/utils/index.js +25 -0
  429. package/dist/utils/index.js.map +1 -0
  430. package/dist/utils/indexBy.d.ts +5 -0
  431. package/dist/utils/indexBy.js +15 -0
  432. package/dist/utils/indexBy.js.map +1 -0
  433. package/dist/utils/markup.d.ts +2 -0
  434. package/dist/utils/markup.js +10 -0
  435. package/dist/utils/markup.js.map +1 -0
  436. package/dist/utils/memo.d.ts +34 -0
  437. package/dist/utils/memo.js +61 -0
  438. package/dist/utils/memo.js.map +1 -0
  439. package/dist/utils/object.d.ts +1 -0
  440. package/dist/utils/object.js +7 -0
  441. package/dist/utils/object.js.map +1 -0
  442. package/dist/utils/position.d.ts +3 -0
  443. package/dist/utils/position.js +20 -0
  444. package/dist/utils/position.js.map +1 -0
  445. package/dist/utils/types.d.ts +52 -0
  446. package/dist/utils/types.js +23 -0
  447. package/dist/utils/types.js.map +1 -0
  448. package/dist/visitor.d.ts +24 -0
  449. package/dist/visitor.js +119 -0
  450. package/dist/visitor.js.map +1 -0
  451. package/dist/visitors/index.d.ts +2 -0
  452. package/dist/visitors/index.js +8 -0
  453. package/dist/visitors/index.js.map +1 -0
  454. package/dist/visitors/json.d.ts +2 -0
  455. package/dist/visitors/json.js +39 -0
  456. package/dist/visitors/json.js.map +1 -0
  457. package/dist/visitors/liquid.d.ts +2 -0
  458. package/dist/visitors/liquid.js +39 -0
  459. package/dist/visitors/liquid.js.map +1 -0
  460. package/package.json +45 -0
  461. package/src/AugmentedThemeDocset.spec.ts +148 -0
  462. package/src/AugmentedThemeDocset.ts +148 -0
  463. package/src/JSONValidator.ts +82 -0
  464. package/src/checks/app-block-missing-schema/index.spec.ts +121 -0
  465. package/src/checks/app-block-missing-schema/index.ts +46 -0
  466. package/src/checks/app-block-valid-tags/index.spec.ts +96 -0
  467. package/src/checks/app-block-valid-tags/index.ts +54 -0
  468. package/src/checks/asset-preload/index.spec.ts +78 -0
  469. package/src/checks/asset-preload/index.ts +65 -0
  470. package/src/checks/asset-size-app-block-css/index.spec.ts +88 -0
  471. package/src/checks/asset-size-app-block-css/index.ts +78 -0
  472. package/src/checks/asset-size-app-block-javascript/index.spec.ts +66 -0
  473. package/src/checks/asset-size-app-block-javascript/index.ts +78 -0
  474. package/src/checks/asset-size-css/index.spec.ts +166 -0
  475. package/src/checks/asset-size-css/index.ts +160 -0
  476. package/src/checks/asset-size-javascript/index.spec.ts +184 -0
  477. package/src/checks/asset-size-javascript/index.ts +144 -0
  478. package/src/checks/block-id-usage/index.spec.ts +76 -0
  479. package/src/checks/block-id-usage/index.ts +72 -0
  480. package/src/checks/cdn-preconnect/index.spec.ts +40 -0
  481. package/src/checks/cdn-preconnect/index.ts +43 -0
  482. package/src/checks/content-for-header-modification/index.spec.ts +65 -0
  483. package/src/checks/content-for-header-modification/index.ts +72 -0
  484. package/src/checks/deprecate-bgsizes/index.spec.ts +41 -0
  485. package/src/checks/deprecate-bgsizes/index.ts +49 -0
  486. package/src/checks/deprecate-lazysizes/index.spec.ts +26 -0
  487. package/src/checks/deprecate-lazysizes/index.ts +58 -0
  488. package/src/checks/deprecated-filter/fixes.ts +264 -0
  489. package/src/checks/deprecated-filter/index.spec.ts +274 -0
  490. package/src/checks/deprecated-filter/index.ts +113 -0
  491. package/src/checks/deprecated-fonts-on-sections-and-blocks/deprecated-fonts-data.ts +1343 -0
  492. package/src/checks/deprecated-fonts-on-sections-and-blocks/index.spec.ts +613 -0
  493. package/src/checks/deprecated-fonts-on-sections-and-blocks/index.ts +284 -0
  494. package/src/checks/deprecated-fonts-on-settings-schema/index.spec.ts +102 -0
  495. package/src/checks/deprecated-fonts-on-settings-schema/index.ts +66 -0
  496. package/src/checks/deprecated-tag/index.spec.ts +68 -0
  497. package/src/checks/deprecated-tag/index.ts +46 -0
  498. package/src/checks/duplicate-content-for-arguments/index.spec.ts +98 -0
  499. package/src/checks/duplicate-content-for-arguments/index.ts +43 -0
  500. package/src/checks/duplicate-function-arguments/index.spec.ts +98 -0
  501. package/src/checks/duplicate-function-arguments/index.ts +44 -0
  502. package/src/checks/duplicate-render-partial-arguments/index.spec.ts +120 -0
  503. package/src/checks/duplicate-render-partial-arguments/index.ts +48 -0
  504. package/src/checks/empty-block-content/index.spec.ts +117 -0
  505. package/src/checks/empty-block-content/index.ts +60 -0
  506. package/src/checks/graphql/index.ts +64 -0
  507. package/src/checks/graphql-variables/index.ts +113 -0
  508. package/src/checks/hardcoded-routes/index.spec.ts +58 -0
  509. package/src/checks/hardcoded-routes/index.ts +100 -0
  510. package/src/checks/img-width-and-height/index.spec.ts +79 -0
  511. package/src/checks/img-width-and-height/index.ts +52 -0
  512. package/src/checks/index.ts +160 -0
  513. package/src/checks/invalid-hash-assign-target/index.spec.ts +176 -0
  514. package/src/checks/invalid-hash-assign-target/index.ts +306 -0
  515. package/src/checks/json-missing-block/index.spec.ts +435 -0
  516. package/src/checks/json-missing-block/index.ts +56 -0
  517. package/src/checks/json-missing-block/missing-block-utils.ts +147 -0
  518. package/src/checks/json-syntax-error/index.spec.ts +64 -0
  519. package/src/checks/json-syntax-error/index.ts +92 -0
  520. package/src/checks/liquid-free-settings/index.spec.ts +180 -0
  521. package/src/checks/liquid-free-settings/index.ts +79 -0
  522. package/src/checks/liquid-html-syntax-error/checks/InvalidBooleanExpression.spec.ts +43 -0
  523. package/src/checks/liquid-html-syntax-error/checks/InvalidBooleanExpressions.ts +29 -0
  524. package/src/checks/liquid-html-syntax-error/checks/InvalidConditionalNode.spec.ts +385 -0
  525. package/src/checks/liquid-html-syntax-error/checks/InvalidConditionalNode.ts +165 -0
  526. package/src/checks/liquid-html-syntax-error/checks/InvalidConditionalNodeParenthesis.spec.ts +52 -0
  527. package/src/checks/liquid-html-syntax-error/checks/InvalidConditionalNodeParenthesis.ts +39 -0
  528. package/src/checks/liquid-html-syntax-error/checks/InvalidEchoValue.spec.ts +108 -0
  529. package/src/checks/liquid-html-syntax-error/checks/InvalidEchoValue.ts +74 -0
  530. package/src/checks/liquid-html-syntax-error/checks/InvalidFilterName.spec.ts +223 -0
  531. package/src/checks/liquid-html-syntax-error/checks/InvalidFilterName.ts +92 -0
  532. package/src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.spec.ts +145 -0
  533. package/src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.ts +116 -0
  534. package/src/checks/liquid-html-syntax-error/checks/InvalidLoopRange.spec.ts +84 -0
  535. package/src/checks/liquid-html-syntax-error/checks/InvalidLoopRange.ts +79 -0
  536. package/src/checks/liquid-html-syntax-error/checks/InvalidPipeSyntax.spec.ts +184 -0
  537. package/src/checks/liquid-html-syntax-error/checks/InvalidPipeSyntax.ts +91 -0
  538. package/src/checks/liquid-html-syntax-error/checks/MultipleAssignValues.spec.ts +82 -0
  539. package/src/checks/liquid-html-syntax-error/checks/MultipleAssignValues.ts +86 -0
  540. package/src/checks/liquid-html-syntax-error/checks/utils.spec.ts +82 -0
  541. package/src/checks/liquid-html-syntax-error/checks/utils.ts +66 -0
  542. package/src/checks/liquid-html-syntax-error/index.spec.ts +129 -0
  543. package/src/checks/liquid-html-syntax-error/index.ts +152 -0
  544. package/src/checks/matching-translations/index.spec.ts +400 -0
  545. package/src/checks/matching-translations/index.ts +175 -0
  546. package/src/checks/metadata-params/index.spec.ts +103 -0
  547. package/src/checks/metadata-params/index.ts +119 -0
  548. package/src/checks/missing-asset/index.spec.ts +59 -0
  549. package/src/checks/missing-asset/index.ts +48 -0
  550. package/src/checks/missing-content-for-arguments/index.spec.ts +144 -0
  551. package/src/checks/missing-content-for-arguments/index.ts +46 -0
  552. package/src/checks/missing-template/index.spec.ts +61 -0
  553. package/src/checks/missing-template/index.ts +101 -0
  554. package/src/checks/orphaned-partial/index.spec.ts +58 -0
  555. package/src/checks/orphaned-partial/index.ts +43 -0
  556. package/src/checks/pagination-size/index.spec.ts +158 -0
  557. package/src/checks/pagination-size/index.ts +104 -0
  558. package/src/checks/parser-blocking-script/index.spec.ts +225 -0
  559. package/src/checks/parser-blocking-script/index.ts +91 -0
  560. package/src/checks/parser-blocking-script/suggestions.ts +42 -0
  561. package/src/checks/remote-asset/index.spec.ts +280 -0
  562. package/src/checks/remote-asset/index.ts +238 -0
  563. package/src/checks/reserved-doc-param-names/index.spec.ts +62 -0
  564. package/src/checks/reserved-doc-param-names/index.ts +57 -0
  565. package/src/checks/schema-presets-block-order/index.spec.ts +344 -0
  566. package/src/checks/schema-presets-block-order/index.ts +154 -0
  567. package/src/checks/schema-presets-static-blocks/index.spec.ts +145 -0
  568. package/src/checks/schema-presets-static-blocks/index.ts +126 -0
  569. package/src/checks/static-stylesheet-and-javascript-tags/index.spec.ts +257 -0
  570. package/src/checks/static-stylesheet-and-javascript-tags/index.ts +48 -0
  571. package/src/checks/translation-key-exists/index.spec.ts +44 -0
  572. package/src/checks/translation-key-exists/index.ts +78 -0
  573. package/src/checks/unclosed-html-element/index.spec.ts +260 -0
  574. package/src/checks/unclosed-html-element/index.ts +296 -0
  575. package/src/checks/undefined-object/index.spec.ts +519 -0
  576. package/src/checks/undefined-object/index.ts +336 -0
  577. package/src/checks/unique-doc-param-names/index.spec.ts +35 -0
  578. package/src/checks/unique-doc-param-names/index.ts +39 -0
  579. package/src/checks/unique-settings-id/index.spec.ts +24 -0
  580. package/src/checks/unique-settings-id/index.ts +84 -0
  581. package/src/checks/unique-settings-id/test-data.ts +1191 -0
  582. package/src/checks/unique-static-block-id/index.spec.ts +55 -0
  583. package/src/checks/unique-static-block-id/index.ts +60 -0
  584. package/src/checks/unknown-filter/index.spec.ts +59 -0
  585. package/src/checks/unknown-filter/index.ts +38 -0
  586. package/src/checks/unknown-property/index.spec.ts +234 -0
  587. package/src/checks/unknown-property/index.ts +468 -0
  588. package/src/checks/unknown-property/property-shape.ts +315 -0
  589. package/src/checks/unrecognized-content-for-arguments/index.spec.ts +145 -0
  590. package/src/checks/unrecognized-content-for-arguments/index.ts +55 -0
  591. package/src/checks/unrecognized-render-partial-arguments/index.spec.ts +184 -0
  592. package/src/checks/unrecognized-render-partial-arguments/index.ts +76 -0
  593. package/src/checks/unused-assign/index.spec.ts +160 -0
  594. package/src/checks/unused-assign/index.ts +87 -0
  595. package/src/checks/unused-doc-param/index.spec.ts +89 -0
  596. package/src/checks/unused-doc-param/index.ts +59 -0
  597. package/src/checks/utils.ts +117 -0
  598. package/src/checks/valid-block-target/index.spec.ts +1396 -0
  599. package/src/checks/valid-block-target/index.ts +142 -0
  600. package/src/checks/valid-content-for-argument-types/index.spec.ts +382 -0
  601. package/src/checks/valid-content-for-argument-types/index.ts +42 -0
  602. package/src/checks/valid-content-for-arguments/index.spec.ts +107 -0
  603. package/src/checks/valid-content-for-arguments/index.ts +98 -0
  604. package/src/checks/valid-doc-param-types/index.spec.ts +75 -0
  605. package/src/checks/valid-doc-param-types/index.ts +71 -0
  606. package/src/checks/valid-html-translation/index.spec.ts +74 -0
  607. package/src/checks/valid-html-translation/index.ts +45 -0
  608. package/src/checks/valid-json/index.spec.ts +102 -0
  609. package/src/checks/valid-json/index.ts +34 -0
  610. package/src/checks/valid-local-blocks/index.spec.ts +286 -0
  611. package/src/checks/valid-local-blocks/index.ts +100 -0
  612. package/src/checks/valid-local-blocks/valid-block-utils.ts +97 -0
  613. package/src/checks/valid-render-partial-argument-types/index.spec.ts +468 -0
  614. package/src/checks/valid-render-partial-argument-types/index.ts +89 -0
  615. package/src/checks/valid-schema/index.spec.ts +174 -0
  616. package/src/checks/valid-schema/index.ts +41 -0
  617. package/src/checks/valid-schema-name/index.spec.ts +112 -0
  618. package/src/checks/valid-schema-name/index.ts +75 -0
  619. package/src/checks/valid-settings-key/index.spec.ts +321 -0
  620. package/src/checks/valid-settings-key/index.ts +144 -0
  621. package/src/checks/valid-static-block-type/index.spec.ts +38 -0
  622. package/src/checks/valid-static-block-type/index.ts +58 -0
  623. package/src/checks/valid-visible-if/index.spec.ts +619 -0
  624. package/src/checks/valid-visible-if/index.ts +184 -0
  625. package/src/checks/valid-visible-if/visible-if-utils.ts +158 -0
  626. package/src/checks/variable-name/index.spec.ts +62 -0
  627. package/src/checks/variable-name/index.ts +115 -0
  628. package/src/context-utils.spec.ts +103 -0
  629. package/src/context-utils.ts +220 -0
  630. package/src/create-safe-check.ts +13 -0
  631. package/src/disabled-checks/index.spec.ts +262 -0
  632. package/src/disabled-checks/index.ts +189 -0
  633. package/src/disabled-checks/test-checks.ts +60 -0
  634. package/src/find-root.ts +60 -0
  635. package/src/fixes/apply-fix-to-string.spec.ts +52 -0
  636. package/src/fixes/apply-fix-to-string.ts +59 -0
  637. package/src/fixes/autofix.spec.ts +85 -0
  638. package/src/fixes/autofix.ts +41 -0
  639. package/src/fixes/corrector.ts +0 -0
  640. package/src/fixes/correctors/base-corrector.ts +5 -0
  641. package/src/fixes/correctors/graphql-corrector.ts +78 -0
  642. package/src/fixes/correctors/index.ts +29 -0
  643. package/src/fixes/correctors/json-corrector.spec.ts +111 -0
  644. package/src/fixes/correctors/json-corrector.ts +106 -0
  645. package/src/fixes/correctors/string-corrector.ts +78 -0
  646. package/src/fixes/index.ts +4 -0
  647. package/src/fixes/utils.ts +6 -0
  648. package/src/ignore.spec.ts +202 -0
  649. package/src/ignore.ts +23 -0
  650. package/src/index.spec.ts +8 -0
  651. package/src/index.ts +234 -0
  652. package/src/json.spec.ts +140 -0
  653. package/src/json.ts +81 -0
  654. package/src/jsonc/parse.spec.ts +118 -0
  655. package/src/jsonc/parse.ts +121 -0
  656. package/src/jsonc/types.ts +47 -0
  657. package/src/liquid-doc/arguments.spec.ts +146 -0
  658. package/src/liquid-doc/arguments.ts +315 -0
  659. package/src/liquid-doc/liquidDoc.spec.ts +296 -0
  660. package/src/liquid-doc/liquidDoc.ts +147 -0
  661. package/src/liquid-doc/utils.spec.ts +23 -0
  662. package/src/liquid-doc/utils.ts +125 -0
  663. package/src/path.ts +45 -0
  664. package/src/tags/content-for.ts +25 -0
  665. package/src/test/MockFileSystem.spec.ts +71 -0
  666. package/src/test/MockFileSystem.ts +87 -0
  667. package/src/test/MockTheme.ts +17 -0
  668. package/src/test/chai-offer-fix-assertion.spec.ts +53 -0
  669. package/src/test/chai-offer-fix-assertion.ts +45 -0
  670. package/src/test/chai-suggest-assertion.spec.ts +53 -0
  671. package/src/test/chai-suggest-assertion.ts +62 -0
  672. package/src/test/contain-offense.spec.ts +74 -0
  673. package/src/test/contain-offense.ts +54 -0
  674. package/src/test/index.ts +3 -0
  675. package/src/test/test-helper.ts +327 -0
  676. package/src/test/test-setup.ts +36 -0
  677. package/src/to-schema.ts +231 -0
  678. package/src/to-source-code.ts +75 -0
  679. package/src/types/schema-prop-factory.ts +112 -0
  680. package/src/types/schemas/index.ts +5 -0
  681. package/src/types/schemas/preset.ts +52 -0
  682. package/src/types/schemas/section.ts +86 -0
  683. package/src/types/schemas/setting.ts +320 -0
  684. package/src/types/schemas/template.ts +34 -0
  685. package/src/types/schemas/theme-block.ts +34 -0
  686. package/src/types/theme-liquid-docs.ts +184 -0
  687. package/src/types/theme-schemas.ts +80 -0
  688. package/src/types.ts +617 -0
  689. package/src/utils/array.ts +31 -0
  690. package/src/utils/block.ts +300 -0
  691. package/src/utils/error.spec.ts +71 -0
  692. package/src/utils/error.ts +48 -0
  693. package/src/utils/file-utils.ts +58 -0
  694. package/src/utils/index.ts +8 -0
  695. package/src/utils/indexBy.ts +14 -0
  696. package/src/utils/markup.ts +10 -0
  697. package/src/utils/memo.spec.ts +83 -0
  698. package/src/utils/memo.ts +80 -0
  699. package/src/utils/object.ts +3 -0
  700. package/src/utils/position.ts +16 -0
  701. package/src/utils/types.ts +57 -0
  702. package/src/visitor.spec.ts +163 -0
  703. package/src/visitor.ts +161 -0
  704. package/src/visitors/index.ts +2 -0
  705. package/src/visitors/json.ts +41 -0
  706. package/src/visitors/liquid.ts +40 -0
  707. package/tsconfig.build.json +8 -0
  708. package/tsconfig.json +31 -0
package/src/types.ts ADDED
@@ -0,0 +1,617 @@
1
+ import { LiquidHtmlNode, NodeTypes as LiquidHtmlNodeTypes } from '@platformos/liquid-html-parser';
2
+
3
+ import { Schema, Settings } from './types/schema-prop-factory';
4
+
5
+ import { AbstractFileSystem, UriString } from '@platformos/platformos-common';
6
+ import { JSONCorrector, StringCorrector } from './fixes';
7
+
8
+ import {
9
+ ArrayNode,
10
+ ASTNode,
11
+ JSONNode,
12
+ JSONNodeTypes,
13
+ LiteralNode,
14
+ ObjectNode,
15
+ PropertyNode,
16
+ ValueNode,
17
+ } from './jsonc/types';
18
+ import { JsonValidationSet, ThemeDocset } from './types/theme-liquid-docs';
19
+ import { AppBlockSchema, SectionSchema, ThemeBlockSchema } from './types/theme-schemas';
20
+ import { DocDefinition } from './liquid-doc/liquidDoc';
21
+ import { GraphQLCorrector } from './fixes/correctors/graphql-corrector';
22
+
23
+ export * from './jsonc/types';
24
+ export * from './types/schema-prop-factory';
25
+ export * from './types/theme-liquid-docs';
26
+ export * from './types/theme-schemas';
27
+
28
+ export const isObjectNode = (node?: ASTNode): node is ObjectNode => node?.type === 'Object';
29
+ export const isArrayNode = (node?: ASTNode): node is ArrayNode => node?.type === 'Array';
30
+ export const isPropertyNode = (node?: ASTNode): node is PropertyNode => node?.type === 'Property';
31
+ export const isValueNode = (node?: ASTNode): node is ValueNode => node?.type === 'Value';
32
+ export const isLiteralNode = (node?: ASTNode): node is LiteralNode => node?.type === 'Literal';
33
+
34
+ export const Modes = ['theme', 'app'] as const;
35
+ export type Mode = (typeof Modes)[number];
36
+ export type Theme = SourceCode<SourceCodeType>[];
37
+
38
+ export type SourceCode<T = SourceCodeType> = T extends SourceCodeType
39
+ ? {
40
+ /** A normalized uri the file. */
41
+ uri: string;
42
+ /** The type is used as a discriminant for type narrowing */
43
+ type: T;
44
+ /** The version is used by the Language Server to make sure the Client and Server are in sync */
45
+ version?: number;
46
+ /** The contents of the file */
47
+ source: string;
48
+ /** The AST representation of the file, or an Error instance when the file is unparseable */
49
+ ast: AST[T] | Error;
50
+ }
51
+ : never;
52
+ export enum SourceCodeType {
53
+ JSON = 'JSON',
54
+ LiquidHtml = 'LiquidHtml',
55
+ GraphQL = 'GraphQL',
56
+ }
57
+
58
+ export type LiquidSourceCode = SourceCode<SourceCodeType.LiquidHtml>;
59
+ export type PartialSourceCode = SourceCode<SourceCodeType.LiquidHtml> &
60
+ PlatformOSFile & {
61
+ kind: 'Partial';
62
+ };
63
+
64
+ export type PageLiquidSourceCode = SourceCode<SourceCodeType.LiquidHtml> &
65
+ PlatformOSFile & {
66
+ kind: 'Page';
67
+ route: string;
68
+ };
69
+
70
+ export type LiquidCheckDefinition<S extends Schema = Schema> = CheckDefinition<
71
+ SourceCodeType.LiquidHtml,
72
+ S
73
+ >;
74
+ export type LiquidCheck = Check<SourceCodeType.LiquidHtml>;
75
+
76
+ export { LiquidHtmlNode, LiquidHtmlNodeTypes };
77
+
78
+ export type JSONSourceCode = SourceCode<SourceCodeType.JSON>;
79
+ export type JSONCheckDefinition<S extends Schema = Schema> = CheckDefinition<
80
+ SourceCodeType.JSON,
81
+ S
82
+ >;
83
+ export type JSONCheck = Check<SourceCodeType.JSON>;
84
+
85
+ export interface PlatformOSFile {
86
+ name: string;
87
+ module_name: string;
88
+ path: string;
89
+ }
90
+
91
+ export interface GraphQLDocumentNode {
92
+ type: 'Document';
93
+ content: string;
94
+ }
95
+
96
+ // AST[SourceCodeType.LiquidHtml] maps to LiquidHtmlNode
97
+ export type AST = {
98
+ [T in SourceCodeType]: {
99
+ [SourceCodeType.JSON]: JSONNode;
100
+ [SourceCodeType.LiquidHtml]: LiquidHtmlNode;
101
+ [SourceCodeType.GraphQL]: GraphQLDocumentNode;
102
+ }[T];
103
+ };
104
+
105
+ export type NodeTypes = {
106
+ [T in SourceCodeType]: {
107
+ [SourceCodeType.JSON]: JSONNodeTypes;
108
+ [SourceCodeType.LiquidHtml]: LiquidHtmlNodeTypes;
109
+ [SourceCodeType.GraphQL]: 'Document';
110
+ }[T];
111
+ };
112
+
113
+ /** A vscode-uri string. */
114
+ export type { UriString };
115
+
116
+ /** Assumes forward slashes for simplicity internally */
117
+ export type RelativePath = string;
118
+
119
+ export type ChecksSettings = {
120
+ [code in string]?: CheckSettings;
121
+ };
122
+
123
+ export type CheckSettings = {
124
+ enabled: boolean;
125
+ severity?: Severity;
126
+ ignore?: string[];
127
+ } & {
128
+ [key in string]: any;
129
+ };
130
+
131
+ export type GraphQLSourceCode = SourceCode<SourceCodeType.GraphQL>;
132
+ export type GraphQLCheck = Check<SourceCodeType.GraphQL>;
133
+ export type GraphQLCheckDefinition<S extends Schema = Schema> = CheckDefinition<
134
+ SourceCodeType.GraphQL,
135
+ S
136
+ >;
137
+
138
+ export interface Config {
139
+ // I know, it's `context` in the config and `Mode` in the code...
140
+ // We already have something named "Context" internally when you're writing a check.
141
+ // I don't like "Mode" as a public API in the configs. Context sounds more Shopify-y.
142
+ // So we have `context: theme` and `context: app` as valid .theme-check.yml configs.
143
+ // I think it's rather obvious what they mean.
144
+ context: Mode;
145
+ settings: ChecksSettings;
146
+ checks: CheckDefinition<SourceCodeType, Schema>[];
147
+ rootUri: string; // e.g. file:///path-to-root
148
+ ignore?: string[];
149
+ onError?: (error: Error) => void;
150
+ }
151
+
152
+ export type NodeOfType<T extends SourceCodeType, NT> = Extract<AST[T], { type: NT }>;
153
+ export type LiquidHtmlNodeOfType<T> = NodeOfType<SourceCodeType.LiquidHtml, T>;
154
+ export type JSONNodeOfType<T> = NodeOfType<SourceCodeType.LiquidHtml, T>;
155
+
156
+ // Very intentionally eslint-like. Not reinventing the wheel + makes the
157
+ // eslint plugin writing skills transferable.
158
+ //
159
+ // The conditional type here is used to distribute the union if
160
+ // CheckDefinition is used with the enum instead of a specific enum value.
161
+ //
162
+ // That is, we want (CheckDefinition<JSON> | CheckDefinition<LiquidHTML>)[]
163
+ // we don't want (CheckDefinition<JSON | LiquidHtml>)[]
164
+ export type CheckDefinition<
165
+ T = SourceCodeType,
166
+ S extends Schema = Schema,
167
+ > = T extends SourceCodeType
168
+ ? {
169
+ /**
170
+ * The meta object holds information about the check.
171
+ * Its name, documentation, severity, etc.
172
+ */
173
+ meta: {
174
+ /** A human readable name for the check */
175
+ name: string;
176
+
177
+ /**
178
+ * A code for the check (shortname without spaces).
179
+ *
180
+ * Used in configurations and IDEs.
181
+ *
182
+ * Should be unique.
183
+ */
184
+ code: string;
185
+
186
+ /** For backwards compatibility, alternative code names for the check */
187
+ aliases?: string[];
188
+
189
+ /** The severity determines the icon and color of diagnostics */
190
+ severity: Severity.ERROR | Severity.WARNING | Severity.INFO;
191
+
192
+ /** Which AST type the check targets, must be one of SourceCodeType. */
193
+ type: T;
194
+
195
+ /** Human readable short description of the check as well as link to documentation. */
196
+ docs: {
197
+ description: string;
198
+ recommended?: boolean;
199
+ url?: string;
200
+ };
201
+
202
+ /**
203
+ * Schema of settings passed to your check.
204
+ *
205
+ * Used to support validations of your setting values, documentation,
206
+ * and IDE support.
207
+ */
208
+ schema: Schema;
209
+
210
+ /**
211
+ * An optional array that determines which yaml configs will have this check enabled.
212
+ *
213
+ * When no values are given, this check will be `enabled: true` in the `all.yml` configuration
214
+ *
215
+ * When values are given, this check will be `enabled: false` in the `all.yml` configuration
216
+ * and `enabled: true` within all yaml configurations with a matching filename.
217
+ *
218
+ * Note: theme-app-extension target is deprecated (Shopify-specific)
219
+ */
220
+ targets?: ConfigTarget[];
221
+
222
+ deprecated?: boolean;
223
+ replacedBy?: boolean;
224
+ };
225
+
226
+ /**
227
+ * A function that returns a Check, the function scope is a good place to
228
+ * initialize state for a run.
229
+ *
230
+ * - One check is created per file
231
+ * - The state is not shared while traversing all files
232
+ * - To report problems, use the context.report method.
233
+ *
234
+ * @example
235
+ *
236
+ * create(context) {
237
+ * const tags = []
238
+ *
239
+ * return {
240
+ * async LiquidTag(node) {
241
+ * tags.push(node);
242
+ * },
243
+ *
244
+ * async onCodePathEnd() {
245
+ * tags.forEach(tag => {
246
+ * ...
247
+ * });
248
+ * },
249
+ * }
250
+ * }
251
+ */
252
+ create(context: Context<T, S>): Partial<Check<T>>;
253
+ }
254
+ : never;
255
+
256
+ /**
257
+ * A Check is an object that defines visitor methods by node type.
258
+ *
259
+ * @example
260
+ * {
261
+ * async onCodePathStart(file) {
262
+ * // Happens at the very beginning
263
+ * },
264
+ *
265
+ * AssignMarkup: async (node, file) => {
266
+ * // Happens once per node, while going down the tree
267
+ * },
268
+ *
269
+ * "AssignMarkup:exit": async (node, file) => {
270
+ * // Happens once per node, in reverse order
271
+ * },
272
+ *
273
+ * async onCodePathEnd(file) {
274
+ * // Happens at the very end
275
+ * }
276
+ * }
277
+ */
278
+ export type Check<T> = T extends SourceCodeType
279
+ ? Partial<CheckNodeMethods<T> & CheckExitMethods<T> & CheckLifecycleMethods<T>>
280
+ : never;
281
+
282
+ export type CheckNodeMethod<T extends SourceCodeType, NT> = (
283
+ node: NodeOfType<T, NT>,
284
+ ancestors: AST[T][],
285
+ ) => Promise<void>;
286
+
287
+ type CheckNodeMethods<T extends SourceCodeType> = {
288
+ /** Happens once per node, while going down the tree */
289
+ [NT in NodeTypes[T]]: CheckNodeMethod<T, NT>;
290
+ };
291
+
292
+ type CheckExitMethods<T extends SourceCodeType> = {
293
+ /** Happens once per node, in reverse order */
294
+ [NT in NodeTypes[T] as `${NT}:exit`]: CheckNodeMethod<T, NT>;
295
+ };
296
+
297
+ type CheckLifecycleMethods<T extends SourceCodeType> = {
298
+ /** Happens before traversing a file, file might be unparseable */
299
+ onCodePathStart(file: SourceCode<T>): Promise<void>;
300
+
301
+ /** Happens after traversing a file, file is guaranteed to exist */
302
+ onCodePathEnd(file: SourceCode<T> & { ast: AST[T] }): Promise<void>;
303
+ };
304
+
305
+ export type MetafieldCategory =
306
+ | 'article'
307
+ | 'blog'
308
+ | 'collection'
309
+ | 'company'
310
+ | 'company_location'
311
+ | 'location'
312
+ | 'market'
313
+ | 'order'
314
+ | 'page'
315
+ | 'product'
316
+ | 'variant'
317
+ | 'shop';
318
+
319
+ export type MetafieldDefinitionMap = {
320
+ [key in MetafieldCategory]: MetafieldDefinition[];
321
+ };
322
+
323
+ export type MetafieldDefinition = {
324
+ key: string;
325
+ name: string;
326
+ namespace: string;
327
+ description: string;
328
+ type: MetafieldDefinitionType;
329
+ };
330
+
331
+ type MetafieldDefinitionType = {
332
+ category: string;
333
+ name: string;
334
+ };
335
+
336
+ export type Translations = {
337
+ [k in string]: string | Translations;
338
+ };
339
+
340
+ /**
341
+ * A reference is a link between two modules.
342
+ *
343
+ * @example
344
+ *
345
+ * It could be a specific range that points to a whole file
346
+ * {
347
+ * source: { uri: 'file:///templates/index.json', range: [167, 190] },
348
+ * target: 'file:///sections/custom-section.liquid'
349
+ * }
350
+ *
351
+ * It could be a specific range that points to a specific range
352
+ * {
353
+ * // e.g. `<parent-component></parent-component>`
354
+ * source: { uri: 'file:///app/views/partials/parent.liquid', range: [167, 190] },
355
+ *
356
+ * // e.g. window.customElements.define('parent-component', ParentComponent);
357
+ * target: { uri: 'file:///assets/theme.js', range: [0, undefined] }
358
+ * }
359
+ */
360
+ export type Reference = {
361
+ source: Location;
362
+ target: Location;
363
+
364
+ type:
365
+ | 'direct' // explicit dependency, e.g. {% render 'child' %}
366
+ | 'indirect' // indirect dependency, e.g. "blocks": [{ "type": "@theme" }]
367
+ | 'preset'; // preset dependency
368
+ };
369
+
370
+ export type Range = [start: number, end: number]; // represents a range in the source code
371
+ export type Location = {
372
+ /** The URI of the module */
373
+ uri: UriString;
374
+ /** Optional range inside that module */
375
+ range?: Range;
376
+ };
377
+
378
+ export interface Dependencies {
379
+ /** The file system abstraction used to read files. */
380
+ fs: AbstractFileSystem;
381
+
382
+ /** The typing information */
383
+ themeDocset?: ThemeDocset;
384
+
385
+ /** The blocks/sections JSON schemas */
386
+ jsonValidationSet?: JsonValidationSet;
387
+
388
+ /** Returns the typing information for the theme's metafields */
389
+ getMetafieldDefinitions?: (rootUri: UriString) => Promise<MetafieldDefinitionMap>;
390
+
391
+ /**
392
+ * Asynchronously get the block schema for 'blocks/${name}.liquid'
393
+ * May return undefined when the theme isn't preloaded.
394
+ * See {@link ThemeBlockSchema} for more information
395
+ */
396
+ getBlockSchema?: (name: string) => Promise<ThemeBlockSchema | undefined>;
397
+
398
+ /**
399
+ * Asynchronously get the section schema for 'section/${name}.liquid'
400
+ * May return undefined when the theme isn't preloaded or if there are none.
401
+ * See {@link SectionSchema} for more information
402
+ */
403
+ getSectionSchema?: (name: string) => Promise<SectionSchema | undefined>;
404
+
405
+ /**
406
+ * (In theme app extension mode)
407
+ * Asynchronously get the block schema for 'blocks/${name}.liquid'
408
+ * May return undefined when the theme isn't preloaded.
409
+ * See {@link AppBlockSchema} for more information
410
+ */
411
+ getAppBlockSchema?: (name: string) => Promise<AppBlockSchema | undefined>;
412
+
413
+ /**
414
+ * Asynchronously get the Liquid HTML AST for a file.
415
+ * May return undefined when the theme isn't preloaded.
416
+ *
417
+ * Used in theme-checks for cross-file checks rather that going through fs.
418
+ */
419
+ getDocDefinition?: (relativePath: string) => Promise<DocDefinition | undefined>;
420
+
421
+ /**
422
+ * Get references to a file (which files reference this file)
423
+ * Returns an empty array if no files reference this file
424
+ */
425
+ getReferences?: (uri: string) => Promise<Reference[]>;
426
+ }
427
+
428
+ export type ValidateJSON = (
429
+ uri: string,
430
+ jsonString: string,
431
+ ) => Promise<{ message: string; startIndex: number; endIndex: number }[]>;
432
+
433
+ export type IsValidSchema = (uri: string, jsonString: string) => Promise<boolean>;
434
+
435
+ export interface AugmentedDependencies extends Dependencies {
436
+ fileExists: (uri: UriString) => Promise<boolean>;
437
+ fileSize: (uri: UriString) => Promise<number>;
438
+ getDefaultLocale: () => Promise<string>;
439
+ getDefaultSchemaLocale: () => Promise<string>;
440
+ getDefaultTranslations(): Promise<Translations>;
441
+ getDefaultSchemaTranslations(): Promise<Translations>;
442
+ mode: Mode;
443
+ }
444
+
445
+ type StaticContextProperties<T extends SourceCodeType> = T extends SourceCodeType
446
+ ? {
447
+ report(problem: Problem<T>): void;
448
+ toRelativePath(uri: UriString): RelativePath;
449
+ toUri(relativePath: RelativePath): UriString;
450
+ file: SourceCode<T>;
451
+ validateJSON?: ValidateJSON;
452
+ }
453
+ : never;
454
+
455
+ export type Context<T extends SourceCodeType, S extends Schema = Schema> = T extends SourceCodeType
456
+ ? StaticContextProperties<T> & AugmentedDependencies & { settings: Settings<S>; config: Config }
457
+ : never;
458
+
459
+ export type Corrector<T extends SourceCodeType> = T extends SourceCodeType
460
+ ? {
461
+ [SourceCodeType.JSON]: JSONCorrector;
462
+ [SourceCodeType.LiquidHtml]: StringCorrector;
463
+ [SourceCodeType.GraphQL]: GraphQLCorrector;
464
+ }[T]
465
+ : never;
466
+
467
+ /**
468
+ * A Fixer is a function that returns a Fix (a data representation of the change).
469
+ *
470
+ * The Corrector module is helpful for creating Fix objects.
471
+ */
472
+ export type Fixer<T extends SourceCodeType> = T extends SourceCodeType
473
+ ? (corrector: Corrector<T>) => void
474
+ : never;
475
+ export type LiquidHtmlFixer = Fixer<SourceCodeType.LiquidHtml>;
476
+ export type JSONFixer = Fixer<SourceCodeType.JSON>;
477
+ export type GraphQLFixer = Fixer<SourceCodeType.GraphQL>;
478
+
479
+ /**
480
+ * A data representation of a collection of changes to a document. They all
481
+ * assume that they operate on the initial string independently.
482
+ *
483
+ * It is recursive so that fixes can be grouped together.
484
+ */
485
+ export type Fix = FixDescription | Fix[];
486
+
487
+ /**
488
+ * A data representation of a change to a document.
489
+ *
490
+ * To insert:
491
+ * - startIndex: x, endIndex: x, insert: insertion
492
+ *
493
+ * To replace:
494
+ * - startIndex: x, endIndex: y, insert: replacement
495
+ *
496
+ * To delete:
497
+ * - startIndex: x, endIndex: y, insert: ''
498
+ */
499
+ export interface FixDescription {
500
+ /** 0-based index, included */
501
+ startIndex: number;
502
+ /** 0-based index, excluded */
503
+ endIndex: number;
504
+ /** What to replace the contents of the range with. To delete, put entry string. */
505
+ insert: string;
506
+ }
507
+
508
+ /**
509
+ * The FixApplicator is a function that takes a list of FixDescription and
510
+ * applies them on the source to produce a result.
511
+ *
512
+ * - In a CLI context, this might be changeString().then(saveFile)
513
+ * - In the Language Server, this function will collect the TextEdit[]
514
+ * before sending them as a WorkspaceEdit
515
+ *
516
+ * It is assumed that all FixDescription are all applied to the initial
517
+ * document, and not the one produced by previous FixDescription.
518
+ *
519
+ * It is the FixApplicator's job to throw an error if the FixDescription
520
+ * array contains overlapping ranges.
521
+ *
522
+ * It is the FixApplicator's job to change the location of fixes as indexes
523
+ * drift. See [1] and [2] for inspiration, we're following the same
524
+ * pattern.
525
+ *
526
+ * [1]: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textEditArray
527
+ * [2]: https://codemirror.net/docs/ref/#state.EditorState.update
528
+ */
529
+ export interface FixApplicator {
530
+ (source: SourceCode<SourceCodeType>, fixes: Fix): Promise<void>;
531
+ }
532
+
533
+ /**
534
+ * A suggestion is a Fix that we cannot apply automatically. Perhaps
535
+ * because there are multiple options or because the fix is dangerous and
536
+ * requires care.
537
+ *
538
+ * To be used by code editors.
539
+ */
540
+ export type Suggestion<T extends SourceCodeType> = T extends SourceCodeType
541
+ ? {
542
+ message: string;
543
+ fix: Fixer<T>;
544
+ }
545
+ : never;
546
+
547
+ export type LiquidHtmlSuggestion = Suggestion<SourceCodeType.LiquidHtml>;
548
+ export type JSONSuggestion = Suggestion<SourceCodeType.JSON>;
549
+
550
+ export type Problem<T extends SourceCodeType> = T extends SourceCodeType
551
+ ? {
552
+ /** The description of the problem shown to the user */
553
+ message: string;
554
+
555
+ /** 0-indexed, included */
556
+ startIndex: number;
557
+
558
+ /** 0-indexed, excluded */
559
+ endIndex: number;
560
+
561
+ /**
562
+ * The fix attribute is used to provide a "autofix" rule
563
+ * to the offense. It is reserved for safe changes.
564
+ * Unsafe changes should go in `suggest`.
565
+ */
566
+ fix?: Fixer<T>;
567
+
568
+ /**
569
+ * Sometimes, it's not appropriate to automatically apply a fix either
570
+ * because it is not safe, or because there are multiple ways to fix it.
571
+ *
572
+ * For instance, we can't know if you'd want to fix a parser blocking
573
+ * script with `defer` or with `async`. The suggest array allows us to
574
+ * provide fixes for either and the user can choose which one they want.
575
+ */
576
+ suggest?: Suggestion<T>[];
577
+ }
578
+ : never;
579
+
580
+ export type Offense<T extends SourceCodeType = SourceCodeType> = T extends SourceCodeType
581
+ ? {
582
+ type: T;
583
+ check: string;
584
+ message: string;
585
+ uri: string;
586
+ severity: Severity;
587
+ start: Position;
588
+ end: Position;
589
+ fix?: Fixer<T>;
590
+ suggest?: Suggestion<T>[];
591
+ }
592
+ : never;
593
+
594
+ export interface Position {
595
+ /** 0-indexed */
596
+ index: number;
597
+
598
+ /** 1-indexed */
599
+ get line(): number;
600
+
601
+ /** 0-indexed */
602
+ get character(): number;
603
+ }
604
+
605
+ /** The severity determines the icon and color of diagnostics */
606
+ export enum Severity {
607
+ ERROR = 0,
608
+ WARNING = 1,
609
+ INFO = 2,
610
+ }
611
+
612
+ /** The yaml configurations to target checks */
613
+ export enum ConfigTarget {
614
+ All = 'all',
615
+ Recommended = 'recommended',
616
+ ThemeAppExtension = 'theme-app-extension',
617
+ }
@@ -0,0 +1,31 @@
1
+ export function first<T>(arr: T[]): T | undefined {
2
+ return arr[0];
3
+ }
4
+
5
+ export function last<T>(arr: T[], offset: number = 0): T | undefined {
6
+ return arr[arr.length - 1 + offset];
7
+ }
8
+
9
+ export function findLast<T, NT extends T>(array: T[], pred: (n: T) => n is NT): NT | undefined;
10
+ export function findLast<T>(array: T[], pred: (n: T) => boolean): T | undefined {
11
+ return array[findLastIndex(array, pred)];
12
+ }
13
+
14
+ export function findLastIndex<T>(array: T[], pred: (n: T) => boolean): number {
15
+ for (let i = array.length - 1; i >= 0; i--) {
16
+ if (pred(array[i])) return i;
17
+ }
18
+ return -1;
19
+ }
20
+
21
+ export function findLastAndIndex<T, NT extends T>(
22
+ array: T[],
23
+ pred: (n: T) => n is NT,
24
+ ): [NT, number] | [undefined, -1];
25
+ export function findLastAndIndex<T>(
26
+ array: T[],
27
+ pred: (n: T) => boolean,
28
+ ): [T, number] | [undefined, -1] {
29
+ const index = findLastIndex(array, pred);
30
+ return [array[index], index];
31
+ }