nobuilder-json
Version:
nobuilder
115 lines (99 loc) • 3.32 kB
JavaScript
// 设置 ENV
process.env.NODE_ENV = "production";
process.env.BABEL_ENV = "production";
// 保证 unhandle process 能抛出异常
process.on("unhandledRejection", err => {
throw err;
});
// 加载环境变量
require("./lib/env");
const sass = require("node-sass");
const webpack = require("webpack");
const path = require("path");
const babel = require("babel-core");
const assert = require("assert");
const chalk = require("chalk");
const glob = require("glob");
const fs = require("fs-extra");
const { rmdir, mkdir } = require("./utils");
const getUmdConfig = require("./lib/webpack.umd");
const babelConfig = require("./lib/babelConfig");
const paths = require("./lib/paths");
const umdJson = require(paths.umd);
const umdConfig = getUmdConfig(umdJson);
const callback = (err, stats) => {
if (err) {
console.error(err.stack || err);
if (err.details) console.error(err.details);
return;
}
console.log(
stats.toString({
chunks: false, // Makes the build much quieter
chunkModules: false,
colors: true, // Shows colors in the console
children: false,
builtAt: true,
modules: false
})
);
};
const ES_PATTERN = /\.(js|jsx|mjs|tsx)$/;
const CSS_PATTERN = /\.(scss)$/;
async function run(basedir) {
const srcDir = path.join(basedir, "src");
const destDir = path.join(basedir, "dist");
assert(fs.existsSync(srcDir), `${srcDir} directory should exists`);
console.log(chalk.cyan("Starting to transform src files to dist ...\n"));
// remove old destDir
console.log(" - %s %s", chalk.yellow("remove"), destDir);
await rmdir(destDir);
await mkdir(destDir);
// transform
const files = glob.sync("**/*.*", {
cwd: srcDir
});
for (const file of files) {
const srcFile = path.join(srcDir, file);
let destFile = path.join(destDir, file);
// 如果是 ES 代码, 就 transform
if (file.match(ES_PATTERN)) {
console.log(" - %s %s", chalk.green("transform"), file);
destFile = destFile.replace(ES_PATTERN, ".tsx");
console.log(destFile);
const content = fs.readFileSync(srcFile, "utf8");
await mkdir(path.dirname(destFile));
console.log(destFile);
fs.writeFileSync(
destFile.replace(".tsx", ".js"),
babel.transform(content, { ...babelConfig, filename: destFile }).code
);
} else if (file.match(CSS_PATTERN)) {
console.log(" - %s %s", chalk.green("scss"), file, srcFile);
destFile = destFile.replace(CSS_PATTERN, ".css");
let content = fs.readFileSync(srcFile, "utf8");
content = content.replace(/@import ('|")~/g, "@import 'node_modules/");
await mkdir(path.dirname(destFile));
const rawScss = sass.renderSync({
file: srcFile,
data: content
});
const cssContent = rawScss.css.toString("utf-8");
fs.writeFileSync(destFile, cssContent);
} else {
console.log(" - %s %s", chalk.green("copy"), file);
await fs.copy(srcFile, destFile);
}
}
console.log(chalk.green("\nTransform successfully!"));
console.log(chalk.green("\nexecuting webpack to build umd..."));
try {
webpack(umdConfig).run(callback);
} catch (e) {
console.log(e);
}
}
run(process.cwd()).catch(err => {
console.error(chalk.red(err.stack || err));
process.exit(1);
});