s3Helper.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import _ from "lodash";
  2. export const s3ContentsToTree = (
  3. s3Contents,
  4. props = {},
  5. reducer: (...args: unknown[]) => Record<string, unknown> = () => ({})
  6. ) => {
  7. let __result = [];
  8. let level = { __result, __prefix: "" };
  9. props = Object.assign(
  10. {
  11. key: "key",
  12. label: "label",
  13. children: "children",
  14. },
  15. props
  16. );
  17. s3Contents.forEach((s3Content) => {
  18. s3Content.Key.split("/").reduce((r, label, i, a, s3Content) => {
  19. if (!r[label]) {
  20. const __prefix = `${r.__prefix ? r.__prefix + "/" : ""}${label}`;
  21. r[label] = { __result: [], __prefix };
  22. r.__result.push({
  23. ...reducer(r, label, i, a),
  24. [props.key]: __prefix,
  25. [props.label]: label,
  26. [props.children]: r[label].__result,
  27. });
  28. }
  29. return r[label];
  30. }, level);
  31. });
  32. return __result;
  33. };
  34. type TreeNodeLike = {
  35. children?: TreeNodeLike[];
  36. };
  37. export const getTreeLeafs = <T extends TreeNodeLike>(treeNode: T): T[] => {
  38. if (treeNode.children?.length) {
  39. return _.flatMap<T, T>(treeNode.children as T[], getTreeLeafs);
  40. }
  41. return [treeNode];
  42. };