@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,103 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { getSectionBlockByName, schemaSettingsPropertyCompletionItems } from './schemaSettings';
3
-
4
- describe('Unit: schemaSettings', () => {
5
- const translations = {
6
- title: 'Example Title',
7
- };
8
-
9
- describe('schemaSettingsPropertyCompletionItems', () => {
10
- it('returns completion item if setting has a valid id', () => {
11
- const completions = schemaSettingsPropertyCompletionItems(
12
- [
13
- {
14
- id: 'setting-id',
15
- label: 'Setting Label',
16
- },
17
- ],
18
- translations,
19
- );
20
-
21
- expect(completions).to.have.lengthOf(1);
22
- expect(completions).toContainEqual(
23
- expect.objectContaining({
24
- insertText: '"setting-id"',
25
- documentation: expect.objectContaining({
26
- value: 'Setting Label',
27
- }),
28
- }),
29
- );
30
- });
31
-
32
- it('returns translated completion item', () => {
33
- const completions = schemaSettingsPropertyCompletionItems(
34
- [
35
- {
36
- id: 'setting-id',
37
- label: 't:title',
38
- },
39
- ],
40
-
41
- translations,
42
- );
43
-
44
- expect(completions).to.have.lengthOf(1);
45
- expect(completions).toContainEqual(
46
- expect.objectContaining({
47
- insertText: '"setting-id"',
48
- documentation: expect.objectContaining({
49
- value: 'Example Title',
50
- }),
51
- }),
52
- );
53
- });
54
-
55
- it("does not return completion item if setting doesn't have id", () => {
56
- const completions = schemaSettingsPropertyCompletionItems(
57
- [
58
- {
59
- label: 'Setting Label',
60
- },
61
- ],
62
- translations,
63
- );
64
- expect(completions).to.have.lengthOf(0);
65
- });
66
- });
67
-
68
- describe('getSectionBlockByName', () => {
69
- it('does not return block if parsedSchema is empty', () => {
70
- expect(getSectionBlockByName(undefined, 'block-name')).toBeUndefined();
71
- });
72
-
73
- it('does not return block if it is not a section block is empty', () => {
74
- expect(
75
- getSectionBlockByName(
76
- {
77
- blocks: [
78
- {
79
- type: 'block-name',
80
- },
81
- ],
82
- },
83
- 'block-name',
84
- ),
85
- ).toBeUndefined();
86
- });
87
-
88
- it('does return block if it is a section block is empty', () => {
89
- const block = {
90
- type: 'block-name',
91
- name: 'block name',
92
- };
93
- expect(
94
- getSectionBlockByName(
95
- {
96
- blocks: [block],
97
- },
98
- 'block-name',
99
- ),
100
- ).toBe(block);
101
- });
102
- });
103
- });
@@ -1,53 +0,0 @@
1
- import { CompletionItemKind, MarkupKind } from 'vscode-json-languageservice';
2
- import { renderTranslation, translationValue } from '../translations';
3
- import { Section, Setting, Translations } from '@platformos/platformos-check-common';
4
- import { JSONCompletionItem } from './completions/JSONCompletionProvider';
5
-
6
- export function schemaSettingsPropertyCompletionItems(
7
- parsedSettings: Partial<Setting.Any>[],
8
- translations: Translations,
9
- ): JSONCompletionItem[] {
10
- return parsedSettings
11
- .filter((setting) => setting.id)
12
- .map((setting) => {
13
- let docValue = '';
14
-
15
- if (setting.label) {
16
- if (setting.label.startsWith('t:')) {
17
- const translation = translationValue(setting.label.substring(2), translations);
18
-
19
- if (translation) {
20
- docValue = renderTranslation(translation);
21
- }
22
- } else {
23
- docValue = setting.label;
24
- }
25
- }
26
-
27
- const completionText = setting.id ? `"${setting.id}"` : '';
28
-
29
- return {
30
- kind: CompletionItemKind.Property,
31
- label: completionText,
32
- insertText: completionText,
33
- documentation: {
34
- kind: MarkupKind.Markdown,
35
- value: docValue,
36
- },
37
- };
38
- });
39
- }
40
-
41
- /*
42
- * JSONCompletionProviders have to be more fault tolerant since there can be errors
43
- * while typing the schema. This is why parsedSchemas (untyped) are used instead of
44
- * validSchemas (typed).
45
- */
46
- export function getSectionBlockByName(
47
- parsedSchema: any = {},
48
- blockName: string,
49
- ): Partial<Section.LocalBlock> | undefined {
50
- return parsedSchema.blocks
51
- ?.filter((block: any) => 'name' in block)
52
- ?.find((block: any) => block.type === blockName);
53
- }
@@ -1,12 +0,0 @@
1
- import { getCSSLanguageService, LanguageService } from 'vscode-css-languageservice';
2
-
3
- const cssLanguageService = getCSSLanguageService();
4
-
5
- const languageServices = {
6
- css: cssLanguageService,
7
- };
8
- export type CSSLanguageServices = Record<'css' | 'less' | 'scss', LanguageService>;
9
-
10
- export function getCssLanguageService(kind: 'css'): LanguageService {
11
- return languageServices[kind];
12
- }
@@ -1,399 +0,0 @@
1
- import { MockFileSystem } from '@platformos/platformos-check-common/src/test';
2
- import { assert, beforeEach, describe, expect, it } from 'vitest';
3
- import { TextDocumentEdit } from 'vscode-json-languageservice';
4
- import { ApplyWorkspaceEditParams } from 'vscode-languageserver-protocol';
5
- import { ClientCapabilities } from '../../ClientCapabilities';
6
- import { DocumentManager } from '../../documents';
7
- import { MockConnection, mockConnection } from '../../test/MockConnection';
8
- import { RenameHandler } from '../RenameHandler';
9
-
10
- describe('Module: BlockRenameHandler', () => {
11
- const mockRoot = 'mock-fs:';
12
- const findThemeRootURI = async () => mockRoot;
13
- let capabilities: ClientCapabilities;
14
- let documentManager: DocumentManager;
15
- let handler: RenameHandler;
16
- let connection: MockConnection;
17
- let fs: MockFileSystem;
18
-
19
- beforeEach(() => {
20
- connection = mockConnection(mockRoot);
21
- connection.spies.sendRequest.mockReturnValue(Promise.resolve(true));
22
- capabilities = new ClientCapabilities();
23
- fs = new MockFileSystem(
24
- {
25
- 'blocks/other-block.liquid': ``,
26
- 'blocks/old-name.liquid': `
27
- {% schema %}
28
- {
29
- "name": "Old Block",
30
- "blocks": [{ "type": "other-block" }],
31
- "presets": [{
32
- "name": "Default",
33
- "blocks": [{
34
- "type": "other-block"
35
- }]
36
- }]
37
- }
38
- {% endschema %}`,
39
-
40
- 'sections/section.liquid': `
41
- <div>{% content_for "block", id: "old-name-id", type: "old-name" %}</div>
42
- {% schema %}
43
- {
44
- "name": "Section",
45
- "blocks": [{ "type": "old-name" }],
46
- "presets": [
47
- {
48
- "name": "Default",
49
- "blocks": [
50
- {
51
- "type": "old-name",
52
- "blocks": [{ "type": "other-block" }]
53
- }
54
- ]
55
- }
56
- ]
57
- }
58
- {% endschema %}`,
59
-
60
- 'sections/header.json': `
61
- {
62
- "type": "header",
63
- "name": "Header",
64
- "sections": {
65
- "section-id": {
66
- "type": "section",
67
- "blocks": {
68
- "old-name-id": {
69
- "type": "old-name"
70
- }
71
- },
72
- "block_order": ["old-name-id"]
73
- }
74
- },
75
- "order": ["section-id"]
76
- }`,
77
-
78
- 'templates/index.json': `
79
- {
80
- "sections": {
81
- "section-id": {
82
- "type": "section",
83
- "blocks": {
84
- "old-name-id": {
85
- "type": "old-name"
86
- }
87
- },
88
- "block_order": ["old-name-id"]
89
- }
90
- },
91
- "order": ["section-id"]
92
- }`,
93
- },
94
- mockRoot,
95
- );
96
- documentManager = new DocumentManager(
97
- fs, // filesystem
98
- undefined, // optional mode getter
99
- undefined, // optional mode map
100
- async () => 'theme', // getModeForURI
101
- async () => true, // isValidSchema - assume all schemas are valid in tests
102
- );
103
- handler = new RenameHandler(connection, capabilities, documentManager, findThemeRootURI);
104
- });
105
-
106
- describe('when the client does not support workspace/applyEdit', () => {
107
- beforeEach(() => {
108
- capabilities.setup({
109
- workspace: {
110
- applyEdit: false,
111
- },
112
- });
113
- });
114
-
115
- it('does nothing', async () => {
116
- await handler.onDidRenameFiles({
117
- files: [
118
- {
119
- oldUri: 'mock-fs:/blocks/old-name.liquid',
120
- newUri: 'mock-fs:/blocks/new-name.liquid',
121
- },
122
- ],
123
- });
124
- expect(connection.spies.sendRequest).not.toHaveBeenCalled();
125
- });
126
- });
127
-
128
- describe('when the client supports workspace/applyEdit', () => {
129
- beforeEach(() => {
130
- capabilities.setup({
131
- workspace: {
132
- applyEdit: true,
133
- },
134
- });
135
- });
136
-
137
- it('returns a needConfirmation: false workspace edit for renaming a block', async () => {
138
- await handler.onDidRenameFiles({
139
- files: [
140
- {
141
- oldUri: 'mock-fs:/blocks/old-name.liquid',
142
- newUri: 'mock-fs:/blocks/new-name.liquid',
143
- },
144
- ],
145
- });
146
-
147
- const replaceWithNewNameTextEditAtAnyLocation = {
148
- annotationId: 'renameBlock',
149
- newText: 'new-name',
150
- range: {
151
- start: expect.any(Object),
152
- end: expect.any(Object),
153
- },
154
- };
155
-
156
- const templateTextEdits = [
157
- // Block type is updated in the section blocks array
158
- replaceWithNewNameTextEditAtAnyLocation,
159
- ];
160
-
161
- const sectionGroupTextEdits = [
162
- // Block type is updated in the section blocks array,
163
- replaceWithNewNameTextEditAtAnyLocation,
164
- ];
165
-
166
- const sectionFileTextEdits = [
167
- // In the content_for
168
- replaceWithNewNameTextEditAtAnyLocation,
169
- // In the blocks definition
170
- replaceWithNewNameTextEditAtAnyLocation,
171
- // In the presets
172
- replaceWithNewNameTextEditAtAnyLocation,
173
- ];
174
-
175
- expect(connection.spies.sendRequest).toHaveBeenCalledWith('workspace/applyEdit', {
176
- label: "Rename block 'old-name' to 'new-name'",
177
- edit: {
178
- changeAnnotations: {
179
- renameBlock: {
180
- label: `Rename block 'old-name' to 'new-name'`,
181
- needsConfirmation: false,
182
- },
183
- },
184
- documentChanges: expect.arrayContaining([
185
- {
186
- textDocument: {
187
- uri: 'mock-fs:/sections/section.liquid',
188
- version: null,
189
- },
190
- edits: sectionFileTextEdits,
191
- },
192
- {
193
- textDocument: {
194
- uri: 'mock-fs:/templates/index.json',
195
- version: null,
196
- },
197
- edits: templateTextEdits,
198
- },
199
- {
200
- textDocument: {
201
- uri: 'mock-fs:/sections/header.json',
202
- version: null,
203
- },
204
- edits: sectionGroupTextEdits,
205
- },
206
- ]),
207
- },
208
- });
209
- });
210
-
211
- it('replaces the correct text in the documents', async () => {
212
- await handler.onDidRenameFiles({
213
- files: [
214
- {
215
- oldUri: 'mock-fs:/blocks/old-name.liquid',
216
- newUri: 'mock-fs:/blocks/new-name.liquid',
217
- },
218
- ],
219
- });
220
-
221
- const params: ApplyWorkspaceEditParams = connection.spies.sendRequest.mock.calls[0][1];
222
- const expectedFs = new MockFileSystem(
223
- {
224
- 'blocks/new-name.liquid': `
225
- {% schema %}
226
- {
227
- "name": "Old Block",
228
- "blocks": [{ "type": "other-block" }],
229
- "presets": [{
230
- "name": "Default",
231
- "blocks": [{
232
- "type": "other-block"
233
- }]
234
- }]
235
- }
236
- {% endschema %}`,
237
-
238
- // The old-name block type is updated, but not the id.
239
- 'sections/section.liquid': `
240
- <div>{% content_for "block", id: "old-name-id", type: "new-name" %}</div>
241
- {% schema %}
242
- {
243
- "name": "Section",
244
- "blocks": [{ "type": "new-name" }],
245
- "presets": [
246
- {
247
- "name": "Default",
248
- "blocks": [
249
- {
250
- "type": "new-name",
251
- "blocks": [{ "type": "other-block" }]
252
- }
253
- ]
254
- }
255
- ]
256
- }
257
- {% endschema %}`,
258
-
259
- 'sections/header.json': `
260
- {
261
- "type": "header",
262
- "name": "Header",
263
- "sections": {
264
- "section-id": {
265
- "type": "section",
266
- "blocks": {
267
- "old-name-id": {
268
- "type": "new-name"
269
- }
270
- },
271
- "block_order": ["old-name-id"]
272
- }
273
- },
274
- "order": ["section-id"]
275
- }`,
276
-
277
- // The old-name-id's block type is updated, but not the id.
278
- // This isn't a regex search and replace.
279
- 'templates/index.json': `
280
- {
281
- "sections": {
282
- "section-id": {
283
- "type": "section",
284
- "blocks": {
285
- "old-name-id": {
286
- "type": "new-name"
287
- }
288
- },
289
- "block_order": ["old-name-id"]
290
- }
291
- },
292
- "order": ["section-id"]
293
- }`,
294
- },
295
- mockRoot,
296
- );
297
-
298
- assert(params.edit);
299
- assert(params.edit.documentChanges);
300
-
301
- for (const docChange of params.edit.documentChanges) {
302
- assert(TextDocumentEdit.is(docChange));
303
- const uri = docChange.textDocument.uri;
304
- const edits = docChange.edits;
305
- const initialDoc = await fs.readFile(uri);
306
- const expectedDoc = await expectedFs.readFile(uri);
307
- expect(edits).to.applyEdits(initialDoc, expectedDoc);
308
- }
309
- });
310
-
311
- it('preserves local block definitions', async () => {
312
- fs = new MockFileSystem(
313
- {
314
- // a "theme" text block exists
315
- 'blocks/text.liquid': `
316
- {% schema %}
317
- { "name": "text block" }
318
- {% endschema %}`,
319
-
320
- // this section uses a local block of type "text"
321
- 'sections/local.liquid': `
322
- {% schema %}
323
- {
324
- "name": "Section with local blocks",
325
- "blocks": [
326
- {
327
- "type": "text",
328
- "name": "Local text block"
329
- }
330
- ],
331
- "presets": [
332
- {
333
- "name": "Because text is a local block definition, this preset won't get a rename",
334
- "blocks": [
335
- { "type": "text" }
336
- ]
337
- }
338
- ]
339
- }
340
- {% endschema %}`,
341
-
342
- // This section group uses the local section that uses the local block, no rename needed
343
- 'sections/header.json': JSON.stringify({
344
- type: 'header',
345
- name: 'Header',
346
- sections: {
347
- local_id: {
348
- type: 'local',
349
- blocks: {
350
- text_tqQTNE: {
351
- type: 'text',
352
- },
353
- },
354
- block_order: ['text_tqQTNE'],
355
- },
356
- },
357
- order: ['local_id'],
358
- }),
359
-
360
- // This template uses the section that uses the local block, no rename needed
361
- 'templates/index.json': JSON.stringify({
362
- sections: {
363
- local: {
364
- type: 'local',
365
- blocks: {
366
- text_tqQTNE: {
367
- type: 'text',
368
- },
369
- },
370
- block_order: ['text_tqQTNE'],
371
- },
372
- },
373
- }),
374
- },
375
- mockRoot,
376
- );
377
- documentManager = new DocumentManager(
378
- fs,
379
- undefined,
380
- undefined,
381
- async () => 'theme',
382
- async () => true,
383
- );
384
- handler = new RenameHandler(connection, capabilities, documentManager, findThemeRootURI);
385
-
386
- await handler.onDidRenameFiles({
387
- files: [
388
- {
389
- oldUri: 'mock-fs:/blocks/text.liquid',
390
- newUri: 'mock-fs:/blocks/poetry.liquid',
391
- },
392
- ],
393
- });
394
-
395
- // Check if sendRequest was called at all
396
- expect(connection.spies.sendRequest).not.toHaveBeenCalled();
397
- });
398
- });
399
- });