diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..8223000 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,19 @@ +{ + "permissions": { + "allow": [ + "Bash(npm show:*)", + "Bash(npm search:*)", + "Bash(curl -s https://api.github.com/repos/rbxts-flamework/components/releases/latest)", + "Bash(curl -s https://api.github.com/repos/rbxts-flamework/transformer/releases/latest)", + "Bash(python3 -c \"import json,sys; r=json.load\\(sys.stdin\\); print\\(r.get\\(''''tag_name''''\\), r.get\\(''''html_url''''\\)\\)\")", + "Bash(python3 -c \"import json,sys; r=json.load\\(sys.stdin\\); [print\\(a[''''name''''], a[''''browser_download_url'''']\\) for a in r.get\\(''''assets'''',[]\\)]\")", + "Bash(curl -s \"https://api.github.com/repos/rbxts-flamework/transformer\")", + "Bash(python3 -c \"import json,sys; r=json.load\\(sys.stdin\\); print\\(r.get\\(''''clone_url''''\\)\\)\")", + "Read(//d/Projects/flamework-transformer/**)", + "Bash(npm install:*)", + "Bash(python3 -c \"import json,sys; p=json.load\\(sys.stdin\\); print\\(p.get\\(''''scripts'''',{}\\)\\)\")", + "Bash(npm run:*)", + "Bash(npx rbxtsc:*)" + ] + } +} diff --git a/src/components.ts b/src/components.ts index aeb8659..4807b4d 100644 --- a/src/components.ts +++ b/src/components.ts @@ -216,6 +216,8 @@ export class Components implements OnInit, OnStart { } }; + const ancestryConnections = new Map(); + const instanceAdded = (instance: Instance) => { if (predicate !== undefined && !predicate(instance)) { return; @@ -231,8 +233,31 @@ export class Components implements OnInit, OnStart { tracker.setHasTag(instance, true); }; - CollectionService.GetInstanceAddedSignal(config.tag).Connect(instanceAdded); + const instanceTagged = (instance: Instance) => { + instanceAdded(instance); + + if (!ancestryConnections.has(instance)) { + ancestryConnections.set( + instance, + instance.AncestryChanged.Connect(() => { + if (tracker.isTracked(instance)) { + tracker.untrackInstance(instance, listener); + tracker.setHasTag(instance, false); + this.removeComponent(instance, ctor); + } + instanceAdded(instance); + }), + ); + } + }; + + CollectionService.GetInstanceAddedSignal(config.tag).Connect(instanceTagged); CollectionService.GetInstanceRemovedSignal(config.tag).Connect((instance) => { + const conn = ancestryConnections.get(instance); + if (conn) { + conn.Disconnect(); + ancestryConnections.delete(instance); + } tracker.untrackInstance(instance, listener); tracker.setHasTag(instance, false); this.removeComponent(instance, ctor); @@ -241,7 +266,7 @@ export class Components implements OnInit, OnStart { for (const instance of CollectionService.GetTagged(config.tag)) { safeCall( [`[Flamework] Failed to instantiate '${ctor}' for`, instance, `[${instance.GetFullName()}]`], - () => instanceAdded(instance), + () => instanceTagged(instance), false, ); }