@vue/language-core 2.0.26-alpha.2 → 2.0.26

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,3 +7,5 @@ export declare function generateComponent(options: ScriptCodegenOptions, ctx: Sc
7
7
  export declare function generateComponentSetupReturns(scriptSetupRanges: ScriptSetupRanges): Generator<Code>;
8
8
  export declare function generateScriptOptions(script: NonNullable<Sfc['script']>, scriptRanges: ScriptRanges): Generator<Code>;
9
9
  export declare function generateScriptSetupOptions(options: ScriptCodegenOptions, ctx: ScriptCodegenContext, scriptSetup: NonNullable<Sfc['scriptSetup']>, scriptSetupRanges: ScriptSetupRanges): Generator<Code>;
10
+ export declare function generatePropsOption(options: ScriptCodegenOptions, ctx: ScriptCodegenContext, scriptSetup: NonNullable<Sfc['scriptSetup']>, scriptSetupRanges: ScriptSetupRanges): Generator<Code, void, unknown>;
11
+ export declare function generateEmitsOption(options: ScriptCodegenOptions, scriptSetup: NonNullable<Sfc['scriptSetup']>, scriptSetupRanges: ScriptSetupRanges): Generator<Code>;
@@ -4,6 +4,8 @@ exports.generateComponent = generateComponent;
4
4
  exports.generateComponentSetupReturns = generateComponentSetupReturns;
5
5
  exports.generateScriptOptions = generateScriptOptions;
6
6
  exports.generateScriptSetupOptions = generateScriptSetupOptions;
7
+ exports.generatePropsOption = generatePropsOption;
8
+ exports.generateEmitsOption = generateEmitsOption;
7
9
  const common_1 = require("../common");
8
10
  const index_1 = require("./index");
9
11
  function* generateComponent(options, ctx, scriptSetup, scriptSetupRanges) {
@@ -51,58 +53,72 @@ function* generateScriptOptions(script, scriptRanges) {
51
53
  }
52
54
  }
53
55
  function* generateScriptSetupOptions(options, ctx, scriptSetup, scriptSetupRanges) {
54
- const propsCodegens = [];
55
- if (ctx.generatedPropsType) {
56
- propsCodegens.push(function* () {
57
- yield `{} as `;
58
- if (scriptSetupRanges.props.withDefaults?.arg) {
59
- yield `${ctx.helperTypes.WithDefaults.name}<`;
60
- }
61
- yield `${ctx.helperTypes.TypePropsToOption.name}<`;
62
- yield `__VLS_PublicProps>`;
63
- if (scriptSetupRanges.props.withDefaults?.arg) {
64
- yield `, typeof __VLS_withDefaultsArg>`;
65
- }
66
- });
67
- }
68
- if (scriptSetupRanges.props.define?.arg) {
69
- const { arg } = scriptSetupRanges.props.define;
70
- propsCodegens.push(function* () {
71
- yield (0, common_1.generateSfcBlockSection)(scriptSetup, arg.start, arg.end, index_1.codeFeatures.navigation);
72
- });
56
+ yield* generatePropsOption(options, ctx, scriptSetup, scriptSetupRanges);
57
+ yield* generateEmitsOption(options, scriptSetup, scriptSetupRanges);
58
+ }
59
+ function* generatePropsOption(options, ctx, scriptSetup, scriptSetupRanges) {
60
+ if (options.vueCompilerOptions.target >= 3.5 && ctx.generatedPropsType) {
61
+ yield `__typeProps: {} as __VLS_PublicProps,${common_1.newLine}`;
73
62
  }
74
- if (propsCodegens.length === 1) {
75
- yield `props: `;
76
- for (const generate of propsCodegens) {
77
- yield* generate();
63
+ else {
64
+ const codegens = [];
65
+ if (ctx.generatedPropsType) {
66
+ codegens.push(function* () {
67
+ yield `{} as `;
68
+ if (scriptSetupRanges.props.withDefaults?.arg) {
69
+ yield `${ctx.helperTypes.WithDefaults.name}<`;
70
+ }
71
+ yield `${ctx.helperTypes.TypePropsToOption.name}<`;
72
+ yield `__VLS_PublicProps>`;
73
+ if (scriptSetupRanges.props.withDefaults?.arg) {
74
+ yield `, typeof __VLS_withDefaultsArg>`;
75
+ }
76
+ });
78
77
  }
79
- yield `,${common_1.newLine}`;
80
- }
81
- else if (propsCodegens.length >= 2) {
82
- yield `props: {${common_1.newLine}`;
83
- for (const generate of propsCodegens) {
84
- yield `...`;
85
- yield* generate();
78
+ if (scriptSetupRanges.props.define?.arg) {
79
+ const { arg } = scriptSetupRanges.props.define;
80
+ codegens.push(function* () {
81
+ yield (0, common_1.generateSfcBlockSection)(scriptSetup, arg.start, arg.end, index_1.codeFeatures.navigation);
82
+ });
83
+ }
84
+ if (codegens.length === 1) {
85
+ yield `props: `;
86
+ for (const generate of codegens) {
87
+ yield* generate();
88
+ }
86
89
  yield `,${common_1.newLine}`;
87
90
  }
88
- yield `},${common_1.newLine}`;
91
+ else if (codegens.length >= 2) {
92
+ yield `props: {${common_1.newLine}`;
93
+ for (const generate of codegens) {
94
+ yield `...`;
95
+ yield* generate();
96
+ yield `,${common_1.newLine}`;
97
+ }
98
+ yield `},${common_1.newLine}`;
99
+ }
100
+ }
101
+ }
102
+ function* generateEmitsOption(options, scriptSetup, scriptSetupRanges) {
103
+ if (!scriptSetupRanges.emits.define && !scriptSetupRanges.defineProp.some(p => p.isModel)) {
104
+ return;
89
105
  }
90
- if (scriptSetupRanges.defineProp.filter(p => p.isModel).length || scriptSetupRanges.emits.define) {
91
- yield `emits: ({} as __VLS_NormalizeEmits<typeof __VLS_modelEmitsType`;
92
- if (scriptSetupRanges.emits.define) {
106
+ if (options.vueCompilerOptions.target < 3.5 || scriptSetupRanges.emits.define?.arg || scriptSetupRanges.emits.define?.hasUnionTypeArg) {
107
+ yield `emits: ({} as __VLS_NormalizeEmits<__VLS_ModelEmitsType`;
108
+ if (scriptSetupRanges?.emits.define) {
93
109
  yield ` & typeof `;
94
110
  yield scriptSetupRanges.emits.name ?? '__VLS_emit';
95
111
  }
96
112
  yield `>),${common_1.newLine}`;
97
113
  }
98
- if (options.vueCompilerOptions.target >= 3.5) {
99
- // https://github.com/vuejs/core/pull/10801
100
- if (scriptSetupRanges.props.define?.typeArg) {
101
- yield `__typeProps: __VLS_typeProps,${common_1.newLine}`;
102
- }
103
- if (scriptSetupRanges.emits.define?.typeArg) {
104
- yield `__typeEmits: ${scriptSetupRanges.emits.name ?? '__VLS_emit'},${common_1.newLine}`;
114
+ else {
115
+ yield `__typeEmits: {} as __VLS_ModelEmitsType`;
116
+ const typeArg = scriptSetupRanges.emits.define?.typeArg;
117
+ if (typeArg) {
118
+ yield ` & `;
119
+ yield scriptSetup.content.slice(typeArg.start, typeArg.end);
105
120
  }
121
+ yield `,${common_1.newLine}`;
106
122
  }
107
123
  }
108
124
  //# sourceMappingURL=component.js.map
@@ -15,8 +15,9 @@ declare global {
15
15
  type __VLS_Element = ${vueCompilerOptions.target >= 3.3
16
16
  ? `import('${vueCompilerOptions.lib}/jsx-runtime').JSX.Element;`
17
17
  : `globalThis.JSX.Element;`}
18
- type __VLS_GlobalComponents = import('${vueCompilerOptions.lib}').GlobalComponents
19
- & Pick<typeof import('${vueCompilerOptions.lib}'), 'Transition' | 'TransitionGroup' | 'KeepAlive' | 'Suspense' | 'Teleport'>;
18
+ type __VLS_GlobalComponents = ${vueCompilerOptions.target >= 3.5
19
+ ? `import('${vueCompilerOptions.lib}').GlobalComponents`
20
+ : `import('${vueCompilerOptions.lib}').GlobalComponents & Pick<typeof import('${vueCompilerOptions.lib}'), 'Transition' | 'TransitionGroup' | 'KeepAlive' | 'Suspense' | 'Teleport'>;`}
20
21
  type __VLS_BuiltInPublicProps = ${vueCompilerOptions.target >= 3.4
21
22
  ? `import('${vueCompilerOptions.lib}').PublicProps;`
22
23
  : vueCompilerOptions.target >= 3.0
@@ -37,7 +37,7 @@ function* generateScriptSetup(options, ctx, scriptSetup, scriptSetupRanges) {
37
37
  + ` __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>['expose'],${common_1.newLine}`
38
38
  + ` __VLS_setup = (async () => {${common_1.newLine}`;
39
39
  yield* generateSetupFunction(options, ctx, scriptSetup, scriptSetupRanges, undefined, definePropMirrors);
40
- const emitTypes = ['typeof __VLS_modelEmitsType'];
40
+ const emitTypes = ['__VLS_ModelEmitsType'];
41
41
  if (scriptSetupRanges.emits.define) {
42
42
  emitTypes.unshift(`typeof ${scriptSetupRanges.emits.name ?? '__VLS_emit'}`);
43
43
  }
@@ -231,14 +231,7 @@ function* generateComponentProps(options, ctx, scriptSetup, scriptSetupRanges, d
231
231
  yield (0, common_1.generateSfcBlockSection)(scriptSetup, scriptSetupRanges.props.define.arg.start, scriptSetupRanges.props.define.arg.end, index_1.codeFeatures.navigation);
232
232
  yield `,${common_1.newLine}`;
233
233
  }
234
- if (scriptSetupRanges.emits.define || scriptSetupRanges.defineProp.some(p => p.isModel)) {
235
- yield ` emits: ({} as __VLS_NormalizeEmits<typeof __VLS_modelEmitsType`;
236
- if (scriptSetupRanges.emits.define) {
237
- yield ` & typeof `;
238
- yield scriptSetupRanges.emits.name ?? '__VLS_emit';
239
- }
240
- yield `>),${common_1.newLine}`;
241
- }
234
+ yield* (0, component_1.generateEmitsOption)(options, scriptSetup, scriptSetupRanges);
242
235
  yield `})${common_1.endOfLine}`;
243
236
  yield `let __VLS_functionalComponentProps!: `;
244
237
  yield `${ctx.helperTypes.OmitKeepDiscriminatedUnion.name}<InstanceType<typeof __VLS_fnComponent>['$props'], keyof __VLS_BuiltInPublicProps>`;
@@ -329,9 +322,13 @@ function* generateComponentProps(options, ctx, scriptSetup, scriptSetupRanges, d
329
322
  yield common_1.endOfLine;
330
323
  }
331
324
  function* generateModelEmits(options, scriptSetup, scriptSetupRanges) {
332
- yield `const __VLS_modelEmitsType = `;
325
+ yield `type __VLS_ModelEmitsType = `;
333
326
  if (scriptSetupRanges.defineProp.filter(p => p.isModel).length) {
334
- yield `(await import('${options.vueCompilerOptions.lib}')).defineEmits<{${common_1.newLine}`;
327
+ if (options.vueCompilerOptions.target < 3.5) {
328
+ yield `typeof __VLS_modelEmitsType${common_1.endOfLine}`;
329
+ yield `const __VLS_modelEmitsType = (await import('${options.vueCompilerOptions.lib}')).defineEmits<`;
330
+ }
331
+ yield `{${common_1.newLine}`;
335
332
  for (const defineProp of scriptSetupRanges.defineProp) {
336
333
  if (!defineProp.isModel) {
337
334
  continue;
@@ -350,7 +347,10 @@ function* generateModelEmits(options, scriptSetup, scriptSetupRanges) {
350
347
  }
351
348
  yield `]${common_1.endOfLine}`;
352
349
  }
353
- yield `}>()`;
350
+ yield `}`;
351
+ if (options.vueCompilerOptions.target < 3.5) {
352
+ yield `>()`;
353
+ }
354
354
  }
355
355
  else {
356
356
  yield `{}`;
@@ -73,11 +73,11 @@ function createVueLanguagePlugin(ts, asFileName, getProjectVersion, isRootFile,
73
73
  createVirtualCode(scriptId, languageId, snapshot) {
74
74
  if (languageId === 'vue' || languageId === 'markdown' || languageId === 'html') {
75
75
  const fileName = asFileName(scriptId);
76
- if (!pluginContext.globalTypesHolder && getProjectVersion() !== canonicalRootFileNamesVersion) {
76
+ if (getProjectVersion() !== canonicalRootFileNamesVersion) {
77
77
  canonicalRootFileNamesVersion = getProjectVersion();
78
- if (isRootFile(fileName)) {
79
- pluginContext.globalTypesHolder = fileName;
80
- }
78
+ }
79
+ if (!pluginContext.globalTypesHolder && isRootFile(fileName)) {
80
+ pluginContext.globalTypesHolder = fileName;
81
81
  }
82
82
  const fileRegistry = getFileRegistry(pluginContext.globalTypesHolder === fileName);
83
83
  const code = fileRegistry.get(fileName);
@@ -32,7 +32,9 @@ export declare function parseScriptSetupRanges(ts: typeof import('typescript'),
32
32
  define?: ReturnType<(node: ts.CallExpression) => TextRange & {
33
33
  arg?: TextRange;
34
34
  typeArg?: TextRange;
35
- }>;
35
+ }> & {
36
+ hasUnionTypeArg?: boolean;
37
+ };
36
38
  };
37
39
  expose: {
38
40
  name?: string;
@@ -168,6 +168,14 @@ function parseScriptSetupRanges(ts, ast, vueCompilerOptions) {
168
168
  if (ts.isVariableDeclaration(parent)) {
169
169
  emits.name = getNodeText(ts, parent.name, ast);
170
170
  }
171
+ if (node.typeArguments?.length && ts.isTypeLiteralNode(node.typeArguments[0]) && node.typeArguments[0].members.at(0)) {
172
+ for (const member of node.typeArguments[0].members) {
173
+ if (ts.isCallSignatureDeclaration(member) && member.parameters[0].type && ts.isUnionTypeNode(member.parameters[0].type)) {
174
+ emits.define.hasUnionTypeArg = true;
175
+ return;
176
+ }
177
+ }
178
+ }
171
179
  }
172
180
  else if (vueCompilerOptions.macros.defineExpose.includes(callText)) {
173
181
  expose.define = parseDefineFunction(node);
@@ -43,7 +43,9 @@ export declare const tsCodegen: WeakMap<Sfc, {
43
43
  define?: ReturnType<(node: import("typescript").CallExpression) => import("../types").TextRange & {
44
44
  arg?: import("../types").TextRange;
45
45
  typeArg?: import("../types").TextRange;
46
- }>;
46
+ }> & {
47
+ hasUnionTypeArg?: boolean;
48
+ };
47
49
  };
48
50
  expose: {
49
51
  name?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vue/language-core",
3
- "version": "2.0.26-alpha.2",
3
+ "version": "2.0.26",
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.4.0-alpha.12",
15
+ "@volar/language-core": "~2.4.0-alpha.15",
16
16
  "@vue/compiler-dom": "^3.4.0",
17
17
  "@vue/shared": "^3.4.0",
18
18
  "computeds": "^0.0.1",
@@ -25,7 +25,7 @@
25
25
  "@types/minimatch": "^5.1.2",
26
26
  "@types/node": "latest",
27
27
  "@types/path-browserify": "^1.0.1",
28
- "@volar/typescript": "~2.4.0-alpha.12",
28
+ "@volar/typescript": "~2.4.0-alpha.15",
29
29
  "@vue/compiler-sfc": "^3.4.0"
30
30
  },
31
31
  "peerDependencies": {
@@ -36,5 +36,5 @@
36
36
  "optional": true
37
37
  }
38
38
  },
39
- "gitHead": "e4e8c8ca14dc564bf9043a625dd704b32bdc69d0"
39
+ "gitHead": "47924f61e9409501d11ab04e9d3417cc5c86232c"
40
40
  }