in npm/src/main.ts [248:300]
public handleMoniker(moniker: Moniker): void {
if (moniker.kind !== MonikerKind.import || moniker.scheme !== TscMoniker.scheme) {
return;
}
const tscMoniker = TscMoniker.parse(moniker.identifier);
if (!TscMoniker.hasPath(tscMoniker)) {
return;
}
const workspaceRoot = this.source.workspaceRoot;
if (workspaceRoot === undefined) {
return;
}
const parts = tscMoniker.path.split('/');
let packagePath: string | undefined;
let monikerPath: string | undefined;
for (let i = parts.length - 1; i >= 0; i--) {
const part = parts[i];
if (part === 'node_modules') {
// End is exclusive and one for the name
const packageIndex = i + (parts[i + 1].startsWith('@') ? 3 : 2);
packagePath = path.join(workspaceRoot, ...parts.slice(0, packageIndex), `package.json`);
monikerPath = parts.slice(packageIndex).join('/');
break;
}
}
if (packagePath === undefined || (monikerPath !== undefined && monikerPath.length === 0)) {
return;
}
let packageData = this.packageData.get(packagePath);
if (packageData === undefined) {
const packageJson = PackageJson.read(packagePath);
if (packageJson === undefined) {
this.packageData.set(packagePath, null);
} else {
packageData = {
packageInfo: this.queue.createPackageInformation(packageJson),
packageJson: packageJson
};
this.packageData.set(packagePath, packageData);
}
}
if (packageData !== null && packageData !== undefined) {
let npmIdentifier: string;
if (packageData.packageJson.typings === monikerPath || packageData.packageJson.main === monikerPath) {
npmIdentifier = NpmMoniker.create(packageData.packageJson.name, undefined, tscMoniker.name);
} else {
npmIdentifier = NpmMoniker.create(packageData.packageJson.name, monikerPath, tscMoniker.name);
}
const npmMoniker = this.queue.createMoniker(NpmMoniker.scheme, npmIdentifier, UniquenessLevel.scheme, moniker.kind);
this.queue.createPackageInformationEdge(npmMoniker.id, packageData.packageInfo.id);
this.queue.createAttachEdge(npmMoniker.id, moniker.id);
}
}