Skip to content

Commit d25c728

Browse files
fiskerkeithamus
authored andcommitted
feat: support peerDependenciesMeta field (#142)
1 parent 4a554fd commit d25c728

File tree

7 files changed

+105
-9
lines changed

7 files changed

+105
-9
lines changed

index.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,19 @@ const uniqAndSortArray = pipe([uniq, sortArray])
1515
const isPlainObject = x =>
1616
x && Object.prototype.toString.call(x) === '[object Object]'
1717
const onObject = fn => x => (isPlainObject(x) ? fn(x) : x)
18-
const sortObjectBy = comparator => onObject(x => sortObjectKeys(x, comparator))
18+
const sortObjectBy = (comparator, deep) => {
19+
const over = onObject(object => {
20+
object = sortObjectKeys(object, comparator)
21+
if (deep) {
22+
for (const [key, value] of Object.entries(object)) {
23+
object[key] = over(value)
24+
}
25+
}
26+
return object
27+
})
28+
29+
return over
30+
}
1931
const sortObject = sortObjectBy()
2032
const sortURLObject = sortObjectBy(['type', 'url'])
2133
const sortPeopleObject = sortObjectBy(['name', 'email', 'url'])
@@ -227,6 +239,8 @@ const fields = [
227239
{ key: 'dependencies', over: sortObject },
228240
{ key: 'devDependencies', over: sortObject },
229241
{ key: 'peerDependencies', over: sortObject },
242+
// TODO: only sort depth = 2
243+
{ key: 'peerDependenciesMeta', over: sortObjectBy(undefined, true) },
230244
{ key: 'optionalDependencies', over: sortObject },
231245
{ key: 'bundledDependencies', over: uniqAndSortArray },
232246
{ key: 'bundleDependencies', over: uniqAndSortArray },

tests/_helpers.js

+23-8
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,34 @@ const sortPackageJsonAsObject = ({ path, value, options }) =>
2727
path,
2828
)
2929

30-
const keysToObject = keys => {
30+
const keysToObject = (keys, depth = 1) => {
3131
if (keys.some((value, index) => keys.indexOf(value) !== index)) {
3232
throw new Error(`${keys} should be unique.`)
3333
}
34-
return keys.reduce((object, key) => Object.assign(object, { [key]: key }), {})
34+
35+
if (depth < 1) {
36+
throw new Error(`depth should be a positive integer, got ${depth}.`)
37+
}
38+
39+
return keys.reduce(
40+
(object, key) =>
41+
Object.assign(object, {
42+
[key]: depth > 1 ? keysToObject(keys, depth - 1) : key,
43+
}),
44+
{},
45+
)
3546
}
3647

37-
function sortObjectAlphabetically(t, options) {
38-
sortObject(t, {
39-
...options,
40-
value: keysToObject(['z', 'a']),
41-
expect: keysToObject(['a', 'z']),
42-
})
48+
function sortObjectAlphabetically(t, options = {}) {
49+
const { maxDepth = 1, expect } = options
50+
51+
for (let depth = 1; depth < maxDepth + 1; depth++) {
52+
sortObject(t, {
53+
...options,
54+
value: keysToObject(['z', 'a'], depth),
55+
expect: expect || keysToObject(['a', 'z'], depth),
56+
})
57+
}
4358
}
4459

4560
function sortObject(

tests/deps.js

+8
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,11 @@ for (const field of [
2121
]) {
2222
test(field, macro.uniqueAndSort, { path: field })
2323
}
24+
25+
// peerDependenciesMeta
26+
test('peerDependenciesMeta', macro.sortObjectAlphabetically, {
27+
path: 'peerDependenciesMeta',
28+
maxDepth: 2,
29+
// TODO: don't use snapshot, find a esaier way for review
30+
expect: 'snapshot',
31+
})

tests/snapshots/deps.js.md

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Snapshot report for `tests/deps.js`
2+
3+
The actual snapshot is saved in `deps.js.snap`.
4+
5+
Generated by [AVA](https://ava.li).
6+
7+
## peerDependenciesMeta
8+
9+
> Should sort `peerDependenciesMeta` as object.
10+
11+
{
12+
input: `{␊
13+
"peerDependenciesMeta": {␊
14+
"z": "z",␊
15+
"a": "a"␊
16+
}␊
17+
}`,
18+
options: undefined,
19+
output: `{␊
20+
"peerDependenciesMeta": {␊
21+
"a": "a",␊
22+
"z": "z"␊
23+
}␊
24+
}`,
25+
pretty: true,
26+
}
27+
28+
> Should sort `peerDependenciesMeta` as object.
29+
30+
{
31+
input: `{␊
32+
"peerDependenciesMeta": {␊
33+
"z": {␊
34+
"z": "z",␊
35+
"a": "a"␊
36+
},␊
37+
"a": {␊
38+
"z": "z",␊
39+
"a": "a"␊
40+
}␊
41+
}␊
42+
}`,
43+
options: undefined,
44+
output: `{␊
45+
"peerDependenciesMeta": {␊
46+
"a": {␊
47+
"a": "a",␊
48+
"z": "z"␊
49+
},␊
50+
"z": {␊
51+
"a": "a",␊
52+
"z": "z"␊
53+
}␊
54+
}␊
55+
}`,
56+
pretty: true,
57+
}

tests/snapshots/deps.js.snap

297 Bytes
Binary file not shown.

tests/snapshots/main.js.md

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ Generated by [AVA](https://ava.li).
6969
"optionalDependencies": "optionalDependencies",␊
7070
"os": "os",␊
7171
"peerDependencies": "peerDependencies",␊
72+
"peerDependenciesMeta": "peerDependenciesMeta",␊
7273
"pre-commit": "pre-commit",␊
7374
"preferGlobal": "preferGlobal",␊
7475
"prettier": "prettier",␊
@@ -160,6 +161,7 @@ Generated by [AVA](https://ava.li).
160161
"dependencies": "dependencies",␊
161162
"devDependencies": "devDependencies",␊
162163
"peerDependencies": "peerDependencies",␊
164+
"peerDependenciesMeta": "peerDependenciesMeta",␊
163165
"optionalDependencies": "optionalDependencies",␊
164166
"bundledDependencies": "bundledDependencies",␊
165167
"bundleDependencies": "bundleDependencies",␊

tests/snapshots/main.js.snap

7 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)