diff --git a/index.js b/index.js index 328b6af..86057ab 100755 --- a/index.js +++ b/index.js @@ -99,6 +99,10 @@ const sortObjectByIdent = (a, b) => { return 0 } +// sort deps like the npm CLI does (via the package @npmcli/package-json) +// https://github.com/npm/package-json/blob/b6465f44c727d6513db6898c7cbe41dd355cebe8/lib/update-dependencies.js#L8-L21 +const sortDependenciesLikeNpm = sortObjectBy((a, b) => a.localeCompare(b, 'en')) + // https://github.com/eslint/eslint/blob/acc0e47572a9390292b4e313b4a4bf360d236358/conf/config-schema.js const eslintBaseConfigProperties = [ // `files` and `excludedFiles` are only on `overrides[]` @@ -366,13 +370,14 @@ const fields = [ { key: 'tap', over: sortObject }, { key: 'oclif', over: sortObjectBy(undefined, true) }, { key: 'resolutions', over: sortObject }, - { key: 'dependencies', over: sortObject }, - { key: 'devDependencies', over: sortObject }, + { key: 'overrides', over: sortDependenciesLikeNpm }, + { key: 'dependencies', over: sortDependenciesLikeNpm }, + { key: 'devDependencies', over: sortDependenciesLikeNpm }, { key: 'dependenciesMeta', over: sortObjectBy(sortObjectByIdent, true) }, - { key: 'peerDependencies', over: sortObject }, + { key: 'peerDependencies', over: sortDependenciesLikeNpm }, // TODO: only sort depth = 2 { key: 'peerDependenciesMeta', over: sortObjectBy(undefined, true) }, - { key: 'optionalDependencies', over: sortObject }, + { key: 'optionalDependencies', over: sortDependenciesLikeNpm }, { key: 'bundledDependencies', over: uniqAndSortArray }, { key: 'bundleDependencies', over: uniqAndSortArray }, /* vscode */ { key: 'extensionPack', over: uniqAndSortArray }, diff --git a/tests/deps.js b/tests/deps.js index 6885d7a..ffea6a8 100644 --- a/tests/deps.js +++ b/tests/deps.js @@ -1,4 +1,5 @@ import test from 'ava' +import sortPackageJson from '../index.js' import { macro } from './_helpers.js' // `resolutions` and `dependencies` @@ -51,3 +52,43 @@ test('pnpm.overrides', macro.sortObjectWithRangeAlphabetically, { // TODO: don't use snapshot, find a esaier way for review expect: 'snapshot', }) + +test('dependencies with capital and lowercase letters', (t) => { + t.deepEqual( + sortPackageJson({ + dependencies: { + JSONStream: '^1.3.5', + axios: '^1.9.0', + 'json-schema': '^0.4.0', + }, + }), + { + dependencies: { + axios: '^1.9.0', + JSONStream: '^1.3.5', + 'json-schema': '^0.4.0', + }, + }, + ) +}) + +test('devDependencies with capital and lowercase letters', (t) => { + t.deepEqual( + sortPackageJson({ + devDependencies: { + JSONStream: '^1.3.5', + axios: '^1.9.0', + 'json-schema': '^0.4.0', + webpack: '^5.36.2', + }, + }), + { + devDependencies: { + axios: '^1.9.0', + JSONStream: '^1.3.5', + 'json-schema': '^0.4.0', + webpack: '^5.36.2', + }, + }, + ) +}) diff --git a/tests/snapshots/main.js.md b/tests/snapshots/main.js.md index 4599677..01f0824 100644 --- a/tests/snapshots/main.js.md +++ b/tests/snapshots/main.js.md @@ -82,6 +82,7 @@ Generated by [AVA](https://avajs.dev). "oclif": "oclif",␊ "optionalDependencies": "optionalDependencies",␊ "os": "os",␊ + "overrides": "overrides",␊ "packageManager": "packageManager",␊ "peerDependencies": "peerDependencies",␊ "peerDependenciesMeta": "peerDependenciesMeta",␊ @@ -203,6 +204,7 @@ Generated by [AVA](https://avajs.dev). "tap": "tap",␊ "oclif": "oclif",␊ "resolutions": "resolutions",␊ + "overrides": "overrides",␊ "dependencies": "dependencies",␊ "devDependencies": "devDependencies",␊ "dependenciesMeta": "dependenciesMeta",␊ diff --git a/tests/snapshots/main.js.snap b/tests/snapshots/main.js.snap index bf4f774..49dd97e 100644 Binary files a/tests/snapshots/main.js.snap and b/tests/snapshots/main.js.snap differ