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..8a639c1 100644 --- a/lib/get-language-service.js +++ b/lib/get-language-service.js @@ -10,8 +10,13 @@ const { getTypeScriptLanguageServiceHost, getVueLanguageServiceHost } = require( * @returns {ts.LanguageService} */ const getLanguageService = (parser, filepath, code) => { - if (parser === 'vue') { - return require('@volar/vue-typescript').createLanguageService(getVueLanguageServiceHost(filepath, code)); + if (parser === 'vue' || parser === 'svelte') { + return require('@volar/vue-typescript').createLanguageService( + getVueLanguageServiceHost(filepath, code), + /** @todo upgrade to a version with correct types */ + // @ts-ignore + parser === 'svelte' ? [require('@volar-examples/svelte-language-core').languageModule] : undefined, + ); } return require('typescript').createLanguageService(getTypeScriptLanguageServiceHost(filepath, code)); diff --git a/lib/organize.js b/lib/organize.js index f09052c..d5ee0fb 100644 --- a/lib/organize.js +++ b/lib/organize.js @@ -12,14 +12,20 @@ module.exports.organize = ( code, { filepath = 'file.ts', organizeImportsSkipDestructiveCodeActions, parentParser, parser }, ) => { - if (parentParser === 'vue') { - return code; // we do the preprocessing from the `vue` parent parser instead, so we skip the child parsers + if (parentParser === 'vue' || parentParser === 'svelte') { + // we do the preprocessing from the parent parser instead, so we skip the child parsers + return code; } if (sep !== posix.sep) { filepath = filepath.split(sep).join(posix.sep); } + /** @todo remove this */ + if (parser === 'svelte') { + filepath = filepath + '.vue'; + } + const languageService = getLanguageService(parser, filepath, code); const fileChanges = languageService.organizeImports( diff --git a/package.json b/package.json index e14a943..9101ca5 100644 --- a/package.json +++ b/package.json @@ -23,20 +23,26 @@ "repository": "simonhaenisch/prettier-plugin-organize-imports", "homepage": "https://github.com/simonhaenisch/prettier-plugin-organize-imports#readme", "peerDependencies": { - "@volar/vue-typescript": ">=0.40.2", + "@volar-examples/svelte-language-core": "^1.0.3", + "@volar/vue-typescript": "^1.0.3", "prettier": ">=2.0", "typescript": ">=2.9" }, "peerDependenciesMeta": { + "@volar-examples/svelte-language-core": { + "optional": true + }, "@volar/vue-typescript": { "optional": true } }, "devDependencies": { "@types/node": "18.6.4", - "@volar/vue-typescript": "0.40.5", + "@volar-examples/svelte-language-core": "1.0.3", + "@volar/vue-typescript": "1.0.3", "ava": "3.15.0", "prettier": "2.7.1", + "prettier-plugin-svelte": "2.7.1", "typescript": "4.7.4" }, "prettier": { diff --git a/test.js b/test.js index 6fde1a9..8f5c1eb 100644 --- a/test.js +++ b/test.js @@ -175,3 +175,24 @@ test('does not remove unused imports with `organizeImportsSkipDestructiveCodeAct 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); +});