{"version":3,"file":"getHTMLPluginInstances.mjs","sources":[""],"sourcesContent":["import HtmlWebpackPlugin from \"html-webpack-plugin\";\r\nimport path from \"path\";\r\nimport type { TGetHTMLPluginInstancesOptions } from \"../../types/webpack\";\r\nimport { getDir } from \"../node/getDir\";\r\nimport { getFilesWithFS } from \"../node/getFilesWithFS\";\r\n\r\ninterface IFileNameParams {\r\n  file: string;\r\n  outputPath: string;\r\n  filePath: string;\r\n}\r\n\r\ninterface IDirConfig {\r\n  filePath?: string;\r\n  inject?: boolean;\r\n  outputPath: string;\r\n}\r\n\r\nconst defaults: Required<TGetHTMLPluginInstancesOptions> = {\r\n  options: {},\r\n  dirs: [],\r\n  extensions: [ \".tsx\", \".jsx\" ],\r\n  loaders: [],\r\n  getFilterFn: (idPage: string) => true,\r\n};\r\n\r\n/**\r\n * Возвращает массив экземпляров `HtmlWebpackPlugin` с настроенными параметрами.\r\n * @param params{TGetHTMLPluginInstancesOptions} параметры конфигурации.\r\n * @returns Promise<HtmlWebpackPlugin[]> массив экземпляров `HtmlWebpackPlugin`.\r\n * @example\r\n * import { getHTMLPluginInstances } from \"@delement/ui/utils/webpack\";\r\n *\r\n * const instances = await getHTMLPluginInstances({\r\n *   dirs: [{ filePath: \"./src/pages\", outputPath: \"./\" }],\r\n * });\r\n */\r\nexport const getHTMLPluginInstances = async (\r\n  params: TGetHTMLPluginInstancesOptions = {}\r\n): Promise<HtmlWebpackPlugin[]> => {\r\n\r\n  const {\r\n    getFilterFn,\r\n    options,\r\n    dirs,\r\n    extensions,\r\n    loaders,\r\n  } = {\r\n    ...defaults,\r\n    ...params,\r\n  };\r\n\r\n  const customLoaders = loaders.length > 0\r\n    ? loaders\r\n      .map((loaderName) => loaderName.trim())\r\n      .filter((loaderName) => !!loaderName)\r\n      .map((loaderName) => loaderName.replace(/^!+|!+$/g, \"\"))\r\n      .join(\"!\")\r\n    : \"\";\r\n\r\n  const getFileName = ({ file, outputPath, filePath }: IFileNameParams): string => {\r\n\r\n    const parsedPath = path.parse(file);\r\n    const basePath = path.resolve(getDir(import.meta.url), filePath);\r\n\r\n    return path.join(\r\n      outputPath, path.format({\r\n        ...parsedPath,\r\n        base: \"\",\r\n        ext: \".html\",\r\n      }).replace(basePath, \"\")\r\n    );\r\n\r\n  };\r\n\r\n  const isRightExtension = (filePath: string): boolean =>\r\n    extensions.some((ext) => filePath.endsWith(ext));\r\n\r\n  const processDirectory = async ({ filePath, inject, outputPath }: IDirConfig): Promise<HtmlWebpackPlugin[]> => {\r\n\r\n    if (!filePath) {\r\n      return [];\r\n    }\r\n\r\n    console.debug(`[getHTMLPluginInstances] Reading dir \"${filePath}\"`);\r\n\r\n    const files = await getFilesWithFS(filePath)\r\n      .catch((err: Error) => {\r\n        console.error(`[getHTMLPluginInstances] Error while processing directory \"${filePath}\":`, err);\r\n        return [] as string[];\r\n      });\r\n\r\n    return files\r\n      .filter((file) => {\r\n        const baseName = path.basename(file, path.extname(file));\r\n        return isRightExtension(file) && getFilterFn(baseName);\r\n      })\r\n      .map((file) => {\r\n        const template = customLoaders ? `${customLoaders}!${file}` : file;\r\n        const id = path.basename(file, path.extname(file));\r\n        return new HtmlWebpackPlugin({\r\n          cache: true,\r\n          minify: false,\r\n          filename: getFileName({ file, outputPath, filePath }),\r\n          template,\r\n          id,\r\n          ...options,\r\n          ...(typeof inject === \"undefined\" ? {} : { inject }),\r\n        });\r\n      });\r\n  };\r\n\r\n  const instances = await Promise.all(\r\n    dirs.map(processDirectory)\r\n  );\r\n\r\n  return instances.flat();\r\n\r\n};\r\n"],"names":["defaults","options","dirs","extensions","loaders","getFilterFn","idPage","getHTMLPluginInstances","async","params","customLoaders","length","map","loaderName","trim","filter","replace","join","getFileName","file","outputPath","filePath","parsedPath","path","parse","basePath","resolve","getDir","url","format","base","ext","isRightExtension","some","endsWith","processDirectory","inject","console","debug","files","getFilesWithFS","catch","err","error","baseName","basename","extname","template","id","HtmlWebpackPlugin","cache","minify","filename","instances","Promise","all","flat"],"mappings":"wKAkBA,MAAMA,SAAqD,CACzDC,QAAS,CAAA,EACTC,KAAM,GACNC,WAAY,CAAE,OAAQ,QACtBC,QAAS,GACTC,YAAcC,QAAmB;;;;;;;;;;;GAc5B,MAAMC,uBAAyBC,MACpCC,OAAyC,MAGzC,MAAMJ,YACJA,YAAWJ,QACXA,QAAOC,KACPA,KAAIC,WACJA,WAAUC,QACVA,SACE,IACCJ,YACAS,QAGL,MAAMC,cAAgBN,QAAQO,OAAS,EACnCP,QACCQ,IAAKC,YAAeA,WAAWC,QAC/BC,OAAQF,cAAiBA,YACzBD,IAAKC,YAAeA,WAAWG,QAAQ,WAAY,KACnDC,KAAK,KACN,GAEJ,MAAMC,YAAc,EAAGC,UAAMC,sBAAYC,sBAEvC,MAAMC,WAAaC,KAAKC,MAAML,MAC9B,MAAMM,SAAWF,KAAKG,QAAQC,mBAAmBC,KAAMP,UAEvD,OAAOE,KAAKN,KACVG,WAAYG,KAAKM,OAAO,IACnBP,WACHQ,KAAM,GACNC,IAAK,UACJf,QAAQS,SAAU,MAKzB,MAAMO,iBAAoBX,UACxBlB,WAAW8B,KAAMF,KAAQV,SAASa,SAASH,MAE7C,MAAMI,iBAAmB3B,OAASa,kBAAUe,cAAQhB,0BAElD,IAAKC,SACH,MAAO,GAGTgB,QAAQC,MAAM,yCAAyCjB,aAEvD,MAAMkB,YAAcC,eAAenB,UAChCoB,MAAOC,MACNL,QAAQM,MAAM,8DAA8DtB,aAAcqB,KAC1F,MAAO,KAGX,OAAOH,MACJxB,OAAQI,OACP,MAAMyB,SAAWrB,KAAKsB,SAAS1B,KAAMI,KAAKuB,QAAQ3B,OAClD,OAAOa,iBAAiBb,OAASd,YAAYuC,YAE9ChC,IAAKO,OACJ,MAAM4B,SAAWrC,cAAgB,GAAGA,iBAAiBS,OAASA,KAC9D,MAAM6B,GAAKzB,KAAKsB,SAAS1B,KAAMI,KAAKuB,QAAQ3B,OAC5C,OAAO,IAAI8B,kBAAkB,CAC3BC,MAAO,KACPC,OAAQ,MACRC,SAAUlC,YAAY,CAAEC,UAAMC,sBAAYC,oBAC1C0B,kBACAC,SACG/C,kBACQmC,SAAW,YAAc,GAAK,CAAEA,oBAKnD,MAAMiB,gBAAkBC,QAAQC,IAC9BrD,KAAKU,IAAIuB,mBAGX,OAAOkB,UAAUG"}