"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getTypescriptLoader = exports.getBabelLoader = exports.LangType = void 0; var LangType; (function (LangType) { LangType["ES6"] = "ES6"; LangType["Typescript"] = "Typescript"; })(LangType = exports.LangType || (exports.LangType = {})); const replaceExt = (path, ext) => path.substr(0, path.lastIndexOf('.')) + `${ext}'`; function updateEntryExt(self, newExt) { const jsEntryOption = self.entryOption; let tsEntryOption = {}; if (typeof jsEntryOption === 'string') { tsEntryOption = replaceExt(jsEntryOption, newExt); } else if (typeof jsEntryOption === 'object') { Object.keys(jsEntryOption).forEach((entry) => { tsEntryOption[entry] = replaceExt(jsEntryOption[entry], newExt); }); } self.configuration.config.webpackOptions.entry = tsEntryOption; } const getFolder = (path) => path.replace("'./", '').split('/').slice(0, -1).join('/'); function getEntryFolders(self) { const entryOption = self.entryOption; const entryFolders = {}; if (typeof entryOption === 'string') { const folder = getFolder(entryOption); if (folder.length > 0) { entryFolders[folder] = true; } } else if (typeof entryOption === 'object') { Object.keys(entryOption).forEach((entry) => { const folder = getFolder(entryOption[entry]); if (folder.length > 0) { entryFolders[folder] = true; } }); } return Object.keys(entryFolders); } /** * * Returns an module.rule object for the babel loader * @param {string[]} includeFolders An array of folders to include * @returns {Rule} A configuration containing the babel-loader with env preset */ function getBabelLoader(includeFolders) { const include = includeFolders.map((folder) => `path.resolve(__dirname, '${folder}')`); return { test: '/\\.(js|jsx)$/', include, loader: "'babel-loader'" }; } exports.getBabelLoader = getBabelLoader; /** * * Returns an module.rule object for the typescript loader * @param {string[]} includeFolders An array of folders to include * @returns {Rule} A configuration containing the ts-loader */ function getTypescriptLoader(includeFolders) { const include = includeFolders.map((folder) => `path.resolve(__dirname, '${folder}')`); return { test: '/\\.(ts|tsx)$/', loader: "'ts-loader'", include, exclude: ['/node_modules/'] }; } exports.getTypescriptLoader = getTypescriptLoader; function language(self, langType) { const entryFolders = getEntryFolders(self); switch (langType) { case LangType.ES6: self.dependencies.push('babel-loader', '@babel/core', '@babel/preset-env'); self.configuration.config.webpackOptions.module.rules.push(getBabelLoader(entryFolders)); break; case LangType.Typescript: self.dependencies.push('typescript', 'ts-loader'); self.configuration.config.webpackOptions.module.rules.push(getTypescriptLoader(entryFolders)); self.configuration.config.webpackOptions.resolve = { extensions: ["'.tsx'", "'.ts'", "'.js'"], }; updateEntryExt(self, '.ts'); break; } } exports.default = language;