@elench/testkit 0.1.114 → 0.1.116

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 (212) hide show
  1. package/README.md +33 -8
  2. package/lib/cli/args.mjs +3 -3
  3. package/lib/cli/assistant/app.mjs +4 -2
  4. package/lib/cli/assistant/session.mjs +5 -1
  5. package/lib/cli/assistant/state.mjs +1 -2
  6. package/lib/cli/command-flags.mjs +4 -0
  7. package/lib/cli/commands/db/schema/refresh.mjs +21 -0
  8. package/lib/cli/commands/db/schema/verify.mjs +27 -0
  9. package/lib/cli/components/blocks/run-tree.mjs +7 -2
  10. package/lib/cli/components/hooks/use-element-layout.mjs +63 -0
  11. package/lib/cli/components/hooks/use-spinner-frame.mjs +26 -0
  12. package/lib/cli/entrypoint.mjs +1 -0
  13. package/lib/cli/operations/db/schema/refresh/operation.mjs +56 -0
  14. package/lib/cli/operations/db/{snapshot/capture → schema/verify}/operation.mjs +6 -27
  15. package/lib/cli/operations/run/operation.mjs +1 -0
  16. package/lib/cli/renderers/db-schema/text.mjs +7 -0
  17. package/lib/config/database.mjs +64 -0
  18. package/lib/config-api/index.d.ts +16 -1
  19. package/lib/config-api/index.mjs +31 -16
  20. package/lib/database/fingerprint.mjs +2 -0
  21. package/lib/database/index.mjs +142 -104
  22. package/lib/database/schema-source.mjs +295 -0
  23. package/lib/database/template-steps.mjs +158 -38
  24. package/lib/runner/orchestrator.mjs +4 -3
  25. package/lib/runner/template-steps.mjs +12 -1
  26. package/lib/runner/template.mjs +16 -1
  27. package/node_modules/@alcalzone/ansi-tokenize/README.md +0 -5
  28. package/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.d.ts +8 -0
  29. package/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.js +10 -8
  30. package/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.js.map +1 -1
  31. package/node_modules/@alcalzone/ansi-tokenize/build/tokenize.d.ts +1 -5
  32. package/node_modules/@alcalzone/ansi-tokenize/build/tokenize.js +9 -45
  33. package/node_modules/@alcalzone/ansi-tokenize/build/tokenize.js.map +1 -1
  34. package/node_modules/@alcalzone/ansi-tokenize/package.json +1 -1
  35. package/node_modules/@elench/next-analysis/package.json +1 -1
  36. package/node_modules/@elench/testkit-bridge/package.json +2 -2
  37. package/node_modules/@elench/testkit-protocol/package.json +1 -1
  38. package/node_modules/@elench/ts-analysis/package.json +1 -1
  39. package/node_modules/cli-boxes/index.d.ts +95 -90
  40. package/node_modules/cli-boxes/index.js +5 -2
  41. package/node_modules/cli-boxes/package.json +6 -13
  42. package/node_modules/cli-boxes/readme.md +15 -3
  43. package/node_modules/cli-truncate/index.d.ts +1 -1
  44. package/node_modules/cli-truncate/package.json +4 -4
  45. package/node_modules/cli-truncate/readme.md +1 -0
  46. package/node_modules/es-toolkit/CHANGELOG.md +801 -0
  47. package/node_modules/es-toolkit/src/compat/_internal/Equals.d.ts +1 -0
  48. package/node_modules/es-toolkit/src/compat/_internal/IsWritable.d.ts +3 -0
  49. package/node_modules/es-toolkit/src/compat/_internal/MutableList.d.ts +4 -0
  50. package/node_modules/es-toolkit/src/compat/_internal/RejectReadonly.d.ts +4 -0
  51. package/node_modules/esprima/ChangeLog +235 -0
  52. package/node_modules/ink/build/apply-styles.js +175 -0
  53. package/node_modules/ink/build/build-layout.js +77 -0
  54. package/node_modules/ink/build/calculate-wrapped-text.js +53 -0
  55. package/node_modules/ink/build/components/App.d.ts +1 -4
  56. package/node_modules/ink/build/components/App.js +22 -142
  57. package/node_modules/ink/build/components/App.js.map +1 -1
  58. package/node_modules/ink/build/components/AppContext.d.ts +3 -23
  59. package/node_modules/ink/build/components/AppContext.js +4 -7
  60. package/node_modules/ink/build/components/AppContext.js.map +1 -1
  61. package/node_modules/ink/build/components/Box.d.ts +3 -16
  62. package/node_modules/ink/build/components/Color.js +62 -0
  63. package/node_modules/ink/build/components/Cursor.d.ts +83 -0
  64. package/node_modules/ink/build/components/Cursor.js +53 -0
  65. package/node_modules/ink/build/components/Cursor.js.map +1 -0
  66. package/node_modules/ink/build/components/ErrorBoundary.d.ts +2 -2
  67. package/node_modules/ink/build/components/ErrorOverview.js +6 -6
  68. package/node_modules/ink/build/components/ErrorOverview.js.map +1 -1
  69. package/node_modules/ink/build/components/Static.js.map +1 -1
  70. package/node_modules/ink/build/components/StdinContext.d.ts +1 -7
  71. package/node_modules/ink/build/components/StdinContext.js +0 -1
  72. package/node_modules/ink/build/components/StdinContext.js.map +1 -1
  73. package/node_modules/ink/build/components/Text.d.ts +1 -1
  74. package/node_modules/ink/build/components/Text.js +1 -1
  75. package/node_modules/ink/build/components/Text.js.map +1 -1
  76. package/node_modules/ink/build/components/Transform.d.ts +1 -1
  77. package/node_modules/ink/build/devtools-window-polyfill.js +4 -7
  78. package/node_modules/ink/build/devtools-window-polyfill.js.map +1 -1
  79. package/node_modules/ink/build/devtools.js +6 -31
  80. package/node_modules/ink/build/devtools.js.map +1 -1
  81. package/node_modules/ink/build/dom.d.ts +1 -5
  82. package/node_modules/ink/build/dom.js +1 -20
  83. package/node_modules/ink/build/dom.js.map +1 -1
  84. package/node_modules/ink/build/experimental/apply-style.js +140 -0
  85. package/node_modules/ink/build/experimental/dom.js +123 -0
  86. package/node_modules/ink/build/experimental/output.js +91 -0
  87. package/node_modules/ink/build/experimental/reconciler.js +141 -0
  88. package/node_modules/ink/build/experimental/renderer.js +81 -0
  89. package/node_modules/ink/build/hooks/use-app.d.ts +1 -1
  90. package/node_modules/ink/build/hooks/use-app.js +1 -1
  91. package/node_modules/ink/build/hooks/use-cursor.d.ts +1 -1
  92. package/node_modules/ink/build/hooks/use-cursor.js +1 -1
  93. package/node_modules/ink/build/hooks/use-focus-manager.d.ts +2 -17
  94. package/node_modules/ink/build/hooks/use-focus-manager.js +1 -2
  95. package/node_modules/ink/build/hooks/use-focus-manager.js.map +1 -1
  96. package/node_modules/ink/build/hooks/use-focus.d.ts +1 -2
  97. package/node_modules/ink/build/hooks/use-focus.js +4 -5
  98. package/node_modules/ink/build/hooks/use-focus.js.map +1 -1
  99. package/node_modules/ink/build/hooks/use-input.d.ts +1 -2
  100. package/node_modules/ink/build/hooks/use-input.js +80 -82
  101. package/node_modules/ink/build/hooks/use-input.js.map +1 -1
  102. package/node_modules/ink/build/hooks/use-is-screen-reader-enabled.d.ts +1 -2
  103. package/node_modules/ink/build/hooks/use-is-screen-reader-enabled.js +1 -2
  104. package/node_modules/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -1
  105. package/node_modules/ink/build/hooks/use-stderr.d.ts +1 -1
  106. package/node_modules/ink/build/hooks/use-stderr.js +1 -1
  107. package/node_modules/ink/build/hooks/use-stdin.d.ts +2 -4
  108. package/node_modules/ink/build/hooks/use-stdin.js +1 -2
  109. package/node_modules/ink/build/hooks/use-stdin.js.map +1 -1
  110. package/node_modules/ink/build/hooks/use-stdout.d.ts +1 -1
  111. package/node_modules/ink/build/hooks/use-stdout.js +1 -1
  112. package/node_modules/ink/build/hooks/useInput.js +38 -0
  113. package/node_modules/ink/build/index.d.ts +1 -8
  114. package/node_modules/ink/build/index.js +0 -4
  115. package/node_modules/ink/build/index.js.map +1 -1
  116. package/node_modules/ink/build/ink.d.ts +3 -48
  117. package/node_modules/ink/build/ink.js +155 -325
  118. package/node_modules/ink/build/ink.js.map +1 -1
  119. package/node_modules/ink/build/input-parser.d.ts +1 -4
  120. package/node_modules/ink/build/input-parser.js +30 -70
  121. package/node_modules/ink/build/input-parser.js.map +1 -1
  122. package/node_modules/ink/build/instance.js +205 -0
  123. package/node_modules/ink/build/layout.d.ts +7 -0
  124. package/node_modules/ink/build/layout.js +33 -0
  125. package/node_modules/ink/build/layout.js.map +1 -0
  126. package/node_modules/ink/build/log-update.d.ts +0 -1
  127. package/node_modules/ink/build/log-update.js +1 -13
  128. package/node_modules/ink/build/log-update.js.map +1 -1
  129. package/node_modules/ink/build/measure-element.d.ts +0 -4
  130. package/node_modules/ink/build/measure-element.js +0 -4
  131. package/node_modules/ink/build/measure-element.js.map +1 -1
  132. package/node_modules/ink/build/options.d.ts +52 -0
  133. package/node_modules/ink/build/options.js +2 -0
  134. package/node_modules/ink/build/options.js.map +1 -0
  135. package/node_modules/ink/build/output.js +0 -25
  136. package/node_modules/ink/build/output.js.map +1 -1
  137. package/node_modules/ink/build/parse-keypress.d.ts +3 -1
  138. package/node_modules/ink/build/parse-keypress.js +17 -19
  139. package/node_modules/ink/build/parse-keypress.js.map +1 -1
  140. package/node_modules/ink/build/reconciler.js +27 -46
  141. package/node_modules/ink/build/reconciler.js.map +1 -1
  142. package/node_modules/ink/build/render-border.js +18 -29
  143. package/node_modules/ink/build/render-border.js.map +1 -1
  144. package/node_modules/ink/build/render-to-string.js +1 -2
  145. package/node_modules/ink/build/render-to-string.js.map +1 -1
  146. package/node_modules/ink/build/render.d.ts +2 -57
  147. package/node_modules/ink/build/render.js +11 -18
  148. package/node_modules/ink/build/render.js.map +1 -1
  149. package/node_modules/ink/build/screen-reader-update.d.ts +13 -0
  150. package/node_modules/ink/build/screen-reader-update.js +38 -0
  151. package/node_modules/ink/build/screen-reader-update.js.map +1 -0
  152. package/node_modules/ink/build/styles.d.ts +16 -78
  153. package/node_modules/ink/build/styles.js +31 -102
  154. package/node_modules/ink/build/styles.js.map +1 -1
  155. package/node_modules/ink/build/utils.d.ts +2 -9
  156. package/node_modules/ink/build/utils.js +3 -18
  157. package/node_modules/ink/build/utils.js.map +1 -1
  158. package/node_modules/ink/build/wrap-text.js +0 -7
  159. package/node_modules/ink/build/wrap-text.js.map +1 -1
  160. package/node_modules/ink/build/write-synchronized.d.ts +1 -1
  161. package/node_modules/ink/build/write-synchronized.js +2 -4
  162. package/node_modules/ink/build/write-synchronized.js.map +1 -1
  163. package/node_modules/ink/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
  164. package/node_modules/ink/node_modules/emoji-regex/README.md +107 -0
  165. package/node_modules/ink/node_modules/emoji-regex/index.d.ts +3 -0
  166. package/node_modules/ink/node_modules/emoji-regex/index.js +4 -0
  167. package/node_modules/ink/node_modules/emoji-regex/index.mjs +4 -0
  168. package/node_modules/ink/node_modules/emoji-regex/package.json +45 -0
  169. package/node_modules/{wrap-ansi → ink/node_modules/wrap-ansi}/index.d.ts +1 -1
  170. package/node_modules/ink/node_modules/wrap-ansi/index.js +222 -0
  171. package/node_modules/ink/node_modules/wrap-ansi/node_modules/string-width/index.d.ts +39 -0
  172. package/node_modules/ink/node_modules/wrap-ansi/node_modules/string-width/index.js +82 -0
  173. package/node_modules/ink/node_modules/wrap-ansi/node_modules/string-width/license +9 -0
  174. package/node_modules/ink/node_modules/wrap-ansi/node_modules/string-width/package.json +64 -0
  175. package/node_modules/ink/node_modules/wrap-ansi/node_modules/string-width/readme.md +66 -0
  176. package/node_modules/{wrap-ansi → ink/node_modules/wrap-ansi}/package.json +11 -11
  177. package/node_modules/{wrap-ansi → ink/node_modules/wrap-ansi}/readme.md +0 -2
  178. package/node_modules/ink/package.json +98 -34
  179. package/node_modules/ink/readme.md +48 -554
  180. package/node_modules/slice-ansi/index.d.ts +1 -1
  181. package/node_modules/slice-ansi/index.js +89 -146
  182. package/node_modules/slice-ansi/package.json +5 -5
  183. package/node_modules/slice-ansi/readme.md +0 -1
  184. package/node_modules/slice-ansi/tokenize-ansi.js +1 -1
  185. package/package.json +14 -10
  186. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.d.ts +188 -0
  187. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.d.ts.map +1 -0
  188. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.js +293 -0
  189. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.js.map +1 -0
  190. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/package.json +25 -0
  191. package/lib/cli/commands/db/snapshot/capture.mjs +0 -26
  192. package/lib/cli/renderers/db-snapshot-capture/text.mjs +0 -3
  193. package/node_modules/@alcalzone/ansi-tokenize/build/consts.d.ts +0 -17
  194. package/node_modules/@alcalzone/ansi-tokenize/build/consts.js +0 -28
  195. package/node_modules/@alcalzone/ansi-tokenize/build/consts.js.map +0 -1
  196. package/node_modules/ink/build/components/AnimationContext.d.ts +0 -9
  197. package/node_modules/ink/build/components/AnimationContext.js +0 -13
  198. package/node_modules/ink/build/components/AnimationContext.js.map +0 -1
  199. package/node_modules/ink/build/hooks/use-animation.d.ts +0 -49
  200. package/node_modules/ink/build/hooks/use-animation.js +0 -87
  201. package/node_modules/ink/build/hooks/use-animation.js.map +0 -1
  202. package/node_modules/ink/build/hooks/use-box-metrics.d.ts +0 -59
  203. package/node_modules/ink/build/hooks/use-box-metrics.js +0 -88
  204. package/node_modules/ink/build/hooks/use-box-metrics.js.map +0 -1
  205. package/node_modules/ink/build/hooks/use-paste.d.ts +0 -35
  206. package/node_modules/ink/build/hooks/use-paste.js +0 -62
  207. package/node_modules/ink/build/hooks/use-paste.js.map +0 -1
  208. package/node_modules/ink/build/hooks/use-window-size.d.ts +0 -18
  209. package/node_modules/ink/build/hooks/use-window-size.js +0 -22
  210. package/node_modules/ink/build/hooks/use-window-size.js.map +0 -1
  211. package/node_modules/wrap-ansi/index.js +0 -468
  212. /package/node_modules/{wrap-ansi → ink/node_modules/wrap-ansi}/license +0 -0
@@ -3,7 +3,7 @@ Slice a string with [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escap
3
3
 
4
4
  @param string - A string with ANSI escape codes. Like one styled by [`chalk`](https://github.com/chalk/chalk).
5
5
  @param startSlice - Zero-based visible-column index at which to start the slice. Grapheme clusters are kept intact.
6
- @param endSlice - Zero-based visible-column index at which to end the slice. If a full grapheme cluster would cross `endSlice`, it is excluded.
6
+ @param endSlice - Zero-based visible-column index at which to end the slice.
7
7
 
8
8
  @example
9
9
  ```
@@ -29,7 +29,7 @@ function applySgrFragments(activeStyles, fragments) {
29
29
  }
30
30
 
31
31
  function undoAnsiCodes(activeStyles) {
32
- return [...activeStyles.keys()].toReversed().join('');
32
+ return [...activeStyles.keys()].reverse().join('');
33
33
  }
34
34
 
35
35
  function closeHyperlink(hyperlinkToken) {
@@ -59,130 +59,106 @@ function shouldIncludeSgrAfterEnd(token, activeStyles) {
59
59
  return hasClosingEffect && !hasStartFragment;
60
60
  }
61
61
 
62
- function hasSgrStartFragment(token) {
63
- return token.fragments.some(fragment => fragment.type === 'start');
64
- }
65
-
66
- function discardPendingHyperlink(parameters) {
67
- if (
68
- parameters.activeHyperlink
69
- && !parameters.activeHyperlinkHasVisibleText
70
- && parameters.activeHyperlinkOutputIndex !== undefined
71
- ) {
72
- const openCodeLength = parameters.activeHyperlink.code.length;
73
- parameters.returnValue = parameters.returnValue.slice(0, parameters.activeHyperlinkOutputIndex) + parameters.returnValue.slice(parameters.activeHyperlinkOutputIndex + openCodeLength);
74
-
75
- if (
76
- parameters.pendingSgrOutputIndex !== undefined
77
- && parameters.pendingSgrOutputIndex > parameters.activeHyperlinkOutputIndex
78
- ) {
79
- parameters.pendingSgrOutputIndex -= openCodeLength;
80
- }
81
- }
82
-
83
- parameters.activeHyperlink = undefined;
84
- parameters.activeHyperlinkHasVisibleText = false;
85
- parameters.activeHyperlinkOutputIndex = undefined;
86
- }
87
-
88
- function applySgrToken(parameters) {
89
- if (
90
- parameters.isPastEnd
91
- && !shouldIncludeSgrAfterEnd(parameters.token, parameters.activeStyles)
92
- ) {
93
- return parameters;
94
- }
95
-
96
- if (
97
- parameters.include
98
- && hasSgrStartFragment(parameters.token)
99
- && parameters.pendingSgrOutputIndex === undefined
100
- ) {
101
- parameters.pendingSgrOutputIndex = parameters.returnValue.length;
102
- parameters.pendingSgrActiveStyles = new Map(parameters.activeStyles);
62
+ function applySgrToken({token, isPastEnd, activeStyles, returnValue, include, activeHyperlink, position}) {
63
+ if (isPastEnd && !shouldIncludeSgrAfterEnd(token, activeStyles)) {
64
+ return {
65
+ activeStyles,
66
+ activeHyperlink,
67
+ position,
68
+ returnValue,
69
+ include,
70
+ };
103
71
  }
104
72
 
105
- parameters.activeStyles = applySgrFragments(parameters.activeStyles, parameters.token.fragments);
106
- if (parameters.include) {
107
- parameters.returnValue += parameters.token.code;
73
+ activeStyles = applySgrFragments(activeStyles, token.fragments);
74
+ if (include) {
75
+ returnValue += token.code;
108
76
  }
109
77
 
110
- return parameters;
78
+ return {
79
+ activeStyles,
80
+ activeHyperlink,
81
+ position,
82
+ returnValue,
83
+ include,
84
+ };
111
85
  }
112
86
 
113
- function applyHyperlinkToken(parameters) {
87
+ function applyHyperlinkToken({token, isPastEnd, activeStyles, activeHyperlink, position, returnValue, include}) {
114
88
  if (
115
- parameters.isPastEnd
89
+ isPastEnd
116
90
  && (
117
- parameters.token.action !== 'close'
118
- || !parameters.activeHyperlink
91
+ token.action !== 'close'
92
+ || !activeHyperlink
119
93
  )
120
94
  ) {
121
- return parameters;
95
+ return {
96
+ activeStyles,
97
+ activeHyperlink,
98
+ position,
99
+ returnValue,
100
+ include,
101
+ };
122
102
  }
123
103
 
124
- if (parameters.token.action === 'open') {
125
- parameters.activeHyperlink = parameters.token;
126
- parameters.activeHyperlinkHasVisibleText = false;
127
- parameters.activeHyperlinkOutputIndex = undefined;
128
- if (parameters.include) {
129
- parameters.activeHyperlinkOutputIndex = parameters.returnValue.length;
130
- }
131
- } else if (parameters.token.action === 'close') {
132
- if (
133
- parameters.include
134
- && parameters.activeHyperlink
135
- && !parameters.activeHyperlinkHasVisibleText
136
- ) {
137
- discardPendingHyperlink(parameters);
138
- return parameters;
139
- }
140
-
141
- parameters.activeHyperlink = undefined;
142
- parameters.activeHyperlinkHasVisibleText = false;
143
- parameters.activeHyperlinkOutputIndex = undefined;
104
+ if (token.action === 'open') {
105
+ activeHyperlink = token;
106
+ } else if (token.action === 'close') {
107
+ activeHyperlink = undefined;
144
108
  }
145
109
 
146
- if (parameters.include) {
147
- parameters.returnValue += parameters.token.code;
110
+ if (include) {
111
+ returnValue += token.code;
148
112
  }
149
113
 
150
- return parameters;
114
+ return {
115
+ activeStyles,
116
+ activeHyperlink,
117
+ position,
118
+ returnValue,
119
+ include,
120
+ };
151
121
  }
152
122
 
153
- function applyControlToken(parameters) {
154
- if (!parameters.isPastEnd && parameters.include) {
155
- parameters.returnValue += parameters.token.code;
123
+ function applyControlToken({token, isPastEnd, activeStyles, activeHyperlink, position, returnValue, include}) {
124
+ if (!isPastEnd && include) {
125
+ returnValue += token.code;
156
126
  }
157
127
 
158
- return parameters;
128
+ return {
129
+ activeStyles,
130
+ activeHyperlink,
131
+ position,
132
+ returnValue,
133
+ include,
134
+ };
159
135
  }
160
136
 
161
- function applyCharacterToken(parameters) {
137
+ function applyCharacterToken({token, start, activeStyles, activeHyperlink, position, returnValue, include}) {
162
138
  if (
163
- !parameters.include
164
- && parameters.position >= parameters.start
165
- && !parameters.token.isGraphemeContinuation
139
+ !include
140
+ && position >= start
141
+ && !token.isGraphemeContinuation
166
142
  ) {
167
- parameters.include = true;
168
- parameters.returnValue = [...parameters.activeStyles.values()].join('');
169
- if (parameters.activeHyperlink) {
170
- parameters.activeHyperlinkOutputIndex = parameters.returnValue.length;
171
- parameters.returnValue += parameters.activeHyperlink.code;
143
+ include = true;
144
+ returnValue = [...activeStyles.values()].join('');
145
+ if (activeHyperlink) {
146
+ returnValue += activeHyperlink.code;
172
147
  }
173
148
  }
174
149
 
175
- if (parameters.include) {
176
- parameters.returnValue += parameters.token.value;
177
- parameters.pendingSgrOutputIndex = undefined;
178
- parameters.pendingSgrActiveStyles = undefined;
179
- if (parameters.activeHyperlink) {
180
- parameters.activeHyperlinkHasVisibleText = true;
181
- }
150
+ if (include) {
151
+ returnValue += token.value;
182
152
  }
183
153
 
184
- parameters.position += parameters.token.visibleWidth;
185
- return parameters;
154
+ position += token.visibleWidth;
155
+ return {
156
+ activeStyles,
157
+ activeHyperlink,
158
+ position,
159
+ returnValue,
160
+ include,
161
+ };
186
162
  }
187
163
 
188
164
  const tokenHandlers = {
@@ -195,7 +171,21 @@ const tokenHandlers = {
195
171
  function applyToken(parameters) {
196
172
  const tokenHandler = tokenHandlers[parameters.token.type];
197
173
  if (!tokenHandler) {
198
- return parameters;
174
+ const {
175
+ activeStyles,
176
+ activeHyperlink,
177
+ position,
178
+ returnValue,
179
+ include,
180
+ } = parameters;
181
+
182
+ return {
183
+ activeStyles,
184
+ activeHyperlink,
185
+ position,
186
+ returnValue,
187
+ include,
188
+ };
199
189
  }
200
190
 
201
191
  return tokenHandler(parameters);
@@ -216,35 +206,17 @@ function createHasContinuationAheadMap(tokens) {
216
206
  return hasContinuationAhead;
217
207
  }
218
208
 
219
- function isPastEndBoundary(token, position, end) {
220
- if (end === undefined) {
221
- return false;
222
- }
223
-
224
- if (position >= end) {
225
- return true;
226
- }
227
-
228
- return token.type === 'character'
229
- && !token.isGraphemeContinuation
230
- && position + token.visibleWidth > end;
231
- }
232
-
233
209
  export default function sliceAnsi(string, start, end) {
234
210
  const tokens = tokenizeAnsi(string, {endCharacter: end});
235
211
  const hasContinuationAhead = createHasContinuationAheadMap(tokens);
236
212
  let activeStyles = new Map();
237
213
  let activeHyperlink;
238
- let activeHyperlinkHasVisibleText = false;
239
- let activeHyperlinkOutputIndex;
240
- let pendingSgrOutputIndex;
241
- let pendingSgrActiveStyles;
242
214
  let position = 0;
243
215
  let returnValue = '';
244
216
  let include = false;
245
217
 
246
218
  for (const [tokenIndex, token] of tokens.entries()) {
247
- let isPastEnd = isPastEndBoundary(token, position, end);
219
+ let isPastEnd = end !== undefined && position >= end;
248
220
  if (
249
221
  isPastEnd
250
222
  && token.type !== 'character'
@@ -258,44 +230,15 @@ export default function sliceAnsi(string, start, end) {
258
230
  && token.type === 'character'
259
231
  && !token.isGraphemeContinuation
260
232
  ) {
261
- if (activeHyperlink && !activeHyperlinkHasVisibleText) {
262
- const hyperlinkState = {
263
- activeHyperlink,
264
- activeHyperlinkHasVisibleText,
265
- activeHyperlinkOutputIndex,
266
- pendingSgrOutputIndex,
267
- returnValue,
268
- };
269
- discardPendingHyperlink(hyperlinkState);
270
- ({
271
- activeHyperlink,
272
- activeHyperlinkHasVisibleText,
273
- activeHyperlinkOutputIndex,
274
- pendingSgrOutputIndex,
275
- returnValue,
276
- } = hyperlinkState);
277
- }
278
-
279
- if (pendingSgrOutputIndex !== undefined) {
280
- returnValue = returnValue.slice(0, pendingSgrOutputIndex);
281
- activeStyles = pendingSgrActiveStyles;
282
- pendingSgrOutputIndex = undefined;
283
- pendingSgrActiveStyles = undefined;
284
- }
285
-
286
233
  break;
287
234
  }
288
235
 
289
- ({activeStyles, activeHyperlink, activeHyperlinkHasVisibleText, activeHyperlinkOutputIndex, pendingSgrOutputIndex, pendingSgrActiveStyles, position, returnValue, include} = applyToken({
236
+ ({activeStyles, activeHyperlink, position, returnValue, include} = applyToken({
290
237
  token,
291
238
  isPastEnd,
292
239
  start,
293
240
  activeStyles,
294
241
  activeHyperlink,
295
- activeHyperlinkHasVisibleText,
296
- activeHyperlinkOutputIndex,
297
- pendingSgrOutputIndex,
298
- pendingSgrActiveStyles,
299
242
  position,
300
243
  returnValue,
301
244
  include,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slice-ansi",
3
- "version": "9.0.0",
3
+ "version": "8.0.0",
4
4
  "description": "Slice a string with ANSI escape codes",
5
5
  "license": "MIT",
6
6
  "repository": "chalk/slice-ansi",
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "sideEffects": false,
14
14
  "engines": {
15
- "node": ">=22"
15
+ "node": ">=20"
16
16
  },
17
17
  "scripts": {
18
18
  "test": "xo && ava && tsc --lib esnext index.d.ts"
@@ -50,10 +50,10 @@
50
50
  "is-fullwidth-code-point": "^5.1.0"
51
51
  },
52
52
  "devDependencies": {
53
- "ava": "^7.0.0",
53
+ "ava": "^6.4.1",
54
54
  "chalk": "^5.6.2",
55
55
  "random-item": "^4.0.1",
56
- "strip-ansi": "^7.2.0",
57
- "xo": "^2.0.2"
56
+ "strip-ansi": "^7.1.2",
57
+ "xo": "^1.2.3"
58
58
  }
59
59
  }
@@ -41,7 +41,6 @@ Zero-based visible-column index at which to start the slice. Grapheme clusters (
41
41
  Type: `number`
42
42
 
43
43
  Zero-based visible-column index at which to end the slice.
44
- If a full grapheme cluster would cross `endSlice`, it is excluded.
45
44
 
46
45
  ## Related
47
46
 
@@ -64,7 +64,7 @@ const SGR_ANSI_256_LAST_PARAMETER_OFFSET = 2;
64
64
  const SGR_TRUECOLOR_LAST_PARAMETER_OFFSET = 4;
65
65
  const VARIATION_SELECTOR_16_CODE_POINT = 65_039;
66
66
  const COMBINING_ENCLOSING_KEYCAP_CODE_POINT = 8419;
67
- const EMOJI_PRESENTATION_GRAPHEME_REGEX = /\p{Emoji_Presentation}/v;
67
+ const EMOJI_PRESENTATION_GRAPHEME_REGEX = /\p{Emoji_Presentation}/u;
68
68
  const GRAPHEME_SEGMENTER = new Intl.Segmenter(undefined, {granularity: 'grapheme'});
69
69
 
70
70
  const endCodeNumbers = new Set();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elench/testkit",
3
- "version": "0.1.114",
3
+ "version": "0.1.116",
4
4
  "description": "Assistant-first CLI for running, inspecting, and debugging local testkit suites",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -61,7 +61,11 @@
61
61
  "typecheck:packages": "npm --workspace packages/testkit-protocol run typecheck && npm --workspace packages/ts-analysis run typecheck && npm --workspace packages/next-analysis run typecheck && npm --workspace packages/testkit-bridge run typecheck && npm --workspace packages/testkit-extension run compile",
62
62
  "test": "npm run build:assistant && npm run build:packages && vitest run && npm run test:live",
63
63
  "test:audit": "node scripts/test-boundary-audit.mjs",
64
+ "test:compat:node20": "volta run --node 20.19.5 --npm 10.8.2 npm test",
65
+ "test:database-version:compat": "node scripts/test-database-version-compat.mjs",
66
+ "test:engine-version:compat": "node scripts/test-engine-version-compat.mjs",
64
67
  "test:live": "node scripts/live-sandbox/harness.mjs",
68
+ "test:live:neon": "node scripts/test-database-version-compat.mjs --neon-only",
65
69
  "test:unit": "npm run build:assistant && npm run build:packages && npm run test:audit && vitest run --config vitest.unit.config.mjs",
66
70
  "test:integration": "npm run build:assistant && npm run build:packages && vitest run test/integration",
67
71
  "test:system": "npm run build:assistant && npm run build:packages && vitest run test/system"
@@ -85,21 +89,21 @@
85
89
  "typescript"
86
90
  ],
87
91
  "devDependencies": {
88
- "@types/node": "^24.9.1",
92
+ "@types/node": "^20.19.41",
89
93
  "vitest": "^3.2.4"
90
94
  },
91
95
  "dependencies": {
92
96
  "@babel/code-frame": "^7.29.0",
93
- "@elench/next-analysis": "0.1.114",
94
- "@elench/testkit-bridge": "0.1.114",
95
- "@elench/testkit-protocol": "0.1.114",
96
- "@elench/ts-analysis": "0.1.114",
97
+ "@elench/next-analysis": "0.1.116",
98
+ "@elench/testkit-bridge": "0.1.116",
99
+ "@elench/testkit-protocol": "0.1.116",
100
+ "@elench/ts-analysis": "0.1.116",
97
101
  "@oclif/core": "^4.10.6",
98
102
  "@playwright/test": "^1.52.0",
99
103
  "esbuild": "^0.25.11",
100
- "execa": "^9.5.0",
104
+ "execa": "9.1.0",
101
105
  "figures": "^6.1.0",
102
- "ink": "7.0.1",
106
+ "ink": "6.8.0",
103
107
  "marked": "9.1.6",
104
108
  "marked-terminal": "6.2.0",
105
109
  "picocolors": "^1.1.1",
@@ -111,8 +115,8 @@
111
115
  "wrap-ansi": "^10.0.0"
112
116
  },
113
117
  "engines": {
114
- "node": ">=24.14.1",
115
- "npm": ">=11.11.0"
118
+ "node": ">=20",
119
+ "npm": ">=10"
116
120
  },
117
121
  "volta": {
118
122
  "node": "24.14.1",
@@ -0,0 +1,188 @@
1
+ export declare const TESTKIT_BROWSER_PROTOCOL_VERSION = 1;
2
+ export declare const TESTKIT_COVERAGE_GRAPH_VERSION = 1;
3
+ export type BrowserTargetKind = "testId" | "role" | "text" | "css" | "xpath" | "component";
4
+ export type BrowserConfidence = "low" | "medium" | "high";
5
+ export type BrowserFailureState = "failing" | "healthy" | "unavailable";
6
+ export type BrowserCoverageState = "covered" | "missing" | "unavailable";
7
+ export type BridgeSurfaceImportance = "critical" | "high" | "medium" | "low";
8
+ export type BridgeCoverageSupportKind = "direct" | "indirect" | "mixed";
9
+ export type CoverageNodeKind = "page_view" | "ui_surface" | "ui_action" | "client_request" | "api_route" | "server_action" | "server_capability" | "data_capability" | "test_file";
10
+ export type CoverageEdgeKind = "contains" | "renders" | "triggers" | "requests" | "handles" | "delegates_to" | "covers";
11
+ export type CoverageEvidenceSource = "convention" | "static" | "runtime";
12
+ export type CoverageGraphDiagnosticLevel = "info" | "warn";
13
+ export interface BrowserTarget {
14
+ kind: BrowserTargetKind;
15
+ value: string;
16
+ label?: string;
17
+ confidence?: BrowserConfidence;
18
+ }
19
+ export interface BrowserMetadata {
20
+ label?: string;
21
+ origins?: string[];
22
+ routes?: string[];
23
+ targets?: BrowserTarget[];
24
+ }
25
+ export interface BrowserMetadataDocument {
26
+ schemaVersion: number;
27
+ browser: BrowserMetadata;
28
+ }
29
+ export interface CoverageGraphNode {
30
+ id: string;
31
+ kind: CoverageNodeKind;
32
+ service: string;
33
+ label: string;
34
+ filePath?: string;
35
+ route?: string;
36
+ method?: string;
37
+ path?: string;
38
+ target?: BrowserTarget | null;
39
+ metadata?: Record<string, string | number | boolean | null>;
40
+ }
41
+ export interface CoverageGraphEdge {
42
+ id: string;
43
+ kind: CoverageEdgeKind;
44
+ from: string;
45
+ to: string;
46
+ confidence?: BrowserConfidence;
47
+ metadata?: Record<string, string | number | boolean | null>;
48
+ }
49
+ export interface CoverageEvidenceDetails {
50
+ requestPaths?: string[];
51
+ route?: string;
52
+ targets?: BrowserTarget[];
53
+ }
54
+ export interface CoverageEvidence {
55
+ id: string;
56
+ source: CoverageEvidenceSource;
57
+ confidence?: BrowserConfidence;
58
+ service: string;
59
+ suiteName: string;
60
+ type: string;
61
+ testFilePath: string;
62
+ coveredNodeIds: string[];
63
+ details?: CoverageEvidenceDetails;
64
+ }
65
+ export interface CoverageGraphDiagnostic {
66
+ level: CoverageGraphDiagnosticLevel;
67
+ code: string;
68
+ filePath: string;
69
+ service: string;
70
+ message: string;
71
+ }
72
+ export interface CoverageGraph {
73
+ schemaVersion: number;
74
+ nodes: CoverageGraphNode[];
75
+ edges: CoverageGraphEdge[];
76
+ evidence: CoverageEvidence[];
77
+ diagnostics: CoverageGraphDiagnostic[];
78
+ }
79
+ export interface BridgeProductRef {
80
+ name: string;
81
+ directory: string;
82
+ }
83
+ export interface BridgeServiceRef {
84
+ name: string;
85
+ baseUrl: string;
86
+ origin: string;
87
+ }
88
+ export interface BrowserMatchResponse {
89
+ protocolVersion: number;
90
+ url: string;
91
+ origin: string;
92
+ route: string;
93
+ matched: boolean;
94
+ product: BridgeProductRef;
95
+ service: BridgeServiceRef | null;
96
+ }
97
+ export interface BridgeRunSummary {
98
+ artifactAvailable: boolean;
99
+ generatedAt: string | null;
100
+ status: string | null;
101
+ }
102
+ export interface BridgeSupportingTestRef {
103
+ service: string;
104
+ suite: string;
105
+ type: string;
106
+ filePath: string;
107
+ label: string;
108
+ status?: "passed" | "failed" | "skipped" | "not_run";
109
+ error?: string | null;
110
+ }
111
+ export interface BridgeCoverageViaNodeRef {
112
+ id: string;
113
+ kind: CoverageNodeKind;
114
+ label: string;
115
+ route?: string;
116
+ method?: string;
117
+ path?: string;
118
+ }
119
+ export interface FailureOverlayEntry {
120
+ id: string;
121
+ kind: CoverageNodeKind;
122
+ label: string;
123
+ service: string;
124
+ route?: string | null;
125
+ targets: BrowserTarget[];
126
+ failedTests: BridgeSupportingTestRef[];
127
+ viaNodes: BridgeCoverageViaNodeRef[];
128
+ importance?: BridgeSurfaceImportance;
129
+ surfaceKind?: string | null;
130
+ reason?: string | null;
131
+ }
132
+ export interface CoverageOverlayEntry {
133
+ id: string;
134
+ kind: CoverageNodeKind;
135
+ label: string;
136
+ service: string;
137
+ route?: string | null;
138
+ targets: BrowserTarget[];
139
+ supportingTests: BridgeSupportingTestRef[];
140
+ viaNodes: BridgeCoverageViaNodeRef[];
141
+ confidence: BrowserConfidence;
142
+ importance?: BridgeSurfaceImportance;
143
+ surfaceKind?: string | null;
144
+ supportKind?: BridgeCoverageSupportKind;
145
+ reason?: string | null;
146
+ }
147
+ export interface PageOverlayResponse {
148
+ protocolVersion: number;
149
+ page: {
150
+ url: string;
151
+ origin: string;
152
+ route: string;
153
+ };
154
+ match: BrowserMatchResponse;
155
+ run: BridgeRunSummary;
156
+ summary: {
157
+ failureState: BrowserFailureState;
158
+ coverageState: BrowserCoverageState;
159
+ relatedFailureCount: number;
160
+ relatedCoverageCount: number;
161
+ coverageBreakdown?: {
162
+ direct: number;
163
+ indirect: number;
164
+ mixed: number;
165
+ };
166
+ };
167
+ failures: FailureOverlayEntry[];
168
+ coverage: CoverageOverlayEntry[];
169
+ }
170
+ export interface BridgeErrorResponse {
171
+ protocolVersion: number;
172
+ error: {
173
+ code: string;
174
+ message: string;
175
+ };
176
+ }
177
+ export declare function normalizeBrowserTarget(value: unknown): BrowserTarget | null;
178
+ export declare function normalizeBrowserMetadata(value: unknown): BrowserMetadata | null;
179
+ export declare function normalizeBrowserMetadataDocument(value: unknown): BrowserMetadataDocument | null;
180
+ export declare function normalizeCoverageGraphNode(value: unknown): CoverageGraphNode | null;
181
+ export declare function normalizeCoverageGraphEdge(value: unknown): CoverageGraphEdge | null;
182
+ export declare function normalizeCoverageEvidence(value: unknown): CoverageEvidence | null;
183
+ export declare function normalizeCoverageGraphDiagnostic(value: unknown): CoverageGraphDiagnostic | null;
184
+ export declare function normalizeCoverageGraph(value: unknown): CoverageGraph | null;
185
+ export declare function isPageOverlayResponse(value: unknown): value is PageOverlayResponse;
186
+ export declare function normalizePageOverlayResponse(value: unknown): PageOverlayResponse | null;
187
+ export declare function createBridgeErrorResponse(code: string, message: string): BridgeErrorResponse;
188
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}