async function visitPackage()

in packages/jsii-pacmak/lib/npm-modules.ts [33:107]


  async function visitPackage(dir: string, isRoot: boolean) {
    const realPath = await fs.realpath(dir);
    if (visited.has(realPath)) {
      return;
    } // Already visited
    visited.add(realPath);

    const pkg = await fs.readJson(path.join(realPath, 'package.json'));
    if (!pkg.jsii?.outdir || !pkg.jsii?.targets) {
      if (isRoot) {
        throw new Error(
          `Invalid "jsii" section in ${realPath}. Expecting "outdir" and "targets"`,
        );
      } else {
        return; // just move on, this is not a jsii package
      }
    }

    if (!pkg.name) {
      throw new Error(
        `package.json does not have a 'name' field: ${JSON.stringify(
          pkg,
          undefined,
          2,
        )}`,
      );
    }

    const dependencyNames = [
      ...Object.keys(pkg.dependencies ?? {}),
      ...Object.keys(pkg.peerDependencies ?? {}),
      ...Object.keys(pkg.devDependencies ?? {}),
    ];

    // if --recurse is set, find dependency dirs and build them.
    if (recurse) {
      await Promise.all(
        dependencyNames.flatMap(async (dep) => {
          if (isBuiltinModule(dep)) {
            return [];
          }

          try {
            const depDir = await findDependencyDirectory(dep, realPath);
            return [await visitPackage(depDir, false)];
          } catch (e: any) {
            // Some modules like `@types/node` cannot be require()d, but we also don't need them.
            if (
              !['MODULE_NOT_FOUND', 'ERR_PACKAGE_PATH_NOT_EXPORTED'].includes(
                e.code,
              )
            ) {
              throw e;
            }
            return [];
          }
        }),
      );
    }

    // outdir is either by package.json/jsii.outdir (relative to package root) or via command line (relative to cwd)
    const outputDirectory =
      pkg.jsii.outdir && path.resolve(realPath, pkg.jsii.outdir);
    const targets = [...Object.keys(pkg.jsii.targets), 'js']; // "js" is an implicit target.

    ret.push(
      new JsiiModule({
        name: pkg.name,
        moduleDirectory: realPath,
        defaultOutputDirectory: outputDirectory,
        availableTargets: targets,
        dependencyNames,
      }),
    );
  }