termpainter 1.0.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +129 -10
  2. package/dist/cjs/badge.cjs +3 -0
  3. package/dist/cjs/badge.d.ts.map +1 -1
  4. package/dist/cjs/badge.js.map +1 -1
  5. package/dist/cjs/box.cjs +6 -3
  6. package/dist/cjs/box.d.ts.map +1 -1
  7. package/dist/cjs/box.js.map +1 -1
  8. package/dist/cjs/env.cjs +4 -0
  9. package/dist/cjs/env.d.cts +1 -0
  10. package/dist/cjs/env.d.ts +1 -0
  11. package/dist/cjs/env.d.ts.map +1 -1
  12. package/dist/cjs/env.js.map +1 -1
  13. package/dist/cjs/icons.cjs +19 -0
  14. package/dist/cjs/icons.d.cts +10 -0
  15. package/dist/cjs/icons.d.ts +10 -0
  16. package/dist/cjs/icons.d.ts.map +1 -0
  17. package/dist/cjs/icons.js.map +1 -0
  18. package/dist/cjs/index.cjs +9 -1
  19. package/dist/cjs/index.d.cts +7 -2
  20. package/dist/cjs/index.d.ts +7 -2
  21. package/dist/cjs/index.d.ts.map +1 -1
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/cjs/paint.cjs +8 -0
  24. package/dist/cjs/paint.d.cts +1 -0
  25. package/dist/cjs/paint.d.ts +1 -0
  26. package/dist/cjs/paint.d.ts.map +1 -1
  27. package/dist/cjs/paint.js.map +1 -1
  28. package/dist/cjs/silent.cjs +12 -0
  29. package/dist/cjs/silent.d.cts +3 -0
  30. package/dist/cjs/silent.d.ts +3 -0
  31. package/dist/cjs/silent.d.ts.map +1 -0
  32. package/dist/cjs/silent.js.map +1 -0
  33. package/dist/cjs/spinner.cjs +44 -0
  34. package/dist/cjs/spinner.d.cts +6 -0
  35. package/dist/cjs/spinner.d.ts +6 -0
  36. package/dist/cjs/spinner.d.ts.map +1 -0
  37. package/dist/cjs/spinner.js.map +1 -0
  38. package/dist/cjs/style.cjs +55 -8
  39. package/dist/cjs/style.d.cts +8 -4
  40. package/dist/cjs/style.d.ts +8 -4
  41. package/dist/cjs/style.d.ts.map +1 -1
  42. package/dist/cjs/style.js.map +1 -1
  43. package/dist/esm/badge.js +3 -0
  44. package/dist/esm/badge.js.map +1 -1
  45. package/dist/esm/box.js +7 -4
  46. package/dist/esm/box.js.map +1 -1
  47. package/dist/esm/env.js +3 -0
  48. package/dist/esm/env.js.map +1 -1
  49. package/dist/esm/icons.js +15 -0
  50. package/dist/esm/icons.js.map +1 -0
  51. package/dist/esm/index.js +5 -2
  52. package/dist/esm/index.js.map +1 -1
  53. package/dist/esm/paint.js +7 -0
  54. package/dist/esm/paint.js.map +1 -1
  55. package/dist/esm/silent.js +8 -0
  56. package/dist/esm/silent.js.map +1 -0
  57. package/dist/esm/spinner.js +41 -0
  58. package/dist/esm/spinner.js.map +1 -0
  59. package/dist/esm/style.js +55 -8
  60. package/dist/esm/style.js.map +1 -1
  61. package/dist/types/badge.d.ts.map +1 -1
  62. package/dist/types/box.d.ts.map +1 -1
  63. package/dist/types/env.d.ts +1 -0
  64. package/dist/types/env.d.ts.map +1 -1
  65. package/dist/types/icons.d.ts +10 -0
  66. package/dist/types/icons.d.ts.map +1 -0
  67. package/dist/types/index.d.ts +7 -2
  68. package/dist/types/index.d.ts.map +1 -1
  69. package/dist/types/paint.d.ts +1 -0
  70. package/dist/types/paint.d.ts.map +1 -1
  71. package/dist/types/silent.d.ts +3 -0
  72. package/dist/types/silent.d.ts.map +1 -0
  73. package/dist/types/spinner.d.ts +6 -0
  74. package/dist/types/spinner.d.ts.map +1 -0
  75. package/dist/types/style.d.ts +8 -4
  76. package/dist/types/style.d.ts.map +1 -1
  77. package/package.json +4 -1
package/README.md CHANGED
@@ -11,7 +11,7 @@ npm install termpainter
11
11
 
12
12
  ## usage
13
13
  ```ts
14
- import { style, badge, box, paint } from 'termpainter'
14
+ import { style, badge, box, paint, spin, strip, setIcons, setSilent, isInteractive } from 'termpainter'
15
15
  ```
16
16
 
17
17
  ### styles
@@ -27,6 +27,30 @@ style.bold('Important message') // bold white
27
27
  style.highlight('termpainter') // cyan
28
28
  ```
29
29
 
30
+ ### structured log output
31
+
32
+ any `style.*` method accepts an optional second argument — a plain object whose keys and values are printed below the message, indented and with keys in cyan.
33
+ ```ts
34
+ style.info('User created', { id: 123, role: 'admin' })
35
+ // ℹ User created
36
+ // id 123
37
+ // role admin
38
+
39
+ style.error('Request failed', { status: 503, path: '/api/data' })
40
+ ```
41
+
42
+ ### debug
43
+
44
+ only outputs when `DEBUG` is set to any truthy value. silently returns an empty string otherwise. styled gray + dim with a 🔍 prefix.
45
+ ```ts
46
+ style.debug('cache miss for key xyz')
47
+ style.debug('query executed', { rows: 42, ms: 18 })
48
+ ```
49
+ ```sh
50
+ DEBUG=1 node app.js # shows debug output
51
+ node app.js # debug lines are invisible
52
+ ```
53
+
30
54
  ### badges
31
55
 
32
56
  inline labels. good for status, versions, environments.
@@ -40,10 +64,11 @@ badge('offline', 'red')
40
64
 
41
65
  ### boxes
42
66
 
43
- draws a clean unicode border around anything. multiline works fine.
67
+ draws a clean unicode border around anything. multiline works fine. fully composable — pass styled strings directly.
44
68
  ```ts
45
69
  box('Deploy complete\n3 services restarted\nAll checks passed', 'green')
46
70
  box('Critical error\nProcess exited with code 1', 'red')
71
+ box(style.success('done')) // styled content inside a box
47
72
  ```
48
73
 
49
74
  ### divider
@@ -78,18 +103,105 @@ style.timestamp('Connection failed', 'red') // timestamp in red
78
103
 
79
104
  ### paint
80
105
 
81
- low level, for when you need something the presets dont cover.
106
+ low level, for when you need something the presets don't cover.
82
107
  ```ts
83
108
  paint('custom text', { color: 'magenta', bold: true })
84
109
  paint('highlighted', { color: 'white', bg: 'blue' })
85
110
  paint('soft note', { color: 'gray', italic: true, dim: true })
86
111
  ```
87
112
 
113
+ ### group
114
+
115
+ groups a list of already-styled lines under a labeled header.
116
+ ```ts
117
+ style.group('Deploy', [
118
+ style.info('Building'),
119
+ style.success('Done'),
120
+ ])
121
+ // ▶ Deploy
122
+ // ℹ Building
123
+ // ✔ Done
124
+
125
+ style.group('Checks', [
126
+ style.success('Lint passed'),
127
+ style.warn('Coverage at 74%'),
128
+ style.error('Tests failed'),
129
+ ])
130
+ ```
131
+
132
+ ### spinner
133
+
134
+ animated terminal spinner. returns a handle with `succeed` and `fail` to stop it. no external dependencies. automatically degrades to a single printed line when not running in a TTY (CI, piped output).
135
+ ```ts
136
+ const s = spin('Deploying...')
137
+
138
+ // later, when done:
139
+ s.succeed('Deploy complete') // stops spinner, shows style.success
140
+ s.fail('Deploy failed') // stops spinner, shows style.error
141
+
142
+ // optional: reuse the original message
143
+ s.succeed()
144
+ s.fail()
145
+ ```
146
+
147
+ ### strip
148
+
149
+ removes all ANSI escape codes from a string. useful for writing styled output to log files or comparing strings in tests.
150
+ ```ts
151
+ const raw = strip(style.success('Build complete'))
152
+ // => '✔ Build complete'
153
+
154
+ fs.appendFileSync('app.log', strip(style.info('Server started')) + '\n')
155
+ ```
156
+
157
+ ### silent mode
158
+
159
+ suppress all output globally. every function returns an empty string and produces no side effects. useful for tests, CI, and benchmarks.
160
+ ```ts
161
+ import { setSilent } from 'termpainter'
162
+
163
+ setSilent(true)
164
+
165
+ style.success('done') // ''
166
+ badge('v1.0.0', 'cyan') // ''
167
+ box('hello') // ''
168
+
169
+ setSilent(false) // restore normal output
170
+ ```
171
+
172
+ ### isInteractive
173
+
174
+ returns `true` if stdout is an interactive TTY. useful for conditionally using spinners or dynamic layouts.
175
+ ```ts
176
+ import { isInteractive } from 'termpainter'
177
+
178
+ if (isInteractive()) {
179
+ const s = spin('Loading...')
180
+ // ...
181
+ } else {
182
+ console.log(style.muted('Loading...'))
183
+ }
184
+ ```
185
+
186
+ ### custom icons
187
+
188
+ override the default icons for any or all style methods. unspecified keys fall back to defaults.
189
+ ```ts
190
+ import { setIcons } from 'termpainter'
191
+
192
+ setIcons({ success: '✓', error: '✕' })
193
+
194
+ style.success('done') // ✓ done (custom icon)
195
+ style.warn('careful') // ⚠ careful (default icon unchanged)
196
+ ```
197
+
198
+ available keys: `success`, `error`, `warn`, `info`, `debug`
199
+
88
200
  ---
89
201
 
90
202
  ## color support
91
203
 
92
- termpainter automatically strips all ANSI codes when `NO_COLOR` is set, when running in CI, or when output is piped. your logs wont be full of broken escape sequences.
204
+ termpainter automatically strips all ANSI codes when `NO_COLOR` is set, when running in CI, or when output is piped. your logs won't be full of broken escape sequences.
93
205
  ```ts
94
206
  import { isColorEnabled } from 'termpainter'
95
207
 
@@ -102,10 +214,11 @@ isColorEnabled() // true in an interactive terminal, false everywhere else
102
214
 
103
215
  | function | description |
104
216
  |---|---|
105
- | `style.error(msg)` | red, prepends ✖ |
106
- | `style.success(msg)` | green, prepends ✔ |
107
- | `style.warn(msg)` | yellow, prepends ⚠ |
108
- | `style.info(msg)` | blue, prepends ℹ |
217
+ | `style.error(msg, meta?)` | red, prepends ✖ |
218
+ | `style.success(msg, meta?)` | green, prepends ✔ |
219
+ | `style.warn(msg, meta?)` | yellow, prepends ⚠ |
220
+ | `style.info(msg, meta?)` | blue, prepends ℹ |
221
+ | `style.debug(msg, meta?)` | gray+dim, 🔍 prefix, only when `DEBUG` is set |
109
222
  | `style.muted(msg)` | gray, dimmed |
110
223
  | `style.bold(msg)` | bold white |
111
224
  | `style.highlight(msg)` | cyan |
@@ -113,7 +226,13 @@ isColorEnabled() // true in an interactive terminal, false everywhere else
113
226
  | `style.table(data, color?)` | aligned key-value table, keys in cyan |
114
227
  | `style.timestamp(msg, color?)` | prepends [HH:MM:SS], default gray |
115
228
  | `badge(text, color?)` | [text] in chosen color, default white |
116
- | `box(text, color?)` | unicode border box, multiline aware |
229
+ | `box(text, color?)` | unicode border box, multiline and ANSI-aware |
230
+ | `style.group(label, lines[])` | ▶ label in cyan, lines indented 2 spaces |
231
+ | `spin(msg)` | animated spinner, returns `{ succeed(msg?), fail(msg?) }` |
232
+ | `strip(str)` | removes all ANSI escape codes from a string |
233
+ | `setIcons(icons)` | override icons for error, success, warn, info, debug |
234
+ | `setSilent(mode)` | suppress all output globally when `true` |
235
+ | `isInteractive()` | returns `true` if stdout is a TTY |
117
236
  | `paint(text, options?)` | raw ANSI composer |
118
237
  | `isColorEnabled()` | returns true if colors are active |
119
238
 
@@ -121,4 +240,4 @@ isColorEnabled() // true in an interactive terminal, false everywhere else
121
240
 
122
241
  ## license
123
242
 
124
- MIT © Abdullah Hashmi
243
+ MIT © Abdullah Hashmi
@@ -4,7 +4,10 @@ exports.badge = badge;
4
4
  const paint_js_1 = require('./paint.cjs');
5
5
  const codes_js_1 = require('./codes.cjs');
6
6
  const env_js_1 = require('./env.cjs');
7
+ const silent_js_1 = require('./silent.cjs');
7
8
  function badge(text, color = 'white') {
9
+ if ((0, silent_js_1.isSilent)())
10
+ return '';
8
11
  if (!(0, env_js_1.isColorEnabled)())
9
12
  return `[${text}]`;
10
13
  const code = paint_js_1.fgMap[color];
@@ -1 +1 @@
1
- {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/badge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AAI/C,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,KAAe,GAAG,MAAM,CAIlE"}
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/badge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AAK/C,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,KAAe,GAAG,MAAM,CAKlE"}
@@ -1 +1 @@
1
- {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../src/badge.ts"],"names":[],"mappings":";;AAIA,sBAIC;AARD,yCAA+C;AAC/C,yCAAmC;AACnC,qCAA0C;AAE1C,SAAgB,KAAK,CAAC,IAAY,EAAE,QAAe,OAAO;IACxD,IAAI,CAAC,IAAA,uBAAc,GAAE;QAAE,OAAO,IAAI,IAAI,GAAG,CAAC;IAC1C,MAAM,IAAI,GAAG,gBAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,gBAAK,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../src/badge.ts"],"names":[],"mappings":";;AAKA,sBAKC;AAVD,yCAA+C;AAC/C,yCAAmC;AACnC,qCAA0C;AAC1C,2CAAuC;AAEvC,SAAgB,KAAK,CAAC,IAAY,EAAE,QAAe,OAAO;IACxD,IAAI,IAAA,oBAAQ,GAAE;QAAE,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAA,uBAAc,GAAE;QAAE,OAAO,IAAI,IAAI,GAAG,CAAC;IAC1C,MAAM,IAAI,GAAG,gBAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,gBAAK,EAAE,CAAC;AACpC,CAAC"}
package/dist/cjs/box.cjs CHANGED
@@ -4,14 +4,17 @@ exports.box = box;
4
4
  const paint_js_1 = require('./paint.cjs');
5
5
  const codes_js_1 = require('./codes.cjs');
6
6
  const env_js_1 = require('./env.cjs');
7
+ const silent_js_1 = require('./silent.cjs');
7
8
  function box(text, color = 'white') {
9
+ if ((0, silent_js_1.isSilent)())
10
+ return '';
8
11
  const lines = text.split('\n');
9
- const width = Math.max(...lines.map((l) => l.length));
12
+ const width = Math.max(...lines.map((l) => (0, paint_js_1.strip)(l).length));
10
13
  if (!(0, env_js_1.isColorEnabled)()) {
11
14
  const top = `╭${'─'.repeat(width + 2)}╮`;
12
15
  const bottom = `╰${'─'.repeat(width + 2)}╯`;
13
16
  const middle = lines.map((line) => {
14
- const padding = ' '.repeat(width - line.length);
17
+ const padding = ' '.repeat(width - (0, paint_js_1.strip)(line).length);
15
18
  return `│ ${line}${padding} │`;
16
19
  });
17
20
  return [top, ...middle, bottom].join('\n');
@@ -20,7 +23,7 @@ function box(text, color = 'white') {
20
23
  const top = `${c}╭${'─'.repeat(width + 2)}╮${codes_js_1.RESET}`;
21
24
  const bottom = `${c}╰${'─'.repeat(width + 2)}╯${codes_js_1.RESET}`;
22
25
  const middle = lines.map((line) => {
23
- const padding = ' '.repeat(width - line.length);
26
+ const padding = ' '.repeat(width - (0, paint_js_1.strip)(line).length);
24
27
  return `${c}│${codes_js_1.RESET} ${line}${padding} ${c}│${codes_js_1.RESET}`;
25
28
  });
26
29
  return [top, ...middle, bottom].join('\n');
@@ -1 +1 @@
1
- {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/box.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AAI/C,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,KAAe,GAAG,MAAM,CAuBhE"}
1
+ {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/box.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAgB,MAAM,YAAY,CAAC;AAKtD,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,KAAe,GAAG,MAAM,CAwBhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/box.ts"],"names":[],"mappings":";;AAIA,kBAuBC;AA3BD,yCAA+C;AAC/C,yCAAmC;AACnC,qCAA0C;AAE1C,SAAgB,GAAG,CAAC,IAAY,EAAE,QAAe,OAAO;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAEtD,IAAI,CAAC,IAAA,uBAAc,GAAE,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YAChD,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,GAAG,gBAAK,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,gBAAK,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,gBAAK,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC,IAAI,gBAAK,IAAI,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,gBAAK,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/box.ts"],"names":[],"mappings":";;AAKA,kBAwBC;AA7BD,yCAAsD;AACtD,yCAAmC;AACnC,qCAA0C;AAC1C,2CAAuC;AAEvC,SAAgB,GAAG,CAAC,IAAY,EAAE,QAAe,OAAO;IACtD,IAAI,IAAA,oBAAQ,GAAE;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,gBAAK,EAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7D,IAAI,CAAC,IAAA,uBAAc,GAAE,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAA,gBAAK,EAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;YACvD,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,GAAG,gBAAK,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,gBAAK,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,gBAAK,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAA,gBAAK,EAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC,IAAI,gBAAK,IAAI,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,gBAAK,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC"}
package/dist/cjs/env.cjs CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isInteractive = isInteractive;
3
4
  exports.isColorEnabled = isColorEnabled;
4
5
  /**
5
6
  * Returns true if ANSI color codes should be emitted.
@@ -8,6 +9,9 @@ exports.isColorEnabled = isColorEnabled;
8
9
  * - CI env var is set (raw escape codes look broken in most CI logs)
9
10
  * - process.stdout.isTTY is false/undefined (output is being piped)
10
11
  */
12
+ function isInteractive() {
13
+ return process.stdout.isTTY === true;
14
+ }
11
15
  function isColorEnabled() {
12
16
  if (process.env.NO_COLOR !== undefined)
13
17
  return false;
@@ -5,5 +5,6 @@
5
5
  * - CI env var is set (raw escape codes look broken in most CI logs)
6
6
  * - process.stdout.isTTY is false/undefined (output is being piped)
7
7
  */
8
+ export declare function isInteractive(): boolean;
8
9
  export declare function isColorEnabled(): boolean;
9
10
  //# sourceMappingURL=env.d.ts.map
package/dist/cjs/env.d.ts CHANGED
@@ -5,5 +5,6 @@
5
5
  * - CI env var is set (raw escape codes look broken in most CI logs)
6
6
  * - process.stdout.isTTY is false/undefined (output is being piped)
7
7
  */
8
+ export declare function isInteractive(): boolean;
8
9
  export declare function isColorEnabled(): boolean;
9
10
  //# sourceMappingURL=env.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAKxC"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAKxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":";;AAOA,wCAKC;AAZD;;;;;;GAMG;AACH,SAAgB,cAAc;IAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/env.ts"],"names":[],"mappings":";;AAOA,sCAEC;AAED,wCAKC;AAhBD;;;;;;GAMG;AACH,SAAgB,aAAa;IAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AACvC,CAAC;AAED,SAAgB,cAAc;IAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setIcons = setIcons;
4
+ exports.getIcons = getIcons;
5
+ const defaults = {
6
+ error: '✖',
7
+ success: '✔',
8
+ warn: '⚠',
9
+ info: 'ℹ',
10
+ debug: '🔍',
11
+ };
12
+ let current = { ...defaults };
13
+ function setIcons(icons) {
14
+ current = { ...defaults, ...icons };
15
+ }
16
+ function getIcons() {
17
+ return current;
18
+ }
19
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1,10 @@
1
+ export interface Icons {
2
+ error: string;
3
+ success: string;
4
+ warn: string;
5
+ info: string;
6
+ debug: string;
7
+ }
8
+ export declare function setIcons(icons: Partial<Icons>): void;
9
+ export declare function getIcons(): Icons;
10
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +1,10 @@
1
+ export interface Icons {
2
+ error: string;
3
+ success: string;
4
+ warn: string;
5
+ info: string;
6
+ debug: string;
7
+ }
8
+ export declare function setIcons(icons: Partial<Icons>): void;
9
+ export declare function getIcons(): Icons;
10
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/icons.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAYD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAEpD;AAED,wBAAgB,QAAQ,IAAI,KAAK,CAEhC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/icons.ts"],"names":[],"mappings":";;AAkBA,4BAEC;AAED,4BAEC;AAhBD,MAAM,QAAQ,GAAU;IACtB,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,IAAI;CACZ,CAAC;AAEF,IAAI,OAAO,GAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;AAErC,SAAgB,QAAQ,CAAC,KAAqB;IAC5C,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,SAAgB,QAAQ;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -14,16 +14,24 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.isColorEnabled = exports.box = exports.badge = exports.style = exports.paint = void 0;
17
+ exports.isInteractive = exports.isColorEnabled = exports.setSilent = exports.setIcons = exports.spin = exports.box = exports.badge = exports.style = exports.strip = exports.paint = void 0;
18
18
  var paint_js_1 = require('./paint.cjs');
19
19
  Object.defineProperty(exports, "paint", { enumerable: true, get: function () { return paint_js_1.paint; } });
20
+ Object.defineProperty(exports, "strip", { enumerable: true, get: function () { return paint_js_1.strip; } });
20
21
  var style_js_1 = require('./style.cjs');
21
22
  Object.defineProperty(exports, "style", { enumerable: true, get: function () { return style_js_1.style; } });
22
23
  var badge_js_1 = require('./badge.cjs');
23
24
  Object.defineProperty(exports, "badge", { enumerable: true, get: function () { return badge_js_1.badge; } });
24
25
  var box_js_1 = require('./box.cjs');
25
26
  Object.defineProperty(exports, "box", { enumerable: true, get: function () { return box_js_1.box; } });
27
+ var spinner_js_1 = require('./spinner.cjs');
28
+ Object.defineProperty(exports, "spin", { enumerable: true, get: function () { return spinner_js_1.spin; } });
29
+ var icons_js_1 = require('./icons.cjs');
30
+ Object.defineProperty(exports, "setIcons", { enumerable: true, get: function () { return icons_js_1.setIcons; } });
31
+ var silent_js_1 = require('./silent.cjs');
32
+ Object.defineProperty(exports, "setSilent", { enumerable: true, get: function () { return silent_js_1.setSilent; } });
26
33
  var env_js_1 = require('./env.cjs');
27
34
  Object.defineProperty(exports, "isColorEnabled", { enumerable: true, get: function () { return env_js_1.isColorEnabled; } });
35
+ Object.defineProperty(exports, "isInteractive", { enumerable: true, get: function () { return env_js_1.isInteractive; } });
28
36
  __exportStar(require('./codes.cjs'), exports);
29
37
  //# sourceMappingURL=index.js.map
@@ -1,8 +1,13 @@
1
- export { paint } from './paint.js';
1
+ export { paint, strip } from './paint.js';
2
2
  export type { PaintOptions, Color } from './paint.js';
3
3
  export { style } from './style.js';
4
4
  export { badge } from './badge.js';
5
5
  export { box } from './box.js';
6
- export { isColorEnabled } from './env.js';
6
+ export { spin } from './spinner.js';
7
+ export type { SpinnerHandle } from './spinner.js';
8
+ export { setIcons } from './icons.js';
9
+ export type { Icons } from './icons.js';
10
+ export { setSilent } from './silent.js';
11
+ export { isColorEnabled, isInteractive } from './env.js';
7
12
  export * from './codes.js';
8
13
  //# sourceMappingURL=index.d.ts.map
@@ -1,8 +1,13 @@
1
- export { paint } from './paint.js';
1
+ export { paint, strip } from './paint.js';
2
2
  export type { PaintOptions, Color } from './paint.js';
3
3
  export { style } from './style.js';
4
4
  export { badge } from './badge.js';
5
5
  export { box } from './box.js';
6
- export { isColorEnabled } from './env.js';
6
+ export { spin } from './spinner.js';
7
+ export type { SpinnerHandle } from './spinner.js';
8
+ export { setIcons } from './icons.js';
9
+ export type { Icons } from './icons.js';
10
+ export { setSilent } from './silent.js';
11
+ export { isColorEnabled, isInteractive } from './env.js';
7
12
  export * from './codes.js';
8
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzD,cAAc,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AAEd,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AACd,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AACd,mCAA+B;AAAtB,6FAAA,GAAG,OAAA;AACZ,mCAA0C;AAAjC,wGAAA,cAAc,OAAA;AACvB,6CAA2B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uCAA0C;AAAjC,iGAAA,KAAK,OAAA;AAAE,iGAAA,KAAK,OAAA;AAErB,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AACd,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AACd,mCAA+B;AAAtB,6FAAA,GAAG,OAAA;AACZ,2CAAoC;AAA3B,kGAAA,IAAI,OAAA;AAEb,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AAEjB,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,mCAAyD;AAAhD,wGAAA,cAAc,OAAA;AAAE,uGAAA,aAAa,OAAA;AACtC,6CAA2B"}
@@ -2,8 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.bgMap = exports.fgMap = void 0;
4
4
  exports.paint = paint;
5
+ exports.strip = strip;
5
6
  const codes_js_1 = require('./codes.cjs');
6
7
  const env_js_1 = require('./env.cjs');
8
+ const silent_js_1 = require('./silent.cjs');
7
9
  const fgMap = {
8
10
  black: codes_js_1.BLACK,
9
11
  red: codes_js_1.RED,
@@ -29,6 +31,8 @@ const bgMap = {
29
31
  };
30
32
  exports.bgMap = bgMap;
31
33
  function paint(text, options = {}) {
34
+ if ((0, silent_js_1.isSilent)())
35
+ return '';
32
36
  if (!(0, env_js_1.isColorEnabled)())
33
37
  return text;
34
38
  let prefix = '';
@@ -48,4 +52,8 @@ function paint(text, options = {}) {
48
52
  return text;
49
53
  return `${prefix}${text}${codes_js_1.RESET}`;
50
54
  }
55
+ function strip(str) {
56
+ // eslint-disable-next-line no-control-regex
57
+ return str.replace(/\x1b\[[0-9;]*m/g, '');
58
+ }
51
59
  //# sourceMappingURL=paint.js.map
@@ -10,5 +10,6 @@ export interface PaintOptions {
10
10
  declare const fgMap: Record<Color, string>;
11
11
  declare const bgMap: Record<Color, string>;
12
12
  export declare function paint(text: string, options?: PaintOptions): string;
13
+ export declare function strip(str: string): string;
13
14
  export { fgMap, bgMap };
14
15
  //# sourceMappingURL=paint.d.ts.map
@@ -10,5 +10,6 @@ export interface PaintOptions {
10
10
  declare const fgMap: Record<Color, string>;
11
11
  declare const bgMap: Record<Color, string>;
12
12
  export declare function paint(text: string, options?: PaintOptions): string;
13
+ export declare function strip(str: string): string;
13
14
  export { fgMap, bgMap };
14
15
  //# sourceMappingURL=paint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/paint.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1G,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAUhC,CAAC;AAEF,QAAA,MAAM,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAUhC,CAAC;AAEF,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAWtE;AAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/paint.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1G,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAUhC,CAAC;AAEF,QAAA,MAAM,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAUhC,CAAC;AAEF,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAYtE;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"paint.js","sourceRoot":"","sources":["../../src/paint.ts"],"names":[],"mappings":";;;AA0CA,sBAWC;AArDD,yCAIoB;AACpB,qCAA0C;AAa1C,MAAM,KAAK,GAA0B;IACnC,KAAK,EAAE,gBAAK;IACZ,GAAG,EAAE,cAAG;IACR,KAAK,EAAE,gBAAK;IACZ,MAAM,EAAE,iBAAM;IACd,IAAI,EAAE,eAAI;IACV,OAAO,EAAE,kBAAO;IAChB,IAAI,EAAE,eAAI;IACV,KAAK,EAAE,gBAAK;IACZ,IAAI,EAAE,eAAI;CACX,CAAC;AA2BO,sBAAK;AAzBd,MAAM,KAAK,GAA0B;IACnC,KAAK,EAAE,mBAAQ;IACf,GAAG,EAAE,iBAAM;IACX,KAAK,EAAE,mBAAQ;IACf,MAAM,EAAE,oBAAS;IACjB,IAAI,EAAE,kBAAO;IACb,OAAO,EAAE,qBAAU;IACnB,IAAI,EAAE,kBAAO;IACb,KAAK,EAAE,mBAAQ;IACf,IAAI,EAAE,kBAAO;CACd,CAAC;AAec,sBAAK;AAbrB,SAAgB,KAAK,CAAC,IAAY,EAAE,UAAwB,EAAE;IAC5D,IAAI,CAAC,IAAA,uBAAc,GAAE;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,OAAO,CAAC,IAAI;QAAE,MAAM,IAAI,eAAI,CAAC;IACjC,IAAI,OAAO,CAAC,GAAG;QAAE,MAAM,IAAI,cAAG,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,iBAAM,CAAC;IACrC,IAAI,OAAO,CAAC,SAAS;QAAE,MAAM,IAAI,oBAAS,CAAC;IAC3C,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,gBAAK,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"paint.js","sourceRoot":"","sources":["../../src/paint.ts"],"names":[],"mappings":";;;AA2CA,sBAYC;AAED,sBAGC;AA5DD,yCAIoB;AACpB,qCAA0C;AAC1C,2CAAuC;AAavC,MAAM,KAAK,GAA0B;IACnC,KAAK,EAAE,gBAAK;IACZ,GAAG,EAAE,cAAG;IACR,KAAK,EAAE,gBAAK;IACZ,MAAM,EAAE,iBAAM;IACd,IAAI,EAAE,eAAI;IACV,OAAO,EAAE,kBAAO;IAChB,IAAI,EAAE,eAAI;IACV,KAAK,EAAE,gBAAK;IACZ,IAAI,EAAE,eAAI;CACX,CAAC;AAiCO,sBAAK;AA/Bd,MAAM,KAAK,GAA0B;IACnC,KAAK,EAAE,mBAAQ;IACf,GAAG,EAAE,iBAAM;IACX,KAAK,EAAE,mBAAQ;IACf,MAAM,EAAE,oBAAS;IACjB,IAAI,EAAE,kBAAO;IACb,OAAO,EAAE,qBAAU;IACnB,IAAI,EAAE,kBAAO;IACb,KAAK,EAAE,mBAAQ;IACf,IAAI,EAAE,kBAAO;CACd,CAAC;AAqBc,sBAAK;AAnBrB,SAAgB,KAAK,CAAC,IAAY,EAAE,UAAwB,EAAE;IAC5D,IAAI,IAAA,oBAAQ,GAAE;QAAE,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAA,uBAAc,GAAE;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,OAAO,CAAC,IAAI;QAAE,MAAM,IAAI,eAAI,CAAC;IACjC,IAAI,OAAO,CAAC,GAAG;QAAE,MAAM,IAAI,cAAG,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,iBAAM,CAAC;IACrC,IAAI,OAAO,CAAC,SAAS;QAAE,MAAM,IAAI,oBAAS,CAAC;IAC3C,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,gBAAK,EAAE,CAAC;AACpC,CAAC;AAED,SAAgB,KAAK,CAAC,GAAW;IAC/B,4CAA4C;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setSilent = setSilent;
4
+ exports.isSilent = isSilent;
5
+ let silentMode = false;
6
+ function setSilent(mode) {
7
+ silentMode = mode;
8
+ }
9
+ function isSilent() {
10
+ return silentMode;
11
+ }
12
+ //# sourceMappingURL=silent.js.map
@@ -0,0 +1,3 @@
1
+ export declare function setSilent(mode: boolean): void;
2
+ export declare function isSilent(): boolean;
3
+ //# sourceMappingURL=silent.d.ts.map
@@ -0,0 +1,3 @@
1
+ export declare function setSilent(mode: boolean): void;
2
+ export declare function isSilent(): boolean;
3
+ //# sourceMappingURL=silent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"silent.d.ts","sourceRoot":"","sources":["../../src/silent.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAElC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"silent.js","sourceRoot":"","sources":["../../src/silent.ts"],"names":[],"mappings":";;AAEA,8BAEC;AAED,4BAEC;AARD,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,SAAgB,SAAS,CAAC,IAAa;IACrC,UAAU,GAAG,IAAI,CAAC;AACpB,CAAC;AAED,SAAgB,QAAQ;IACtB,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.spin = spin;
4
+ const style_js_1 = require('./style.cjs');
5
+ const silent_js_1 = require('./silent.cjs');
6
+ const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
7
+ function spin(msg) {
8
+ if ((0, silent_js_1.isSilent)()) {
9
+ return {
10
+ succeed(_) { },
11
+ fail(_) { },
12
+ };
13
+ }
14
+ if (!process.stdout.isTTY) {
15
+ process.stdout.write(style_js_1.style.muted(msg) + '\n');
16
+ return {
17
+ succeed(newMsg) {
18
+ process.stdout.write(style_js_1.style.success(newMsg ?? msg) + '\n');
19
+ },
20
+ fail(newMsg) {
21
+ process.stdout.write(style_js_1.style.error(newMsg ?? msg) + '\n');
22
+ },
23
+ };
24
+ }
25
+ let i = 0;
26
+ const timer = setInterval(() => {
27
+ const frame = FRAMES[i % FRAMES.length];
28
+ process.stdout.write(`\r\x1b[K${frame} ${msg}`);
29
+ i++;
30
+ }, 80);
31
+ function stop(output) {
32
+ clearInterval(timer);
33
+ process.stdout.write(`\r\x1b[K${output}\n`);
34
+ }
35
+ return {
36
+ succeed(newMsg) {
37
+ stop(style_js_1.style.success(newMsg ?? msg));
38
+ },
39
+ fail(newMsg) {
40
+ stop(style_js_1.style.error(newMsg ?? msg));
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1,6 @@
1
+ export interface SpinnerHandle {
2
+ succeed(msg?: string): void;
3
+ fail(msg?: string): void;
4
+ }
5
+ export declare function spin(msg: string): SpinnerHandle;
6
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1,6 @@
1
+ export interface SpinnerHandle {
2
+ succeed(msg?: string): void;
3
+ fail(msg?: string): void;
4
+ }
5
+ export declare function spin(msg: string): SpinnerHandle;
6
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/spinner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAwC/C"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/spinner.ts"],"names":[],"mappings":";;AAUA,oBAwCC;AAlDD,yCAAmC;AACnC,2CAAuC;AAEvC,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAOlE,SAAgB,IAAI,CAAC,GAAW;IAC9B,IAAI,IAAA,oBAAQ,GAAE,EAAE,CAAC;QACf,OAAO;YACL,OAAO,CAAC,CAAU,IAAS,CAAC;YAC5B,IAAI,CAAC,CAAU,IAAS,CAAC;SAC1B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9C,OAAO;YACL,OAAO,CAAC,MAAe;gBACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAK,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,CAAC,MAAe;gBAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAK,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1D,CAAC;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;QAChD,CAAC,EAAE,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,IAAI,CAAC,MAAc;QAC1B,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,OAAO,CAAC,MAAe;YACrB,IAAI,CAAC,gBAAK,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,MAAe;YAClB,IAAI,CAAC,gBAAK,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}