@platformos/platformos-language-server-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 (711) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +87 -0
  3. package/dist/ClientCapabilities.d.ts +14 -0
  4. package/dist/ClientCapabilities.js +52 -0
  5. package/dist/ClientCapabilities.js.map +1 -0
  6. package/dist/PropertyShapeInference.d.ts +57 -0
  7. package/dist/PropertyShapeInference.js +336 -0
  8. package/dist/PropertyShapeInference.js.map +1 -0
  9. package/dist/TypeSystem.d.ts +94 -0
  10. package/dist/TypeSystem.js +1481 -0
  11. package/dist/TypeSystem.js.map +1 -0
  12. package/dist/VariableShapeExtractor.d.ts +14 -0
  13. package/dist/VariableShapeExtractor.js +283 -0
  14. package/dist/VariableShapeExtractor.js.map +1 -0
  15. package/dist/codeActions/BaseCodeActionsProvider.d.ts +11 -0
  16. package/dist/codeActions/BaseCodeActionsProvider.js +14 -0
  17. package/dist/codeActions/BaseCodeActionsProvider.js.map +1 -0
  18. package/dist/codeActions/CodeActionsProvider.d.ts +9 -0
  19. package/dist/codeActions/CodeActionsProvider.js +22 -0
  20. package/dist/codeActions/CodeActionsProvider.js.map +1 -0
  21. package/dist/codeActions/index.d.ts +1 -0
  22. package/dist/codeActions/index.js +7 -0
  23. package/dist/codeActions/index.js.map +1 -0
  24. package/dist/codeActions/providers/FixAllProvider.d.ts +23 -0
  25. package/dist/codeActions/providers/FixAllProvider.js +52 -0
  26. package/dist/codeActions/providers/FixAllProvider.js.map +1 -0
  27. package/dist/codeActions/providers/FixProvider.d.ts +6 -0
  28. package/dist/codeActions/providers/FixProvider.js +72 -0
  29. package/dist/codeActions/providers/FixProvider.js.map +1 -0
  30. package/dist/codeActions/providers/GenerateDocBlockProvider.d.ts +10 -0
  31. package/dist/codeActions/providers/GenerateDocBlockProvider.js +39 -0
  32. package/dist/codeActions/providers/GenerateDocBlockProvider.js.map +1 -0
  33. package/dist/codeActions/providers/SuggestionProvider.d.ts +6 -0
  34. package/dist/codeActions/providers/SuggestionProvider.js +41 -0
  35. package/dist/codeActions/providers/SuggestionProvider.js.map +1 -0
  36. package/dist/codeActions/providers/index.d.ts +3 -0
  37. package/dist/codeActions/providers/index.js +10 -0
  38. package/dist/codeActions/providers/index.js.map +1 -0
  39. package/dist/codeActions/providers/utils.d.ts +20 -0
  40. package/dist/codeActions/providers/utils.js +29 -0
  41. package/dist/codeActions/providers/utils.js.map +1 -0
  42. package/dist/commands/BaseExecuteCommandProvider.d.ts +13 -0
  43. package/dist/commands/BaseExecuteCommandProvider.js +13 -0
  44. package/dist/commands/BaseExecuteCommandProvider.js.map +1 -0
  45. package/dist/commands/ExecuteCommandProvider.d.ts +11 -0
  46. package/dist/commands/ExecuteCommandProvider.js +30 -0
  47. package/dist/commands/ExecuteCommandProvider.js.map +1 -0
  48. package/dist/commands/index.d.ts +2 -0
  49. package/dist/commands/index.js +9 -0
  50. package/dist/commands/index.js.map +1 -0
  51. package/dist/commands/providers/ApplyFixesProvider.d.ts +19 -0
  52. package/dist/commands/providers/ApplyFixesProvider.js +69 -0
  53. package/dist/commands/providers/ApplyFixesProvider.js.map +1 -0
  54. package/dist/commands/providers/ApplySuggestionProvider.d.ts +19 -0
  55. package/dist/commands/providers/ApplySuggestionProvider.js +73 -0
  56. package/dist/commands/providers/ApplySuggestionProvider.js.map +1 -0
  57. package/dist/commands/providers/GenerateDocBlockCommandProvider.d.ts +19 -0
  58. package/dist/commands/providers/GenerateDocBlockCommandProvider.js +64 -0
  59. package/dist/commands/providers/GenerateDocBlockCommandProvider.js.map +1 -0
  60. package/dist/commands/providers/RunChecksProvider.d.ts +26 -0
  61. package/dist/commands/providers/RunChecksProvider.js +32 -0
  62. package/dist/commands/providers/RunChecksProvider.js.map +1 -0
  63. package/dist/commands/providers/index.d.ts +3 -0
  64. package/dist/commands/providers/index.js +12 -0
  65. package/dist/commands/providers/index.js.map +1 -0
  66. package/dist/completions/CompletionsProvider.d.ts +35 -0
  67. package/dist/completions/CompletionsProvider.js +55 -0
  68. package/dist/completions/CompletionsProvider.js.map +1 -0
  69. package/dist/completions/index.d.ts +1 -0
  70. package/dist/completions/index.js +6 -0
  71. package/dist/completions/index.js.map +1 -0
  72. package/dist/completions/params/LiquidCompletionParams.d.ts +24 -0
  73. package/dist/completions/params/LiquidCompletionParams.js +436 -0
  74. package/dist/completions/params/LiquidCompletionParams.js.map +1 -0
  75. package/dist/completions/params/fix.d.ts +11 -0
  76. package/dist/completions/params/fix.js +238 -0
  77. package/dist/completions/params/fix.js.map +1 -0
  78. package/dist/completions/params/index.d.ts +2 -0
  79. package/dist/completions/params/index.js +8 -0
  80. package/dist/completions/params/index.js.map +1 -0
  81. package/dist/completions/providers/ContentForBlockTypeCompletionProvider.d.ts +8 -0
  82. package/dist/completions/providers/ContentForBlockTypeCompletionProvider.js +36 -0
  83. package/dist/completions/providers/ContentForBlockTypeCompletionProvider.js.map +1 -0
  84. package/dist/completions/providers/ContentForCompletionProvider.d.ts +7 -0
  85. package/dist/completions/providers/ContentForCompletionProvider.js +87 -0
  86. package/dist/completions/providers/ContentForCompletionProvider.js.map +1 -0
  87. package/dist/completions/providers/ContentForParameterCompletionProvider.d.ts +23 -0
  88. package/dist/completions/providers/ContentForParameterCompletionProvider.js +127 -0
  89. package/dist/completions/providers/ContentForParameterCompletionProvider.js.map +1 -0
  90. package/dist/completions/providers/FilterCompletionProvider.d.ts +21 -0
  91. package/dist/completions/providers/FilterCompletionProvider.js +162 -0
  92. package/dist/completions/providers/FilterCompletionProvider.js.map +1 -0
  93. package/dist/completions/providers/FilterNamedParameterCompletionProvider.d.ts +15 -0
  94. package/dist/completions/providers/FilterNamedParameterCompletionProvider.js +86 -0
  95. package/dist/completions/providers/FilterNamedParameterCompletionProvider.js.map +1 -0
  96. package/dist/completions/providers/HtmlAttributeCompletionProvider.d.ts +13 -0
  97. package/dist/completions/providers/HtmlAttributeCompletionProvider.js +83 -0
  98. package/dist/completions/providers/HtmlAttributeCompletionProvider.js.map +1 -0
  99. package/dist/completions/providers/HtmlAttributeValueCompletionProvider.d.ts +7 -0
  100. package/dist/completions/providers/HtmlAttributeValueCompletionProvider.js +53 -0
  101. package/dist/completions/providers/HtmlAttributeValueCompletionProvider.js.map +1 -0
  102. package/dist/completions/providers/HtmlTagCompletionProvider.d.ts +7 -0
  103. package/dist/completions/providers/HtmlTagCompletionProvider.js +90 -0
  104. package/dist/completions/providers/HtmlTagCompletionProvider.js.map +1 -0
  105. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.d.ts +9 -0
  106. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js +56 -0
  107. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js.map +1 -0
  108. package/dist/completions/providers/LiquidDocTagCompletionProvider.d.ts +8 -0
  109. package/dist/completions/providers/LiquidDocTagCompletionProvider.js +62 -0
  110. package/dist/completions/providers/LiquidDocTagCompletionProvider.js.map +1 -0
  111. package/dist/completions/providers/LiquidTagsCompletionProvider.d.ts +9 -0
  112. package/dist/completions/providers/LiquidTagsCompletionProvider.js +367 -0
  113. package/dist/completions/providers/LiquidTagsCompletionProvider.js.map +1 -0
  114. package/dist/completions/providers/ObjectAttributeCompletionProvider.d.ts +9 -0
  115. package/dist/completions/providers/ObjectAttributeCompletionProvider.js +71 -0
  116. package/dist/completions/providers/ObjectAttributeCompletionProvider.js.map +1 -0
  117. package/dist/completions/providers/ObjectCompletionProvider.d.ts +9 -0
  118. package/dist/completions/providers/ObjectCompletionProvider.js +35 -0
  119. package/dist/completions/providers/ObjectCompletionProvider.js.map +1 -0
  120. package/dist/completions/providers/PartialCompletionProvider.d.ts +9 -0
  121. package/dist/completions/providers/PartialCompletionProvider.js +34 -0
  122. package/dist/completions/providers/PartialCompletionProvider.js.map +1 -0
  123. package/dist/completions/providers/RenderPartialParameterCompletionProvider.d.ts +10 -0
  124. package/dist/completions/providers/RenderPartialParameterCompletionProvider.js +55 -0
  125. package/dist/completions/providers/RenderPartialParameterCompletionProvider.js.map +1 -0
  126. package/dist/completions/providers/TranslationCompletionProvider.d.ts +11 -0
  127. package/dist/completions/providers/TranslationCompletionProvider.js +78 -0
  128. package/dist/completions/providers/TranslationCompletionProvider.js.map +1 -0
  129. package/dist/completions/providers/common/CompletionItemProperties.d.ts +7 -0
  130. package/dist/completions/providers/common/CompletionItemProperties.js +52 -0
  131. package/dist/completions/providers/common/CompletionItemProperties.js.map +1 -0
  132. package/dist/completions/providers/common/Provider.d.ts +5 -0
  133. package/dist/completions/providers/common/Provider.js +3 -0
  134. package/dist/completions/providers/common/Provider.js.map +1 -0
  135. package/dist/completions/providers/common/index.d.ts +7 -0
  136. package/dist/completions/providers/common/index.js +17 -0
  137. package/dist/completions/providers/common/index.js.map +1 -0
  138. package/dist/completions/providers/data/contentForParameterCompletionOptions.d.ts +7 -0
  139. package/dist/completions/providers/data/contentForParameterCompletionOptions.js +13 -0
  140. package/dist/completions/providers/data/contentForParameterCompletionOptions.js.map +1 -0
  141. package/dist/completions/providers/index.d.ts +17 -0
  142. package/dist/completions/providers/index.js +36 -0
  143. package/dist/completions/providers/index.js.map +1 -0
  144. package/dist/css/CSSLanguageService.d.ts +12 -0
  145. package/dist/css/CSSLanguageService.js +94 -0
  146. package/dist/css/CSSLanguageService.js.map +1 -0
  147. package/dist/css/test/test-helpers.d.ts +4 -0
  148. package/dist/css/test/test-helpers.js +19 -0
  149. package/dist/css/test/test-helpers.js.map +1 -0
  150. package/dist/definitions/BaseDefinitionProvider.d.ts +5 -0
  151. package/dist/definitions/BaseDefinitionProvider.js +3 -0
  152. package/dist/definitions/BaseDefinitionProvider.js.map +1 -0
  153. package/dist/definitions/DefinitionProvider.d.ts +8 -0
  154. package/dist/definitions/DefinitionProvider.js +29 -0
  155. package/dist/definitions/DefinitionProvider.js.map +1 -0
  156. package/dist/definitions/providers/SchemaTranslationStringDefinitionProvider.d.ts +10 -0
  157. package/dist/definitions/providers/SchemaTranslationStringDefinitionProvider.js +55 -0
  158. package/dist/definitions/providers/SchemaTranslationStringDefinitionProvider.js.map +1 -0
  159. package/dist/definitions/providers/TranslationStringDefinitionProvider.d.ts +10 -0
  160. package/dist/definitions/providers/TranslationStringDefinitionProvider.js +48 -0
  161. package/dist/definitions/providers/TranslationStringDefinitionProvider.js.map +1 -0
  162. package/dist/diagnostics/DiagnosticsManager.d.ts +24 -0
  163. package/dist/diagnostics/DiagnosticsManager.js +40 -0
  164. package/dist/diagnostics/DiagnosticsManager.js.map +1 -0
  165. package/dist/diagnostics/index.d.ts +2 -0
  166. package/dist/diagnostics/index.js +8 -0
  167. package/dist/diagnostics/index.js.map +1 -0
  168. package/dist/diagnostics/offenseToDiagnostic.d.ts +4 -0
  169. package/dist/diagnostics/offenseToDiagnostic.js +68 -0
  170. package/dist/diagnostics/offenseToDiagnostic.js.map +1 -0
  171. package/dist/diagnostics/runChecks.d.ts +9 -0
  172. package/dist/diagnostics/runChecks.js +103 -0
  173. package/dist/diagnostics/runChecks.js.map +1 -0
  174. package/dist/docset/HtmlDocset.d.ts +35 -0
  175. package/dist/docset/HtmlDocset.js +39 -0
  176. package/dist/docset/HtmlDocset.js.map +1 -0
  177. package/dist/docset/MarkdownRenderer.d.ts +7 -0
  178. package/dist/docset/MarkdownRenderer.js +125 -0
  179. package/dist/docset/MarkdownRenderer.js.map +1 -0
  180. package/dist/docset/index.d.ts +2 -0
  181. package/dist/docset/index.js +22 -0
  182. package/dist/docset/index.js.map +1 -0
  183. package/dist/documentHighlights/BaseDocumentHighlightsProvider.d.ts +5 -0
  184. package/dist/documentHighlights/BaseDocumentHighlightsProvider.js +3 -0
  185. package/dist/documentHighlights/BaseDocumentHighlightsProvider.js.map +1 -0
  186. package/dist/documentHighlights/DocumentHighlightsProvider.d.ts +22 -0
  187. package/dist/documentHighlights/DocumentHighlightsProvider.js +41 -0
  188. package/dist/documentHighlights/DocumentHighlightsProvider.js.map +1 -0
  189. package/dist/documentHighlights/index.d.ts +1 -0
  190. package/dist/documentHighlights/index.js +7 -0
  191. package/dist/documentHighlights/index.js.map +1 -0
  192. package/dist/documentHighlights/providers/HtmlTagNameDocumentHighlightsProvider.d.ts +11 -0
  193. package/dist/documentHighlights/providers/HtmlTagNameDocumentHighlightsProvider.js +20 -0
  194. package/dist/documentHighlights/providers/HtmlTagNameDocumentHighlightsProvider.js.map +1 -0
  195. package/dist/documentHighlights/providers/LiquidBlockTagDocumentHighlightsProvider.d.ts +11 -0
  196. package/dist/documentHighlights/providers/LiquidBlockTagDocumentHighlightsProvider.js +48 -0
  197. package/dist/documentHighlights/providers/LiquidBlockTagDocumentHighlightsProvider.js.map +1 -0
  198. package/dist/documentHighlights/providers/index.d.ts +2 -0
  199. package/dist/documentHighlights/providers/index.js +8 -0
  200. package/dist/documentHighlights/providers/index.js.map +1 -0
  201. package/dist/documentLinks/DocumentLinksProvider.d.ts +12 -0
  202. package/dist/documentLinks/DocumentLinksProvider.js +78 -0
  203. package/dist/documentLinks/DocumentLinksProvider.js.map +1 -0
  204. package/dist/documentLinks/index.d.ts +1 -0
  205. package/dist/documentLinks/index.js +6 -0
  206. package/dist/documentLinks/index.js.map +1 -0
  207. package/dist/documents/DocumentManager.d.ts +60 -0
  208. package/dist/documents/DocumentManager.js +167 -0
  209. package/dist/documents/DocumentManager.js.map +1 -0
  210. package/dist/documents/index.d.ts +2 -0
  211. package/dist/documents/index.js +21 -0
  212. package/dist/documents/index.js.map +1 -0
  213. package/dist/documents/types.d.ts +39 -0
  214. package/dist/documents/types.js +11 -0
  215. package/dist/documents/types.js.map +1 -0
  216. package/dist/formatting/OnTypeFormattingProvider.d.ts +10 -0
  217. package/dist/formatting/OnTypeFormattingProvider.js +24 -0
  218. package/dist/formatting/OnTypeFormattingProvider.js.map +1 -0
  219. package/dist/formatting/index.d.ts +1 -0
  220. package/dist/formatting/index.js +6 -0
  221. package/dist/formatting/index.js.map +1 -0
  222. package/dist/formatting/providers/BracketsAutoclosingOnTypeFormattingProvider.d.ts +49 -0
  223. package/dist/formatting/providers/BracketsAutoclosingOnTypeFormattingProvider.js +105 -0
  224. package/dist/formatting/providers/BracketsAutoclosingOnTypeFormattingProvider.js.map +1 -0
  225. package/dist/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.d.ts +41 -0
  226. package/dist/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.js +105 -0
  227. package/dist/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.js.map +1 -0
  228. package/dist/formatting/types.d.ts +7 -0
  229. package/dist/formatting/types.js +3 -0
  230. package/dist/formatting/types.js.map +1 -0
  231. package/dist/hover/BaseHoverProvider.d.ts +5 -0
  232. package/dist/hover/BaseHoverProvider.js +3 -0
  233. package/dist/hover/BaseHoverProvider.js.map +1 -0
  234. package/dist/hover/HoverProvider.d.ts +20 -0
  235. package/dist/hover/HoverProvider.js +55 -0
  236. package/dist/hover/HoverProvider.js.map +1 -0
  237. package/dist/hover/index.d.ts +1 -0
  238. package/dist/hover/index.js +6 -0
  239. package/dist/hover/index.js.map +1 -0
  240. package/dist/hover/providers/ContentForArgumentHoverProvider.d.ts +8 -0
  241. package/dist/hover/providers/ContentForArgumentHoverProvider.js +37 -0
  242. package/dist/hover/providers/ContentForArgumentHoverProvider.js.map +1 -0
  243. package/dist/hover/providers/ContentForTypeHoverProvider.d.ts +8 -0
  244. package/dist/hover/providers/ContentForTypeHoverProvider.js +32 -0
  245. package/dist/hover/providers/ContentForTypeHoverProvider.js.map +1 -0
  246. package/dist/hover/providers/HtmlAttributeHoverProvider.d.ts +6 -0
  247. package/dist/hover/providers/HtmlAttributeHoverProvider.js +37 -0
  248. package/dist/hover/providers/HtmlAttributeHoverProvider.js.map +1 -0
  249. package/dist/hover/providers/HtmlAttributeValueHoverProvider.d.ts +6 -0
  250. package/dist/hover/providers/HtmlAttributeValueHoverProvider.js +42 -0
  251. package/dist/hover/providers/HtmlAttributeValueHoverProvider.js.map +1 -0
  252. package/dist/hover/providers/HtmlTagHoverProvider.d.ts +6 -0
  253. package/dist/hover/providers/HtmlTagHoverProvider.js +37 -0
  254. package/dist/hover/providers/HtmlTagHoverProvider.js.map +1 -0
  255. package/dist/hover/providers/LiquidDocTagHoverProvider.d.ts +9 -0
  256. package/dist/hover/providers/LiquidDocTagHoverProvider.js +42 -0
  257. package/dist/hover/providers/LiquidDocTagHoverProvider.js.map +1 -0
  258. package/dist/hover/providers/LiquidFilterArgumentHoverProvider.d.ts +8 -0
  259. package/dist/hover/providers/LiquidFilterArgumentHoverProvider.js +36 -0
  260. package/dist/hover/providers/LiquidFilterArgumentHoverProvider.js.map +1 -0
  261. package/dist/hover/providers/LiquidFilterHoverProvider.d.ts +8 -0
  262. package/dist/hover/providers/LiquidFilterHoverProvider.js +29 -0
  263. package/dist/hover/providers/LiquidFilterHoverProvider.js.map +1 -0
  264. package/dist/hover/providers/LiquidObjectAttributeHoverProvider.d.ts +9 -0
  265. package/dist/hover/providers/LiquidObjectAttributeHoverProvider.js +113 -0
  266. package/dist/hover/providers/LiquidObjectAttributeHoverProvider.js.map +1 -0
  267. package/dist/hover/providers/LiquidObjectHoverProvider.d.ts +9 -0
  268. package/dist/hover/providers/LiquidObjectHoverProvider.js +72 -0
  269. package/dist/hover/providers/LiquidObjectHoverProvider.js.map +1 -0
  270. package/dist/hover/providers/LiquidTagHoverProvider.d.ts +8 -0
  271. package/dist/hover/providers/LiquidTagHoverProvider.js +31 -0
  272. package/dist/hover/providers/LiquidTagHoverProvider.js.map +1 -0
  273. package/dist/hover/providers/RenderPartialHoverProvider.d.ts +8 -0
  274. package/dist/hover/providers/RenderPartialHoverProvider.js +28 -0
  275. package/dist/hover/providers/RenderPartialHoverProvider.js.map +1 -0
  276. package/dist/hover/providers/RenderPartialParameterHoverProvider.d.ts +8 -0
  277. package/dist/hover/providers/RenderPartialParameterHoverProvider.js +33 -0
  278. package/dist/hover/providers/RenderPartialParameterHoverProvider.js.map +1 -0
  279. package/dist/hover/providers/TranslationHoverProvider.d.ts +13 -0
  280. package/dist/hover/providers/TranslationHoverProvider.js +45 -0
  281. package/dist/hover/providers/TranslationHoverProvider.js.map +1 -0
  282. package/dist/hover/providers/index.d.ts +11 -0
  283. package/dist/hover/providers/index.js +26 -0
  284. package/dist/hover/providers/index.js.map +1 -0
  285. package/dist/index.d.ts +8 -0
  286. package/dist/index.js +33 -0
  287. package/dist/index.js.map +1 -0
  288. package/dist/internal-types.d.ts +1 -0
  289. package/dist/internal-types.js +3 -0
  290. package/dist/internal-types.js.map +1 -0
  291. package/dist/json/JSONContributions.d.ts +25 -0
  292. package/dist/json/JSONContributions.js +99 -0
  293. package/dist/json/JSONContributions.js.map +1 -0
  294. package/dist/json/JSONLanguageService.d.ts +27 -0
  295. package/dist/json/JSONLanguageService.js +171 -0
  296. package/dist/json/JSONLanguageService.js.map +1 -0
  297. package/dist/json/RequestContext.d.ts +22 -0
  298. package/dist/json/RequestContext.js +14 -0
  299. package/dist/json/RequestContext.js.map +1 -0
  300. package/dist/json/completions/JSONCompletionProvider.d.ts +30 -0
  301. package/dist/json/completions/JSONCompletionProvider.js +3 -0
  302. package/dist/json/completions/JSONCompletionProvider.js.map +1 -0
  303. package/dist/json/completions/providers/BlockSettingsPropertyCompletionProvider.d.ts +44 -0
  304. package/dist/json/completions/providers/BlockSettingsPropertyCompletionProvider.js +98 -0
  305. package/dist/json/completions/providers/BlockSettingsPropertyCompletionProvider.js.map +1 -0
  306. package/dist/json/completions/providers/BlockTypeCompletionProvider.d.ts +35 -0
  307. package/dist/json/completions/providers/BlockTypeCompletionProvider.js +97 -0
  308. package/dist/json/completions/providers/BlockTypeCompletionProvider.js.map +1 -0
  309. package/dist/json/completions/providers/ReferencedBlockTypeCompletionProvider.d.ts +34 -0
  310. package/dist/json/completions/providers/ReferencedBlockTypeCompletionProvider.js +95 -0
  311. package/dist/json/completions/providers/ReferencedBlockTypeCompletionProvider.js.map +1 -0
  312. package/dist/json/completions/providers/SchemaTranslationCompletionProvider.d.ts +9 -0
  313. package/dist/json/completions/providers/SchemaTranslationCompletionProvider.js +46 -0
  314. package/dist/json/completions/providers/SchemaTranslationCompletionProvider.js.map +1 -0
  315. package/dist/json/completions/providers/SettingsPropertyCompletionProvider.d.ts +33 -0
  316. package/dist/json/completions/providers/SettingsPropertyCompletionProvider.js +64 -0
  317. package/dist/json/completions/providers/SettingsPropertyCompletionProvider.js.map +1 -0
  318. package/dist/json/documentLinks/DocumentLinksProvider.d.ts +6 -0
  319. package/dist/json/documentLinks/DocumentLinksProvider.js +45 -0
  320. package/dist/json/documentLinks/DocumentLinksProvider.js.map +1 -0
  321. package/dist/json/hover/JSONHoverProvider.d.ts +7 -0
  322. package/dist/json/hover/JSONHoverProvider.js +3 -0
  323. package/dist/json/hover/JSONHoverProvider.js.map +1 -0
  324. package/dist/json/hover/providers/BlockSettingsHoverProvider.d.ts +12 -0
  325. package/dist/json/hover/providers/BlockSettingsHoverProvider.js +75 -0
  326. package/dist/json/hover/providers/BlockSettingsHoverProvider.js.map +1 -0
  327. package/dist/json/hover/providers/SchemaTranslationHoverProvider.d.ts +10 -0
  328. package/dist/json/hover/providers/SchemaTranslationHoverProvider.js +36 -0
  329. package/dist/json/hover/providers/SchemaTranslationHoverProvider.js.map +1 -0
  330. package/dist/json/hover/providers/SettingsHoverProvider.d.ts +10 -0
  331. package/dist/json/hover/providers/SettingsHoverProvider.js +62 -0
  332. package/dist/json/hover/providers/SettingsHoverProvider.js.map +1 -0
  333. package/dist/json/hover/providers/TranslationPathHoverProvider.d.ts +9 -0
  334. package/dist/json/hover/providers/TranslationPathHoverProvider.js +65 -0
  335. package/dist/json/hover/providers/TranslationPathHoverProvider.js.map +1 -0
  336. package/dist/json/schemaSettings.d.ts +4 -0
  337. package/dist/json/schemaSettings.js +45 -0
  338. package/dist/json/schemaSettings.js.map +1 -0
  339. package/dist/json/test/test-helpers.d.ts +8 -0
  340. package/dist/json/test/test-helpers.js +42 -0
  341. package/dist/json/test/test-helpers.js.map +1 -0
  342. package/dist/json/utils.d.ts +6 -0
  343. package/dist/json/utils.js +31 -0
  344. package/dist/json/utils.js.map +1 -0
  345. package/dist/linkedEditingRanges/BaseLinkedEditingRangesProvider.d.ts +5 -0
  346. package/dist/linkedEditingRanges/BaseLinkedEditingRangesProvider.js +3 -0
  347. package/dist/linkedEditingRanges/BaseLinkedEditingRangesProvider.js.map +1 -0
  348. package/dist/linkedEditingRanges/LinkedEditingRangesProvider.d.ts +8 -0
  349. package/dist/linkedEditingRanges/LinkedEditingRangesProvider.js +31 -0
  350. package/dist/linkedEditingRanges/LinkedEditingRangesProvider.js.map +1 -0
  351. package/dist/linkedEditingRanges/index.d.ts +1 -0
  352. package/dist/linkedEditingRanges/index.js +6 -0
  353. package/dist/linkedEditingRanges/index.js.map +1 -0
  354. package/dist/linkedEditingRanges/providers/EmptyHtmlTagLinkedRangesProvider.d.ts +9 -0
  355. package/dist/linkedEditingRanges/providers/EmptyHtmlTagLinkedRangesProvider.js +37 -0
  356. package/dist/linkedEditingRanges/providers/EmptyHtmlTagLinkedRangesProvider.js.map +1 -0
  357. package/dist/linkedEditingRanges/providers/HtmlTagNameLinkedRangesProvider.d.ts +12 -0
  358. package/dist/linkedEditingRanges/providers/HtmlTagNameLinkedRangesProvider.js +26 -0
  359. package/dist/linkedEditingRanges/providers/HtmlTagNameLinkedRangesProvider.js.map +1 -0
  360. package/dist/linkedEditingRanges/providers/index.d.ts +2 -0
  361. package/dist/linkedEditingRanges/providers/index.js +8 -0
  362. package/dist/linkedEditingRanges/providers/index.js.map +1 -0
  363. package/dist/linkedEditingRanges/wordPattern.d.ts +1 -0
  364. package/dist/linkedEditingRanges/wordPattern.js +7 -0
  365. package/dist/linkedEditingRanges/wordPattern.js.map +1 -0
  366. package/dist/plugins/css.d.ts +3 -0
  367. package/dist/plugins/css.js +12 -0
  368. package/dist/plugins/css.js.map +1 -0
  369. package/dist/progress.d.ts +42 -0
  370. package/dist/progress.js +74 -0
  371. package/dist/progress.js.map +1 -0
  372. package/dist/rename/BaseRenameProvider.d.ts +6 -0
  373. package/dist/rename/BaseRenameProvider.js +3 -0
  374. package/dist/rename/BaseRenameProvider.js.map +1 -0
  375. package/dist/rename/RenameProvider.d.ts +21 -0
  376. package/dist/rename/RenameProvider.js +58 -0
  377. package/dist/rename/RenameProvider.js.map +1 -0
  378. package/dist/rename/providers/HtmlTagNameRenameProvider.d.ts +10 -0
  379. package/dist/rename/providers/HtmlTagNameRenameProvider.js +39 -0
  380. package/dist/rename/providers/HtmlTagNameRenameProvider.js.map +1 -0
  381. package/dist/rename/providers/LiquidVariableRenameProvider.d.ts +16 -0
  382. package/dist/rename/providers/LiquidVariableRenameProvider.js +194 -0
  383. package/dist/rename/providers/LiquidVariableRenameProvider.js.map +1 -0
  384. package/dist/renamed/BaseRenameHandler.d.ts +4 -0
  385. package/dist/renamed/BaseRenameHandler.js +3 -0
  386. package/dist/renamed/BaseRenameHandler.js.map +1 -0
  387. package/dist/renamed/RenameHandler.d.ts +18 -0
  388. package/dist/renamed/RenameHandler.js +37 -0
  389. package/dist/renamed/RenameHandler.js.map +1 -0
  390. package/dist/renamed/handlers/AssetRenameHandler.d.ts +26 -0
  391. package/dist/renamed/handlers/AssetRenameHandler.js +99 -0
  392. package/dist/renamed/handlers/AssetRenameHandler.js.map +1 -0
  393. package/dist/renamed/handlers/BlockRenameHandler.d.ts +41 -0
  394. package/dist/renamed/handlers/BlockRenameHandler.js +304 -0
  395. package/dist/renamed/handlers/BlockRenameHandler.js.map +1 -0
  396. package/dist/renamed/handlers/PartialRenameHandler.d.ts +26 -0
  397. package/dist/renamed/handlers/PartialRenameHandler.js +99 -0
  398. package/dist/renamed/handlers/PartialRenameHandler.js.map +1 -0
  399. package/dist/renamed/handlers/SectionRenameHandler.d.ts +25 -0
  400. package/dist/renamed/handlers/SectionRenameHandler.js +176 -0
  401. package/dist/renamed/handlers/SectionRenameHandler.js.map +1 -0
  402. package/dist/renamed/handlers/utils.d.ts +3 -0
  403. package/dist/renamed/handlers/utils.js +20 -0
  404. package/dist/renamed/handlers/utils.js.map +1 -0
  405. package/dist/server/CachedFileSystem.d.ts +12 -0
  406. package/dist/server/CachedFileSystem.js +29 -0
  407. package/dist/server/CachedFileSystem.js.map +1 -0
  408. package/dist/server/Configuration.d.ts +25 -0
  409. package/dist/server/Configuration.js +77 -0
  410. package/dist/server/Configuration.js.map +1 -0
  411. package/dist/server/ThemeGraphManager.d.ts +35 -0
  412. package/dist/server/ThemeGraphManager.js +200 -0
  413. package/dist/server/ThemeGraphManager.js.map +1 -0
  414. package/dist/server/index.d.ts +1 -0
  415. package/dist/server/index.js +6 -0
  416. package/dist/server/index.js.map +1 -0
  417. package/dist/server/safe.d.ts +19 -0
  418. package/dist/server/safe.js +33 -0
  419. package/dist/server/safe.js.map +1 -0
  420. package/dist/server/startServer.d.ts +13 -0
  421. package/dist/server/startServer.js +598 -0
  422. package/dist/server/startServer.js.map +1 -0
  423. package/dist/settings/index.d.ts +29 -0
  424. package/dist/settings/index.js +11 -0
  425. package/dist/settings/index.js.map +1 -0
  426. package/dist/test/ApplyEditsAssertion.d.ts +14 -0
  427. package/dist/test/ApplyEditsAssertion.js +19 -0
  428. package/dist/test/ApplyEditsAssertion.js.map +1 -0
  429. package/dist/test/CompletionItemsAssertion.d.ts +25 -0
  430. package/dist/test/CompletionItemsAssertion.js +60 -0
  431. package/dist/test/CompletionItemsAssertion.js.map +1 -0
  432. package/dist/test/HoverAssertion.d.ts +16 -0
  433. package/dist/test/HoverAssertion.js +54 -0
  434. package/dist/test/HoverAssertion.js.map +1 -0
  435. package/dist/test/MockChecks.d.ts +2 -0
  436. package/dist/test/MockChecks.js +30 -0
  437. package/dist/test/MockChecks.js.map +1 -0
  438. package/dist/test/MockConnection.d.ts +44 -0
  439. package/dist/test/MockConnection.js +106 -0
  440. package/dist/test/MockConnection.js.map +1 -0
  441. package/dist/test/test-setup.d.ts +1 -0
  442. package/dist/test/test-setup.js +8 -0
  443. package/dist/test/test-setup.js.map +1 -0
  444. package/dist/translations.d.ts +19 -0
  445. package/dist/translations.js +73 -0
  446. package/dist/translations.js.map +1 -0
  447. package/dist/tsconfig.tsbuildinfo +1 -0
  448. package/dist/types.d.ts +149 -0
  449. package/dist/types.js +63 -0
  450. package/dist/types.js.map +1 -0
  451. package/dist/utils/array.d.ts +1 -0
  452. package/dist/utils/array.js +11 -0
  453. package/dist/utils/array.js.map +1 -0
  454. package/dist/utils/debounce.d.ts +37 -0
  455. package/dist/utils/debounce.js +44 -0
  456. package/dist/utils/debounce.js.map +1 -0
  457. package/dist/utils/htmlTagNames.d.ts +5 -0
  458. package/dist/utils/htmlTagNames.js +42 -0
  459. package/dist/utils/htmlTagNames.js.map +1 -0
  460. package/dist/utils/index.d.ts +5 -0
  461. package/dist/utils/index.js +26 -0
  462. package/dist/utils/index.js.map +1 -0
  463. package/dist/utils/isCovered.d.ts +4 -0
  464. package/dist/utils/isCovered.js +7 -0
  465. package/dist/utils/isCovered.js.map +1 -0
  466. package/dist/utils/liquidDoc.d.ts +22 -0
  467. package/dist/utils/liquidDoc.js +78 -0
  468. package/dist/utils/liquidDoc.js.map +1 -0
  469. package/dist/utils/node.d.ts +24 -0
  470. package/dist/utils/node.js +52 -0
  471. package/dist/utils/node.js.map +1 -0
  472. package/dist/utils/uri.d.ts +12 -0
  473. package/dist/utils/uri.js +30 -0
  474. package/dist/utils/uri.js.map +1 -0
  475. package/dist/version.d.ts +1 -0
  476. package/dist/version.js +9 -0
  477. package/dist/version.js.map +1 -0
  478. package/package.json +40 -0
  479. package/src/ClientCapabilities.ts +63 -0
  480. package/src/PropertyShapeInference.ts +394 -0
  481. package/src/TypeSystem.spec.ts +1150 -0
  482. package/src/TypeSystem.ts +1948 -0
  483. package/src/VariableShapeExtractor.ts +380 -0
  484. package/src/codeActions/BaseCodeActionsProvider.ts +18 -0
  485. package/src/codeActions/CodeActionsProvider.ts +28 -0
  486. package/src/codeActions/index.ts +1 -0
  487. package/src/codeActions/providers/FixAllProvider.spec.ts +115 -0
  488. package/src/codeActions/providers/FixAllProvider.ts +60 -0
  489. package/src/codeActions/providers/FixProvider.spec.ts +330 -0
  490. package/src/codeActions/providers/FixProvider.ts +105 -0
  491. package/src/codeActions/providers/SuggestionProvider.spec.ts +143 -0
  492. package/src/codeActions/providers/SuggestionProvider.ts +75 -0
  493. package/src/codeActions/providers/index.ts +3 -0
  494. package/src/codeActions/providers/utils.ts +47 -0
  495. package/src/commands/BaseExecuteCommandProvider.ts +15 -0
  496. package/src/commands/ExecuteCommandProvider.ts +59 -0
  497. package/src/commands/index.ts +2 -0
  498. package/src/commands/providers/ApplyFixesProvider.spec.ts +133 -0
  499. package/src/commands/providers/ApplyFixesProvider.ts +86 -0
  500. package/src/commands/providers/ApplySuggestionProvider.spec.ts +135 -0
  501. package/src/commands/providers/ApplySuggestionProvider.ts +105 -0
  502. package/src/commands/providers/RunChecksProvider.spec.ts +55 -0
  503. package/src/commands/providers/RunChecksProvider.ts +36 -0
  504. package/src/commands/providers/index.ts +3 -0
  505. package/src/completions/CompletionsProvider.ts +128 -0
  506. package/src/completions/index.ts +1 -0
  507. package/src/completions/params/LiquidCompletionParams.spec.ts +319 -0
  508. package/src/completions/params/LiquidCompletionParams.ts +538 -0
  509. package/src/completions/params/fix.spec.ts +159 -0
  510. package/src/completions/params/fix.ts +269 -0
  511. package/src/completions/params/index.ts +2 -0
  512. package/src/completions/params/testcases.txt +104 -0
  513. package/src/completions/providers/ContentForBlockTypeCompletionProvider.spec.ts +41 -0
  514. package/src/completions/providers/ContentForBlockTypeCompletionProvider.ts +42 -0
  515. package/src/completions/providers/ContentForCompletionProvider.spec.ts +96 -0
  516. package/src/completions/providers/ContentForCompletionProvider.ts +113 -0
  517. package/src/completions/providers/ContentForParameterCompletionProvider.spec.ts +362 -0
  518. package/src/completions/providers/ContentForParameterCompletionProvider.ts +187 -0
  519. package/src/completions/providers/FilterCompletionProvider.spec.ts +377 -0
  520. package/src/completions/providers/FilterCompletionProvider.ts +225 -0
  521. package/src/completions/providers/FilterNamedParameterCompletionProvider.spec.ts +239 -0
  522. package/src/completions/providers/FilterNamedParameterCompletionProvider.ts +121 -0
  523. package/src/completions/providers/HtmlAttributeCompletionProvider.spec.ts +150 -0
  524. package/src/completions/providers/HtmlAttributeCompletionProvider.ts +117 -0
  525. package/src/completions/providers/HtmlAttributeValueCompletionProvider.spec.ts +38 -0
  526. package/src/completions/providers/HtmlAttributeValueCompletionProvider.ts +65 -0
  527. package/src/completions/providers/HtmlTagCompletionProvider.spec.ts +57 -0
  528. package/src/completions/providers/HtmlTagCompletionProvider.ts +119 -0
  529. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.spec.ts +79 -0
  530. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.ts +65 -0
  531. package/src/completions/providers/LiquidDocTagCompletionProvider.spec.ts +144 -0
  532. package/src/completions/providers/LiquidDocTagCompletionProvider.ts +74 -0
  533. package/src/completions/providers/LiquidTagsCompletionProvider.spec.ts +377 -0
  534. package/src/completions/providers/LiquidTagsCompletionProvider.ts +459 -0
  535. package/src/completions/providers/ObjectAttributeCompletionProvider.spec.ts +524 -0
  536. package/src/completions/providers/ObjectAttributeCompletionProvider.ts +95 -0
  537. package/src/completions/providers/ObjectCompletionProvider.spec.ts +232 -0
  538. package/src/completions/providers/ObjectCompletionProvider.ts +44 -0
  539. package/src/completions/providers/PartialCompletionProvider.spec.ts +107 -0
  540. package/src/completions/providers/PartialCompletionProvider.ts +50 -0
  541. package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +91 -0
  542. package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +79 -0
  543. package/src/completions/providers/TranslationCompletionProvider.spec.ts +65 -0
  544. package/src/completions/providers/TranslationCompletionProvider.ts +103 -0
  545. package/src/completions/providers/common/CompletionItemProperties.ts +66 -0
  546. package/src/completions/providers/common/Provider.ts +6 -0
  547. package/src/completions/providers/common/index.ts +18 -0
  548. package/src/completions/providers/data/contentForParameterCompletionOptions.ts +9 -0
  549. package/src/completions/providers/index.ts +20 -0
  550. package/src/css/CSSLanguageService.spec.ts +161 -0
  551. package/src/css/CSSLanguageService.ts +113 -0
  552. package/src/css/test/test-helpers.ts +30 -0
  553. package/src/definitions/BaseDefinitionProvider.ts +10 -0
  554. package/src/definitions/DefinitionProvider.ts +48 -0
  555. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.spec.ts +96 -0
  556. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.ts +82 -0
  557. package/src/definitions/providers/TranslationStringDefinitionProvider.spec.ts +77 -0
  558. package/src/definitions/providers/TranslationStringDefinitionProvider.ts +72 -0
  559. package/src/diagnostics/DiagnosticsManager.spec.ts +79 -0
  560. package/src/diagnostics/DiagnosticsManager.ts +58 -0
  561. package/src/diagnostics/index.ts +2 -0
  562. package/src/diagnostics/offenseToDiagnostic.ts +80 -0
  563. package/src/diagnostics/runChecks.spec.ts +285 -0
  564. package/src/diagnostics/runChecks.ts +147 -0
  565. package/src/docset/HtmlDocset.ts +43 -0
  566. package/src/docset/MarkdownRenderer.spec.ts +46 -0
  567. package/src/docset/MarkdownRenderer.ts +179 -0
  568. package/src/docset/index.ts +2 -0
  569. package/src/documentHighlights/BaseDocumentHighlightsProvider.ts +10 -0
  570. package/src/documentHighlights/DocumentHighlightsProvider.ts +54 -0
  571. package/src/documentHighlights/index.ts +1 -0
  572. package/src/documentHighlights/providers/HtmlTagNameDocumentHighlightsProvider.spec.ts +94 -0
  573. package/src/documentHighlights/providers/HtmlTagNameDocumentHighlightsProvider.ts +22 -0
  574. package/src/documentHighlights/providers/LiquidBlockTagDocumentHighlightsProvider.spec.ts +188 -0
  575. package/src/documentHighlights/providers/LiquidBlockTagDocumentHighlightsProvider.ts +73 -0
  576. package/src/documentHighlights/providers/index.ts +2 -0
  577. package/src/documentLinks/DocumentLinksProvider.spec.ts +66 -0
  578. package/src/documentLinks/DocumentLinksProvider.ts +123 -0
  579. package/src/documentLinks/index.ts +1 -0
  580. package/src/documents/DocumentManager.spec.ts +276 -0
  581. package/src/documents/DocumentManager.ts +232 -0
  582. package/src/documents/index.ts +2 -0
  583. package/src/documents/types.ts +55 -0
  584. package/src/formatting/OnTypeFormattingProvider.spec.ts +74 -0
  585. package/src/formatting/OnTypeFormattingProvider.ts +26 -0
  586. package/src/formatting/index.ts +1 -0
  587. package/src/formatting/providers/BracketsAutoclosingOnTypeFormattingProvider.spec.ts +88 -0
  588. package/src/formatting/providers/BracketsAutoclosingOnTypeFormattingProvider.ts +114 -0
  589. package/src/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.spec.ts +183 -0
  590. package/src/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.ts +127 -0
  591. package/src/formatting/types.ts +12 -0
  592. package/src/hover/BaseHoverProvider.ts +10 -0
  593. package/src/hover/HoverProvider.ts +86 -0
  594. package/src/hover/index.ts +1 -0
  595. package/src/hover/providers/ContentForArgumentHoverProvider.spec.ts +76 -0
  596. package/src/hover/providers/ContentForArgumentHoverProvider.ts +56 -0
  597. package/src/hover/providers/ContentForTypeHoverProvider.spec.ts +91 -0
  598. package/src/hover/providers/ContentForTypeHoverProvider.ts +42 -0
  599. package/src/hover/providers/HtmlAttributeHoverProvider.spec.ts +50 -0
  600. package/src/hover/providers/HtmlAttributeHoverProvider.ts +48 -0
  601. package/src/hover/providers/HtmlAttributeValueHoverProvider.spec.ts +38 -0
  602. package/src/hover/providers/HtmlAttributeValueHoverProvider.ts +52 -0
  603. package/src/hover/providers/HtmlTagHoverProvider.spec.ts +39 -0
  604. package/src/hover/providers/HtmlTagHoverProvider.ts +42 -0
  605. package/src/hover/providers/LiquidDocTagHoverProvider.spec.ts +64 -0
  606. package/src/hover/providers/LiquidDocTagHoverProvider.ts +58 -0
  607. package/src/hover/providers/LiquidFilterArgumentHoverProvider.spec.ts +57 -0
  608. package/src/hover/providers/LiquidFilterArgumentHoverProvider.ts +42 -0
  609. package/src/hover/providers/LiquidFilterHoverProvider.spec.ts +50 -0
  610. package/src/hover/providers/LiquidFilterHoverProvider.ts +29 -0
  611. package/src/hover/providers/LiquidObjectAttributeHoverProvider.spec.ts +238 -0
  612. package/src/hover/providers/LiquidObjectAttributeHoverProvider.ts +156 -0
  613. package/src/hover/providers/LiquidObjectHoverProvider.spec.ts +278 -0
  614. package/src/hover/providers/LiquidObjectHoverProvider.ts +95 -0
  615. package/src/hover/providers/LiquidTagHoverProvider.spec.ts +51 -0
  616. package/src/hover/providers/LiquidTagHoverProvider.ts +33 -0
  617. package/src/hover/providers/RenderPartialHoverProvider.spec.ts +85 -0
  618. package/src/hover/providers/RenderPartialHoverProvider.ts +38 -0
  619. package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +70 -0
  620. package/src/hover/providers/RenderPartialParameterHoverProvider.ts +47 -0
  621. package/src/hover/providers/TranslationHoverProvider.spec.ts +59 -0
  622. package/src/hover/providers/TranslationHoverProvider.ts +61 -0
  623. package/src/hover/providers/index.ts +11 -0
  624. package/src/index.spec.ts +8 -0
  625. package/src/index.ts +34 -0
  626. package/src/internal-types.ts +1 -0
  627. package/src/json/JSONContributions.ts +150 -0
  628. package/src/json/JSONLanguageService.spec.ts +424 -0
  629. package/src/json/JSONLanguageService.ts +239 -0
  630. package/src/json/RequestContext.ts +35 -0
  631. package/src/json/completions/JSONCompletionProvider.ts +33 -0
  632. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.spec.ts +163 -0
  633. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.ts +121 -0
  634. package/src/json/completions/providers/BlockTypeCompletionProvider.spec.ts +137 -0
  635. package/src/json/completions/providers/BlockTypeCompletionProvider.ts +108 -0
  636. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.spec.ts +132 -0
  637. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.ts +120 -0
  638. package/src/json/completions/providers/SchemaTranslationCompletionProvider.ts +51 -0
  639. package/src/json/completions/providers/SettingsPropertyCompletionProvider.spec.ts +211 -0
  640. package/src/json/completions/providers/SettingsPropertyCompletionProvider.ts +75 -0
  641. package/src/json/documentLinks/DocumentLinksProvider.spec.ts +223 -0
  642. package/src/json/documentLinks/DocumentLinksProvider.ts +61 -0
  643. package/src/json/hover/JSONHoverProvider.ts +8 -0
  644. package/src/json/hover/providers/BlockSettingsHoverProvider.spec.ts +292 -0
  645. package/src/json/hover/providers/BlockSettingsHoverProvider.ts +99 -0
  646. package/src/json/hover/providers/SchemaTranslationHoverProvider.ts +35 -0
  647. package/src/json/hover/providers/SettingsHoverProvider.spec.ts +139 -0
  648. package/src/json/hover/providers/SettingsHoverProvider.ts +79 -0
  649. package/src/json/hover/providers/TranslationPathHoverProvider.ts +71 -0
  650. package/src/json/schemaSettings.spec.ts +103 -0
  651. package/src/json/schemaSettings.ts +53 -0
  652. package/src/json/test/test-helpers.ts +68 -0
  653. package/src/json/utils.ts +30 -0
  654. package/src/linkedEditingRanges/BaseLinkedEditingRangesProvider.ts +10 -0
  655. package/src/linkedEditingRanges/LinkedEditingRangesProvider.ts +40 -0
  656. package/src/linkedEditingRanges/index.ts +1 -0
  657. package/src/linkedEditingRanges/providers/EmptyHtmlTagLinkedRangesProvider.spec.ts +74 -0
  658. package/src/linkedEditingRanges/providers/EmptyHtmlTagLinkedRangesProvider.ts +47 -0
  659. package/src/linkedEditingRanges/providers/HtmlTagNameLinkedRangesProvider.spec.ts +102 -0
  660. package/src/linkedEditingRanges/providers/HtmlTagNameLinkedRangesProvider.ts +28 -0
  661. package/src/linkedEditingRanges/providers/index.ts +2 -0
  662. package/src/linkedEditingRanges/wordPattern.ts +3 -0
  663. package/src/plugins/css.ts +12 -0
  664. package/src/progress.ts +83 -0
  665. package/src/rename/BaseRenameProvider.ts +21 -0
  666. package/src/rename/RenameProvider.ts +91 -0
  667. package/src/rename/providers/HtmlTagNameRenameProvider.spec.ts +84 -0
  668. package/src/rename/providers/HtmlTagNameRenameProvider.ts +59 -0
  669. package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +511 -0
  670. package/src/rename/providers/LiquidVariableRenameProvider.ts +300 -0
  671. package/src/renamed/BaseRenameHandler.ts +5 -0
  672. package/src/renamed/RenameHandler.ts +45 -0
  673. package/src/renamed/handlers/AssetRenameHandler.spec.ts +217 -0
  674. package/src/renamed/handlers/AssetRenameHandler.ts +108 -0
  675. package/src/renamed/handlers/BlockRenameHandler.spec.ts +399 -0
  676. package/src/renamed/handlers/BlockRenameHandler.ts +402 -0
  677. package/src/renamed/handlers/PartialRenameHandler.spec.ts +153 -0
  678. package/src/renamed/handlers/PartialRenameHandler.ts +110 -0
  679. package/src/renamed/handlers/SectionRenameHandler.spec.ts +321 -0
  680. package/src/renamed/handlers/SectionRenameHandler.ts +224 -0
  681. package/src/renamed/handlers/utils.ts +22 -0
  682. package/src/server/CachedFileSystem.ts +39 -0
  683. package/src/server/Configuration.ts +89 -0
  684. package/src/server/ThemeGraphManager.ts +265 -0
  685. package/src/server/index.ts +1 -0
  686. package/src/server/safe.ts +30 -0
  687. package/src/server/startServer.spec.ts +423 -0
  688. package/src/server/startServer.ts +771 -0
  689. package/src/settings/index.ts +50 -0
  690. package/src/test/ApplyEditsAssertion.spec.ts +57 -0
  691. package/src/test/ApplyEditsAssertion.ts +34 -0
  692. package/src/test/CompletionItemsAssertion.spec.ts +48 -0
  693. package/src/test/CompletionItemsAssertion.ts +99 -0
  694. package/src/test/HoverAssertion.ts +84 -0
  695. package/src/test/MockChecks.ts +32 -0
  696. package/src/test/MockConnection.ts +158 -0
  697. package/src/test/test-setup.ts +6 -0
  698. package/src/translations.ts +83 -0
  699. package/src/types.ts +173 -0
  700. package/src/utils/array.ts +6 -0
  701. package/src/utils/debounce.ts +60 -0
  702. package/src/utils/htmlTagNames.ts +61 -0
  703. package/src/utils/index.ts +12 -0
  704. package/src/utils/isCovered.ts +3 -0
  705. package/src/utils/liquidDoc.spec.ts +167 -0
  706. package/src/utils/liquidDoc.ts +102 -0
  707. package/src/utils/node.ts +69 -0
  708. package/src/utils/uri.ts +22 -0
  709. package/src/version.ts +3 -0
  710. package/tsconfig.build.json +10 -0
  711. package/tsconfig.json +24 -0
@@ -0,0 +1,1150 @@
1
+ import {
2
+ AssignMarkup,
3
+ LiquidVariable,
4
+ LiquidVariableOutput,
5
+ NamedTags,
6
+ NodeTypes,
7
+ toLiquidHtmlAST,
8
+ } from '@platformos/liquid-html-parser';
9
+ import {
10
+ MetafieldDefinitionMap,
11
+ path as pathUtils,
12
+ BasicParamTypes,
13
+ ObjectEntry,
14
+ } from '@platformos/platformos-check-common';
15
+ import { assert, beforeEach, describe, expect, it, vi } from 'vitest';
16
+ import { URI } from 'vscode-uri';
17
+ import { SettingsSchemaJSONFile } from './settings';
18
+ import { ArrayType, ShapeType, TypeSystem, UnionType } from './TypeSystem';
19
+ import { isLiquidVariableOutput, isNamedLiquidTag } from './utils';
20
+
21
+ describe('Module: TypeSystem', () => {
22
+ let typeSystem: TypeSystem;
23
+ let settingsProvider: any;
24
+ const literalContexts = [
25
+ { value: `10`, type: 'number' },
26
+ { value: `'string'`, type: 'string' },
27
+ { value: `true`, type: 'boolean' },
28
+ // { value: `null`, type: 'untyped' },
29
+ ];
30
+
31
+ beforeEach(() => {
32
+ const _objects: ObjectEntry[] = [
33
+ {
34
+ name: 'all_products',
35
+ return_type: [{ type: 'array', array_value: 'product' }],
36
+ },
37
+ {
38
+ name: 'product',
39
+ access: {
40
+ global: true,
41
+ parents: [],
42
+ template: [],
43
+ },
44
+ return_type: [],
45
+ properties: [
46
+ {
47
+ name: 'featured_image',
48
+ description: 'ze best image for ze product',
49
+ return_type: [{ type: 'image', name: '' }],
50
+ },
51
+ {
52
+ name: 'images',
53
+ description: 'all images for ze product',
54
+ return_type: [{ type: 'array', array_value: 'image' }],
55
+ },
56
+ {
57
+ name: 'title',
58
+ description: 'the title of the product',
59
+ return_type: [{ type: 'string', name: '' }],
60
+ },
61
+ {
62
+ name: 'metafields',
63
+ return_type: [{ type: 'untyped', name: '' }],
64
+ },
65
+ ],
66
+ },
67
+ {
68
+ name: 'metafield',
69
+ properties: [
70
+ {
71
+ name: 'type',
72
+ description: 'the type of the metafield',
73
+ return_type: [{ type: 'string', name: '' }],
74
+ },
75
+ {
76
+ name: 'value',
77
+ description: 'the value of the metafield',
78
+ return_type: [{ type: 'untyped', name: '' }],
79
+ },
80
+ ],
81
+ },
82
+ {
83
+ name: 'settings',
84
+ return_type: [],
85
+ properties: [], // these should be populated dynamically
86
+ },
87
+ {
88
+ name: 'predictive_search',
89
+ access: { global: false, parents: [], template: [] },
90
+ return_type: [],
91
+ },
92
+ {
93
+ name: 'comment',
94
+ access: { global: false, parents: [], template: [] },
95
+ return_type: [],
96
+ },
97
+ {
98
+ name: 'recommendations',
99
+ access: { global: false, parents: [], template: [] },
100
+ return_type: [],
101
+ },
102
+ {
103
+ name: 'app',
104
+ access: { global: false, parents: [], template: [] },
105
+ return_type: [],
106
+ },
107
+ {
108
+ name: 'section',
109
+ access: { global: false, parents: [], template: [] },
110
+ return_type: [],
111
+ properties: [
112
+ {
113
+ name: 'settings',
114
+ return_type: [{ type: 'untyped', name: '' }],
115
+ },
116
+ ],
117
+ },
118
+ {
119
+ name: 'block',
120
+ access: { global: false, parents: [], template: [] },
121
+ return_type: [],
122
+ properties: [
123
+ {
124
+ name: 'settings',
125
+ return_type: [{ type: 'untyped', name: '' }],
126
+ },
127
+ ],
128
+ },
129
+ {
130
+ name: 'locale',
131
+ access: { global: false, parents: [], template: [] },
132
+ return_type: [],
133
+ },
134
+ ];
135
+ settingsProvider = vi.fn().mockResolvedValue([]);
136
+ typeSystem = new TypeSystem(
137
+ {
138
+ graphQL: async () => null,
139
+ tags: async () => [],
140
+ objects: async () => _objects,
141
+ liquidDrops: async () => _objects,
142
+ filters: async () => [
143
+ {
144
+ name: 'size',
145
+ return_type: [{ type: 'number', name: '' }],
146
+ },
147
+ ],
148
+ systemTranslations: async () => ({}),
149
+ },
150
+ settingsProvider,
151
+ async (_uri: string) => {
152
+ return {
153
+ article: [],
154
+ blog: [],
155
+ collection: [],
156
+ company: [],
157
+ company_location: [],
158
+ location: [],
159
+ market: [],
160
+ order: [
161
+ {
162
+ key: 'prods',
163
+ name: 'products',
164
+ namespace: 'related',
165
+ description: 'related products',
166
+ type: {
167
+ category: 'REFERENCE',
168
+ name: 'list.product_reference',
169
+ },
170
+ },
171
+ ],
172
+ page: [],
173
+ product: [
174
+ {
175
+ key: 'code',
176
+ name: 'code',
177
+ namespace: 'manufacturer',
178
+ description: 'the code provided by the manufacturer',
179
+ type: {
180
+ category: 'TEXT',
181
+ name: 'single_line_text_field',
182
+ },
183
+ },
184
+ {
185
+ key: 'id',
186
+ name: 'id',
187
+ namespace: 'manufacturer',
188
+ description: 'the id provided by the manufacturer',
189
+ type: {
190
+ category: 'INTEGER',
191
+ name: 'number_integer',
192
+ },
193
+ },
194
+ {
195
+ key: 'is_rare',
196
+ name: 'is_rare',
197
+ namespace: 'custom',
198
+ description: 'is this product rare?',
199
+ type: {
200
+ category: 'BOOLEAN',
201
+ name: 'boolean',
202
+ },
203
+ },
204
+ ],
205
+ variant: [],
206
+ shop: [],
207
+ } as MetafieldDefinitionMap;
208
+ },
209
+ );
210
+ });
211
+
212
+ it('should return the type of assign markup nodes (basic test)', async () => {
213
+ for (const { value, type } of literalContexts) {
214
+ const ast = toLiquidHtmlAST(`{% assign x = ${value} %}`);
215
+ const assignMarkup = (ast as any).children[0].markup as AssignMarkup;
216
+ const inferredType = await typeSystem.inferType(assignMarkup, ast, 'file:///file.liquid');
217
+ expect(inferredType, value).to.equal(type);
218
+ }
219
+ });
220
+
221
+ it('should return the type of other variables', async () => {
222
+ for (const { value, type } of literalContexts) {
223
+ const ast = toLiquidHtmlAST(`{% assign x = ${value} %}{% assign y = x %}`);
224
+ const yVariable = (ast as any).children[1].markup as AssignMarkup;
225
+ const inferredType = await typeSystem.inferType(yVariable, ast, 'file:///file.liquid');
226
+ expect(inferredType).to.equal(type);
227
+ }
228
+ });
229
+
230
+ it('should return the type of expressions', async () => {
231
+ for (const { value, type } of literalContexts) {
232
+ const ast = toLiquidHtmlAST(`{{ ${value} }}`);
233
+ const output = ast.children[0] as LiquidVariableOutput;
234
+ const variable = output.markup;
235
+ if (typeof variable === 'string') throw new Error('expecting real deal');
236
+ const expression = variable.expression;
237
+ const inferredType = await typeSystem.inferType(expression, ast, 'file:///file.liquid');
238
+ expect(inferredType, value).to.equal(type);
239
+ }
240
+ });
241
+
242
+ it('should return the type of array variables', async () => {
243
+ const ast = toLiquidHtmlAST(`{% assign x = all_products %}`);
244
+ const xVariable = (ast as any).children[0].markup as AssignMarkup;
245
+ const inferredType = await typeSystem.inferType(xVariable, ast, 'file:///file.liquid');
246
+ expect(inferredType).to.eql({ kind: 'array', valueType: 'product' });
247
+ });
248
+
249
+ it('should return the type of object properties', async () => {
250
+ const ast = toLiquidHtmlAST(`{% assign x = all_products[0].featured_image %}`);
251
+ const xVariable = (ast as any).children[0].markup as AssignMarkup;
252
+ const inferredType = await typeSystem.inferType(xVariable, ast, 'file:///file.liquid');
253
+ expect(inferredType).to.equal('image');
254
+ });
255
+
256
+ it('should return the type of filtered variables', async () => {
257
+ const ast = toLiquidHtmlAST(`{% assign x = product | size %}`);
258
+ const xVariable = (ast as any).children[0].markup as AssignMarkup;
259
+ const inferredType = await typeSystem.inferType(xVariable, ast, 'file:///file.liquid');
260
+ expect(inferredType).to.equal('number');
261
+ });
262
+
263
+ describe('when using string builtin methods', () => {
264
+ it('should return number for size', async () => {
265
+ const ast = toLiquidHtmlAST(`{{ product.title.size }}`);
266
+ const xVariable = (ast as any).children[0].markup as LiquidVariable;
267
+ const inferredType = await typeSystem.inferType(xVariable, ast, 'file:///file.liquid');
268
+ expect(inferredType).to.equal('number');
269
+ });
270
+
271
+ ['first', 'last'].forEach((method) => {
272
+ it(`should return string for ${method}`, async () => {
273
+ const ast = toLiquidHtmlAST(`{{ product.title.${method} }}`);
274
+ const xVariable = (ast as any).children[0].markup as LiquidVariable;
275
+ const inferredType = await typeSystem.inferType(xVariable, ast, 'file:///file.liquid');
276
+ expect(inferredType).to.equal('string');
277
+ });
278
+ });
279
+ });
280
+
281
+ describe('when using array builtin methods', () => {
282
+ it('should return number for size', async () => {
283
+ const ast = toLiquidHtmlAST(`{{ product.images.size }}`);
284
+ const xVariable = (ast as any).children[0].markup as LiquidVariable;
285
+ const inferredType = await typeSystem.inferType(xVariable, ast, 'file:///file.liquid');
286
+ expect(inferredType).to.equal('number');
287
+ });
288
+
289
+ ['first', 'last'].forEach((method) => {
290
+ it(`should return the value type of the array for ${method}`, async () => {
291
+ const ast = toLiquidHtmlAST(`{{ product.images.${method} }}`);
292
+ const xVariable = (ast as any).children[0].markup as LiquidVariable;
293
+ const inferredType = await typeSystem.inferType(xVariable, ast, 'file:///file.liquid');
294
+ expect(inferredType).to.equal('image');
295
+ });
296
+ });
297
+ });
298
+
299
+ describe('when using the default filter', () => {
300
+ it('should return the type of the default value literal', async () => {
301
+ const ast = toLiquidHtmlAST(`
302
+ {% assign x = x | default: 10 %}
303
+ `);
304
+ const xVariable = (ast as any).children[0].markup as AssignMarkup;
305
+ const inferredType = await typeSystem.inferType(xVariable, ast, 'file:///file.liquid');
306
+ expect(inferredType).to.equal('number');
307
+ });
308
+
309
+ it('should return the type of the default value lookup', async () => {
310
+ const ast = toLiquidHtmlAST(`
311
+ {% assign d = product.featured_image %}
312
+ {% assign x = unknown | default: d %}
313
+ `);
314
+ const xVariable = (ast as any).children[1].markup as AssignMarkup;
315
+ const inferredType = await typeSystem.inferType(xVariable, ast, 'file:///file.liquid');
316
+ expect(inferredType).to.equal('image');
317
+ });
318
+ });
319
+
320
+ it('should return the type of variables in for loop', async () => {
321
+ const ast = toLiquidHtmlAST(`{% for item in all_products %}{{ item }}{% endfor %}`);
322
+ const forLoop = ast.children[0];
323
+ assert(isNamedLiquidTag(forLoop, NamedTags.for) && forLoop.children?.length === 1);
324
+ const branch = forLoop.children[0];
325
+ assert(branch.type === NodeTypes.LiquidBranch);
326
+ const variableOutput = branch.children[0];
327
+ assert(isLiquidVariableOutput(variableOutput));
328
+ const variable = variableOutput.markup;
329
+
330
+ const inferredType = await typeSystem.inferType(variable, ast, 'file:///file.liquid');
331
+ expect(inferredType).to.equal('product');
332
+ });
333
+
334
+ it('should patch the properties of settings when a schema is available', async () => {
335
+ settingsProvider.mockResolvedValue([
336
+ {
337
+ name: 'category',
338
+ settings: [
339
+ {
340
+ id: 'slide',
341
+ label: 'Slide label',
342
+ type: 'checkbox',
343
+ },
344
+ {
345
+ id: 'my_font',
346
+ label: 'my font',
347
+ type: 'font_picker',
348
+ },
349
+ ],
350
+ },
351
+ ] as SettingsSchemaJSONFile);
352
+
353
+ const contexts = [
354
+ { id: 'slide', expectedType: 'boolean' },
355
+ { id: 'my_font', expectedType: 'font' },
356
+ ];
357
+ for (const { id, expectedType } of contexts) {
358
+ const ast = toLiquidHtmlAST(`{{ settings.${id} }}`);
359
+ const variableOutput = ast.children[0];
360
+ assert(isLiquidVariableOutput(variableOutput));
361
+ const inferredType = await typeSystem.inferType(
362
+ variableOutput.markup,
363
+ ast,
364
+ 'file:///file.liquid',
365
+ );
366
+ expect(inferredType).to.eql(expectedType);
367
+ }
368
+ });
369
+
370
+ it('should support section settings in section files', async () => {
371
+ const sourceCode = `
372
+ {{ section.settings.my_list }}
373
+ {% schema %}
374
+ {
375
+ "name": "section-settings-example",
376
+ "tag": "section",
377
+ "settings": [
378
+ {
379
+ "id": "my_list",
380
+ "label": "t:my-setting.label",
381
+ "type": "product_list"
382
+ }
383
+ ]
384
+ }
385
+ {% endschema %}
386
+ `;
387
+ const ast = toLiquidHtmlAST(sourceCode);
388
+ const variableOutput = ast.children[0];
389
+ assert(isLiquidVariableOutput(variableOutput));
390
+ const inferredType = await typeSystem.inferType(
391
+ variableOutput.markup,
392
+ ast,
393
+ 'file:///sections/my-section.liquid',
394
+ );
395
+ expect(inferredType).to.eql({ kind: 'array', valueType: 'product' } as ArrayType);
396
+ });
397
+
398
+ it('should support block settings in blocks files', async () => {
399
+ const sourceCode = `
400
+ {{ block.settings.my_list }}
401
+ {% schema %}
402
+ {
403
+ "name": "section-settings-example",
404
+ "tag": "section",
405
+ "settings": [
406
+ {
407
+ "id": "my_list",
408
+ "label": "t:my-setting.label",
409
+ "type": "product_list"
410
+ }
411
+ ]
412
+ }
413
+ {% endschema %}
414
+ `;
415
+ const ast = toLiquidHtmlAST(sourceCode);
416
+ const variableOutput = ast.children[0];
417
+ assert(isLiquidVariableOutput(variableOutput));
418
+ const inferredType = await typeSystem.inferType(
419
+ variableOutput.markup,
420
+ ast,
421
+ 'file:///blocks/my-section.liquid',
422
+ );
423
+ expect(inferredType).to.eql({ kind: 'array', valueType: 'product' } as ArrayType);
424
+ });
425
+
426
+ // TODO
427
+ it.skip('should support narrowing the type of blocks', async () => {
428
+ const sourceCode = `
429
+ {% for block in section.blocks %}
430
+ {% case block.type %}
431
+ {% when 'slide' %}
432
+ {{ block.settings.image }}
433
+ {% else %}
434
+ {% endcase }
435
+ {% if block.type == 'slide' %}
436
+ {{ block.settings.image }}
437
+ {% endif %}
438
+ {% endfor %}
439
+ {% schema %}
440
+ {
441
+ "name": "Slideshow",
442
+ "tag": "section",
443
+ "class": "slideshow",
444
+ "settings": [],
445
+ "blocks": [
446
+ {
447
+ "name": "Slide",
448
+ "type": "slide",
449
+ "settings": [
450
+ {
451
+ "type": "image_picker",
452
+ "id": "image",
453
+ "label": "Image"
454
+ }
455
+ ]
456
+ }
457
+ ]
458
+ }
459
+ {% endschema %}
460
+ `;
461
+ const ast = toLiquidHtmlAST(sourceCode);
462
+ });
463
+
464
+ it('should support path-contextual variable types', async () => {
465
+ let inferredType: string | ArrayType | ShapeType | UnionType;
466
+ const contexts: [string, string][] = [
467
+ ['section', 'sections/my-section.liquid'],
468
+ ['comment', 'sections/main-article.liquid'],
469
+ ['block', 'blocks/my-block.liquid'],
470
+ ['predictive_search', 'sections/predictive-search.liquid'],
471
+ ['recommendations', 'sections/recommendations.liquid'],
472
+ ['app', 'blocks/recommendations.liquid'],
473
+ ['app', 'app/views/partials/recommendations.liquid'],
474
+ ['locale', 'layout/checkout.liquid'],
475
+ ];
476
+ for (const [object, path] of contexts) {
477
+ const sourceCode = `{{ ${object} }}`;
478
+ const ast = toLiquidHtmlAST(sourceCode);
479
+ const variableOutput = ast.children[0];
480
+ assert(isLiquidVariableOutput(variableOutput));
481
+ inferredType = await typeSystem.inferType(
482
+ variableOutput.markup,
483
+ ast,
484
+ // This will be different on Windows ^^
485
+ pathUtils.normalize(URI.from({ scheme: 'file', path })),
486
+ );
487
+ expect(inferredType).to.eql(object);
488
+ inferredType = await typeSystem.inferType(
489
+ variableOutput.markup,
490
+ ast,
491
+ // This will be different on Windows ^^
492
+ pathUtils.normalize(URI.from({ scheme: 'file', path: 'file.liquid' })),
493
+ );
494
+ expect(inferredType).to.eql('unknown');
495
+ }
496
+ });
497
+
498
+ describe('LiquidDoc inferred type', () => {
499
+ const liquidDocParamTypeToTypeMap = {
500
+ [BasicParamTypes.String]: 'string',
501
+ [BasicParamTypes.Number]: 'number',
502
+ [BasicParamTypes.Boolean]: 'boolean',
503
+ [BasicParamTypes.Object]: 'untyped',
504
+ invalid: 'untyped',
505
+ };
506
+
507
+ Object.entries(liquidDocParamTypeToTypeMap).forEach(([docParamType, expectedType]) => {
508
+ it(`should support basic liquid doc params type: ${docParamType}`, async () => {
509
+ const sourceCode = `
510
+ {% doc %}
511
+ @param {${docParamType}} data - some data
512
+ {% enddoc %}
513
+ {{ data }}
514
+ `;
515
+ const ast = toLiquidHtmlAST(sourceCode);
516
+ const variableOutput = ast.children[1];
517
+ assert(isLiquidVariableOutput(variableOutput));
518
+ const inferredType = await typeSystem.inferType(
519
+ variableOutput.markup,
520
+ ast,
521
+ 'file:///snippets/example.liquid',
522
+ );
523
+ expect(inferredType).to.eql(expectedType);
524
+ });
525
+ });
526
+
527
+ it(`should support complex liquid doc params type: product`, async () => {
528
+ const sourceCode = `
529
+ {% doc %}
530
+ @param {product} data - some data
531
+ {% enddoc %}
532
+ {{ data }}
533
+ `;
534
+ const ast = toLiquidHtmlAST(sourceCode);
535
+ const variableOutput = ast.children[1];
536
+ assert(isLiquidVariableOutput(variableOutput));
537
+ const inferredType = await typeSystem.inferType(
538
+ variableOutput.markup,
539
+ ast,
540
+ 'file:///snippets/example.liquid',
541
+ );
542
+ expect(inferredType).to.eql('product');
543
+ });
544
+
545
+ it(`should support array liquid doc params type: product[]`, async () => {
546
+ const sourceCode = `
547
+ {% doc %}
548
+ @param {product[]} data - some data
549
+ {% enddoc %}
550
+ {{ data }}
551
+ `;
552
+ const ast = toLiquidHtmlAST(sourceCode);
553
+ const variableOutput = ast.children[1];
554
+ assert(isLiquidVariableOutput(variableOutput));
555
+ const inferredType = await typeSystem.inferType(
556
+ variableOutput.markup,
557
+ ast,
558
+ 'file:///snippets/example.liquid',
559
+ );
560
+ expect(inferredType).to.eql({
561
+ kind: 'array',
562
+ valueType: 'product',
563
+ });
564
+ });
565
+ });
566
+
567
+ describe('cross-file type inference (A -> B -> C)', () => {
568
+ it('should infer types through chain of function calls with GraphQL at the end', async () => {
569
+ // Setup: File C calls GraphQL, B calls C, A calls B
570
+ // The type from GraphQL should propagate: C -> B -> A
571
+
572
+ const { MockFileSystem } = await import('@platformos/platformos-check-common/src/test');
573
+ const { DocumentsLocator } = await import('@platformos/platformos-common');
574
+
575
+ const mockFiles = {
576
+ // File C: calls GraphQL and returns the result
577
+ 'app/lib/deep/get_user.liquid': `{% graphql result %}
578
+ query {
579
+ user {
580
+ id
581
+ name
582
+ email
583
+ }
584
+ }
585
+ {% endgraphql %}
586
+ {% return result %}`,
587
+ // File B: calls C and returns its result
588
+ 'app/lib/middle/get_data.liquid': `{% function user_data = 'deep/get_user' %}
589
+ {% return user_data %}`,
590
+ // GraphQL query file (for file-based GraphQL test)
591
+ 'app/graphql/get_products.graphql': `query {
592
+ products {
593
+ id
594
+ title
595
+ price
596
+ }
597
+ }`,
598
+ // File that uses file-based GraphQL
599
+ 'app/lib/products/fetch.liquid': `{% graphql result = 'get_products' %}
600
+ {% return result %}`,
601
+ // File that calls the file-based GraphQL function
602
+ 'app/lib/products/wrapper.liquid': `{% function products = 'products/fetch' %}
603
+ {% return products %}`,
604
+ };
605
+
606
+ const rootUri = 'file:///project';
607
+ const fs = new MockFileSystem(mockFiles, rootUri);
608
+ const documentsLocator = new DocumentsLocator(fs);
609
+
610
+ const crossFileTypeSystem = new TypeSystem(
611
+ {
612
+ graphQL: async () => null, // No schema for simple inference
613
+ tags: async () => [],
614
+ objects: async () => [],
615
+ liquidDrops: async () => [],
616
+ filters: async () => [],
617
+ systemTranslations: async () => ({}),
618
+ },
619
+ async () => [],
620
+ async () => ({
621
+ article: [],
622
+ blog: [],
623
+ collection: [],
624
+ company: [],
625
+ company_location: [],
626
+ location: [],
627
+ market: [],
628
+ order: [],
629
+ page: [],
630
+ product: [],
631
+ variant: [],
632
+ shop: [],
633
+ }),
634
+ fs,
635
+ documentsLocator,
636
+ async () => rootUri,
637
+ );
638
+
639
+ // Test 1: File A calls B (which calls C with GraphQL)
640
+ // Check that `data` has the correct shape type
641
+ const fileASource = `{% function data = 'middle/get_data' %}
642
+ {{ data }}`;
643
+ const fileAAst = toLiquidHtmlAST(fileASource);
644
+ const variableOutput = fileAAst.children[1];
645
+ assert(isLiquidVariableOutput(variableOutput));
646
+
647
+ const inferredType = await crossFileTypeSystem.inferType(
648
+ variableOutput.markup,
649
+ fileAAst,
650
+ `${rootUri}/app/views/pages/test.liquid`,
651
+ );
652
+
653
+ // The type of `data` should be a shape with the GraphQL structure
654
+ expect(inferredType).to.have.property('kind', 'shape');
655
+ if (typeof inferredType !== 'string' && inferredType.kind === 'shape') {
656
+ // data should have `user` property from GraphQL
657
+ const userShape = inferredType.shape.properties?.get('user');
658
+ expect(userShape).to.exist;
659
+ expect(userShape?.kind).to.equal('object');
660
+ expect(userShape?.properties?.get('name')?.kind).to.equal('primitive');
661
+ expect(userShape?.properties?.get('id')?.kind).to.equal('primitive');
662
+ expect(userShape?.properties?.get('email')?.kind).to.equal('primitive');
663
+ }
664
+
665
+ // Test 2: File-based GraphQL through chain
666
+ const fileBSource = `{% function products = 'products/wrapper' %}
667
+ {{ products }}`;
668
+ const fileBAst = toLiquidHtmlAST(fileBSource);
669
+ const variableOutputB = fileBAst.children[1];
670
+ assert(isLiquidVariableOutput(variableOutputB));
671
+
672
+ const inferredTypeB = await crossFileTypeSystem.inferType(
673
+ variableOutputB.markup,
674
+ fileBAst,
675
+ `${rootUri}/app/views/pages/test2.liquid`,
676
+ );
677
+
678
+ expect(inferredTypeB).to.have.property('kind', 'shape');
679
+ if (typeof inferredTypeB !== 'string' && inferredTypeB.kind === 'shape') {
680
+ const productsShape = inferredTypeB.shape.properties?.get('products');
681
+ expect(productsShape).to.exist;
682
+ expect(productsShape?.kind).to.equal('object');
683
+ expect(productsShape?.properties?.get('id')?.kind).to.equal('primitive');
684
+ expect(productsShape?.properties?.get('title')?.kind).to.equal('primitive');
685
+ expect(productsShape?.properties?.get('price')?.kind).to.equal('primitive');
686
+ }
687
+ });
688
+
689
+ it('should handle multiple return types creating a union', async () => {
690
+ const { MockFileSystem } = await import('@platformos/platformos-check-common/src/test');
691
+ const { DocumentsLocator } = await import('@platformos/platformos-common');
692
+
693
+ const mockFiles = {
694
+ // File with conditional returns
695
+ 'app/lib/conditional/get_value.liquid': `
696
+ {% if condition %}
697
+ {% return 'string_value' %}
698
+ {% else %}
699
+ {% return 42 %}
700
+ {% endif %}
701
+ `,
702
+ // Wrapper that calls the conditional function
703
+ 'app/lib/conditional/wrapper.liquid': `
704
+ {% function result = 'conditional/get_value' %}
705
+ {% return result %}
706
+ `,
707
+ };
708
+
709
+ const rootUri = 'file:///project';
710
+ const fs = new MockFileSystem(mockFiles, rootUri);
711
+ const documentsLocator = new DocumentsLocator(fs);
712
+
713
+ const unionTypeSystem = new TypeSystem(
714
+ {
715
+ graphQL: async () => null,
716
+ tags: async () => [],
717
+ objects: async () => [],
718
+ liquidDrops: async () => [],
719
+ filters: async () => [],
720
+ systemTranslations: async () => ({}),
721
+ },
722
+ async () => [],
723
+ async () => ({
724
+ article: [],
725
+ blog: [],
726
+ collection: [],
727
+ company: [],
728
+ company_location: [],
729
+ location: [],
730
+ market: [],
731
+ order: [],
732
+ page: [],
733
+ product: [],
734
+ variant: [],
735
+ shop: [],
736
+ }),
737
+ fs,
738
+ documentsLocator,
739
+ async () => rootUri,
740
+ );
741
+
742
+ // Call the wrapper that calls the conditional function
743
+ const sourceCode = `
744
+ {% function data = 'conditional/wrapper' %}
745
+ {{ data }}
746
+ `;
747
+ const ast = toLiquidHtmlAST(sourceCode);
748
+ const variableOutput = ast.children[1];
749
+ assert(isLiquidVariableOutput(variableOutput));
750
+
751
+ const inferredType = await unionTypeSystem.inferType(
752
+ variableOutput.markup,
753
+ ast,
754
+ `${rootUri}/app/views/pages/test.liquid`,
755
+ );
756
+
757
+ // Should be a union type of string and number
758
+ expect(inferredType).to.have.property('kind', 'union');
759
+ if (typeof inferredType !== 'string' && inferredType.kind === 'union') {
760
+ expect(inferredType.types).to.have.length(2);
761
+ expect(inferredType.types).to.include('string');
762
+ expect(inferredType.types).to.include('number');
763
+ }
764
+ });
765
+
766
+ it('should handle circular references gracefully', async () => {
767
+ const { MockFileSystem } = await import('@platformos/platformos-check-common/src/test');
768
+ const { DocumentsLocator } = await import('@platformos/platformos-common');
769
+
770
+ const mockFiles = {
771
+ // File A calls B
772
+ 'app/lib/circular/a.liquid': `
773
+ {% function result = 'circular/b' %}
774
+ {% return result %}
775
+ `,
776
+ // File B calls A (circular!)
777
+ 'app/lib/circular/b.liquid': `
778
+ {% function result = 'circular/a' %}
779
+ {% return result %}
780
+ `,
781
+ };
782
+
783
+ const rootUri = 'file:///project';
784
+ const fs = new MockFileSystem(mockFiles, rootUri);
785
+ const documentsLocator = new DocumentsLocator(fs);
786
+
787
+ const circularTypeSystem = new TypeSystem(
788
+ {
789
+ graphQL: async () => null,
790
+ tags: async () => [],
791
+ objects: async () => [],
792
+ liquidDrops: async () => [],
793
+ filters: async () => [],
794
+ systemTranslations: async () => ({}),
795
+ },
796
+ async () => [],
797
+ async () => ({
798
+ article: [],
799
+ blog: [],
800
+ collection: [],
801
+ company: [],
802
+ company_location: [],
803
+ location: [],
804
+ market: [],
805
+ order: [],
806
+ page: [],
807
+ product: [],
808
+ variant: [],
809
+ shop: [],
810
+ }),
811
+ fs,
812
+ documentsLocator,
813
+ async () => rootUri,
814
+ );
815
+
816
+ // This should not hang or throw - it should return 'untyped' for circular refs
817
+ const sourceCode = `
818
+ {% function data = 'circular/a' %}
819
+ {{ data }}
820
+ `;
821
+ const ast = toLiquidHtmlAST(sourceCode);
822
+ const variableOutput = ast.children[1];
823
+ assert(isLiquidVariableOutput(variableOutput));
824
+
825
+ const inferredType = await circularTypeSystem.inferType(
826
+ variableOutput.markup,
827
+ ast,
828
+ `${rootUri}/app/views/pages/test.liquid`,
829
+ );
830
+
831
+ // Should handle circular reference gracefully (returns 'untyped')
832
+ expect(inferredType).to.equal('untyped');
833
+ });
834
+
835
+ it('should infer types through 3-level chain: A -> B -> C with GraphQL', async () => {
836
+ const { MockFileSystem } = await import('@platformos/platformos-check-common/src/test');
837
+ const { DocumentsLocator } = await import('@platformos/platformos-common');
838
+
839
+ const mockFiles = {
840
+ // File C: the deepest level, calls GraphQL
841
+ 'app/lib/level3/fetch_data.liquid': `{% graphql result %}
842
+ query {
843
+ records {
844
+ results {
845
+ id
846
+ properties {
847
+ name
848
+ value
849
+ }
850
+ }
851
+ }
852
+ }
853
+ {% endgraphql %}
854
+ {% return result %}`,
855
+ // File B: middle level, calls C
856
+ 'app/lib/level2/process_data.liquid': `{% function raw_data = 'level3/fetch_data' %}
857
+ {% return raw_data %}`,
858
+ // File A: top level, calls B
859
+ 'app/lib/level1/get_records.liquid': `{% function processed = 'level2/process_data' %}
860
+ {% return processed %}`,
861
+ };
862
+
863
+ const rootUri = 'file:///project';
864
+ const fs = new MockFileSystem(mockFiles, rootUri);
865
+ const documentsLocator = new DocumentsLocator(fs);
866
+
867
+ const threeLevelTypeSystem = new TypeSystem(
868
+ {
869
+ graphQL: async () => null,
870
+ tags: async () => [],
871
+ objects: async () => [],
872
+ liquidDrops: async () => [],
873
+ filters: async () => [],
874
+ systemTranslations: async () => ({}),
875
+ },
876
+ async () => [],
877
+ async () => ({
878
+ article: [],
879
+ blog: [],
880
+ collection: [],
881
+ company: [],
882
+ company_location: [],
883
+ location: [],
884
+ market: [],
885
+ order: [],
886
+ page: [],
887
+ product: [],
888
+ variant: [],
889
+ shop: [],
890
+ }),
891
+ fs,
892
+ documentsLocator,
893
+ async () => rootUri,
894
+ );
895
+
896
+ // Consumer code calls file A (which calls B, which calls C)
897
+ // Test just `records` variable to verify the full shape is propagated
898
+ const sourceCode = `{% function records = 'level1/get_records' %}
899
+ {{ records }}`;
900
+ const ast = toLiquidHtmlAST(sourceCode);
901
+ const variableOutput = ast.children[1];
902
+ assert(isLiquidVariableOutput(variableOutput));
903
+
904
+ const inferredType = await threeLevelTypeSystem.inferType(
905
+ variableOutput.markup,
906
+ ast,
907
+ `${rootUri}/app/views/pages/consumer.liquid`,
908
+ );
909
+
910
+ // Verify the entire chain propagates the GraphQL shape correctly
911
+ expect(inferredType).to.have.property('kind', 'shape');
912
+ if (typeof inferredType !== 'string' && inferredType.kind === 'shape') {
913
+ // Check the nested structure: records.results should be an object
914
+ const recordsShape = inferredType.shape.properties?.get('records');
915
+ expect(recordsShape).to.exist;
916
+ expect(recordsShape?.kind).to.equal('object');
917
+
918
+ const resultsShape = recordsShape?.properties?.get('results');
919
+ expect(resultsShape).to.exist;
920
+ expect(resultsShape?.kind).to.equal('object');
921
+
922
+ // Check deeply nested properties
923
+ expect(resultsShape?.properties?.get('id')?.kind).to.equal('primitive');
924
+ const propertiesShape = resultsShape?.properties?.get('properties');
925
+ expect(propertiesShape).to.exist;
926
+ expect(propertiesShape?.kind).to.equal('object');
927
+ expect(propertiesShape?.properties?.get('name')?.kind).to.equal('primitive');
928
+ expect(propertiesShape?.properties?.get('value')?.kind).to.equal('primitive');
929
+ }
930
+ });
931
+
932
+ it('should merge hash_assign keys with existing function return shapes', async () => {
933
+ const { MockFileSystem } = await import('@platformos/platformos-check-common/src/test');
934
+ const { DocumentsLocator } = await import('@platformos/platformos-common');
935
+
936
+ const mockFiles = {
937
+ // Function that returns a shape from GraphQL
938
+ 'app/lib/api/get_user.liquid': `{% graphql result %}
939
+ query {
940
+ user {
941
+ id
942
+ name
943
+ }
944
+ }
945
+ {% endgraphql %}
946
+ {% return result %}`,
947
+ };
948
+
949
+ const rootUri = 'file:///project';
950
+ const fs = new MockFileSystem(mockFiles, rootUri);
951
+ const documentsLocator = new DocumentsLocator(fs);
952
+
953
+ const hashAssignTypeSystem = new TypeSystem(
954
+ {
955
+ graphQL: async () => null,
956
+ tags: async () => [],
957
+ objects: async () => [],
958
+ liquidDrops: async () => [],
959
+ filters: async () => [],
960
+ systemTranslations: async () => ({}),
961
+ },
962
+ async () => [],
963
+ async () => ({
964
+ article: [],
965
+ blog: [],
966
+ collection: [],
967
+ company: [],
968
+ company_location: [],
969
+ location: [],
970
+ market: [],
971
+ order: [],
972
+ page: [],
973
+ product: [],
974
+ variant: [],
975
+ shop: [],
976
+ }),
977
+ fs,
978
+ documentsLocator,
979
+ async () => rootUri,
980
+ );
981
+
982
+ // hash_assign should add 'extra' key while preserving 'user' key
983
+ const sourceCode = `{% function data = 'api/get_user' %}
984
+ {% hash_assign data['extra'] = 'value' %}
985
+ {{ data }}`;
986
+ const ast = toLiquidHtmlAST(sourceCode);
987
+ const variableOutput = ast.children[2];
988
+ assert(isLiquidVariableOutput(variableOutput));
989
+
990
+ const inferredType = await hashAssignTypeSystem.inferType(
991
+ variableOutput.markup,
992
+ ast,
993
+ `${rootUri}/app/views/pages/test.liquid`,
994
+ );
995
+
996
+ // Should have both original 'user' key and new 'extra' key
997
+ expect(inferredType).to.have.property('kind', 'shape');
998
+ if (typeof inferredType !== 'string' && inferredType.kind === 'shape') {
999
+ expect(inferredType.shape.properties?.get('user')).to.exist;
1000
+ expect(inferredType.shape.properties?.get('extra')).to.exist;
1001
+ }
1002
+ });
1003
+
1004
+ it('should accumulate multiple hash_assign keys', async () => {
1005
+ const { MockFileSystem } = await import('@platformos/platformos-check-common/src/test');
1006
+ const { DocumentsLocator } = await import('@platformos/platformos-common');
1007
+
1008
+ const mockFiles = {};
1009
+
1010
+ const rootUri = 'file:///project';
1011
+ const fs = new MockFileSystem(mockFiles, rootUri);
1012
+ const documentsLocator = new DocumentsLocator(fs);
1013
+
1014
+ const hashAssignTypeSystem = new TypeSystem(
1015
+ {
1016
+ graphQL: async () => null,
1017
+ tags: async () => [],
1018
+ objects: async () => [],
1019
+ liquidDrops: async () => [],
1020
+ filters: async () => [],
1021
+ systemTranslations: async () => ({}),
1022
+ },
1023
+ async () => [],
1024
+ async () => ({
1025
+ article: [],
1026
+ blog: [],
1027
+ collection: [],
1028
+ company: [],
1029
+ company_location: [],
1030
+ location: [],
1031
+ market: [],
1032
+ order: [],
1033
+ page: [],
1034
+ product: [],
1035
+ variant: [],
1036
+ shop: [],
1037
+ }),
1038
+ fs,
1039
+ documentsLocator,
1040
+ async () => rootUri,
1041
+ );
1042
+
1043
+ // Multiple hash_assign calls should accumulate keys
1044
+ const sourceCode = `{% assign data = '{}' | parse_json %}
1045
+ {% hash_assign data['key1'] = 'value1' %}
1046
+ {% hash_assign data['key2'] = 'value2' %}
1047
+ {% hash_assign data['key3'] = 'value3' %}
1048
+ {{ data }}`;
1049
+ const ast = toLiquidHtmlAST(sourceCode);
1050
+ const variableOutput = ast.children[4];
1051
+ assert(isLiquidVariableOutput(variableOutput));
1052
+
1053
+ const inferredType = await hashAssignTypeSystem.inferType(
1054
+ variableOutput.markup,
1055
+ ast,
1056
+ `${rootUri}/app/views/pages/test.liquid`,
1057
+ );
1058
+
1059
+ // Should have all three keys
1060
+ expect(inferredType).to.have.property('kind', 'shape');
1061
+ if (typeof inferredType !== 'string' && inferredType.kind === 'shape') {
1062
+ expect(inferredType.shape.properties?.get('key1')).to.exist;
1063
+ expect(inferredType.shape.properties?.get('key2')).to.exist;
1064
+ expect(inferredType.shape.properties?.get('key3')).to.exist;
1065
+ }
1066
+ });
1067
+ });
1068
+
1069
+ describe('metafieldDefinitionsObjectMap', async () => {
1070
+ it('should convert metafield definitions into types', async () => {
1071
+ const metafieldObjectMap = await typeSystem.metafieldDefinitionsObjectMap(
1072
+ 'file:///any/file.liquid',
1073
+ );
1074
+
1075
+ assert(metafieldObjectMap['product_metafields']);
1076
+ assert(metafieldObjectMap['product_metafield_custom']);
1077
+ assert(metafieldObjectMap['product_metafield_manufacturer']);
1078
+ });
1079
+
1080
+ it('should group metafield definitions by namespace', async () => {
1081
+ const metafieldObjectMap = await typeSystem.metafieldDefinitionsObjectMap(
1082
+ 'file:///any/file.liquid',
1083
+ );
1084
+ const properties = metafieldObjectMap['product_metafields'].properties;
1085
+
1086
+ assert(properties);
1087
+ expect(properties).toHaveLength(2);
1088
+ expect(properties).toContainEqual(
1089
+ expect.objectContaining({
1090
+ name: 'custom',
1091
+ return_type: [{ type: 'product_metafield_custom', name: '' }],
1092
+ }),
1093
+ );
1094
+ expect(metafieldObjectMap['product_metafields'].properties).toContainEqual(
1095
+ expect.objectContaining({
1096
+ name: 'manufacturer',
1097
+ return_type: [{ type: 'product_metafield_manufacturer', name: '' }],
1098
+ }),
1099
+ );
1100
+
1101
+ const manufacturerProperties =
1102
+ metafieldObjectMap['product_metafield_manufacturer'].properties;
1103
+
1104
+ assert(manufacturerProperties);
1105
+ expect(manufacturerProperties).toHaveLength(2);
1106
+
1107
+ expect(manufacturerProperties).toContainEqual(
1108
+ expect.objectContaining({
1109
+ name: 'code',
1110
+ return_type: [{ type: 'metafield_string', name: '' }],
1111
+ }),
1112
+ );
1113
+ expect(manufacturerProperties).toContainEqual(
1114
+ expect.objectContaining({
1115
+ name: 'id',
1116
+ return_type: [{ type: 'metafield_number', name: '' }],
1117
+ }),
1118
+ );
1119
+
1120
+ const customProperties = metafieldObjectMap['product_metafield_custom'].properties;
1121
+
1122
+ assert(customProperties);
1123
+ expect(customProperties).toHaveLength(1);
1124
+
1125
+ expect(customProperties).toContainEqual(
1126
+ expect.objectContaining({
1127
+ name: 'is_rare',
1128
+ return_type: [{ type: 'metafield_boolean', name: '' }],
1129
+ }),
1130
+ );
1131
+ });
1132
+
1133
+ it('should have `metafield_x_array` return_type for array of references', async () => {
1134
+ const metafieldObjectMap = await typeSystem.metafieldDefinitionsObjectMap(
1135
+ 'file:///any/file.liquid',
1136
+ );
1137
+ const relatedProperties = metafieldObjectMap['order_metafield_related'].properties;
1138
+
1139
+ assert(relatedProperties);
1140
+ expect(relatedProperties).toHaveLength(1);
1141
+
1142
+ expect(relatedProperties).toContainEqual(
1143
+ expect.objectContaining({
1144
+ name: 'prods',
1145
+ return_type: [{ type: 'metafield_product_array', name: '' }],
1146
+ }),
1147
+ );
1148
+ });
1149
+ });
1150
+ });