in packages/build-plugin-lowcode/src/index.js [1009:1191]
async function bundleAssets(options, pluginOptions, metaTypes, renderTypes, execCompile) {
const { onHook } = options;
const { rootDir, pkg: package } = options.context;
if (!PARSED_NPM_NAME) {
PARSED_NPM_NAME = parseNpmName(package.name);
}
const metaExportName = `${PARSED_NPM_NAME.uniqueName}Meta`;
const {
package: packageName = package.name,
baseUrl,
library = PARSED_NPM_NAME.uniqueName,
umdUrls,
renderUrls,
editUrls,
groups = DEFAULT_GROUPS,
categories = DEFAULT_CATEGORIES,
builtinAssets = [],
extraAssets = [],
baseLibrary,
ignoreComponents = {},
buildTarget = 'build',
engineScope = '@ali',
lowcodeDir = 'lowcode',
} = pluginOptions || {};
if (baseLibrary === 'rax' && Array.isArray(extraAssets)) {
extraAssets.push(
`https://g.alicdn.com/code/npm/@alife/mobile-page/0.1.1/build/lowcode/assets-prod.json`,
);
}
const baseSchemas = await Promise.all(
builtinAssets.map(async (url) => {
if (typeof url === 'object') {
return url;
} else {
try {
return await axios(url).then(({ data }) => data);
} catch (e) {
console.error(
`[@alifd/build-plugin-lowcode] get assets data from builtin assets ${url} failed: `,
e,
);
return {};
}
}
}),
);
const extraSchemas = await Promise.all(
extraAssets.map(async (url) => {
if (typeof url === 'object') {
return url;
} else {
try {
return await axios(url).then(({ data }) => data);
} catch (e) {
console.error(
`[@alifd/build-plugin-lowcode] get assets data from builtin assets ${url} failed: `,
e,
);
return {};
}
}
}),
);
const assetsPaths = await Promise.all(
['daily', 'prod', 'dev'].map(async (item) => {
const _baseUrl =
(baseUrl && baseUrl[item]) ||
`${UNPKG_BASE_URL_MAP[engineScope]}/${package.name}@${package.version}`;
let urls;
let metaUrl;
const metaUrls = {};
const advancedRenderUrls = {};
const advancedEditUrls = {};
const advancedMetaUrls = {};
if (item === 'dev') {
urls = JSON.stringify([`./view.js`, `./view.css`]);
metaTypes.forEach((item) => {
const _url = item ? `./meta.${item}.js` : './meta.js';
if (!metaUrl) metaUrl = _url;
metaUrls[item || 'default'] = _url;
advancedMetaUrls[item || 'default'] = [_url];
});
renderTypes.forEach((renderType) => {
advancedRenderUrls[renderType] = [
`./render/${renderType}/view.js`,
`./render/${renderType}/view.css`,
];
});
} else {
urls = JSON.stringify([
`${_baseUrl}/${buildTarget}/${lowcodeDir}/view.js`,
`${_baseUrl}/${buildTarget}/${lowcodeDir}/view.css`,
]);
metaTypes.forEach((item) => {
const _url = item
? `${_baseUrl}/${buildTarget}/${lowcodeDir}/meta.${item}.js`
: `${_baseUrl}/${buildTarget}/${lowcodeDir}/meta.js`;
if (!metaUrl) metaUrl = _url;
metaUrls[item || 'default'] = _url;
advancedMetaUrls[item || 'default'] = [_url];
});
renderTypes.forEach((renderType) => {
advancedRenderUrls[renderType] = [
`${_baseUrl}/${buildTarget}/${lowcodeDir}/render/${renderType}/view.js`,
`${_baseUrl}/${buildTarget}/${lowcodeDir}/render/${renderType}/view.css`,
];
});
}
const _urls = advancedRenderUrls.default || renderUrls || umdUrls;
const _editUrls = editUrls || umdUrls;
const assetsPath = generateEntry({
template: 'assets.json',
filename: `assets-${item}.json`,
rootDir,
params: {
package: packageName,
version: package.version,
library,
urls: _urls ? JSON.stringify(_urls) : urls,
editUrls: _editUrls ? JSON.stringify(_editUrls) : urls,
metaUrl,
metaUrls: JSON.stringify(metaUrls),
metaExportName,
groups: JSON.stringify(groups),
categories: JSON.stringify(categories),
ignoreComponents: JSON.stringify(ignoreComponents),
advancedRenderUrls: JSON.stringify(advancedRenderUrls),
advancedEditUrls: JSON.stringify(advancedEditUrls),
advancedMetaUrls: JSON.stringify(advancedMetaUrls),
},
});
let schemas = baseSchemas;
if (item === 'dev') {
schemas = [...extraSchemas, ...baseSchemas];
}
const assetsData = require(assetsPath);
schemas.forEach((schemaItem) => {
mergeWith(assetsData, schemaItem, (objValue, srcValue) => {
if (Array.isArray(objValue) && Array.isArray(srcValue)) {
if (typeof objValue[0] === 'string') {
const tempMap = {};
srcValue.forEach((srcItem) => {
tempMap[srcItem] = true;
});
objValue.forEach((objItem) => {
if (!tempMap[objItem]) {
srcValue.push(objItem);
}
});
return srcValue;
} else {
return srcValue.concat(objValue);
}
}
});
});
const packageMap = {};
assetsData.packages.forEach((packageItem) => {
if (!packageMap[packageItem.package]) {
packageMap[packageItem.package] = packageItem;
}
});
assetsData.packages = Object.values(packageMap);
fse.outputFileSync(assetsPath, JSON.stringify(assetsData, null, 2));
return assetsPath;
}),
);
if (!execCompile) return assetsPaths;
onHook('after.build.compile', () => {
['dev', 'daily', 'prod'].forEach((item) => {
const filename = `assets-${item}.json`;
const targetPath = path.resolve(rootDir, `${buildTarget}/${lowcodeDir}/${filename}`);
const originPath = path.resolve(rootDir, `.tmp/${filename}`);
if (!fse.existsSync(originPath)) {
return;
}
fse.outputFileSync(targetPath, JSON.stringify(require(originPath), null, 2));
});
updatePackage(rootDir, baseUrl, lowcodeDir, buildTarget, engineScope, package);
});
return assetsPaths;
}