{"version":3,"file":"getFilesWithContext.mjs","sources":[""],"sourcesContent":["import path from \"path\";\r\nimport type { TWebpackAsyncRequestResult } from \"../../types/webpack\";\r\n\r\ntype TModule<M = Record<string, unknown>> = M & {\r\n  default?: Record<string, unknown>;\r\n};\r\n\r\ntype TGetModuleFn<Result = TModule> = (props: {\r\n  module: TModule;\r\n  path: string;\r\n  index: number;\r\n  items: string[];\r\n}) => Result;\r\n\r\ntype TGetFilterFn = (path: string) => boolean;\r\n\r\nconst getFilterFnDefault: TGetFilterFn = (_path) => true;\r\nconst getModuleFnDefault: TGetModuleFn = ({ module }) => module;\r\n\r\n/**\r\n * Возвращает массив всех файлов из папки при помощи модуля `webpackAsyncContext`\r\n * @param requireFn{TWebpackAsyncRequestResult} функция, возвращаемая `import.meta.webpackContext`\r\n * @param getModuleFn{TGetModuleFn=} callback для найденного файла\r\n * @param getFilterFn{TGetFilterFn=} callback для фильтра найденных файлов\r\n * @returns {Promise<unknown>}\r\n * @example\r\n * import { getFilesWithContext } from \"@delement/ui/utils/webpack\";\r\n *\r\n * const modules = await getFilesWithContext(import.meta.webpackContext(\"./\", { recursive: true }));\r\n */\r\nexport const getFilesWithContext = async <Result = TModule>(\r\n  requireFn: TWebpackAsyncRequestResult,\r\n  getModuleFn: TGetModuleFn<Result> = getModuleFnDefault as TGetModuleFn<Result>,\r\n  getFilterFn: TGetFilterFn = getFilterFnDefault\r\n): Promise<Result[]> => {\r\n  if (!requireFn?.keys) {\r\n    return [];\r\n  }\r\n\r\n  // Фиксируем один и тот же порядок для загрузки и для items\r\n  const requestPaths: string[] = requireFn\r\n    .keys()\r\n    .filter((requestPath: string) => getFilterFn(requestPath))\r\n    .sort((a: string, b: string) => a.localeCompare(b));\r\n\r\n  const items: string[] = requestPaths.map((requestPath: string) => path.normalize(requestPath));\r\n\r\n  const results = await Promise.all(\r\n    requestPaths.map((requestPath: string) => requireFn(requestPath))\r\n  );\r\n\r\n  return results.map((item: TModule, index: number) => {\r\n    const module = item?.default ?? item;\r\n\r\n    return getModuleFn({\r\n      module,\r\n      path: items[index],\r\n      index,\r\n      items,\r\n    });\r\n  });\r\n};\r\n"],"names":["getFilterFnDefault","_path","getModuleFnDefault","module","getFilesWithContext","async","requireFn","getModuleFn","getFilterFn","keys","requestPaths","filter","requestPath","sort","a","b","localeCompare","items","map","path","normalize","results","Promise","all","item","index","default"],"mappings":"uBAgBA,MAAMA,mBAAoCC,OAAU,KACpD,MAAMC,mBAAmC,EAAGC,iBAAaA;;;;;;;;;;;GAalD,MAAMC,oBAAsBC,MACjCC,UACAC,YAAoCL,mBACpCM,YAA4BR,sBAE5B,IAAKM,WAAWG,KACd,MAAO;2DAIT;MAAMC,aAAyBJ,UAC5BG,OACAE,OAAQC,aAAwBJ,YAAYI,cAC5CC,KAAK,CAACC,EAAWC,IAAcD,EAAEE,cAAcD,IAElD,MAAME,MAAkBP,aAAaQ,IAAKN,aAAwBO,KAAKC,UAAUR,cAEjF,MAAMS,cAAgBC,QAAQC,IAC5Bb,aAAaQ,IAAKN,aAAwBN,UAAUM,eAGtD,OAAOS,QAAQH,IAAI,CAACM,KAAeC,SACjC,MAAMtB,OAASqB,MAAME,SAAWF,KAEhC,OAAOjB,YAAY,CACjBJ,cACAgB,KAAMF,MAAMQ,OACZA,YACAR"}