{"version":3,"file":"HttpMigrateRouteAccessor.mjs","sources":["../../src/composers/HttpMigrateRouteAccessor.ts"],"sourcesContent":["import { IHttpMigrateRoute } from \"../structures/IHttpMigrateRoute\";\nimport { EndpointUtil } from \"../utils/EndpointUtil\";\nimport { Escaper } from \"../utils/Escaper\";\nimport { MapUtil } from \"../utils/MapUtil\";\n\nexport namespace HttpMigrateRouteAccessor {\n  export const overwrite = (routes: IHttpMigrateRoute[]): void => {\n    const predefined: Map<string, number> = getPredefinedAccessors(routes);\n    const dict: Map<string, IElement> = collect((op) =>\n      op.emendedPath\n        .split(\"/\")\n        .filter((str) => !!str.length && str[0] !== \":\")\n        .map(EndpointUtil.normalize)\n        .map((str) => (Escaper.variable(str) ? str : `_${str}`)),\n    )(routes) as Map<string, IElement>;\n\n    for (const props of dict.values())\n      props.entries.forEach((entry, i) => {\n        entry.alias = EndpointUtil.escapeDuplicate(\n          [\n            ...props.children,\n            ...props.entries.filter((_, j) => i !== j).map((e) => e.alias),\n          ].map(EndpointUtil.normalize),\n        )(EndpointUtil.normalize(entry.alias));\n\n        const parameters: { name: string; key: string }[] = [\n          ...entry.route.parameters,\n          ...(entry.route.body ? [entry.route.body] : []),\n          ...(entry.route.headers ? [entry.route.headers] : []),\n          ...(entry.route.query ? [entry.route.query] : []),\n        ];\n        parameters.forEach(\n          (p, i) =>\n            (p.key = EndpointUtil.escapeDuplicate([\n              \"connection\",\n              entry.alias,\n              ...parameters.filter((_, j) => i !== j).map((y) => y.key),\n            ])(p.key)),\n        );\n\n        const accessor: string[] | undefined =\n          entry.route.operation()[\"x-samchon-accessor\"];\n        if (accessor !== undefined && predefined.get(accessor.join(\".\")) === 1)\n          entry.route.accessor = accessor;\n        else entry.route.accessor = [...props.namespace, entry.alias];\n      });\n\n    for (const x of routes) {\n      while (true) {\n        const neighbor: IHttpMigrateRoute | undefined = routes.find(\n          (y) =>\n            y.accessor.length < x.accessor.length &&\n            x.accessor\n              .slice(0, y.accessor.length)\n              .every((v, i) => v === y.accessor[i]),\n        );\n        if (neighbor === undefined) break;\n        x.accessor[neighbor.accessor.length - 1] =\n          `_${x.accessor[neighbor.accessor.length - 1]}`;\n      }\n    }\n  };\n\n  const collect =\n    (getter: (r: IHttpMigrateRoute) => string[]) =>\n    (routes: IHttpMigrateRoute[]): Map<string, IElement> => {\n      const dict: Map<string, IElement> = new Map();\n      for (const r of routes) {\n        const namespace: string[] = getter(r);\n        let last: IElement = MapUtil.take(dict)(namespace.join(\".\"))(() => ({\n          namespace,\n          children: new Set(),\n          entries: [],\n        }));\n        last.entries.push({\n          route: r,\n          alias: getName(r),\n        });\n        namespace.slice(0, -1).forEach((_i, i, array) => {\n          const partial: string[] = namespace.slice(0, array.length - i);\n          const element: IElement = MapUtil.take(dict)(partial.join(\".\"))(\n            () => ({\n              namespace: partial,\n              children: new Set(),\n              entries: [],\n            }),\n          );\n          element.children.add(last.namespace.at(-1)!);\n        });\n        const top = MapUtil.take(dict)(\"\")(() => ({\n          namespace: [],\n          children: new Set(),\n          entries: [],\n        }));\n        if (namespace.length) top.children.add(namespace[0]);\n      }\n      return dict;\n    };\n\n  const getName = (op: IHttpMigrateRoute): string => {\n    const method = op.method === \"delete\" ? \"erase\" : op.method;\n    if (op.parameters.length === 0) return method;\n    return (\n      method +\n      \"By\" +\n      op.parameters.map((p) => EndpointUtil.capitalize(p.key)).join(\"And\")\n    );\n  };\n\n  const getPredefinedAccessors = (\n    routes: IHttpMigrateRoute[],\n  ): Map<string, number> => {\n    const dict: Map<string, number> = new Map();\n    for (const r of routes) {\n      const accessor = r.operation()[\"x-samchon-accessor\"]?.join(\".\");\n      if (accessor === undefined) continue;\n      else if (dict.has(accessor)) dict.set(accessor, dict.get(accessor)! + 1);\n      else dict.set(accessor, 1);\n    }\n    return dict;\n  };\n\n  interface IElement {\n    namespace: string[];\n    entries: IEntry[];\n    children: Set<string>;\n  }\n  interface IEntry {\n    route: IHttpMigrateRoute;\n    alias: string;\n  }\n}\n"],"names":["HttpMigrateRouteAccessor","overwrite","routes","predefined","getPredefinedAccessors","dict","collect","op","emendedPath","split","filter","str","length","map","EndpointUtil","normalize","Escaper","variable","props","values","entries","forEach","entry","i","alias","escapeDuplicate","children","_","j","e","parameters","route","body","headers","query","p","key","y","accessor","operation","undefined","get","join","namespace","x","neighbor","find","slice","every","v","getter","Map","r","last","MapUtil","take","Set","push","getName","_i","array","partial","element","add","at","top","method","capitalize","has","set"],"mappings":"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"}