import {RuleSetRule, RuleSetUseItem} from "webpack"; import {basename, resolve} from "path"; export const cacheLoader: RuleSetUseItem = { loader: "cache-loader", options: { cacheDirectory: resolve(__dirname, "../var/webpack-cache"), }, }; /* Return expose-loader format to the config For example [ // Exposes 'my_module' as the name {path: './folder/my_module.js'}, // Exposes 'my_custom_name' {path: './folder/my_module.js', name: 'my_custom_name'}, // Exposes 'name1' and 'name2' {path: './folder/my_module.js', name: ['name1', 'name2']} ] */ interface ExportLoaderOptions { path: string; name?: string | string[]; } function getExposeLoaders(optionsArr: ExportLoaderOptions[]): RuleSetRule[] { const exposeLoaders = []; for (const loaderEntry of optionsArr) { const path = loaderEntry.path; let name = ""; const useArr = [cacheLoader]; // If no name is provided, infer it if (!loaderEntry.name) { name = basename(path, ".js"); useArr.push({loader: "expose-loader", options: name}); } else { // If name is an array if (Array.isArray(loaderEntry.name)) { for (const exposeName of loaderEntry.name) { useArr.push({loader: "expose-loader", options: exposeName}); } // If name is a string } else { useArr.push({loader: "expose-loader", options: loaderEntry.name}); } } exposeLoaders.push({ test: require.resolve(path), use: useArr, }); } return exposeLoaders; } export {getExposeLoaders};