UNPKG

webpack-typescript-builder

Version:

Webpack config builder for typescript, styles (css and sass), fonts and images.

120 lines (119 loc) 5.55 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const commander_1 = __importDefault(require("commander")); const fs = __importStar(require("fs")); const path = __importStar(require("path")); const webpack_1 = __importDefault(require("webpack")); const webpack_merge_1 = __importDefault(require("webpack-merge")); const config_builder_1 = require("../../config-builder"); function createConfigs(dir) { const projectRoot = process.cwd(); const libRoot = path.join(__dirname, "../../.."); const libAppRoot = path.join(libRoot, "app"); const appRoot = path.join(projectRoot, dir); const settingsFileName = "wtb.json"; const defaultSettingsLocation = path.join(libAppRoot, settingsFileName); const customSettingsLocation = path.join(appRoot, settingsFileName); const defaultTsConfigLocation = path.join(libRoot, "tsconfig.base.json"); const appTsConfigLocation = path.join(projectRoot, "tsconfig.json"); const tsConfigLocation = fs.existsSync(appTsConfigLocation) ? appTsConfigLocation : defaultTsConfigLocation; process.stdout.write(`Using ${tsConfigLocation}\n`); const defaultSettings = JSON.parse(fs.readFileSync(defaultSettingsLocation, "utf8")); const settings = fs.existsSync(customSettingsLocation) ? { ...defaultSettings, ...JSON.parse(fs.readFileSync(customSettingsLocation, "utf8")), } : defaultSettings; const outputPath = path.join(projectRoot, settings.outputClientPath); const outputPathServer = path.join(projectRoot, settings.outputServerPath); const clientEntryPoint = path.join(libAppRoot, "client"); const serverEntryPoint = path.join(libAppRoot, "server"); const ssrEntryPoint = settings.ssrModule ? path.join(appRoot, settings.ssrModule) : path.join(libAppRoot, "ssr"); const appEntry = path.join(libAppRoot, `entry/index.${commander_1.default.production ? "prod" : "dev"}.ts`); const devEntries = commander_1.default.production ? [] : ["webpack-hot-middleware/client", "react-hot-loader/patch"]; const client = { index: [...devEntries, clientEntryPoint], }; const server = { server: commander_1.default.production ? ssrEntryPoint : serverEntryPoint, }; let clientConfig = config_builder_1.createWebConfig(tsConfigLocation, client, outputPath, commander_1.default.production); let serverConfig = config_builder_1.createServerConfig(tsConfigLocation, server, outputPathServer, commander_1.default.production); const definePlugin = new webpack_1.default.DefinePlugin({ "process.env": { API_URL: JSON.stringify(settings.devApiUrl), NODE_ENV: JSON.stringify(commander_1.default.production ? "production" : "development"), SCRIPTS_TYPE: JSON.stringify(settings.type), }, }); clientConfig.plugins.push(definePlugin); serverConfig.plugins.push(definePlugin); if (!commander_1.default.production) { clientConfig.resolve.alias["react-dom"] = "@hot-loader/react-dom"; serverConfig.resolve.alias["react-dom"] = "@hot-loader/react-dom"; } const clientDomainTask = path.join(libAppRoot, "esm/domain-task"); clientConfig.resolve.alias["domain-task"] = clientDomainTask; if (settings.extend) { if (settings.extend.clientConfig) { const location = path.join(appRoot, settings.extend.clientConfig); const extendClientConfig = require(location); clientConfig = webpack_merge_1.default.smart(clientConfig, extendClientConfig); } if (settings.extend.serverConfig) { const location = path.join(appRoot, settings.extend.serverConfig); const extendServerConfig = require(location); serverConfig = webpack_merge_1.default.smart(serverConfig, extendServerConfig); } } const configs = [clientConfig, serverConfig]; const reduxAsyncModule = "./flavors/router-redux-async"; const reduxModule = "./flavors/router-redux"; const basicModule = "./flavors/basic"; let flavorModule; switch (settings.flavor) { case "router-redux": flavorModule = reduxModule; break; case "router-redux-async": flavorModule = reduxAsyncModule; break; default: flavorModule = basicModule; break; } inject(configs, "injected-app-entry", appEntry); inject(configs, "injected-app-module", appRoot); inject(configs, "injected-flavor-module", flavorModule); inject(configs, "injected-ssr-module", ssrEntryPoint); inject(configs, "injected-default-middlewares", commander_1.default.production ? "./middlewares/prod" : "./middlewares/dev"); return configs; } exports.createConfigs = createConfigs; function inject(configs, module, alias) { for (const item of configs) { item.resolve.alias[module] = alias; } } function config(dir) { const cfg = createConfigs(dir); console.log(cfg); } commander_1.default.command("config <dir>").action(config);