Skip to content

Commit 317b0cc

Browse files
committed
refactor(component-meta): read node directly instead of creating sub ast
1 parent e5eecb1 commit 317b0cc

File tree

3 files changed

+41
-28
lines changed

3 files changed

+41
-28
lines changed

Diff for: packages/component-meta/lib/base.ts

+26-24
Original file line numberDiff line numberDiff line change
@@ -328,9 +328,10 @@ ${commandLine.vueOptions.target < 3 ? vue2TypeHelpersCode : typeHelpersCode}
328328

329329
// fill defaults
330330
const printer = ts.createPrinter(checkerOptions.printer);
331-
const snapshot = language.scripts.get(componentPath)?.snapshot!;
331+
const sourceScript = language.scripts.get(componentPath)!;
332+
const { snapshot } = sourceScript;
332333

333-
const vueFile = language.scripts.get(componentPath)?.generated?.root;
334+
const vueFile = sourceScript.generated?.root;
334335
const vueDefaults = vueFile && exportName === 'default'
335336
? (vueFile instanceof vue.VueVirtualCode ? readVueComponentDefaultProps(vueFile, printer, ts) : {})
336337
: {};
@@ -674,9 +675,9 @@ function createSchemaResolvers(
674675
}
675676
function getDeclaration(declaration: ts.Declaration): Declaration | undefined {
676677
const fileName = declaration.getSourceFile().fileName;
677-
const sourceFile = language.scripts.get(fileName);
678-
if (sourceFile?.generated) {
679-
const script = sourceFile.generated.languagePlugin.typescript?.getServiceScript(sourceFile.generated.root);
678+
const sourceScript = language.scripts.get(fileName);
679+
if (sourceScript?.generated) {
680+
const script = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
680681
if (script) {
681682
for (const [sourceScript, map] of language.maps.forEach(script.code)) {
682683
for (const [start] of map.toSourceLocation(declaration.getStart())) {
@@ -711,7 +712,10 @@ function readVueComponentDefaultProps(
711712
printer: ts.Printer | undefined,
712713
ts: typeof import('typescript')
713714
) {
714-
let result: Record<string, { default?: string, required?: boolean; }> = {};
715+
let result: Record<string, {
716+
default?: string;
717+
required?: boolean;
718+
}> = {};
715719

716720
scriptSetupWorker();
717721
scriptWorker();
@@ -720,16 +724,16 @@ function readVueComponentDefaultProps(
720724

721725
function scriptSetupWorker() {
722726

723-
const sfc = root._sfc;
724-
const codegen = vue.tsCodegen.get(sfc);
725-
const scriptSetupRanges = codegen?.scriptSetupRanges.get();
726-
727-
if (sfc.scriptSetup && scriptSetupRanges?.withDefaults?.arg) {
727+
const ast = root._sfc.scriptSetup?.ast;
728+
if (!ast) {
729+
return;
730+
}
728731

729-
const defaultsText = sfc.scriptSetup.content.slice(scriptSetupRanges.withDefaults.arg.start, scriptSetupRanges.withDefaults.arg.end);
730-
const ast = ts.createSourceFile('/tmp.' + sfc.scriptSetup.lang, '(' + defaultsText + ')', ts.ScriptTarget.Latest);
731-
const obj = findObjectLiteralExpression(ast);
732+
const codegen = vue.tsCodegen.get(root._sfc);
733+
const scriptSetupRanges = codegen?.scriptSetupRanges.get();
732734

735+
if (scriptSetupRanges?.withDefaults?.argNode) {
736+
const obj = findObjectLiteralExpression(scriptSetupRanges.withDefaults.argNode);
733737
if (obj) {
734738
for (const prop of obj.properties) {
735739
if (ts.isPropertyAssignment(prop)) {
@@ -743,19 +747,17 @@ function readVueComponentDefaultProps(
743747
}
744748
}
745749
}
746-
} else if (sfc.scriptSetup && scriptSetupRanges?.defineProps?.arg) {
747-
const defaultsText = sfc.scriptSetup.content.slice(scriptSetupRanges.defineProps.arg.start, scriptSetupRanges.defineProps.arg.end);
748-
const ast = ts.createSourceFile('/tmp.' + sfc.scriptSetup.lang, '(' + defaultsText + ')', ts.ScriptTarget.Latest);
749-
const obj = findObjectLiteralExpression(ast);
750-
750+
}
751+
else if (scriptSetupRanges?.defineProps?.argNode) {
752+
const obj = findObjectLiteralExpression(scriptSetupRanges.defineProps.argNode);
751753
if (obj) {
752754
result = {
753755
...result,
754756
...resolvePropsOption(ast, obj, printer, ts),
755757
};
756758
}
757-
} else if (sfc.scriptSetup && scriptSetupRanges?.defineProps?.destructured) {
758-
const ast = sfc.scriptSetup.ast;
759+
}
760+
else if (scriptSetupRanges?.defineProps?.destructured) {
759761
for (const [prop, initializer] of scriptSetupRanges.defineProps.destructured) {
760762
if (initializer) {
761763
const expText = printer?.printNode(ts.EmitHint.Expression, initializer, ast) ?? initializer.getText(ast);
@@ -780,10 +782,10 @@ function readVueComponentDefaultProps(
780782

781783
function scriptWorker() {
782784

783-
const descriptor = root._sfc;
785+
const sfc = root._sfc;
784786

785-
if (descriptor.script) {
786-
const scriptResult = readTsComponentDefaultProps(descriptor.script.lang, descriptor.script.content, 'default', printer, ts);
787+
if (sfc.script) {
788+
const scriptResult = readTsComponentDefaultProps(sfc.script.lang, sfc.script.content, 'default', printer, ts);
787789
for (const [key, value] of Object.entries(scriptResult)) {
788790
result[key] = value;
789791
}

Diff for: packages/language-core/lib/codegen/utils/index.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ export function collectVars(
4141
export function collectIdentifiers(
4242
ts: typeof import('typescript'),
4343
node: ts.Node,
44-
results: Array<{ id: ts.Identifier, isRest: boolean, initializer: ts.Expression | undefined; }> = [],
44+
results: {
45+
id: ts.Identifier,
46+
isRest: boolean,
47+
initializer: ts.Expression | undefined;
48+
}[] = [],
4549
isRest = false,
4650
initializer: ts.Expression | undefined = undefined
4751
) {

Diff for: packages/language-core/lib/parsers/scriptSetupRanges.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,14 @@ type DefineProps = CallExpressionRange & {
2727
destructured?: Map<string, ts.Expression | undefined>;
2828
destructuredRest?: string;
2929
statement: TextRange;
30+
// used by component-meta
31+
argNode?: ts.Expression;
3032
};
3133

32-
type WithDefaults = Pick<CallExpressionRange, 'callExp' | 'exp' | 'arg'>;
34+
type WithDefaults = Omit<CallExpressionRange, 'typeArg'> & {
35+
// used by component-meta
36+
argNode?: ts.Expression;
37+
};
3338

3439
type DefineEmits = CallExpressionRange & {
3540
name?: string;
@@ -281,7 +286,8 @@ export function parseScriptSetupRanges(
281286
else if (vueCompilerOptions.macros.defineProps.includes(callText)) {
282287
defineProps = {
283288
...parseCallExpression(node),
284-
statement: getStatementRange(ts, parents, node, ast)
289+
statement: getStatementRange(ts, parents, node, ast),
290+
argNode: node.arguments[0]
285291
};
286292
if (ts.isVariableDeclaration(parent)) {
287293
if (ts.isObjectBindingPattern(parent.name)) {
@@ -316,7 +322,8 @@ export function parseScriptSetupRanges(
316322
withDefaults = {
317323
callExp: _getStartEnd(node),
318324
exp: _getStartEnd(node.expression),
319-
arg: arg ? _getStartEnd(arg) : undefined
325+
arg: arg ? _getStartEnd(arg) : undefined,
326+
argNode: arg
320327
};
321328
}
322329
else if (vueCompilerOptions.macros.defineEmits.includes(callText)) {

0 commit comments

Comments
 (0)