From 20ecf4e0cc21f3620e6618edcdc8bea67c555ee5 Mon Sep 17 00:00:00 2001 From: Sandro Circi Date: Wed, 26 Aug 2026 01:43:10 +0200 Subject: [PATCH] fix(meta): handle unresolved imports in getComponentMeta function --- packages/core/src/plugins/meta/checker.ts | 5 +++- packages/vue/test/meta.spec.ts | 32 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 packages/vue/test/meta.spec.ts diff --git a/packages/core/src/plugins/meta/checker.ts b/packages/core/src/plugins/meta/checker.ts index bd23db82..2599328e 100644 --- a/packages/core/src/plugins/meta/checker.ts +++ b/packages/core/src/plugins/meta/checker.ts @@ -23,7 +23,10 @@ export function createChecker(dirs: ComponentsDir[], rootDir = process.cwd(), ts const checker = { ...metaChecker, - getComponentMeta: (componentPath: string): CompodiumMeta => { + getComponentMeta: (componentPath: string): CompodiumMeta | undefined => { + // A component that is not on disk becomes an unresolved import inside the virtual meta entry + if (!existsSync(componentPath)) return undefined + const meta = getComponentMeta(metaChecker, componentPath) return { props: meta.props diff --git a/packages/vue/test/meta.spec.ts b/packages/vue/test/meta.spec.ts new file mode 100644 index 00000000..da40a8d4 --- /dev/null +++ b/packages/vue/test/meta.spec.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from 'vitest' + +import { fileURLToPath } from 'node:url' +import { joinURL } from 'ufo' +import { dirname } from 'pathe' + +import { createViteServer } from './utils' + +const componentPath = (name: string) => fileURLToPath(joinURL(dirname(import.meta.url), './fixtures/basic/src/components', name)) + +describe('meta api', async () => { + const server = await createViteServer('./fixtures/basic') + + it('describes a component it can resolve', async () => { + const resp = await server.get('/__compodium__/api/meta').query({ component: componentPath('BasicComponent.vue') }) + + expect(resp.status).toBe(200) + expect(resp.body.props.map((prop: { name: string }) => prop.name)).toContain('foo') + }, 30_000) + + it('answers 404 for a component that does not exist', async () => { + const resp = await server.get('/__compodium__/api/meta').query({ component: componentPath('MissingComponent.vue') }) + + expect(resp.status).toBe(404) + }) + + it('answers 400 when no component is named', async () => { + const resp = await server.get('/__compodium__/api/meta') + + expect(resp.status).toBe(400) + }) +})