@platformos/platformos-language-server-common 0.0.7 → 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 (239) hide show
  1. package/CHANGELOG.md +10 -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/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 +4 -16
  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 +12 -11
  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 +0 -8
  120. package/dist/utils/uri.js +1 -17
  121. package/dist/utils/uri.js.map +1 -1
  122. package/package.json +4 -4
  123. package/src/PropertyShapeInference.ts +76 -1
  124. package/src/TypeSystem.spec.ts +188 -450
  125. package/src/TypeSystem.ts +251 -457
  126. package/src/completions/CompletionsProvider.ts +13 -34
  127. package/src/completions/params/LiquidCompletionParams.spec.ts +0 -9
  128. package/src/completions/params/LiquidCompletionParams.ts +4 -14
  129. package/src/completions/params/fix.spec.ts +0 -3
  130. package/src/completions/providers/FilterCompletionProvider.spec.ts +2 -8
  131. package/src/completions/providers/FilterNamedParameterCompletionProvider.spec.ts +1 -5
  132. package/src/completions/providers/FilterNamedParameterCompletionProvider.ts +6 -6
  133. package/src/completions/providers/HtmlAttributeCompletionProvider.spec.ts +1 -4
  134. package/src/completions/providers/HtmlAttributeValueCompletionProvider.spec.ts +1 -4
  135. package/src/completions/providers/HtmlTagCompletionProvider.spec.ts +1 -4
  136. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.spec.ts +1 -28
  137. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.ts +3 -3
  138. package/src/completions/providers/LiquidDocTagCompletionProvider.spec.ts +1 -26
  139. package/src/completions/providers/LiquidTagsCompletionProvider.spec.ts +2 -16
  140. package/src/completions/providers/LiquidTagsCompletionProvider.ts +3 -3
  141. package/src/completions/providers/ObjectAttributeCompletionProvider.spec.ts +2 -31
  142. package/src/completions/providers/ObjectCompletionProvider.spec.ts +34 -123
  143. package/src/completions/providers/PartialCompletionProvider.spec.ts +4 -13
  144. package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +3 -5
  145. package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +0 -1
  146. package/src/completions/providers/TranslationCompletionProvider.spec.ts +1 -4
  147. package/src/completions/providers/index.ts +0 -3
  148. package/src/css/CSSLanguageService.ts +97 -81
  149. package/src/definitions/DefinitionProvider.ts +0 -6
  150. package/src/definitions/providers/TranslationStringDefinitionProvider.spec.ts +1 -5
  151. package/src/diagnostics/offenseToDiagnostic.ts +1 -1
  152. package/src/diagnostics/runChecks.spec.ts +16 -24
  153. package/src/diagnostics/runChecks.ts +17 -91
  154. package/src/docset/MarkdownRenderer.ts +1 -1
  155. package/src/documentLinks/DocumentLinksProvider.ts +3 -3
  156. package/src/documents/DocumentManager.spec.ts +12 -97
  157. package/src/documents/DocumentManager.ts +13 -14
  158. package/src/documents/types.ts +18 -9
  159. package/src/hover/HoverProvider.ts +9 -21
  160. package/src/hover/providers/HtmlAttributeHoverProvider.spec.ts +1 -3
  161. package/src/hover/providers/HtmlAttributeValueHoverProvider.spec.ts +1 -3
  162. package/src/hover/providers/HtmlTagHoverProvider.spec.ts +1 -3
  163. package/src/hover/providers/LiquidDocTagHoverProvider.spec.ts +0 -3
  164. package/src/hover/providers/LiquidFilterArgumentHoverProvider.spec.ts +0 -3
  165. package/src/hover/providers/LiquidFilterArgumentHoverProvider.ts +3 -3
  166. package/src/hover/providers/LiquidFilterHoverProvider.spec.ts +0 -3
  167. package/src/hover/providers/LiquidFilterHoverProvider.ts +3 -3
  168. package/src/hover/providers/LiquidObjectAttributeHoverProvider.spec.ts +1 -3
  169. package/src/hover/providers/LiquidObjectHoverProvider.spec.ts +46 -129
  170. package/src/hover/providers/LiquidTagHoverProvider.spec.ts +0 -3
  171. package/src/hover/providers/LiquidTagHoverProvider.ts +3 -3
  172. package/src/hover/providers/RenderPartialHoverProvider.spec.ts +1 -4
  173. package/src/hover/providers/RenderPartialHoverProvider.ts +1 -5
  174. package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +1 -4
  175. package/src/hover/providers/RenderPartialParameterHoverProvider.ts +0 -1
  176. package/src/hover/providers/TranslationHoverProvider.spec.ts +1 -4
  177. package/src/hover/providers/TranslationHoverProvider.ts +3 -3
  178. package/src/index.ts +2 -5
  179. package/src/internal-types.ts +1 -1
  180. package/src/json/JSONContributions.ts +4 -61
  181. package/src/json/JSONLanguageService.ts +19 -117
  182. package/src/json/test/test-helpers.ts +4 -35
  183. package/src/json/utils.ts +0 -27
  184. package/src/rename/RenameProvider.ts +3 -3
  185. package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +4 -4
  186. package/src/rename/providers/LiquidVariableRenameProvider.ts +4 -4
  187. package/src/renamed/RenameHandler.ts +4 -9
  188. package/src/renamed/handlers/AssetRenameHandler.spec.ts +3 -3
  189. package/src/renamed/handlers/AssetRenameHandler.ts +5 -5
  190. package/src/renamed/handlers/PartialRenameHandler.spec.ts +2 -2
  191. package/src/renamed/handlers/PartialRenameHandler.ts +5 -5
  192. package/src/renamed/handlers/utils.ts +1 -1
  193. package/src/server/{ThemeGraphManager.ts → AppGraphManager.ts} +21 -90
  194. package/src/server/startServer.spec.ts +7 -9
  195. package/src/server/startServer.ts +65 -217
  196. package/src/test/CompletionItemsAssertion.spec.ts +1 -4
  197. package/src/types.ts +33 -63
  198. package/src/utils/liquidDoc.ts +1 -1
  199. package/src/utils/uri.ts +0 -14
  200. package/src/completions/providers/ContentForBlockTypeCompletionProvider.spec.ts +0 -41
  201. package/src/completions/providers/ContentForBlockTypeCompletionProvider.ts +0 -42
  202. package/src/completions/providers/ContentForCompletionProvider.spec.ts +0 -96
  203. package/src/completions/providers/ContentForCompletionProvider.ts +0 -113
  204. package/src/completions/providers/ContentForParameterCompletionProvider.spec.ts +0 -362
  205. package/src/completions/providers/ContentForParameterCompletionProvider.ts +0 -187
  206. package/src/completions/providers/data/contentForParameterCompletionOptions.ts +0 -9
  207. package/src/css/CSSLanguageService.spec.ts +0 -159
  208. package/src/css/test/test-helpers.ts +0 -30
  209. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.spec.ts +0 -96
  210. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.ts +0 -82
  211. package/src/hover/providers/ContentForArgumentHoverProvider.spec.ts +0 -76
  212. package/src/hover/providers/ContentForArgumentHoverProvider.ts +0 -56
  213. package/src/hover/providers/ContentForTypeHoverProvider.spec.ts +0 -91
  214. package/src/hover/providers/ContentForTypeHoverProvider.ts +0 -42
  215. package/src/json/JSONLanguageService.spec.ts +0 -424
  216. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.spec.ts +0 -163
  217. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.ts +0 -121
  218. package/src/json/completions/providers/BlockTypeCompletionProvider.spec.ts +0 -137
  219. package/src/json/completions/providers/BlockTypeCompletionProvider.ts +0 -108
  220. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.spec.ts +0 -132
  221. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.ts +0 -120
  222. package/src/json/completions/providers/SchemaTranslationCompletionProvider.ts +0 -51
  223. package/src/json/completions/providers/SettingsPropertyCompletionProvider.spec.ts +0 -211
  224. package/src/json/completions/providers/SettingsPropertyCompletionProvider.ts +0 -75
  225. package/src/json/documentLinks/DocumentLinksProvider.spec.ts +0 -223
  226. package/src/json/documentLinks/DocumentLinksProvider.ts +0 -61
  227. package/src/json/hover/providers/BlockSettingsHoverProvider.spec.ts +0 -292
  228. package/src/json/hover/providers/BlockSettingsHoverProvider.ts +0 -99
  229. package/src/json/hover/providers/SchemaTranslationHoverProvider.ts +0 -35
  230. package/src/json/hover/providers/SettingsHoverProvider.spec.ts +0 -139
  231. package/src/json/hover/providers/SettingsHoverProvider.ts +0 -79
  232. package/src/json/schemaSettings.spec.ts +0 -103
  233. package/src/json/schemaSettings.ts +0 -53
  234. package/src/plugins/css.ts +0 -12
  235. package/src/renamed/handlers/BlockRenameHandler.spec.ts +0 -399
  236. package/src/renamed/handlers/BlockRenameHandler.ts +0 -402
  237. package/src/renamed/handlers/SectionRenameHandler.spec.ts +0 -321
  238. package/src/renamed/handlers/SectionRenameHandler.ts +0 -224
  239. package/src/settings/index.ts +0 -50
@@ -1,321 +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: SectionRenameHandler', () => {
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
- 'sections/old-name.liquid': `
26
- {% schema %}
27
- {
28
- "name": "Old name"
29
- }
30
- {% endschema %}`,
31
-
32
- 'layout/theme.liquid': `
33
- {% section 'old-name' %}
34
- `,
35
-
36
- 'sections/header.json': `
37
- {
38
- "type": "header",
39
- "name": "Header",
40
- "sections": {
41
- "section-id": {
42
- "type": "old-name"
43
- }
44
- },
45
- "order": ["section-id"]
46
- }`,
47
-
48
- 'templates/index.json': `
49
- {
50
- "sections": {
51
- "section-id": {
52
- "type": "old-name"
53
- }
54
- },
55
- "order": ["section-id"]
56
- }`,
57
- },
58
- mockRoot,
59
- );
60
- documentManager = new DocumentManager(
61
- fs, // filesystem
62
- undefined, // optional mode getter
63
- undefined, // optional mode map
64
- async () => 'theme', // getModeForURI
65
- async () => true, // isValidSchema - assume all schemas are valid in tests
66
- );
67
- handler = new RenameHandler(connection, capabilities, documentManager, findThemeRootURI);
68
- });
69
-
70
- describe('when the client does not support workspace/applyEdit', () => {
71
- beforeEach(() => {
72
- capabilities.setup({
73
- workspace: {
74
- applyEdit: false,
75
- },
76
- });
77
- });
78
-
79
- it('does nothing', async () => {
80
- await handler.onDidRenameFiles({
81
- files: [
82
- {
83
- oldUri: 'mock-fs:/sections/old-name.liquid',
84
- newUri: 'mock-fs:/sections/new-name.liquid',
85
- },
86
- ],
87
- });
88
- expect(connection.spies.sendRequest).not.toHaveBeenCalled();
89
- });
90
- });
91
-
92
- describe('when the client supports workspace/applyEdit', () => {
93
- beforeEach(() => {
94
- capabilities.setup({
95
- workspace: {
96
- applyEdit: true,
97
- },
98
- });
99
- });
100
-
101
- it('returns a needConfirmation: false workspace edit for renaming a section', async () => {
102
- await handler.onDidRenameFiles({
103
- files: [
104
- {
105
- oldUri: 'mock-fs:/sections/old-name.liquid',
106
- newUri: 'mock-fs:/sections/new-name.liquid',
107
- },
108
- ],
109
- });
110
-
111
- const replaceWithNewNameTextEditAtAnyLocation = {
112
- annotationId: 'renameSection',
113
- newText: 'new-name',
114
- range: {
115
- start: expect.any(Object),
116
- end: expect.any(Object),
117
- },
118
- };
119
-
120
- const templateTextEdits = [
121
- // Section type is updated in the section sections array
122
- replaceWithNewNameTextEditAtAnyLocation,
123
- ];
124
-
125
- const sectionGroupTextEdits = [
126
- // Section type is updated in the section sections array,
127
- replaceWithNewNameTextEditAtAnyLocation,
128
- ];
129
-
130
- const sectionTagTextEdits = [
131
- // Over {% section 'old-name' %}
132
- replaceWithNewNameTextEditAtAnyLocation,
133
- ];
134
-
135
- expect(connection.spies.sendRequest).toHaveBeenCalledWith('workspace/applyEdit', {
136
- label: "Rename section 'old-name' to 'new-name'",
137
- edit: {
138
- changeAnnotations: {
139
- renameSection: {
140
- label: `Rename section 'old-name' to 'new-name'`,
141
- needsConfirmation: false,
142
- },
143
- },
144
- documentChanges: expect.arrayContaining([
145
- {
146
- textDocument: {
147
- uri: 'mock-fs:/layout/theme.liquid',
148
- version: null,
149
- },
150
- edits: sectionTagTextEdits,
151
- },
152
- {
153
- textDocument: {
154
- uri: 'mock-fs:/templates/index.json',
155
- version: null,
156
- },
157
- edits: templateTextEdits,
158
- },
159
- {
160
- textDocument: {
161
- uri: 'mock-fs:/sections/header.json',
162
- version: null,
163
- },
164
- edits: sectionGroupTextEdits,
165
- },
166
- ]),
167
- },
168
- });
169
- });
170
-
171
- it('replaces the correct text in the documents', async () => {
172
- await handler.onDidRenameFiles({
173
- files: [
174
- {
175
- oldUri: 'mock-fs:/sections/old-name.liquid',
176
- newUri: 'mock-fs:/sections/new-name.liquid',
177
- },
178
- ],
179
- });
180
-
181
- const params: ApplyWorkspaceEditParams = connection.spies.sendRequest.mock.calls[0][1];
182
- const expectedFs = new MockFileSystem(
183
- {
184
- 'sections/new-name.liquid': `
185
- {% schema %}
186
- {
187
- "name": "Old name"
188
- }
189
- {% endschema %}`,
190
-
191
- 'layout/theme.liquid': `
192
- {% section 'new-name' %}
193
- `,
194
-
195
- 'sections/header.json': `
196
- {
197
- "type": "header",
198
- "name": "Header",
199
- "sections": {
200
- "section-id": {
201
- "type": "new-name"
202
- }
203
- },
204
- "order": ["section-id"]
205
- }`,
206
-
207
- 'templates/index.json': `
208
- {
209
- "sections": {
210
- "section-id": {
211
- "type": "new-name"
212
- }
213
- },
214
- "order": ["section-id"]
215
- }`,
216
- },
217
- mockRoot,
218
- );
219
-
220
- assert(params.edit);
221
- assert(params.edit.documentChanges);
222
-
223
- for (const docChange of params.edit.documentChanges) {
224
- assert(TextDocumentEdit.is(docChange));
225
- const uri = docChange.textDocument.uri;
226
- const edits = docChange.edits;
227
- const initialDoc = await fs.readFile(uri);
228
- const expectedDoc = await expectedFs.readFile(uri);
229
- expect(edits).to.applyEdits(initialDoc, expectedDoc);
230
- }
231
- });
232
-
233
- it('preserves local section definitions', async () => {
234
- fs = new MockFileSystem(
235
- {
236
- // a "theme" text section exists
237
- 'sections/text.liquid': `
238
- {% schema %}
239
- { "name": "text section" }
240
- {% endschema %}`,
241
-
242
- // this section uses a local section of type "text"
243
- 'sections/local.liquid': `
244
- {% schema %}
245
- {
246
- "name": "Section with local sections",
247
- "sections": [
248
- {
249
- "type": "text",
250
- "name": "Local text section"
251
- }
252
- ],
253
- "presets": [
254
- {
255
- "name": "Because text is a local section definition, this preset won't get a rename",
256
- "sections": [
257
- { "type": "text" }
258
- ]
259
- }
260
- ]
261
- }
262
- {% endschema %}`,
263
-
264
- // This section group uses the local section that uses the local section, no rename needed
265
- 'sections/header.json': JSON.stringify({
266
- type: 'header',
267
- name: 'Header',
268
- sections: {
269
- local_id: {
270
- type: 'local',
271
- sections: {
272
- text_tqQTNE: {
273
- type: 'text',
274
- },
275
- },
276
- section_order: ['text_tqQTNE'],
277
- },
278
- },
279
- order: ['local_id'],
280
- }),
281
-
282
- // This template uses the section that uses the local section, no rename needed
283
- 'templates/index.json': JSON.stringify({
284
- sections: {
285
- local: {
286
- type: 'local',
287
- sections: {
288
- text_tqQTNE: {
289
- type: 'text',
290
- },
291
- },
292
- section_order: ['text_tqQTNE'],
293
- },
294
- },
295
- }),
296
- },
297
- mockRoot,
298
- );
299
- documentManager = new DocumentManager(
300
- fs,
301
- undefined,
302
- undefined,
303
- async () => 'theme',
304
- async () => true,
305
- );
306
- handler = new RenameHandler(connection, capabilities, documentManager, findThemeRootURI);
307
-
308
- await handler.onDidRenameFiles({
309
- files: [
310
- {
311
- oldUri: 'mock-fs:/sections/text.liquid',
312
- newUri: 'mock-fs:/sections/poetry.liquid',
313
- },
314
- ],
315
- });
316
-
317
- // Check if sendRequest was called at all
318
- expect(connection.spies.sendRequest).not.toHaveBeenCalled();
319
- });
320
- });
321
- });
@@ -1,224 +0,0 @@
1
- import { LiquidString } from '@platformos/liquid-html-parser';
2
- import {
3
- isError,
4
- LiteralNode,
5
- nodeAtPath,
6
- parseJSON,
7
- path,
8
- SourceCodeType,
9
- visit,
10
- } from '@platformos/platformos-check-common';
11
- import { Connection } from 'vscode-languageserver';
12
- import {
13
- AnnotatedTextEdit,
14
- ApplyWorkspaceEditRequest,
15
- Range,
16
- RenameFilesParams,
17
- TextDocumentEdit,
18
- AnnotatedTextEdit as TextEdit,
19
- WorkspaceEdit,
20
- } from 'vscode-languageserver-protocol';
21
- import { ClientCapabilities } from '../../ClientCapabilities';
22
- import {
23
- AugmentedJsonSourceCode,
24
- AugmentedLiquidSourceCode,
25
- AugmentedSourceCode,
26
- DocumentManager,
27
- isJsonSourceCode,
28
- isLiquidSourceCode,
29
- } from '../../documents';
30
- import { FindThemeRootURI } from '../../internal-types';
31
- import { isSection, isSectionGroup, isTemplate, sectionName } from '../../utils/uri';
32
- import { BaseRenameHandler } from '../BaseRenameHandler';
33
- import { isValidSectionGroup, isValidTemplate } from './utils';
34
-
35
- type DocumentChange = TextDocumentEdit;
36
-
37
- const annotationId = 'renameSection';
38
-
39
- /**
40
- * The SectionRenameHandler will handle section renames
41
- *
42
- * Whenever a section gets renamed, a lot of things need to happen:
43
- * 2. References in template files must be changed
44
- * 3. References in section groups must be changed
45
- * 4. References like {% section "oldName" %} must be changed
46
- */
47
- export class SectionRenameHandler implements BaseRenameHandler {
48
- constructor(
49
- private documentManager: DocumentManager,
50
- private connection: Connection,
51
- private capabilities: ClientCapabilities,
52
- private findThemeRootURI: FindThemeRootURI,
53
- ) {}
54
-
55
- async onDidRenameFiles(params: RenameFilesParams): Promise<void> {
56
- if (!this.capabilities.hasApplyEditSupport) return;
57
-
58
- const relevantRenames = params.files.filter(
59
- (file) => isSection(file.oldUri) && isSection(file.newUri),
60
- );
61
-
62
- // Only preload if you have something to do (folder renames not supported yet).
63
- if (relevantRenames.length !== 1) return;
64
- const rename = relevantRenames[0];
65
- const rootUri = await this.findThemeRootURI(path.dirname(params.files[0].oldUri));
66
- if (!rootUri) return;
67
- await this.documentManager.preload(rootUri);
68
- const theme = this.documentManager.theme(rootUri, true);
69
- const liquidFiles = theme.filter(isLiquidSourceCode);
70
- const templates = theme.filter(isJsonSourceCode).filter((file) => isTemplate(file.uri));
71
- const sectionGroups = theme.filter(isJsonSourceCode).filter((file) => isSectionGroup(file.uri));
72
- const oldSectionName = sectionName(rename.oldUri);
73
- const newSectionName = sectionName(rename.newUri);
74
- const editLabel = `Rename section '${oldSectionName}' to '${newSectionName}'`;
75
- const workspaceEdit: WorkspaceEdit = {
76
- documentChanges: [],
77
- changeAnnotations: {
78
- [annotationId]: {
79
- label: editLabel,
80
- needsConfirmation: false,
81
- },
82
- },
83
- };
84
-
85
- // All the templates/*.json files need to be updated with the new block name
86
- // when the old block name wasn't a local block.
87
- const [templateChanges, sectionGroupChanges, sectionTagChanges] = await Promise.all([
88
- Promise.all(templates.map(this.getTemplateChanges(oldSectionName, newSectionName))),
89
- Promise.all(sectionGroups.map(this.getSectionGroupChanges(oldSectionName, newSectionName))),
90
- Promise.all(liquidFiles.map(this.getSectionTagChanges(oldSectionName, newSectionName))),
91
- ]);
92
-
93
- for (const docChange of [...templateChanges, ...sectionGroupChanges]) {
94
- if (docChange !== null) {
95
- workspaceEdit.documentChanges!.push(docChange);
96
- }
97
- }
98
-
99
- // Because section tag changes could make a change to an existing document,
100
- // we need to group the edits together by document. Or else we might have
101
- // index drifting issues.
102
- for (const docChange of sectionTagChanges) {
103
- if (docChange !== null) {
104
- const existingDocChange = (workspaceEdit.documentChanges as DocumentChange[]).find(
105
- (dc) => dc.textDocument.uri === docChange?.textDocument.uri,
106
- );
107
- if (existingDocChange) {
108
- existingDocChange.edits.push(...docChange.edits);
109
- } else {
110
- workspaceEdit.documentChanges!.push(docChange);
111
- }
112
- }
113
- }
114
-
115
- if (workspaceEdit.documentChanges!.length === 0) {
116
- console.error('Nothing to do!');
117
- return;
118
- }
119
-
120
- await this.connection.sendRequest(ApplyWorkspaceEditRequest.type, {
121
- label: editLabel,
122
- edit: workspaceEdit,
123
- });
124
- }
125
-
126
- private getTemplateChanges(oldSectionName: string, newSectionName: string) {
127
- return async (sourceCode: AugmentedJsonSourceCode) => {
128
- const { textDocument, ast, source } = sourceCode;
129
- const parsed = parseJSON(source);
130
- if (!parsed || isError(parsed) || isError(ast)) return null;
131
- const edits: AnnotatedTextEdit[] = !isValidTemplate(parsed)
132
- ? []
133
- : Object.entries(parsed.sections)
134
- .filter(([_key, section]) => section.type === oldSectionName)
135
- .map(([key]) => {
136
- const node = nodeAtPath(ast, ['sections', key, 'type']) as LiteralNode;
137
- return {
138
- annotationId,
139
- newText: newSectionName,
140
- range: Range.create(
141
- textDocument.positionAt(node.loc.start.offset + 1),
142
- textDocument.positionAt(node.loc.end.offset - 1),
143
- ),
144
- } as AnnotatedTextEdit;
145
- });
146
-
147
- if (edits.length === 0) return null;
148
-
149
- return documentChanges(sourceCode, edits);
150
- };
151
- }
152
-
153
- // Awfully similar except for the isValidSectionGroup check and the types of the objects.
154
- // Feels like a coincidence that the types are so similar. I'm not sure this should be DRY'd up.
155
- private getSectionGroupChanges(oldSectionName: string, newSectionName: string) {
156
- return async (sourceCode: AugmentedJsonSourceCode) => {
157
- const { textDocument, ast, source } = sourceCode;
158
- const parsed = parseJSON(source);
159
- if (!parsed || isError(parsed) || isError(ast)) return null;
160
- const edits: TextEdit[] = !isValidSectionGroup(parsed)
161
- ? []
162
- : Object.entries(parsed.sections)
163
- .filter(([_key, section]) => section.type === oldSectionName)
164
- .map(([key]) => {
165
- const node = nodeAtPath(ast, ['sections', key, 'type']) as LiteralNode;
166
- return {
167
- annotationId,
168
- newText: newSectionName,
169
- range: Range.create(
170
- textDocument.positionAt(node.loc.start.offset + 1),
171
- textDocument.positionAt(node.loc.end.offset - 1),
172
- ),
173
- } as AnnotatedTextEdit;
174
- });
175
-
176
- if (edits.length === 0) return null;
177
-
178
- return documentChanges(sourceCode, edits);
179
- };
180
- }
181
-
182
- private getSectionTagChanges(oldSectionName: string, newSectionName: string) {
183
- return async (sourceCode: AugmentedLiquidSourceCode) => {
184
- const { textDocument, ast } = sourceCode;
185
- if (isError(ast)) return null;
186
-
187
- const edits = await visit<SourceCodeType.LiquidHtml, TextEdit>(ast, {
188
- async LiquidTag(node) {
189
- if (node.name !== 'section') return;
190
- if (typeof node.markup === 'string') return;
191
-
192
- // Note the type assertion to the LHS of the expression.
193
- // The type assertions above are enough for this to be true.
194
- // But I'm making the explicit annotation here to make it clear.
195
- const typeNode: LiquidString = node.markup;
196
- if (typeNode.value !== oldSectionName) return;
197
-
198
- return {
199
- annotationId,
200
- newText: newSectionName,
201
- range: Range.create(
202
- textDocument.positionAt(typeNode.position.start + 1),
203
- textDocument.positionAt(typeNode.position.end - 1),
204
- ),
205
- };
206
- },
207
- });
208
-
209
- if (edits.length === 0) return null;
210
-
211
- return documentChanges(sourceCode, edits);
212
- };
213
- }
214
- }
215
-
216
- function documentChanges(sourceCode: AugmentedSourceCode, edits: TextEdit[]): DocumentChange {
217
- return {
218
- textDocument: {
219
- uri: sourceCode.uri,
220
- version: sourceCode.version ?? null /* null means file from disk in this API */,
221
- },
222
- edits,
223
- };
224
- }
@@ -1,50 +0,0 @@
1
- export type GetThemeSettingsSchemaForURI = (uri: string) => Promise<SettingsSchemaJSONFile>;
2
-
3
- export type SettingsSchemaJSONFile = (ThemeInfo | SettingsCategory)[];
4
-
5
- export interface ThemeInfo {
6
- name: string;
7
- theme_name: string;
8
- theme_author: string;
9
- theme_version: string;
10
- theme_documentation_url: string;
11
- theme_support_url?: string;
12
- theme_support_email?: string;
13
- }
14
-
15
- export interface SettingsCategory {
16
- name: string;
17
- settings: Setting[];
18
- }
19
-
20
- export type Setting = SideBarSetting | InputSetting;
21
-
22
- export interface SideBarSetting {
23
- type: string;
24
- content: string;
25
- }
26
-
27
- export interface InputSetting {
28
- type: string;
29
- id: string;
30
- label: string;
31
- default?: number | string | boolean | string[];
32
- info?: string;
33
- }
34
-
35
- interface Option {
36
- label: string;
37
- value: string;
38
- }
39
-
40
- interface MaybeGroupedOption extends Option {
41
- group?: string;
42
- }
43
-
44
- export function isSettingsCategory(x: ThemeInfo | SettingsCategory): x is SettingsCategory {
45
- return 'settings' in x;
46
- }
47
-
48
- export function isInputSetting(x: Setting): x is InputSetting {
49
- return 'id' in x && 'type' in x && 'label' in x;
50
- }