@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,113 +1,129 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { getCSSLanguageService, LanguageService } from 'vscode-css-languageservice';
|
|
2
|
+
import {
|
|
3
|
+
HtmlRawNode,
|
|
4
|
+
LiquidHtmlNode,
|
|
5
|
+
NodeTypes,
|
|
6
|
+
RawMarkupKinds,
|
|
7
|
+
walk,
|
|
8
|
+
} from '@platformos/liquid-html-parser';
|
|
9
|
+
import { isError, SourceCodeType } from '@platformos/platformos-check-common';
|
|
4
10
|
import {
|
|
5
11
|
CompletionItem,
|
|
6
12
|
CompletionList,
|
|
7
13
|
CompletionParams,
|
|
8
|
-
Diagnostic,
|
|
9
|
-
DocumentDiagnosticParams,
|
|
10
14
|
Hover,
|
|
11
15
|
HoverParams,
|
|
12
16
|
ClientCapabilities as LSPClientCapabilities,
|
|
17
|
+
Position,
|
|
13
18
|
} from 'vscode-languageserver';
|
|
14
19
|
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
15
20
|
import { DocumentManager } from '../documents';
|
|
16
21
|
|
|
17
22
|
export class CSSLanguageService {
|
|
18
23
|
private service: LanguageService | null = null;
|
|
24
|
+
// Standalone .css files — managed independently of DocumentManager
|
|
25
|
+
private cssDocuments: Map<string, TextDocument> = new Map();
|
|
19
26
|
|
|
20
27
|
constructor(private documentManager: DocumentManager) {}
|
|
21
28
|
|
|
22
|
-
|
|
23
|
-
this.service = getCSSLanguageService({
|
|
24
|
-
clientCapabilities,
|
|
25
|
-
});
|
|
29
|
+
setup(clientCapabilities: LSPClientCapabilities) {
|
|
30
|
+
this.service = getCSSLanguageService({ clientCapabilities });
|
|
26
31
|
}
|
|
27
32
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
33
|
+
open(uri: string, source: string, version: number) {
|
|
34
|
+
this.cssDocuments.set(uri, TextDocument.create(uri, 'css', version, source));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
change(uri: string, source: string, version: number) {
|
|
38
|
+
const existing = this.cssDocuments.get(uri);
|
|
39
|
+
if (existing) {
|
|
40
|
+
this.cssDocuments.set(uri, TextDocument.update(existing, [{ text: source }], version));
|
|
41
|
+
} else {
|
|
42
|
+
this.open(uri, source, version);
|
|
43
|
+
}
|
|
35
44
|
}
|
|
36
45
|
|
|
37
|
-
|
|
46
|
+
close(uri: string) {
|
|
47
|
+
this.cssDocuments.delete(uri);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async completions(params: CompletionParams): Promise<CompletionList | CompletionItem[] | null> {
|
|
38
51
|
const service = this.service;
|
|
39
|
-
if (!service) return
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
52
|
+
if (!service) return null;
|
|
53
|
+
|
|
54
|
+
const uri = params.textDocument.uri;
|
|
55
|
+
|
|
56
|
+
if (uri.endsWith('.css')) {
|
|
57
|
+
const textDoc = this.cssDocuments.get(uri);
|
|
58
|
+
if (!textDoc) return null;
|
|
59
|
+
const stylesheet = service.parseStylesheet(textDoc);
|
|
60
|
+
return service.doComplete(textDoc, params.position, stylesheet);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const embedded = this.findEmbeddedCSS(uri, params.position);
|
|
64
|
+
if (!embedded) return null;
|
|
65
|
+
const stylesheet = service.parseStylesheet(embedded.virtualDoc);
|
|
66
|
+
return service.doComplete(embedded.virtualDoc, params.position, stylesheet);
|
|
44
67
|
}
|
|
45
68
|
|
|
46
69
|
async hover(params: HoverParams): Promise<Hover | null> {
|
|
47
70
|
const service = this.service;
|
|
48
71
|
if (!service) return null;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
72
|
+
|
|
73
|
+
const uri = params.textDocument.uri;
|
|
74
|
+
|
|
75
|
+
if (uri.endsWith('.css')) {
|
|
76
|
+
const textDoc = this.cssDocuments.get(uri);
|
|
77
|
+
if (!textDoc) return null;
|
|
78
|
+
const stylesheet = service.parseStylesheet(textDoc);
|
|
79
|
+
return service.doHover(textDoc, params.position, stylesheet);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const embedded = this.findEmbeddedCSS(uri, params.position);
|
|
83
|
+
if (!embedded) return null;
|
|
84
|
+
const stylesheet = service.parseStylesheet(embedded.virtualDoc);
|
|
85
|
+
return service.doHover(embedded.virtualDoc, params.position, stylesheet);
|
|
53
86
|
}
|
|
54
87
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
let offset = 0;
|
|
71
|
-
let isDiagnostics = false;
|
|
72
|
-
if ('position' in params && params.position.line !== 0 && params.position.character !== 0) {
|
|
73
|
-
offset = textDocument.offsetAt(params.position);
|
|
74
|
-
} else {
|
|
75
|
-
const stylesheetIndex = document.source.indexOf('{% stylesheet %}');
|
|
76
|
-
offset = stylesheetIndex;
|
|
77
|
-
isDiagnostics = true;
|
|
78
|
-
}
|
|
79
|
-
const [node, ancestors] = findCurrentNode(document.ast, offset);
|
|
80
|
-
let stylesheetTag = [...ancestors].find(
|
|
81
|
-
(node): node is LiquidRawTag =>
|
|
82
|
-
node.type === NodeTypes.LiquidRawTag && node.name === 'stylesheet',
|
|
83
|
-
);
|
|
84
|
-
if (isDiagnostics && 'children' in node && node.children) {
|
|
85
|
-
stylesheetTag = node.children.find(
|
|
86
|
-
(node): node is LiquidRawTag =>
|
|
87
|
-
node.type === NodeTypes.LiquidRawTag && node.name === 'stylesheet',
|
|
88
|
-
);
|
|
89
|
-
}
|
|
88
|
+
/**
|
|
89
|
+
* Finds the <style> block under the cursor in a .liquid file and builds a
|
|
90
|
+
* virtual CSS TextDocument whose line numbers align with the parent document.
|
|
91
|
+
*
|
|
92
|
+
* Strategy: prefix body.value with N newlines where N equals the line number
|
|
93
|
+
* of blockStartPosition.end. This keeps line numbers in sync so the same LSP
|
|
94
|
+
* Position can be passed directly to the CSS service.
|
|
95
|
+
*
|
|
96
|
+
* Note: character offsets are only accurate when <style> is on its own line
|
|
97
|
+
* (the typical case). Inline `<style>css</style>` is not handled perfectly.
|
|
98
|
+
*/
|
|
99
|
+
private findEmbeddedCSS(uri: string, position: Position): { virtualDoc: TextDocument } | null {
|
|
100
|
+
const document = this.documentManager.get(uri);
|
|
101
|
+
if (!document || document.type !== SourceCodeType.LiquidHtml) return null;
|
|
102
|
+
if (isError(document.ast)) return null;
|
|
90
103
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
'json',
|
|
105
|
-
textDocument.version,
|
|
106
|
-
stylesheetString,
|
|
107
|
-
);
|
|
108
|
-
const stylesheetDocument = service.parseStylesheet(stylesheetTextDocument);
|
|
109
|
-
return [stylesheetTextDocument, stylesheetDocument];
|
|
104
|
+
const offset = document.textDocument.offsetAt(position);
|
|
105
|
+
|
|
106
|
+
let foundNode: HtmlRawNode | null = null;
|
|
107
|
+
walk(document.ast as LiquidHtmlNode, (node) => {
|
|
108
|
+
if (node.type === NodeTypes.HtmlRawNode) {
|
|
109
|
+
const rawNode = node as HtmlRawNode;
|
|
110
|
+
if (
|
|
111
|
+
rawNode.body.kind === RawMarkupKinds.css &&
|
|
112
|
+
rawNode.blockStartPosition.end <= offset &&
|
|
113
|
+
offset <= rawNode.blockEndPosition.start
|
|
114
|
+
) {
|
|
115
|
+
foundNode = rawNode;
|
|
116
|
+
}
|
|
110
117
|
}
|
|
111
|
-
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
if (!foundNode) return null;
|
|
121
|
+
|
|
122
|
+
const node = foundNode as HtmlRawNode;
|
|
123
|
+
const bodyStartPos = document.textDocument.positionAt(node.blockStartPosition.end);
|
|
124
|
+
const prefix = '\n'.repeat(bodyStartPos.line);
|
|
125
|
+
const virtualDoc = TextDocument.create(uri + '#style', 'css', 0, prefix + node.body.value);
|
|
126
|
+
|
|
127
|
+
return { virtualDoc };
|
|
112
128
|
}
|
|
113
129
|
}
|
|
@@ -3,7 +3,6 @@ import { DefinitionLink, DefinitionParams } from 'vscode-languageserver';
|
|
|
3
3
|
|
|
4
4
|
import { AugmentedJsonSourceCode, DocumentManager } from '../documents';
|
|
5
5
|
import { BaseDefinitionProvider } from './BaseDefinitionProvider';
|
|
6
|
-
import { SchemaTranslationStringDefinitionProvider } from './providers/SchemaTranslationStringDefinitionProvider';
|
|
7
6
|
import { TranslationStringDefinitionProvider } from './providers/TranslationStringDefinitionProvider';
|
|
8
7
|
|
|
9
8
|
export class DefinitionProvider {
|
|
@@ -12,14 +11,9 @@ export class DefinitionProvider {
|
|
|
12
11
|
constructor(
|
|
13
12
|
private documentManager: DocumentManager,
|
|
14
13
|
getDefaultLocaleSourceCode: (uri: string) => Promise<AugmentedJsonSourceCode | null>,
|
|
15
|
-
getDefaultSchemaLocaleSourceCode: (uri: string) => Promise<AugmentedJsonSourceCode | null>,
|
|
16
14
|
) {
|
|
17
15
|
this.providers = [
|
|
18
16
|
new TranslationStringDefinitionProvider(documentManager, getDefaultLocaleSourceCode),
|
|
19
|
-
new SchemaTranslationStringDefinitionProvider(
|
|
20
|
-
documentManager,
|
|
21
|
-
getDefaultSchemaLocaleSourceCode,
|
|
22
|
-
),
|
|
23
17
|
];
|
|
24
18
|
}
|
|
25
19
|
|
|
@@ -33,11 +33,7 @@ describe('Module: TranslationStringDefinitionProvider', () => {
|
|
|
33
33
|
};
|
|
34
34
|
};
|
|
35
35
|
|
|
36
|
-
provider = new DefinitionProvider(
|
|
37
|
-
documentManager,
|
|
38
|
-
mockGetDefaultLocaleSourceCode,
|
|
39
|
-
async () => null,
|
|
40
|
-
);
|
|
36
|
+
provider = new DefinitionProvider(documentManager, mockGetDefaultLocaleSourceCode);
|
|
41
37
|
});
|
|
42
38
|
|
|
43
39
|
it('finds the definition of existing translation keys', async () => {
|
|
@@ -45,7 +45,7 @@ describe('Module: runChecks', () => {
|
|
|
45
45
|
let connection: { sendDiagnostics: ReturnType<typeof vi.fn> };
|
|
46
46
|
let runChecks: ReturnType<typeof makeRunChecks>;
|
|
47
47
|
let fs: MockFileSystem;
|
|
48
|
-
const rootUri = path.normalize('browser:///
|
|
48
|
+
const rootUri = path.normalize('browser:///app');
|
|
49
49
|
const fileUri = path.join(rootUri, 'app', 'input.liquid');
|
|
50
50
|
|
|
51
51
|
beforeEach(() => {
|
|
@@ -67,18 +67,16 @@ describe('Module: runChecks', () => {
|
|
|
67
67
|
runChecks = makeRunChecks(documentManager, diagnosticsManager, {
|
|
68
68
|
fs,
|
|
69
69
|
loadConfig: async () => ({
|
|
70
|
-
context: 'theme' as const,
|
|
71
70
|
settings: {},
|
|
72
71
|
checks: [LiquidFilter],
|
|
73
72
|
rootUri,
|
|
74
73
|
}),
|
|
75
|
-
|
|
74
|
+
platformosDocset: {
|
|
76
75
|
graphQL: async () => null,
|
|
77
76
|
filters: async () => [],
|
|
78
77
|
objects: async () => [],
|
|
79
78
|
liquidDrops: async () => [],
|
|
80
79
|
tags: async () => [],
|
|
81
|
-
systemTranslations: async () => ({}),
|
|
82
80
|
},
|
|
83
81
|
jsonValidationSet: {
|
|
84
82
|
schemas: async () => [],
|
|
@@ -98,7 +96,7 @@ describe('Module: runChecks', () => {
|
|
|
98
96
|
version: fileVersion,
|
|
99
97
|
diagnostics: [
|
|
100
98
|
{
|
|
101
|
-
source: '
|
|
99
|
+
source: 'platformos-check',
|
|
102
100
|
code: 'LiquidFilter',
|
|
103
101
|
message: 'Liquid filter can not be used',
|
|
104
102
|
severity: 1,
|
|
@@ -147,7 +145,7 @@ describe('Module: runChecks', () => {
|
|
|
147
145
|
fileVersion: 0,
|
|
148
146
|
diagnostics: [
|
|
149
147
|
{
|
|
150
|
-
source: '
|
|
148
|
+
source: 'platformos-check',
|
|
151
149
|
code: 'LiquidFilter',
|
|
152
150
|
message: 'Liquid filter can not be used',
|
|
153
151
|
severity: 1,
|
|
@@ -171,7 +169,7 @@ describe('Module: runChecks', () => {
|
|
|
171
169
|
fileVersion: 0,
|
|
172
170
|
diagnostics: [
|
|
173
171
|
{
|
|
174
|
-
source: '
|
|
172
|
+
source: 'platformos-check',
|
|
175
173
|
code: 'LiquidFilter',
|
|
176
174
|
message: 'Liquid filter can not be used',
|
|
177
175
|
severity: 1,
|
|
@@ -206,17 +204,17 @@ describe('Module: runChecks', () => {
|
|
|
206
204
|
});
|
|
207
205
|
|
|
208
206
|
it('should use the contents of the default translations file buffer (if any) instead of the result of the factory', async () => {
|
|
209
|
-
const defaultPath = '
|
|
207
|
+
const defaultPath = 'app/translations/en.yml';
|
|
210
208
|
const defaultURI = path.join(rootUri, ...defaultPath.split('/'));
|
|
211
|
-
const frPath = '
|
|
209
|
+
const frPath = 'app/translations/fr.yml';
|
|
212
210
|
const frURI = path.join(rootUri, ...frPath.split('/'));
|
|
213
211
|
const files = {
|
|
214
212
|
'.pos': '',
|
|
215
213
|
'app/test': '',
|
|
216
214
|
'.git/test': 'test',
|
|
217
215
|
'modules/test': 'test',
|
|
218
|
-
[defaultPath]:
|
|
219
|
-
[frPath]:
|
|
216
|
+
[defaultPath]: 'en:\n hello: hello',
|
|
217
|
+
[frPath]: 'fr:\n hello: bonjour\n hi: salut',
|
|
220
218
|
};
|
|
221
219
|
|
|
222
220
|
const matchingTranslation = allChecks.filter((c) => c.meta.code === 'MatchingTranslations');
|
|
@@ -224,18 +222,16 @@ describe('Module: runChecks', () => {
|
|
|
224
222
|
runChecks = makeRunChecks(documentManager, diagnosticsManager, {
|
|
225
223
|
fs: new MockFileSystem(files, rootUri),
|
|
226
224
|
loadConfig: async () => ({
|
|
227
|
-
context: 'theme',
|
|
228
225
|
settings: {},
|
|
229
226
|
checks: matchingTranslation,
|
|
230
227
|
rootUri: rootUri,
|
|
231
228
|
}),
|
|
232
|
-
|
|
229
|
+
platformosDocset: {
|
|
233
230
|
graphQL: async () => null,
|
|
234
231
|
filters: async () => [],
|
|
235
232
|
objects: async () => [],
|
|
236
233
|
liquidDrops: async () => [],
|
|
237
234
|
tags: async () => [],
|
|
238
|
-
systemTranslations: async () => ({}),
|
|
239
235
|
},
|
|
240
236
|
jsonValidationSet: {
|
|
241
237
|
schemas: async () => [],
|
|
@@ -251,20 +247,16 @@ describe('Module: runChecks', () => {
|
|
|
251
247
|
version: 0,
|
|
252
248
|
diagnostics: expect.arrayContaining([
|
|
253
249
|
{
|
|
254
|
-
source: '
|
|
250
|
+
source: 'platformos-check',
|
|
255
251
|
code: 'MatchingTranslations',
|
|
256
252
|
codeDescription: { href: expect.any(String) },
|
|
257
253
|
message: `A default translation for 'hi' does not exist`,
|
|
258
254
|
severity: 1,
|
|
259
255
|
range: {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
},
|
|
264
|
-
start: {
|
|
265
|
-
character: 19,
|
|
266
|
-
line: 0,
|
|
267
|
-
},
|
|
256
|
+
// 'fr:\n hello: bonjour\n hi: salut'
|
|
257
|
+
// line 2 starts at offset 21, 'hi: salut' spans offsets 23-31
|
|
258
|
+
start: { line: 2, character: 2 },
|
|
259
|
+
end: { line: 2, character: 10 },
|
|
268
260
|
},
|
|
269
261
|
},
|
|
270
262
|
]),
|
|
@@ -273,7 +265,7 @@ describe('Module: runChecks', () => {
|
|
|
273
265
|
|
|
274
266
|
// Change the contents of the defaultURI buffer, expect frURI to be fixed
|
|
275
267
|
documentManager.open(defaultURI, files[defaultPath], 0);
|
|
276
|
-
documentManager.change(defaultURI,
|
|
268
|
+
documentManager.change(defaultURI, 'en:\n hello: hello\n hi: hi', 1);
|
|
277
269
|
connection.sendDiagnostics.mockClear();
|
|
278
270
|
await runChecks([frURI]);
|
|
279
271
|
expect(connection.sendDiagnostics).toHaveBeenCalledWith({
|
|
@@ -2,21 +2,15 @@ import {
|
|
|
2
2
|
check,
|
|
3
3
|
findRoot,
|
|
4
4
|
makeFileExists,
|
|
5
|
-
Offense,
|
|
6
5
|
path,
|
|
7
6
|
Reference,
|
|
8
|
-
SectionSchema,
|
|
9
|
-
Severity,
|
|
10
7
|
SourceCodeType,
|
|
11
|
-
ThemeBlockSchema,
|
|
12
8
|
} from '@platformos/platformos-check-common';
|
|
13
9
|
|
|
14
|
-
import {
|
|
15
|
-
import { AugmentedSourceCode, DocumentManager } from '../documents';
|
|
10
|
+
import { DocumentManager } from '../documents';
|
|
16
11
|
import { Dependencies } from '../types';
|
|
17
12
|
import { DiagnosticsManager } from './DiagnosticsManager';
|
|
18
|
-
import {
|
|
19
|
-
import { ThemeGraphManager } from '../server/ThemeGraphManager';
|
|
13
|
+
import { AppGraphManager } from '../server/AppGraphManager';
|
|
20
14
|
|
|
21
15
|
export function makeRunChecks(
|
|
22
16
|
documentManager: DocumentManager,
|
|
@@ -24,18 +18,12 @@ export function makeRunChecks(
|
|
|
24
18
|
{
|
|
25
19
|
fs,
|
|
26
20
|
loadConfig,
|
|
27
|
-
|
|
21
|
+
platformosDocset,
|
|
28
22
|
jsonValidationSet,
|
|
29
|
-
|
|
30
|
-
cssLanguageService,
|
|
31
|
-
themeGraphManager,
|
|
23
|
+
appGraphManager,
|
|
32
24
|
includeFilesFromDisk,
|
|
33
|
-
}: Pick<
|
|
34
|
-
|
|
35
|
-
'fs' | 'loadConfig' | 'themeDocset' | 'jsonValidationSet' | 'getMetafieldDefinitions'
|
|
36
|
-
> & {
|
|
37
|
-
cssLanguageService?: CSSLanguageService;
|
|
38
|
-
themeGraphManager?: ThemeGraphManager;
|
|
25
|
+
}: Pick<Dependencies, 'fs' | 'loadConfig' | 'platformosDocset' | 'jsonValidationSet'> & {
|
|
26
|
+
appGraphManager?: AppGraphManager;
|
|
39
27
|
includeFilesFromDisk?: () => boolean;
|
|
40
28
|
},
|
|
41
29
|
) {
|
|
@@ -45,10 +33,10 @@ export function makeRunChecks(
|
|
|
45
33
|
// workspaces.
|
|
46
34
|
//
|
|
47
35
|
// e.g. if a user renames
|
|
48
|
-
//
|
|
49
|
-
//
|
|
36
|
+
// app1/app/views/partials/a.liquid to
|
|
37
|
+
// app1/app/views/partials/b.liquid
|
|
50
38
|
//
|
|
51
|
-
// then we recheck
|
|
39
|
+
// then we recheck app1
|
|
52
40
|
const fileExists = makeFileExists(fs);
|
|
53
41
|
const rootURIs = await Promise.all(triggerURIs.map((uri) => findRoot(uri, fileExists)));
|
|
54
42
|
const deduplicatedRootURIs = new Set<string>(rootURIs.filter((x): x is string => !!x));
|
|
@@ -58,42 +46,16 @@ export function makeRunChecks(
|
|
|
58
46
|
|
|
59
47
|
async function runChecksForRoot(configFileRootUri: string) {
|
|
60
48
|
const config = await loadConfig(configFileRootUri, fs);
|
|
61
|
-
const
|
|
49
|
+
const app = documentManager.app(config.rootUri, includeFilesFromDisk?.());
|
|
62
50
|
|
|
63
|
-
const
|
|
64
|
-
? await Promise.all(
|
|
65
|
-
theme.map((sourceCode) => getCSSDiagnostics(cssLanguageService, sourceCode)),
|
|
66
|
-
).then((offenses) => offenses.flat())
|
|
67
|
-
: [];
|
|
68
|
-
|
|
69
|
-
const themeOffenses = await check(theme, config, {
|
|
51
|
+
const appOffenses = await check(app, config, {
|
|
70
52
|
fs,
|
|
71
|
-
|
|
53
|
+
platformosDocset,
|
|
72
54
|
jsonValidationSet,
|
|
73
|
-
getMetafieldDefinitions,
|
|
74
55
|
|
|
75
56
|
async getReferences(uri: string): Promise<Reference[]> {
|
|
76
|
-
if (!
|
|
77
|
-
return
|
|
78
|
-
},
|
|
79
|
-
|
|
80
|
-
// TODO should do something for app blocks?
|
|
81
|
-
async getBlockSchema(name) {
|
|
82
|
-
// We won't preload here. If it's available, we'll give it. Otherwise expect nothing.
|
|
83
|
-
const uri = path.join(config.rootUri, 'blocks', `${name}.liquid`);
|
|
84
|
-
const doc = documentManager.get(uri);
|
|
85
|
-
if (doc?.type !== SourceCodeType.LiquidHtml) return undefined;
|
|
86
|
-
const schema = await doc.getSchema();
|
|
87
|
-
return schema as ThemeBlockSchema | undefined;
|
|
88
|
-
},
|
|
89
|
-
|
|
90
|
-
async getSectionSchema(name) {
|
|
91
|
-
// We won't preload here. If it's available, we'll give it. Otherwise expect nothing.
|
|
92
|
-
const uri = path.join(config.rootUri, 'sections', `${name}.liquid`);
|
|
93
|
-
const doc = documentManager.get(uri);
|
|
94
|
-
if (doc?.type !== SourceCodeType.LiquidHtml) return undefined;
|
|
95
|
-
const schema = await doc.getSchema();
|
|
96
|
-
return schema as SectionSchema | undefined;
|
|
57
|
+
if (!appGraphManager) return [];
|
|
58
|
+
return appGraphManager.getReferences(uri);
|
|
97
59
|
},
|
|
98
60
|
|
|
99
61
|
async getDocDefinition(relativePath) {
|
|
@@ -103,50 +65,14 @@ export function makeRunChecks(
|
|
|
103
65
|
return doc.getLiquidDoc();
|
|
104
66
|
},
|
|
105
67
|
});
|
|
106
|
-
const offenses = [...themeOffenses, ...cssOffenses];
|
|
107
68
|
|
|
108
|
-
// We iterate over the
|
|
69
|
+
// We iterate over the app files (as opposed to offenses) because if
|
|
109
70
|
// there were offenses before, we need to send an empty array to clear
|
|
110
71
|
// them.
|
|
111
|
-
for (const sourceCode of
|
|
112
|
-
const sourceCodeOffenses =
|
|
72
|
+
for (const sourceCode of app) {
|
|
73
|
+
const sourceCodeOffenses = appOffenses.filter((offense) => offense.uri === sourceCode.uri);
|
|
113
74
|
diagnosticsManager.set(sourceCode.uri, sourceCode.version, sourceCodeOffenses);
|
|
114
75
|
}
|
|
115
76
|
}
|
|
116
77
|
};
|
|
117
78
|
}
|
|
118
|
-
|
|
119
|
-
async function getCSSDiagnostics(
|
|
120
|
-
cssLanguageService: CSSLanguageService,
|
|
121
|
-
sourceCode: AugmentedSourceCode,
|
|
122
|
-
): Promise<Offense[]> {
|
|
123
|
-
if (sourceCode.type !== SourceCodeType.LiquidHtml) {
|
|
124
|
-
return [];
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const diagnostics = await cssLanguageService.diagnostics({
|
|
128
|
-
textDocument: { uri: sourceCode.uri },
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
return diagnostics
|
|
132
|
-
.map(
|
|
133
|
-
(diagnostic): Offense => ({
|
|
134
|
-
check: 'css',
|
|
135
|
-
message: diagnostic.message,
|
|
136
|
-
end: {
|
|
137
|
-
index: sourceCode.textDocument.offsetAt(diagnostic.range.end),
|
|
138
|
-
line: diagnostic.range.end.line,
|
|
139
|
-
character: diagnostic.range.end.character,
|
|
140
|
-
},
|
|
141
|
-
start: {
|
|
142
|
-
index: sourceCode.textDocument.offsetAt(diagnostic.range.start),
|
|
143
|
-
line: diagnostic.range.start.line,
|
|
144
|
-
character: diagnostic.range.start.character,
|
|
145
|
-
},
|
|
146
|
-
severity: offenseSeverity(diagnostic),
|
|
147
|
-
uri: sourceCode.uri,
|
|
148
|
-
type: SourceCodeType.LiquidHtml,
|
|
149
|
-
}),
|
|
150
|
-
)
|
|
151
|
-
.filter((offense) => offense.severity !== Severity.INFO);
|
|
152
|
-
}
|
|
@@ -62,7 +62,7 @@ function sanitize(s: string | undefined) {
|
|
|
62
62
|
?.replace(/(^|\n+)>/g, ' ')
|
|
63
63
|
.replace(/>/g, '>')
|
|
64
64
|
.replace(/</g, '<')
|
|
65
|
-
.replace(/\]\(\//g, '](https://
|
|
65
|
+
.replace(/\]\(\//g, '](https://documentation.platformos.com/')
|
|
66
66
|
.trim();
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -6,13 +6,13 @@ import { URI, Utils } from 'vscode-uri';
|
|
|
6
6
|
|
|
7
7
|
import { visit, Visitor } from '@platformos/platformos-check-common';
|
|
8
8
|
import { DocumentManager } from '../documents';
|
|
9
|
-
import {
|
|
9
|
+
import { FindAppRootURI } from '../internal-types';
|
|
10
10
|
import { DocumentsLocator, TranslationProvider } from '@platformos/platformos-common';
|
|
11
11
|
|
|
12
12
|
export class DocumentLinksProvider {
|
|
13
13
|
constructor(
|
|
14
14
|
private documentManager: DocumentManager,
|
|
15
|
-
private
|
|
15
|
+
private findAppRootURI: FindAppRootURI,
|
|
16
16
|
private documentsLocator: DocumentsLocator,
|
|
17
17
|
private translationProvider: TranslationProvider,
|
|
18
18
|
) {}
|
|
@@ -27,7 +27,7 @@ export class DocumentLinksProvider {
|
|
|
27
27
|
return [];
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
const rootUri = await this.
|
|
30
|
+
const rootUri = await this.findAppRootURI(uriString);
|
|
31
31
|
if (!rootUri) {
|
|
32
32
|
return [];
|
|
33
33
|
}
|