@macroforge/svelte-language-server 0.1.3
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/README.md +331 -0
- package/bin/server.js +5 -0
- package/dist/src/importPackage.d.ts +16 -0
- package/dist/src/importPackage.js +76 -0
- package/dist/src/importPackage.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +23 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/DiagnosticsManager.d.ts +20 -0
- package/dist/src/lib/DiagnosticsManager.js +71 -0
- package/dist/src/lib/DiagnosticsManager.js.map +1 -0
- package/dist/src/lib/FallbackWatcher.d.ts +15 -0
- package/dist/src/lib/FallbackWatcher.js +66 -0
- package/dist/src/lib/FallbackWatcher.js.map +1 -0
- package/dist/src/lib/documentHighlight/wordHighlight.d.ts +3 -0
- package/dist/src/lib/documentHighlight/wordHighlight.js +62 -0
- package/dist/src/lib/documentHighlight/wordHighlight.js.map +1 -0
- package/dist/src/lib/documents/Document.d.ts +63 -0
- package/dist/src/lib/documents/Document.js +138 -0
- package/dist/src/lib/documents/Document.js.map +1 -0
- package/dist/src/lib/documents/DocumentBase.d.ts +65 -0
- package/dist/src/lib/documents/DocumentBase.js +69 -0
- package/dist/src/lib/documents/DocumentBase.js.map +1 -0
- package/dist/src/lib/documents/DocumentManager.d.ts +28 -0
- package/dist/src/lib/documents/DocumentManager.js +122 -0
- package/dist/src/lib/documents/DocumentManager.js.map +1 -0
- package/dist/src/lib/documents/DocumentMapper.d.ts +88 -0
- package/dist/src/lib/documents/DocumentMapper.js +258 -0
- package/dist/src/lib/documents/DocumentMapper.js.map +1 -0
- package/dist/src/lib/documents/configLoader.d.ts +80 -0
- package/dist/src/lib/documents/configLoader.js +265 -0
- package/dist/src/lib/documents/configLoader.js.map +1 -0
- package/dist/src/lib/documents/fileCollection.d.ts +41 -0
- package/dist/src/lib/documents/fileCollection.js +87 -0
- package/dist/src/lib/documents/fileCollection.js.map +1 -0
- package/dist/src/lib/documents/index.d.ts +5 -0
- package/dist/src/lib/documents/index.js +22 -0
- package/dist/src/lib/documents/index.js.map +1 -0
- package/dist/src/lib/documents/parseHtml.d.ts +13 -0
- package/dist/src/lib/documents/parseHtml.js +160 -0
- package/dist/src/lib/documents/parseHtml.js.map +1 -0
- package/dist/src/lib/documents/utils.d.ts +105 -0
- package/dist/src/lib/documents/utils.js +410 -0
- package/dist/src/lib/documents/utils.js.map +1 -0
- package/dist/src/lib/foldingRange/indentFolding.d.ts +26 -0
- package/dist/src/lib/foldingRange/indentFolding.js +142 -0
- package/dist/src/lib/foldingRange/indentFolding.js.map +1 -0
- package/dist/src/lib/semanticToken/semanticTokenLegend.d.ts +33 -0
- package/dist/src/lib/semanticToken/semanticTokenLegend.js +37 -0
- package/dist/src/lib/semanticToken/semanticTokenLegend.js.map +1 -0
- package/dist/src/logger.d.ts +9 -0
- package/dist/src/logger.js +28 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/ls-config.d.ts +326 -0
- package/dist/src/ls-config.js +386 -0
- package/dist/src/ls-config.js.map +1 -0
- package/dist/src/plugins/PluginHost.d.ts +68 -0
- package/dist/src/plugins/PluginHost.js +447 -0
- package/dist/src/plugins/PluginHost.js.map +1 -0
- package/dist/src/plugins/css/CSSDocument.d.ts +46 -0
- package/dist/src/plugins/css/CSSDocument.js +78 -0
- package/dist/src/plugins/css/CSSDocument.js.map +1 -0
- package/dist/src/plugins/css/CSSPlugin.d.ts +35 -0
- package/dist/src/plugins/css/CSSPlugin.js +407 -0
- package/dist/src/plugins/css/CSSPlugin.js.map +1 -0
- package/dist/src/plugins/css/FileSystemProvider.d.ts +10 -0
- package/dist/src/plugins/css/FileSystemProvider.js +75 -0
- package/dist/src/plugins/css/FileSystemProvider.js.map +1 -0
- package/dist/src/plugins/css/StyleAttributeDocument.d.ts +41 -0
- package/dist/src/plugins/css/StyleAttributeDocument.js +65 -0
- package/dist/src/plugins/css/StyleAttributeDocument.js.map +1 -0
- package/dist/src/plugins/css/features/getIdClassCompletion.d.ts +19 -0
- package/dist/src/plugins/css/features/getIdClassCompletion.js +56 -0
- package/dist/src/plugins/css/features/getIdClassCompletion.js.map +1 -0
- package/dist/src/plugins/css/features/svelte-selectors.d.ts +2 -0
- package/dist/src/plugins/css/features/svelte-selectors.js +18 -0
- package/dist/src/plugins/css/features/svelte-selectors.js.map +1 -0
- package/dist/src/plugins/css/global-vars.d.ts +16 -0
- package/dist/src/plugins/css/global-vars.js +82 -0
- package/dist/src/plugins/css/global-vars.js.map +1 -0
- package/dist/src/plugins/css/service.d.ts +5 -0
- package/dist/src/plugins/css/service.js +66 -0
- package/dist/src/plugins/css/service.js.map +1 -0
- package/dist/src/plugins/documentContext.d.ts +3 -0
- package/dist/src/plugins/documentContext.js +36 -0
- package/dist/src/plugins/documentContext.js.map +1 -0
- package/dist/src/plugins/html/HTMLPlugin.d.ts +36 -0
- package/dist/src/plugins/html/HTMLPlugin.js +363 -0
- package/dist/src/plugins/html/HTMLPlugin.js.map +1 -0
- package/dist/src/plugins/html/dataProvider.d.ts +1 -0
- package/dist/src/plugins/html/dataProvider.js +481 -0
- package/dist/src/plugins/html/dataProvider.js.map +1 -0
- package/dist/src/plugins/index.d.ts +7 -0
- package/dist/src/plugins/index.js +24 -0
- package/dist/src/plugins/index.js.map +1 -0
- package/dist/src/plugins/interfaces.d.ts +132 -0
- package/dist/src/plugins/interfaces.js +3 -0
- package/dist/src/plugins/interfaces.js.map +1 -0
- package/dist/src/plugins/svelte/SvelteDocument.d.ts +98 -0
- package/dist/src/plugins/svelte/SvelteDocument.js +318 -0
- package/dist/src/plugins/svelte/SvelteDocument.js.map +1 -0
- package/dist/src/plugins/svelte/SveltePlugin.d.ts +24 -0
- package/dist/src/plugins/svelte/SveltePlugin.js +306 -0
- package/dist/src/plugins/svelte/SveltePlugin.js.map +1 -0
- package/dist/src/plugins/svelte/features/SvelteTags.d.ts +28 -0
- package/dist/src/plugins/svelte/features/SvelteTags.js +136 -0
- package/dist/src/plugins/svelte/features/SvelteTags.js.map +1 -0
- package/dist/src/plugins/svelte/features/getCodeActions/getQuickfixes.d.ts +11 -0
- package/dist/src/plugins/svelte/features/getCodeActions/getQuickfixes.js +140 -0
- package/dist/src/plugins/svelte/features/getCodeActions/getQuickfixes.js.map +1 -0
- package/dist/src/plugins/svelte/features/getCodeActions/getRefactorings.d.ts +9 -0
- package/dist/src/plugins/svelte/features/getCodeActions/getRefactorings.js +140 -0
- package/dist/src/plugins/svelte/features/getCodeActions/getRefactorings.js.map +1 -0
- package/dist/src/plugins/svelte/features/getCodeActions/index.d.ts +4 -0
- package/dist/src/plugins/svelte/features/getCodeActions/index.js +19 -0
- package/dist/src/plugins/svelte/features/getCodeActions/index.js.map +1 -0
- package/dist/src/plugins/svelte/features/getCompletions.d.ts +4 -0
- package/dist/src/plugins/svelte/features/getCompletions.js +184 -0
- package/dist/src/plugins/svelte/features/getCompletions.js.map +1 -0
- package/dist/src/plugins/svelte/features/getDiagnostics.d.ts +9 -0
- package/dist/src/plugins/svelte/features/getDiagnostics.js +284 -0
- package/dist/src/plugins/svelte/features/getDiagnostics.js.map +1 -0
- package/dist/src/plugins/svelte/features/getHoverInfo.d.ts +7 -0
- package/dist/src/plugins/svelte/features/getHoverInfo.js +93 -0
- package/dist/src/plugins/svelte/features/getHoverInfo.js.map +1 -0
- package/dist/src/plugins/svelte/features/getModifierData.d.ts +7 -0
- package/dist/src/plugins/svelte/features/getModifierData.js +56 -0
- package/dist/src/plugins/svelte/features/getModifierData.js.map +1 -0
- package/dist/src/plugins/svelte/features/getSelectionRanges.d.ts +3 -0
- package/dist/src/plugins/svelte/features/getSelectionRanges.js +46 -0
- package/dist/src/plugins/svelte/features/getSelectionRanges.js.map +1 -0
- package/dist/src/plugins/svelte/features/utils.d.ts +5 -0
- package/dist/src/plugins/svelte/features/utils.js +18 -0
- package/dist/src/plugins/svelte/features/utils.js.map +1 -0
- package/dist/src/plugins/typescript/ComponentInfoProvider.d.ts +27 -0
- package/dist/src/plugins/typescript/ComponentInfoProvider.js +116 -0
- package/dist/src/plugins/typescript/ComponentInfoProvider.js.map +1 -0
- package/dist/src/plugins/typescript/DocumentMapper.d.ts +10 -0
- package/dist/src/plugins/typescript/DocumentMapper.js +25 -0
- package/dist/src/plugins/typescript/DocumentMapper.js.map +1 -0
- package/dist/src/plugins/typescript/DocumentSnapshot.d.ts +173 -0
- package/dist/src/plugins/typescript/DocumentSnapshot.js +623 -0
- package/dist/src/plugins/typescript/DocumentSnapshot.js.map +1 -0
- package/dist/src/plugins/typescript/LSAndTSDocResolver.d.ts +100 -0
- package/dist/src/plugins/typescript/LSAndTSDocResolver.js +301 -0
- package/dist/src/plugins/typescript/LSAndTSDocResolver.js.map +1 -0
- package/dist/src/plugins/typescript/SnapshotManager.d.ts +59 -0
- package/dist/src/plugins/typescript/SnapshotManager.js +238 -0
- package/dist/src/plugins/typescript/SnapshotManager.js.map +1 -0
- package/dist/src/plugins/typescript/TypeScriptPlugin.d.ts +65 -0
- package/dist/src/plugins/typescript/TypeScriptPlugin.js +332 -0
- package/dist/src/plugins/typescript/TypeScriptPlugin.js.map +1 -0
- package/dist/src/plugins/typescript/features/CallHierarchyProvider.d.ts +24 -0
- package/dist/src/plugins/typescript/features/CallHierarchyProvider.js +325 -0
- package/dist/src/plugins/typescript/features/CallHierarchyProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/CodeActionsProvider.d.ts +72 -0
- package/dist/src/plugins/typescript/features/CodeActionsProvider.js +1030 -0
- package/dist/src/plugins/typescript/features/CodeActionsProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/CodeLensProvider.d.ts +28 -0
- package/dist/src/plugins/typescript/features/CodeLensProvider.js +205 -0
- package/dist/src/plugins/typescript/features/CodeLensProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/CompletionProvider.d.ts +57 -0
- package/dist/src/plugins/typescript/features/CompletionProvider.js +791 -0
- package/dist/src/plugins/typescript/features/CompletionProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/DiagnosticsProvider.d.ts +36 -0
- package/dist/src/plugins/typescript/features/DiagnosticsProvider.js +497 -0
- package/dist/src/plugins/typescript/features/DiagnosticsProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/DocumentHighlightProvider.d.ts +17 -0
- package/dist/src/plugins/typescript/features/DocumentHighlightProvider.js +211 -0
- package/dist/src/plugins/typescript/features/DocumentHighlightProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/FindComponentReferencesProvider.d.ts +9 -0
- package/dist/src/plugins/typescript/features/FindComponentReferencesProvider.js +66 -0
- package/dist/src/plugins/typescript/features/FindComponentReferencesProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/FindFileReferencesProvider.d.ts +9 -0
- package/dist/src/plugins/typescript/features/FindFileReferencesProvider.js +38 -0
- package/dist/src/plugins/typescript/features/FindFileReferencesProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/FindReferencesProvider.d.ts +20 -0
- package/dist/src/plugins/typescript/features/FindReferencesProvider.js +149 -0
- package/dist/src/plugins/typescript/features/FindReferencesProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/FoldingRangeProvider.d.ts +28 -0
- package/dist/src/plugins/typescript/features/FoldingRangeProvider.js +247 -0
- package/dist/src/plugins/typescript/features/FoldingRangeProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/HoverProvider.d.ts +11 -0
- package/dist/src/plugins/typescript/features/HoverProvider.js +75 -0
- package/dist/src/plugins/typescript/features/HoverProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/ImplementationProvider.d.ts +9 -0
- package/dist/src/plugins/typescript/features/ImplementationProvider.js +47 -0
- package/dist/src/plugins/typescript/features/ImplementationProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/InlayHintProvider.d.ts +22 -0
- package/dist/src/plugins/typescript/features/InlayHintProvider.js +225 -0
- package/dist/src/plugins/typescript/features/InlayHintProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/RenameProvider.d.ts +53 -0
- package/dist/src/plugins/typescript/features/RenameProvider.js +423 -0
- package/dist/src/plugins/typescript/features/RenameProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/SelectionRangeProvider.d.ts +18 -0
- package/dist/src/plugins/typescript/features/SelectionRangeProvider.js +62 -0
- package/dist/src/plugins/typescript/features/SelectionRangeProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/SemanticTokensProvider.d.ts +15 -0
- package/dist/src/plugins/typescript/features/SemanticTokensProvider.js +116 -0
- package/dist/src/plugins/typescript/features/SemanticTokensProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/SignatureHelpProvider.d.ts +22 -0
- package/dist/src/plugins/typescript/features/SignatureHelpProvider.js +110 -0
- package/dist/src/plugins/typescript/features/SignatureHelpProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/TypeDefinitionProvider.d.ts +9 -0
- package/dist/src/plugins/typescript/features/TypeDefinitionProvider.js +35 -0
- package/dist/src/plugins/typescript/features/TypeDefinitionProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/UpdateImportsProvider.d.ts +11 -0
- package/dist/src/plugins/typescript/features/UpdateImportsProvider.js +109 -0
- package/dist/src/plugins/typescript/features/UpdateImportsProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/WorkspaceSymbolProvider.d.ts +25 -0
- package/dist/src/plugins/typescript/features/WorkspaceSymbolProvider.js +176 -0
- package/dist/src/plugins/typescript/features/WorkspaceSymbolProvider.js.map +1 -0
- package/dist/src/plugins/typescript/features/getDirectiveCommentCompletions.d.ts +13 -0
- package/dist/src/plugins/typescript/features/getDirectiveCommentCompletions.js +58 -0
- package/dist/src/plugins/typescript/features/getDirectiveCommentCompletions.js.map +1 -0
- package/dist/src/plugins/typescript/features/getJsDocTemplateCompletion.d.ts +4 -0
- package/dist/src/plugins/typescript/features/getJsDocTemplateCompletion.js +57 -0
- package/dist/src/plugins/typescript/features/getJsDocTemplateCompletion.js.map +1 -0
- package/dist/src/plugins/typescript/features/utils.d.ts +81 -0
- package/dist/src/plugins/typescript/features/utils.js +331 -0
- package/dist/src/plugins/typescript/features/utils.js.map +1 -0
- package/dist/src/plugins/typescript/macroforgeAugmenter.d.ts +23 -0
- package/dist/src/plugins/typescript/macroforgeAugmenter.js +41 -0
- package/dist/src/plugins/typescript/macroforgeAugmenter.js.map +1 -0
- package/dist/src/plugins/typescript/module-loader.d.ts +28 -0
- package/dist/src/plugins/typescript/module-loader.js +254 -0
- package/dist/src/plugins/typescript/module-loader.js.map +1 -0
- package/dist/src/plugins/typescript/previewer.d.ts +7 -0
- package/dist/src/plugins/typescript/previewer.js +120 -0
- package/dist/src/plugins/typescript/previewer.js.map +1 -0
- package/dist/src/plugins/typescript/service.d.ts +105 -0
- package/dist/src/plugins/typescript/service.js +1073 -0
- package/dist/src/plugins/typescript/service.js.map +1 -0
- package/dist/src/plugins/typescript/serviceCache.d.ts +90 -0
- package/dist/src/plugins/typescript/serviceCache.js +50 -0
- package/dist/src/plugins/typescript/serviceCache.js.map +1 -0
- package/dist/src/plugins/typescript/svelte-ast-utils.d.ts +77 -0
- package/dist/src/plugins/typescript/svelte-ast-utils.js +100 -0
- package/dist/src/plugins/typescript/svelte-ast-utils.js.map +1 -0
- package/dist/src/plugins/typescript/svelte-sys.d.ts +9 -0
- package/dist/src/plugins/typescript/svelte-sys.js +79 -0
- package/dist/src/plugins/typescript/svelte-sys.js.map +1 -0
- package/dist/src/plugins/typescript/utils.d.ts +48 -0
- package/dist/src/plugins/typescript/utils.js +334 -0
- package/dist/src/plugins/typescript/utils.js.map +1 -0
- package/dist/src/server.d.ts +19 -0
- package/dist/src/server.js +434 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/svelte-check.d.ts +65 -0
- package/dist/src/svelte-check.js +288 -0
- package/dist/src/svelte-check.js.map +1 -0
- package/dist/src/utils.d.ts +111 -0
- package/dist/src/utils.js +337 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SveltePlugin = void 0;
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
6
|
+
const importPackage_1 = require("../../importPackage");
|
|
7
|
+
const logger_1 = require("../../logger");
|
|
8
|
+
const utils_1 = require("../../utils");
|
|
9
|
+
const getCodeActions_1 = require("./features/getCodeActions");
|
|
10
|
+
const getCompletions_1 = require("./features/getCompletions");
|
|
11
|
+
const getDiagnostics_1 = require("./features/getDiagnostics");
|
|
12
|
+
const getHoverInfo_1 = require("./features/getHoverInfo");
|
|
13
|
+
const getSelectionRanges_1 = require("./features/getSelectionRanges");
|
|
14
|
+
const SvelteDocument_1 = require("./SvelteDocument");
|
|
15
|
+
class SveltePlugin {
|
|
16
|
+
constructor(configManager) {
|
|
17
|
+
this.configManager = configManager;
|
|
18
|
+
this.__name = 'svelte';
|
|
19
|
+
this.docManager = new Map();
|
|
20
|
+
}
|
|
21
|
+
async getCodeLens(document) {
|
|
22
|
+
if (!this.featureEnabled('runesLegacyModeCodeLens'))
|
|
23
|
+
return null;
|
|
24
|
+
if (!document.isSvelte5)
|
|
25
|
+
return null;
|
|
26
|
+
const doc = await this.getSvelteDoc(document);
|
|
27
|
+
try {
|
|
28
|
+
const result = await doc.getCompiled();
|
|
29
|
+
// @ts-ignore
|
|
30
|
+
const runes = result.metadata.runes;
|
|
31
|
+
return [
|
|
32
|
+
{
|
|
33
|
+
range: {
|
|
34
|
+
start: { line: 0, character: 0 },
|
|
35
|
+
end: { line: 0, character: 0 }
|
|
36
|
+
},
|
|
37
|
+
command: {
|
|
38
|
+
title: runes ? 'Runes mode' : 'Legacy mode',
|
|
39
|
+
command: 'svelte.openLink',
|
|
40
|
+
arguments: ['https://svelte.dev/docs/svelte/legacy-overview']
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
// show an empty code lens in case of a compilation error to prevent code from jumping around
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
range: {
|
|
50
|
+
start: { line: 0, character: 0 },
|
|
51
|
+
end: { line: 0, character: 0 }
|
|
52
|
+
},
|
|
53
|
+
command: {
|
|
54
|
+
title: '',
|
|
55
|
+
command: ''
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async getDiagnostics(document, cancellationToken) {
|
|
62
|
+
if (!this.featureEnabled('diagnostics') || !this.configManager.getIsTrusted()) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
return (0, getDiagnostics_1.getDiagnostics)(document, await this.getSvelteDoc(document), this.configManager.getConfig().svelte.compilerWarnings, cancellationToken);
|
|
66
|
+
}
|
|
67
|
+
async getCompiledResult(document) {
|
|
68
|
+
try {
|
|
69
|
+
const svelteDoc = await this.getSvelteDoc(document);
|
|
70
|
+
const options = { generate: 'dom' }; // 'client' in Svelte 5
|
|
71
|
+
// @ts-ignore Svelte 5 only; we gotta write it like this else Svelte 4 fails on unknown key
|
|
72
|
+
if (document.config?.compilerOptions?.experimental) {
|
|
73
|
+
// @ts-ignore Svelte 5 only
|
|
74
|
+
options.experimental = document.config.compilerOptions.experimental;
|
|
75
|
+
}
|
|
76
|
+
return await svelteDoc.getCompiledWith(options);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async formatDocument(document, options) {
|
|
83
|
+
if (!this.featureEnabled('format')) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
const filePath = document.getFilePath();
|
|
87
|
+
/**
|
|
88
|
+
* Prettier v2 can't use v3 plugins and vice versa. Therefore, we need to check
|
|
89
|
+
* which version of prettier is used in the workspace and import the correct
|
|
90
|
+
* version of the Svelte plugin. If user uses Prettier < 3 and has no Svelte plugin
|
|
91
|
+
* then fall back to our built-in versions which are both v3 and compatible with
|
|
92
|
+
* each other.
|
|
93
|
+
*/
|
|
94
|
+
const importFittingPrettier = async () => {
|
|
95
|
+
const getConfig = async (p) => {
|
|
96
|
+
// Try resolving the config through prettier and fall back to possible editor config
|
|
97
|
+
return this.configManager.getMergedPrettierConfig(await p.resolveConfig(filePath, { editorconfig: true }),
|
|
98
|
+
// Be defensive here because IDEs other than VSCode might not have these settings
|
|
99
|
+
options && {
|
|
100
|
+
tabWidth: options.tabSize,
|
|
101
|
+
useTabs: !options.insertSpaces
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
const prettier1 = (0, importPackage_1.importPrettier)(filePath);
|
|
105
|
+
const config1 = await getConfig(prettier1);
|
|
106
|
+
const resolvedPlugins1 = resolvePlugins(config1.plugins);
|
|
107
|
+
const pluginLoaded = await hasSveltePluginLoaded(prettier1, resolvedPlugins1);
|
|
108
|
+
if (Number(prettier1.version[0]) >= 3 || pluginLoaded) {
|
|
109
|
+
// plugin loaded, or referenced in user config as a plugin, or same version as our fallback version -> ok
|
|
110
|
+
return {
|
|
111
|
+
prettier: prettier1,
|
|
112
|
+
config: config1,
|
|
113
|
+
isFallback: false,
|
|
114
|
+
resolvedPlugins: resolvedPlugins1
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// User either only has Plugin or incompatible Prettier major version installed or none
|
|
118
|
+
// -> load our fallback version
|
|
119
|
+
const prettier2 = (0, importPackage_1.importPrettier)(__dirname);
|
|
120
|
+
const config2 = await getConfig(prettier2);
|
|
121
|
+
const resolvedPlugins2 = resolvePlugins(config2.plugins);
|
|
122
|
+
return {
|
|
123
|
+
prettier: prettier2,
|
|
124
|
+
config: config2,
|
|
125
|
+
isFallback: true,
|
|
126
|
+
resolvedPlugins: resolvedPlugins2
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
const { prettier, config, isFallback, resolvedPlugins } = await importFittingPrettier();
|
|
130
|
+
// If user has prettier-plugin-svelte 1.x, then remove `options` from the sort
|
|
131
|
+
// order or else it will throw a config error (`options` was not present back then).
|
|
132
|
+
if (config?.svelteSortOrder &&
|
|
133
|
+
(0, importPackage_1.getPackageInfo)('prettier-plugin-svelte', filePath)?.version.major < 2) {
|
|
134
|
+
config.svelteSortOrder = config.svelteSortOrder
|
|
135
|
+
.replace('-options', '')
|
|
136
|
+
.replace('options-', '');
|
|
137
|
+
}
|
|
138
|
+
// If user has prettier-plugin-svelte 3.x, then add `options` from the sort
|
|
139
|
+
// order or else it will throw a config error (now required).
|
|
140
|
+
if (config?.svelteSortOrder &&
|
|
141
|
+
!config.svelteSortOrder.includes('options') &&
|
|
142
|
+
config.svelteSortOrder !== 'none' &&
|
|
143
|
+
(0, importPackage_1.getPackageInfo)('prettier-plugin-svelte', filePath)?.version.major >= 3) {
|
|
144
|
+
config.svelteSortOrder = 'options-' + config.svelteSortOrder;
|
|
145
|
+
}
|
|
146
|
+
// Take .prettierignore into account
|
|
147
|
+
const fileInfo = await prettier.getFileInfo(filePath, {
|
|
148
|
+
ignorePath: this.configManager.getPrettierConfig()?.ignorePath ?? '.prettierignore',
|
|
149
|
+
// Sapper places stuff within src/node_modules, we want to format that, too
|
|
150
|
+
withNodeModules: true
|
|
151
|
+
});
|
|
152
|
+
if (fileInfo.ignored) {
|
|
153
|
+
logger_1.Logger.debug('File is ignored, formatting skipped');
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
if (isFallback || !(await hasSveltePluginLoaded(prettier, resolvedPlugins))) {
|
|
157
|
+
// If the user uses Svelte 5 but doesn't have prettier installed, we need to provide
|
|
158
|
+
// the compiler path to the plugin so it can use its parser method; else it will crash.
|
|
159
|
+
const svelteCompilerInfo = (0, importPackage_1.getPackageInfo)('svelte', filePath);
|
|
160
|
+
if (svelteCompilerInfo.version.major >= 5) {
|
|
161
|
+
config.svelte5CompilerPath = svelteCompilerInfo.path + '/compiler';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Prettier v3 format is async, v2 is not
|
|
165
|
+
const formattedCode = await prettier.format(document.getText(), {
|
|
166
|
+
...config,
|
|
167
|
+
plugins: Array.from(new Set([...resolvedPlugins, ...(await getSveltePlugin(resolvedPlugins))])),
|
|
168
|
+
parser: 'svelte'
|
|
169
|
+
});
|
|
170
|
+
return document.getText() === formattedCode
|
|
171
|
+
? []
|
|
172
|
+
: [
|
|
173
|
+
vscode_languageserver_1.TextEdit.replace(vscode_languageserver_1.Range.create(document.positionAt(0), document.positionAt(document.getTextLength())), formattedCode)
|
|
174
|
+
];
|
|
175
|
+
async function getSveltePlugin(plugins = []) {
|
|
176
|
+
// Only provide our version of the svelte plugin if the user doesn't have one in
|
|
177
|
+
// the workspace already. If we did it, Prettier would - for some reason - use
|
|
178
|
+
// the workspace version for parsing and the extension version for printing,
|
|
179
|
+
// which could crash if the contract of the parser output changed.
|
|
180
|
+
return !isFallback && (await hasSveltePluginLoaded(prettier, plugins))
|
|
181
|
+
? []
|
|
182
|
+
: [require.resolve('prettier-plugin-svelte')];
|
|
183
|
+
}
|
|
184
|
+
async function hasSveltePluginLoaded(p, plugins = []) {
|
|
185
|
+
if (plugins.some(SveltePlugin.isPrettierPluginSvelte))
|
|
186
|
+
return true;
|
|
187
|
+
if (Number(p.version[0]) >= 3)
|
|
188
|
+
return false; // Prettier version 3 has removed the "search plugins" feature
|
|
189
|
+
// Prettier v3 getSupportInfo is async, v2 is not
|
|
190
|
+
const info = await p.getSupportInfo();
|
|
191
|
+
return info.languages.some((l) => l.name === 'svelte');
|
|
192
|
+
}
|
|
193
|
+
function resolvePlugins(plugins) {
|
|
194
|
+
return (plugins ?? []).map(resolvePlugin).filter(utils_1.isNotNullOrUndefined);
|
|
195
|
+
}
|
|
196
|
+
function resolvePlugin(plugin) {
|
|
197
|
+
// https://github.com/prettier/prettier-vscode/blob/160b0e92d88fa19003dce2745d5ab8c67e886a04/src/ModuleResolver.ts#L373
|
|
198
|
+
if (typeof plugin != 'string' || (0, path_1.isAbsolute)(plugin) || plugin.startsWith('.')) {
|
|
199
|
+
return plugin;
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
return require.resolve(plugin, {
|
|
203
|
+
paths: [filePath]
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
logger_1.Logger.error(`failed to resolve plugin ${plugin} with error:\n`, error);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
static isPrettierPluginSvelte(plugin) {
|
|
212
|
+
if (typeof plugin === 'string') {
|
|
213
|
+
return plugin.includes('prettier-plugin-svelte');
|
|
214
|
+
}
|
|
215
|
+
return !!plugin?.languages?.find((l) => l.name === 'svelte');
|
|
216
|
+
}
|
|
217
|
+
async getCompletions(document, position, _, cancellationToken) {
|
|
218
|
+
if (!this.featureEnabled('completions')) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
const svelteDoc = await this.getSvelteDoc(document);
|
|
222
|
+
if (cancellationToken?.isCancellationRequested) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
return (0, getCompletions_1.getCompletions)(document, svelteDoc, position);
|
|
226
|
+
}
|
|
227
|
+
async doHover(document, position) {
|
|
228
|
+
if (!this.featureEnabled('hover')) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
return (0, getHoverInfo_1.getHoverInfo)(document, await this.getSvelteDoc(document), position);
|
|
232
|
+
}
|
|
233
|
+
async getCodeActions(document, range, context, cancellationToken) {
|
|
234
|
+
if (!this.featureEnabled('codeActions')) {
|
|
235
|
+
return [];
|
|
236
|
+
}
|
|
237
|
+
const svelteDoc = await this.getSvelteDoc(document);
|
|
238
|
+
if (cancellationToken?.isCancellationRequested) {
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
try {
|
|
242
|
+
return (0, getCodeActions_1.getCodeActions)(svelteDoc, range, context);
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
return [];
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async executeCommand(document, command, args) {
|
|
249
|
+
if (command === 'migrate_to_svelte_5') {
|
|
250
|
+
return this.migrate(document);
|
|
251
|
+
}
|
|
252
|
+
if (!this.featureEnabled('codeActions')) {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
const svelteDoc = await this.getSvelteDoc(document);
|
|
256
|
+
try {
|
|
257
|
+
return (0, getCodeActions_1.executeCommand)(svelteDoc, command, args);
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
migrate(document) {
|
|
264
|
+
try {
|
|
265
|
+
const compiler = document.compiler;
|
|
266
|
+
if (!compiler.migrate) {
|
|
267
|
+
return 'Your installed Svelte version does not support migration';
|
|
268
|
+
}
|
|
269
|
+
const migrated = compiler.migrate(document.getText(), {
|
|
270
|
+
filename: document.getFilePath() ?? undefined
|
|
271
|
+
});
|
|
272
|
+
return {
|
|
273
|
+
changes: {
|
|
274
|
+
[document.uri]: [
|
|
275
|
+
vscode_languageserver_1.TextEdit.replace(vscode_languageserver_1.Range.create(document.positionAt(0), document.positionAt(document.getTextLength())), migrated.code)
|
|
276
|
+
]
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
logger_1.Logger.error('Failed to migrate Svelte file', error);
|
|
282
|
+
return error?.message ?? 'Failed to migrate Svelte file';
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
async getSelectionRange(document, position) {
|
|
286
|
+
if (!this.featureEnabled('selectionRange')) {
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
const svelteDoc = await this.getSvelteDoc(document);
|
|
290
|
+
return (0, getSelectionRanges_1.getSelectionRange)(svelteDoc, position);
|
|
291
|
+
}
|
|
292
|
+
featureEnabled(feature) {
|
|
293
|
+
return (this.configManager.enabled('svelte.enable') &&
|
|
294
|
+
this.configManager.enabled(`svelte.${feature}.enable`));
|
|
295
|
+
}
|
|
296
|
+
async getSvelteDoc(document) {
|
|
297
|
+
let svelteDoc = this.docManager.get(document);
|
|
298
|
+
if (!svelteDoc || svelteDoc.version !== document.version) {
|
|
299
|
+
svelteDoc = new SvelteDocument_1.SvelteDocument(document);
|
|
300
|
+
this.docManager.set(document, svelteDoc);
|
|
301
|
+
}
|
|
302
|
+
return svelteDoc;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
exports.SveltePlugin = SveltePlugin;
|
|
306
|
+
//# sourceMappingURL=SveltePlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SveltePlugin.js","sourceRoot":"","sources":["../../../../src/plugins/svelte/SveltePlugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { SvelteDocument } from '../SvelteDocument';
|
|
2
|
+
/**
|
|
3
|
+
* Special svelte syntax tags that do template logic.
|
|
4
|
+
*/
|
|
5
|
+
export type SvelteLogicTag = 'each' | 'if' | 'await' | 'key' | 'snippet';
|
|
6
|
+
/**
|
|
7
|
+
* Special svelte syntax tags.
|
|
8
|
+
*/
|
|
9
|
+
export type SvelteTag = SvelteLogicTag | 'html' | 'debug' | 'const' | 'render' | 'attach';
|
|
10
|
+
/**
|
|
11
|
+
* For each tag, a documentation in markdown format.
|
|
12
|
+
*/
|
|
13
|
+
export declare const documentation: {
|
|
14
|
+
await: string;
|
|
15
|
+
each: string;
|
|
16
|
+
if: string;
|
|
17
|
+
key: string;
|
|
18
|
+
snippet: string;
|
|
19
|
+
render: string;
|
|
20
|
+
html: string;
|
|
21
|
+
debug: string;
|
|
22
|
+
const: string;
|
|
23
|
+
attach: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Get the last tag that is opened but not closed.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getLatestOpeningTag(svelteDoc: SvelteDocument, offset: number): SvelteLogicTag | null;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.documentation = void 0;
|
|
4
|
+
exports.getLatestOpeningTag = getLatestOpeningTag;
|
|
5
|
+
/**
|
|
6
|
+
* For each tag, a documentation in markdown format.
|
|
7
|
+
*/
|
|
8
|
+
exports.documentation = {
|
|
9
|
+
await: `\`{#await ...}\`\\
|
|
10
|
+
Await blocks allow you to branch on the three possible states of a Promise — pending, ` +
|
|
11
|
+
`fulfilled or rejected.
|
|
12
|
+
#### Usage:
|
|
13
|
+
\`{#await expression}...{:then name}...{:catch name}...{/await}\`\\
|
|
14
|
+
\`{#await expression}...{:then name}...{/await}\`\\
|
|
15
|
+
\`{#await expression then name}...{/await}\`\\
|
|
16
|
+
\\
|
|
17
|
+
https://svelte.dev/docs/svelte/await
|
|
18
|
+
`,
|
|
19
|
+
each: `\`{#each ...}\`\\
|
|
20
|
+
Iterating over lists of values can be done with an each block.
|
|
21
|
+
#### Usage:
|
|
22
|
+
\`{#each expression as name}...{/each}\`\\
|
|
23
|
+
\`{#each expression as name, index}...{/each}\`\\
|
|
24
|
+
\`{#each expression as name, index (key)}...{/each}\`\\
|
|
25
|
+
\`{#each expression as name}...{:else}...{/each}\`\\
|
|
26
|
+
\\
|
|
27
|
+
https://svelte.dev/docs/svelte/each
|
|
28
|
+
`,
|
|
29
|
+
if: `\`{#if ...}\`\\
|
|
30
|
+
Content that is conditionally rendered can be wrapped in an if block.
|
|
31
|
+
#### Usage:
|
|
32
|
+
\`{#if expression}...{/if}\`\\
|
|
33
|
+
\`{#if expression}...{:else if expression}...{/if}\`\\
|
|
34
|
+
\`{#if expression}...{:else}...{/if}\`\\
|
|
35
|
+
\\
|
|
36
|
+
https://svelte.dev/docs/svelte/if
|
|
37
|
+
`,
|
|
38
|
+
key: `\`{#key expression}...{/key}\`\\
|
|
39
|
+
Key blocks destroy and recreate their contents when the value of an expression changes.\\
|
|
40
|
+
This is useful if you want an element to play its transition whenever a value changes.\\
|
|
41
|
+
When used around components, this will cause them to be reinstantiated and reinitialised.
|
|
42
|
+
#### Usage:
|
|
43
|
+
\`{#key expression}...{/key}\`\\
|
|
44
|
+
\\
|
|
45
|
+
https://svelte.dev/docs/svelte/key
|
|
46
|
+
`,
|
|
47
|
+
snippet: `\`{#snippet identifier(parameter)}...{/snippet}\`\\
|
|
48
|
+
Snippets allow you to create reusable UI blocks you can render with the {@render ...} tag.
|
|
49
|
+
They also function as slot props for components.
|
|
50
|
+
#### Usage:
|
|
51
|
+
\`{#snippet identifier(parameter)}...{/snippet}\`\\
|
|
52
|
+
\\
|
|
53
|
+
https://svelte.dev/docs/svelte/snippet
|
|
54
|
+
`,
|
|
55
|
+
render: `\`{@render ...}\`\\
|
|
56
|
+
Renders a snippet with the given parameters.
|
|
57
|
+
#### Usage:
|
|
58
|
+
\`{@render identifier(parameter)}\`\\
|
|
59
|
+
\\
|
|
60
|
+
https://svelte.dev/docs/svelte/@render
|
|
61
|
+
`,
|
|
62
|
+
html: `\`{@html ...}\`\\
|
|
63
|
+
In a text expression, characters like < and > are escaped; however, ` +
|
|
64
|
+
`with HTML expressions, they're not.
|
|
65
|
+
The expression should be valid standalone HTML.
|
|
66
|
+
#### Caution
|
|
67
|
+
Svelte does not sanitize expressions before injecting HTML.
|
|
68
|
+
If the data comes from an untrusted source, you must sanitize it, ` +
|
|
69
|
+
`or you are exposing your users to an XSS vulnerability.
|
|
70
|
+
#### Usage:
|
|
71
|
+
\`{@html expression}\`\\
|
|
72
|
+
\\
|
|
73
|
+
https://svelte.dev/docs/svelte/@html
|
|
74
|
+
`,
|
|
75
|
+
debug: `\`{@debug ...}\`\\
|
|
76
|
+
Offers an alternative to \`console.log(...)\`.
|
|
77
|
+
It logs the values of specific variables whenever they change, ` +
|
|
78
|
+
`and pauses code execution if you have devtools open.
|
|
79
|
+
It accepts a comma-separated list of variable names (not arbitrary expressions).
|
|
80
|
+
#### Usage:
|
|
81
|
+
\`{@debug}\`
|
|
82
|
+
\`{@debug var1, var2, ..., varN}\`\\
|
|
83
|
+
\\
|
|
84
|
+
https://svelte.dev/docs/svelte/@debug
|
|
85
|
+
`,
|
|
86
|
+
const: `\`{@const ...}\`\\
|
|
87
|
+
Defines a local constant\\
|
|
88
|
+
#### Usage:
|
|
89
|
+
\`{@const a = b + c}\`\\
|
|
90
|
+
\\
|
|
91
|
+
https://svelte.dev/docs/svelte/@const
|
|
92
|
+
`,
|
|
93
|
+
attach: `\`{@attach ...}\`\\
|
|
94
|
+
Defines an attachment that is attached to an element or component\\
|
|
95
|
+
#### Usage:
|
|
96
|
+
\`<div {@attach (node) => {...}}></div>\`\\
|
|
97
|
+
\`<Component {@attach namedAttachment} />\`\\
|
|
98
|
+
\\
|
|
99
|
+
https://svelte.dev/docs/svelte/@attach
|
|
100
|
+
`
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Get the last tag that is opened but not closed.
|
|
104
|
+
*/
|
|
105
|
+
function getLatestOpeningTag(svelteDoc, offset) {
|
|
106
|
+
// Only use content up to the position and strip out html comments
|
|
107
|
+
const content = svelteDoc
|
|
108
|
+
.getText()
|
|
109
|
+
.substring(0, offset)
|
|
110
|
+
.replace(/<!--(.*?)-->/g, '');
|
|
111
|
+
const lastIdxs = [
|
|
112
|
+
idxOfLastOpeningTag(content, 'each'),
|
|
113
|
+
idxOfLastOpeningTag(content, 'if'),
|
|
114
|
+
idxOfLastOpeningTag(content, 'await'),
|
|
115
|
+
idxOfLastOpeningTag(content, 'key'),
|
|
116
|
+
idxOfLastOpeningTag(content, 'snippet')
|
|
117
|
+
];
|
|
118
|
+
const lastIdx = lastIdxs.sort((i1, i2) => i2.lastIdx - i1.lastIdx);
|
|
119
|
+
return lastIdx[0].lastIdx === -1 ? null : lastIdx[0].tag;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get the last tag and its index that is opened but not closed.
|
|
123
|
+
*/
|
|
124
|
+
function idxOfLastOpeningTag(content, tag) {
|
|
125
|
+
const nrOfEndingTags = content.match(new RegExp(`{\\s*/${tag}`, 'g'))?.length ?? 0;
|
|
126
|
+
let lastIdx = -1;
|
|
127
|
+
let nrOfOpeningTags = 0;
|
|
128
|
+
let match;
|
|
129
|
+
const regexp = new RegExp(`{\\s*#${tag}`, 'g');
|
|
130
|
+
while ((match = regexp.exec(content)) != null) {
|
|
131
|
+
nrOfOpeningTags += 1;
|
|
132
|
+
lastIdx = match.index;
|
|
133
|
+
}
|
|
134
|
+
return { lastIdx: nrOfOpeningTags <= nrOfEndingTags ? -1 : lastIdx, tag };
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=SvelteTags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SvelteTags.js","sourceRoot":"","sources":["../../../../../src/plugins/svelte/features/SvelteTags.ts"],"names":[],"mappings":";;;AAoHA,kDAkBC;AA1HD;;GAEG;AACU,QAAA,aAAa,GAAG;IACzB,KAAK,EACD;uFAC+E;QAC/E;;;;;;;CAOP;IACG,IAAI,EAAE;;;;;;;;;CAST;IACG,EAAE,EAAE;;;;;;;;CAQP;IACG,GAAG,EAAE;;;;;;;;CAQR;IACG,OAAO,EAAE;;;;;;;CAOZ;IACG,MAAM,EAAE;;;;;;CAMX;IACG,IAAI,EACA;qEAC6D;QAC7D;;;;mEAI2D;QAC3D;;;;;CAKP;IACG,KAAK,EACD;;gEAEwD;QACxD;;;;;;;CAOP;IACG,KAAK,EAAE;;;;;;CAMV;IACG,MAAM,EAAE;;;;;;;CAOX;CACA,CAAC;AAEF;;GAEG;AACH,SAAgB,mBAAmB,CAC/B,SAAyB,EACzB,MAAc;IAEd,kEAAkE;IAClE,MAAM,OAAO,GAAG,SAAS;SACpB,OAAO,EAAE;SACT,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;SACpB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG;QACb,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC;QACpC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC;QAClC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;QACrC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC;QACnC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC;KAC1C,CAAC;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAe,EAAE,GAAmB;IAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IAEnF,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,KAA6B,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5C,eAAe,IAAI,CAAC,CAAC;QACrB,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,eAAe,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CodeAction, Diagnostic } from 'vscode-languageserver';
|
|
2
|
+
import { SvelteDocument } from '../../SvelteDocument';
|
|
3
|
+
/**
|
|
4
|
+
* Get applicable quick fixes.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getQuickfixActions(svelteDoc: SvelteDocument, svelteDiagnostics: Diagnostic[]): Promise<CodeAction[]>;
|
|
7
|
+
/**
|
|
8
|
+
* Whether or not the given diagnostic can be ignored via a
|
|
9
|
+
* <!-- svelte-ignore <code> -->
|
|
10
|
+
*/
|
|
11
|
+
export declare function isIgnorableSvelteDiagnostic(diagnostic: Diagnostic): boolean | "" | 0 | undefined;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getQuickfixActions = getQuickfixActions;
|
|
4
|
+
exports.isIgnorableSvelteDiagnostic = isIgnorableSvelteDiagnostic;
|
|
5
|
+
const estree_walker_1 = require("estree-walker");
|
|
6
|
+
const os_1 = require("os");
|
|
7
|
+
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
8
|
+
const documents_1 = require("../../../../lib/documents");
|
|
9
|
+
const utils_1 = require("../../../../utils");
|
|
10
|
+
/**
|
|
11
|
+
* Get applicable quick fixes.
|
|
12
|
+
*/
|
|
13
|
+
async function getQuickfixActions(svelteDoc, svelteDiagnostics) {
|
|
14
|
+
const textDocument = vscode_languageserver_1.OptionalVersionedTextDocumentIdentifier.create((0, utils_1.pathToUrl)(svelteDoc.getFilePath()), null);
|
|
15
|
+
const { ast } = await svelteDoc.getCompiled();
|
|
16
|
+
const transpiled = await svelteDoc.getTranspiled();
|
|
17
|
+
const content = transpiled.getText();
|
|
18
|
+
const lineOffsets = (0, documents_1.getLineOffsets)(content);
|
|
19
|
+
const codeActions = [];
|
|
20
|
+
for (const diagnostic of svelteDiagnostics) {
|
|
21
|
+
codeActions.push(...(await createQuickfixActions(textDocument, transpiled, content, lineOffsets, ast, diagnostic)));
|
|
22
|
+
}
|
|
23
|
+
return codeActions;
|
|
24
|
+
}
|
|
25
|
+
async function createQuickfixActions(textDocument, transpiled, content, lineOffsets, ast, diagnostic) {
|
|
26
|
+
const { range: { start, end } } = diagnostic;
|
|
27
|
+
const generatedStart = transpiled.getGeneratedPosition(start);
|
|
28
|
+
const generatedEnd = transpiled.getGeneratedPosition(end);
|
|
29
|
+
const diagnosticStartOffset = (0, documents_1.offsetAt)(generatedStart, content, lineOffsets);
|
|
30
|
+
const diagnosticEndOffset = (0, documents_1.offsetAt)(generatedEnd, content, lineOffsets);
|
|
31
|
+
const offsetRange = {
|
|
32
|
+
pos: diagnosticStartOffset,
|
|
33
|
+
end: diagnosticEndOffset
|
|
34
|
+
};
|
|
35
|
+
const { html, instance, module } = ast;
|
|
36
|
+
const tree = [html, instance, module].find((part) => {
|
|
37
|
+
return (part?.start != null &&
|
|
38
|
+
offsetRange.pos >= part.start &&
|
|
39
|
+
part?.end != null &&
|
|
40
|
+
offsetRange.pos <= part.end &&
|
|
41
|
+
part?.end != null &&
|
|
42
|
+
offsetRange.end <= part.end &&
|
|
43
|
+
part?.start != null &&
|
|
44
|
+
offsetRange.end >= part.start);
|
|
45
|
+
});
|
|
46
|
+
const node = findTagForRange(tree, offsetRange, tree === html);
|
|
47
|
+
const codeActions = [];
|
|
48
|
+
if (diagnostic.code == 'security-anchor-rel-noreferrer') {
|
|
49
|
+
codeActions.push(createSvelteAnchorMissingAttributeQuickfixAction(textDocument, transpiled, content, lineOffsets, node));
|
|
50
|
+
}
|
|
51
|
+
codeActions.push(createSvelteIgnoreQuickfixAction(textDocument, transpiled, content, lineOffsets, node, diagnostic, tree === html));
|
|
52
|
+
return codeActions;
|
|
53
|
+
}
|
|
54
|
+
function createSvelteAnchorMissingAttributeQuickfixAction(textDocument, transpiled, content, lineOffsets, node) {
|
|
55
|
+
// Assert non-null because the node target attribute is required for 'security-anchor-rel-noreferrer'
|
|
56
|
+
const targetAttribute = node.attributes.find((i) => i.name == 'target');
|
|
57
|
+
const relAttribute = node.attributes.find((i) => i.name == 'rel');
|
|
58
|
+
const codeActionTextEdit = relAttribute
|
|
59
|
+
? vscode_languageserver_1.TextEdit.insert((0, documents_1.positionAt)(relAttribute.end - 1, content, lineOffsets), ' noreferrer')
|
|
60
|
+
: vscode_languageserver_1.TextEdit.insert((0, documents_1.positionAt)(targetAttribute.end, content, lineOffsets), ' rel="noreferrer"');
|
|
61
|
+
return vscode_languageserver_1.CodeAction.create('(svelte) Add missing attribute rel="noreferrer"', {
|
|
62
|
+
documentChanges: [
|
|
63
|
+
vscode_languageserver_1.TextDocumentEdit.create(textDocument, [
|
|
64
|
+
(0, documents_1.mapObjWithRangeToOriginal)(transpiled, codeActionTextEdit)
|
|
65
|
+
])
|
|
66
|
+
]
|
|
67
|
+
}, vscode_languageserver_1.CodeActionKind.QuickFix);
|
|
68
|
+
}
|
|
69
|
+
function createSvelteIgnoreQuickfixAction(textDocument, transpiled, content, lineOffsets, node, diagnostic, isHtml) {
|
|
70
|
+
return vscode_languageserver_1.CodeAction.create(getCodeActionTitle(diagnostic), {
|
|
71
|
+
documentChanges: [
|
|
72
|
+
vscode_languageserver_1.TextDocumentEdit.create(textDocument, [
|
|
73
|
+
getSvelteIgnoreEdit(transpiled, content, lineOffsets, node, diagnostic, isHtml)
|
|
74
|
+
])
|
|
75
|
+
]
|
|
76
|
+
}, vscode_languageserver_1.CodeActionKind.QuickFix);
|
|
77
|
+
}
|
|
78
|
+
function getCodeActionTitle(diagnostic) {
|
|
79
|
+
// make it distinguishable with eslint's code action
|
|
80
|
+
return `(svelte) Disable ${diagnostic.code} for this line`;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Whether or not the given diagnostic can be ignored via a
|
|
84
|
+
* <!-- svelte-ignore <code> -->
|
|
85
|
+
*/
|
|
86
|
+
function isIgnorableSvelteDiagnostic(diagnostic) {
|
|
87
|
+
const { source, severity, code } = diagnostic;
|
|
88
|
+
return (code &&
|
|
89
|
+
!nonIgnorableWarnings.includes(code) &&
|
|
90
|
+
source === 'svelte' &&
|
|
91
|
+
severity !== vscode_languageserver_1.DiagnosticSeverity.Error);
|
|
92
|
+
}
|
|
93
|
+
const nonIgnorableWarnings = [
|
|
94
|
+
'missing-custom-element-compile-options',
|
|
95
|
+
'unused-export-let',
|
|
96
|
+
'css-unused-selector'
|
|
97
|
+
];
|
|
98
|
+
function getSvelteIgnoreEdit(transpiled, content, lineOffsets, node, diagnostic, isHtml) {
|
|
99
|
+
const { code } = diagnostic;
|
|
100
|
+
const nodeStartPosition = (0, documents_1.positionAt)(node.start, content, lineOffsets);
|
|
101
|
+
const nodeLineStart = (0, documents_1.offsetAt)({
|
|
102
|
+
line: nodeStartPosition.line,
|
|
103
|
+
character: 0
|
|
104
|
+
}, content, lineOffsets);
|
|
105
|
+
const afterStartLineStart = content.slice(nodeLineStart);
|
|
106
|
+
const indent = (0, utils_1.getIndent)(afterStartLineStart);
|
|
107
|
+
// TODO: Make all code action's new line consistent
|
|
108
|
+
let ignore = `${indent}// svelte-ignore ${code}${os_1.EOL}${indent}`;
|
|
109
|
+
if (isHtml) {
|
|
110
|
+
ignore = `${indent}<!-- svelte-ignore ${code} -->${os_1.EOL}`;
|
|
111
|
+
}
|
|
112
|
+
const position = vscode_languageserver_1.Position.create(nodeStartPosition.line, 0);
|
|
113
|
+
return (0, documents_1.mapObjWithRangeToOriginal)(transpiled, vscode_languageserver_1.TextEdit.insert(position, ignore));
|
|
114
|
+
}
|
|
115
|
+
const elementOrComponent = ['Component', 'Element', 'InlineComponent'];
|
|
116
|
+
function findTagForRange(ast, range, isHtml) {
|
|
117
|
+
let nearest = ast;
|
|
118
|
+
(0, estree_walker_1.walk)(ast, {
|
|
119
|
+
enter(node, parent) {
|
|
120
|
+
if (isHtml) {
|
|
121
|
+
const { type } = node;
|
|
122
|
+
const isBlock = 'block' in node || node.type.toLowerCase().includes('block');
|
|
123
|
+
const isFragment = type === 'Fragment';
|
|
124
|
+
const keepLooking = isFragment || elementOrComponent.includes(type) || isBlock;
|
|
125
|
+
if (!keepLooking) {
|
|
126
|
+
this.skip();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (within(node, range) && parent === nearest) {
|
|
131
|
+
nearest = node;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
return nearest;
|
|
136
|
+
}
|
|
137
|
+
function within(node, range) {
|
|
138
|
+
return node.end >= range.end && node.start <= range.pos;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=getQuickfixes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getQuickfixes.js","sourceRoot":"","sources":["../../../../../../src/plugins/svelte/features/getCodeActions/getQuickfixes.ts"],"names":[],"mappings":"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"}
|