Skip to content

Commit 66c1567

Browse files
svelte import sort
1 parent 61d0697 commit 66c1567

File tree

12 files changed

+1293
-6
lines changed

12 files changed

+1293
-6
lines changed

package.json

Lines changed: 15 additions & 2 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": "jest -i",
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",
@@ -48,17 +49,29 @@
4849
"@types/node": "20.8.6",
4950
"@vue/compiler-sfc": "^3.2.41",
5051
"jest": "26.6.3",
52+
"patch-package": "^8.0.0",
53+
"postinstall-postinstall": "^2.1.0",
5154
"prettier": "2.8",
55+
"prettier-plugin-svelte": "2",
56+
"svelte": "^4.2.10",
5257
"ts-jest": "26.5.3",
5358
"typescript": "4.9.4"
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": "2.x",
64+
"svelte": "4.x"
5865
},
5966
"peerDependenciesMeta": {
6067
"@vue/compiler-sfc": {
6168
"optional": true
69+
},
70+
"prettier-plugin-svelte": {
71+
"optional": true
72+
},
73+
"svelte": {
74+
"optional": true
6275
}
6376
}
6477
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
diff --git a/node_modules/prettier-plugin-svelte/plugin.js b/node_modules/prettier-plugin-svelte/plugin.js
2+
index bcb248e..9d4ad94 100644
3+
--- a/node_modules/prettier-plugin-svelte/plugin.js
4+
+++ b/node_modules/prettier-plugin-svelte/plugin.js
5+
@@ -2120,7 +2120,7 @@ const parsers = {
6+
hasPragma,
7+
parse: (text) => {
8+
try {
9+
- return Object.assign(Object.assign({}, require(`svelte/compiler`).parse(text)), { __isRoot: true });
10+
+ return Object.assign(Object.assign({}, require(`svelte/compiler.cjs`).parse(text)), { __isRoot: true });
11+
}
12+
catch (err) {
13+
if (err.start != null && err.end != null) {

src/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import { parsers as typescriptParsers } from 'prettier/parser-typescript';
55

66
import { defaultPreprocessor } from './preprocessors/default-processor';
77
import { vuePreprocessor } from './preprocessors/vue-preprocessor';
8+
import { sveltePreprocessor } from './preprocessors/svelte-preprocessor';
9+
10+
const { parsers: svelteParsers } = require('prettier-plugin-svelte');
811

912
const options = {
1013
importOrder: {
@@ -68,6 +71,10 @@ module.exports = {
6871
...htmlParsers.vue,
6972
preprocess: vuePreprocessor,
7073
},
74+
svelte: {
75+
...svelteParsers.svelte,
76+
preprocess: sveltePreprocessor,
77+
},
7178
},
7279
options,
7380
};

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)