appium-session-recorder 0.0.2 → 0.0.4

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 (73) hide show
  1. package/dist/index.js +33319 -0
  2. package/dist/ui/assets/index-CnJwu_Mc.js +8 -0
  3. package/dist/ui/assets/index-VIFL67d5.css +1 -0
  4. package/{src → dist}/ui/index.html +2 -1
  5. package/package.json +20 -13
  6. package/bun.lock +0 -731
  7. package/src/cli/arg-parser.ts +0 -311
  8. package/src/cli/commands/drive.ts +0 -147
  9. package/src/cli/commands/index.ts +0 -54
  10. package/src/cli/commands/proxy.ts +0 -41
  11. package/src/cli/commands/screen.ts +0 -73
  12. package/src/cli/commands/selectors.ts +0 -42
  13. package/src/cli/commands/session.ts +0 -64
  14. package/src/cli/commands/types.ts +0 -11
  15. package/src/cli/index.ts +0 -158
  16. package/src/cli/prompts.ts +0 -64
  17. package/src/cli/response.ts +0 -44
  18. package/src/core/appium/client.ts +0 -248
  19. package/src/core/index.ts +0 -5
  20. package/src/core/selectors/generate-candidates.ts +0 -155
  21. package/src/core/selectors/score-candidates.ts +0 -184
  22. package/src/core/types.ts +0 -79
  23. package/src/core/xml/parse-source.ts +0 -197
  24. package/src/index.ts +0 -7
  25. package/src/server/appium-client.ts +0 -24
  26. package/src/server/index.ts +0 -6
  27. package/src/server/interaction-recorder.ts +0 -74
  28. package/src/server/proxy-middleware.ts +0 -68
  29. package/src/server/routes.ts +0 -64
  30. package/src/server/server.ts +0 -43
  31. package/src/server/types.ts +0 -34
  32. package/src/ui/bun.lock +0 -311
  33. package/src/ui/package.json +0 -20
  34. package/src/ui/src/App.css +0 -12
  35. package/src/ui/src/App.tsx +0 -41
  36. package/src/ui/src/components/ActionCarousel.css +0 -128
  37. package/src/ui/src/components/ActionCarousel.tsx +0 -92
  38. package/src/ui/src/components/Inspector.css +0 -314
  39. package/src/ui/src/components/Inspector.tsx +0 -265
  40. package/src/ui/src/components/InteractionCard.css +0 -159
  41. package/src/ui/src/components/InteractionCard.tsx +0 -60
  42. package/src/ui/src/components/MainInspector.css +0 -304
  43. package/src/ui/src/components/MainInspector.tsx +0 -304
  44. package/src/ui/src/components/Stats.css +0 -27
  45. package/src/ui/src/components/Timeline.css +0 -31
  46. package/src/ui/src/components/Timeline.tsx +0 -37
  47. package/src/ui/src/hooks/useInteractions.ts +0 -73
  48. package/src/ui/src/index.tsx +0 -11
  49. package/src/ui/src/services/api.ts +0 -41
  50. package/src/ui/src/styles/tokens.css +0 -126
  51. package/src/ui/src/types.ts +0 -34
  52. package/src/ui/src/utils/__tests__/locators.test.ts +0 -304
  53. package/src/ui/src/utils/__tests__/xml-parser.test.ts +0 -326
  54. package/src/ui/src/utils/locators.ts +0 -14
  55. package/src/ui/src/utils/xml-parser.ts +0 -45
  56. package/src/ui/tsconfig.json +0 -34
  57. package/src/ui/tsconfig.node.json +0 -11
  58. package/src/ui/vite.config.ts +0 -22
  59. package/tests/cli/arg-parser.test.ts +0 -397
  60. package/tests/cli/drive-commands.test.ts +0 -151
  61. package/tests/cli/selectors-best.test.ts +0 -42
  62. package/tests/cli/session-commands.test.ts +0 -53
  63. package/tests/core/selector-candidates.test.ts +0 -83
  64. package/tests/core/selector-scoring.test.ts +0 -75
  65. package/tests/core/xml-parser.test.ts +0 -56
  66. package/tests/server/appium-client.test.ts +0 -229
  67. package/tests/server/interaction-recorder.test.ts +0 -377
  68. package/tests/server/proxy-middleware.test.ts +0 -343
  69. package/tests/server/routes.test.ts +0 -305
  70. package/tsconfig.json +0 -26
  71. package/vitest.config.ts +0 -16
  72. package/vitest.ui.config.ts +0 -15
  73. package/workflow.gif +0 -0
@@ -1,159 +0,0 @@
1
- .interaction-card {
2
- background: var(--color-bg-secondary);
3
- border-radius: var(--radius-xl);
4
- padding: var(--spacing-5);
5
- border-left: 3px solid var(--color-accent-primary);
6
- transition: all var(--transition-base);
7
- box-shadow: var(--shadow-xs);
8
- border-top: 1px solid var(--color-border);
9
- border-right: 1px solid var(--color-border);
10
- border-bottom: 1px solid var(--color-border);
11
- }
12
-
13
- .interaction-card.action {
14
- border-left-color: var(--color-accent-warning);
15
- }
16
-
17
- .interaction-card:hover {
18
- box-shadow: var(--shadow-md);
19
- transform: translateY(-1px);
20
- }
21
-
22
- .interaction-header {
23
- display: flex;
24
- justify-content: space-between;
25
- align-items: center;
26
- margin-bottom: var(--spacing-3);
27
- flex-wrap: wrap;
28
- gap: var(--spacing-2);
29
- }
30
-
31
- .interaction-header-left {
32
- display: flex;
33
- align-items: center;
34
- gap: var(--spacing-2);
35
- flex-wrap: wrap;
36
- }
37
-
38
- .interaction-id {
39
- background: var(--color-bg-tertiary);
40
- color: var(--color-text-secondary);
41
- padding: 2px var(--spacing-2);
42
- border-radius: var(--radius-full);
43
- font-size: var(--font-size-xs);
44
- font-weight: var(--font-weight-semibold);
45
- }
46
-
47
- .interaction-card.action .interaction-id {
48
- background: #FFF3E0;
49
- color: var(--color-accent-warning);
50
- }
51
-
52
- .interaction-method {
53
- font-weight: var(--font-weight-semibold);
54
- padding: 2px var(--spacing-2);
55
- border-radius: var(--radius-sm);
56
- font-size: var(--font-size-xs);
57
- text-transform: uppercase;
58
- letter-spacing: 0.03em;
59
- }
60
-
61
- .interaction-method.POST {
62
- background: #E8F5EE;
63
- color: var(--color-accent-success);
64
- }
65
-
66
- .interaction-method.GET {
67
- background: #E8F0FE;
68
- color: #3B7DD8;
69
- }
70
-
71
- .interaction-method.DELETE {
72
- background: #FDECEB;
73
- color: var(--color-accent-error);
74
- }
75
-
76
- .interaction-path {
77
- color: var(--color-text-secondary);
78
- font-size: var(--font-size-sm);
79
- word-break: break-all;
80
- overflow-wrap: break-word;
81
- max-width: 100%;
82
- }
83
-
84
- .interaction-time {
85
- color: var(--color-text-tertiary);
86
- font-size: var(--font-size-xs);
87
- }
88
-
89
- .element-info {
90
- background: var(--color-bg-tertiary);
91
- padding: var(--spacing-2) var(--spacing-3);
92
- border-radius: var(--radius-md);
93
- margin-top: var(--spacing-3);
94
- font-size: var(--font-size-sm);
95
- word-wrap: break-word;
96
- overflow-wrap: break-word;
97
- }
98
-
99
- .element-info-using {
100
- color: var(--color-accent-primary);
101
- font-weight: var(--font-weight-medium);
102
- }
103
-
104
- .element-info-value {
105
- color: var(--color-text-primary);
106
- word-break: break-all;
107
- }
108
-
109
- .interaction-body {
110
- background: var(--color-bg-primary);
111
- padding: var(--spacing-3);
112
- border-radius: var(--radius-md);
113
- margin-top: var(--spacing-3);
114
- font-size: var(--font-size-xs);
115
- font-family: var(--font-mono);
116
- overflow: auto;
117
- max-height: 200px;
118
- border: 1px solid var(--color-border);
119
- white-space: pre-wrap;
120
- word-break: break-all;
121
- color: var(--color-text-secondary);
122
- }
123
-
124
- .screenshot-container {
125
- margin-top: var(--spacing-4);
126
- display: flex;
127
- flex-direction: column;
128
- gap: var(--spacing-3);
129
- align-items: flex-start;
130
- }
131
-
132
- .screenshot {
133
- max-width: 300px;
134
- border-radius: var(--radius-xl);
135
- cursor: pointer;
136
- border: 1px solid var(--color-border);
137
- transition: all var(--transition-base);
138
- }
139
-
140
- .screenshot:hover {
141
- border-color: var(--color-accent-primary);
142
- box-shadow: var(--shadow-md);
143
- }
144
-
145
- .inspect-btn {
146
- background: var(--color-accent-primary);
147
- color: white;
148
- border: none;
149
- padding: var(--spacing-2) var(--spacing-5);
150
- border-radius: var(--radius-lg);
151
- cursor: pointer;
152
- font-weight: var(--font-weight-medium);
153
- font-size: var(--font-size-sm);
154
- transition: all var(--transition-fast);
155
- }
156
-
157
- .inspect-btn:hover {
158
- background: var(--color-accent-secondary);
159
- }
@@ -1,60 +0,0 @@
1
- import { type Component, Show } from 'solid-js';
2
- import type { Interaction } from '../types';
3
- import './InteractionCard.css';
4
-
5
- type InteractionCardProps = {
6
- interaction: Interaction;
7
- onInspect?: () => void;
8
- };
9
-
10
- export const InteractionCard: Component<InteractionCardProps> = (props) => {
11
- const formattedTime = () => new Date(props.interaction.timestamp).toLocaleTimeString();
12
- const isAction = () => !!props.interaction.screenshot;
13
-
14
- return (
15
- <div classList={{ 'interaction-card': true, 'action': isAction() }}>
16
- <div class="interaction-header">
17
- <div class="interaction-header-left">
18
- <span class="interaction-id">#{props.interaction.id}</span>
19
- <span classList={{
20
- 'interaction-method': true,
21
- [props.interaction.method]: true,
22
- }}>
23
- {props.interaction.method}
24
- </span>
25
- <span class="interaction-path">{props.interaction.path}</span>
26
- </div>
27
- <span class="interaction-time">{formattedTime()}</span>
28
- </div>
29
-
30
- <Show when={props.interaction.elementInfo}>
31
- <div class="element-info">
32
- <span class="element-info-using">{props.interaction.elementInfo!.using}:</span>
33
- {' "'}
34
- <span class="element-info-value">{props.interaction.elementInfo!.value}</span>
35
- {'"'}
36
- </div>
37
- </Show>
38
-
39
- <Show when={props.interaction.body}>
40
- <pre class="interaction-body">
41
- {JSON.stringify(props.interaction.body, null, 2)}
42
- </pre>
43
- </Show>
44
-
45
- <Show when={props.interaction.screenshot}>
46
- <div class="screenshot-container">
47
- <img
48
- src={`data:image/png;base64,${props.interaction.screenshot}`}
49
- alt="Screenshot"
50
- class="screenshot"
51
- onClick={props.onInspect}
52
- />
53
- <button class="inspect-btn" onClick={props.onInspect}>
54
- Inspect Elements
55
- </button>
56
- </div>
57
- </Show>
58
- </div>
59
- );
60
- };
@@ -1,304 +0,0 @@
1
- .main-inspector {
2
- display: flex;
3
- flex-direction: column;
4
- height: 100%;
5
- overflow: hidden;
6
- }
7
-
8
- .inspector-empty {
9
- display: flex;
10
- align-items: center;
11
- justify-content: center;
12
- height: 100%;
13
- background: var(--color-bg-primary);
14
- }
15
-
16
- .inspector-empty-content {
17
- display: flex;
18
- flex-direction: column;
19
- align-items: center;
20
- gap: var(--spacing-4);
21
- color: var(--color-text-tertiary);
22
- }
23
-
24
- .inspector-empty-icon {
25
- font-size: 3rem;
26
- opacity: 0.4;
27
- }
28
-
29
- .inspector-empty-text {
30
- font-size: var(--font-size-base);
31
- }
32
-
33
- /* Query Section */
34
- .query-section {
35
- background: var(--color-bg-secondary);
36
- padding: var(--spacing-4) var(--spacing-5);
37
- border-bottom: 1px solid var(--color-border);
38
- flex-shrink: 0;
39
- }
40
-
41
- .section-title {
42
- color: var(--color-text-primary);
43
- font-size: var(--font-size-sm);
44
- margin: 0 0 var(--spacing-3) 0;
45
- font-weight: var(--font-weight-semibold);
46
- letter-spacing: 0.01em;
47
- }
48
-
49
- .query-row {
50
- display: flex;
51
- gap: var(--spacing-2);
52
- margin-bottom: var(--spacing-3);
53
- }
54
-
55
- .query-select,
56
- .query-input {
57
- background: var(--color-bg-primary);
58
- color: var(--color-text-primary);
59
- border: 1px solid var(--color-border);
60
- padding: var(--spacing-2) var(--spacing-3);
61
- border-radius: var(--radius-lg);
62
- font-size: var(--font-size-sm);
63
- font-family: var(--font-family);
64
- transition: border-color var(--transition-fast);
65
- }
66
-
67
- .query-select:focus,
68
- .query-input:focus {
69
- outline: none;
70
- border-color: var(--color-accent-primary);
71
- }
72
-
73
- .query-select {
74
- min-width: 170px;
75
- }
76
-
77
- .query-input {
78
- flex: 1;
79
- }
80
-
81
- .query-btn {
82
- background: var(--color-accent-primary);
83
- color: white;
84
- border: none;
85
- padding: var(--spacing-2) var(--spacing-5);
86
- border-radius: var(--radius-lg);
87
- cursor: pointer;
88
- font-weight: var(--font-weight-medium);
89
- font-size: var(--font-size-sm);
90
- transition: all var(--transition-fast);
91
- }
92
-
93
- .query-btn:hover {
94
- background: var(--color-accent-secondary);
95
- }
96
-
97
- .query-result {
98
- padding: var(--spacing-2) var(--spacing-3);
99
- border-radius: var(--radius-md);
100
- font-size: var(--font-size-sm);
101
- margin-bottom: var(--spacing-3);
102
- }
103
-
104
- .query-result.success {
105
- background: #E8F5EE;
106
- color: var(--color-accent-success);
107
- }
108
-
109
- .query-result.error {
110
- background: #FDECEB;
111
- color: var(--color-accent-error);
112
- display: flex;
113
- align-items: center;
114
- gap: var(--spacing-3);
115
- }
116
-
117
- .error-icon {
118
- font-size: var(--font-size-sm);
119
- }
120
-
121
- .error-dismiss {
122
- margin-left: auto;
123
- background: transparent;
124
- border: none;
125
- color: var(--color-accent-error);
126
- cursor: pointer;
127
- font-size: var(--font-size-sm);
128
- padding: 0;
129
- opacity: 0.6;
130
- transition: opacity var(--transition-fast);
131
- }
132
-
133
- .error-dismiss:hover {
134
- opacity: 1;
135
- }
136
-
137
- /* Element Panel */
138
- .element-panel {
139
- display: flex;
140
- gap: var(--spacing-6);
141
- padding-top: var(--spacing-3);
142
- border-top: 1px solid var(--color-border);
143
- margin-top: var(--spacing-3);
144
- }
145
-
146
- .element-details {
147
- display: flex;
148
- flex-direction: column;
149
- gap: var(--spacing-2);
150
- min-width: 240px;
151
- }
152
-
153
- .element-attr {
154
- display: flex;
155
- gap: var(--spacing-3);
156
- font-size: var(--font-size-sm);
157
- }
158
-
159
- .attr-name {
160
- color: var(--color-text-tertiary);
161
- min-width: 55px;
162
- font-weight: var(--font-weight-medium);
163
- }
164
-
165
- .attr-value {
166
- color: var(--color-text-primary);
167
- }
168
-
169
- .locators-section {
170
- flex: 1;
171
- }
172
-
173
- .locators-section h4 {
174
- color: var(--color-text-secondary);
175
- font-size: var(--font-size-sm);
176
- margin: 0 0 var(--spacing-2) 0;
177
- font-weight: var(--font-weight-medium);
178
- }
179
-
180
- .locators-list {
181
- display: flex;
182
- flex-direction: column;
183
- gap: var(--spacing-1);
184
- }
185
-
186
- .locator-row {
187
- display: flex;
188
- align-items: center;
189
- gap: var(--spacing-3);
190
- padding: var(--spacing-2) var(--spacing-3);
191
- background: var(--color-bg-primary);
192
- border-radius: var(--radius-md);
193
- cursor: pointer;
194
- transition: all var(--transition-fast);
195
- position: relative;
196
- border: 1px solid transparent;
197
- }
198
-
199
- .locator-row:hover {
200
- background: var(--color-bg-tertiary);
201
- border-color: var(--color-border);
202
- }
203
-
204
- .locator-row.copied {
205
- background: #E8F5EE;
206
- border-color: #C6E7D4;
207
- }
208
-
209
- .locator-strategy {
210
- color: var(--color-accent-primary);
211
- font-size: var(--font-size-xs);
212
- min-width: 130px;
213
- font-weight: var(--font-weight-medium);
214
- font-family: var(--font-mono);
215
- }
216
-
217
- .locator-value {
218
- flex: 1;
219
- font-size: var(--font-size-xs);
220
- color: var(--color-text-secondary);
221
- word-break: break-all;
222
- font-family: var(--font-mono);
223
- }
224
-
225
- .copied-badge {
226
- font-size: var(--font-size-xs);
227
- color: var(--color-accent-success);
228
- font-weight: var(--font-weight-medium);
229
- }
230
-
231
- /* Content Area: Screenshot Left, XML Right */
232
- .content-area {
233
- flex: 1;
234
- display: flex;
235
- gap: var(--spacing-4);
236
- padding: var(--spacing-4);
237
- overflow: hidden;
238
- background: var(--color-bg-primary);
239
- }
240
-
241
- /* Screenshot Section */
242
- .screenshot-section {
243
- flex-shrink: 0;
244
- display: flex;
245
- align-items: flex-start;
246
- justify-content: center;
247
- overflow: auto;
248
- }
249
-
250
- .screenshot-image {
251
- max-height: 100%;
252
- max-width: 350px;
253
- border-radius: var(--radius-xl);
254
- box-shadow: var(--shadow-md);
255
- object-fit: contain;
256
- border: 1px solid var(--color-border);
257
- }
258
-
259
- /* XML Section */
260
- .xml-section {
261
- flex: 1;
262
- display: flex;
263
- flex-direction: column;
264
- overflow: hidden;
265
- }
266
-
267
- .xml-section .section-title {
268
- flex-shrink: 0;
269
- margin-bottom: var(--spacing-3);
270
- }
271
-
272
- .xml-source {
273
- flex: 1;
274
- background: var(--color-bg-secondary);
275
- padding: var(--spacing-4);
276
- border-radius: var(--radius-lg);
277
- font-size: var(--font-size-xs);
278
- font-family: var(--font-mono);
279
- overflow: auto;
280
- white-space: pre;
281
- color: var(--color-text-secondary);
282
- border: 1px solid var(--color-border);
283
- margin: 0;
284
- line-height: 1.7;
285
- }
286
-
287
- .xml-source::-webkit-scrollbar {
288
- width: 6px;
289
- height: 6px;
290
- }
291
-
292
- .xml-source::-webkit-scrollbar-track {
293
- background: transparent;
294
- border-radius: var(--radius-sm);
295
- }
296
-
297
- .xml-source::-webkit-scrollbar-thumb {
298
- background: var(--color-border);
299
- border-radius: var(--radius-sm);
300
- }
301
-
302
- .xml-source::-webkit-scrollbar-thumb:hover {
303
- background: var(--color-text-tertiary);
304
- }