@vue/language-core 3.1.7 → 3.1.8

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.
Files changed (44) hide show
  1. package/lib/codegen/globalTypes.js +1 -1
  2. package/lib/codegen/names.d.ts +0 -1
  3. package/lib/codegen/names.js +1 -2
  4. package/lib/codegen/script/component.js +1 -14
  5. package/lib/codegen/script/index.js +57 -51
  6. package/lib/codegen/script/src.d.ts +1 -0
  7. package/lib/codegen/script/src.js +17 -12
  8. package/lib/codegen/script/template.d.ts +1 -1
  9. package/lib/codegen/script/template.js +9 -24
  10. package/lib/codegen/style/classProperty.d.ts +2 -0
  11. package/lib/codegen/style/classProperty.js +18 -0
  12. package/lib/codegen/style/imports.d.ts +2 -0
  13. package/lib/codegen/style/imports.js +27 -0
  14. package/lib/codegen/style/index.d.ts +1 -4
  15. package/lib/codegen/template/context.d.ts +1 -4
  16. package/lib/codegen/template/context.js +2 -1
  17. package/lib/codegen/template/element.js +101 -155
  18. package/lib/codegen/template/elementChildren.d.ts +5 -0
  19. package/lib/codegen/template/elementChildren.js +12 -0
  20. package/lib/codegen/template/elementEvents.d.ts +1 -1
  21. package/lib/codegen/template/elementEvents.js +3 -3
  22. package/lib/codegen/template/index.d.ts +2 -5
  23. package/lib/codegen/template/templateChild.js +11 -15
  24. package/lib/codegen/template/vSlot.d.ts +1 -1
  25. package/lib/codegen/template/vSlot.js +14 -20
  26. package/lib/codegen/utils/index.js +4 -2
  27. package/lib/codegen/utils/wrapWith.d.ts +2 -0
  28. package/lib/codegen/utils/wrapWith.js +15 -0
  29. package/lib/parsers/scriptRanges.d.ts +2 -0
  30. package/lib/parsers/scriptRanges.js +2 -0
  31. package/lib/parsers/utils.js +3 -0
  32. package/lib/plugins/vue-script-js.js +1 -1
  33. package/lib/plugins/vue-tsx.d.ts +3 -4
  34. package/lib/virtualFile/computedEmbeddedCodes.d.ts +4 -0
  35. package/lib/virtualFile/computedEmbeddedCodes.js +262 -0
  36. package/lib/virtualFile/computedSfc.d.ts +6 -0
  37. package/lib/virtualFile/computedSfc.js +340 -0
  38. package/lib/virtualFile/computedVueSfc.d.ts +4 -0
  39. package/lib/virtualFile/computedVueSfc.js +41 -0
  40. package/lib/virtualFile/embeddedFile.d.ts +11 -0
  41. package/lib/virtualFile/embeddedFile.js +14 -0
  42. package/lib/virtualFile/vueFile.d.ts +24 -0
  43. package/lib/virtualFile/vueFile.js +49 -0
  44. package/package.json +2 -2
@@ -12,6 +12,7 @@ const names = require("../names");
12
12
  const utils_1 = require("../utils");
13
13
  const boundary_1 = require("../utils/boundary");
14
14
  const camelized_1 = require("../utils/camelized");
15
+ const stringLiteralKey_1 = require("../utils/stringLiteralKey");
15
16
  const elementDirectives_1 = require("./elementDirectives");
16
17
  const elementEvents_1 = require("./elementEvents");
17
18
  const elementProps_1 = require("./elementProps");
@@ -20,33 +21,14 @@ const propertyAccess_1 = require("./propertyAccess");
20
21
  const styleScopedClasses_1 = require("./styleScopedClasses");
21
22
  const templateChild_1 = require("./templateChild");
22
23
  const vSlot_1 = require("./vSlot");
23
- const colonReg = /:/g;
24
24
  function* generateComponent(options, ctx, node) {
25
- const tagOffsets = (0, shared_2.getElementTagOffsets)(node, options.template);
26
- const failGeneratedExpressions = [];
27
- const possibleOriginalNames = getPossibleOriginalComponentNames(node.tag, true);
28
- const matchConst = possibleOriginalNames.find(name => options.setupConsts.has(name));
29
- const componentOriginalVar = matchConst ?? ctx.getInternalVariable();
30
- const componentFunctionalVar = ctx.getInternalVariable();
31
- const componentVNodeVar = ctx.getInternalVariable();
32
- const componentCtxVar = ctx.getInternalVariable();
33
- const componentPropsVar = ctx.getInternalVariable();
34
- const isComponentTag = node.tag.toLowerCase() === 'component';
35
- let isCtxVarUsed = false;
36
- let isPropsVarUsed = false;
37
- ctx.currentComponent = {
38
- get ctxVar() {
39
- isCtxVarUsed = true;
40
- return componentCtxVar;
41
- },
42
- get propsVar() {
43
- isPropsVarUsed = true;
44
- return componentPropsVar;
45
- },
46
- };
47
- let props = node.props;
48
- let dynamicTagInfo;
49
- if (isComponentTag) {
25
+ let { tag, props } = node;
26
+ let [startTagOffset, endTagOffset] = (0, shared_2.getElementTagOffsets)(node, options.template);
27
+ let isExpression = false;
28
+ if (tag.includes('.')) {
29
+ isExpression = true;
30
+ }
31
+ else if (tag === 'component') {
50
32
  for (const prop of node.props) {
51
33
  if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
52
34
  && prop.name === 'bind'
@@ -55,122 +37,123 @@ function* generateComponent(options, ctx, node) {
55
37
  if (prop.arg.loc.end.offset === prop.exp.loc.end.offset) {
56
38
  ctx.inlayHints.push((0, inlayHints_1.createVBindShorthandInlayHintInfo)(prop.exp.loc, 'is'));
57
39
  }
58
- dynamicTagInfo = {
59
- tag: prop.exp.content,
60
- offsets: [prop.exp.loc.start.offset],
61
- };
40
+ isExpression = true;
41
+ tag = prop.exp.content;
42
+ startTagOffset = prop.exp.loc.start.offset;
43
+ endTagOffset = undefined;
62
44
  props = props.filter(p => p !== prop);
63
45
  break;
64
46
  }
65
47
  }
66
48
  }
67
- else if (node.tag.includes('.')) {
68
- // namespace tag
69
- dynamicTagInfo = {
70
- tag: node.tag,
71
- offsets: tagOffsets,
72
- };
73
- }
74
- if (matchConst) {
75
- // navigation support
76
- yield `/** @type {[`;
77
- for (const tagOffset of tagOffsets) {
78
- yield `typeof `;
79
- if (componentOriginalVar === node.tag) {
80
- yield [
81
- componentOriginalVar,
82
- 'template',
83
- tagOffset,
84
- codeFeatures_1.codeFeatures.withoutHighlightAndCompletion,
85
- ];
86
- }
87
- else {
88
- const shouldCapitalize = matchConst[0].toUpperCase() === matchConst[0];
89
- yield* (0, camelized_1.generateCamelized)(shouldCapitalize ? (0, shared_1.capitalize)(node.tag) : node.tag, 'template', tagOffset, codeFeatures_1.codeFeatures.withoutHighlightAndCompletion);
90
- }
91
- yield `, `;
92
- }
93
- yield `]} */${utils_1.endOfLine}`;
94
- // auto import support
95
- yield `// @ts-ignore${utils_1.newLine}`; // #2304
96
- yield* (0, camelized_1.generateCamelized)((0, shared_1.capitalize)(node.tag), 'template', tagOffsets[0], codeFeatures_1.codeFeatures.importCompletionOnly);
97
- yield utils_1.endOfLine;
98
- }
99
- else if (dynamicTagInfo) {
100
- yield `const ${componentOriginalVar} = (`;
101
- yield* (0, interpolation_1.generateInterpolation)(options, ctx, options.template, codeFeatures_1.codeFeatures.all, dynamicTagInfo.tag, dynamicTagInfo.offsets[0], `(`, `)`);
102
- if (dynamicTagInfo.offsets[1] !== undefined) {
103
- yield `,`;
104
- yield* (0, interpolation_1.generateInterpolation)(options, ctx, options.template, codeFeatures_1.codeFeatures.withoutCompletion, dynamicTagInfo.tag, dynamicTagInfo.offsets[1], `(`, `)`);
49
+ const componentVar = ctx.getInternalVariable();
50
+ if (isExpression) {
51
+ yield `const ${componentVar} = `;
52
+ yield* (0, interpolation_1.generateInterpolation)(options, ctx, options.template, codeFeatures_1.codeFeatures.all, tag, startTagOffset, `(`, `)`);
53
+ if (endTagOffset !== undefined) {
54
+ yield ` || `;
55
+ yield* (0, interpolation_1.generateInterpolation)(options, ctx, options.template, codeFeatures_1.codeFeatures.withoutCompletion, tag, endTagOffset, `(`, `)`);
105
56
  }
106
- yield `)${utils_1.endOfLine}`;
57
+ yield `${utils_1.endOfLine}`;
107
58
  }
108
59
  else {
109
- yield `const ${componentOriginalVar} = ({} as __VLS_WithComponent<'${getCanonicalComponentName(node.tag)}', __VLS_LocalComponents, `;
110
- if (options.selfComponentName && possibleOriginalNames.includes(options.selfComponentName)) {
111
- yield `typeof ${names._export}, `;
60
+ const originalNames = new Set([
61
+ (0, shared_1.capitalize)((0, shared_1.camelize)(tag)),
62
+ (0, shared_1.camelize)(tag),
63
+ tag,
64
+ ]);
65
+ const matchedSetupConst = [...originalNames].find(name => options.setupConsts.has(name));
66
+ if (matchedSetupConst) {
67
+ // navigation & auto import support
68
+ yield `const ${componentVar} = `;
69
+ yield* (0, camelized_1.generateCamelized)(matchedSetupConst[0] + tag.slice(1), 'template', startTagOffset, {
70
+ ...codeFeatures_1.codeFeatures.withoutHighlightAndCompletion,
71
+ ...codeFeatures_1.codeFeatures.importCompletionOnly,
72
+ });
73
+ if (endTagOffset !== undefined) {
74
+ yield ` || `;
75
+ yield* (0, camelized_1.generateCamelized)(matchedSetupConst[0] + tag.slice(1), 'template', endTagOffset, codeFeatures_1.codeFeatures.withoutHighlightAndCompletion);
76
+ }
77
+ yield utils_1.endOfLine;
112
78
  }
113
79
  else {
114
- yield `void, `;
115
- }
116
- yield getPossibleOriginalComponentNames(node.tag, false)
117
- .map(name => `'${name}'`)
118
- .join(`, `);
119
- yield `>).`;
120
- yield* generateCanonicalComponentName(node.tag, tagOffsets[0], {
121
- ...codeFeatures_1.codeFeatures.semanticWithoutHighlight,
122
- ...options.vueCompilerOptions.checkUnknownComponents
123
- ? codeFeatures_1.codeFeatures.verification
124
- : codeFeatures_1.codeFeatures.doNotReportTs2339AndTs2551,
125
- });
126
- yield utils_1.endOfLine;
127
- const camelizedTag = (0, shared_1.camelize)(node.tag);
128
- if (utils_1.identifierRegex.test(camelizedTag)) {
129
- // navigation support
130
- yield `/** @type {[`;
131
- for (const tagOffset of tagOffsets) {
132
- for (const shouldCapitalize of (node.tag[0] === node.tag[0].toUpperCase() ? [false] : [true, false])) {
133
- yield `typeof ${names.components}.`;
134
- yield* (0, camelized_1.generateCamelized)(shouldCapitalize ? (0, shared_1.capitalize)(node.tag) : node.tag, 'template', tagOffset, codeFeatures_1.codeFeatures.navigation);
135
- yield `, `;
80
+ yield `let ${componentVar}!: __VLS_WithComponent<'${tag}', __VLS_LocalComponents`;
81
+ yield originalNames.has(options.selfComponentName)
82
+ ? `, typeof ${names._export}`
83
+ : `, void`;
84
+ for (const name of originalNames) {
85
+ yield `, '${name}'`;
86
+ }
87
+ yield `>[`;
88
+ yield* (0, stringLiteralKey_1.generateStringLiteralKey)(tag, startTagOffset, {
89
+ ...codeFeatures_1.codeFeatures.semanticWithoutHighlight,
90
+ ...options.vueCompilerOptions.checkUnknownComponents
91
+ ? codeFeatures_1.codeFeatures.verification
92
+ : codeFeatures_1.codeFeatures.doNotReportTs2339AndTs2551,
93
+ });
94
+ yield `]${utils_1.endOfLine}`;
95
+ if (utils_1.identifierRegex.test((0, shared_1.camelize)(tag))) {
96
+ // navigation support
97
+ yield `/** @ts-ignore @type {typeof ${names.components}.`;
98
+ yield* (0, camelized_1.generateCamelized)(tag, 'template', startTagOffset, codeFeatures_1.codeFeatures.navigation);
99
+ if (tag[0] !== tag[0].toUpperCase()) {
100
+ yield ` | typeof ${names.components}.`;
101
+ yield* (0, camelized_1.generateCamelized)((0, shared_1.capitalize)(tag), 'template', startTagOffset, codeFeatures_1.codeFeatures.navigation);
136
102
  }
103
+ yield `} */${utils_1.newLine}`;
104
+ // auto import support
105
+ yield* (0, camelized_1.generateCamelized)(tag, 'template', startTagOffset, codeFeatures_1.codeFeatures.importCompletionOnly);
106
+ yield utils_1.endOfLine;
137
107
  }
138
- yield `]} */${utils_1.endOfLine}`;
139
- // auto import support
140
- yield `// @ts-ignore${utils_1.newLine}`; // #2304
141
- yield* (0, camelized_1.generateCamelized)((0, shared_1.capitalize)(node.tag), 'template', tagOffsets[0], codeFeatures_1.codeFeatures.importCompletionOnly);
142
- yield utils_1.endOfLine;
143
108
  }
144
109
  }
110
+ yield* generateComponentBody(options, ctx, node, tag, startTagOffset, props, componentVar);
111
+ }
112
+ function* generateComponentBody(options, ctx, node, tag, tagOffset, props, componentVar) {
113
+ let isCtxVarUsed = false;
114
+ let isPropsVarUsed = false;
115
+ const getCtxVar = () => (isCtxVarUsed = true, ctxVar);
116
+ const getPropsVar = () => (isPropsVarUsed = true, propsVar);
117
+ ctx.components.push(getCtxVar);
118
+ const failGeneratedExpressions = [];
145
119
  const propCodes = [...(0, elementProps_1.generateElementProps)(options, ctx, node, props, options.vueCompilerOptions.checkUnknownProps, failGeneratedExpressions)];
120
+ const functionalVar = ctx.getInternalVariable();
121
+ const vNodeVar = ctx.getInternalVariable();
122
+ const ctxVar = ctx.getInternalVariable();
123
+ const propsVar = ctx.getInternalVariable();
146
124
  yield `// @ts-ignore${utils_1.newLine}`;
147
- yield `const ${componentFunctionalVar} = __VLS_asFunctionalComponent(${componentOriginalVar}, new ${componentOriginalVar}({${utils_1.newLine}`;
125
+ yield `const ${functionalVar} = __VLS_asFunctionalComponent(${componentVar}, new ${componentVar}({${utils_1.newLine}`;
148
126
  yield* (0, muggle_string_1.toString)(propCodes);
149
127
  yield `}))${utils_1.endOfLine}`;
150
128
  yield `const `;
151
129
  const token = yield* (0, boundary_1.startBoundary)('template', node.loc.start.offset, codeFeatures_1.codeFeatures.doNotReportTs6133);
152
- yield componentVNodeVar;
130
+ yield vNodeVar;
153
131
  yield (0, boundary_1.endBoundary)(token, node.loc.end.offset);
154
- yield ` = ${componentFunctionalVar}`;
155
- yield* generateComponentGeneric(ctx);
132
+ yield ` = ${functionalVar}`;
133
+ if (ctx.currentInfo.generic) {
134
+ const { content, offset } = ctx.currentInfo.generic;
135
+ const token = yield* (0, boundary_1.startBoundary)('template', offset, codeFeatures_1.codeFeatures.verification);
136
+ yield `<`;
137
+ yield [content, 'template', offset, codeFeatures_1.codeFeatures.all];
138
+ yield `>`;
139
+ yield (0, boundary_1.endBoundary)(token, offset + content.length);
140
+ }
156
141
  yield `(`;
157
- const token2 = yield* (0, boundary_1.startBoundary)('template', tagOffsets[0], codeFeatures_1.codeFeatures.verification);
142
+ const token2 = yield* (0, boundary_1.startBoundary)('template', tagOffset, codeFeatures_1.codeFeatures.verification);
158
143
  yield `{${utils_1.newLine}`;
159
144
  yield* propCodes;
160
145
  yield `}`;
161
- yield (0, boundary_1.endBoundary)(token2, tagOffsets[0] + node.tag.length);
162
- yield `, ...__VLS_functionalComponentArgsRest(${componentFunctionalVar}))${utils_1.endOfLine}`;
146
+ yield (0, boundary_1.endBoundary)(token2, tagOffset + tag.length);
147
+ yield `, ...__VLS_functionalComponentArgsRest(${functionalVar}))${utils_1.endOfLine}`;
163
148
  yield* generateFailedExpressions(options, ctx, failGeneratedExpressions);
164
- yield* (0, elementEvents_1.generateElementEvents)(options, ctx, node, componentOriginalVar);
149
+ yield* (0, elementEvents_1.generateElementEvents)(options, ctx, node, componentVar, getCtxVar, getPropsVar);
165
150
  yield* (0, elementDirectives_1.generateElementDirectives)(options, ctx, node);
166
151
  const templateRef = getTemplateRef(node);
167
- const tag = (0, shared_2.hyphenateTag)(node.tag);
168
152
  const isRootNode = ctx.singleRootNodes.has(node)
169
- && !options.vueCompilerOptions.fallthroughComponentNames.includes(tag);
153
+ && !options.vueCompilerOptions.fallthroughComponentNames.includes((0, shared_2.hyphenateTag)(tag));
170
154
  if (templateRef || isRootNode) {
171
155
  const componentInstanceVar = ctx.getInternalVariable();
172
- isCtxVarUsed = true;
173
- yield `var ${componentInstanceVar} = {} as (Parameters<NonNullable<typeof ${componentCtxVar}['expose']>>[0] | null)`;
156
+ yield `var ${componentInstanceVar} = {} as (Parameters<NonNullable<typeof ${getCtxVar()}['expose']>>[0] | null)`;
174
157
  if (ctx.inVFor) {
175
158
  yield `[]`;
176
159
  }
@@ -184,18 +167,20 @@ function* generateComponent(options, ctx, node) {
184
167
  }
185
168
  }
186
169
  if (hasVBindAttrs(options, ctx, node)) {
187
- ctx.inheritedAttrVars.add(componentPropsVar);
188
- isPropsVarUsed = true;
170
+ ctx.inheritedAttrVars.add(getPropsVar());
189
171
  }
190
172
  yield* generateStyleScopedClassReferences(options, node);
191
173
  const slotDir = node.props.find(p => p.type === CompilerDOM.NodeTypes.DIRECTIVE && p.name === 'slot');
192
- yield* (0, vSlot_1.generateVSlot)(options, ctx, node, slotDir);
174
+ if (slotDir || node.children.length) {
175
+ yield* (0, vSlot_1.generateVSlot)(options, ctx, node, slotDir, getCtxVar());
176
+ }
193
177
  if (isCtxVarUsed) {
194
- yield `var ${componentCtxVar}!: __VLS_FunctionalComponentCtx<typeof ${componentOriginalVar}, typeof ${componentVNodeVar}>${utils_1.endOfLine}`;
178
+ yield `var ${ctxVar}!: __VLS_FunctionalComponentCtx<typeof ${componentVar}, typeof ${vNodeVar}>${utils_1.endOfLine}`;
195
179
  }
196
180
  if (isPropsVarUsed) {
197
- yield `var ${componentPropsVar}!: __VLS_FunctionalComponentProps<typeof ${componentOriginalVar}, typeof ${componentVNodeVar}>${utils_1.endOfLine}`;
181
+ yield `var ${propsVar}!: __VLS_FunctionalComponentProps<typeof ${componentVar}, typeof ${vNodeVar}>${utils_1.endOfLine}`;
198
182
  }
183
+ ctx.components.pop();
199
184
  }
200
185
  function* generateElement(options, ctx, node) {
201
186
  const [startTagOffset, endTagOffset] = (0, shared_2.getElementTagOffsets)(node, options.template);
@@ -231,12 +216,9 @@ function* generateElement(options, ctx, node) {
231
216
  ctx.inheritedAttrVars.add(`__VLS_intrinsics.${node.tag}`);
232
217
  }
233
218
  yield* generateStyleScopedClassReferences(options, node);
234
- const { currentComponent } = ctx;
235
- ctx.currentComponent = undefined;
236
219
  for (const child of node.children) {
237
220
  yield* (0, templateChild_1.generateTemplateChild)(options, ctx, child);
238
221
  }
239
- ctx.currentComponent = currentComponent;
240
222
  }
241
223
  function* generateStyleScopedClassReferences({ template, ts }, node) {
242
224
  for (const prop of node.props) {
@@ -339,42 +321,6 @@ function* generateFailedExpressions(options, ctx, failGeneratedExpressions) {
339
321
  yield utils_1.endOfLine;
340
322
  }
341
323
  }
342
- function getCanonicalComponentName(tagText) {
343
- return utils_1.identifierRegex.test(tagText)
344
- ? tagText
345
- : (0, shared_1.capitalize)((0, shared_1.camelize)(tagText.replace(colonReg, '-')));
346
- }
347
- function getPossibleOriginalComponentNames(tagText, deduplicate) {
348
- const name1 = (0, shared_1.capitalize)((0, shared_1.camelize)(tagText));
349
- const name2 = (0, shared_1.camelize)(tagText);
350
- const name3 = tagText;
351
- const names = [name1];
352
- if (!deduplicate || name2 !== name1) {
353
- names.push(name2);
354
- }
355
- if (!deduplicate || name3 !== name2) {
356
- names.push(name3);
357
- }
358
- return names;
359
- }
360
- function* generateCanonicalComponentName(tagText, offset, features) {
361
- if (utils_1.identifierRegex.test(tagText)) {
362
- yield [tagText, 'template', offset, features];
363
- }
364
- else {
365
- yield* (0, camelized_1.generateCamelized)((0, shared_1.capitalize)(tagText.replace(colonReg, '-')), 'template', offset, features);
366
- }
367
- }
368
- function* generateComponentGeneric(ctx) {
369
- if (ctx.currentInfo.generic) {
370
- const { content, offset } = ctx.currentInfo.generic;
371
- const token = yield* (0, boundary_1.startBoundary)('template', offset, codeFeatures_1.codeFeatures.verification);
372
- yield `<`;
373
- yield [content, 'template', offset, codeFeatures_1.codeFeatures.all];
374
- yield `>`;
375
- yield (0, boundary_1.endBoundary)(token, offset + content.length);
376
- }
377
- }
378
324
  function getTemplateRef(node) {
379
325
  for (const prop of node.props) {
380
326
  if (prop.type === CompilerDOM.NodeTypes.ATTRIBUTE
@@ -0,0 +1,5 @@
1
+ import type * as CompilerDOM from '@vue/compiler-dom';
2
+ import type { Code } from '../../types';
3
+ import type { TemplateCodegenContext } from './context';
4
+ import type { TemplateCodegenOptions } from './index';
5
+ export declare function generateElementChildren(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, children: (CompilerDOM.TemplateChildNode | CompilerDOM.SimpleExpressionNode)[], enterNode?: boolean): Generator<Code>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateElementChildren = generateElementChildren;
4
+ const templateChild_1 = require("./templateChild");
5
+ function* generateElementChildren(options, ctx, children, enterNode = true) {
6
+ yield* ctx.generateAutoImportCompletion();
7
+ for (const childNode of children) {
8
+ yield* (0, templateChild_1.generateTemplateChild)(options, ctx, childNode, enterNode);
9
+ }
10
+ yield* ctx.generateAutoImportCompletion();
11
+ }
12
+ //# sourceMappingURL=elementChildren.js.map
@@ -3,7 +3,7 @@ import type * as ts from 'typescript';
3
3
  import type { Code, VueCodeInformation } 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, componentOriginalVar: string): Generator<Code>;
6
+ export declare function generateElementEvents(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, componentOriginalVar: string, getCtxVar: () => string, getPropsVar: () => string): Generator<Code>;
7
7
  export declare function generateEventArg(options: TemplateCodegenOptions, name: string, start: number, directive?: string, features?: VueCodeInformation): Generator<Code>;
8
8
  export declare function generateEventExpression(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, prop: CompilerDOM.DirectiveNode): Generator<Code>;
9
9
  export declare function generateModelEventExpression(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, prop: CompilerDOM.DirectiveNode): Generator<Code>;
@@ -12,7 +12,7 @@ const utils_1 = require("../utils");
12
12
  const boundary_1 = require("../utils/boundary");
13
13
  const camelized_1 = require("../utils/camelized");
14
14
  const interpolation_1 = require("./interpolation");
15
- function* generateElementEvents(options, ctx, node, componentOriginalVar) {
15
+ function* generateElementEvents(options, ctx, node, componentOriginalVar, getCtxVar, getPropsVar) {
16
16
  let emitsVar;
17
17
  for (const prop of node.props) {
18
18
  if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
@@ -23,7 +23,7 @@ function* generateElementEvents(options, ctx, node, componentOriginalVar) {
23
23
  && (!prop.arg || prop.arg.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION && prop.arg.isStatic))) {
24
24
  if (!emitsVar) {
25
25
  emitsVar = ctx.getInternalVariable();
26
- yield `let ${emitsVar}!: __VLS_ResolveEmits<typeof ${componentOriginalVar}, typeof ${ctx.currentComponent.ctxVar}.emit>${utils_1.endOfLine}`;
26
+ yield `let ${emitsVar}!: __VLS_ResolveEmits<typeof ${componentOriginalVar}, typeof ${getCtxVar()}.emit>${utils_1.endOfLine}`;
27
27
  }
28
28
  let source = prop.arg?.loc.source ?? 'model-value';
29
29
  let start = prop.arg?.loc.start.offset;
@@ -42,7 +42,7 @@ function* generateElementEvents(options, ctx, node, componentOriginalVar) {
42
42
  const propName = (0, shared_1.camelize)(propPrefix + source);
43
43
  const emitName = emitPrefix + source;
44
44
  const camelizedEmitName = (0, shared_1.camelize)(emitName);
45
- yield `const ${ctx.getInternalVariable()}: __VLS_NormalizeComponentEvent<typeof ${ctx.currentComponent.propsVar}, typeof ${emitsVar}, '${propName}', '${emitName}', '${camelizedEmitName}'> = (${utils_1.newLine}`;
45
+ yield `const ${ctx.getInternalVariable()}: __VLS_NormalizeComponentEvent<typeof ${getPropsVar()}, typeof ${emitsVar}, '${propName}', '${emitName}', '${camelizedEmitName}'> = (${utils_1.newLine}`;
46
46
  if (prop.name === 'on') {
47
47
  yield `{ `;
48
48
  yield* generateEventArg(options, source, start, emitPrefix.slice(0, -1), codeFeatures_1.codeFeatures.navigation);
@@ -10,7 +10,7 @@ export interface TemplateCodegenOptions {
10
10
  propsAssignName?: string;
11
11
  slotsAssignName?: string;
12
12
  inheritAttrs: boolean;
13
- selfComponentName?: string;
13
+ selfComponentName: string;
14
14
  }
15
15
  export { generate as generateTemplate };
16
16
  declare function generate(options: TemplateCodegenOptions): {
@@ -49,15 +49,12 @@ declare function generate(options: TemplateCodegenOptions): {
49
49
  typeExp: string;
50
50
  offset: number;
51
51
  }[]>;
52
- currentComponent: {
53
- get ctxVar(): string;
54
- get propsVar(): string;
55
- } | undefined;
56
52
  singleRootElTypes: Set<string>;
57
53
  singleRootNodes: Set<import("@vue/compiler-dom").ElementNode | null>;
58
54
  addTemplateRef(name: string, typeExp: string, offset: number): void;
59
55
  recordComponentAccess(source: string, name: string, offset?: number): void;
60
56
  scopes: Set<string>[];
57
+ components: (() => string)[];
61
58
  declare(...varNames: string[]): void;
62
59
  startScope(): () => Generator<Code, any, any>;
63
60
  getInternalVariable(): string;
@@ -29,25 +29,21 @@ function* generateTemplateChild(options, ctx, node, enterNode = true) {
29
29
  }
30
30
  }
31
31
  else if (node.type === CompilerDOM.NodeTypes.ELEMENT) {
32
+ let slotDir;
32
33
  if (node.tagType === CompilerDOM.ElementTypes.SLOT) {
33
34
  yield* (0, slotOutlet_1.generateSlotOutlet)(options, ctx, node);
34
35
  }
36
+ else if (node.tagType === CompilerDOM.ElementTypes.TEMPLATE
37
+ && ctx.components.length
38
+ && (slotDir = node.props.find(p => p.type === CompilerDOM.NodeTypes.DIRECTIVE && p.name === 'slot'))) {
39
+ yield* (0, vSlot_1.generateVSlot)(options, ctx, node, slotDir, ctx.components[ctx.components.length - 1]());
40
+ }
41
+ else if (node.tagType === CompilerDOM.ElementTypes.ELEMENT
42
+ || node.tagType === CompilerDOM.ElementTypes.TEMPLATE) {
43
+ yield* (0, element_1.generateElement)(options, ctx, node);
44
+ }
35
45
  else {
36
- const slotDir = node.props.find(p => p.type === CompilerDOM.NodeTypes.DIRECTIVE && p.name === 'slot');
37
- if (node.tagType === CompilerDOM.ElementTypes.TEMPLATE
38
- && ctx.currentComponent
39
- && slotDir) {
40
- yield* (0, vSlot_1.generateVSlot)(options, ctx, node, slotDir);
41
- }
42
- else if (node.tagType === CompilerDOM.ElementTypes.ELEMENT
43
- || node.tagType === CompilerDOM.ElementTypes.TEMPLATE) {
44
- yield* (0, element_1.generateElement)(options, ctx, node);
45
- }
46
- else {
47
- const { currentComponent } = ctx;
48
- yield* (0, element_1.generateComponent)(options, ctx, node);
49
- ctx.currentComponent = currentComponent;
50
- }
46
+ yield* (0, element_1.generateComponent)(options, ctx, node);
51
47
  }
52
48
  }
53
49
  else if (node.type === CompilerDOM.NodeTypes.TEXT_CALL) {
@@ -2,4 +2,4 @@ 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 generateVSlot(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, slotDir: CompilerDOM.DirectiveNode | undefined): Generator<Code>;
5
+ export declare function generateVSlot(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, slotDir: CompilerDOM.DirectiveNode | undefined, ctxVar: string): Generator<Code>;
@@ -10,34 +10,28 @@ const boundary_1 = require("../utils/boundary");
10
10
  const interpolation_1 = require("./interpolation");
11
11
  const objectProperty_1 = require("./objectProperty");
12
12
  const templateChild_1 = require("./templateChild");
13
- function* generateVSlot(options, ctx, node, slotDir) {
14
- if (!ctx.currentComponent) {
15
- return;
16
- }
13
+ function* generateVSlot(options, ctx, node, slotDir, ctxVar) {
17
14
  const slotVar = ctx.getInternalVariable();
18
15
  if (slotDir) {
19
16
  yield `{${utils_1.newLine}`;
20
- }
21
- if (slotDir || node.children.length) {
22
17
  yield `const { `;
23
- if (slotDir) {
24
- if (slotDir.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION && slotDir.arg.content) {
25
- yield* (0, objectProperty_1.generateObjectProperty)(options, ctx, slotDir.arg.loc.source, slotDir.arg.loc.start.offset, slotDir.arg.isStatic ? codeFeatures_1.codeFeatures.withoutHighlight : codeFeatures_1.codeFeatures.all, false, true);
26
- }
27
- else {
28
- const token = yield* (0, boundary_1.startBoundary)('template', slotDir.loc.start.offset, codeFeatures_1.codeFeatures.withoutHighlightAndCompletion);
29
- yield `default`;
30
- yield (0, boundary_1.endBoundary)(token, slotDir.loc.start.offset + (slotDir.rawName?.length ?? 0));
31
- }
18
+ if (slotDir.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION && slotDir.arg.content) {
19
+ yield* (0, objectProperty_1.generateObjectProperty)(options, ctx, slotDir.arg.loc.source, slotDir.arg.loc.start.offset, slotDir.arg.isStatic ? codeFeatures_1.codeFeatures.withoutHighlight : codeFeatures_1.codeFeatures.all, false, true);
32
20
  }
33
21
  else {
34
- // #932: reference for implicit default slot
35
- const token = yield* (0, boundary_1.startBoundary)('template', node.loc.start.offset, codeFeatures_1.codeFeatures.navigation);
22
+ const token = yield* (0, boundary_1.startBoundary)('template', slotDir.loc.start.offset, codeFeatures_1.codeFeatures.withoutHighlightAndCompletion);
36
23
  yield `default`;
37
- yield (0, boundary_1.endBoundary)(token, node.loc.end.offset);
24
+ yield (0, boundary_1.endBoundary)(token, slotDir.loc.start.offset + (slotDir.rawName?.length ?? 0));
38
25
  }
39
- yield `: ${slotVar} } = ${ctx.currentComponent.ctxVar}.slots!${utils_1.endOfLine}`;
40
26
  }
27
+ else {
28
+ yield `const { `;
29
+ // #932: reference for implicit default slot
30
+ const token = yield* (0, boundary_1.startBoundary)('template', node.loc.start.offset, codeFeatures_1.codeFeatures.navigation);
31
+ yield `default`;
32
+ yield (0, boundary_1.endBoundary)(token, node.loc.end.offset);
33
+ }
34
+ yield `: ${slotVar} } = ${ctxVar}.slots!${utils_1.endOfLine}`;
41
35
  const endScope = ctx.startScope();
42
36
  if (slotDir?.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
43
37
  const slotAst = (0, utils_1.getTypeScriptAST)(options.ts, options.template, `(${slotDir.exp.content}) => {}`);
@@ -54,7 +48,7 @@ function* generateVSlot(options, ctx, node, slotDir) {
54
48
  isStatic = slotDir.arg.isStatic;
55
49
  }
56
50
  if (isStatic && !slotDir.arg) {
57
- yield `${ctx.currentComponent.ctxVar}.slots!['`;
51
+ yield `${ctxVar}.slots!['`;
58
52
  yield [
59
53
  '',
60
54
  'template',
@@ -39,9 +39,11 @@ function* generateSfcBlockSection(block, start, end, features) {
39
39
  yield [text, block.name, start, features];
40
40
  // #3632
41
41
  if ('parseDiagnostics' in block.ast) {
42
- const emptyEndLength = text.length - text.trimEnd().length;
42
+ const textEnd = text.trimEnd().length;
43
43
  for (const diag of block.ast.parseDiagnostics) {
44
- if (diag.start >= end - emptyEndLength) {
44
+ const diagStart = diag.start;
45
+ const diagEnd = diag.start + diag.length;
46
+ if (diagStart >= textEnd && diagEnd <= end) {
45
47
  yield `;`;
46
48
  yield ['', block.name, end, codeFeatures_1.codeFeatures.verification];
47
49
  yield exports.newLine;
@@ -0,0 +1,2 @@
1
+ import type { Code, VueCodeInformation } from '../../types';
2
+ export declare function wrapWith(source: string, startOffset: number, endOffset: number, features: VueCodeInformation, ...codes: Code[]): Generator<Code>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wrapWith = wrapWith;
4
+ function* wrapWith(source, startOffset, endOffset, features, ...codes) {
5
+ yield ['', source, startOffset, features];
6
+ let offset = 1;
7
+ for (const code of codes) {
8
+ if (typeof code !== 'string') {
9
+ offset++;
10
+ }
11
+ yield code;
12
+ }
13
+ yield ['', source, endOffset, { __combineOffset: offset }];
14
+ }
15
+ //# sourceMappingURL=wrapWith.js.map
@@ -5,8 +5,10 @@ export interface ScriptRanges extends ReturnType<typeof parseScriptRanges> {
5
5
  export declare function parseScriptRanges(ts: typeof import('typescript'), ast: ts.SourceFile, vueCompilerOptions: VueCompilerOptions): {
6
6
  exportDefault: (TextRange & {
7
7
  expression: TextRange;
8
+ isObjectLiteral: boolean;
8
9
  }) | undefined;
9
10
  componentOptions: {
11
+ isObjectLiteral: boolean;
10
12
  expression: TextRange;
11
13
  args: TextRange;
12
14
  argsNode: ts.ObjectLiteralExpression;
@@ -12,6 +12,7 @@ function parseScriptRanges(ts, ast, vueCompilerOptions) {
12
12
  exportDefault = {
13
13
  ..._getStartEnd(raw),
14
14
  expression: _getStartEnd(raw.expression),
15
+ isObjectLiteral: ts.isObjectLiteralExpression(raw.expression),
15
16
  };
16
17
  const comment = (0, utils_1.getClosestMultiLineCommentRange)(ts, raw, [], ast);
17
18
  if (comment) {
@@ -54,6 +55,7 @@ function parseScriptRanges(ts, ast, vueCompilerOptions) {
54
55
  }
55
56
  });
56
57
  componentOptions = {
58
+ isObjectLiteral: ts.isObjectLiteralExpression(node.expression),
57
59
  expression: _getStartEnd(node.expression),
58
60
  args: _getStartEnd(obj),
59
61
  argsNode: obj,
@@ -35,6 +35,9 @@ function parseBindingRanges(ts, ast, componentExtsensions) {
35
35
  if (componentExtsensions.some(ext => moduleName.endsWith(ext))) {
36
36
  components.push(_getStartEnd(name));
37
37
  }
38
+ else {
39
+ bindings.push(_getStartEnd(name));
40
+ }
38
41
  }
39
42
  if (namedBindings) {
40
43
  if (ts.isNamedImports(namedBindings)) {
@@ -6,7 +6,7 @@ const plugin = ({ modules }) => {
6
6
  compileSFCScript(lang, script) {
7
7
  if (lang === 'js' || lang === 'ts' || lang === 'jsx' || lang === 'tsx') {
8
8
  const ts = modules.typescript;
9
- return ts.createSourceFile('test.' + lang, script, 99);
9
+ return ts.createSourceFile('.' + lang, script, 99);
10
10
  }
11
11
  },
12
12
  };
@@ -3,8 +3,10 @@ export declare const tsCodegen: WeakMap<Sfc, {
3
3
  getScriptRanges: () => {
4
4
  exportDefault: (import("../types").TextRange & {
5
5
  expression: import("../types").TextRange;
6
+ isObjectLiteral: boolean;
6
7
  }) | undefined;
7
8
  componentOptions: {
9
+ isObjectLiteral: boolean;
8
10
  expression: import("../types").TextRange;
9
11
  args: import("../types").TextRange;
10
12
  argsNode: import("typescript").ObjectLiteralExpression;
@@ -160,15 +162,12 @@ export declare const tsCodegen: WeakMap<Sfc, {
160
162
  typeExp: string;
161
163
  offset: number;
162
164
  }[]>;
163
- currentComponent: {
164
- get ctxVar(): string;
165
- get propsVar(): string;
166
- } | undefined;
167
165
  singleRootElTypes: Set<string>;
168
166
  singleRootNodes: Set<import("@vue/compiler-dom").ElementNode | null>;
169
167
  addTemplateRef(name: string, typeExp: string, offset: number): void;
170
168
  recordComponentAccess(source: string, name: string, offset?: number): void;
171
169
  scopes: Set<string>[];
170
+ components: (() => string)[];
172
171
  declare(...varNames: string[]): void;
173
172
  startScope(): () => Generator<import("../types").Code, any, any>;
174
173
  getInternalVariable(): string;