This guide walks you through using lockfile-lint-api to validate your lockfiles for security issues.
npm install lockfile-lint-apiRequirements: Node.js >= 16.0.0
The library follows a simple pattern:
const { ParseLockfile } = require('lockfile-lint-api');
// Parse from file path
const parser = new ParseLockfile({
lockfilePath: './package-lock.json'
});
const lockfile = parser.parseSync();
// Returns: { type: 'success', object: { ... } }Alternative: Parse from string content
const fs = require('fs');
const content = fs.readFileSync('./yarn.lock', 'utf-8');
const parser = new ParseLockfile({
lockfileText: content
});
const lockfile = parser.parseSync();All validators follow the same pattern - they accept the parsed packages object:
const { ValidateHost, ValidateHttps } = require('lockfile-lint-api');
// Host validation
const hostValidator = new ValidateHost({
packages: lockfile.object
});
// HTTPS validation
const httpsValidator = new ValidateHttps({
packages: lockfile.object
});All validators return a consistent result structure:
const result = hostValidator.validate(['npm']);
if (result.type === 'success') {
console.log('Validation passed');
} else {
console.error('Validation failed:');
result.errors.forEach(error => {
console.error(` ${error.package}: ${error.message}`);
});
}Ensure all packages come from trusted registries:
const { ValidateHost, ParseLockfile } = require('lockfile-lint-api');
const parser = new ParseLockfile({ lockfilePath: './package-lock.json' });
const lockfile = parser.parseSync();
const validator = new ValidateHost({ packages: lockfile.object });
// Use registry shortcuts
const result = validator.validate(['npm']); // Only npm registry
// or
const result = validator.validate(['npm', 'yarn']); // npm or yarn
// Use custom registries
const result = validator.validate(['registry.mycompany.com']);Ensure all packages use secure HTTPS:
const { ValidateHttps, ParseLockfile } = require('lockfile-lint-api');
const parser = new ParseLockfile({ lockfilePath: './package-lock.json' });
const lockfile = parser.parseSync();
const validator = new ValidateHttps({ packages: lockfile.object });
const result = validator.validate();
if (result.type === 'error') {
console.error('Insecure packages detected:', result.errors);
}Ensure all packages use strong SHA-512 hashes:
const { ValidateIntegrity, ParseLockfile } = require('lockfile-lint-api');
const parser = new ParseLockfile({ lockfilePath: './package-lock.json' });
const lockfile = parser.parseSync();
const validator = new ValidateIntegrity({ packages: lockfile.object });
// Validate all packages
const result = validator.validate();
// Or exclude specific packages
const result = validator.validate({
integrityExclude: ['legacy-package', '@company/old-lib']
});Parsing errors throw exceptions:
try {
const parser = new ParseLockfile({ lockfilePath: './package-lock.json' });
const lockfile = parser.parseSync();
} catch (error) {
if (error.name === 'ParsingError') {
console.error('Failed to parse lockfile:', error.message);
}
}Validation errors are returned in result objects:
const result = validator.validate(['npm']);
if (result.type === 'error') {
// Handle validation failures
result.errors.forEach(error => {
console.error(`${error.package}: ${error.message}`);
});
}const {
ParseLockfile,
ValidateHost,
ValidateHttps
} = require('lockfile-lint-api');
function validateLockfile(lockfilePath) {
try {
// Parse
const parser = new ParseLockfile({ lockfilePath });
const lockfile = parser.parseSync();
// Validate hosts
const hostValidator = new ValidateHost({ packages: lockfile.object });
const hostResult = hostValidator.validate(['npm']);
if (hostResult.type === 'error') {
console.error('Host validation failed:');
hostResult.errors.forEach(e => console.error(e.message));
return false;
}
// Validate HTTPS
const httpsValidator = new ValidateHttps({ packages: lockfile.object });
const httpsResult = httpsValidator.validate();
if (httpsResult.type === 'error') {
console.error('HTTPS validation failed:');
httpsResult.errors.forEach(e => console.error(e.message));
return false;
}
console.log('✓ All validations passed');
return true;
} catch (error) {
console.error('Error:', error.message);
return false;
}
}
validateLockfile('./package-lock.json');