@codelet/app-json-webpack-plugin
Version:
webpack plugin inject chunk
79 lines (78 loc) • 3.09 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
const webpack_1 = require("webpack");
const NAME = 'AppJsonWebpackPlugin';
class AppJsonWebpackPlugin {
options;
constructor(options = {}) {
this.options = options;
}
apply(compiler) {
compiler.hooks.thisCompilation.tap(NAME, (compilation) => {
compilation.hooks.processAssets.tapAsync({
name: NAME,
stage: webpack_1.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS,
}, async (assets, callback) => {
try {
for (const name in assets) {
if (name.endsWith('app.json')) {
const appJsonPages = await this.getAppJsonPages(compiler.options.entry);
const json = JSON.parse(assets[name].source().toString());
const content = JSON.stringify(Object.assign(json, appJsonPages), null, 2);
assets[name] = Object.assign({}, assets[name], {
source: () => content,
size: () => content.length,
});
}
}
callback();
}
catch (err) {
callback(err);
}
});
});
}
async getAppJsonPages(entry) {
const entryData = typeof entry === 'function' ? await entry() : entry;
const entryKeys = Object.keys(entryData);
if (this.options.filterPages) {
return this.options.filterPages(entryKeys);
}
const source = entryKeys
.filter((key) => {
if (key.includes(`components${path_1.default.sep}`)) {
return false;
}
return key.endsWith(`${path_1.default.sep}index`);
})
.map((item) => item.split(path_1.default.sep).join('/'));
let pages = [];
const subpackages = [];
source.forEach((item) => {
if (item.startsWith('pages/')) {
pages.push(item);
}
else {
const [name, ...rest] = item.split('/');
let subpackage = subpackages.find((item) => item.name === name);
if (!subpackage) {
subpackage = { name, root: name, pages: [] };
subpackages.push(subpackage);
}
subpackage.pages.push(rest.join('/'));
}
});
// 将 pageIndex 移动到第一位
if (this.options.pageIndex) {
pages = pages.filter((item) => item !== this.options.pageIndex);
pages.unshift(this.options.pageIndex);
}
return { pages, subpackages };
}
}
exports.default = AppJsonWebpackPlugin;