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