Skip to content

Commit edf5da8

Browse files
authored
feat(language-core): add checkUnknownDirectives option (#5141)
1 parent 8b48fd3 commit edf5da8

File tree

6 files changed

+26
-8
lines changed

6 files changed

+26
-8
lines changed

packages/language-core/lib/codegen/script/scriptSetup.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { combineLastMapping, endOfLine, generateSfcBlockSection, newLine } from
55
import { generateComponent, generateEmitsOption } from './component';
66
import { generateComponentSelf } from './componentSelf';
77
import type { ScriptCodegenContext } from './context';
8-
import { ScriptCodegenOptions, generateScriptSectionPartiallyEnding } from './index';
8+
import { type ScriptCodegenOptions, generateScriptSectionPartiallyEnding } from './index';
99
import { generateTemplate } from './template';
1010

1111
export function* generateScriptSetupImports(

packages/language-core/lib/codegen/template/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export function createTemplateCodegenContext(options: Pick<TemplateCodegenOption
3535
shouldReport: () => {
3636
token.errors++;
3737
return false;
38-
}
38+
},
3939
},
4040
};
4141
}

packages/language-core/lib/codegen/template/elementDirectives.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as CompilerDOM from '@vue/compiler-dom';
22
import { camelize } from '@vue/shared';
33
import type { Code } from '../../types';
44
import { hyphenateAttr } from '../../utils/shared';
5+
import { codeFeatures } from '../codeFeatures';
56
import { endOfLine, wrapWith } from '../utils';
67
import { generateCamelized } from '../utils/camelized';
78
import { generateStringLiteralKey } from '../utils/stringLiteralKey';
@@ -10,6 +11,15 @@ import type { TemplateCodegenOptions } from './index';
1011
import { generateInterpolation } from './interpolation';
1112
import { generateObjectProperty } from './objectProperty';
1213

14+
const builtInDirectives = new Set([
15+
'cloak',
16+
'html',
17+
'memo',
18+
'once',
19+
'show',
20+
'text',
21+
]);
22+
1323
export function* generateElementDirectives(
1424
options: TemplateCodegenOptions,
1525
ctx: TemplateCodegenContext,
@@ -34,7 +44,7 @@ export function* generateElementDirectives(
3444
prop.loc.end.offset,
3545
ctx.codeFeatures.verification,
3646
`__VLS_asFunctionalDirective(`,
37-
...generateIdentifier(ctx, prop),
47+
...generateIdentifier(options, ctx, prop),
3848
`)(null!, { ...__VLS_directiveBindingRestFields, `,
3949
...generateArg(options, ctx, prop),
4050
...generateModifiers(options, ctx, prop),
@@ -46,6 +56,7 @@ export function* generateElementDirectives(
4656
}
4757

4858
function* generateIdentifier(
59+
options: TemplateCodegenOptions,
4960
ctx: TemplateCodegenContext,
5061
prop: CompilerDOM.DirectiveNode
5162
): Generator<Code> {
@@ -58,16 +69,16 @@ function* generateIdentifier(
5869
...generateCamelized(
5970
rawName,
6071
prop.loc.start.offset,
61-
{
62-
...ctx.codeFeatures.withoutHighlight,
72+
ctx.resolveCodeFeatures({
73+
...codeFeatures.withoutHighlight,
6374
// fix https://github.com/vuejs/language-tools/issues/1905
64-
...ctx.codeFeatures.additionalCompletion,
65-
verification: false,
75+
...codeFeatures.additionalCompletion,
76+
verification: options.vueCompilerOptions.checkUnknownDirectives && !builtInDirectives.has(prop.name),
6677
navigation: {
6778
resolveRenameNewName: camelize,
6879
resolveRenameEditText: getPropRenameApply(prop.name),
6980
},
70-
}
81+
})
7182
)
7283
);
7384
}

packages/language-core/lib/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export interface VueCompilerOptions {
3131
jsxSlots: boolean;
3232
checkUnknownProps: boolean;
3333
checkUnknownEvents: boolean;
34+
checkUnknownDirectives: boolean;
3435
checkUnknownComponents: boolean;
3536
skipTemplateCodegen: boolean;
3637
fallthroughAttributes: boolean;

packages/language-core/lib/utils/ts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ export function getDefaultCompilerOptions(target = 99, lib = 'vue', strictTempla
264264
jsxSlots: false,
265265
checkUnknownProps: strictTemplates,
266266
checkUnknownEvents: strictTemplates,
267+
checkUnknownDirectives: strictTemplates,
267268
checkUnknownComponents: strictTemplates,
268269
skipTemplateCodegen: false,
269270
fallthroughAttributes: false,

packages/language-core/schemas/vue-tsconfig.schema.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@
5555
"default": false,
5656
"markdownDescription": "Check unknown events. If not set, uses the 'strictTemplates' value."
5757
},
58+
"checkUnknownDirectives": {
59+
"type": "boolean",
60+
"default": false,
61+
"markdownDescription": "Check unknown directives. If not set, uses the 'strictTemplates' value."
62+
},
5863
"checkUnknownComponents": {
5964
"type": "boolean",
6065
"default": false,

0 commit comments

Comments
 (0)