@fairfox/polly 0.78.0 → 0.80.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 (97) hide show
  1. package/dist/cli/polly.js +76 -3
  2. package/dist/cli/polly.js.map +3 -3
  3. package/dist/src/background/index.js.map +3 -3
  4. package/dist/src/background/message-router.js.map +3 -3
  5. package/dist/src/client/index.js +137 -32
  6. package/dist/src/client/index.js.map +6 -5
  7. package/dist/src/client/wrapper.d.ts +39 -2
  8. package/dist/src/elysia/index.js +22 -3
  9. package/dist/src/elysia/index.js.map +5 -5
  10. package/dist/src/elysia/route-match.d.ts +13 -0
  11. package/dist/src/index.d.ts +1 -1
  12. package/dist/src/index.js +12 -2
  13. package/dist/src/index.js.map +7 -7
  14. package/dist/src/mesh.js +28 -9
  15. package/dist/src/mesh.js.map +10 -9
  16. package/dist/src/peer.js +6 -2
  17. package/dist/src/peer.js.map +5 -5
  18. package/dist/src/polly-ui/Badge.d.ts +5 -0
  19. package/dist/src/polly-ui/Button.d.ts +31 -6
  20. package/dist/src/polly-ui/Dropdown.d.ts +6 -0
  21. package/dist/src/polly-ui/Select.d.ts +11 -1
  22. package/dist/src/polly-ui/TextInput.d.ts +30 -0
  23. package/dist/src/polly-ui/index.css +10 -0
  24. package/dist/src/polly-ui/index.js +81 -32
  25. package/dist/src/polly-ui/index.js.map +10 -10
  26. package/dist/src/polly-ui/styles.css +10 -0
  27. package/dist/src/shared/adapters/index.js.map +3 -3
  28. package/dist/src/shared/lib/context-helpers.js.map +3 -3
  29. package/dist/src/shared/lib/message-bus.js.map +3 -3
  30. package/dist/src/shared/lib/resource.js +11 -2
  31. package/dist/src/shared/lib/resource.js.map +6 -6
  32. package/dist/src/shared/lib/state.d.ts +20 -0
  33. package/dist/src/shared/lib/state.js +11 -1
  34. package/dist/src/shared/lib/state.js.map +5 -5
  35. package/dist/src/shared/state/app-state.js +10 -1
  36. package/dist/src/shared/state/app-state.js.map +5 -5
  37. package/dist/tools/init/src/cli.js +23 -2
  38. package/dist/tools/init/src/cli.js.map +4 -4
  39. package/dist/tools/init/templates/pwa/package.json.template +1 -1
  40. package/dist/tools/init/templates/pwa/src/service-worker.ts.template +26 -15
  41. package/dist/tools/init/templates/pwa/src/shared-worker.ts.template +13 -3
  42. package/dist/tools/init/templates/pwa/tsconfig.json.template +2 -2
  43. package/dist/tools/init/templates/pwa/tsconfig.worker.json.template +17 -0
  44. package/dist/tools/test/src/browser/index.js +5 -2
  45. package/dist/tools/test/src/browser/index.js.map +3 -3
  46. package/dist/tools/test/src/contrast/index.js +20 -15
  47. package/dist/tools/test/src/contrast/index.js.map +3 -3
  48. package/dist/tools/test/src/coverage-policy/cli.d.ts +19 -0
  49. package/dist/tools/test/src/coverage-policy/cli.js +339 -0
  50. package/dist/tools/test/src/coverage-policy/cli.js.map +13 -0
  51. package/dist/tools/test/src/coverage-policy/discover.d.ts +23 -0
  52. package/dist/tools/test/src/coverage-policy/enforce.d.ts +54 -0
  53. package/dist/tools/test/src/coverage-policy/index.d.ts +10 -0
  54. package/dist/tools/test/src/coverage-policy/index.js +242 -0
  55. package/dist/tools/test/src/coverage-policy/index.js.map +13 -0
  56. package/dist/tools/test/src/coverage-policy/mutate-targets.d.ts +30 -0
  57. package/dist/tools/test/src/coverage-policy/types.d.ts +35 -0
  58. package/dist/tools/test/src/e2e-cli/index.d.ts +10 -0
  59. package/dist/tools/test/src/e2e-cli/run-cli.d.ts +25 -0
  60. package/dist/tools/test/src/e2e-cli/with-temp-dir.d.ts +15 -0
  61. package/dist/tools/test/src/e2e-mesh/index.js +29 -8
  62. package/dist/tools/test/src/e2e-mesh/index.js.map +7 -6
  63. package/dist/tools/test/src/e2e-mesh/launch-peer.d.ts +7 -1
  64. package/dist/tools/test/src/e2e-mesh/wait-for-convergence.d.ts +8 -0
  65. package/dist/tools/test/src/e2e-relay/index.d.ts +12 -0
  66. package/dist/tools/test/src/e2e-relay/index.js +1421 -0
  67. package/dist/tools/test/src/e2e-relay/index.js.map +30 -0
  68. package/dist/tools/test/src/e2e-relay/wait-for-relay-convergence.d.ts +35 -0
  69. package/dist/tools/test/src/e2e-relay/with-repo-server.d.ts +33 -0
  70. package/dist/tools/test/src/e2e-shared/assert.d.ts +18 -0
  71. package/dist/tools/test/src/e2e-shared/contract.d.ts +40 -0
  72. package/dist/tools/test/src/e2e-shared/index.d.ts +3 -0
  73. package/dist/tools/test/src/e2e-shared/timeout-context.d.ts +17 -0
  74. package/dist/tools/test/src/index.d.ts +1 -0
  75. package/dist/tools/test/src/index.js +16 -1
  76. package/dist/tools/test/src/index.js.map +5 -4
  77. package/dist/tools/test/src/tiers/args.d.ts +23 -0
  78. package/dist/tools/test/src/tiers/cli.d.ts +2 -0
  79. package/dist/tools/test/src/tiers/cli.js +490 -0
  80. package/dist/tools/test/src/tiers/cli.js.map +16 -0
  81. package/dist/tools/test/src/tiers/detect.d.ts +12 -0
  82. package/dist/tools/test/src/tiers/discover.d.ts +2 -0
  83. package/dist/tools/test/src/tiers/engine.d.ts +3 -0
  84. package/dist/tools/test/src/tiers/index.d.ts +14 -0
  85. package/dist/tools/test/src/tiers/protocol.d.ts +10 -0
  86. package/dist/tools/test/src/tiers/reporter.d.ts +12 -0
  87. package/dist/tools/test/src/tiers/types.d.ts +94 -0
  88. package/dist/tools/test/src/tiers/worker.d.ts +2 -0
  89. package/dist/tools/test/src/tiers/worker.js +60 -0
  90. package/dist/tools/test/src/tiers/worker.js.map +12 -0
  91. package/dist/tools/verify/src/cli.js +165 -30
  92. package/dist/tools/verify/src/cli.js.map +7 -6
  93. package/dist/tools/verify/src/stryker/index.js +20 -11
  94. package/dist/tools/verify/src/stryker/index.js.map +3 -3
  95. package/dist/tools/visualize/src/cli.js +8 -5
  96. package/dist/tools/visualize/src/cli.js.map +4 -4
  97. package/package.json +26 -6
@@ -0,0 +1,18 @@
1
+ /**
2
+ * One assertion primitive for every e2e script.
3
+ *
4
+ * Six scripts each declared their own `class AssertionError extends Error {}`
5
+ * plus an `assert()` function. This is the single shared copy. A thrown
6
+ * {@link Failure} is the canonical "clean test failure" signal: the `selfRun`
7
+ * footer and the tier engine both treat it as `pass: false` rather than a
8
+ * crash, so the distinction between "the assertion didn't hold" and "the
9
+ * harness threw" stays visible.
10
+ */
11
+ /** Thrown when an assertion does not hold. Distinct type so callers can catch it. */
12
+ export declare class Failure extends Error {
13
+ name: string;
14
+ }
15
+ /** Assert `condition`, throwing {@link Failure} with `message` when it is false. */
16
+ export declare function assert(condition: unknown, message: string): asserts condition;
17
+ /** Fail unconditionally. `never` return lets it stand in for exhaustiveness. */
18
+ export declare function fail(message: string): never;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The contract every tiered test case speaks.
3
+ *
4
+ * An e2e script is "tier-aware" when it exports an async `run(ctx)` that
5
+ * returns a {@link TierResult} instead of signalling success through
6
+ * `process.exitCode`. The engine prefers this export so it can collect a
7
+ * structured result; scripts that do not export it still run (the engine
8
+ * falls back to executing the file and reading its exit code), so the
9
+ * migration is incremental and never breaks the suite.
10
+ *
11
+ * Standalone execution is preserved: a converted script keeps a
12
+ * `if (import.meta.main) selfRun(run)` footer so `bun scripts/e2e-foo.ts`
13
+ * behaves exactly as before.
14
+ */
15
+ /** Logger handed to a case so its output can be captured/prefixed by the engine. */
16
+ export type TierLog = (message: string) => void;
17
+ /** Context passed to a case's `run()`. Kept small and forward-compatible. */
18
+ export interface TierContext {
19
+ /** Emit a progress line. Defaults to `console.log` when run standalone. */
20
+ log: TierLog;
21
+ /** Extra environment the engine wants the case to honour (e.g. SIGNALING_URL). */
22
+ env: Record<string, string | undefined>;
23
+ }
24
+ /** What a case reports back. `pass: false` with a `message` is a clean failure. */
25
+ export interface TierResult {
26
+ pass: boolean;
27
+ /** Human-readable failure reason; omitted on success. */
28
+ message?: string;
29
+ /** Optional structured detail surfaced in `--json` output. */
30
+ detail?: Record<string, unknown>;
31
+ }
32
+ export type TierRun = (ctx: TierContext) => Promise<TierResult>;
33
+ /** Build a default context for standalone (`import.meta.main`) execution. */
34
+ export declare function standaloneContext(): TierContext;
35
+ /**
36
+ * Footer helper for converted scripts: runs the case standalone, prints a
37
+ * PASS/FAIL line in the historical `[e2e] <capability>: PASS` format, and sets
38
+ * the process exit code. Keeps the file runnable on its own.
39
+ */
40
+ export declare function selfRun(capability: string, run: TierRun): Promise<void>;
@@ -0,0 +1,3 @@
1
+ export { assert, Failure, fail } from "./assert";
2
+ export { selfRun, standaloneContext, type TierContext, type TierLog, type TierResult, type TierRun, } from "./contract";
3
+ export { resolveContext } from "./timeout-context";
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @fairfox/polly/test/e2e-shared — timeout diagnostic context.
3
+ *
4
+ * A convergence poller that times out can only show the per-peer values it
5
+ * was watching. That answers "what did each peer see" but not "why" — was the
6
+ * peer ever connected to the relay, does the hub even know about the document?
7
+ * The pollers accept an optional `context()` that a caller wires to live
8
+ * transport state (e.g. `relayStats(server)`); it is evaluated ONLY on the
9
+ * timeout path and appended to the failure, so a hung e2e self-diagnoses
10
+ * instead of leaving the reader to guess.
11
+ *
12
+ * Borrowed from fairfox's `waitForLine(..., context)` pattern, where the relay
13
+ * heartbeat is embedded in every timeout so the error pinpoints sync state.
14
+ */
15
+ /** Evaluate a timeout-only diagnostic context, never letting it throw — a
16
+ * broken context must not mask the real timeout it is trying to explain. */
17
+ export declare function resolveContext(context: (() => string | Promise<string>) | undefined): Promise<string>;
@@ -17,4 +17,5 @@
17
17
  */
18
18
  export type { MockChrome, MockContextMenus, MockExtensionAdapters, MockFetch, MockLogger, MockOffscreen, MockPort, MockRuntime, MockStorageArea, MockTabs, MockWindow, } from "./adapters/index";
19
19
  export { createMockAdapters, createMockChrome, createMockContextMenus, createMockFetch, createMockLogger, createMockOffscreen, createMockPort, createMockRuntime, createMockStorageArea, createMockTabs, createMockWindow, } from "./adapters/index";
20
+ export { resolveContext } from "./e2e-shared/timeout-context";
20
21
  export { createMockRoutedMessage, expectType, noOp, noOpAsync, waitFor, waitForCondition, } from "./test-utils";
@@ -455,9 +455,24 @@ async function waitForCondition(condition, timeout = 1000, interval = 10) {
455
455
  function expectType(_value) {}
456
456
  function noOp() {}
457
457
  async function noOpAsync() {}
458
+ // tools/test/src/e2e-shared/timeout-context.ts
459
+ async function resolveContext(context) {
460
+ if (!context)
461
+ return "";
462
+ try {
463
+ return `
464
+
465
+ transport: ${await context()}`;
466
+ } catch (err) {
467
+ return `
468
+
469
+ transport: <context threw: ${err instanceof Error ? err.message : String(err)}>`;
470
+ }
471
+ }
458
472
  export {
459
473
  waitForCondition,
460
474
  waitFor,
475
+ resolveContext,
461
476
  noOpAsync,
462
477
  noOp,
463
478
  expectType,
@@ -475,4 +490,4 @@ export {
475
490
  createMockAdapters
476
491
  };
477
492
 
478
- //# debugId=C3F8571E4BAD0E3E64756E2164756E21
493
+ //# debugId=4C7C1ECF1DBCF7D064756E2164756E21
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../tools/test/src/adapters/context-menus.mock.ts", "../tools/test/src/adapters/fetch.mock.ts", "../tools/test/src/adapters/logger.mock.ts", "../tools/test/src/adapters/offscreen.mock.ts", "../tools/test/src/adapters/runtime.mock.ts", "../tools/test/src/adapters/storage.mock.ts", "../tools/test/src/adapters/tabs.mock.ts", "../tools/test/src/adapters/window.mock.ts", "../tools/test/src/adapters/index.ts", "../tools/test/src/test-utils.ts"],
3
+ "sources": ["../tools/test/src/adapters/context-menus.mock.ts", "../tools/test/src/adapters/fetch.mock.ts", "../tools/test/src/adapters/logger.mock.ts", "../tools/test/src/adapters/offscreen.mock.ts", "../tools/test/src/adapters/runtime.mock.ts", "../tools/test/src/adapters/storage.mock.ts", "../tools/test/src/adapters/tabs.mock.ts", "../tools/test/src/adapters/window.mock.ts", "../tools/test/src/adapters/index.ts", "../tools/test/src/test-utils.ts", "../tools/test/src/e2e-shared/timeout-context.ts"],
4
4
  "sourcesContent": [
5
5
  "import type { ContextMenusAdapter } from \"@/shared/adapters/context-menus.adapter\";\n\nexport interface MockContextMenus extends ContextMenusAdapter {\n _menus: Map<string, chrome.contextMenus.CreateProperties>;\n}\n\nexport function createMockContextMenus(): MockContextMenus {\n const menus = new Map<string, chrome.contextMenus.CreateProperties>();\n\n return {\n create: async (createProperties: chrome.contextMenus.CreateProperties): Promise<void> => {\n if (createProperties.id) {\n menus.set(createProperties.id, createProperties);\n }\n },\n update: async (\n _id: string,\n _updateProperties: Omit<chrome.contextMenus.CreateProperties, \"id\">\n ): Promise<void> => {\n // Mock implementation\n },\n remove: async (_id: string): Promise<void> => {\n // Mock implementation\n },\n removeAll: async (): Promise<void> => {\n // Mock implementation\n },\n onClicked: (\n _callback: (info: chrome.contextMenus.OnClickData, tab?: chrome.tabs.Tab) => void\n ): void => {\n // Mock implementation\n },\n _menus: menus,\n };\n}\n",
6
6
  "import type { FetchAdapter } from \"@/shared/adapters/fetch.adapter\";\n\nexport interface MockFetch extends FetchAdapter {\n _responses: Array<Partial<Response>>;\n _calls: Array<{ input: string | URL; init?: RequestInit }>;\n}\n\nexport function createMockFetch(): MockFetch {\n const responses: Array<Partial<Response>> = [];\n const calls: Array<{ input: string | URL; init?: RequestInit }> = [];\n\n return {\n fetch: async (input: string | URL, init?: RequestInit): Promise<Response> => {\n calls.push({ input, ...(init && { init }) });\n\n const mockResponse = responses.shift() || {\n ok: true,\n status: 200,\n headers: new Headers(),\n statusText: \"OK\",\n json: async () => ({}),\n text: async () => \"\",\n blob: async () => new Blob(),\n arrayBuffer: async () => new ArrayBuffer(0),\n formData: async () => new FormData(),\n };\n\n return mockResponse as unknown as Response;\n },\n _responses: responses,\n _calls: calls,\n };\n}\n",
@@ -11,9 +11,10 @@
11
11
  "import type { TabsAdapter } from \"@/shared/adapters/tabs.adapter\";\n\nexport interface MockTabs extends TabsAdapter {\n _tabs: Map<number, chrome.tabs.Tab>;\n}\n\nexport function createMockTabs(): MockTabs {\n const tabs = new Map<number, chrome.tabs.Tab>();\n\n return {\n query: async (queryInfo: chrome.tabs.QueryInfo): Promise<chrome.tabs.Tab[]> => {\n const results: chrome.tabs.Tab[] = [];\n for (const tab of tabs.values()) {\n let matches = true;\n if (queryInfo.active !== undefined && tab.active !== queryInfo.active) {\n matches = false;\n }\n if (queryInfo.currentWindow !== undefined) {\n matches = false;\n }\n if (matches) {\n results.push(tab);\n }\n }\n return results;\n },\n get: async (tabId: number): Promise<chrome.tabs.Tab> => {\n const tab = tabs.get(tabId);\n if (!tab) {\n throw new Error(`Tab ${tabId} not found`);\n }\n return tab;\n },\n sendMessage: async (_tabId: number, _message: unknown): Promise<unknown> => {\n return Promise.resolve({ success: true });\n },\n reload: async (\n _tabId: number,\n _reloadProperties?: { bypassCache?: boolean }\n ): Promise<void> => {\n // Mock implementation\n },\n onRemoved: (\n _callback: (tabId: number, removeInfo: chrome.tabs.OnRemovedInfo) => void\n ): void => {\n // Mock implementation - register listener\n },\n onUpdated: (\n _callback: (\n tabId: number,\n changeInfo: chrome.tabs.OnUpdatedInfo,\n tab: chrome.tabs.Tab\n ) => void\n ): void => {\n // Mock implementation - register listener\n },\n onActivated: (_callback: (activeInfo: { tabId: number; windowId: number }) => void): void => {\n // Mock implementation - register listener\n },\n create: async (createProperties: chrome.tabs.CreateProperties): Promise<chrome.tabs.Tab> => {\n const newTab: chrome.tabs.Tab = {\n id: Math.floor(Math.random() * 10000),\n index: tabs.size,\n pinned: false,\n highlighted: false,\n windowId: 1,\n active: true,\n incognito: false,\n selected: true,\n discarded: false,\n autoDiscardable: true,\n groupId: -1,\n url: createProperties.url || \"about:blank\",\n title: createProperties.url || \"New Tab\",\n frozen: false,\n };\n if (newTab.id !== undefined) {\n tabs.set(newTab.id, newTab);\n }\n return newTab;\n },\n _tabs: tabs,\n };\n}\n",
12
12
  "import type { WindowAdapter } from \"@/shared/adapters/window.adapter\";\n\nexport interface MockWindow extends WindowAdapter {\n _messageListeners: Set<(event: MessageEvent) => void>;\n}\n\nexport function createMockWindow(): MockWindow {\n const messageListeners = new Set<(event: MessageEvent) => void>();\n\n return {\n postMessage: (message: unknown, targetOrigin: string) => {\n const event = new MessageEvent(\"message\", {\n data: message,\n origin: targetOrigin,\n source: null,\n });\n for (const listener of messageListeners) {\n listener(event);\n }\n },\n addEventListener: (type: string, listener: (event: MessageEvent) => void) => {\n if (type === \"message\") {\n messageListeners.add(listener);\n }\n },\n removeEventListener: (type: string, listener: (event: MessageEvent) => void) => {\n if (type === \"message\") {\n messageListeners.delete(listener);\n }\n },\n _messageListeners: messageListeners,\n };\n}\n",
13
13
  "import { createMockContextMenus, type MockContextMenus } from \"./context-menus.mock\";\nimport { createMockFetch, type MockFetch } from \"./fetch.mock\";\nimport { createMockLogger, type MockLogger } from \"./logger.mock\";\nimport { createMockOffscreen, type MockOffscreen } from \"./offscreen.mock\";\nimport { createMockPort, createMockRuntime, type MockPort, type MockRuntime } from \"./runtime.mock\";\nimport { createMockStorageArea, type MockStorageArea } from \"./storage.mock\";\nimport { createMockTabs, type MockTabs } from \"./tabs.mock\";\nimport { createMockWindow, type MockWindow } from \"./window.mock\";\n\n/**\n * Mock adapters with full type information including mock-specific properties\n */\nexport interface MockExtensionAdapters {\n runtime: MockRuntime;\n storage: MockStorageArea;\n tabs: MockTabs;\n window: MockWindow;\n offscreen: MockOffscreen;\n contextMenus: MockContextMenus;\n fetch: MockFetch;\n logger: MockLogger;\n}\n\n/**\n * Convenience interface grouping Chrome-like mock APIs\n * Useful when tests need direct access to internal mock state\n */\nexport interface MockChrome {\n runtime: MockRuntime;\n storage: {\n local: MockStorageArea;\n };\n tabs: MockTabs;\n}\n\n/**\n * Create a mock Chrome object with grouped APIs\n * Use this when you need access to internal mock state (e.g., mockChrome.tabs._tabs)\n */\nexport function createMockChrome(): MockChrome {\n return {\n runtime: createMockRuntime(),\n storage: {\n local: createMockStorageArea(),\n },\n tabs: createMockTabs(),\n };\n}\n\n/**\n * Create a complete set of mock adapters for testing\n * Returns mock adapters with full type information\n */\nexport function createMockAdapters(): MockExtensionAdapters {\n return {\n runtime: createMockRuntime(),\n storage: createMockStorageArea(),\n tabs: createMockTabs(),\n window: createMockWindow(),\n offscreen: createMockOffscreen(),\n contextMenus: createMockContextMenus(),\n fetch: createMockFetch(),\n logger: createMockLogger({ silent: true }),\n };\n}\n\nexport type {\n MockContextMenus,\n MockFetch,\n MockLogger,\n MockOffscreen,\n MockPort,\n MockRuntime,\n MockStorageArea,\n MockTabs,\n MockWindow,\n};\n// Re-export individual mock factories and types for convenience\nexport {\n createMockContextMenus,\n createMockFetch,\n createMockLogger,\n createMockOffscreen,\n createMockPort,\n createMockRuntime,\n createMockStorageArea,\n createMockTabs,\n createMockWindow,\n};\n",
14
- "import type { ExtensionMessage, RoutedMessage } from \"@fairfox/polly/types\";\n\n/**\n * Test utilities for extension testing\n */\n\nexport function createMockRoutedMessage<T extends ExtensionMessage>(\n payload: T,\n overrides?: Partial<Omit<RoutedMessage<T>, \"payload\">>\n): RoutedMessage<T> {\n return {\n id: overrides?.id || `msg-${Date.now()}-${Math.random()}`,\n source: overrides?.source || \"background\",\n targets: overrides?.targets || [\"content\"],\n tabId: overrides?.tabId,\n timestamp: overrides?.timestamp || Date.now(),\n payload,\n };\n}\n\nexport function waitFor(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function waitForCondition(\n condition: () => boolean,\n timeout = 1000,\n interval = 10\n): Promise<void> {\n const startTime = Date.now();\n while (!condition()) {\n if (Date.now() - startTime > timeout) {\n throw new Error(\"Condition not met within timeout\");\n }\n await waitFor(interval);\n }\n}\n\nexport function expectType<T>(_value: T): void {\n // Type assertion helper for compile-time checks\n}\n\n/**\n * No-op function for mocks that don't need to do anything\n * Use this instead of empty arrow functions to satisfy linter\n */\n// biome-ignore lint/suspicious/noEmptyBlockStatements: intentional no-op for mocks\nexport function noOp(): void {}\n\n/**\n * Async no-op function for async mocks that don't need to do anything\n * Use this instead of empty async arrow functions to satisfy linter\n */\n// biome-ignore lint/suspicious/noEmptyBlockStatements: intentional no-op for mocks\nexport async function noOpAsync(): Promise<void> {}\n"
14
+ "import type { ExtensionMessage, RoutedMessage } from \"@fairfox/polly/types\";\n\n/**\n * Test utilities for extension testing\n */\n\nexport function createMockRoutedMessage<T extends ExtensionMessage>(\n payload: T,\n overrides?: Partial<Omit<RoutedMessage<T>, \"payload\">>\n): RoutedMessage<T> {\n return {\n id: overrides?.id || `msg-${Date.now()}-${Math.random()}`,\n source: overrides?.source || \"background\",\n targets: overrides?.targets || [\"content\"],\n tabId: overrides?.tabId,\n timestamp: overrides?.timestamp || Date.now(),\n payload,\n };\n}\n\nexport function waitFor(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function waitForCondition(\n condition: () => boolean,\n timeout = 1000,\n interval = 10\n): Promise<void> {\n const startTime = Date.now();\n while (!condition()) {\n if (Date.now() - startTime > timeout) {\n throw new Error(\"Condition not met within timeout\");\n }\n await waitFor(interval);\n }\n}\n\nexport function expectType<T>(_value: T): void {\n // Type assertion helper for compile-time checks\n}\n\n/**\n * No-op function for mocks that don't need to do anything\n * Use this instead of empty arrow functions to satisfy linter\n */\n// biome-ignore lint/suspicious/noEmptyBlockStatements: intentional no-op for mocks\nexport function noOp(): void {}\n\n/**\n * Async no-op function for async mocks that don't need to do anything\n * Use this instead of empty async arrow functions to satisfy linter\n */\n// biome-ignore lint/suspicious/noEmptyBlockStatements: intentional no-op for mocks\nexport async function noOpAsync(): Promise<void> {}\n",
15
+ "/**\n * @fairfox/polly/test/e2e-shared — timeout diagnostic context.\n *\n * A convergence poller that times out can only show the per-peer values it\n * was watching. That answers \"what did each peer see\" but not \"why\" — was the\n * peer ever connected to the relay, does the hub even know about the document?\n * The pollers accept an optional `context()` that a caller wires to live\n * transport state (e.g. `relayStats(server)`); it is evaluated ONLY on the\n * timeout path and appended to the failure, so a hung e2e self-diagnoses\n * instead of leaving the reader to guess.\n *\n * Borrowed from fairfox's `waitForLine(..., context)` pattern, where the relay\n * heartbeat is embedded in every timeout so the error pinpoints sync state.\n */\n\n/** Evaluate a timeout-only diagnostic context, never letting it throw — a\n * broken context must not mask the real timeout it is trying to explain. */\nexport async function resolveContext(\n context: (() => string | Promise<string>) | undefined\n): Promise<string> {\n if (!context) return \"\";\n try {\n return `\\n\\ntransport: ${await context()}`;\n } catch (err) {\n return `\\n\\ntransport: <context threw: ${err instanceof Error ? err.message : String(err)}>`;\n }\n}\n"
15
16
  ],
16
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,SAAS,sBAAsB,GAAqB;AAAA,EACzD,MAAM,QAAQ,IAAI;AAAA,EAElB,OAAO;AAAA,IACL,QAAQ,OAAO,qBAA0E;AAAA,MACvF,IAAI,iBAAiB,IAAI;AAAA,QACvB,MAAM,IAAI,iBAAiB,IAAI,gBAAgB;AAAA,MACjD;AAAA;AAAA,IAEF,QAAQ,OACN,KACA,sBACkB;AAAA,IAGpB,QAAQ,OAAO,QAA+B;AAAA,IAG9C,WAAW,YAA2B;AAAA,IAGtC,WAAW,CACT,cACS;AAAA,IAGX,QAAQ;AAAA,EACV;AAAA;;;AC1BK,SAAS,eAAe,GAAc;AAAA,EAC3C,MAAM,YAAsC,CAAC;AAAA,EAC7C,MAAM,QAA4D,CAAC;AAAA,EAEnE,OAAO;AAAA,IACL,OAAO,OAAO,OAAqB,SAA0C;AAAA,MAC3E,MAAM,KAAK,EAAE,UAAW,QAAQ,EAAE,KAAK,EAAG,CAAC;AAAA,MAE3C,MAAM,eAAe,UAAU,MAAM,KAAK;AAAA,QACxC,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS,IAAI;AAAA,QACb,YAAY;AAAA,QACZ,MAAM,aAAa,CAAC;AAAA,QACpB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY,IAAI;AAAA,QACtB,aAAa,YAAY,IAAI,YAAY,CAAC;AAAA,QAC1C,UAAU,YAAY,IAAI;AAAA,MAC5B;AAAA,MAEA,OAAO;AAAA;AAAA,IAET,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA;;;ACdK,SAAS,gBAAgB,CAAC,SAA4C;AAAA,EAC3E,MAAM,QAAmB,CAAC;AAAA,EAC1B,MAAM,SAAS,SAAS,UAAU;AAAA,EAElC,MAAM,eAAe,CAAC,OAAiB,SAAiB,YAAsC;AAAA,IAC5F,IAAI,CAAC,QAAQ;AAAA,MAEX,MAAM,gBAAgB,UAAU,UAAU,QAAQ,MAAM,QAAQ;AAAA,MAChE,cAAc,SAAS,OAAO;AAAA,IAChC;AAAA;AAAA,EAGF,OAAO;AAAA,IACL,KAAK,CAAC,SAAiB,SAAyC;AAAA,MAC9D,MAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP;AAAA,WACI,WAAW,EAAE,QAAQ;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,aAAa,SAAS,SAAS,OAAO;AAAA;AAAA,IAGxC,IAAI,CAAC,SAAiB,SAAyC;AAAA,MAC7D,MAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP;AAAA,WACI,WAAW,EAAE,QAAQ;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,aAAa,QAAQ,SAAS,OAAO;AAAA;AAAA,IAGvC,IAAI,CAAC,SAAiB,SAAyC;AAAA,MAC7D,MAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP;AAAA,WACI,WAAW,EAAE,QAAQ;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,aAAa,QAAQ,SAAS,OAAO;AAAA;AAAA,IAGvC,KAAK,CAAC,SAAiB,OAAe,SAAyC;AAAA,MAC7E,MAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP;AAAA,WACI,SAAS,EAAE,MAAM;AAAA,WACjB,WAAW,EAAE,QAAQ;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,aAAa,SAAS,SAAS,KAAK,SAAS,MAAM,CAAC;AAAA;AAAA,IAGtD,GAAG,CAAC,OAAiB,SAAiB,SAAyC;AAAA,MAC7E,MAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,WACI,WAAW,EAAE,QAAQ;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,aAAa,OAAO,SAAS,OAAO;AAAA;AAAA,IAItC,QAAQ;AAAA,IACR,MAAM,GAAG;AAAA,MACP,MAAM,SAAS;AAAA;AAAA,EAEnB;AAAA;;;AC7EK,SAAS,mBAAmB,GAAkB;AAAA,EACnD,IAAI,cAAc;AAAA,EAElB,OAAO;AAAA,IACL,gBAAgB,OAAO,gBAAkE;AAAA,MACvF,cAAc;AAAA;AAAA,IAEhB,eAAe,YAA2B;AAAA,MACxC,cAAc;AAAA;AAAA,IAEhB,aAAa,YAA8B;AAAA,MACzC,OAAO;AAAA;AAAA,IAET,cAAc;AAAA,EAChB;AAAA;;;AChBK,SAAS,cAAc,CAAC,MAAwB;AAAA,EACrD,MAAM,YAAY,IAAI;AAAA,EACtB,MAAM,sBAAsB,IAAI;AAAA,EAEhC,OAAO;AAAA,IACL;AAAA,IACA,WAAW,CAAC,aAAa,UAAU,IAAI,QAAQ;AAAA,IAC/C,cAAc,CAAC,aAAa,oBAAoB,IAAI,QAAQ;AAAA,IAC5D,aAAa,CAAC,YAAY;AAAA,MACxB,WAAW,YAAY,WAAW;AAAA,QAChC,SAAS,OAAO;AAAA,MAClB;AAAA;AAAA,IAEF,YAAY,MAAM;AAAA,MAChB,WAAW,YAAY,qBAAqB;AAAA,QAC1C,SAAS;AAAA,MACX;AAAA;AAAA,IAEF,YAAY;AAAA,IACZ,sBAAsB;AAAA,EACxB;AAAA;AAWK,SAAS,iBAAiB,CAAC,KAAK,qBAAkC;AAAA,EACvE,MAAM,mBAAmB,IAAI;AAAA,EAG7B,MAAM,mBAAmB,IAAI;AAAA,EAE7B,OAAO;AAAA,IACL;AAAA,IACA,aAAa,OAAU,YAAiC;AAAA,MAEtD,IAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,aAAa,SAAS;AAAA,QAE3E,WAAW,YAAY,kBAAkB;AAAA,UACvC,SAAS,SAAS,EAAE,KAAK,GAAG,GAAG,MAAM,EAEpC;AAAA,QACH;AAAA,QACA;AAAA,MACF;AAAA,MAGA,IAAI,iBAAiB,SAAS,GAAG;AAAA,QAC/B;AAAA,MACF;AAAA,MAEA,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,QAC9B,IAAI,WAAW;AAAA,QACf,MAAM,qBAAqB,CAAC,QAAiB;AAAA,UAC3C,IAAI,CAAC,UAAU;AAAA,YACb,WAAW;AAAA,YACX,QAAQ,GAAG;AAAA,UACb;AAAA;AAAA,QAIF,WAAW,YAAY,kBAAkB;AAAA,UACvC,MAAM,SAAS,SAAS,SAAS,EAAE,KAAK,GAAG,GAAG,kBAAkB;AAAA,UAGhE,IAAI,OAAO,WAAW,aAAa,WAAW,MAAM,CAEpD;AAAA,QACF;AAAA,QAGA,IAAI,CAAC,UAAU;AAAA,UACb,QAAQ,SAAS;AAAA,QACnB;AAAA,OACD;AAAA;AAAA,IAEH,WAAW,CACT,aAKG;AAAA,MACH,iBAAiB,IAAI,QAAQ;AAAA;AAAA,IAE/B,uBAAuB,CACrB,aAKG;AAAA,MACH,iBAAiB,OAAO,QAAQ;AAAA;AAAA,IAElC,SAAS,CAAC,SAA8B;AAAA,MACtC,MAAM,OAAO,eAAe,IAAI;AAAA,MAChC,WAAW,YAAY,kBAAkB;AAAA,QACvC,SAAS,IAAI;AAAA,MACf;AAAA,MACA,OAAO;AAAA;AAAA,IAET,WAAW,CAAC,aAA0C;AAAA,MACpD,iBAAiB,IAAI,QAAQ;AAAA;AAAA,IAE/B,QAAQ,CAAC,SAAyB;AAAA,MAChC,OAAO,sBAAsB,MAAM;AAAA;AAAA,IAErC,OAAO,MAAc;AAAA,MACnB,OAAO;AAAA;AAAA,IAET,iBAAiB,MAAY;AAAA,IAG7B,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,EACrB;AAAA;;;ACzHK,SAAS,qBAAqB,GAAoB;AAAA,EACvD,MAAM,OAAO,IAAI;AAAA,EAEjB,OAAO;AAAA,IACL,KAAK,OACH,SAEe;AAAA,MACf,IAAI,CAAC,MAAM;AAAA,QACT,OAAO,OAAO,YAAY,IAAI;AAAA,MAChC;AAAA,MACA,IAAI,OAAO,SAAS,UAAU;AAAA,QAC5B,OAAQ,KAAK,IAAI,IAAI,IAAI,GAAG,OAAO,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC;AAAA,MACzD;AAAA,MACA,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,QACvB,MAAM,UAAkC,CAAC;AAAA,QACzC,WAAW,OAAO,MAAM;AAAA,UACtB,IAAI,KAAK,IAAI,GAAG,GAAG;AAAA,YACjB,QAAO,OAAO,KAAK,IAAI,GAAG;AAAA,UAC5B;AAAA,QACF;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MAEA,MAAM,SAAkC,CAAC;AAAA,MACzC,YAAY,KAAK,iBAAiB,OAAO,QAAQ,IAAI,GAAG;AAAA,QACtD,OAAO,OAAO,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;AAAA,MAChD;AAAA,MACA,OAAO;AAAA;AAAA,IAET,KAAK,OAAO,UAAU;AAAA,MACpB,YAAY,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;AAAA,QAChD,KAAK,IAAI,KAAK,KAAK;AAAA,MACrB;AAAA;AAAA,IAEF,QAAQ,OAAO,SAAS;AAAA,MACtB,MAAM,WAAW,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAAA,MACnD,WAAW,OAAO,UAAU;AAAA,QAC1B,KAAK,OAAO,GAAG;AAAA,MACjB;AAAA;AAAA,IAEF,OAAO,YAAY;AAAA,MACjB,KAAK,MAAM;AAAA;AAAA,IAEb,WAAW,CAAC,cAAmE;AAAA,IAG/E,OAAO;AAAA,EACT;AAAA;;;AChDK,SAAS,cAAc,GAAa;AAAA,EACzC,MAAM,OAAO,IAAI;AAAA,EAEjB,OAAO;AAAA,IACL,OAAO,OAAO,cAAiE;AAAA,MAC7E,MAAM,UAA6B,CAAC;AAAA,MACpC,WAAW,OAAO,KAAK,OAAO,GAAG;AAAA,QAC/B,IAAI,UAAU;AAAA,QACd,IAAI,UAAU,WAAW,aAAa,IAAI,WAAW,UAAU,QAAQ;AAAA,UACrE,UAAU;AAAA,QACZ;AAAA,QACA,IAAI,UAAU,kBAAkB,WAAW;AAAA,UACzC,UAAU;AAAA,QACZ;AAAA,QACA,IAAI,SAAS;AAAA,UACX,QAAQ,KAAK,GAAG;AAAA,QAClB;AAAA,MACF;AAAA,MACA,OAAO;AAAA;AAAA,IAET,KAAK,OAAO,UAA4C;AAAA,MACtD,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,MAC1B,IAAI,CAAC,KAAK;AAAA,QACR,MAAM,IAAI,MAAM,OAAO,iBAAiB;AAAA,MAC1C;AAAA,MACA,OAAO;AAAA;AAAA,IAET,aAAa,OAAO,QAAgB,aAAwC;AAAA,MAC1E,OAAO,QAAQ,QAAQ,EAAE,SAAS,KAAK,CAAC;AAAA;AAAA,IAE1C,QAAQ,OACN,QACA,sBACkB;AAAA,IAGpB,WAAW,CACT,cACS;AAAA,IAGX,WAAW,CACT,cAKS;AAAA,IAGX,aAAa,CAAC,cAA+E;AAAA,IAG7F,QAAQ,OAAO,qBAA6E;AAAA,MAC1F,MAAM,SAA0B;AAAA,QAC9B,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,GAAK;AAAA,QACpC,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,KAAK,iBAAiB,OAAO;AAAA,QAC7B,OAAO,iBAAiB,OAAO;AAAA,QAC/B,QAAQ;AAAA,MACV;AAAA,MACA,IAAI,OAAO,OAAO,WAAW;AAAA,QAC3B,KAAK,IAAI,OAAO,IAAI,MAAM;AAAA,MAC5B;AAAA,MACA,OAAO;AAAA;AAAA,IAET,OAAO;AAAA,EACT;AAAA;;;AC5EK,SAAS,gBAAgB,GAAe;AAAA,EAC7C,MAAM,mBAAmB,IAAI;AAAA,EAE7B,OAAO;AAAA,IACL,aAAa,CAAC,SAAkB,iBAAyB;AAAA,MACvD,MAAM,QAAQ,IAAI,aAAa,WAAW;AAAA,QACxC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,WAAW,YAAY,kBAAkB;AAAA,QACvC,SAAS,KAAK;AAAA,MAChB;AAAA;AAAA,IAEF,kBAAkB,CAAC,MAAc,aAA4C;AAAA,MAC3E,IAAI,SAAS,WAAW;AAAA,QACtB,iBAAiB,IAAI,QAAQ;AAAA,MAC/B;AAAA;AAAA,IAEF,qBAAqB,CAAC,MAAc,aAA4C;AAAA,MAC9E,IAAI,SAAS,WAAW;AAAA,QACtB,iBAAiB,OAAO,QAAQ;AAAA,MAClC;AAAA;AAAA,IAEF,mBAAmB;AAAA,EACrB;AAAA;;;ACQK,SAAS,gBAAgB,GAAe;AAAA,EAC7C,OAAO;AAAA,IACL,SAAS,kBAAkB;AAAA,IAC3B,SAAS;AAAA,MACP,OAAO,sBAAsB;AAAA,IAC/B;AAAA,IACA,MAAM,eAAe;AAAA,EACvB;AAAA;AAOK,SAAS,kBAAkB,GAA0B;AAAA,EAC1D,OAAO;AAAA,IACL,SAAS,kBAAkB;AAAA,IAC3B,SAAS,sBAAsB;AAAA,IAC/B,MAAM,eAAe;AAAA,IACrB,QAAQ,iBAAiB;AAAA,IACzB,WAAW,oBAAoB;AAAA,IAC/B,cAAc,uBAAuB;AAAA,IACrC,OAAO,gBAAgB;AAAA,IACvB,QAAQ,iBAAiB,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC3C;AAAA;;ACzDK,SAAS,uBAAmD,CACjE,SACA,WACkB;AAAA,EAClB,OAAO;AAAA,IACL,IAAI,WAAW,MAAM,OAAO,KAAK,IAAI,KAAK,KAAK,OAAO;AAAA,IACtD,QAAQ,WAAW,UAAU;AAAA,IAC7B,SAAS,WAAW,WAAW,CAAC,SAAS;AAAA,IACzC,OAAO,WAAW;AAAA,IAClB,WAAW,WAAW,aAAa,KAAK,IAAI;AAAA,IAC5C;AAAA,EACF;AAAA;AAGK,SAAS,OAAO,CAAC,IAA2B;AAAA,EACjD,OAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA;AAGzD,eAAsB,gBAAgB,CACpC,WACA,UAAU,MACV,WAAW,IACI;AAAA,EACf,MAAM,YAAY,KAAK,IAAI;AAAA,EAC3B,OAAO,CAAC,UAAU,GAAG;AAAA,IACnB,IAAI,KAAK,IAAI,IAAI,YAAY,SAAS;AAAA,MACpC,MAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAAA,IACA,MAAM,QAAQ,QAAQ;AAAA,EACxB;AAAA;AAGK,SAAS,UAAa,CAAC,QAAiB;AASxC,SAAS,IAAI,GAAS;AAO7B,eAAsB,SAAS,GAAkB;",
17
- "debugId": "C3F8571E4BAD0E3E64756E2164756E21",
17
+ "mappings": "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",
18
+ "debugId": "4C7C1ECF1DBCF7D064756E2164756E21",
18
19
  "names": []
19
20
  }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared flag parsing for the tiered runner CLIs.
3
+ *
4
+ * Both front-ends (Polly's internal scripts/test/cli.ts and the consumer-facing
5
+ * tools/test/src/tiers/cli.ts) accept the same flags; only their tier *sets*
6
+ * differ. This keeps the surface identical.
7
+ */
8
+ export interface TierArgs {
9
+ /** Explicit tier names (positional or via --tier=a,b). */
10
+ tiers: string[];
11
+ /** --only=substr filters across tiers. */
12
+ only: string[];
13
+ all: boolean;
14
+ full: boolean;
15
+ list: boolean;
16
+ bail: boolean;
17
+ strictNeeds: boolean;
18
+ /** Path to write JSON results, or null. */
19
+ json: string | null;
20
+ }
21
+ export declare const DEFAULT_JSON = "test-results/tiers.json";
22
+ /** Parse argv into {@link TierArgs}. Exits(2) on an unknown `--flag`. */
23
+ export declare function parseTierArgs(argv: string[]): TierArgs;
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env bun
2
+ export {};