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