@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,424 +0,0 @@
1
- import { Mode, Translations } from '@platformos/platformos-check-common';
2
- import { assert, beforeEach, describe, expect, it } from 'vitest';
3
- import { DocumentManager } from '../documents';
4
- import { JSONLanguageService } from './JSONLanguageService';
5
- import { getRequestParams, isCompletionList } from './test/test-helpers';
6
-
7
- const simplifiedSectionSchema = JSON.stringify({
8
- $schema: 'http://json-schema.org/draft-07/schema#',
9
- type: 'object',
10
- additionalProperties: false,
11
- properties: {
12
- name: {
13
- type: 'string',
14
- description: 'The section title shown in the theme editor',
15
- },
16
- class: {
17
- type: 'string',
18
- description: 'Additional CSS class for the section',
19
- },
20
- disabled_on: {
21
- type: 'string',
22
- },
23
- },
24
- });
25
-
26
- const simplifiedTaeBlockSchema = JSON.stringify({
27
- $schema: 'http://json-schema.org/draft-07/schema#',
28
- type: 'object',
29
- additionalProperties: false,
30
- properties: {
31
- name: {
32
- type: 'string',
33
- description: 'The section title shown in the theme editor',
34
- },
35
- class: {
36
- type: 'string',
37
- description: 'Additional CSS class for the section',
38
- },
39
- javascript: {
40
- type: 'string',
41
- description: 'Haha this one is different',
42
- },
43
- },
44
- });
45
-
46
- const simplifiedTranslationSchema = JSON.stringify({
47
- $schema: 'https://json-schema.org/draft/2020-12/schema',
48
- type: 'object',
49
- additionalProperties: {
50
- oneOf: [
51
- {
52
- type: 'string',
53
- },
54
- {
55
- $ref: '#/$defs/pluralizedString',
56
- },
57
- {
58
- $ref: '#',
59
- },
60
- ],
61
- },
62
- $defs: {
63
- pluralizedString: {
64
- type: 'object',
65
- properties: {
66
- one: {
67
- type: 'string',
68
- description: 'Translation for the singular form',
69
- },
70
- other: {
71
- type: 'string',
72
- description: 'Translation for the plural form',
73
- },
74
- },
75
- additionalProperties: false,
76
- description: 'An object representing a pluralized translation string',
77
- },
78
- },
79
- });
80
-
81
- describe('Module: JSONLanguageService', () => {
82
- let jsonLanguageService: JSONLanguageService;
83
- let documentManager: DocumentManager;
84
- let schemaTranslations: Translations;
85
-
86
- beforeEach(async () => {
87
- schemaTranslations = {};
88
- documentManager = new DocumentManager(
89
- undefined,
90
- undefined,
91
- undefined,
92
- async () => 'theme', // theme schema
93
- async () => false, // invalid
94
- );
95
- jsonLanguageService = new JSONLanguageService(
96
- documentManager,
97
- {
98
- schemas: async (mode: Mode) => [
99
- {
100
- uri: 'https://shopify.dev/section-schema.json',
101
- schema: simplifiedSectionSchema,
102
- fileMatch: ['**/sections/*.liquid'],
103
- },
104
- {
105
- uri: 'https://shopify.dev/translation-schema.json',
106
- schema: simplifiedTranslationSchema,
107
- fileMatch: ['**/locales/*.json'],
108
- },
109
- {
110
- uri:
111
- mode === 'theme'
112
- ? 'https://shopify.dev/block-schema.json'
113
- : 'https://shopify.dev/block-tae-schema.json',
114
- schema: mode === 'theme' ? simplifiedSectionSchema : simplifiedTaeBlockSchema,
115
- fileMatch: ['**/blocks/*.liquid'],
116
- },
117
- ],
118
- },
119
- () => Promise.resolve(schemaTranslations),
120
- (uri: string) => Promise.resolve(uri.includes('tae') ? 'app' : 'theme'),
121
- () => Promise.resolve([]),
122
- async () => undefined,
123
- async () => 'file:///test-root',
124
- );
125
-
126
- await jsonLanguageService.setup({
127
- textDocument: {
128
- completion: {
129
- contextSupport: true,
130
- completionItem: {
131
- snippetSupport: true,
132
- commitCharactersSupport: true,
133
- documentationFormat: ['markdown'],
134
- deprecatedSupport: true,
135
- preselectSupport: true,
136
- },
137
- },
138
- },
139
- });
140
- });
141
-
142
- describe('completions', () => {
143
- it('should return section JSON schema completions in a section file {% schema %}', async () => {
144
- const params = getRequestParams(
145
- documentManager,
146
- 'sections/section.liquid',
147
- `
148
- <div>hello world</div>
149
- {% schema %}
150
- {
151
- "name": "My section",
152
- "█"
153
- }
154
- {% endschema %}
155
- `,
156
- );
157
-
158
- const completions = await jsonLanguageService.completions(params);
159
- assert(isCompletionList(completions));
160
- expect(completions.items).to.have.lengthOf(2);
161
- expect(completions.items[0].label).to.equal('class');
162
- expect(completions.items[0].documentation).to.equal('Additional CSS class for the section');
163
- });
164
-
165
- it('should return translation key completions in a theme translation file', async () => {
166
- const paths = [
167
- 'locales/en.default.json',
168
- 'locales/en.default.schema.json',
169
- 'locales/fr.json',
170
- 'locales/fr.schema.json',
171
- ];
172
- for (const path of paths) {
173
- const params = getRequestParams(
174
- documentManager,
175
- path,
176
- `
177
- {
178
- "general": {
179
- "hello": {
180
- "other": "hey folks",
181
- "█"
182
- }
183
- }
184
- }
185
- `,
186
- );
187
- const completions = await jsonLanguageService.completions(params);
188
- assert(isCompletionList(completions));
189
- expect(completions.items).to.have.lengthOf(1);
190
- expect(completions.items[0].label).to.equal('one');
191
- expect(completions.items[0].documentation).to.eql('Translation for the singular form');
192
- }
193
- });
194
-
195
- it('should be possible to offer theme app extension completions in app contexts, and theme completions in theme contexts for blocks', async () => {
196
- const testContexts: [Mode, string, string[]][] = [
197
- ['theme', 'theme/blocks/block.liquid', ['class', 'disabled_on']],
198
- ['app', 'tae/blocks/block.liquid', ['class', 'javascript']],
199
- ];
200
- for (const [mode, path, expectedRecommendations] of testContexts) {
201
- const params = getRequestParams(
202
- documentManager,
203
- path,
204
- `
205
- <div>hello world</div>
206
- {% schema %}
207
- {
208
- "name": "My section",
209
- "█"
210
- }
211
- {% endschema %}
212
- `,
213
- );
214
-
215
- const completions = await jsonLanguageService.completions(params);
216
- assert(isCompletionList(completions));
217
- expect(completions.items).to.have.lengthOf(expectedRecommendations.length);
218
- expect(completions.items).toEqual(
219
- expectedRecommendations.map((recommendation) =>
220
- expect.objectContaining({ label: recommendation }),
221
- ),
222
- );
223
- }
224
- });
225
-
226
- it('should complete t:translations', async () => {
227
- schemaTranslations = {
228
- general: {
229
- hello: 'hello world',
230
- hi: 'hi world',
231
- },
232
- };
233
-
234
- const params = getRequestParams(
235
- documentManager,
236
- 'sections/section.liquid',
237
- `
238
- <div>hello world</div>
239
- {% schema %}
240
- {
241
- "name": "t:█"
242
- }
243
- {% endschema %}
244
- `,
245
- );
246
-
247
- const completions = await jsonLanguageService.completions(params);
248
- assert(isCompletionList(completions));
249
- expect(completions.items).to.have.lengthOf(2);
250
- expect(completions.items[0].label).to.equal('t:general.hello');
251
- expect(completions.items[0].documentation).to.eql({
252
- kind: 'markdown',
253
- value: 'hello world',
254
- });
255
- });
256
- });
257
-
258
- describe('hover', () => {
259
- it('should return the translation value of a t:translation', async () => {
260
- schemaTranslations = {
261
- general: {
262
- hello: 'hello world',
263
- },
264
- };
265
- const params = getRequestParams(
266
- documentManager,
267
- 'sections/section.liquid',
268
- `
269
- <div>hello world</div>
270
- {% schema %}
271
- {
272
- "name": "t:general.hello█"
273
- }
274
- {% endschema %}
275
- `,
276
- );
277
- const hover = await jsonLanguageService.hover(params);
278
- assert(hover !== null);
279
- expect(hover.contents).to.eql(['hello world']);
280
- });
281
-
282
- it('should return the path of a translation key in a theme translation file', async () => {
283
- const paths = ['locales/en.default.json', 'locales/fr.json'];
284
- for (const path of paths) {
285
- const params = getRequestParams(
286
- documentManager,
287
- path,
288
- `
289
- {
290
- "general": {
291
- "hello█": "world"
292
- }
293
- }
294
- `,
295
- );
296
- const hover = await jsonLanguageService.hover(params);
297
- assert(hover !== null);
298
- expect(hover.contents).to.eql([{ language: 'liquid', value: `{{ 'general.hello' | t }}` }]);
299
- }
300
- });
301
-
302
- it('should return add interpolated variables to the hover', async () => {
303
- const paths = ['locales/en.default.json', 'locales/fr.json'];
304
- for (const path of paths) {
305
- const params = getRequestParams(
306
- documentManager,
307
- path,
308
- `
309
- {
310
- "general": {
311
- "hello█": " {{ var1 }} world {{ var2 }}"
312
- }
313
- }
314
- `,
315
- );
316
- const hover = await jsonLanguageService.hover(params);
317
- assert(hover !== null);
318
- expect(hover.contents).to.eql([
319
- { language: 'liquid', value: `{{ 'general.hello' | t: var1: var1, var2: var2 }}` },
320
- ]);
321
- }
322
- });
323
-
324
- it('should return translation group hover for non-leaf nodes', async () => {
325
- const paths = ['locales/en.default.json', 'locales/fr.json'];
326
- for (const path of paths) {
327
- const params = getRequestParams(
328
- documentManager,
329
- path,
330
- `
331
- {
332
- "general█": {
333
- "hello": " {{ var1 }} world {{ var2 }}"
334
- }
335
- }
336
- `,
337
- );
338
- const hover = await jsonLanguageService.hover(params);
339
- assert(hover !== null);
340
- expect(hover.contents).to.eql([`Translation group: general`]);
341
- }
342
- });
343
-
344
- it('should return the parent translation key for pluralized translations', async () => {
345
- const paths = ['locales/en.default.json', 'locales/fr.json'];
346
- for (const path of paths) {
347
- const params = getRequestParams(
348
- documentManager,
349
- path,
350
- `
351
- {
352
- "general": {
353
- "one█": " {{ var1 }} world"
354
- }
355
- }
356
- `,
357
- );
358
- const hover = await jsonLanguageService.hover(params);
359
- assert(hover !== null);
360
- expect(hover.contents).to.eql([
361
- { language: 'liquid', value: `{{ 'general' | t: var1: var1 }}` },
362
- ]);
363
- }
364
- });
365
-
366
- it('should return the t:path of a translation key in a schema translation file', async () => {
367
- const paths = ['locales/en.default.schema.json', 'locales/fr.schema.json'];
368
- for (const path of paths) {
369
- const params = getRequestParams(
370
- documentManager,
371
- path,
372
- `
373
- {
374
- "general": {
375
- "hello█": "world"
376
- }
377
- }
378
- `,
379
- );
380
- const hover = await jsonLanguageService.hover(params);
381
- assert(hover !== null);
382
- expect(hover.contents).to.eql([{ language: 'json', value: `"t:general.hello"` }]);
383
- }
384
- });
385
- });
386
-
387
- describe('isValidSchema', () => {
388
- it('should return true for a valid schema', async () => {
389
- const params = getRequestParams(
390
- documentManager,
391
- 'sections/section.liquid',
392
- `
393
- <div>hello world</div>
394
- {% schema %}
395
- { "name": "hello world" }
396
- {% endschema %}
397
- `,
398
- );
399
- const isValid = await jsonLanguageService.isValidSchema(
400
- params.textDocument.uri,
401
- '{ "name": "hello world" }',
402
- );
403
- expect(isValid).to.be.true;
404
- });
405
-
406
- it('should return false for an invalid schema', async () => {
407
- const params = getRequestParams(
408
- documentManager,
409
- 'sections/section.liquid',
410
- `
411
- <div>hello world</div>
412
- {% schema %}
413
- { "invalid": true }
414
- {% endschema %}
415
- `,
416
- );
417
- const isValid = await jsonLanguageService.isValidSchema(
418
- params.textDocument.uri,
419
- '{ "invalid": true }',
420
- );
421
- expect(isValid).to.be.false;
422
- });
423
- });
424
- });
@@ -1,163 +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: BlockSettingsPropertyCompletionProvider', () => {
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: 'presets',
53
- schemaTemplate: (referencedBlock: object) => {
54
- return {
55
- presets: [
56
- {
57
- blocks: [referencedBlock],
58
- },
59
- ],
60
- };
61
- },
62
- },
63
- {
64
- label: 'default',
65
- schemaTemplate: (referencedBlock: object) => {
66
- return {
67
- default: {
68
- blocks: [referencedBlock],
69
- },
70
- };
71
- },
72
- },
73
- ];
74
-
75
- for (const test of tests) {
76
- describe(`${test.label} block settings`, () => {
77
- beforeEach(() => {
78
- const testBlockSchema = {
79
- settings: [
80
- { id: 'custom-setting', label: 'Custom Setting' },
81
- { id: 'fake-setting', label: 't:general.fake' },
82
- { id: 'no-label' },
83
- { nope: 'no-id' },
84
- ],
85
- };
86
- documentManager.open(`${rootUri}/blocks/test-block.liquid`, toSource(testBlockSchema), 1);
87
- documentManager.open(`${rootUri}/blocks/no-settings-block.liquid`, toSource({}), 1);
88
- });
89
-
90
- it(`completes ${test.label} block settings property when settings exist`, async () => {
91
- const schema = {
92
- ...test.schemaTemplate({
93
- type: 'test-block',
94
- settings: {
95
- '█': '',
96
- },
97
- }),
98
- };
99
- const params = getRequestParams(
100
- documentManager,
101
- 'sections/section.liquid',
102
- toSource(schema),
103
- );
104
- const completions = await jsonLanguageService.completions(params);
105
-
106
- assert(isCompletionList(completions));
107
- expect(completions.items).to.have.lengthOf(3);
108
- expect(completions.items).toContainEqual(
109
- expect.objectContaining({
110
- insertText: `"custom-setting"`,
111
- documentation: expect.objectContaining({
112
- value: 'Custom Setting',
113
- }),
114
- }),
115
- );
116
- expect(completions.items).toContainEqual(
117
- expect.objectContaining({
118
- insertText: `"fake-setting"`,
119
- documentation: expect.objectContaining({
120
- value: 'Fake Setting',
121
- }),
122
- }),
123
- );
124
- expect(completions.items).toContainEqual(
125
- expect.objectContaining({
126
- insertText: `"no-label"`,
127
- documentation: expect.objectContaining({
128
- value: '',
129
- }),
130
- }),
131
- );
132
- });
133
-
134
- it(`offers no suggestions for ${test.label} block settings property when there are no settings`, async () => {
135
- const schema = {
136
- ...test.schemaTemplate({
137
- type: 'no-settings-block',
138
- settings: {
139
- '█': '',
140
- },
141
- }),
142
- };
143
- const source = `
144
- {% schema %}
145
- ${JSON.stringify(schema)}
146
- {% endschema %}
147
- `;
148
- const params = getRequestParams(documentManager, 'sections/section.liquid', source);
149
- const completions = await jsonLanguageService.completions(params);
150
-
151
- assert(isCompletionList(completions));
152
- expect(completions.items).to.have.lengthOf(0);
153
- });
154
- });
155
- }
156
- });
157
- });
158
-
159
- function toSource(schema: object) {
160
- return `{% schema %}
161
- ${JSON.stringify(schema)}
162
- {% endschema %}`;
163
- }
@@ -1,121 +0,0 @@
1
- import { JSONPath } from 'vscode-json-languageservice';
2
- import { GetThemeBlockSchema } from '../../JSONContributions';
3
- import { RequestContext } from '../../RequestContext';
4
- import { JSONCompletionItem, JSONCompletionProvider } from '../JSONCompletionProvider';
5
- import { isBlockFile, isSectionFile } from '../../utils';
6
- import { deepGet, isError, SourceCodeType } from '@platformos/platformos-check-common';
7
- import { isSectionOrBlockSchema } from './BlockTypeCompletionProvider';
8
- import { GetTranslationsForURI } from '../../../translations';
9
- import { getSectionBlockByName, schemaSettingsPropertyCompletionItems } from '../../schemaSettings';
10
-
11
- /**
12
- * The BlockSettingsPropertyCompletionProvider offers value completions of the
13
- * `presets.[].(recursive blocks.[]).settings` keys and `defaults.blocks.[].settings` keys inside
14
- * `{% schema %}` tags.
15
- *
16
- * @example
17
- * {% schema %}
18
- * {
19
- * "presets": [
20
- * {
21
- * "blocks": [
22
- * {
23
- * "type": "block-type",
24
- * "settings": {
25
- * "█"
26
- * }
27
- * },
28
- * ]
29
- * },
30
- * ],
31
- * "default": {
32
- * "blocks": [
33
- * {
34
- * "type": "block-type",
35
- * "settings": {
36
- * "█"
37
- * }
38
- * },
39
- * ]
40
- * }
41
- * }
42
- * {% endschema %}
43
- */
44
- export class BlockSettingsPropertyCompletionProvider implements JSONCompletionProvider {
45
- constructor(
46
- private getDefaultSchemaTranslations: GetTranslationsForURI,
47
- private getThemeBlockSchema: GetThemeBlockSchema,
48
- ) {}
49
-
50
- async completeProperty(context: RequestContext, path: JSONPath): Promise<JSONCompletionItem[]> {
51
- const { doc } = context;
52
-
53
- if (doc.type !== SourceCodeType.LiquidHtml) return [];
54
-
55
- // section files can have schemas with `presets` and `default`
56
- // block files can have schemas with `presets` only
57
- if (
58
- !(
59
- isSectionFile(doc.uri) &&
60
- (isPresetsBlocksSettingsPath(path) || isDefaultBlocksSettingsPath(path))
61
- ) &&
62
- !(isBlockFile(doc.uri) && isPresetsBlocksSettingsPath(path))
63
- ) {
64
- return [];
65
- }
66
-
67
- const schema = await doc.getSchema();
68
-
69
- if (!schema || !isSectionOrBlockSchema(schema) || isError(schema.parsed)) {
70
- return [];
71
- }
72
-
73
- const blockType: string = deepGet(schema.parsed, [...path.slice(0, -1), 'type']);
74
-
75
- if (!blockType) {
76
- return [];
77
- }
78
-
79
- const translations = await this.getDefaultSchemaTranslations(doc.textDocument.uri);
80
-
81
- const localBlock = getSectionBlockByName(schema.parsed, blockType);
82
-
83
- if (localBlock) {
84
- if (localBlock.settings) {
85
- return schemaSettingsPropertyCompletionItems(localBlock.settings, translations);
86
- }
87
- } else {
88
- const blockOriginSchema = await this.getThemeBlockSchema(doc.uri, blockType);
89
-
90
- if (
91
- !blockOriginSchema ||
92
- isError(blockOriginSchema.parsed) ||
93
- !isSectionOrBlockSchema(blockOriginSchema)
94
- ) {
95
- return [];
96
- }
97
-
98
- if (
99
- !blockOriginSchema.parsed?.settings ||
100
- !Array.isArray(blockOriginSchema.parsed?.settings)
101
- ) {
102
- return [];
103
- }
104
-
105
- return schemaSettingsPropertyCompletionItems(blockOriginSchema.parsed.settings, translations);
106
- }
107
-
108
- return [];
109
- }
110
- }
111
-
112
- // `blocks` can be nested within other `blocks`
113
- // We need to ensure the last leg of the path is { "blocks": [{ "settings": { "█" } }] }
114
- function isPresetsBlocksSettingsPath(path: JSONPath) {
115
- return path.at(0) === 'presets' && path.at(-3) === 'blocks' && path.at(-1) === 'settings';
116
- }
117
-
118
- // `blocks` inside `default` can't be nested within other `blocks`
119
- function isDefaultBlocksSettingsPath(path: JSONPath) {
120
- return path.at(0) === 'default' && path.at(1) === 'blocks' && path.at(3) === 'settings';
121
- }