@vielzeug/assay 26.10.14 → 26.10.16

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/wait.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"wait.js","names":[],"sources":["../src/wait.ts"],"sourcesContent":["import { abortError, sleep } from '@vielzeug/arsenal';\n\nimport { AssayTimeoutError } from './errors';\n\nexport interface DelayOptions {\n signal?: AbortSignal;\n}\n\nexport interface WaitOptions {\n /** Polling interval in ms (default: 50). */\n interval?: number;\n /** Cancel the pending wait. */\n signal?: AbortSignal;\n /** Maximum wait time in ms (default: 1000). */\n timeout?: number;\n}\n\nexport interface EventuallyOptions extends WaitOptions {\n /** Context included in the timeout error. */\n message?: string;\n}\n\nconst DEADLINE = Symbol('assay.deadline');\nconst MAX_TIMER_MS = 2_147_483_647;\nconst now = (): number => performance.now();\n\nconst validateDuration = (name: string, value: number, allowZero: boolean): void => {\n if (!Number.isFinite(value) || value > MAX_TIMER_MS || (allowZero ? value < 0 : value <= 0)) {\n throw new RangeError(\n `${name} must be a ${allowZero ? 'non-negative' : 'positive'} finite number no greater than ${MAX_TIMER_MS}`,\n );\n }\n};\n\nconst validateWait = (interval: number, timeout: number): void => {\n validateDuration('interval', interval, false);\n validateDuration('timeout', timeout, true);\n};\n\nconst runBounded = <T>(run: () => T | Promise<T>, deadline: number, signal?: AbortSignal): Promise<T> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError(signal, 'The operation was aborted.'));\n return;\n }\n\n let settled = false;\n const cleanup = (): boolean => {\n if (settled) return false;\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n return true;\n };\n const resolveOnce = (value: T): void => {\n if (cleanup()) resolve(value);\n };\n const rejectOnce = (error: unknown): void => {\n if (cleanup()) reject(error);\n };\n const timer = setTimeout(() => rejectOnce(DEADLINE), Math.max(0, deadline - now()));\n const abort = () => rejectOnce(abortError(signal, 'The operation was aborted.'));\n\n signal?.addEventListener('abort', abort, { once: true });\n\n try {\n Promise.resolve(run()).then(resolveOnce, rejectOnce);\n } catch (error) {\n rejectOnce(error);\n }\n });\n\nexport const delay = (ms = 0, options: DelayOptions = {}): Promise<void> => {\n validateDuration('ms', ms, true);\n return sleep(ms, options.signal);\n};\n\nexport async function waitUntil(\n predicate: () => boolean | Promise<boolean>,\n { interval = 50, signal, timeout = 1000 }: WaitOptions = {},\n): Promise<void> {\n validateWait(interval, timeout);\n const deadline = now() + timeout;\n let first = true;\n\n for (;;) {\n if (signal?.aborted) throw abortError(signal, 'The operation was aborted.');\n if (!first && now() >= deadline) throw new AssayTimeoutError(`waitUntil timed out after ${timeout}ms`);\n first = false;\n\n let matched: boolean;\n try {\n matched = await runBounded(predicate, deadline, signal);\n } catch (error) {\n if (error === DEADLINE) throw new AssayTimeoutError(`waitUntil timed out after ${timeout}ms`);\n throw error;\n }\n if (matched) return;\n\n const remaining = deadline - now();\n if (remaining <= 0) throw new AssayTimeoutError(`waitUntil timed out after ${timeout}ms`);\n await sleep(Math.min(interval, remaining), signal);\n }\n}\n\n/**\n * Retry an assertion until it stops throwing or the timeout elapses.\n *\n * Polls the assertion on a fixed interval and preserves the last failure as the\n * timeout cause. Pending asynchronous assertions remain bounded by the same\n * deadline. Use `waitUntil()` for boolean conditions, `delay()` for explicit\n * timer dependencies, and `nextTick()` for one queued microtask boundary.\n *\n * @example\n * await eventually(() => expect(region.textContent).toBe('Saved'));\n */\nexport async function eventually(\n assertion: () => void | Promise<void>,\n { interval = 50, message, signal, timeout = 1000 }: EventuallyOptions = {},\n): Promise<void> {\n validateWait(interval, timeout);\n const deadline = now() + timeout;\n let first = true;\n let lastError: unknown;\n\n for (;;) {\n if (signal?.aborted) throw abortError(signal, 'The operation was aborted.');\n if (!first && now() >= deadline) break;\n first = false;\n\n try {\n await runBounded(assertion, deadline, signal);\n return;\n } catch (error) {\n if (signal?.aborted) throw abortError(signal, 'The operation was aborted.');\n if (error === DEADLINE) break;\n lastError = error;\n }\n\n const remaining = deadline - now();\n if (remaining <= 0) break;\n await sleep(Math.min(interval, remaining), signal);\n }\n\n const timing = `eventually timed out after ${timeout}ms`;\n const context = message ? `${message} (${timing})` : timing;\n const detail = lastError instanceof Error ? lastError.message : lastError == null ? '' : String(lastError);\n\n throw new AssayTimeoutError(detail ? `${context}\\n${detail}` : context, { cause: lastError });\n}\n\n/** Resolve with the next event of `type`, or reject when it times out or is aborted. */\nexport function waitForEvent<T extends Event = Event>(\n target: EventTarget,\n type: string,\n { signal, timeout = 1000 }: Omit<WaitOptions, 'interval'> = {},\n): Promise<T> {\n validateDuration('timeout', timeout, true);\n\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError(signal, 'The operation was aborted.'));\n return;\n }\n\n const dispose = () => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n target.removeEventListener(type, onEvent);\n };\n const onEvent = (event: Event): void => {\n dispose();\n resolve(event as T);\n };\n const timer = setTimeout(() => {\n dispose();\n reject(new AssayTimeoutError(`waitForEvent: \"${type}\" timed out after ${timeout}ms`));\n }, timeout);\n const onAbort = () => {\n dispose();\n reject(abortError(signal, 'The operation was aborted.'));\n };\n\n target.addEventListener(type, onEvent, { once: true });\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"wait.js","names":["DEADLINE","MAX_TIMER_MS","value","allowZero","name","interval","timeout","signal","abortError","settled","timer","resolve","reject","error","deadline","run","ms","sleep","options","first","AssayTimeoutError","matched","predicate","remaining","lastError","assertion","timing","context","message","detail","target","type","event"],"sources":["../src/wait.ts"],"sourcesContent":["import { abortError, sleep } from '@vielzeug/arsenal';\n\nimport { AssayTimeoutError } from './errors';\n\nexport interface DelayOptions {\n signal?: AbortSignal;\n}\n\nexport interface WaitOptions {\n /** Polling interval in ms (default: 50). */\n interval?: number;\n /** Cancel the pending wait. */\n signal?: AbortSignal;\n /** Maximum wait time in ms (default: 1000). */\n timeout?: number;\n}\n\nexport interface EventuallyOptions extends WaitOptions {\n /** Context included in the timeout error. */\n message?: string;\n}\n\nconst DEADLINE = Symbol('assay.deadline');\nconst MAX_TIMER_MS = 2_147_483_647;\nconst now = (): number => performance.now();\n\nconst validateDuration = (name: string, value: number, allowZero: boolean): void => {\n if (!Number.isFinite(value) || value > MAX_TIMER_MS || (allowZero ? value < 0 : value <= 0)) {\n throw new RangeError(\n `${name} must be a ${allowZero ? 'non-negative' : 'positive'} finite number no greater than ${MAX_TIMER_MS}`,\n );\n }\n};\n\nconst validateWait = (interval: number, timeout: number): void => {\n validateDuration('interval', interval, false);\n validateDuration('timeout', timeout, true);\n};\n\nconst runBounded = <T>(run: () => T | Promise<T>, deadline: number, signal?: AbortSignal): Promise<T> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError(signal, 'The operation was aborted.'));\n return;\n }\n\n let settled = false;\n const cleanup = (): boolean => {\n if (settled) return false;\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n return true;\n };\n const resolveOnce = (value: T): void => {\n if (cleanup()) resolve(value);\n };\n const rejectOnce = (error: unknown): void => {\n if (cleanup()) reject(error);\n };\n const timer = setTimeout(() => rejectOnce(DEADLINE), Math.max(0, deadline - now()));\n const abort = () => rejectOnce(abortError(signal, 'The operation was aborted.'));\n\n signal?.addEventListener('abort', abort, { once: true });\n\n try {\n Promise.resolve(run()).then(resolveOnce, rejectOnce);\n } catch (error) {\n rejectOnce(error);\n }\n });\n\nexport const delay = (ms = 0, options: DelayOptions = {}): Promise<void> => {\n validateDuration('ms', ms, true);\n return sleep(ms, options.signal);\n};\n\nexport async function waitUntil(\n predicate: () => boolean | Promise<boolean>,\n { interval = 50, signal, timeout = 1000 }: WaitOptions = {},\n): Promise<void> {\n validateWait(interval, timeout);\n const deadline = now() + timeout;\n let first = true;\n\n for (;;) {\n if (signal?.aborted) throw abortError(signal, 'The operation was aborted.');\n if (!first && now() >= deadline) throw new AssayTimeoutError(`waitUntil timed out after ${timeout}ms`);\n first = false;\n\n let matched: boolean;\n try {\n matched = await runBounded(predicate, deadline, signal);\n } catch (error) {\n if (error === DEADLINE) throw new AssayTimeoutError(`waitUntil timed out after ${timeout}ms`);\n throw error;\n }\n if (matched) return;\n\n const remaining = deadline - now();\n if (remaining <= 0) throw new AssayTimeoutError(`waitUntil timed out after ${timeout}ms`);\n await sleep(Math.min(interval, remaining), signal);\n }\n}\n\n/**\n * Retry an assertion until it stops throwing or the timeout elapses.\n *\n * Polls the assertion on a fixed interval and preserves the last failure as the\n * timeout cause. Pending asynchronous assertions remain bounded by the same\n * deadline. Use `waitUntil()` for boolean conditions, `delay()` for explicit\n * timer dependencies, and `nextTick()` for one queued microtask boundary.\n *\n * @example\n * await eventually(() => expect(region.textContent).toBe('Saved'));\n */\nexport async function eventually(\n assertion: () => void | Promise<void>,\n { interval = 50, message, signal, timeout = 1000 }: EventuallyOptions = {},\n): Promise<void> {\n validateWait(interval, timeout);\n const deadline = now() + timeout;\n let first = true;\n let lastError: unknown;\n\n for (;;) {\n if (signal?.aborted) throw abortError(signal, 'The operation was aborted.');\n if (!first && now() >= deadline) break;\n first = false;\n\n try {\n await runBounded(assertion, deadline, signal);\n return;\n } catch (error) {\n if (signal?.aborted) throw abortError(signal, 'The operation was aborted.');\n if (error === DEADLINE) break;\n lastError = error;\n }\n\n const remaining = deadline - now();\n if (remaining <= 0) break;\n await sleep(Math.min(interval, remaining), signal);\n }\n\n const timing = `eventually timed out after ${timeout}ms`;\n const context = message ? `${message} (${timing})` : timing;\n const detail = lastError instanceof Error ? lastError.message : lastError == null ? '' : String(lastError);\n\n throw new AssayTimeoutError(detail ? `${context}\\n${detail}` : context, { cause: lastError });\n}\n\n/** Resolve with the next event of `type`, or reject when it times out or is aborted. */\nexport function waitForEvent<T extends Event = Event>(\n target: EventTarget,\n type: string,\n { signal, timeout = 1000 }: Omit<WaitOptions, 'interval'> = {},\n): Promise<T> {\n validateDuration('timeout', timeout, true);\n\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError(signal, 'The operation was aborted.'));\n return;\n }\n\n const dispose = () => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n target.removeEventListener(type, onEvent);\n };\n const onEvent = (event: Event): void => {\n dispose();\n resolve(event as T);\n };\n const timer = setTimeout(() => {\n dispose();\n reject(new AssayTimeoutError(`waitForEvent: \"${type}\" timed out after ${timeout}ms`));\n }, timeout);\n const onAbort = () => {\n dispose();\n reject(abortError(signal, 'The operation was aborted.'));\n };\n\n target.addEventListener(type, onEvent, { once: true });\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vielzeug/assay",
3
- "version": "26.10.14",
3
+ "version": "26.10.16",
4
4
  "description": "Framework-agnostic DOM testing primitives: scoped queries, event dispatch, async waiting",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,13 +41,13 @@
41
41
  "verify:exports": "node verify-exports.mjs"
42
42
  },
43
43
  "dependencies": {
44
- "@vielzeug/arsenal": "26.10.14"
44
+ "@vielzeug/arsenal": "26.10.16"
45
45
  },
46
46
  "devDependencies": {
47
- "@types/node": "^26.6.2",
48
- "jsdom": "^30.1.1",
47
+ "@types/node": "^26.6.5",
48
+ "jsdom": "^30.1.3",
49
49
  "typescript": "^6.0.3",
50
- "vite": "^8.3.0",
51
- "vitest": "^5.0.1"
50
+ "vite": "^8.3.4",
51
+ "vitest": "^5.0.5"
52
52
  }
53
53
  }