@ethlete/components 1.0.0-next.75 → 1.0.0-next.77
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/CHANGELOG.md +20 -0
- package/fesm2022/ethlete-components-testing.mjs +384 -475
- package/fesm2022/ethlete-components-testing.mjs.map +1 -1
- package/fesm2022/ethlete-components.mjs +105736 -72746
- package/fesm2022/ethlete-components.mjs.map +1 -1
- package/package.json +2 -2
- package/src/lib/forms/form-field/form-field-control-suffix-styles.component.css +10 -1
- package/src/lib/overlay/strategies/sheet-styles.component.css +19 -0
- package/types/ethlete-components-testing.d.ts +225 -238
- package/types/ethlete-components.d.ts +29206 -21279
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethlete-components-testing.mjs","sources":["../../../../libs/components/testing/driver-core.ts","../../../../libs/components/testing/control-driver.ts","../../../../libs/components/testing/overlay-control-driver.ts","../../../../libs/components/testing/date-picker-driver.ts","../../../../libs/components/testing/fake-overlay-ref.ts","../../../../libs/components/testing/field-control-driver.ts","../../../../libs/components/testing/select-driver.ts","../../../../libs/components/testing/tabs-driver.ts","../../../../libs/components/testing/test-environment.ts","../../../../libs/components/testing/ethlete-components-testing.ts"],"sourcesContent":["import { ApplicationRef, Type } from '@angular/core';\nimport { ComponentFixture, TestBed } from '@angular/core/testing';\n\nexport const tick = () => TestBed.inject(ApplicationRef).tick();\n\nexport const flushFrames = () =>\n new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n\nexport const resetOverlays = () =>\n document.querySelectorAll('.et-overlay-runtime-entry').forEach((entry) => entry.remove());\n\n/**\n * The newest overlay pane in the document.\n *\n * Overlays render into the document, not into the fixture, and jsdom fires no transition events -\n * so a pane stuck in its leave transition stays reachable. Scope every pane query through here, or\n * a stale pane answers it.\n */\nexport const latestPane = () =>\n Array.from(document.querySelectorAll<HTMLElement>('.et-overlay-runtime-pane')).at(-1) ?? null;\n\nexport const hostDirective = <T>(fixture: ComponentFixture<unknown>, type: Type<T>) =>\n fixture.debugElement.children[0]!.injector.get(type);\n\nexport const directiveAt = <T>(fixture: ComponentFixture<unknown>, type: Type<T>, selector: string) => {\n const node = fixture.debugElement.query(\n (candidate) => (candidate.nativeElement as Element | null)?.matches?.(selector) ?? false,\n );\n\n if (!node) throw new Error(`No element in the fixture matches \"${selector}\"`);\n\n return node.injector.get(type);\n};\n\nexport const hostElement = (fixture: ComponentFixture<unknown>) =>\n fixture.debugElement.children[0]!.nativeElement as HTMLElement;\n\n/**\n * Queries the fixture's root element, narrowing `nativeElement` (typed `any`) to `HTMLElement`\n * once - a generic call directly through `fixture.nativeElement.querySelectorAll<E>(...)` fails\n * with TS2347 and collapses every downstream member access to `{}`.\n */\nexport const queryAll = <E extends Element = HTMLElement>(fixture: ComponentFixture<unknown>, selector: string) =>\n Array.from((fixture.nativeElement as HTMLElement).querySelectorAll<E>(selector));\n\n/** Single-result counterpart of {@link queryAll}. */\nexport const query = <E extends Element = HTMLElement>(fixture: ComponentFixture<unknown>, selector: string) =>\n (fixture.nativeElement as HTMLElement).querySelector<E>(selector);\n\nexport const pressKey = (target: EventTarget, key: string, init: KeyboardEventInit = {}) => {\n const event = new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true, ...init });\n\n target.dispatchEvent(event);\n tick();\n\n return event;\n};\n\nexport const focusEvent = (target: EventTarget, type: 'focus' | 'blur') => {\n target.dispatchEvent(new FocusEvent(type));\n tick();\n};\n\nexport const pointerEnter = (target: EventTarget) => {\n target.dispatchEvent(new PointerEvent('pointerenter', { bubbles: false }));\n tick();\n};\n\nexport const pointerEvent = (target: EventTarget, type: string, init: PointerEventInit = {}) => {\n target.dispatchEvent(new PointerEvent(type, { bubbles: true, ...init }));\n tick();\n};\n\nexport const setInputValue = (input: HTMLInputElement, value: string) => {\n input.value = value;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n tick();\n};\n\nexport const focusField = (field: HTMLInputElement) => {\n field.focus();\n field.dispatchEvent(new FocusEvent('focus'));\n tick();\n};\n\nexport const typeInField = (field: HTMLInputElement, text: string) => {\n field.focus();\n setInputValue(field, text);\n};\n\n/**\n * Types `text` one character at a time, each with its own `input` event and the caret left after\n * the inserted character - what a real keyboard produces. Use it instead of {@link typeInField}\n * whenever the control reads or rewrites the element between keystrokes; a whole-string\n * {@link setInputValue} hides every defect that only appears mid-entry.\n */\nexport const typeChars = (field: HTMLInputElement, text: string) => {\n field.focus();\n\n for (const char of text) {\n const caret = field.selectionStart ?? field.value.length;\n\n field.value = field.value.slice(0, caret) + char + field.value.slice(caret);\n field.setSelectionRange(caret + 1, caret + 1);\n field.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText' }));\n tick();\n }\n};\n\nexport const blurField = (field: HTMLInputElement) => {\n field.blur();\n field.dispatchEvent(new Event('blur'));\n tick();\n};\n\nexport const pointerDownOutside = () => {\n document.body.dispatchEvent(new Event('pointerdown', { bubbles: true }));\n tick();\n};\n\nexport type ClipboardPayload = Readonly<Record<string, string>>;\n\n/** jsdom has no `DataTransfer`, so the clipboard payload is faked onto the event. */\nexport const pasteInto = (target: EventTarget, payload: ClipboardPayload | string) => {\n const event = new Event('paste', { bubbles: true, cancelable: true });\n const data = typeof payload === 'string' ? { 'text/plain': payload } : payload;\n\n Object.defineProperty(event, 'clipboardData', { value: { getData: (type: string) => data[type] ?? '' } });\n target.dispatchEvent(event);\n tick();\n};\n\nexport const textOf = (element: Element | null | undefined) => element?.textContent?.trim() ?? null;\n","import { Type } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { directiveAt, hostDirective, hostElement, tick } from './driver-core';\n\nexport type ControlDriverOptions = {\n /** Matches the element carrying the directive, when the host template nests it. */\n directiveSelector?: string;\n};\n\n/** The host, the directive under test, and queries scoped to the fixture - what every driver needs. */\nexport const createControlDriver = <T, D>(\n fixture: ComponentFixture<T>,\n directiveType: Type<D>,\n { directiveSelector }: ControlDriverOptions = {},\n) => {\n const control = directiveSelector\n ? directiveAt(fixture, directiveType, directiveSelector)\n : hostDirective(fixture, directiveType);\n\n const root = fixture.nativeElement as HTMLElement;\n\n const query = <E extends HTMLElement = HTMLElement>(selector: string) => root.querySelector<E>(selector);\n const queryAll = <E extends HTMLElement = HTMLElement>(selector: string) =>\n Array.from(root.querySelectorAll<E>(selector));\n\n return {\n fixture,\n host: fixture.componentInstance,\n control,\n detectChanges: () => fixture.detectChanges(),\n tick,\n\n element: () => hostElement(fixture),\n directive: <X>(type: Type<X>, selector?: string) =>\n selector ? directiveAt(fixture, type, selector) : hostDirective(fixture, type),\n query,\n queryAll,\n text: (selector: string) => query(selector)?.textContent?.trim() ?? null,\n\n click: (element: HTMLElement) => {\n element.click();\n tick();\n },\n };\n};\n","import { Type } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { ControlDriverOptions, createControlDriver } from './control-driver';\nimport { flushFrames, latestPane, pointerDownOutside, pressKey, resetOverlays, tick } from './driver-core';\n\nexport type OverlayControlDriverOptions<D> = ControlDriverOptions & {\n /** The element the user clicks to open the overlay. */\n triggerSelector?: string;\n /** How this control closes its overlay from code. */\n hide: (control: D) => void;\n};\n\n/**\n * The plumbing every overlay-backed form control driver needs: the host component, the directive,\n * the trigger, the overlay pane, and the open/close dance jsdom needs two frames for.\n */\nexport const createOverlayControlDriver = <T, D>(\n fixture: ComponentFixture<T>,\n directiveType: Type<D>,\n { triggerSelector = '[role=\"combobox\"]', hide, ...controlOptions }: OverlayControlDriverOptions<D>,\n) => {\n const base = createControlDriver(fixture, directiveType, controlOptions);\n\n const pane = () => latestPane();\n const paneEl = <E extends HTMLElement = HTMLElement>(selector: string) => pane()?.querySelector<E>(selector) ?? null;\n const paneEls = <E extends HTMLElement = HTMLElement>(selector: string) =>\n Array.from(pane()?.querySelectorAll<E>(selector) ?? []);\n\n const trigger = <E extends HTMLElement = HTMLElement>() => base.query<E>(triggerSelector)!;\n\n const settle = async () => {\n await flushFrames();\n tick();\n };\n\n const settleOpen = async () => {\n await settle();\n await settle();\n };\n\n return {\n ...base,\n settle,\n trigger,\n\n pane,\n paneEl,\n paneEls,\n\n open: async () => {\n trigger().click();\n tick();\n await settleOpen();\n },\n close: async () => {\n hide(base.control);\n tick();\n await settle();\n },\n // jsdom fires no transition events, so a leaving pane would linger and shadow the next open\n closeAndRemovePanes: () => {\n hide(base.control);\n tick();\n resetOverlays();\n tick();\n },\n press: (key: string) => pressKey(trigger(), key),\n escape: () => pressKey(document, 'Escape'),\n pointerDownOutside,\n clickInPane: (selector: string) => {\n paneEl(selector)!.click();\n tick();\n },\n };\n};\n","import { Type } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { blurField, focusField, pressKey, textOf, tick, typeChars, typeInField } from './driver-core';\nimport { ControlDriverOptions } from './control-driver';\nimport { createOverlayControlDriver } from './overlay-control-driver';\n\n/**\n * Types masked date/time text one character at a time, with the caret tracking the insertion -\n * what `InputMaskDirective`'s live reformatting needs, unlike a whole-string {@link typeInField}.\n */\nexport const typeMasked = (field: HTMLInputElement, text: string) => typeChars(field, text);\n\n/**\n * Driver for every date-time control that pairs text fields with a picker overlay: date, date\n * range, date-time, time and time range. The picker trigger is matched by its directive, so a test\n * host can put it on any element; the fields are matched by CSS, defaulting to the only `input`.\n */\nexport const createDatePickerDriver = <T, D extends { closePicker: () => void }>(\n fixture: ComponentFixture<T>,\n directiveType: Type<D>,\n options: ControlDriverOptions = {},\n) => {\n const base = createOverlayControlDriver(fixture, directiveType, {\n ...options,\n triggerSelector: '[etdatepickertrigger]',\n hide: (control) => control.closePicker(),\n });\n\n const dayCell = (label: string) =>\n base\n .paneEls<HTMLButtonElement>('.et-calendar-cell')\n .find((cell) => textOf(cell) === label && !cell.hasAttribute('data-outside-month')) ?? null;\n\n const field = (selector = 'input') => base.query<HTMLInputElement>(selector)!;\n\n return {\n ...base,\n dayCell,\n clickDayCell: (label: string) => {\n dayCell(label)!.click();\n tick();\n },\n field,\n fields: () => base.queryAll<HTMLInputElement>('input'),\n type: (text: string, selector?: string) => typeInField(field(selector), text),\n typeMasked: (text: string, selector?: string) => typeMasked(field(selector), text),\n typeAndBlur: (text: string, selector?: string) => {\n typeInField(field(selector), text);\n blurField(field(selector));\n },\n focusField: (selector?: string) => focusField(field(selector)),\n blurField: (selector?: string) => blurField(field(selector)),\n pressInField: (key: string, selector?: string) => pressKey(field(selector), key),\n };\n};\n\nexport type DatePickerDriver<T, D extends { closePicker: () => void }> = ReturnType<\n typeof createDatePickerDriver<T, D>\n>;\n","import { Provider, signal } from '@angular/core';\nimport { OverlayRuntimeCloseEvent, OverlayRuntimeCloseSource } from '@ethlete/core';\nimport { ReplaySubject, map } from 'rxjs';\nimport { OVERLAY_REF, OverlayCloseGuard, OverlayConfig, OverlayRef } from '@ethlete/components';\n\nexport type TestOverlayRef<TComponent extends object = object, TResult = unknown> = OverlayRef<TComponent, TResult> & {\n /** Every `close()` / `forceClose()` call, in order, including ones a close guard vetoed. */\n readonly closeCalls: readonly { result: TResult | undefined; source: OverlayRuntimeCloseSource; forced: boolean }[];\n /** Whether a close got past the close guards. */\n readonly isClosed: () => boolean;\n};\n\n/**\n * A standalone `OverlayRef` for unit-testing an overlay component without opening it: `close(result)`\n * runs the registered close guards, records the call and emits `beforeClosed` / `afterClosed`\n * (replayed, so a late subscriber still sees the result). Pair it with {@link provideTestOverlayRef}.\n *\n * @example\n * const ref = createTestOverlayRef<ProductResult>();\n * TestBed.configureTestingModule({ providers: [provideTestOverlayRef(ref)] });\n * // … press the component's save button …\n * expect(ref.closeCalls.at(-1)?.result).toEqual({ saved: true });\n */\nexport const createTestOverlayRef = <TResult = unknown, TComponent extends object = object>(\n config: OverlayConfig = {},\n): TestOverlayRef<TComponent, TResult> => {\n const closeCalls: { result: TResult | undefined; source: OverlayRuntimeCloseSource; forced: boolean }[] = [];\n const closeGuards = new Set<OverlayCloseGuard<TResult>>();\n const closed = signal(false);\n const busy = signal(false);\n const afterOpened$ = new ReplaySubject<void>(1);\n const beforeClosed$ = new ReplaySubject<OverlayRuntimeCloseEvent<TResult | undefined>>(1);\n const afterClosed$ = new ReplaySubject<OverlayRuntimeCloseEvent<TResult | undefined>>(1);\n\n afterOpened$.next();\n afterOpened$.complete();\n\n const requestClose = (result: TResult | undefined, source: OverlayRuntimeCloseSource, forced: boolean) => {\n closeCalls.push({ result, source, forced });\n\n if (closed()) return;\n\n const event = { result, source };\n\n if (!forced && [...closeGuards].some((guard) => !guard(event))) return;\n\n closed.set(true);\n beforeClosed$.next(event);\n beforeClosed$.complete();\n afterClosed$.next(event);\n afterClosed$.complete();\n };\n\n const mapResult = (subject: ReplaySubject<OverlayRuntimeCloseEvent<TResult | undefined>>) =>\n subject.pipe(map((event) => event.result));\n\n return {\n id: config.id ?? 'et-test-overlay',\n elements: null,\n config,\n headerTemplate: signal(null).asReadonly(),\n layout: signal(null).asReadonly(),\n componentInstance: () => null,\n close: (result) => requestClose(result, 'api', false),\n busy,\n forceClose: (result, source = 'api') => requestClose(result, source, true),\n registerCloseGuard: (guard) => {\n closeGuards.add(guard);\n\n return () => closeGuards.delete(guard);\n },\n updatePositionStrategy: () => undefined,\n afterOpened: () => afterOpened$.asObservable(),\n beforeClosed: () => mapResult(beforeClosed$),\n beforeClosedEvent: () => beforeClosed$.asObservable(),\n afterClosed: () => mapResult(afterClosed$),\n afterClosedEvent: () => afterClosed$.asObservable(),\n closeCalls,\n isClosed: closed.asReadonly(),\n };\n};\n\n/** Provides `ref` (a fresh {@link createTestOverlayRef} by default) as `OVERLAY_REF`, so `definition.injectRef()` resolves it. */\nexport const provideTestOverlayRef = <TResult = unknown>(\n ref: TestOverlayRef<object, TResult> = createTestOverlayRef<TResult>(),\n): Provider[] => [{ provide: OVERLAY_REF, useValue: ref }];\n","import { Type } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { ControlDriverOptions, createControlDriver } from './control-driver';\nimport { blurField, focusField, pointerEvent, pressKey, setInputValue, typeChars } from './driver-core';\n\nexport type FieldControlDriverOptions = ControlDriverOptions & {\n /** Matches the editable field, when it is not the host's only `input`. */\n fieldSelector?: string;\n};\n\n/**\n * The plumbing every text-field form control driver needs: the host component, the directive, the\n * native field, and the value / focus / key events a user produces on it.\n */\nexport const createFieldControlDriver = <T, D>(\n fixture: ComponentFixture<T>,\n directiveType: Type<D>,\n { fieldSelector = 'input', ...controlOptions }: FieldControlDriverOptions = {},\n) => {\n const base = createControlDriver(fixture, directiveType, controlOptions);\n\n const field = () => base.query<HTMLInputElement>(fieldSelector)!;\n\n return {\n ...base,\n\n field,\n fieldValue: () => field().value,\n placeholder: () => field().placeholder,\n\n type: (text: string) => setInputValue(field(), text),\n /** Types one character at a time - what a keyboard produces, unlike `type`'s single event. */\n typeChars: (text: string) => typeChars(field(), text),\n typeAndBlur: (text: string) => {\n setInputValue(field(), text);\n blurField(field());\n },\n focus: () => focusField(field()),\n blur: () => blurField(field()),\n\n press: (key: string, init: KeyboardEventInit = {}) => pressKey(field(), key, init),\n pointer: pointerEvent,\n };\n};\n\nexport type FieldControlDriver<T, D> = ReturnType<typeof createFieldControlDriver<T, D>>;\n","import { ComponentFixture } from '@angular/core/testing';\nimport { pasteInto, pointerEnter, pressKey, setInputValue, textOf, tick } from './driver-core';\nimport { ControlDriverOptions } from './control-driver';\nimport { createOverlayControlDriver } from './overlay-control-driver';\nimport { SelectDirective } from '@ethlete/components';\n\nexport const createSelectDriver = <T>(fixture: ComponentFixture<T>, controlOptions: ControlDriverOptions = {}) => {\n const base = createOverlayControlDriver(fixture, SelectDirective, {\n triggerSelector: '[etselecttrigger], [role=\"combobox\"]',\n hide: (select) => select.hide(),\n ...controlOptions,\n });\n\n // a trigger-inline search renders in the fixture, a panel-hosted one in the pane\n const searchInput = () =>\n (base.query<HTMLInputElement>('input[etselectsearch]') ?? base.paneEl<HTMLInputElement>('input[etselectsearch]'))!;\n\n const options = () => base.paneEls('[role=\"option\"]');\n const visibleOptions = () => base.paneEls('[role=\"option\"]:not([data-filtered])');\n const activeOption = () => base.paneEl('[role=\"option\"][data-active]');\n const optionByLabel = (label: string) => visibleOptions().find((option) => textOf(option) === label) ?? null;\n const chips = () => base.queryAll('et-chip');\n const chipRemoveButton = (index: number) => chips()[index]!.querySelector<HTMLElement>('.et-chip-remove-button');\n const optionGroups = () => base.paneEls('[role=\"group\"]');\n const virtualBody = () => base.paneEl('.et-select-virtual-options')!;\n\n return {\n ...base,\n select: base.control,\n\n searchInput,\n valueEl: () => base.query('.et-select-value'),\n valueText: () => textOf(base.query('.et-select-value')),\n chips,\n chipLabels: () => chips().map(textOf),\n chipRemoveButton,\n\n listbox: () => base.paneEl('[role=\"listbox\"]'),\n paneText: () => textOf(base.pane()),\n options,\n visibleOptions,\n activeOption,\n activeLabel: () => textOf(activeOption()),\n optionLabels: () => options().map(textOf),\n visibleLabels: () => visibleOptions().map(textOf),\n optionByLabel,\n\n optionGroups,\n groupsHidden: () => optionGroups().map((group) => group.hasAttribute('hidden')),\n groupOptionCounts: () => optionGroups().map((group) => group.querySelectorAll('[role=\"option\"]').length),\n groupLabel: (index: number) => {\n const labelledBy = optionGroups()[index]?.getAttribute('aria-labelledby');\n\n return labelledBy ? textOf(base.paneEl(`#${labelledBy}`)) : null;\n },\n\n virtualPadding: () => ({\n start: parseFloat(virtualBody().style.paddingBlockStart),\n end: parseFloat(virtualBody().style.paddingBlockEnd),\n }),\n\n clickOption: (index: number) => {\n options()[index]!.click();\n tick();\n },\n clickOptionByLabel: (label: string) => {\n optionByLabel(label)!.click();\n tick();\n },\n removeChip: (index: number) => {\n chipRemoveButton(index)!.click();\n tick();\n },\n hover: (element: HTMLElement) => pointerEnter(element),\n type: (text: string) => setInputValue(searchInput(), text),\n pressInSearch: (key: string) => pressKey(searchInput(), key),\n paste: (text: string) => pasteInto(searchInput(), text),\n };\n};\n\nexport type SelectDriver<T> = ReturnType<typeof createSelectDriver<T>>;\n","import { ComponentFixture } from '@angular/core/testing';\nimport { ControlDriverOptions, createControlDriver } from './control-driver';\nimport { pressKey } from './driver-core';\nimport { TabBarDirective } from '@ethlete/components';\n\nexport type TabBarDriverOptions = ControlDriverOptions & {\n /** Matches every trigger inside the bar. Defaults to the role every `TabBarTriggerDirective` host carries. */\n triggerSelector?: string;\n};\n\n/**\n * Wraps a mounted `[etTabBar]` host with the roving-tabindex vocabulary its keyboard model needs:\n * which trigger is currently the tab stop, and dispatching a key from wherever focus actually is.\n */\nexport const createTabBarDriver = <T>(fixture: ComponentFixture<T>, options: TabBarDriverOptions = {}) => {\n const { triggerSelector = '[role=\"tab\"]', ...controlOptions } = options;\n const base = createControlDriver(fixture, TabBarDirective, controlOptions);\n\n const triggers = () => base.queryAll<HTMLButtonElement>(triggerSelector);\n\n const trigger = (index: number) => {\n const el = triggers()[index];\n\n if (!el) throw new Error(`No tab trigger at index ${index}`);\n\n return el;\n };\n\n /** The trigger the roving-tabindex model made the tab stop - `tabindex=\"0\"` among the bar's triggers. */\n const tabbableTrigger = () => triggers().find((el) => el.getAttribute('tabindex') === '0') ?? null;\n\n const focusTabbable = () => {\n const el = tabbableTrigger();\n\n if (!el) throw new Error('No tabbable trigger - the roving-tabindex lookup found nothing');\n\n el.focus();\n base.tick();\n };\n\n /** Dispatches `key` from wherever focus currently is, falling back to the roving tab stop. */\n const press = (key: string, init?: KeyboardEventInit) => {\n const target = (document.activeElement as HTMLElement | null) ?? tabbableTrigger();\n\n if (!target) throw new Error('No focused trigger to dispatch the keydown on');\n\n return pressKey(target, key, init);\n };\n\n return {\n ...base,\n triggers,\n trigger,\n tabbableTrigger,\n focusTabbable,\n press,\n focusedIndex: () => base.control.focusedIndex(),\n selectedIndex: () => base.control.selectedIndex(),\n };\n};\n","class ResizeObserverFake {\n constructor(callback: ResizeObserverCallback) {\n void callback;\n }\n\n observe() {\n return undefined;\n }\n\n unobserve() {\n return undefined;\n }\n\n disconnect() {\n return undefined;\n }\n}\n\nclass IntersectionObserverFake {\n public readonly root = null;\n public readonly rootMargin = '';\n public readonly thresholds: number[] = [];\n\n constructor(callback: IntersectionObserverCallback) {\n void callback;\n }\n\n observe() {\n return undefined;\n }\n\n unobserve() {\n return undefined;\n }\n\n disconnect() {\n return undefined;\n }\n\n takeRecords(): IntersectionObserverEntry[] {\n return [];\n }\n}\n\nclass AnimationFake extends EventTarget {\n public finished: Promise<AnimationFake>;\n public currentTime: number | null = 0;\n public playState = 'finished';\n public onfinish: (() => void) | null = null;\n public oncancel: (() => void) | null = null;\n\n // An animation settles once: without the latch a `cancel()` before the queued auto-finish would fire\n // `oncancel` and then `onfinish`. It is set before notifying, so a handler that re-enters\n // `cancel()`/`finish()` is a no-op.\n private settled = false;\n\n constructor() {\n super();\n this.finished = Promise.resolve(this);\n queueMicrotask(() => this.finish());\n }\n\n cancel() {\n if (this.settled) return;\n this.settled = true;\n this.playState = 'idle';\n this.dispatchEvent(new Event('cancel'));\n this.oncancel?.();\n }\n\n finish() {\n if (this.settled) return;\n this.settled = true;\n this.playState = 'finished';\n this.dispatchEvent(new Event('finish'));\n this.onfinish?.();\n }\n\n play() {\n return undefined;\n }\n\n pause() {\n return undefined;\n }\n\n reverse() {\n return undefined;\n }\n\n commitStyles() {\n return undefined;\n }\n}\n\nconst fakeMediaQueryList = (query: string): MediaQueryList => ({\n matches: false,\n media: query,\n onchange: null,\n addListener: () => undefined,\n removeListener: () => undefined,\n addEventListener: () => undefined,\n removeEventListener: () => undefined,\n dispatchEvent: () => false,\n});\n\nconst defineMissing = (target: object, key: string, value: unknown) => {\n if (Reflect.get(target, key)) return;\n\n Object.defineProperty(target, key, { configurable: true, value, writable: true });\n};\n\n/**\n * Installs the browser APIs jsdom lacks and `@ethlete/components` needs to render: `ResizeObserver`,\n * `IntersectionObserver`, `matchMedia`, `Element.prototype.animate` and `Element.prototype.scroll`. Call it once in a test setup file;\n * an API that already exists is left alone. The fakes never report: observers never fire, no media query\n * matches, and an animation finishes on the next microtask.\n */\nexport const setupComponentsTestEnvironment = () => {\n defineMissing(globalThis, 'ResizeObserver', ResizeObserverFake);\n defineMissing(globalThis, 'IntersectionObserver', IntersectionObserverFake);\n defineMissing(globalThis, 'matchMedia', fakeMediaQueryList);\n defineMissing(Element.prototype, 'animate', () => new AnimationFake() as unknown as Animation);\n defineMissing(Element.prototype, 'scroll', () => undefined);\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ethlete-components-testing.mjs","names":[],"sources":["../../../../libs/components/testing/driver-core.ts","../../../../libs/components/testing/control-driver.ts","../../../../libs/components/testing/overlay-control-driver.ts","../../../../libs/components/testing/date-picker-driver.ts","../../../../libs/components/testing/fake-overlay-ref.ts","../../../../libs/components/testing/field-control-driver.ts","../../../../libs/components/testing/select-driver.ts","../../../../libs/components/testing/tabs-driver.ts","../../../../libs/components/testing/test-environment.ts"],"sourcesContent":["import { ApplicationRef, Type } from '@angular/core';\nimport { ComponentFixture, TestBed } from '@angular/core/testing';\n\nexport const tick = () => TestBed.inject(ApplicationRef).tick();\n\nexport const flushFrames = () =>\n new Promise<void>((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));\n\nexport const resetOverlays = () =>\n document.querySelectorAll('.et-overlay-runtime-entry').forEach((entry) => entry.remove());\n\n/**\n * The newest overlay pane in the document.\n *\n * Overlays render into the document, not into the fixture, and jsdom fires no transition events -\n * so a pane stuck in its leave transition stays reachable. Scope every pane query through here, or\n * a stale pane answers it.\n */\nexport const latestPane = () =>\n Array.from(document.querySelectorAll<HTMLElement>('.et-overlay-runtime-pane')).at(-1) ?? null;\n\nexport const hostDirective = <T>(fixture: ComponentFixture<unknown>, type: Type<T>) =>\n fixture.debugElement.children[0]!.injector.get(type);\n\nexport const directiveAt = <T>(fixture: ComponentFixture<unknown>, type: Type<T>, selector: string) => {\n const node = fixture.debugElement.query(\n (candidate) => (candidate.nativeElement as Element | null)?.matches?.(selector) ?? false,\n );\n\n if (!node) throw new Error(`No element in the fixture matches \"${selector}\"`);\n\n return node.injector.get(type);\n};\n\nexport const hostElement = (fixture: ComponentFixture<unknown>) =>\n fixture.debugElement.children[0]!.nativeElement as HTMLElement;\n\n/**\n * Queries the fixture's root element, narrowing `nativeElement` (typed `any`) to `HTMLElement`\n * once - a generic call directly through `fixture.nativeElement.querySelectorAll<E>(...)` fails\n * with TS2347 and collapses every downstream member access to `{}`.\n */\nexport const queryAll = <E extends Element = HTMLElement>(fixture: ComponentFixture<unknown>, selector: string) =>\n Array.from((fixture.nativeElement as HTMLElement).querySelectorAll<E>(selector));\n\n/** Single-result counterpart of {@link queryAll}. */\nexport const query = <E extends Element = HTMLElement>(fixture: ComponentFixture<unknown>, selector: string) =>\n (fixture.nativeElement as HTMLElement).querySelector<E>(selector);\n\nexport const pressKey = (target: EventTarget, key: string, init: KeyboardEventInit = {}) => {\n const event = new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true, ...init });\n\n target.dispatchEvent(event);\n tick();\n\n return event;\n};\n\nexport const focusEvent = (target: EventTarget, type: 'focus' | 'blur') => {\n target.dispatchEvent(new FocusEvent(type));\n tick();\n};\n\nexport const pointerEnter = (target: EventTarget) => {\n target.dispatchEvent(new PointerEvent('pointerenter', { bubbles: false }));\n tick();\n};\n\nexport const pointerEvent = (target: EventTarget, type: string, init: PointerEventInit = {}) => {\n target.dispatchEvent(new PointerEvent(type, { bubbles: true, ...init }));\n tick();\n};\n\nexport const setInputValue = (input: HTMLInputElement, value: string) => {\n input.value = value;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n tick();\n};\n\nexport const focusField = (field: HTMLInputElement) => {\n field.focus();\n field.dispatchEvent(new FocusEvent('focus'));\n tick();\n};\n\nexport const typeInField = (field: HTMLInputElement, text: string) => {\n field.focus();\n setInputValue(field, text);\n};\n\n/**\n * Types `text` one character at a time, each with its own `input` event and the caret left after\n * the inserted character - what a real keyboard produces. Use it instead of {@link typeInField}\n * whenever the control reads or rewrites the element between keystrokes; a whole-string\n * {@link setInputValue} hides every defect that only appears mid-entry.\n */\nexport const typeChars = (field: HTMLInputElement, text: string) => {\n field.focus();\n\n for (const char of text) {\n const caret = field.selectionStart ?? field.value.length;\n\n field.value = field.value.slice(0, caret) + char + field.value.slice(caret);\n field.setSelectionRange(caret + 1, caret + 1);\n field.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText' }));\n tick();\n }\n};\n\nexport const blurField = (field: HTMLInputElement) => {\n field.blur();\n field.dispatchEvent(new Event('blur'));\n tick();\n};\n\nexport const pointerDownOutside = () => {\n document.body.dispatchEvent(new Event('pointerdown', { bubbles: true }));\n tick();\n};\n\nexport type ClipboardPayload = Readonly<Record<string, string>>;\n\n/** jsdom has no `DataTransfer`, so the clipboard payload is faked onto the event. */\nexport const pasteInto = (target: EventTarget, payload: ClipboardPayload | string) => {\n const event = new Event('paste', { bubbles: true, cancelable: true });\n const data = typeof payload === 'string' ? { 'text/plain': payload } : payload;\n\n Object.defineProperty(event, 'clipboardData', { value: { getData: (type: string) => data[type] ?? '' } });\n target.dispatchEvent(event);\n tick();\n};\n\nexport const textOf = (element: Element | null | undefined) => element?.textContent?.trim() ?? null;\n","import { Type } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { directiveAt, hostDirective, hostElement, tick } from './driver-core';\n\nexport type ControlDriverOptions = {\n /** Matches the element carrying the directive, when the host template nests it. */\n directiveSelector?: string;\n};\n\n/** The host, the directive under test, and queries scoped to the fixture - what every driver needs. */\nexport const createControlDriver = <T, D>(\n fixture: ComponentFixture<T>,\n directiveType: Type<D>,\n { directiveSelector }: ControlDriverOptions = {},\n) => {\n const control = directiveSelector\n ? directiveAt(fixture, directiveType, directiveSelector)\n : hostDirective(fixture, directiveType);\n\n const root = fixture.nativeElement as HTMLElement;\n\n const query = <E extends HTMLElement = HTMLElement>(selector: string) => root.querySelector<E>(selector);\n const queryAll = <E extends HTMLElement = HTMLElement>(selector: string) =>\n Array.from(root.querySelectorAll<E>(selector));\n\n return {\n fixture,\n host: fixture.componentInstance,\n control,\n detectChanges: () => fixture.detectChanges(),\n tick,\n\n element: () => hostElement(fixture),\n directive: <X>(type: Type<X>, selector?: string) =>\n selector ? directiveAt(fixture, type, selector) : hostDirective(fixture, type),\n query,\n queryAll,\n text: (selector: string) => query(selector)?.textContent?.trim() ?? null,\n\n click: (element: HTMLElement) => {\n element.click();\n tick();\n },\n };\n};\n","import { Type } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { ControlDriverOptions, createControlDriver } from './control-driver';\nimport { flushFrames, latestPane, pointerDownOutside, pressKey, resetOverlays, tick } from './driver-core';\n\nexport type OverlayControlDriverOptions<D> = ControlDriverOptions & {\n /** The element the user clicks to open the overlay. */\n triggerSelector?: string;\n /** How this control closes its overlay from code. */\n hide: (control: D) => void;\n};\n\n/**\n * The plumbing every overlay-backed form control driver needs: the host component, the directive,\n * the trigger, the overlay pane, and the open/close dance jsdom needs two frames for.\n */\nexport const createOverlayControlDriver = <T, D>(\n fixture: ComponentFixture<T>,\n directiveType: Type<D>,\n { triggerSelector = '[role=\"combobox\"]', hide, ...controlOptions }: OverlayControlDriverOptions<D>,\n) => {\n const base = createControlDriver(fixture, directiveType, controlOptions);\n\n const pane = () => latestPane();\n const paneEl = <E extends HTMLElement = HTMLElement>(selector: string) => pane()?.querySelector<E>(selector) ?? null;\n const paneEls = <E extends HTMLElement = HTMLElement>(selector: string) =>\n Array.from(pane()?.querySelectorAll<E>(selector) ?? []);\n\n const trigger = <E extends HTMLElement = HTMLElement>() => base.query<E>(triggerSelector)!;\n\n const settle = async () => {\n await flushFrames();\n tick();\n };\n\n const settleOpen = async () => {\n await settle();\n await settle();\n };\n\n return {\n ...base,\n settle,\n trigger,\n\n pane,\n paneEl,\n paneEls,\n\n open: async () => {\n trigger().click();\n tick();\n await settleOpen();\n },\n close: async () => {\n hide(base.control);\n tick();\n await settle();\n },\n // jsdom fires no transition events, so a leaving pane would linger and shadow the next open\n closeAndRemovePanes: () => {\n hide(base.control);\n tick();\n resetOverlays();\n tick();\n },\n press: (key: string) => pressKey(trigger(), key),\n escape: () => pressKey(document, 'Escape'),\n pointerDownOutside,\n clickInPane: (selector: string) => {\n paneEl(selector)!.click();\n tick();\n },\n };\n};\n","import { Type } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { blurField, focusField, pressKey, textOf, tick, typeChars, typeInField } from './driver-core';\nimport { ControlDriverOptions } from './control-driver';\nimport { createOverlayControlDriver } from './overlay-control-driver';\n\n/**\n * Types masked date/time text one character at a time, with the caret tracking the insertion -\n * what `InputMaskDirective`'s live reformatting needs, unlike a whole-string {@link typeInField}.\n */\nexport const typeMasked = (field: HTMLInputElement, text: string) => typeChars(field, text);\n\n/**\n * Driver for every date-time control that pairs text fields with a picker overlay: date, date\n * range, date-time, time and time range. The picker trigger is matched by its directive, so a test\n * host can put it on any element; the fields are matched by CSS, defaulting to the only `input`.\n */\nexport const createDatePickerDriver = <T, D extends { closePicker: () => void }>(\n fixture: ComponentFixture<T>,\n directiveType: Type<D>,\n options: ControlDriverOptions = {},\n) => {\n const base = createOverlayControlDriver(fixture, directiveType, {\n ...options,\n triggerSelector: '[etdatepickertrigger]',\n hide: (control) => control.closePicker(),\n });\n\n const dayCell = (label: string) =>\n base\n .paneEls<HTMLButtonElement>('.et-calendar-cell')\n .find((cell) => textOf(cell) === label && !cell.hasAttribute('data-outside-month')) ?? null;\n\n const field = (selector = 'input') => base.query<HTMLInputElement>(selector)!;\n\n return {\n ...base,\n dayCell,\n clickDayCell: (label: string) => {\n dayCell(label)!.click();\n tick();\n },\n field,\n fields: () => base.queryAll<HTMLInputElement>('input'),\n type: (text: string, selector?: string) => typeInField(field(selector), text),\n typeMasked: (text: string, selector?: string) => typeMasked(field(selector), text),\n typeAndBlur: (text: string, selector?: string) => {\n typeInField(field(selector), text);\n blurField(field(selector));\n },\n focusField: (selector?: string) => focusField(field(selector)),\n blurField: (selector?: string) => blurField(field(selector)),\n pressInField: (key: string, selector?: string) => pressKey(field(selector), key),\n };\n};\n\nexport type DatePickerDriver<T, D extends { closePicker: () => void }> = ReturnType<\n typeof createDatePickerDriver<T, D>\n>;\n","import { Provider, signal } from '@angular/core';\nimport { OverlayRuntimeCloseEvent, OverlayRuntimeCloseSource } from '@ethlete/core';\nimport { ReplaySubject, map } from 'rxjs';\nimport { OVERLAY_REF, OverlayCloseGuard, OverlayConfig, OverlayRef } from '@ethlete/components';\n\nexport type TestOverlayRef<TComponent extends object = object, TResult = unknown> = OverlayRef<TComponent, TResult> & {\n /** Every `close()` / `forceClose()` call, in order, including ones a close guard vetoed. */\n readonly closeCalls: readonly { result: TResult | undefined; source: OverlayRuntimeCloseSource; forced: boolean }[];\n /** Whether a close got past the close guards. */\n readonly isClosed: () => boolean;\n};\n\n/**\n * A standalone `OverlayRef` for unit-testing an overlay component without opening it: `close(result)`\n * runs the registered close guards, records the call and emits `beforeClosed` / `afterClosed`\n * (replayed, so a late subscriber still sees the result). Pair it with {@link provideTestOverlayRef}.\n *\n * @example\n * const ref = createTestOverlayRef<ProductResult>();\n * TestBed.configureTestingModule({ providers: [provideTestOverlayRef(ref)] });\n * // … press the component's save button …\n * expect(ref.closeCalls.at(-1)?.result).toEqual({ saved: true });\n */\nexport const createTestOverlayRef = <TResult = unknown, TComponent extends object = object>(\n config: OverlayConfig = {},\n): TestOverlayRef<TComponent, TResult> => {\n const closeCalls: { result: TResult | undefined; source: OverlayRuntimeCloseSource; forced: boolean }[] = [];\n const closeGuards = new Set<OverlayCloseGuard<TResult>>();\n const closed = signal(false);\n const busy = signal(false);\n const afterOpened$ = new ReplaySubject<void>(1);\n const beforeClosed$ = new ReplaySubject<OverlayRuntimeCloseEvent<TResult | undefined>>(1);\n const afterClosed$ = new ReplaySubject<OverlayRuntimeCloseEvent<TResult | undefined>>(1);\n\n afterOpened$.next();\n afterOpened$.complete();\n\n const requestClose = (result: TResult | undefined, source: OverlayRuntimeCloseSource, forced: boolean) => {\n closeCalls.push({ result, source, forced });\n\n if (closed()) return;\n\n const event = { result, source };\n\n if (!forced && [...closeGuards].some((guard) => !guard(event))) return;\n\n closed.set(true);\n beforeClosed$.next(event);\n beforeClosed$.complete();\n afterClosed$.next(event);\n afterClosed$.complete();\n };\n\n const mapResult = (subject: ReplaySubject<OverlayRuntimeCloseEvent<TResult | undefined>>) =>\n subject.pipe(map((event) => event.result));\n\n return {\n id: config.id ?? 'et-test-overlay',\n elements: null,\n config,\n headerTemplate: signal(null).asReadonly(),\n layout: signal(null).asReadonly(),\n componentInstance: () => null,\n close: (result) => requestClose(result, 'api', false),\n busy,\n forceClose: (result, source = 'api') => requestClose(result, source, true),\n registerCloseGuard: (guard) => {\n closeGuards.add(guard);\n\n return () => closeGuards.delete(guard);\n },\n updatePositionStrategy: () => undefined,\n afterOpened: () => afterOpened$.asObservable(),\n beforeClosed: () => mapResult(beforeClosed$),\n beforeClosedEvent: () => beforeClosed$.asObservable(),\n afterClosed: () => mapResult(afterClosed$),\n afterClosedEvent: () => afterClosed$.asObservable(),\n closeCalls,\n isClosed: closed.asReadonly(),\n };\n};\n\n/** Provides `ref` (a fresh {@link createTestOverlayRef} by default) as `OVERLAY_REF`, so `definition.injectRef()` resolves it. */\nexport const provideTestOverlayRef = <TResult = unknown>(\n ref: TestOverlayRef<object, TResult> = createTestOverlayRef<TResult>(),\n): Provider[] => [{ provide: OVERLAY_REF, useValue: ref }];\n","import { Type } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { ControlDriverOptions, createControlDriver } from './control-driver';\nimport { blurField, focusField, pointerEvent, pressKey, setInputValue, typeChars } from './driver-core';\n\nexport type FieldControlDriverOptions = ControlDriverOptions & {\n /** Matches the editable field, when it is not the host's only `input`. */\n fieldSelector?: string;\n};\n\n/**\n * The plumbing every text-field form control driver needs: the host component, the directive, the\n * native field, and the value / focus / key events a user produces on it.\n */\nexport const createFieldControlDriver = <T, D>(\n fixture: ComponentFixture<T>,\n directiveType: Type<D>,\n { fieldSelector = 'input', ...controlOptions }: FieldControlDriverOptions = {},\n) => {\n const base = createControlDriver(fixture, directiveType, controlOptions);\n\n const field = () => base.query<HTMLInputElement>(fieldSelector)!;\n\n return {\n ...base,\n\n field,\n fieldValue: () => field().value,\n placeholder: () => field().placeholder,\n\n type: (text: string) => setInputValue(field(), text),\n /** Types one character at a time - what a keyboard produces, unlike `type`'s single event. */\n typeChars: (text: string) => typeChars(field(), text),\n typeAndBlur: (text: string) => {\n setInputValue(field(), text);\n blurField(field());\n },\n focus: () => focusField(field()),\n blur: () => blurField(field()),\n\n press: (key: string, init: KeyboardEventInit = {}) => pressKey(field(), key, init),\n pointer: pointerEvent,\n };\n};\n\nexport type FieldControlDriver<T, D> = ReturnType<typeof createFieldControlDriver<T, D>>;\n","import { ComponentFixture } from '@angular/core/testing';\nimport { pasteInto, pointerEnter, pressKey, setInputValue, textOf, tick } from './driver-core';\nimport { ControlDriverOptions } from './control-driver';\nimport { createOverlayControlDriver } from './overlay-control-driver';\nimport { SelectDirective } from '@ethlete/components';\n\nexport const createSelectDriver = <T>(fixture: ComponentFixture<T>, controlOptions: ControlDriverOptions = {}) => {\n const base = createOverlayControlDriver(fixture, SelectDirective, {\n triggerSelector: '[etselecttrigger], [role=\"combobox\"]',\n hide: (select) => select.hide(),\n ...controlOptions,\n });\n\n // a trigger-inline search renders in the fixture, a panel-hosted one in the pane\n const searchInput = () =>\n (base.query<HTMLInputElement>('input[etselectsearch]') ?? base.paneEl<HTMLInputElement>('input[etselectsearch]'))!;\n\n const options = () => base.paneEls('[role=\"option\"]');\n const visibleOptions = () => base.paneEls('[role=\"option\"]:not([data-filtered])');\n const activeOption = () => base.paneEl('[role=\"option\"][data-active]');\n const optionByLabel = (label: string) => visibleOptions().find((option) => textOf(option) === label) ?? null;\n const chips = () => base.queryAll('et-chip');\n const chipRemoveButton = (index: number) => chips()[index]!.querySelector<HTMLElement>('.et-chip-remove-button');\n const optionGroups = () => base.paneEls('[role=\"group\"]');\n const virtualBody = () => base.paneEl('.et-select-virtual-options')!;\n\n return {\n ...base,\n select: base.control,\n\n searchInput,\n valueEl: () => base.query('.et-select-value'),\n valueText: () => textOf(base.query('.et-select-value')),\n chips,\n chipLabels: () => chips().map(textOf),\n chipRemoveButton,\n\n listbox: () => base.paneEl('[role=\"listbox\"]'),\n paneText: () => textOf(base.pane()),\n options,\n visibleOptions,\n activeOption,\n activeLabel: () => textOf(activeOption()),\n optionLabels: () => options().map(textOf),\n visibleLabels: () => visibleOptions().map(textOf),\n optionByLabel,\n\n optionGroups,\n groupsHidden: () => optionGroups().map((group) => group.hasAttribute('hidden')),\n groupOptionCounts: () => optionGroups().map((group) => group.querySelectorAll('[role=\"option\"]').length),\n groupLabel: (index: number) => {\n const labelledBy = optionGroups()[index]?.getAttribute('aria-labelledby');\n\n return labelledBy ? textOf(base.paneEl(`#${labelledBy}`)) : null;\n },\n\n virtualPadding: () => ({\n start: parseFloat(virtualBody().style.paddingBlockStart),\n end: parseFloat(virtualBody().style.paddingBlockEnd),\n }),\n\n clickOption: (index: number) => {\n options()[index]!.click();\n tick();\n },\n clickOptionByLabel: (label: string) => {\n optionByLabel(label)!.click();\n tick();\n },\n removeChip: (index: number) => {\n chipRemoveButton(index)!.click();\n tick();\n },\n hover: (element: HTMLElement) => pointerEnter(element),\n type: (text: string) => setInputValue(searchInput(), text),\n pressInSearch: (key: string) => pressKey(searchInput(), key),\n paste: (text: string) => pasteInto(searchInput(), text),\n };\n};\n\nexport type SelectDriver<T> = ReturnType<typeof createSelectDriver<T>>;\n","import { ComponentFixture } from '@angular/core/testing';\nimport { ControlDriverOptions, createControlDriver } from './control-driver';\nimport { pressKey } from './driver-core';\nimport { TabBarDirective } from '@ethlete/components';\n\nexport type TabBarDriverOptions = ControlDriverOptions & {\n /** Matches every trigger inside the bar. Defaults to the role every `TabBarTriggerDirective` host carries. */\n triggerSelector?: string;\n};\n\n/**\n * Wraps a mounted `[etTabBar]` host with the roving-tabindex vocabulary its keyboard model needs:\n * which trigger is currently the tab stop, and dispatching a key from wherever focus actually is.\n */\nexport const createTabBarDriver = <T>(fixture: ComponentFixture<T>, options: TabBarDriverOptions = {}) => {\n const { triggerSelector = '[role=\"tab\"]', ...controlOptions } = options;\n const base = createControlDriver(fixture, TabBarDirective, controlOptions);\n\n const triggers = () => base.queryAll<HTMLButtonElement>(triggerSelector);\n\n const trigger = (index: number) => {\n const el = triggers()[index];\n\n if (!el) throw new Error(`No tab trigger at index ${index}`);\n\n return el;\n };\n\n /** The trigger the roving-tabindex model made the tab stop - `tabindex=\"0\"` among the bar's triggers. */\n const tabbableTrigger = () => triggers().find((el) => el.getAttribute('tabindex') === '0') ?? null;\n\n const focusTabbable = () => {\n const el = tabbableTrigger();\n\n if (!el) throw new Error('No tabbable trigger - the roving-tabindex lookup found nothing');\n\n el.focus();\n base.tick();\n };\n\n /** Dispatches `key` from wherever focus currently is, falling back to the roving tab stop. */\n const press = (key: string, init?: KeyboardEventInit) => {\n const target = (document.activeElement as HTMLElement | null) ?? tabbableTrigger();\n\n if (!target) throw new Error('No focused trigger to dispatch the keydown on');\n\n return pressKey(target, key, init);\n };\n\n return {\n ...base,\n triggers,\n trigger,\n tabbableTrigger,\n focusTabbable,\n press,\n focusedIndex: () => base.control.focusedIndex(),\n selectedIndex: () => base.control.selectedIndex(),\n };\n};\n","class ResizeObserverFake {\n constructor(callback: ResizeObserverCallback) {\n void callback;\n }\n\n observe() {\n return undefined;\n }\n\n unobserve() {\n return undefined;\n }\n\n disconnect() {\n return undefined;\n }\n}\n\nclass IntersectionObserverFake {\n public readonly root = null;\n public readonly rootMargin = '';\n public readonly thresholds: number[] = [];\n\n constructor(callback: IntersectionObserverCallback) {\n void callback;\n }\n\n observe() {\n return undefined;\n }\n\n unobserve() {\n return undefined;\n }\n\n disconnect() {\n return undefined;\n }\n\n takeRecords(): IntersectionObserverEntry[] {\n return [];\n }\n}\n\nclass AnimationFake extends EventTarget {\n public finished: Promise<AnimationFake>;\n public currentTime: number | null = 0;\n public playState = 'finished';\n public onfinish: (() => void) | null = null;\n public oncancel: (() => void) | null = null;\n\n // An animation settles once: without the latch a `cancel()` before the queued auto-finish would fire\n // `oncancel` and then `onfinish`. It is set before notifying, so a handler that re-enters\n // `cancel()`/`finish()` is a no-op.\n private settled = false;\n\n constructor() {\n super();\n this.finished = Promise.resolve(this);\n queueMicrotask(() => this.finish());\n }\n\n cancel() {\n if (this.settled) return;\n this.settled = true;\n this.playState = 'idle';\n this.dispatchEvent(new Event('cancel'));\n this.oncancel?.();\n }\n\n finish() {\n if (this.settled) return;\n this.settled = true;\n this.playState = 'finished';\n this.dispatchEvent(new Event('finish'));\n this.onfinish?.();\n }\n\n play() {\n return undefined;\n }\n\n pause() {\n return undefined;\n }\n\n reverse() {\n return undefined;\n }\n\n commitStyles() {\n return undefined;\n }\n}\n\nconst fakeMediaQueryList = (query: string): MediaQueryList => ({\n matches: false,\n media: query,\n onchange: null,\n addListener: () => undefined,\n removeListener: () => undefined,\n addEventListener: () => undefined,\n removeEventListener: () => undefined,\n dispatchEvent: () => false,\n});\n\nconst defineMissing = (target: object, key: string, value: unknown) => {\n if (Reflect.get(target, key)) return;\n\n Object.defineProperty(target, key, { configurable: true, value, writable: true });\n};\n\n/**\n * Installs the browser APIs jsdom lacks and `@ethlete/components` needs to render: `ResizeObserver`,\n * `IntersectionObserver`, `matchMedia`, `Element.prototype.animate` and `Element.prototype.scroll`. Call it once in a test setup file;\n * an API that already exists is left alone. The fakes never report: observers never fire, no media query\n * matches, and an animation finishes on the next microtask.\n */\nexport const setupComponentsTestEnvironment = () => {\n defineMissing(globalThis, 'ResizeObserver', ResizeObserverFake);\n defineMissing(globalThis, 'IntersectionObserver', IntersectionObserverFake);\n defineMissing(globalThis, 'matchMedia', fakeMediaQueryList);\n defineMissing(Element.prototype, 'animate', () => new AnimationFake() as unknown as Animation);\n defineMissing(Element.prototype, 'scroll', () => undefined);\n};\n"],"mappings":"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"}
|