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