Skip to content

Commit def02a1

Browse files
committed
Require Node.js 18 and move to ESM
Closes #58
1 parent 4c2fe26 commit def02a1

9 files changed

Lines changed: 184 additions & 177 deletions

File tree

.github/workflows/main.yml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@ jobs:
1010
fail-fast: false
1111
matrix:
1212
node-version:
13-
- 14
14-
- 12
15-
- 10
16-
- 8
13+
- 20
14+
- 18
1715
steps:
1816
- uses: actions/checkout@v4
1917
- uses: actions/setup-node@v4

example-all.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
'use strict';
2-
const readline = require('readline');
3-
const logUpdate = require('log-update');
4-
const cliSpinners = require('.');
1+
import process from 'node:process';
2+
import readline from 'node:readline';
3+
import logUpdate from 'log-update';
4+
import cliSpinners from './index.js';
55

66
const spinners = Object.keys(cliSpinners);
77
let frame = 0;
@@ -34,21 +34,19 @@ readline.emitKeypressEvents(process.stdin);
3434

3535
process.stdin.setRawMode(true);
3636

37-
process.stdin.on('keypress', (str, key) => {
37+
process.stdin.on('keypress', (string_, key) => {
3838
if (key.ctrl && key.name === 'c') {
3939
// eslint-disable-next-line unicorn/no-process-exit
4040
process.exit(130);
4141
}
4242

43-
if (key.name === 'return') {
44-
if (scrutator) {
45-
clearTimeout(scrutator);
46-
showNextSpinner();
47-
}
43+
if (key.name === 'return' && scrutator) {
44+
clearTimeout(scrutator);
45+
showNextSpinner();
4846
}
4947
});
5048

51-
console.log(spinners.length + ' spinners\n');
49+
console.log(`${spinners.length} spinners\n`);
5250
showNextSpinner();
5351

5452
// $ node example-all.js

example.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
'use strict';
2-
const logUpdate = require('log-update');
3-
const cliSpinners = require('.');
1+
import process from 'node:process';
2+
import logUpdate from 'log-update';
3+
import cliSpinners from './index.js';
44

5-
const spinner = cliSpinners[process.argv[2] || 'dots'];
6-
let i = 0;
5+
const spinner = cliSpinners[process.argv[2] ?? 'dots'];
6+
let index = 0;
77

88
setInterval(() => {
99
const {frames} = spinner;
10-
logUpdate(frames[i = ++i % frames.length] + ' Unicorns');
10+
logUpdate(frames[index = ++index % frames.length] + ' Unicorns');
1111
}, spinner.interval);
1212

1313
// $ node example.js nameOfSpinner

index.d.ts

Lines changed: 118 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,128 +1,135 @@
1-
declare namespace cliSpinners {
2-
type SpinnerName =
3-
| 'dots'
4-
| 'dots2'
5-
| 'dots3'
6-
| 'dots4'
7-
| 'dots5'
8-
| 'dots6'
9-
| 'dots7'
10-
| 'dots8'
11-
| 'dots9'
12-
| 'dots10'
13-
| 'dots11'
14-
| 'dots12'
15-
| 'dots8Bit'
16-
| 'sand'
17-
| 'line'
18-
| 'line2'
19-
| 'pipe'
20-
| 'simpleDots'
21-
| 'simpleDotsScrolling'
22-
| 'star'
23-
| 'star2'
24-
| 'flip'
25-
| 'hamburger'
26-
| 'growVertical'
27-
| 'growHorizontal'
28-
| 'balloon'
29-
| 'balloon2'
30-
| 'noise'
31-
| 'bounce'
32-
| 'boxBounce'
33-
| 'boxBounce2'
34-
| 'binary'
35-
| 'triangle'
36-
| 'arc'
37-
| 'circle'
38-
| 'squareCorners'
39-
| 'circleQuarters'
40-
| 'circleHalves'
41-
| 'squish'
42-
| 'toggle'
43-
| 'toggle2'
44-
| 'toggle3'
45-
| 'toggle4'
46-
| 'toggle5'
47-
| 'toggle6'
48-
| 'toggle7'
49-
| 'toggle8'
50-
| 'toggle9'
51-
| 'toggle10'
52-
| 'toggle11'
53-
| 'toggle12'
54-
| 'toggle13'
55-
| 'arrow'
56-
| 'arrow2'
57-
| 'arrow3'
58-
| 'bouncingBar'
59-
| 'bouncingBall'
60-
| 'smiley'
61-
| 'monkey'
62-
| 'hearts'
63-
| 'clock'
64-
| 'earth'
65-
| 'material'
66-
| 'moon'
67-
| 'runner'
68-
| 'pong'
69-
| 'shark'
70-
| 'dqpb'
71-
| 'weather'
72-
| 'christmas'
73-
| 'grenade'
74-
| 'point'
75-
| 'layer'
76-
| 'betaWave'
77-
| 'fingerDance'
78-
| 'fistBump'
79-
| 'soccerHeader'
80-
| 'mindblown'
81-
| 'speaker'
82-
| 'orangePulse'
83-
| 'bluePulse'
84-
| 'orangeBluePulse'
85-
| 'timeTravel'
86-
| 'aesthetic'
87-
| 'dwarfFortress';
1+
// TODO: Load the spinner names from the JSON file.
2+
export type SpinnerName =
3+
| 'dots'
4+
| 'dots2'
5+
| 'dots3'
6+
| 'dots4'
7+
| 'dots5'
8+
| 'dots6'
9+
| 'dots7'
10+
| 'dots8'
11+
| 'dots9'
12+
| 'dots10'
13+
| 'dots11'
14+
| 'dots12'
15+
| 'dots8Bit'
16+
| 'sand'
17+
| 'line'
18+
| 'line2'
19+
| 'pipe'
20+
| 'simpleDots'
21+
| 'simpleDotsScrolling'
22+
| 'star'
23+
| 'star2'
24+
| 'flip'
25+
| 'hamburger'
26+
| 'growVertical'
27+
| 'growHorizontal'
28+
| 'balloon'
29+
| 'balloon2'
30+
| 'noise'
31+
| 'bounce'
32+
| 'boxBounce'
33+
| 'boxBounce2'
34+
| 'binary'
35+
| 'triangle'
36+
| 'arc'
37+
| 'circle'
38+
| 'squareCorners'
39+
| 'circleQuarters'
40+
| 'circleHalves'
41+
| 'squish'
42+
| 'toggle'
43+
| 'toggle2'
44+
| 'toggle3'
45+
| 'toggle4'
46+
| 'toggle5'
47+
| 'toggle6'
48+
| 'toggle7'
49+
| 'toggle8'
50+
| 'toggle9'
51+
| 'toggle10'
52+
| 'toggle11'
53+
| 'toggle12'
54+
| 'toggle13'
55+
| 'arrow'
56+
| 'arrow2'
57+
| 'arrow3'
58+
| 'bouncingBar'
59+
| 'bouncingBall'
60+
| 'smiley'
61+
| 'monkey'
62+
| 'hearts'
63+
| 'clock'
64+
| 'earth'
65+
| 'material'
66+
| 'moon'
67+
| 'runner'
68+
| 'pong'
69+
| 'shark'
70+
| 'dqpb'
71+
| 'weather'
72+
| 'christmas'
73+
| 'grenade'
74+
| 'point'
75+
| 'layer'
76+
| 'betaWave'
77+
| 'fingerDance'
78+
| 'fistBump'
79+
| 'soccerHeader'
80+
| 'mindblown'
81+
| 'speaker'
82+
| 'orangePulse'
83+
| 'bluePulse'
84+
| 'orangeBluePulse'
85+
| 'timeTravel'
86+
| 'aesthetic'
87+
| 'dwarfFortress';
8888

89-
interface Spinner {
90-
/**
91-
Recommended interval.
92-
*/
93-
readonly interval: number;
89+
export type Spinner = {
90+
/**
91+
The recommended interval.
92+
*/
93+
readonly interval: number;
9494

95-
/**
96-
A list of frames to show for the spinner.
97-
*/
98-
readonly frames: string[];
99-
}
100-
}
95+
/**
96+
A list of frames to show for the spinner.
97+
*/
98+
readonly frames: string[];
99+
};
101100

102101
/**
103102
70+ spinners for use in the terminal.
104103
105104
@example
106105
```
107-
import cliSpinners = require('cli-spinners');
106+
import cliSpinners from 'cli-spinners';
108107
109108
console.log(cliSpinners.dots);
110109
// {
111-
// interval: 80,
112-
// frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
110+
// interval: 80,
111+
// frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
113112
// }
114113
```
115114
*/
116115
declare const cliSpinners: {
117-
readonly [spinnerName in cliSpinners.SpinnerName]: cliSpinners.Spinner;
118-
} & {
119-
/**
120-
Returns a random spinner each time it's called.
121-
*/
122-
readonly random: cliSpinners.Spinner;
123-
124-
// TODO: Remove this for the next major release
125-
default: typeof cliSpinners;
116+
readonly [spinnerName in SpinnerName]: Spinner;
126117
};
127118

128-
export = cliSpinners;
119+
export default cliSpinners;
120+
121+
/**
122+
Get a random spinner.
123+
124+
@example
125+
```
126+
import {randomSpinner} from 'cli-spinners';
127+
128+
console.log(randomSpinner());
129+
// {
130+
// interval: 80,
131+
// frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
132+
// }
133+
```
134+
*/
135+
export function randomSpinner(): Spinner;

index.js

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1-
'use strict';
1+
import spinners from './spinners.json' with {type: 'json'};
22

3-
const spinners = Object.assign({}, require('./spinners.json')); // eslint-disable-line import/extensions
3+
export default spinners;
44

55
const spinnersList = Object.keys(spinners);
66

7-
Object.defineProperty(spinners, 'random', {
8-
get() {
9-
const randomIndex = Math.floor(Math.random() * spinnersList.length);
10-
const spinnerName = spinnersList[randomIndex];
11-
return spinners[spinnerName];
12-
}
13-
});
14-
15-
module.exports = spinners;
7+
export function randomSpinner() {
8+
const randomIndex = Math.floor(Math.random() * spinnersList.length);
9+
const spinnerName = spinnersList[randomIndex];
10+
return spinners[spinnerName];
11+
}

index.test-d.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

package.json

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,18 @@
1010
"email": "sindresorhus@gmail.com",
1111
"url": "https://sindresorhus.com"
1212
},
13+
"type": "module",
14+
"exports": {
15+
"types": "./index.d.ts",
16+
"default": "./index.js"
17+
},
18+
"sideEffects": false,
1319
"engines": {
14-
"node": ">=6"
20+
"node": ">=18.20"
1521
},
1622
"scripts": {
17-
"test": "xo && ava && tsd",
23+
"//test": "xo && ava && tsc --noEmit index.d.ts",
24+
"test": "ava && tsc --noEmit index.d.ts",
1825
"asciicast": "asciinema rec --command='node example-all.js' --title='cli-spinner' --quiet"
1926
},
2027
"files": [
@@ -40,11 +47,10 @@
4047
"json"
4148
],
4249
"devDependencies": {
43-
"@types/node": "^17.0.41",
44-
"ava": "^1.4.1",
45-
"log-update": "^3.2.0",
46-
"string-length": "^4.0.1",
47-
"tsd": "^0.7.2",
48-
"xo": "^0.24.0"
50+
"ava": "^6.1.2",
51+
"log-update": "^6.0.0",
52+
"string-length": "^6.0.0",
53+
"typescript": "^5.4.5",
54+
"xo": "^0.58.0"
4955
}
5056
}

0 commit comments

Comments
 (0)