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