@qontinui/ui-bridge 0.2.0 → 0.3.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.
- package/dist/ai/index.d.mts +312 -155
- package/dist/ai/index.d.ts +312 -155
- package/dist/ai/index.js +2363 -67
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +2328 -68
- package/dist/ai/index.mjs.map +1 -1
- package/dist/annotations/index.d.mts +218 -0
- package/dist/annotations/index.d.ts +218 -0
- package/dist/annotations/index.js +246 -0
- package/dist/annotations/index.js.map +1 -0
- package/dist/annotations/index.mjs +241 -0
- package/dist/annotations/index.mjs.map +1 -0
- package/dist/assertions-BSR3afVr.d.ts +161 -0
- package/dist/assertions-CTw1hfOx.d.mts +161 -0
- package/dist/babel-plugin/index.js +504 -0
- package/dist/babel-plugin/index.js.map +1 -0
- package/dist/babel-plugin/index.mjs +488 -0
- package/dist/babel-plugin/index.mjs.map +1 -0
- package/dist/browser-capture-Bms60T6f.d.mts +47 -0
- package/dist/browser-capture-CsTU29mb.d.ts +47 -0
- package/dist/control/index.d.mts +26 -7
- package/dist/control/index.d.ts +26 -7
- package/dist/control/index.js +276 -48
- package/dist/control/index.js.map +1 -1
- package/dist/control/index.mjs +276 -48
- package/dist/control/index.mjs.map +1 -1
- package/dist/core/index.d.mts +115 -44
- package/dist/core/index.d.ts +115 -44
- package/dist/core/index.js +0 -1560
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +1 -1549
- package/dist/core/index.mjs.map +1 -1
- package/dist/debug/index.d.mts +5 -3
- package/dist/debug/index.d.ts +5 -3
- package/dist/debug/index.js +925 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/index.mjs +924 -2
- package/dist/debug/index.mjs.map +1 -1
- package/dist/index.d.mts +13 -9
- package/dist/index.d.ts +13 -9
- package/dist/index.js +8310 -3777
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8246 -3766
- package/dist/index.mjs.map +1 -1
- package/dist/{metrics-NC3csD0R.d.mts → metrics-DuA2qIIz.d.mts} +2 -2
- package/dist/{metrics-C9XRi_mL.d.ts → metrics-KFAAKNEB.d.ts} +2 -2
- package/dist/native/control/index.js +448 -0
- package/dist/native/control/index.js.map +1 -0
- package/dist/native/control/index.mjs +445 -0
- package/dist/native/control/index.mjs.map +1 -0
- package/dist/native/core/index.js +486 -0
- package/dist/native/core/index.js.map +1 -0
- package/dist/native/core/index.mjs +475 -0
- package/dist/native/core/index.mjs.map +1 -0
- package/dist/native/debug/index.js +408 -0
- package/dist/native/debug/index.js.map +1 -0
- package/dist/native/debug/index.mjs +406 -0
- package/dist/native/debug/index.mjs.map +1 -0
- package/dist/native/index.js +2232 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/index.mjs +2204 -0
- package/dist/native/index.mjs.map +1 -0
- package/dist/native/react/index.js +1377 -0
- package/dist/native/react/index.js.map +1 -0
- package/dist/native/react/index.mjs +1365 -0
- package/dist/native/react/index.mjs.map +1 -0
- package/dist/native/server/index.js +440 -0
- package/dist/native/server/index.js.map +1 -0
- package/dist/native/server/index.mjs +435 -0
- package/dist/native/server/index.mjs.map +1 -0
- package/dist/react/index.d.mts +121 -9
- package/dist/react/index.d.ts +121 -9
- package/dist/react/index.js +2239 -91
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +2239 -92
- package/dist/react/index.mjs.map +1 -1
- package/dist/{registry-CIEDjbQ9.d.ts → registry-C6dDtn1v.d.ts} +34 -15
- package/dist/{registry-SsSDq46X.d.mts → registry-POtcxnal.d.mts} +34 -15
- package/dist/render-log/index.d.mts +1 -1
- package/dist/render-log/index.d.ts +1 -1
- package/dist/server/express.d.mts +37 -0
- package/dist/server/express.d.ts +37 -0
- package/dist/server/express.js +298 -0
- package/dist/server/express.js.map +1 -0
- package/dist/server/express.mjs +294 -0
- package/dist/server/express.mjs.map +1 -0
- package/dist/server/handlers.d.mts +124 -0
- package/dist/server/handlers.d.ts +124 -0
- package/dist/server/handlers.js +7183 -0
- package/dist/server/handlers.js.map +1 -0
- package/dist/server/handlers.mjs +7180 -0
- package/dist/server/handlers.mjs.map +1 -0
- package/dist/server/index.d.mts +12 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.js +8384 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +8369 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/nextjs.d.mts +128 -0
- package/dist/server/nextjs.d.ts +128 -0
- package/dist/server/nextjs.js +390 -0
- package/dist/server/nextjs.js.map +1 -0
- package/dist/server/nextjs.mjs +385 -0
- package/dist/server/nextjs.mjs.map +1 -0
- package/dist/server/standalone.d.mts +7 -0
- package/dist/server/standalone.d.ts +7 -0
- package/dist/server/standalone.js +845 -0
- package/dist/server/standalone.js.map +1 -0
- package/dist/server/standalone.mjs +841 -0
- package/dist/server/standalone.mjs.map +1 -0
- package/dist/specs/index.d.mts +365 -0
- package/dist/specs/index.d.ts +365 -0
- package/dist/specs/index.js +2809 -0
- package/dist/specs/index.js.map +1 -0
- package/dist/specs/index.mjs +2786 -0
- package/dist/specs/index.mjs.map +1 -0
- package/dist/standalone-B6GLIEmR.d.ts +216 -0
- package/dist/standalone-CjdYqj3P.d.mts +216 -0
- package/dist/swc-plugin/index.d.mts +79 -0
- package/dist/swc-plugin/index.d.ts +79 -0
- package/dist/swc-plugin/index.js +15 -0
- package/dist/swc-plugin/index.js.map +1 -0
- package/dist/swc-plugin/index.mjs +9 -0
- package/dist/swc-plugin/index.mjs.map +1 -0
- package/dist/types-B2EfvEaq.d.ts +236 -0
- package/dist/{types-Dr6tH-bm.d.mts → types-C7gVYRnF.d.ts} +72 -2
- package/dist/{types-oCTrRxSw.d.ts → types-CJGrBEhC.d.mts} +72 -2
- package/dist/types-CebMQj76.d.ts +1275 -0
- package/dist/types-D_ypYl3T.d.mts +1275 -0
- package/dist/types-UBtp7R0u.d.mts +132 -0
- package/dist/types-UBtp7R0u.d.ts +132 -0
- package/dist/types-gO696T_t.d.mts +236 -0
- package/dist/{types-CPMbN_Iw.d.mts → types-suaYwWWg.d.mts} +519 -152
- package/dist/{types-CPMbN_Iw.d.ts → types-suaYwWWg.d.ts} +519 -152
- package/package.json +123 -4
- package/swc-plugin-wasm/ui_bridge_swc_plugin.wasm +0 -0
- package/dist/types-BvCfFuEV.d.ts +0 -534
- package/dist/types-CFT3Dnx4.d.mts +0 -534
- package/dist/websocket-client-CX4QJesI.d.ts +0 -124
- package/dist/websocket-client-C_Na0OSp.d.mts +0 -124
package/dist/control/index.mjs
CHANGED
|
@@ -103,6 +103,10 @@ function getElementState(element) {
|
|
|
103
103
|
pointerEvents: style.pointerEvents
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
|
+
const rawText = element.textContent?.trim();
|
|
107
|
+
if (rawText) {
|
|
108
|
+
state.textContent = rawText.replace(/\s+/g, " ").slice(0, 500);
|
|
109
|
+
}
|
|
106
110
|
if (element instanceof HTMLInputElement) {
|
|
107
111
|
state.value = element.value;
|
|
108
112
|
if (element.type === "checkbox" || element.type === "radio") {
|
|
@@ -144,9 +148,25 @@ function createMouseEvent(type, element, options) {
|
|
|
144
148
|
clientY: rect.top + y
|
|
145
149
|
});
|
|
146
150
|
}
|
|
151
|
+
function elementFromPointSafe(x, y) {
|
|
152
|
+
if (typeof document.elementFromPoint === "function") {
|
|
153
|
+
return document.elementFromPoint(x, y);
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
function createMouseEventAt(type, clientX, clientY) {
|
|
158
|
+
return new MouseEvent(type, {
|
|
159
|
+
bubbles: true,
|
|
160
|
+
cancelable: true,
|
|
161
|
+
button: 0,
|
|
162
|
+
clientX,
|
|
163
|
+
clientY
|
|
164
|
+
});
|
|
165
|
+
}
|
|
147
166
|
var DefaultActionExecutor = class {
|
|
148
|
-
constructor(registry) {
|
|
167
|
+
constructor(registry, consoleCapture) {
|
|
149
168
|
this.registry = registry;
|
|
169
|
+
this.consoleCapture = consoleCapture;
|
|
150
170
|
}
|
|
151
171
|
/**
|
|
152
172
|
* Execute an action on an element
|
|
@@ -183,11 +203,19 @@ var DefaultActionExecutor = class {
|
|
|
183
203
|
};
|
|
184
204
|
}
|
|
185
205
|
}
|
|
206
|
+
const actionStartTime = Date.now();
|
|
186
207
|
const result = await this.performAction(element, request.action, request.params);
|
|
208
|
+
let consoleErrors;
|
|
209
|
+
if (this.consoleCapture) {
|
|
210
|
+
await sleep(50);
|
|
211
|
+
const errors = this.consoleCapture.getConsoleSince(actionStartTime);
|
|
212
|
+
if (errors.length > 0) consoleErrors = errors;
|
|
213
|
+
}
|
|
187
214
|
return {
|
|
188
215
|
success: true,
|
|
189
216
|
elementState: getElementState(element),
|
|
190
217
|
result,
|
|
218
|
+
consoleErrors,
|
|
191
219
|
durationMs: performance.now() - startTime,
|
|
192
220
|
timestamp: Date.now(),
|
|
193
221
|
requestId: request.requestId,
|
|
@@ -279,47 +307,76 @@ var DefaultActionExecutor = class {
|
|
|
279
307
|
const rootEl = document.querySelector(options.root);
|
|
280
308
|
if (rootEl) root = rootEl;
|
|
281
309
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
const
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
if (
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
310
|
+
if (!options?.contentOnly) {
|
|
311
|
+
const interactiveSelectors = [
|
|
312
|
+
"a[href]",
|
|
313
|
+
"button",
|
|
314
|
+
"input",
|
|
315
|
+
"select",
|
|
316
|
+
"textarea",
|
|
317
|
+
"[onclick]",
|
|
318
|
+
'[role="button"]',
|
|
319
|
+
'[role="link"]',
|
|
320
|
+
'[role="checkbox"]',
|
|
321
|
+
'[role="radio"]',
|
|
322
|
+
'[role="menuitem"]',
|
|
323
|
+
'[role="tab"]',
|
|
324
|
+
'[role="switch"]',
|
|
325
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
326
|
+
'[contenteditable="true"]',
|
|
327
|
+
"[data-ui-element]",
|
|
328
|
+
"[data-ui-id]",
|
|
329
|
+
"[data-testid]"
|
|
330
|
+
];
|
|
331
|
+
const selector = options?.selector || interactiveSelectors.join(", ");
|
|
332
|
+
const foundElements = root.querySelectorAll(selector);
|
|
333
|
+
for (const el of foundElements) {
|
|
334
|
+
if (options?.limit && elements.length >= options.limit) break;
|
|
335
|
+
const state = getElementState(el);
|
|
336
|
+
if (!options?.includeHidden && !state.visible) continue;
|
|
337
|
+
if (options?.types) {
|
|
338
|
+
const type = this.inferElementType(el);
|
|
339
|
+
if (!options.types.includes(type)) continue;
|
|
340
|
+
}
|
|
341
|
+
const registered = this.registry.findByDOMElement(el);
|
|
342
|
+
elements.push({
|
|
343
|
+
id: registered?.id || this.getElementId(el),
|
|
344
|
+
type: registered?.type || this.inferElementType(el),
|
|
345
|
+
label: registered?.label || this.getElementLabel(el),
|
|
346
|
+
tagName: el.tagName.toLowerCase(),
|
|
347
|
+
role: el.getAttribute("role") || void 0,
|
|
348
|
+
accessibleName: this.getAccessibleName(el),
|
|
349
|
+
actions: registered?.actions || this.inferActions(el),
|
|
350
|
+
state,
|
|
351
|
+
registered: !!registered,
|
|
352
|
+
category: registered?.category || "interactive",
|
|
353
|
+
contentMetadata: registered?.contentMetadata
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (options?.includeContent || options?.contentOnly) {
|
|
358
|
+
const contentElements = this.registry.getAllContentElements();
|
|
359
|
+
for (const el of contentElements) {
|
|
360
|
+
if (options?.limit && elements.length >= options.limit) break;
|
|
361
|
+
const state = el.getState();
|
|
362
|
+
if (!options?.includeHidden && !state.visible) continue;
|
|
363
|
+
if (options?.contentRole && el.contentMetadata?.contentRole !== options.contentRole) {
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
elements.push({
|
|
367
|
+
id: el.id,
|
|
368
|
+
type: el.type,
|
|
369
|
+
label: el.label,
|
|
370
|
+
tagName: el.element.tagName.toLowerCase(),
|
|
371
|
+
role: el.element.getAttribute("role") || void 0,
|
|
372
|
+
accessibleName: el.label || state.textContent?.trim(),
|
|
373
|
+
actions: [],
|
|
374
|
+
state,
|
|
375
|
+
registered: true,
|
|
376
|
+
category: "content",
|
|
377
|
+
contentMetadata: el.contentMetadata
|
|
378
|
+
});
|
|
379
|
+
}
|
|
323
380
|
}
|
|
324
381
|
return {
|
|
325
382
|
elements,
|
|
@@ -349,7 +406,9 @@ var DefaultActionExecutor = class {
|
|
|
349
406
|
type: el.type,
|
|
350
407
|
label: el.label,
|
|
351
408
|
actions: [...el.actions, ...el.customActions ? Object.keys(el.customActions) : []],
|
|
352
|
-
state: el.getState()
|
|
409
|
+
state: el.getState(),
|
|
410
|
+
category: el.category,
|
|
411
|
+
contentMetadata: el.contentMetadata
|
|
353
412
|
})),
|
|
354
413
|
components: components.map((comp) => ({
|
|
355
414
|
id: comp.id,
|
|
@@ -433,6 +492,14 @@ var DefaultActionExecutor = class {
|
|
|
433
492
|
return this.performCheck(element, false);
|
|
434
493
|
case "toggle":
|
|
435
494
|
return this.performToggle(element);
|
|
495
|
+
case "drag":
|
|
496
|
+
return this.performDrag(element, params);
|
|
497
|
+
case "setValue":
|
|
498
|
+
return this.performSetValue(element, params);
|
|
499
|
+
case "submit":
|
|
500
|
+
return this.performSubmit(element);
|
|
501
|
+
case "reset":
|
|
502
|
+
return this.performReset(element);
|
|
436
503
|
default: {
|
|
437
504
|
const registered = this.registry.findByDOMElement(element);
|
|
438
505
|
if (registered?.customActions?.[action]) {
|
|
@@ -462,15 +529,26 @@ var DefaultActionExecutor = class {
|
|
|
462
529
|
if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {
|
|
463
530
|
throw new Error("Type action requires an input or textarea element");
|
|
464
531
|
}
|
|
532
|
+
const proto = element instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;
|
|
533
|
+
const nativeSetter = Object.getOwnPropertyDescriptor(proto, "value")?.set;
|
|
465
534
|
element.focus();
|
|
466
535
|
if (options?.clear) {
|
|
467
|
-
|
|
536
|
+
if (nativeSetter) {
|
|
537
|
+
nativeSetter.call(element, "");
|
|
538
|
+
} else {
|
|
539
|
+
element.value = "";
|
|
540
|
+
}
|
|
468
541
|
element.dispatchEvent(new Event("input", { bubbles: true }));
|
|
469
542
|
}
|
|
470
543
|
const text = options?.text || "";
|
|
471
544
|
const delay = options?.delay || 0;
|
|
472
545
|
for (const char of text) {
|
|
473
|
-
element.value
|
|
546
|
+
const current = element.value;
|
|
547
|
+
if (nativeSetter) {
|
|
548
|
+
nativeSetter.call(element, current + char);
|
|
549
|
+
} else {
|
|
550
|
+
element.value = current + char;
|
|
551
|
+
}
|
|
474
552
|
if (options?.triggerEvents !== false) {
|
|
475
553
|
element.dispatchEvent(new Event("input", { bubbles: true }));
|
|
476
554
|
}
|
|
@@ -484,7 +562,13 @@ var DefaultActionExecutor = class {
|
|
|
484
562
|
}
|
|
485
563
|
performClear(element) {
|
|
486
564
|
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
|
|
487
|
-
element.
|
|
565
|
+
const proto = element instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;
|
|
566
|
+
const nativeSetter = Object.getOwnPropertyDescriptor(proto, "value")?.set;
|
|
567
|
+
if (nativeSetter) {
|
|
568
|
+
nativeSetter.call(element, "");
|
|
569
|
+
} else {
|
|
570
|
+
element.value = "";
|
|
571
|
+
}
|
|
488
572
|
element.dispatchEvent(new Event("input", { bubbles: true }));
|
|
489
573
|
element.dispatchEvent(new Event("change", { bubbles: true }));
|
|
490
574
|
}
|
|
@@ -566,6 +650,150 @@ var DefaultActionExecutor = class {
|
|
|
566
650
|
element.dispatchEvent(new Event("change", { bubbles: true }));
|
|
567
651
|
}
|
|
568
652
|
}
|
|
653
|
+
performSetValue(element, params) {
|
|
654
|
+
const value = params?.value;
|
|
655
|
+
if (value === void 0) {
|
|
656
|
+
throw new Error('setValue requires a "value" parameter');
|
|
657
|
+
}
|
|
658
|
+
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
|
|
659
|
+
const nativeSetter = Object.getOwnPropertyDescriptor(
|
|
660
|
+
element instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype,
|
|
661
|
+
"value"
|
|
662
|
+
)?.set;
|
|
663
|
+
if (nativeSetter) {
|
|
664
|
+
nativeSetter.call(element, value);
|
|
665
|
+
} else {
|
|
666
|
+
element.value = value;
|
|
667
|
+
}
|
|
668
|
+
element.dispatchEvent(new Event("input", { bubbles: true }));
|
|
669
|
+
element.dispatchEvent(new Event("change", { bubbles: true }));
|
|
670
|
+
} else if (element instanceof HTMLSelectElement) {
|
|
671
|
+
element.value = value;
|
|
672
|
+
element.dispatchEvent(new Event("change", { bubbles: true }));
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
performSubmit(element) {
|
|
676
|
+
const form = element instanceof HTMLFormElement ? element : element.closest("form");
|
|
677
|
+
if (form) {
|
|
678
|
+
const submitEvent = new Event("submit", { bubbles: true, cancelable: true });
|
|
679
|
+
if (form.dispatchEvent(submitEvent)) {
|
|
680
|
+
form.requestSubmit();
|
|
681
|
+
}
|
|
682
|
+
} else {
|
|
683
|
+
throw new Error("No form found for submit action");
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
performReset(element) {
|
|
687
|
+
const form = element instanceof HTMLFormElement ? element : element.closest("form");
|
|
688
|
+
if (form) {
|
|
689
|
+
form.reset();
|
|
690
|
+
form.dispatchEvent(new Event("reset", { bubbles: true }));
|
|
691
|
+
} else {
|
|
692
|
+
throw new Error("No form found for reset action");
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Perform a drag operation by dispatching a sequence of mouse events.
|
|
697
|
+
*
|
|
698
|
+
* Follows the same composite pattern as the qontinui core library:
|
|
699
|
+
* mousedown on source → wait → mousemove × N along path → mouseup on target.
|
|
700
|
+
*
|
|
701
|
+
* Optionally dispatches HTML5 drag events (dragstart/dragover/drop/dragend)
|
|
702
|
+
* for apps that use the HTML5 Drag and Drop API instead of mouse events.
|
|
703
|
+
*/
|
|
704
|
+
async performDrag(sourceElement, options) {
|
|
705
|
+
const sourceRect = sourceElement.getBoundingClientRect();
|
|
706
|
+
const sourceX = sourceRect.left + (options?.sourceOffset?.x ?? sourceRect.width / 2);
|
|
707
|
+
const sourceY = sourceRect.top + (options?.sourceOffset?.y ?? sourceRect.height / 2);
|
|
708
|
+
let targetX;
|
|
709
|
+
let targetY;
|
|
710
|
+
if (options?.targetPosition) {
|
|
711
|
+
targetX = options.targetPosition.x;
|
|
712
|
+
targetY = options.targetPosition.y;
|
|
713
|
+
} else if (options?.target) {
|
|
714
|
+
const targetElement = this.resolveTargetElement(options.target);
|
|
715
|
+
if (!targetElement) {
|
|
716
|
+
throw new Error(`Drag target element not found: ${JSON.stringify(options.target)}`);
|
|
717
|
+
}
|
|
718
|
+
const targetRect = targetElement.getBoundingClientRect();
|
|
719
|
+
targetX = targetRect.left + (options?.targetOffset?.x ?? targetRect.width / 2);
|
|
720
|
+
targetY = targetRect.top + (options?.targetOffset?.y ?? targetRect.height / 2);
|
|
721
|
+
} else {
|
|
722
|
+
throw new Error("Drag requires either target or targetPosition");
|
|
723
|
+
}
|
|
724
|
+
const steps = options?.steps ?? 10;
|
|
725
|
+
const holdDelay = options?.holdDelay ?? 100;
|
|
726
|
+
const releaseDelay = options?.releaseDelay ?? 50;
|
|
727
|
+
sourceElement.dispatchEvent(createMouseEventAt("mousedown", sourceX, sourceY));
|
|
728
|
+
const canHTML5 = options?.html5 && typeof DragEvent !== "undefined";
|
|
729
|
+
if (canHTML5) {
|
|
730
|
+
sourceElement.dispatchEvent(
|
|
731
|
+
new DragEvent("dragstart", {
|
|
732
|
+
bubbles: true,
|
|
733
|
+
cancelable: true,
|
|
734
|
+
clientX: sourceX,
|
|
735
|
+
clientY: sourceY
|
|
736
|
+
})
|
|
737
|
+
);
|
|
738
|
+
}
|
|
739
|
+
if (holdDelay > 0) {
|
|
740
|
+
await sleep(holdDelay);
|
|
741
|
+
}
|
|
742
|
+
for (let i = 1; i <= steps; i++) {
|
|
743
|
+
const progress = i / steps;
|
|
744
|
+
const currentX = sourceX + (targetX - sourceX) * progress;
|
|
745
|
+
const currentY = sourceY + (targetY - sourceY) * progress;
|
|
746
|
+
const dispatchTarget = elementFromPointSafe(currentX, currentY) || sourceElement;
|
|
747
|
+
dispatchTarget.dispatchEvent(createMouseEventAt("mousemove", currentX, currentY));
|
|
748
|
+
if (canHTML5) {
|
|
749
|
+
dispatchTarget.dispatchEvent(
|
|
750
|
+
new DragEvent("dragover", {
|
|
751
|
+
bubbles: true,
|
|
752
|
+
cancelable: true,
|
|
753
|
+
clientX: currentX,
|
|
754
|
+
clientY: currentY
|
|
755
|
+
})
|
|
756
|
+
);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
const dropTarget = elementFromPointSafe(targetX, targetY) || sourceElement;
|
|
760
|
+
dropTarget.dispatchEvent(createMouseEventAt("mouseup", targetX, targetY));
|
|
761
|
+
if (canHTML5) {
|
|
762
|
+
dropTarget.dispatchEvent(
|
|
763
|
+
new DragEvent("drop", {
|
|
764
|
+
bubbles: true,
|
|
765
|
+
cancelable: true,
|
|
766
|
+
clientX: targetX,
|
|
767
|
+
clientY: targetY
|
|
768
|
+
})
|
|
769
|
+
);
|
|
770
|
+
sourceElement.dispatchEvent(
|
|
771
|
+
new DragEvent("dragend", {
|
|
772
|
+
bubbles: true,
|
|
773
|
+
cancelable: true,
|
|
774
|
+
clientX: targetX,
|
|
775
|
+
clientY: targetY
|
|
776
|
+
})
|
|
777
|
+
);
|
|
778
|
+
}
|
|
779
|
+
if (releaseDelay > 0) {
|
|
780
|
+
await sleep(releaseDelay);
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
/**
|
|
784
|
+
* Resolve a drag target element from a target descriptor.
|
|
785
|
+
*/
|
|
786
|
+
resolveTargetElement(target) {
|
|
787
|
+
if (target.elementId) {
|
|
788
|
+
const registered = this.registry.getElement(target.elementId);
|
|
789
|
+
if (registered?.element) return registered.element;
|
|
790
|
+
return findElementByIdentifier(target.elementId);
|
|
791
|
+
}
|
|
792
|
+
if (target.selector) {
|
|
793
|
+
return document.querySelector(target.selector);
|
|
794
|
+
}
|
|
795
|
+
return null;
|
|
796
|
+
}
|
|
569
797
|
getElementId(element) {
|
|
570
798
|
return element.getAttribute("data-ui-id") || element.getAttribute("data-testid") || element.id || `${element.tagName.toLowerCase()}-${Math.random().toString(36).substr(2, 8)}`;
|
|
571
799
|
}
|
|
@@ -661,8 +889,8 @@ var DefaultActionExecutor = class {
|
|
|
661
889
|
}
|
|
662
890
|
}
|
|
663
891
|
};
|
|
664
|
-
function createActionExecutor(registry) {
|
|
665
|
-
return new DefaultActionExecutor(registry);
|
|
892
|
+
function createActionExecutor(registry, consoleCapture) {
|
|
893
|
+
return new DefaultActionExecutor(registry, consoleCapture);
|
|
666
894
|
}
|
|
667
895
|
|
|
668
896
|
// src/control/workflow-engine.ts
|