@gdjiami/cli
Version:
CLI for build front end project.
203 lines (202 loc) • 8.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getEntries = void 0;
var tslib_1 = require("tslib");
/**
* 多页入口相关方法
*/
var glob_1 = tslib_1.__importDefault(require("glob"));
var path_1 = tslib_1.__importDefault(require("path"));
var json5_1 = tslib_1.__importDefault(require("json5"));
var fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
var chalk_1 = tslib_1.__importDefault(require("chalk"));
var uniq_1 = tslib_1.__importDefault(require("lodash/uniq"));
var difference_1 = tslib_1.__importDefault(require("lodash/difference"));
var utils_1 = require("../../utils");
var constants_1 = require("../../constants");
var paths_1 = tslib_1.__importDefault(require("../../paths"));
var HtmlWebpackPlugin = require('html-webpack-plugin');
var PageLessFileRegexp = /.*\/(.*)\.page\..*$/;
/**
* scan entries in src
*/
function getEntries(option) {
var context = option.context;
var entries = {};
var templatePlugins = [];
var templates = getTraditionalEntries(option);
var traditionalEntries = Object.keys(templates);
var pageLessEntries = getPagelessEntries(option);
var electronEntries = getElectronEntries(option);
var defaultHtmlTempalte = getDefaultTemplate();
// 检验是否找到指定的入口文件
checkEntryExisting(traditionalEntries.concat(electronEntries), option);
// 剔除.page文件
difference_1.default(traditionalEntries, pageLessEntries).forEach(function (page) {
entries[page] = ["./" + page];
// 生成html-webpack-plugin
var tplPath = path_1.default.join(context, page + "." + templates[page]);
templatePlugins.push(new HtmlWebpackPlugin(tslib_1.__assign(tslib_1.__assign({}, getCommonTemplatePluginOptions(page, option)), { template: tplPath })));
});
pageLessEntries.forEach(function (page) {
entries[page] = ["./" + page + ".page"];
var tplPath = traditionalEntries.indexOf(page) !== -1 ? path_1.default.join(context, page + "." + templates[page]) : defaultHtmlTempalte;
templatePlugins.push(new HtmlWebpackPlugin(tslib_1.__assign(tslib_1.__assign({}, getCommonTemplatePluginOptions(page, option)), { template: tplPath })));
});
electronEntries.forEach(function (page) {
if (page in entries) {
// 已经有tradition 入口定义
return;
}
entries[page] = ["./" + page];
templatePlugins.push(new HtmlWebpackPlugin(tslib_1.__assign(tslib_1.__assign({}, getCommonTemplatePluginOptions(page, option)), { template: defaultHtmlTempalte })));
});
// 警告并使用默认入口
if (Object.keys(entries).length === 0) {
var defaultIndex = path_1.default.join(context, 'index');
var ext = findJsFiles(defaultIndex, false);
if (ext) {
utils_1.message.warn("Use 'index" + ext + "' as default entry");
var page = 'index';
entries[page] = ["./" + page];
templatePlugins.push(new HtmlWebpackPlugin(tslib_1.__assign(tslib_1.__assign({}, getCommonTemplatePluginOptions(page, option)), { template: defaultHtmlTempalte })));
}
else {
utils_1.message.error("Not entries found in " + context + ".");
process.exit(1);
}
}
// 添加开发环境依赖
if (!option.isProduction && option.hotreload) {
for (var entry in entries) {
entries[entry].unshift(require.resolve('webpack/hot/dev-server'));
entries[entry].unshift(require.resolve('webpack-dev-server/client') + '?/');
}
}
for (var externalEntry in option.inject) {
entries[externalEntry] = [option.inject[externalEntry]];
}
return {
entries: entries,
templatePlugins: templatePlugins,
};
}
exports.getEntries = getEntries;
/**
* 传统的入口方式, 一个page.{ext} 对应 一个page.js
*/
function getTraditionalEntries(_a) {
var context = _a.context, entry = _a.entry;
var globStr = path_1.default.join(context, "*.@(" + constants_1.TemplateExtensions.map(function (i) { return i.slice(1); }).join('|') + ")");
var reg = /^.*\/(.*)\.([a-zA-Z]*)$/;
var matchPages = glob_1.default.sync(globStr, {});
var pages = matchPages.reduce(function (entries, page) {
var matched = page.match(reg);
if (matched) {
var name = matched[1], ext = matched[2];
if (entry == null || entry.indexOf(name) !== -1) {
entries[name] = ext;
}
}
return entries;
}, {});
return pages;
}
/**
* 从page.json 中获取入口文件信息
*/
function getElectronEntries(_a) {
var context = _a.context, entry = _a.entry;
var configPath = path_1.default.join(context, 'page.json');
if (!fs_extra_1.default.existsSync(configPath)) {
return [];
}
var json = fs_extra_1.default.readFileSync(configPath);
var config = json5_1.default.parse(json.toString());
return Object.keys(config).filter(function (p) { return (entry ? entry.indexOf(p) !== -1 : true); });
}
/**
* 获取*.page.ext 形式的入口
* @param param0
*/
function getPagelessEntries(_a) {
var context = _a.context, entry = _a.entry;
return glob_1.default
.sync(path_1.default.join(context, "*.page.@(" + constants_1.Extensions.map(function (i) { return i.slice(1); }).join('|') + ")"))
.map(function (p) {
var match = p.match(PageLessFileRegexp);
return match[1];
})
.filter(function (p) { return (entry ? entry.indexOf(p) !== -1 : true); });
}
/**
* 检查对应的Javascript入口是否存在
* @param page
*/
function findJsFiles(page, checkPageless) {
if (checkPageless === void 0) { checkPageless = true; }
var exts = constants_1.Extensions.concat(checkPageless ? constants_1.Extensions.map(function (i) { return ".page" + i; }) : []);
for (var _i = 0, exts_1 = exts; _i < exts_1.length; _i++) {
var ext = exts_1[_i];
if (fs_extra_1.default.existsSync(page + ext)) {
return ext;
}
}
return undefined;
}
/**
* 检查是否存在入口
* @param entries
* @param param1
*/
function checkEntryExisting(entries, _a) {
var context = _a.context;
uniq_1.default(entries).forEach(function (page) {
var pagePath = path_1.default.join(context, page);
var entryFileExt = findJsFiles(pagePath);
if (entryFileExt == null) {
utils_1.message.error("not any entry file(" + chalk_1.default.blue(page + ".{tsx|ts|js|jsx}") + " or " + chalk_1.default.blue(page + ".page.{tsx|ts|js|jsx}") + ") found in " + context + ".");
process.exit(1);
}
});
}
/**
* 获取默认的html-webpack-plugin 模板
*/
function getDefaultTemplate() {
if (fs_extra_1.default.existsSync(paths_1.default.appHtml)) {
return paths_1.default.appHtml;
}
return paths_1.default.ownHtml;
}
/**
* 获取通用的html-webpack-plugin配置项
* @param page 入口名称
* @param param0
*/
function getCommonTemplatePluginOptions(page, _a) {
var isProduction = _a.isProduction, templateParameters = _a.templateParameters, inject = _a.inject;
var preinjected = Object.keys(inject);
return {
title: page,
filename: page + ".html",
chunks: tslib_1.__spreadArrays(preinjected, [page]),
chunksSortMode: preinjected && preinjected.length ? 'manual' : 'auto',
templateParameters: templateParameters,
inject: true,
minify: isProduction
? {
removeComments: true,
collapseWhitespace: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeStyleLinkTypeAttributes: true,
keepClosingSlash: true,
minifyJS: true,
minifyCSS: true,
minifyURLs: true,
}
: undefined,
};
}