{"version":3,"sources":["../src/Operator.ts","../src/Utils.ts","../src/Tree.ts"],"sourcesContent":["import type { Component, Children, HierarchicalData } from \"./types\";\nimport { Tree } from \"./Tree\";\nimport { split, splitKey } from \"./Utils\";\n\nexport class Operator<TreeKind extends string> {\n  private tree: Tree<TreeKind>;\n  constructor(\n    private treeKind: TreeKind,\n    private delimiter: string = \"/\",\n  ) {\n    this.tree = new Tree(treeKind, \".\");\n  }\n\n  private setToRootOrParent(component: Component, currentPathName: string, previousPathArray: string[], nextPathArray: string[]): void {\n    const childComponent = this.tree.getChildByPaths(nextPathArray, component.kind);\n    if (childComponent || nextPathArray.length === 0) {\n      return;\n    }\n    if (previousPathArray.length === 0 && nextPathArray.length === 1) {\n      this.tree.set(nextPathArray[0], component);\n    } else {\n      const parentComponent = this.tree.getChildByPaths(previousPathArray, this.treeKind);\n      parentComponent && parentComponent.set(currentPathName, component);\n    }\n  }\n\n  private removeFromRootOrParent(currentPathName: string, currentPathArray: string[], component: Component): void {\n    const previousPathArray: string[] = currentPathArray.slice(0, currentPathArray.length - 1);\n    if (previousPathArray.length === 0 && currentPathArray.length === 1) {\n      this.tree.remove(currentPathName, component);\n    } else {\n      const parentComponent = this.tree.getChildByPaths(previousPathArray, this.treeKind);\n      parentComponent && parentComponent.remove(currentPathName, component);\n    }\n  }\n\n  public getHierarchy(): HierarchicalData {\n    return this.tree.getHierarchy();\n  }\n\n  public getChildByPaths(path: string, kind: string): Component | undefined {\n    const pathArray = split(path, this.delimiter);\n    return this.tree.getChildByPaths(pathArray, kind);\n  }\n\n  public set(path: string, component: Component): void {\n    const pathArray = split(path, this.delimiter);\n    const pathArrayLength = pathArray.length;\n    pathArray.reduce<string[]>((previousPathArray, currentPathName, currentIndex) => {\n      const nextPathArray = previousPathArray.concat(currentPathName);\n      const isLastIndex = currentIndex === pathArrayLength - 1;\n      if (isLastIndex) {\n        this.setToRootOrParent(component, currentPathName, previousPathArray, nextPathArray);\n      } else {\n        const tree = new Tree(this.treeKind, currentPathName);\n        this.setToRootOrParent(tree, currentPathName, previousPathArray, nextPathArray);\n      }\n      return nextPathArray;\n    }, []);\n  }\n\n  public remove(path: string, kind: string): void {\n    const pathArray = split(path, this.delimiter);\n    const pathArrayLength = pathArray.length;\n    for (let i = 0; i <= pathArrayLength; i++) {\n      const currentPathArray = pathArray.slice(0, pathArrayLength - i);\n      const currentPathName = pathArray[pathArrayLength - i - 1];\n      if (!currentPathName) {\n        continue;\n      }\n      if (i === 0) {\n        const component = this.tree.getChildByPaths(currentPathArray, kind);\n        component && this.removeFromRootOrParent(currentPathName, currentPathArray, component);\n      } else {\n        const component = this.tree.getChildByPaths(currentPathArray, this.treeKind);\n        component && component.hasChildren() && this.removeFromRootOrParent(currentPathName, currentPathArray, component);\n      }\n    }\n  }\n\n  public copy(from: string, to: string, kind: string): boolean {\n    const fromComponent = this.getChildByPaths(from, kind);\n    const toComponent = this.getChildByPaths(to, kind);\n    if (toComponent || !fromComponent) {\n      return false;\n    }\n    this.set(to, fromComponent);\n    return true;\n  }\n\n  public move(from: string, to: string, kind: string): boolean {\n    const success = this.copy(from, to, kind);\n    if (success) {\n      this.remove(from, kind);\n      return true;\n    }\n    return false;\n  }\n\n  private getChildPaths(kind: string, children: Children, parentPath: string): string[] {\n    let pathArray: string[] = [];\n    Object.entries(children).forEach(([key, child]) => {\n      const subChildren = child.getChildren();\n      const [, pathName] = splitKey(key);\n      const nextPath = [parentPath, pathName].join(this.delimiter).replace(/\\/$/, \"\");\n      if (subChildren) {\n        pathArray = pathArray.concat(this.getChildPaths(kind, subChildren, nextPath));\n      } else if (child.kind === kind) {\n        pathArray.push(nextPath);\n      }\n    });\n    return pathArray;\n  }\n\n  public getNodePaths(kind: string): string[] {\n    return this.getChildPaths(kind, this.tree.getChildren(), this.tree.name);\n  }\n}\n","export const generateKey = (kind: string, name: string): string => {\n  return `${kind}:${name}`;\n};\n\nexport const splitKey = (key: string): string[] => {\n  return key.split(\":\");\n};\n\nexport const split = (p: string, delimiter: string): string[] => {\n  const array = [];\n  for (const seg of p.split(delimiter)) {\n    switch (seg) {\n      case \".\":\n        break;\n      case \"..\":\n        array.pop();\n        break;\n      default:\n        array.push(seg);\n        break;\n    }\n  }\n  return array;\n};\n","import type { Component, Children, HierarchicalData } from \"./types\";\nimport { generateKey } from \"./Utils\";\n\nexport class Tree<Kind extends string> implements Component<Kind> {\n  private children: Children = {};\n  constructor(\n    public kind: Kind,\n    public name: string,\n  ) {}\n\n  public getChildByPaths(paths: string[], kind: string): Component<string> | undefined {\n    const [name, ...pathArray] = paths;\n    if (!name) {\n      return;\n    }\n    if (pathArray.length === 0) {\n      const component = this.children[generateKey(kind, name)];\n      return component;\n    }\n    const childTree = this.children[generateKey(this.kind, name)];\n    return childTree && childTree.getChildByPaths(pathArray, kind);\n  }\n\n  public getHierarchy(): HierarchicalData {\n    const entires = Object.entries(this.children).map(([key, child]) => {\n      return [key, child.getHierarchy()];\n    });\n    return {\n      name: this.name,\n      children: Object.fromEntries(entires),\n    };\n  }\n\n  public getChildren(): Children {\n    return this.children;\n  }\n\n  public hasChildren(): boolean {\n    return Object.keys(this.children).length === 0;\n  }\n\n  public set(pathName: string, component: Component): void {\n    const key = generateKey(component.kind, pathName);\n    this.children[key] = component;\n  }\n\n  public remove(pathName: string, component: Component<string>): void {\n    const targetKey = generateKey(component.kind, pathName);\n    const entries = Object.entries(this.children).filter(([key]) => {\n      return targetKey !== key;\n    });\n    this.children = Object.fromEntries(entries);\n  }\n}\n"],"mappings":"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","names":[]}