diff --git a/.gitignore b/.gitignore index 815441d..52e0af1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,6 @@ node_modules *.tsbuildinfo *.rbxm +*.tgz .DS_Store roblox.d.luau diff --git a/packages/charm/src/core.luau b/packages/charm/src/core.luau index dffba9a..f430260 100644 --- a/packages/charm/src/core.luau +++ b/packages/charm/src/core.luau @@ -349,7 +349,7 @@ local function effect(fn: (dispose: () -> ()) -> ...(() -> ())?): () -> () cleanup = nil :: any, } self.cleanup = effectStop(self) - if activeSub then + if activeSub and config.trackInnerEffects then link(self, activeSub) elseif activeScope then link(self, activeScope) diff --git a/packages/charm/src/flags.luau b/packages/charm/src/flags.luau index 3900394..43475be 100644 --- a/packages/charm/src/flags.luau +++ b/packages/charm/src/flags.luau @@ -12,4 +12,8 @@ return { --- Enforces immutability of atoms by deep-freezing table values. Enabled --- if the optimization level is below 2, which is true in studio. frozen = not isO2, + --- Whether inner effects should clean up after themselves when their + --- parent effect re-runs. This is usually desirable, but can be disabled + --- to revert to the old behavior. Defaults to `true`. + trackInnerEffects = true, } diff --git a/packages/charm/src/index.d.ts b/packages/charm/src/index.d.ts index a8cabeb..cfffd62 100644 --- a/packages/charm/src/index.d.ts +++ b/packages/charm/src/index.d.ts @@ -13,6 +13,7 @@ export type Equals = (current: T, incoming: T) => boolean; export const flags: { strict: boolean; frozen: boolean; + trackInnerEffects: boolean; }; export function atom(value: T, equals?: Equals): Atom;