@vue/language-core 1.9.0-alpha.3 → 2.0.1

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 (93) hide show
  1. package/index.d.ts +13 -0
  2. package/{out/index.js → index.js} +12 -14
  3. package/lib/generators/script.d.ts +13 -0
  4. package/lib/generators/script.js +1060 -0
  5. package/lib/generators/template.d.ts +9 -0
  6. package/lib/generators/template.js +1567 -0
  7. package/lib/generators/utils.d.ts +6 -0
  8. package/lib/generators/utils.js +58 -0
  9. package/lib/languageModule.d.ts +5 -0
  10. package/lib/languageModule.js +114 -0
  11. package/{out → lib}/parsers/scriptRanges.d.ts +2 -3
  12. package/{out → lib}/parsers/scriptRanges.js +11 -6
  13. package/{out → lib}/parsers/scriptSetupRanges.d.ts +17 -9
  14. package/{out → lib}/parsers/scriptSetupRanges.js +42 -35
  15. package/lib/plugins/file-html.d.ts +3 -0
  16. package/{out → lib}/plugins/file-html.js +1 -1
  17. package/lib/plugins/file-md.d.ts +3 -0
  18. package/{out → lib}/plugins/file-md.js +8 -8
  19. package/lib/plugins/file-vue.d.ts +3 -0
  20. package/{out → lib}/plugins/file-vue.js +9 -2
  21. package/lib/plugins/vue-sfc-customblocks.d.ts +3 -0
  22. package/lib/plugins/vue-sfc-customblocks.js +28 -0
  23. package/lib/plugins/vue-sfc-scripts.d.ts +3 -0
  24. package/lib/plugins/vue-sfc-scripts.js +36 -0
  25. package/lib/plugins/vue-sfc-styles.d.ts +3 -0
  26. package/lib/plugins/vue-sfc-styles.js +28 -0
  27. package/lib/plugins/vue-sfc-template.d.ts +3 -0
  28. package/lib/plugins/vue-sfc-template.js +29 -0
  29. package/lib/plugins/vue-template-html.d.ts +3 -0
  30. package/{out → lib}/plugins/vue-template-html.js +12 -12
  31. package/{out → lib}/plugins/vue-tsx.d.ts +25 -18
  32. package/lib/plugins/vue-tsx.js +212 -0
  33. package/{out → lib}/plugins.d.ts +19 -7
  34. package/{out → lib}/plugins.js +24 -18
  35. package/{out → lib}/types.d.ts +26 -9
  36. package/lib/types.js +5 -0
  37. package/{out → lib}/utils/parseCssClassNames.d.ts +0 -1
  38. package/{out → lib}/utils/parseCssVars.d.ts +0 -1
  39. package/{out → lib}/utils/parseSfc.d.ts +0 -1
  40. package/{out → lib}/utils/parseSfc.js +4 -18
  41. package/{out → lib}/utils/shared.d.ts +0 -1
  42. package/lib/utils/transform.d.ts +8 -0
  43. package/{out → lib}/utils/transform.js +62 -62
  44. package/{out → lib}/utils/ts.d.ts +3 -4
  45. package/{out → lib}/utils/ts.js +0 -12
  46. package/lib/utils/vue2TemplateCompiler.d.ts +2 -0
  47. package/{out → lib}/utils/vue2TemplateCompiler.js +5 -2
  48. package/{out → lib}/virtualFile/computedFiles.d.ts +2 -3
  49. package/{out → lib}/virtualFile/computedFiles.js +55 -42
  50. package/lib/virtualFile/computedMappings.d.ts +4 -0
  51. package/{out → lib}/virtualFile/computedMappings.js +9 -12
  52. package/lib/virtualFile/computedSfc.d.ts +4 -0
  53. package/{out → lib}/virtualFile/computedSfc.js +3 -3
  54. package/{out → lib}/virtualFile/computedVueSfc.d.ts +2 -3
  55. package/lib/virtualFile/embeddedFile.d.ts +12 -0
  56. package/lib/virtualFile/embeddedFile.js +15 -0
  57. package/lib/virtualFile/vueFile.d.ts +25 -0
  58. package/{out → lib}/virtualFile/vueFile.js +11 -21
  59. package/package.json +8 -11
  60. package/out/generators/script.d.ts +0 -15
  61. package/out/generators/script.js +0 -887
  62. package/out/generators/template.d.ts +0 -21
  63. package/out/generators/template.js +0 -1506
  64. package/out/index.d.ts +0 -16
  65. package/out/languageModule.d.ts +0 -10
  66. package/out/languageModule.js +0 -99
  67. package/out/plugins/file-html.d.ts +0 -4
  68. package/out/plugins/file-md.d.ts +0 -4
  69. package/out/plugins/file-vue.d.ts +0 -4
  70. package/out/plugins/vue-sfc-customblocks.d.ts +0 -4
  71. package/out/plugins/vue-sfc-customblocks.js +0 -33
  72. package/out/plugins/vue-sfc-scripts.d.ts +0 -4
  73. package/out/plugins/vue-sfc-scripts.js +0 -42
  74. package/out/plugins/vue-sfc-styles.d.ts +0 -4
  75. package/out/plugins/vue-sfc-styles.js +0 -33
  76. package/out/plugins/vue-sfc-template.d.ts +0 -4
  77. package/out/plugins/vue-sfc-template.js +0 -29
  78. package/out/plugins/vue-template-html.d.ts +0 -4
  79. package/out/plugins/vue-tsx.js +0 -159
  80. package/out/types.js +0 -3
  81. package/out/utils/globalTypes.d.ts +0 -4
  82. package/out/utils/globalTypes.js +0 -135
  83. package/out/utils/transform.d.ts +0 -9
  84. package/out/utils/vue2TemplateCompiler.d.ts +0 -3
  85. package/out/virtualFile/computedMappings.d.ts +0 -6
  86. package/out/virtualFile/computedSfc.d.ts +0 -5
  87. package/out/virtualFile/embeddedFile.d.ts +0 -13
  88. package/out/virtualFile/embeddedFile.js +0 -16
  89. package/out/virtualFile/vueFile.d.ts +0 -28
  90. /package/{out → lib}/utils/parseCssClassNames.js +0 -0
  91. /package/{out → lib}/utils/parseCssVars.js +0 -0
  92. /package/{out → lib}/utils/shared.js +0 -0
  93. /package/{out → lib}/virtualFile/computedVueSfc.js +0 -0
@@ -0,0 +1,1060 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generate = void 0;
4
+ const path = require("path-browserify");
5
+ const shared_1 = require("../utils/shared");
6
+ const transform_1 = require("../utils/transform");
7
+ const utils_1 = require("./utils");
8
+ function* generate(ts, fileName, script, scriptSetup, styles, // TODO: computed it
9
+ lang, scriptRanges, scriptSetupRanges, templateCodegen, compilerOptions, vueCompilerOptions, globalTypesHolder, getGeneratedLength, linkedCodeMappings = [], codegenStack) {
10
+ //#region monkey fix: https://github.com/vuejs/language-tools/pull/2113
11
+ if (!script && !scriptSetup) {
12
+ scriptSetup = {
13
+ content: '',
14
+ lang: 'ts',
15
+ name: '',
16
+ start: 0,
17
+ end: 0,
18
+ startTagEnd: 0,
19
+ endTagStart: 0,
20
+ generic: undefined,
21
+ genericOffset: 0,
22
+ attrs: {},
23
+ ast: ts.createSourceFile('', '', 99, false, ts.ScriptKind.TS),
24
+ };
25
+ scriptSetupRanges = {
26
+ bindings: [],
27
+ props: {},
28
+ emits: {},
29
+ expose: {},
30
+ slots: {},
31
+ defineProp: [],
32
+ importSectionEndOffset: 0,
33
+ leadingCommentEndOffset: 0,
34
+ };
35
+ }
36
+ //#endregion
37
+ const bindingNames = new Set([
38
+ ...scriptRanges?.bindings.map(range => script.content.substring(range.start, range.end)) ?? [],
39
+ ...scriptSetupRanges?.bindings.map(range => scriptSetup.content.substring(range.start, range.end)) ?? [],
40
+ ]);
41
+ const bypassDefineComponent = lang === 'js' || lang === 'jsx';
42
+ const _ = codegenStack ? utils_1.withStack : (code) => [code, ''];
43
+ const helperTypes = {
44
+ OmitKeepDiscriminatedUnion: {
45
+ get name() {
46
+ this.usage = true;
47
+ return `__VLS_OmitKeepDiscriminatedUnion`;
48
+ },
49
+ get code() {
50
+ return `type __VLS_OmitKeepDiscriminatedUnion<T, K extends keyof any> = T extends any
51
+ ? Pick<T, Exclude<keyof T, K>>
52
+ : never;`;
53
+ },
54
+ },
55
+ WithDefaults: {
56
+ get name() {
57
+ this.usage = true;
58
+ return `__VLS_WithDefaults`;
59
+ },
60
+ get code() {
61
+ return `type __VLS_WithDefaults<P, D> = {
62
+ [K in keyof Pick<P, keyof P>]: K extends keyof D
63
+ ? ${helperTypes.Prettify.name}<P[K] & { default: D[K]}>
64
+ : P[K]
65
+ };`;
66
+ },
67
+ },
68
+ Prettify: {
69
+ get name() {
70
+ this.usage = true;
71
+ return `__VLS_Prettify`;
72
+ },
73
+ get code() {
74
+ return `type __VLS_Prettify<T> = { [K in keyof T]: T[K]; } & {};`;
75
+ },
76
+ },
77
+ WithTemplateSlots: {
78
+ get name() {
79
+ this.usage = true;
80
+ return `__VLS_WithTemplateSlots`;
81
+ },
82
+ get code() {
83
+ return `type __VLS_WithTemplateSlots<T, S> = T & {
84
+ new(): {
85
+ ${(0, shared_1.getSlotsPropertyName)(vueCompilerOptions.target)}: S;
86
+ ${vueCompilerOptions.jsxSlots ? `$props: ${helperTypes.PropsChildren.name}<S>;` : ''}
87
+ }
88
+ };`;
89
+ },
90
+ },
91
+ PropsChildren: {
92
+ get name() {
93
+ this.usage = true;
94
+ return `__VLS_PropsChildren`;
95
+ },
96
+ get code() {
97
+ return `type __VLS_PropsChildren<S> = {
98
+ [K in keyof (
99
+ boolean extends (
100
+ // @ts-ignore
101
+ JSX.ElementChildrenAttribute extends never
102
+ ? true
103
+ : false
104
+ )
105
+ ? never
106
+ // @ts-ignore
107
+ : JSX.ElementChildrenAttribute
108
+ )]?: S;
109
+ };`;
110
+ },
111
+ },
112
+ TypePropsToOption: {
113
+ get name() {
114
+ this.usage = true;
115
+ return `__VLS_TypePropsToOption`;
116
+ },
117
+ get code() {
118
+ return compilerOptions.exactOptionalPropertyTypes ?
119
+ `type __VLS_TypePropsToOption<T> = {
120
+ [K in keyof T]-?: {} extends Pick<T, K>
121
+ ? { type: import('${vueCompilerOptions.lib}').PropType<T[K]> }
122
+ : { type: import('${vueCompilerOptions.lib}').PropType<T[K]>, required: true }
123
+ };` :
124
+ `type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
125
+ type __VLS_TypePropsToOption<T> = {
126
+ [K in keyof T]-?: {} extends Pick<T, K>
127
+ ? { type: import('${vueCompilerOptions.lib}').PropType<__VLS_NonUndefinedable<T[K]>> }
128
+ : { type: import('${vueCompilerOptions.lib}').PropType<T[K]>, required: true }
129
+ };`;
130
+ },
131
+ },
132
+ };
133
+ let generatedTemplate = false;
134
+ let scriptSetupGeneratedOffset;
135
+ yield _(`/* __placeholder__ */\n`);
136
+ yield* generateSrc();
137
+ yield* generateScriptSetupImports();
138
+ yield* generateScriptContentBeforeExportDefault();
139
+ yield* generateScriptSetupAndTemplate();
140
+ yield* generateScriptContentAfterExportDefault();
141
+ if (globalTypesHolder === fileName) {
142
+ yield* generateGlobalHelperTypes();
143
+ }
144
+ yield* generateLocalHelperTypes();
145
+ yield _(`\ntype __VLS_IntrinsicElementsCompletion = __VLS_IntrinsicElements;\n`);
146
+ if (!generatedTemplate) {
147
+ yield* generateTemplate(false);
148
+ }
149
+ if (scriptSetup) {
150
+ yield _(['', 'scriptSetup', scriptSetup.content.length, (0, utils_1.disableAllFeatures)({ verification: true })]);
151
+ }
152
+ function* generateGlobalHelperTypes() {
153
+ const fnPropsType = `(K extends { $props: infer Props } ? Props : any)${vueCompilerOptions.strictTemplates ? '' : ' & Record<string, unknown>'}`;
154
+ yield _(`
155
+ ; declare global {
156
+ // @ts-ignore
157
+ type __VLS_IntrinsicElements = __VLS_PickNotAny<import('vue/jsx-runtime').JSX.IntrinsicElements, __VLS_PickNotAny<JSX.IntrinsicElements, Record<string, any>>>;
158
+ // @ts-ignore
159
+ type __VLS_Element = __VLS_PickNotAny<import('vue/jsx-runtime').JSX.Element, JSX.Element>;
160
+ // @ts-ignore
161
+ type __VLS_GlobalComponents = ${[
162
+ `__VLS_PickNotAny<import('vue').GlobalComponents, {}>`,
163
+ `__VLS_PickNotAny<import('@vue/runtime-core').GlobalComponents, {}>`,
164
+ `__VLS_PickNotAny<import('@vue/runtime-dom').GlobalComponents, {}>`,
165
+ `Pick<typeof import('${vueCompilerOptions.lib}'), 'Transition' | 'TransitionGroup' | 'KeepAlive' | 'Suspense' | 'Teleport'>`
166
+ ].join(' & ')};
167
+ type __VLS_IsAny<T> = 0 extends 1 & T ? true : false;
168
+ type __VLS_PickNotAny<A, B> = __VLS_IsAny<A> extends true ? B : A;
169
+
170
+ const __VLS_intrinsicElements: __VLS_IntrinsicElements;
171
+
172
+ // v-for
173
+ function __VLS_getVForSourceType(source: number): [number, number, number][];
174
+ function __VLS_getVForSourceType(source: string): [string, number, number][];
175
+ function __VLS_getVForSourceType<T extends any[]>(source: T): [
176
+ T[number], // item
177
+ number, // key
178
+ number, // index
179
+ ][];
180
+ function __VLS_getVForSourceType<T extends { [Symbol.iterator](): Iterator<any> }>(source: T): [
181
+ T extends { [Symbol.iterator](): Iterator<infer T1> } ? T1 : never, // item
182
+ number, // key
183
+ undefined, // index
184
+ ][];
185
+ function __VLS_getVForSourceType<T>(source: T): [
186
+ T[keyof T], // item
187
+ keyof T, // key
188
+ number, // index
189
+ ][];
190
+
191
+ // @ts-ignore
192
+ function __VLS_getSlotParams<T>(slot: T): Parameters<__VLS_PickNotAny<NonNullable<T>, (...args: any[]) => any>>;
193
+ // @ts-ignore
194
+ function __VLS_getSlotParam<T>(slot: T): Parameters<__VLS_PickNotAny<NonNullable<T>, (...args: any[]) => any>>[0];
195
+ function __VLS_directiveFunction<T>(dir: T):
196
+ T extends import('${vueCompilerOptions.lib}').ObjectDirective<infer E, infer V> | import('${vueCompilerOptions.lib}').FunctionDirective<infer E, infer V> ? (value: V) => void
197
+ : T;
198
+ function __VLS_withScope<T, K>(ctx: T, scope: K): ctx is T & K;
199
+ function __VLS_makeOptional<T>(t: T): { [K in keyof T]?: T[K] };
200
+
201
+ type __VLS_SelfComponent<N, C> = string extends N ? {} : N extends string ? { [P in N]: C } : {};
202
+ type __VLS_WithComponent<N0 extends string, LocalComponents, N1 extends string, N2 extends string, N3 extends string> =
203
+ N1 extends keyof LocalComponents ? N1 extends N0 ? Pick<LocalComponents, N0 extends keyof LocalComponents ? N0 : never> : { [K in N0]: LocalComponents[N1] } :
204
+ N2 extends keyof LocalComponents ? N2 extends N0 ? Pick<LocalComponents, N0 extends keyof LocalComponents ? N0 : never> : { [K in N0]: LocalComponents[N2] } :
205
+ N3 extends keyof LocalComponents ? N3 extends N0 ? Pick<LocalComponents, N0 extends keyof LocalComponents ? N0 : never> : { [K in N0]: LocalComponents[N3] } :
206
+ N1 extends keyof __VLS_GlobalComponents ? N1 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N1] } :
207
+ N2 extends keyof __VLS_GlobalComponents ? N2 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N2] } :
208
+ N3 extends keyof __VLS_GlobalComponents ? N3 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N3] } :
209
+ ${vueCompilerOptions.strictTemplates ? '{}' : '{ [K in N0]: unknown }'}
210
+
211
+ type __VLS_FillingEventArg_ParametersLength<E extends (...args: any) => any> = __VLS_IsAny<Parameters<E>> extends true ? -1 : Parameters<E>['length'];
212
+ type __VLS_FillingEventArg<E> = E extends (...args: any) => any ? __VLS_FillingEventArg_ParametersLength<E> extends 0 ? ($event?: undefined) => ReturnType<E> : E : E;
213
+ function __VLS_asFunctionalComponent<T, K = T extends new (...args: any) => any ? InstanceType<T> : unknown>(t: T, instance?: K):
214
+ T extends new (...args: any) => any
215
+ ? (props: ${fnPropsType}, ctx?: any) => __VLS_Element & { __ctx?: {
216
+ attrs?: any,
217
+ slots?: K extends { ${(0, shared_1.getSlotsPropertyName)(vueCompilerOptions.target)}: infer Slots } ? Slots : any,
218
+ emit?: K extends { $emit: infer Emit } ? Emit : any
219
+ } & { props?: ${fnPropsType}; expose?(exposed: K): void; } }
220
+ : T extends () => any ? (props: {}, ctx?: any) => ReturnType<T>
221
+ : T extends (...args: any) => any ? T
222
+ : (_: {}${vueCompilerOptions.strictTemplates ? '' : ' & Record<string, unknown>'}, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: {}${vueCompilerOptions.strictTemplates ? '' : ' & Record<string, unknown>'} } };
223
+ function __VLS_elementAsFunctionalComponent<T>(t: T): (_: T${vueCompilerOptions.strictTemplates ? '' : ' & Record<string, unknown>'}, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: T${vueCompilerOptions.strictTemplates ? '' : ' & Record<string, unknown>'} } };
224
+ function __VLS_functionalComponentArgsRest<T extends (...args: any) => any>(t: T): Parameters<T>['length'] extends 2 ? [any] : [];
225
+ function __VLS_pickEvent<E1, E2>(emitEvent: E1, propEvent: E2): __VLS_FillingEventArg<
226
+ __VLS_PickNotAny<
227
+ __VLS_AsFunctionOrAny<E2>,
228
+ __VLS_AsFunctionOrAny<E1>
229
+ >
230
+ > | undefined;
231
+ function __VLS_pickFunctionalComponentCtx<T, K>(comp: T, compInstance: K): __VLS_PickNotAny<
232
+ '__ctx' extends keyof __VLS_PickNotAny<K, {}> ? K extends { __ctx?: infer Ctx } ? Ctx : never : any
233
+ , T extends (props: any, ctx: infer Ctx) => any ? Ctx : any
234
+ >;
235
+ type __VLS_FunctionalComponentProps<T, K> =
236
+ '__ctx' extends keyof __VLS_PickNotAny<K, {}> ? K extends { __ctx?: { props?: infer P } } ? NonNullable<P> : never
237
+ : T extends (props: infer P, ...args: any) => any ? P :
238
+ {};
239
+ type __VLS_AsFunctionOrAny<F> = unknown extends F ? any : ((...args: any) => any) extends F ? F : any;
240
+
241
+ function __VLS_normalizeSlot<S>(s: S): S extends () => infer R ? (props: {}) => R : S;
242
+
243
+ /**
244
+ * emit
245
+ */
246
+ // fix https://github.com/vuejs/language-tools/issues/926
247
+ type __VLS_UnionToIntersection<U> = (U extends unknown ? (arg: U) => unknown : never) extends ((arg: infer P) => unknown) ? P : never;
248
+ type __VLS_OverloadUnionInner<T, U = unknown> = U & T extends (...args: infer A) => infer R
249
+ ? U extends T
250
+ ? never
251
+ : __VLS_OverloadUnionInner<T, Pick<T, keyof T> & U & ((...args: A) => R)> | ((...args: A) => R)
252
+ : never;
253
+ type __VLS_OverloadUnion<T> = Exclude<
254
+ __VLS_OverloadUnionInner<(() => never) & T>,
255
+ T extends () => never ? never : () => never
256
+ >;
257
+ type __VLS_ConstructorOverloads<T> = __VLS_OverloadUnion<T> extends infer F
258
+ ? F extends (event: infer E, ...args: infer A) => any
259
+ ? { [K in E & string]: (...args: A) => void; }
260
+ : never
261
+ : never;
262
+ type __VLS_NormalizeEmits<T> = __VLS_PrettifyGlobal<
263
+ __VLS_UnionToIntersection<
264
+ __VLS_ConstructorOverloads<T> & {
265
+ [K in keyof T]: T[K] extends any[] ? { (...args: T[K]): void } : never
266
+ }
267
+ >
268
+ >;
269
+ type __VLS_PrettifyGlobal<T> = { [K in keyof T]: T[K]; } & {};
270
+ }
271
+ `);
272
+ }
273
+ function* generateLocalHelperTypes() {
274
+ let shouldCheck = true;
275
+ while (shouldCheck) {
276
+ shouldCheck = false;
277
+ for (const helperType of Object.values(helperTypes)) {
278
+ if (helperType.usage && !helperType.generated) {
279
+ shouldCheck = true;
280
+ helperType.generated = true;
281
+ yield _('\n' + helperType.code + '\n');
282
+ }
283
+ }
284
+ }
285
+ }
286
+ function* generateSrc() {
287
+ if (!script?.src)
288
+ return;
289
+ let src = script.src;
290
+ if (src.endsWith('.d.ts'))
291
+ src = src.substring(0, src.length - '.d.ts'.length);
292
+ else if (src.endsWith('.ts'))
293
+ src = src.substring(0, src.length - '.ts'.length);
294
+ else if (src.endsWith('.tsx'))
295
+ src = src.substring(0, src.length - '.tsx'.length) + '.jsx';
296
+ if (!src.endsWith('.js') && !src.endsWith('.jsx'))
297
+ src = src + '.js';
298
+ yield _(`export * from `);
299
+ yield _([
300
+ `'${src}'`,
301
+ 'script',
302
+ script.srcOffset - 1,
303
+ (0, utils_1.enableAllFeatures)({
304
+ navigation: src === script.src ? true : {
305
+ shouldRename: () => false,
306
+ resolveRenameEditText(newName) {
307
+ if (newName.endsWith('.jsx') || newName.endsWith('.js')) {
308
+ newName = newName.split('.').slice(0, -1).join('.');
309
+ }
310
+ if (script?.src?.endsWith('.d.ts')) {
311
+ newName = newName + '.d.ts';
312
+ }
313
+ else if (script?.src?.endsWith('.ts')) {
314
+ newName = newName + '.ts';
315
+ }
316
+ else if (script?.src?.endsWith('.tsx')) {
317
+ newName = newName + '.tsx';
318
+ }
319
+ return newName;
320
+ },
321
+ },
322
+ }),
323
+ ]);
324
+ yield _(`;\n`);
325
+ yield _(`export { default } from '${src}';\n`);
326
+ }
327
+ function* generateScriptContentBeforeExportDefault() {
328
+ if (!script)
329
+ return;
330
+ if (!!scriptSetup && scriptRanges?.exportDefault)
331
+ return yield _(generateSourceCode(script, 0, scriptRanges.exportDefault.expression.start));
332
+ let isExportRawObject = false;
333
+ if (scriptRanges?.exportDefault)
334
+ isExportRawObject = script.content.substring(scriptRanges.exportDefault.expression.start, scriptRanges.exportDefault.expression.end).startsWith('{');
335
+ if (!isExportRawObject || !vueCompilerOptions.optionsWrapper.length || !scriptRanges?.exportDefault)
336
+ return yield _(generateSourceCode(script, 0, script.content.length));
337
+ yield _(generateSourceCode(script, 0, scriptRanges.exportDefault.expression.start));
338
+ yield _(vueCompilerOptions.optionsWrapper[0]);
339
+ yield _(['', 'script', scriptRanges.exportDefault.expression.start, (0, utils_1.disableAllFeatures)({
340
+ __hint: {
341
+ setting: 'vue.inlayHints.optionsWrapper',
342
+ label: vueCompilerOptions.optionsWrapper[0],
343
+ tooltip: [
344
+ 'This is virtual code that is automatically wrapped for type support, it does not affect your runtime behavior, you can customize it via `vueCompilerOptions.optionsWrapper` option in tsconfig / jsconfig.',
345
+ 'To hide it, you can set `"vue.inlayHints.optionsWrapper": false` in IDE settings.',
346
+ ].join('\n\n'),
347
+ }
348
+ })]);
349
+ yield _(generateSourceCode(script, scriptRanges.exportDefault.expression.start, scriptRanges.exportDefault.expression.end));
350
+ yield _(['', 'script', scriptRanges.exportDefault.expression.end, (0, utils_1.disableAllFeatures)({
351
+ __hint: {
352
+ setting: 'vue.inlayHints.optionsWrapper',
353
+ label: vueCompilerOptions.optionsWrapper[1],
354
+ tooltip: '',
355
+ }
356
+ })]);
357
+ yield _(vueCompilerOptions.optionsWrapper[1]);
358
+ yield _(generateSourceCode(script, scriptRanges.exportDefault.expression.end, script.content.length));
359
+ }
360
+ function* generateScriptContentAfterExportDefault() {
361
+ if (!script)
362
+ return;
363
+ if (!!scriptSetup && scriptRanges?.exportDefault)
364
+ yield _(generateSourceCode(script, scriptRanges.exportDefault.expression.end, script.content.length));
365
+ }
366
+ function* generateScriptSetupImports() {
367
+ if (!scriptSetup || !scriptSetupRanges)
368
+ return;
369
+ yield _([
370
+ scriptSetup.content.substring(0, Math.max(scriptSetupRanges.importSectionEndOffset, scriptSetupRanges.leadingCommentEndOffset)) + '\n',
371
+ 'scriptSetup',
372
+ 0,
373
+ (0, utils_1.enableAllFeatures)({}),
374
+ ]);
375
+ }
376
+ function* generateModelEmits() {
377
+ if (!scriptSetup || !scriptSetupRanges) {
378
+ return;
379
+ }
380
+ yield _(`let __VLS_modelEmitsType!: {}`);
381
+ if (scriptSetupRanges.defineProp.length) {
382
+ yield _(` & ReturnType<typeof import('${vueCompilerOptions.lib}').defineEmits<{\n`);
383
+ for (const defineProp of scriptSetupRanges.defineProp) {
384
+ if (!defineProp.isModel)
385
+ continue;
386
+ let propName = 'modelValue';
387
+ if (defineProp.name) {
388
+ propName = scriptSetup.content.substring(defineProp.name.start, defineProp.name.end);
389
+ propName = propName.replace(/['"]+/g, '');
390
+ }
391
+ yield _(`'update:${propName}': [${propName}:`);
392
+ if (defineProp.type) {
393
+ yield _(scriptSetup.content.substring(defineProp.type.start, defineProp.type.end));
394
+ }
395
+ else {
396
+ yield _(`any`);
397
+ }
398
+ yield _(`];\n`);
399
+ }
400
+ yield _(`}>>`);
401
+ }
402
+ yield _(`;\n`);
403
+ }
404
+ function* generateScriptSetupAndTemplate() {
405
+ if (!scriptSetup || !scriptSetupRanges)
406
+ return;
407
+ const definePropMirrors = new Map();
408
+ if (scriptSetup.generic) {
409
+ if (!scriptRanges?.exportDefault) {
410
+ yield _(`export default `);
411
+ }
412
+ yield _(`(<`);
413
+ yield _([
414
+ scriptSetup.generic,
415
+ scriptSetup.name,
416
+ scriptSetup.genericOffset,
417
+ (0, utils_1.enableAllFeatures)({}),
418
+ ]);
419
+ if (!scriptSetup.generic.endsWith(`,`)) {
420
+ yield _(`,`);
421
+ }
422
+ yield _(`>`);
423
+ yield _(`(\n`
424
+ + ` __VLS_props: Awaited<typeof __VLS_setup>['props'],\n`
425
+ + ` __VLS_ctx?: ${helperTypes.Prettify.name}<Pick<Awaited<typeof __VLS_setup>, 'attrs' | 'emit' | 'slots'>>,\n` // use __VLS_Prettify for less dts code
426
+ + ` __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>['expose'],\n`
427
+ + ` __VLS_setup = (async () => {\n`);
428
+ yield* generateSetupFunction(true, 'none', definePropMirrors);
429
+ //#region props
430
+ yield _(`const __VLS_fnComponent = `
431
+ + `(await import('${vueCompilerOptions.lib}')).defineComponent({\n`);
432
+ if (scriptSetupRanges.props.define?.arg) {
433
+ yield _(` props: `);
434
+ yield _(generateSourceCodeForExtraReference(scriptSetup, scriptSetupRanges.props.define.arg.start, scriptSetupRanges.props.define.arg.end));
435
+ yield _(`,\n`);
436
+ }
437
+ if (scriptSetupRanges.emits.define) {
438
+ yield _(` emits: ({} as __VLS_NormalizeEmits<typeof `);
439
+ yield _(scriptSetupRanges.emits.name ?? '__VLS_emit');
440
+ yield _(`>),\n`);
441
+ }
442
+ yield _(`});\n`);
443
+ if (scriptSetupRanges.defineProp.length) {
444
+ yield _(`const __VLS_defaults = {\n`);
445
+ for (const defineProp of scriptSetupRanges.defineProp) {
446
+ if (defineProp.defaultValue) {
447
+ if (defineProp.name) {
448
+ yield _(scriptSetup.content.substring(defineProp.name.start, defineProp.name.end));
449
+ }
450
+ else {
451
+ yield _('modelValue');
452
+ }
453
+ yield _(`: `);
454
+ yield _(scriptSetup.content.substring(defineProp.defaultValue.start, defineProp.defaultValue.end));
455
+ yield _(`,\n`);
456
+ }
457
+ }
458
+ yield _(`};\n`);
459
+ }
460
+ yield _(`let __VLS_fnPropsTypeOnly!: {}`); // TODO: reuse __VLS_fnPropsTypeOnly even without generic, and remove __VLS_propsOption_defineProp
461
+ if (scriptSetupRanges.props.define?.typeArg) {
462
+ yield _(` & `);
463
+ yield _(generateSourceCode(scriptSetup, scriptSetupRanges.props.define.typeArg.start, scriptSetupRanges.props.define.typeArg.end));
464
+ }
465
+ if (scriptSetupRanges.defineProp.length) {
466
+ yield _(` & {\n`);
467
+ for (const defineProp of scriptSetupRanges.defineProp) {
468
+ let propName = 'modelValue';
469
+ if (defineProp.name) {
470
+ propName = scriptSetup.content.substring(defineProp.name.start, defineProp.name.end);
471
+ definePropMirrors.set(propName, getGeneratedLength());
472
+ }
473
+ yield _(`${propName}${defineProp.required ? '' : '?'}: `);
474
+ if (defineProp.type) {
475
+ yield _(scriptSetup.content.substring(defineProp.type.start, defineProp.type.end));
476
+ }
477
+ else if (defineProp.defaultValue) {
478
+ yield _(`typeof __VLS_defaults['`);
479
+ yield _(propName);
480
+ yield _(`']`);
481
+ }
482
+ else {
483
+ yield _(`any`);
484
+ }
485
+ yield _(',\n');
486
+ }
487
+ yield _(`}`);
488
+ }
489
+ yield _(`;\n`);
490
+ yield* generateModelEmits();
491
+ yield _(`let __VLS_fnPropsDefineComponent!: InstanceType<typeof __VLS_fnComponent>['$props'];\n`);
492
+ yield _(`let __VLS_fnPropsSlots!: `);
493
+ if (scriptSetupRanges.slots.define && vueCompilerOptions.jsxSlots) {
494
+ yield _(`${helperTypes.PropsChildren.name}<typeof __VLS_slots>`);
495
+ }
496
+ else {
497
+ yield _(`{}`);
498
+ }
499
+ yield _(`;\n`);
500
+ yield _(`let __VLS_defaultProps!:\n`
501
+ + ` import('${vueCompilerOptions.lib}').VNodeProps\n`
502
+ + ` & import('${vueCompilerOptions.lib}').AllowedComponentProps\n`
503
+ + ` & import('${vueCompilerOptions.lib}').ComponentCustomProps;\n`);
504
+ //#endregion
505
+ yield _(` return {} as {\n`
506
+ + ` props: ${helperTypes.Prettify.name}<${helperTypes.OmitKeepDiscriminatedUnion.name}<typeof __VLS_fnPropsDefineComponent & typeof __VLS_fnPropsTypeOnly, keyof typeof __VLS_defaultProps>> & typeof __VLS_fnPropsSlots & typeof __VLS_defaultProps,\n`
507
+ + ` expose(exposed: import('${vueCompilerOptions.lib}').ShallowUnwrapRef<${scriptSetupRanges.expose.define ? 'typeof __VLS_exposed' : '{}'}>): void,\n`
508
+ + ` attrs: any,\n`
509
+ + ` slots: ReturnType<typeof __VLS_template>,\n`
510
+ + ` emit: typeof ${scriptSetupRanges.emits.name ?? '__VLS_emit'} & typeof __VLS_modelEmitsType,\n`
511
+ + ` };\n`);
512
+ yield _(` })(),\n`); // __VLS_setup = (async () => {
513
+ yield _(`) => ({} as import('${vueCompilerOptions.lib}').VNode & { __ctx?: Awaited<typeof __VLS_setup> }))`);
514
+ }
515
+ else if (!script) {
516
+ // no script block, generate script setup code at root
517
+ yield* generateSetupFunction(false, 'export', definePropMirrors);
518
+ }
519
+ else {
520
+ if (!scriptRanges?.exportDefault) {
521
+ yield _(`export default `);
522
+ }
523
+ yield _(`await (async () => {\n`);
524
+ yield* generateSetupFunction(false, 'return', definePropMirrors);
525
+ yield _(`})()`);
526
+ }
527
+ if (scriptSetupGeneratedOffset !== undefined) {
528
+ for (const defineProp of scriptSetupRanges.defineProp) {
529
+ if (!defineProp.name) {
530
+ continue;
531
+ }
532
+ const propName = scriptSetup.content.substring(defineProp.name.start, defineProp.name.end);
533
+ const propMirror = definePropMirrors.get(propName);
534
+ if (propMirror !== undefined) {
535
+ linkedCodeMappings.push({
536
+ sourceOffsets: [defineProp.name.start + scriptSetupGeneratedOffset],
537
+ generatedOffsets: [propMirror],
538
+ lengths: [defineProp.name.end - defineProp.name.start],
539
+ data: undefined,
540
+ });
541
+ }
542
+ }
543
+ }
544
+ }
545
+ function* generateSetupFunction(functional, mode, definePropMirrors) {
546
+ if (!scriptSetupRanges || !scriptSetup)
547
+ return;
548
+ const definePropProposalA = scriptSetup.content.trimStart().startsWith('// @experimentalDefinePropProposal=kevinEdition') || vueCompilerOptions.experimentalDefinePropProposal === 'kevinEdition';
549
+ const definePropProposalB = scriptSetup.content.trimStart().startsWith('// @experimentalDefinePropProposal=johnsonEdition') || vueCompilerOptions.experimentalDefinePropProposal === 'johnsonEdition';
550
+ if (vueCompilerOptions.target >= 3.3) {
551
+ yield _(`const { `);
552
+ for (const macro of Object.keys(vueCompilerOptions.macros)) {
553
+ if (!bindingNames.has(macro)) {
554
+ yield _(macro + `, `);
555
+ }
556
+ }
557
+ yield _(`} = await import('${vueCompilerOptions.lib}');\n`);
558
+ }
559
+ if (definePropProposalA) {
560
+ yield _(`declare function defineProp<T>(name: string, options: { required: true } & Record<string, unknown>): import('${vueCompilerOptions.lib}').ComputedRef<T>;\n`);
561
+ yield _(`declare function defineProp<T>(name: string, options: { default: any } & Record<string, unknown>): import('${vueCompilerOptions.lib}').ComputedRef<T>;\n`);
562
+ yield _(`declare function defineProp<T>(name?: string, options?: any): import('${vueCompilerOptions.lib}').ComputedRef<T | undefined>;\n`);
563
+ }
564
+ if (definePropProposalB) {
565
+ yield _(`declare function defineProp<T>(value: T | (() => T), required?: boolean, rest?: any): import('${vueCompilerOptions.lib}').ComputedRef<T>;\n`);
566
+ yield _(`declare function defineProp<T>(value: T | (() => T) | undefined, required: true, rest?: any): import('${vueCompilerOptions.lib}').ComputedRef<T>;\n`);
567
+ yield _(`declare function defineProp<T>(value?: T | (() => T), required?: boolean, rest?: any): import('${vueCompilerOptions.lib}').ComputedRef<T | undefined>;\n`);
568
+ }
569
+ scriptSetupGeneratedOffset = getGeneratedLength() - scriptSetupRanges.importSectionEndOffset;
570
+ let setupCodeModifies = [];
571
+ if (scriptSetupRanges.props.define && !scriptSetupRanges.props.name) {
572
+ const range = scriptSetupRanges.props.withDefaults ?? scriptSetupRanges.props.define;
573
+ const statement = scriptSetupRanges.props.define.statement;
574
+ if (statement.start === range.start && statement.end === range.end) {
575
+ setupCodeModifies.push([[`const __VLS_props = `], range.start, range.start]);
576
+ }
577
+ else {
578
+ setupCodeModifies.push([[
579
+ `const __VLS_props = `,
580
+ generateSourceCode(scriptSetup, range.start, range.end),
581
+ `;\n`,
582
+ generateSourceCode(scriptSetup, statement.start, range.start),
583
+ `__VLS_props`,
584
+ ], statement.start, range.end]);
585
+ }
586
+ }
587
+ if (scriptSetupRanges.slots.define && !scriptSetupRanges.slots.name) {
588
+ setupCodeModifies.push([[`const __VLS_slots = `], scriptSetupRanges.slots.define.start, scriptSetupRanges.slots.define.start]);
589
+ }
590
+ if (scriptSetupRanges.emits.define && !scriptSetupRanges.emits.name) {
591
+ setupCodeModifies.push([[`const __VLS_emit = `], scriptSetupRanges.emits.define.start, scriptSetupRanges.emits.define.start]);
592
+ }
593
+ if (scriptSetupRanges.expose.define) {
594
+ if (scriptSetupRanges.expose.define?.typeArg) {
595
+ setupCodeModifies.push([
596
+ [
597
+ `let __VLS_exposed!: `,
598
+ generateSourceCodeForExtraReference(scriptSetup, scriptSetupRanges.expose.define.typeArg.start, scriptSetupRanges.expose.define.typeArg.end),
599
+ `;\n`,
600
+ ],
601
+ scriptSetupRanges.expose.define.start,
602
+ scriptSetupRanges.expose.define.start,
603
+ ]);
604
+ }
605
+ else if (scriptSetupRanges.expose.define?.arg) {
606
+ setupCodeModifies.push([
607
+ [
608
+ `const __VLS_exposed = `,
609
+ generateSourceCodeForExtraReference(scriptSetup, scriptSetupRanges.expose.define.arg.start, scriptSetupRanges.expose.define.arg.end),
610
+ `;\n`,
611
+ ],
612
+ scriptSetupRanges.expose.define.start,
613
+ scriptSetupRanges.expose.define.start,
614
+ ]);
615
+ }
616
+ else {
617
+ setupCodeModifies.push([
618
+ [`const __VLS_exposed = {};\n`],
619
+ scriptSetupRanges.expose.define.start,
620
+ scriptSetupRanges.expose.define.start,
621
+ ]);
622
+ }
623
+ }
624
+ setupCodeModifies = setupCodeModifies.sort((a, b) => a[1] - b[1]);
625
+ if (setupCodeModifies.length) {
626
+ yield _(generateSourceCode(scriptSetup, scriptSetupRanges.importSectionEndOffset, setupCodeModifies[0][1]));
627
+ while (setupCodeModifies.length) {
628
+ const [codes, _start, end] = setupCodeModifies.shift();
629
+ for (const code of codes) {
630
+ yield _(code);
631
+ }
632
+ if (setupCodeModifies.length) {
633
+ const nextStart = setupCodeModifies[0][1];
634
+ yield _(generateSourceCode(scriptSetup, end, nextStart));
635
+ }
636
+ else {
637
+ yield _(generateSourceCode(scriptSetup, end));
638
+ }
639
+ }
640
+ }
641
+ else {
642
+ yield _(generateSourceCode(scriptSetup, scriptSetupRanges.importSectionEndOffset));
643
+ }
644
+ if (scriptSetupRanges.props.define?.typeArg && scriptSetupRanges.props.withDefaults?.arg) {
645
+ // fix https://github.com/vuejs/language-tools/issues/1187
646
+ yield _(`const __VLS_withDefaultsArg = (function <T>(t: T) { return t })(`);
647
+ yield _(generateSourceCodeForExtraReference(scriptSetup, scriptSetupRanges.props.withDefaults.arg.start, scriptSetupRanges.props.withDefaults.arg.end));
648
+ yield _(`);\n`);
649
+ }
650
+ if (!functional && scriptSetupRanges.defineProp.length) {
651
+ yield _(`let __VLS_propsOption_defineProp!: {\n`);
652
+ for (const defineProp of scriptSetupRanges.defineProp) {
653
+ let propName = 'modelValue';
654
+ if (defineProp.name && defineProp.nameIsString) {
655
+ // renaming support
656
+ yield _(generateSourceCodeForExtraReference(scriptSetup, defineProp.name.start, defineProp.name.end));
657
+ }
658
+ else if (defineProp.name) {
659
+ propName = scriptSetup.content.substring(defineProp.name.start, defineProp.name.end);
660
+ const start = getGeneratedLength();
661
+ definePropMirrors.set(propName, start);
662
+ yield _(propName);
663
+ }
664
+ else {
665
+ yield _(propName);
666
+ }
667
+ yield _(`: `);
668
+ let type = 'any';
669
+ if (!defineProp.nameIsString) {
670
+ type = `NonNullable<typeof ${propName}['value']>`;
671
+ }
672
+ else if (defineProp.type) {
673
+ type = scriptSetup.content.substring(defineProp.type.start, defineProp.type.end);
674
+ }
675
+ if (defineProp.required) {
676
+ yield _(`{ required: true, type: import('${vueCompilerOptions.lib}').PropType<${type}> },\n`);
677
+ }
678
+ else {
679
+ yield _(`import('${vueCompilerOptions.lib}').PropType<${type}>,\n`);
680
+ }
681
+ }
682
+ yield _(`};\n`);
683
+ }
684
+ yield* generateModelEmits();
685
+ yield* generateTemplate(functional);
686
+ if (mode === 'return' || mode === 'export') {
687
+ if (!vueCompilerOptions.skipTemplateCodegen && (templateCodegen?.hasSlot || scriptSetupRanges?.slots.define)) {
688
+ yield _(`const __VLS_component = `);
689
+ yield* generateComponent(functional);
690
+ yield _(`;\n`);
691
+ yield _(mode === 'return' ? 'return ' : 'export default ');
692
+ yield _(`{} as ${helperTypes.WithTemplateSlots.name}<typeof __VLS_component, ReturnType<typeof __VLS_template>>;\n`);
693
+ }
694
+ else {
695
+ yield _(mode === 'return' ? 'return ' : 'export default ');
696
+ yield* generateComponent(functional);
697
+ yield _(`;\n`);
698
+ }
699
+ }
700
+ }
701
+ function* generateComponent(functional) {
702
+ if (!scriptSetupRanges)
703
+ return;
704
+ if (script && scriptRanges?.exportDefault && scriptRanges.exportDefault.expression.start !== scriptRanges.exportDefault.args.start) {
705
+ // use defineComponent() from user space code if it exist
706
+ yield _(generateSourceCode(script, scriptRanges.exportDefault.expression.start, scriptRanges.exportDefault.args.start));
707
+ yield _(`{\n`);
708
+ }
709
+ else {
710
+ yield _(`(await import('${vueCompilerOptions.lib}')).defineComponent({\n`);
711
+ }
712
+ yield _(`setup() {\n`);
713
+ yield _(`return {\n`);
714
+ yield* generateSetupReturns();
715
+ if (scriptSetupRanges.expose.define) {
716
+ yield _(`...__VLS_exposed,\n`);
717
+ }
718
+ yield _(`};\n`);
719
+ yield _(`},\n`);
720
+ yield* generateComponentOptions(functional);
721
+ yield _(`})`);
722
+ }
723
+ function* generateComponentOptions(functional) {
724
+ if (scriptSetup && scriptSetupRanges && !bypassDefineComponent) {
725
+ const ranges = scriptSetupRanges;
726
+ const propsCodegens = [];
727
+ if (ranges.props.define?.arg) {
728
+ const arg = ranges.props.define.arg;
729
+ propsCodegens.push(function* () {
730
+ yield _(generateSourceCodeForExtraReference(scriptSetup, arg.start, arg.end));
731
+ });
732
+ }
733
+ if (ranges.props.define?.typeArg) {
734
+ const typeArg = ranges.props.define.typeArg;
735
+ propsCodegens.push(function* () {
736
+ yield _(`{} as `);
737
+ if (ranges.props.withDefaults?.arg) {
738
+ yield _(`${helperTypes.WithDefaults.name}<`);
739
+ }
740
+ yield _(`${helperTypes.TypePropsToOption.name}<`);
741
+ if (functional) {
742
+ yield _(`typeof __VLS_fnPropsTypeOnly`);
743
+ }
744
+ else {
745
+ yield _(generateSourceCodeForExtraReference(scriptSetup, typeArg.start, typeArg.end));
746
+ }
747
+ yield _(`>`);
748
+ if (ranges.props.withDefaults?.arg) {
749
+ yield _(`, typeof __VLS_withDefaultsArg`);
750
+ yield _(`>`);
751
+ }
752
+ });
753
+ }
754
+ if (!functional && ranges.defineProp.length) {
755
+ propsCodegens.push(function* () {
756
+ yield _(`__VLS_propsOption_defineProp`);
757
+ });
758
+ }
759
+ if (propsCodegens.length === 1) {
760
+ yield _(`props: `);
761
+ for (const generate of propsCodegens) {
762
+ yield* generate();
763
+ }
764
+ yield _(`,\n`);
765
+ }
766
+ else if (propsCodegens.length >= 2) {
767
+ yield _(`props: {\n`);
768
+ for (const generate of propsCodegens) {
769
+ yield _(`...`);
770
+ yield* generate();
771
+ yield _(`,\n`);
772
+ }
773
+ yield _(`},\n`);
774
+ }
775
+ yield _(`emits: ({} as __VLS_NormalizeEmits<typeof __VLS_modelEmitsType`);
776
+ if (ranges.emits.define) {
777
+ yield _(` & typeof `);
778
+ yield _(ranges.emits.name ?? '__VLS_emit');
779
+ }
780
+ yield _(`>),\n`);
781
+ }
782
+ if (script && scriptRanges?.exportDefault?.args) {
783
+ yield _(generateSourceCode(script, scriptRanges.exportDefault.args.start + 1, scriptRanges.exportDefault.args.end - 1));
784
+ }
785
+ }
786
+ function* generateSetupReturns() {
787
+ if (scriptSetupRanges && bypassDefineComponent) {
788
+ // fill $props
789
+ if (scriptSetupRanges.props.define) {
790
+ // NOTE: defineProps is inaccurate for $props
791
+ yield _(`$props: __VLS_makeOptional(${scriptSetupRanges.props.name ?? `__VLS_props`}),\n`);
792
+ yield _(`...${scriptSetupRanges.props.name ?? `__VLS_props`},\n`);
793
+ }
794
+ // fill $emit
795
+ if (scriptSetupRanges.emits.define) {
796
+ yield _(`$emit: ${scriptSetupRanges.emits.name ?? '__VLS_emit'},\n`);
797
+ }
798
+ }
799
+ }
800
+ function* generateTemplate(functional) {
801
+ generatedTemplate = true;
802
+ if (!vueCompilerOptions.skipTemplateCodegen) {
803
+ yield* generateExportOptions();
804
+ yield* generateConstNameOption();
805
+ yield _(`function __VLS_template() {\n`);
806
+ const cssIds = new Set();
807
+ yield* generateTemplateContext(cssIds);
808
+ yield _(`}\n`);
809
+ yield* generateComponentForTemplateUsage(functional, cssIds);
810
+ }
811
+ else {
812
+ yield _(`function __VLS_template() {\n`);
813
+ const templateUsageVars = [...getTemplateUsageVars()];
814
+ yield _(`// @ts-ignore\n`);
815
+ yield _(`[${templateUsageVars.join(', ')}]\n`);
816
+ yield _(`return {};\n`);
817
+ yield _(`}\n`);
818
+ }
819
+ }
820
+ function* generateComponentForTemplateUsage(functional, cssIds) {
821
+ if (scriptSetup && scriptSetupRanges) {
822
+ yield _(`const __VLS_internalComponent = (await import('${vueCompilerOptions.lib}')).defineComponent({\n`);
823
+ yield _(`setup() {\n`);
824
+ yield _(`return {\n`);
825
+ yield* generateSetupReturns();
826
+ // bindings
827
+ const templateUsageVars = getTemplateUsageVars();
828
+ for (const [content, bindings] of [
829
+ [scriptSetup.content, scriptSetupRanges.bindings],
830
+ scriptRanges && script
831
+ ? [script.content, scriptRanges.bindings]
832
+ : ['', []],
833
+ ]) {
834
+ for (const expose of bindings) {
835
+ const varName = content.substring(expose.start, expose.end);
836
+ if (!templateUsageVars.has(varName) && !cssIds.has(varName)) {
837
+ continue;
838
+ }
839
+ const templateOffset = getGeneratedLength();
840
+ yield _(varName);
841
+ yield _(`: ${varName} as typeof `);
842
+ const scriptOffset = getGeneratedLength();
843
+ yield _(varName);
844
+ yield _(`,\n`);
845
+ linkedCodeMappings.push({
846
+ sourceOffsets: [scriptOffset],
847
+ generatedOffsets: [templateOffset],
848
+ lengths: [varName.length],
849
+ data: undefined,
850
+ });
851
+ }
852
+ }
853
+ yield _(`};\n`); // return {
854
+ yield _(`},\n`); // setup() {
855
+ yield* generateComponentOptions(functional);
856
+ yield _(`});\n`); // defineComponent {
857
+ }
858
+ else if (script) {
859
+ yield _(`let __VLS_internalComponent!: typeof import('./${path.basename(fileName)}')['default'];\n`);
860
+ }
861
+ else {
862
+ yield _(`const __VLS_internalComponent = (await import('${vueCompilerOptions.lib}')).defineComponent({});\n`);
863
+ }
864
+ }
865
+ function* generateExportOptions() {
866
+ yield _(`\n`);
867
+ yield _(`const __VLS_componentsOption = `);
868
+ if (script && scriptRanges?.exportDefault?.componentsOption) {
869
+ const componentsOption = scriptRanges.exportDefault.componentsOption;
870
+ yield _([
871
+ script.content.substring(componentsOption.start, componentsOption.end),
872
+ 'script',
873
+ componentsOption.start,
874
+ (0, utils_1.disableAllFeatures)({
875
+ navigation: true,
876
+ }),
877
+ ]);
878
+ }
879
+ else {
880
+ yield _(`{}`);
881
+ }
882
+ yield _(`;\n`);
883
+ }
884
+ function* generateConstNameOption() {
885
+ yield _(`\n`);
886
+ if (script && scriptRanges?.exportDefault?.nameOption) {
887
+ const nameOption = scriptRanges.exportDefault.nameOption;
888
+ yield _(`const __VLS_name = `);
889
+ yield _(`${script.content.substring(nameOption.start, nameOption.end)} as const`);
890
+ yield _(`;\n`);
891
+ }
892
+ else if (scriptSetup) {
893
+ yield _(`let __VLS_name!: '${path.basename(fileName.substring(0, fileName.lastIndexOf('.')))}';\n`);
894
+ }
895
+ else {
896
+ yield _(`const __VLS_name = undefined;\n`);
897
+ }
898
+ }
899
+ function* generateTemplateContext(cssIds = new Set()) {
900
+ const useGlobalThisTypeInCtx = fileName.endsWith('.html');
901
+ yield _(`let __VLS_ctx!: ${useGlobalThisTypeInCtx ? 'typeof globalThis &' : ''}`);
902
+ yield _(`InstanceType<__VLS_PickNotAny<typeof __VLS_internalComponent, new () => {}>> & {\n`);
903
+ /* CSS Module */
904
+ for (let i = 0; i < styles.length; i++) {
905
+ const style = styles[i];
906
+ if (style.module) {
907
+ yield _(`${style.module}: Record<string, string> & ${helperTypes.Prettify.name}<{}`);
908
+ for (const className of style.classNames) {
909
+ yield* generateCssClassProperty(i, className.text, className.offset, 'string', false, true);
910
+ }
911
+ yield _(`>;\n`);
912
+ }
913
+ }
914
+ yield _(`};\n`);
915
+ /* Components */
916
+ yield _(`/* Components */\n`);
917
+ yield _(`let __VLS_otherComponents!: NonNullable<typeof __VLS_internalComponent extends { components: infer C } ? C : {}> & typeof __VLS_componentsOption;\n`);
918
+ yield _(`let __VLS_own!: __VLS_SelfComponent<typeof __VLS_name, typeof __VLS_internalComponent & (new () => { ${(0, shared_1.getSlotsPropertyName)(vueCompilerOptions.target)}: typeof ${scriptSetupRanges?.slots?.name ?? '__VLS_slots'} })>;\n`);
919
+ yield _(`let __VLS_localComponents!: typeof __VLS_otherComponents & Omit<typeof __VLS_own, keyof typeof __VLS_otherComponents>;\n`);
920
+ yield _(`let __VLS_components!: typeof __VLS_localComponents & __VLS_GlobalComponents & typeof __VLS_ctx;\n`); // for html completion, TS references...
921
+ /* Style Scoped */
922
+ yield _(`/* Style Scoped */\n`);
923
+ yield _(`type __VLS_StyleScopedClasses = {}`);
924
+ for (let i = 0; i < styles.length; i++) {
925
+ const style = styles[i];
926
+ const option = vueCompilerOptions.experimentalResolveStyleCssClasses;
927
+ if (option === 'always' || (option === 'scoped' && style.scoped)) {
928
+ for (const className of style.classNames) {
929
+ yield* generateCssClassProperty(i, className.text, className.offset, 'boolean', true, !style.module);
930
+ }
931
+ }
932
+ }
933
+ yield _(`;\n`);
934
+ yield _('let __VLS_styleScopedClasses!: __VLS_StyleScopedClasses | keyof __VLS_StyleScopedClasses | (keyof __VLS_StyleScopedClasses)[];\n');
935
+ yield _(`/* CSS variable injection */\n`);
936
+ yield* generateCssVars(cssIds);
937
+ yield _(`/* CSS variable injection end */\n`);
938
+ if (templateCodegen) {
939
+ for (let i = 0; i < templateCodegen.tsCodes.length; i++) {
940
+ yield [
941
+ templateCodegen.tsCodes[i],
942
+ templateCodegen.tsCodegenStacks[i],
943
+ ];
944
+ }
945
+ }
946
+ else {
947
+ yield _(`// no template\n`);
948
+ if (!scriptSetupRanges?.slots.define) {
949
+ yield _(`const __VLS_slots = {};\n`);
950
+ }
951
+ }
952
+ yield _(`return ${scriptSetupRanges?.slots.name ?? '__VLS_slots'};\n`);
953
+ }
954
+ function* generateCssClassProperty(styleIndex, classNameWithDot, offset, propertyType, optional, referencesCodeLens) {
955
+ yield _(`\n & { `);
956
+ yield _([
957
+ '',
958
+ 'style_' + styleIndex,
959
+ offset,
960
+ (0, utils_1.disableAllFeatures)({
961
+ navigation: true,
962
+ __referencesCodeLens: referencesCodeLens,
963
+ }),
964
+ ]);
965
+ yield _(`'`);
966
+ yield _([
967
+ '',
968
+ 'style_' + styleIndex,
969
+ offset,
970
+ (0, utils_1.disableAllFeatures)({
971
+ navigation: {
972
+ resolveRenameNewName: normalizeCssRename,
973
+ resolveRenameEditText: applyCssRename,
974
+ },
975
+ }),
976
+ ]);
977
+ yield _([
978
+ classNameWithDot.substring(1),
979
+ 'style_' + styleIndex,
980
+ offset + 1,
981
+ (0, utils_1.disableAllFeatures)({ __combineLastMappping: true }),
982
+ ]);
983
+ yield _(`'`);
984
+ yield _([
985
+ '',
986
+ 'style_' + styleIndex,
987
+ offset + classNameWithDot.length,
988
+ (0, utils_1.disableAllFeatures)({}),
989
+ ]);
990
+ yield _(`${optional ? '?' : ''}: ${propertyType}`);
991
+ yield _(` }`);
992
+ }
993
+ function* generateCssVars(cssIds) {
994
+ const emptyLocalVars = new Map();
995
+ for (const style of styles) {
996
+ for (const cssBind of style.cssVars) {
997
+ for (const [segment, offset, onlyError] of (0, transform_1.eachInterpolationSegment)(ts, cssBind.text, ts.createSourceFile('/a.txt', cssBind.text, 99), emptyLocalVars, cssIds, vueCompilerOptions)) {
998
+ if (offset === undefined) {
999
+ yield _(segment);
1000
+ }
1001
+ else {
1002
+ yield _([
1003
+ segment,
1004
+ style.name,
1005
+ cssBind.offset + offset,
1006
+ onlyError
1007
+ ? (0, utils_1.disableAllFeatures)({ verification: true })
1008
+ : (0, utils_1.enableAllFeatures)({}),
1009
+ ]);
1010
+ }
1011
+ }
1012
+ yield _(`;\n`);
1013
+ }
1014
+ }
1015
+ }
1016
+ function getTemplateUsageVars() {
1017
+ const usageVars = new Set();
1018
+ if (templateCodegen) {
1019
+ // fix import components unused report
1020
+ for (const varName of bindingNames) {
1021
+ if (templateCodegen.tagNames.has(varName) || templateCodegen.tagNames.has((0, shared_1.hyphenateTag)(varName))) {
1022
+ usageVars.add(varName);
1023
+ }
1024
+ }
1025
+ for (const tag of Object.keys(templateCodegen.tagNames)) {
1026
+ if (tag.indexOf('.') >= 0) {
1027
+ usageVars.add(tag.split('.')[0]);
1028
+ }
1029
+ }
1030
+ for (const _id of templateCodegen.accessedGlobalVariables) {
1031
+ usageVars.add(_id);
1032
+ }
1033
+ }
1034
+ return usageVars;
1035
+ }
1036
+ function generateSourceCode(block, start, end) {
1037
+ return [
1038
+ block.content.substring(start, end),
1039
+ block.name,
1040
+ start,
1041
+ (0, utils_1.enableAllFeatures)({}), // diagnostic also working for setup() returns unused in template checking
1042
+ ];
1043
+ }
1044
+ function generateSourceCodeForExtraReference(block, start, end) {
1045
+ return [
1046
+ block.content.substring(start, end),
1047
+ block.name,
1048
+ start,
1049
+ (0, utils_1.disableAllFeatures)({ navigation: true }),
1050
+ ];
1051
+ }
1052
+ }
1053
+ exports.generate = generate;
1054
+ function normalizeCssRename(newName) {
1055
+ return newName.startsWith('.') ? newName.slice(1) : newName;
1056
+ }
1057
+ function applyCssRename(newName) {
1058
+ return '.' + newName;
1059
+ }
1060
+ //# sourceMappingURL=script.js.map