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