react-docgen icon indicating copy to clipboard operation
react-docgen copied to clipboard

Monorepo support is missing

Open rvetere opened this issue 1 year ago • 1 comments

We are working in a huge monorepo setup with hundreds of packages. Now if an interface is imported from an "external" package - just another package that i'm currently scoped into - it won't pick up this file and parse it. This results in missing properties that basically would be delivered by this imported interface/type.

Could be fixed with a patch in the makeFsImporter.ts but i didn't made a pull request yet - i just tried it out very specifically for our own repository, but it would need further work to make a generic solution out of it:

function resolveImportedValue(
    path: ImportPath,
    name: string,
    file: FileState,
    seen = new Set<string>(),
  ): NodePath | null {
    // Bail if no filename was provided for the current source file.
    // Also never traverse into react itself.
    let source = path.node.source?.value;
    let { filename } = file.opts;

    // Customization: add support to resolve packages from blocks, segments, and libraries in iso monorepo
    if (
      (typeof filename === "string" && source?.startsWith("@blocks")) ||
      source?.startsWith("@segments") ||
      source?.startsWith("@libraries")
    ) {
      filename = `${getRepoRoot(filename as string)}/${source.replace("@", "")}/src/index.ts`;
      source = "./index";
    }
    // Customization: end

    if (!source || !filename || source === "react") {
      return null;
    }

rvetere avatar May 30 '24 10:05 rvetere

I had the same issue with my NX monorepo.

In the end I fix it using react-docgen-typescript with next way:

import * as docgen from 'react-docgen-typescript';

const tsConfigBasePath = path.resolve(__dirname, '../path/to/tsconfig.base.json');

const docgenMonorepo = docgen.withCustomConfig(tsConfigBasePath);
const docs = docgenMonorepo.parse("./path/to/component");

It's work perfect

olejech avatar Dec 04 '24 13:12 olejech