@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,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,22 +0,0 @@
1
- import { Template } from '@platformos/platformos-check-common';
2
-
3
- // this is very very optimistic...
4
- export function isValidTemplate(parsed: unknown): parsed is Template.Template {
5
- return (
6
- typeof parsed === 'object' &&
7
- parsed !== null &&
8
- 'sections' in parsed &&
9
- 'order' in parsed &&
10
- Array.isArray((parsed as Template.Template).order)
11
- );
12
- }
13
-
14
- export function isValidSectionGroup(parsed: unknown): parsed is Template.SectionGroup {
15
- return (
16
- typeof parsed === 'object' &&
17
- parsed !== null &&
18
- 'sections' in parsed &&
19
- 'order' in parsed &&
20
- Array.isArray((parsed as Template.SectionGroup).order)
21
- );
22
- }
@@ -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
- }