From 14e586cc77570b08afae5eeef605e978fec287d8 Mon Sep 17 00:00:00 2001 From: Justinas Delinda <8914032+minht11@users.noreply.github.com> Date: Wed, 8 Nov 2023 09:44:02 +0200 Subject: [PATCH] fix(vue): vue regular script block exports not being recognized inside editor (#8998) Co-authored-by: Erika <3019731+Princesseuh@users.noreply.github.com> --- .changeset/two-oranges-knock.md | 5 ++++ packages/integrations/vue/package.json | 1 + packages/integrations/vue/src/editor.cts | 28 +++++++++++++------ .../vue/test/app-entrypoint.test.js | 22 +++++++++++---- .../src/components/Generics.vue | 13 +++++++++ .../src/components/GenericsAndBlocks.vue | 18 ++++++++++++ .../src/components/MultipleScriptBlocks.vue | 18 ++++++++++++ .../app-entrypoint/src/pages/index.astro | 11 ++++++++ pnpm-lock.yaml | 3 ++ 9 files changed, 105 insertions(+), 14 deletions(-) create mode 100644 .changeset/two-oranges-knock.md create mode 100644 packages/integrations/vue/test/fixtures/app-entrypoint/src/components/Generics.vue create mode 100644 packages/integrations/vue/test/fixtures/app-entrypoint/src/components/GenericsAndBlocks.vue create mode 100644 packages/integrations/vue/test/fixtures/app-entrypoint/src/components/MultipleScriptBlocks.vue diff --git a/.changeset/two-oranges-knock.md b/.changeset/two-oranges-knock.md new file mode 100644 index 000000000000..4bf6e8938540 --- /dev/null +++ b/.changeset/two-oranges-knock.md @@ -0,0 +1,5 @@ +--- +'@astrojs/vue': patch +--- + +Adds editor support for Vue non setup script blocks and Vue 3.3 generics. diff --git a/packages/integrations/vue/package.json b/packages/integrations/vue/package.json index 836d4cb91d94..2e0d0a2f6628 100644 --- a/packages/integrations/vue/package.json +++ b/packages/integrations/vue/package.json @@ -51,6 +51,7 @@ "astro-scripts": "workspace:*", "chai": "^4.3.7", "linkedom": "^0.15.1", + "cheerio": "1.0.0-rc.12", "mocha": "^10.2.0", "vite": "^4.4.9", "vue": "^3.3.4" diff --git a/packages/integrations/vue/src/editor.cts b/packages/integrations/vue/src/editor.cts index 29adaa09cad6..0b62e899eed3 100644 --- a/packages/integrations/vue/src/editor.cts +++ b/packages/integrations/vue/src/editor.cts @@ -6,7 +6,7 @@ export function toTSX(code: string, className: string): string { // NOTE: As you can expect, using regexes for this is not exactly the most reliable way of doing things // However, I couldn't figure out a way to do it using Vue's compiler, I tried looking at how Volar does it, but I // didn't really understand everything happening there and it seemed to be pretty Volar-specific. I do believe - // someone more knowledgable on Vue's internals could figure it out, but since this solution is good enough for most + // someone more knowledgeable on Vue's internals could figure it out, but since this solution is good enough for most // Vue components (and it's an improvement over, well, nothing), it's alright, I think try { const parsedResult = parse(code); @@ -18,29 +18,39 @@ export function toTSX(code: string, className: string): string { `; } - if (parsedResult.descriptor.scriptSetup) { - const definePropsType = - parsedResult.descriptor.scriptSetup.content.match(/defineProps<([\s\S]+)>/m); + // Vue supports 2 type of script blocks: setup and non-setup + const regularScriptBlockContent = parsedResult.descriptor.script?.content ?? ''; + const { scriptSetup } = parsedResult.descriptor; + + if (scriptSetup) { + const definePropsType = scriptSetup.content.match(/defineProps<([\S\s]+?)>\s?\(\)/m); + const propsGeneric = scriptSetup.attrs.generic; + const propsGenericType = propsGeneric ? `<${propsGeneric}>` : ''; if (definePropsType) { result = ` - ${parsedResult.descriptor.scriptSetup.content} + ${regularScriptBlockContent} + ${scriptSetup.content} - export default function ${className}__AstroComponent_(_props: ${definePropsType[1]}): any { + export default function ${className}__AstroComponent_${propsGenericType}(_props: ${definePropsType[1]}): any {
} `; } else { - const defineProps = - parsedResult.descriptor.scriptSetup.content.match(/defineProps\([\s\S]+\)/m); + // TODO. Find a way to support generics when using defineProps without passing explicit types. + // Right now something like this `defineProps({ prop: { type: Array as PropType