async function bundleAssets()

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;
}