@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,211 +0,0 @@
1
- import { describe, it, expect, assert, beforeEach } from 'vitest';
2
- import { JSONLanguageService } from '../../JSONLanguageService';
3
- import { DocumentManager } from '../../../documents';
4
- import {
5
- getRequestParams,
6
- isCompletionList,
7
- mockJSONLanguageService,
8
- } from '../../test/test-helpers';
9
-
10
- describe('Unit: SettingsPropertyCompletionProvider', () => {
11
- const rootUri = 'file:///root/';
12
- let jsonLanguageService: JSONLanguageService;
13
- let documentManager: DocumentManager;
14
-
15
- beforeEach(async () => {
16
- documentManager = new DocumentManager(
17
- undefined, // don't need a fs
18
- undefined, // don't need a connection
19
- undefined, // don't need client capabilities
20
- async () => 'theme', // 'theme' mode
21
- async () => false, // schema is invalid for tests
22
- );
23
- jsonLanguageService = mockJSONLanguageService(
24
- rootUri,
25
- documentManager,
26
- async (_uri: string) => ({
27
- general: {
28
- fake: 'Fake Setting',
29
- },
30
- }),
31
- );
32
-
33
- await jsonLanguageService.setup({
34
- textDocument: {
35
- completion: {
36
- contextSupport: true,
37
- completionItem: {
38
- snippetSupport: true,
39
- commitCharactersSupport: true,
40
- documentationFormat: ['markdown'],
41
- deprecatedSupport: true,
42
- preselectSupport: true,
43
- },
44
- },
45
- },
46
- });
47
- });
48
-
49
- describe('section file with valid schema', () => {
50
- const tests = [
51
- {
52
- label: 'preset',
53
- schemaTemplate: (setting: object) => {
54
- return {
55
- presets: [setting],
56
- };
57
- },
58
- },
59
- {
60
- label: 'default',
61
- schemaTemplate: (setting: object) => {
62
- return {
63
- default: setting,
64
- };
65
- },
66
- },
67
- ];
68
-
69
- for (const test of tests) {
70
- describe(`${test.label} settings`, () => {
71
- it(`completes ${test.label} setting property when settings exist`, async () => {
72
- const schema = {
73
- settings: [{ id: 'custom-setting' }, { id: 'fake-setting' }, {}],
74
- ...test.schemaTemplate({
75
- settings: {
76
- '█': '',
77
- },
78
- }),
79
- };
80
- const source = `
81
- {% schema %}
82
- ${JSON.stringify(schema)}
83
- {% endschema %}
84
- `;
85
- const params = getRequestParams(documentManager, 'sections/section.liquid', source);
86
- const completions = await jsonLanguageService.completions(params);
87
-
88
- assert(isCompletionList(completions));
89
- expect(completions.items).to.have.lengthOf(2);
90
- expect(completions.items.map((item) => item.label)).to.include.members([
91
- `"custom-setting"`,
92
- `"fake-setting"`,
93
- ]);
94
- });
95
-
96
- it(`offers no suggestions for ${test.label} setting property when there are no settings`, async () => {
97
- const schema = {
98
- ...test.schemaTemplate({
99
- settings: {
100
- '█': '',
101
- },
102
- }),
103
- };
104
- const source = `
105
- {% schema %}
106
- ${JSON.stringify(schema)}
107
- {% endschema %}
108
- `;
109
- const params = getRequestParams(documentManager, 'sections/section.liquid', source);
110
- const completions = await jsonLanguageService.completions(params);
111
-
112
- assert(isCompletionList(completions));
113
- expect(completions.items).to.have.lengthOf(0);
114
- expect(completions.items.map((item) => item.label)).to.include.members([]);
115
- });
116
-
117
- it(`offers ${test.label} setting completion with docs from setting.label`, async () => {
118
- const schema = {
119
- settings: [
120
- { id: 'custom-setting', label: 'Custom Setting' },
121
- { id: 'fake-setting', label: 't:general.fake' },
122
- {},
123
- ],
124
- ...test.schemaTemplate({
125
- settings: {
126
- '█': '',
127
- },
128
- }),
129
- };
130
- const source = `
131
- {% schema %}
132
- ${JSON.stringify(schema)}
133
- {% endschema %}
134
- `;
135
- const params = getRequestParams(documentManager, 'sections/section.liquid', source);
136
- const completions = await jsonLanguageService.completions(params);
137
-
138
- assert(isCompletionList(completions));
139
- expect(completions.items).to.have.lengthOf(2);
140
- expect(completions.items).toEqual(
141
- expect.arrayContaining([
142
- expect.objectContaining({
143
- documentation: { kind: 'markdown', value: 'Custom Setting' },
144
- }),
145
- expect.objectContaining({
146
- documentation: { kind: 'markdown', value: 'Fake Setting' },
147
- }),
148
- ]),
149
- );
150
- });
151
- });
152
- }
153
-
154
- describe('block file with valid schema', () => {
155
- it(`offers no suggestions for default setting property when file is block`, async () => {
156
- const source = `
157
- {% schema %}
158
- {
159
- "settings": [
160
- {"id": "custom-setting"},
161
- {"id": "fake-setting"},
162
- {},
163
- ],
164
- "default": {
165
- "settings": {
166
- "█": ""
167
- }
168
- }
169
- }
170
- {% endschema %}
171
- `;
172
- const params = getRequestParams(documentManager, 'blocks/block.liquid', source);
173
- const completions = await jsonLanguageService.completions(params);
174
-
175
- assert(isCompletionList(completions));
176
- expect(completions.items).to.have.lengthOf(0);
177
- expect(completions.items.map((item) => item.label)).to.include.members([]);
178
- });
179
- });
180
- });
181
-
182
- describe('invalid schema', () => {
183
- it('completes preset setting property when settings exist and schema has small errors', async () => {
184
- const source = `
185
- {% schema %}
186
- {
187
- "settings": [
188
- {"id": "custom-setting"},
189
- {"id": "fake-setting"},
190
- {},
191
- ],
192
- "presets": [{
193
- "settings": {
194
- "█"
195
- }
196
- }]
197
- }
198
- {% endschema %}
199
- `;
200
- const params = getRequestParams(documentManager, 'blocks/block.liquid', source);
201
- const completions = await jsonLanguageService.completions(params);
202
-
203
- assert(isCompletionList(completions));
204
- expect(completions.items).to.have.lengthOf(2);
205
- expect(completions.items.map((item) => item.label)).to.include.members([
206
- `"custom-setting"`,
207
- `"fake-setting"`,
208
- ]);
209
- });
210
- });
211
- });
@@ -1,75 +0,0 @@
1
- import { isError, SourceCodeType } from '@platformos/platformos-check-common';
2
- import { JSONPath } from 'vscode-json-languageservice';
3
- import { JSONCompletionItem } from 'vscode-json-languageservice/lib/umd/jsonContributions';
4
- import { RequestContext } from '../../RequestContext';
5
- import { isBlockFile, isSectionFile } from '../../utils';
6
- import { JSONCompletionProvider } from '../JSONCompletionProvider';
7
- import { GetTranslationsForURI } from '../../../translations';
8
- import { isSectionOrBlockSchema } from './BlockTypeCompletionProvider';
9
- import { schemaSettingsPropertyCompletionItems } from '../../schemaSettings';
10
-
11
- /**
12
- * The SettingsPropertyCompletionProvider offers property completions for:
13
- * - `presets.[].settings.[]` objects inside `{% schema %}` tag in sections and blocks
14
- * - `default.settings` object inside `{% schema %}` tag in sections
15
- *
16
- * @example
17
- * {% schema %}
18
- * {
19
- * "presets": [
20
- * {
21
- * "settings": [
22
- * { "█" },
23
- * ]
24
- * },
25
- * ],
26
- * "default": {
27
- * "settings": {
28
- * "█"
29
- * }
30
- * }
31
- * }
32
- * {% endschema %}
33
- */
34
- export class SettingsPropertyCompletionProvider implements JSONCompletionProvider {
35
- constructor(public getDefaultSchemaTranslations: GetTranslationsForURI) {}
36
-
37
- async completeProperty(context: RequestContext, path: JSONPath): Promise<JSONCompletionItem[]> {
38
- const { doc } = context;
39
-
40
- if (doc.type !== SourceCodeType.LiquidHtml) return [];
41
-
42
- // section files can have schemas with `presets` and `default`
43
- // block files can have schemas with `presets` only
44
- if (
45
- !(isSectionFile(doc.uri) && (isPresetSettingsPath(path) || isDefaultSettingsPath(path))) &&
46
- !(isBlockFile(doc.uri) && isPresetSettingsPath(path))
47
- ) {
48
- return [];
49
- }
50
-
51
- const schema = await doc.getSchema();
52
-
53
- if (!schema || !isSectionOrBlockSchema(schema) || isError(schema.parsed)) {
54
- return [];
55
- }
56
-
57
- const parsedSchema = schema.parsed;
58
-
59
- if (!parsedSchema?.settings || !Array.isArray(parsedSchema.settings)) {
60
- return [];
61
- }
62
-
63
- const translations = await this.getDefaultSchemaTranslations(doc.textDocument.uri);
64
-
65
- return schemaSettingsPropertyCompletionItems(parsedSchema.settings, translations);
66
- }
67
- }
68
-
69
- function isPresetSettingsPath(path: JSONPath) {
70
- return path.length === 3 && path.at(0) === 'presets' && path.at(2) === 'settings';
71
- }
72
-
73
- function isDefaultSettingsPath(path: JSONPath) {
74
- return path.length === 2 && path.at(0) === 'default' && path.at(1) === 'settings';
75
- }
@@ -1,223 +0,0 @@
1
- import { beforeEach, describe, expect, it } from 'vitest';
2
- import { DocumentManager } from '../../documents';
3
- import { createJSONDocumentLinksVisitor } from './DocumentLinksProvider';
4
- import { toJSONAST, visit } from '@platformos/platformos-check-common';
5
- import { URI } from 'vscode-uri';
6
- import { JSONLanguageService } from '../JSONLanguageService';
7
-
8
- describe('JSON Document Links', () => {
9
- let documentManager: DocumentManager;
10
- let rootUri: string;
11
- let uriString: string;
12
- let jsonLanguageService: JSONLanguageService;
13
-
14
- beforeEach(async () => {
15
- documentManager = new DocumentManager();
16
- rootUri = 'file:///path/to/project';
17
-
18
- // Create a minimal JSONLanguageService for testing
19
- jsonLanguageService = new JSONLanguageService(
20
- documentManager,
21
- { schemas: async () => [] },
22
- async () => ({}),
23
- async () => 'theme',
24
- async () => [],
25
- async () => undefined,
26
- async () => rootUri,
27
- );
28
-
29
- // Initialize the service to resolve the initialized promise
30
- await jsonLanguageService.setup({});
31
- });
32
-
33
- describe('Schema Tags in Liquid Files', () => {
34
- it('should return document links for block types in schema tags', async () => {
35
- uriString = 'file:///path/to/sections/header.liquid';
36
- rootUri = 'file:///path/to/project';
37
-
38
- const schemaContent = `
39
- {
40
- "name": "Header",
41
- "blocks": [
42
- { "type": "logo" },
43
- { "type": "navigation" }
44
- ]
45
- }
46
- `;
47
-
48
- const liquidContent = `
49
- <div>Header content</div>
50
-
51
- {% schema %}
52
- ${schemaContent}
53
- {% endschema %}
54
- `;
55
-
56
- documentManager.open(uriString, liquidContent, 1);
57
-
58
- const textDocument = documentManager.get(uriString)!.textDocument;
59
- const schemaOffset = liquidContent.indexOf(schemaContent);
60
-
61
- const visitor = await createJSONDocumentLinksVisitor(
62
- textDocument,
63
- URI.parse(rootUri),
64
- schemaOffset,
65
- );
66
- const ast = toJSONAST(schemaContent);
67
-
68
- if (ast instanceof Error) throw ast;
69
- const result = await visit(ast, visitor);
70
-
71
- expect(result).toHaveLength(2);
72
- expect(result[0].target).toBe('file:///path/to/project/blocks/logo.liquid');
73
- expect(result[1].target).toBe('file:///path/to/project/blocks/navigation.liquid');
74
- });
75
-
76
- it('should handle section types in schema tags', async () => {
77
- uriString = 'file:///path/to/sections/main-collection.liquid';
78
- rootUri = 'file:///path/to/project';
79
-
80
- const schemaContent = `
81
- {
82
- "name": "Collection",
83
- "blocks": [
84
- {
85
- "type": "text",
86
- "settings": []
87
- }
88
- ],
89
- "presets": [
90
- {
91
- "name": "Default",
92
- "blocks": [
93
- { "type": "text" }
94
- ]
95
- }
96
- ]
97
- }
98
- `;
99
-
100
- const liquidContent = `
101
- <div>Collection content</div>
102
-
103
- {% schema %}
104
- ${schemaContent}
105
- {% endschema %}
106
- `;
107
-
108
- documentManager.open(uriString, liquidContent, 1);
109
-
110
- const textDocument = documentManager.get(uriString)!.textDocument;
111
- const schemaOffset = liquidContent.indexOf(schemaContent);
112
-
113
- const visitor = await createJSONDocumentLinksVisitor(
114
- textDocument,
115
- URI.parse(rootUri),
116
- schemaOffset,
117
- );
118
- const ast = toJSONAST(schemaContent);
119
-
120
- if (ast instanceof Error) throw ast;
121
- const result = await visit(ast, visitor);
122
-
123
- // Should find both block type references (in blocks array and in presets)
124
- expect(result).toHaveLength(2);
125
- expect(result[0].target).toBe('file:///path/to/project/blocks/text.liquid');
126
- expect(result[1].target).toBe('file:///path/to/project/blocks/text.liquid');
127
- });
128
-
129
- it('should not create links for special block types in schema tags', async () => {
130
- uriString = 'file:///path/to/sections/app-blocks.liquid';
131
- rootUri = 'file:///path/to/project';
132
-
133
- const schemaContent = `
134
- {
135
- "name": "App Blocks",
136
- "blocks": [
137
- { "type": "@app" },
138
- { "type": "@theme" },
139
- { "type": "custom-block" }
140
- ]
141
- }
142
- `;
143
-
144
- const liquidContent = `
145
- <div>App blocks section</div>
146
-
147
- {% schema %}
148
- ${schemaContent}
149
- {% endschema %}
150
- `;
151
-
152
- documentManager.open(uriString, liquidContent, 1);
153
-
154
- const textDocument = documentManager.get(uriString)!.textDocument;
155
- const schemaOffset = liquidContent.indexOf(schemaContent);
156
- const visitor = await createJSONDocumentLinksVisitor(
157
- textDocument,
158
- URI.parse(rootUri),
159
- schemaOffset,
160
- );
161
- const ast = toJSONAST(schemaContent);
162
-
163
- if (ast instanceof Error) throw ast;
164
- const result = await visit(ast, visitor);
165
-
166
- // Should only create link for custom-block, not @app or @theme
167
- expect(result).toHaveLength(1);
168
- expect(result[0].target).toBe('file:///path/to/project/blocks/custom-block.liquid');
169
- });
170
- });
171
-
172
- describe('JSON Files', () => {
173
- it('should return document links for section types in template JSON files', async () => {
174
- uriString = 'file:///path/to/templates/index.json';
175
-
176
- const jsonContent = `{
177
- "layout": "theme",
178
- "sections": {
179
- "header": {
180
- "type": "header-section"
181
- },
182
- "main": {
183
- "type": "main-product"
184
- }
185
- }
186
- }`;
187
-
188
- documentManager.open(uriString, jsonContent, 1);
189
-
190
- const result = await jsonLanguageService.documentLinks({
191
- textDocument: { uri: uriString },
192
- });
193
-
194
- expect(result).toHaveLength(2);
195
- expect(result[0].target).toBe('file:///path/to/project/sections/header-section.liquid');
196
- expect(result[1].target).toBe('file:///path/to/project/sections/main-product.liquid');
197
- });
198
-
199
- it('should return document links for block types in section JSON files', async () => {
200
- uriString = 'file:///path/to/sections/settings.json';
201
-
202
- const jsonContent = `{
203
- "name": "Section with blocks",
204
- "blocks": [
205
- { "type": "text" },
206
- { "type": "image" },
207
- { "type": "@app" }
208
- ]
209
- }`;
210
-
211
- documentManager.open(uriString, jsonContent, 1);
212
-
213
- const result = await jsonLanguageService.documentLinks({
214
- textDocument: { uri: uriString },
215
- });
216
-
217
- expect(result).toHaveLength(2);
218
- expect(result[0].target).toBe('file:///path/to/project/blocks/text.liquid');
219
- expect(result[1].target).toBe('file:///path/to/project/blocks/image.liquid');
220
- // @app should not create a link
221
- });
222
- });
223
- });
@@ -1,61 +0,0 @@
1
- import { JSONNode, SourceCodeType } from '@platformos/platformos-check-common';
2
- import { DocumentLink, Range } from 'vscode-languageserver';
3
- import { TextDocument } from 'vscode-languageserver-textdocument';
4
- import { URI, Utils } from 'vscode-uri';
5
- import { Visitor } from '@platformos/platformos-check-common';
6
-
7
- export async function createJSONDocumentLinksVisitor(
8
- textDocument: TextDocument,
9
- root: URI,
10
- offset: number = 0,
11
- ): Promise<Visitor<SourceCodeType.JSON, DocumentLink>> {
12
- const visitor: Visitor<SourceCodeType.JSON, DocumentLink> = {
13
- async Property(node, ancestors) {
14
- const origin = jsonPropertyOriginDirectory(ancestors);
15
-
16
- if (!origin) return;
17
-
18
- if (
19
- !(
20
- node.key.value === 'type' &&
21
- node.value.type === 'Literal' &&
22
- typeof node.value.value === 'string'
23
- )
24
- ) {
25
- return;
26
- }
27
-
28
- if (origin === 'blocks' && ['@app', '@theme'].includes(node.value.value)) {
29
- return;
30
- }
31
-
32
- return DocumentLink.create(
33
- range(textDocument, node.value, offset),
34
- Utils.resolvePath(root, origin, node.value.value + '.liquid').toString(),
35
- );
36
- },
37
- };
38
- return visitor;
39
- }
40
-
41
- function range(textDocument: TextDocument, node: JSONNode, offset: number): Range {
42
- // +1 and -1 to exclude the quotes
43
- const start = textDocument.positionAt(offset + node.loc.start.offset + 1);
44
- const end = textDocument.positionAt(offset + node.loc.end.offset - 1);
45
- return Range.create(start, end);
46
- }
47
-
48
- function jsonPropertyOriginDirectory(ancestors: JSONNode[]): 'sections' | 'blocks' | undefined {
49
- for (let i = ancestors.length - 1; i >= 0; i--) {
50
- const ancestor = ancestors[i];
51
- if (ancestor.type === 'Property') {
52
- if (ancestor.key.value === 'blocks') {
53
- return 'blocks';
54
- }
55
- if (ancestor.key.value === 'sections') {
56
- return 'sections';
57
- }
58
- }
59
- }
60
- return undefined;
61
- }