@platformos/platformos-language-server-common 0.0.6 → 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 (247) hide show
  1. package/CHANGELOG.md +20 -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/completions/CompletionsProvider.d.ts +6 -10
  9. package/dist/completions/CompletionsProvider.js +6 -9
  10. package/dist/completions/CompletionsProvider.js.map +1 -1
  11. package/dist/completions/params/LiquidCompletionParams.js +4 -16
  12. package/dist/completions/params/LiquidCompletionParams.js.map +1 -1
  13. package/dist/completions/providers/ContentForCompletionProvider.js +2 -4
  14. package/dist/completions/providers/ContentForCompletionProvider.js.map +1 -1
  15. package/dist/completions/providers/FilterCompletionProvider.js.map +1 -1
  16. package/dist/completions/providers/FilterNamedParameterCompletionProvider.d.ts +3 -3
  17. package/dist/completions/providers/FilterNamedParameterCompletionProvider.js +6 -6
  18. package/dist/completions/providers/FilterNamedParameterCompletionProvider.js.map +1 -1
  19. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.d.ts +3 -3
  20. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js +3 -3
  21. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js.map +1 -1
  22. package/dist/completions/providers/LiquidTagsCompletionProvider.d.ts +3 -3
  23. package/dist/completions/providers/LiquidTagsCompletionProvider.js +3 -3
  24. package/dist/completions/providers/LiquidTagsCompletionProvider.js.map +1 -1
  25. package/dist/completions/providers/RenderPartialParameterCompletionProvider.js +1 -1
  26. package/dist/completions/providers/RenderPartialParameterCompletionProvider.js.map +1 -1
  27. package/dist/completions/providers/TranslationCompletionProvider.js +1 -1
  28. package/dist/completions/providers/TranslationCompletionProvider.js.map +1 -1
  29. package/dist/completions/providers/index.d.ts +0 -3
  30. package/dist/completions/providers/index.js +1 -7
  31. package/dist/completions/providers/index.js.map +1 -1
  32. package/dist/css/CSSLanguageService.d.ts +19 -5
  33. package/dist/css/CSSLanguageService.js +77 -63
  34. package/dist/css/CSSLanguageService.js.map +1 -1
  35. package/dist/definitions/DefinitionProvider.d.ts +1 -1
  36. package/dist/definitions/DefinitionProvider.js +1 -3
  37. package/dist/definitions/DefinitionProvider.js.map +1 -1
  38. package/dist/diagnostics/offenseToDiagnostic.js +1 -1
  39. package/dist/diagnostics/offenseToDiagnostic.js.map +1 -1
  40. package/dist/diagnostics/runChecks.d.ts +3 -5
  41. package/dist/diagnostics/runChecks.js +12 -64
  42. package/dist/diagnostics/runChecks.js.map +1 -1
  43. package/dist/docset/MarkdownRenderer.js +1 -1
  44. package/dist/docset/MarkdownRenderer.js.map +1 -1
  45. package/dist/documentHighlights/providers/HtmlTagNameDocumentHighlightsProvider.d.ts +1 -1
  46. package/dist/documentLinks/DocumentLinksProvider.d.ts +3 -3
  47. package/dist/documentLinks/DocumentLinksProvider.js +3 -3
  48. package/dist/documentLinks/DocumentLinksProvider.js.map +1 -1
  49. package/dist/documents/DocumentManager.d.ts +4 -5
  50. package/dist/documents/DocumentManager.js +12 -11
  51. package/dist/documents/DocumentManager.js.map +1 -1
  52. package/dist/documents/types.d.ts +16 -3
  53. package/dist/documents/types.js +3 -3
  54. package/dist/documents/types.js.map +1 -1
  55. package/dist/formatting/OnTypeFormattingProvider.d.ts +1 -1
  56. package/dist/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.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/linkedEditingRanges/providers/HtmlTagNameLinkedRangesProvider.d.ts +1 -1
  92. package/dist/progress.js.map +1 -1
  93. package/dist/rename/RenameProvider.d.ts +2 -2
  94. package/dist/rename/RenameProvider.js +2 -2
  95. package/dist/rename/RenameProvider.js.map +1 -1
  96. package/dist/rename/providers/LiquidVariableRenameProvider.d.ts +3 -3
  97. package/dist/rename/providers/LiquidVariableRenameProvider.js +4 -4
  98. package/dist/rename/providers/LiquidVariableRenameProvider.js.map +1 -1
  99. package/dist/renamed/RenameHandler.d.ts +2 -3
  100. package/dist/renamed/RenameHandler.js +3 -8
  101. package/dist/renamed/RenameHandler.js.map +1 -1
  102. package/dist/renamed/handlers/AssetRenameHandler.d.ts +3 -3
  103. package/dist/renamed/handlers/AssetRenameHandler.js +5 -5
  104. package/dist/renamed/handlers/AssetRenameHandler.js.map +1 -1
  105. package/dist/renamed/handlers/PartialRenameHandler.d.ts +3 -3
  106. package/dist/renamed/handlers/PartialRenameHandler.js +5 -5
  107. package/dist/renamed/handlers/PartialRenameHandler.js.map +1 -1
  108. package/dist/renamed/handlers/utils.d.ts +1 -1
  109. package/dist/server/AppGraphManager.d.ts +32 -0
  110. package/dist/server/AppGraphManager.js +155 -0
  111. package/dist/server/AppGraphManager.js.map +1 -0
  112. package/dist/server/Configuration.js.map +1 -1
  113. package/dist/server/startServer.d.ts +2 -2
  114. package/dist/server/startServer.js +62 -164
  115. package/dist/server/startServer.js.map +1 -1
  116. package/dist/tsconfig.tsbuildinfo +1 -1
  117. package/dist/types.d.ts +33 -54
  118. package/dist/types.js +21 -26
  119. package/dist/types.js.map +1 -1
  120. package/dist/utils/liquidDoc.js +1 -1
  121. package/dist/utils/liquidDoc.js.map +1 -1
  122. package/dist/utils/uri.d.ts +0 -8
  123. package/dist/utils/uri.js +1 -17
  124. package/dist/utils/uri.js.map +1 -1
  125. package/package.json +9 -9
  126. package/src/PropertyShapeInference.ts +76 -1
  127. package/src/TypeSystem.spec.ts +187 -452
  128. package/src/TypeSystem.ts +253 -459
  129. package/src/completions/CompletionsProvider.ts +13 -34
  130. package/src/completions/params/LiquidCompletionParams.spec.ts +0 -9
  131. package/src/completions/params/LiquidCompletionParams.ts +4 -14
  132. package/src/completions/params/fix.spec.ts +0 -3
  133. package/src/completions/providers/FilterCompletionProvider.spec.ts +2 -8
  134. package/src/completions/providers/FilterCompletionProvider.ts +6 -6
  135. package/src/completions/providers/FilterNamedParameterCompletionProvider.spec.ts +1 -5
  136. package/src/completions/providers/FilterNamedParameterCompletionProvider.ts +6 -6
  137. package/src/completions/providers/HtmlAttributeCompletionProvider.spec.ts +1 -4
  138. package/src/completions/providers/HtmlAttributeValueCompletionProvider.spec.ts +1 -4
  139. package/src/completions/providers/HtmlTagCompletionProvider.spec.ts +1 -4
  140. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.spec.ts +1 -28
  141. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.ts +3 -3
  142. package/src/completions/providers/LiquidDocTagCompletionProvider.spec.ts +1 -26
  143. package/src/completions/providers/LiquidTagsCompletionProvider.spec.ts +2 -16
  144. package/src/completions/providers/LiquidTagsCompletionProvider.ts +3 -3
  145. package/src/completions/providers/ObjectAttributeCompletionProvider.spec.ts +2 -31
  146. package/src/completions/providers/ObjectCompletionProvider.spec.ts +34 -123
  147. package/src/completions/providers/PartialCompletionProvider.spec.ts +4 -13
  148. package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +3 -5
  149. package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +0 -1
  150. package/src/completions/providers/TranslationCompletionProvider.spec.ts +1 -4
  151. package/src/completions/providers/TranslationCompletionProvider.ts +1 -1
  152. package/src/completions/providers/index.ts +0 -3
  153. package/src/css/CSSLanguageService.ts +97 -81
  154. package/src/definitions/DefinitionProvider.ts +0 -6
  155. package/src/definitions/providers/TranslationStringDefinitionProvider.spec.ts +1 -5
  156. package/src/diagnostics/offenseToDiagnostic.ts +1 -1
  157. package/src/diagnostics/runChecks.spec.ts +16 -24
  158. package/src/diagnostics/runChecks.ts +17 -91
  159. package/src/docset/MarkdownRenderer.ts +1 -1
  160. package/src/documentLinks/DocumentLinksProvider.ts +3 -3
  161. package/src/documents/DocumentManager.spec.ts +12 -97
  162. package/src/documents/DocumentManager.ts +13 -14
  163. package/src/documents/types.ts +18 -9
  164. package/src/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.ts +1 -3
  165. package/src/hover/HoverProvider.ts +9 -21
  166. package/src/hover/providers/HtmlAttributeHoverProvider.spec.ts +1 -3
  167. package/src/hover/providers/HtmlAttributeValueHoverProvider.spec.ts +1 -3
  168. package/src/hover/providers/HtmlTagHoverProvider.spec.ts +1 -3
  169. package/src/hover/providers/LiquidDocTagHoverProvider.spec.ts +0 -3
  170. package/src/hover/providers/LiquidFilterArgumentHoverProvider.spec.ts +0 -3
  171. package/src/hover/providers/LiquidFilterArgumentHoverProvider.ts +3 -3
  172. package/src/hover/providers/LiquidFilterHoverProvider.spec.ts +0 -3
  173. package/src/hover/providers/LiquidFilterHoverProvider.ts +3 -3
  174. package/src/hover/providers/LiquidObjectAttributeHoverProvider.spec.ts +1 -3
  175. package/src/hover/providers/LiquidObjectHoverProvider.spec.ts +46 -129
  176. package/src/hover/providers/LiquidTagHoverProvider.spec.ts +0 -3
  177. package/src/hover/providers/LiquidTagHoverProvider.ts +3 -3
  178. package/src/hover/providers/RenderPartialHoverProvider.spec.ts +1 -4
  179. package/src/hover/providers/RenderPartialHoverProvider.ts +1 -5
  180. package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +1 -4
  181. package/src/hover/providers/RenderPartialParameterHoverProvider.ts +0 -1
  182. package/src/hover/providers/TranslationHoverProvider.spec.ts +1 -4
  183. package/src/hover/providers/TranslationHoverProvider.ts +3 -3
  184. package/src/index.ts +2 -5
  185. package/src/internal-types.ts +1 -1
  186. package/src/json/JSONContributions.ts +4 -61
  187. package/src/json/JSONLanguageService.ts +19 -117
  188. package/src/json/test/test-helpers.ts +4 -35
  189. package/src/json/utils.ts +0 -27
  190. package/src/progress.ts +4 -1
  191. package/src/rename/RenameProvider.ts +3 -3
  192. package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +4 -4
  193. package/src/rename/providers/LiquidVariableRenameProvider.ts +4 -4
  194. package/src/renamed/RenameHandler.ts +4 -9
  195. package/src/renamed/handlers/AssetRenameHandler.spec.ts +3 -3
  196. package/src/renamed/handlers/AssetRenameHandler.ts +5 -5
  197. package/src/renamed/handlers/PartialRenameHandler.spec.ts +2 -2
  198. package/src/renamed/handlers/PartialRenameHandler.ts +5 -5
  199. package/src/renamed/handlers/utils.ts +1 -1
  200. package/src/server/{ThemeGraphManager.ts → AppGraphManager.ts} +21 -90
  201. package/src/server/Configuration.ts +4 -1
  202. package/src/server/startServer.spec.ts +7 -9
  203. package/src/server/startServer.ts +65 -217
  204. package/src/test/CompletionItemsAssertion.spec.ts +1 -4
  205. package/src/types.ts +33 -63
  206. package/src/utils/liquidDoc.ts +1 -1
  207. package/src/utils/uri.ts +0 -14
  208. package/src/completions/providers/ContentForBlockTypeCompletionProvider.spec.ts +0 -41
  209. package/src/completions/providers/ContentForBlockTypeCompletionProvider.ts +0 -42
  210. package/src/completions/providers/ContentForCompletionProvider.spec.ts +0 -96
  211. package/src/completions/providers/ContentForCompletionProvider.ts +0 -113
  212. package/src/completions/providers/ContentForParameterCompletionProvider.spec.ts +0 -362
  213. package/src/completions/providers/ContentForParameterCompletionProvider.ts +0 -187
  214. package/src/completions/providers/data/contentForParameterCompletionOptions.ts +0 -9
  215. package/src/css/CSSLanguageService.spec.ts +0 -161
  216. package/src/css/test/test-helpers.ts +0 -30
  217. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.spec.ts +0 -96
  218. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.ts +0 -82
  219. package/src/hover/providers/ContentForArgumentHoverProvider.spec.ts +0 -76
  220. package/src/hover/providers/ContentForArgumentHoverProvider.ts +0 -56
  221. package/src/hover/providers/ContentForTypeHoverProvider.spec.ts +0 -91
  222. package/src/hover/providers/ContentForTypeHoverProvider.ts +0 -42
  223. package/src/json/JSONLanguageService.spec.ts +0 -424
  224. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.spec.ts +0 -163
  225. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.ts +0 -121
  226. package/src/json/completions/providers/BlockTypeCompletionProvider.spec.ts +0 -137
  227. package/src/json/completions/providers/BlockTypeCompletionProvider.ts +0 -108
  228. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.spec.ts +0 -132
  229. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.ts +0 -120
  230. package/src/json/completions/providers/SchemaTranslationCompletionProvider.ts +0 -51
  231. package/src/json/completions/providers/SettingsPropertyCompletionProvider.spec.ts +0 -211
  232. package/src/json/completions/providers/SettingsPropertyCompletionProvider.ts +0 -75
  233. package/src/json/documentLinks/DocumentLinksProvider.spec.ts +0 -223
  234. package/src/json/documentLinks/DocumentLinksProvider.ts +0 -61
  235. package/src/json/hover/providers/BlockSettingsHoverProvider.spec.ts +0 -292
  236. package/src/json/hover/providers/BlockSettingsHoverProvider.ts +0 -99
  237. package/src/json/hover/providers/SchemaTranslationHoverProvider.ts +0 -35
  238. package/src/json/hover/providers/SettingsHoverProvider.spec.ts +0 -139
  239. package/src/json/hover/providers/SettingsHoverProvider.ts +0 -79
  240. package/src/json/schemaSettings.spec.ts +0 -103
  241. package/src/json/schemaSettings.ts +0 -53
  242. package/src/plugins/css.ts +0 -12
  243. package/src/renamed/handlers/BlockRenameHandler.spec.ts +0 -399
  244. package/src/renamed/handlers/BlockRenameHandler.ts +0 -402
  245. package/src/renamed/handlers/SectionRenameHandler.spec.ts +0 -321
  246. package/src/renamed/handlers/SectionRenameHandler.ts +0 -224
  247. 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
- }