Skip to content

Commit bd77a6e

Browse files
committed
Fix #2014
1 parent 27a0763 commit bd77a6e

File tree

9 files changed

+57
-22
lines changed

9 files changed

+57
-22
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
### 0.28.0
44

5+
- Load prettier plugin from VLS if not present in workspace folder. #2014.
56
- Cross file template type checking - check that components are passed props with the correct types. #1596 and #2294.
67

78
### 0.27.3 | 2020-09-13 | [VSIX](https://marketplace.visualstudio.com/_apis/public/gallery/publishers/octref/vsextensions/vetur/0.27.3/vspackage)

server/src/embeddedSupport/languageModes.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,12 @@ export class LanguageModes {
145145

146146
this.modes['vue'] = getVueMode(workspacePath, globalSnippetDir);
147147
this.modes['vue-html'] = vueHtmlMode;
148-
this.modes['pug'] = getPugMode();
149-
this.modes['css'] = getCSSMode(this.documentRegions);
150-
this.modes['postcss'] = getPostCSSMode(this.documentRegions);
151-
this.modes['scss'] = getSCSSMode(this.documentRegions);
148+
this.modes['pug'] = getPugMode(workspacePath);
149+
this.modes['css'] = getCSSMode(workspacePath, this.documentRegions);
150+
this.modes['postcss'] = getPostCSSMode(workspacePath, this.documentRegions);
151+
this.modes['scss'] = getSCSSMode(workspacePath, this.documentRegions);
152152
this.modes['sass'] = new SassLanguageMode();
153-
this.modes['less'] = getLESSMode(this.documentRegions);
153+
this.modes['less'] = getLESSMode(workspacePath, this.documentRegions);
154154
this.modes['stylus'] = getStylusMode(this.documentRegions);
155155
this.modes['javascript'] = jsMode;
156156
this.modes['typescript'] = jsMode;

server/src/modes/pug/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { prettierify } from '../../utils/prettier';
44
import { VLSFormatConfig } from '../../config';
55
import { getFileFsPath } from '../../utils/paths';
66

7-
export function getPugMode(): LanguageMode {
7+
export function getPugMode(workspacePath: string): LanguageMode {
88
let config: any = {};
99

1010
return {
@@ -24,6 +24,7 @@ export function getPugMode(): LanguageMode {
2424
const foo = prettierify(
2525
value,
2626
getFileFsPath(document.uri),
27+
workspacePath,
2728
range,
2829
config.vetur.format as VLSFormatConfig,
2930
'pug',

server/src/modes/script/javascript.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,7 @@ export async function getJavascriptMode(
576576
} else {
577577
doFormat = prettierify;
578578
}
579-
return doFormat(code, filePath, range, vlsFormatConfig, parser, needInitialIndent);
579+
return doFormat(code, filePath, workspacePath, range, vlsFormatConfig, parser, needInitialIndent);
580580
} else {
581581
const initialIndentLevel = needInitialIndent ? 1 : 0;
582582
const formatSettings: ts.FormatCodeSettings =

server/src/modes/style/index.ts

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,40 @@ import { ParserOption } from '../../utils/prettier/prettier.d';
1818
import { NULL_HOVER } from '../nullMode';
1919
import { VLSFormatConfig } from '../../config';
2020

21-
export function getCSSMode(documentRegions: LanguageModelCache<VueDocumentRegions>): LanguageMode {
21+
export function getCSSMode(
22+
workspacePath: string,
23+
documentRegions: LanguageModelCache<VueDocumentRegions>
24+
): LanguageMode {
2225
const languageService = getCSSLanguageService();
23-
return getStyleMode('css', languageService, documentRegions);
26+
return getStyleMode('css', workspacePath, languageService, documentRegions);
2427
}
2528

26-
export function getPostCSSMode(documentRegions: LanguageModelCache<VueDocumentRegions>): LanguageMode {
29+
export function getPostCSSMode(
30+
workspacePath: string,
31+
documentRegions: LanguageModelCache<VueDocumentRegions>
32+
): LanguageMode {
2733
const languageService = getCSSLanguageService();
28-
return getStyleMode('postcss', languageService, documentRegions);
34+
return getStyleMode('postcss', workspacePath, languageService, documentRegions);
2935
}
3036

31-
export function getSCSSMode(documentRegions: LanguageModelCache<VueDocumentRegions>): LanguageMode {
37+
export function getSCSSMode(
38+
workspacePath: string,
39+
documentRegions: LanguageModelCache<VueDocumentRegions>
40+
): LanguageMode {
3241
const languageService = getSCSSLanguageService();
33-
return getStyleMode('scss', languageService, documentRegions);
42+
return getStyleMode('scss', workspacePath, languageService, documentRegions);
3443
}
35-
export function getLESSMode(documentRegions: LanguageModelCache<VueDocumentRegions>): LanguageMode {
44+
export function getLESSMode(
45+
workspacePath: string,
46+
documentRegions: LanguageModelCache<VueDocumentRegions>
47+
): LanguageMode {
3648
const languageService = getLESSLanguageService();
37-
return getStyleMode('less', languageService, documentRegions);
49+
return getStyleMode('less', workspacePath, languageService, documentRegions);
3850
}
3951

4052
function getStyleMode(
4153
languageId: LanguageId,
54+
workspacePath: string,
4255
languageService: LanguageService,
4356
documentRegions: LanguageModelCache<VueDocumentRegions>
4457
): LanguageMode {
@@ -145,6 +158,7 @@ function getStyleMode(
145158
return prettierify(
146159
value,
147160
getFileFsPath(document.uri),
161+
workspacePath,
148162
range,
149163
config.vetur.format as VLSFormatConfig,
150164
parserMap[languageId],

server/src/modes/template/htmlMode.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export class HTMLMode implements LanguageMode {
3838

3939
constructor(
4040
documentRegions: LanguageModelCache<VueDocumentRegions>,
41-
workspacePath: string | undefined,
41+
private workspacePath: string | undefined,
4242
vueVersion: VueVersion,
4343
private vueDocuments: LanguageModelCache<HTMLDocument>,
4444
private vueInfoService?: VueInfoService
@@ -104,7 +104,7 @@ export class HTMLMode implements LanguageMode {
104104
return findDocumentSymbols(document, this.vueDocuments.refreshAndGet(document));
105105
}
106106
format(document: TextDocument, range: Range, formattingOptions: FormattingOptions) {
107-
return htmlFormat(document, range, this.config.vetur.format as VLSFormatConfig);
107+
return htmlFormat(document, range, this.config.vetur.format as VLSFormatConfig, this.workspacePath);
108108
}
109109
findDefinition(document: TextDocument, position: Position) {
110110
const embedded = this.embeddedDocuments.refreshAndGet(document);

server/src/modes/template/services/htmlFormat.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ type PrettyHtmlConfig = IPrettyHtml extends (input: string, options: infer R) =>
1313
const TEMPLATE_HEAD = '<template>';
1414
const TEMPLATE_TAIL = '</template>';
1515

16-
export function htmlFormat(document: TextDocument, currRange: Range, vlsFormatConfig: VLSFormatConfig): TextEdit[] {
16+
export function htmlFormat(
17+
document: TextDocument,
18+
currRange: Range,
19+
vlsFormatConfig: VLSFormatConfig,
20+
workspacePath?: string
21+
): TextEdit[] {
1722
if (vlsFormatConfig.defaultFormatter.html === 'none') {
1823
return [];
1924
}
@@ -29,6 +34,7 @@ export function htmlFormat(document: TextDocument, currRange: Range, vlsFormatCo
2934
const prettierResult = formatWithPrettier(
3035
originalSource,
3136
getFileFsPath(document.uri),
37+
workspacePath,
3238
currRange,
3339
vlsFormatConfig,
3440
false
@@ -78,11 +84,12 @@ function formatWithJsBeautify(input: string, vlsFormatConfig: VLSFormatConfig):
7884
function formatWithPrettier(
7985
code: string,
8086
fileFsPath: string,
87+
workspacePath: string | undefined,
8188
range: Range,
8289
vlsFormatConfig: VLSFormatConfig,
8390
initialIndent: boolean
8491
) {
85-
return prettierify(code, fileFsPath, range, vlsFormatConfig, 'vue', initialIndent);
92+
return prettierify(code, fileFsPath, workspacePath, range, vlsFormatConfig, 'vue', initialIndent);
8693
}
8794

8895
function getPrettyHtmlOptions(prettierrcOptions: Partial<PrettierConfig> | null, vlsFormatConfig: VLSFormatConfig) {

server/src/utils/prettier/index.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,22 @@ import { indentSection } from '../strings';
66
import { requireLocalPkg } from './requirePkg';
77
import { VLSFormatConfig } from '../../config';
88
import { logger } from '../../log';
9+
import * as path from 'path';
10+
11+
const VLS_PATH = path.resolve(__dirname, '../../../');
912

1013
export function prettierify(
1114
code: string,
1215
fileFsPath: string,
16+
workspacePath: string | undefined,
1317
range: Range,
1418
vlsFormatConfig: VLSFormatConfig,
1519
parser: ParserOption,
1620
initialIndent: boolean
1721
): TextEdit[] {
1822
try {
1923
const prettier = requireLocalPkg(fileFsPath, 'prettier') as Prettier;
20-
const prettierOptions = getPrettierOptions(prettier, fileFsPath, parser, vlsFormatConfig);
24+
const prettierOptions = getPrettierOptions(prettier, fileFsPath, workspacePath, parser, vlsFormatConfig);
2125
logger.logDebug(`Using prettier. Options\n${JSON.stringify(prettierOptions)}`);
2226

2327
const prettierifiedCode = prettier.format(code, prettierOptions);
@@ -32,6 +36,7 @@ export function prettierify(
3236
export function prettierEslintify(
3337
code: string,
3438
fileFsPath: string,
39+
workspacePath: string | undefined,
3540
range: Range,
3641
vlsFormatConfig: VLSFormatConfig,
3742
parser: ParserOption,
@@ -41,7 +46,7 @@ export function prettierEslintify(
4146
const prettier = requireLocalPkg(fileFsPath, 'prettier') as Prettier;
4247
const prettierEslint = requireLocalPkg(fileFsPath, 'prettier-eslint') as PrettierEslintFormat;
4348

44-
const prettierOptions = getPrettierOptions(prettier, fileFsPath, parser, vlsFormatConfig);
49+
const prettierOptions = getPrettierOptions(prettier, fileFsPath, workspacePath, parser, vlsFormatConfig);
4550
logger.logDebug(`Using prettier-eslint. Options\n${JSON.stringify(prettierOptions)}`);
4651

4752
const prettierifiedCode = prettierEslint({
@@ -60,6 +65,7 @@ export function prettierEslintify(
6065
export function prettierTslintify(
6166
code: string,
6267
fileFsPath: string,
68+
workspacePath: string,
6369
range: Range,
6470
vlsFormatConfig: VLSFormatConfig,
6571
parser: ParserOption,
@@ -69,7 +75,7 @@ export function prettierTslintify(
6975
const prettier = requireLocalPkg(fileFsPath, 'prettier') as Prettier;
7076
const prettierTslint = requireLocalPkg(fileFsPath, 'prettier-tslint').format as PrettierTslintFormat;
7177

72-
const prettierOptions = getPrettierOptions(prettier, fileFsPath, parser, vlsFormatConfig);
78+
const prettierOptions = getPrettierOptions(prettier, fileFsPath, workspacePath, parser, vlsFormatConfig);
7379
logger.logDebug(`Using prettier-tslint. Options\n${JSON.stringify(prettierOptions)}`);
7480

7581
const prettierifiedCode = prettierTslint({
@@ -89,6 +95,7 @@ export function prettierTslintify(
8995
function getPrettierOptions(
9096
prettierModule: Prettier,
9197
fileFsPath: string,
98+
workspacePath: string | undefined,
9299
parser: ParserOption,
93100
vlsFormatConfig: VLSFormatConfig
94101
) {
@@ -98,13 +105,17 @@ function getPrettierOptions(
98105
prettierrcOptions.tabWidth = prettierrcOptions.tabWidth || vlsFormatConfig.options.tabSize;
99106
prettierrcOptions.useTabs = prettierrcOptions.useTabs || vlsFormatConfig.options.useTabs;
100107
prettierrcOptions.parser = parser;
108+
// For loading plugins such as @prettier/plugin-pug
109+
prettierrcOptions.pluginSearchDirs = workspacePath ? [workspacePath, VLS_PATH] : [VLS_PATH];
101110

102111
return prettierrcOptions;
103112
} else {
104113
const vscodePrettierOptions = vlsFormatConfig.defaultFormatterOptions.prettier || {};
105114
vscodePrettierOptions.tabWidth = vscodePrettierOptions.tabWidth || vlsFormatConfig.options.tabSize;
106115
vscodePrettierOptions.useTabs = vscodePrettierOptions.useTabs || vlsFormatConfig.options.useTabs;
107116
vscodePrettierOptions.parser = parser;
117+
// For loading plugins such as @prettier/plugin-pug
118+
vscodePrettierOptions.pluginSearchDirs = workspacePath ? [workspacePath, VLS_PATH] : [VLS_PATH];
108119

109120
return vscodePrettierOptions;
110121
}

server/src/utils/prettier/prettier.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export interface PrettierConfig {
4343
jsxSingleQuote: boolean;
4444
htmlWhitespaceSensitivity: 'css' | 'strict' | 'ignore';
4545
endOfLine: 'auto' | 'lf' | 'crlf' | 'cr';
46+
pluginSearchDirs: string[];
4647
}
4748

4849
export interface Prettier {

0 commit comments

Comments
 (0)