@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.
- package/CHANGELOG.md +20 -0
- package/dist/PropertyShapeInference.d.ts +18 -0
- package/dist/PropertyShapeInference.js +62 -0
- package/dist/PropertyShapeInference.js.map +1 -1
- package/dist/TypeSystem.d.ts +4 -9
- package/dist/TypeSystem.js +246 -390
- 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 +6 -17
- 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 +17 -12
- 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 +2 -9
- package/dist/utils/uri.js +5 -21
- package/dist/utils/uri.js.map +1 -1
- package/package.json +4 -4
- package/src/ClientCapabilities.ts +1 -1
- package/src/PropertyShapeInference.ts +81 -1
- package/src/TypeSystem.spec.ts +206 -449
- package/src/TypeSystem.ts +267 -460
- package/src/codeActions/providers/FixAllProvider.spec.ts +1 -1
- package/src/codeActions/providers/FixProvider.spec.ts +11 -11
- package/src/codeActions/providers/SuggestionProvider.spec.ts +2 -2
- package/src/commands/providers/ApplyFixesProvider.ts +2 -2
- package/src/commands/providers/ApplySuggestionProvider.ts +2 -2
- package/src/commands/providers/RunChecksProvider.ts +2 -2
- package/src/completions/CompletionsProvider.ts +14 -35
- package/src/completions/params/LiquidCompletionParams.spec.ts +0 -9
- package/src/completions/params/LiquidCompletionParams.ts +8 -17
- 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 +4 -18
- 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 +6 -15
- package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +13 -15
- package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +2 -3
- package/src/completions/providers/TranslationCompletionProvider.spec.ts +1 -4
- package/src/completions/providers/TranslationCompletionProvider.ts +3 -3
- 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 +22 -30
- package/src/diagnostics/runChecks.ts +17 -91
- package/src/docset/MarkdownRenderer.ts +1 -1
- package/src/documentLinks/DocumentLinksProvider.ts +10 -10
- package/src/documents/DocumentManager.spec.ts +46 -119
- package/src/documents/DocumentManager.ts +19 -15
- 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 +1 -4
- 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 +11 -14
- package/src/hover/providers/RenderPartialHoverProvider.ts +1 -5
- package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +10 -13
- package/src/hover/providers/RenderPartialParameterHoverProvider.ts +2 -3
- package/src/hover/providers/TranslationHoverProvider.spec.ts +1 -4
- package/src/hover/providers/TranslationHoverProvider.ts +3 -3
- package/src/index.ts +4 -7
- 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 +4 -4
- package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +5 -5
- package/src/rename/providers/LiquidVariableRenameProvider.ts +6 -6
- package/src/renamed/RenameHandler.ts +4 -9
- package/src/renamed/handlers/AssetRenameHandler.spec.ts +28 -28
- package/src/renamed/handlers/AssetRenameHandler.ts +6 -6
- package/src/renamed/handlers/PartialRenameHandler.spec.ts +9 -9
- package/src/renamed/handlers/PartialRenameHandler.ts +10 -10
- package/src/server/{ThemeGraphManager.ts → AppGraphManager.ts} +21 -90
- package/src/server/safe.ts +1 -1
- package/src/server/startServer.spec.ts +10 -12
- package/src/server/startServer.ts +69 -222
- package/src/test/CompletionItemsAssertion.spec.ts +1 -4
- package/src/types.ts +33 -63
- package/src/utils/debounce.ts +1 -1
- package/src/utils/liquidDoc.ts +6 -6
- package/src/utils/uri.ts +5 -17
- 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/renamed/handlers/utils.ts +0 -22
- 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
|
-
}
|
package/src/settings/index.ts
DELETED
|
@@ -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
|
-
}
|