diff --git a/README.md b/README.md index 2121f86..b9fbcf2 100644 --- a/README.md +++ b/README.md @@ -380,7 +380,7 @@ Having some trouble or an issue? You can check [FAQ / Troubleshooting section](. | NodeJS with ES Modules | ✅ Everything | - | | React | ✅ Everything | - | | Angular | ✅ Everything | Supported through `importOrderParserPlugins` API | -| Vue | ✅ Everything | - | +| Vue | ✅ Everything | Peer dependency `@vue/compiler-sfc` is required | | Svelte | ⚠️ Not yet | Contributions are welcome | ## Contribution diff --git a/docs/TROUBLESHOOTING.md b/docs/TROUBLESHOOTING.md index f0cf919..b0bf266 100644 --- a/docs/TROUBLESHOOTING.md +++ b/docs/TROUBLESHOOTING.md @@ -107,3 +107,7 @@ module.exports = { plugins: [require('@ianvs/prettier-plugin-sort-imports')], }; ``` + +#### Q. Why are my .vue sfc files not being formatted? + +Be sure that you have `@vue/compiler-sfc` installed in your project, (run `npm ls @vue/compiler-sfc` to double-check). If it's not there, install it and try formatting again. diff --git a/package.json b/package.json index fe29f3f..17dfcf6 100644 --- a/package.json +++ b/package.json @@ -52,20 +52,26 @@ "@babel/types": "^7.17.0", "javascript-natural-sort": "0.7.1", "lodash.clone": "^4.5.0", - "lodash.isequal": "^4.5.0", - "@vue/compiler-sfc": "3.2.40" + "lodash.isequal": "^4.5.0" }, "devDependencies": { "@types/jest": "^29.2.0", "@types/lodash.clone": "4.5.7", "@types/lodash.isequal": "4.5.6", "@types/node": "^17.0.21", + "@vue/compiler-sfc": "3.2.40", "jest": "^29.2.2", "prettier": "2.7.1", "ts-jest": "^29.0.3", "typescript": "4.8.4" }, "peerDependencies": { + "@vue/compiler-sfc": ">=3.0.0", "prettier": "2.x" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + } } } diff --git a/src/preprocessors/vue.ts b/src/preprocessors/vue.ts index 1c20b5d..6366004 100644 --- a/src/preprocessors/vue.ts +++ b/src/preprocessors/vue.ts @@ -1,12 +1,20 @@ -import { parse } from '@vue/compiler-sfc'; - import { PrettierOptions } from '../types'; import { preprocessor } from './preprocessor'; export function vuePreprocessor(code: string, options: PrettierOptions) { - const { descriptor } = parse(code); - const content = - (descriptor.script ?? descriptor.scriptSetup)?.content ?? code; + try { + const { parse } = require('@vue/compiler-sfc'); + const { descriptor } = parse(code); + const content = + (descriptor.script ?? descriptor.scriptSetup)?.content ?? code; - return code.replace(content, `\n${preprocessor(content, options)}\n`); + return code.replace(content, `\n${preprocessor(content, options)}\n`); + } catch (err) { + if ((err as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') { + console.warn( + '[@ianvs/prettier-plugin-sort-imports]: Could not process .vue file. Please be sure that "@vue/compiler-sfc" is installed in your project.', + ); + throw err; + } + } } diff --git a/yarn.lock b/yarn.lock index ed983b0..5c6bb65 100644 --- a/yarn.lock +++ b/yarn.lock @@ -304,12 +304,12 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.7": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.7": version "7.17.7" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.7.tgz" integrity sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA== -"@babel/parser@^7.18.10", "@babel/parser@^7.19.6": +"@babel/parser@^7.16.4", "@babel/parser@^7.18.10", "@babel/parser@^7.19.6": version "7.19.6" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== @@ -876,7 +876,7 @@ "@vue/compiler-core@3.2.40": version "3.2.40" - resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.40.tgz" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.40.tgz#c785501f09536748121e937fb87605bbb1ada8e5" integrity sha512-2Dc3Stk0J/VyQ4OUr2yEC53kU28614lZS+bnrCbFSAIftBJ40g/2yQzf4mPBiFuqguMB7hyHaujdgZAQ67kZYA== dependencies: "@babel/parser" "^7.16.4" @@ -886,7 +886,7 @@ "@vue/compiler-dom@3.2.40": version "3.2.40" - resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz#c225418773774db536174d30d3f25ba42a33e7e4" integrity sha512-OZCNyYVC2LQJy4H7h0o28rtk+4v+HMQygRTpmibGoG9wZyomQiS5otU7qo3Wlq5UfHDw2RFwxb9BJgKjVpjrQw== dependencies: "@vue/compiler-core" "3.2.40" @@ -894,7 +894,7 @@ "@vue/compiler-sfc@3.2.40": version "3.2.40" - resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz#61823283efc84d25d9d2989458f305d32a2ed141" integrity sha512-tzqwniIN1fu1PDHC3CpqY/dPCfN/RN1thpBC+g69kJcrl7mbGiHKNwbA6kJ3XKKy8R6JLKqcpVugqN4HkeBFFg== dependencies: "@babel/parser" "^7.16.4" @@ -910,7 +910,7 @@ "@vue/compiler-ssr@3.2.40": version "3.2.40" - resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz#67df95a096c63e9ec4b50b84cc6f05816793629c" integrity sha512-80cQcgasKjrPPuKcxwuCx7feq+wC6oFl5YaKSee9pV3DNq+6fmCVwEEC3vvkf/E2aI76rIJSOYHsWSEIxK74oQ== dependencies: "@vue/compiler-dom" "3.2.40" @@ -918,7 +918,7 @@ "@vue/reactivity-transform@3.2.40": version "3.2.40" - resolved "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz#dc24b9074b26f0d9dd2034c6349f5bb2a51c86ac" integrity sha512-HQUCVwEaacq6fGEsg2NUuGKIhUveMCjOk8jGHqLXPI2w6zFoPrlQhwWEaINTv5kkZDXKEnCijAp+4gNEHG03yw== dependencies: "@babel/parser" "^7.16.4" @@ -929,7 +929,7 @@ "@vue/shared@3.2.40": version "3.2.40" - resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.40.tgz" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.40.tgz#e57799da2a930b975321981fcee3d1e90ed257ae" integrity sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ== ansi-escapes@^4.2.1: @@ -1295,7 +1295,7 @@ esprima@^4.0.0: estree-walker@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== execa@^5.0.0: @@ -1992,7 +1992,7 @@ lru-cache@^6.0.0: magic-string@^0.25.7: version "0.25.9" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: sourcemap-codec "^1.4.8" @@ -2053,7 +2053,7 @@ ms@2.1.2: nanoid@^3.3.4: version "3.3.4" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== natural-compare@^1.4.0: @@ -2182,7 +2182,7 @@ pkg-dir@^4.2.0: postcss@^8.1.10: version "8.4.18" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2" integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA== dependencies: nanoid "^3.3.4" @@ -2300,7 +2300,7 @@ slash@^3.0.0: source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map-support@0.5.13: @@ -2323,7 +2323,7 @@ source-map@^0.6.0, source-map@^0.6.1: sourcemap-codec@^1.4.8: version "1.4.8" - resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== sprintf-js@~1.0.2: