@peteanderson/ansi 0.3.2 → 1.0.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 (182) hide show
  1. package/dist/ansi.d.ts +28 -37
  2. package/dist/ansi.d.ts.map +1 -0
  3. package/dist/ansi.js +29 -52
  4. package/dist/ansi.js.map +1 -0
  5. package/dist/caret.d.ts +5 -3
  6. package/dist/caret.d.ts.map +1 -0
  7. package/dist/caret.js +6 -8
  8. package/dist/caret.js.map +1 -0
  9. package/dist/erase.d.ts +5 -1
  10. package/dist/erase.d.ts.map +1 -0
  11. package/dist/erase.js +4 -2
  12. package/dist/erase.js.map +1 -0
  13. package/dist/features/build.d.ts +7 -11
  14. package/dist/features/build.d.ts.map +1 -0
  15. package/dist/features/build.js +12 -25
  16. package/dist/features/build.js.map +1 -0
  17. package/dist/features/detect.d.ts +4 -4
  18. package/dist/features/detect.d.ts.map +1 -0
  19. package/dist/features/detect.js +5 -6
  20. package/dist/features/detect.js.map +1 -0
  21. package/dist/features/features.d.ts +4 -4
  22. package/dist/features/features.d.ts.map +1 -0
  23. package/dist/features/features.js +24 -34
  24. package/dist/features/features.js.map +1 -0
  25. package/dist/features/index.d.ts +2 -2
  26. package/dist/features/index.d.ts.map +1 -0
  27. package/dist/features/index.js +17 -1
  28. package/dist/features/index.js.map +1 -0
  29. package/dist/features/types.d.ts +10 -0
  30. package/dist/features/types.d.ts.map +1 -0
  31. package/dist/features/types.js +3 -0
  32. package/dist/features/types.js.map +1 -0
  33. package/dist/index.d.ts +3 -81
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +23 -1
  36. package/dist/index.js.map +1 -0
  37. package/dist/pad.d.ts +3 -12
  38. package/dist/pad.d.ts.map +1 -0
  39. package/dist/pad.js +8 -14
  40. package/dist/pad.js.map +1 -0
  41. package/dist/patterns.d.ts +4 -3
  42. package/dist/patterns.d.ts.map +1 -0
  43. package/dist/patterns.js +6 -4
  44. package/dist/patterns.js.map +1 -0
  45. package/dist/scroll.d.ts +5 -3
  46. package/dist/scroll.d.ts.map +1 -0
  47. package/dist/scroll.js +6 -6
  48. package/dist/scroll.js.map +1 -0
  49. package/dist/sgr/color/color.d.ts +5 -9
  50. package/dist/sgr/color/color.d.ts.map +1 -0
  51. package/dist/sgr/color/color.js +22 -29
  52. package/dist/sgr/color/color.js.map +1 -0
  53. package/dist/sgr/color/index.d.ts +2 -2
  54. package/dist/sgr/color/index.d.ts.map +1 -0
  55. package/dist/sgr/color/index.js +17 -1
  56. package/dist/sgr/color/index.js.map +1 -0
  57. package/dist/sgr/color/test-rgb.d.ts +3 -0
  58. package/dist/sgr/color/test-rgb.d.ts.map +1 -0
  59. package/dist/sgr/color/test-rgb.js +149 -0
  60. package/dist/sgr/color/test-rgb.js.map +1 -0
  61. package/dist/sgr/color/types.d.ts +30 -0
  62. package/dist/sgr/color/types.d.ts.map +1 -0
  63. package/dist/sgr/color/types.js +3 -0
  64. package/dist/sgr/color/types.js.map +1 -0
  65. package/dist/sgr/color/utils.d.ts +7 -27
  66. package/dist/sgr/color/utils.d.ts.map +1 -0
  67. package/dist/sgr/color/utils.js +17 -32
  68. package/dist/sgr/color/utils.js.map +1 -0
  69. package/dist/sgr/index.d.ts +4 -9
  70. package/dist/sgr/index.d.ts.map +1 -0
  71. package/dist/sgr/index.js +18 -4
  72. package/dist/sgr/index.js.map +1 -0
  73. package/dist/sgr/reset.d.ts +2 -1
  74. package/dist/sgr/reset.d.ts.map +1 -0
  75. package/dist/sgr/reset.js +4 -1
  76. package/dist/sgr/reset.js.map +1 -0
  77. package/dist/sgr/sgr.d.ts +4 -3
  78. package/dist/sgr/sgr.d.ts.map +1 -0
  79. package/dist/sgr/sgr.js +8 -22
  80. package/dist/sgr/sgr.js.map +1 -0
  81. package/dist/sgr/style.d.ts +3 -1
  82. package/dist/sgr/style.d.ts.map +1 -0
  83. package/dist/sgr/style.js +5 -3
  84. package/dist/sgr/style.js.map +1 -0
  85. package/dist/sgr/utils.d.ts +3 -2
  86. package/dist/sgr/utils.d.ts.map +1 -0
  87. package/dist/sgr/utils.js +3 -3
  88. package/dist/sgr/utils.js.map +1 -0
  89. package/dist/simplify/atom.d.ts +4 -3
  90. package/dist/simplify/atom.d.ts.map +1 -0
  91. package/dist/simplify/atom.js +12 -9
  92. package/dist/simplify/atom.js.map +1 -0
  93. package/dist/simplify/index.d.ts +2 -2
  94. package/dist/simplify/index.d.ts.map +1 -0
  95. package/dist/simplify/index.js +17 -1
  96. package/dist/simplify/index.js.map +1 -0
  97. package/dist/simplify/lookup.d.ts +3 -5
  98. package/dist/simplify/lookup.d.ts.map +1 -0
  99. package/dist/simplify/lookup.js +9 -13
  100. package/dist/simplify/lookup.js.map +1 -0
  101. package/dist/simplify/simplify.d.ts +2 -1
  102. package/dist/simplify/simplify.d.ts.map +1 -0
  103. package/dist/simplify/simplify.js +7 -7
  104. package/dist/simplify/simplify.js.map +1 -0
  105. package/dist/simplify/state.d.ts +3 -8
  106. package/dist/simplify/state.d.ts.map +1 -0
  107. package/dist/simplify/state.js +9 -13
  108. package/dist/simplify/state.js.map +1 -0
  109. package/dist/simplify/test.d.ts +2 -0
  110. package/dist/simplify/test.d.ts.map +1 -0
  111. package/dist/simplify/test.js +64 -0
  112. package/dist/simplify/test.js.map +1 -0
  113. package/dist/simplify/types.d.ts +9 -0
  114. package/dist/simplify/types.d.ts.map +1 -0
  115. package/dist/simplify/types.js +3 -0
  116. package/dist/simplify/types.js.map +1 -0
  117. package/dist/simplify/utils.d.ts +3 -2
  118. package/dist/simplify/utils.d.ts.map +1 -0
  119. package/dist/simplify/utils.js +4 -3
  120. package/dist/simplify/utils.js.map +1 -0
  121. package/dist/slice.d.ts +21 -1
  122. package/dist/slice.d.ts.map +1 -0
  123. package/dist/slice.js +10 -22
  124. package/dist/slice.js.map +1 -0
  125. package/dist/strip.d.ts +4 -15
  126. package/dist/strip.d.ts.map +1 -0
  127. package/dist/strip.js +10 -17
  128. package/dist/strip.js.map +1 -0
  129. package/dist/terminal.d.ts +5 -1
  130. package/dist/terminal.d.ts.map +1 -0
  131. package/dist/terminal.js +4 -2
  132. package/dist/terminal.js.map +1 -0
  133. package/package.json +9 -22
  134. package/src/ansi.ts +71 -0
  135. package/src/{caret.js → caret.ts} +9 -15
  136. package/src/{erase.js → erase.ts} +7 -10
  137. package/src/features/build.ts +52 -0
  138. package/src/features/detect.ts +33 -0
  139. package/src/features/features.ts +48 -0
  140. package/src/features/index.ts +1 -0
  141. package/src/features/{types.d.ts → types.ts} +1 -1
  142. package/src/index.ts +2 -0
  143. package/src/pad.ts +7 -0
  144. package/src/{patterns.js → patterns.ts} +3 -5
  145. package/src/scroll.ts +13 -0
  146. package/src/sgr/color/{color.js → color.ts} +26 -35
  147. package/src/sgr/color/index.ts +1 -0
  148. package/src/sgr/color/{types.d.ts → types.ts} +6 -2
  149. package/src/sgr/color/utils.ts +58 -0
  150. package/src/sgr/index.ts +3 -0
  151. package/src/sgr/reset.ts +1 -0
  152. package/src/sgr/sgr.ts +68 -0
  153. package/src/sgr/{style.js → style.ts} +3 -5
  154. package/src/sgr/{utils.js → utils.ts} +3 -6
  155. package/src/simplify/{atom.js → atom.ts} +11 -13
  156. package/src/simplify/index.ts +1 -0
  157. package/src/simplify/{lookup.js → lookup.ts} +5 -14
  158. package/src/simplify/{simplify.js → simplify.ts} +4 -10
  159. package/src/simplify/state.ts +63 -0
  160. package/src/simplify/{types.d.ts → types.ts} +5 -5
  161. package/src/simplify/{utils.js → utils.ts} +4 -10
  162. package/src/{slice.js → slice.ts} +12 -26
  163. package/src/strip.ts +5 -0
  164. package/src/{terminal.js → terminal.ts} +4 -7
  165. package/LICENSE +0 -7
  166. package/README.md +0 -174
  167. package/src/ansi.js +0 -70
  168. package/src/features/build.js +0 -68
  169. package/src/features/detect.js +0 -40
  170. package/src/features/features.js +0 -53
  171. package/src/features/index.js +0 -1
  172. package/src/index.js +0 -1
  173. package/src/pad.js +0 -21
  174. package/src/scroll.js +0 -18
  175. package/src/sgr/color/index.js +0 -1
  176. package/src/sgr/color/utils.js +0 -81
  177. package/src/sgr/index.js +0 -5
  178. package/src/sgr/reset.js +0 -3
  179. package/src/sgr/sgr.js +0 -77
  180. package/src/simplify/index.js +0 -1
  181. package/src/simplify/state.js +0 -73
  182. package/src/strip.js +0 -23
@@ -1,81 +0,0 @@
1
- /** @typedef {import("../sgr").Code} Code */
2
-
3
- /** @type {(r: number, g: number, b: number) => number} */
4
- function rgbToX256(r, g, b) {
5
- if (r === g && g === b) {
6
- // grayscale
7
- return 232 + Math.floor(r * 24 / 256);
8
- }
9
-
10
- // 6x6x6 color cube
11
- return (
12
- 16 +
13
- Math.floor(r * 6 / 256) * 36 +
14
- Math.floor(g * 6 / 256) * 6 +
15
- Math.floor(b * 6 / 256)
16
- );
17
- }
18
-
19
- /** @type {(code: number) => [number, number, number]} */
20
- function x256ToRgb(code) {
21
- if (code >= 232) {
22
- // grayscale
23
- const gray = Math.round((code - 232) * 255 / 24);
24
- return [gray, gray, gray];
25
- }
26
-
27
- code -= 16;
28
- const r = Math.floor(code / 36) * 51;
29
- const g = Math.floor((code % 36) / 6) * 51;
30
- const b = (code % 6) * 51;
31
- return [r, g, b];
32
- }
33
-
34
- /** @type {(r: number, g: number, b: number) => number} */
35
- function rgbToX16(r, g, b) {
36
- // First calculate it as a 4x4x4 cube.
37
-
38
- r = Math.min(2, Math.floor(r / 85));
39
- g = Math.min(2, Math.floor(g / 85));
40
- b = Math.min(2, Math.floor(b / 85));
41
-
42
- // Which channels are "on" determines the hue (ANSI color index 0–7).
43
- const index = (r ? 1 : 0) | (g ? 2 : 0) | (b ? 4 : 0);
44
-
45
- // The bright bit is derived from the max channel level across all three.
46
- const twos = (r === 2 ? 1 : 0) + (g === 2 ? 1 : 0) + (b === 2 ? 1 : 0);
47
- const ones = (r === 1 ? 1 : 0) + (g === 1 ? 1 : 0) + (b === 1 ? 1 : 0);
48
- const bright = twos > 0 && twos >= ones;
49
-
50
- // Return value uses the SGR offset scheme: 0–7 for normal, 60–67 for bright.
51
- return index + (bright ? 60 : 0);
52
- }
53
-
54
- /** @type {(r: number, g: number, b: number) => number} */
55
- function rgbToX8(r, g, b) {
56
- r = r >= 128 ? 1 : 0;
57
- g = g >= 128 ? 1 : 0;
58
- b = b >= 128 ? 1 : 0;
59
-
60
- return (r ? 1 : 0) | (g ? 2 : 0) | (b ? 4 : 0);
61
- }
62
-
63
- /**
64
- * @overload
65
- * @param {number} x
66
- * @returns {number}
67
- * @overload
68
- * @param {number} r
69
- * @param {number} g
70
- * @param {number} b
71
- * @returns {[number, number, number]}
72
- *//** @param {[number] | [number, number, number]} args */
73
- const clip = (...args) => args.length === 1 ?
74
- Math.max(0, Math.min(255, Math.floor(args[0]))) :
75
- [
76
- Math.max(0, Math.min(255, Math.floor(args[0]))),
77
- Math.max(0, Math.min(255, Math.floor(args[1]))),
78
- Math.max(0, Math.min(255, Math.floor(args[2]))),
79
- ];
80
-
81
- module.exports = {rgbToX256, x256ToRgb, rgbToX16, rgbToX8, clip};
package/src/sgr/index.js DELETED
@@ -1,5 +0,0 @@
1
- module.exports = {
2
- ...require("./reset"),
3
- ...require("./style"),
4
- ...require("./color"),
5
- };
package/src/sgr/reset.js DELETED
@@ -1,3 +0,0 @@
1
- const makeReset = (enabled = true) => enabled ? "\x1b[0m" : "";
2
-
3
- module.exports = {makeReset};
package/src/sgr/sgr.js DELETED
@@ -1,77 +0,0 @@
1
- "use strict";
2
-
3
- /**
4
- @typedef {number | number[]} Code
5
- @typedef {{
6
- (text: string): string;
7
- open : string;
8
- close : string;
9
- codes : {open: Code, close: Code};
10
- combine : (...styles: SGR[]) => SGR;
11
- }} SGR
12
- */
13
-
14
- /** @type {(code: Code, codes: Code[]) => Code} */
15
- function combine(code, codes, ) {
16
- if (!codes.length)
17
- return code;
18
-
19
- const rtn = Array.isArray(code) ? [...code] : [code];
20
-
21
- for (const c of codes) {
22
- if (Array.isArray(c))
23
- rtn.push(...c);
24
- else
25
- rtn.push(c);
26
- }
27
-
28
- return rtn;
29
- }
30
-
31
- /** @type {(code: Code) => string | number} */
32
- const codeSequence = code => Array.isArray(code) ? code.join(';') : code;
33
-
34
- /** @type {(open: Code, close: Code, reset?: boolean) => SGR} */
35
- function sgr(open, close, reset = false) {
36
- const openCode = codeSequence(open);
37
- const closeCode = codeSequence(close);
38
- const openSequence = `\x1b[${openCode}m`;
39
- const closeSequence = `\x1b[${closeCode}m`;
40
- const reopenCode = reset ? `${closeCode};${openCode}` : openCode;
41
-
42
- const rxClose = new RegExp(
43
- `(?<start>\\x1b\\[(?:\\d+;)*)${closeCode}(?<end>(?:;\\d+)*m)`,
44
- "g"
45
- );
46
- const replace = `$<start>${reopenCode}$<end>`;
47
-
48
- /** @type {(text: string) => string} */
49
- const func = s => openSequence + s.replace(rxClose, replace) + closeSequence;
50
-
51
- return Object.assign(func, {
52
- codes : {open, close},
53
- open : openSequence,
54
- close : closeSequence,
55
-
56
- /** @type {(...styles: SGR[]) => SGR} */
57
- combine: (...styles) => sgr(
58
- combine(open, styles.map(s => s.codes.open)),
59
- combine(close, styles.map(s => s.codes.close)),
60
- ),
61
- });
62
- };
63
-
64
- /** @type {SGR} */
65
- const disabledSGR = Object.assign(/** @type {(text: string) => string} */ s => s, {
66
- codes : {open: 0, close: 0},
67
- open : "",
68
- close : "",
69
- combine : () => disabledSGR,
70
- });
71
-
72
- /** @type {typeof sgr} */
73
- const disabled = () => disabledSGR;
74
-
75
- const makeSGR = (enabled = true) => enabled ? sgr : disabled;
76
-
77
- module.exports = {makeSGR};
@@ -1 +0,0 @@
1
- module.exports = require("./simplify");
@@ -1,73 +0,0 @@
1
- "use strict";
2
-
3
- const {lookUpAtom} = require("./lookup");
4
- const {arraysEqual, transitionIntensity} = require("./utils");
5
-
6
- /** @typedef {import("./types").Attribute} Attribute */
7
- /** @typedef {import("./types").AttributeMap} AttributeMap */
8
-
9
- /** @type {Map<Attribute, number[]>} */
10
- const defaultCodes = new Map([
11
- ["intensity", [22]],
12
- ["italic", [23]],
13
- ["underline", [24]],
14
- ["inverse", [27]],
15
- ["hidden", [28]],
16
- ["strikethrough",[29]],
17
- ["fg", [39]],
18
- ["bg", [49]],
19
- ["frame", [54]],
20
- ["overline", [55]],
21
- ]);
22
-
23
- /** @type {AttributeMap} */
24
- class State extends Map {
25
- /** @type {(codes: number[]) => number[]} */
26
- update(codes) {
27
- /** @type {AttributeMap} */
28
- let snapshot = new Map(this);
29
-
30
- /** @type {Set<Attribute>} */
31
- const attributes = new Set();
32
-
33
- for (let i = 0; i < codes.length; i++) {
34
- const {attribute, code, skip} = lookUpAtom(codes, i, this);
35
-
36
- if (attribute === "reset") {
37
- attributes.clear();
38
- this.clear();
39
- attributes.add("reset");
40
- for (const [attr, defaultCode] of defaultCodes)
41
- this.set(attr, defaultCode);
42
-
43
- snapshot = new Map(this);
44
- continue;
45
- }
46
-
47
- attributes.add(attribute);
48
- this.set(attribute, code);
49
-
50
- if (skip)
51
- i += skip;
52
- }
53
-
54
- return Array.from(attributes).flatMap(attribute => {
55
- if (attribute === "reset")
56
- return [0];
57
-
58
- const code = this.get(attribute);
59
-
60
- if (arraysEqual(code, snapshot.get(attribute)))
61
- return [];
62
-
63
- if (attribute === "intensity") {
64
- const previous = snapshot.get(attribute);
65
- return transitionIntensity(previous, code);
66
- }
67
-
68
- return code;
69
- });
70
- }
71
- }
72
-
73
- module.exports = {State};
package/src/strip.js DELETED
@@ -1,23 +0,0 @@
1
- "use strict";
2
-
3
- const {rxCSI, rxUnsafe} = require("./patterns");
4
-
5
- /**
6
- * Remove all ANSI escape codes from the given text.
7
- * @type {(text: string) => string}
8
- */
9
- const strip = text => text.replace(new RegExp(rxCSI), "");
10
-
11
- /**
12
- * Calculate the visible length of a string with ANSI escape codes stripped.
13
- * @type {(text: string) => number}
14
- */
15
- const visibleLength = text => strip(text).length;
16
-
17
- /**
18
- * Remove all ANSI escape codes except SGR codes (m), which are used for color and styling.
19
- * @type {(text: string) => string}
20
- */
21
- const sanitize = text => text.replace(new RegExp(rxUnsafe), "");
22
-
23
- module.exports = {strip, visibleLength, sanitize};