@vue/language-core 2.0.17 → 2.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,16 +7,20 @@ function generateGlobalTypes(vueCompilerOptions) {
7
7
  return `export const __VLS_globalTypesStart = {};
8
8
  declare global {
9
9
  // @ts-ignore
10
- type __VLS_IntrinsicElements = __VLS_PickNotAny<import('vue/jsx-runtime').JSX.IntrinsicElements, __VLS_PickNotAny<globalThis.JSX.IntrinsicElements, Record<string, any>>>;
10
+ type __VLS_IntrinsicElements = __VLS_PickNotAny<import('${vueCompilerOptions.lib}/jsx-runtime').JSX.IntrinsicElements, __VLS_PickNotAny<globalThis.JSX.IntrinsicElements, Record<string, any>>>;
11
11
  // @ts-ignore
12
- type __VLS_Element = __VLS_PickNotAny<import('vue/jsx-runtime').JSX.Element, globalThis.JSX.Element>;
12
+ type __VLS_Element = __VLS_PickNotAny<import('${vueCompilerOptions.lib}/jsx-runtime').JSX.Element, globalThis.JSX.Element>;
13
13
  // @ts-ignore
14
14
  type __VLS_GlobalComponents = ${[
15
- `__VLS_PickNotAny<import('vue').GlobalComponents, {}>`,
15
+ `__VLS_PickNotAny<import('${vueCompilerOptions.lib}').GlobalComponents, {}>`,
16
16
  `__VLS_PickNotAny<import('@vue/runtime-core').GlobalComponents, {}>`,
17
17
  `__VLS_PickNotAny<import('@vue/runtime-dom').GlobalComponents, {}>`,
18
18
  `Pick<typeof import('${vueCompilerOptions.lib}'), 'Transition' | 'TransitionGroup' | 'KeepAlive' | 'Suspense' | 'Teleport'>`
19
19
  ].join(' & ')};
20
+ type __VLS_BuiltInPublicProps =
21
+ __VLS_PickNotAny<import('${vueCompilerOptions.lib}').VNodeProps, {}>
22
+ & __VLS_PickNotAny<import('${vueCompilerOptions.lib}').AllowedComponentProps, {}>
23
+ & __VLS_PickNotAny<import('${vueCompilerOptions.lib}').ComponentCustomProps, {}>;
20
24
  type __VLS_IsAny<T> = 0 extends 1 & T ? true : false;
21
25
  type __VLS_PickNotAny<A, B> = __VLS_IsAny<A> extends true ? B : A;
22
26
 
@@ -67,8 +71,6 @@ declare global {
67
71
  N3 extends keyof __VLS_GlobalComponents ? N3 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N3] } :
68
72
  ${vueCompilerOptions.strictTemplates ? '{}' : '{ [K in N0]: unknown }'}
69
73
 
70
- type __VLS_FillingEventArg_ParametersLength<E extends (...args: any) => any> = __VLS_IsAny<Parameters<E>> extends true ? -1 : Parameters<E>['length'];
71
- type __VLS_FillingEventArg<E> = E extends (...args: any) => any ? __VLS_FillingEventArg_ParametersLength<E> extends 0 ? ($event?: undefined) => ReturnType<E> : E : E;
72
74
  function __VLS_asFunctionalComponent<T, K = T extends new (...args: any) => any ? InstanceType<T> : unknown>(t: T, instance?: K):
73
75
  T extends new (...args: any) => any
74
76
  ? (props: ${fnPropsType}, ctx?: any) => __VLS_Element & { __ctx?: {
@@ -81,12 +83,6 @@ declare global {
81
83
  : (_: {}${vueCompilerOptions.strictTemplates ? '' : ' & Record<string, unknown>'}, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: {}${vueCompilerOptions.strictTemplates ? '' : ' & Record<string, unknown>'} } };
82
84
  function __VLS_elementAsFunction<T>(tag: T, endTag?: T): (_: T${vueCompilerOptions.strictTemplates ? '' : ' & Record<string, unknown>'}) => void;
83
85
  function __VLS_functionalComponentArgsRest<T extends (...args: any) => any>(t: T): Parameters<T>['length'] extends 2 ? [any] : [];
84
- function __VLS_pickEvent<E1, E2>(emitEvent: E1, propEvent: E2): __VLS_FillingEventArg<
85
- __VLS_PickNotAny<
86
- __VLS_AsFunctionOrAny<E2>,
87
- __VLS_AsFunctionOrAny<E1>
88
- >
89
- > | undefined;
90
86
  function __VLS_pickFunctionalComponentCtx<T, K>(comp: T, compInstance: K): __VLS_PickNotAny<
91
87
  '__ctx' extends keyof __VLS_PickNotAny<K, {}> ? K extends { __ctx?: infer Ctx } ? Ctx : never : any
92
88
  , T extends (props: any, ctx: infer Ctx) => any ? Ctx : any
@@ -255,10 +255,6 @@ function* generateComponentProps(options, ctx, scriptSetup, scriptSetupRanges, d
255
255
  yield `let __VLS_functionalComponentProps!: `;
256
256
  yield `${ctx.helperTypes.OmitKeepDiscriminatedUnion.name}<InstanceType<typeof __VLS_fnComponent>['$props'], keyof __VLS_BuiltInPublicProps>`;
257
257
  yield common_1.endOfLine;
258
- yield `type __VLS_BuiltInPublicProps =${common_1.newLine}`
259
- + ` import('${options.vueCompilerOptions.lib}').VNodeProps${common_1.newLine}`
260
- + ` & import('${options.vueCompilerOptions.lib}').AllowedComponentProps${common_1.newLine}`
261
- + ` & import('${options.vueCompilerOptions.lib}').ComponentCustomProps${common_1.endOfLine}`;
262
258
  if (scriptSetupRanges.defineProp.length) {
263
259
  yield `const __VLS_defaults = {${common_1.newLine}`;
264
260
  for (const defineProp of scriptSetupRanges.defineProp) {
@@ -32,7 +32,6 @@ function* generateComponent(options, ctx, node, currentComponent, componentCtxVa
32
32
  const isComponentTag = node.tag.toLowerCase() === 'component';
33
33
  let props = node.props;
34
34
  let dynamicTagInfo;
35
- let usedComponentEventsVar = false;
36
35
  if (isComponentTag) {
37
36
  for (const prop of node.props) {
38
37
  if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE && prop.name === 'bind' && prop.arg?.loc.source === 'is' && prop.exp) {
@@ -158,12 +157,12 @@ function* generateComponent(options, ctx, node, currentComponent, componentCtxVa
158
157
  componentCtxVar = var_defineComponentCtx;
159
158
  currentComponent = node;
160
159
  for (const failedExp of propsFailedExps) {
161
- yield* (0, interpolation_1.generateInterpolation)(options, ctx, failedExp.loc.source, failedExp.loc, failedExp.loc.start.offset, ctx.codeFeatures.all, '(', ')');
160
+ yield* (0, interpolation_1.generateInterpolation)(options, ctx, failedExp.node.loc.source, failedExp.node.loc, failedExp.node.loc.start.offset, ctx.codeFeatures.all, failedExp.prefix, failedExp.suffix);
162
161
  yield common_1.endOfLine;
163
162
  }
164
163
  yield* generateVScope(options, ctx, node, props);
165
164
  ctx.usedComponentCtxVars.add(componentCtxVar);
166
- yield* (0, elementEvents_1.generateElementEvents)(options, ctx, node, var_functionalComponent, var_componentInstance, var_componentEmit, var_componentEvents, () => usedComponentEventsVar = true);
165
+ const usedComponentEventsVar = yield* (0, elementEvents_1.generateElementEvents)(options, ctx, node, var_functionalComponent, var_componentInstance, var_componentEmit, var_componentEvents);
167
166
  const slotDir = node.props.find(p => p.type === CompilerDOM.NodeTypes.DIRECTIVE && p.name === 'slot');
168
167
  if (slotDir) {
169
168
  yield* generateComponentSlot(options, ctx, node, slotDir, currentComponent, componentCtxVar);
@@ -196,7 +195,7 @@ function* generateElement(options, ctx, node, currentComponent, componentCtxVar)
196
195
  yield* (0, common_1.wrapWith)(startTagOffset, startTagOffset + node.tag.length, ctx.codeFeatures.verification, `{`, ...(0, elementProps_1.generateElementProps)(options, ctx, node, node.props, true, propsFailedExps), `}`);
197
196
  yield `)${common_1.endOfLine}`;
198
197
  for (const failedExp of propsFailedExps) {
199
- yield* (0, interpolation_1.generateInterpolation)(options, ctx, failedExp.loc.source, failedExp.loc, failedExp.loc.start.offset, ctx.codeFeatures.all, '(', ')');
198
+ yield* (0, interpolation_1.generateInterpolation)(options, ctx, failedExp.node.loc.source, failedExp.node.loc, failedExp.node.loc.start.offset, ctx.codeFeatures.all, failedExp.prefix, failedExp.suffix);
200
199
  yield common_1.endOfLine;
201
200
  }
202
201
  yield* generateVScope(options, ctx, node, node.props);
@@ -3,7 +3,7 @@ import type * as ts from 'typescript';
3
3
  import type { Code } from '../../types';
4
4
  import type { TemplateCodegenContext } from './context';
5
5
  import type { TemplateCodegenOptions } from './index';
6
- export declare function generateElementEvents(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, componentVar: string, componentInstanceVar: string, emitVar: string, eventsVar: string, used: () => void): Generator<Code>;
7
- export declare function generateEventArg(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, arg: CompilerDOM.SimpleExpressionNode, access: boolean, enableHover: boolean): Generator<Code>;
6
+ export declare function generateElementEvents(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, componentVar: string, componentInstanceVar: string, emitVar: string, eventsVar: string): Generator<Code>;
7
+ export declare function generateEventArg(ctx: TemplateCodegenContext, arg: CompilerDOM.SimpleExpressionNode, enableHover: boolean): Generator<Code>;
8
8
  export declare function generateEventExpression(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, prop: CompilerDOM.DirectiveNode): Generator<Code>;
9
9
  export declare function isCompoundExpression(ts: typeof import('typescript'), ast: ts.SourceFile): boolean;
@@ -7,44 +7,52 @@ const shared_2 = require("../../utils/shared");
7
7
  const common_1 = require("../common");
8
8
  const camelized_1 = require("./camelized");
9
9
  const interpolation_1 = require("./interpolation");
10
- const objectProperty_1 = require("./objectProperty");
11
- function* generateElementEvents(options, ctx, node, componentVar, componentInstanceVar, emitVar, eventsVar, used) {
10
+ function* generateElementEvents(options, ctx, node, componentVar, componentInstanceVar, emitVar, eventsVar) {
11
+ let usedComponentEventsVar = false;
12
+ let propsVar;
12
13
  for (const prop of node.props) {
13
14
  if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
14
15
  && prop.name === 'on'
15
- && prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
16
- used();
17
- const eventVar = ctx.getInternalVariable();
18
- yield `let ${eventVar} = {${common_1.newLine}`;
19
- yield `/**__VLS_emit,${emitVar},${prop.arg.loc.source}*/${common_1.newLine}`;
20
- yield `'${prop.arg.loc.source}': __VLS_pickEvent(`;
21
- yield `${eventsVar}['${prop.arg.loc.source}'], `;
22
- yield `({} as __VLS_FunctionalComponentProps<typeof ${componentVar}, typeof ${componentInstanceVar}>)`;
23
- yield* generateEventArg(options, ctx, prop.arg, true, false);
24
- yield `) }${common_1.endOfLine}`;
25
- yield `${eventVar} = { `;
26
- if (prop.arg.loc.source.startsWith('[') && prop.arg.loc.source.endsWith(']')) {
27
- yield `[(`;
28
- yield* (0, interpolation_1.generateInterpolation)(options, ctx, prop.arg.loc.source.slice(1, -1), prop.arg.loc, prop.arg.loc.start.offset + 1, ctx.codeFeatures.all, '', '');
29
- yield `)!]`;
16
+ && prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION
17
+ && !prop.arg.loc.source.startsWith('[')
18
+ && !prop.arg.loc.source.endsWith(']')) {
19
+ usedComponentEventsVar = true;
20
+ if (!propsVar) {
21
+ propsVar = ctx.getInternalVariable();
22
+ yield `let ${propsVar}!: __VLS_FunctionalComponentProps<typeof ${componentVar}, typeof ${componentInstanceVar}>${common_1.endOfLine}`;
23
+ }
24
+ const originalPropName = (0, shared_1.camelize)('on-' + prop.arg.loc.source);
25
+ const originalPropNameObjectKey = common_1.variableNameRegex.test(originalPropName)
26
+ ? originalPropName
27
+ : `'${originalPropName}'`;
28
+ yield `const ${ctx.getInternalVariable()}: `;
29
+ if (!options.vueCompilerOptions.strictTemplates) {
30
+ yield `Record<string, unknown> & `;
30
31
  }
31
- else {
32
- yield* (0, objectProperty_1.generateObjectProperty)(options, ctx, prop.arg.loc.source, prop.arg.loc.start.offset, ctx.codeFeatures.withoutHighlightAndCompletionAndNavigation, prop.arg.loc);
32
+ yield `(`;
33
+ yield `__VLS_IsAny<__VLS_AsFunctionOrAny<typeof ${propsVar}['${originalPropName}']>> extends false${common_1.newLine}`;
34
+ yield `? typeof ${propsVar}${common_1.newLine}`;
35
+ yield `: __VLS_IsAny<typeof ${eventsVar}['${prop.arg.loc.source}']> extends false${common_1.newLine}`;
36
+ yield `? {${common_1.newLine}`;
37
+ yield `/**__VLS_emit,${emitVar},${prop.arg.loc.source}*/${common_1.newLine}`;
38
+ yield `${originalPropNameObjectKey}?: typeof ${eventsVar}['${prop.arg.loc.source}']${common_1.newLine}`;
39
+ yield `}${common_1.newLine}`;
40
+ if (prop.arg.loc.source !== (0, shared_1.camelize)(prop.arg.loc.source)) {
41
+ yield `: __VLS_IsAny<typeof ${eventsVar}['${(0, shared_1.camelize)(prop.arg.loc.source)}']> extends false${common_1.newLine}`;
42
+ yield `? {${common_1.newLine}`;
43
+ yield `/**__VLS_emit,${emitVar},${(0, shared_1.camelize)(prop.arg.loc.source)}*/${common_1.newLine}`;
44
+ yield `${originalPropNameObjectKey}?: typeof ${eventsVar}['${(0, shared_1.camelize)(prop.arg.loc.source)}']${common_1.newLine}`;
45
+ yield `}${common_1.newLine}`;
33
46
  }
47
+ yield `: typeof ${propsVar}${common_1.newLine}`;
48
+ yield `) = {${common_1.newLine}`;
49
+ yield* generateEventArg(ctx, prop.arg, true);
34
50
  yield `: `;
35
51
  yield* generateEventExpression(options, ctx, prop);
36
- yield common_1.newLine;
37
52
  yield `}${common_1.endOfLine}`;
38
53
  }
39
- else if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
40
- && prop.name === 'on'
41
- && prop.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
42
- // for vue 2 nameless event
43
- // https://github.com/johnsoncodehk/vue-tsc/issues/67
44
- yield* (0, interpolation_1.generateInterpolation)(options, ctx, prop.exp.content, prop.exp.loc, prop.exp.loc.start.offset, ctx.codeFeatures.all, '$event => {(', ')}');
45
- yield common_1.endOfLine;
46
- }
47
54
  }
55
+ return usedComponentEventsVar;
48
56
  }
49
57
  exports.generateElementEvents = generateElementEvents;
50
58
  const eventArgFeatures = {
@@ -63,34 +71,20 @@ const eventArgFeatures = {
63
71
  },
64
72
  },
65
73
  };
66
- function* generateEventArg(options, ctx, arg, access, enableHover) {
74
+ function* generateEventArg(ctx, arg, enableHover) {
67
75
  const features = enableHover
68
76
  ? {
69
77
  ...ctx.codeFeatures.withoutHighlightAndCompletion,
70
78
  ...eventArgFeatures,
71
79
  }
72
80
  : eventArgFeatures;
73
- if (arg.loc.source.startsWith('[') && arg.loc.source.endsWith(']')) {
74
- yield `[`;
75
- yield* (0, interpolation_1.generateInterpolation)(options, ctx, arg.loc.source.slice(1, -1), arg.loc, arg.loc.start.offset + 1, ctx.codeFeatures.all, '', '');
76
- yield `]`;
77
- }
78
- else if (common_1.variableNameRegex.test((0, shared_1.camelize)(arg.loc.source))) {
79
- if (access) {
80
- yield `.`;
81
- }
81
+ if (common_1.variableNameRegex.test((0, shared_1.camelize)(arg.loc.source))) {
82
82
  yield ['', 'template', arg.loc.start.offset, features];
83
83
  yield `on`;
84
84
  yield* (0, camelized_1.generateCamelized)((0, shared_1.capitalize)(arg.loc.source), arg.loc.start.offset, common_1.combineLastMapping);
85
85
  }
86
86
  else {
87
- if (access) {
88
- yield `[`;
89
- }
90
87
  yield* (0, common_1.wrapWith)(arg.loc.start.offset, arg.loc.end.offset, features, `'`, ['', 'template', arg.loc.start.offset, common_1.combineLastMapping], 'on', ...(0, camelized_1.generateCamelized)((0, shared_1.capitalize)(arg.loc.source), arg.loc.start.offset, common_1.combineLastMapping), `'`);
91
- if (access) {
92
- yield `]`;
93
- }
94
88
  }
95
89
  }
96
90
  exports.generateEventArg = generateEventArg;
@@ -102,7 +96,7 @@ function* generateEventExpression(options, ctx, prop) {
102
96
  const ast = (0, common_1.createTsAst)(options.ts, prop.exp, prop.exp.content);
103
97
  const _isCompoundExpression = isCompoundExpression(options.ts, ast);
104
98
  if (_isCompoundExpression) {
105
- yield `$event => {${common_1.newLine}`;
99
+ yield `(...[$event]) => {${common_1.newLine}`;
106
100
  ctx.addLocalVariable('$event');
107
101
  prefix = '';
108
102
  suffix = '';
@@ -2,4 +2,8 @@ import * as CompilerDOM from '@vue/compiler-dom';
2
2
  import type { Code } from '../../types';
3
3
  import type { TemplateCodegenContext } from './context';
4
4
  import type { TemplateCodegenOptions } from './index';
5
- export declare function generateElementProps(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, props: CompilerDOM.ElementNode['props'], enableCodeFeatures: boolean, propsFailedExps?: CompilerDOM.SimpleExpressionNode[]): Generator<Code>;
5
+ export declare function generateElementProps(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, props: CompilerDOM.ElementNode['props'], enableCodeFeatures: boolean, propsFailedExps?: {
6
+ node: CompilerDOM.SimpleExpressionNode;
7
+ prefix: string;
8
+ suffix: string;
9
+ }[]): Generator<Code>;
@@ -12,86 +12,72 @@ const objectProperty_1 = require("./objectProperty");
12
12
  const language_core_1 = require("@volar/language-core");
13
13
  const elementEvents_1 = require("./elementEvents");
14
14
  function* generateElementProps(options, ctx, node, props, enableCodeFeatures, propsFailedExps) {
15
- let styleAttrNum = 0;
16
- let classAttrNum = 0;
17
15
  const isIntrinsicElement = node.tagType === CompilerDOM.ElementTypes.ELEMENT || node.tagType === CompilerDOM.ElementTypes.TEMPLATE;
18
16
  const canCamelize = node.tagType === CompilerDOM.ElementTypes.COMPONENT;
19
- if (props.some(prop => prop.type === CompilerDOM.NodeTypes.DIRECTIVE
20
- && prop.name === 'bind'
21
- && !prop.arg
22
- && prop.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION)) {
23
- // fix https://github.com/vuejs/language-tools/issues/2166
24
- styleAttrNum++;
25
- classAttrNum++;
26
- }
27
- if (isIntrinsicElement) {
28
- for (const prop of props) {
29
- if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
30
- && prop.name === 'on') {
31
- if (prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
32
- yield* (0, elementEvents_1.generateEventArg)(options, ctx, prop.arg, false, true);
17
+ for (const prop of props) {
18
+ if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
19
+ && prop.name === 'on') {
20
+ if (prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION
21
+ && !prop.arg.loc.source.startsWith('[')
22
+ && !prop.arg.loc.source.endsWith(']')) {
23
+ if (isIntrinsicElement) {
24
+ yield `...{ `;
25
+ yield* (0, elementEvents_1.generateEventArg)(ctx, prop.arg, true);
33
26
  yield `: `;
34
27
  yield* (0, elementEvents_1.generateEventExpression)(options, ctx, prop);
35
- yield `,${common_1.newLine}`;
28
+ yield `}, `;
36
29
  }
37
- else if (prop.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
38
- propsFailedExps?.push(prop.exp);
30
+ else {
31
+ yield `...{ '${(0, shared_1.camelize)('on-' + prop.arg.loc.source)}': {} as any }, `;
39
32
  }
40
33
  }
41
- }
42
- }
43
- else {
44
- let generatedEvent = false;
45
- for (const prop of props) {
46
- if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
47
- && prop.name === 'on'
48
- && prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
49
- if (prop.arg.loc.source.startsWith('[') && prop.arg.loc.source.endsWith(']')) {
50
- continue;
51
- }
52
- if (!generatedEvent) {
53
- yield `...{ `;
54
- generatedEvent = true;
55
- }
56
- yield `'${(0, shared_1.camelize)('on-' + prop.arg.loc.source)}': {} as any, `;
34
+ else if (prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION
35
+ && prop.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION
36
+ && prop.arg.loc.source.startsWith('[')
37
+ && prop.arg.loc.source.endsWith(']')) {
38
+ propsFailedExps?.push({ node: prop.arg, prefix: '(', suffix: ')' });
39
+ propsFailedExps?.push({ node: prop.exp, prefix: '() => {', suffix: '}' });
40
+ }
41
+ else if (!prop.arg
42
+ && prop.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
43
+ propsFailedExps?.push({ node: prop.exp, prefix: '(', suffix: ')' });
57
44
  }
58
- }
59
- if (generatedEvent) {
60
- yield `}, `;
61
45
  }
62
46
  }
63
47
  for (const prop of props) {
64
48
  if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
65
- && (prop.name === 'bind' || prop.name === 'model')
66
- && (prop.name === 'model' || prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION)
49
+ && ((prop.name === 'bind' && prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION)
50
+ || prop.name === 'model')
67
51
  && (!prop.exp || prop.exp.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION)) {
68
- let propName = prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION
69
- ? prop.arg.constType === CompilerDOM.ConstantTypes.CAN_STRINGIFY
52
+ let propName;
53
+ if (prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
54
+ propName = prop.arg.constType === CompilerDOM.ConstantTypes.CAN_STRINGIFY
70
55
  ? prop.arg.content
71
- : prop.arg.loc.source
72
- : getModelValuePropName(node, options.vueCompilerOptions.target, options.vueCompilerOptions);
73
- if (prop.modifiers.some(m => m === 'prop' || m === 'attr')) {
74
- propName = propName?.substring(1);
56
+ : prop.arg.loc.source;
57
+ }
58
+ else {
59
+ propName = getModelValuePropName(node, options.vueCompilerOptions.target, options.vueCompilerOptions);
75
60
  }
76
61
  if (propName === undefined
77
- || options.vueCompilerOptions.dataAttributes.some(pattern => (0, minimatch_1.minimatch)(propName, pattern))
78
- || (propName === 'style' && ++styleAttrNum >= 2)
79
- || (propName === 'class' && ++classAttrNum >= 2)
80
- || (propName === 'name' && node.tagType === CompilerDOM.ElementTypes.SLOT) // #2308
81
- ) {
62
+ || options.vueCompilerOptions.dataAttributes.some(pattern => (0, minimatch_1.minimatch)(propName, pattern))) {
82
63
  if (prop.exp && prop.exp.constType !== CompilerDOM.ConstantTypes.CAN_STRINGIFY) {
83
- propsFailedExps?.push(prop.exp);
64
+ propsFailedExps?.push({ node: prop.exp, prefix: '(', suffix: ')' });
84
65
  }
85
66
  continue;
86
67
  }
68
+ if (prop.modifiers.some(m => m === 'prop' || m === 'attr')) {
69
+ propName = propName.substring(1);
70
+ }
71
+ const shouldSpread = propName === 'style' || propName === 'class';
87
72
  const shouldCamelize = canCamelize
88
73
  && (!prop.arg || (prop.arg.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION && prop.arg.isStatic)) // isStatic
89
74
  && (0, shared_2.hyphenateAttr)(propName) === propName
90
75
  && !options.vueCompilerOptions.htmlAttributes.some(pattern => (0, minimatch_1.minimatch)(propName, pattern));
91
- const codes = (0, common_1.wrapWith)(prop.loc.start.offset, prop.loc.end.offset, ctx.codeFeatures.verification, ...(0, objectProperty_1.generateObjectProperty)(options, ctx, propName, prop.arg
92
- ? prop.arg.loc.start.offset
93
- : prop.loc.start.offset, prop.arg
94
- ? {
76
+ if (shouldSpread) {
77
+ yield `...{ `;
78
+ }
79
+ const codes = (0, common_1.wrapWith)(prop.loc.start.offset, prop.loc.end.offset, ctx.codeFeatures.verification, ...(prop.arg
80
+ ? (0, objectProperty_1.generateObjectProperty)(options, ctx, propName, prop.arg.loc.start.offset, {
95
81
  ...ctx.codeFeatures.withoutHighlightAndCompletion,
96
82
  navigation: ctx.codeFeatures.withoutHighlightAndCompletion.navigation
97
83
  ? {
@@ -99,33 +85,34 @@ function* generateElementProps(options, ctx, node, props, enableCodeFeatures, pr
99
85
  resolveRenameEditText: shouldCamelize ? shared_2.hyphenateAttr : undefined,
100
86
  }
101
87
  : false,
102
- }
103
- : ctx.codeFeatures.withoutHighlightAndCompletion, prop.loc.name_2 ?? (prop.loc.name_2 = {}), shouldCamelize), `: (`, ...genereatePropExp(options, ctx, prop.exp, ctx.codeFeatures.all, prop.arg?.loc.start.offset === prop.exp?.loc.start.offset, enableCodeFeatures), `)`);
88
+ }, prop.loc.name_2 ?? (prop.loc.name_2 = {}), shouldCamelize)
89
+ : [propName]), `: (`, ...genereatePropExp(options, ctx, prop.exp, ctx.codeFeatures.all, prop.arg?.loc.start.offset === prop.exp?.loc.start.offset, enableCodeFeatures), `)`);
104
90
  if (!enableCodeFeatures) {
105
91
  yield (0, language_core_1.toString)([...codes]);
106
92
  }
107
93
  else {
108
94
  yield* codes;
109
95
  }
96
+ if (shouldSpread) {
97
+ yield ` }`;
98
+ }
110
99
  yield `, `;
111
100
  }
112
101
  else if (prop.type === CompilerDOM.NodeTypes.ATTRIBUTE) {
113
102
  if (options.vueCompilerOptions.dataAttributes.some(pattern => (0, minimatch_1.minimatch)(prop.name, pattern))
114
- || (prop.name === 'style' && ++styleAttrNum >= 2)
115
- || (prop.name === 'class' && ++classAttrNum >= 2)
116
- || (prop.name === 'name' && node.tagType === CompilerDOM.ElementTypes.SLOT) // #2308
117
- ) {
118
- continue;
119
- }
120
- if (options.vueCompilerOptions.target < 3
121
- && prop.name === 'persisted'
122
- && node.tag.toLowerCase() === 'transition') {
123
103
  // Vue 2 Transition doesn't support "persisted" property but `@vue/compiler-dom always adds it (#3881)
104
+ || (options.vueCompilerOptions.target < 3
105
+ && prop.name === 'persisted'
106
+ && node.tag.toLowerCase() === 'transition')) {
124
107
  continue;
125
108
  }
109
+ const shouldSpread = prop.name === 'style' || prop.name === 'class';
126
110
  const shouldCamelize = canCamelize
127
111
  && (0, shared_2.hyphenateAttr)(prop.name) === prop.name
128
112
  && !options.vueCompilerOptions.htmlAttributes.some(pattern => (0, minimatch_1.minimatch)(prop.name, pattern));
113
+ if (shouldSpread) {
114
+ yield `...{ `;
115
+ }
129
116
  const codes = (0, common_1.conditionWrapWith)(enableCodeFeatures, prop.loc.start.offset, prop.loc.end.offset, ctx.codeFeatures.verification, ...(0, objectProperty_1.generateObjectProperty)(options, ctx, prop.name, prop.loc.start.offset, shouldCamelize
130
117
  ? {
131
118
  ...ctx.codeFeatures.withoutHighlightAndCompletion,
@@ -145,6 +132,9 @@ function* generateElementProps(options, ctx, node, props, enableCodeFeatures, pr
145
132
  else {
146
133
  yield* codes;
147
134
  }
135
+ if (shouldSpread) {
136
+ yield ` }`;
137
+ }
148
138
  yield `, `;
149
139
  }
150
140
  else if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
@@ -15,4 +15,3 @@ export interface TemplateCodegenOptions {
15
15
  }
16
16
  export declare function generateTemplate(options: TemplateCodegenOptions): Generator<Code, TemplateCodegenContext>;
17
17
  export declare function forEachElementNode(node: CompilerDOM.RootNode | CompilerDOM.TemplateChildNode): Generator<CompilerDOM.ElementNode>;
18
- export declare function isFragment(node: CompilerDOM.IfNode | CompilerDOM.ForNode): boolean | undefined;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isFragment = exports.forEachElementNode = exports.generateTemplate = void 0;
3
+ exports.forEachElementNode = exports.generateTemplate = void 0;
4
4
  const CompilerDOM = require("@vue/compiler-dom");
5
5
  const common_1 = require("../common");
6
6
  const context_1 = require("./context");
@@ -138,8 +138,4 @@ function* forEachElementNode(node) {
138
138
  }
139
139
  }
140
140
  exports.forEachElementNode = forEachElementNode;
141
- function isFragment(node) {
142
- return node.codegenNode && 'consequent' in node.codegenNode && 'tag' in node.codegenNode.consequent && node.codegenNode.consequent.tag === CompilerDOM.FRAGMENT;
143
- }
144
- exports.isFragment = isFragment;
145
141
  //# sourceMappingURL=index.js.map
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseVForNode = exports.generateVFor = void 0;
4
4
  const CompilerDOM = require("@vue/compiler-dom");
5
5
  const common_1 = require("../common");
6
- const index_1 = require("./index");
7
6
  const interpolation_1 = require("./interpolation");
8
7
  const templateChild_1 = require("./templateChild");
9
8
  function* generateVFor(options, ctx, node, currentComponent, componentCtxVar) {
@@ -31,12 +30,30 @@ function* generateVFor(options, ctx, node, currentComponent, componentCtxVar) {
31
30
  yield `{} as any`;
32
31
  }
33
32
  yield `) {${common_1.newLine}`;
34
- if ((0, index_1.isFragment)(node)) {
35
- yield* ctx.resetDirectiveComments('end of v-for start');
36
- }
37
33
  for (const varName of forBlockVars) {
38
34
  ctx.addLocalVariable(varName);
39
35
  }
36
+ let isFragment = true;
37
+ for (const argument of node.codegenNode?.children.arguments ?? []) {
38
+ if (argument.type === CompilerDOM.NodeTypes.JS_FUNCTION_EXPRESSION
39
+ && argument.returns.type === CompilerDOM.NodeTypes.VNODE_CALL
40
+ && argument.returns.props?.type === CompilerDOM.NodeTypes.JS_OBJECT_EXPRESSION) {
41
+ if (argument.returns.tag !== CompilerDOM.FRAGMENT) {
42
+ isFragment = false;
43
+ continue;
44
+ }
45
+ for (const prop of argument.returns.props.properties) {
46
+ if (prop.value.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION
47
+ && !prop.value.isStatic) {
48
+ yield* (0, interpolation_1.generateInterpolation)(options, ctx, prop.value.content, prop.value.loc, prop.value.loc.start.offset, ctx.codeFeatures.all, '(', ')');
49
+ yield common_1.endOfLine;
50
+ }
51
+ }
52
+ }
53
+ }
54
+ if (isFragment) {
55
+ yield* ctx.resetDirectiveComments('end of v-for start');
56
+ }
40
57
  let prev;
41
58
  for (const childNode of node.children) {
42
59
  yield* (0, templateChild_1.generateTemplateChild)(options, ctx, childNode, currentComponent, prev, componentCtxVar);
@@ -4,7 +4,6 @@ exports.generateVIf = void 0;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const CompilerDOM = require("@vue/compiler-dom");
6
6
  const common_1 = require("../common");
7
- const index_1 = require("./index");
8
7
  const interpolation_1 = require("./interpolation");
9
8
  const templateChild_1 = require("./templateChild");
10
9
  function* generateVIf(options, ctx, node, currentComponent, componentCtxVar) {
@@ -33,7 +32,7 @@ function* generateVIf(options, ctx, node, currentComponent, componentCtxVar) {
33
32
  yield ` `;
34
33
  }
35
34
  yield `{${common_1.newLine}`;
36
- if ((0, index_1.isFragment)(node)) {
35
+ if (isFragment(node)) {
37
36
  yield* ctx.resetDirectiveComments('end of v-if start');
38
37
  }
39
38
  let prev;
@@ -50,4 +49,10 @@ function* generateVIf(options, ctx, node, currentComponent, componentCtxVar) {
50
49
  ctx.blockConditions.length = originalBlockConditionsLength;
51
50
  }
52
51
  exports.generateVIf = generateVIf;
52
+ function isFragment(node) {
53
+ return node.codegenNode
54
+ && 'consequent' in node.codegenNode
55
+ && 'tag' in node.codegenNode.consequent
56
+ && node.codegenNode.consequent.tag === CompilerDOM.FRAGMENT;
57
+ }
53
58
  //# sourceMappingURL=vIf.js.map
@@ -42,6 +42,7 @@ const plugin = () => {
42
42
  const file2VueSourceMap = new language_core_1.SourceMap((0, language_core_1.buildMappings)(codes));
43
43
  const sfc = (0, parseSfc_1.parse)((0, language_core_1.toString)(codes));
44
44
  if (sfc.descriptor.template) {
45
+ sfc.descriptor.template.lang = 'md';
45
46
  transformRange(sfc.descriptor.template);
46
47
  }
47
48
  if (sfc.descriptor.script) {
@@ -0,0 +1,3 @@
1
+ import type { VueLanguagePlugin } from '../types';
2
+ declare const plugin: VueLanguagePlugin;
3
+ export default plugin;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const plugin = ({ modules }) => {
4
+ return {
5
+ version: 2,
6
+ compileSFCScript(lang, script) {
7
+ if (lang === 'js' || lang === 'ts' || lang === 'jsx' || lang === 'tsx') {
8
+ const ts = modules.typescript;
9
+ return ts.createSourceFile('test.' + lang, script, 99);
10
+ }
11
+ },
12
+ };
13
+ };
14
+ exports.default = plugin;
15
+ //# sourceMappingURL=vue-script-js.js.map
@@ -4,7 +4,7 @@ const plugin = ({ modules }) => {
4
4
  return {
5
5
  version: 2,
6
6
  compileSFCTemplate(lang, template, options) {
7
- if (lang === 'html') {
7
+ if (lang === 'html' || lang === 'md') {
8
8
  const compiler = modules['@vue/compiler-dom'];
9
9
  return compiler.compile(template, {
10
10
  ...options,
package/lib/plugins.d.ts CHANGED
@@ -12,6 +12,7 @@ export declare function getBasePlugins(pluginContext: Parameters<VueLanguagePlug
12
12
  newText: string;
13
13
  }): import("@vue/compiler-sfc").SFCParseResult | undefined;
14
14
  resolveTemplateCompilerOptions?(options: import("@vue/compiler-dom").CompilerOptions): import("@vue/compiler-dom").CompilerOptions;
15
+ compileSFCScript?(lang: string, script: string): import("typescript").SourceFile | undefined;
15
16
  compileSFCTemplate?(lang: string, template: string, options: import("@vue/compiler-dom").CompilerOptions): import("@vue/compiler-dom").CodegenResult | undefined;
16
17
  updateSFCTemplate?(oldResult: import("@vue/compiler-dom").CodegenResult, textChange: {
17
18
  start: number;
package/lib/plugins.js CHANGED
@@ -19,6 +19,7 @@ const vue_sfc_customblocks_1 = require("./plugins/vue-sfc-customblocks");
19
19
  const vue_sfc_scripts_1 = require("./plugins/vue-sfc-scripts");
20
20
  const vue_sfc_styles_1 = require("./plugins/vue-sfc-styles");
21
21
  const vue_sfc_template_1 = require("./plugins/vue-sfc-template");
22
+ const vue_script_js_1 = require("./plugins/vue-script-js");
22
23
  const vue_template_html_1 = require("./plugins/vue-template-html");
23
24
  const vue_template_inline_css_1 = require("./plugins/vue-template-inline-css");
24
25
  const vue_template_inline_ts_1 = require("./plugins/vue-template-inline-ts");
@@ -27,6 +28,7 @@ const types_1 = require("./types");
27
28
  __exportStar(require("./plugins/shared"), exports);
28
29
  function getBasePlugins(pluginContext) {
29
30
  const plugins = [
31
+ vue_script_js_1.default,
30
32
  vue_template_html_1.default,
31
33
  vue_template_inline_css_1.default,
32
34
  vue_template_inline_ts_1.default,
package/lib/types.d.ts CHANGED
@@ -68,6 +68,7 @@ export type VueLanguagePlugin = (ctx: {
68
68
  newText: string;
69
69
  }): SFCParseResult | undefined;
70
70
  resolveTemplateCompilerOptions?(options: CompilerDOM.CompilerOptions): CompilerDOM.CompilerOptions;
71
+ compileSFCScript?(lang: string, script: string): ts.SourceFile | undefined;
71
72
  compileSFCTemplate?(lang: string, template: string, options: CompilerDOM.CompilerOptions): CompilerDOM.CodegenResult | undefined;
72
73
  updateSFCTemplate?(oldResult: CompilerDOM.CodegenResult, textChange: {
73
74
  start: number;
@@ -25,7 +25,16 @@ function computedSfc(ts, plugins, fileName, snapshot, parsed) {
25
25
  const _src = src();
26
26
  return _src ? untrackedSnapshot().getText(0, base.startTagEnd).lastIndexOf(_src) - base.startTagEnd : -1;
27
27
  });
28
- const ast = (0, computeds_1.computed)(() => ts.createSourceFile(fileName + '.' + base.lang, base.content, 99));
28
+ const ast = (0, computeds_1.computed)(() => {
29
+ for (const plugin of plugins) {
30
+ const ast = plugin.compileSFCScript?.(base.lang, base.content);
31
+ if (ast) {
32
+ return ast;
33
+ ;
34
+ }
35
+ }
36
+ return ts.createSourceFile(fileName + '.' + base.lang, '', 99);
37
+ });
29
38
  return mergeObject(base, {
30
39
  get src() { return src(); },
31
40
  get srcOffset() { return srcOffset(); },
@@ -41,7 +50,16 @@ function computedSfc(ts, plugins, fileName, snapshot, parsed) {
41
50
  const _generic = generic();
42
51
  return _generic !== undefined ? untrackedSnapshot().getText(0, base.startTagEnd).lastIndexOf(_generic) - base.startTagEnd : -1;
43
52
  });
44
- const ast = (0, computeds_1.computed)(() => ts.createSourceFile(fileName + '.' + base.lang, base.content, 99));
53
+ const ast = (0, computeds_1.computed)(() => {
54
+ for (const plugin of plugins) {
55
+ const ast = plugin.compileSFCScript?.(base.lang, base.content);
56
+ if (ast) {
57
+ return ast;
58
+ ;
59
+ }
60
+ }
61
+ return ts.createSourceFile(fileName + '.' + base.lang, '', 99);
62
+ });
45
63
  return mergeObject(base, {
46
64
  get generic() { return generic(); },
47
65
  get genericOffset() { return genericOffset(); },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vue/language-core",
3
- "version": "2.0.17",
3
+ "version": "2.0.19",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "**/*.js",
@@ -12,7 +12,7 @@
12
12
  "directory": "packages/language-core"
13
13
  },
14
14
  "dependencies": {
15
- "@volar/language-core": "~2.2.2",
15
+ "@volar/language-core": "~2.2.4",
16
16
  "@vue/compiler-dom": "^3.4.0",
17
17
  "@vue/shared": "^3.4.0",
18
18
  "computeds": "^0.0.1",
@@ -34,5 +34,5 @@
34
34
  "optional": true
35
35
  }
36
36
  },
37
- "gitHead": "968039cbb07961f318b4bf122bfa8e3e4a824277"
37
+ "gitHead": "a9fae154ad1efc4359866cfd10251d53e4b0faed"
38
38
  }