Skip to content

Commit d7bdc8c

Browse files
canarddemagretbyara
authored andcommitted
svelte import sort
1 parent a554662 commit d7bdc8c

File tree

11 files changed

+1282
-33
lines changed

11 files changed

+1282
-33
lines changed

package.json

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"example": "prettier --config ./examples/.prettierrc --plugin lib/src/index.js",
1717
"test": "yarn node --experimental-vm-modules $(yarn bin jest)",
1818
"type-check": "tsc --noEmit",
19-
"prepublishOnly": "npm run compile && npm run test"
19+
"prepublishOnly": "npm run compile && npm run test",
20+
"postinstall": "patch-package"
2021
},
2122
"keywords": [
2223
"prettier",
@@ -41,27 +42,39 @@
4142
"lodash": "^4.17.21"
4243
},
4344
"devDependencies": {
44-
"@babel/core": "7.26.0",
45+
"@babel/core": "^7.26.0",
4546
"@types/chai": "5.0.1",
4647
"@types/jest": "29.5.14",
4748
"@types/lodash": "4.17.13",
48-
"@types/node": "22.9.0",
49-
"@vue/compiler-sfc": "^3.5.12",
49+
"@types/node": "22.9.1",
50+
"@vue/compiler-sfc": "^3.5.13",
5051
"jest": "29.7.0",
52+
"patch-package": "^8.0.0",
53+
"postinstall-postinstall": "^2.1.0",
5154
"prettier": "3.3.3",
55+
"prettier-plugin-svelte": "3.3.1",
56+
"svelte": "^4.2.19",
5257
"ts-jest": "29.2.5",
5358
"typescript": "5.6.3"
5459
},
5560
"peerDependencies": {
5661
"@vue/compiler-sfc": "3.x",
57-
"prettier": "2.x - 3.x"
62+
"prettier": "2.x - 3.x",
63+
"prettier-plugin-svelte": "3.x",
64+
"svelte": "4.x"
5865
},
5966
"engines": {
6067
"node": ">18.12"
6168
},
6269
"peerDependenciesMeta": {
6370
"@vue/compiler-sfc": {
6471
"optional": true
72+
},
73+
"prettier-plugin-svelte": {
74+
"optional": true
75+
},
76+
"svelte": {
77+
"optional": true
6578
}
6679
}
6780
}

src/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { parsers as htmlParsers } from 'prettier/plugins/html';
44
import { parsers as typescriptParsers } from 'prettier/plugins/typescript';
55
import { defaultPreprocessor } from './preprocessors/default-processor';
66
import { vuePreprocessor } from './preprocessors/vue-preprocessor';
7+
import { sveltePreprocessor } from './preprocessors/svelte-preprocessor';
8+
9+
const { parsers: svelteParsers } = require('prettier-plugin-svelte');
710

811
const options = {
912
importOrder: {
@@ -67,6 +70,10 @@ module.exports = {
6770
...htmlParsers.vue,
6871
preprocess: vuePreprocessor,
6972
},
73+
svelte: {
74+
...svelteParsers.svelte,
75+
preprocess: sveltePreprocessor,
76+
},
7077
},
7178
options,
7279
};

src/preprocessors/default-processor.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { PrettierOptions } from '../types';
22
import { preprocessor } from './preprocessor';
33

44
export function defaultPreprocessor(code: string, options: PrettierOptions) {
5-
if (options.filepath?.endsWith('.vue')) return code;
5+
for (const extension of ['svelte', 'vue']) {
6+
if (options.filepath?.endsWith(`.${extension}`)) return code;
7+
}
68
return preprocessor(code, options);
79
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { PrettierOptions } from '../types';
2+
import { preprocessor } from './preprocessor';
3+
4+
const booleanGuard = <T>(value: T | undefined): value is T => Boolean(value);
5+
6+
const sortImports = (code: string, options: PrettierOptions) => {
7+
const { parse } = require('svelte/compiler.cjs');
8+
const { instance, module } = parse(code);
9+
const sources = [instance, module].filter(booleanGuard);
10+
if (!sources.length) return code;
11+
return sources.reduce((code, source) => {
12+
const snippet = code.slice(source.content.start, source.content.end);
13+
const preprocessed = preprocessor(snippet, options);
14+
const result = code.replace(snippet, `\n${preprocessed}\n`);
15+
return result;
16+
}, code);
17+
};
18+
19+
export function sveltePreprocessor(code: string, options: PrettierOptions) {
20+
const sorted = sortImports(code, options);
21+
22+
const prettierPluginSvelte = require('prettier-plugin-svelte');
23+
return prettierPluginSvelte.parsers.svelte.preprocess(sorted, options);
24+
}

0 commit comments

Comments
 (0)