From 0ee7b771daf9f7fd8ad1da67cbea4cfbd7cec801 Mon Sep 17 00:00:00 2001 From: cha0s Date: Sat, 23 Jan 2021 17:30:15 -0600 Subject: [PATCH] feat: treeToResourcePaths --- packages/core/src/models/project.js | 2 +- packages/core/src/server/index.js | 2 +- packages/core/src/state/projects.js | 2 +- packages/core/src/{tree-utils.js => tree.js} | 38 ++++++++++++++------ packages/core/test/tree.js | 14 +++++++- 5 files changed, 43 insertions(+), 15 deletions(-) rename packages/core/src/{tree-utils.js => tree.js} (80%) diff --git a/packages/core/src/models/project.js b/packages/core/src/models/project.js index 55ec595..9f6ba4f 100644 --- a/packages/core/src/models/project.js +++ b/packages/core/src/models/project.js @@ -4,7 +4,7 @@ import {promisify} from 'util'; import {Model, Sequelize, Types} from '@latus/db/server'; import glob from 'glob'; -import {pathsToTree} from '../tree-utils'; +import {pathsToTree} from '../tree'; export default () => class Project extends Model { diff --git a/packages/core/src/server/index.js b/packages/core/src/server/index.js index 377f2d4..e20e073 100644 --- a/packages/core/src/server/index.js +++ b/packages/core/src/server/index.js @@ -4,7 +4,7 @@ import {promisify} from 'util'; import {decorateWithLatus, gatherWithLatus} from '@latus/core'; -import {treeToPaths} from '../tree-utils'; +import {treeToPaths} from '../tree'; const readFile = promisify(fs.readFile).bind(fs); const stat = promisify(fs.stat).bind(fs); diff --git a/packages/core/src/state/projects.js b/packages/core/src/state/projects.js index fd934c8..9a94cac 100644 --- a/packages/core/src/state/projects.js +++ b/packages/core/src/state/projects.js @@ -6,7 +6,7 @@ import { import { addPathToTree, removePathFromTree, -} from '../tree-utils'; +} from '../tree'; export const projectsSelector = (state) => state.projects; diff --git a/packages/core/src/tree-utils.js b/packages/core/src/tree.js similarity index 80% rename from packages/core/src/tree-utils.js rename to packages/core/src/tree.js index 89fb6d0..c595dfe 100644 --- a/packages/core/src/tree-utils.js +++ b/packages/core/src/tree.js @@ -4,7 +4,7 @@ import natsort from 'natsort'; import { getFlatDataFromTree, getTreeFromFlatData, - // removeNodeAtPath, + walk, } from 'react-sortable-tree'; const getKey = ({path}) => path; @@ -16,16 +16,6 @@ const getParentKey = ({path}) => { export const pathToNode = (path) => ({path, label: basename(path)}); -export const treeToPaths = (tree) => ( - getFlatDataFromTree({ - getNodeKey: ({node: {path}}) => path, - ignoreCollapsed: false, - treeData: tree, - }) - .map(({path}) => path.pop()) - .sort(natsort({insensitive: true})) -); - export const pathsToTree = (paths) => ( getTreeFromFlatData({ flatData: paths @@ -37,6 +27,32 @@ export const pathsToTree = (paths) => ( }) ); +export const treeToResourcePaths = (tree) => { + const files = []; + walk({ + callback: ({node: {children, path}}) => { + if (!children) { + files.push(path); + } + }, + getNodeKey: ({node: {path}}) => path, + ignoreCollapsed: false, + treeData: tree, + }); + return files + .sort(natsort({insensitive: true})); +}; + +export const treeToPaths = (tree) => ( + getFlatDataFromTree({ + getNodeKey: ({node: {path}}) => path, + ignoreCollapsed: false, + treeData: tree, + }) + .map(({path}) => path.pop()) + .sort(natsort({insensitive: true})) +); + export const addPathToTree = (tree, path) => { const paths = treeToPaths(tree); const parts = path.split('/'); diff --git a/packages/core/test/tree.js b/packages/core/test/tree.js index 2f94981..e24f0d2 100644 --- a/packages/core/test/tree.js +++ b/packages/core/test/tree.js @@ -4,8 +4,9 @@ import { addPathToTree, pathsToTree, removePathFromTree, + treeToResourcePaths, treeToPaths, -} from '../src/tree-utils'; +} from '../src/tree'; it('can get a tree from paths', () => { expect(pathsToTree(['/foo', '/bar', '/bar/baz.txt', '/boo'])) @@ -18,6 +19,17 @@ it('can get a tree from paths', () => { ]); }); +it('can get resource paths from a tree', () => { + expect(treeToResourcePaths([ + {path: '/foo', label: 'foo'}, + {path: '/bar', label: 'bar', children: [ + {path: '/bar/baz.txt', label: 'baz.txt'}, + ]}, + {path: '/boo', label: 'boo'}, + ])) + .to.deep.equal(['/bar/baz.txt', '/boo', '/foo']); +}); + it('can get paths from a tree', () => { expect(treeToPaths([ {path: '/foo', label: 'foo'},