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);
+});