@peteanderson/ansi 2.1.0 → 2.1.1

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 (44) hide show
  1. package/dist/cjs/patterns.d.ts.map +1 -1
  2. package/dist/cjs/patterns.js +1 -1
  3. package/dist/cjs/patterns.js.map +1 -1
  4. package/dist/cjs/simplify/simplify.d.ts.map +1 -1
  5. package/dist/cjs/simplify/simplify.js +4 -3
  6. package/dist/cjs/simplify/simplify.js.map +1 -1
  7. package/dist/cjs/simplify/state.d.ts +2 -1
  8. package/dist/cjs/simplify/state.d.ts.map +1 -1
  9. package/dist/cjs/simplify/state.js +32 -7
  10. package/dist/cjs/simplify/state.js.map +1 -1
  11. package/dist/esm/ansi.d.ts +18 -18
  12. package/dist/esm/features/build.d.ts +1 -1
  13. package/dist/esm/features/detect.d.ts +1 -1
  14. package/dist/esm/features/features.d.ts +1 -1
  15. package/dist/esm/features/index.d.ts +2 -2
  16. package/dist/esm/index.d.ts +3 -3
  17. package/dist/esm/patterns.d.ts.map +1 -1
  18. package/dist/esm/patterns.js +1 -1
  19. package/dist/esm/patterns.js.map +1 -1
  20. package/dist/esm/sgr/color/channel.d.ts +2 -2
  21. package/dist/esm/sgr/color/color.d.ts +2 -2
  22. package/dist/esm/sgr/color/context.d.ts +2 -2
  23. package/dist/esm/sgr/color/index.d.ts +1 -1
  24. package/dist/esm/sgr/color/rgb.d.ts +2 -2
  25. package/dist/esm/sgr/combine.d.ts +1 -1
  26. package/dist/esm/sgr/format-builder.d.ts +1 -1
  27. package/dist/esm/sgr/index.d.ts +2 -2
  28. package/dist/esm/sgr/sgr.d.ts +2 -2
  29. package/dist/esm/sgr/style.d.ts +1 -1
  30. package/dist/esm/simplify/atom.d.ts +1 -1
  31. package/dist/esm/simplify/index.d.ts +1 -1
  32. package/dist/esm/simplify/lookup.d.ts +1 -1
  33. package/dist/esm/simplify/simplify.d.ts.map +1 -1
  34. package/dist/esm/simplify/simplify.js +4 -3
  35. package/dist/esm/simplify/simplify.js.map +1 -1
  36. package/dist/esm/simplify/state.d.ts +3 -2
  37. package/dist/esm/simplify/state.d.ts.map +1 -1
  38. package/dist/esm/simplify/state.js +32 -7
  39. package/dist/esm/simplify/state.js.map +1 -1
  40. package/dist/esm/types.d.ts +10 -10
  41. package/package.json +1 -1
  42. package/src/patterns.ts +1 -1
  43. package/src/simplify/simplify.ts +4 -3
  44. package/src/simplify/state.ts +39 -8
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/patterns.ts"],"names":[],"mappings":"AAuCA,eAAO,MAAM,KAAK,kBAAqC,CAAC;AACxD,eAAO,MAAM,KAAK,kBAA+C,CAAC;AAClE,eAAO,MAAM,QAAQ,kBAA+C,CAAC"}
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/patterns.ts"],"names":[],"mappings":"AAuCA,eAAO,MAAM,KAAK,kBAAuC,CAAC;AAC1D,eAAO,MAAM,KAAK,kBAA+C,CAAC;AAClE,eAAO,MAAM,QAAQ,kBAA+C,CAAC"}
@@ -39,7 +39,7 @@ timeit(() => long .replace(new RegExp(rxSGR.source, "g"), ""), {description: "lo
39
39
  */
40
40
  Object.defineProperty(exports, "__esModule", { value: true });
41
41
  exports.rxUnsafe = exports.rxCSI = exports.rxSGR = void 0;
42
- exports.rxSGR = Object.freeze(/\x1b\[[\d;]*m/g);
42
+ exports.rxSGR = Object.freeze(/\x1b\[([\d;]*)m/g);
43
43
  exports.rxCSI = Object.freeze(/\x1b\[[0-?]*[ -/]*[@-~]/g);
44
44
  exports.rxUnsafe = Object.freeze(/\x1b\[[0-?]*[ -/]*[@-ln-~]/g); // Everything except SGR codes (m).
45
45
  //# sourceMappingURL=patterns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/patterns.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCE;;;AAEW,QAAA,KAAK,GAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAC3C,QAAA,KAAK,GAAM,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;AACrD,QAAA,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,mCAAmC"}
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/patterns.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCE;;;AAEW,QAAA,KAAK,GAAM,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC7C,QAAA,KAAK,GAAM,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;AACrD,QAAA,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,mCAAmC"}
@@ -1 +1 @@
1
- {"version":3,"file":"simplify.d.ts","sourceRoot":"","sources":["../../../src/simplify/simplify.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuB7C;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC"}
1
+ {"version":3,"file":"simplify.d.ts","sourceRoot":"","sources":["../../../src/simplify/simplify.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwB7C;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC"}
@@ -12,12 +12,13 @@ function simplify(text) {
12
12
  let codes = parts[i++].split(";").map(Number);
13
13
  let chunk = parts[i++];
14
14
  while (!chunk && i < parts.length) {
15
+ // Merge consecutive SGR sequences with no text between them.
15
16
  codes.push(...parts[i++].split(";").map(Number));
16
17
  chunk = parts[i++];
17
18
  }
18
- codes = state.update(codes);
19
- if (codes.length)
20
- result += `\x1b[${codes.join(";")}m`;
19
+ const newCodes = state.update(codes);
20
+ if (newCodes.length)
21
+ result += `\x1b[${newCodes.join(";")}m`;
21
22
  result += chunk;
22
23
  }
23
24
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"simplify.js","sourceRoot":"","sources":["../../../src/simplify/simplify.ts"],"names":[],"mappings":";;AAGA,4BAuBC;AA1BD,0CAAkC;AAClC,mCAA8B;AAE9B,SAAgB,QAAQ,CAAC,IAAY;IACpC,sEAAsE;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAK,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAI,IAAI,aAAK,EAAE,CAAC;IAC3B,IAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAI,CAAC;QACpC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAEvB,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM;YACf,MAAM,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"simplify.js","sourceRoot":"","sources":["../../../src/simplify/simplify.ts"],"names":[],"mappings":";;AAGA,4BAwBC;AA3BD,0CAAkC;AAClC,mCAA8B;AAE9B,SAAgB,QAAQ,CAAC,IAAY;IACpC,sEAAsE;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAK,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAI,IAAI,aAAK,EAAE,CAAC;IAC3B,IAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAI,CAAC;QACpC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAEvB,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACnC,6DAA6D;YAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,QAAQ,CAAC,MAAM;YAClB,MAAM,IAAI,QAAQ,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { Attribute, AttributeMap } from "./types";
2
2
  export declare class State extends Map<Attribute, number[]> implements AttributeMap {
3
- update(codes: number[]): number[];
3
+ #private;
4
+ update(codes: number[]): Array<number | string>;
4
5
  }
5
6
  //# sourceMappingURL=state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/simplify/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,SAAS,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AAerD,qBAAa,KAAM,SAAQ,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAE,YAAW,YAAY;IAC1E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CA2CjC"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/simplify/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,SAAS,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AAerD,qBAAa,KAAM,SAAQ,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAE,YAAW,YAAY;;IAa1E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;CA8D/C"}
@@ -16,12 +16,24 @@ const defaultCodes = new Map([
16
16
  ["overline", [55]],
17
17
  ]);
18
18
  class State extends Map {
19
+ #isDefaultState(except) {
20
+ for (const [attribute, defaultCode] of defaultCodes) {
21
+ if (attribute === except)
22
+ continue;
23
+ const current = this.get(attribute);
24
+ if (!(0, utils_1.arraysEqual)(current, defaultCode))
25
+ return false;
26
+ }
27
+ return true;
28
+ }
19
29
  update(codes) {
20
30
  let snapshot = new Map(this);
21
31
  const attributes = new Set();
22
32
  for (let i = 0; i < codes.length; i++) {
23
33
  const { attribute, code, skip } = (0, lookup_1.lookUpAtom)(codes, i, this);
24
34
  if (attribute === "reset") {
35
+ if (this.#isDefaultState())
36
+ continue;
25
37
  attributes.clear();
26
38
  this.clear();
27
39
  attributes.add("reset");
@@ -35,18 +47,31 @@ class State extends Map {
35
47
  if (skip)
36
48
  i += skip;
37
49
  }
38
- return Array.from(attributes).flatMap(attribute => {
39
- if (attribute === "reset")
40
- return [0];
50
+ const rtn = [];
51
+ for (const attribute of attributes) {
52
+ if (attribute === "reset") {
53
+ rtn.length = 0; // Any previous codes are irrelevant.
54
+ rtn.push(""); // The terminal will interpret missing values as `0`.
55
+ continue;
56
+ }
41
57
  const code = this.get(attribute);
42
58
  if ((0, utils_1.arraysEqual)(code, snapshot.get(attribute)))
43
- return [];
59
+ continue;
60
+ // If this code would put us in a known overall default state, then we can just reset,
61
+ // which is shorter. (Compare `\x1b[m` vs. `\x1b[39m` or especially `\x1b[22;39;49m`.)
62
+ if ((0, utils_1.arraysEqual)(code, defaultCodes.get(attribute)) && this.#isDefaultState(attribute)) {
63
+ rtn.length = 0;
64
+ rtn.push("");
65
+ continue;
66
+ }
44
67
  if (attribute === "intensity") {
45
68
  const previous = snapshot.get(attribute);
46
- return (0, utils_1.transitionIntensity)(previous, code);
69
+ rtn.push(...(0, utils_1.transitionIntensity)(previous, code));
70
+ continue;
47
71
  }
48
- return code;
49
- });
72
+ rtn.push(...code);
73
+ }
74
+ return rtn;
50
75
  }
51
76
  }
52
77
  exports.State = State;
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/simplify/state.ts"],"names":[],"mappings":";;;AAAA,qCAA0D;AAC1D,mCAAyD;AAIzD,MAAM,YAAY,GAA6B,IAAI,GAAG,CAAC;IACtD,CAAC,WAAW,EAAM,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,QAAQ,EAAS,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,WAAW,EAAM,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,SAAS,EAAQ,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,QAAQ,EAAS,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,IAAI,EAAa,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,IAAI,EAAa,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,OAAO,EAAU,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,UAAU,EAAO,CAAC,EAAE,CAAC,CAAC;CACvB,CAAC,CAAC;AAEH,MAAa,KAAM,SAAQ,GAAwB;IAClD,MAAM,CAAC,KAAe;QACrB,IAAI,QAAQ,GAAiB,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAa,CAAC;QAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,IAAA,mBAAU,EAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAE3D,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC3B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxB,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,YAAY;oBAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAE7B,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzB,SAAS;YACV,CAAC;YAED,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAE1B,IAAI,IAAI;gBACP,CAAC,IAAI,IAAI,CAAC;QACZ,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACjD,IAAI,SAAS,KAAK,OAAO;gBACxB,OAAO,CAAC,CAAC,CAAC,CAAC;YAEZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YAElC,IAAI,IAAA,mBAAW,EAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC7C,OAAO,EAAE,CAAC;YAEX,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACzC,OAAO,IAAA,2BAAmB,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;YAED,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC;CACD;AA5CD,sBA4CC"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/simplify/state.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { padEnd, padStart } from "./pad";
2
- import { strip, visibleLength } from "./strip";
3
- import type { Args } from "./features";
4
- import type { Ansi } from "./types";
1
+ import { padEnd, padStart } from "./pad.js";
2
+ import { strip, visibleLength } from "./strip.js";
3
+ import type { Args } from "./features/index.js";
4
+ import type { Ansi } from "./types.js";
5
5
  export declare function makeAnsi(...args: Args): Ansi;
6
6
  export declare const ansi: Ansi;
7
- export declare const fg: import("./sgr/types").Channel<"bg" | import("./sgr/types").StyleKey>, bg: import("./sgr/types").Channel<"fg" | import("./sgr/types").StyleKey>, style: import("./sgr/types").Style<import("./sgr/types").ChainKey>, reset: string, caret: {
7
+ export declare const fg: import("./sgr/types.js").Channel<"bg" | import("./sgr/types.js").StyleKey>, bg: import("./sgr/types.js").Channel<"fg" | import("./sgr/types.js").StyleKey>, style: import("./sgr/types.js").Style<import("./sgr/types.js").ChainKey>, reset: string, caret: {
8
8
  up: (count?: number) => string;
9
9
  down: (count?: number) => string;
10
10
  forward: (count?: number) => string;
@@ -67,19 +67,19 @@ export declare const fg: import("./sgr/types").Channel<"bg" | import("./sgr/type
67
67
  };
68
68
  };
69
69
  export { padEnd, padStart, strip, visibleLength };
70
- declare const _default: typeof makeAnsi & import("./sgr").SGR & {
71
- caret: import("./caret").Caret;
72
- erase: import("./erase").Erase;
73
- scroll: import("./scroll").Scroll;
74
- terminal: import("./terminal").Terminal;
75
- padEnd: import("./pad").PadEnd;
76
- padStart: import("./pad").PadStart;
77
- strip: import("./strip").Strip;
78
- visibleLength: import("./strip").VisibleLength;
79
- sanitize: import("./strip").Sanitize;
80
- slice: import("./slice").Slice;
81
- simplify: import("./simplify").Simplify;
82
- features: import("./features").Features;
70
+ declare const _default: typeof makeAnsi & import("./sgr/index.js").SGR & {
71
+ caret: import("./caret.js").Caret;
72
+ erase: import("./erase.js").Erase;
73
+ scroll: import("./scroll.js").Scroll;
74
+ terminal: import("./terminal.js").Terminal;
75
+ padEnd: import("./pad.js").PadEnd;
76
+ padStart: import("./pad.js").PadStart;
77
+ strip: import("./strip.js").Strip;
78
+ visibleLength: import("./strip.js").VisibleLength;
79
+ sanitize: import("./strip.js").Sanitize;
80
+ slice: import("./slice.js").Slice;
81
+ simplify: import("./simplify/index.js").Simplify;
82
+ features: import("./features/index.js").Features;
83
83
  };
84
84
  export default _default;
85
85
  //# sourceMappingURL=ansi.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { ColorDepth, Features } from "./types";
1
+ import type { ColorDepth, Features } from "./types.js";
2
2
  export declare function build(isTTY: boolean, colorDepth: ColorDepth, style?: boolean, caret?: boolean, erase?: boolean, scroll?: boolean, terminal?: boolean): Features;
3
3
  export declare const boolean: (isTTY: boolean, enabled: boolean) => Features;
4
4
  export declare const number: (isTTY: boolean, colorDepth: ColorDepth) => Features;
@@ -1,4 +1,4 @@
1
- import type { ColorDepth, Features } from "./types";
1
+ import type { ColorDepth, Features } from "./types.js";
2
2
  export declare function getColorDepth(stream?: NodeJS.WriteStream): ColorDepth;
3
3
  export declare function detectFeatureSupport(isTTY: boolean, colorDepth: ColorDepth): Omit<Features, "colorDepth">;
4
4
  //# sourceMappingURL=detect.d.ts.map
@@ -1,3 +1,3 @@
1
- import type { Args, Features } from "./types";
1
+ import type { Args, Features } from "./types.js";
2
2
  export declare function getFeatures(...args: Args): Features;
3
3
  //# sourceMappingURL=features.d.ts.map
@@ -1,3 +1,3 @@
1
- export * from "./features";
2
- export type * from "./types";
1
+ export * from "./features.js";
2
+ export type * from "./types.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- export { default } from "./ansi";
2
- export * from "./ansi";
3
- export type { Ansi } from "./types";
1
+ export { default } from "./ansi.js";
2
+ export * from "./ansi.js";
3
+ export type { Ansi } from "./types.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/patterns.ts"],"names":[],"mappings":"AAuCA,eAAO,MAAM,KAAK,kBAAqC,CAAC;AACxD,eAAO,MAAM,KAAK,kBAA+C,CAAC;AAClE,eAAO,MAAM,QAAQ,kBAA+C,CAAC"}
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/patterns.ts"],"names":[],"mappings":"AAuCA,eAAO,MAAM,KAAK,kBAAuC,CAAC;AAC1D,eAAO,MAAM,KAAK,kBAA+C,CAAC;AAClE,eAAO,MAAM,QAAQ,kBAA+C,CAAC"}
@@ -36,7 +36,7 @@ timeit(() => long .replace(new RegExp(rxSGR.source, "g"), ""), {description: "lo
36
36
  // long - clone source : 46.491 ųs (21,510 in 1.000026492 s)
37
37
  ```
38
38
  */
39
- export const rxSGR = Object.freeze(/\x1b\[[\d;]*m/g);
39
+ export const rxSGR = Object.freeze(/\x1b\[([\d;]*)m/g);
40
40
  export const rxCSI = Object.freeze(/\x1b\[[0-?]*[ -/]*[@-~]/g);
41
41
  export const rxUnsafe = Object.freeze(/\x1b\[[0-?]*[ -/]*[@-ln-~]/g); // Everything except SGR codes (m).
42
42
  //# sourceMappingURL=patterns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCE;AAEF,MAAM,CAAC,MAAM,KAAK,GAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,KAAK,GAAM,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,mCAAmC"}
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCE;AAEF,MAAM,CAAC,MAAM,KAAK,GAAM,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,KAAK,GAAM,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,mCAAmC"}
@@ -1,4 +1,4 @@
1
- import type { ColorDepth } from "../../features";
2
- import type { ChainKey, Channel, ColorKey, FormatBuilder, Style } from "../types";
1
+ import type { ColorDepth } from "../../features/index.js";
2
+ import type { ChainKey, Channel, ColorKey, FormatBuilder, Style } from "../types.js";
3
3
  export declare function makeChannel(keys: ReadonlySet<ChainKey>, makeFormatter: FormatBuilder, style: Style, colorDepth: ColorDepth, channel: ColorKey): Channel;
4
4
  //# sourceMappingURL=channel.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { ColorDepth } from "../../features";
2
- import type { ChainKey, Color, FormatBuilder, Style } from "../types";
1
+ import type { ColorDepth } from "../../features/index.js";
2
+ import type { ChainKey, Color, FormatBuilder, Style } from "../types.js";
3
3
  export declare function makeColor(keys: ReadonlySet<ChainKey>, makeFormatter: FormatBuilder, style: Style, colorDepth: ColorDepth): Color<any>;
4
4
  //# sourceMappingURL=color.d.ts.map
@@ -1,5 +1,5 @@
1
- import type { ColorDepth } from "../../features";
2
- import type { ChainKey, Code, ColorKey, Format, FormatBuilder, Style } from "../types";
1
+ import type { ColorDepth } from "../../features/index.js";
2
+ import type { ChainKey, Code, ColorKey, Format, FormatBuilder, Style } from "../types.js";
3
3
  export declare function buildContext(keys: ReadonlySet<ChainKey>, makeFormatter: FormatBuilder, style: Style, colorDepth: ColorDepth, channel: ColorKey): {
4
4
  colorDepth: ColorDepth;
5
5
  channel: ColorKey;
@@ -1,2 +1,2 @@
1
- export * from "./color";
1
+ export * from "./color.js";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
- import type { Channel, Format } from "../types";
2
- import type { Context } from "./context";
1
+ import type { Channel, Format } from "../types.js";
2
+ import type { Context } from "./context.js";
3
3
  export declare function makeRGB(ctx: Context): Channel["rgb"];
4
4
  export declare function makeX256(ctx: Context): (...args: [number] | [number, number, number]) => Format;
5
5
  //# sourceMappingURL=rgb.d.ts.map
@@ -1,3 +1,3 @@
1
- import type { Code } from "./types";
1
+ import type { Code } from "./types.js";
2
2
  export declare function combineCodes(base: Code, code: Code): Code;
3
3
  //# sourceMappingURL=combine.d.ts.map
@@ -1,3 +1,3 @@
1
- import type { ChainBuilder, FormatBuilder } from "./types";
1
+ import type { ChainBuilder, FormatBuilder } from "./types.js";
2
2
  export declare function makeFormatBuilder(makeChain: ChainBuilder, enabled?: boolean): FormatBuilder;
3
3
  //# sourceMappingURL=format-builder.d.ts.map
@@ -1,3 +1,3 @@
1
- export * from "./sgr";
2
- export { SGR } from "./types";
1
+ export * from "./sgr.js";
2
+ export { SGR } from "./types.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { Features } from "../features";
2
- import type { SGR } from "./types";
1
+ import type { Features } from "../features/index.js";
2
+ import type { SGR } from "./types.js";
3
3
  export declare function makeSGR(features: Features): SGR;
4
4
  //# sourceMappingURL=sgr.d.ts.map
@@ -1,3 +1,3 @@
1
- import type { ChainKey, FormatBuilder, Style } from "./types";
1
+ import type { ChainKey, FormatBuilder, Style } from "./types.js";
2
2
  export declare function makeStyle(keys: ReadonlySet<ChainKey>, makeFormatter: FormatBuilder, enabled: boolean): Style<any>;
3
3
  //# sourceMappingURL=style.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { BuildAtom } from "./types";
1
+ import type { BuildAtom } from "./types.js";
2
2
  export declare const buildExtendedColorAtom: BuildAtom;
3
3
  export declare const buildIntensityAtom: BuildAtom;
4
4
  //# sourceMappingURL=atom.d.ts.map
@@ -1,2 +1,2 @@
1
- export * from "./simplify";
1
+ export * from "./simplify.js";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,3 @@
1
- import type { Atom, AttributeMap } from "./types";
1
+ import type { Atom, AttributeMap } from "./types.js";
2
2
  export declare function lookUpAtom(codes: number[], index: number, state: AttributeMap): Atom;
3
3
  //# sourceMappingURL=lookup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"simplify.d.ts","sourceRoot":"","sources":["../../../src/simplify/simplify.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuB7C;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC"}
1
+ {"version":3,"file":"simplify.d.ts","sourceRoot":"","sources":["../../../src/simplify/simplify.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwB7C;AAED,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC"}
@@ -9,12 +9,13 @@ export function simplify(text) {
9
9
  let codes = parts[i++].split(";").map(Number);
10
10
  let chunk = parts[i++];
11
11
  while (!chunk && i < parts.length) {
12
+ // Merge consecutive SGR sequences with no text between them.
12
13
  codes.push(...parts[i++].split(";").map(Number));
13
14
  chunk = parts[i++];
14
15
  }
15
- codes = state.update(codes);
16
- if (codes.length)
17
- result += `\x1b[${codes.join(";")}m`;
16
+ const newCodes = state.update(codes);
17
+ if (newCodes.length)
18
+ result += `\x1b[${newCodes.join(";")}m`;
18
19
  result += chunk;
19
20
  }
20
21
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"simplify.js","sourceRoot":"","sources":["../../../src/simplify/simplify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAC;AAClC,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAE9B,MAAM,UAAU,QAAQ,CAAC,IAAY;IACpC,sEAAsE;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAI,IAAI,KAAK,EAAE,CAAC;IAC3B,IAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAI,CAAC;QACpC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAEvB,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM;YACf,MAAM,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"simplify.js","sourceRoot":"","sources":["../../../src/simplify/simplify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAC;AAClC,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAE9B,MAAM,UAAU,QAAQ,CAAC,IAAY;IACpC,sEAAsE;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAI,IAAI,KAAK,EAAE,CAAC;IAC3B,IAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAI,CAAC;QACpC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAEvB,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACnC,6DAA6D;YAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,QAAQ,CAAC,MAAM;YAClB,MAAM,IAAI,QAAQ,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -1,5 +1,6 @@
1
- import type { Attribute, AttributeMap } from "./types";
1
+ import type { Attribute, AttributeMap } from "./types.js";
2
2
  export declare class State extends Map<Attribute, number[]> implements AttributeMap {
3
- update(codes: number[]): number[];
3
+ #private;
4
+ update(codes: number[]): Array<number | string>;
4
5
  }
5
6
  //# sourceMappingURL=state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/simplify/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,SAAS,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AAerD,qBAAa,KAAM,SAAQ,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAE,YAAW,YAAY;IAC1E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CA2CjC"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/simplify/state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,SAAS,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AAerD,qBAAa,KAAM,SAAQ,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAE,YAAW,YAAY;;IAa1E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;CA8D/C"}
@@ -13,12 +13,24 @@ const defaultCodes = new Map([
13
13
  ["overline", [55]],
14
14
  ]);
15
15
  export class State extends Map {
16
+ #isDefaultState(except) {
17
+ for (const [attribute, defaultCode] of defaultCodes) {
18
+ if (attribute === except)
19
+ continue;
20
+ const current = this.get(attribute);
21
+ if (!arraysEqual(current, defaultCode))
22
+ return false;
23
+ }
24
+ return true;
25
+ }
16
26
  update(codes) {
17
27
  let snapshot = new Map(this);
18
28
  const attributes = new Set();
19
29
  for (let i = 0; i < codes.length; i++) {
20
30
  const { attribute, code, skip } = lookUpAtom(codes, i, this);
21
31
  if (attribute === "reset") {
32
+ if (this.#isDefaultState())
33
+ continue;
22
34
  attributes.clear();
23
35
  this.clear();
24
36
  attributes.add("reset");
@@ -32,18 +44,31 @@ export class State extends Map {
32
44
  if (skip)
33
45
  i += skip;
34
46
  }
35
- return Array.from(attributes).flatMap(attribute => {
36
- if (attribute === "reset")
37
- return [0];
47
+ const rtn = [];
48
+ for (const attribute of attributes) {
49
+ if (attribute === "reset") {
50
+ rtn.length = 0; // Any previous codes are irrelevant.
51
+ rtn.push(""); // The terminal will interpret missing values as `0`.
52
+ continue;
53
+ }
38
54
  const code = this.get(attribute);
39
55
  if (arraysEqual(code, snapshot.get(attribute)))
40
- return [];
56
+ continue;
57
+ // If this code would put us in a known overall default state, then we can just reset,
58
+ // which is shorter. (Compare `\x1b[m` vs. `\x1b[39m` or especially `\x1b[22;39;49m`.)
59
+ if (arraysEqual(code, defaultCodes.get(attribute)) && this.#isDefaultState(attribute)) {
60
+ rtn.length = 0;
61
+ rtn.push("");
62
+ continue;
63
+ }
41
64
  if (attribute === "intensity") {
42
65
  const previous = snapshot.get(attribute);
43
- return transitionIntensity(previous, code);
66
+ rtn.push(...transitionIntensity(previous, code));
67
+ continue;
44
68
  }
45
- return code;
46
- });
69
+ rtn.push(...code);
70
+ }
71
+ return rtn;
47
72
  }
48
73
  }
49
74
  //# sourceMappingURL=state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/simplify/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAA4B,UAAU,CAAC;AAC1D,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAC,MAAM,SAAS,CAAC;AAIzD,MAAM,YAAY,GAA6B,IAAI,GAAG,CAAC;IACtD,CAAC,WAAW,EAAM,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,QAAQ,EAAS,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,WAAW,EAAM,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,SAAS,EAAQ,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,QAAQ,EAAS,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,IAAI,EAAa,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,IAAI,EAAa,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,OAAO,EAAU,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,UAAU,EAAO,CAAC,EAAE,CAAC,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,OAAO,KAAM,SAAQ,GAAwB;IAClD,MAAM,CAAC,KAAe;QACrB,IAAI,QAAQ,GAAiB,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAa,CAAC;QAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAE3D,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC3B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxB,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,YAAY;oBAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAE7B,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzB,SAAS;YACV,CAAC;YAED,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAE1B,IAAI,IAAI;gBACP,CAAC,IAAI,IAAI,CAAC;QACZ,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACjD,IAAI,SAAS,KAAK,OAAO;gBACxB,OAAO,CAAC,CAAC,CAAC,CAAC;YAEZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YAElC,IAAI,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC7C,OAAO,EAAE,CAAC;YAEX,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACzC,OAAO,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;YAED,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC;CACD"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/simplify/state.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import type { Caret } from "./caret";
2
- import type { Erase } from "./erase";
3
- import type { Features } from "./features";
4
- import type { PadEnd, PadStart } from "./pad";
5
- import type { Scroll } from "./scroll";
6
- import type { SGR } from "./sgr";
7
- import type { Simplify } from "./simplify";
8
- import type { Slice } from "./slice";
9
- import type { Sanitize, Strip, VisibleLength } from "./strip";
10
- import type { Terminal } from "./terminal";
1
+ import type { Caret } from "./caret.js";
2
+ import type { Erase } from "./erase.js";
3
+ import type { Features } from "./features/index.js";
4
+ import type { PadEnd, PadStart } from "./pad.js";
5
+ import type { Scroll } from "./scroll.js";
6
+ import type { SGR } from "./sgr/index.js";
7
+ import type { Simplify } from "./simplify/index.js";
8
+ import type { Slice } from "./slice.js";
9
+ import type { Sanitize, Strip, VisibleLength } from "./strip.js";
10
+ import type { Terminal } from "./terminal.js";
11
11
  export type Ansi = SGR & {
12
12
  caret: Caret;
13
13
  erase: Erase;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name" : "@peteanderson/ansi",
3
- "version" : "2.1.0",
3
+ "version" : "2.1.1",
4
4
  "description" : "ANSI escape sequence generation with automatic feature detection",
5
5
  "author" : {
6
6
  "name" : "Pete Anderson",
package/src/patterns.ts CHANGED
@@ -37,6 +37,6 @@ timeit(() => long .replace(new RegExp(rxSGR.source, "g"), ""), {description: "lo
37
37
  ```
38
38
  */
39
39
 
40
- export const rxSGR = Object.freeze(/\x1b\[[\d;]*m/g);
40
+ export const rxSGR = Object.freeze(/\x1b\[([\d;]*)m/g);
41
41
  export const rxCSI = Object.freeze(/\x1b\[[0-?]*[ -/]*[@-~]/g);
42
42
  export const rxUnsafe = Object.freeze(/\x1b\[[0-?]*[ -/]*[@-ln-~]/g); // Everything except SGR codes (m).
@@ -13,13 +13,14 @@ export function simplify(text: string): string {
13
13
  let chunk = parts[i++];
14
14
 
15
15
  while (!chunk && i < parts.length) {
16
+ // Merge consecutive SGR sequences with no text between them.
16
17
  codes.push(...parts[i++].split(";").map(Number));
17
18
  chunk = parts[i++];
18
19
  }
19
20
 
20
- codes = state.update(codes);
21
- if (codes.length)
22
- result += `\x1b[${codes.join(";")}m`;
21
+ const newCodes = state.update(codes);
22
+ if (newCodes.length)
23
+ result += `\x1b[${newCodes.join(";")}m`;
23
24
  result += chunk;
24
25
  }
25
26
 
@@ -17,7 +17,19 @@ const defaultCodes: Map<Attribute, number[]> = new Map([
17
17
  ]);
18
18
 
19
19
  export class State extends Map<Attribute, number[]> implements AttributeMap {
20
- update(codes: number[]): number[] {
20
+ #isDefaultState(except?: Attribute): boolean {
21
+ for (const [attribute, defaultCode] of defaultCodes) {
22
+ if (attribute === except)
23
+ continue;
24
+
25
+ const current = this.get(attribute);
26
+ if (!arraysEqual(current, defaultCode))
27
+ return false;
28
+ }
29
+ return true;
30
+ }
31
+
32
+ update(codes: number[]): Array<number | string> {
21
33
  let snapshot: AttributeMap = new Map(this);
22
34
 
23
35
  const attributes = new Set<Attribute>();
@@ -26,6 +38,9 @@ export class State extends Map<Attribute, number[]> implements AttributeMap {
26
38
  const {attribute, code, skip} = lookUpAtom(codes, i, this);
27
39
 
28
40
  if (attribute === "reset") {
41
+ if (this.#isDefaultState())
42
+ continue;
43
+
29
44
  attributes.clear();
30
45
  this.clear();
31
46
  attributes.add("reset");
@@ -43,21 +58,37 @@ export class State extends Map<Attribute, number[]> implements AttributeMap {
43
58
  i += skip;
44
59
  }
45
60
 
46
- return Array.from(attributes).flatMap(attribute => {
47
- if (attribute === "reset")
48
- return [0];
61
+ const rtn: Array<number | string> = [];
62
+
63
+ for (const attribute of attributes) {
64
+ if (attribute === "reset") {
65
+ rtn.length = 0; // Any previous codes are irrelevant.
66
+ rtn.push(""); // The terminal will interpret missing values as `0`.
67
+ continue;
68
+ }
49
69
 
50
70
  const code = this.get(attribute)!;
51
71
 
52
72
  if (arraysEqual(code, snapshot.get(attribute)))
53
- return [];
73
+ continue;
74
+
75
+ // If this code would put us in a known overall default state, then we can just reset,
76
+ // which is shorter. (Compare `\x1b[m` vs. `\x1b[39m` or especially `\x1b[22;39;49m`.)
77
+ if (arraysEqual(code, defaultCodes.get(attribute)) && this.#isDefaultState(attribute)) {
78
+ rtn.length = 0;
79
+ rtn.push("");
80
+ continue;
81
+ }
54
82
 
55
83
  if (attribute === "intensity") {
56
84
  const previous = snapshot.get(attribute);
57
- return transitionIntensity(previous, code);
85
+ rtn.push(...transitionIntensity(previous, code));
86
+ continue;
58
87
  }
59
88
 
60
- return code;
61
- });
89
+ rtn.push(...code);
90
+ }
91
+
92
+ return rtn;
62
93
  }
63
94
  }