UNPKG

@codelet/app-json-webpack-plugin

Version:

webpack plugin inject chunk

85 lines (84 loc) 3.37 kB
"use strict"; 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 { let [root, ...rest] = item.split('/'); // 需要兼容 packages ,推荐用户把分包都放到 packages 目录下 let name = root; if (root === 'packages') { name = rest.shift() ?? ''; root = `packages/${name}`; } let subpackage = subpackages.find((item) => item.name === name); if (!subpackage) { subpackage = { name, root, 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;