export default async function demoInfoLoader()

in packages/plugin-docs/src/loaders/demo-info-loader.ts [8:52]


export default async function demoInfoLoader(this: any, content: string) {
  const callback = this.async();
  const ast = await parseAsync(content, {
    presets: [
      ["@babel/preset-typescript", { isTSX: true, allExtensions: true }],
    ],
  });

  if (!ast || ast.type !== "File") {
    throw new Error(`unexpected content`);
  }

  // 在运行时创建codesandbox时需要imports的信息
  const imports = ast.program.body
    .filter(isImportNode)
    .filter((node) => {
      // 过滤掉纯类型import
      return node.importKind === "value";
    })
    .map((node) => {
      return node.source.value;
    });

  // 在eval时需要imports的信息
  let importCodeLines: string[] = [];
  let objectPropertyCodeLines: string[] = [];
  imports.forEach((importName, idx) => {
    importCodeLines.push(`import * as _dep${idx} from "${importName}";`);
    objectPropertyCodeLines.push(`"${importName}": _dep${idx},`);
  });

  callback(
    null,
    `export const imports = ${JSON.stringify(imports)};
    export const code = ${JSON.stringify(content)};

    ${importCodeLines.join("\n")}
    export const deps = {
      ${objectPropertyCodeLines.join("\n")}
    };
    `,
    null,
    null
  );
}