import merge from 'lodash/merge' import { loadJson, loadJsonSync } from '../json' import { formatJson } from '../prettier' import { BuildJson, Obj, ProjectFileProcessor } from '../type' export const BUILD_JSON_FILE_NAME = 'build.json' export const BUILD_JSON_SCHEMA: BuildJson = { targets: undefined, cone: { oneCode: undefined, lowcode: undefined, lowcodeEntryName: undefined, useLowcodeConfigs: undefined, dynamicSplitting: undefined, routerSplitting: undefined, cssModule: undefined, }, } export async function loadBuildJson(dir: string): Promise { return loadJson(dir, BUILD_JSON_FILE_NAME) } export function loadBuildJsonSync(dir: string): Obj { return loadJsonSync(dir, BUILD_JSON_FILE_NAME) } export const updateBuildJson: ProjectFileProcessor = async ({ obj, props }) => { const { mobile, oneCode, lowcode, useLowcodeConfigs, buildPluginPackageName, mpa, } = props let moreConfig = {} // oneCode 优先级比 mobile 高 if (oneCode) { moreConfig = { targets: ['web', 'web-mobile'], cone: { oneCode: true }, } } else if (mobile) { moreConfig = { targets: ['web-mobile'], } } const buildJson = merge({}, BUILD_JSON_SCHEMA, obj, moreConfig) // cone config if (buildJson.cone) { // 低码 if (!lowcode) { delete buildJson.cone.lowcode delete buildJson.cone.lowcodeEntryName } else { buildJson.cone.lowcode = true } if (!useLowcodeConfigs) { delete buildJson.cone.useLowcodeConfigs } else { buildJson.cone.useLowcodeConfigs = true } } // 更新插件 buildJson.plugins = buildJson.plugins || [] // 自定义打包插件 if (buildPluginPackageName) { const arr: string[] = Array.isArray(buildPluginPackageName) ? buildPluginPackageName : [buildPluginPackageName] for (const name of arr) { buildJson.plugins.splice(buildJson.plugins.length - 1, 0, name) } } // 如果是移动端, 移除插件 build-plugin-fusion if (mobile && !oneCode) { const idx = buildJson.plugins.findIndex((plugin) => { return Array.isArray(plugin) && plugin[0] === 'build-plugin-fusion' }) if (idx !== -1) { buildJson.plugins.splice(idx, 1) } } if (mpa) { // mpa 移除build-plugin-router const idx = buildJson.plugins.findIndex((plugin) => { return Array.isArray(plugin) && plugin[0] === 'build-plugin-router' }) if (idx !== -1) { buildJson.plugins.splice(idx, 1) } // 增加build-plugin-multi-pages const idxJsxPlus = buildJson.plugins.findIndex((plugin) => { return Array.isArray(plugin) && plugin[0] === 'build-plugin-jsx-plus' }) if (idxJsxPlus) { buildJson.plugins.splice(idx + 1, 0, 'build-plugin-multi-pages') } if (buildJson.cone) { buildJson.cone.dynamicSplitting = false buildJson.cone.routerSplitting = false } } return buildJson }