@@ -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
156156function 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+ )
173182function 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
188205module . exports = sortPackageJson
189206module . exports . sortPackageJson = sortPackageJson
190- module . exports . sortOrder = sortOrder
207+ module . exports . sortOrder = defaultSortOrder
191208
192209if ( require . main === module ) {
193210 const fs = require ( 'fs' )
0 commit comments