Utilities to extract/fetch data on NPM contacts (author, maintainers etc..)
- Node.js v20 or higher
This package is available in the Node Package Repository and can be easily installed with npm or yarn.
$ npm i @nodesecure/contact
# or
$ yarn add @nodesecure/contact
Here is an example of usage from the Scanner. In this case, we are using dependenciesMap, which is a Record<string, Dependency>
. However, you can build your own record of ContactExtractorPackageMetadata
.
import {
ContactExtractor,
type ContactExtractorPackageMetadata
} from "@nodesecure/contact";
const dependencies: Record<string, ContactExtractorPackageMetadata> = Object.create(null);
for (const [packageName, dependency] of dependenciesMap) {
const { author, maintainers } = dependency.metadata;
dependencies[packageName] = {
maintainers,
...( author === null ? {} : { author } )
}
}
const extractor = new ContactExtractor({
highlight: [
{
name: "Sindre Sorhus"
}
]
});
const contacts = extractor.fromDependencies(
dependencies
);
console.log(contacts);
Contact is defined by the following TypeScript interface:
interface Contact {
email?: string;
url?: string;
name: string;
}
Note
This package authorizes literal RegExp in the name property
The constructor take a list of contacts you want to find/extract.
interface ContactExtractorOptions {
highlight: Contact[];
}
The method fromDependencies will return an array of IlluminatedContact objects if any are found in the provided dependencies.
type IlluminatedContact = Contact & {
dependencies: string[];
}
Compare two contacts and return true
if they are the same person
import {
compareContact
} from "@nodesecure/contact";
import assert from "node:assert";
assert.ok(
compareContact(
{ name: "john doe" },
{ name: "John Doe" }
)
);
Each string is trimmed, converted to lowercase, and any multiple spaces are reduced to a single space.
interface CompareOptions {
/**
* @default true
*/
compareName?: boolean;
}
MIT