Skip to content

Commit 401e527

Browse files
committed
feat(script-sorting): handle post-script ordering
1 parent 9f5dc60 commit 401e527

File tree

2 files changed

+33
-17
lines changed

2 files changed

+33
-17
lines changed

src/package/scripts/script-comparator.js

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,23 @@ function sortTestScript() {
22
return -1;
33
}
44

5+
function isRelatedScript(a, b, prefix) {
6+
return a.startsWith(prefix) && a.slice(prefix.length) === b;
7+
}
8+
59
function isPreScriptFor(a, b) {
6-
return a.startsWith('pre') && a.slice(3) === b;
10+
return isRelatedScript(a, b, 'pre');
711
}
812

9-
export default function compareScriptNames(a, b) {
10-
if (isPreScriptFor(a, b)) {
11-
return -1;
12-
}
13+
function isPostScriptFor(a, b) {
14+
return isRelatedScript(a, b, 'post');
15+
}
1316

14-
if (isPreScriptFor(b, a)) {
15-
return 1;
16-
}
17+
export default function compareScriptNames(a, b) {
18+
if (isPreScriptFor(a, b)) return -1;
19+
if (isPreScriptFor(b, a)) return 1;
20+
if (isPostScriptFor(a, b)) return 1;
21+
if (isPostScriptFor(b, a)) return -1;
1722

1823
if ('test' === a) {
1924
return sortTestScript(a, b);

src/package/scripts/script-comparator.test.js

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,37 @@ import any from '@travi/any';
44
import compareScriptNames from './script-comparator.js';
55

66
describe('script name comparator', () => {
7+
const A_AFTER_B = 1;
8+
const A_BEFORE_B = -1;
9+
const baseScriptName = any.word();
10+
711
it('should consider undefined sort orders as equivalent', async () => {
812
expect(compareScriptNames(any.word(), any.word())).toEqual(0);
913
});
1014

1115
it('should sort `pre` scripts ahead of their related scripts', async () => {
12-
const baseScriptName = any.word();
13-
expect(compareScriptNames(`pre${baseScriptName}`, baseScriptName)).toEqual(-1);
14-
expect(compareScriptNames(baseScriptName, `pre${baseScriptName}`)).toEqual(1);
16+
expect(compareScriptNames(`pre${baseScriptName}`, baseScriptName)).toEqual(A_BEFORE_B);
17+
expect(compareScriptNames(baseScriptName, `pre${baseScriptName}`)).toEqual(A_AFTER_B);
18+
19+
expect(compareScriptNames('pretest', 'test')).toEqual(A_BEFORE_B);
20+
expect(compareScriptNames('test', 'pretest')).toEqual(A_AFTER_B);
21+
});
22+
23+
it('should sort `post` scripts after of their related scripts', async () => {
24+
expect(compareScriptNames(`post${baseScriptName}`, baseScriptName)).toEqual(A_AFTER_B);
25+
expect(compareScriptNames(baseScriptName, `post${baseScriptName}`)).toEqual(A_BEFORE_B);
1526

16-
expect(compareScriptNames('pretest', 'test')).toEqual(-1);
17-
expect(compareScriptNames('test', 'pretest')).toEqual(1);
27+
expect(compareScriptNames('posttest', 'test')).toEqual(A_AFTER_B);
28+
expect(compareScriptNames('test', 'posttest')).toEqual(A_BEFORE_B);
1829
});
1930

2031
it('should sort the `test` script ahead of any sub-test scripts', async () => {
21-
expect(compareScriptNames('test', `test:${any.word()}`)).toEqual(-1);
22-
expect(compareScriptNames(`test:${any.word()}`, 'test')).toEqual(1);
32+
expect(compareScriptNames('test', `test:${any.word()}`)).toEqual(A_BEFORE_B);
33+
expect(compareScriptNames(`test:${any.word()}`, 'test')).toEqual(A_AFTER_B);
2334
});
2435

2536
it('should sort `lint:` scripts above `test:` scripts', async () => {
26-
expect(compareScriptNames(`lint:${any.word()}`, `test:${any.word()}`)).toEqual(-1);
27-
expect(compareScriptNames(`test:${any.word()}`, `lint:${any.word()}`)).toEqual(1);
37+
expect(compareScriptNames(`lint:${any.word()}`, `test:${any.word()}`)).toEqual(A_BEFORE_B);
38+
expect(compareScriptNames(`test:${any.word()}`, `lint:${any.word()}`)).toEqual(A_AFTER_B);
2839
});
2940
});

0 commit comments

Comments
 (0)