Skip to content

Commit

Permalink
WIP version of Svelte support via Volar
Browse files Browse the repository at this point in the history
doesn't actually work yet
  • Loading branch information
simonhaenisch committed Oct 10, 2022
1 parent ed98428 commit 23c0bcd
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 6 deletions.
2 changes: 2 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -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');
Expand Down Expand Up @@ -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),
},
Expand Down
9 changes: 7 additions & 2 deletions lib/get-language-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
10 changes: 8 additions & 2 deletions lib/organize.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
10 changes: 8 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
21 changes: 21 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -175,3 +175,24 @@ test('does not remove unused imports with `organizeImportsSkipDestructiveCodeAct

t.is(formattedCode, code);
});

test('has basic Svelte support', (t) => {
const code = `
<script lang="ts">
import Foo from './foo';
import Bar from './bar';
</script>
<Foo />
`;

const expectedCode = `<script lang="ts">
import Bar from "./bar";
import Foo from "./foo";
</script>
<Foo />
`;

const formattedCode = prettify(code, { plugins: ['prettier-plugin-svelte', '.'], filepath: 'file.svelte' });

t.is(formattedCode, expectedCode);
});

0 comments on commit 23c0bcd

Please sign in to comment.