@platformos/platformos-language-server-common 0.0.7 → 0.0.9

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 (249) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/PropertyShapeInference.d.ts +18 -0
  3. package/dist/PropertyShapeInference.js +62 -0
  4. package/dist/PropertyShapeInference.js.map +1 -1
  5. package/dist/TypeSystem.d.ts +4 -9
  6. package/dist/TypeSystem.js +246 -390
  7. package/dist/TypeSystem.js.map +1 -1
  8. package/dist/codeActions/providers/GenerateDocBlockProvider.d.ts +10 -0
  9. package/dist/codeActions/providers/GenerateDocBlockProvider.js +39 -0
  10. package/dist/codeActions/providers/GenerateDocBlockProvider.js.map +1 -0
  11. package/dist/commands/providers/GenerateDocBlockCommandProvider.d.ts +19 -0
  12. package/dist/commands/providers/GenerateDocBlockCommandProvider.js +64 -0
  13. package/dist/commands/providers/GenerateDocBlockCommandProvider.js.map +1 -0
  14. package/dist/completions/CompletionsProvider.d.ts +6 -10
  15. package/dist/completions/CompletionsProvider.js +6 -9
  16. package/dist/completions/CompletionsProvider.js.map +1 -1
  17. package/dist/completions/params/LiquidCompletionParams.js +6 -17
  18. package/dist/completions/params/LiquidCompletionParams.js.map +1 -1
  19. package/dist/completions/providers/ContentForCompletionProvider.js +2 -4
  20. package/dist/completions/providers/ContentForCompletionProvider.js.map +1 -1
  21. package/dist/completions/providers/FilterNamedParameterCompletionProvider.d.ts +3 -3
  22. package/dist/completions/providers/FilterNamedParameterCompletionProvider.js +6 -6
  23. package/dist/completions/providers/FilterNamedParameterCompletionProvider.js.map +1 -1
  24. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.d.ts +3 -3
  25. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js +3 -3
  26. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js.map +1 -1
  27. package/dist/completions/providers/LiquidTagsCompletionProvider.d.ts +3 -3
  28. package/dist/completions/providers/LiquidTagsCompletionProvider.js +3 -3
  29. package/dist/completions/providers/LiquidTagsCompletionProvider.js.map +1 -1
  30. package/dist/completions/providers/RenderPartialParameterCompletionProvider.js +1 -1
  31. package/dist/completions/providers/RenderPartialParameterCompletionProvider.js.map +1 -1
  32. package/dist/completions/providers/index.d.ts +0 -3
  33. package/dist/completions/providers/index.js +1 -7
  34. package/dist/completions/providers/index.js.map +1 -1
  35. package/dist/css/CSSLanguageService.d.ts +19 -5
  36. package/dist/css/CSSLanguageService.js +77 -63
  37. package/dist/css/CSSLanguageService.js.map +1 -1
  38. package/dist/definitions/DefinitionProvider.d.ts +1 -1
  39. package/dist/definitions/DefinitionProvider.js +1 -3
  40. package/dist/definitions/DefinitionProvider.js.map +1 -1
  41. package/dist/diagnostics/offenseToDiagnostic.js +1 -1
  42. package/dist/diagnostics/offenseToDiagnostic.js.map +1 -1
  43. package/dist/diagnostics/runChecks.d.ts +3 -5
  44. package/dist/diagnostics/runChecks.js +12 -64
  45. package/dist/diagnostics/runChecks.js.map +1 -1
  46. package/dist/docset/MarkdownRenderer.js +1 -1
  47. package/dist/docset/MarkdownRenderer.js.map +1 -1
  48. package/dist/documentLinks/DocumentLinksProvider.d.ts +3 -3
  49. package/dist/documentLinks/DocumentLinksProvider.js +3 -3
  50. package/dist/documentLinks/DocumentLinksProvider.js.map +1 -1
  51. package/dist/documents/DocumentManager.d.ts +4 -5
  52. package/dist/documents/DocumentManager.js +17 -12
  53. package/dist/documents/DocumentManager.js.map +1 -1
  54. package/dist/documents/types.d.ts +16 -3
  55. package/dist/documents/types.js +3 -3
  56. package/dist/documents/types.js.map +1 -1
  57. package/dist/hover/HoverProvider.d.ts +5 -8
  58. package/dist/hover/HoverProvider.js +8 -14
  59. package/dist/hover/HoverProvider.js.map +1 -1
  60. package/dist/hover/providers/LiquidFilterArgumentHoverProvider.d.ts +3 -3
  61. package/dist/hover/providers/LiquidFilterArgumentHoverProvider.js +3 -3
  62. package/dist/hover/providers/LiquidFilterArgumentHoverProvider.js.map +1 -1
  63. package/dist/hover/providers/LiquidFilterHoverProvider.d.ts +3 -3
  64. package/dist/hover/providers/LiquidFilterHoverProvider.js +3 -3
  65. package/dist/hover/providers/LiquidFilterHoverProvider.js.map +1 -1
  66. package/dist/hover/providers/LiquidTagHoverProvider.d.ts +3 -3
  67. package/dist/hover/providers/LiquidTagHoverProvider.js +3 -3
  68. package/dist/hover/providers/LiquidTagHoverProvider.js.map +1 -1
  69. package/dist/hover/providers/RenderPartialHoverProvider.js +1 -1
  70. package/dist/hover/providers/RenderPartialHoverProvider.js.map +1 -1
  71. package/dist/hover/providers/RenderPartialParameterHoverProvider.js +1 -1
  72. package/dist/hover/providers/RenderPartialParameterHoverProvider.js.map +1 -1
  73. package/dist/hover/providers/TranslationHoverProvider.d.ts +3 -3
  74. package/dist/hover/providers/TranslationHoverProvider.js +3 -3
  75. package/dist/hover/providers/TranslationHoverProvider.js.map +1 -1
  76. package/dist/index.d.ts +1 -1
  77. package/dist/index.js.map +1 -1
  78. package/dist/internal-types.d.ts +1 -1
  79. package/dist/json/JSONContributions.d.ts +1 -5
  80. package/dist/json/JSONContributions.js +4 -36
  81. package/dist/json/JSONContributions.js.map +1 -1
  82. package/dist/json/JSONLanguageService.d.ts +4 -12
  83. package/dist/json/JSONLanguageService.js +17 -80
  84. package/dist/json/JSONLanguageService.js.map +1 -1
  85. package/dist/json/test/test-helpers.d.ts +1 -3
  86. package/dist/json/test/test-helpers.js +3 -19
  87. package/dist/json/test/test-helpers.js.map +1 -1
  88. package/dist/json/utils.d.ts +0 -5
  89. package/dist/json/utils.js +0 -24
  90. package/dist/json/utils.js.map +1 -1
  91. package/dist/rename/RenameProvider.d.ts +2 -2
  92. package/dist/rename/RenameProvider.js +2 -2
  93. package/dist/rename/RenameProvider.js.map +1 -1
  94. package/dist/rename/providers/LiquidVariableRenameProvider.d.ts +3 -3
  95. package/dist/rename/providers/LiquidVariableRenameProvider.js +4 -4
  96. package/dist/rename/providers/LiquidVariableRenameProvider.js.map +1 -1
  97. package/dist/renamed/RenameHandler.d.ts +2 -3
  98. package/dist/renamed/RenameHandler.js +3 -8
  99. package/dist/renamed/RenameHandler.js.map +1 -1
  100. package/dist/renamed/handlers/AssetRenameHandler.d.ts +3 -3
  101. package/dist/renamed/handlers/AssetRenameHandler.js +5 -5
  102. package/dist/renamed/handlers/AssetRenameHandler.js.map +1 -1
  103. package/dist/renamed/handlers/PartialRenameHandler.d.ts +3 -3
  104. package/dist/renamed/handlers/PartialRenameHandler.js +5 -5
  105. package/dist/renamed/handlers/PartialRenameHandler.js.map +1 -1
  106. package/dist/renamed/handlers/utils.d.ts +1 -1
  107. package/dist/server/AppGraphManager.d.ts +32 -0
  108. package/dist/server/AppGraphManager.js +155 -0
  109. package/dist/server/AppGraphManager.js.map +1 -0
  110. package/dist/server/startServer.d.ts +2 -2
  111. package/dist/server/startServer.js +62 -164
  112. package/dist/server/startServer.js.map +1 -1
  113. package/dist/tsconfig.tsbuildinfo +1 -1
  114. package/dist/types.d.ts +33 -54
  115. package/dist/types.js +21 -26
  116. package/dist/types.js.map +1 -1
  117. package/dist/utils/liquidDoc.js +1 -1
  118. package/dist/utils/liquidDoc.js.map +1 -1
  119. package/dist/utils/uri.d.ts +2 -9
  120. package/dist/utils/uri.js +5 -21
  121. package/dist/utils/uri.js.map +1 -1
  122. package/package.json +4 -4
  123. package/src/ClientCapabilities.ts +1 -1
  124. package/src/PropertyShapeInference.ts +81 -1
  125. package/src/TypeSystem.spec.ts +206 -449
  126. package/src/TypeSystem.ts +267 -460
  127. package/src/codeActions/providers/FixAllProvider.spec.ts +1 -1
  128. package/src/codeActions/providers/FixProvider.spec.ts +11 -11
  129. package/src/codeActions/providers/SuggestionProvider.spec.ts +2 -2
  130. package/src/commands/providers/ApplyFixesProvider.ts +2 -2
  131. package/src/commands/providers/ApplySuggestionProvider.ts +2 -2
  132. package/src/commands/providers/RunChecksProvider.ts +2 -2
  133. package/src/completions/CompletionsProvider.ts +14 -35
  134. package/src/completions/params/LiquidCompletionParams.spec.ts +0 -9
  135. package/src/completions/params/LiquidCompletionParams.ts +8 -17
  136. package/src/completions/params/fix.spec.ts +0 -3
  137. package/src/completions/providers/FilterCompletionProvider.spec.ts +2 -8
  138. package/src/completions/providers/FilterNamedParameterCompletionProvider.spec.ts +1 -5
  139. package/src/completions/providers/FilterNamedParameterCompletionProvider.ts +6 -6
  140. package/src/completions/providers/HtmlAttributeCompletionProvider.spec.ts +1 -4
  141. package/src/completions/providers/HtmlAttributeValueCompletionProvider.spec.ts +1 -4
  142. package/src/completions/providers/HtmlTagCompletionProvider.spec.ts +1 -4
  143. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.spec.ts +1 -28
  144. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.ts +3 -3
  145. package/src/completions/providers/LiquidDocTagCompletionProvider.spec.ts +1 -26
  146. package/src/completions/providers/LiquidTagsCompletionProvider.spec.ts +4 -18
  147. package/src/completions/providers/LiquidTagsCompletionProvider.ts +3 -3
  148. package/src/completions/providers/ObjectAttributeCompletionProvider.spec.ts +2 -31
  149. package/src/completions/providers/ObjectCompletionProvider.spec.ts +34 -123
  150. package/src/completions/providers/PartialCompletionProvider.spec.ts +6 -15
  151. package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +13 -15
  152. package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +2 -3
  153. package/src/completions/providers/TranslationCompletionProvider.spec.ts +1 -4
  154. package/src/completions/providers/TranslationCompletionProvider.ts +3 -3
  155. package/src/completions/providers/index.ts +0 -3
  156. package/src/css/CSSLanguageService.ts +97 -81
  157. package/src/definitions/DefinitionProvider.ts +0 -6
  158. package/src/definitions/providers/TranslationStringDefinitionProvider.spec.ts +1 -5
  159. package/src/diagnostics/offenseToDiagnostic.ts +1 -1
  160. package/src/diagnostics/runChecks.spec.ts +22 -30
  161. package/src/diagnostics/runChecks.ts +17 -91
  162. package/src/docset/MarkdownRenderer.ts +1 -1
  163. package/src/documentLinks/DocumentLinksProvider.ts +10 -10
  164. package/src/documents/DocumentManager.spec.ts +46 -119
  165. package/src/documents/DocumentManager.ts +19 -15
  166. package/src/documents/types.ts +18 -9
  167. package/src/hover/HoverProvider.ts +9 -21
  168. package/src/hover/providers/HtmlAttributeHoverProvider.spec.ts +1 -3
  169. package/src/hover/providers/HtmlAttributeValueHoverProvider.spec.ts +1 -3
  170. package/src/hover/providers/HtmlTagHoverProvider.spec.ts +1 -3
  171. package/src/hover/providers/LiquidDocTagHoverProvider.spec.ts +1 -4
  172. package/src/hover/providers/LiquidFilterArgumentHoverProvider.spec.ts +0 -3
  173. package/src/hover/providers/LiquidFilterArgumentHoverProvider.ts +3 -3
  174. package/src/hover/providers/LiquidFilterHoverProvider.spec.ts +0 -3
  175. package/src/hover/providers/LiquidFilterHoverProvider.ts +3 -3
  176. package/src/hover/providers/LiquidObjectAttributeHoverProvider.spec.ts +1 -3
  177. package/src/hover/providers/LiquidObjectHoverProvider.spec.ts +46 -129
  178. package/src/hover/providers/LiquidTagHoverProvider.spec.ts +0 -3
  179. package/src/hover/providers/LiquidTagHoverProvider.ts +3 -3
  180. package/src/hover/providers/RenderPartialHoverProvider.spec.ts +11 -14
  181. package/src/hover/providers/RenderPartialHoverProvider.ts +1 -5
  182. package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +10 -13
  183. package/src/hover/providers/RenderPartialParameterHoverProvider.ts +2 -3
  184. package/src/hover/providers/TranslationHoverProvider.spec.ts +1 -4
  185. package/src/hover/providers/TranslationHoverProvider.ts +3 -3
  186. package/src/index.ts +4 -7
  187. package/src/internal-types.ts +1 -1
  188. package/src/json/JSONContributions.ts +4 -61
  189. package/src/json/JSONLanguageService.ts +19 -117
  190. package/src/json/test/test-helpers.ts +4 -35
  191. package/src/json/utils.ts +0 -27
  192. package/src/rename/RenameProvider.ts +4 -4
  193. package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +5 -5
  194. package/src/rename/providers/LiquidVariableRenameProvider.ts +6 -6
  195. package/src/renamed/RenameHandler.ts +4 -9
  196. package/src/renamed/handlers/AssetRenameHandler.spec.ts +28 -28
  197. package/src/renamed/handlers/AssetRenameHandler.ts +6 -6
  198. package/src/renamed/handlers/PartialRenameHandler.spec.ts +9 -9
  199. package/src/renamed/handlers/PartialRenameHandler.ts +10 -10
  200. package/src/server/{ThemeGraphManager.ts → AppGraphManager.ts} +21 -90
  201. package/src/server/safe.ts +1 -1
  202. package/src/server/startServer.spec.ts +10 -12
  203. package/src/server/startServer.ts +69 -222
  204. package/src/test/CompletionItemsAssertion.spec.ts +1 -4
  205. package/src/types.ts +33 -63
  206. package/src/utils/debounce.ts +1 -1
  207. package/src/utils/liquidDoc.ts +6 -6
  208. package/src/utils/uri.ts +5 -17
  209. package/src/completions/providers/ContentForBlockTypeCompletionProvider.spec.ts +0 -41
  210. package/src/completions/providers/ContentForBlockTypeCompletionProvider.ts +0 -42
  211. package/src/completions/providers/ContentForCompletionProvider.spec.ts +0 -96
  212. package/src/completions/providers/ContentForCompletionProvider.ts +0 -113
  213. package/src/completions/providers/ContentForParameterCompletionProvider.spec.ts +0 -362
  214. package/src/completions/providers/ContentForParameterCompletionProvider.ts +0 -187
  215. package/src/completions/providers/data/contentForParameterCompletionOptions.ts +0 -9
  216. package/src/css/CSSLanguageService.spec.ts +0 -159
  217. package/src/css/test/test-helpers.ts +0 -30
  218. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.spec.ts +0 -96
  219. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.ts +0 -82
  220. package/src/hover/providers/ContentForArgumentHoverProvider.spec.ts +0 -76
  221. package/src/hover/providers/ContentForArgumentHoverProvider.ts +0 -56
  222. package/src/hover/providers/ContentForTypeHoverProvider.spec.ts +0 -91
  223. package/src/hover/providers/ContentForTypeHoverProvider.ts +0 -42
  224. package/src/json/JSONLanguageService.spec.ts +0 -424
  225. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.spec.ts +0 -163
  226. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.ts +0 -121
  227. package/src/json/completions/providers/BlockTypeCompletionProvider.spec.ts +0 -137
  228. package/src/json/completions/providers/BlockTypeCompletionProvider.ts +0 -108
  229. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.spec.ts +0 -132
  230. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.ts +0 -120
  231. package/src/json/completions/providers/SchemaTranslationCompletionProvider.ts +0 -51
  232. package/src/json/completions/providers/SettingsPropertyCompletionProvider.spec.ts +0 -211
  233. package/src/json/completions/providers/SettingsPropertyCompletionProvider.ts +0 -75
  234. package/src/json/documentLinks/DocumentLinksProvider.spec.ts +0 -223
  235. package/src/json/documentLinks/DocumentLinksProvider.ts +0 -61
  236. package/src/json/hover/providers/BlockSettingsHoverProvider.spec.ts +0 -292
  237. package/src/json/hover/providers/BlockSettingsHoverProvider.ts +0 -99
  238. package/src/json/hover/providers/SchemaTranslationHoverProvider.ts +0 -35
  239. package/src/json/hover/providers/SettingsHoverProvider.spec.ts +0 -139
  240. package/src/json/hover/providers/SettingsHoverProvider.ts +0 -79
  241. package/src/json/schemaSettings.spec.ts +0 -103
  242. package/src/json/schemaSettings.ts +0 -53
  243. package/src/plugins/css.ts +0 -12
  244. package/src/renamed/handlers/BlockRenameHandler.spec.ts +0 -399
  245. package/src/renamed/handlers/BlockRenameHandler.ts +0 -402
  246. package/src/renamed/handlers/SectionRenameHandler.spec.ts +0 -321
  247. package/src/renamed/handlers/SectionRenameHandler.ts +0 -224
  248. package/src/renamed/handlers/utils.ts +0 -22
  249. package/src/settings/index.ts +0 -50
@@ -1,159 +0,0 @@
1
- import { assert, beforeEach, describe, expect, it } from 'vitest';
2
- import { DocumentManager } from '../documents';
3
- import { CSSLanguageService } from './CSSLanguageService';
4
- import { getRequestParams, isCompletionList } from './test/test-helpers';
5
-
6
- describe('Module: CSSLanguageService', () => {
7
- let cssLanguageService: CSSLanguageService;
8
- let documentManager: DocumentManager;
9
-
10
- beforeEach(async () => {
11
- documentManager = new DocumentManager(
12
- undefined,
13
- undefined,
14
- undefined,
15
- async () => 'theme', // theme schema
16
- async () => false, // invalid
17
- );
18
- cssLanguageService = new CSSLanguageService(documentManager);
19
-
20
- await cssLanguageService.setup({
21
- textDocument: {
22
- completion: {
23
- contextSupport: true,
24
- completionItem: {
25
- snippetSupport: true,
26
- commitCharactersSupport: true,
27
- documentationFormat: ['markdown'],
28
- deprecatedSupport: true,
29
- preselectSupport: true,
30
- },
31
- },
32
- },
33
- });
34
- });
35
-
36
- describe('completions', () => {
37
- it('should return CSS completions in a liquid file {% stylesheet %}', async () => {
38
- const params = getRequestParams(
39
- documentManager,
40
- 'sections/section.liquid',
41
- `
42
- {% stylesheet %}
43
- .a:hov█ {
44
- color: red;
45
- }
46
- {% endstylesheet %}
47
- <div>hello world</div>
48
-
49
- `,
50
- );
51
-
52
- const completions = await cssLanguageService.completions(params);
53
- assert(isCompletionList(completions));
54
- expect(completions.items).to.have.lengthOf(377);
55
- expect(completions.items[0].label).to.equal(':active');
56
- expect(completions.items[0].documentation).to.deep.equal({
57
- kind: 'markdown',
58
- value:
59
- `Applies while an element is being activated by the user\\. For example, between the times the user presses the mouse button and releases it\\.\n\n` +
60
- `![Baseline icon](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTAiIHZpZXdCb3g9IjAgMCA1NDAgMzAwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5ncmVlbi1zaGFwZSB7CiAgICAgIGZpbGw6ICNDNEVFRDA7IC8qIExpZ2h0IG1vZGUgKi8KICAgIH0KCiAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgIC5ncmVlbi1zaGFwZSB7CiAgICAgICAgZmlsbDogIzEyNTIyNTsgLyogRGFyayBtb2RlICovCiAgICAgIH0KICAgIH0KICA8L3N0eWxlPgogIDxwYXRoIGQ9Ik00MjAgMzBMMzkwIDYwTDQ4MCAxNTBMMzkwIDI0MEwzMzAgMTgwTDMwMCAyMTBMMzkwIDMwMEw1NDAgMTUwTDQyMCAzMFoiIGNsYXNzPSJncmVlbi1zaGFwZSIvPgogIDxwYXRoIGQ9Ik0xNTAgMEwzMCAxMjBMNjAgMTUwTDE1MCA2MEwyMTAgMTIwTDI0MCA5MEwxNTAgMFoiIGNsYXNzPSJncmVlbi1zaGFwZSIvPgogIDxwYXRoIGQ9Ik0zOTAgMEw0MjAgMzBMMTUwIDMwMEwwIDE1MEwzMCAxMjBMMTUwIDI0MEwzOTAgMFoiIGZpbGw9IiMxRUE0NDYiLz4KPC9zdmc+) _Widely available across major browsers (Baseline since 2015)_\n\n` +
61
- `[MDN Reference](https://developer.mozilla.org/docs/Web/CSS/:active)`,
62
- });
63
- });
64
- });
65
-
66
- describe('hover', () => {
67
- it('should return hover information for the given property in a {% stylesheet %}', async () => {
68
- const params = getRequestParams(
69
- documentManager,
70
- 'sections/section.liquid',
71
- `
72
- {% stylesheet %}
73
- .wrapper {
74
- display: flex█;
75
- }
76
- {% endstylesheet %}
77
- <div>hello world</div>
78
- `,
79
- );
80
- const hover = await cssLanguageService.hover(params);
81
- assert(hover !== null);
82
- expect(hover.contents).to.eql({
83
- kind: 'plaintext',
84
- value:
85
- dedent(`In combination with 'float' and 'position', determines the type of box or boxes that are generated for an element.
86
-
87
- Widely available across major browsers (Baseline since 2015)
88
-
89
- Syntax: [ <display-outside> || <display-inside> ] | <display-listitem> | <display-internal> | <display-box> | <display-legacy>
90
-
91
- MDN Reference: https://developer.mozilla.org/docs/Web/CSS/display`),
92
- });
93
- });
94
-
95
- it('should return hover information for the given tag in a {% stylesheet %}', async () => {
96
- const params = getRequestParams(
97
- documentManager,
98
- 'sections/section.liquid',
99
- `
100
- {% stylesheet %}
101
- .wrapper█ {
102
- display: flex;
103
- }
104
- {% endstylesheet %}
105
- <div>hello world</div>
106
- `,
107
- );
108
- const hover = await cssLanguageService.hover(params);
109
- assert(hover !== null);
110
- expect(hover.contents).to.eql([
111
- '<element class="wrapper">',
112
- '[Selector Specificity](https://developer.mozilla.org/docs/Web/CSS/Specificity): (0, 1, 0)',
113
- ]);
114
- });
115
- });
116
-
117
- describe('diagnostics', () => {
118
- it('should return ddiagnostics information for the given property in a {% stylesheet %}', async () => {
119
- const params = getRequestParams(
120
- documentManager,
121
- 'sections/section.liquid',
122
- `
123
- {% stylesheet %}
124
- a:h {
125
- }
126
- {% endstylesheet %}
127
- <div>hello world</div>
128
- `,
129
- );
130
- const diagnostics = await cssLanguageService.diagnostics(params);
131
- assert(diagnostics !== null);
132
- expect(diagnostics).to.eql([
133
- {
134
- code: 'emptyRules',
135
- message: 'Do not use empty rulesets',
136
- range: {
137
- end: {
138
- character: 15,
139
- line: 2,
140
- },
141
- start: {
142
- character: 12,
143
- line: 2,
144
- },
145
- },
146
- severity: 2,
147
- source: 'json',
148
- },
149
- ]);
150
- });
151
- });
152
- });
153
-
154
- function dedent(text: string): string {
155
- return text
156
- .split('\n')
157
- .map((line) => line.trimStart())
158
- .join('\n');
159
- }
@@ -1,30 +0,0 @@
1
- import {
2
- CompletionItem,
3
- CompletionList,
4
- CompletionParams,
5
- HoverParams,
6
- } from 'vscode-languageserver-protocol';
7
- import { DocumentManager } from '../../documents';
8
-
9
- export function getRequestParams(
10
- documentManager: DocumentManager,
11
- relativePath: string,
12
- source: string,
13
- ): HoverParams & CompletionParams {
14
- const uri = `file:///root/${relativePath}`;
15
- const sourceWithoutCursor = source.replace('█', '');
16
- documentManager.open(uri, sourceWithoutCursor, 1);
17
- const doc = documentManager.get(uri)!.textDocument;
18
- const position = doc.positionAt(source.indexOf('█'));
19
-
20
- return {
21
- textDocument: { uri: uri },
22
- position: position,
23
- };
24
- }
25
-
26
- export function isCompletionList(
27
- completions: null | CompletionList | CompletionItem[],
28
- ): completions is CompletionList {
29
- return completions !== null && !Array.isArray(completions);
30
- }
@@ -1,96 +0,0 @@
1
- import { JSONSourceCode, SourceCodeType, toSourceCode } from '@platformos/platformos-check-common';
2
- import { assert, beforeEach, describe, expect, it } from 'vitest';
3
- import { DefinitionParams, LocationLink } from 'vscode-languageserver-protocol';
4
- import { TextDocument } from 'vscode-languageserver-textdocument';
5
- import { AugmentedJsonSourceCode, DocumentManager } from '../../documents';
6
- import { DefinitionProvider } from '../DefinitionProvider';
7
-
8
- describe('Module: SchemaTranslationStringDefinitionProvider', () => {
9
- let provider: DefinitionProvider;
10
- let documentManager: DocumentManager;
11
- let mockGetDefaultSchemaLocaleSourceCode: (uri: string) => Promise<any>;
12
-
13
- beforeEach(() => {
14
- documentManager = new DocumentManager(
15
- undefined,
16
- undefined,
17
- undefined,
18
- async () => 'theme',
19
- async () => true,
20
- );
21
-
22
- const translationFileContents = JSON.stringify(
23
- {
24
- hello: {
25
- world: 'Hello World',
26
- },
27
- },
28
- null,
29
- 2,
30
- );
31
-
32
- const uri = 'file:///locales/en.default.schema.json';
33
- const sourceCode = toSourceCode(uri, translationFileContents) as JSONSourceCode;
34
- const textDocument = TextDocument.create(uri, sourceCode.type, 1, sourceCode.source);
35
- mockGetDefaultSchemaLocaleSourceCode = async (): Promise<AugmentedJsonSourceCode> => {
36
- return {
37
- ...sourceCode,
38
- textDocument,
39
- };
40
- };
41
-
42
- provider = new DefinitionProvider(
43
- documentManager,
44
- async () => null,
45
- mockGetDefaultSchemaLocaleSourceCode,
46
- );
47
- });
48
-
49
- it('finds the definition of existing translation keys', async () => {
50
- const source = `
51
- {% schema %}
52
- {
53
- "name": "t:hello.world"
54
- }
55
- {% endschema %}
56
- `;
57
- documentManager.open('file:///blocks/test.liquid', source, 1);
58
- const params: DefinitionParams = {
59
- textDocument: { uri: 'file:///blocks/test.liquid' },
60
- position: { line: 3, character: 26 }, // Position within "t:hello.world"
61
- };
62
-
63
- const result = await provider.definitions(params);
64
-
65
- assert(result);
66
- expect(result).toHaveLength(1);
67
- assert(LocationLink.is(result[0]));
68
- expect(result[0]).toMatchObject({
69
- targetUri: 'file:///locales/en.default.schema.json',
70
- targetRange: {
71
- start: { line: 2, character: expect.any(Number) },
72
- end: { line: 2, character: expect.any(Number) },
73
- },
74
- });
75
- });
76
-
77
- it('returns null for non-existent translation key', async () => {
78
- const source = `
79
- {% schema %}
80
- {
81
- "name": "t:hello.world"
82
- }
83
- {% endschema %}
84
- `;
85
- documentManager.open('file:///blocks/products.liquid', source, 1);
86
-
87
- const params: DefinitionParams = {
88
- textDocument: { uri: 'file:///blocks/products.liquid' },
89
- position: { line: 0, character: 7 }, // Position within "unknown.key"
90
- };
91
-
92
- const result = await provider.definitions(params);
93
-
94
- assert(result === null);
95
- });
96
- });
@@ -1,82 +0,0 @@
1
- import { LiquidHtmlNode, LiquidRawTag, NodeTypes } from '@platformos/liquid-html-parser';
2
- import { SourceCodeType, findJSONNode, nodeAtPath } from '@platformos/platformos-check-common';
3
- import {
4
- DefinitionLink,
5
- DefinitionParams,
6
- LocationLink,
7
- Range,
8
- } from 'vscode-languageserver-protocol';
9
- import { AugmentedJsonSourceCode, DocumentManager } from '../../documents';
10
- import { BaseDefinitionProvider } from '../BaseDefinitionProvider';
11
-
12
- export class SchemaTranslationStringDefinitionProvider implements BaseDefinitionProvider {
13
- constructor(
14
- private documentManager: DocumentManager,
15
- private getDefaultSchemaLocaleSourceCode: (
16
- uri: string,
17
- ) => Promise<AugmentedJsonSourceCode | null>,
18
- ) {}
19
-
20
- async definitions(
21
- params: DefinitionParams,
22
- node: LiquidHtmlNode,
23
- ancestors: LiquidHtmlNode[],
24
- ): Promise<DefinitionLink[]> {
25
- const sourceCode = this.documentManager.get(params.textDocument.uri);
26
- if (!sourceCode || sourceCode.type !== SourceCodeType.LiquidHtml) return [];
27
-
28
- // We want text inside {% schema %}
29
- if (node.type !== NodeTypes.TextNode) return [];
30
- const schemaTag = ancestors.find(isSchemaTag);
31
- if (!schemaTag) {
32
- return [];
33
- }
34
-
35
- const schema = await sourceCode.getSchema();
36
- if (!schema || schema.ast instanceof Error) return [];
37
-
38
- // Now we need to find the location of the translation in the translation file
39
- const defaultLocaleFile = await this.getDefaultSchemaLocaleSourceCode(params.textDocument.uri);
40
- if (
41
- !defaultLocaleFile ||
42
- defaultLocaleFile.type !== SourceCodeType.JSON ||
43
- defaultLocaleFile.ast instanceof Error
44
- ) {
45
- return [];
46
- }
47
-
48
- const documentOffset = sourceCode.textDocument.offsetAt(params.position);
49
- const offset = documentOffset - schema.offset;
50
- const [jNode, _jAncestors] = findJSONNode(schema.ast, offset);
51
-
52
- if (jNode.type !== 'Literal') return [];
53
- if (typeof jNode.value !== 'string' || !jNode.value.startsWith('t:')) return [];
54
-
55
- const translationKey = jNode.value.slice(2).trim();
56
- const translationNode = nodeAtPath(defaultLocaleFile.ast, translationKey.split('.'));
57
-
58
- if (!translationNode) return [];
59
-
60
- const targetRange = Range.create(
61
- defaultLocaleFile.textDocument.positionAt(translationNode.loc.start.offset),
62
- defaultLocaleFile.textDocument.positionAt(translationNode.loc.end.offset),
63
- );
64
- const originRange = Range.create(
65
- sourceCode.textDocument.positionAt(schema.offset + jNode.loc.start.offset),
66
- sourceCode.textDocument.positionAt(schema.offset + jNode.loc.end.offset),
67
- );
68
-
69
- return [
70
- LocationLink.create(
71
- defaultLocaleFile.textDocument.uri,
72
- targetRange,
73
- targetRange,
74
- originRange,
75
- ),
76
- ];
77
- }
78
- }
79
-
80
- function isSchemaTag(node: LiquidHtmlNode): node is LiquidRawTag & { name: 'schema' } {
81
- return node.type === NodeTypes.LiquidRawTag && node.name === 'schema';
82
- }
@@ -1,76 +0,0 @@
1
- import { describe, beforeEach, it, expect } from 'vitest';
2
- import { DocumentManager } from '../../documents';
3
- import { HoverProvider } from '../HoverProvider';
4
- import { MetafieldDefinitionMap } from '@platformos/platformos-check-common';
5
- import { GetDocDefinitionForURI, DocDefinition } from '@platformos/platformos-check-common';
6
- import { TranslationProvider } from '@platformos/platformos-common';
7
- import { MockFileSystem } from '@platformos/platformos-check-common/src/test';
8
-
9
- const uri = 'file:///blocks/product-card.liquid';
10
-
11
- describe('Module: ContentForArgumentHoverProvider', async () => {
12
- let provider: HoverProvider;
13
- let getSnippetDefinition: GetDocDefinitionForURI;
14
- const mockSnippetDefinition: DocDefinition = {
15
- uri,
16
- liquidDoc: {
17
- parameters: [
18
- {
19
- name: 'title',
20
- description: 'The title of the product',
21
- type: 'string',
22
- required: true,
23
- nodeType: 'param',
24
- },
25
- ],
26
- },
27
- };
28
-
29
- describe('hover', () => {
30
- beforeEach(() => {
31
- provider = createProvider(async () => mockSnippetDefinition);
32
- });
33
-
34
- it('should return null if doc definition not found', async () => {
35
- getSnippetDefinition = async () => undefined;
36
- provider = createProvider(getSnippetDefinition);
37
- await expect(provider).to.hover(
38
- `{% content_for 'block', type: 'product-card', tit█le: 'value' %}`,
39
- null,
40
- );
41
- });
42
-
43
- it('should return null if parameter not found in doc definition', async () => {
44
- await expect(provider).to.hover(
45
- `{% content_for 'block', type: unknown-para█m: 'value' %}`,
46
- null,
47
- );
48
- });
49
-
50
- it('should return parameter info from doc definition', async () => {
51
- await expect(provider).to.hover(
52
- `{% content_for 'block', type: 'product-card', ti█tle: 'My Product' %}`,
53
- '### `title`: string\n\nThe title of the product',
54
- );
55
- });
56
- });
57
- });
58
-
59
- const createProvider = (getSnippetDefinition: GetDocDefinitionForURI) => {
60
- return new HoverProvider(
61
- new DocumentManager(),
62
- {
63
- graphQL: async () => null,
64
- filters: async () => [],
65
- objects: async () => [],
66
- liquidDrops: async () => [],
67
- tags: async () => [],
68
- systemTranslations: async () => ({}),
69
- },
70
- new TranslationProvider(new MockFileSystem({})),
71
- async (_rootUri: string) => ({}) as MetafieldDefinitionMap,
72
- async () => ({}),
73
- async () => [],
74
- getSnippetDefinition,
75
- );
76
- };
@@ -1,56 +0,0 @@
1
- import { NodeTypes } from '@platformos/liquid-html-parser';
2
- import {
3
- LiquidHtmlNode,
4
- GetDocDefinitionForURI,
5
- getBlockName,
6
- } from '@platformos/platformos-check-common';
7
- import { Hover, HoverParams } from 'vscode-languageserver';
8
- import { BaseHoverProvider } from '../BaseHoverProvider';
9
- import { formatLiquidDocParameter } from '../../utils/liquidDoc';
10
-
11
- export class ContentForArgumentHoverProvider implements BaseHoverProvider {
12
- constructor(private getDocDefinitionForURI: GetDocDefinitionForURI) {}
13
-
14
- async hover(
15
- currentNode: LiquidHtmlNode,
16
- ancestors: LiquidHtmlNode[],
17
- params: HoverParams,
18
- ): Promise<Hover | null> {
19
- const parentNode = ancestors.at(-1);
20
- if (
21
- currentNode.type !== NodeTypes.NamedArgument ||
22
- !parentNode ||
23
- parentNode.type !== NodeTypes.ContentForMarkup ||
24
- parentNode.contentForType.type !== NodeTypes.String
25
- ) {
26
- return null;
27
- }
28
-
29
- const blockName = getBlockName(parentNode);
30
-
31
- if (!blockName) {
32
- return null;
33
- }
34
-
35
- const docDefinition = await this.getDocDefinitionForURI(
36
- params.textDocument.uri,
37
- 'blocks',
38
- blockName,
39
- );
40
-
41
- const hoverArgument = docDefinition?.liquidDoc?.parameters?.find(
42
- (argument) => argument.name === currentNode.name,
43
- );
44
-
45
- if (!hoverArgument) {
46
- return null;
47
- }
48
-
49
- return {
50
- contents: {
51
- kind: 'markdown',
52
- value: formatLiquidDocParameter(hoverArgument, true),
53
- },
54
- };
55
- }
56
- }
@@ -1,91 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { DocumentManager } from '../../documents';
3
- import { HoverProvider } from '../HoverProvider';
4
- import { MetafieldDefinitionMap } from '@platformos/platformos-check-common';
5
- import { GetDocDefinitionForURI, DocDefinition } from '@platformos/platformos-check-common';
6
- import { TranslationProvider } from '@platformos/platformos-common';
7
- import { MockFileSystem } from '@platformos/platformos-check-common/src/test';
8
-
9
- const uri = 'file:///blocks/product-card.liquid';
10
-
11
- describe('Module: ContentForTypeHoverProvider', async () => {
12
- let provider: HoverProvider;
13
- const mockSnippetDefinition: DocDefinition = {
14
- uri,
15
- liquidDoc: {
16
- parameters: [
17
- {
18
- name: 'title',
19
- description: 'The title of the product',
20
- type: 'string',
21
- required: true,
22
- nodeType: 'param',
23
- },
24
- ],
25
- description: {
26
- content: 'This is a description',
27
- nodeType: 'description',
28
- },
29
- examples: [
30
- {
31
- content: '{{ product }}',
32
- nodeType: 'example',
33
- },
34
- ],
35
- },
36
- };
37
-
38
- describe('hover', () => {
39
- it('should return snippet definition with all parameters', async () => {
40
- provider = createProvider(async () => mockSnippetDefinition);
41
- // prettier-ignore
42
- const expectedHoverContent =
43
- `### product-card
44
-
45
- **Description:**
46
-
47
-
48
- This is a description
49
-
50
- **Parameters:**
51
- - \`title\`: string - The title of the product
52
-
53
- **Examples:**
54
- \`\`\`liquid
55
- {{ product }}
56
- \`\`\``;
57
-
58
- await expect(provider).to.hover(
59
- `{% content_for 'block', type: 'product-car█d' %}`,
60
- expectedHoverContent,
61
- );
62
- });
63
-
64
- it("should return nothing if not in content_for tag's type argument's value", async () => {
65
- await expect(provider).to.hover(
66
- `{% content_for 'block', type: 'product-card', id: 'some-█string' %}`,
67
- null,
68
- );
69
- await expect(provider).to.hover(`{{ content_for 'bl█ock', type: 'product-card' }}`, null);
70
- });
71
- });
72
- });
73
-
74
- const createProvider = (getSnippetDefinition: GetDocDefinitionForURI) => {
75
- return new HoverProvider(
76
- new DocumentManager(),
77
- {
78
- graphQL: async () => null,
79
- filters: async () => [],
80
- objects: async () => [],
81
- liquidDrops: async () => [],
82
- tags: async () => [],
83
- systemTranslations: async () => ({}),
84
- },
85
- new TranslationProvider(new MockFileSystem({})),
86
- async (_rootUri: string) => ({}) as MetafieldDefinitionMap,
87
- async () => ({}),
88
- async () => [],
89
- getSnippetDefinition,
90
- );
91
- };
@@ -1,42 +0,0 @@
1
- import { NodeTypes } from '@platformos/liquid-html-parser';
2
- import { LiquidHtmlNode, GetDocDefinitionForURI } from '@platformos/platformos-check-common';
3
- import { Hover, HoverParams } from 'vscode-languageserver';
4
- import { BaseHoverProvider } from '../BaseHoverProvider';
5
- import { formatLiquidDocContentMarkdown } from '../../utils/liquidDoc';
6
-
7
- export class ContentForTypeHoverProvider implements BaseHoverProvider {
8
- constructor(private getDocDefinitionForURI: GetDocDefinitionForURI) {}
9
-
10
- async hover(
11
- currentNode: LiquidHtmlNode,
12
- ancestors: LiquidHtmlNode[],
13
- params: HoverParams,
14
- ): Promise<Hover | null> {
15
- const parentNode = ancestors.at(-1);
16
- const grandParentNode = ancestors.at(-2);
17
- if (
18
- currentNode.type !== NodeTypes.String ||
19
- !parentNode ||
20
- !grandParentNode ||
21
- parentNode.type !== NodeTypes.NamedArgument ||
22
- parentNode.name !== 'type' ||
23
- grandParentNode.type !== NodeTypes.ContentForMarkup
24
- ) {
25
- return null;
26
- }
27
-
28
- const blockName = currentNode.value;
29
- const docDefinition = await this.getDocDefinitionForURI(
30
- params.textDocument.uri,
31
- 'blocks',
32
- blockName,
33
- );
34
-
35
- return {
36
- contents: {
37
- kind: 'markdown',
38
- value: formatLiquidDocContentMarkdown(blockName, docDefinition),
39
- },
40
- };
41
- }
42
- }