@vielzeug/assay 1.0.0 → 2.0.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.
package/dist/events.d.ts CHANGED
@@ -1,42 +1,16 @@
1
- /**
2
- * Synchronous DOM event dispatchers for test environments.
3
- */
4
- export declare const createPointerEvent: (type: string, init?: PointerEventInit) => Event;
5
- /**
6
- * Fire low-level DOM events synchronously. Every method dispatches an appropriately-typed
7
- * `Event` subclass with sensible defaults and returns `dispatchEvent`'s own boolean result
8
- * (`false` when a listener called `preventDefault()`) — the same contract for all of them,
9
- * with no exceptions.
10
- *
11
- * @example
12
- * fire.click(button);
13
- * fire.keyDown(input, { key: 'Enter' });
14
- * fire.custom(el, 'value-change', { detail: 42 });
15
- */
16
- export declare const fire: {
17
- readonly blur: (el: Element, opts?: FocusEventInit) => boolean;
18
- readonly change: (el: Element, opts?: EventInit) => boolean;
19
- readonly click: (el: Element, opts?: PointerEventInit) => boolean;
20
- /** Fire a CustomEvent. Pass `{ detail: ... }` for event detail. */
21
- readonly custom: (el: Element, name: string, opts?: CustomEventInit) => boolean;
22
- /** Dispatch any pre-built Event instance directly. */
23
- readonly event: (el: Element, event: Event) => boolean;
24
- readonly focus: (el: Element, _name?: string, opts?: FocusEventInit) => boolean;
25
- readonly input: (el: Element, opts?: EventInit) => boolean;
26
- /** Fire a KeyboardEvent with a given type (keydown, keyup, keypress). */
27
- readonly keyboard: (el: Element, type: string, opts?: KeyboardEventInit) => boolean;
28
- readonly keyDown: (el: Element, opts?: KeyboardEventInit) => boolean;
29
- readonly keyUp: (el: Element, opts?: KeyboardEventInit) => boolean;
30
- /** Fire a MouseEvent with a given type (click, mousedown, etc.). */
31
- readonly mouse: (el: Element, type: string, opts?: MouseEventInit) => boolean;
32
- readonly pointerCancel: (el: Element, opts?: PointerEventInit) => boolean;
33
- readonly pointerDown: (el: Element, opts?: PointerEventInit) => boolean;
34
- readonly pointerEnter: (el: Element, opts?: PointerEventInit) => boolean;
35
- readonly pointerLeave: (el: Element, opts?: PointerEventInit) => boolean;
36
- readonly pointerMove: (el: Element, opts?: PointerEventInit) => boolean;
37
- readonly pointerUp: (el: Element, opts?: PointerEventInit) => boolean;
38
- readonly submit: (el: Element, opts?: EventInit) => boolean;
39
- /** Fire a touch event; falls back to CustomEvent in environments without TouchEvent. */
40
- readonly touch: (el: Element, type: string, opts?: EventInit) => boolean;
41
- };
1
+ /** Synchronous, exact DOM event dispatchers for test environments. */
2
+ /** Dispatch an event instance without modifying it. */
3
+ export declare const dispatch: (target: EventTarget, event: Event) => boolean;
4
+ export declare const fireBlur: (target: EventTarget, init?: FocusEventInit) => boolean;
5
+ export declare const fireChange: (target: EventTarget, init?: EventInit) => boolean;
6
+ export declare const fireClick: (target: EventTarget, init?: MouseEventInit) => boolean;
7
+ export interface CustomEventOptions<T> extends CustomEventInit<T> {
8
+ type: string;
9
+ }
10
+ export declare const fireCustom: <T>(target: EventTarget, { type, ...init }: CustomEventOptions<T>) => boolean;
11
+ export declare const fireFocus: (target: EventTarget, init?: FocusEventInit) => boolean;
12
+ export declare const fireInput: (target: EventTarget, init?: InputEventInit) => boolean;
13
+ export declare const fireKeyDown: (target: EventTarget, init?: KeyboardEventInit) => boolean;
14
+ export declare const fireKeyUp: (target: EventTarget, init?: KeyboardEventInit) => boolean;
15
+ export declare const fireSubmit: (target: EventTarget, init?: SubmitEventInit) => boolean;
42
16
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,OAAM,gBAAqB,KAAG,KAY9E,CAAC;AAIF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,IAAI;wBACJ,OAAO,SAAS,cAAc;0BAC5B,OAAO,SAAS,SAAS;yBAC1B,OAAO,SAAS,gBAAgB;IAE5C,mEAAmE;0BACtD,OAAO,QAAQ,MAAM,SAAS,eAAe;IAE1D,sDAAsD;yBAC1C,OAAO,SAAS,KAAK;yBACrB,OAAO,UAAU,MAAM,SAAS,cAAc;yBAE9C,OAAO,SAAS,SAAS;IACrC,yEAAyE;4BAC1D,OAAO,QAAQ,MAAM,SAAS,iBAAiB;2BAEhD,OAAO,SAAS,iBAAiB;yBAEnC,OAAO,SAAS,iBAAiB;IAE7C,oEAAoE;yBACxD,OAAO,QAAQ,MAAM,SAAS,cAAc;iCAEpC,OAAO,SAAS,gBAAgB;+BAElC,OAAO,SAAS,gBAAgB;gCAE/B,OAAO,SAAS,gBAAgB;gCAEhC,OAAO,SAAS,gBAAgB;+BAEjC,OAAO,SAAS,gBAAgB;6BAElC,OAAO,SAAS,gBAAgB;0BAEnC,OAAO,SAAS,SAAS;IAEtC,wFAAwF;yBAC5E,OAAO,QAAQ,MAAM,SAAS,SAAS;CAY3C,CAAC"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,uDAAuD;AACvD,eAAO,MAAM,QAAQ,GAAI,QAAQ,WAAW,EAAE,OAAO,KAAK,KAAG,OAAsC,CAAC;AAEpG,eAAO,MAAM,QAAQ,GAAI,QAAQ,WAAW,EAAE,OAAM,cAAmB,KAAG,OAC1B,CAAC;AAEjD,eAAO,MAAM,UAAU,GAAI,QAAQ,WAAW,EAAE,OAAM,SAAc,KAAG,OACJ,CAAC;AAEpE,eAAO,MAAM,SAAS,GAAI,QAAQ,WAAW,EAAE,OAAM,cAAmB,KAAG,OACc,CAAC;AAE1F,MAAM,WAAW,kBAAkB,CAAC,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IAC/D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,QAAQ,WAAW,EAAE,mBAAmB,kBAAkB,CAAC,CAAC,CAAC,KAAG,OACU,CAAC;AAEzG,eAAO,MAAM,SAAS,GAAI,QAAQ,WAAW,EAAE,OAAM,cAAmB,KAAG,OAC1B,CAAC;AAElD,eAAO,MAAM,SAAS,GAAI,QAAQ,WAAW,EAAE,OAAM,cAAmB,KAAG,OACJ,CAAC;AAExE,eAAO,MAAM,WAAW,GAAI,QAAQ,WAAW,EAAE,OAAM,iBAAsB,KAAG,OACc,CAAC;AAE/F,eAAO,MAAM,SAAS,GAAI,QAAQ,WAAW,EAAE,OAAM,iBAAsB,KAAG,OACc,CAAC;AAE7F,eAAO,MAAM,UAAU,GAAI,QAAQ,WAAW,EAAE,OAAM,eAAoB,KAAG,OACc,CAAC"}
package/dist/events.js CHANGED
@@ -1,98 +1,33 @@
1
- import { warnOnce as e } from "./_dev.js";
2
1
  //#region src/events.ts
3
- var t = (t, n = {}) => typeof PointerEvent < "u" ? new PointerEvent(t, n) : (e("pointer-fallback", "PointerEvent is unavailable in this environment — falling back to MouseEvent. pointerId/pointerType/isPrimary and similar pointer-only fields will be missing from every dispatched event."), new MouseEvent(t, n)), n = {
4
- blur: (e, t) => e.dispatchEvent(new FocusEvent("blur", {
5
- bubbles: !0,
6
- ...t
7
- })),
8
- change: (e, t) => e.dispatchEvent(new Event("change", {
9
- bubbles: !0,
10
- ...t
11
- })),
12
- click: (e, t) => e.dispatchEvent(new MouseEvent("click", {
13
- bubbles: !0,
14
- cancelable: !0,
15
- ...t
16
- })),
17
- custom: (e, t, n) => e.dispatchEvent(new CustomEvent(t, {
18
- bubbles: !0,
19
- cancelable: !0,
20
- composed: !1,
21
- ...n
22
- })),
23
- event: (e, t) => e.dispatchEvent(t),
24
- focus: (e, t, n) => e.dispatchEvent(new FocusEvent("focus", {
25
- bubbles: !0,
26
- ...n
27
- })),
28
- input: (e, t) => e.dispatchEvent(new Event("input", {
29
- bubbles: !0,
30
- ...t
31
- })),
32
- keyboard: (e, t, n) => e.dispatchEvent(new KeyboardEvent(t, {
33
- bubbles: !0,
34
- cancelable: !0,
35
- ...n
36
- })),
37
- keyDown: (e, t) => e.dispatchEvent(new KeyboardEvent("keydown", {
38
- bubbles: !0,
39
- cancelable: !0,
40
- ...t
41
- })),
42
- keyUp: (e, t) => e.dispatchEvent(new KeyboardEvent("keyup", {
43
- bubbles: !0,
44
- cancelable: !0,
45
- ...t
46
- })),
47
- mouse: (e, t, n) => e.dispatchEvent(new MouseEvent(t, {
48
- bubbles: !0,
49
- cancelable: !0,
50
- ...n
51
- })),
52
- pointerCancel: (e, n) => e.dispatchEvent(t("pointercancel", {
53
- bubbles: !0,
54
- cancelable: !1,
55
- ...n
56
- })),
57
- pointerDown: (e, n) => e.dispatchEvent(t("pointerdown", {
58
- bubbles: !0,
59
- cancelable: !0,
60
- ...n
61
- })),
62
- pointerEnter: (e, n) => e.dispatchEvent(t("pointerenter", {
63
- bubbles: !1,
64
- ...n
65
- })),
66
- pointerLeave: (e, n) => e.dispatchEvent(t("pointerleave", {
67
- bubbles: !1,
68
- ...n
69
- })),
70
- pointerMove: (e, n) => e.dispatchEvent(t("pointermove", {
71
- bubbles: !0,
72
- cancelable: !0,
73
- ...n
74
- })),
75
- pointerUp: (e, n) => e.dispatchEvent(t("pointerup", {
76
- bubbles: !0,
77
- cancelable: !0,
78
- ...n
79
- })),
80
- submit: (e, t) => e.dispatchEvent(new Event("submit", {
81
- bubbles: !0,
82
- cancelable: !0,
83
- ...t
84
- })),
85
- touch: (t, n, r) => typeof TouchEvent < "u" ? t.dispatchEvent(new TouchEvent(n, {
86
- bubbles: !0,
87
- cancelable: !0,
88
- ...r
89
- })) : (e("touch-fallback", "TouchEvent is unavailable in this environment — falling back to CustomEvent. The dispatched event will have no `touches`/`changedTouches` data."), t.dispatchEvent(new CustomEvent(n, {
90
- bubbles: !0,
91
- cancelable: !0,
92
- ...r
93
- })))
94
- };
2
+ var e = (e, t) => e.dispatchEvent(t), t = (t, n = {}) => e(t, new FocusEvent("blur", n)), n = (t, n = {}) => e(t, new Event("change", {
3
+ bubbles: !0,
4
+ ...n
5
+ })), r = (t, n = {}) => e(t, new MouseEvent("click", {
6
+ bubbles: !0,
7
+ cancelable: !0,
8
+ ...n
9
+ })), i = (t, { type: n, ...r }) => e(t, new CustomEvent(n, {
10
+ bubbles: !0,
11
+ cancelable: !0,
12
+ composed: !1,
13
+ ...r
14
+ })), a = (t, n = {}) => e(t, new FocusEvent("focus", n)), o = (t, n = {}) => e(t, new InputEvent("input", {
15
+ bubbles: !0,
16
+ ...n
17
+ })), s = (t, n = {}) => e(t, new KeyboardEvent("keydown", {
18
+ bubbles: !0,
19
+ cancelable: !0,
20
+ ...n
21
+ })), c = (t, n = {}) => e(t, new KeyboardEvent("keyup", {
22
+ bubbles: !0,
23
+ cancelable: !0,
24
+ ...n
25
+ })), l = (t, n = {}) => e(t, new SubmitEvent("submit", {
26
+ bubbles: !0,
27
+ cancelable: !0,
28
+ ...n
29
+ }));
95
30
  //#endregion
96
- export { t as createPointerEvent, n as fire };
31
+ export { e as dispatch, t as fireBlur, n as fireChange, r as fireClick, i as fireCustom, a as fireFocus, o as fireInput, s as fireKeyDown, c as fireKeyUp, l as fireSubmit };
97
32
 
98
33
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","names":[],"sources":["../src/events.ts"],"sourcesContent":["/**\n * Synchronous DOM event dispatchers for test environments.\n */\n\nimport { warnOnce } from './_dev';\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nexport const createPointerEvent = (type: string, init: PointerEventInit = {}): Event => {\n if (typeof PointerEvent !== 'undefined') {\n return new PointerEvent(type, init);\n }\n\n warnOnce(\n 'pointer-fallback',\n 'PointerEvent is unavailable in this environment — falling back to MouseEvent. ' +\n 'pointerId/pointerType/isPrimary and similar pointer-only fields will be missing from every dispatched event.',\n );\n\n return new MouseEvent(type, init);\n};\n\n// ─── API ─────────────────────────────────────────────────────────────────────\n\n/**\n * Fire low-level DOM events synchronously. Every method dispatches an appropriately-typed\n * `Event` subclass with sensible defaults and returns `dispatchEvent`'s own boolean result\n * (`false` when a listener called `preventDefault()`) — the same contract for all of them,\n * with no exceptions.\n *\n * @example\n * fire.click(button);\n * fire.keyDown(input, { key: 'Enter' });\n * fire.custom(el, 'value-change', { detail: 42 });\n */\nexport const fire = {\n blur: (el: Element, opts?: FocusEventInit) => el.dispatchEvent(new FocusEvent('blur', { bubbles: true, ...opts })),\n change: (el: Element, opts?: EventInit) => el.dispatchEvent(new Event('change', { bubbles: true, ...opts })),\n click: (el: Element, opts?: PointerEventInit) =>\n el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, ...opts })),\n /** Fire a CustomEvent. Pass `{ detail: ... }` for event detail. */\n custom: (el: Element, name: string, opts?: CustomEventInit) =>\n el.dispatchEvent(new CustomEvent(name, { bubbles: true, cancelable: true, composed: false, ...opts })),\n /** Dispatch any pre-built Event instance directly. */\n event: (el: Element, event: Event) => el.dispatchEvent(event),\n focus: (el: Element, _name?: string, opts?: FocusEventInit) =>\n el.dispatchEvent(new FocusEvent('focus', { bubbles: true, ...opts })),\n input: (el: Element, opts?: EventInit) => el.dispatchEvent(new Event('input', { bubbles: true, ...opts })),\n /** Fire a KeyboardEvent with a given type (keydown, keyup, keypress). */\n keyboard: (el: Element, type: string, opts?: KeyboardEventInit) =>\n el.dispatchEvent(new KeyboardEvent(type, { bubbles: true, cancelable: true, ...opts })),\n keyDown: (el: Element, opts?: KeyboardEventInit) =>\n el.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, cancelable: true, ...opts })),\n keyUp: (el: Element, opts?: KeyboardEventInit) =>\n el.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true, cancelable: true, ...opts })),\n /** Fire a MouseEvent with a given type (click, mousedown, etc.). */\n mouse: (el: Element, type: string, opts?: MouseEventInit) =>\n el.dispatchEvent(new MouseEvent(type, { bubbles: true, cancelable: true, ...opts })),\n pointerCancel: (el: Element, opts?: PointerEventInit) =>\n el.dispatchEvent(createPointerEvent('pointercancel', { bubbles: true, cancelable: false, ...opts })),\n pointerDown: (el: Element, opts?: PointerEventInit) =>\n el.dispatchEvent(createPointerEvent('pointerdown', { bubbles: true, cancelable: true, ...opts })),\n pointerEnter: (el: Element, opts?: PointerEventInit) =>\n el.dispatchEvent(createPointerEvent('pointerenter', { bubbles: false, ...opts })),\n pointerLeave: (el: Element, opts?: PointerEventInit) =>\n el.dispatchEvent(createPointerEvent('pointerleave', { bubbles: false, ...opts })),\n pointerMove: (el: Element, opts?: PointerEventInit) =>\n el.dispatchEvent(createPointerEvent('pointermove', { bubbles: true, cancelable: true, ...opts })),\n pointerUp: (el: Element, opts?: PointerEventInit) =>\n el.dispatchEvent(createPointerEvent('pointerup', { bubbles: true, cancelable: true, ...opts })),\n submit: (el: Element, opts?: EventInit) =>\n el.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true, ...opts })),\n /** Fire a touch event; falls back to CustomEvent in environments without TouchEvent. */\n touch: (el: Element, type: string, opts?: EventInit) => {\n if (typeof TouchEvent !== 'undefined') {\n return el.dispatchEvent(new TouchEvent(type, { bubbles: true, cancelable: true, ...opts }));\n }\n\n warnOnce(\n 'touch-fallback',\n 'TouchEvent is unavailable in this environment — falling back to CustomEvent. The dispatched event will have no `touches`/`changedTouches` data.',\n );\n\n return el.dispatchEvent(new CustomEvent(type, { bubbles: true, cancelable: true, ...opts }));\n },\n} as const;\n"],"mappings":";;AAQA,IAAa,KAAsB,GAAc,IAAyB,CAAC,MACrE,OAAO,eAAiB,MACnB,IAAI,aAAa,GAAM,CAAI,KAGpC,EACE,oBACA,4LAEF,GAEO,IAAI,WAAW,GAAM,CAAI,IAgBrB,IAAO;CAClB,OAAO,GAAa,MAA0B,EAAG,cAAc,IAAI,WAAW,QAAQ;EAAE,SAAS;EAAM,GAAG;CAAK,CAAC,CAAC;CACjH,SAAS,GAAa,MAAqB,EAAG,cAAc,IAAI,MAAM,UAAU;EAAE,SAAS;EAAM,GAAG;CAAK,CAAC,CAAC;CAC3G,QAAQ,GAAa,MACnB,EAAG,cAAc,IAAI,WAAW,SAAS;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC;CAExF,SAAS,GAAa,GAAc,MAClC,EAAG,cAAc,IAAI,YAAY,GAAM;EAAE,SAAS;EAAM,YAAY;EAAM,UAAU;EAAO,GAAG;CAAK,CAAC,CAAC;CAEvG,QAAQ,GAAa,MAAiB,EAAG,cAAc,CAAK;CAC5D,QAAQ,GAAa,GAAgB,MACnC,EAAG,cAAc,IAAI,WAAW,SAAS;EAAE,SAAS;EAAM,GAAG;CAAK,CAAC,CAAC;CACtE,QAAQ,GAAa,MAAqB,EAAG,cAAc,IAAI,MAAM,SAAS;EAAE,SAAS;EAAM,GAAG;CAAK,CAAC,CAAC;CAEzG,WAAW,GAAa,GAAc,MACpC,EAAG,cAAc,IAAI,cAAc,GAAM;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC;CACxF,UAAU,GAAa,MACrB,EAAG,cAAc,IAAI,cAAc,WAAW;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC;CAC7F,QAAQ,GAAa,MACnB,EAAG,cAAc,IAAI,cAAc,SAAS;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC;CAE3F,QAAQ,GAAa,GAAc,MACjC,EAAG,cAAc,IAAI,WAAW,GAAM;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC;CACrF,gBAAgB,GAAa,MAC3B,EAAG,cAAc,EAAmB,iBAAiB;EAAE,SAAS;EAAM,YAAY;EAAO,GAAG;CAAK,CAAC,CAAC;CACrG,cAAc,GAAa,MACzB,EAAG,cAAc,EAAmB,eAAe;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC;CAClG,eAAe,GAAa,MAC1B,EAAG,cAAc,EAAmB,gBAAgB;EAAE,SAAS;EAAO,GAAG;CAAK,CAAC,CAAC;CAClF,eAAe,GAAa,MAC1B,EAAG,cAAc,EAAmB,gBAAgB;EAAE,SAAS;EAAO,GAAG;CAAK,CAAC,CAAC;CAClF,cAAc,GAAa,MACzB,EAAG,cAAc,EAAmB,eAAe;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC;CAClG,YAAY,GAAa,MACvB,EAAG,cAAc,EAAmB,aAAa;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC;CAChG,SAAS,GAAa,MACpB,EAAG,cAAc,IAAI,MAAM,UAAU;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC;CAEpF,QAAQ,GAAa,GAAc,MAC7B,OAAO,aAAe,MACjB,EAAG,cAAc,IAAI,WAAW,GAAM;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC,KAG5F,EACE,kBACA,iJACF,GAEO,EAAG,cAAc,IAAI,YAAY,GAAM;EAAE,SAAS;EAAM,YAAY;EAAM,GAAG;CAAK,CAAC,CAAC;AAE/F"}
1
+ {"version":3,"file":"events.js","names":[],"sources":["../src/events.ts"],"sourcesContent":["/** Synchronous, exact DOM event dispatchers for test environments. */\n\n/** Dispatch an event instance without modifying it. */\nexport const dispatch = (target: EventTarget, event: Event): boolean => target.dispatchEvent(event);\n\nexport const fireBlur = (target: EventTarget, init: FocusEventInit = {}): boolean =>\n dispatch(target, new FocusEvent('blur', init));\n\nexport const fireChange = (target: EventTarget, init: EventInit = {}): boolean =>\n dispatch(target, new Event('change', { bubbles: true, ...init }));\n\nexport const fireClick = (target: EventTarget, init: MouseEventInit = {}): boolean =>\n dispatch(target, new MouseEvent('click', { bubbles: true, cancelable: true, ...init }));\n\nexport interface CustomEventOptions<T> extends CustomEventInit<T> {\n type: string;\n}\n\nexport const fireCustom = <T>(target: EventTarget, { type, ...init }: CustomEventOptions<T>): boolean =>\n dispatch(target, new CustomEvent(type, { bubbles: true, cancelable: true, composed: false, ...init }));\n\nexport const fireFocus = (target: EventTarget, init: FocusEventInit = {}): boolean =>\n dispatch(target, new FocusEvent('focus', init));\n\nexport const fireInput = (target: EventTarget, init: InputEventInit = {}): boolean =>\n dispatch(target, new InputEvent('input', { bubbles: true, ...init }));\n\nexport const fireKeyDown = (target: EventTarget, init: KeyboardEventInit = {}): boolean =>\n dispatch(target, new KeyboardEvent('keydown', { bubbles: true, cancelable: true, ...init }));\n\nexport const fireKeyUp = (target: EventTarget, init: KeyboardEventInit = {}): boolean =>\n dispatch(target, new KeyboardEvent('keyup', { bubbles: true, cancelable: true, ...init }));\n\nexport const fireSubmit = (target: EventTarget, init: SubmitEventInit = {}): boolean =>\n dispatch(target, new SubmitEvent('submit', { bubbles: true, cancelable: true, ...init }));\n"],"mappings":";AAGA,IAAa,KAAY,GAAqB,MAA0B,EAAO,cAAc,CAAK,GAErF,KAAY,GAAqB,IAAuB,CAAC,MACpE,EAAS,GAAQ,IAAI,WAAW,QAAQ,CAAI,CAAC,GAElC,KAAc,GAAqB,IAAkB,CAAC,MACjE,EAAS,GAAQ,IAAI,MAAM,UAAU;CAAE,SAAS;CAAM,GAAG;AAAK,CAAC,CAAC,GAErD,KAAa,GAAqB,IAAuB,CAAC,MACrE,EAAS,GAAQ,IAAI,WAAW,SAAS;CAAE,SAAS;CAAM,YAAY;CAAM,GAAG;AAAK,CAAC,CAAC,GAM3E,KAAiB,GAAqB,EAAE,SAAM,GAAG,QAC5D,EAAS,GAAQ,IAAI,YAAY,GAAM;CAAE,SAAS;CAAM,YAAY;CAAM,UAAU;CAAO,GAAG;AAAK,CAAC,CAAC,GAE1F,KAAa,GAAqB,IAAuB,CAAC,MACrE,EAAS,GAAQ,IAAI,WAAW,SAAS,CAAI,CAAC,GAEnC,KAAa,GAAqB,IAAuB,CAAC,MACrE,EAAS,GAAQ,IAAI,WAAW,SAAS;CAAE,SAAS;CAAM,GAAG;AAAK,CAAC,CAAC,GAEzD,KAAe,GAAqB,IAA0B,CAAC,MAC1E,EAAS,GAAQ,IAAI,cAAc,WAAW;CAAE,SAAS;CAAM,YAAY;CAAM,GAAG;AAAK,CAAC,CAAC,GAEhF,KAAa,GAAqB,IAA0B,CAAC,MACxE,EAAS,GAAQ,IAAI,cAAc,SAAS;CAAE,SAAS;CAAM,YAAY;CAAM,GAAG;AAAK,CAAC,CAAC,GAE9E,KAAc,GAAqB,IAAwB,CAAC,MACvE,EAAS,GAAQ,IAAI,YAAY,UAAU;CAAE,SAAS;CAAM,YAAY;CAAM,GAAG;AAAK,CAAC,CAAC"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./events.cjs"),n=require("./query.cjs"),r=require("./wait.cjs");exports.AssayError=e.AssayError,exports.AssayTimeoutError=e.AssayTimeoutError,exports.createPointerEvent=t.createPointerEvent,exports.fire=t.fire,exports.getSlotted=n.getSlotted,exports.nextTick=r.nextTick,exports.query=n.query,exports.queryAll=n.queryAll,exports.queryAllByTestId=n.queryAllByTestId,exports.queryAllByText=n.queryAllByText,exports.queryAllInShadow=n.queryAllInShadow,exports.queryByTestId=n.queryByTestId,exports.queryByText=n.queryByText,exports.queryInShadow=n.queryInShadow,exports.queryPart=n.queryPart,exports.wait=r.wait,exports.waitFor=r.waitFor,exports.waitForEvent=r.waitForEvent,exports.within=n.within;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./events.cjs"),n=require("./query.cjs"),r=require("./wait.cjs");exports.AssayError=e.AssayError,exports.AssayQueryError=e.AssayQueryError,exports.AssayTimeoutError=e.AssayTimeoutError,exports.delay=r.delay,exports.dispatch=t.dispatch,exports.fireBlur=t.fireBlur,exports.fireChange=t.fireChange,exports.fireClick=t.fireClick,exports.fireCustom=t.fireCustom,exports.fireFocus=t.fireFocus,exports.fireInput=t.fireInput,exports.fireKeyDown=t.fireKeyDown,exports.fireKeyUp=t.fireKeyUp,exports.fireSubmit=t.fireSubmit,exports.getSlotted=n.getSlotted,exports.nextTick=r.nextTick,exports.queryAllInShadow=n.queryAllInShadow,exports.queryInShadow=n.queryInShadow,exports.queryPart=n.queryPart,exports.retry=r.retry,exports.waitForEvent=r.waitForEvent,exports.waitUntil=r.waitUntil,exports.within=n.within;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export { AssayError, AssayTimeoutError } from './errors';
2
- export { fire, createPointerEvent } from './events';
3
- export { within, query, queryAll, queryByTestId, queryAllByTestId, queryByText, queryAllByText, queryInShadow, queryAllInShadow, queryPart, getSlotted, type QueryScope, } from './query';
4
- export { waitFor, waitForEvent, nextTick, wait, type WaitOptions } from './wait';
1
+ export { AssayError, AssayQueryError, AssayTimeoutError } from './errors';
2
+ export { dispatch, fireBlur, fireChange, fireClick, fireCustom, fireFocus, fireInput, fireKeyDown, fireKeyUp, fireSubmit, type CustomEventOptions, } from './events';
3
+ export { within, queryInShadow, queryAllInShadow, queryPart, getSlotted, type QueryScope } from './query';
4
+ export { delay, nextTick, retry, waitForEvent, waitUntil, type DelayOptions, type RetryOptions, type WaitOptions, } from './wait';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEzD,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EACL,MAAM,EACN,KAAK,EACL,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,KAAK,UAAU,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE1E,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,EACV,KAAK,kBAAkB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1G,OAAO,EACL,KAAK,EACL,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,QAAQ,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { AssayError as e, AssayTimeoutError as t } from "./errors.js";
2
- import { createPointerEvent as n, fire as r } from "./events.js";
3
- import { getSlotted as i, query as a, queryAll as o, queryAllByTestId as s, queryAllByText as c, queryAllInShadow as l, queryByTestId as u, queryByText as d, queryInShadow as f, queryPart as p, within as m } from "./query.js";
4
- import { nextTick as h, wait as g, waitFor as _, waitForEvent as v } from "./wait.js";
5
- export { e as AssayError, t as AssayTimeoutError, n as createPointerEvent, r as fire, i as getSlotted, h as nextTick, a as query, o as queryAll, s as queryAllByTestId, c as queryAllByText, l as queryAllInShadow, u as queryByTestId, d as queryByText, f as queryInShadow, p as queryPart, g as wait, _ as waitFor, v as waitForEvent, m as within };
1
+ import { AssayError as e, AssayQueryError as t, AssayTimeoutError as n } from "./errors.js";
2
+ import { dispatch as r, fireBlur as i, fireChange as a, fireClick as o, fireCustom as s, fireFocus as c, fireInput as l, fireKeyDown as u, fireKeyUp as d, fireSubmit as f } from "./events.js";
3
+ import { getSlotted as p, queryAllInShadow as m, queryInShadow as h, queryPart as g, within as _ } from "./query.js";
4
+ import { delay as v, nextTick as y, retry as b, waitForEvent as x, waitUntil as S } from "./wait.js";
5
+ export { e as AssayError, t as AssayQueryError, n as AssayTimeoutError, v as delay, r as dispatch, i as fireBlur, a as fireChange, o as fireClick, s as fireCustom, c as fireFocus, l as fireInput, u as fireKeyDown, d as fireKeyUp, f as fireSubmit, p as getSlotted, y as nextTick, m as queryAllInShadow, h as queryInShadow, g as queryPart, b as retry, x as waitForEvent, S as waitUntil, _ as within };
package/dist/query.cjs CHANGED
@@ -1,2 +1,2 @@
1
- function e(e,t){return e.querySelector(t)}function t(e,t){return Array.from(e.querySelectorAll(t))}function n(e,t){return e.querySelector(`[data-testid="${t}"]`)}function r(e,t){return Array.from(e.querySelectorAll(`[data-testid="${t}"]`))}function i(e,t,n){for(let r of e.querySelectorAll(n))if(r.textContent?.trim()===t)return r;return null}function a(e,t,n){return Array.from(e.querySelectorAll(n)).filter(e=>e.textContent?.trim()===t)}function o(e,t){return e.shadowRoot?.querySelector(t)??null}function s(e,t){return Array.from(e.shadowRoot?.querySelectorAll(t)??[])}function c(e,t){return o(e,`[part="${t}"]`)}function l(e,t){let n=t?`[slot="${t}"]`:`:not([slot])`;return Array.from(e.querySelectorAll(`:scope > ${n}`))}function u(o){return{query:t=>e(o,t),queryAll:e=>t(o,e),queryAllByTestId:e=>r(o,e),queryAllByText:(e,t=`*`)=>a(o,e,t),queryByTestId:e=>n(o,e),queryByText:(e,t=`*`)=>i(o,e,t)}}exports.getSlotted=l,exports.query=e,exports.queryAll=t,exports.queryAllByTestId=r,exports.queryAllByText=a,exports.queryAllInShadow=s,exports.queryByTestId=n,exports.queryByText=i,exports.queryInShadow=o,exports.queryPart=c,exports.within=u;
1
+ const e=require("./errors.cjs");var t=e=>e instanceof Element?e.outerHTML.slice(0,500):e instanceof ShadowRoot?`<shadow-root>${e.innerHTML.slice(0,500)}</shadow-root>`:e.nodeName,n=(n,r,i)=>{if(n)return n;throw new e.AssayQueryError(`Unable to find ${r} within ${t(i)}.`)},r=(e,t)=>e.querySelector(t),i=(e,t)=>Array.from(e.querySelectorAll(t)),a=(e,t)=>i(e,`[data-testid]`).find(e=>e.getAttribute(`data-testid`)===t)??null,o=(e,t)=>i(e,`[data-testid]`).filter(e=>e.getAttribute(`data-testid`)===t),s=(e,t,n=`*`)=>{for(let r of e.querySelectorAll(n))if(r.textContent?.trim()===t)return r;return null},c=(e,t,n=`*`)=>Array.from(e.querySelectorAll(n)).filter(e=>e.textContent?.trim()===t);function l(e,t){return e.shadowRoot?r(e.shadowRoot,t):null}function u(e,t){return e.shadowRoot?i(e.shadowRoot,t):[]}function d(e,t){return u(e,`[part]`).find(e=>e.getAttribute(`part`)?.split(/\s+/).includes(t))??null}function f(e,t){return Array.from(e.children).filter(e=>t===void 0?!e.getAttribute(`slot`):e.getAttribute(`slot`)===t)}function p(e){return{get:t=>n(r(e,t),`"${t}"`,e),getByTestId:t=>n(a(e,t),`data-testid "${t}"`,e),getByText:(t,r=`*`)=>n(s(e,t,r),`text "${t}" matching "${r}"`,e),query:t=>r(e,t),queryAll:t=>i(e,t),queryAllByTestId:t=>o(e,t),queryAllByText:(t,n=`*`)=>c(e,t,n),queryByTestId:t=>a(e,t),queryByText:(t,n=`*`)=>s(e,t,n)}}exports.getSlotted=f,exports.queryAllInShadow=u,exports.queryInShadow=l,exports.queryPart=d,exports.within=p;
2
2
  //# sourceMappingURL=query.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.cjs","names":[],"sources":["../src/query.ts"],"sourcesContent":["/**\n * DOM query helpers for test environments.\n */\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** Scoped query helpers for any DOM element — see {@link within} */\nexport interface QueryScope {\n query<E extends Element = Element>(selector: string): E | null;\n queryAll<E extends Element = Element>(selector: string): E[];\n queryByText<E extends Element = Element>(text: string, selector?: string): E | null;\n queryAllByText<E extends Element = Element>(text: string, selector?: string): E[];\n queryByTestId<E extends Element = Element>(testId: string): E | null;\n queryAllByTestId<E extends Element = Element>(testId: string): E[];\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Query a single element within `root`. Equivalent to `root.querySelector(selector)`. */\nexport function query<E extends Element = Element>(root: Element | ShadowRoot, selector: string): E | null {\n return root.querySelector<E>(selector);\n}\n\n/** Query every element within `root` matching `selector`. */\nexport function queryAll<E extends Element = Element>(root: Element | ShadowRoot, selector: string): E[] {\n return Array.from(root.querySelectorAll<E>(selector));\n}\n\n/** Query a single element within `root` by its `data-testid` attribute. */\nexport function queryByTestId<E extends Element = Element>(root: Element | ShadowRoot, testId: string): E | null {\n return root.querySelector<E>(`[data-testid=\"${testId}\"]`);\n}\n\n/** Query every element within `root` matching a `data-testid` attribute. */\nexport function queryAllByTestId<E extends Element = Element>(root: Element | ShadowRoot, testId: string): E[] {\n return Array.from(root.querySelectorAll<E>(`[data-testid=\"${testId}\"]`));\n}\n\nexport function queryByText<E extends Element = Element>(\n root: Element | ShadowRoot,\n text: string,\n selector: string,\n): E | null {\n for (const el of root.querySelectorAll<E>(selector)) {\n if (el.textContent?.trim() === text) return el;\n }\n\n return null;\n}\n\nexport function queryAllByText<E extends Element = Element>(\n root: Element | ShadowRoot,\n text: string,\n selector: string,\n): E[] {\n return Array.from(root.querySelectorAll<E>(selector)).filter((el) => el.textContent?.trim() === text);\n}\n\n/**\n * Queries the shadow root of a custom element for a matching CSS selector.\n * Returns `null` if the element has no shadow root or no match is found — safe to call on\n * both open-shadow custom elements and plain elements without checking `shadowRoot` first.\n */\nexport function queryInShadow<E extends Element = Element>(host: Element, selector: string): E | null {\n return host.shadowRoot?.querySelector<E>(selector) ?? null;\n}\n\n/** Queries all matching elements inside the shadow root of a custom element. */\nexport function queryAllInShadow<E extends Element = Element>(host: Element, selector: string): E[] {\n return Array.from(host.shadowRoot?.querySelectorAll<E>(selector) ?? []);\n}\n\n/**\n * Queries a shadow DOM element by its CSS `part` attribute — shorthand for\n * `queryInShadow(host, '[part=\"name\"]')`.\n *\n * @example\n * const btn = queryPart(carousel, 'prev-btn');\n * expect(btn).not.toBeNull();\n */\nexport function queryPart<E extends Element = Element>(host: Element, part: string): E | null {\n return queryInShadow<E>(host, `[part=\"${part}\"]`);\n}\n\n/**\n * Returns the light-DOM children assigned to a named slot, or every slotted child (elements\n * with no `slot` attribute) when no name is given.\n *\n * @example\n * const slides = getSlotted(carousel);\n * expect(slides).toHaveLength(3);\n */\nexport function getSlotted<E extends Element = Element>(host: Element, slotName?: string): E[] {\n const selector = slotName ? `[slot=\"${slotName}\"]` : ':not([slot])';\n\n return Array.from(host.querySelectorAll<E>(`:scope > ${selector}`));\n}\n\n// ─── API ─────────────────────────────────────────────────────────────────────\n\n/**\n * Create query helpers scoped to any element — useful for slotted/light DOM content.\n *\n * @example\n * const panel = fixture.query('.panel')!;\n * const { query } = within(panel);\n * expect(query('.title')?.textContent).toBe('Hello');\n */\nexport function within(element: Element): QueryScope {\n return {\n query: <E extends Element = Element>(selector: string) => query<E>(element, selector),\n queryAll: <E extends Element = Element>(selector: string) => queryAll<E>(element, selector),\n queryAllByTestId: <E extends Element = Element>(testId: string) => queryAllByTestId<E>(element, testId),\n queryAllByText: <E extends Element = Element>(text: string, selector = '*') =>\n queryAllByText<E>(element, text, selector),\n queryByTestId: <E extends Element = Element>(testId: string) => queryByTestId<E>(element, testId),\n queryByText: <E extends Element = Element>(text: string, selector = '*') => queryByText<E>(element, text, selector),\n };\n}\n"],"mappings":"AAmBA,SAAgB,EAAmC,EAA4B,EAA4B,CACzG,OAAO,EAAK,cAAiB,CAAQ,CACvC,CAGA,SAAgB,EAAsC,EAA4B,EAAuB,CACvG,OAAO,MAAM,KAAK,EAAK,iBAAoB,CAAQ,CAAC,CACtD,CAGA,SAAgB,EAA2C,EAA4B,EAA0B,CAC/G,OAAO,EAAK,cAAiB,iBAAiB,EAAO,GAAG,CAC1D,CAGA,SAAgB,EAA8C,EAA4B,EAAqB,CAC7G,OAAO,MAAM,KAAK,EAAK,iBAAoB,iBAAiB,EAAO,GAAG,CAAC,CACzE,CAEA,SAAgB,EACd,EACA,EACA,EACU,CACV,IAAK,IAAM,KAAM,EAAK,iBAAoB,CAAQ,EAChD,GAAI,EAAG,aAAa,KAAK,IAAM,EAAM,OAAO,EAG9C,OAAO,IACT,CAEA,SAAgB,EACd,EACA,EACA,EACK,CACL,OAAO,MAAM,KAAK,EAAK,iBAAoB,CAAQ,CAAC,CAAC,CAAC,OAAQ,GAAO,EAAG,aAAa,KAAK,IAAM,CAAI,CACtG,CAOA,SAAgB,EAA2C,EAAe,EAA4B,CACpG,OAAO,EAAK,YAAY,cAAiB,CAAQ,GAAK,IACxD,CAGA,SAAgB,EAA8C,EAAe,EAAuB,CAClG,OAAO,MAAM,KAAK,EAAK,YAAY,iBAAoB,CAAQ,GAAK,CAAC,CAAC,CACxE,CAUA,SAAgB,EAAuC,EAAe,EAAwB,CAC5F,OAAO,EAAiB,EAAM,UAAU,EAAK,GAAG,CAClD,CAUA,SAAgB,EAAwC,EAAe,EAAwB,CAC7F,IAAM,EAAW,EAAW,UAAU,EAAS,IAAM,eAErD,OAAO,MAAM,KAAK,EAAK,iBAAoB,YAAY,GAAU,CAAC,CACpE,CAYA,SAAgB,EAAO,EAA8B,CACnD,MAAO,CACL,MAAqC,GAAqB,EAAS,EAAS,CAAQ,EACpF,SAAwC,GAAqB,EAAY,EAAS,CAAQ,EAC1F,iBAAgD,GAAmB,EAAoB,EAAS,CAAM,EACtG,gBAA8C,EAAc,EAAW,MACrE,EAAkB,EAAS,EAAM,CAAQ,EAC3C,cAA6C,GAAmB,EAAiB,EAAS,CAAM,EAChG,aAA2C,EAAc,EAAW,MAAQ,EAAe,EAAS,EAAM,CAAQ,CACpH,CACF"}
1
+ {"version":3,"file":"query.cjs","names":[],"sources":["../src/query.ts"],"sourcesContent":["import { AssayQueryError } from './errors';\n\n/** DOM query helpers for test environments. */\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** Scoped query helpers for any queryable DOM root — see {@link within}. */\nexport interface QueryScope {\n get<E extends Element = Element>(selector: string): E;\n query<E extends Element = Element>(selector: string): E | null;\n queryAll<E extends Element = Element>(selector: string): E[];\n getByText<E extends Element = Element>(text: string, selector?: string): E;\n queryByText<E extends Element = Element>(text: string, selector?: string): E | null;\n queryAllByText<E extends Element = Element>(text: string, selector?: string): E[];\n getByTestId<E extends Element = Element>(testId: string): E;\n queryByTestId<E extends Element = Element>(testId: string): E | null;\n queryAllByTestId<E extends Element = Element>(testId: string): E[];\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\ntype QueryRoot = ParentNode;\n\nconst describeRoot = (root: QueryRoot): string => {\n if (root instanceof Element) return root.outerHTML.slice(0, 500);\n\n if (root instanceof ShadowRoot) return `<shadow-root>${root.innerHTML.slice(0, 500)}</shadow-root>`;\n\n return root.nodeName;\n};\n\nconst requireMatch = <E extends Element>(element: E | null, description: string, root: QueryRoot): E => {\n if (element) return element;\n\n throw new AssayQueryError(`Unable to find ${description} within ${describeRoot(root)}.`);\n};\n\nconst query = <E extends Element = Element>(root: QueryRoot, selector: string): E | null =>\n root.querySelector<E>(selector);\n\nconst queryAll = <E extends Element = Element>(root: QueryRoot, selector: string): E[] => {\n return Array.from(root.querySelectorAll<E>(selector));\n};\n\nconst queryByTestId = <E extends Element = Element>(root: QueryRoot, testId: string): E | null =>\n queryAll<E>(root, '[data-testid]').find((element) => element.getAttribute('data-testid') === testId) ?? null;\n\nconst queryAllByTestId = <E extends Element = Element>(root: QueryRoot, testId: string): E[] =>\n queryAll<E>(root, '[data-testid]').filter((element) => element.getAttribute('data-testid') === testId);\n\nconst queryByText = <E extends Element = Element>(root: QueryRoot, text: string, selector = '*'): E | null => {\n for (const el of root.querySelectorAll<E>(selector)) {\n if (el.textContent?.trim() === text) return el;\n }\n\n return null;\n};\n\nconst queryAllByText = <E extends Element = Element>(root: QueryRoot, text: string, selector = '*'): E[] => {\n return Array.from(root.querySelectorAll<E>(selector)).filter((el) => el.textContent?.trim() === text);\n};\n\n/**\n * Queries the shadow root of a custom element for a matching CSS selector.\n * Returns `null` if the element has no shadow root or no match is found — safe to call on\n * both open-shadow custom elements and plain elements without checking `shadowRoot` first.\n */\nexport function queryInShadow<E extends Element = Element>(host: Element, selector: string): E | null {\n return host.shadowRoot ? query<E>(host.shadowRoot, selector) : null;\n}\n\n/** Queries all matching elements inside the shadow root of a custom element. */\nexport function queryAllInShadow<E extends Element = Element>(host: Element, selector: string): E[] {\n return host.shadowRoot ? queryAll<E>(host.shadowRoot, selector) : [];\n}\n\n/**\n * Queries a shadow DOM element by its CSS `part` attribute — shorthand for\n * `queryInShadow(host, '[part=\"name\"]')`.\n *\n * @example\n * const btn = queryPart(carousel, 'prev-btn');\n * expect(btn).not.toBeNull();\n */\nexport function queryPart<E extends Element = Element>(host: Element, part: string): E | null {\n return (\n queryAllInShadow<E>(host, '[part]').find((element) => element.getAttribute('part')?.split(/\\s+/).includes(part)) ??\n null\n );\n}\n\n/**\n * Returns the light-DOM children assigned to a named slot, or every child assigned to the\n * default slot when no name is given.\n *\n * @example\n * const slides = getSlotted(carousel);\n * expect(slides).toHaveLength(3);\n */\nexport function getSlotted<E extends Element = Element>(host: Element, slotName?: string): E[] {\n return Array.from(host.children).filter((element) =>\n slotName === undefined ? !element.getAttribute('slot') : element.getAttribute('slot') === slotName,\n ) as E[];\n}\n\n// ─── API ─────────────────────────────────────────────────────────────────────\n\n/**\n * Create query helpers scoped to a DOM root — useful for light DOM and shadow roots.\n *\n * @example\n * const view = within(fixture.shadow!);\n * expect(view.get('.title').textContent).toBe('Hello');\n */\nexport function within(root: QueryRoot): QueryScope {\n return {\n get: <E extends Element = Element>(selector: string) =>\n requireMatch(query<E>(root, selector), `\"${selector}\"`, root),\n getByTestId: <E extends Element = Element>(testId: string) =>\n requireMatch(queryByTestId<E>(root, testId), `data-testid \"${testId}\"`, root),\n getByText: <E extends Element = Element>(text: string, selector = '*') =>\n requireMatch(queryByText<E>(root, text, selector), `text \"${text}\" matching \"${selector}\"`, root),\n query: <E extends Element = Element>(selector: string) => query<E>(root, selector),\n queryAll: <E extends Element = Element>(selector: string) => queryAll<E>(root, selector),\n queryAllByTestId: <E extends Element = Element>(testId: string) => queryAllByTestId<E>(root, testId),\n queryAllByText: <E extends Element = Element>(text: string, selector = '*') =>\n queryAllByText<E>(root, text, selector),\n queryByTestId: <E extends Element = Element>(testId: string) => queryByTestId<E>(root, testId),\n queryByText: <E extends Element = Element>(text: string, selector = '*') => queryByText<E>(root, text, selector),\n };\n}\n"],"mappings":"gCAuBA,IAAM,EAAgB,GAChB,aAAgB,QAAgB,EAAK,UAAU,MAAM,EAAG,GAAG,EAE3D,aAAgB,WAAmB,gBAAgB,EAAK,UAAU,MAAM,EAAG,GAAG,EAAE,gBAE7E,EAAK,SAGR,GAAmC,EAAmB,EAAqB,IAAuB,CACtG,GAAI,EAAS,OAAO,EAEpB,MAAM,IAAI,EAAA,gBAAgB,kBAAkB,EAAY,UAAU,EAAa,CAAI,EAAE,EAAE,CACzF,EAEM,GAAsC,EAAiB,IAC3D,EAAK,cAAiB,CAAQ,EAE1B,GAAyC,EAAiB,IACvD,MAAM,KAAK,EAAK,iBAAoB,CAAQ,CAAC,EAGhD,GAA8C,EAAiB,IACnE,EAAY,EAAM,eAAe,CAAC,CAAC,KAAM,GAAY,EAAQ,aAAa,aAAa,IAAM,CAAM,GAAK,KAEpG,GAAiD,EAAiB,IACtE,EAAY,EAAM,eAAe,CAAC,CAAC,OAAQ,GAAY,EAAQ,aAAa,aAAa,IAAM,CAAM,EAEjG,GAA4C,EAAiB,EAAc,EAAW,MAAkB,CAC5G,IAAK,IAAM,KAAM,EAAK,iBAAoB,CAAQ,EAChD,GAAI,EAAG,aAAa,KAAK,IAAM,EAAM,OAAO,EAG9C,OAAO,IACT,EAEM,GAA+C,EAAiB,EAAc,EAAW,MACtF,MAAM,KAAK,EAAK,iBAAoB,CAAQ,CAAC,CAAC,CAAC,OAAQ,GAAO,EAAG,aAAa,KAAK,IAAM,CAAI,EAQtG,SAAgB,EAA2C,EAAe,EAA4B,CACpG,OAAO,EAAK,WAAa,EAAS,EAAK,WAAY,CAAQ,EAAI,IACjE,CAGA,SAAgB,EAA8C,EAAe,EAAuB,CAClG,OAAO,EAAK,WAAa,EAAY,EAAK,WAAY,CAAQ,EAAI,CAAC,CACrE,CAUA,SAAgB,EAAuC,EAAe,EAAwB,CAC5F,OACE,EAAoB,EAAM,QAAQ,CAAC,CAAC,KAAM,GAAY,EAAQ,aAAa,MAAM,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC,SAAS,CAAI,CAAC,GAC/G,IAEJ,CAUA,SAAgB,EAAwC,EAAe,EAAwB,CAC7F,OAAO,MAAM,KAAK,EAAK,QAAQ,CAAC,CAAC,OAAQ,GACvC,IAAa,IAAA,GAAY,CAAC,EAAQ,aAAa,MAAM,EAAI,EAAQ,aAAa,MAAM,IAAM,CAC5F,CACF,CAWA,SAAgB,EAAO,EAA6B,CAClD,MAAO,CACL,IAAmC,GACjC,EAAa,EAAS,EAAM,CAAQ,EAAG,IAAI,EAAS,GAAI,CAAI,EAC9D,YAA2C,GACzC,EAAa,EAAiB,EAAM,CAAM,EAAG,gBAAgB,EAAO,GAAI,CAAI,EAC9E,WAAyC,EAAc,EAAW,MAChE,EAAa,EAAe,EAAM,EAAM,CAAQ,EAAG,SAAS,EAAK,cAAc,EAAS,GAAI,CAAI,EAClG,MAAqC,GAAqB,EAAS,EAAM,CAAQ,EACjF,SAAwC,GAAqB,EAAY,EAAM,CAAQ,EACvF,iBAAgD,GAAmB,EAAoB,EAAM,CAAM,EACnG,gBAA8C,EAAc,EAAW,MACrE,EAAkB,EAAM,EAAM,CAAQ,EACxC,cAA6C,GAAmB,EAAiB,EAAM,CAAM,EAC7F,aAA2C,EAAc,EAAW,MAAQ,EAAe,EAAM,EAAM,CAAQ,CACjH,CACF"}
package/dist/query.d.ts CHANGED
@@ -1,25 +1,17 @@
1
- /**
2
- * DOM query helpers for test environments.
3
- */
4
- /** Scoped query helpers for any DOM element — see {@link within} */
1
+ /** DOM query helpers for test environments. */
2
+ /** Scoped query helpers for any queryable DOM root — see {@link within}. */
5
3
  export interface QueryScope {
4
+ get<E extends Element = Element>(selector: string): E;
6
5
  query<E extends Element = Element>(selector: string): E | null;
7
6
  queryAll<E extends Element = Element>(selector: string): E[];
7
+ getByText<E extends Element = Element>(text: string, selector?: string): E;
8
8
  queryByText<E extends Element = Element>(text: string, selector?: string): E | null;
9
9
  queryAllByText<E extends Element = Element>(text: string, selector?: string): E[];
10
+ getByTestId<E extends Element = Element>(testId: string): E;
10
11
  queryByTestId<E extends Element = Element>(testId: string): E | null;
11
12
  queryAllByTestId<E extends Element = Element>(testId: string): E[];
12
13
  }
13
- /** Query a single element within `root`. Equivalent to `root.querySelector(selector)`. */
14
- export declare function query<E extends Element = Element>(root: Element | ShadowRoot, selector: string): E | null;
15
- /** Query every element within `root` matching `selector`. */
16
- export declare function queryAll<E extends Element = Element>(root: Element | ShadowRoot, selector: string): E[];
17
- /** Query a single element within `root` by its `data-testid` attribute. */
18
- export declare function queryByTestId<E extends Element = Element>(root: Element | ShadowRoot, testId: string): E | null;
19
- /** Query every element within `root` matching a `data-testid` attribute. */
20
- export declare function queryAllByTestId<E extends Element = Element>(root: Element | ShadowRoot, testId: string): E[];
21
- export declare function queryByText<E extends Element = Element>(root: Element | ShadowRoot, text: string, selector: string): E | null;
22
- export declare function queryAllByText<E extends Element = Element>(root: Element | ShadowRoot, text: string, selector: string): E[];
14
+ type QueryRoot = ParentNode;
23
15
  /**
24
16
  * Queries the shadow root of a custom element for a matching CSS selector.
25
17
  * Returns `null` if the element has no shadow root or no match is found — safe to call on
@@ -38,8 +30,8 @@ export declare function queryAllInShadow<E extends Element = Element>(host: Elem
38
30
  */
39
31
  export declare function queryPart<E extends Element = Element>(host: Element, part: string): E | null;
40
32
  /**
41
- * Returns the light-DOM children assigned to a named slot, or every slotted child (elements
42
- * with no `slot` attribute) when no name is given.
33
+ * Returns the light-DOM children assigned to a named slot, or every child assigned to the
34
+ * default slot when no name is given.
43
35
  *
44
36
  * @example
45
37
  * const slides = getSlotted(carousel);
@@ -47,12 +39,12 @@ export declare function queryPart<E extends Element = Element>(host: Element, pa
47
39
  */
48
40
  export declare function getSlotted<E extends Element = Element>(host: Element, slotName?: string): E[];
49
41
  /**
50
- * Create query helpers scoped to any element — useful for slotted/light DOM content.
42
+ * Create query helpers scoped to a DOM root — useful for light DOM and shadow roots.
51
43
  *
52
44
  * @example
53
- * const panel = fixture.query('.panel')!;
54
- * const { query } = within(panel);
55
- * expect(query('.title')?.textContent).toBe('Hello');
45
+ * const view = within(fixture.shadow!);
46
+ * expect(view.get('.title').textContent).toBe('Hello');
56
47
  */
57
- export declare function within(element: Element): QueryScope;
48
+ export declare function within(root: QueryRoot): QueryScope;
49
+ export {};
58
50
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,oEAAoE;AACpE,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IAC/D,QAAQ,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;IAC7D,WAAW,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IACpF,cAAc,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;IAClF,aAAa,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IACrE,gBAAgB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACpE;AAID,0FAA0F;AAC1F,wBAAgB,KAAK,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAEzG;AAED,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAEvG;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAE/G;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAE7G;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EACrD,IAAI,EAAE,OAAO,GAAG,UAAU,EAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,CAAC,GAAG,IAAI,CAMV;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EACxD,IAAI,EAAE,OAAO,GAAG,UAAU,EAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,CAAC,EAAE,CAEL;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAEpG;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAElG;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAE5F;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAI7F;AAID;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAUnD"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAEA,+CAA+C;AAI/C,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC;IACtD,KAAK,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IAC/D,QAAQ,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;IAC7D,SAAS,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IAC3E,WAAW,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IACpF,cAAc,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;IAClF,WAAW,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC;IAC5D,aAAa,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IACrE,gBAAgB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;CACpE;AAID,KAAK,SAAS,GAAG,UAAU,CAAC;AAyC5B;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAEpG;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAElG;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAK5F;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAI7F;AAID;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,CAgBlD"}
package/dist/query.js CHANGED
@@ -1,47 +1,38 @@
1
+ import { AssayQueryError as e } from "./errors.js";
1
2
  //#region src/query.ts
2
- function e(e, t) {
3
- return e.querySelector(t);
4
- }
5
- function t(e, t) {
6
- return Array.from(e.querySelectorAll(t));
7
- }
8
- function n(e, t) {
9
- return e.querySelector(`[data-testid="${t}"]`);
10
- }
11
- function r(e, t) {
12
- return Array.from(e.querySelectorAll(`[data-testid="${t}"]`));
13
- }
14
- function i(e, t, n) {
3
+ var t = (e) => e instanceof Element ? e.outerHTML.slice(0, 500) : e instanceof ShadowRoot ? `<shadow-root>${e.innerHTML.slice(0, 500)}</shadow-root>` : e.nodeName, n = (n, r, i) => {
4
+ if (n) return n;
5
+ throw new e(`Unable to find ${r} within ${t(i)}.`);
6
+ }, r = (e, t) => e.querySelector(t), i = (e, t) => Array.from(e.querySelectorAll(t)), a = (e, t) => i(e, "[data-testid]").find((e) => e.getAttribute("data-testid") === t) ?? null, o = (e, t) => i(e, "[data-testid]").filter((e) => e.getAttribute("data-testid") === t), s = (e, t, n = "*") => {
15
7
  for (let r of e.querySelectorAll(n)) if (r.textContent?.trim() === t) return r;
16
8
  return null;
9
+ }, c = (e, t, n = "*") => Array.from(e.querySelectorAll(n)).filter((e) => e.textContent?.trim() === t);
10
+ function l(e, t) {
11
+ return e.shadowRoot ? r(e.shadowRoot, t) : null;
17
12
  }
18
- function a(e, t, n) {
19
- return Array.from(e.querySelectorAll(n)).filter((e) => e.textContent?.trim() === t);
20
- }
21
- function o(e, t) {
22
- return e.shadowRoot?.querySelector(t) ?? null;
23
- }
24
- function s(e, t) {
25
- return Array.from(e.shadowRoot?.querySelectorAll(t) ?? []);
13
+ function u(e, t) {
14
+ return e.shadowRoot ? i(e.shadowRoot, t) : [];
26
15
  }
27
- function c(e, t) {
28
- return o(e, `[part="${t}"]`);
16
+ function d(e, t) {
17
+ return u(e, "[part]").find((e) => e.getAttribute("part")?.split(/\s+/).includes(t)) ?? null;
29
18
  }
30
- function l(e, t) {
31
- let n = t ? `[slot="${t}"]` : ":not([slot])";
32
- return Array.from(e.querySelectorAll(`:scope > ${n}`));
19
+ function f(e, t) {
20
+ return Array.from(e.children).filter((e) => t === void 0 ? !e.getAttribute("slot") : e.getAttribute("slot") === t);
33
21
  }
34
- function u(o) {
22
+ function p(e) {
35
23
  return {
36
- query: (t) => e(o, t),
37
- queryAll: (e) => t(o, e),
38
- queryAllByTestId: (e) => r(o, e),
39
- queryAllByText: (e, t = "*") => a(o, e, t),
40
- queryByTestId: (e) => n(o, e),
41
- queryByText: (e, t = "*") => i(o, e, t)
24
+ get: (t) => n(r(e, t), `"${t}"`, e),
25
+ getByTestId: (t) => n(a(e, t), `data-testid "${t}"`, e),
26
+ getByText: (t, r = "*") => n(s(e, t, r), `text "${t}" matching "${r}"`, e),
27
+ query: (t) => r(e, t),
28
+ queryAll: (t) => i(e, t),
29
+ queryAllByTestId: (t) => o(e, t),
30
+ queryAllByText: (t, n = "*") => c(e, t, n),
31
+ queryByTestId: (t) => a(e, t),
32
+ queryByText: (t, n = "*") => s(e, t, n)
42
33
  };
43
34
  }
44
35
  //#endregion
45
- export { l as getSlotted, e as query, t as queryAll, r as queryAllByTestId, a as queryAllByText, s as queryAllInShadow, n as queryByTestId, i as queryByText, o as queryInShadow, c as queryPart, u as within };
36
+ export { f as getSlotted, u as queryAllInShadow, l as queryInShadow, d as queryPart, p as within };
46
37
 
47
38
  //# sourceMappingURL=query.js.map
package/dist/query.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","names":[],"sources":["../src/query.ts"],"sourcesContent":["/**\n * DOM query helpers for test environments.\n */\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** Scoped query helpers for any DOM element — see {@link within} */\nexport interface QueryScope {\n query<E extends Element = Element>(selector: string): E | null;\n queryAll<E extends Element = Element>(selector: string): E[];\n queryByText<E extends Element = Element>(text: string, selector?: string): E | null;\n queryAllByText<E extends Element = Element>(text: string, selector?: string): E[];\n queryByTestId<E extends Element = Element>(testId: string): E | null;\n queryAllByTestId<E extends Element = Element>(testId: string): E[];\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Query a single element within `root`. Equivalent to `root.querySelector(selector)`. */\nexport function query<E extends Element = Element>(root: Element | ShadowRoot, selector: string): E | null {\n return root.querySelector<E>(selector);\n}\n\n/** Query every element within `root` matching `selector`. */\nexport function queryAll<E extends Element = Element>(root: Element | ShadowRoot, selector: string): E[] {\n return Array.from(root.querySelectorAll<E>(selector));\n}\n\n/** Query a single element within `root` by its `data-testid` attribute. */\nexport function queryByTestId<E extends Element = Element>(root: Element | ShadowRoot, testId: string): E | null {\n return root.querySelector<E>(`[data-testid=\"${testId}\"]`);\n}\n\n/** Query every element within `root` matching a `data-testid` attribute. */\nexport function queryAllByTestId<E extends Element = Element>(root: Element | ShadowRoot, testId: string): E[] {\n return Array.from(root.querySelectorAll<E>(`[data-testid=\"${testId}\"]`));\n}\n\nexport function queryByText<E extends Element = Element>(\n root: Element | ShadowRoot,\n text: string,\n selector: string,\n): E | null {\n for (const el of root.querySelectorAll<E>(selector)) {\n if (el.textContent?.trim() === text) return el;\n }\n\n return null;\n}\n\nexport function queryAllByText<E extends Element = Element>(\n root: Element | ShadowRoot,\n text: string,\n selector: string,\n): E[] {\n return Array.from(root.querySelectorAll<E>(selector)).filter((el) => el.textContent?.trim() === text);\n}\n\n/**\n * Queries the shadow root of a custom element for a matching CSS selector.\n * Returns `null` if the element has no shadow root or no match is found — safe to call on\n * both open-shadow custom elements and plain elements without checking `shadowRoot` first.\n */\nexport function queryInShadow<E extends Element = Element>(host: Element, selector: string): E | null {\n return host.shadowRoot?.querySelector<E>(selector) ?? null;\n}\n\n/** Queries all matching elements inside the shadow root of a custom element. */\nexport function queryAllInShadow<E extends Element = Element>(host: Element, selector: string): E[] {\n return Array.from(host.shadowRoot?.querySelectorAll<E>(selector) ?? []);\n}\n\n/**\n * Queries a shadow DOM element by its CSS `part` attribute — shorthand for\n * `queryInShadow(host, '[part=\"name\"]')`.\n *\n * @example\n * const btn = queryPart(carousel, 'prev-btn');\n * expect(btn).not.toBeNull();\n */\nexport function queryPart<E extends Element = Element>(host: Element, part: string): E | null {\n return queryInShadow<E>(host, `[part=\"${part}\"]`);\n}\n\n/**\n * Returns the light-DOM children assigned to a named slot, or every slotted child (elements\n * with no `slot` attribute) when no name is given.\n *\n * @example\n * const slides = getSlotted(carousel);\n * expect(slides).toHaveLength(3);\n */\nexport function getSlotted<E extends Element = Element>(host: Element, slotName?: string): E[] {\n const selector = slotName ? `[slot=\"${slotName}\"]` : ':not([slot])';\n\n return Array.from(host.querySelectorAll<E>(`:scope > ${selector}`));\n}\n\n// ─── API ─────────────────────────────────────────────────────────────────────\n\n/**\n * Create query helpers scoped to any element — useful for slotted/light DOM content.\n *\n * @example\n * const panel = fixture.query('.panel')!;\n * const { query } = within(panel);\n * expect(query('.title')?.textContent).toBe('Hello');\n */\nexport function within(element: Element): QueryScope {\n return {\n query: <E extends Element = Element>(selector: string) => query<E>(element, selector),\n queryAll: <E extends Element = Element>(selector: string) => queryAll<E>(element, selector),\n queryAllByTestId: <E extends Element = Element>(testId: string) => queryAllByTestId<E>(element, testId),\n queryAllByText: <E extends Element = Element>(text: string, selector = '*') =>\n queryAllByText<E>(element, text, selector),\n queryByTestId: <E extends Element = Element>(testId: string) => queryByTestId<E>(element, testId),\n queryByText: <E extends Element = Element>(text: string, selector = '*') => queryByText<E>(element, text, selector),\n };\n}\n"],"mappings":";AAmBA,SAAgB,EAAmC,GAA4B,GAA4B;CACzG,OAAO,EAAK,cAAiB,CAAQ;AACvC;AAGA,SAAgB,EAAsC,GAA4B,GAAuB;CACvG,OAAO,MAAM,KAAK,EAAK,iBAAoB,CAAQ,CAAC;AACtD;AAGA,SAAgB,EAA2C,GAA4B,GAA0B;CAC/G,OAAO,EAAK,cAAiB,iBAAiB,EAAO,GAAG;AAC1D;AAGA,SAAgB,EAA8C,GAA4B,GAAqB;CAC7G,OAAO,MAAM,KAAK,EAAK,iBAAoB,iBAAiB,EAAO,GAAG,CAAC;AACzE;AAEA,SAAgB,EACd,GACA,GACA,GACU;CACV,KAAK,IAAM,KAAM,EAAK,iBAAoB,CAAQ,GAChD,IAAI,EAAG,aAAa,KAAK,MAAM,GAAM,OAAO;CAG9C,OAAO;AACT;AAEA,SAAgB,EACd,GACA,GACA,GACK;CACL,OAAO,MAAM,KAAK,EAAK,iBAAoB,CAAQ,CAAC,CAAC,CAAC,QAAQ,MAAO,EAAG,aAAa,KAAK,MAAM,CAAI;AACtG;AAOA,SAAgB,EAA2C,GAAe,GAA4B;CACpG,OAAO,EAAK,YAAY,cAAiB,CAAQ,KAAK;AACxD;AAGA,SAAgB,EAA8C,GAAe,GAAuB;CAClG,OAAO,MAAM,KAAK,EAAK,YAAY,iBAAoB,CAAQ,KAAK,CAAC,CAAC;AACxE;AAUA,SAAgB,EAAuC,GAAe,GAAwB;CAC5F,OAAO,EAAiB,GAAM,UAAU,EAAK,GAAG;AAClD;AAUA,SAAgB,EAAwC,GAAe,GAAwB;CAC7F,IAAM,IAAW,IAAW,UAAU,EAAS,MAAM;CAErD,OAAO,MAAM,KAAK,EAAK,iBAAoB,YAAY,GAAU,CAAC;AACpE;AAYA,SAAgB,EAAO,GAA8B;CACnD,OAAO;EACL,QAAqC,MAAqB,EAAS,GAAS,CAAQ;EACpF,WAAwC,MAAqB,EAAY,GAAS,CAAQ;EAC1F,mBAAgD,MAAmB,EAAoB,GAAS,CAAM;EACtG,iBAA8C,GAAc,IAAW,QACrE,EAAkB,GAAS,GAAM,CAAQ;EAC3C,gBAA6C,MAAmB,EAAiB,GAAS,CAAM;EAChG,cAA2C,GAAc,IAAW,QAAQ,EAAe,GAAS,GAAM,CAAQ;CACpH;AACF"}
1
+ {"version":3,"file":"query.js","names":[],"sources":["../src/query.ts"],"sourcesContent":["import { AssayQueryError } from './errors';\n\n/** DOM query helpers for test environments. */\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** Scoped query helpers for any queryable DOM root — see {@link within}. */\nexport interface QueryScope {\n get<E extends Element = Element>(selector: string): E;\n query<E extends Element = Element>(selector: string): E | null;\n queryAll<E extends Element = Element>(selector: string): E[];\n getByText<E extends Element = Element>(text: string, selector?: string): E;\n queryByText<E extends Element = Element>(text: string, selector?: string): E | null;\n queryAllByText<E extends Element = Element>(text: string, selector?: string): E[];\n getByTestId<E extends Element = Element>(testId: string): E;\n queryByTestId<E extends Element = Element>(testId: string): E | null;\n queryAllByTestId<E extends Element = Element>(testId: string): E[];\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\ntype QueryRoot = ParentNode;\n\nconst describeRoot = (root: QueryRoot): string => {\n if (root instanceof Element) return root.outerHTML.slice(0, 500);\n\n if (root instanceof ShadowRoot) return `<shadow-root>${root.innerHTML.slice(0, 500)}</shadow-root>`;\n\n return root.nodeName;\n};\n\nconst requireMatch = <E extends Element>(element: E | null, description: string, root: QueryRoot): E => {\n if (element) return element;\n\n throw new AssayQueryError(`Unable to find ${description} within ${describeRoot(root)}.`);\n};\n\nconst query = <E extends Element = Element>(root: QueryRoot, selector: string): E | null =>\n root.querySelector<E>(selector);\n\nconst queryAll = <E extends Element = Element>(root: QueryRoot, selector: string): E[] => {\n return Array.from(root.querySelectorAll<E>(selector));\n};\n\nconst queryByTestId = <E extends Element = Element>(root: QueryRoot, testId: string): E | null =>\n queryAll<E>(root, '[data-testid]').find((element) => element.getAttribute('data-testid') === testId) ?? null;\n\nconst queryAllByTestId = <E extends Element = Element>(root: QueryRoot, testId: string): E[] =>\n queryAll<E>(root, '[data-testid]').filter((element) => element.getAttribute('data-testid') === testId);\n\nconst queryByText = <E extends Element = Element>(root: QueryRoot, text: string, selector = '*'): E | null => {\n for (const el of root.querySelectorAll<E>(selector)) {\n if (el.textContent?.trim() === text) return el;\n }\n\n return null;\n};\n\nconst queryAllByText = <E extends Element = Element>(root: QueryRoot, text: string, selector = '*'): E[] => {\n return Array.from(root.querySelectorAll<E>(selector)).filter((el) => el.textContent?.trim() === text);\n};\n\n/**\n * Queries the shadow root of a custom element for a matching CSS selector.\n * Returns `null` if the element has no shadow root or no match is found — safe to call on\n * both open-shadow custom elements and plain elements without checking `shadowRoot` first.\n */\nexport function queryInShadow<E extends Element = Element>(host: Element, selector: string): E | null {\n return host.shadowRoot ? query<E>(host.shadowRoot, selector) : null;\n}\n\n/** Queries all matching elements inside the shadow root of a custom element. */\nexport function queryAllInShadow<E extends Element = Element>(host: Element, selector: string): E[] {\n return host.shadowRoot ? queryAll<E>(host.shadowRoot, selector) : [];\n}\n\n/**\n * Queries a shadow DOM element by its CSS `part` attribute — shorthand for\n * `queryInShadow(host, '[part=\"name\"]')`.\n *\n * @example\n * const btn = queryPart(carousel, 'prev-btn');\n * expect(btn).not.toBeNull();\n */\nexport function queryPart<E extends Element = Element>(host: Element, part: string): E | null {\n return (\n queryAllInShadow<E>(host, '[part]').find((element) => element.getAttribute('part')?.split(/\\s+/).includes(part)) ??\n null\n );\n}\n\n/**\n * Returns the light-DOM children assigned to a named slot, or every child assigned to the\n * default slot when no name is given.\n *\n * @example\n * const slides = getSlotted(carousel);\n * expect(slides).toHaveLength(3);\n */\nexport function getSlotted<E extends Element = Element>(host: Element, slotName?: string): E[] {\n return Array.from(host.children).filter((element) =>\n slotName === undefined ? !element.getAttribute('slot') : element.getAttribute('slot') === slotName,\n ) as E[];\n}\n\n// ─── API ─────────────────────────────────────────────────────────────────────\n\n/**\n * Create query helpers scoped to a DOM root — useful for light DOM and shadow roots.\n *\n * @example\n * const view = within(fixture.shadow!);\n * expect(view.get('.title').textContent).toBe('Hello');\n */\nexport function within(root: QueryRoot): QueryScope {\n return {\n get: <E extends Element = Element>(selector: string) =>\n requireMatch(query<E>(root, selector), `\"${selector}\"`, root),\n getByTestId: <E extends Element = Element>(testId: string) =>\n requireMatch(queryByTestId<E>(root, testId), `data-testid \"${testId}\"`, root),\n getByText: <E extends Element = Element>(text: string, selector = '*') =>\n requireMatch(queryByText<E>(root, text, selector), `text \"${text}\" matching \"${selector}\"`, root),\n query: <E extends Element = Element>(selector: string) => query<E>(root, selector),\n queryAll: <E extends Element = Element>(selector: string) => queryAll<E>(root, selector),\n queryAllByTestId: <E extends Element = Element>(testId: string) => queryAllByTestId<E>(root, testId),\n queryAllByText: <E extends Element = Element>(text: string, selector = '*') =>\n queryAllByText<E>(root, text, selector),\n queryByTestId: <E extends Element = Element>(testId: string) => queryByTestId<E>(root, testId),\n queryByText: <E extends Element = Element>(text: string, selector = '*') => queryByText<E>(root, text, selector),\n };\n}\n"],"mappings":";;AAuBA,IAAM,KAAgB,MAChB,aAAgB,UAAgB,EAAK,UAAU,MAAM,GAAG,GAAG,IAE3D,aAAgB,aAAmB,gBAAgB,EAAK,UAAU,MAAM,GAAG,GAAG,EAAE,kBAE7E,EAAK,UAGR,KAAmC,GAAmB,GAAqB,MAAuB;CACtG,IAAI,GAAS,OAAO;CAEpB,MAAM,IAAI,EAAgB,kBAAkB,EAAY,UAAU,EAAa,CAAI,EAAE,EAAE;AACzF,GAEM,KAAsC,GAAiB,MAC3D,EAAK,cAAiB,CAAQ,GAE1B,KAAyC,GAAiB,MACvD,MAAM,KAAK,EAAK,iBAAoB,CAAQ,CAAC,GAGhD,KAA8C,GAAiB,MACnE,EAAY,GAAM,eAAe,CAAC,CAAC,MAAM,MAAY,EAAQ,aAAa,aAAa,MAAM,CAAM,KAAK,MAEpG,KAAiD,GAAiB,MACtE,EAAY,GAAM,eAAe,CAAC,CAAC,QAAQ,MAAY,EAAQ,aAAa,aAAa,MAAM,CAAM,GAEjG,KAA4C,GAAiB,GAAc,IAAW,QAAkB;CAC5G,KAAK,IAAM,KAAM,EAAK,iBAAoB,CAAQ,GAChD,IAAI,EAAG,aAAa,KAAK,MAAM,GAAM,OAAO;CAG9C,OAAO;AACT,GAEM,KAA+C,GAAiB,GAAc,IAAW,QACtF,MAAM,KAAK,EAAK,iBAAoB,CAAQ,CAAC,CAAC,CAAC,QAAQ,MAAO,EAAG,aAAa,KAAK,MAAM,CAAI;AAQtG,SAAgB,EAA2C,GAAe,GAA4B;CACpG,OAAO,EAAK,aAAa,EAAS,EAAK,YAAY,CAAQ,IAAI;AACjE;AAGA,SAAgB,EAA8C,GAAe,GAAuB;CAClG,OAAO,EAAK,aAAa,EAAY,EAAK,YAAY,CAAQ,IAAI,CAAC;AACrE;AAUA,SAAgB,EAAuC,GAAe,GAAwB;CAC5F,OACE,EAAoB,GAAM,QAAQ,CAAC,CAAC,MAAM,MAAY,EAAQ,aAAa,MAAM,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC,SAAS,CAAI,CAAC,KAC/G;AAEJ;AAUA,SAAgB,EAAwC,GAAe,GAAwB;CAC7F,OAAO,MAAM,KAAK,EAAK,QAAQ,CAAC,CAAC,QAAQ,MACvC,MAAa,KAAA,IAAY,CAAC,EAAQ,aAAa,MAAM,IAAI,EAAQ,aAAa,MAAM,MAAM,CAC5F;AACF;AAWA,SAAgB,EAAO,GAA6B;CAClD,OAAO;EACL,MAAmC,MACjC,EAAa,EAAS,GAAM,CAAQ,GAAG,IAAI,EAAS,IAAI,CAAI;EAC9D,cAA2C,MACzC,EAAa,EAAiB,GAAM,CAAM,GAAG,gBAAgB,EAAO,IAAI,CAAI;EAC9E,YAAyC,GAAc,IAAW,QAChE,EAAa,EAAe,GAAM,GAAM,CAAQ,GAAG,SAAS,EAAK,cAAc,EAAS,IAAI,CAAI;EAClG,QAAqC,MAAqB,EAAS,GAAM,CAAQ;EACjF,WAAwC,MAAqB,EAAY,GAAM,CAAQ;EACvF,mBAAgD,MAAmB,EAAoB,GAAM,CAAM;EACnG,iBAA8C,GAAc,IAAW,QACrE,EAAkB,GAAM,GAAM,CAAQ;EACxC,gBAA6C,MAAmB,EAAiB,GAAM,CAAM;EAC7F,cAA2C,GAAc,IAAW,QAAQ,EAAe,GAAM,GAAM,CAAQ;CACjH;AACF"}
package/dist/wait.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const e=require("./errors.cjs");async function t(t,{interval:n=50,message:r,timeout:a=1e3}={}){let o=Date.now()+a,s;for(;;){try{let e=await t();if(e===void 0||e)return}catch(e){s=e}if(Date.now()>=o)break;await i(n)}let c=`waitFor timed out after ${a}ms`,l=r?`${r} (${c})`:c,u=s instanceof Error?s.message:s==null?void 0:String(s);throw new e.AssayTimeoutError(u?`${l}\n${u}`:l,{cause:s})}function n(t,n,r=1e3){return new Promise((i,a)=>{let o=e=>{clearTimeout(s),i(e)},s=setTimeout(()=>{t.removeEventListener(n,o),a(new e.AssayTimeoutError(`waitForEvent: "${n}" timed out after ${r}ms`))},r);t.addEventListener(n,o,{once:!0})})}var r=()=>new Promise(e=>{queueMicrotask(e)}),i=(e=0)=>new Promise(t=>{setTimeout(t,e)});exports.nextTick=r,exports.wait=i,exports.waitFor=t,exports.waitForEvent=n;
1
+ const e=require("./errors.cjs");var t=e=>e.reason??new DOMException(`The operation was aborted.`,`AbortError`),n=(e=0,{signal:n}={})=>new Promise((r,i)=>{if(n?.aborted){i(t(n));return}let a=setTimeout(o,e);function o(){n?.removeEventListener(`abort`,s),r()}function s(){clearTimeout(a),i(t(n))}n?.addEventListener(`abort`,s,{once:!0})});async function r(r,{interval:i=50,signal:a,timeout:o=1e3}={}){let s=Date.now()+o;for(;;){if(a?.aborted)throw t(a);if(await r())return;if(Date.now()>=s)break;await n(i,{signal:a})}throw new e.AssayTimeoutError(`waitUntil timed out after ${o}ms`)}async function i(r,{interval:i=50,message:a,signal:o,timeout:s=1e3}={}){let c=Date.now()+s,l;for(;;){if(o?.aborted)throw t(o);try{await r();return}catch(e){l=e}if(Date.now()>=c)break;await n(i,{signal:o})}let u=`retry timed out after ${s}ms`,d=a?`${a} (${u})`:u,f=l instanceof Error?l.message:l==null?``:String(l);throw new e.AssayTimeoutError(f?`${d}\n${f}`:d,{cause:l})}function a(n,r,{signal:i,timeout:a=1e3}={}){return new Promise((o,s)=>{if(i?.aborted){s(t(i));return}let c=()=>{clearTimeout(u),i?.removeEventListener(`abort`,d),n.removeEventListener(r,l)},l=e=>{c(),o(e)},u=setTimeout(()=>{c(),s(new e.AssayTimeoutError(`waitForEvent: "${r}" timed out after ${a}ms`))},a),d=()=>{c(),s(t(i))};n.addEventListener(r,l,{once:!0}),i?.addEventListener(`abort`,d,{once:!0})})}var o=()=>new Promise(e=>{queueMicrotask(e)});exports.delay=n,exports.nextTick=o,exports.retry=i,exports.waitForEvent=a,exports.waitUntil=r;
2
2
  //# sourceMappingURL=wait.cjs.map