@peteanderson/ansi 3.2.0 → 3.4.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 +15 -0
  2. package/dist/cjs/ansi.d.ts +4 -1
  3. package/dist/cjs/ansi.d.ts.map +1 -1
  4. package/dist/cjs/ansi.js +4 -2
  5. package/dist/cjs/ansi.js.map +1 -1
  6. package/dist/cjs/features/build.d.ts +1 -1
  7. package/dist/cjs/features/build.d.ts.map +1 -1
  8. package/dist/cjs/features/build.js +17 -3
  9. package/dist/cjs/features/build.js.map +1 -1
  10. package/dist/cjs/features/detect.d.ts.map +1 -1
  11. package/dist/cjs/features/detect.js +2 -0
  12. package/dist/cjs/features/detect.js.map +1 -1
  13. package/dist/cjs/features/features.js +4 -4
  14. package/dist/cjs/features/features.js.map +1 -1
  15. package/dist/cjs/features/types.d.ts +2 -0
  16. package/dist/cjs/features/types.d.ts.map +1 -1
  17. package/dist/cjs/index.d.ts +4 -1
  18. package/dist/cjs/index.d.ts.map +1 -1
  19. package/dist/cjs/ins-del.d.ts +30 -0
  20. package/dist/cjs/ins-del.d.ts.map +1 -0
  21. package/dist/cjs/{erase.js → ins-del.js} +23 -4
  22. package/dist/cjs/ins-del.js.map +1 -0
  23. package/dist/cjs/slice.d.ts +8 -0
  24. package/dist/cjs/slice.d.ts.map +1 -1
  25. package/dist/cjs/slice.js +8 -0
  26. package/dist/cjs/slice.js.map +1 -1
  27. package/dist/cjs/split-at.d.ts.map +1 -1
  28. package/dist/cjs/split-at.js +2 -1
  29. package/dist/cjs/split-at.js.map +1 -1
  30. package/dist/cjs/types.d.ts +3 -1
  31. package/dist/cjs/types.d.ts.map +1 -1
  32. package/dist/esm/ansi.d.ts +4 -1
  33. package/dist/esm/ansi.d.ts.map +1 -1
  34. package/dist/esm/ansi.js +3 -1
  35. package/dist/esm/ansi.js.map +1 -1
  36. package/dist/esm/features/build.d.ts +1 -1
  37. package/dist/esm/features/build.d.ts.map +1 -1
  38. package/dist/esm/features/build.js +17 -3
  39. package/dist/esm/features/build.js.map +1 -1
  40. package/dist/esm/features/detect.d.ts.map +1 -1
  41. package/dist/esm/features/detect.js +2 -0
  42. package/dist/esm/features/detect.js.map +1 -1
  43. package/dist/esm/features/features.js +4 -4
  44. package/dist/esm/features/features.js.map +1 -1
  45. package/dist/esm/features/types.d.ts +2 -0
  46. package/dist/esm/features/types.d.ts.map +1 -1
  47. package/dist/esm/ins-del.d.ts +30 -0
  48. package/dist/esm/ins-del.d.ts.map +1 -0
  49. package/dist/esm/ins-del.js +46 -0
  50. package/dist/esm/ins-del.js.map +1 -0
  51. package/dist/esm/slice.d.ts +8 -0
  52. package/dist/esm/slice.d.ts.map +1 -1
  53. package/dist/esm/slice.js +8 -0
  54. package/dist/esm/slice.js.map +1 -1
  55. package/dist/esm/split-at.d.ts.map +1 -1
  56. package/dist/esm/split-at.js +2 -1
  57. package/dist/esm/split-at.js.map +1 -1
  58. package/dist/esm/types.d.ts +3 -1
  59. package/dist/esm/types.d.ts.map +1 -1
  60. package/package.json +1 -1
  61. package/src/ansi.ts +13 -11
  62. package/src/features/build.ts +18 -2
  63. package/src/features/detect.ts +2 -0
  64. package/src/features/features.ts +4 -4
  65. package/src/features/types.ts +2 -0
  66. package/src/ins-del.ts +58 -0
  67. package/src/slice.ts +8 -0
  68. package/src/split-at.ts +2 -1
  69. package/src/types.ts +3 -1
  70. package/dist/cjs/erase.d.ts +0 -17
  71. package/dist/cjs/erase.d.ts.map +0 -1
  72. package/dist/cjs/erase.js.map +0 -1
  73. package/dist/esm/erase.d.ts +0 -17
  74. package/dist/esm/erase.d.ts.map +0 -1
  75. package/dist/esm/erase.js +0 -29
  76. package/dist/esm/erase.js.map +0 -1
  77. package/src/erase.ts +0 -33
@@ -1 +1 @@
1
- {"version":3,"file":"features.js","sourceRoot":"","sources":["../../../src/features/features.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAiC,UAAU,CAAC;AAC3D,OAAO,EAAC,WAAW,EAAC,MAA4B,UAAU,CAAC;AAC3D,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAC,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAC,MAA0B,UAAU,CAAC;AAI3D,MAAM,UAAU,WAAW,CAAC,GAAG,IAAU;IACxC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAE9B,IAAI,OAAO,QAAQ,KAAK,SAAS;QAChC,OAAO,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE5D,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAC/B,OAAO,MAAM,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE3D,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAC5C,QAAQ,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,QAAQ,YAAY,WAAW;QAClC,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEtB,IAAI,QAAQ,YAAY,MAAM;QAC7B,OAAO,IAAI,EAAE,CAAC;IAEf,MAAM,EAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAC,GAAG,QAAQ,CAAC;IAEtE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;IAE1B,IAAI,UAAU;QACb,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEhF,IAAI,MAAM,CAAC,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEnF,OAAO,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../../src/features/features.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAiC,UAAU,CAAC;AAC3D,OAAO,EAAC,WAAW,EAAC,MAA4B,UAAU,CAAC;AAC3D,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAC,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAC,MAA0B,UAAU,CAAC;AAI3D,MAAM,UAAU,WAAW,CAAC,GAAG,IAAU;IACxC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAE9B,IAAI,OAAO,QAAQ,KAAK,SAAS;QAChC,OAAO,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE5D,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAC/B,OAAO,MAAM,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE3D,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAC5C,QAAQ,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,QAAQ,YAAY,WAAW;QAClC,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEtB,IAAI,QAAQ,YAAY,MAAM;QAC7B,OAAO,IAAI,EAAE,CAAC;IAEf,MAAM,EAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAC,GAAG,QAAQ,CAAC;IAE3F,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;IAE1B,IAAI,UAAU;QACb,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE7F,IAAI,MAAM,CAAC,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEhG,OAAO,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC3F,CAAC"}
@@ -4,7 +4,9 @@ export interface Features {
4
4
  colorDepth: ColorDepth;
5
5
  style: boolean;
6
6
  cursor: boolean;
7
+ delete: boolean;
7
8
  erase: boolean;
9
+ insert: boolean;
8
10
  scroll: boolean;
9
11
  terminal: boolean;
10
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/features/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAErC,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACxB,UAAU,EAAG,UAAU,CAAC;IACxB,KAAK,EAAQ,OAAO,CAAC;IACrB,MAAM,EAAO,OAAO,CAAC;IACrB,KAAK,EAAQ,OAAO,CAAC;IACrB,MAAM,EAAO,OAAO,CAAC;IACrB,QAAQ,EAAK,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,IAAI,GACb,CAAC,OAAO,EAAM,OAAO,EAAY,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAC7D,CAAC,UAAU,EAAG,UAAU,EAAS,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAC7D,CAAC,QAAQ,EAAK,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAC7D,CAAC,MAAM,EAAO,MAAM,CAAC,GACrB,CAAC,MAAM,CAAC,EAAM,MAAM,CAAC,WAAW,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/features/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAErC,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACxB,UAAU,EAAG,UAAU,CAAC;IACxB,KAAK,EAAQ,OAAO,CAAC;IACrB,MAAM,EAAO,OAAO,CAAC;IACrB,MAAM,EAAO,OAAO,CAAC;IACrB,KAAK,EAAQ,OAAO,CAAC;IACrB,MAAM,EAAO,OAAO,CAAC;IACrB,MAAM,EAAO,OAAO,CAAC;IACrB,QAAQ,EAAK,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,IAAI,GACb,CAAC,OAAO,EAAM,OAAO,EAAY,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAC7D,CAAC,UAAU,EAAG,UAAU,EAAS,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAC7D,CAAC,QAAQ,EAAK,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAC7D,CAAC,MAAM,EAAO,MAAM,CAAC,GACrB,CAAC,MAAM,CAAC,EAAM,MAAM,CAAC,WAAW,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ declare const erase: {
2
+ char: (count?: number | undefined) => string;
3
+ line: {
4
+ toStart: string;
5
+ toEnd: string;
6
+ full: string;
7
+ };
8
+ screen: {
9
+ toStart: string;
10
+ toEnd: string;
11
+ full: string;
12
+ scrollback: string;
13
+ };
14
+ };
15
+ declare const insert: {
16
+ char: (count?: number | undefined) => string;
17
+ line: (count?: number | undefined) => string;
18
+ };
19
+ declare const del: {
20
+ char: (count?: number | undefined) => string;
21
+ line: (count?: number | undefined) => string;
22
+ };
23
+ export type Erase = typeof erase;
24
+ export type Insert = typeof insert;
25
+ export type Delete = typeof del;
26
+ export declare const makeErase: (enabled?: boolean) => Erase;
27
+ export declare const makeInsert: (enabled?: boolean) => Insert;
28
+ export declare const makeDelete: (enabled?: boolean) => Delete;
29
+ export {};
30
+ //# sourceMappingURL=ins-del.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ins-del.d.ts","sourceRoot":"","sources":["../../src/ins-del.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,KAAK;;;;;;;;;;;;;CAcV,CAAC;AAEF,QAAA,MAAM,MAAM;;;CAGX,CAAC;AAEF,QAAA,MAAM,GAAG;;;CAGR,CAAC;AAEF,MAAM,MAAM,KAAK,GAAI,OAAO,KAAK,CAAC;AAClC,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC;AACnC,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC;AAyBhC,eAAO,MAAM,SAAS,GAAK,iBAAc,KAAG,KAA0C,CAAC;AACvF,eAAO,MAAM,UAAU,GAAI,iBAAc,KAAG,MAA2C,CAAC;AACxF,eAAO,MAAM,UAAU,GAAI,iBAAc,KAAG,MAA2C,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { count, csi, noop } from "./utils.js";
2
+ const erase = {
3
+ char: count("X"),
4
+ line: {
5
+ toStart: csi("1K"),
6
+ toEnd: csi("0K"),
7
+ full: csi("2K"),
8
+ },
9
+ screen: {
10
+ toStart: csi("1J"),
11
+ toEnd: csi("0J"),
12
+ full: csi("2J"),
13
+ scrollback: csi("3J"),
14
+ },
15
+ };
16
+ const insert = {
17
+ char: count("@"),
18
+ line: count("L"),
19
+ };
20
+ const del = {
21
+ char: count("P"),
22
+ line: count("M"),
23
+ };
24
+ const disabledErase = {
25
+ char: noop,
26
+ line: {
27
+ toStart: "",
28
+ toEnd: "",
29
+ full: "",
30
+ },
31
+ screen: {
32
+ toStart: "",
33
+ toEnd: "",
34
+ full: "",
35
+ scrollback: "",
36
+ },
37
+ };
38
+ const disabledInsert = {
39
+ char: noop,
40
+ line: noop,
41
+ };
42
+ const disabledDelete = disabledInsert;
43
+ export const makeErase = (enabled = true) => enabled ? erase : disabledErase;
44
+ export const makeInsert = (enabled = true) => enabled ? insert : disabledInsert;
45
+ export const makeDelete = (enabled = true) => enabled ? del : disabledDelete;
46
+ //# sourceMappingURL=ins-del.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ins-del.js","sourceRoot":"","sources":["../../src/ins-del.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAC,MAAM,SAAS,CAAC;AAEzC,MAAM,KAAK,GAAG;IACb,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;IAEhB,IAAI,EAAE;QACL,OAAO,EAAG,GAAG,CAAC,IAAI,CAAC;QACnB,KAAK,EAAK,GAAG,CAAC,IAAI,CAAC;QACnB,IAAI,EAAM,GAAG,CAAC,IAAI,CAAC;KACnB;IACD,MAAM,EAAE;QACP,OAAO,EAAM,GAAG,CAAC,IAAI,CAAC;QACtB,KAAK,EAAQ,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,EAAS,GAAG,CAAC,IAAI,CAAC;QACtB,UAAU,EAAG,GAAG,CAAC,IAAI,CAAC;KACtB;CACD,CAAC;AAEF,MAAM,MAAM,GAAG;IACd,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;IAChB,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;CAChB,CAAC;AAEF,MAAM,GAAG,GAAG;IACX,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;IAChB,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;CAChB,CAAC;AAMF,MAAM,aAAa,GAAU;IAC5B,IAAI,EAAE,IAAI;IAEV,IAAI,EAAE;QACL,OAAO,EAAG,EAAE;QACZ,KAAK,EAAK,EAAE;QACZ,IAAI,EAAM,EAAE;KACZ;IACD,MAAM,EAAE;QACP,OAAO,EAAM,EAAE;QACf,KAAK,EAAQ,EAAE;QACf,IAAI,EAAS,EAAE;QACf,UAAU,EAAG,EAAE;KACf;CACD,CAAC;AAEF,MAAM,cAAc,GAAW;IAC9B,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;CACV,CAAC;AAEF,MAAM,cAAc,GAAW,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,SAAS,GAAI,CAAC,OAAO,GAAG,IAAI,EAAU,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC,CAAC,aAAa,CAAC;AACvF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAO,GAAG,IAAI,EAAU,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;AACxF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAO,GAAG,IAAI,EAAU,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAI,CAAC,CAAC,cAAc,CAAC"}
@@ -11,6 +11,14 @@ export declare function skippedSequences(text: string, start: number, end?: numb
11
11
  * printed. If you compose two or more slices together, there may be redundant SGR sequences at the
12
12
  * boundaries, but the result will be correct. You can use `simplify` to remove the redundancies.
13
13
  *
14
+ * Negative indices for `start` or `end` are interpreted as offsets from the end of the string,
15
+ * counting only visible characters. For example, `slice(text, -1)` returns a string containing only
16
+ * the last visible character of `text`, as well as any SGR codes from before and after that
17
+ * character.
18
+ *
19
+ * This function is analogous to `String.prototype.slice`. If the given string contains no ANSI
20
+ * sequences, the result will be the same as `text.slice(start, end)`.
21
+ *
14
22
  * Note the following caveats:
15
23
  *
16
24
  * * Any non-SGR ANSI codes prior to or after the slice will be ignored.
@@ -1 +1 @@
1
- {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/slice.ts"],"names":[],"mappings":"AAIA,wBAAgB,OAAO,CACtB,IAAI,EAAc,MAAM,EACxB,eAAe,EAAG,MAAM,EACxB,YAAY,EAAM,MAAM,GACtB;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAsBjC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CA8BvE;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC"}
1
+ {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/slice.ts"],"names":[],"mappings":"AAIA,wBAAgB,OAAO,CACtB,IAAI,EAAc,MAAM,EACxB,eAAe,EAAG,MAAM,EACxB,YAAY,EAAM,MAAM,GACtB;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAsBjC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CA8BvE;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC"}
package/dist/esm/slice.js CHANGED
@@ -32,6 +32,14 @@ export function skippedSequences(text, start, end) {
32
32
  * printed. If you compose two or more slices together, there may be redundant SGR sequences at the
33
33
  * boundaries, but the result will be correct. You can use `simplify` to remove the redundancies.
34
34
  *
35
+ * Negative indices for `start` or `end` are interpreted as offsets from the end of the string,
36
+ * counting only visible characters. For example, `slice(text, -1)` returns a string containing only
37
+ * the last visible character of `text`, as well as any SGR codes from before and after that
38
+ * character.
39
+ *
40
+ * This function is analogous to `String.prototype.slice`. If the given string contains no ANSI
41
+ * sequences, the result will be the same as `text.slice(start, end)`.
42
+ *
35
43
  * Note the following caveats:
36
44
  *
37
45
  * * Any non-SGR ANSI codes prior to or after the slice will be ignored.
@@ -1 +1 @@
1
- {"version":3,"file":"slice.js","sourceRoot":"","sources":["../../src/slice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slice.js","sourceRoot":"","sources":["../../src/slice.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"split-at.d.ts","sourceRoot":"","sources":["../../src/split-at.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACtB,IAAI,EAAa,MAAM,EACvB,YAAY,EAAK,MAAM,EACvB,cAAc,GAAG,OAAe,GAC9B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAwB9B;AAED,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC"}
1
+ {"version":3,"file":"split-at.d.ts","sourceRoot":"","sources":["../../src/split-at.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACtB,IAAI,EAAa,MAAM,EACvB,YAAY,EAAK,MAAM,EACvB,cAAc,GAAG,OAAe,GAC9B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAwB9B;AAED,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { scanCSI, skippedSequences } from "./slice.js";
2
+ import { visibleLength } from "./strip.js";
2
3
  /**
3
4
  * Split a string into two parts at the given visible index (i.e., the given visible character,
4
5
  * ignoring ANSI escape codes). The returned strings will include any ANSI escape codes from within
@@ -12,7 +13,7 @@ export function splitAt(text, visibleIndex, includeSkipped = false) {
12
13
  if (!visibleIndex)
13
14
  return ["", text];
14
15
  if (visibleIndex < 0)
15
- throw new Error("visibleIndex must be non-negative");
16
+ visibleIndex = Math.max(0, visibleLength(text) + visibleIndex);
16
17
  if (visibleIndex > text.length)
17
18
  return [text, ""];
18
19
  const { index } = scanCSI(text, 0, visibleIndex);
@@ -1 +1 @@
1
- {"version":3,"file":"split-at.js","sourceRoot":"","sources":["../../src/split-at.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAIlD;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CACtB,IAAuB,EACvB,YAAuB,EACvB,iBAA2B,KAAK;IAEhC,IAAI,CAAC,YAAY;QAChB,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAEnB,IAAI,YAAY,GAAG,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAEtD,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM;QAC7B,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEnB,MAAM,EAAC,KAAK,EAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;IAE/C,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;QACxB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEnB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjC,IAAI,GAAG,GAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE9B,IAAI,cAAc,EAAE,CAAC;QACpB,KAAK,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,GAAG,GAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"split-at.js","sourceRoot":"","sources":["../../src/split-at.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAClD,OAAO,EAAC,aAAa,EAAC,MAAkB,SAAS,CAAC;AAIlD;;;;;;;;GAQG;AACH,MAAM,UAAU,OAAO,CACtB,IAAuB,EACvB,YAAuB,EACvB,iBAA2B,KAAK;IAEhC,IAAI,CAAC,YAAY;QAChB,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAEnB,IAAI,YAAY,GAAG,CAAC;QACnB,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IAEhE,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM;QAC7B,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEnB,MAAM,EAAC,KAAK,EAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;IAE/C,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;QACxB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEnB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjC,IAAI,GAAG,GAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE9B,IAAI,cAAc,EAAE,CAAC;QACpB,KAAK,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,GAAG,GAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { Cursor } from "./cursor.js";
2
- import type { Erase } from "./erase.js";
2
+ import type { Delete, Erase, Insert } from "./ins-del.js";
3
3
  import type { Features } from "./features/index.js";
4
4
  import type { PadEnd, PadStart } from "./pad.js";
5
5
  import type { Scroll } from "./scroll.js";
@@ -11,7 +11,9 @@ import type { Sanitize, Strip, VisibleLength } from "./strip.js";
11
11
  import type { Terminal } from "./terminal.js";
12
12
  export type Ansi = SGR & {
13
13
  cursor: Cursor;
14
+ delete: Delete;
14
15
  erase: Erase;
16
+ insert: Insert;
15
17
  scroll: Scroll;
16
18
  terminal: Terminal;
17
19
  padEnd: PadEnd;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAA8B,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAC,KAAK,EAAC,MAA+B,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAA4B,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAC,MAAM,EAAE,QAAQ,EAAC,MAAoB,OAAO,CAAC;AAC1D,OAAO,KAAK,EAAC,MAAM,EAAC,MAA8B,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAC,GAAG,EAAC,MAAiC,OAAO,CAAC;AAC1D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAA4B,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAC,KAAK,EAAC,MAA+B,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAC,OAAO,EAAC,MAA6B,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAA4B,YAAY,CAAC;AAE/D,MAAM,MAAM,IAAI,GAAG,GAAG,GAAG;IACxB,MAAM,EAAK,MAAM,CAAC;IAClB,KAAK,EAAM,KAAK,CAAC;IACjB,MAAM,EAAK,MAAM,CAAC;IAClB,QAAQ,EAAG,QAAQ,CAAC;IAEpB,MAAM,EAAK,MAAM,CAAC;IAClB,QAAQ,EAAG,QAAQ,CAAC;IAEpB,KAAK,EAAW,KAAK,CAAC;IACtB,aAAa,EAAG,aAAa,CAAC;IAC9B,QAAQ,EAAQ,QAAQ,CAAC;IACzB,KAAK,EAAW,KAAK,CAAC;IACtB,OAAO,EAAS,OAAO,CAAC;IACxB,QAAQ,EAAQ,QAAQ,CAAC;IAEzB,QAAQ,EAAG,QAAQ,CAAC;CACpB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAA8B,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAC,MAAe,WAAW,CAAC;AAC9D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAA4B,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAC,MAAM,EAAE,QAAQ,EAAC,MAAoB,OAAO,CAAC;AAC1D,OAAO,KAAK,EAAC,MAAM,EAAC,MAA8B,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAC,GAAG,EAAC,MAAiC,OAAO,CAAC;AAC1D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAA4B,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAC,KAAK,EAAC,MAA+B,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAC,OAAO,EAAC,MAA6B,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAA4B,YAAY,CAAC;AAE/D,MAAM,MAAM,IAAI,GAAG,GAAG,GAAG;IACxB,MAAM,EAAK,MAAM,CAAC;IAClB,MAAM,EAAK,MAAM,CAAC;IAClB,KAAK,EAAM,KAAK,CAAC;IACjB,MAAM,EAAK,MAAM,CAAC;IAClB,MAAM,EAAK,MAAM,CAAC;IAClB,QAAQ,EAAG,QAAQ,CAAC;IAEpB,MAAM,EAAK,MAAM,CAAC;IAClB,QAAQ,EAAG,QAAQ,CAAC;IAEpB,KAAK,EAAW,KAAK,CAAC;IACtB,aAAa,EAAG,aAAa,CAAC;IAC9B,QAAQ,EAAQ,QAAQ,CAAC;IACzB,KAAK,EAAW,KAAK,CAAC;IACtB,OAAO,EAAS,OAAO,CAAC;IACxB,QAAQ,EAAQ,QAAQ,CAAC;IAEzB,QAAQ,EAAG,QAAQ,CAAC;CACpB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name" : "@peteanderson/ansi",
3
- "version" : "3.2.0",
3
+ "version" : "3.4.0",
4
4
  "description" : "ANSI escape sequence generation with automatic feature detection",
5
5
  "author" : {
6
6
  "name" : "Pete Anderson",
package/src/ansi.ts CHANGED
@@ -1,14 +1,14 @@
1
- import {makeCursor} from "./cursor";
2
- import {makeErase} from "./erase";
3
- import {getFeatures} from "./features";
4
- import {padEnd, padStart} from "./pad";
5
- import {makeScroll} from "./scroll";
6
- import {makeSGR} from "./sgr";
7
- import {simplify} from "./simplify";
8
- import {slice} from "./slice";
9
- import {splitAt} from "./split-at";
10
- import {sanitize, strip, visibleLength} from "./strip";
11
- import {makeTerminal} from "./terminal";
1
+ import {makeCursor} from "./cursor";
2
+ import {makeDelete, makeErase, makeInsert} from "./ins-del";
3
+ import {getFeatures} from "./features";
4
+ import {padEnd, padStart} from "./pad";
5
+ import {makeScroll} from "./scroll";
6
+ import {makeSGR} from "./sgr";
7
+ import {simplify} from "./simplify";
8
+ import {slice} from "./slice";
9
+ import {splitAt} from "./split-at";
10
+ import {sanitize, strip, visibleLength} from "./strip";
11
+ import {makeTerminal} from "./terminal";
12
12
 
13
13
  import type {Args} from "./features";
14
14
  import type {Ansi} from "./types";
@@ -20,7 +20,9 @@ export function makeAnsi(...args: Args): Ansi {
20
20
  ...makeSGR(features),
21
21
 
22
22
  cursor : makeCursor(features.cursor),
23
+ delete : makeDelete(features.erase),
23
24
  erase : makeErase(features.erase),
25
+ insert : makeInsert(features.erase),
24
26
  scroll : makeScroll(features.scroll),
25
27
 
26
28
  terminal: makeTerminal(features.terminal),
@@ -16,25 +16,41 @@ export function build(
16
16
  colorDepth : ColorDepth,
17
17
  style? : boolean,
18
18
  cursor? : boolean,
19
+ del? : boolean,
19
20
  erase? : boolean,
21
+ insert? : boolean,
20
22
  scroll? : boolean,
21
23
  terminal? : boolean,
22
24
  ): Features {
23
25
  if (
24
26
  style !== undefined &&
25
27
  cursor !== undefined &&
28
+ del !== undefined &&
26
29
  erase !== undefined &&
30
+ insert !== undefined &&
27
31
  scroll !== undefined &&
28
32
  terminal !== undefined
29
- )
30
- return {colorDepth: normalizeColorDepth(colorDepth), style, cursor, erase, scroll, terminal};
33
+ ) {
34
+ return {
35
+ colorDepth: normalizeColorDepth(colorDepth),
36
+ style,
37
+ cursor,
38
+ delete: del,
39
+ erase,
40
+ insert,
41
+ scroll,
42
+ terminal,
43
+ };
44
+ }
31
45
 
32
46
  const support = detectFeatureSupport(isTTY, colorDepth);
33
47
  return {
34
48
  colorDepth : normalizeColorDepth(colorDepth),
35
49
  style : style ?? support.style,
36
50
  cursor : cursor ?? support.cursor,
51
+ delete : del ?? support.delete,
37
52
  erase : erase ?? support.erase,
53
+ insert : insert ?? support.insert,
38
54
  scroll : scroll ?? support.scroll,
39
55
  terminal : terminal ?? support.terminal,
40
56
  };
@@ -29,7 +29,9 @@ export function detectFeatureSupport(
29
29
  return {
30
30
  style : colorDepth > 1,
31
31
  cursor : enabled,
32
+ delete : enabled,
32
33
  erase : enabled,
34
+ insert : enabled,
33
35
  scroll : enabled,
34
36
  terminal : enabled,
35
37
  };
@@ -23,15 +23,15 @@ export function getFeatures(...args: Args): Features {
23
23
  if (features instanceof Socket)
24
24
  return pipe();
25
25
 
26
- const {colorDepth, style, cursor, erase, scroll, terminal} = features;
26
+ const {colorDepth, style, cursor, delete: del, erase, insert, scroll, terminal} = features;
27
27
 
28
28
  stream ??= process.stdout;
29
29
 
30
30
  if (colorDepth)
31
- return build(stream.isTTY, colorDepth, style, cursor, erase, scroll, terminal);
31
+ return build(stream.isTTY, colorDepth, style, cursor, del, erase, insert, scroll, terminal);
32
32
 
33
33
  if (stream.isTTY)
34
- return build(true, getColorDepth(stream), style, cursor, erase, scroll, terminal);
34
+ return build(true, getColorDepth(stream), style, cursor, del, erase, insert, scroll, terminal);
35
35
 
36
- return build(false, getColorDepth(), style, cursor, erase, scroll, terminal);
36
+ return build(false, getColorDepth(), style, cursor, del, erase, insert, scroll, terminal);
37
37
  }
@@ -6,7 +6,9 @@ export interface Features {
6
6
  colorDepth : ColorDepth;
7
7
  style : boolean;
8
8
  cursor : boolean;
9
+ delete : boolean;
9
10
  erase : boolean;
11
+ insert : boolean;
10
12
  scroll : boolean;
11
13
  terminal : boolean;
12
14
  }
package/src/ins-del.ts ADDED
@@ -0,0 +1,58 @@
1
+ import {count, csi, noop} from "./utils";
2
+
3
+ const erase = {
4
+ char: count("X"),
5
+
6
+ line: {
7
+ toStart : csi("1K"),
8
+ toEnd : csi("0K"),
9
+ full : csi("2K"),
10
+ },
11
+ screen: {
12
+ toStart : csi("1J"),
13
+ toEnd : csi("0J"),
14
+ full : csi("2J"),
15
+ scrollback : csi("3J"),
16
+ },
17
+ };
18
+
19
+ const insert = {
20
+ char: count("@"),
21
+ line: count("L"),
22
+ };
23
+
24
+ const del = {
25
+ char: count("P"),
26
+ line: count("M"),
27
+ };
28
+
29
+ export type Erase = typeof erase;
30
+ export type Insert = typeof insert;
31
+ export type Delete = typeof del;
32
+
33
+ const disabledErase: Erase = {
34
+ char: noop,
35
+
36
+ line: {
37
+ toStart : "",
38
+ toEnd : "",
39
+ full : "",
40
+ },
41
+ screen: {
42
+ toStart : "",
43
+ toEnd : "",
44
+ full : "",
45
+ scrollback : "",
46
+ },
47
+ };
48
+
49
+ const disabledInsert: Insert = {
50
+ char: noop,
51
+ line: noop,
52
+ };
53
+
54
+ const disabledDelete: Delete = disabledInsert;
55
+
56
+ export const makeErase = (enabled = true): Erase => enabled ? erase : disabledErase;
57
+ export const makeInsert = (enabled = true): Insert => enabled ? insert : disabledInsert;
58
+ export const makeDelete = (enabled = true): Delete => enabled ? del : disabledDelete;
package/src/slice.ts CHANGED
@@ -43,6 +43,14 @@ export function skippedSequences(text: string, start: number, end?: number): str
43
43
  * printed. If you compose two or more slices together, there may be redundant SGR sequences at the
44
44
  * boundaries, but the result will be correct. You can use `simplify` to remove the redundancies.
45
45
  *
46
+ * Negative indices for `start` or `end` are interpreted as offsets from the end of the string,
47
+ * counting only visible characters. For example, `slice(text, -1)` returns a string containing only
48
+ * the last visible character of `text`, as well as any SGR codes from before and after that
49
+ * character.
50
+ *
51
+ * This function is analogous to `String.prototype.slice`. If the given string contains no ANSI
52
+ * sequences, the result will be the same as `text.slice(start, end)`.
53
+ *
46
54
  * Note the following caveats:
47
55
  *
48
56
  * * Any non-SGR ANSI codes prior to or after the slice will be ignored.
package/src/split-at.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import {scanCSI, skippedSequences} from "./slice";
2
+ import {visibleLength} from "./strip";
2
3
 
3
4
  import type {slice} from "./slice";
4
5
 
@@ -20,7 +21,7 @@ export function splitAt(
20
21
  return ["", text];
21
22
 
22
23
  if (visibleIndex < 0)
23
- throw new Error("visibleIndex must be non-negative");
24
+ visibleIndex = Math.max(0, visibleLength(text) + visibleIndex);
24
25
 
25
26
  if (visibleIndex > text.length)
26
27
  return [text, ""];
package/src/types.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type {Cursor} from "./cursor";
2
- import type {Erase} from "./erase";
2
+ import type {Delete, Erase, Insert} from "./ins-del";
3
3
  import type {Features} from "./features";
4
4
  import type {PadEnd, PadStart} from "./pad";
5
5
  import type {Scroll} from "./scroll";
@@ -12,7 +12,9 @@ import type {Terminal} from "./terminal";
12
12
 
13
13
  export type Ansi = SGR & {
14
14
  cursor : Cursor;
15
+ delete : Delete;
15
16
  erase : Erase;
17
+ insert : Insert;
16
18
  scroll : Scroll;
17
19
  terminal : Terminal;
18
20
 
@@ -1,17 +0,0 @@
1
- declare const erase: {
2
- line: {
3
- toStart: string;
4
- toEnd: string;
5
- full: string;
6
- };
7
- screen: {
8
- toStart: string;
9
- toEnd: string;
10
- full: string;
11
- scrollback: string;
12
- };
13
- };
14
- export type Erase = typeof erase;
15
- export declare const makeErase: (enabled?: boolean) => Erase;
16
- export {};
17
- //# sourceMappingURL=erase.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"erase.d.ts","sourceRoot":"","sources":["../../src/erase.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,KAAK;;;;;;;;;;;;CAYV,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC;AAgBjC,eAAO,MAAM,SAAS,GAAI,iBAAc,KAAG,KAAmC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"erase.js","sourceRoot":"","sources":["../../src/erase.ts"],"names":[],"mappings":";;;AAAA,mCAA4B;AAE5B,MAAM,KAAK,GAAG;IACb,IAAI,EAAE;QACL,OAAO,EAAG,IAAA,WAAG,EAAC,IAAI,CAAC;QACnB,KAAK,EAAK,IAAA,WAAG,EAAC,IAAI,CAAC;QACnB,IAAI,EAAM,IAAA,WAAG,EAAC,IAAI,CAAC;KACnB;IACD,MAAM,EAAE;QACP,OAAO,EAAM,IAAA,WAAG,EAAC,IAAI,CAAC;QACtB,KAAK,EAAQ,IAAA,WAAG,EAAC,IAAI,CAAC;QACtB,IAAI,EAAS,IAAA,WAAG,EAAC,IAAI,CAAC;QACtB,UAAU,EAAG,IAAA,WAAG,EAAC,IAAI,CAAC;KACtB;CACD,CAAC;AAIF,MAAM,QAAQ,GAAU;IACvB,IAAI,EAAE;QACL,OAAO,EAAG,EAAE;QACZ,KAAK,EAAK,EAAE;QACZ,IAAI,EAAM,EAAE;KACZ;IACD,MAAM,EAAE;QACP,OAAO,EAAM,EAAE;QACf,KAAK,EAAQ,EAAE;QACf,IAAI,EAAS,EAAE;QACf,UAAU,EAAG,EAAE;KACf;CACD,CAAC;AAEK,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,IAAI,EAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAAlE,QAAA,SAAS,aAAyD"}
@@ -1,17 +0,0 @@
1
- declare const erase: {
2
- line: {
3
- toStart: string;
4
- toEnd: string;
5
- full: string;
6
- };
7
- screen: {
8
- toStart: string;
9
- toEnd: string;
10
- full: string;
11
- scrollback: string;
12
- };
13
- };
14
- export type Erase = typeof erase;
15
- export declare const makeErase: (enabled?: boolean) => Erase;
16
- export {};
17
- //# sourceMappingURL=erase.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"erase.d.ts","sourceRoot":"","sources":["../../src/erase.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,KAAK;;;;;;;;;;;;CAYV,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC;AAgBjC,eAAO,MAAM,SAAS,GAAI,iBAAc,KAAG,KAAmC,CAAC"}
package/dist/esm/erase.js DELETED
@@ -1,29 +0,0 @@
1
- import { csi } from "./utils.js";
2
- const erase = {
3
- line: {
4
- toStart: csi("1K"),
5
- toEnd: csi("0K"),
6
- full: csi("2K"),
7
- },
8
- screen: {
9
- toStart: csi("1J"),
10
- toEnd: csi("0J"),
11
- full: csi("2J"),
12
- scrollback: csi("3J"),
13
- },
14
- };
15
- const disabled = {
16
- line: {
17
- toStart: "",
18
- toEnd: "",
19
- full: "",
20
- },
21
- screen: {
22
- toStart: "",
23
- toEnd: "",
24
- full: "",
25
- scrollback: "",
26
- },
27
- };
28
- export const makeErase = (enabled = true) => enabled ? erase : disabled;
29
- //# sourceMappingURL=erase.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"erase.js","sourceRoot":"","sources":["../../src/erase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,SAAS,CAAC;AAE5B,MAAM,KAAK,GAAG;IACb,IAAI,EAAE;QACL,OAAO,EAAG,GAAG,CAAC,IAAI,CAAC;QACnB,KAAK,EAAK,GAAG,CAAC,IAAI,CAAC;QACnB,IAAI,EAAM,GAAG,CAAC,IAAI,CAAC;KACnB;IACD,MAAM,EAAE;QACP,OAAO,EAAM,GAAG,CAAC,IAAI,CAAC;QACtB,KAAK,EAAQ,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,EAAS,GAAG,CAAC,IAAI,CAAC;QACtB,UAAU,EAAG,GAAG,CAAC,IAAI,CAAC;KACtB;CACD,CAAC;AAIF,MAAM,QAAQ,GAAU;IACvB,IAAI,EAAE;QACL,OAAO,EAAG,EAAE;QACZ,KAAK,EAAK,EAAE;QACZ,IAAI,EAAM,EAAE;KACZ;IACD,MAAM,EAAE;QACP,OAAO,EAAM,EAAE;QACf,KAAK,EAAQ,EAAE;QACf,IAAI,EAAS,EAAE;QACf,UAAU,EAAG,EAAE;KACf;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,IAAI,EAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC"}
package/src/erase.ts DELETED
@@ -1,33 +0,0 @@
1
- import {csi} from "./utils";
2
-
3
- const erase = {
4
- line: {
5
- toStart : csi("1K"),
6
- toEnd : csi("0K"),
7
- full : csi("2K"),
8
- },
9
- screen: {
10
- toStart : csi("1J"),
11
- toEnd : csi("0J"),
12
- full : csi("2J"),
13
- scrollback : csi("3J"),
14
- },
15
- };
16
-
17
- export type Erase = typeof erase;
18
-
19
- const disabled: Erase = {
20
- line: {
21
- toStart : "",
22
- toEnd : "",
23
- full : "",
24
- },
25
- screen: {
26
- toStart : "",
27
- toEnd : "",
28
- full : "",
29
- scrollback : "",
30
- },
31
- };
32
-
33
- export const makeErase = (enabled = true): Erase => enabled ? erase : disabled;