Skip to content

Commit 71b28d3

Browse files
fiskerkeithamus
authored andcommitted
feat: support private keys (#102)
* feat: support private keys * refactor: use `partition`
1 parent 60e981f commit 71b28d3

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

index.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ const fields = [
151151
{ key: 'publishConfig', over: sortObject },
152152
]
153153

154-
const sortOrder = fields.map(({ key }) => key)
154+
const defaultSortOrder = fields.map(({ key }) => key)
155155

156156
function editStringJSON(json, over) {
157157
if (typeof json === 'string') {
@@ -170,11 +170,28 @@ function editStringJSON(json, over) {
170170
return over(json)
171171
}
172172

173+
const isPrivateKey = key => key[0] === '_'
174+
const partition = (array, predicate) =>
175+
array.reduce(
176+
(result, value) => {
177+
result[predicate(value) ? 0 : 1].push(value)
178+
return result
179+
},
180+
[[], []],
181+
)
173182
function sortPackageJson(jsonIsh, options = {}) {
174183
return editStringJSON(
175184
jsonIsh,
176185
onObject(json => {
177-
const newJson = sortObjectKeys(json, options.sortOrder || sortOrder)
186+
let sortOrder = options.sortOrder ? options.sortOrder : defaultSortOrder
187+
188+
if (Array.isArray(sortOrder)) {
189+
const keys = Object.keys(json)
190+
const [privateKeys, publicKeys] = partition(keys, isPrivateKey)
191+
sortOrder = [...sortOrder, ...publicKeys.sort(), ...privateKeys.sort()]
192+
}
193+
194+
const newJson = sortObjectKeys(json, sortOrder)
178195

179196
for (const { key, over } of fields) {
180197
if (over && newJson[key]) newJson[key] = over(newJson[key])
@@ -187,7 +204,7 @@ function sortPackageJson(jsonIsh, options = {}) {
187204

188205
module.exports = sortPackageJson
189206
module.exports.sortPackageJson = sortPackageJson
190-
module.exports.sortOrder = sortOrder
207+
module.exports.sortOrder = defaultSortOrder
191208

192209
if (require.main === module) {
193210
const fs = require('fs')

test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,22 @@ fs.readFile('./package.json', 'utf8', (error, contents) => {
149149
)
150150
})
151151

152+
// fields with '_' prefix should alway at bottom
153+
assert.deepStrictEqual(
154+
Object.keys(
155+
sortPackageJson({
156+
_foo: '_foo',
157+
foo: 'foo',
158+
version: '1.0.0',
159+
name: 'sort-package-json',
160+
bar: 'bar',
161+
_id: 'sort-package-json@1.0.0',
162+
_bar: '_bar',
163+
}),
164+
),
165+
['name', 'version', 'bar', 'foo', '_bar', '_foo', '_id'],
166+
)
167+
152168
// fields tests
153169

154170
// fields sort as object

0 commit comments

Comments
 (0)