webpack-typescript-builder
Version:
Webpack config builder for typescript, styles (css and sass), fonts and images.
120 lines (119 loc) • 5.55 kB
JavaScript
"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);