diff --git a/index.js b/index.js index 2399edb..11dd4d8 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,6 @@ const { parsers: babelParsers } = require('prettier/parser-babel'); const { parsers: htmlParsers } = require('prettier/parser-html'); +const { parsers: svelteParsers } = require('prettier-plugin-svelte'); const { parsers: typescriptParsers } = require('prettier/parser-typescript'); const { organize } = require('./lib/organize'); @@ -59,6 +60,7 @@ const plugin = { parsers: { babel: withOrganizeImportsPreprocess(babelParsers.babel), 'babel-ts': withOrganizeImportsPreprocess(babelParsers['babel-ts']), + svelte: withOrganizeImportsPreprocess(svelteParsers.svelte), typescript: withOrganizeImportsPreprocess(typescriptParsers.typescript), vue: withOrganizeImportsPreprocess(htmlParsers.vue), }, diff --git a/lib/get-language-service.js b/lib/get-language-service.js index 016af6a..82e669b 100644 --- a/lib/get-language-service.js +++ b/lib/get-language-service.js @@ -10,6 +10,12 @@ const { getTypeScriptLanguageServiceHost, getVueLanguageServiceHost } = require( * @returns {ts.LanguageService} */ const getLanguageService = (parser, filepath, code) => { + if (parser === 'svelte') { + return require('@volar-examples/svelte-typescript').createLanguageService( + getVueLanguageServiceHost(filepath, code), + ); + } + if (parser === 'vue') { return require('@volar/vue-typescript').createLanguageService(getVueLanguageServiceHost(filepath, code)); } diff --git a/lib/organize.js b/lib/organize.js index 6dab8e2..fc108cb 100644 --- a/lib/organize.js +++ b/lib/organize.js @@ -12,7 +12,7 @@ module.exports.organize = ( code, { filepath = 'file.ts', organizeImportsSkipDestructiveCodeActions, parentParser, parser }, ) => { - if (parentParser === 'vue') { + if (parentParser === 'vue' || parentParser === 'svelte') { // we already did the preprocessing in the parent parser, so we skip the child parsers return code; } diff --git a/package.json b/package.json index 5704ece..5aab338 100644 --- a/package.json +++ b/package.json @@ -24,26 +24,36 @@ "repository": "simonhaenisch/prettier-plugin-organize-imports", "homepage": "https://github.com/simonhaenisch/prettier-plugin-organize-imports#readme", "peerDependencies": { + "@volar-examples/svelte-typescript": "^1.0.4", "@volar/vue-language-plugin-pug": "^1.0.4", "@volar/vue-typescript": "^1.0.4", "prettier": ">=2.0", + "prettier-plugin-svelte": "^2.8.0", "typescript": ">=2.9" }, "peerDependenciesMeta": { + "@volar-examples/svelte-typescript": { + "optional": true + }, "@volar/vue-language-plugin-pug": { "optional": true }, "@volar/vue-typescript": { "optional": true + }, + "prettier-plugin-svelte": { + "optional": true } }, "devDependencies": { "@types/node": "18.11.9", "@types/prettier": "2.7.1", + "@volar-examples/svelte-typescript": "1.0.9", "@volar/vue-language-plugin-pug": "1.0.9", "@volar/vue-typescript": "1.0.9", "ava": "3.15.0", "prettier": "2.7.1", + "prettier-plugin-svelte": "2.8.0", "typescript": "4.8.4" }, "prettier": { diff --git a/test.js b/test.js index c33d5e1..a287c91 100644 --- a/test.js +++ b/test.js @@ -182,6 +182,32 @@ Foo t.is(formattedCode, code); }); +test('has basic Svelte support', (t) => { + const code = ` + + + + + `; + + const expectedCode = ` + + + +`; + + const formattedCode = prettify(code, { plugins: ['prettier-plugin-svelte', '.'], filepath: 'file.svelte' }); + + t.is(formattedCode, expectedCode); +}); + test('does not remove unused imports with `organizeImportsSkipDestructiveCodeActions` enabled', (t) => { const code = `import { foo } from "./bar"; `;