async function generateExtendDocsConfig(opts) {
  const {
    nodeModulesDir,
    npmScope = '@lion',
    classPrefix,
    classBareImport,
    tagPrefix,
    tagBareImport,
    exportsMapJsonFileName = 'package.json',
  } = opts;
  const _nodeModulesDir = nodeModulesDir || path.resolve('./node_modules');

  const folderToCheck = npmScope ? path.join(_nodeModulesDir, npmScope) : _nodeModulesDir;
  const packages = fs
    .readdirSync(folderToCheck)
    .filter(dir => fs.statSync(path.join(folderToCheck, dir)).isDirectory())
    .map(dir => (npmScope ? `${npmScope}/${dir}` : dir));

  const changes = [];
  for (const pkgName of packages) {
    const pkgPath = path.join(_nodeModulesDir, ...pkgName.split('/'));
    const pkgJsonPath = path.join(pkgPath, exportsMapJsonFileName);

    const publicApi = await getPublicApiOfPkg(pkgJsonPath);
    for (const entryPoint of publicApi.entryPoints) {
      const { exports, name, namePath, path: entryPointFile } = entryPoint;

      for (const exportName of exports) {
        changes.push({
          name: `${name} - ${exportName}`,
          variable: {
            from: exportName,
            to: exportName.replace(/^Lion/, classPrefix),
            paths: [
              {
                from: name,
                to: `${classBareImport}${namePath}`,
              },
            ],
          },
        });
      }

      const src = await fs.promises.readFile(entryPointFile, 'utf8');
      if (src.includes('.define(')) {
        const matches = src.match(/define\(['"](.*)['"]/);
        if (matches && matches[1]) {
          const tagName = matches[1];
          changes.push({
            name,
            tag: {
              from: tagName,
              to: tagName.replace(/^lion-/, tagPrefix),
              paths: [
                {
                  from: name,
                  to: `${tagBareImport}${namePath.replace('lion-', tagPrefix)}`,
                },
              ],
            },
          });
        }
      }
    }
  }

  return changes;
}
@param {object} opts
@param {string} [opts.nodeModulesDir]
@param {string} [opts.npmScope]
@param {string} opts.classPrefix
@param {string} opts.classBareImport
@param {string} opts.tagPrefix
@param {string} opts.tagBareImport
@param {string} [opts.exportsMapJsonFileName]
@returns