Normalizes data that can be found in package.json files.
npx @tessl/cli install tessl/npm-normalize-package-data@8.0.0Normalize Package Data provides comprehensive normalization and validation of package.json metadata. It transforms inconsistent package.json data into standardized formats by cleaning version numbers, converting string dependencies to objects, normalizing people fields, and inferring missing metadata from related fields.
npm install normalize-package-dataconst normalize = require("normalize-package-data");const normalize = require("normalize-package-data");
// Load package data
const packageData = require("./package.json");
// Basic normalization
normalize(packageData);
// packageData is now normalized in-place
// With warning callback
const warnings = [];
normalize(packageData, (warning) => {
warnings.push(warning);
});
// Strict mode (Semver 2.0 compliance)
normalize(packageData, true);
// Strict mode with warning callback
normalize(packageData, (warning) => {
console.error("Warning:", warning);
}, true);Normalize Package Data operates through a central normalize function that orchestrates field-specific normalization tasks:
normalize() coordinates all normalization operationsCore normalization function that transforms package.json data into standardized format.
/**
* Normalizes package.json data in-place
* @param {Object} data - Package data object to normalize
* @param {Function|boolean} [warn] - Warning callback function or strict mode flag
* @param {boolean} [strict] - Enable strict validation mode
*/
function normalize(data, warn, strict);Parameters:
data (Object): Package.json data to normalize (modified in-place)warn (Function|boolean): Warning callback function or true for strict modestrict (boolean): When true, enforces strict Semver 2.0 compliance and name validationNormalization Operations:
Access to the underlying fixer module for custom normalization workflows.
/**
* Direct access to the fixer module with individual field normalization functions
*/
normalize.fixer: {
warn: Function;
fixRepositoryField: Function;
fixTypos: Function;
fixScriptsField: Function;
fixFilesField: Function;
fixBinField: Function;
fixManField: Function;
fixBundleDependenciesField: Function;
fixDependencies: Function;
fixModulesField: Function;
fixKeywordsField: Function;
fixVersionField: Function;
fixPeople: Function;
fixNameField: Function; // fixNameField(data, options)
fixDescriptionField: Function;
fixReadmeField: Function;
fixBugsField: Function;
fixHomepageField: Function;
fixLicenseField: Function;
}The warning system provides detailed feedback about data quality issues during normalization.
Warning Callback Usage:
const warnings = [];
normalize(packageData, (message) => {
warnings.push(message);
});
// Warning types (29 total warning messages):
// Missing data: missingRepository, missingDescription, missingReadme, missingLicense
// Invalid types: nonObjectScripts, nonStringScript, nonArrayFiles, nonArrayKeywords
// Invalid values: invalidFilename, invalidLicense, nonEmailUrlBugsString
// Dependencies: nonObjectDependencies, nonStringDependency, deprecatedArrayDependencies
// Typos: repositories (should be repository), dependancies (should be dependencies)
// URLs: brokenGitUrl, nonUrlHomepage, nonUrlBugsUrlField
// Deprecated: deprecatedModules
// Name conflicts: conflictingName (conflicts with Node.js core modules)Strict Mode: When strict mode is enabled:
Individual field normalization functions available through normalize.fixer:
/**
* Validates and cleans version field using semver
* @param {Object} data - Package data
* @param {boolean} strict - Strict mode flag
*/
fixVersionField(data, strict);/**
* Normalizes all dependency fields (dependencies, devDependencies, optionalDependencies)
* Converts arrays/strings to objects, validates URLs, merges optionalDependencies
* @param {Object} data - Package data
*/
fixDependencies(data);/**
* Validates and normalizes the package name field
* @param {Object} data - Package data
* @param {Object|boolean} [options] - Options object or strict boolean
* @param {boolean} [options.strict] - Enable strict validation
* @param {boolean} [options.allowLegacyCase] - Allow legacy case patterns
*/
fixNameField(data, options);/**
* Normalizes author, contributors, and maintainers fields
* Converts strings to structured objects with name, email, url properties
* @param {Object} data - Package data
*/
fixPeople(data);/**
* Normalizes repository field and infers bugs/homepage URLs
* Supports hosted git providers (GitHub, GitLab, etc.)
* @param {Object} data - Package data
*/
fixRepositoryField(data);The normalize function may throw errors for critical validation failures:
Error when version field contains invalid semverError when package name violates npm naming rulesTypeError for invalid argumentsNon-critical issues are reported through the warning callback system rather than throwing errors.
The normalize function processes fields in a specific order and performs special transformations:
Field Processing Order:
Special Behaviors:
gypfile: true when install script is "node-gyp rebuild" and no preinstall script exists_id field as name@versionNote: Type definitions below use TypeScript syntax for clarity, but this is a JavaScript package.
/**
* Warning callback function type
* @callback WarningCallback
* @param {string} message - Formatted warning message
*/
/**
* Person object structure (normalized from string format)
*/
interface PersonObject {
name?: string;
email?: string;
url?: string;
}
/**
* Repository object structure
*/
interface RepositoryObject {
type: string;
url: string;
}
/**
* Bugs object structure
*/
interface BugsObject {
url?: string;
email?: string;
}