| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- import _ from "lodash";
- export const s3ContentsToTree = (
- s3Contents,
- props = {},
- reducer: (...args: unknown[]) => Record<string, unknown> = () => ({})
- ) => {
- let __result = [];
- let level = { __result, __prefix: "" };
- props = Object.assign(
- {
- key: "key",
- label: "label",
- children: "children",
- },
- props
- );
- s3Contents.forEach((s3Content) => {
- s3Content.Key.split("/").reduce((r, label, i, a, s3Content) => {
- if (!r[label]) {
- const __prefix = `${r.__prefix ? r.__prefix + "/" : ""}${label}`;
- r[label] = { __result: [], __prefix };
- r.__result.push({
- ...reducer(r, label, i, a),
- [props.key]: __prefix,
- [props.label]: label,
- [props.children]: r[label].__result,
- });
- }
- return r[label];
- }, level);
- });
- return __result;
- };
- type TreeNodeLike = {
- children?: TreeNodeLike[];
- };
- export const getTreeLeafs = <T extends TreeNodeLike>(treeNode: T): T[] => {
- if (treeNode.children?.length) {
- return _.flatMap<T, T>(treeNode.children as T[], getTreeLeafs);
- }
- return [treeNode];
- };
|