jazelle/utils/sort-package-json.js (32 lines of code) (raw):

// @flow /* sorts package.json based on the following criteria * name first * description second * version third * author fourth * all other keys in alphabetical order * dependencies and devDependencies sorted alphabetically * newline at the end of the file */ module.exports = function sortPackageJson(pkg /*: Object */) /*: string */ { const specialKeys = ['name', 'description', 'version', 'author']; const nextPkg = {}; const pkgKeys = Object.keys(pkg) .filter(key => !specialKeys.includes(key)) .sort(); specialKeys.concat(pkgKeys).forEach(key => { if (Array.isArray(pkg[key])) { nextPkg[key] = pkg[key].sort(); } else if (pkg[key] && typeof pkg[key] === 'object') { nextPkg[key] = sortObject(pkg[key]); } else { nextPkg[key] = pkg[key]; } }); return JSON.stringify(nextPkg, null, 2) + '\n'; }; function sortObject(obj) { const nextObj = {}; Object.keys(obj) .sort() .forEach(key => { if (Array.isArray(obj[key])) { nextObj[key] = obj[key].sort(); } else if (obj[key] && typeof obj[key] === 'object') { nextObj[key] = sortObject(obj[key]); } else { nextObj[key] = obj[key]; } }); return nextObj; }