@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,402 +0,0 @@
1
- import { NodeTypes } from '@platformos/liquid-html-parser';
2
- import {
3
- isBlockSchema,
4
- isError,
5
- isSectionSchema,
6
- JSONNode,
7
- nodeAtPath,
8
- parseJSON,
9
- path,
10
- Preset,
11
- Section,
12
- SourceCodeType,
13
- Template,
14
- ThemeBlock,
15
- visit,
16
- } from '@platformos/platformos-check-common';
17
- import { Connection } from 'vscode-languageserver';
18
- import {
19
- ApplyWorkspaceEditRequest,
20
- Range,
21
- RenameFilesParams,
22
- TextDocumentEdit,
23
- AnnotatedTextEdit as TextEdit,
24
- WorkspaceEdit,
25
- } from 'vscode-languageserver-protocol';
26
- import { TextDocument } from 'vscode-languageserver-textdocument';
27
- import { ClientCapabilities } from '../../ClientCapabilities';
28
- import {
29
- AugmentedJsonSourceCode,
30
- AugmentedLiquidSourceCode,
31
- AugmentedSourceCode,
32
- DocumentManager,
33
- isJsonSourceCode,
34
- isLiquidSourceCode,
35
- } from '../../documents';
36
- import { blockName, isBlock, isSection, isSectionGroup, isTemplate } from '../../utils/uri';
37
- import { BaseRenameHandler } from '../BaseRenameHandler';
38
- import { isValidSectionGroup, isValidTemplate } from './utils';
39
- import { FindThemeRootURI } from '../../internal-types';
40
-
41
- type DocumentChange = TextDocumentEdit;
42
-
43
- const annotationId = 'renameBlock';
44
-
45
- /**
46
- * The BlockRenameHandler will handle block renames.
47
- *
48
- * Whenever a block gets renamed, a lot of things need to happen:
49
- * 1. References in files with a {% schema %} must be changed
50
- * 2. References in template files must be changed
51
- * 3. References in section groups must be changed
52
- * 4. References in {% content_for "block", type: "oldName" %} must be changed
53
- *
54
- * Things we're not doing:
55
- * 5. If isPublic(oldName) && isPrivate(newName) && "schema.blocks" accepts "@theme",
56
- * Then the block should be added to the "blocks" array
57
- *
58
- * Reasoning: this is more noisy than useful. a now-private block
59
- * could be used by a preset, template or section group. Doing a
60
- * toil-free rename would require visiting all preset, templates and
61
- * section groups to see if a parent that uses the new block name
62
- * was supporting "@theme" blocks. It's a lot. It's O(S*(S+T+SG)) where
63
- * S is the number of sections, T is the number of templates and SG is the
64
- * number of section groups. It's not worth it.
65
- *
66
- * This stuff is complicated enough as it is 😅.
67
- */
68
- export class BlockRenameHandler implements BaseRenameHandler {
69
- constructor(
70
- private documentManager: DocumentManager,
71
- private connection: Connection,
72
- private capabilities: ClientCapabilities,
73
- private findThemeRootURI: FindThemeRootURI,
74
- ) {}
75
-
76
- async onDidRenameFiles(params: RenameFilesParams): Promise<void> {
77
- if (!this.capabilities.hasApplyEditSupport) return;
78
-
79
- const relevantRenames = params.files.filter(
80
- (file) => isBlock(file.oldUri) && isBlock(file.newUri),
81
- );
82
-
83
- // Only preload if you have something to do (folder renames not supported yet).
84
- if (relevantRenames.length !== 1) return;
85
- const rename = relevantRenames[0];
86
- const rootUri = await this.findThemeRootURI(path.dirname(params.files[0].oldUri));
87
- if (!rootUri) return;
88
- await this.documentManager.preload(rootUri);
89
- const theme = this.documentManager.theme(rootUri, true);
90
- const liquidFiles = theme.filter(isLiquidSourceCode);
91
- const sectionsAndBlocks = liquidFiles.filter(
92
- (file) => isBlock(file.uri) || isSection(file.uri),
93
- );
94
- const templates = theme.filter(isJsonSourceCode).filter((file) => isTemplate(file.uri));
95
- const sectionGroups = theme.filter(isJsonSourceCode).filter((file) => isSectionGroup(file.uri));
96
- const oldBlockName = blockName(rename.oldUri);
97
- const newBlockName = blockName(rename.newUri);
98
- const editLabel = `Rename block '${oldBlockName}' to '${newBlockName}'`;
99
- const workspaceEdit: WorkspaceEdit = {
100
- documentChanges: [],
101
- changeAnnotations: {
102
- [annotationId]: {
103
- label: editLabel,
104
- needsConfirmation: false,
105
- },
106
- },
107
- };
108
-
109
- // We need to keep track of sections that have local blocks, because we
110
- // shouldn't rename those. Only uses of "@theme" or specifically named blocks
111
- // should be renamed when the blocks/*.liquid file is renamed.
112
- const sectionsWithLocalBlocks = new Set();
113
- const sectionAndBlocksChanges: (DocumentChange | null)[] = await Promise.all(
114
- sectionsAndBlocks.map(
115
- this.getSchemaChanges(sectionsWithLocalBlocks, oldBlockName, newBlockName),
116
- ),
117
- );
118
-
119
- // All the templates/*.json files need to be updated with the new block name
120
- // when the old block name wasn't a local block.
121
- const [templateChanges, sectionGroupChanges, contentForChanges] = await Promise.all([
122
- Promise.all(
123
- templates.map(this.getTemplateChanges(oldBlockName, newBlockName, sectionsWithLocalBlocks)),
124
- ),
125
- Promise.all(
126
- sectionGroups.map(
127
- this.getSectionGroupChanges(oldBlockName, newBlockName, sectionsWithLocalBlocks),
128
- ),
129
- ),
130
- Promise.all(liquidFiles.map(this.getContentForChanges(oldBlockName, newBlockName))),
131
- ]);
132
-
133
- for (const docChange of [
134
- ...sectionAndBlocksChanges,
135
- ...templateChanges,
136
- ...sectionGroupChanges,
137
- ]) {
138
- if (docChange !== null) {
139
- workspaceEdit.documentChanges!.push(docChange);
140
- }
141
- }
142
-
143
- // Because contentForChanges could make a change to an existing document, we need
144
- // to group the edits together by document. Or else we might have index
145
- // drifting issues.
146
- for (const docChange of contentForChanges) {
147
- if (docChange !== null) {
148
- const existingDocChange = (workspaceEdit.documentChanges as DocumentChange[]).find(
149
- (dc) => dc.textDocument.uri === docChange?.textDocument.uri,
150
- );
151
- if (existingDocChange) {
152
- existingDocChange.edits.push(...docChange.edits);
153
- } else {
154
- workspaceEdit.documentChanges!.push(docChange);
155
- }
156
- }
157
- }
158
-
159
- if (workspaceEdit.documentChanges!.length === 0) {
160
- console.error('Nothing to do!');
161
- return;
162
- }
163
-
164
- await this.connection.sendRequest(ApplyWorkspaceEditRequest.type, {
165
- label: editLabel,
166
- edit: workspaceEdit,
167
- });
168
- }
169
-
170
- private getSchemaChanges(
171
- sectionsWithLocalBlocks: Set<unknown>,
172
- oldBlockName: string,
173
- newBlockName: string,
174
- ) {
175
- return async (sourceCode: AugmentedLiquidSourceCode) => {
176
- if (sourceCode.ast instanceof Error) return null;
177
- const textDocument = sourceCode.textDocument;
178
- const schema = await sourceCode.getSchema();
179
- if (!isBlockSchema(schema) && !isSectionSchema(schema)) return null;
180
- if (isError(schema.validSchema) || isError(schema.ast)) return null;
181
- const { validSchema, ast, offset } = schema;
182
-
183
- const edits: TextEdit[] = [];
184
- if (validSchema.blocks) {
185
- for (let i = 0; i < validSchema.blocks.length; i++) {
186
- const blockDef = validSchema.blocks[i];
187
- if (isLocalBlock(blockDef)) {
188
- // If the section has a local blocks, we shouldn't rename
189
- // anything in this file.
190
- if (isSectionSchema(schema)) {
191
- sectionsWithLocalBlocks.add(schema.name);
192
- }
193
- return null;
194
- }
195
-
196
- if (blockDef.type !== oldBlockName) continue;
197
- const node = nodeAtPath(ast, ['blocks', i, 'type']);
198
- edits.push({
199
- annotationId,
200
- newText: newBlockName,
201
- range: Range.create(
202
- textDocument.positionAt(offset + node!.loc!.start.offset + 1),
203
- textDocument.positionAt(offset + node!.loc!.end.offset - 1),
204
- ),
205
- });
206
- }
207
- }
208
-
209
- const presetEdits = (
210
- presetBlock: Preset.Preset | Preset.Block | undefined,
211
- path: (string | number)[],
212
- ): TextEdit[] => {
213
- if (!presetBlock || !('blocks' in presetBlock)) return [];
214
- if (Array.isArray(presetBlock.blocks)) {
215
- return presetBlock.blocks.flatMap((block, index) => {
216
- const edits = presetEdits(block, [...path, 'blocks', index]);
217
- if (block.type === oldBlockName) {
218
- const node = nodeAtPath(ast, [...path, 'blocks', index, 'type']);
219
- edits.push({
220
- annotationId,
221
- newText: newBlockName,
222
- range: Range.create(
223
- textDocument.positionAt(offset + node!.loc!.start.offset + 1),
224
- textDocument.positionAt(offset + node!.loc!.end.offset - 1),
225
- ),
226
- });
227
- }
228
- return edits;
229
- });
230
- } else if (typeof presetBlock.blocks === 'object') {
231
- return Object.entries(presetBlock.blocks).flatMap(([key, block]) => {
232
- const edits = presetEdits(block, [...path, 'blocks', key]);
233
- if (block.type === oldBlockName) {
234
- const node = nodeAtPath(ast, [...path, 'blocks', key, 'type']);
235
- edits.push({
236
- annotationId,
237
- newText: newBlockName,
238
- range: Range.create(
239
- textDocument.positionAt(offset + node!.loc!.start.offset + 1),
240
- textDocument.positionAt(offset + node!.loc!.end.offset - 1),
241
- ),
242
- });
243
- }
244
- return edits;
245
- });
246
- } else {
247
- return [];
248
- }
249
- };
250
-
251
- if (validSchema.presets) {
252
- edits.push(
253
- ...validSchema.presets.flatMap((preset, i) => presetEdits(preset, ['presets', i])),
254
- );
255
- }
256
-
257
- if (edits.length === 0) return null;
258
-
259
- return documentChanges(sourceCode, edits);
260
- };
261
- }
262
-
263
- private getTemplateChanges(
264
- oldBlockName: string,
265
- newBlockName: string,
266
- sectionsWithLocalBlocks: Set<unknown>,
267
- ) {
268
- return async (sourceCode: AugmentedJsonSourceCode) => {
269
- // assuming that the JSON is valid...
270
- const { textDocument, ast, source } = sourceCode;
271
- const parsed = parseJSON(source);
272
- if (!parsed || isError(parsed) || isError(ast)) return null;
273
- const getBlocksEdits = getBlocksEditsFactory(oldBlockName, newBlockName, textDocument, ast);
274
- const edits: TextEdit[] = !isValidTemplate(parsed)
275
- ? []
276
- : Object.entries(parsed.sections).flatMap(([key, section]) => {
277
- if (
278
- 'blocks' in section &&
279
- !!section.blocks &&
280
- !sectionsWithLocalBlocks.has(section.type) // don't rename local blocks
281
- ) {
282
- return getBlocksEdits(section.blocks, ['sections', key, 'blocks']);
283
- } else {
284
- return [];
285
- }
286
- });
287
-
288
- if (edits.length === 0) return null;
289
-
290
- return documentChanges(sourceCode, edits);
291
- };
292
- }
293
-
294
- private getSectionGroupChanges(
295
- oldBlockName: string,
296
- newBlockName: string,
297
- sectionsWithLocalBlocks: Set<unknown>,
298
- ) {
299
- return async (sourceCode: AugmentedJsonSourceCode) => {
300
- const { textDocument, ast, source } = sourceCode;
301
- const parsed = parseJSON(source);
302
- if (!parsed || isError(parsed) || isError(ast)) return null;
303
- const getBlocksEdits = getBlocksEditsFactory(oldBlockName, newBlockName, textDocument, ast);
304
- const edits: TextEdit[] = !isValidSectionGroup(parsed)
305
- ? []
306
- : Object.entries(parsed.sections).flatMap(([key, section]) => {
307
- if (
308
- 'blocks' in section &&
309
- !!section.blocks &&
310
- !sectionsWithLocalBlocks.has(section.type) // don't rename local blocks
311
- ) {
312
- return getBlocksEdits(section.blocks, ['sections', key, 'blocks']);
313
- } else {
314
- return [];
315
- }
316
- });
317
-
318
- if (edits.length === 0) return null;
319
-
320
- return documentChanges(sourceCode, edits);
321
- };
322
- }
323
-
324
- private getContentForChanges(oldBlockName: string, newBlockName: string) {
325
- return async (sourceCode: AugmentedLiquidSourceCode) => {
326
- const { textDocument, ast } = sourceCode;
327
- if (isError(ast)) return null;
328
-
329
- const edits = await visit<SourceCodeType.LiquidHtml, TextEdit>(ast, {
330
- async LiquidTag(node) {
331
- if (node.name !== 'content_for') return;
332
- if (typeof node.markup === 'string') return;
333
- if (node.markup.contentForType.value !== 'block') return;
334
- const typeNode = node.markup.args.find((arg) => arg.name === 'type');
335
- if (
336
- !typeNode ||
337
- typeNode.value.type !== NodeTypes.String ||
338
- typeNode.value.value !== oldBlockName
339
- ) {
340
- return;
341
- }
342
-
343
- return {
344
- annotationId,
345
- newText: newBlockName,
346
- range: Range.create(
347
- textDocument.positionAt(typeNode.value.position.start + 1),
348
- textDocument.positionAt(typeNode.value.position.end - 1),
349
- ),
350
- };
351
- },
352
- });
353
-
354
- if (edits.length === 0) return null;
355
-
356
- return documentChanges(sourceCode, edits);
357
- };
358
- }
359
- }
360
-
361
- function isLocalBlock(blockDef: ThemeBlock.Block | Section.Block): blockDef is Section.LocalBlock {
362
- return 'name' in blockDef && typeof blockDef.name === 'string';
363
- }
364
-
365
- function getBlocksEditsFactory(
366
- oldBlockName: string,
367
- newBlockName: string,
368
- textDocument: TextDocument,
369
- ast: JSONNode,
370
- ) {
371
- return function getBlocksEdits(
372
- blocks: Record<string, Template.Block> | undefined,
373
- path: (string | number)[],
374
- ): TextEdit[] {
375
- if (!blocks) return [];
376
- return Object.entries(blocks).flatMap(([key, block]) => {
377
- const edits = getBlocksEdits(block.blocks, [...path, key, 'blocks']);
378
- if (block.type === oldBlockName) {
379
- const node = nodeAtPath(ast, [...path, key, 'type'])!;
380
- edits.push({
381
- annotationId,
382
- newText: newBlockName,
383
- range: Range.create(
384
- textDocument.positionAt(node.loc!.start.offset + 1),
385
- textDocument.positionAt(node.loc!.end.offset - 1),
386
- ),
387
- });
388
- }
389
- return edits;
390
- });
391
- };
392
- }
393
-
394
- function documentChanges(sourceCode: AugmentedSourceCode, edits: TextEdit[]): DocumentChange {
395
- return {
396
- textDocument: {
397
- uri: sourceCode.uri,
398
- version: sourceCode.version ?? null /* null means file from disk in this API */,
399
- },
400
- edits,
401
- };
402
- }