From 7815983575ff63c1914903206235f81fbab8ac3f Mon Sep 17 00:00:00 2001 From: wattanx Date: Fri, 10 May 2024 22:55:04 +0900 Subject: [PATCH] feat: convert to defineAsyncComponent --- .../src/lib/convertSrc.ts | 4 ++ .../lib/converter/componentsConverter.spec.ts | 50 +++++++++++++++++ .../src/lib/converter/componentsConverter.ts | 54 +++++++++++++++++++ .../src/lib/helpers/node.ts | 2 +- 4 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 packages/vue-script-setup-converter/src/lib/converter/componentsConverter.spec.ts create mode 100644 packages/vue-script-setup-converter/src/lib/converter/componentsConverter.ts diff --git a/packages/vue-script-setup-converter/src/lib/convertSrc.ts b/packages/vue-script-setup-converter/src/lib/convertSrc.ts index b328c77..5c76f93 100644 --- a/packages/vue-script-setup-converter/src/lib/convertSrc.ts +++ b/packages/vue-script-setup-converter/src/lib/convertSrc.ts @@ -14,6 +14,7 @@ import { convertPageMeta } from "./converter/pageMetaConverter"; import { convertProps } from "./converter/propsConverter"; import { convertSetup } from "./converter/setupConverter"; import { convertEmits } from "./converter/emitsConverter"; +import { convertComponents } from "./converter/componentsConverter"; export const convertSrc = (input: string) => { const { @@ -48,6 +49,7 @@ export const convertSrc = (input: string) => { const props = convertProps(callexpression, lang) ?? ""; const emits = convertEmits(callexpression, lang) ?? ""; const statement = convertSetup(callexpression) ?? ""; + const components = convertComponents(callexpression) ?? ""; const statements = project.createSourceFile("new.tsx"); @@ -76,6 +78,8 @@ export const convertSrc = (input: string) => { statements.addStatements(pageMeta); } + statements.addStatements(components); + statements.addStatements(props); statements.addStatements(emits); statements.addStatements(statement); diff --git a/packages/vue-script-setup-converter/src/lib/converter/componentsConverter.spec.ts b/packages/vue-script-setup-converter/src/lib/converter/componentsConverter.spec.ts new file mode 100644 index 0000000..dd1810e --- /dev/null +++ b/packages/vue-script-setup-converter/src/lib/converter/componentsConverter.spec.ts @@ -0,0 +1,50 @@ +import { expect, test } from "vitest"; +import type { CallExpression } from "ts-morph"; +import { ScriptTarget, SyntaxKind, Project } from "ts-morph"; +import { parse } from "@vue/compiler-sfc"; +import { getNodeByKind } from "../helpers/node"; +import { convertComponents } from "./componentsConverter"; + +const parseScript = (input: string, lang: "js" | "ts" = "js") => { + const { + descriptor: { script }, + } = parse(input); + + const project = new Project({ + tsConfigFilePath: "tsconfig.json", + compilerOptions: { + target: ScriptTarget.Latest, + }, + }); + + const sourceFile = project.createSourceFile("s.tsx", script?.content ?? ""); + + const callexpression = getNodeByKind(sourceFile, SyntaxKind.CallExpression); + + const components = convertComponents(callexpression as CallExpression); + + return components; +}; + +test("should be converted to defineAsyncComponent", () => { + const source = `