Skip to content

Commit

Permalink
fix #1029, rest args disposing unowned root
Browse files Browse the repository at this point in the history
  • Loading branch information
ryansolid committed Jun 2, 2022
1 parent c23f730 commit 0cf1348
Show file tree
Hide file tree
Showing 5 changed files with 128 additions and 31 deletions.
54 changes: 27 additions & 27 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -45,7 +45,7 @@
"ncp": "2.0.0",
"npm-run-all": "^4.1.5",
"rimraf": "^3.0.2",
"rollup": "^2.62.0",
"rollup": "^2.75.5",
"rollup-plugin-cleanup": "^3.2.1",
"rollup-plugin-copy": "^3.4.0",
"shelljs": "^0.8.4",
Expand Down
79 changes: 79 additions & 0 deletions packages/solid-ssr/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 12 additions & 3 deletions packages/solid/src/reactive/signal.ts
Expand Up @@ -106,18 +106,27 @@ export type RootFunction<T> = (dispose: () => void) => T;
export function createRoot<T>(fn: RootFunction<T>, detachedOwner?: Owner): T {
const listener = Listener,
owner = Owner,
unowned = fn.length === 0,
root: Owner =
fn.length === 0 && !"_SOLID_DEV_"
unowned && !"_SOLID_DEV_"
? UNOWNED
: { owned: null, cleanups: null, context: null, owner: detachedOwner || owner };
: { owned: null, cleanups: null, context: null, owner: detachedOwner || owner },
updateFn = unowned
? "_SOLID_DEV_"
? () =>
fn(() => {
throw new Error("Dispose method must be an explicit argument to createRoot function");
})
: fn
: () => fn(() => cleanNode(root));

if ("_SOLID_DEV_" && owner) root.name = `${(owner as Computation<any>).name}-r${rootCount++}`;

Owner = root;
Listener = null;

try {
return runUpdates(() => fn(() => cleanNode(root)), true)!;
return runUpdates(updateFn as () => T, true)!;
} finally {
Listener = listener;
Owner = owner;
Expand Down
9 changes: 9 additions & 0 deletions packages/solid/test/signals.spec.ts
Expand Up @@ -382,6 +382,15 @@ describe("onCleanup", () => {
disposer!();
expect(temp).toBe("disposed");
});
test("Failed Root disposal from arguments", () => {
let temp: string | undefined, disposer: () => void;
createRoot((...args) => {
disposer = args[0];
onCleanup(() => (temp = "disposed"));
});
expect(temp).toBeUndefined();
expect(disposer!).toThrow();
});
});

describe("onError", () => {
Expand Down

0 comments on commit 0cf1348

Please sign in to comment.