sort-package-json
Advanced tools
Comparing version 1.36.0 to 1.37.0
@@ -1,5 +0,35 @@ | ||
export declare const sortOrder: string[]; | ||
export declare function sortPackageJson<T>(packageJson: T, options?: { | ||
sortOrder: string[]; | ||
}): T; | ||
export default sortPackageJson; | ||
type ComparatorFunction = (left: string, right: string) => number | ||
declare namespace sortPackageJson { | ||
interface Options { | ||
readonly sortOrder?: readonly string[] | ComparatorFunction | ||
} | ||
} | ||
declare const sortPackageJson: { | ||
/** | ||
Sort packageJson. | ||
@param packageJson - A packageJson object or string. | ||
@returns Sorted packageJson object or string. | ||
*/ | ||
(packageJson, options?: sortPackageJson.Options): typeof packageJson | ||
/** | ||
Sort packageJson. | ||
@param packageJson - A packageJson object or string. | ||
@returns Sorted packageJson object or string. | ||
*/ | ||
sortPackageJson( | ||
packageJson, | ||
options?: sortPackageJson.Options, | ||
): typeof packageJson | ||
/** | ||
Default sort order. | ||
*/ | ||
readonly sortOrder: readonly string[] | ||
} | ||
export default sortPackageJson |
131
index.js
@@ -1,8 +0,9 @@ | ||
#!/usr/bin/env node | ||
const sortObjectKeys = require('sort-object-keys') | ||
const detectIndent = require('detect-indent') | ||
const detectNewline = require('detect-newline').graceful | ||
const globby = require('globby') | ||
const gitHooks = require('git-hooks-list') | ||
const hasOwnProperty = (object, property) => | ||
Object.prototype.hasOwnProperty.call(object, property) | ||
const pipe = fns => x => fns.reduce((result, fn) => fn(result), x) | ||
const onArray = fn => x => (Array.isArray(x) ? fn(x) : x) | ||
@@ -26,4 +27,6 @@ const uniq = onArray(xs => xs.filter((x, i) => i === xs.indexOf(x))) | ||
]) | ||
const sortProperty = (property, over) => object => | ||
Object.assign(object, { [property]: over(object[property]) }) | ||
const overProperty = (property, over) => object => | ||
hasOwnProperty(object, property) | ||
? Object.assign(object, { [property]: over(object[property]) }) | ||
: object | ||
const sortGitHooks = sortObjectBy(gitHooks) | ||
@@ -44,3 +47,24 @@ const sortESLintConfig = sortObjectBy([ | ||
]) | ||
const sortVSCodeBadgeObject = sortObjectBy(['description', 'url', 'href']) | ||
const sortPrettierConfigKeys = onObject(config => | ||
sortObjectKeys(config, [ | ||
...Object.keys(config) | ||
.filter(key => key !== 'overrides') | ||
.sort(), | ||
'overrides', | ||
]), | ||
) | ||
const sortPrettierConfigOptions = pipe([ | ||
sortObject, | ||
overProperty('options', sortObject), | ||
]) | ||
const sortPrettierConfigOverrides = onArray(overrides => | ||
overrides.map(sortPrettierConfigOptions), | ||
) | ||
const sortPrettierConfig = pipe([ | ||
sortPrettierConfigKeys, | ||
onObject(overProperty('overrides', sortPrettierConfigOverrides)), | ||
]) | ||
// See https://docs.npmjs.com/misc/scripts | ||
@@ -87,2 +111,9 @@ const defaultNpmScripts = new Set([ | ||
// fields marked `vscode` are for `Visual Studio Code extension manifest` only | ||
// https://code.visualstudio.com/api/references/extension-manifest | ||
// Supported fields: | ||
// publisher, displayName, categories, galleryBanner, preview, contributes, | ||
// activationEvents, badges, markdown, qna, extensionPack, | ||
// extensionDependencies, icon | ||
// field.key{string}: field name | ||
@@ -92,5 +123,7 @@ // field.over{function}: sort field subKey | ||
{ key: 'name' }, | ||
/* vscode */ { key: 'displayName' }, | ||
{ key: 'version' }, | ||
{ key: 'private' }, | ||
{ key: 'description' }, | ||
/* vscode */ { key: 'categories', over: uniq }, | ||
{ key: 'keywords', over: uniq }, | ||
@@ -102,2 +135,3 @@ { key: 'homepage' }, | ||
{ key: 'license', over: sortURLObject }, | ||
/* vscode */ { key: 'qna' }, | ||
{ key: 'author', over: sortPeopleObject }, | ||
@@ -108,2 +142,3 @@ { | ||
}, | ||
/* vscode */ { key: 'publisher' }, | ||
{ key: 'files', over: uniq }, | ||
@@ -144,3 +179,5 @@ { key: 'sideEffects' }, | ||
{ key: 'betterScripts', over: sortScripts }, | ||
{ key: 'husky', over: sortProperty('hooks', sortGitHooks) }, | ||
/* vscode */ { key: 'contributes', over: sortObject }, | ||
/* vscode */ { key: 'activationEvents', over: uniq }, | ||
{ key: 'husky', over: overProperty('hooks', sortGitHooks) }, | ||
{ key: 'pre-commit' }, | ||
@@ -155,3 +192,3 @@ { key: 'commitlint', over: sortObject }, | ||
{ key: 'xo', over: sortObject }, | ||
{ key: 'prettier', over: sortObject }, | ||
{ key: 'prettier', over: sortPrettierConfig }, | ||
{ key: 'eslintConfig', over: sortESLintConfig }, | ||
@@ -171,2 +208,4 @@ { key: 'eslintIgnore' }, | ||
{ key: 'bundleDependencies', over: sortArray }, | ||
/* vscode */ { key: 'extensionPack', over: sortArray }, | ||
/* vscode */ { key: 'extensionDependencies', over: sortArray }, | ||
{ key: 'flat' }, | ||
@@ -179,5 +218,21 @@ { key: 'engines', over: sortObject }, | ||
{ key: 'publishConfig', over: sortObject }, | ||
/* vscode */ { key: 'icon' }, | ||
/* vscode */ { | ||
key: 'badges', | ||
over: onArray(badge => badge.map(sortVSCodeBadgeObject)), | ||
}, | ||
/* vscode */ { key: 'galleryBanner', over: sortObject }, | ||
/* vscode */ { key: 'preview' }, | ||
/* vscode */ { key: 'markdown' }, | ||
] | ||
const defaultSortOrder = fields.map(({ key }) => key) | ||
const overFields = pipe( | ||
fields.reduce((fns, { key, over }) => { | ||
if (over) { | ||
fns.push(overProperty(key, over)) | ||
} | ||
return fns | ||
}, []), | ||
) | ||
@@ -227,9 +282,3 @@ function editStringJSON(json, over) { | ||
const newJson = sortObjectKeys(json, sortOrder) | ||
for (const { key, over } of fields) { | ||
if (over && newJson[key]) newJson[key] = over(newJson[key]) | ||
} | ||
return newJson | ||
return overFields(sortObjectKeys(json, sortOrder)) | ||
}), | ||
@@ -242,57 +291,1 @@ ) | ||
module.exports.sortOrder = defaultSortOrder | ||
if (require.main === module) { | ||
const fs = require('fs') | ||
const isCheckFlag = argument => argument === '--check' || argument === '-c' | ||
const cliArguments = process.argv.slice(2) | ||
const isCheck = cliArguments.some(isCheckFlag) | ||
const patterns = cliArguments.filter(argument => !isCheckFlag(argument)) | ||
if (!patterns.length) { | ||
patterns[0] = 'package.json' | ||
} | ||
const files = globby.sync(patterns) | ||
if (files.length === 0) { | ||
console.log('No matching files.') | ||
process.exit(1) | ||
} | ||
let notSortedFiles = 0 | ||
files.forEach(file => { | ||
const packageJson = fs.readFileSync(file, 'utf8') | ||
const sorted = sortPackageJson(packageJson) | ||
if (sorted !== packageJson) { | ||
if (isCheck) { | ||
notSortedFiles++ | ||
console.log(file) | ||
} else { | ||
fs.writeFileSync(file, sorted, 'utf8') | ||
console.log(`${file} is sorted!`) | ||
} | ||
} | ||
}) | ||
if (isCheck) { | ||
console.log() | ||
if (notSortedFiles) { | ||
console.log( | ||
notSortedFiles === 1 | ||
? `${notSortedFiles} of ${files.length} matched file is not sorted.` | ||
: `${notSortedFiles} of ${files.length} matched files are not sorted.`, | ||
) | ||
} else { | ||
console.log( | ||
files.length === 1 | ||
? `${files.length} matched file is sorted.` | ||
: `${files.length} matched files are sorted.`, | ||
) | ||
} | ||
process.exit(notSortedFiles) | ||
} | ||
} |
{ | ||
"name": "sort-package-json", | ||
"version": "1.36.0", | ||
"version": "1.37.0", | ||
"description": "Sort an Object or package.json based on the well-known package.json keys", | ||
@@ -22,11 +22,12 @@ "keywords": [ | ||
"index.js", | ||
"index.d.ts" | ||
"index.d.ts", | ||
"cli.js" | ||
], | ||
"main": "index.js", | ||
"types": "index.d.ts", | ||
"bin": "index.js", | ||
"bin": "cli.js", | ||
"scripts": { | ||
"lint": "eslint .", | ||
"semantic-release": "semantic-release", | ||
"sort-package-json": "node index.js package.json --check", | ||
"sort-package-json": "node cli.js package.json --check", | ||
"test": "node test.js" | ||
@@ -71,5 +72,5 @@ }, | ||
"prettier": "^1.19.1", | ||
"semantic-release": "^15.9.17", | ||
"semantic-release": "15.14.0", | ||
"validate-commit-msg": "^2.14.0" | ||
} | ||
} |
@@ -83,6 +83,6 @@ # Sort Package.json | ||
```js | ||
sortPackageJson(jsonIsh, options?) | ||
sortPackageJson(packageJson, options?) | ||
``` | ||
Pass a JSON string, return a new sorted JSON string. | ||
Pass a JSON string, return a new sorted JSON string.\ | ||
Pass a JSON object, return a new sorted JSON object. | ||
@@ -130,20 +130,37 @@ | ||
custom sortOrder | ||
Type: `string[] | Function`\ | ||
Default: `sortPackageJson.sortOrder` | ||
Custom ordering array or comparator function. | ||
If an array, sort keys in ordering of `options.sortOrder`. | ||
**Notice**: fields not in this array, will still sort by `defaultSortOrder` | ||
```js | ||
console.log(sortPackageJson(packageJsonObject, { | ||
sortOrder: ['version', 'name', 'dependencies'], | ||
})) | ||
/* => object: | ||
{ | ||
version: '1.0.0', | ||
name: 'my-awesome-project', | ||
dependencies: { | ||
'sort-object-keys': '1.0.0', | ||
'sort-package-json': '1.0.0' | ||
const sorted = sortPackageJson(packageJsonObject, { | ||
sortOrder: ['version'] | ||
}) | ||
console.log(Object.keys(sorted)) | ||
// -> [ 'version', 'name', 'dependencies' ] | ||
// ^^^^^^^^^^^^^^^^^^^^^^ | ||
// `name` and `dependencies` are sorted by defaultSortOrder | ||
``` | ||
If a function, sort fields by [Array#sort(options.sortOrder)](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Description) | ||
```js | ||
const sorted = sortPackageJson(packageJsonObject, { | ||
sortOrder(left, right) { | ||
return left.localeCompare(right) | ||
} | ||
} | ||
}) | ||
console.log(Object.keys(sorted)) | ||
// -> [ 'dependencies', 'name', 'version' ] | ||
``` | ||
## Related tools | ||
@@ -150,0 +167,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
17817
5
337
223