diff --git a/.changeset/stale-regions-go.md b/.changeset/stale-regions-go.md new file mode 100644 index 0000000..b1cf253 --- /dev/null +++ b/.changeset/stale-regions-go.md @@ -0,0 +1,5 @@ +--- +'svelte-tree-view': minor +--- + +invert isCircularNode return value for node collapsing, make DefaultNode ESM export, refactor stores into one diff --git a/package.json b/package.json index 482e163..911d722 100644 --- a/package.json +++ b/package.json @@ -20,24 +20,24 @@ "devDependencies": { "@changesets/cli": "^2.29.5", "@eslint/compat": "^1.3.1", - "@eslint/js": "^9.30.1", - "@typescript-eslint/eslint-plugin": "^8.35.1", - "@typescript-eslint/parser": "^8.35.1", + "@eslint/js": "^9.31.0", + "@typescript-eslint/eslint-plugin": "^8.37.0", + "@typescript-eslint/parser": "^8.37.0", "concurrently": "^9.2.0", - "eslint": "^9.30.1", - "eslint-config-prettier": "^10.1.5", - "eslint-plugin-prettier": "^5.5.1", + "eslint": "^9.31.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.3", "eslint-plugin-promise": "^7.2.1", - "eslint-plugin-svelte": "^3.10.1", + "eslint-plugin-svelte": "^3.11.0", "globals": "^16.3.0", "husky": "^9.1.7", "prettier": "^3.6.2", "prettier-plugin-svelte": "^3.4.0", - "prettier-plugin-tailwindcss": "^0.6.13", + "prettier-plugin-tailwindcss": "^0.6.14", "tslib": "^2.8.1", "typescript": "^5.8.3", - "typescript-eslint": "^8.35.1", - "vite": "^7.0.2", + "typescript-eslint": "^8.37.0", + "vite": "^7.0.5", "vite-plugin-dts": "^4.5.4" } } \ No newline at end of file diff --git a/packages/site/package.json b/packages/site/package.json index c0e3e36..d1404b2 100644 --- a/packages/site/package.json +++ b/packages/site/package.json @@ -19,10 +19,10 @@ }, "devDependencies": { "@sveltejs/adapter-static": "^3.0.8", - "@sveltejs/kit": "2.22.2", - "@sveltejs/vite-plugin-svelte": "^5.1.0", + "@sveltejs/kit": "2.25.1", + "@sveltejs/vite-plugin-svelte": "^6.1.0", "@tailwindcss/vite": "^4.1.11", - "svelte": "^5.35.4", + "svelte": "^5.36.10", "svelte-preprocess": "^6.0.3", "svelte-tree-view": "workspace:*", "tailwindcss": "^4.1.11" diff --git a/packages/site/src/components/DiffValue.svelte b/packages/site/src/components/DiffValue.svelte index 2bae307..940d3ef 100644 --- a/packages/site/src/components/DiffValue.svelte +++ b/packages/site/src/components/DiffValue.svelte @@ -1,13 +1,11 @@ -
+
- {#if $propsObj.showLogButton} + {#if $viewProps.showLogButton} {/if} - {#if $propsObj.showCopyButton} + {#if $viewProps.showCopyButton}
- {#if $propsObj.showLogButton} + {#if $viewProps.showLogButton} {/if} - {#if $propsObj.showCopyButton} + {#if $viewProps.showCopyButton} {/if}
diff --git a/packages/svelte-tree-view/src/lib/TreeView.svelte b/packages/svelte-tree-view/src/lib/TreeView.svelte index 491c588..26d2329 100644 --- a/packages/svelte-tree-view/src/lib/TreeView.svelte +++ b/packages/svelte-tree-view/src/lib/TreeView.svelte @@ -3,9 +3,8 @@ import { get } from 'svelte/store' import TreeViewNode from './TreeViewNode.svelte' - import { createPropsStore, createRootElementStore, createTreeStore } from './stores' + import { createStore, type TreeStore } from './store.svelte' - import type { Stores } from './stores' import type { Props, TreeViewProps } from './types' const DEFAULT_RECURSION_OPTS = { @@ -38,20 +37,14 @@ onUpdate } let rootElement: HTMLElement - const propsStore = createPropsStore(propsObj) - const rootElementStore = createRootElementStore() - const treeStore = createTreeStore(propsStore) + const store = createStore(propsObj) const newRecOpts = $derived({ ...DEFAULT_RECURSION_OPTS, ...recursionOpts }) - const treeChildren = $derived(treeStore.rootNode.children) + const treeChildren = $derived(store.rootNode.children) - setContext('svelte-tree-view', { - propsStore, - rootElementStore, - treeStore - }) + setContext('svelte-tree-view', store) onMount(() => { - rootElementStore.set(rootElement) + store.setRootElement(rootElement) }) $effect(() => { @@ -66,19 +59,19 @@ valueFormatter, onUpdate } - propsStore.setProps(propsObj) + store.setProps(propsObj) }) $effect(() => { - const oldRecOptions = get(propsStore.recursionOpts) + const oldRecOptions = get(store.recursionOpts) // Destruct recursionOpts to unwrap from proxy const opts = { ...newRecOpts } const newData = data - const shouldRecompute = oldRecOptions?.shouldExpandNode !== opts.shouldExpandNode + const recomputeExpandNode = oldRecOptions?.shouldExpandNode !== opts.shouldExpandNode // Use untrack to prevent triggering this effect again untrack(() => { - treeStore.recompute(newData, opts, shouldRecompute) - propsStore.setProps(propsObj) + store.createTree(newData, opts, recomputeExpandNode) + store.setProps(propsObj) propsObj.recursionOpts = opts }) }) diff --git a/packages/svelte-tree-view/src/lib/TreeViewNode.svelte b/packages/svelte-tree-view/src/lib/TreeViewNode.svelte index 8b81102..0b411e8 100644 --- a/packages/svelte-tree-view/src/lib/TreeViewNode.svelte +++ b/packages/svelte-tree-view/src/lib/TreeViewNode.svelte @@ -3,8 +3,7 @@ import TreeViewNode from './TreeViewNode.svelte' - import type { Stores } from './stores' - import type { TreeNode } from './types' + import type { TreeStore } from './store.svelte' interface Props { id: string @@ -12,41 +11,38 @@ let { id }: Props = $props() - const { treeStore, propsStore, rootElementStore } = getContext('svelte-tree-view') - let { props: propsObj } = propsStore - let node = $state(treeStore.treeMap[id] as TreeNode) - let hasChildren = $derived(node && node.children.length > 0) + const { rootElement, treeMap, viewProps, ...rest } = getContext('svelte-tree-view') + let node = $derived(treeMap[id]) + let hasChildren = $derived(node.children.length > 0) let nodeProps = $derived({ node, - getTreeContext: () => getContext('svelte-tree-view'), + getTreeContext: () => getContext('svelte-tree-view'), TreeViewNode: TreeViewNode, handleLogNode() { - console.info('%c [svelte-tree-view]: Property added to window._node', 'color: #b8e248') console.log(node.getValue()) try { - if (typeof window !== 'undefined') window._node = node.getValue() + window._node = node.getValue() + console.info('%c [svelte-tree-view]: Property added to window._node', 'color: #b8e248') } catch (err) { - console.error('Failed to set _node, window was undefined') + console.error('[svelte-tree-view]: handleLogNode() errored', err) } }, handleCopyNodeToClipboard() { try { navigator.clipboard.writeText(JSON.stringify(node.getValue())) } catch (err) { - console.error('Copying node to clipboard failed: ', err) + console.error('[svelte-tree-view]: handleCopyNodeToClipboard() errored', err) } }, handleToggleCollapse() { if (hasChildren) { - treeStore.toggleCollapse(node.id) + rest.toggleCollapse(node.id) } else if (node.circularOfId) { - treeStore.expandAllNodesToNode(node.circularOfId) - $rootElementStore - ?.querySelector(`li[data-tree-id="${node.circularOfId}"]`) - ?.scrollIntoView() + rest.expandAllNodesToNode(node.circularOfId) + $rootElement?.querySelector(`[data-tree-node-id="${node.circularOfId}"]`)?.scrollIntoView() } } }) -{@render $propsObj.treeNode(nodeProps)} +{@render $viewProps.treeNode(nodeProps)} diff --git a/packages/svelte-tree-view/src/lib/__tests__/TreeView.spec.ts b/packages/svelte-tree-view/src/lib/__tests__/TreeView.spec.ts index 481869a..564670e 100644 --- a/packages/svelte-tree-view/src/lib/__tests__/TreeView.spec.ts +++ b/packages/svelte-tree-view/src/lib/__tests__/TreeView.spec.ts @@ -54,11 +54,11 @@ describe('TreeView', () => { const existingNodeWithValue = iteratedValues.get(val) if (existingNodeWithValue) { node.circularOfId = existingNodeWithValue.id - return false + return true } iteratedValues.set(val, node) } - return true + return false }, shouldExpandNode: () => true }, diff --git a/packages/svelte-tree-view/src/lib/__tests__/__snapshots__/TreeView.spec.ts.snap b/packages/svelte-tree-view/src/lib/__tests__/__snapshots__/TreeView.spec.ts.snap index 22b14b5..d3c9d17 100644 --- a/packages/svelte-tree-view/src/lib/__tests__/__snapshots__/TreeView.spec.ts.snap +++ b/packages/svelte-tree-view/src/lib/__tests__/__snapshots__/TreeView.spec.ts.snap @@ -10,7 +10,7 @@ exports[`TreeView > should render 1`] = `