diff --git a/CHANGELOG.md b/CHANGELOG.md
index fe4a5550..063393a2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,7 @@ and adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
### Fixes
+- What a Svelte component's instance `
+
+
{items.length}
+`,
+ 'src/lib/examples/item-demo.svelte': `
+
+{label}
+`,
+ 'src/components/TabItem.vue': `
+
+
+`,
+ 'src/extensions/code-block.ts': `import { isActive } from "@/tiptap/core";
+
+export function active(state: unknown) {
+ return isActive(state);
+}
+`,
+ 'src/components/CrudTable.vue': `
+
+
+`,
+ 'src/pages/GroupDataPage.vue': `
+
+{{ config }}
+`,
+ };
+ for (const [rel, content] of Object.entries(files)) {
+ fs.mkdirSync(path.dirname(path.join(root, rel)), { recursive: true });
+ fs.writeFileSync(path.join(root, rel), content);
+ }
+ cg = await CodeGraph.init(root, { index: true });
+});
+
+afterAll(() => {
+ cg?.close();
+ if (root) fs.rmSync(root, { recursive: true, force: true });
+});
+
+const targetsFrom = (file: string) => {
+ const ids = cg.getNodesInFile(file).map((n) => n.id);
+ return cg.getOutgoingEdgesFrom(ids).filter((e) => e.kind !== 'contains').map((e) => cg.getNode(e.target)!).map((t) => `${t.filePath}:${t.name}`);
+};
+
+describe('single-file component declarations', () => {
+ it('are private to the component', () => {
+ expect(targetsFrom('src/lib/examples/item-demo.svelte')).not.toContain('src/lib/examples/attachment-group.svelte:Item');
+ expect(targetsFrom('src/extensions/code-block.ts')).not.toContain('src/components/TabItem.vue:isActive');
+ });
+
+ it('except a type a Vue