@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.
- package/CHANGELOG.md +10 -0
- package/dist/PropertyShapeInference.d.ts +18 -0
- package/dist/PropertyShapeInference.js +58 -0
- package/dist/PropertyShapeInference.js.map +1 -1
- package/dist/TypeSystem.d.ts +4 -9
- package/dist/TypeSystem.js +234 -388
- package/dist/TypeSystem.js.map +1 -1
- package/dist/codeActions/providers/GenerateDocBlockProvider.d.ts +10 -0
- package/dist/codeActions/providers/GenerateDocBlockProvider.js +39 -0
- package/dist/codeActions/providers/GenerateDocBlockProvider.js.map +1 -0
- package/dist/commands/providers/GenerateDocBlockCommandProvider.d.ts +19 -0
- package/dist/commands/providers/GenerateDocBlockCommandProvider.js +64 -0
- package/dist/commands/providers/GenerateDocBlockCommandProvider.js.map +1 -0
- package/dist/completions/CompletionsProvider.d.ts +6 -10
- package/dist/completions/CompletionsProvider.js +6 -9
- package/dist/completions/CompletionsProvider.js.map +1 -1
- package/dist/completions/params/LiquidCompletionParams.js +4 -16
- package/dist/completions/params/LiquidCompletionParams.js.map +1 -1
- package/dist/completions/providers/ContentForCompletionProvider.js +2 -4
- package/dist/completions/providers/ContentForCompletionProvider.js.map +1 -1
- package/dist/completions/providers/FilterNamedParameterCompletionProvider.d.ts +3 -3
- package/dist/completions/providers/FilterNamedParameterCompletionProvider.js +6 -6
- package/dist/completions/providers/FilterNamedParameterCompletionProvider.js.map +1 -1
- package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.d.ts +3 -3
- package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js +3 -3
- package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js.map +1 -1
- package/dist/completions/providers/LiquidTagsCompletionProvider.d.ts +3 -3
- package/dist/completions/providers/LiquidTagsCompletionProvider.js +3 -3
- package/dist/completions/providers/LiquidTagsCompletionProvider.js.map +1 -1
- package/dist/completions/providers/RenderPartialParameterCompletionProvider.js +1 -1
- package/dist/completions/providers/RenderPartialParameterCompletionProvider.js.map +1 -1
- package/dist/completions/providers/index.d.ts +0 -3
- package/dist/completions/providers/index.js +1 -7
- package/dist/completions/providers/index.js.map +1 -1
- package/dist/css/CSSLanguageService.d.ts +19 -5
- package/dist/css/CSSLanguageService.js +77 -63
- package/dist/css/CSSLanguageService.js.map +1 -1
- package/dist/definitions/DefinitionProvider.d.ts +1 -1
- package/dist/definitions/DefinitionProvider.js +1 -3
- package/dist/definitions/DefinitionProvider.js.map +1 -1
- package/dist/diagnostics/offenseToDiagnostic.js +1 -1
- package/dist/diagnostics/offenseToDiagnostic.js.map +1 -1
- package/dist/diagnostics/runChecks.d.ts +3 -5
- package/dist/diagnostics/runChecks.js +12 -64
- package/dist/diagnostics/runChecks.js.map +1 -1
- package/dist/docset/MarkdownRenderer.js +1 -1
- package/dist/docset/MarkdownRenderer.js.map +1 -1
- package/dist/documentLinks/DocumentLinksProvider.d.ts +3 -3
- package/dist/documentLinks/DocumentLinksProvider.js +3 -3
- package/dist/documentLinks/DocumentLinksProvider.js.map +1 -1
- package/dist/documents/DocumentManager.d.ts +4 -5
- package/dist/documents/DocumentManager.js +12 -11
- package/dist/documents/DocumentManager.js.map +1 -1
- package/dist/documents/types.d.ts +16 -3
- package/dist/documents/types.js +3 -3
- package/dist/documents/types.js.map +1 -1
- package/dist/hover/HoverProvider.d.ts +5 -8
- package/dist/hover/HoverProvider.js +8 -14
- package/dist/hover/HoverProvider.js.map +1 -1
- package/dist/hover/providers/LiquidFilterArgumentHoverProvider.d.ts +3 -3
- package/dist/hover/providers/LiquidFilterArgumentHoverProvider.js +3 -3
- package/dist/hover/providers/LiquidFilterArgumentHoverProvider.js.map +1 -1
- package/dist/hover/providers/LiquidFilterHoverProvider.d.ts +3 -3
- package/dist/hover/providers/LiquidFilterHoverProvider.js +3 -3
- package/dist/hover/providers/LiquidFilterHoverProvider.js.map +1 -1
- package/dist/hover/providers/LiquidTagHoverProvider.d.ts +3 -3
- package/dist/hover/providers/LiquidTagHoverProvider.js +3 -3
- package/dist/hover/providers/LiquidTagHoverProvider.js.map +1 -1
- package/dist/hover/providers/RenderPartialHoverProvider.js +1 -1
- package/dist/hover/providers/RenderPartialHoverProvider.js.map +1 -1
- package/dist/hover/providers/RenderPartialParameterHoverProvider.js +1 -1
- package/dist/hover/providers/RenderPartialParameterHoverProvider.js.map +1 -1
- package/dist/hover/providers/TranslationHoverProvider.d.ts +3 -3
- package/dist/hover/providers/TranslationHoverProvider.js +3 -3
- package/dist/hover/providers/TranslationHoverProvider.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal-types.d.ts +1 -1
- package/dist/json/JSONContributions.d.ts +1 -5
- package/dist/json/JSONContributions.js +4 -36
- package/dist/json/JSONContributions.js.map +1 -1
- package/dist/json/JSONLanguageService.d.ts +4 -12
- package/dist/json/JSONLanguageService.js +17 -80
- package/dist/json/JSONLanguageService.js.map +1 -1
- package/dist/json/test/test-helpers.d.ts +1 -3
- package/dist/json/test/test-helpers.js +3 -19
- package/dist/json/test/test-helpers.js.map +1 -1
- package/dist/json/utils.d.ts +0 -5
- package/dist/json/utils.js +0 -24
- package/dist/json/utils.js.map +1 -1
- package/dist/rename/RenameProvider.d.ts +2 -2
- package/dist/rename/RenameProvider.js +2 -2
- package/dist/rename/RenameProvider.js.map +1 -1
- package/dist/rename/providers/LiquidVariableRenameProvider.d.ts +3 -3
- package/dist/rename/providers/LiquidVariableRenameProvider.js +4 -4
- package/dist/rename/providers/LiquidVariableRenameProvider.js.map +1 -1
- package/dist/renamed/RenameHandler.d.ts +2 -3
- package/dist/renamed/RenameHandler.js +3 -8
- package/dist/renamed/RenameHandler.js.map +1 -1
- package/dist/renamed/handlers/AssetRenameHandler.d.ts +3 -3
- package/dist/renamed/handlers/AssetRenameHandler.js +5 -5
- package/dist/renamed/handlers/AssetRenameHandler.js.map +1 -1
- package/dist/renamed/handlers/PartialRenameHandler.d.ts +3 -3
- package/dist/renamed/handlers/PartialRenameHandler.js +5 -5
- package/dist/renamed/handlers/PartialRenameHandler.js.map +1 -1
- package/dist/renamed/handlers/utils.d.ts +1 -1
- package/dist/server/AppGraphManager.d.ts +32 -0
- package/dist/server/AppGraphManager.js +155 -0
- package/dist/server/AppGraphManager.js.map +1 -0
- package/dist/server/startServer.d.ts +2 -2
- package/dist/server/startServer.js +62 -164
- package/dist/server/startServer.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +33 -54
- package/dist/types.js +21 -26
- package/dist/types.js.map +1 -1
- package/dist/utils/liquidDoc.js +1 -1
- package/dist/utils/liquidDoc.js.map +1 -1
- package/dist/utils/uri.d.ts +0 -8
- package/dist/utils/uri.js +1 -17
- package/dist/utils/uri.js.map +1 -1
- package/package.json +4 -4
- package/src/PropertyShapeInference.ts +76 -1
- package/src/TypeSystem.spec.ts +188 -450
- package/src/TypeSystem.ts +251 -457
- package/src/completions/CompletionsProvider.ts +13 -34
- package/src/completions/params/LiquidCompletionParams.spec.ts +0 -9
- package/src/completions/params/LiquidCompletionParams.ts +4 -14
- package/src/completions/params/fix.spec.ts +0 -3
- package/src/completions/providers/FilterCompletionProvider.spec.ts +2 -8
- package/src/completions/providers/FilterNamedParameterCompletionProvider.spec.ts +1 -5
- package/src/completions/providers/FilterNamedParameterCompletionProvider.ts +6 -6
- package/src/completions/providers/HtmlAttributeCompletionProvider.spec.ts +1 -4
- package/src/completions/providers/HtmlAttributeValueCompletionProvider.spec.ts +1 -4
- package/src/completions/providers/HtmlTagCompletionProvider.spec.ts +1 -4
- package/src/completions/providers/LiquidDocParamTypeCompletionProvider.spec.ts +1 -28
- package/src/completions/providers/LiquidDocParamTypeCompletionProvider.ts +3 -3
- package/src/completions/providers/LiquidDocTagCompletionProvider.spec.ts +1 -26
- package/src/completions/providers/LiquidTagsCompletionProvider.spec.ts +2 -16
- package/src/completions/providers/LiquidTagsCompletionProvider.ts +3 -3
- package/src/completions/providers/ObjectAttributeCompletionProvider.spec.ts +2 -31
- package/src/completions/providers/ObjectCompletionProvider.spec.ts +34 -123
- package/src/completions/providers/PartialCompletionProvider.spec.ts +4 -13
- package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +3 -5
- package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +0 -1
- package/src/completions/providers/TranslationCompletionProvider.spec.ts +1 -4
- package/src/completions/providers/index.ts +0 -3
- package/src/css/CSSLanguageService.ts +97 -81
- package/src/definitions/DefinitionProvider.ts +0 -6
- package/src/definitions/providers/TranslationStringDefinitionProvider.spec.ts +1 -5
- package/src/diagnostics/offenseToDiagnostic.ts +1 -1
- package/src/diagnostics/runChecks.spec.ts +16 -24
- package/src/diagnostics/runChecks.ts +17 -91
- package/src/docset/MarkdownRenderer.ts +1 -1
- package/src/documentLinks/DocumentLinksProvider.ts +3 -3
- package/src/documents/DocumentManager.spec.ts +12 -97
- package/src/documents/DocumentManager.ts +13 -14
- package/src/documents/types.ts +18 -9
- package/src/hover/HoverProvider.ts +9 -21
- package/src/hover/providers/HtmlAttributeHoverProvider.spec.ts +1 -3
- package/src/hover/providers/HtmlAttributeValueHoverProvider.spec.ts +1 -3
- package/src/hover/providers/HtmlTagHoverProvider.spec.ts +1 -3
- package/src/hover/providers/LiquidDocTagHoverProvider.spec.ts +0 -3
- package/src/hover/providers/LiquidFilterArgumentHoverProvider.spec.ts +0 -3
- package/src/hover/providers/LiquidFilterArgumentHoverProvider.ts +3 -3
- package/src/hover/providers/LiquidFilterHoverProvider.spec.ts +0 -3
- package/src/hover/providers/LiquidFilterHoverProvider.ts +3 -3
- package/src/hover/providers/LiquidObjectAttributeHoverProvider.spec.ts +1 -3
- package/src/hover/providers/LiquidObjectHoverProvider.spec.ts +46 -129
- package/src/hover/providers/LiquidTagHoverProvider.spec.ts +0 -3
- package/src/hover/providers/LiquidTagHoverProvider.ts +3 -3
- package/src/hover/providers/RenderPartialHoverProvider.spec.ts +1 -4
- package/src/hover/providers/RenderPartialHoverProvider.ts +1 -5
- package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +1 -4
- package/src/hover/providers/RenderPartialParameterHoverProvider.ts +0 -1
- package/src/hover/providers/TranslationHoverProvider.spec.ts +1 -4
- package/src/hover/providers/TranslationHoverProvider.ts +3 -3
- package/src/index.ts +2 -5
- package/src/internal-types.ts +1 -1
- package/src/json/JSONContributions.ts +4 -61
- package/src/json/JSONLanguageService.ts +19 -117
- package/src/json/test/test-helpers.ts +4 -35
- package/src/json/utils.ts +0 -27
- package/src/rename/RenameProvider.ts +3 -3
- package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +4 -4
- package/src/rename/providers/LiquidVariableRenameProvider.ts +4 -4
- package/src/renamed/RenameHandler.ts +4 -9
- package/src/renamed/handlers/AssetRenameHandler.spec.ts +3 -3
- package/src/renamed/handlers/AssetRenameHandler.ts +5 -5
- package/src/renamed/handlers/PartialRenameHandler.spec.ts +2 -2
- package/src/renamed/handlers/PartialRenameHandler.ts +5 -5
- package/src/renamed/handlers/utils.ts +1 -1
- package/src/server/{ThemeGraphManager.ts → AppGraphManager.ts} +21 -90
- package/src/server/startServer.spec.ts +7 -9
- package/src/server/startServer.ts +65 -217
- package/src/test/CompletionItemsAssertion.spec.ts +1 -4
- package/src/types.ts +33 -63
- package/src/utils/liquidDoc.ts +1 -1
- package/src/utils/uri.ts +0 -14
- package/src/completions/providers/ContentForBlockTypeCompletionProvider.spec.ts +0 -41
- package/src/completions/providers/ContentForBlockTypeCompletionProvider.ts +0 -42
- package/src/completions/providers/ContentForCompletionProvider.spec.ts +0 -96
- package/src/completions/providers/ContentForCompletionProvider.ts +0 -113
- package/src/completions/providers/ContentForParameterCompletionProvider.spec.ts +0 -362
- package/src/completions/providers/ContentForParameterCompletionProvider.ts +0 -187
- package/src/completions/providers/data/contentForParameterCompletionOptions.ts +0 -9
- package/src/css/CSSLanguageService.spec.ts +0 -159
- package/src/css/test/test-helpers.ts +0 -30
- package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.spec.ts +0 -96
- package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.ts +0 -82
- package/src/hover/providers/ContentForArgumentHoverProvider.spec.ts +0 -76
- package/src/hover/providers/ContentForArgumentHoverProvider.ts +0 -56
- package/src/hover/providers/ContentForTypeHoverProvider.spec.ts +0 -91
- package/src/hover/providers/ContentForTypeHoverProvider.ts +0 -42
- package/src/json/JSONLanguageService.spec.ts +0 -424
- package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.spec.ts +0 -163
- package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.ts +0 -121
- package/src/json/completions/providers/BlockTypeCompletionProvider.spec.ts +0 -137
- package/src/json/completions/providers/BlockTypeCompletionProvider.ts +0 -108
- package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.spec.ts +0 -132
- package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.ts +0 -120
- package/src/json/completions/providers/SchemaTranslationCompletionProvider.ts +0 -51
- package/src/json/completions/providers/SettingsPropertyCompletionProvider.spec.ts +0 -211
- package/src/json/completions/providers/SettingsPropertyCompletionProvider.ts +0 -75
- package/src/json/documentLinks/DocumentLinksProvider.spec.ts +0 -223
- package/src/json/documentLinks/DocumentLinksProvider.ts +0 -61
- package/src/json/hover/providers/BlockSettingsHoverProvider.spec.ts +0 -292
- package/src/json/hover/providers/BlockSettingsHoverProvider.ts +0 -99
- package/src/json/hover/providers/SchemaTranslationHoverProvider.ts +0 -35
- package/src/json/hover/providers/SettingsHoverProvider.spec.ts +0 -139
- package/src/json/hover/providers/SettingsHoverProvider.ts +0 -79
- package/src/json/schemaSettings.spec.ts +0 -103
- package/src/json/schemaSettings.ts +0 -53
- package/src/plugins/css.ts +0 -12
- package/src/renamed/handlers/BlockRenameHandler.spec.ts +0 -399
- package/src/renamed/handlers/BlockRenameHandler.ts +0 -402
- package/src/renamed/handlers/SectionRenameHandler.spec.ts +0 -321
- package/src/renamed/handlers/SectionRenameHandler.ts +0 -224
- 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
|
-
}
|