@vielzeug/ore 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/dist/aria.cjs +1 -1
  2. package/dist/aria.cjs.map +1 -1
  3. package/dist/aria.d.ts +9 -8
  4. package/dist/aria.d.ts.map +1 -1
  5. package/dist/aria.js +1 -1
  6. package/dist/aria.js.map +1 -1
  7. package/dist/base-element.cjs +1 -1
  8. package/dist/base-element.cjs.map +1 -1
  9. package/dist/base-element.d.ts.map +1 -1
  10. package/dist/base-element.js +1 -1
  11. package/dist/base-element.js.map +1 -1
  12. package/dist/directives/classMap.cjs +1 -1
  13. package/dist/directives/classMap.cjs.map +1 -1
  14. package/dist/directives/classMap.d.ts.map +1 -1
  15. package/dist/directives/classMap.js +1 -1
  16. package/dist/directives/classMap.js.map +1 -1
  17. package/dist/directives/each.cjs +1 -1
  18. package/dist/directives/each.cjs.map +1 -1
  19. package/dist/directives/each.d.ts +8 -1
  20. package/dist/directives/each.d.ts.map +1 -1
  21. package/dist/directives/each.js +1 -1
  22. package/dist/directives/each.js.map +1 -1
  23. package/dist/directives/index.d.ts +34 -5
  24. package/dist/directives/index.d.ts.map +1 -1
  25. package/dist/directives/raw.cjs +1 -1
  26. package/dist/directives/raw.cjs.map +1 -1
  27. package/dist/directives/raw.js +1 -1
  28. package/dist/directives/raw.js.map +1 -1
  29. package/dist/directives/styleMap.cjs +1 -1
  30. package/dist/directives/styleMap.cjs.map +1 -1
  31. package/dist/directives/styleMap.d.ts.map +1 -1
  32. package/dist/directives/styleMap.js +1 -1
  33. package/dist/directives/styleMap.js.map +1 -1
  34. package/dist/directives/when.cjs +1 -1
  35. package/dist/directives/when.cjs.map +1 -1
  36. package/dist/directives/when.d.ts.map +1 -1
  37. package/dist/directives/when.js +1 -1
  38. package/dist/directives/when.js.map +1 -1
  39. package/dist/directives.cjs +1 -1
  40. package/dist/directives.js +1 -1
  41. package/dist/errors.cjs.map +1 -1
  42. package/dist/errors.d.ts +16 -3
  43. package/dist/errors.d.ts.map +1 -1
  44. package/dist/errors.js.map +1 -1
  45. package/dist/host-bind.cjs +1 -1
  46. package/dist/host-bind.cjs.map +1 -1
  47. package/dist/host-bind.d.ts +6 -0
  48. package/dist/host-bind.d.ts.map +1 -1
  49. package/dist/host-bind.js +1 -1
  50. package/dist/host-bind.js.map +1 -1
  51. package/dist/index.cjs +1 -1
  52. package/dist/index.d.ts +8 -3
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +1 -1
  55. package/dist/ore.cjs +2 -2
  56. package/dist/ore.cjs.map +1 -1
  57. package/dist/ore.iife.js +2 -2
  58. package/dist/ore.iife.js.map +1 -1
  59. package/dist/ore.js +2 -2
  60. package/dist/ore.js.map +1 -1
  61. package/dist/props.cjs.map +1 -1
  62. package/dist/props.d.ts +12 -0
  63. package/dist/props.d.ts.map +1 -1
  64. package/dist/props.js.map +1 -1
  65. package/dist/runtime.cjs +1 -1
  66. package/dist/runtime.cjs.map +1 -1
  67. package/dist/runtime.d.ts.map +1 -1
  68. package/dist/runtime.js +1 -1
  69. package/dist/runtime.js.map +1 -1
  70. package/dist/slots.cjs +1 -1
  71. package/dist/slots.cjs.map +1 -1
  72. package/dist/slots.d.ts.map +1 -1
  73. package/dist/slots.js +1 -1
  74. package/dist/slots.js.map +1 -1
  75. package/dist/template/bindings.cjs +1 -1
  76. package/dist/template/bindings.cjs.map +1 -1
  77. package/dist/template/bindings.d.ts.map +1 -1
  78. package/dist/template/bindings.js +1 -1
  79. package/dist/template/bindings.js.map +1 -1
  80. package/dist/template/instantiator.cjs.map +1 -1
  81. package/dist/template/instantiator.d.ts.map +1 -1
  82. package/dist/template/instantiator.js.map +1 -1
  83. package/dist/testing/flush.cjs +1 -1
  84. package/dist/testing/flush.cjs.map +1 -1
  85. package/dist/testing/flush.d.ts +30 -26
  86. package/dist/testing/flush.d.ts.map +1 -1
  87. package/dist/testing/flush.js +1 -1
  88. package/dist/testing/flush.js.map +1 -1
  89. package/dist/testing/index.d.ts +30 -1
  90. package/dist/testing/index.d.ts.map +1 -1
  91. package/dist/testing/interactions.cjs +1 -1
  92. package/dist/testing/interactions.cjs.map +1 -1
  93. package/dist/testing/interactions.d.ts.map +1 -1
  94. package/dist/testing/interactions.js +1 -1
  95. package/dist/testing/interactions.js.map +1 -1
  96. package/dist/testing/mount.cjs +1 -1
  97. package/dist/testing/mount.cjs.map +1 -1
  98. package/dist/testing/mount.d.ts +8 -14
  99. package/dist/testing/mount.d.ts.map +1 -1
  100. package/dist/testing/mount.js +1 -1
  101. package/dist/testing/mount.js.map +1 -1
  102. package/dist/testing/render-hook.cjs +1 -1
  103. package/dist/testing/render-hook.js +1 -1
  104. package/dist/testing.cjs +2 -1
  105. package/dist/testing.cjs.map +1 -0
  106. package/dist/testing.js +2 -1
  107. package/dist/testing.js.map +1 -0
  108. package/dist/utils/aria.cjs.map +1 -1
  109. package/dist/utils/aria.d.ts +1 -1
  110. package/dist/utils/aria.js.map +1 -1
  111. package/dist/utils/dom.cjs +1 -1
  112. package/dist/utils/dom.cjs.map +1 -1
  113. package/dist/utils/dom.d.ts +36 -0
  114. package/dist/utils/dom.d.ts.map +1 -1
  115. package/dist/utils/dom.js +1 -1
  116. package/dist/utils/dom.js.map +1 -1
  117. package/dist/utils/id.cjs +1 -1
  118. package/dist/utils/id.cjs.map +1 -1
  119. package/dist/utils/id.d.ts +11 -2
  120. package/dist/utils/id.d.ts.map +1 -1
  121. package/dist/utils/id.js +1 -1
  122. package/dist/utils/id.js.map +1 -1
  123. package/package.json +4 -9
  124. package/dist/devtools.cjs +0 -2
  125. package/dist/devtools.cjs.map +0 -1
  126. package/dist/devtools.d.ts +0 -32
  127. package/dist/devtools.d.ts.map +0 -1
  128. package/dist/devtools.js +0 -2
  129. package/dist/devtools.js.map +0 -1
  130. package/dist/testing/events.cjs +0 -2
  131. package/dist/testing/events.cjs.map +0 -1
  132. package/dist/testing/events.d.ts +0 -37
  133. package/dist/testing/events.d.ts.map +0 -1
  134. package/dist/testing/events.js +0 -2
  135. package/dist/testing/events.js.map +0 -1
  136. package/dist/testing/query.cjs +0 -2
  137. package/dist/testing/query.cjs.map +0 -1
  138. package/dist/testing/query.d.ts +0 -24
  139. package/dist/testing/query.d.ts.map +0 -1
  140. package/dist/testing/query.js +0 -2
  141. package/dist/testing/query.js.map +0 -1
  142. package/dist/testing/testing.cjs +0 -2
  143. package/dist/testing/testing.cjs.map +0 -1
  144. package/dist/testing/testing.d.ts +0 -32
  145. package/dist/testing/testing.d.ts.map +0 -1
  146. package/dist/testing/testing.js +0 -2
  147. package/dist/testing/testing.js.map +0 -1
  148. package/dist/testing/wait.cjs +0 -2
  149. package/dist/testing/wait.cjs.map +0 -1
  150. package/dist/testing/wait.d.ts +0 -35
  151. package/dist/testing/wait.d.ts.map +0 -1
  152. package/dist/testing/wait.js +0 -2
  153. package/dist/testing/wait.js.map +0 -1
@@ -1,37 +0,0 @@
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.
7
- *
8
- * @example
9
- * fire.click(button);
10
- * fire.keyDown(input, { key: 'Enter' });
11
- * fire.custom(el, 'value-change', { detail: 42 });
12
- */
13
- export declare const fire: {
14
- readonly blur: (el: Element, opts?: FocusEventInit) => boolean;
15
- readonly change: (el: Element, opts?: EventInit) => boolean;
16
- readonly click: (el: Element, opts?: PointerEventInit) => boolean;
17
- /** Fire a CustomEvent. Pass `{ detail: ... }` for event detail. */
18
- readonly custom: (el: Element, name: string, opts?: CustomEventInit) => void;
19
- /** Dispatch any pre-built Event instance directly. */
20
- readonly event: (el: Element, event: Event) => void;
21
- readonly focus: (el: Element, _name?: string, opts?: FocusEventInit) => boolean;
22
- readonly input: (el: Element, opts?: EventInit) => boolean;
23
- /** Fire a KeyboardEvent with a given type (keydown, keyup, keypress). */
24
- readonly keyboard: (el: Element, type: string, opts?: KeyboardEventInit) => boolean;
25
- readonly keyDown: (el: Element, opts?: KeyboardEventInit) => boolean;
26
- readonly keyUp: (el: Element, opts?: KeyboardEventInit) => boolean;
27
- /** Fire a MouseEvent with a given type (click, mousedown, etc.). */
28
- readonly mouse: (el: Element, type: string, opts?: MouseEventInit) => boolean;
29
- readonly pointerDown: (el: Element, opts?: PointerEventInit) => boolean;
30
- readonly pointerEnter: (el: Element, opts?: PointerEventInit) => boolean;
31
- readonly pointerLeave: (el: Element, opts?: PointerEventInit) => boolean;
32
- readonly pointerUp: (el: Element, opts?: PointerEventInit) => boolean;
33
- readonly submit: (el: Element, opts?: EventInit) => boolean;
34
- /** Fire a touch event; falls back to CustomEvent in environments without TouchEvent. */
35
- readonly touch: (el: Element, type: string, opts?: EventInit) => void;
36
- };
37
- //# sourceMappingURL=events.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/testing/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,OAAM,gBAAqB,KAAG,KAM9E,CAAC;AAIF;;;;;;;GAOG;AACH,eAAO,MAAM,IAAI;wBACJ,OAAO,SAAS,cAAc;0BAC5B,OAAO,SAAS,SAAS;yBAC1B,OAAO,SAAS,gBAAgB;IAE5C,mEAAmE;0BACxD,OAAO,QAAQ,MAAM,SAAS,eAAe,KAAG,IAAI;IAG/D,sDAAsD;yBAC5C,OAAO,SAAS,KAAK,KAAG,IAAI;yBAG1B,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;+BAEtC,OAAO,SAAS,gBAAgB;gCAE/B,OAAO,SAAS,gBAAgB;gCAEhC,OAAO,SAAS,gBAAgB;6BAEnC,OAAO,SAAS,gBAAgB;0BAEnC,OAAO,SAAS,SAAS;IAEtC,wFAAwF;yBAC9E,OAAO,QAAQ,MAAM,SAAS,SAAS,KAAG,IAAI;CAOhD,CAAC"}
@@ -1,2 +0,0 @@
1
- var e=(e,t={})=>typeof PointerEvent<`u`?new PointerEvent(e,t):new MouseEvent(e,t),t={blur:(e,t)=>e.dispatchEvent(new FocusEvent(`blur`,{bubbles:!0,...t})),change:(e,t)=>e.dispatchEvent(new Event(`change`,{bubbles:!0,...t})),click:(e,t)=>e.dispatchEvent(new MouseEvent(`click`,{bubbles:!0,cancelable:!0,...t})),custom(e,t,n){e.dispatchEvent(new CustomEvent(t,{bubbles:!0,cancelable:!0,composed:!1,...n}))},event(e,t){e.dispatchEvent(t)},focus:(e,t,n)=>e.dispatchEvent(new FocusEvent(`focus`,{bubbles:!0,...n})),input:(e,t)=>e.dispatchEvent(new Event(`input`,{bubbles:!0,...t})),keyboard:(e,t,n)=>e.dispatchEvent(new KeyboardEvent(t,{bubbles:!0,cancelable:!0,...n})),keyDown:(e,t)=>e.dispatchEvent(new KeyboardEvent(`keydown`,{bubbles:!0,cancelable:!0,...t})),keyUp:(e,t)=>e.dispatchEvent(new KeyboardEvent(`keyup`,{bubbles:!0,cancelable:!0,...t})),mouse:(e,t,n)=>e.dispatchEvent(new MouseEvent(t,{bubbles:!0,cancelable:!0,...n})),pointerDown:(t,n)=>t.dispatchEvent(e(`pointerdown`,{bubbles:!0,cancelable:!0,...n})),pointerEnter:(t,n)=>t.dispatchEvent(e(`pointerenter`,{bubbles:!1,...n})),pointerLeave:(t,n)=>t.dispatchEvent(e(`pointerleave`,{bubbles:!1,...n})),pointerUp:(t,n)=>t.dispatchEvent(e(`pointerup`,{bubbles:!0,cancelable:!0,...n})),submit:(e,t)=>e.dispatchEvent(new Event(`submit`,{bubbles:!0,cancelable:!0,...t})),touch(e,t,n){typeof TouchEvent<`u`?e.dispatchEvent(new TouchEvent(t,{bubbles:!0,cancelable:!0,...n})):e.dispatchEvent(new CustomEvent(t,{bubbles:!0,cancelable:!0,...n}))}};export{e as createPointerEvent,t as fire};
2
- //# sourceMappingURL=events.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.js","names":[],"sources":["../../src/testing/events.ts"],"sourcesContent":["/**\n * Synchronous DOM event dispatchers for test environments.\n */\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 return new MouseEvent(type, init);\n};\n\n// ─── API ─────────────────────────────────────────────────────────────────────\n\n/**\n * Fire low-level DOM events synchronously.\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): void {\n el.dispatchEvent(new CustomEvent(name, { bubbles: true, cancelable: true, composed: false, ...opts }));\n },\n /** Dispatch any pre-built Event instance directly. */\n event(el: Element, event: Event): void {\n el.dispatchEvent(event);\n },\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 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 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): void {\n if (typeof TouchEvent !== 'undefined') {\n el.dispatchEvent(new TouchEvent(type, { bubbles: true, cancelable: true, ...opts }));\n } else {\n el.dispatchEvent(new CustomEvent(type, { bubbles: true, cancelable: true, ...opts }));\n }\n },\n} as const;\n"],"mappings":"AAMA,IAAa,GAAsB,EAAc,EAAyB,CAAC,IACrE,OAAO,aAAiB,IACnB,IAAI,aAAa,EAAM,CAAI,EAG7B,IAAI,WAAW,EAAM,CAAI,EAarB,EAAO,CAClB,MAAO,EAAa,IAA0B,EAAG,cAAc,IAAI,WAAW,OAAQ,CAAE,QAAS,GAAM,GAAG,CAAK,CAAC,CAAC,EACjH,QAAS,EAAa,IAAqB,EAAG,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,GAAM,GAAG,CAAK,CAAC,CAAC,EAC3G,OAAQ,EAAa,IACnB,EAAG,cAAc,IAAI,WAAW,QAAS,CAAE,QAAS,GAAM,WAAY,GAAM,GAAG,CAAK,CAAC,CAAC,EAExF,OAAO,EAAa,EAAc,EAA8B,CAC9D,EAAG,cAAc,IAAI,YAAY,EAAM,CAAE,QAAS,GAAM,WAAY,GAAM,SAAU,GAAO,GAAG,CAAK,CAAC,CAAC,CACvG,EAEA,MAAM,EAAa,EAAoB,CACrC,EAAG,cAAc,CAAK,CACxB,EACA,OAAQ,EAAa,EAAgB,IACnC,EAAG,cAAc,IAAI,WAAW,QAAS,CAAE,QAAS,GAAM,GAAG,CAAK,CAAC,CAAC,EACtE,OAAQ,EAAa,IAAqB,EAAG,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,GAAM,GAAG,CAAK,CAAC,CAAC,EAEzG,UAAW,EAAa,EAAc,IACpC,EAAG,cAAc,IAAI,cAAc,EAAM,CAAE,QAAS,GAAM,WAAY,GAAM,GAAG,CAAK,CAAC,CAAC,EACxF,SAAU,EAAa,IACrB,EAAG,cAAc,IAAI,cAAc,UAAW,CAAE,QAAS,GAAM,WAAY,GAAM,GAAG,CAAK,CAAC,CAAC,EAC7F,OAAQ,EAAa,IACnB,EAAG,cAAc,IAAI,cAAc,QAAS,CAAE,QAAS,GAAM,WAAY,GAAM,GAAG,CAAK,CAAC,CAAC,EAE3F,OAAQ,EAAa,EAAc,IACjC,EAAG,cAAc,IAAI,WAAW,EAAM,CAAE,QAAS,GAAM,WAAY,GAAM,GAAG,CAAK,CAAC,CAAC,EACrF,aAAc,EAAa,IACzB,EAAG,cAAc,EAAmB,cAAe,CAAE,QAAS,GAAM,WAAY,GAAM,GAAG,CAAK,CAAC,CAAC,EAClG,cAAe,EAAa,IAC1B,EAAG,cAAc,EAAmB,eAAgB,CAAE,QAAS,GAAO,GAAG,CAAK,CAAC,CAAC,EAClF,cAAe,EAAa,IAC1B,EAAG,cAAc,EAAmB,eAAgB,CAAE,QAAS,GAAO,GAAG,CAAK,CAAC,CAAC,EAClF,WAAY,EAAa,IACvB,EAAG,cAAc,EAAmB,YAAa,CAAE,QAAS,GAAM,WAAY,GAAM,GAAG,CAAK,CAAC,CAAC,EAChG,QAAS,EAAa,IACpB,EAAG,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,GAAM,WAAY,GAAM,GAAG,CAAK,CAAC,CAAC,EAEpF,MAAM,EAAa,EAAc,EAAwB,CACnD,OAAO,WAAe,IACxB,EAAG,cAAc,IAAI,WAAW,EAAM,CAAE,QAAS,GAAM,WAAY,GAAM,GAAG,CAAK,CAAC,CAAC,EAEnF,EAAG,cAAc,IAAI,YAAY,EAAM,CAAE,QAAS,GAAM,WAAY,GAAM,GAAG,CAAK,CAAC,CAAC,CAExF,CACF"}
@@ -1,2 +0,0 @@
1
- function e(e,t,n){for(let r of e.querySelectorAll(n))if(r.textContent?.trim()===t)return r;return null}function t(e,t,n){return Array.from(e.querySelectorAll(n)).filter(e=>e.textContent?.trim()===t)}function n(n){return{query:e=>n.querySelector(e),queryAll:e=>Array.from(n.querySelectorAll(e)),queryAllByTestId:e=>Array.from(n.querySelectorAll(`[data-testid="${e}"]`)),queryAllByText:(e,r=`*`)=>t(n,e,r),queryByTestId:e=>n.querySelector(`[data-testid="${e}"]`),queryByText:(t,r=`*`)=>e(n,t,r)}}exports.queryAllByText=t,exports.queryByText=e,exports.within=n;
2
- //# sourceMappingURL=query.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query.cjs","names":[],"sources":["../../src/testing/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\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// ─── 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) => element.querySelector<E>(selector),\n queryAll: <E extends Element = Element>(selector: string) => Array.from(element.querySelectorAll<E>(selector)),\n queryAllByTestId: <E extends Element = Element>(testId: string) =>\n Array.from(element.querySelectorAll<E>(`[data-testid=\"${testId}\"]`)),\n queryAllByText: <E extends Element = Element>(text: string, selector = '*') =>\n queryAllByText<E>(element, text, selector),\n queryByTestId: <E extends Element = Element>(testId: string) =>\n element.querySelector<E>(`[data-testid=\"${testId}\"]`),\n queryByText: <E extends Element = Element>(text: string, selector = '*') => queryByText<E>(element, text, selector),\n };\n}\n"],"mappings":"AAkBA,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,CAYA,SAAgB,EAAO,EAA8B,CACnD,MAAO,CACL,MAAqC,GAAqB,EAAQ,cAAiB,CAAQ,EAC3F,SAAwC,GAAqB,MAAM,KAAK,EAAQ,iBAAoB,CAAQ,CAAC,EAC7G,iBAAgD,GAC9C,MAAM,KAAK,EAAQ,iBAAoB,iBAAiB,EAAO,GAAG,CAAC,EACrE,gBAA8C,EAAc,EAAW,MACrE,EAAkB,EAAS,EAAM,CAAQ,EAC3C,cAA6C,GAC3C,EAAQ,cAAiB,iBAAiB,EAAO,GAAG,EACtD,aAA2C,EAAc,EAAW,MAAQ,EAAe,EAAS,EAAM,CAAQ,CACpH,CACF"}
@@ -1,24 +0,0 @@
1
- /**
2
- * DOM query helpers for test environments.
3
- */
4
- /** Scoped query helpers for any DOM element — see {@link within} */
5
- export interface QueryScope {
6
- query<E extends Element = Element>(selector: string): E | null;
7
- queryAll<E extends Element = Element>(selector: string): E[];
8
- queryByText<E extends Element = Element>(text: string, selector?: string): E | null;
9
- queryAllByText<E extends Element = Element>(text: string, selector?: string): E[];
10
- queryByTestId<E extends Element = Element>(testId: string): E | null;
11
- queryAllByTestId<E extends Element = Element>(testId: string): E[];
12
- }
13
- export declare function queryByText<E extends Element = Element>(root: Element | ShadowRoot, text: string, selector: string): E | null;
14
- export declare function queryAllByText<E extends Element = Element>(root: Element | ShadowRoot, text: string, selector: string): E[];
15
- /**
16
- * Create query helpers scoped to any element — useful for slotted/light DOM content.
17
- *
18
- * @example
19
- * const panel = fixture.query('.panel')!;
20
- * const { query } = within(panel);
21
- * expect(query('.title')?.textContent).toBe('Hello');
22
- */
23
- export declare function within(element: Element): QueryScope;
24
- //# sourceMappingURL=query.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/testing/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,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;AAID;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAYnD"}
@@ -1,2 +0,0 @@
1
- function e(e,t,n){for(let r of e.querySelectorAll(n))if(r.textContent?.trim()===t)return r;return null}function t(e,t,n){return Array.from(e.querySelectorAll(n)).filter(e=>e.textContent?.trim()===t)}function n(n){return{query:e=>n.querySelector(e),queryAll:e=>Array.from(n.querySelectorAll(e)),queryAllByTestId:e=>Array.from(n.querySelectorAll(`[data-testid="${e}"]`)),queryAllByText:(e,r=`*`)=>t(n,e,r),queryByTestId:e=>n.querySelector(`[data-testid="${e}"]`),queryByText:(t,r=`*`)=>e(n,t,r)}}export{t as queryAllByText,e as queryByText,n as within};
2
- //# sourceMappingURL=query.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query.js","names":[],"sources":["../../src/testing/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\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// ─── 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) => element.querySelector<E>(selector),\n queryAll: <E extends Element = Element>(selector: string) => Array.from(element.querySelectorAll<E>(selector)),\n queryAllByTestId: <E extends Element = Element>(testId: string) =>\n Array.from(element.querySelectorAll<E>(`[data-testid=\"${testId}\"]`)),\n queryAllByText: <E extends Element = Element>(text: string, selector = '*') =>\n queryAllByText<E>(element, text, selector),\n queryByTestId: <E extends Element = Element>(testId: string) =>\n element.querySelector<E>(`[data-testid=\"${testId}\"]`),\n queryByText: <E extends Element = Element>(text: string, selector = '*') => queryByText<E>(element, text, selector),\n };\n}\n"],"mappings":"AAkBA,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,CAYA,SAAgB,EAAO,EAA8B,CACnD,MAAO,CACL,MAAqC,GAAqB,EAAQ,cAAiB,CAAQ,EAC3F,SAAwC,GAAqB,MAAM,KAAK,EAAQ,iBAAoB,CAAQ,CAAC,EAC7G,iBAAgD,GAC9C,MAAM,KAAK,EAAQ,iBAAoB,iBAAiB,EAAO,GAAG,CAAC,EACrE,gBAA8C,EAAc,EAAW,MACrE,EAAkB,EAAS,EAAM,CAAQ,EAC3C,cAA6C,GAC3C,EAAQ,cAAiB,iBAAiB,EAAO,GAAG,EACtD,aAA2C,EAAc,EAAW,MAAQ,EAAe,EAAS,EAAM,CAAQ,CACpH,CACF"}
@@ -1,2 +0,0 @@
1
- const e=require("./flush.cjs"),t=require("./dom.cjs"),n=require("./form-internals-polyfill.cjs"),r=require("./query.cjs"),i=require("./mount.cjs"),a=require("./events.cjs"),o=require("./interactions.cjs"),s=require("./wait.cjs"),c=require("./render-hook.cjs");function l(e){e(i.cleanup),n.installFormInternalsPolyfill()}exports.FLUSH_DEEP=e.FLUSH_DEEP,exports.cleanup=i.cleanup,exports.createPointerEvent=a.createPointerEvent,exports.fire=a.fire,exports.flush=e.flush,exports.install=l,exports.installFormInternalsPolyfill=n.installFormInternalsPolyfill,exports.mock=i.mock,exports.mount=i.mount,exports.mountComponent=i.mountComponent,exports.renderHook=c.renderHook,exports.user=o.user,exports.waitFor=s.waitFor,exports.waitForEvent=s.waitForEvent,exports.walkFlatTree=t.walkFlatTree,exports.within=r.within;
2
- //# sourceMappingURL=testing.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.cjs","names":[],"sources":["../../src/testing/testing.ts"],"sourcesContent":["/**\n * Testing utilities for Ore components\n *\n * ⚠️ Requires DOM environment (browser / jsdom / happy-dom)\n *\n * This barrel re-exports the full testing API for convenience.\n * For tree-shaking, import directly from the focused sub-modules.\n */\n\nimport { installFormInternalsPolyfill } from './form-internals-polyfill';\nimport { cleanup } from './mount';\n\nexport { fire, createPointerEvent } from './events';\nexport { FLUSH_DEEP, flush, type FlushOptions } from './flush';\nexport { walkFlatTree } from './dom';\nexport { installFormInternalsPolyfill } from './form-internals-polyfill';\nexport { user } from './interactions';\nexport { cleanup, mock, mount, mountComponent, type Fixture, type MountOptions, type MountSetup } from './mount';\nexport { within, type QueryScope } from './query';\nexport { waitFor, waitForEvent, type WaitOptions } from './wait';\nexport { renderHook, type HookFixture } from './render-hook';\n\n/**\n * Register auto-cleanup after each test, and polyfill the jsdom/happy-dom gaps in\n * `ElementInternals`/`FormData`/`<form>.reset()` that `useField()` needs (see\n * `installFormInternalsPolyfill` — safe to call even in a suite with no form-associated\n * components; every patch it installs is a guarded no-op when its target is missing).\n * Call once in your test setup file.\n *\n * @example\n * // vitest.setup.ts\n * import { afterEach } from 'vitest';\n * import { install } from '@vielzeug/ore/testing';\n * install(afterEach);\n */\nexport function install(afterEachHook: (fn: () => void) => void): void {\n afterEachHook(cleanup);\n installFormInternalsPolyfill();\n}\n"],"mappings":"oQAmCA,SAAgB,EAAQ,EAA+C,CACrE,EAAc,EAAA,OAAO,EACrB,EAAA,6BAA6B,CAC/B"}
@@ -1,32 +0,0 @@
1
- /**
2
- * Testing utilities for Ore components
3
- *
4
- * ⚠️ Requires DOM environment (browser / jsdom / happy-dom)
5
- *
6
- * This barrel re-exports the full testing API for convenience.
7
- * For tree-shaking, import directly from the focused sub-modules.
8
- */
9
- export { fire, createPointerEvent } from './events';
10
- export { FLUSH_DEEP, flush, type FlushOptions } from './flush';
11
- export { walkFlatTree } from './dom';
12
- export { installFormInternalsPolyfill } from './form-internals-polyfill';
13
- export { user } from './interactions';
14
- export { cleanup, mock, mount, mountComponent, type Fixture, type MountOptions, type MountSetup } from './mount';
15
- export { within, type QueryScope } from './query';
16
- export { waitFor, waitForEvent, type WaitOptions } from './wait';
17
- export { renderHook, type HookFixture } from './render-hook';
18
- /**
19
- * Register auto-cleanup after each test, and polyfill the jsdom/happy-dom gaps in
20
- * `ElementInternals`/`FormData`/`<form>.reset()` that `useField()` needs (see
21
- * `installFormInternalsPolyfill` — safe to call even in a suite with no form-associated
22
- * components; every patch it installs is a guarded no-op when its target is missing).
23
- * Call once in your test setup file.
24
- *
25
- * @example
26
- * // vitest.setup.ts
27
- * import { afterEach } from 'vitest';
28
- * import { install } from '@vielzeug/ore/testing';
29
- * install(afterEach);
30
- */
31
- export declare function install(afterEachHook: (fn: () => void) => void): void;
32
- //# sourceMappingURL=testing.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/testing/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjH,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE7D;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,GAAG,IAAI,CAGrE"}
@@ -1,2 +0,0 @@
1
- import{FLUSH_DEEP as e,flush as t}from"./flush.js";import{walkFlatTree as n}from"./dom.js";import{installFormInternalsPolyfill as r}from"./form-internals-polyfill.js";import{within as i}from"./query.js";import{cleanup as a,mock as o,mount as s,mountComponent as c}from"./mount.js";import{createPointerEvent as l,fire as u}from"./events.js";import{user as d}from"./interactions.js";import{waitFor as f,waitForEvent as p}from"./wait.js";import{renderHook as m}from"./render-hook.js";function h(e){e(a),r()}export{e as FLUSH_DEEP,a as cleanup,l as createPointerEvent,u as fire,t as flush,h as install,r as installFormInternalsPolyfill,o as mock,s as mount,c as mountComponent,m as renderHook,d as user,f as waitFor,p as waitForEvent,n as walkFlatTree,i as within};
2
- //# sourceMappingURL=testing.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.js","names":[],"sources":["../../src/testing/testing.ts"],"sourcesContent":["/**\n * Testing utilities for Ore components\n *\n * ⚠️ Requires DOM environment (browser / jsdom / happy-dom)\n *\n * This barrel re-exports the full testing API for convenience.\n * For tree-shaking, import directly from the focused sub-modules.\n */\n\nimport { installFormInternalsPolyfill } from './form-internals-polyfill';\nimport { cleanup } from './mount';\n\nexport { fire, createPointerEvent } from './events';\nexport { FLUSH_DEEP, flush, type FlushOptions } from './flush';\nexport { walkFlatTree } from './dom';\nexport { installFormInternalsPolyfill } from './form-internals-polyfill';\nexport { user } from './interactions';\nexport { cleanup, mock, mount, mountComponent, type Fixture, type MountOptions, type MountSetup } from './mount';\nexport { within, type QueryScope } from './query';\nexport { waitFor, waitForEvent, type WaitOptions } from './wait';\nexport { renderHook, type HookFixture } from './render-hook';\n\n/**\n * Register auto-cleanup after each test, and polyfill the jsdom/happy-dom gaps in\n * `ElementInternals`/`FormData`/`<form>.reset()` that `useField()` needs (see\n * `installFormInternalsPolyfill` — safe to call even in a suite with no form-associated\n * components; every patch it installs is a guarded no-op when its target is missing).\n * Call once in your test setup file.\n *\n * @example\n * // vitest.setup.ts\n * import { afterEach } from 'vitest';\n * import { install } from '@vielzeug/ore/testing';\n * install(afterEach);\n */\nexport function install(afterEachHook: (fn: () => void) => void): void {\n afterEachHook(cleanup);\n installFormInternalsPolyfill();\n}\n"],"mappings":"ieAmCA,SAAgB,EAAQ,EAA+C,CACrE,EAAc,CAAO,EACrB,EAA6B,CAC/B"}
@@ -1,2 +0,0 @@
1
- const e=require("../errors.cjs");async function t(t,{interval:n=50,message:r,timeout:i=1e3}={}){let a=Date.now()+i,o,s=async()=>{try{let e=await t();return e===void 0||!!e}catch(e){return o=e,!1}};for(;Date.now()<a;){if(await s())return;await new Promise(e=>setTimeout(e,n))}if(await s())return;let c=r??`waitFor timed out after ${i}ms`;throw o instanceof Error?(o.message=`${c}\n${o.message}`,o):new e.OreTimeoutError(o==null?c:`${c}\nCause: ${o}`)}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.OreTimeoutError(`waitForEvent: "${n}" timed out after ${r}ms`))},r);t.addEventListener(n,o,{once:!0})})}exports.waitFor=t,exports.waitForEvent=n;
2
- //# sourceMappingURL=wait.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wait.cjs","names":[],"sources":["../../src/testing/wait.ts"],"sourcesContent":["/**\n * Async waiting utilities for test environments.\n */\n\nimport { OreTimeoutError } from '../errors';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface WaitOptions {\n /** Maximum wait time in ms (default: 1000) */\n timeout?: number;\n /** Polling interval in ms (default: 50) */\n interval?: number;\n /** Message included in timeout error */\n message?: string;\n}\n\n// ─── API ─────────────────────────────────────────────────────────────────────\n\n/**\n * Poll until a callback returns truthy (or void) without throwing.\n * Supports both boolean conditions and `expect()` assertions.\n *\n * - Returns truthy → success\n * - Returns `undefined` (e.g. bare `expect()` call) → success\n * - Returns falsy value → retry\n * - Throws → retry, re-throw original error on timeout\n *\n * @example\n * await waitFor(() => query('.status')?.textContent === 'loaded');\n * await waitFor(() => expect(count).toBe(3));\n */\nexport async function waitFor(\n fn: () => unknown,\n { interval = 50, message, timeout = 1000 }: WaitOptions = {},\n): Promise<void> {\n const deadline = Date.now() + timeout;\n let lastError: unknown;\n\n const attempt = async (): Promise<boolean> => {\n try {\n const result = await fn();\n\n return result === undefined || !!result;\n } catch (e) {\n lastError = e;\n\n return false;\n }\n };\n\n while (Date.now() < deadline) {\n if (await attempt()) return;\n\n await new Promise((r) => setTimeout(r, interval));\n }\n\n if (await attempt()) return;\n\n const base = message ?? `waitFor timed out after ${timeout}ms`;\n\n if (lastError instanceof Error) {\n lastError.message = `${base}\\n${lastError.message}`;\n throw lastError;\n }\n\n throw new OreTimeoutError(lastError != null ? `${base}\\nCause: ${lastError}` : base);\n}\n\n/**\n * Resolve when the target element emits the given event.\n *\n * @example\n * const promise = waitForEvent(el, 'change');\n * fire.click(trigger);\n * const event = await promise;\n */\nexport function waitForEvent<T extends Event = Event>(element: Element, name: string, timeout = 1000): Promise<T> {\n return new Promise((resolve, reject) => {\n const onEvent = (e: Event): void => {\n clearTimeout(timer);\n resolve(e as T);\n };\n const timer = setTimeout(() => {\n element.removeEventListener(name, onEvent);\n reject(new OreTimeoutError(`waitForEvent: \"${name}\" timed out after ${timeout}ms`));\n }, timeout);\n\n element.addEventListener(name, onEvent, { once: true });\n });\n}\n"],"mappings":"iCAgCA,eAAsB,EACpB,EACA,CAAE,WAAW,GAAI,UAAS,UAAU,KAAsB,CAAC,EAC5C,CACf,IAAM,EAAW,KAAK,IAAI,EAAI,EAC1B,EAEE,EAAU,SAA8B,CAC5C,GAAI,CACF,IAAM,EAAS,MAAM,EAAG,EAExB,OAAO,IAAW,IAAA,IAAa,CAAC,CAAC,CACnC,OAAS,EAAG,CAGV,MAFA,GAAY,EAEL,EACT,CACF,EAEA,KAAO,KAAK,IAAI,EAAI,GAAU,CAC5B,GAAI,MAAM,EAAQ,EAAG,OAErB,MAAM,IAAI,QAAS,GAAM,WAAW,EAAG,CAAQ,CAAC,CAClD,CAEA,GAAI,MAAM,EAAQ,EAAG,OAErB,IAAM,EAAO,GAAW,2BAA2B,EAAQ,IAO3D,MALI,aAAqB,OACvB,EAAU,QAAU,GAAG,EAAK,IAAI,EAAU,UACpC,GAGF,IAAI,EAAA,gBAAgB,GAAa,KAAwC,EAAjC,GAAG,EAAK,WAAW,GAAkB,CACrF,CAUA,SAAgB,EAAsC,EAAkB,EAAc,EAAU,IAAkB,CAChH,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,IAAM,EAAW,GAAmB,CAClC,aAAa,CAAK,EAClB,EAAQ,CAAM,CAChB,EACM,EAAQ,eAAiB,CAC7B,EAAQ,oBAAoB,EAAM,CAAO,EACzC,EAAO,IAAI,EAAA,gBAAgB,kBAAkB,EAAK,oBAAoB,EAAQ,GAAG,CAAC,CACpF,EAAG,CAAO,EAEV,EAAQ,iBAAiB,EAAM,EAAS,CAAE,KAAM,EAAK,CAAC,CACxD,CAAC,CACH"}
@@ -1,35 +0,0 @@
1
- /**
2
- * Async waiting utilities for test environments.
3
- */
4
- export interface WaitOptions {
5
- /** Maximum wait time in ms (default: 1000) */
6
- timeout?: number;
7
- /** Polling interval in ms (default: 50) */
8
- interval?: number;
9
- /** Message included in timeout error */
10
- message?: string;
11
- }
12
- /**
13
- * Poll until a callback returns truthy (or void) without throwing.
14
- * Supports both boolean conditions and `expect()` assertions.
15
- *
16
- * - Returns truthy → success
17
- * - Returns `undefined` (e.g. bare `expect()` call) → success
18
- * - Returns falsy value → retry
19
- * - Throws → retry, re-throw original error on timeout
20
- *
21
- * @example
22
- * await waitFor(() => query('.status')?.textContent === 'loaded');
23
- * await waitFor(() => expect(count).toBe(3));
24
- */
25
- export declare function waitFor(fn: () => unknown, { interval, message, timeout }?: WaitOptions): Promise<void>;
26
- /**
27
- * Resolve when the target element emits the given event.
28
- *
29
- * @example
30
- * const promise = waitForEvent(el, 'change');
31
- * fire.click(trigger);
32
- * const event = await promise;
33
- */
34
- export declare function waitForEvent<T extends Event = Event>(element: Element, name: string, timeout?: number): Promise<T>;
35
- //# sourceMappingURL=wait.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/testing/wait.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,OAAO,CAC3B,EAAE,EAAE,MAAM,OAAO,EACjB,EAAE,QAAa,EAAE,OAAO,EAAE,OAAc,EAAE,GAAE,WAAgB,GAC3D,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAahH"}
@@ -1,2 +0,0 @@
1
- import{OreTimeoutError as e}from"../errors.js";async function t(t,{interval:n=50,message:r,timeout:i=1e3}={}){let a=Date.now()+i,o,s=async()=>{try{let e=await t();return e===void 0||!!e}catch(e){return o=e,!1}};for(;Date.now()<a;){if(await s())return;await new Promise(e=>setTimeout(e,n))}if(await s())return;let c=r??`waitFor timed out after ${i}ms`;throw o instanceof Error?(o.message=`${c}\n${o.message}`,o):new e(o==null?c:`${c}\nCause: ${o}`)}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(`waitForEvent: "${n}" timed out after ${r}ms`))},r);t.addEventListener(n,o,{once:!0})})}export{t as waitFor,n as waitForEvent};
2
- //# sourceMappingURL=wait.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wait.js","names":[],"sources":["../../src/testing/wait.ts"],"sourcesContent":["/**\n * Async waiting utilities for test environments.\n */\n\nimport { OreTimeoutError } from '../errors';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface WaitOptions {\n /** Maximum wait time in ms (default: 1000) */\n timeout?: number;\n /** Polling interval in ms (default: 50) */\n interval?: number;\n /** Message included in timeout error */\n message?: string;\n}\n\n// ─── API ─────────────────────────────────────────────────────────────────────\n\n/**\n * Poll until a callback returns truthy (or void) without throwing.\n * Supports both boolean conditions and `expect()` assertions.\n *\n * - Returns truthy → success\n * - Returns `undefined` (e.g. bare `expect()` call) → success\n * - Returns falsy value → retry\n * - Throws → retry, re-throw original error on timeout\n *\n * @example\n * await waitFor(() => query('.status')?.textContent === 'loaded');\n * await waitFor(() => expect(count).toBe(3));\n */\nexport async function waitFor(\n fn: () => unknown,\n { interval = 50, message, timeout = 1000 }: WaitOptions = {},\n): Promise<void> {\n const deadline = Date.now() + timeout;\n let lastError: unknown;\n\n const attempt = async (): Promise<boolean> => {\n try {\n const result = await fn();\n\n return result === undefined || !!result;\n } catch (e) {\n lastError = e;\n\n return false;\n }\n };\n\n while (Date.now() < deadline) {\n if (await attempt()) return;\n\n await new Promise((r) => setTimeout(r, interval));\n }\n\n if (await attempt()) return;\n\n const base = message ?? `waitFor timed out after ${timeout}ms`;\n\n if (lastError instanceof Error) {\n lastError.message = `${base}\\n${lastError.message}`;\n throw lastError;\n }\n\n throw new OreTimeoutError(lastError != null ? `${base}\\nCause: ${lastError}` : base);\n}\n\n/**\n * Resolve when the target element emits the given event.\n *\n * @example\n * const promise = waitForEvent(el, 'change');\n * fire.click(trigger);\n * const event = await promise;\n */\nexport function waitForEvent<T extends Event = Event>(element: Element, name: string, timeout = 1000): Promise<T> {\n return new Promise((resolve, reject) => {\n const onEvent = (e: Event): void => {\n clearTimeout(timer);\n resolve(e as T);\n };\n const timer = setTimeout(() => {\n element.removeEventListener(name, onEvent);\n reject(new OreTimeoutError(`waitForEvent: \"${name}\" timed out after ${timeout}ms`));\n }, timeout);\n\n element.addEventListener(name, onEvent, { once: true });\n });\n}\n"],"mappings":"+CAgCA,eAAsB,EACpB,EACA,CAAE,WAAW,GAAI,UAAS,UAAU,KAAsB,CAAC,EAC5C,CACf,IAAM,EAAW,KAAK,IAAI,EAAI,EAC1B,EAEE,EAAU,SAA8B,CAC5C,GAAI,CACF,IAAM,EAAS,MAAM,EAAG,EAExB,OAAO,IAAW,IAAA,IAAa,CAAC,CAAC,CACnC,OAAS,EAAG,CAGV,MAFA,GAAY,EAEL,EACT,CACF,EAEA,KAAO,KAAK,IAAI,EAAI,GAAU,CAC5B,GAAI,MAAM,EAAQ,EAAG,OAErB,MAAM,IAAI,QAAS,GAAM,WAAW,EAAG,CAAQ,CAAC,CAClD,CAEA,GAAI,MAAM,EAAQ,EAAG,OAErB,IAAM,EAAO,GAAW,2BAA2B,EAAQ,IAO3D,MALI,aAAqB,OACvB,EAAU,QAAU,GAAG,EAAK,IAAI,EAAU,UACpC,GAGF,IAAI,EAAgB,GAAa,KAAwC,EAAjC,GAAG,EAAK,WAAW,GAAkB,CACrF,CAUA,SAAgB,EAAsC,EAAkB,EAAc,EAAU,IAAkB,CAChH,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,IAAM,EAAW,GAAmB,CAClC,aAAa,CAAK,EAClB,EAAQ,CAAM,CAChB,EACM,EAAQ,eAAiB,CAC7B,EAAQ,oBAAoB,EAAM,CAAO,EACzC,EAAO,IAAI,EAAgB,kBAAkB,EAAK,oBAAoB,EAAQ,GAAG,CAAC,CACpF,EAAG,CAAO,EAEV,EAAQ,iBAAiB,EAAM,EAAS,CAAE,KAAM,EAAK,CAAC,CACxD,CAAC,CACH"}