@matter/tools 0.12.2 → 0.12.3-alpha.0-20250205-ad3416ca3

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 (225) hide show
  1. package/dist/cjs/ansi-text/chars.d.ts +11 -0
  2. package/dist/cjs/ansi-text/chars.d.ts.map +1 -0
  3. package/dist/cjs/ansi-text/chars.js +57 -0
  4. package/dist/cjs/ansi-text/chars.js.map +6 -0
  5. package/dist/cjs/ansi-text/consumer.d.ts +45 -0
  6. package/dist/cjs/ansi-text/consumer.d.ts.map +1 -0
  7. package/dist/cjs/ansi-text/consumer.js +22 -0
  8. package/dist/cjs/ansi-text/consumer.js.map +6 -0
  9. package/dist/cjs/ansi-text/contiguous-output-segment.d.ts +31 -0
  10. package/dist/cjs/ansi-text/contiguous-output-segment.d.ts.map +1 -0
  11. package/dist/cjs/ansi-text/contiguous-output-segment.js +156 -0
  12. package/dist/cjs/ansi-text/contiguous-output-segment.js.map +6 -0
  13. package/dist/cjs/ansi-text/index.d.ts +12 -0
  14. package/dist/cjs/ansi-text/index.d.ts.map +1 -0
  15. package/dist/cjs/ansi-text/index.js +29 -0
  16. package/dist/cjs/ansi-text/index.js.map +6 -0
  17. package/dist/cjs/ansi-text/printer.d.ts +24 -0
  18. package/dist/cjs/ansi-text/printer.d.ts.map +1 -0
  19. package/dist/cjs/ansi-text/printer.js +81 -0
  20. package/dist/cjs/ansi-text/printer.js.map +6 -0
  21. package/dist/cjs/ansi-text/producer.d.ts +17 -0
  22. package/dist/cjs/ansi-text/producer.d.ts.map +1 -0
  23. package/dist/cjs/ansi-text/producer.js +45 -0
  24. package/dist/cjs/ansi-text/producer.js.map +6 -0
  25. package/dist/cjs/ansi-text/screen.d.ts +13 -0
  26. package/dist/cjs/ansi-text/screen.d.ts.map +1 -0
  27. package/dist/cjs/ansi-text/screen.js +38 -0
  28. package/dist/cjs/ansi-text/screen.js.map +6 -0
  29. package/dist/cjs/ansi-text/sgr.d.ts +100 -0
  30. package/dist/cjs/ansi-text/sgr.d.ts.map +1 -0
  31. package/dist/cjs/ansi-text/sgr.js +140 -0
  32. package/dist/cjs/ansi-text/sgr.js.map +6 -0
  33. package/dist/cjs/ansi-text/std.d.ts +17 -0
  34. package/dist/cjs/ansi-text/std.d.ts.map +1 -0
  35. package/dist/cjs/ansi-text/std.js +43 -0
  36. package/dist/cjs/ansi-text/std.js.map +6 -0
  37. package/dist/cjs/ansi-text/style.d.ts +88 -0
  38. package/dist/cjs/ansi-text/style.d.ts.map +1 -0
  39. package/dist/cjs/ansi-text/style.js +257 -0
  40. package/dist/cjs/ansi-text/style.js.map +6 -0
  41. package/dist/cjs/ansi-text/text-builder.d.ts +78 -0
  42. package/dist/cjs/ansi-text/text-builder.d.ts.map +1 -0
  43. package/dist/cjs/ansi-text/text-builder.js +164 -0
  44. package/dist/cjs/ansi-text/text-builder.js.map +6 -0
  45. package/dist/cjs/ansi-text/text-writer.d.ts +30 -0
  46. package/dist/cjs/ansi-text/text-writer.d.ts.map +1 -0
  47. package/dist/cjs/ansi-text/text-writer.js +317 -0
  48. package/dist/cjs/ansi-text/text-writer.js.map +6 -0
  49. package/dist/cjs/ansi-text/token.d.ts +61 -0
  50. package/dist/cjs/ansi-text/token.d.ts.map +1 -0
  51. package/dist/cjs/ansi-text/token.js +22 -0
  52. package/dist/cjs/ansi-text/token.js.map +6 -0
  53. package/dist/cjs/ansi-text/tokenize.d.ts +11 -0
  54. package/dist/cjs/ansi-text/tokenize.d.ts.map +1 -0
  55. package/dist/cjs/ansi-text/tokenize.js +190 -0
  56. package/dist/cjs/ansi-text/tokenize.js.map +6 -0
  57. package/dist/cjs/ansi-text/truncator.d.ts +20 -0
  58. package/dist/cjs/ansi-text/truncator.d.ts.map +1 -0
  59. package/dist/cjs/ansi-text/truncator.js +72 -0
  60. package/dist/cjs/ansi-text/truncator.js.map +6 -0
  61. package/dist/cjs/ansi-text/visible-width-of.d.ts +10 -0
  62. package/dist/cjs/ansi-text/visible-width-of.d.ts.map +1 -0
  63. package/dist/cjs/ansi-text/visible-width-of.js +55 -0
  64. package/dist/cjs/ansi-text/visible-width-of.js.map +6 -0
  65. package/dist/cjs/ansi-text/wrapper.d.ts +34 -0
  66. package/dist/cjs/ansi-text/wrapper.d.ts.map +1 -0
  67. package/dist/cjs/ansi-text/wrapper.js +208 -0
  68. package/dist/cjs/ansi-text/wrapper.js.map +6 -0
  69. package/dist/cjs/building/cli.js +6 -6
  70. package/dist/cjs/building/cli.js.map +1 -1
  71. package/dist/cjs/building/graph.d.ts +2 -2
  72. package/dist/cjs/building/graph.d.ts.map +1 -1
  73. package/dist/cjs/building/graph.js.map +1 -1
  74. package/dist/cjs/building/project-builder.d.ts +38 -0
  75. package/dist/cjs/building/project-builder.d.ts.map +1 -0
  76. package/dist/cjs/building/project-builder.js +200 -0
  77. package/dist/cjs/building/project-builder.js.map +6 -0
  78. package/dist/cjs/building/tsconfig.js +1 -1
  79. package/dist/cjs/building/tsconfig.js.map +1 -1
  80. package/dist/cjs/index.d.ts +4 -6
  81. package/dist/cjs/index.d.ts.map +1 -1
  82. package/dist/cjs/index.js +4 -6
  83. package/dist/cjs/index.js.map +1 -1
  84. package/dist/cjs/running/ensure-compiled.js +2 -2
  85. package/dist/cjs/running/ensure-compiled.js.map +1 -1
  86. package/dist/cjs/util/commander.d.ts.map +1 -1
  87. package/dist/cjs/util/commander.js +4 -5
  88. package/dist/cjs/util/commander.js.map +2 -2
  89. package/dist/cjs/util/index.d.ts +1 -0
  90. package/dist/cjs/util/index.d.ts.map +1 -1
  91. package/dist/cjs/util/index.js +1 -0
  92. package/dist/cjs/util/index.js.map +1 -1
  93. package/dist/cjs/util/progress.d.ts +2 -2
  94. package/dist/cjs/util/progress.d.ts.map +1 -1
  95. package/dist/cjs/util/progress.js +25 -53
  96. package/dist/cjs/util/progress.js.map +2 -2
  97. package/dist/cjs/versioning/versioner.js +2 -12
  98. package/dist/cjs/versioning/versioner.js.map +2 -2
  99. package/dist/esm/ansi-text/chars.d.ts +11 -0
  100. package/dist/esm/ansi-text/chars.d.ts.map +1 -0
  101. package/dist/esm/ansi-text/chars.js +37 -0
  102. package/dist/esm/ansi-text/chars.js.map +6 -0
  103. package/dist/esm/ansi-text/consumer.d.ts +45 -0
  104. package/dist/esm/ansi-text/consumer.d.ts.map +1 -0
  105. package/dist/esm/ansi-text/consumer.js +6 -0
  106. package/dist/esm/ansi-text/consumer.js.map +6 -0
  107. package/dist/esm/ansi-text/contiguous-output-segment.d.ts +31 -0
  108. package/dist/esm/ansi-text/contiguous-output-segment.d.ts.map +1 -0
  109. package/dist/esm/ansi-text/contiguous-output-segment.js +136 -0
  110. package/dist/esm/ansi-text/contiguous-output-segment.js.map +6 -0
  111. package/dist/esm/ansi-text/index.d.ts +12 -0
  112. package/dist/esm/ansi-text/index.d.ts.map +1 -0
  113. package/dist/esm/ansi-text/index.js +12 -0
  114. package/dist/esm/ansi-text/index.js.map +6 -0
  115. package/dist/esm/ansi-text/printer.d.ts +24 -0
  116. package/dist/esm/ansi-text/printer.d.ts.map +1 -0
  117. package/dist/esm/ansi-text/printer.js +61 -0
  118. package/dist/esm/ansi-text/printer.js.map +6 -0
  119. package/dist/esm/ansi-text/producer.d.ts +17 -0
  120. package/dist/esm/ansi-text/producer.d.ts.map +1 -0
  121. package/dist/esm/ansi-text/producer.js +25 -0
  122. package/dist/esm/ansi-text/producer.js.map +6 -0
  123. package/dist/esm/ansi-text/screen.d.ts +13 -0
  124. package/dist/esm/ansi-text/screen.d.ts.map +1 -0
  125. package/dist/esm/ansi-text/screen.js +18 -0
  126. package/dist/esm/ansi-text/screen.js.map +6 -0
  127. package/dist/esm/ansi-text/sgr.d.ts +100 -0
  128. package/dist/esm/ansi-text/sgr.d.ts.map +1 -0
  129. package/dist/esm/ansi-text/sgr.js +120 -0
  130. package/dist/esm/ansi-text/sgr.js.map +6 -0
  131. package/dist/esm/ansi-text/std.d.ts +17 -0
  132. package/dist/esm/ansi-text/std.d.ts.map +1 -0
  133. package/dist/esm/ansi-text/std.js +23 -0
  134. package/dist/esm/ansi-text/std.js.map +6 -0
  135. package/dist/esm/ansi-text/style.d.ts +88 -0
  136. package/dist/esm/ansi-text/style.d.ts.map +1 -0
  137. package/dist/esm/ansi-text/style.js +245 -0
  138. package/dist/esm/ansi-text/style.js.map +6 -0
  139. package/dist/esm/ansi-text/text-builder.d.ts +78 -0
  140. package/dist/esm/ansi-text/text-builder.d.ts.map +1 -0
  141. package/dist/esm/ansi-text/text-builder.js +150 -0
  142. package/dist/esm/ansi-text/text-builder.js.map +6 -0
  143. package/dist/esm/ansi-text/text-writer.d.ts +30 -0
  144. package/dist/esm/ansi-text/text-writer.d.ts.map +1 -0
  145. package/dist/esm/ansi-text/text-writer.js +297 -0
  146. package/dist/esm/ansi-text/text-writer.js.map +6 -0
  147. package/dist/esm/ansi-text/token.d.ts +61 -0
  148. package/dist/esm/ansi-text/token.d.ts.map +1 -0
  149. package/dist/esm/ansi-text/token.js +6 -0
  150. package/dist/esm/ansi-text/token.js.map +6 -0
  151. package/dist/esm/ansi-text/tokenize.d.ts +11 -0
  152. package/dist/esm/ansi-text/tokenize.d.ts.map +1 -0
  153. package/dist/esm/ansi-text/tokenize.js +170 -0
  154. package/dist/esm/ansi-text/tokenize.js.map +6 -0
  155. package/dist/esm/ansi-text/truncator.d.ts +20 -0
  156. package/dist/esm/ansi-text/truncator.d.ts.map +1 -0
  157. package/dist/esm/ansi-text/truncator.js +52 -0
  158. package/dist/esm/ansi-text/truncator.js.map +6 -0
  159. package/dist/esm/ansi-text/visible-width-of.d.ts +10 -0
  160. package/dist/esm/ansi-text/visible-width-of.d.ts.map +1 -0
  161. package/dist/esm/ansi-text/visible-width-of.js +35 -0
  162. package/dist/esm/ansi-text/visible-width-of.js.map +6 -0
  163. package/dist/esm/ansi-text/wrapper.d.ts +34 -0
  164. package/dist/esm/ansi-text/wrapper.d.ts.map +1 -0
  165. package/dist/esm/ansi-text/wrapper.js +188 -0
  166. package/dist/esm/ansi-text/wrapper.js.map +6 -0
  167. package/dist/esm/building/cli.js +3 -3
  168. package/dist/esm/building/cli.js.map +1 -1
  169. package/dist/esm/building/graph.d.ts +2 -2
  170. package/dist/esm/building/graph.d.ts.map +1 -1
  171. package/dist/esm/building/graph.js +1 -1
  172. package/dist/esm/building/graph.js.map +1 -1
  173. package/dist/esm/building/project-builder.d.ts +38 -0
  174. package/dist/esm/building/project-builder.d.ts.map +1 -0
  175. package/dist/esm/building/project-builder.js +180 -0
  176. package/dist/esm/building/project-builder.js.map +6 -0
  177. package/dist/esm/building/tsconfig.js +2 -2
  178. package/dist/esm/building/tsconfig.js.map +1 -1
  179. package/dist/esm/index.d.ts +4 -6
  180. package/dist/esm/index.d.ts.map +1 -1
  181. package/dist/esm/index.js +5 -7
  182. package/dist/esm/index.js.map +1 -1
  183. package/dist/esm/running/ensure-compiled.js +3 -3
  184. package/dist/esm/running/ensure-compiled.js.map +1 -1
  185. package/dist/esm/util/commander.d.ts.map +1 -1
  186. package/dist/esm/util/commander.js +5 -6
  187. package/dist/esm/util/commander.js.map +1 -1
  188. package/dist/esm/util/index.d.ts +1 -0
  189. package/dist/esm/util/index.d.ts.map +1 -1
  190. package/dist/esm/util/index.js +2 -1
  191. package/dist/esm/util/index.js.map +1 -1
  192. package/dist/esm/util/progress.d.ts +2 -2
  193. package/dist/esm/util/progress.d.ts.map +1 -1
  194. package/dist/esm/util/progress.js +26 -44
  195. package/dist/esm/util/progress.js.map +1 -1
  196. package/dist/esm/versioning/versioner.js +3 -3
  197. package/dist/esm/versioning/versioner.js.map +1 -1
  198. package/package.json +11 -1
  199. package/src/ansi-text/chars.ts +31 -0
  200. package/src/ansi-text/consumer.ts +53 -0
  201. package/src/ansi-text/contiguous-output-segment.ts +181 -0
  202. package/src/ansi-text/index.ts +14 -0
  203. package/src/ansi-text/printer.ts +86 -0
  204. package/src/ansi-text/producer.ts +29 -0
  205. package/src/ansi-text/screen.ts +18 -0
  206. package/src/ansi-text/sgr.ts +154 -0
  207. package/src/ansi-text/std.ts +28 -0
  208. package/src/ansi-text/style.ts +369 -0
  209. package/src/ansi-text/text-builder.ts +261 -0
  210. package/src/ansi-text/text-writer.ts +363 -0
  211. package/src/ansi-text/token.ts +76 -0
  212. package/src/ansi-text/tokenize.ts +212 -0
  213. package/src/ansi-text/truncator.ts +63 -0
  214. package/src/ansi-text/visible-width-of.ts +39 -0
  215. package/src/ansi-text/wrapper.ts +244 -0
  216. package/src/building/cli.ts +2 -2
  217. package/src/building/graph.ts +2 -2
  218. package/src/building/project-builder.ts +230 -0
  219. package/src/building/tsconfig.ts +2 -4
  220. package/src/index.ts +4 -6
  221. package/src/running/ensure-compiled.ts +2 -2
  222. package/src/util/commander.ts +4 -6
  223. package/src/util/index.ts +1 -0
  224. package/src/util/progress.ts +24 -61
  225. package/src/versioning/versioner.ts +2 -2
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { Consumer } from "./consumer.js";
8
+ import { Producer } from "./producer.js";
9
+ import { Truncator } from "./truncator.js";
10
+ import { Wrapper } from "./wrapper.js";
11
+
12
+ /**
13
+ * Text output with high-level formatting functionality.
14
+ */
15
+ export interface Printer extends Consumer {
16
+ (...text: Producer.Sequence): void;
17
+
18
+ target: Consumer;
19
+
20
+ writeTruncated(...text: Producer.Sequence): void;
21
+ writeTruncatedLine(...text: Producer.Sequence): void;
22
+ }
23
+
24
+ export function Printer(target: Consumer, options?: Printer.Options) {
25
+ target = options?.wrap ? new Wrapper(target, options.wrap) : target;
26
+ let truncator: undefined | Truncator;
27
+
28
+ const printer = function Printer(...text: Producer.Sequence) {
29
+ printer.write(...text);
30
+ } as Printer;
31
+
32
+ Object.defineProperties(printer, {
33
+ target: {
34
+ get() {
35
+ return target;
36
+ },
37
+ },
38
+
39
+ state: {
40
+ get() {
41
+ return target.state;
42
+ },
43
+ },
44
+
45
+ write: {
46
+ value(...text: Producer.Sequence) {
47
+ target.write(...text);
48
+ },
49
+ },
50
+
51
+ close: {
52
+ value() {
53
+ target.close();
54
+ },
55
+ },
56
+
57
+ writeTruncated: {
58
+ value(...text: string[]) {
59
+ if (!truncator) {
60
+ truncator = new Truncator(target, { addNewline: false });
61
+ }
62
+ truncator.write(...text);
63
+ },
64
+ },
65
+
66
+ writeTruncatedLine: {
67
+ value(...text: string[]) {
68
+ const tokens = [...Producer.of(text)].filter(
69
+ token => token.kind !== "newline" && token.kind !== "carriage-return",
70
+ );
71
+ if (!truncator) {
72
+ truncator = new Truncator(target);
73
+ }
74
+ truncator.write(...tokens);
75
+ },
76
+ },
77
+ });
78
+
79
+ return printer;
80
+ }
81
+
82
+ export namespace Printer {
83
+ export interface Options extends Consumer.Options {
84
+ wrap?: Wrapper.Options;
85
+ }
86
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { Token } from "./token.js";
8
+ import { tokenize } from "./tokenize.js";
9
+
10
+ /**
11
+ * A source of ANSI tokens.
12
+ */
13
+ export interface Producer extends Iterable<Token, void, void> {}
14
+
15
+ export namespace Producer {
16
+ export interface Sequence extends Array<string | Token | Producer> {}
17
+
18
+ export function* of(sequence: Sequence): Producer {
19
+ for (const item of sequence) {
20
+ if (typeof item === "string") {
21
+ yield* tokenize(item);
22
+ } else if (Symbol.iterator in item) {
23
+ yield* item;
24
+ } else {
25
+ yield item;
26
+ }
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ export namespace screen {
8
+ export namespace erase {
9
+ // Erase to end of line
10
+ export const toEol = "\x1b[K";
11
+
12
+ // Move to start of line and erase
13
+ export const line = `\r${toEol}`;
14
+ }
15
+
16
+ // Clear all lines
17
+ export const clear = "\x1b[K";
18
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * SGR (select graphics rendition) opcodes.
9
+ *
10
+ * SGR is a CSI (ANSI "control sequence introducer", or ESC-[) sequence terminated by "m".
11
+ */
12
+ export enum SgrOpcode {
13
+ reset = 0,
14
+ bold = 1,
15
+ dim = 2,
16
+ italic = 3,
17
+ underline = 4,
18
+ slowBlink = 5,
19
+ fastBlink = 6,
20
+ invert = 7,
21
+ conceal = 8,
22
+ strike = 9,
23
+ normalFont = 10,
24
+ gothic = 20,
25
+ doubleUnderline = 21,
26
+ normalIntensity = 22,
27
+ notItalic = 23,
28
+ notUnderline = 24,
29
+ notBlink = 25,
30
+ notInvert = 27,
31
+ notConceal = 28,
32
+ notStrike = 29,
33
+ normalFg = 39,
34
+ normalBg = 49,
35
+ }
36
+
37
+ /**
38
+ * SGR categories.
39
+ *
40
+ * Each of these is cleared via a single opcode. Except for intensity (dim/bold) only one value may be in effect.
41
+ */
42
+ export enum SgrCategory {
43
+ reset,
44
+ intensity,
45
+ italic,
46
+ underline,
47
+ blink,
48
+ invert,
49
+ conceal,
50
+ strike,
51
+ font,
52
+ fg,
53
+ bg,
54
+ }
55
+
56
+ /**
57
+ * Masks for meaningful groups of CSI codes.
58
+ */
59
+ export enum SgrOpcodeBlock {
60
+ font = 10,
61
+ fg = 30,
62
+ bg = 40,
63
+ fgBright = 90,
64
+ bgBright = 100,
65
+ }
66
+
67
+ /**
68
+ * Color selectors.
69
+ */
70
+ export enum Color {
71
+ black = 0,
72
+ red = 1,
73
+ green = 2,
74
+ yellow = 3,
75
+ blue = 4,
76
+ magenta = 5,
77
+ cyan = 6,
78
+ white = 7,
79
+ extended = 8,
80
+ }
81
+
82
+ /**
83
+ * Extended color subselectors.
84
+ */
85
+ export enum ExtendedColor {
86
+ rgb = 2,
87
+ eightBit = 5,
88
+ }
89
+
90
+ /**
91
+ * Mapping of opcodes to categories.
92
+ */
93
+ export const SgrOpcodeToCategory = Array<number | undefined>(110);
94
+
95
+ /**
96
+ * Mapping of opcodes to opcodes that disable the attribute.
97
+ */
98
+ export const SgrOpcodeToUndoOpcode = Array<number | undefined>(110);
99
+
100
+ {
101
+ function setCat(code: keyof typeof SgrOpcode, category: keyof typeof SgrCategory, undo?: keyof typeof SgrOpcode) {
102
+ const opcode = SgrOpcode[code];
103
+ SgrOpcodeToCategory[opcode] = SgrCategory[category];
104
+ if (undo !== undefined) {
105
+ SgrOpcodeToUndoOpcode[opcode] = SgrOpcode[undo];
106
+ }
107
+ }
108
+
109
+ function setBlockCat(
110
+ block: keyof typeof SgrOpcodeBlock,
111
+ category: keyof typeof SgrCategory,
112
+ undo: keyof typeof SgrOpcode,
113
+ ) {
114
+ const start = SgrOpcodeBlock[block];
115
+ for (let i = SgrOpcodeBlock[block]; i < start + 10; i++) {
116
+ SgrOpcodeToCategory[i] = SgrCategory[category];
117
+ SgrOpcodeToUndoOpcode[i] = SgrOpcode[undo];
118
+ }
119
+ }
120
+
121
+ setCat("reset", "reset");
122
+ setCat("dim", "intensity", "normalIntensity");
123
+ setCat("bold", "intensity", "normalIntensity");
124
+ setCat("normalIntensity", "intensity");
125
+ setCat("italic", "italic", "notItalic");
126
+ setCat("notItalic", "italic");
127
+ setCat("underline", "underline", "notUnderline");
128
+ setCat("doubleUnderline", "underline", "notUnderline");
129
+ setCat("notUnderline", "underline");
130
+ setCat("fastBlink", "blink", "notBlink");
131
+ setCat("slowBlink", "blink", "notBlink");
132
+ setCat("notBlink", "blink");
133
+ setCat("invert", "invert", "notInvert");
134
+ setCat("notInvert", "invert");
135
+ setCat("conceal", "conceal", "notConceal");
136
+ setCat("notConceal", "conceal");
137
+ setCat("strike", "strike", "notStrike");
138
+ setCat("notStrike", "strike");
139
+ setBlockCat("font", "font", "normalFont");
140
+ setBlockCat("fg", "fg", "normalFg");
141
+ setBlockCat("fgBright", "fg", "normalFg");
142
+ setBlockCat("bg", "bg", "normalBg");
143
+ setBlockCat("bgBright", "bg", "normalBg");
144
+ }
145
+
146
+ export interface EightBitColor {
147
+ color: number;
148
+ }
149
+
150
+ export interface RgbColor {
151
+ r?: number;
152
+ g?: number;
153
+ b?: number;
154
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { stderr, stdout } from "process";
8
+ import { Printer } from "./printer.js";
9
+ import { ansi } from "./text-builder.js";
10
+ import { TextWriter } from "./text-writer.js";
11
+
12
+ const DEFAULT_WRAP_PREFIX = ` ${ansi.dim}⤷${ansi.not.dim} `;
13
+
14
+ export namespace std {
15
+ /**
16
+ * Writer that writes to Node's stdout.
17
+ */
18
+ export const out = Printer(new TextWriter(text => stdout.write(text), { terminalWidth: stdout.columns }), {
19
+ wrap: { wrapPrefix: DEFAULT_WRAP_PREFIX },
20
+ });
21
+
22
+ /**
23
+ * Writer that writes to Node's stdout.
24
+ */
25
+ export const err = Printer(new TextWriter(text => stderr.write(text), { terminalWidth: stderr.columns }), {
26
+ wrap: { wrapPrefix: DEFAULT_WRAP_PREFIX },
27
+ });
28
+ }
@@ -0,0 +1,369 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { Producer } from "./producer.js";
8
+ import {
9
+ Color,
10
+ ExtendedColor,
11
+ SgrCategory,
12
+ SgrOpcode,
13
+ SgrOpcodeBlock,
14
+ SgrOpcodeToCategory,
15
+ SgrOpcodeToUndoOpcode,
16
+ } from "./sgr.js";
17
+ import { Token } from "./token.js";
18
+
19
+ /**
20
+ * An immutable representation of an ANSI CSI SGR sequence, also known as the "American National Standards Institute
21
+ * Control Sequence Introducer Select Graphic Rendition".
22
+ *
23
+ * Implemented largely from https://en.wikipedia.org/wiki/ANSI_escape_code
24
+ *
25
+ * Provides high level logic for parsing and manipulating styling.
26
+ */
27
+ export interface Style extends Producer {
28
+ /**
29
+ * The current definition, either {@link codes} or {@link text}.
30
+ */
31
+ get styleDefinition(): Style.Definition;
32
+
33
+ set styleDefinition(definition: Style.InputDefinition | Style | undefined);
34
+
35
+ /**
36
+ * The list of codes in this style.
37
+ */
38
+ styleCodes: (string | number)[];
39
+
40
+ /**
41
+ * The style as a style token.
42
+ */
43
+ styleToken: Token;
44
+
45
+ /**
46
+ * A style that disables this style.
47
+ */
48
+ undoStyle: Style;
49
+
50
+ /**
51
+ * Create the ANSI escape sequence for this style.
52
+ */
53
+ toString(): string;
54
+
55
+ /**
56
+ * Create a new style by adding additional style information.
57
+ */
58
+ addStyle<T extends Style>(this: T, style: Style.InputDefinition | Style): T;
59
+
60
+ /**
61
+ * Create a style that transitions from this style to another.
62
+ */
63
+ diffStyle<T extends Style>(this: T, other: Style): T;
64
+
65
+ /**
66
+ * Execute a function against each code in this style's sequence.
67
+ */
68
+ evaluateStyle(processor: (category: SgrCategory, code: number | string) => void): void;
69
+
70
+ /**
71
+ * The factory used to create this style.
72
+ */
73
+ factory: Style.Factory;
74
+ }
75
+
76
+ const codes = Symbol("codes");
77
+ const text = Symbol("text");
78
+
79
+ interface InternalStyle extends Style {
80
+ [codes]?: (string | number)[];
81
+ [text]?: string;
82
+ }
83
+
84
+ export function Style(definition?: Style.InputDefinition): Style {
85
+ if (definition instanceof Style) {
86
+ return definition;
87
+ }
88
+
89
+ const style = Object.create(Style.prototype) as Style;
90
+
91
+ style.styleDefinition = Style.definitionOf(definition);
92
+
93
+ return style;
94
+ }
95
+
96
+ export namespace Style {
97
+ export type Factory = (definition?: Definition | Style, derivesFrom?: Style) => Style;
98
+ export type Definition = undefined | string | (string | number)[];
99
+ export type InputDefinition = Definition | { styleDefinition: Definition };
100
+
101
+ export function opcodeOf(code: number | string) {
102
+ if (typeof code === "number") {
103
+ return code;
104
+ }
105
+
106
+ if (code === "") {
107
+ return 0;
108
+ }
109
+
110
+ // Note we must use parseInt so trailing parameters are stripped
111
+ const opcode = Number.parseInt(code);
112
+ if (Number.isNaN(opcode)) {
113
+ return undefined;
114
+ }
115
+
116
+ return opcode;
117
+ }
118
+
119
+ export function codesOf(definition?: string): (number | string)[] {
120
+ definition = textOf(definition);
121
+ if (definition === undefined) {
122
+ return [];
123
+ }
124
+ if (definition === "") {
125
+ return [0];
126
+ }
127
+
128
+ const parts = definition.split(";");
129
+ const codes = Array<string | number>();
130
+ let pos = 0;
131
+ while (pos < parts.length) {
132
+ const part = parts[pos];
133
+ const opcode = opcodeOf(parts[pos]);
134
+ pos++;
135
+
136
+ // Determine how many arguments the code has. We encode these as a single unit
137
+ let expectedParts;
138
+ switch (opcode) {
139
+ case SgrOpcodeBlock.fg + Color.extended:
140
+ case SgrOpcodeBlock.bg + Color.extended:
141
+ switch (opcodeOf(parts[pos])) {
142
+ case ExtendedColor.eightBit:
143
+ expectedParts = 3;
144
+ break;
145
+
146
+ case ExtendedColor.rgb:
147
+ expectedParts = 5;
148
+ break;
149
+
150
+ default:
151
+ // Not sure what to make of this; just grab the two prefix codes
152
+ expectedParts = 1;
153
+ break;
154
+ }
155
+ break;
156
+
157
+ case undefined:
158
+ // Ignore
159
+ continue;
160
+
161
+ default:
162
+ expectedParts = 0;
163
+ break;
164
+ }
165
+
166
+ // Store the original code as a number if it is encoded as an integer without arguments
167
+ let baseCode: number | string;
168
+ if (opcode.toString() === part) {
169
+ baseCode = opcode;
170
+ } else {
171
+ baseCode = part;
172
+ }
173
+
174
+ // Arguments may be encoded in a single code with ":" as separator, or as separate codes if ";" is
175
+ // the separator. Unsure where which is supported so we just handle both
176
+ if (expectedParts) {
177
+ const codeCount = part.split(":").length;
178
+ if (codeCount < expectedParts) {
179
+ // At least some args are in subsequent codes; join these together using original separator so
180
+ // they serialize in original form
181
+ const argParts = expectedParts - codeCount;
182
+ codes.push([baseCode, ...parts.slice(pos, pos + argParts)].join(";"));
183
+ pos += argParts;
184
+ continue;
185
+ }
186
+ }
187
+
188
+ // No args or all args encoded using ":" separator
189
+ codes.push(baseCode);
190
+ }
191
+ return codes;
192
+ }
193
+
194
+ export function textOf(definition?: string) {
195
+ if (definition === undefined || definition === "") {
196
+ return definition;
197
+ }
198
+ definition = definition.trim();
199
+ if (definition[0] === "\x1b" && definition[1] === "[") {
200
+ definition = definition.slice(2);
201
+ }
202
+ if (definition[definition.length - 1] === "m") {
203
+ definition = definition.slice(0, definition.length - 1);
204
+ }
205
+ return definition;
206
+ }
207
+
208
+ export function definitionOf(definition: InputDefinition): Definition {
209
+ if (definition !== undefined && typeof definition !== "string" && !Array.isArray(definition)) {
210
+ return definition.styleDefinition;
211
+ }
212
+ return definition;
213
+ }
214
+
215
+ declare const Inherit: Style;
216
+ declare const None: Style;
217
+ }
218
+
219
+ Style.prototype = {
220
+ get styleDefinition(): Style.Definition {
221
+ if (this[codes] !== undefined) {
222
+ return this[codes];
223
+ }
224
+ if (this[text] !== undefined) {
225
+ return this[text];
226
+ }
227
+ },
228
+
229
+ set styleDefinition(definition: Style.InputDefinition) {
230
+ if (typeof definition === "function" || (typeof definition === "object" && !Array.isArray(definition))) {
231
+ this.styleDefinition = definition.styleDefinition;
232
+ } else if (typeof definition === "string") {
233
+ this[text] = Style.textOf(definition);
234
+ this[codes] = undefined;
235
+ } else {
236
+ this[codes] = definition;
237
+ this[text] = undefined;
238
+ }
239
+ },
240
+
241
+ get styleCodes() {
242
+ if (this[codes] === undefined) {
243
+ this[codes] = Style.codesOf(this[text]);
244
+ }
245
+ return this[codes] ?? [];
246
+ },
247
+
248
+ get styleToken(): Token {
249
+ return {
250
+ kind: "style",
251
+
252
+ // Do not use this because extension toString() may not do the correct thing
253
+ style: Style(this.styleDefinition),
254
+ };
255
+ },
256
+
257
+ get undoStyle() {
258
+ const codes = Array<number>();
259
+ for (const code of this.styleCodes) {
260
+ const opcode = Style.opcodeOf(code);
261
+ if (opcode === undefined) {
262
+ continue;
263
+ }
264
+
265
+ const undo = SgrOpcodeToUndoOpcode[opcode];
266
+ if (undo === undefined) {
267
+ continue;
268
+ }
269
+
270
+ codes.push(undo);
271
+ }
272
+ return Style(codes);
273
+ },
274
+
275
+ toString() {
276
+ const codes = Array<number | string>();
277
+ for (const code of this.styleCodes) {
278
+ const opcode = Style.opcodeOf(code);
279
+ if (opcode === undefined) {
280
+ continue;
281
+ }
282
+
283
+ codes.push(code);
284
+ }
285
+ return `\x1b[${codes.join(";")}m`;
286
+ },
287
+
288
+ addStyle<T extends Style>(this: T, codes: Style.InputDefinition): T {
289
+ let categories = Array<number | string>();
290
+
291
+ function processor(category: SgrCategory, code: number | string) {
292
+ if (category === SgrCategory.reset) {
293
+ categories = [SgrOpcode.reset];
294
+ } else {
295
+ categories[category] = code;
296
+ }
297
+ }
298
+
299
+ // Add my codes
300
+ this.evaluateStyle(processor);
301
+
302
+ // Overwrite with new codes
303
+ codes = Style.definitionOf(codes);
304
+ if (codes !== undefined) {
305
+ Style(codes).evaluateStyle(processor);
306
+ }
307
+
308
+ return this.factory(
309
+ categories.filter(entry => entry !== undefined),
310
+ this,
311
+ ) as T;
312
+ },
313
+
314
+ diffStyle<T extends Style>(this: T, other: Style): T {
315
+ let current = Array<number | string | undefined>();
316
+
317
+ // Collect current styles by category. Reset clears state
318
+ this.evaluateStyle((category: SgrCategory, code: number | string) => {
319
+ if (category === SgrCategory.reset) {
320
+ current = [];
321
+ } else {
322
+ current[category] = code;
323
+ }
324
+ });
325
+
326
+ // Collect target style by category. Reset clears current (because its no longer relevant) and adds the
327
+ // reset which always serializes first
328
+ let target = [...current];
329
+ other.evaluateStyle((category, code) => {
330
+ if (category === SgrCategory.reset) {
331
+ current = [];
332
+ target = [SgrCategory.reset];
333
+ } else if (current[category] === code) {
334
+ target[category] = undefined;
335
+ } else {
336
+ target[category] = code;
337
+ }
338
+ });
339
+
340
+ // Target now contains only those codes required to perform transition
341
+ return this.factory(
342
+ target.filter(entry => entry !== undefined),
343
+ this,
344
+ ) as T;
345
+ },
346
+
347
+ evaluateStyle(processor: (category: SgrCategory, code: number | string) => void) {
348
+ for (const code of this.styleCodes) {
349
+ const opcode = Style.opcodeOf(code);
350
+ if (opcode !== undefined) {
351
+ const category = SgrOpcodeToCategory[opcode];
352
+ if (category !== undefined) {
353
+ processor(category, code);
354
+ }
355
+ }
356
+ }
357
+ },
358
+
359
+ get factory() {
360
+ return Style;
361
+ },
362
+
363
+ [Symbol.iterator]() {
364
+ return [{ kind: "style", style: this as Style } satisfies Token][Symbol.iterator]();
365
+ },
366
+ } satisfies Pick<InternalStyle, keyof InternalStyle>;
367
+
368
+ Style.Inherit = Style();
369
+ Style.None = Style([0]);