@vue/language-core 3.1.4 → 3.1.5
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.
- package/lib/codegen/globalTypes.js +4 -3
- package/lib/codegen/script/component.js +1 -1
- package/lib/codegen/script/index.js +1 -1
- package/lib/codegen/script/scriptSetup.js +2 -2
- package/lib/codegen/script/src.js +1 -1
- package/lib/codegen/style/classProperty.js +1 -1
- package/lib/codegen/style/imports.js +1 -1
- package/lib/codegen/template/context.d.ts +3 -3
- package/lib/codegen/template/context.js +2 -2
- package/lib/codegen/template/element.js +30 -17
- package/lib/codegen/template/elementDirectives.js +5 -5
- package/lib/codegen/template/elementEvents.d.ts +1 -1
- package/lib/codegen/template/elementEvents.js +4 -8
- package/lib/codegen/template/elementProps.d.ts +2 -2
- package/lib/codegen/template/elementProps.js +38 -83
- package/lib/codegen/template/index.d.ts +3 -3
- package/lib/codegen/template/index.js +2 -2
- package/lib/codegen/template/interpolation.js +38 -39
- package/lib/codegen/template/objectProperty.js +1 -1
- package/lib/codegen/template/slotOutlet.js +5 -10
- package/lib/codegen/template/styleScopedClasses.js +8 -8
- package/lib/codegen/template/vSlot.js +3 -4
- package/lib/codegen/utils/index.d.ts +0 -2
- package/lib/codegen/utils/index.js +0 -11
- package/lib/codegen/utils/stringLiteralKey.js +1 -1
- package/lib/codegen/utils/unicode.js +1 -1
- package/lib/codegen/utils/wrapWith.d.ts +1 -2
- package/lib/codegen/utils/wrapWith.js +1 -10
- package/lib/compilerOptions.d.ts +2 -5
- package/lib/compilerOptions.js +43 -66
- package/lib/languagePlugin.js +16 -23
- package/lib/plugins/vue-template-html.js +12 -9
- package/lib/plugins/vue-template-inline-css.js +8 -14
- package/lib/plugins/vue-tsx.d.ts +3 -3
- package/lib/plugins/vue-tsx.js +0 -1
- package/lib/utils/parseSfc.js +5 -10
- package/lib/utils/shared.d.ts +1 -0
- package/lib/utils/shared.js +8 -0
- package/lib/virtualFile/computedSfc.d.ts +1 -1
- package/lib/virtualFile/computedSfc.js +6 -2
- package/package.json +2 -2
|
@@ -11,7 +11,6 @@ function getGlobalTypesFileName(options) {
|
|
|
11
11
|
}
|
|
12
12
|
function generateGlobalTypes(options) {
|
|
13
13
|
const { lib, target, checkUnknownProps } = options;
|
|
14
|
-
const fnPropsType = `(T extends { $props: infer Props } ? Props : {})${checkUnknownProps ? '' : ' & Record<string, unknown>'}`;
|
|
15
14
|
let text = `// @ts-nocheck\nexport {};\n`;
|
|
16
15
|
if (target < 3.5) {
|
|
17
16
|
text += `
|
|
@@ -22,6 +21,8 @@ function generateGlobalTypes(options) {
|
|
|
22
21
|
}
|
|
23
22
|
text += `
|
|
24
23
|
; declare global {
|
|
24
|
+
${checkUnknownProps ? '' : 'var __VLS_PROPS_FALLBACK: Record<string, unknown>;'}
|
|
25
|
+
|
|
25
26
|
const __VLS_directiveBindingRestFields: { instance: null, oldValue: null, modifiers: any, dir: any };
|
|
26
27
|
const __VLS_unref: typeof import('${lib}').unref;
|
|
27
28
|
const __VLS_placeholder: any;
|
|
@@ -54,14 +55,14 @@ function generateGlobalTypes(options) {
|
|
|
54
55
|
? K extends { __ctx?: { props?: infer P } } ? NonNullable<P> : never
|
|
55
56
|
: T extends (props: infer P, ...args: any) => any ? P
|
|
56
57
|
: {};
|
|
57
|
-
type __VLS_FunctionalComponent<T> = (props: ${
|
|
58
|
+
type __VLS_FunctionalComponent<T> = (props: (T extends { $props: infer Props } ? Props : {})${checkUnknownProps ? '' : ' & Record<string, unknown>'}, ctx?: any) => ${target >= 3.3
|
|
58
59
|
? `import('${lib}/jsx-runtime').JSX.Element`
|
|
59
60
|
: `globalThis.JSX.Element`} & {
|
|
60
61
|
__ctx?: {
|
|
61
62
|
attrs?: any;
|
|
62
63
|
slots?: T extends { $slots: infer Slots } ? Slots : Record<string, any>;
|
|
63
64
|
emit?: T extends { $emit: infer Emit } ? Emit : {};
|
|
64
|
-
props?:
|
|
65
|
+
props?: typeof props;
|
|
65
66
|
expose?: (exposed: T) => void;
|
|
66
67
|
};
|
|
67
68
|
};
|
|
@@ -48,7 +48,7 @@ function* generateComponent(options, ctx, scriptSetup, scriptSetupRanges) {
|
|
|
48
48
|
}
|
|
49
49
|
if (options.vueCompilerOptions.target >= 3.5
|
|
50
50
|
&& options.vueCompilerOptions.inferComponentDollarEl
|
|
51
|
-
&& options.templateCodegen?.singleRootElTypes.
|
|
51
|
+
&& options.templateCodegen?.singleRootElTypes.size) {
|
|
52
52
|
yield `__typeEl: {} as __VLS_RootEl,${utils_1.newLine}`;
|
|
53
53
|
}
|
|
54
54
|
if (options.sfc.script && options.scriptRanges?.componentOptions?.args) {
|
|
@@ -107,7 +107,7 @@ function* generateConstExport(options, block) {
|
|
|
107
107
|
yield* (0, utils_1.generatePartiallyEnding)(options.sfc.script.name, options.scriptRanges?.exportDefault?.start ?? options.sfc.script.content.length, '#3632/script.vue');
|
|
108
108
|
}
|
|
109
109
|
yield `const `;
|
|
110
|
-
yield* (0, wrapWith_1.wrapWith)(0, block.content.length,
|
|
110
|
+
yield* (0, wrapWith_1.wrapWith)(block.name, 0, block.content.length, codeFeatures_1.codeFeatures.doNotReportTs6133, `__VLS_export`);
|
|
111
111
|
yield ` = `;
|
|
112
112
|
}
|
|
113
113
|
function* generateExportDefault(options) {
|
|
@@ -71,7 +71,7 @@ function* generateScriptSetup(options, ctx, scriptSetup, scriptSetupRanges) {
|
|
|
71
71
|
? `import('${options.vueCompilerOptions.lib}').VNodeProps`
|
|
72
72
|
+ ` & import('${options.vueCompilerOptions.lib}').AllowedComponentProps`
|
|
73
73
|
+ ` & import('${options.vueCompilerOptions.lib}').ComponentCustomProps`
|
|
74
|
-
: `globalThis.JSX.IntrinsicAttributes`}${utils_1.endOfLine}`
|
|
74
|
+
: `globalThis.JSX.IntrinsicAttributes`} & (typeof globalThis extends { __VLS_PROPS_FALLBACK: infer P } ? P : {})${utils_1.endOfLine}`
|
|
75
75
|
+ ` expose: (exposed: ${scriptSetupRanges.defineExpose
|
|
76
76
|
? `import('${options.vueCompilerOptions.lib}').ShallowUnwrapRef<typeof __VLS_exposed>`
|
|
77
77
|
: `{}`}) => void${utils_1.endOfLine}`
|
|
@@ -174,7 +174,7 @@ function* generateSetupFunction(options, ctx, scriptSetup, scriptSetupRanges, sy
|
|
|
174
174
|
]
|
|
175
175
|
: [
|
|
176
176
|
` as __VLS_StyleModules[`,
|
|
177
|
-
...(0, wrapWith_1.wrapWith)(exp.start, exp.end,
|
|
177
|
+
...(0, wrapWith_1.wrapWith)(scriptSetup.name, exp.start, exp.end, codeFeatures_1.codeFeatures.verification, `'$style'`),
|
|
178
178
|
`])`,
|
|
179
179
|
],
|
|
180
180
|
callExp.end,
|
|
@@ -22,7 +22,7 @@ function* generateSrc(src) {
|
|
|
22
22
|
text = text + '.js';
|
|
23
23
|
}
|
|
24
24
|
yield `export * from `;
|
|
25
|
-
yield* (0, wrapWith_1.wrapWith)(src.offset, src.offset + src.text.length,
|
|
25
|
+
yield* (0, wrapWith_1.wrapWith)('main', src.offset, src.offset + src.text.length, {
|
|
26
26
|
...codeFeatures_1.codeFeatures.all,
|
|
27
27
|
...text !== src.text ? codeFeatures_1.codeFeatures.navigationWithoutRename : {},
|
|
28
28
|
}, `'`, [text.slice(0, src.text.length), 'main', src.offset, utils_1.combineLastMapping], text.slice(src.text.length), `'`);
|
|
@@ -6,7 +6,7 @@ const utils_1 = require("../utils");
|
|
|
6
6
|
const wrapWith_1 = require("../utils/wrapWith");
|
|
7
7
|
function* generateClassProperty(styleIndex, classNameWithDot, offset, propertyType) {
|
|
8
8
|
yield `${utils_1.newLine} & { `;
|
|
9
|
-
yield* (0, wrapWith_1.wrapWith)(offset, offset + classNameWithDot.length,
|
|
9
|
+
yield* (0, wrapWith_1.wrapWith)('style_' + styleIndex, offset, offset + classNameWithDot.length, codeFeatures_1.codeFeatures.navigation, `'`, [
|
|
10
10
|
classNameWithDot.slice(1),
|
|
11
11
|
'style_' + styleIndex,
|
|
12
12
|
offset + 1,
|
|
@@ -10,7 +10,7 @@ function* generateStyleImports(style) {
|
|
|
10
10
|
};
|
|
11
11
|
if (typeof style.src === 'object') {
|
|
12
12
|
yield `${utils_1.newLine} & typeof import(`;
|
|
13
|
-
yield* (0, wrapWith_1.wrapWith)(style.src.offset, style.src.offset + style.src.text.length,
|
|
13
|
+
yield* (0, wrapWith_1.wrapWith)('main', style.src.offset, style.src.offset + style.src.text.length, features, `'`, [style.src.text, 'main', style.src.offset, utils_1.combineLastMapping], `'`);
|
|
14
14
|
yield `).default`;
|
|
15
15
|
}
|
|
16
16
|
for (const { text, offset } of style.imports) {
|
|
@@ -143,10 +143,10 @@ export declare function createTemplateCodegenContext(options: Pick<TemplateCodeg
|
|
|
143
143
|
offset: number;
|
|
144
144
|
}[]>;
|
|
145
145
|
currentComponent: {
|
|
146
|
-
ctxVar: string;
|
|
147
|
-
|
|
146
|
+
get ctxVar(): string;
|
|
147
|
+
get propsVar(): string;
|
|
148
148
|
} | undefined;
|
|
149
|
-
singleRootElTypes: string
|
|
149
|
+
singleRootElTypes: Set<string>;
|
|
150
150
|
singleRootNodes: Set<CompilerDOM.ElementNode | null>;
|
|
151
151
|
addTemplateRef(name: string, typeExp: string, offset: number): void;
|
|
152
152
|
accessExternalVariable(name: string, offset?: number): void;
|
|
@@ -173,7 +173,7 @@ function createTemplateCodegenContext(options, templateAst) {
|
|
|
173
173
|
inheritedAttrVars,
|
|
174
174
|
templateRefs,
|
|
175
175
|
currentComponent: undefined,
|
|
176
|
-
singleRootElTypes:
|
|
176
|
+
singleRootElTypes: new Set(),
|
|
177
177
|
singleRootNodes: new Set(),
|
|
178
178
|
addTemplateRef(name, typeExp, offset) {
|
|
179
179
|
let refs = templateRefs.get(name);
|
|
@@ -308,7 +308,7 @@ function createTemplateCodegenContext(options, templateAst) {
|
|
|
308
308
|
const data = stack.pop();
|
|
309
309
|
commentBuffer.length = 0;
|
|
310
310
|
if (data.expectError !== undefined) {
|
|
311
|
-
yield* (0, wrapWith_1.wrapWith)(data.expectError.node.loc.start.offset, data.expectError.node.loc.end.offset, {
|
|
311
|
+
yield* (0, wrapWith_1.wrapWith)('template', data.expectError.node.loc.start.offset, data.expectError.node.loc.end.offset, {
|
|
312
312
|
verification: {
|
|
313
313
|
// If no errors/warnings/diagnostics were reported within the region of code covered
|
|
314
314
|
// by the @vue-expect-error directive, then we should allow any `unused @ts-expect-error`
|
|
@@ -4,6 +4,7 @@ exports.generateComponent = generateComponent;
|
|
|
4
4
|
exports.generateElement = generateElement;
|
|
5
5
|
const CompilerDOM = require("@vue/compiler-dom");
|
|
6
6
|
const shared_1 = require("@vue/shared");
|
|
7
|
+
const muggle_string_1 = require("muggle-string");
|
|
7
8
|
const shared_2 = require("../../utils/shared");
|
|
8
9
|
const codeFeatures_1 = require("../codeFeatures");
|
|
9
10
|
const inlayHints_1 = require("../inlayHints");
|
|
@@ -28,10 +29,19 @@ function* generateComponent(options, ctx, node) {
|
|
|
28
29
|
const componentFunctionalVar = ctx.getInternalVariable();
|
|
29
30
|
const componentVNodeVar = ctx.getInternalVariable();
|
|
30
31
|
const componentCtxVar = ctx.getInternalVariable();
|
|
32
|
+
const componentPropsVar = ctx.getInternalVariable();
|
|
31
33
|
const isComponentTag = node.tag.toLowerCase() === 'component';
|
|
34
|
+
let isCtxVarUsed = false;
|
|
35
|
+
let isPropsVarUsed = false;
|
|
32
36
|
ctx.currentComponent = {
|
|
33
|
-
ctxVar
|
|
34
|
-
|
|
37
|
+
get ctxVar() {
|
|
38
|
+
isCtxVarUsed = true;
|
|
39
|
+
return componentCtxVar;
|
|
40
|
+
},
|
|
41
|
+
get propsVar() {
|
|
42
|
+
isPropsVarUsed = true;
|
|
43
|
+
return componentPropsVar;
|
|
44
|
+
},
|
|
35
45
|
};
|
|
36
46
|
let props = node.props;
|
|
37
47
|
let dynamicTagInfo;
|
|
@@ -132,19 +142,20 @@ function* generateComponent(options, ctx, node) {
|
|
|
132
142
|
yield utils_1.endOfLine;
|
|
133
143
|
}
|
|
134
144
|
}
|
|
145
|
+
const propCodes = [...(0, elementProps_1.generateElementProps)(options, ctx, node, props, options.vueCompilerOptions.checkUnknownProps, failedPropExps)];
|
|
135
146
|
yield `// @ts-ignore${utils_1.newLine}`;
|
|
136
147
|
yield `const ${componentFunctionalVar} = __VLS_asFunctionalComponent(${componentOriginalVar}, new ${componentOriginalVar}({${utils_1.newLine}`;
|
|
137
|
-
yield* (0,
|
|
148
|
+
yield* (0, muggle_string_1.toString)(propCodes);
|
|
138
149
|
yield `}))${utils_1.endOfLine}`;
|
|
139
150
|
yield `const `;
|
|
140
|
-
yield* (0, wrapWith_1.wrapWith)(node.loc.start.offset, node.loc.end.offset, codeFeatures_1.codeFeatures.doNotReportTs6133, componentVNodeVar);
|
|
151
|
+
yield* (0, wrapWith_1.wrapWith)('template', node.loc.start.offset, node.loc.end.offset, codeFeatures_1.codeFeatures.doNotReportTs6133, componentVNodeVar);
|
|
141
152
|
yield ` = ${componentFunctionalVar}`;
|
|
142
153
|
yield* generateComponentGeneric(ctx);
|
|
143
154
|
yield `(`;
|
|
144
|
-
yield* (0, wrapWith_1.wrapWith)(tagOffsets[0], tagOffsets[0] + node.tag.length, codeFeatures_1.codeFeatures.verification, `{${utils_1.newLine}`, ...
|
|
155
|
+
yield* (0, wrapWith_1.wrapWith)('template', tagOffsets[0], tagOffsets[0] + node.tag.length, codeFeatures_1.codeFeatures.verification, `{${utils_1.newLine}`, ...propCodes, `}`);
|
|
145
156
|
yield `, ...__VLS_functionalComponentArgsRest(${componentFunctionalVar}))${utils_1.endOfLine}`;
|
|
146
157
|
yield* generateFailedPropExps(options, ctx, failedPropExps);
|
|
147
|
-
yield* (0, elementEvents_1.generateElementEvents)(options, ctx, node, componentOriginalVar
|
|
158
|
+
yield* (0, elementEvents_1.generateElementEvents)(options, ctx, node, componentOriginalVar);
|
|
148
159
|
yield* (0, elementDirectives_1.generateElementDirectives)(options, ctx, node);
|
|
149
160
|
const reference = yield* generateElementReference(options, ctx, node);
|
|
150
161
|
const tag = (0, shared_2.hyphenateTag)(node.tag);
|
|
@@ -152,7 +163,7 @@ function* generateComponent(options, ctx, node) {
|
|
|
152
163
|
&& !options.vueCompilerOptions.fallthroughComponentNames.includes(tag);
|
|
153
164
|
if (reference || isRootNode) {
|
|
154
165
|
const componentInstanceVar = ctx.getInternalVariable();
|
|
155
|
-
|
|
166
|
+
isCtxVarUsed = true;
|
|
156
167
|
yield `var ${componentInstanceVar} = {} as (Parameters<NonNullable<typeof ${componentCtxVar}['expose']>>[0] | null)`;
|
|
157
168
|
if (ctx.inVFor) {
|
|
158
169
|
yield `[]`;
|
|
@@ -163,21 +174,22 @@ function* generateComponent(options, ctx, node) {
|
|
|
163
174
|
ctx.addTemplateRef(reference.name, typeExp, reference.offset);
|
|
164
175
|
}
|
|
165
176
|
if (isRootNode) {
|
|
166
|
-
ctx.singleRootElTypes.
|
|
177
|
+
ctx.singleRootElTypes.add(`NonNullable<typeof ${componentInstanceVar}>['$el']`);
|
|
167
178
|
}
|
|
168
179
|
}
|
|
169
180
|
if (hasVBindAttrs(options, ctx, node)) {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
yield `var ${attrsVar}!: NonNullable<typeof ${componentCtxVar}['props']>${utils_1.endOfLine}`;
|
|
173
|
-
ctx.inheritedAttrVars.add(attrsVar);
|
|
181
|
+
ctx.inheritedAttrVars.add(componentPropsVar);
|
|
182
|
+
isPropsVarUsed = true;
|
|
174
183
|
}
|
|
175
184
|
(0, styleScopedClasses_1.collectStyleScopedClassReferences)(options, ctx, node);
|
|
176
185
|
const slotDir = node.props.find(p => p.type === CompilerDOM.NodeTypes.DIRECTIVE && p.name === 'slot');
|
|
177
186
|
yield* (0, vSlot_1.generateVSlot)(options, ctx, node, slotDir);
|
|
178
|
-
if (
|
|
187
|
+
if (isCtxVarUsed) {
|
|
179
188
|
yield `var ${componentCtxVar}!: __VLS_FunctionalComponentCtx<typeof ${componentOriginalVar}, typeof ${componentVNodeVar}>${utils_1.endOfLine}`;
|
|
180
189
|
}
|
|
190
|
+
if (isPropsVarUsed) {
|
|
191
|
+
yield `var ${componentPropsVar}!: __VLS_FunctionalComponentProps<typeof ${componentOriginalVar}, typeof ${componentVNodeVar}>${utils_1.endOfLine}`;
|
|
192
|
+
}
|
|
181
193
|
}
|
|
182
194
|
function* generateElement(options, ctx, node) {
|
|
183
195
|
const [startTagOffset, endTagOffset] = (0, shared_2.getElementTagOffsets)(node, options.template);
|
|
@@ -189,7 +201,7 @@ function* generateElement(options, ctx, node) {
|
|
|
189
201
|
yield* (0, propertyAccess_1.generatePropertyAccess)(options, ctx, node.tag, endTagOffset, codeFeatures_1.codeFeatures.withoutHighlightAndCompletion);
|
|
190
202
|
}
|
|
191
203
|
yield `)(`;
|
|
192
|
-
yield* (0, wrapWith_1.wrapWith)(startTagOffset, startTagOffset + node.tag.length, codeFeatures_1.codeFeatures.verification, `{${utils_1.newLine}`, ...(0, elementProps_1.generateElementProps)(options, ctx, node, node.props, options.vueCompilerOptions.checkUnknownProps,
|
|
204
|
+
yield* (0, wrapWith_1.wrapWith)('template', startTagOffset, startTagOffset + node.tag.length, codeFeatures_1.codeFeatures.verification, `{${utils_1.newLine}`, ...(0, elementProps_1.generateElementProps)(options, ctx, node, node.props, options.vueCompilerOptions.checkUnknownProps, failedPropExps), `}`);
|
|
193
205
|
yield `)${utils_1.endOfLine}`;
|
|
194
206
|
yield* generateFailedPropExps(options, ctx, failedPropExps);
|
|
195
207
|
yield* (0, elementDirectives_1.generateElementDirectives)(options, ctx, node);
|
|
@@ -202,7 +214,7 @@ function* generateElement(options, ctx, node) {
|
|
|
202
214
|
ctx.addTemplateRef(reference.name, typeExp, reference.offset);
|
|
203
215
|
}
|
|
204
216
|
if (ctx.singleRootNodes.has(node)) {
|
|
205
|
-
ctx.singleRootElTypes.
|
|
217
|
+
ctx.singleRootElTypes.add(`__VLS_Elements['${node.tag}']`);
|
|
206
218
|
}
|
|
207
219
|
if (hasVBindAttrs(options, ctx, node)) {
|
|
208
220
|
ctx.inheritedAttrVars.add(`__VLS_intrinsics.${node.tag}`);
|
|
@@ -248,7 +260,7 @@ function* generateCanonicalComponentName(tagText, offset, features) {
|
|
|
248
260
|
function* generateComponentGeneric(ctx) {
|
|
249
261
|
if (ctx.currentInfo.generic) {
|
|
250
262
|
const { content, offset } = ctx.currentInfo.generic;
|
|
251
|
-
yield* (0, wrapWith_1.wrapWith)(offset, offset + content.length, codeFeatures_1.codeFeatures.verification, `<`, [
|
|
263
|
+
yield* (0, wrapWith_1.wrapWith)('template', offset, offset + content.length, codeFeatures_1.codeFeatures.verification, `<`, [
|
|
252
264
|
content,
|
|
253
265
|
'template',
|
|
254
266
|
offset,
|
|
@@ -261,7 +273,8 @@ function* generateElementReference(options, ctx, node) {
|
|
|
261
273
|
if (prop.type === CompilerDOM.NodeTypes.ATTRIBUTE
|
|
262
274
|
&& prop.name === 'ref'
|
|
263
275
|
&& prop.value) {
|
|
264
|
-
const
|
|
276
|
+
const name = prop.value.content;
|
|
277
|
+
const offset = (0, shared_2.getAttributeValueOffset)(prop.value);
|
|
265
278
|
// navigation support for `const foo = ref()`
|
|
266
279
|
yield `/** @type {typeof __VLS_ctx`;
|
|
267
280
|
yield* (0, propertyAccess_1.generatePropertyAccess)(options, ctx, name, offset, codeFeatures_1.codeFeatures.navigation);
|
|
@@ -32,13 +32,13 @@ function* generateElementDirectives(options, ctx, node) {
|
|
|
32
32
|
if (!builtInDirectives.has(prop.name)) {
|
|
33
33
|
ctx.accessExternalVariable((0, shared_1.camelize)('v-' + prop.name), prop.loc.start.offset);
|
|
34
34
|
}
|
|
35
|
-
yield* (0, wrapWith_1.wrapWith)(prop.loc.start.offset, prop.loc.end.offset, codeFeatures_1.codeFeatures.verification, `__VLS_asFunctionalDirective(`, ...generateIdentifier(options, prop), `)(null!, { ...__VLS_directiveBindingRestFields, `, ...generateArg(options, ctx, prop), ...generateModifiers(options, ctx, prop), ...generateValue(options, ctx, prop), ` }, null!, null!)`);
|
|
35
|
+
yield* (0, wrapWith_1.wrapWith)('template', prop.loc.start.offset, prop.loc.end.offset, codeFeatures_1.codeFeatures.verification, `__VLS_asFunctionalDirective(`, ...generateIdentifier(options, prop), `)(null!, { ...__VLS_directiveBindingRestFields, `, ...generateArg(options, ctx, prop), ...generateModifiers(options, ctx, prop), ...generateValue(options, ctx, prop), ` }, null!, null!)`);
|
|
36
36
|
yield utils_1.endOfLine;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
function* generateIdentifier(options, prop) {
|
|
40
40
|
const rawName = 'v-' + prop.name;
|
|
41
|
-
yield* (0, wrapWith_1.wrapWith)(prop.loc.start.offset, prop.loc.start.offset + rawName.length, codeFeatures_1.codeFeatures.verification, `__VLS_directives.`, ...(0, camelized_1.generateCamelized)(rawName, 'template', prop.loc.start.offset, {
|
|
41
|
+
yield* (0, wrapWith_1.wrapWith)('template', prop.loc.start.offset, prop.loc.start.offset + rawName.length, codeFeatures_1.codeFeatures.verification, `__VLS_directives.`, ...(0, camelized_1.generateCamelized)(rawName, 'template', prop.loc.start.offset, {
|
|
42
42
|
...codeFeatures_1.codeFeatures.withoutHighlightAndCompletion,
|
|
43
43
|
verification: options.vueCompilerOptions.checkUnknownDirectives && !builtInDirectives.has(prop.name),
|
|
44
44
|
}));
|
|
@@ -49,7 +49,7 @@ function* generateArg(options, ctx, prop) {
|
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
51
|
const startOffset = arg.loc.start.offset + arg.loc.source.indexOf(arg.content);
|
|
52
|
-
yield* (0, wrapWith_1.wrapWith)(startOffset, startOffset + arg.content.length, codeFeatures_1.codeFeatures.verification, `arg`);
|
|
52
|
+
yield* (0, wrapWith_1.wrapWith)('template', startOffset, startOffset + arg.content.length, codeFeatures_1.codeFeatures.verification, `arg`);
|
|
53
53
|
yield `: `;
|
|
54
54
|
if (arg.isStatic) {
|
|
55
55
|
yield* (0, stringLiteralKey_1.generateStringLiteralKey)(arg.content, startOffset, codeFeatures_1.codeFeatures.all);
|
|
@@ -66,7 +66,7 @@ function* generateModifiers(options, ctx, prop, propertyName = 'modifiers') {
|
|
|
66
66
|
}
|
|
67
67
|
const startOffset = modifiers[0].loc.start.offset - 1;
|
|
68
68
|
const endOffset = modifiers.at(-1).loc.end.offset;
|
|
69
|
-
yield* (0, wrapWith_1.wrapWith)(startOffset, endOffset, codeFeatures_1.codeFeatures.verification, propertyName);
|
|
69
|
+
yield* (0, wrapWith_1.wrapWith)('template', startOffset, endOffset, codeFeatures_1.codeFeatures.verification, propertyName);
|
|
70
70
|
yield `: { `;
|
|
71
71
|
for (const mod of modifiers) {
|
|
72
72
|
yield* (0, objectProperty_1.generateObjectProperty)(options, ctx, mod.content, mod.loc.start.offset, codeFeatures_1.codeFeatures.withoutHighlight);
|
|
@@ -79,7 +79,7 @@ function* generateValue(options, ctx, prop) {
|
|
|
79
79
|
if (exp?.type !== CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
|
|
80
80
|
return;
|
|
81
81
|
}
|
|
82
|
-
yield* (0, wrapWith_1.wrapWith)(exp.loc.start.offset, exp.loc.end.offset, codeFeatures_1.codeFeatures.verification, `value`);
|
|
82
|
+
yield* (0, wrapWith_1.wrapWith)('template', exp.loc.start.offset, exp.loc.end.offset, codeFeatures_1.codeFeatures.verification, `value`);
|
|
83
83
|
yield `: `;
|
|
84
84
|
yield* (0, elementProps_1.generatePropExp)(options, ctx, prop, exp);
|
|
85
85
|
}
|
|
@@ -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
|
|
6
|
+
export declare function generateElementEvents(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, componentOriginalVar: 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,9 +12,8 @@ const utils_1 = require("../utils");
|
|
|
12
12
|
const camelized_1 = require("../utils/camelized");
|
|
13
13
|
const wrapWith_1 = require("../utils/wrapWith");
|
|
14
14
|
const interpolation_1 = require("./interpolation");
|
|
15
|
-
function* generateElementEvents(options, ctx, node, componentOriginalVar
|
|
15
|
+
function* generateElementEvents(options, ctx, node, componentOriginalVar) {
|
|
16
16
|
let emitsVar;
|
|
17
|
-
let propsVar;
|
|
18
17
|
for (const prop of node.props) {
|
|
19
18
|
if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
|
|
20
19
|
&& (prop.name === 'on'
|
|
@@ -22,12 +21,9 @@ function* generateElementEvents(options, ctx, node, componentOriginalVar, compon
|
|
|
22
21
|
|| options.vueCompilerOptions.strictVModel
|
|
23
22
|
&& prop.name === 'model'
|
|
24
23
|
&& (!prop.arg || prop.arg.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION && prop.arg.isStatic))) {
|
|
25
|
-
ctx.currentComponent.used = true;
|
|
26
24
|
if (!emitsVar) {
|
|
27
25
|
emitsVar = ctx.getInternalVariable();
|
|
28
|
-
|
|
29
|
-
yield `let ${emitsVar}!: __VLS_ResolveEmits<typeof ${componentOriginalVar}, typeof ${componentCtxVar}.emit>${utils_1.endOfLine}`;
|
|
30
|
-
yield `let ${propsVar}!: __VLS_FunctionalComponentProps<typeof ${componentFunctionalVar}, typeof ${componentVNodeVar}>${utils_1.endOfLine}`;
|
|
26
|
+
yield `let ${emitsVar}!: __VLS_ResolveEmits<typeof ${componentOriginalVar}, typeof ${ctx.currentComponent.ctxVar}.emit>${utils_1.endOfLine}`;
|
|
31
27
|
}
|
|
32
28
|
let source = prop.arg?.loc.source ?? 'model-value';
|
|
33
29
|
let start = prop.arg?.loc.start.offset;
|
|
@@ -46,7 +42,7 @@ function* generateElementEvents(options, ctx, node, componentOriginalVar, compon
|
|
|
46
42
|
const propName = (0, shared_1.camelize)(propPrefix + source);
|
|
47
43
|
const emitName = emitPrefix + source;
|
|
48
44
|
const camelizedEmitName = (0, shared_1.camelize)(emitName);
|
|
49
|
-
yield `const ${ctx.getInternalVariable()}: __VLS_NormalizeComponentEvent<typeof ${propsVar}, typeof ${emitsVar}, '${propName}', '${emitName}', '${camelizedEmitName}'> = (${utils_1.newLine}`;
|
|
45
|
+
yield `const ${ctx.getInternalVariable()}: __VLS_NormalizeComponentEvent<typeof ${ctx.currentComponent.propsVar}, typeof ${emitsVar}, '${propName}', '${emitName}', '${camelizedEmitName}'> = (${utils_1.newLine}`;
|
|
50
46
|
if (prop.name === 'on') {
|
|
51
47
|
yield `{ `;
|
|
52
48
|
yield* generateEventArg(options, source, start, emitPrefix.slice(0, -1), codeFeatures_1.codeFeatures.navigation);
|
|
@@ -83,7 +79,7 @@ function* generateEventArg(options, name, start, directive = 'on', features) {
|
|
|
83
79
|
yield* (0, camelized_1.generateCamelized)(name, 'template', start, utils_1.combineLastMapping);
|
|
84
80
|
}
|
|
85
81
|
else {
|
|
86
|
-
yield* (0, wrapWith_1.wrapWith)(start, start + name.length, features, `'`, directive, ...(0, camelized_1.generateCamelized)(name, 'template', start, utils_1.combineLastMapping), `'`);
|
|
82
|
+
yield* (0, wrapWith_1.wrapWith)('template', start, start + name.length, features, `'`, directive, ...(0, camelized_1.generateCamelized)(name, 'template', start, utils_1.combineLastMapping), `'`);
|
|
87
83
|
}
|
|
88
84
|
}
|
|
89
85
|
function* generateEventExpression(options, ctx, prop) {
|
|
@@ -7,5 +7,5 @@ export interface FailedPropExpression {
|
|
|
7
7
|
prefix: string;
|
|
8
8
|
suffix: string;
|
|
9
9
|
}
|
|
10
|
-
export declare function generateElementProps(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, props: CompilerDOM.ElementNode['props'], strictPropsCheck: boolean,
|
|
11
|
-
export declare function generatePropExp(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, prop: CompilerDOM.DirectiveNode, exp: CompilerDOM.SimpleExpressionNode | undefined
|
|
10
|
+
export declare function generateElementProps(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, props: CompilerDOM.ElementNode['props'], strictPropsCheck: boolean, failedPropExps?: FailedPropExpression[]): Generator<Code>;
|
|
11
|
+
export declare function generatePropExp(options: TemplateCodegenOptions, ctx: TemplateCodegenContext, prop: CompilerDOM.DirectiveNode, exp: CompilerDOM.SimpleExpressionNode | undefined): Generator<Code>;
|
|
@@ -4,7 +4,6 @@ exports.generateElementProps = generateElementProps;
|
|
|
4
4
|
exports.generatePropExp = generatePropExp;
|
|
5
5
|
const CompilerDOM = require("@vue/compiler-dom");
|
|
6
6
|
const shared_1 = require("@vue/shared");
|
|
7
|
-
const muggle_string_1 = require("muggle-string");
|
|
8
7
|
const picomatch_1 = require("picomatch");
|
|
9
8
|
const shared_2 = require("../../utils/shared");
|
|
10
9
|
const codeFeatures_1 = require("../codeFeatures");
|
|
@@ -17,7 +16,7 @@ const elementDirectives_1 = require("./elementDirectives");
|
|
|
17
16
|
const elementEvents_1 = require("./elementEvents");
|
|
18
17
|
const interpolation_1 = require("./interpolation");
|
|
19
18
|
const objectProperty_1 = require("./objectProperty");
|
|
20
|
-
function* generateElementProps(options, ctx, node, props, strictPropsCheck,
|
|
19
|
+
function* generateElementProps(options, ctx, node, props, strictPropsCheck, failedPropExps) {
|
|
21
20
|
const isComponent = node.tagType === CompilerDOM.ElementTypes.COMPONENT;
|
|
22
21
|
for (const prop of props) {
|
|
23
22
|
if (prop.type === CompilerDOM.NodeTypes.DIRECTIVE
|
|
@@ -81,15 +80,9 @@ function* generateElementProps(options, ctx, node, props, strictPropsCheck, enab
|
|
|
81
80
|
if (shouldSpread) {
|
|
82
81
|
yield `...{ `;
|
|
83
82
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (enableCodeFeatures) {
|
|
88
|
-
yield* codes;
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
yield (0, muggle_string_1.toString)(codes);
|
|
92
|
-
}
|
|
83
|
+
yield* (0, wrapWith_1.wrapWith)('template', prop.loc.start.offset, prop.loc.end.offset, codeFeatures_1.codeFeatures.verification, ...(prop.arg
|
|
84
|
+
? (0, objectProperty_1.generateObjectProperty)(options, ctx, propName, prop.arg.loc.start.offset, features, shouldCamelize)
|
|
85
|
+
: (0, wrapWith_1.wrapWith)('template', prop.loc.start.offset, prop.loc.start.offset + 'v-model'.length, codeFeatures_1.codeFeatures.withoutHighlightAndCompletion, propName)), `: `, ...(0, wrapWith_1.wrapWith)('template', prop.arg?.loc.start.offset ?? prop.loc.start.offset, prop.arg?.loc.end.offset ?? prop.loc.end.offset, codeFeatures_1.codeFeatures.verification, ...generatePropExp(options, ctx, prop, prop.exp)));
|
|
93
86
|
if (shouldSpread) {
|
|
94
87
|
yield ` }`;
|
|
95
88
|
}
|
|
@@ -100,13 +93,7 @@ function* generateElementProps(options, ctx, node, props, strictPropsCheck, enab
|
|
|
100
93
|
? `[__VLS_tryAsConstant(\`\${${prop.arg.content}}Modifiers\`)]`
|
|
101
94
|
: (0, shared_1.camelize)(propName) + `Modifiers`
|
|
102
95
|
: `modelModifiers`;
|
|
103
|
-
|
|
104
|
-
if (enableCodeFeatures) {
|
|
105
|
-
yield* codes;
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
yield (0, muggle_string_1.toString)(codes);
|
|
109
|
-
}
|
|
96
|
+
yield* (0, elementDirectives_1.generateModifiers)(options, ctx, prop, propertyName);
|
|
110
97
|
yield utils_1.newLine;
|
|
111
98
|
}
|
|
112
99
|
}
|
|
@@ -120,15 +107,9 @@ function* generateElementProps(options, ctx, node, props, strictPropsCheck, enab
|
|
|
120
107
|
if (shouldSpread) {
|
|
121
108
|
yield `...{ `;
|
|
122
109
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (enableCodeFeatures) {
|
|
127
|
-
yield* codes;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
yield (0, muggle_string_1.toString)(codes);
|
|
131
|
-
}
|
|
110
|
+
yield* (0, wrapWith_1.wrapWith)('template', prop.loc.start.offset, prop.loc.end.offset, codeFeatures_1.codeFeatures.verification, ...(0, objectProperty_1.generateObjectProperty)(options, ctx, prop.name, prop.loc.start.offset, features, shouldCamelize), `: `, ...(prop.value
|
|
111
|
+
? generateAttrValue(prop.value, codeFeatures_1.codeFeatures.withoutNavigation)
|
|
112
|
+
: [`true`]));
|
|
132
113
|
if (shouldSpread) {
|
|
133
114
|
yield ` }`;
|
|
134
115
|
}
|
|
@@ -138,74 +119,48 @@ function* generateElementProps(options, ctx, node, props, strictPropsCheck, enab
|
|
|
138
119
|
&& !prop.arg
|
|
139
120
|
&& prop.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) {
|
|
140
121
|
if (prop.exp.loc.source === '$attrs') {
|
|
141
|
-
|
|
142
|
-
ctx.bindingAttrLocs.push(prop.exp.loc);
|
|
143
|
-
}
|
|
122
|
+
ctx.bindingAttrLocs.push(prop.exp.loc);
|
|
144
123
|
}
|
|
145
124
|
else {
|
|
146
|
-
|
|
147
|
-
if (enableCodeFeatures) {
|
|
148
|
-
yield* codes;
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
yield (0, muggle_string_1.toString)(codes);
|
|
152
|
-
}
|
|
125
|
+
yield* (0, wrapWith_1.wrapWith)('template', prop.exp.loc.start.offset, prop.exp.loc.end.offset, codeFeatures_1.codeFeatures.verification, `...`, ...generatePropExp(options, ctx, prop, prop.exp));
|
|
153
126
|
yield `,${utils_1.newLine}`;
|
|
154
127
|
}
|
|
155
128
|
}
|
|
156
129
|
}
|
|
157
130
|
}
|
|
158
|
-
function* generatePropExp(options, ctx, prop, exp
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
if (!isShorthand) { // vue 3.4+
|
|
165
|
-
yield* (0, interpolation_1.generateInterpolation)(options, ctx, 'template', features, exp.loc.source, exp.loc.start.offset, `(`, `)`);
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
const propVariableName = (0, shared_1.camelize)(exp.loc.source);
|
|
169
|
-
if (utils_1.identifierRegex.test(propVariableName)) {
|
|
170
|
-
const isDestructuredProp = options.destructuredPropNames.has(propVariableName);
|
|
171
|
-
const isTemplateRef = options.templateRefNames.has(propVariableName);
|
|
172
|
-
const codes = (0, camelized_1.generateCamelized)(exp.loc.source, 'template', exp.loc.start.offset, features);
|
|
173
|
-
if (ctx.hasLocalVariable(propVariableName) || isDestructuredProp) {
|
|
174
|
-
yield* codes;
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
ctx.accessExternalVariable(propVariableName, exp.loc.start.offset);
|
|
178
|
-
if (isTemplateRef) {
|
|
179
|
-
yield `__VLS_unref(`;
|
|
180
|
-
yield* codes;
|
|
181
|
-
yield `)`;
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
yield `__VLS_ctx.`;
|
|
185
|
-
yield* codes;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
if (enableCodeFeatures) {
|
|
189
|
-
ctx.inlayHints.push((0, inlayHints_1.createVBindShorthandInlayHintInfo)(prop.loc, propVariableName));
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
131
|
+
function* generatePropExp(options, ctx, prop, exp) {
|
|
132
|
+
if (!exp) {
|
|
133
|
+
yield `{}`;
|
|
134
|
+
}
|
|
135
|
+
else if (prop.arg?.loc.start.offset !== prop.exp?.loc.start.offset) {
|
|
136
|
+
yield* (0, interpolation_1.generateInterpolation)(options, ctx, 'template', codeFeatures_1.codeFeatures.all, exp.loc.source, exp.loc.start.offset, `(`, `)`);
|
|
193
137
|
}
|
|
194
138
|
else {
|
|
195
|
-
|
|
139
|
+
const propVariableName = (0, shared_1.camelize)(exp.loc.source);
|
|
140
|
+
if (utils_1.identifierRegex.test(propVariableName)) {
|
|
141
|
+
const codes = (0, camelized_1.generateCamelized)(exp.loc.source, 'template', exp.loc.start.offset, codeFeatures_1.codeFeatures.withoutHighlightAndCompletion);
|
|
142
|
+
if (options.destructuredPropNames.has(propVariableName) || ctx.hasLocalVariable(propVariableName)) {
|
|
143
|
+
yield* codes;
|
|
144
|
+
}
|
|
145
|
+
else if (options.templateRefNames.has(propVariableName)) {
|
|
146
|
+
yield `__VLS_unref(`;
|
|
147
|
+
yield* codes;
|
|
148
|
+
yield `)`;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
ctx.accessExternalVariable(propVariableName, exp.loc.start.offset);
|
|
152
|
+
yield `__VLS_ctx.`;
|
|
153
|
+
yield* codes;
|
|
154
|
+
}
|
|
155
|
+
ctx.inlayHints.push((0, inlayHints_1.createVBindShorthandInlayHintInfo)(prop.loc, propVariableName));
|
|
156
|
+
}
|
|
196
157
|
}
|
|
197
158
|
}
|
|
198
|
-
function* generateAttrValue(
|
|
199
|
-
const quote =
|
|
159
|
+
function* generateAttrValue(node, features) {
|
|
160
|
+
const quote = node.loc.source.startsWith("'") ? "'" : '"';
|
|
161
|
+
const offset = (0, shared_2.getAttributeValueOffset)(node);
|
|
200
162
|
yield quote;
|
|
201
|
-
|
|
202
|
-
let content = attrNode.loc.source;
|
|
203
|
-
if ((content.startsWith('"') && content.endsWith('"'))
|
|
204
|
-
|| (content.startsWith("'") && content.endsWith("'"))) {
|
|
205
|
-
start++;
|
|
206
|
-
content = content.slice(1, -1);
|
|
207
|
-
}
|
|
208
|
-
yield* (0, unicode_1.generateUnicode)(content, start, features);
|
|
163
|
+
yield* (0, unicode_1.generateUnicode)(node.content, offset, features);
|
|
209
164
|
yield quote;
|
|
210
165
|
}
|
|
211
166
|
function getShouldCamelize(options, prop, propName) {
|
|
@@ -60,10 +60,10 @@ declare function generate(options: TemplateCodegenOptions): {
|
|
|
60
60
|
offset: number;
|
|
61
61
|
}[]>;
|
|
62
62
|
currentComponent: {
|
|
63
|
-
ctxVar: string;
|
|
64
|
-
|
|
63
|
+
get ctxVar(): string;
|
|
64
|
+
get propsVar(): string;
|
|
65
65
|
} | undefined;
|
|
66
|
-
singleRootElTypes: string
|
|
66
|
+
singleRootElTypes: Set<string>;
|
|
67
67
|
singleRootNodes: Set<import("@vue/compiler-dom").ElementNode | null>;
|
|
68
68
|
addTemplateRef(name: string, typeExp: string, offset: number): void;
|
|
69
69
|
accessExternalVariable(name: string, offset?: number): void;
|
|
@@ -73,7 +73,7 @@ function* generateSlots(options, ctx) {
|
|
|
73
73
|
yield* (0, objectProperty_1.generateObjectProperty)(options, ctx, slot.name, slot.offset, codeFeatures_1.codeFeatures.navigation);
|
|
74
74
|
}
|
|
75
75
|
else {
|
|
76
|
-
yield* (0, wrapWith_1.wrapWith)(slot.tagRange[0], slot.tagRange[1], codeFeatures_1.codeFeatures.navigation, `default`);
|
|
76
|
+
yield* (0, wrapWith_1.wrapWith)('template', slot.tagRange[0], slot.tagRange[1], codeFeatures_1.codeFeatures.navigation, `default`);
|
|
77
77
|
}
|
|
78
78
|
yield `?: (props: typeof ${slot.propsVar}) => any }`;
|
|
79
79
|
}
|
|
@@ -127,7 +127,7 @@ function* generateTemplateRefs(options, ctx) {
|
|
|
127
127
|
}
|
|
128
128
|
function* generateRootEl(ctx) {
|
|
129
129
|
yield `type __VLS_RootEl = `;
|
|
130
|
-
if (ctx.singleRootElTypes.
|
|
130
|
+
if (ctx.singleRootElTypes.size && !ctx.singleRootNodes.has(null)) {
|
|
131
131
|
for (const type of ctx.singleRootElTypes) {
|
|
132
132
|
yield `${utils_1.newLine}| ${type}`;
|
|
133
133
|
}
|