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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/PropertyShapeInference.d.ts +18 -0
  3. package/dist/PropertyShapeInference.js +58 -0
  4. package/dist/PropertyShapeInference.js.map +1 -1
  5. package/dist/TypeSystem.d.ts +4 -9
  6. package/dist/TypeSystem.js +234 -388
  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 +4 -16
  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 +12 -11
  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 +0 -8
  120. package/dist/utils/uri.js +1 -17
  121. package/dist/utils/uri.js.map +1 -1
  122. package/package.json +4 -4
  123. package/src/PropertyShapeInference.ts +76 -1
  124. package/src/TypeSystem.spec.ts +188 -450
  125. package/src/TypeSystem.ts +251 -457
  126. package/src/completions/CompletionsProvider.ts +13 -34
  127. package/src/completions/params/LiquidCompletionParams.spec.ts +0 -9
  128. package/src/completions/params/LiquidCompletionParams.ts +4 -14
  129. package/src/completions/params/fix.spec.ts +0 -3
  130. package/src/completions/providers/FilterCompletionProvider.spec.ts +2 -8
  131. package/src/completions/providers/FilterNamedParameterCompletionProvider.spec.ts +1 -5
  132. package/src/completions/providers/FilterNamedParameterCompletionProvider.ts +6 -6
  133. package/src/completions/providers/HtmlAttributeCompletionProvider.spec.ts +1 -4
  134. package/src/completions/providers/HtmlAttributeValueCompletionProvider.spec.ts +1 -4
  135. package/src/completions/providers/HtmlTagCompletionProvider.spec.ts +1 -4
  136. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.spec.ts +1 -28
  137. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.ts +3 -3
  138. package/src/completions/providers/LiquidDocTagCompletionProvider.spec.ts +1 -26
  139. package/src/completions/providers/LiquidTagsCompletionProvider.spec.ts +2 -16
  140. package/src/completions/providers/LiquidTagsCompletionProvider.ts +3 -3
  141. package/src/completions/providers/ObjectAttributeCompletionProvider.spec.ts +2 -31
  142. package/src/completions/providers/ObjectCompletionProvider.spec.ts +34 -123
  143. package/src/completions/providers/PartialCompletionProvider.spec.ts +4 -13
  144. package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +3 -5
  145. package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +0 -1
  146. package/src/completions/providers/TranslationCompletionProvider.spec.ts +1 -4
  147. package/src/completions/providers/index.ts +0 -3
  148. package/src/css/CSSLanguageService.ts +97 -81
  149. package/src/definitions/DefinitionProvider.ts +0 -6
  150. package/src/definitions/providers/TranslationStringDefinitionProvider.spec.ts +1 -5
  151. package/src/diagnostics/offenseToDiagnostic.ts +1 -1
  152. package/src/diagnostics/runChecks.spec.ts +16 -24
  153. package/src/diagnostics/runChecks.ts +17 -91
  154. package/src/docset/MarkdownRenderer.ts +1 -1
  155. package/src/documentLinks/DocumentLinksProvider.ts +3 -3
  156. package/src/documents/DocumentManager.spec.ts +12 -97
  157. package/src/documents/DocumentManager.ts +13 -14
  158. package/src/documents/types.ts +18 -9
  159. package/src/hover/HoverProvider.ts +9 -21
  160. package/src/hover/providers/HtmlAttributeHoverProvider.spec.ts +1 -3
  161. package/src/hover/providers/HtmlAttributeValueHoverProvider.spec.ts +1 -3
  162. package/src/hover/providers/HtmlTagHoverProvider.spec.ts +1 -3
  163. package/src/hover/providers/LiquidDocTagHoverProvider.spec.ts +0 -3
  164. package/src/hover/providers/LiquidFilterArgumentHoverProvider.spec.ts +0 -3
  165. package/src/hover/providers/LiquidFilterArgumentHoverProvider.ts +3 -3
  166. package/src/hover/providers/LiquidFilterHoverProvider.spec.ts +0 -3
  167. package/src/hover/providers/LiquidFilterHoverProvider.ts +3 -3
  168. package/src/hover/providers/LiquidObjectAttributeHoverProvider.spec.ts +1 -3
  169. package/src/hover/providers/LiquidObjectHoverProvider.spec.ts +46 -129
  170. package/src/hover/providers/LiquidTagHoverProvider.spec.ts +0 -3
  171. package/src/hover/providers/LiquidTagHoverProvider.ts +3 -3
  172. package/src/hover/providers/RenderPartialHoverProvider.spec.ts +1 -4
  173. package/src/hover/providers/RenderPartialHoverProvider.ts +1 -5
  174. package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +1 -4
  175. package/src/hover/providers/RenderPartialParameterHoverProvider.ts +0 -1
  176. package/src/hover/providers/TranslationHoverProvider.spec.ts +1 -4
  177. package/src/hover/providers/TranslationHoverProvider.ts +3 -3
  178. package/src/index.ts +2 -5
  179. package/src/internal-types.ts +1 -1
  180. package/src/json/JSONContributions.ts +4 -61
  181. package/src/json/JSONLanguageService.ts +19 -117
  182. package/src/json/test/test-helpers.ts +4 -35
  183. package/src/json/utils.ts +0 -27
  184. package/src/rename/RenameProvider.ts +3 -3
  185. package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +4 -4
  186. package/src/rename/providers/LiquidVariableRenameProvider.ts +4 -4
  187. package/src/renamed/RenameHandler.ts +4 -9
  188. package/src/renamed/handlers/AssetRenameHandler.spec.ts +3 -3
  189. package/src/renamed/handlers/AssetRenameHandler.ts +5 -5
  190. package/src/renamed/handlers/PartialRenameHandler.spec.ts +2 -2
  191. package/src/renamed/handlers/PartialRenameHandler.ts +5 -5
  192. package/src/renamed/handlers/utils.ts +1 -1
  193. package/src/server/{ThemeGraphManager.ts → AppGraphManager.ts} +21 -90
  194. package/src/server/startServer.spec.ts +7 -9
  195. package/src/server/startServer.ts +65 -217
  196. package/src/test/CompletionItemsAssertion.spec.ts +1 -4
  197. package/src/types.ts +33 -63
  198. package/src/utils/liquidDoc.ts +1 -1
  199. package/src/utils/uri.ts +0 -14
  200. package/src/completions/providers/ContentForBlockTypeCompletionProvider.spec.ts +0 -41
  201. package/src/completions/providers/ContentForBlockTypeCompletionProvider.ts +0 -42
  202. package/src/completions/providers/ContentForCompletionProvider.spec.ts +0 -96
  203. package/src/completions/providers/ContentForCompletionProvider.ts +0 -113
  204. package/src/completions/providers/ContentForParameterCompletionProvider.spec.ts +0 -362
  205. package/src/completions/providers/ContentForParameterCompletionProvider.ts +0 -187
  206. package/src/completions/providers/data/contentForParameterCompletionOptions.ts +0 -9
  207. package/src/css/CSSLanguageService.spec.ts +0 -159
  208. package/src/css/test/test-helpers.ts +0 -30
  209. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.spec.ts +0 -96
  210. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.ts +0 -82
  211. package/src/hover/providers/ContentForArgumentHoverProvider.spec.ts +0 -76
  212. package/src/hover/providers/ContentForArgumentHoverProvider.ts +0 -56
  213. package/src/hover/providers/ContentForTypeHoverProvider.spec.ts +0 -91
  214. package/src/hover/providers/ContentForTypeHoverProvider.ts +0 -42
  215. package/src/json/JSONLanguageService.spec.ts +0 -424
  216. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.spec.ts +0 -163
  217. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.ts +0 -121
  218. package/src/json/completions/providers/BlockTypeCompletionProvider.spec.ts +0 -137
  219. package/src/json/completions/providers/BlockTypeCompletionProvider.ts +0 -108
  220. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.spec.ts +0 -132
  221. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.ts +0 -120
  222. package/src/json/completions/providers/SchemaTranslationCompletionProvider.ts +0 -51
  223. package/src/json/completions/providers/SettingsPropertyCompletionProvider.spec.ts +0 -211
  224. package/src/json/completions/providers/SettingsPropertyCompletionProvider.ts +0 -75
  225. package/src/json/documentLinks/DocumentLinksProvider.spec.ts +0 -223
  226. package/src/json/documentLinks/DocumentLinksProvider.ts +0 -61
  227. package/src/json/hover/providers/BlockSettingsHoverProvider.spec.ts +0 -292
  228. package/src/json/hover/providers/BlockSettingsHoverProvider.ts +0 -99
  229. package/src/json/hover/providers/SchemaTranslationHoverProvider.ts +0 -35
  230. package/src/json/hover/providers/SettingsHoverProvider.spec.ts +0 -139
  231. package/src/json/hover/providers/SettingsHoverProvider.ts +0 -79
  232. package/src/json/schemaSettings.spec.ts +0 -103
  233. package/src/json/schemaSettings.ts +0 -53
  234. package/src/plugins/css.ts +0 -12
  235. package/src/renamed/handlers/BlockRenameHandler.spec.ts +0 -399
  236. package/src/renamed/handlers/BlockRenameHandler.ts +0 -402
  237. package/src/renamed/handlers/SectionRenameHandler.spec.ts +0 -321
  238. package/src/renamed/handlers/SectionRenameHandler.ts +0 -224
  239. package/src/settings/index.ts +0 -50
@@ -1,292 +0,0 @@
1
- import { describe, beforeEach, it, expect } from 'vitest';
2
- import { DocumentManager } from '../../../documents';
3
- import { JSONLanguageService } from '../../JSONLanguageService';
4
- import { getRequestParams, mockJSONLanguageService } from '../../test/test-helpers';
5
-
6
- describe('Module: BlockSettingsHoverProvider', async () => {
7
- const rootUri = 'file:///root';
8
- let jsonLanguageService: JSONLanguageService;
9
- let documentManager: DocumentManager;
10
-
11
- beforeEach(async () => {
12
- documentManager = new DocumentManager(
13
- undefined, // don't need a fs
14
- undefined, // don't need a connection
15
- undefined, // don't need client capabilities
16
- async () => 'theme', // 'theme' mode
17
- async () => false, // schema is invalid for tests
18
- );
19
- jsonLanguageService = mockJSONLanguageService(
20
- rootUri,
21
- documentManager,
22
- async (uri: string) => ({
23
- general: {
24
- fake: 'Fake Setting',
25
- },
26
- }),
27
- );
28
-
29
- await jsonLanguageService.setup({
30
- textDocument: {
31
- hover: {},
32
- completion: {
33
- contextSupport: true,
34
- completionItem: {
35
- snippetSupport: true,
36
- commitCharactersSupport: true,
37
- documentationFormat: ['markdown'],
38
- deprecatedSupport: true,
39
- preselectSupport: true,
40
- },
41
- },
42
- },
43
- });
44
- });
45
-
46
- const testBlockName = 'test-block';
47
-
48
- describe('valid theme block settings', async () => {
49
- beforeEach(() => {
50
- const testBlockSchema = {
51
- settings: [
52
- { id: 'custom-setting', label: 'Custom Setting' },
53
- { id: 'fake-setting', label: 't:general.fake' },
54
- ],
55
- };
56
- documentManager.open(
57
- `${rootUri}/blocks/${testBlockName}.liquid`,
58
- toSource(testBlockSchema),
59
- 1,
60
- );
61
- });
62
-
63
- it('provides hover when referenced block has literal settings label', async () => {
64
- const testSectionSchema = {
65
- presets: [
66
- {
67
- blocks: {
68
- [testBlockName]: {
69
- type: testBlockName,
70
- settings: {
71
- 'custom-setting█': '',
72
- },
73
- },
74
- },
75
- },
76
- ],
77
- };
78
- const params = getRequestParams(
79
- documentManager,
80
- 'sections/test-section.liquid',
81
- toSource(testSectionSchema),
82
- );
83
- const hover = await jsonLanguageService.hover(params);
84
- expect(hover).not.toBeNull();
85
- expect(hover!.contents).to.have.lengthOf(1);
86
- expect(hover!.contents).toEqual(['Custom Setting']);
87
- });
88
-
89
- it('provides hover when referenced block has translation settings label', async () => {
90
- const testSectionSchema = {
91
- presets: [
92
- {
93
- blocks: {
94
- [testBlockName]: {
95
- type: testBlockName,
96
- settings: {
97
- 'fake-setting█': '',
98
- },
99
- },
100
- },
101
- },
102
- ],
103
- };
104
- const params = getRequestParams(
105
- documentManager,
106
- 'sections/test-section.liquid',
107
- toSource(testSectionSchema),
108
- );
109
- const hover = await jsonLanguageService.hover(params);
110
- expect(hover).not.toBeNull();
111
- expect(hover!.contents).to.have.lengthOf(1);
112
- expect(hover!.contents).toEqual(['Fake Setting']);
113
- });
114
-
115
- it('provides hover when block reference is nested within another referenced block', async () => {
116
- const testSectionSchema = {
117
- presets: [
118
- {
119
- blocks: [
120
- {
121
- type: 'fake-block',
122
- blocks: {
123
- [testBlockName]: {
124
- type: testBlockName,
125
- settings: {
126
- 'fake-setting█': '',
127
- },
128
- },
129
- },
130
- },
131
- ],
132
- },
133
- ],
134
- };
135
- const params = getRequestParams(
136
- documentManager,
137
- 'sections/test-section.liquid',
138
- toSource(testSectionSchema),
139
- );
140
- const hover = await jsonLanguageService.hover(params);
141
- expect(hover).not.toBeNull();
142
- expect(hover!.contents).to.have.lengthOf(1);
143
- expect(hover!.contents).toEqual(['Fake Setting']);
144
- });
145
- });
146
-
147
- describe('valid section block settings', async () => {
148
- function hoverParams(settingId: string) {
149
- const testSectionSchema = {
150
- blocks: [
151
- {
152
- type: testBlockName,
153
- name: 'Test Block',
154
- settings: [
155
- { id: 'custom-setting', label: 'Custom Setting' },
156
- { id: 'fake-setting', label: 't:general.fake' },
157
- ],
158
- },
159
- ],
160
- presets: [
161
- {
162
- blocks: {
163
- [testBlockName]: {
164
- type: testBlockName,
165
- settings: {
166
- [`${settingId}█`]: '',
167
- },
168
- },
169
- },
170
- },
171
- ],
172
- };
173
- return getRequestParams(
174
- documentManager,
175
- 'sections/test-section.liquid',
176
- toSource(testSectionSchema),
177
- );
178
- }
179
-
180
- it('provides hover when referenced block has literal settings label', async () => {
181
- const params = hoverParams('custom-setting');
182
- const hover = await jsonLanguageService.hover(params);
183
- expect(hover).not.toBeNull();
184
- expect(hover!.contents).to.have.lengthOf(1);
185
- expect(hover!.contents).toEqual(['Custom Setting']);
186
- });
187
-
188
- it('provides hover when referenced block has translation settings label', async () => {
189
- const params = hoverParams('fake-setting');
190
- const hover = await jsonLanguageService.hover(params);
191
- expect(hover).not.toBeNull();
192
- expect(hover!.contents).to.have.lengthOf(1);
193
- expect(hover!.contents).toEqual(['Fake Setting']);
194
- });
195
- });
196
-
197
- describe('invalid theme block settings', async () => {
198
- it('provides no hover when block file nor local block exist', async () => {
199
- const testSectionSchema = {
200
- presets: [
201
- {
202
- blocks: {
203
- [testBlockName]: {
204
- type: testBlockName,
205
- settings: {
206
- 'nonexistent-setting█': '',
207
- },
208
- },
209
- },
210
- },
211
- ],
212
- };
213
- const params = getRequestParams(
214
- documentManager,
215
- 'sections/test-section.liquid',
216
- toSource(testSectionSchema),
217
- );
218
- const hover = await jsonLanguageService.hover(params);
219
- expect(hover).not.toBeNull();
220
- expect(hover!.contents).to.have.lengthOf(0);
221
- });
222
-
223
- it('provides no hover when block file has no settings', async () => {
224
- const testBlockSchema = {};
225
- documentManager.open(
226
- `${rootUri}/blocks/${testBlockName}.liquid`,
227
- toSource(testBlockSchema),
228
- 1,
229
- );
230
-
231
- const testSectionSchema = {
232
- presets: [
233
- {
234
- blocks: {
235
- [testBlockName]: {
236
- type: testBlockName,
237
- settings: {
238
- 'nonexistent-setting█': '',
239
- },
240
- },
241
- },
242
- },
243
- ],
244
- };
245
- const params = getRequestParams(
246
- documentManager,
247
- 'sections/test-section.liquid',
248
- toSource(testSectionSchema),
249
- );
250
- const hover = await jsonLanguageService.hover(params);
251
- expect(hover).not.toBeNull();
252
- expect(hover!.contents).to.have.lengthOf(0);
253
- });
254
-
255
- it('provides no hover when local block has no settings', async () => {
256
- const testSectionSchema = {
257
- blocks: [
258
- {
259
- type: testBlockName,
260
- name: 'Test Block',
261
- },
262
- ],
263
- presets: [
264
- {
265
- blocks: {
266
- [testBlockName]: {
267
- type: testBlockName,
268
- settings: {
269
- 'nonexistent-setting█': '',
270
- },
271
- },
272
- },
273
- },
274
- ],
275
- };
276
- const params = getRequestParams(
277
- documentManager,
278
- 'sections/test-section.liquid',
279
- toSource(testSectionSchema),
280
- );
281
- const hover = await jsonLanguageService.hover(params);
282
- expect(hover).not.toBeNull();
283
- expect(hover!.contents).to.have.lengthOf(0);
284
- });
285
- });
286
- });
287
-
288
- function toSource(schema: object) {
289
- return `{% schema %}
290
- ${JSON.stringify(schema)}
291
- {% endschema %}`;
292
- }
@@ -1,99 +0,0 @@
1
- import {
2
- AppBlockSchema,
3
- deepGet,
4
- isError,
5
- SectionSchema,
6
- Setting,
7
- ThemeBlockSchema,
8
- } from '@platformos/platformos-check-common';
9
- import { JSONPath, MarkedString } from 'vscode-json-languageservice';
10
- import { GetTranslationsForURI, renderTranslation, translationValue } from '../../../translations';
11
- import { isLiquidRequestContext, LiquidRequestContext, RequestContext } from '../../RequestContext';
12
- import { isSectionOrBlockFile } from '../../utils';
13
- import { JSONHoverProvider } from '../JSONHoverProvider';
14
- import { isSectionOrBlockSchema } from '../../completions/providers/BlockTypeCompletionProvider';
15
- import { GetThemeBlockSchema } from '../../JSONContributions';
16
- import { getSectionBlockByName } from '../../schemaSettings';
17
-
18
- export class BlockSettingsHoverProvider implements JSONHoverProvider {
19
- constructor(
20
- private getDefaultSchemaTranslations: GetTranslationsForURI,
21
- private getThemeBlockSchema: GetThemeBlockSchema,
22
- ) {}
23
-
24
- canHover(context: RequestContext, path: JSONPath): context is LiquidRequestContext {
25
- return (
26
- isSectionOrBlockFile(context.doc.uri) &&
27
- isLiquidRequestContext(context) &&
28
- path.length !== 0 &&
29
- isBlocksSettingsPath(path)
30
- );
31
- }
32
-
33
- async hover(context: RequestContext, path: JSONPath): Promise<MarkedString[]> {
34
- if (!this.canHover(context, path)) return [];
35
-
36
- const { doc } = context;
37
- const schema = await doc.getSchema();
38
-
39
- if (!isValidSchema(schema)) return [];
40
-
41
- const blockType = deepGet(schema.parsed, [...path.slice(0, -2), 'type']);
42
-
43
- if (!blockType) return [];
44
-
45
- const sectionBlock = getSectionBlockByName(schema.parsed, blockType);
46
-
47
- let label: string | undefined;
48
-
49
- if (sectionBlock) {
50
- if (!hasValidSettings(sectionBlock.settings)) return [];
51
-
52
- label = getSettingLabelById(sectionBlock.settings, path.at(-1) as string);
53
- } else {
54
- const themeBlockSchema = await this.getThemeBlockSchema(doc.uri, blockType);
55
-
56
- if (!isValidSchema(themeBlockSchema)) return [];
57
- if (!hasValidSettings(themeBlockSchema.parsed.settings)) return [];
58
-
59
- label = getSettingLabelById(themeBlockSchema.parsed.settings, path.at(-1) as string);
60
- }
61
-
62
- if (!label) return [];
63
-
64
- if (!label.startsWith('t:')) {
65
- return [label];
66
- }
67
-
68
- const translations = await this.getDefaultSchemaTranslations(doc.uri);
69
-
70
- const value = translationValue(label.substring(2), translations);
71
- if (!value) return [];
72
-
73
- return [renderTranslation(value)];
74
- }
75
- }
76
-
77
- function isBlocksSettingsPath(path: JSONPath) {
78
- return (
79
- (path.at(0) === 'presets' || path.at(0) === 'default') &&
80
- path.at(-4) === 'blocks' &&
81
- path.at(-2) === 'settings' &&
82
- path.at(-1) !== undefined &&
83
- typeof path.at(-1) === 'string'
84
- );
85
- }
86
-
87
- function isValidSchema(
88
- schema: SectionSchema | ThemeBlockSchema | AppBlockSchema | undefined,
89
- ): schema is SectionSchema | ThemeBlockSchema {
90
- return !!schema && !isError(schema.parsed) && isSectionOrBlockSchema(schema);
91
- }
92
-
93
- function hasValidSettings(settings: any): settings is Partial<Setting.Any>[] {
94
- return settings !== undefined && Array.isArray(settings);
95
- }
96
-
97
- function getSettingLabelById(settings: Partial<Setting.Any>[], id: string) {
98
- return settings.find((setting) => setting.id === id)?.label;
99
- }
@@ -1,35 +0,0 @@
1
- import { deepGet } from '@platformos/platformos-check-common';
2
- import { JSONPath, MarkedString } from 'vscode-json-languageservice';
3
- import { GetTranslationsForURI, renderTranslation, translationValue } from '../../../translations';
4
- import { isLiquidRequestContext, LiquidRequestContext, RequestContext } from '../../RequestContext';
5
- import { isSectionOrBlockFile } from '../../utils';
6
- import { JSONHoverProvider } from '../JSONHoverProvider';
7
-
8
- export class SchemaTranslationHoverProvider implements JSONHoverProvider {
9
- constructor(private getDefaultSchemaTranslations: GetTranslationsForURI) {}
10
-
11
- canHover(context: RequestContext, path: JSONPath): context is LiquidRequestContext {
12
- const label = deepGet(context.parsed, path);
13
- return (
14
- isSectionOrBlockFile(context.doc.uri) &&
15
- isLiquidRequestContext(context) &&
16
- path.length !== 0 &&
17
- label &&
18
- typeof label === 'string' &&
19
- label.startsWith('t:')
20
- );
21
- }
22
-
23
- async hover(context: RequestContext, path: JSONPath): Promise<MarkedString[]> {
24
- if (!this.canHover(context, path)) return [];
25
- // Can assert is a string because of `canHover` check above
26
- const label = deepGet(context.parsed, path) as string;
27
- return this.getDefaultSchemaTranslations(context.doc.uri).then((translations) => {
28
- const path = label.slice(2); // remove `t:`
29
- const value = translationValue(path, translations);
30
- if (!value) return undefined as any;
31
-
32
- return [renderTranslation(value)];
33
- });
34
- }
35
- }
@@ -1,139 +0,0 @@
1
- import { describe, beforeEach, it, expect } from 'vitest';
2
- import { DocumentManager } from '../../../documents';
3
- import { JSONLanguageService } from '../../JSONLanguageService';
4
- import { getRequestParams, mockJSONLanguageService } from '../../test/test-helpers';
5
-
6
- describe('Module: SettingsHoverProvider', async () => {
7
- const rootUri = 'file:///root/';
8
- let jsonLanguageService: JSONLanguageService;
9
- let documentManager: DocumentManager;
10
-
11
- beforeEach(async () => {
12
- documentManager = new DocumentManager(
13
- undefined, // don't need a fs
14
- undefined, // don't need a connection
15
- undefined, // don't need client capabilities
16
- async () => 'theme', // 'theme' mode
17
- async () => false, // schema is invalid for tests
18
- );
19
- jsonLanguageService = mockJSONLanguageService(
20
- rootUri,
21
- documentManager,
22
- async (uri: string) => ({
23
- general: {
24
- fake: 'Fake Setting',
25
- },
26
- }),
27
- );
28
-
29
- await jsonLanguageService.setup({
30
- textDocument: {
31
- hover: {},
32
- completion: {
33
- contextSupport: true,
34
- completionItem: {
35
- snippetSupport: true,
36
- commitCharactersSupport: true,
37
- documentationFormat: ['markdown'],
38
- deprecatedSupport: true,
39
- preselectSupport: true,
40
- },
41
- },
42
- },
43
- });
44
- });
45
-
46
- const tests = [
47
- {
48
- label: 'preset',
49
- schemaTemplate: (setting: object) => {
50
- return {
51
- presets: [setting],
52
- };
53
- },
54
- },
55
- {
56
- label: 'default',
57
- schemaTemplate: (setting: object) => {
58
- return {
59
- default: setting,
60
- };
61
- },
62
- },
63
- ];
64
-
65
- for (const test of tests) {
66
- describe(`${test.label} settings`, () => {
67
- it(`provide hover for ${test.label} setting when setting label contains a translation key`, async () => {
68
- const schema = {
69
- settings: [
70
- { id: 'custom-setting', label: 'Custom Setting' },
71
- { id: 'fake-setting', label: 't:general.fake' },
72
- ],
73
- ...test.schemaTemplate({
74
- settings: {
75
- 'fake-setting█': '',
76
- },
77
- }),
78
- };
79
- const source = `
80
- {% schema %}
81
- ${JSON.stringify(schema)}
82
- {% endschema %}
83
- `;
84
- const params = getRequestParams(documentManager, 'blocks/block.liquid', source);
85
- const hover = await jsonLanguageService.hover(params);
86
-
87
- expect(hover).not.toBeNull();
88
- expect(hover!.contents).to.have.lengthOf(1);
89
- expect(hover!.contents).toEqual(['Fake Setting']);
90
- });
91
-
92
- it(`provide hover for ${test.label} setting when setting label is literal text`, async () => {
93
- const schema = {
94
- settings: [
95
- { id: 'custom-setting', label: 'Custom Setting' },
96
- { id: 'fake-setting', label: 't:general.fake' },
97
- ],
98
- ...test.schemaTemplate({
99
- settings: {
100
- 'custom-setting█': '',
101
- },
102
- }),
103
- };
104
- const source = `
105
- {% schema %}
106
- ${JSON.stringify(schema)}
107
- {% endschema %}
108
- `;
109
- const params = getRequestParams(documentManager, 'blocks/block.liquid', source);
110
- const hover = await jsonLanguageService.hover(params);
111
-
112
- expect(hover).not.toBeNull();
113
- expect(hover!.contents).to.have.lengthOf(1);
114
- expect(hover!.contents).toEqual(['Custom Setting']);
115
- });
116
-
117
- it(`provide no hover for ${test.label} setting when setting label does not exist`, async () => {
118
- const schema = {
119
- settings: [{ id: 'custom-setting' }, { id: 'fake-setting', label: 't:general.fake' }],
120
- ...test.schemaTemplate({
121
- settings: {
122
- 'custom-setting█': '',
123
- },
124
- }),
125
- };
126
- const source = `
127
- {% schema %}
128
- ${JSON.stringify(schema)}
129
- {% endschema %}
130
- `;
131
- const params = getRequestParams(documentManager, 'blocks/block.liquid', source);
132
- const hover = await jsonLanguageService.hover(params);
133
-
134
- expect(hover).not.toBeNull();
135
- expect(hover!.contents).to.have.lengthOf(0);
136
- });
137
- });
138
- }
139
- });
@@ -1,79 +0,0 @@
1
- import { isError } from '@platformos/platformos-check-common';
2
- import { JSONPath, MarkedString } from 'vscode-json-languageservice';
3
- import { GetTranslationsForURI, renderTranslation, translationValue } from '../../../translations';
4
- import { isLiquidRequestContext, LiquidRequestContext, RequestContext } from '../../RequestContext';
5
- import { isSectionOrBlockFile } from '../../utils';
6
- import { JSONHoverProvider } from '../JSONHoverProvider';
7
- import { AugmentedLiquidSourceCode } from '../../../documents';
8
- import { isSectionOrBlockSchema } from '../../completions/providers/BlockTypeCompletionProvider';
9
-
10
- export class SettingsHoverProvider implements JSONHoverProvider {
11
- constructor(private getDefaultSchemaTranslations: GetTranslationsForURI) {}
12
-
13
- canHover(context: RequestContext, path: JSONPath): context is LiquidRequestContext {
14
- return (
15
- isSectionOrBlockFile(context.doc.uri) &&
16
- isLiquidRequestContext(context) &&
17
- path.length !== 0 &&
18
- (isPresetsSettingsPath(path) || isDefaultSettingsPath(path))
19
- );
20
- }
21
-
22
- async hover(context: RequestContext, path: JSONPath): Promise<MarkedString[]> {
23
- if (!this.canHover(context, path)) return [];
24
-
25
- const { doc } = context;
26
- const label = await getSettingsLabel(doc, path.at(-1) as string);
27
-
28
- if (!label) return [];
29
-
30
- if (!label.startsWith('t:')) {
31
- return [label];
32
- }
33
-
34
- return this.getDefaultSchemaTranslations(doc.uri).then((translations) => {
35
- const path = label.substring(2);
36
- const value = translationValue(path, translations);
37
- if (!value) return undefined as any;
38
-
39
- return [renderTranslation(value)];
40
- });
41
- }
42
- }
43
-
44
- function isPresetsSettingsPath(path: JSONPath) {
45
- return (
46
- path.at(0) === 'presets' &&
47
- path.at(2) === 'settings' &&
48
- path.at(3) !== undefined &&
49
- typeof path.at(3) === 'string'
50
- );
51
- }
52
-
53
- function isDefaultSettingsPath(path: JSONPath) {
54
- return (
55
- path.at(0) === 'default' &&
56
- path.at(1) === 'settings' &&
57
- path.at(2) !== undefined &&
58
- typeof path.at(2) === 'string'
59
- );
60
- }
61
-
62
- async function getSettingsLabel(
63
- doc: AugmentedLiquidSourceCode,
64
- label: string,
65
- ): Promise<string | undefined> {
66
- const schema = await doc.getSchema();
67
-
68
- if (
69
- !schema ||
70
- !isSectionOrBlockSchema(schema) ||
71
- isError(schema.parsed) ||
72
- schema.parsed.settings === undefined ||
73
- !Array.isArray(schema.parsed.settings)
74
- ) {
75
- return;
76
- }
77
-
78
- return schema.parsed.settings.find((setting: any) => setting?.id === label)?.label;
79
- }