diff --git a/packages/language-server/package.json b/packages/language-server/package.json index cee54acab..61d6f2545 100644 --- a/packages/language-server/package.json +++ b/packages/language-server/package.json @@ -1,6 +1,6 @@ { "name": "svelte-language-server", - "version": "0.11.0", + "version": "0.12.0", "description": "A language server for Svelte", "main": "dist/src/index.js", "typings": "dist/src/index", @@ -51,7 +51,7 @@ "estree-walker": "^2.0.1", "lodash": "^4.17.19", "prettier": "2.2.1", - "prettier-plugin-svelte": "~1.4.1", + "prettier-plugin-svelte": "~2.1.0", "source-map": "^0.7.3", "svelte": "3.31.0", "svelte-preprocess": "~4.6.1", diff --git a/packages/language-server/src/ls-config.ts b/packages/language-server/src/ls-config.ts index d5d01cf68..2234485c0 100644 --- a/packages/language-server/src/ls-config.ts +++ b/packages/language-server/src/ls-config.ts @@ -42,7 +42,18 @@ const defaultLSConfig: LSConfig = { compilerWarnings: {}, diagnostics: { enable: true }, rename: { enable: true }, - format: { enable: true }, + format: { + enable: true, + config: { + svelteSortOrder: 'options-scripts-markup-styles', + svelteStrictMode: false, + svelteAllowShorthand: true, + svelteBracketNewLine: true, + svelteIndentScriptAndStyle: true, + printWidth: 80, + singleQuote: false + } + }, completions: { enable: true }, hover: { enable: true }, codeActions: { enable: true }, @@ -149,6 +160,15 @@ export interface LSSvelteConfig { }; format: { enable: boolean; + config: { + svelteSortOrder: string; + svelteStrictMode: boolean; + svelteAllowShorthand: boolean; + svelteBracketNewLine: boolean; + svelteIndentScriptAndStyle: boolean; + printWidth: number; + singleQuote: boolean; + }; }; rename: { enable: boolean; diff --git a/packages/language-server/src/plugins/svelte/SveltePlugin.ts b/packages/language-server/src/plugins/svelte/SveltePlugin.ts index 6a604cd18..21c975d7e 100644 --- a/packages/language-server/src/plugins/svelte/SveltePlugin.ts +++ b/packages/language-server/src/plugins/svelte/SveltePlugin.ts @@ -29,6 +29,7 @@ import { getHoverInfo } from './features/getHoverInfo'; import { SvelteCompileResult, SvelteDocument } from './SvelteDocument'; import { Logger } from '../../logger'; import { getSelectionRange } from './features/getSelectionRanges'; +import { merge } from 'lodash'; export class SveltePlugin implements @@ -73,12 +74,17 @@ export class SveltePlugin // Try resolving the config through prettier and fall back to possible editor config const config = returnObjectIfHasKeys(await prettier.resolveConfig(filePath, { editorconfig: true })) || - returnObjectIfHasKeys(this.configManager.getPrettierConfig()) || - // Be defensive here because IDEs other than VSCode might not have these settings - (options && { - tabWidth: options.tabSize, - useTabs: !options.insertSpaces - }); + merge( + {}, // merge into empty obj to not manipulate own config + this.configManager.get('svelte.format.config'), + returnObjectIfHasKeys(this.configManager.getPrettierConfig()) || + // Be defensive here because IDEs other than VSCode might not have these settings + (options && { + tabWidth: options.tabSize, + useTabs: !options.insertSpaces + }) || + {} + ); // Take .prettierignore into account const fileInfo = await prettier.getFileInfo(filePath, { ignorePath: this.configManager.getPrettierConfig()?.ignorePath ?? '.prettierignore', diff --git a/packages/language-server/test/plugins/svelte/SveltePlugin.test.ts b/packages/language-server/test/plugins/svelte/SveltePlugin.test.ts index afdad0658..78646827c 100644 --- a/packages/language-server/test/plugins/svelte/SveltePlugin.test.ts +++ b/packages/language-server/test/plugins/svelte/SveltePlugin.test.ts @@ -101,12 +101,23 @@ describe('Svelte Plugin', () => { }); }); + const defaultSettings = { + svelteSortOrder: 'options-scripts-markup-styles', + svelteStrictMode: false, + svelteAllowShorthand: true, + svelteBracketNewLine: true, + svelteIndentScriptAndStyle: true, + printWidth: 80, + singleQuote: false + }; + it('should use prettier fallback config for formatting', async () => { const formatStub = await testFormat(undefined, { fallbackConfig: true }); sinon.assert.calledOnceWithExactly(formatStub, 'unformatted', { fallbackConfig: true, plugins: [], - parser: 'svelte' + parser: 'svelte', + ...defaultSettings }); }); @@ -116,7 +127,8 @@ describe('Svelte Plugin', () => { tabWidth: 4, useTabs: false, plugins: [], - parser: 'svelte' + parser: 'svelte', + ...defaultSettings }); }); @@ -126,7 +138,8 @@ describe('Svelte Plugin', () => { tabWidth: 4, useTabs: false, plugins: [], - parser: 'svelte' + parser: 'svelte', + ...defaultSettings }); }); }); diff --git a/packages/svelte-vscode/README.md b/packages/svelte-vscode/README.md index 9623ef67e..6f220ff83 100644 --- a/packages/svelte-vscode/README.md +++ b/packages/svelte-vscode/README.md @@ -200,7 +200,35 @@ Svelte compiler warning codes to ignore or to treat as errors. Example: { 'css-u ##### `svelte.plugin.svelte.format.enable` -Enable formatting for Svelte (includes css & js). _Default_: `true` +Enable formatting for Svelte (includes css & js) using [prettier-plugin-svelte](https://github.com/sveltejs/prettier-plugin-svelte). You can set some formatting options through this extension. They will be ignored if there's a `.prettierrc` configuration file. _Default_: `true` + +##### `svelte.plugin.svelte.format.config.svelteSortOrder` + +Format: join the keys `options`, `scripts`, `markup`, `styles` with a `-` in the order you want. _Default_: `options-scripts-markup-styles` + +##### `svelte.plugin.svelte.format.config.svelteStrictMode` + +More strict HTML syntax. _Default_: `false` + +##### `svelte.plugin.svelte.format.config.svelteAllowShorthand` + +Option to enable/disable component attribute shorthand if attribute name and expression are the same. _Default_: `true` + +##### `svelte.plugin.svelte.format.config.svelteBracketNewLine` + +Put the `>` of a multiline element on a new line. _Default_: `true` + +##### `svelte.plugin.svelte.format.config.svelteIndentScriptAndStyle` + +Whether or not to indent code inside `