@fairfox/polly 0.91.0 → 0.92.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/polly.js +3 -3
- package/dist/cli/polly.js.map +3 -3
- package/dist/gallery/gallery.css +2 -2
- package/dist/gallery/gallery.js +248 -241
- package/dist/src/background/index.js +27 -11
- package/dist/src/background/index.js.map +2 -2
- package/dist/src/background/message-router.js +27 -11
- package/dist/src/background/message-router.js.map +2 -2
- package/dist/src/client/index.js +56 -56
- package/dist/src/client/index.js.map +4 -4
- package/dist/src/elysia/index.js +6 -6
- package/dist/src/elysia/index.js.map +3 -3
- package/dist/src/index.js +27 -11
- package/dist/src/index.js.map +2 -2
- package/dist/src/mesh.js +2 -2
- package/dist/src/mesh.js.map +3 -3
- package/dist/src/peer.js +6 -6
- package/dist/src/peer.js.map +3 -3
- package/dist/src/polly-ui/index.css +2 -2
- package/dist/src/polly-ui/markdown.js +1844 -1010
- package/dist/src/polly-ui/markdown.js.map +5 -5
- package/dist/src/polly-ui/styles.css +2 -2
- package/dist/src/shared/adapters/index.js +27 -11
- package/dist/src/shared/adapters/index.js.map +2 -2
- package/dist/src/shared/lib/context-helpers.js +27 -11
- package/dist/src/shared/lib/context-helpers.js.map +2 -2
- package/dist/src/shared/lib/message-bus.js +27 -11
- package/dist/src/shared/lib/message-bus.js.map +2 -2
- package/dist/src/shared/lib/resource.js +17 -1
- package/dist/src/shared/lib/resource.js.map +2 -2
- package/dist/src/shared/lib/state.js +17 -1
- package/dist/src/shared/lib/state.js.map +2 -2
- package/dist/src/shared/state/app-state.js +17 -1
- package/dist/src/shared/state/app-state.js.map +2 -2
- package/dist/tools/bdd/src/cli.js +20 -2
- package/dist/tools/bdd/src/cli.js.map +4 -4
- package/dist/tools/bdd/src/index.js +20 -2
- package/dist/tools/bdd/src/index.js.map +3 -3
- package/dist/tools/init/templates/pwa/package.json.template +2 -3
- package/dist/tools/mutate/src/args.d.ts +25 -3
- package/dist/tools/mutate/src/cli.js +3234 -312
- package/dist/tools/mutate/src/cli.js.map +32 -12
- package/dist/tools/mutate/src/config.d.ts +13 -2
- package/dist/tools/mutate/src/define.d.ts +76 -0
- package/dist/tools/mutate/src/engine/ast.d.ts +13 -0
- package/dist/tools/mutate/src/engine/baseline.d.ts +20 -0
- package/dist/tools/mutate/src/engine/cache.d.ts +32 -0
- package/dist/tools/mutate/src/engine/coverage.d.ts +60 -0
- package/dist/tools/mutate/src/engine/generate.d.ts +23 -0
- package/dist/tools/mutate/src/engine/graph.d.ts +11 -0
- package/dist/tools/mutate/src/engine/index.d.ts +16 -0
- package/dist/tools/mutate/src/engine/junit.d.ts +38 -0
- package/dist/tools/mutate/src/engine/operators.d.ts +14 -0
- package/dist/tools/mutate/src/engine/preload.d.ts +10 -0
- package/dist/tools/mutate/src/engine/preload.js +180 -0
- package/dist/tools/mutate/src/engine/preload.js.map +10 -0
- package/dist/tools/mutate/src/engine/probes.d.ts +12 -0
- package/dist/tools/mutate/src/engine/report-writer.d.ts +44 -0
- package/dist/tools/mutate/src/engine/runner.d.ts +31 -0
- package/dist/tools/mutate/src/engine/stray-writes.d.ts +25 -0
- package/dist/tools/mutate/src/engine/typecheck.d.ts +37 -0
- package/dist/tools/mutate/src/engine/types.d.ts +191 -0
- package/dist/tools/mutate/src/engine/verify-callsites.d.ts +9 -0
- package/dist/tools/mutate/src/engine/workdir.d.ts +16 -0
- package/dist/tools/mutate/src/engine-config.d.ts +7 -0
- package/dist/tools/mutate/src/index.d.ts +7 -3
- package/dist/tools/mutate/src/index.js +2701 -77
- package/dist/tools/mutate/src/index.js.map +26 -7
- package/dist/tools/mutate/src/ingest.d.ts +30 -1
- package/dist/tools/mutate/src/init.d.ts +2 -1
- package/dist/tools/mutate/src/migrate.d.ts +32 -0
- package/dist/tools/mutate/src/report.d.ts +3 -0
- package/dist/tools/mutate/src/run.d.ts +17 -8
- package/dist/tools/mutate/src/verify-matrix.d.ts +12 -15
- package/dist/tools/quality/src/cli.js +9 -9
- package/dist/tools/quality/src/cli.js.map +4 -4
- package/dist/tools/quality/src/index.js +9 -9
- package/dist/tools/quality/src/index.js.map +4 -4
- package/dist/tools/quality/src/no-tautology-ensures.d.ts +2 -2
- package/dist/tools/quality/src/plugins/import-checks.d.ts +1 -1
- package/dist/tools/test/src/adapters/index.js +3 -2
- package/dist/tools/test/src/adapters/index.js.map +3 -3
- package/dist/tools/test/src/coverage-policy/cli.d.ts +2 -2
- package/dist/tools/test/src/coverage-policy/cli.js +217 -17
- package/dist/tools/test/src/coverage-policy/cli.js.map +7 -5
- package/dist/tools/test/src/coverage-policy/index.d.ts +1 -1
- package/dist/tools/test/src/coverage-policy/index.js +213 -12
- package/dist/tools/test/src/coverage-policy/index.js.map +7 -5
- package/dist/tools/test/src/coverage-policy/mutate-targets.d.ts +29 -12
- package/dist/tools/test/src/e2e-mesh/index.js +6 -6
- package/dist/tools/test/src/e2e-mesh/index.js.map +4 -4
- package/dist/tools/test/src/e2e-relay/index.js +230 -226
- package/dist/tools/test/src/e2e-relay/index.js.map +7 -7
- package/dist/tools/test/src/index.js +3 -2
- package/dist/tools/test/src/index.js.map +3 -3
- package/dist/tools/test/src/visual/index.js +684 -511
- package/dist/tools/test/src/visual/index.js.map +11 -11
- package/dist/tools/verify/src/cli.js +2 -2
- package/dist/tools/verify/src/cli.js.map +3 -3
- package/dist/tools/verify/src/config.d.ts +1 -1
- package/dist/tools/verify/src/config.js +68 -3
- package/dist/tools/verify/src/config.js.map +4 -4
- package/dist/tools/verify/src/primitives/index.d.ts +34 -0
- package/package.json +29 -39
- package/dist/tools/verify/src/stryker/index.d.ts +0 -32
- package/dist/tools/verify/src/stryker/index.js +0 -86
- package/dist/tools/verify/src/stryker/index.js.map +0 -10
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* first positional argument) is a tautology: a bare literal (`true`,
|
|
6
6
|
* `false`, `null`, `undefined`, a number, a string) or a comparison of
|
|
7
7
|
* two literals (`1 === 1`). These primitives are Polly's formal-verify
|
|
8
|
-
* contracts — `ensures`/`requires` (and the wider verify family
|
|
9
|
-
*
|
|
8
|
+
* contracts — `ensures`/`requires` (and the wider verify family listed in
|
|
9
|
+
* `tools/mutate/src/engine/verify-callsites.ts`) compile away at
|
|
10
10
|
* runtime and translate to TLA+ assertions under verification. A
|
|
11
11
|
* tautological predicate therefore asserts nothing, yet reads in review
|
|
12
12
|
* like a genuine safety check. Swapping a real predicate for `true`
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* - polly:relative-imports — ban `../` imports beyond a depth threshold (#84)
|
|
5
5
|
* - polly:tsconfig-paths — ban `compilerOptions.paths` aliases (#84)
|
|
6
6
|
* - polly:no-raw-http — force HTTP through a canonical client (#86)
|
|
7
|
-
* - polly:types — multi-package
|
|
7
|
+
* - polly:types — multi-package `bun check` orchestrator (#85)
|
|
8
8
|
*
|
|
9
9
|
* All four are parameterised. Defaults are silent or zero-impact unless a
|
|
10
10
|
* consumer opts in via `polly.config.ts`. Polly's own pre-commit pipeline
|
|
@@ -297,7 +297,8 @@ function createMockTabs() {
|
|
|
297
297
|
groupId: -1,
|
|
298
298
|
url: createProperties.url || "about:blank",
|
|
299
299
|
title: createProperties.url || "New Tab",
|
|
300
|
-
frozen: false
|
|
300
|
+
frozen: false,
|
|
301
|
+
lastAccessed: 0
|
|
301
302
|
};
|
|
302
303
|
if (newTab.id !== undefined) {
|
|
303
304
|
tabs.set(newTab.id, newTab);
|
|
@@ -372,4 +373,4 @@ export {
|
|
|
372
373
|
createMockWindow
|
|
373
374
|
};
|
|
374
375
|
|
|
375
|
-
//# debugId=
|
|
376
|
+
//# debugId=66C49F02E51A2E8764756E2164756E21
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
"import type {\n CreateOffscreenDocumentParameters,\n OffscreenAdapter,\n} from \"@/shared/adapters/offscreen.adapter\";\n\nexport interface MockOffscreen extends OffscreenAdapter {\n _hasDocument: boolean;\n}\n\nexport function createMockOffscreen(): MockOffscreen {\n let hasDocument = false;\n\n return {\n createDocument: async (_parameters: CreateOffscreenDocumentParameters): Promise<void> => {\n hasDocument = true;\n },\n closeDocument: async (): Promise<void> => {\n hasDocument = false;\n },\n hasDocument: async (): Promise<boolean> => {\n return hasDocument;\n },\n _hasDocument: hasDocument,\n };\n}\n",
|
|
9
9
|
"import type { MessageSender, PortAdapter, RuntimeAdapter } from \"@/shared/adapters/runtime.adapter\";\n\nexport interface MockPort extends PortAdapter {\n _listeners: Set<(message: unknown) => void>;\n _disconnectListeners: Set<() => void>;\n}\n\nexport function createMockPort(name: string): MockPort {\n const listeners = new Set<(message: unknown) => void>();\n const disconnectListeners = new Set<() => void>();\n\n return {\n name,\n onMessage: (callback) => listeners.add(callback),\n onDisconnect: (callback) => disconnectListeners.add(callback),\n postMessage: (message) => {\n for (const listener of listeners) {\n listener(message);\n }\n },\n disconnect: () => {\n for (const listener of disconnectListeners) {\n listener();\n }\n },\n _listeners: listeners,\n _disconnectListeners: disconnectListeners,\n };\n}\n\nexport interface MockRuntime extends RuntimeAdapter {\n id: string;\n _messageListeners: Set<\n (message: unknown, sender: MessageSender, sendResponse: (response: unknown) => void) => void\n >;\n _connectListeners: Set<(port: PortAdapter) => void>;\n}\n\nexport function createMockRuntime(id = \"test-extension-id\"): MockRuntime {\n const messageListeners = new Set<\n (message: unknown, sender: MessageSender, sendResponse: (response: unknown) => void) => void\n >();\n const connectListeners = new Set<(port: PortAdapter) => void>();\n\n return {\n id,\n sendMessage: async <T>(message: T): Promise<unknown> => {\n // Check if this is a response message\n if (typeof message === \"object\" && message !== null && \"success\" in message) {\n // This is a response, route it back to all listeners\n for (const listener of messageListeners) {\n listener(message, { url: \"\" }, () => {\n // Empty response handler for mock\n });\n }\n return undefined;\n }\n\n // This is a request, call ALL listeners (Chrome calls all, but only first response is used)\n if (messageListeners.size === 0) {\n return undefined;\n }\n\n return new Promise((resolve) => {\n let resolved = false;\n const sharedSendResponse = (res: unknown) => {\n if (!resolved) {\n resolved = true;\n resolve(res);\n }\n };\n\n // Call all listeners (Chrome behavior)\n for (const listener of messageListeners) {\n const result = listener(message, { url: \"\" }, sharedSendResponse);\n // If listener returns true, it will send response asynchronously\n // If it returns false/undefined/void and we haven't resolved yet, continue to next listener\n if (typeof result === \"boolean\" && result === true) {\n // Listener will send response asynchronously, wait for it\n }\n }\n\n // If no listener handled it, resolve with undefined\n if (!resolved) {\n resolve(undefined);\n }\n });\n },\n onMessage: (\n callback: (\n message: unknown,\n sender: MessageSender,\n sendResponse: (response: unknown) => void\n ) => undefined | boolean\n ) => {\n messageListeners.add(callback);\n },\n removeMessageListener: (\n callback: (\n message: unknown,\n sender: MessageSender,\n sendResponse: (response: unknown) => void\n ) => undefined | boolean\n ) => {\n messageListeners.delete(callback);\n },\n connect: (name: string): PortAdapter => {\n const port = createMockPort(name);\n for (const listener of connectListeners) {\n listener(port);\n }\n return port;\n },\n onConnect: (callback: (port: PortAdapter) => void) => {\n connectListeners.add(callback);\n },\n getURL: (path: string): string => {\n return `chrome-extension://${id}/${path}`;\n },\n getId: (): string => {\n return id;\n },\n openOptionsPage: (): void => {\n // Mock implementation - no-op for tests\n },\n _messageListeners: messageListeners,\n _connectListeners: connectListeners,\n };\n}\n",
|
|
10
10
|
"import type { StorageAdapter, StorageChanges } from \"@/shared/adapters/storage.adapter\";\n\nexport interface MockStorageArea extends StorageAdapter {\n _data: Map<string, unknown>;\n}\n\nexport function createMockStorageArea(): MockStorageArea {\n const data = new Map<string, unknown>();\n\n return {\n get: async <T = Record<string, unknown>>(\n keys?: string | string[] | Record<string, unknown> | null\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Mock storage needs to handle multiple key types\n ): Promise<T> => {\n if (!keys) {\n return Object.fromEntries(data) as unknown as T;\n }\n if (typeof keys === \"string\") {\n return (data.has(keys) ? { [keys]: data.get(keys) } : {}) as unknown as T;\n }\n if (Array.isArray(keys)) {\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n if (data.has(key)) {\n result[key] = data.get(key);\n }\n }\n return result as unknown as T;\n }\n // Object with defaults\n const result: Record<string, unknown> = {};\n for (const [key, defaultValue] of Object.entries(keys)) {\n result[key] = data.has(key) ? data.get(key) : defaultValue;\n }\n return result as unknown as T;\n },\n set: async (items) => {\n for (const [key, value] of Object.entries(items)) {\n data.set(key, value);\n }\n },\n remove: async (keys) => {\n const keyArray = Array.isArray(keys) ? keys : [keys];\n for (const key of keyArray) {\n data.delete(key);\n }\n },\n clear: async () => {\n data.clear();\n },\n onChanged: (_callback: (changes: StorageChanges, areaName: string) => void) => {\n // Mock implementation - not needed for current tests\n },\n _data: data,\n };\n}\n",
|
|
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",
|
|
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 lastAccessed: 0,\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
14
|
],
|
|
15
|
-
"mappings": "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
|
|
16
|
-
"debugId": "
|
|
15
|
+
"mappings": "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",
|
|
16
|
+
"debugId": "66C49F02E51A2E8764756E2164756E21",
|
|
17
17
|
"names": []
|
|
18
18
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @fairfox/polly/test/coverage — consumer-facing `polly coverage`.
|
|
4
4
|
*
|
|
5
5
|
* Zero-config: run it in any Polly project and it reports per-file coverage,
|
|
6
|
-
* orphan source files, and (if a
|
|
6
|
+
* orphan source files, and (if a mutation config is present) dead mutate/test
|
|
7
7
|
* globs. Add a `coverage.config.ts` with a `defaultThreshold` to turn the
|
|
8
8
|
* report into an enforced gate, and `exempt` entries to record which
|
|
9
9
|
* higher-tier test covers a unit-thin file.
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* polly coverage # report (zero-config) or enforce (with config)
|
|
13
13
|
* polly coverage --strict-orphans # fail on source no unit test imports
|
|
14
14
|
* polly coverage --orphans # list the orphan files
|
|
15
|
-
* polly coverage --no-mutate # skip the
|
|
15
|
+
* polly coverage --no-mutate # skip the mutate-target check
|
|
16
16
|
* polly coverage --config <path> # explicit coverage.config.ts
|
|
17
17
|
* bun test --coverage | polly coverage --stdin
|
|
18
18
|
*/
|
|
@@ -171,8 +171,184 @@ init_enforce();
|
|
|
171
171
|
|
|
172
172
|
// tools/test/src/coverage-policy/mutate-targets.ts
|
|
173
173
|
import { existsSync as existsSync3, readFileSync } from "node:fs";
|
|
174
|
-
import { join as join3, resolve as resolve3 } from "node:path";
|
|
174
|
+
import { dirname, join as join3, resolve as resolve3 } from "node:path";
|
|
175
175
|
import { Glob as Glob2 } from "bun";
|
|
176
|
+
|
|
177
|
+
// src/shared/lib/guards.ts
|
|
178
|
+
function isRecord(input) {
|
|
179
|
+
return typeof input === "object" && input !== null && !Array.isArray(input);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// tools/mutate/src/define.ts
|
|
183
|
+
var MUTATION_CONFIG_FILE = "polly.mutate.ts";
|
|
184
|
+
function defineMutation(config) {
|
|
185
|
+
return config;
|
|
186
|
+
}
|
|
187
|
+
var MUTATOR_NAMES = new Set([
|
|
188
|
+
"ArithmeticOperator",
|
|
189
|
+
"ArrayDeclaration",
|
|
190
|
+
"ArrowFunction",
|
|
191
|
+
"AssignmentOperator",
|
|
192
|
+
"BlockStatement",
|
|
193
|
+
"BooleanLiteral",
|
|
194
|
+
"ConditionalExpression",
|
|
195
|
+
"EqualityOperator",
|
|
196
|
+
"LogicalOperator",
|
|
197
|
+
"MethodExpression",
|
|
198
|
+
"ObjectLiteral",
|
|
199
|
+
"OptionalChaining",
|
|
200
|
+
"Regex",
|
|
201
|
+
"StringLiteral",
|
|
202
|
+
"UnaryOperator",
|
|
203
|
+
"UpdateOperator"
|
|
204
|
+
]);
|
|
205
|
+
function isMutatorName(value) {
|
|
206
|
+
return typeof value === "string" && MUTATOR_NAMES.has(value);
|
|
207
|
+
}
|
|
208
|
+
function strings(value, where) {
|
|
209
|
+
if (!Array.isArray(value) || !value.every((v) => typeof v === "string")) {
|
|
210
|
+
throw new Error(`${where} must be an array of strings`);
|
|
211
|
+
}
|
|
212
|
+
return value;
|
|
213
|
+
}
|
|
214
|
+
function optionalNumber(value, where) {
|
|
215
|
+
if (value === undefined)
|
|
216
|
+
return;
|
|
217
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
218
|
+
throw new Error(`${where} must be a number`);
|
|
219
|
+
return value;
|
|
220
|
+
}
|
|
221
|
+
function optionalString(value, where) {
|
|
222
|
+
if (value === undefined)
|
|
223
|
+
return;
|
|
224
|
+
if (typeof value !== "string")
|
|
225
|
+
throw new Error(`${where} must be a string`);
|
|
226
|
+
return value;
|
|
227
|
+
}
|
|
228
|
+
function isEngineMode(v) {
|
|
229
|
+
return v === "fast" || v === "matrix";
|
|
230
|
+
}
|
|
231
|
+
function isCoverageMode(v) {
|
|
232
|
+
return v === "dynamic" || v === "static";
|
|
233
|
+
}
|
|
234
|
+
function parseRun(raw, where) {
|
|
235
|
+
const mode = raw["mode"];
|
|
236
|
+
if (mode !== undefined && !isEngineMode(mode)) {
|
|
237
|
+
throw new Error(`${where}: mode must be "fast" or "matrix"`);
|
|
238
|
+
}
|
|
239
|
+
const concurrency = optionalNumber(raw["concurrency"], `${where}: concurrency`);
|
|
240
|
+
if (concurrency !== undefined && !(Number.isInteger(concurrency) && concurrency > 0)) {
|
|
241
|
+
throw new Error(`${where}: concurrency must be a positive integer`);
|
|
242
|
+
}
|
|
243
|
+
const coverage = raw["coverage"];
|
|
244
|
+
if (coverage !== undefined && !isCoverageMode(coverage)) {
|
|
245
|
+
throw new Error(`${where}: coverage must be "dynamic" or "static"`);
|
|
246
|
+
}
|
|
247
|
+
const common = { targets: strings(raw["targets"], `${where}: targets`) };
|
|
248
|
+
if (isEngineMode(mode))
|
|
249
|
+
common.mode = mode;
|
|
250
|
+
if (isCoverageMode(coverage))
|
|
251
|
+
common.coverage = coverage;
|
|
252
|
+
if (concurrency !== undefined)
|
|
253
|
+
common.concurrency = concurrency;
|
|
254
|
+
const timeout = raw["timeout"];
|
|
255
|
+
if (timeout !== undefined) {
|
|
256
|
+
if (!isRecord(timeout))
|
|
257
|
+
throw new Error(`${where}: timeout must be { factor, extraMs }`);
|
|
258
|
+
const factor = optionalNumber(timeout["factor"], `${where}: timeout.factor`) ?? 2;
|
|
259
|
+
const extraMs = optionalNumber(timeout["extraMs"], `${where}: timeout.extraMs`) ?? 3000;
|
|
260
|
+
common.timeout = { factor, extraMs };
|
|
261
|
+
}
|
|
262
|
+
return common;
|
|
263
|
+
}
|
|
264
|
+
function parseMutants(raw, where) {
|
|
265
|
+
const out = {};
|
|
266
|
+
const mutators = raw["mutators"];
|
|
267
|
+
if (mutators !== undefined) {
|
|
268
|
+
if (!isRecord(mutators))
|
|
269
|
+
throw new Error(`${where}: mutators must be { exclude }`);
|
|
270
|
+
const exclude = mutators["exclude"] === undefined ? [] : mutators["exclude"];
|
|
271
|
+
if (!Array.isArray(exclude) || !exclude.every(isMutatorName)) {
|
|
272
|
+
throw new Error(`${where}: mutators.exclude holds an unknown mutator name`);
|
|
273
|
+
}
|
|
274
|
+
out.mutators = { exclude };
|
|
275
|
+
}
|
|
276
|
+
const ignore = raw["ignoreVerifyCallsites"];
|
|
277
|
+
if (ignore !== undefined) {
|
|
278
|
+
if (typeof ignore !== "boolean")
|
|
279
|
+
throw new Error(`${where}: ignoreVerifyCallsites must be boolean`);
|
|
280
|
+
out.ignoreVerifyCallsites = ignore;
|
|
281
|
+
}
|
|
282
|
+
const typecheck = raw["typecheck"];
|
|
283
|
+
if (typecheck !== undefined) {
|
|
284
|
+
if (typeof typecheck !== "boolean")
|
|
285
|
+
throw new Error(`${where}: typecheck must be boolean`);
|
|
286
|
+
out.typecheck = typecheck;
|
|
287
|
+
}
|
|
288
|
+
return { ...out, ...parseContracts(raw, where) };
|
|
289
|
+
}
|
|
290
|
+
function isContractsMode(v) {
|
|
291
|
+
return v === "off" || v === "ensures" || v === "all";
|
|
292
|
+
}
|
|
293
|
+
function parseContracts(raw, where) {
|
|
294
|
+
const contracts = raw["contracts"];
|
|
295
|
+
if (contracts === undefined)
|
|
296
|
+
return {};
|
|
297
|
+
if (!isContractsMode(contracts)) {
|
|
298
|
+
throw new Error(`${where}: contracts must be "off", "ensures" or "all"`);
|
|
299
|
+
}
|
|
300
|
+
return { contracts };
|
|
301
|
+
}
|
|
302
|
+
function parseOutputs(raw, where) {
|
|
303
|
+
const out = {};
|
|
304
|
+
const thresholds = raw["thresholds"];
|
|
305
|
+
if (thresholds !== undefined) {
|
|
306
|
+
if (!isRecord(thresholds))
|
|
307
|
+
throw new Error(`${where}: thresholds must be { break }`);
|
|
308
|
+
const brk = optionalNumber(thresholds["break"], `${where}: thresholds.break`);
|
|
309
|
+
out.thresholds = brk === undefined ? {} : { break: brk };
|
|
310
|
+
}
|
|
311
|
+
const report = optionalString(raw["report"], `${where}: report`);
|
|
312
|
+
if (report !== undefined)
|
|
313
|
+
out.report = report;
|
|
314
|
+
const decisions = optionalString(raw["decisions"], `${where}: decisions`);
|
|
315
|
+
if (decisions !== undefined)
|
|
316
|
+
out.decisions = decisions;
|
|
317
|
+
return out;
|
|
318
|
+
}
|
|
319
|
+
function parseCommon(raw, where) {
|
|
320
|
+
return { ...parseRun(raw, where), ...parseMutants(raw, where), ...parseOutputs(raw, where) };
|
|
321
|
+
}
|
|
322
|
+
function parseMutationConfig(raw, where) {
|
|
323
|
+
if (!isRecord(raw))
|
|
324
|
+
throw new Error(`${where}: the default export must be a config object`);
|
|
325
|
+
const { targets, ...common } = parseCommon(raw, where);
|
|
326
|
+
const runner = raw["runner"];
|
|
327
|
+
if (isRecord(runner) && runner["kind"] === "command") {
|
|
328
|
+
const argv = strings(runner["argv"], `${where}: runner.argv`);
|
|
329
|
+
if (argv.length === 0)
|
|
330
|
+
throw new Error(`${where}: runner.argv is empty`);
|
|
331
|
+
return { targets, runner: { kind: "command", argv }, ...common };
|
|
332
|
+
}
|
|
333
|
+
if (runner !== undefined && !(isRecord(runner) && runner["kind"] === "bun-test")) {
|
|
334
|
+
throw new Error(`${where}: runner.kind must be "bun-test" or "command"`);
|
|
335
|
+
}
|
|
336
|
+
const tests = raw["tests"];
|
|
337
|
+
if (!isRecord(tests))
|
|
338
|
+
throw new Error(`${where}: tests.include is required`);
|
|
339
|
+
const include = strings(tests["include"], `${where}: tests.include`);
|
|
340
|
+
if (include.length === 0)
|
|
341
|
+
throw new Error(`${where}: tests.include is empty`);
|
|
342
|
+
const preload = tests["preload"] === undefined ? undefined : strings(tests["preload"], `${where}: tests.preload`);
|
|
343
|
+
return { targets, tests: preload ? { include, preload } : { include }, ...common };
|
|
344
|
+
}
|
|
345
|
+
async function loadMutationConfig(path) {
|
|
346
|
+
const mod = await import(path);
|
|
347
|
+
const raw = isRecord(mod) ? mod["default"] : undefined;
|
|
348
|
+
return parseMutationConfig(raw, path);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// tools/test/src/coverage-policy/mutate-targets.ts
|
|
176
352
|
async function findStrykerConfigs(root) {
|
|
177
353
|
const found = [];
|
|
178
354
|
const single = join3(root, "stryker.conf.json");
|
|
@@ -184,12 +360,37 @@ async function findStrykerConfigs(root) {
|
|
|
184
360
|
}
|
|
185
361
|
return found.sort();
|
|
186
362
|
}
|
|
363
|
+
async function findMutateConfigs(root) {
|
|
364
|
+
const out = [];
|
|
365
|
+
const polly = join3(root, MUTATION_CONFIG_FILE);
|
|
366
|
+
if (existsSync3(polly)) {
|
|
367
|
+
const config = await loadMutationConfig(polly);
|
|
368
|
+
out.push({
|
|
369
|
+
path: polly,
|
|
370
|
+
format: "polly",
|
|
371
|
+
targets: { field: "targets", patterns: config.targets },
|
|
372
|
+
tests: { field: "tests.include", patterns: config.tests?.include ?? [] }
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
for (const path of await findStrykerConfigs(root)) {
|
|
376
|
+
const config = JSON.parse(readFileSync(path, "utf8"));
|
|
377
|
+
out.push({
|
|
378
|
+
path,
|
|
379
|
+
format: "stryker",
|
|
380
|
+
targets: { field: "mutate", patterns: config.mutate ?? [] },
|
|
381
|
+
tests: { field: "testFiles", patterns: config.testFiles ?? config.bun?.testFiles ?? [] }
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
return out;
|
|
385
|
+
}
|
|
187
386
|
function isGlob(pattern) {
|
|
188
387
|
return pattern.includes("*") || pattern.includes("?") || pattern.includes("[");
|
|
189
388
|
}
|
|
190
|
-
|
|
191
|
-
|
|
389
|
+
var LINE_RANGE = /:\d+(?::\d+)?-\d+(?::\d+)?$/;
|
|
390
|
+
async function resolvesToFile(entry, cwd) {
|
|
391
|
+
if (entry.startsWith("!"))
|
|
192
392
|
return true;
|
|
393
|
+
const pattern = entry.replace(LINE_RANGE, "");
|
|
193
394
|
if (!isGlob(pattern))
|
|
194
395
|
return existsSync3(resolve3(cwd, pattern));
|
|
195
396
|
const glob = new Glob2(pattern);
|
|
@@ -199,7 +400,7 @@ async function resolvesToFile(pattern, cwd) {
|
|
|
199
400
|
}
|
|
200
401
|
async function checkField(configPath, field, patterns, cwd) {
|
|
201
402
|
const issues = [];
|
|
202
|
-
for (const pattern of patterns
|
|
403
|
+
for (const pattern of patterns) {
|
|
203
404
|
if (!await resolvesToFile(pattern, cwd)) {
|
|
204
405
|
issues.push({ config: configPath, field, pattern });
|
|
205
406
|
}
|
|
@@ -207,15 +408,14 @@ async function checkField(configPath, field, patterns, cwd) {
|
|
|
207
408
|
return issues;
|
|
208
409
|
}
|
|
209
410
|
async function validateMutateTargets(root) {
|
|
210
|
-
const configs = await
|
|
411
|
+
const configs = await findMutateConfigs(root);
|
|
211
412
|
const issues = [];
|
|
212
|
-
for (const
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
issues.push(...await checkField(
|
|
216
|
-
issues.push(...await checkField(configPath, "testFiles", testFiles, root));
|
|
413
|
+
for (const c of configs) {
|
|
414
|
+
const cwd = c.format === "polly" ? dirname(c.path) : root;
|
|
415
|
+
issues.push(...await checkField(c.path, c.targets.field, c.targets.patterns, cwd));
|
|
416
|
+
issues.push(...await checkField(c.path, c.tests.field, c.tests.patterns, cwd));
|
|
217
417
|
}
|
|
218
|
-
return { configs, issues };
|
|
418
|
+
return { configs: configs.map((c) => c.path), issues };
|
|
219
419
|
}
|
|
220
420
|
|
|
221
421
|
// tools/test/src/coverage-policy/cli.ts
|
|
@@ -276,7 +476,7 @@ function reportOrphans(f, args) {
|
|
|
276
476
|
function reportMutate(report) {
|
|
277
477
|
if (report.issues.length === 0)
|
|
278
478
|
return;
|
|
279
|
-
process.stderr.write(`❌ ${report.issues.length}
|
|
479
|
+
process.stderr.write(`❌ ${report.issues.length} mutate target(s) resolve to no files:
|
|
280
480
|
`);
|
|
281
481
|
for (const i of report.issues) {
|
|
282
482
|
process.stderr.write(` ${i.config} [${i.field}] ${i.pattern}
|
|
@@ -284,15 +484,15 @@ function reportMutate(report) {
|
|
|
284
484
|
}
|
|
285
485
|
}
|
|
286
486
|
function showHelp() {
|
|
287
|
-
process.stdout.write(`polly coverage — coverage policy, orphan detection,
|
|
487
|
+
process.stdout.write(`polly coverage — coverage policy, orphan detection, mutate-target validation
|
|
288
488
|
|
|
289
489
|
` + ` Coverage that a line ran isn't proof anything checks it. This enforces a
|
|
290
490
|
` + ` per-file floor with explicit, owned exemptions so test debt stays visible,
|
|
291
|
-
` + ` and flags orphans (source no test imports) and drifted
|
|
491
|
+
` + ` and flags orphans (source no test imports) and drifted mutate targets.
|
|
292
492
|
|
|
293
493
|
` + ` --strict-orphans fail on source no unit test imports
|
|
294
494
|
` + ` --orphans list orphan files
|
|
295
|
-
` + ` --no-mutate skip the
|
|
495
|
+
` + ` --no-mutate skip the mutation target/test-glob check
|
|
296
496
|
` + ` --config <path> explicit coverage.config.ts
|
|
297
497
|
` + " --stdin read a `bun test --coverage` table from stdin\n");
|
|
298
498
|
}
|
|
@@ -320,7 +520,7 @@ async function main() {
|
|
|
320
520
|
const mode = findings.enforced ? `floor enforced` : "report-only (no defaultThreshold)";
|
|
321
521
|
const where = source ? "" : " — zero-config";
|
|
322
522
|
const orphanNote = findings.orphans.length ? `, ${findings.orphans.length} orphan` : "";
|
|
323
|
-
const mutateNote = mutate.configs.length ? `, ${mutate.configs.length}
|
|
523
|
+
const mutateNote = mutate.configs.length ? `, ${mutate.configs.length} mutation config(s) ok` : "";
|
|
324
524
|
process.stdout.write(`✅ coverage ok — ${findings.rowCount} src files, ${mode}${where}${orphanNote}${mutateNote}
|
|
325
525
|
`);
|
|
326
526
|
}
|
|
@@ -328,4 +528,4 @@ async function main() {
|
|
|
328
528
|
}
|
|
329
529
|
await main();
|
|
330
530
|
|
|
331
|
-
//# debugId=
|
|
531
|
+
//# debugId=CE201D1B3DC4BC5164756E2164756E21
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../tools/test/src/coverage-policy/enforce.ts", "../tools/test/src/coverage-policy/discover.ts", "../tools/test/src/coverage-policy/cli.ts", "../tools/test/src/coverage-policy/mutate-targets.ts"],
|
|
3
|
+
"sources": ["../tools/test/src/coverage-policy/enforce.ts", "../tools/test/src/coverage-policy/discover.ts", "../tools/test/src/coverage-policy/cli.ts", "../tools/test/src/coverage-policy/mutate-targets.ts", "../src/shared/lib/guards.ts", "../tools/mutate/src/define.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * @fairfox/polly/test/coverage — the coverage-policy engine.\n *\n * Parses a `bun test --coverage` table and applies a {@link CoverageConfig}.\n * It fails on four conditions, not just low numbers: a non-exempt file below\n * the floor, an exempt key whose source no longer exists, an exemption whose\n * `claimedBy` test no longer exists, and an exempt file that has climbed back\n * over the floor (promote it). It also reports orphans — source files no unit\n * test imports, the blind spot a coverage table can't show.\n *\n * Everything here is parameterised by the project root, so the same engine\n * backs Polly's own gate and the consumer-facing `polly coverage` command.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Glob } from \"bun\";\nimport type { CoverageConfig } from \"./types\";\n\nexport interface CoverageRow {\n /** Project-relative, e.g. `src/shared/lib/state.ts`. */\n file: string;\n funcs: number;\n lines: number;\n}\n\nexport interface Violation {\n file: string;\n metric: \"lines\" | \"funcs\";\n observed: number;\n required: number;\n}\n\nexport interface CoverageFindings {\n rowCount: number;\n violations: Violation[];\n staleExempts: string[];\n missingExemptFiles: string[];\n missingClaimedBy: Array<{ file: string; claimedBy: string }>;\n orphans: string[];\n /** True when a floor was configured; false means report-only. */\n enforced: boolean;\n}\n\nconst DEFAULT_SRC = \"src\";\n\n/** `../src/foo.ts` (run from a subdir) → `src/foo.ts` (project-relative). */\nfunction normalizePath(raw: string): string {\n return raw.replace(/^(?:\\.\\.\\/)+/, \"\");\n}\n\n/**\n * Parse the `bun test --coverage` table. Only rows under `srcDir` are\n * policy-bearing; the `All files` summary and test-infra rows are skipped.\n * Column order is `File | % Funcs | % Lines | Uncovered`.\n */\nexport function parseCoverageTable(text: string, srcDir: string): CoverageRow[] {\n const prefix = `${srcDir}/`;\n const rows: CoverageRow[] = [];\n for (const line of text.split(\"\\n\")) {\n if (!line.includes(\"|\")) continue;\n if (line.includes(\"All files\") || line.includes(\"% Funcs\")) continue;\n if (line.trim().startsWith(\"---\")) continue;\n\n const cells = line.split(\"|\").map((c) => c.trim());\n if (cells.length < 3) continue;\n\n const file = normalizePath(cells[0] ?? \"\");\n const funcs = Number(cells[1]);\n const lines = Number(cells[2]);\n if (!file.startsWith(prefix) || Number.isNaN(funcs) || Number.isNaN(lines)) continue;\n\n rows.push({ file, funcs, lines });\n }\n return rows;\n}\n\n/** Run `bun test --coverage` in the configured cwd and return combined output. */\nexport async function runCoverage(root: string, testCwd: string): Promise<string> {\n const proc = Bun.spawn([\"bun\", \"test\", \"--coverage\"], {\n cwd: join(root, testCwd),\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n const [out, err] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n ]);\n await proc.exited;\n if (proc.exitCode !== 0) {\n throw new Error(`bun test --coverage exited ${proc.exitCode}\\n${err}`);\n }\n return `${out}\\n${err}`;\n}\n\nfunction evaluateRows(\n rows: CoverageRow[],\n config: CoverageConfig\n): { violations: Violation[]; staleExempts: string[] } {\n const t = config.defaultThreshold;\n const exempt = config.exempt ?? {};\n const violations: Violation[] = [];\n const staleExempts: string[] = [];\n if (!t) return { violations, staleExempts };\n\n for (const row of rows) {\n if (exempt[row.file]) {\n if (row.lines >= t.lines && row.funcs >= t.funcs) staleExempts.push(row.file);\n continue;\n }\n if (row.lines < t.lines) {\n violations.push({ file: row.file, metric: \"lines\", observed: row.lines, required: t.lines });\n }\n if (row.funcs < t.funcs) {\n violations.push({ file: row.file, metric: \"funcs\", observed: row.funcs, required: t.funcs });\n }\n }\n return { violations, staleExempts };\n}\n\nfunction validateExemptions(\n root: string,\n config: CoverageConfig\n): { missingExemptFiles: string[]; missingClaimedBy: Array<{ file: string; claimedBy: string }> } {\n const missingExemptFiles: string[] = [];\n const missingClaimedBy: Array<{ file: string; claimedBy: string }> = [];\n for (const [file, entry] of Object.entries(config.exempt ?? {})) {\n if (!existsSync(resolve(root, file))) missingExemptFiles.push(file);\n const claimedBy = entry.claimedBy.trim();\n if (!claimedBy.startsWith(\"n/a\") && !existsSync(resolve(root, claimedBy))) {\n missingClaimedBy.push({ file, claimedBy });\n }\n }\n return { missingExemptFiles, missingClaimedBy };\n}\n\n/** Source files no row covers and no exemption names — the coverage blind spot. */\nasync function findOrphans(\n root: string,\n srcDir: string,\n covered: Set<string>,\n config: CoverageConfig\n): Promise<string[]> {\n const exempt = config.exempt ?? {};\n const orphans: string[] = [];\n const glob = new Glob(`${srcDir}/**/*.{ts,tsx}`);\n for await (const file of glob.scan({ cwd: root, onlyFiles: true })) {\n if (file.endsWith(\".d.ts\") || /\\.test\\.tsx?$/.test(file) || file.includes(\"/__tests__/\")) {\n continue;\n }\n if (covered.has(file) || exempt[file]) continue;\n orphans.push(file);\n }\n return orphans.sort();\n}\n\n/** Apply the policy to a parsed table. Pure — no spawning. */\nexport async function evaluateCoverage(\n root: string,\n rows: CoverageRow[],\n config: CoverageConfig\n): Promise<CoverageFindings> {\n const srcDir = config.srcDir ?? DEFAULT_SRC;\n const { violations, staleExempts } = evaluateRows(rows, config);\n const { missingExemptFiles, missingClaimedBy } = validateExemptions(root, config);\n const orphans = await findOrphans(root, srcDir, new Set(rows.map((r) => r.file)), config);\n return {\n rowCount: rows.length,\n violations,\n staleExempts,\n missingExemptFiles,\n missingClaimedBy,\n orphans,\n enforced: config.defaultThreshold !== undefined,\n };\n}\n\n/** Run the suite under coverage and apply the policy. */\nexport async function enforceCoverage(\n root: string,\n config: CoverageConfig,\n coverageText?: string\n): Promise<CoverageFindings> {\n const srcDir = config.srcDir ?? DEFAULT_SRC;\n const text = coverageText ?? (await runCoverage(root, config.testCwd ?? \".\"));\n const rows = parseCoverageTable(text, srcDir);\n return evaluateCoverage(root, rows, config);\n}\n\n/** True when the findings represent a policy failure (orphans are advisory\n * unless `strictOrphans`). */\nexport function hasFailure(findings: CoverageFindings, strictOrphans: boolean): boolean {\n return (\n findings.violations.length > 0 ||\n findings.staleExempts.length > 0 ||\n findings.missingExemptFiles.length > 0 ||\n findings.missingClaimedBy.length > 0 ||\n (strictOrphans && findings.orphans.length > 0)\n );\n}\n",
|
|
6
6
|
"/**\n * @fairfox/polly/test/coverage — zero-config loading.\n *\n * `polly coverage` runs without any config: it looks for a `coverage.config.ts`\n * (or `.js`) at the project root, and if there is none it returns an empty\n * config, which the engine treats as report-only — it prints the numbers and\n * the orphan count but never fails the build. A consumer opts into enforcement\n * by adding a `defaultThreshold`, and into legible tiering by adding `exempt`\n * entries. This mirrors how `polly test --tier` discovers tiers by convention.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport type { CoverageConfig } from \"./types\";\n\nexport interface LoadedConfig {\n config: CoverageConfig;\n /** Absolute path the config was loaded from, or null for the zero-config default. */\n source: string | null;\n}\n\nfunction isCoverageConfig(value: unknown): value is CoverageConfig {\n return typeof value === \"object\" && value !== null;\n}\n\nasync function importConfig(path: string): Promise<CoverageConfig> {\n const mod: Record<string, unknown> = await import(path);\n const candidate = mod[\"config\"] ?? mod[\"default\"];\n if (!isCoverageConfig(candidate)) {\n throw new Error(`${path} must export \\`config\\` (a CoverageConfig object)`);\n }\n return candidate;\n}\n\n/**\n * Resolve the coverage config. With `explicitPath` (Polly's own front-end\n * passes scripts/coverage.config.ts) that file must exist. Otherwise look for\n * coverage.config.{ts,js} at the root; absent → the zero-config report-only\n * default.\n */\nexport async function loadCoverageConfig(\n root: string,\n explicitPath?: string\n): Promise<LoadedConfig> {\n if (explicitPath) {\n const abs = isAbsolute(explicitPath) ? explicitPath : resolve(root, explicitPath);\n if (!existsSync(abs)) throw new Error(`coverage config not found: ${abs}`);\n return { config: await importConfig(abs), source: abs };\n }\n\n for (const name of [\"coverage.config.ts\", \"coverage.config.js\"]) {\n const abs = join(root, name);\n if (existsSync(abs)) return { config: await importConfig(abs), source: abs };\n }\n return { config: {}, source: null };\n}\n",
|
|
7
|
-
"#!/usr/bin/env bun\n\n/**\n * @fairfox/polly/test/coverage — consumer-facing `polly coverage`.\n *\n * Zero-config: run it in any Polly project and it reports per-file coverage,\n * orphan source files, and (if a
|
|
8
|
-
"/**\n * @fairfox/polly/test/coverage —
|
|
7
|
+
"#!/usr/bin/env bun\n\n/**\n * @fairfox/polly/test/coverage — consumer-facing `polly coverage`.\n *\n * Zero-config: run it in any Polly project and it reports per-file coverage,\n * orphan source files, and (if a mutation config is present) dead mutate/test\n * globs. Add a `coverage.config.ts` with a `defaultThreshold` to turn the\n * report into an enforced gate, and `exempt` entries to record which\n * higher-tier test covers a unit-thin file.\n *\n * Usage:\n * polly coverage # report (zero-config) or enforce (with config)\n * polly coverage --strict-orphans # fail on source no unit test imports\n * polly coverage --orphans # list the orphan files\n * polly coverage --no-mutate # skip the mutate-target check\n * polly coverage --config <path> # explicit coverage.config.ts\n * bun test --coverage | polly coverage --stdin\n */\n\nimport { loadCoverageConfig } from \"./discover\";\nimport { type CoverageFindings, enforceCoverage, hasFailure, parseCoverageTable } from \"./enforce\";\nimport { type MutateTargetReport, validateMutateTargets } from \"./mutate-targets\";\n\ninterface Args {\n root: string;\n configPath?: string;\n strictOrphans: boolean;\n listOrphans: boolean;\n stdin: boolean;\n mutate: boolean;\n help: boolean;\n}\n\nfunction parseArgs(argv: string[]): Args {\n const flag = (name: string) => argv.includes(name);\n const argValue = (name: string): string | undefined => {\n const i = argv.indexOf(name);\n return i >= 0 ? argv[i + 1] : undefined;\n };\n const strictOrphans = flag(\"--strict-orphans\");\n return {\n root: process.cwd(),\n configPath: argValue(\"--config\"),\n strictOrphans,\n listOrphans: strictOrphans || flag(\"--orphans\"),\n stdin: flag(\"--stdin\"),\n mutate: !flag(\"--no-mutate\"),\n help: flag(\"--help\") || flag(\"-h\"),\n };\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: string[] = [];\n for await (const chunk of Bun.stdin.stream()) chunks.push(new TextDecoder().decode(chunk));\n return chunks.join(\"\");\n}\n\nfunction reportPolicy(f: CoverageFindings): void {\n for (const m of f.missingExemptFiles) {\n process.stderr.write(`❌ exempt source missing: ${m}\\n`);\n }\n for (const { file, claimedBy } of f.missingClaimedBy) {\n process.stderr.write(`❌ ${file} → claimedBy missing: ${claimedBy}\\n`);\n }\n for (const s of f.staleExempts) {\n process.stderr.write(`❌ exempt file now meets the floor — promote it: ${s}\\n`);\n }\n for (const v of f.violations) {\n process.stderr.write(\n `❌ ${v.file} ${v.metric}=${v.observed.toFixed(2)}% (need ≥ ${v.required}%)\\n`\n );\n }\n}\n\nfunction reportOrphans(f: CoverageFindings, args: Args): void {\n if (f.orphans.length === 0) return;\n process.stderr.write(\n `${args.strictOrphans ? \"❌\" : \"⚠️ \"} ${f.orphans.length} src file(s) no unit test imports\\n`\n );\n if (args.listOrphans) for (const o of f.orphans) process.stderr.write(` ${o}\\n`);\n else process.stderr.write(\" --orphans to list, --strict-orphans to fail\\n\");\n}\n\nfunction reportMutate(report: MutateTargetReport): void {\n if (report.issues.length === 0) return;\n process.stderr.write(`❌ ${report.issues.length} mutate target(s) resolve to no files:\\n`);\n for (const i of report.issues) {\n process.stderr.write(` ${i.config} [${i.field}] ${i.pattern}\\n`);\n }\n}\n\nfunction showHelp(): void {\n process.stdout.write(\n \"polly coverage — coverage policy, orphan detection, mutate-target validation\\n\\n\" +\n \" Coverage that a line ran isn't proof anything checks it. This enforces a\\n\" +\n \" per-file floor with explicit, owned exemptions so test debt stays visible,\\n\" +\n \" and flags orphans (source no test imports) and drifted mutate targets.\\n\\n\" +\n \" --strict-orphans fail on source no unit test imports\\n\" +\n \" --orphans list orphan files\\n\" +\n \" --no-mutate skip the mutation target/test-glob check\\n\" +\n \" --config <path> explicit coverage.config.ts\\n\" +\n \" --stdin read a `bun test --coverage` table from stdin\\n\"\n );\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n if (args.help) {\n showHelp();\n return;\n }\n\n const { config, source } = await loadCoverageConfig(args.root, args.configPath);\n const srcDir = config.srcDir ?? \"src\";\n\n const findings = args.stdin\n ? await import(\"./enforce\").then(async (m) => {\n const rows = parseCoverageTable(await readStdin(), srcDir);\n return m.evaluateCoverage(args.root, rows, config);\n })\n : await enforceCoverage(args.root, config);\n\n reportPolicy(findings);\n reportOrphans(findings, args);\n\n let mutate: MutateTargetReport = { configs: [], issues: [] };\n if (args.mutate) {\n mutate = await validateMutateTargets(args.root);\n reportMutate(mutate);\n }\n\n const failed = hasFailure(findings, args.strictOrphans) || mutate.issues.length > 0;\n if (!failed) {\n const mode = findings.enforced ? `floor enforced` : \"report-only (no defaultThreshold)\";\n const where = source ? \"\" : \" — zero-config\";\n const orphanNote = findings.orphans.length ? `, ${findings.orphans.length} orphan` : \"\";\n const mutateNote = mutate.configs.length\n ? `, ${mutate.configs.length} mutation config(s) ok`\n : \"\";\n process.stdout.write(\n `✅ coverage ok — ${findings.rowCount} src files, ${mode}${where}${orphanNote}${mutateNote}\\n`\n );\n }\n process.exit(failed ? 1 : 0);\n}\n\nawait main();\n",
|
|
8
|
+
"/**\n * @fairfox/polly/test/coverage — mutation target / test-glob validation.\n *\n * A mutation config's target and test lists are hand-curated. A path that is\n * renamed, or a glob whose directory moves, silently resolves to nothing —\n * fewer files (or none) are mutated and the only signal is a long mutation\n * run whose score quietly drops. This asserts, in milliseconds, that every\n * entry still resolves to at least one file.\n *\n * Reads both config formats: `polly.mutate.ts` at the root, and Stryker JSON\n * (deprecated) — a single `stryker.conf.json` at the root or a `stryker/`\n * directory of per-package shards.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { Glob } from \"bun\";\nimport { loadMutationConfig, MUTATION_CONFIG_FILE } from \"../../../mutate/src/define.ts\";\n\ninterface StrykerConfig {\n mutate?: string[];\n testFiles?: string[];\n bun?: { testFiles?: string[] };\n}\n\nexport interface MutateTargetIssue {\n config: string;\n /** `mutate`/`testFiles` for a Stryker config, `targets`/`tests.include` for polly.mutate.ts. */\n field: \"mutate\" | \"testFiles\" | \"targets\" | \"tests.include\";\n pattern: string;\n}\n\n/** One mutation config, reduced to the paths it names. */\nexport interface MutateConfigEntry {\n path: string;\n format: \"polly\" | \"stryker\";\n targets: { field: MutateTargetIssue[\"field\"]; patterns: string[] };\n tests: { field: MutateTargetIssue[\"field\"]; patterns: string[] };\n}\n\nexport interface MutateTargetReport {\n configs: string[];\n issues: MutateTargetIssue[];\n}\n\n/** Locate every Stryker config under the project root. */\nexport async function findStrykerConfigs(root: string): Promise<string[]> {\n const found: string[] = [];\n const single = join(root, \"stryker.conf.json\");\n if (existsSync(single)) found.push(single);\n\n const glob = new Glob(\"stryker/*.{json,conf.json}\");\n for await (const rel of glob.scan({ cwd: root, onlyFiles: true })) {\n found.push(join(root, rel));\n }\n return found.sort();\n}\n\n/** Every mutation config under `root`, both formats, with the paths each names. */\nexport async function findMutateConfigs(root: string): Promise<MutateConfigEntry[]> {\n const out: MutateConfigEntry[] = [];\n const polly = join(root, MUTATION_CONFIG_FILE);\n if (existsSync(polly)) {\n const config = await loadMutationConfig(polly);\n out.push({\n path: polly,\n format: \"polly\",\n targets: { field: \"targets\", patterns: config.targets },\n tests: { field: \"tests.include\", patterns: config.tests?.include ?? [] },\n });\n }\n for (const path of await findStrykerConfigs(root)) {\n const config = JSON.parse(readFileSync(path, \"utf8\")) as unknown as StrykerConfig;\n out.push({\n path,\n format: \"stryker\",\n targets: { field: \"mutate\", patterns: config.mutate ?? [] },\n tests: { field: \"testFiles\", patterns: config.testFiles ?? config.bun?.testFiles ?? [] },\n });\n }\n return out;\n}\n\nfunction isGlob(pattern: string): boolean {\n return pattern.includes(\"*\") || pattern.includes(\"?\") || pattern.includes(\"[\");\n}\n\n/** `file.ts:10-20` (or `:10:1-20:5`) names `file.ts`. */\nconst LINE_RANGE = /:\\d+(?::\\d+)?-\\d+(?::\\d+)?$/;\n\nasync function resolvesToFile(entry: string, cwd: string): Promise<boolean> {\n if (entry.startsWith(\"!\")) return true; // negations are filters, not targets\n const pattern = entry.replace(LINE_RANGE, \"\");\n if (!isGlob(pattern)) return existsSync(resolve(cwd, pattern));\n const glob = new Glob(pattern);\n for await (const _ of glob.scan({ cwd, onlyFiles: true })) return true;\n return false;\n}\n\nasync function checkField(\n configPath: string,\n field: MutateTargetIssue[\"field\"],\n patterns: string[],\n cwd: string\n): Promise<MutateTargetIssue[]> {\n const issues: MutateTargetIssue[] = [];\n for (const pattern of patterns) {\n if (!(await resolvesToFile(pattern, cwd))) {\n issues.push({ config: configPath, field, pattern });\n }\n }\n return issues;\n}\n\n/**\n * Validate every mutation config under `root`. polly.mutate.ts paths are\n * relative to its own directory (the root). Paths in a Stryker config are\n * relative to that config's directory; for the monorepo-root configs that is\n * the root, so Stryker globs resolve against `root`.\n */\nexport async function validateMutateTargets(root: string): Promise<MutateTargetReport> {\n const configs = await findMutateConfigs(root);\n const issues: MutateTargetIssue[] = [];\n for (const c of configs) {\n const cwd = c.format === \"polly\" ? dirname(c.path) : root;\n issues.push(...(await checkField(c.path, c.targets.field, c.targets.patterns, cwd)));\n issues.push(...(await checkField(c.path, c.tests.field, c.tests.patterns, cwd)));\n }\n return { configs: configs.map((c) => c.path), issues };\n}\n",
|
|
9
|
+
"/**\n * Type guards for walking `unknown` values safely.\n *\n * Polly touches a lot of shapes it doesn't own: parsed JSON bodies\n * from the signalling server, IndexedDB records, `postMessage`\n * payloads, storage adapter returns. TypeScript sees every one of\n * those as `unknown`, and the ergonomic-but-unsafe fix — a bare `as`\n * cast — hides every shape mismatch until runtime. The helpers below\n * are the thinnest possible layer that turns a runtime shape check\n * into a compile-time narrowing, so the code that follows can read\n * the value without a cast.\n *\n * Each guard checks own-properties only (`Object.hasOwn`), not the\n * prototype chain. Walking into a prototype would make a simple\n * `hasKeyInObject(x, \"toString\")` pass for any object, which is\n * never what a caller looking for a specific data key intends.\n */\n\n/** Narrow `input` to an object carrying its own `key`. Returns true\n * when the input is a non-null object with an own property under\n * the given key. The value under the key is left as `unknown`;\n * callers narrow further with `Array.isArray`, `typeof`, or another\n * guard. */\nexport function hasKeyInObject<K extends string>(\n input: unknown,\n key: K\n): input is Record<K, unknown> {\n return typeof input === \"object\" && input !== null && Object.hasOwn(input, key);\n}\n\n/** Narrow `input` to a plain object (non-null, non-array). Useful as\n * a prelude to reads off a record whose shape is known at the\n * call site but typed as `unknown`. */\nexport function isRecord(input: unknown): input is Record<string, unknown> {\n return typeof input === \"object\" && input !== null && !Array.isArray(input);\n}\n\n/**\n * Compile-time exhaustiveness check for discriminated unions.\n *\n * A string-literal union is decorative without one: add a third\n * variant and nothing flags the `switch` statements that only handled\n * the first two — the new case silently falls through whatever\n * `default` arm exists. Placing `assertNever` in that `default` arm\n * turns the gap into a type error, because `value` is only assignable\n * to `never` when every other case has already been handled. The\n * moment a variant is added and a switch forgets it, `value` is no\n * longer `never` and the call fails to type-check.\n *\n * ```ts\n * switch (event.kind) {\n * case \"a\": return handleA(event);\n * case \"b\": return handleB(event);\n * default: return assertNever(event);\n * }\n * ```\n *\n * The `throw` is the runtime backstop for the case TypeScript cannot\n * see — a value arriving from outside the type system (a parsed JSON\n * body, a `postMessage` payload) that violates the declared union.\n */\nexport function assertNever(value: never): never {\n throw new Error(`assertNever: unexpected value ${JSON.stringify(value)}`);\n}\n",
|
|
10
|
+
"/**\n * `polly.mutate.ts` — the typed config for `polly mutate`:\n *\n * import { defineMutation } from \"@fairfox/polly/mutate\";\n * export default defineMutation({\n * targets: [\"src/**\\/*.ts\", \"!src/**\\/*.test.ts\"],\n * tests: { include: [\"tests/**\\/*.test.ts\"] },\n * });\n *\n * Paths are relative to the config file's directory, which is also where the\n * tests run. `defineMutation` only checks the shape at the type level; the\n * CLI loads the file with a plain dynamic import and validates the default\n * export with `parseMutationConfig`, so a hand-written `.js` config with a\n * typo fails with a message, not a crash deep in the engine.\n */\nimport { isRecord } from \"../../../src/shared/lib/guards\";\nimport type { ContractsMode, CoverageMode, EngineMode, MutatorName } from \"./engine/types.ts\";\n\nexport const MUTATION_CONFIG_FILE = \"polly.mutate.ts\";\n\nexport interface MutationTests {\n /** Test-file globs. The engine runs only the files whose imports reach a target. */\n include: string[];\n /** Project preloads, passed to `bun test` before the injection preload. */\n preload?: string[];\n}\n\nexport interface CommandRunner {\n kind: \"command\";\n /**\n * The command, run once per mutant in the config dir; non-zero exit kills\n * the mutant. Every Bun process it starts gets the injection preload via\n * BUN_OPTIONS. No test selection, fast mode only.\n */\n argv: string[];\n}\n\ninterface MutationCommon {\n /** Files to mutate: globs, `!` exclusions, and `file.ts:10-20` line ranges. */\n targets: string[];\n /** fast stops at the first failing test; matrix records every killer. Default fast. */\n mode?: EngineMode;\n /**\n * dynamic: one probed pass over every test file finds the tests that run\n * each mutant; a mutant no test runs is NoCoverage. static: the test files\n * that import the target. Default dynamic; the command runner is always static.\n */\n coverage?: CoverageMode;\n /** Parallel test processes. Default: cores − 1. */\n concurrency?: number;\n /** Per-mutant timeout = baseline × factor + extraMs. Default 2 / 3000. */\n timeout?: { factor: number; extraMs: number };\n mutators?: { exclude?: MutatorName[] };\n /**\n * Report mutants the project's TypeScript config rejects as CompileError,\n * never run (TypeScript 7 through the `typescript-7` dependency). Default true.\n */\n typecheck?: boolean;\n /** Report mutants inside requires/ensures/… as Ignored (polly#143). Default true. */\n ignoreVerifyCallsites?: boolean;\n /**\n * POLLY_CONTRACTS for every test process: a false requires/ensures throws,\n * so each contract kills the mutants that falsify it. off keeps them\n * no-ops; ensures enforces postconditions only. Default all.\n */\n contracts?: ContractsMode;\n /** `polly mutate run` exits 1 when the score is below `break`. */\n thresholds?: { break?: number };\n /** Report path. Default reports/mutation/mutation.json. */\n report?: string;\n /** Verdict log. Default .polly/test-debt/decisions.jsonl. */\n decisions?: string;\n}\n\nexport type MutationConfig = MutationCommon &\n (\n | { runner?: { kind: \"bun-test\" }; tests: MutationTests }\n | { runner: CommandRunner; tests?: undefined }\n );\n\nexport function defineMutation(config: MutationConfig): MutationConfig {\n return config;\n}\n\nconst MUTATOR_NAMES: ReadonlySet<string> = new Set<MutatorName>([\n \"ArithmeticOperator\",\n \"ArrayDeclaration\",\n \"ArrowFunction\",\n \"AssignmentOperator\",\n \"BlockStatement\",\n \"BooleanLiteral\",\n \"ConditionalExpression\",\n \"EqualityOperator\",\n \"LogicalOperator\",\n \"MethodExpression\",\n \"ObjectLiteral\",\n \"OptionalChaining\",\n \"Regex\",\n \"StringLiteral\",\n \"UnaryOperator\",\n \"UpdateOperator\",\n]);\n\nfunction isMutatorName(value: unknown): value is MutatorName {\n return typeof value === \"string\" && MUTATOR_NAMES.has(value);\n}\n\nfunction strings(value: unknown, where: string): string[] {\n if (!Array.isArray(value) || !value.every((v) => typeof v === \"string\")) {\n throw new Error(`${where} must be an array of strings`);\n }\n return value;\n}\n\nfunction optionalNumber(value: unknown, where: string): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw new Error(`${where} must be a number`);\n return value;\n}\n\nfunction optionalString(value: unknown, where: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\") throw new Error(`${where} must be a string`);\n return value;\n}\n\nfunction isEngineMode(v: unknown): v is EngineMode {\n return v === \"fast\" || v === \"matrix\";\n}\n\nfunction isCoverageMode(v: unknown): v is CoverageMode {\n return v === \"dynamic\" || v === \"static\";\n}\n\nfunction parseRun(raw: Record<string, unknown>, where: string): MutationCommon {\n const mode = raw[\"mode\"];\n if (mode !== undefined && !isEngineMode(mode)) {\n throw new Error(`${where}: mode must be \"fast\" or \"matrix\"`);\n }\n const concurrency = optionalNumber(raw[\"concurrency\"], `${where}: concurrency`);\n if (concurrency !== undefined && !(Number.isInteger(concurrency) && concurrency > 0)) {\n throw new Error(`${where}: concurrency must be a positive integer`);\n }\n const coverage = raw[\"coverage\"];\n if (coverage !== undefined && !isCoverageMode(coverage)) {\n throw new Error(`${where}: coverage must be \"dynamic\" or \"static\"`);\n }\n const common: MutationCommon = { targets: strings(raw[\"targets\"], `${where}: targets`) };\n if (isEngineMode(mode)) common.mode = mode;\n if (isCoverageMode(coverage)) common.coverage = coverage;\n if (concurrency !== undefined) common.concurrency = concurrency;\n const timeout = raw[\"timeout\"];\n if (timeout !== undefined) {\n if (!isRecord(timeout)) throw new Error(`${where}: timeout must be { factor, extraMs }`);\n const factor = optionalNumber(timeout[\"factor\"], `${where}: timeout.factor`) ?? 2;\n const extraMs = optionalNumber(timeout[\"extraMs\"], `${where}: timeout.extraMs`) ?? 3000;\n common.timeout = { factor, extraMs };\n }\n return common;\n}\n\nfunction parseMutants(raw: Record<string, unknown>, where: string): Partial<MutationCommon> {\n const out: Partial<MutationCommon> = {};\n const mutators = raw[\"mutators\"];\n if (mutators !== undefined) {\n if (!isRecord(mutators)) throw new Error(`${where}: mutators must be { exclude }`);\n const exclude = mutators[\"exclude\"] === undefined ? [] : mutators[\"exclude\"];\n if (!Array.isArray(exclude) || !exclude.every(isMutatorName)) {\n throw new Error(`${where}: mutators.exclude holds an unknown mutator name`);\n }\n out.mutators = { exclude };\n }\n const ignore = raw[\"ignoreVerifyCallsites\"];\n if (ignore !== undefined) {\n if (typeof ignore !== \"boolean\")\n throw new Error(`${where}: ignoreVerifyCallsites must be boolean`);\n out.ignoreVerifyCallsites = ignore;\n }\n const typecheck = raw[\"typecheck\"];\n if (typecheck !== undefined) {\n if (typeof typecheck !== \"boolean\") throw new Error(`${where}: typecheck must be boolean`);\n out.typecheck = typecheck;\n }\n return { ...out, ...parseContracts(raw, where) };\n}\n\nexport function isContractsMode(v: unknown): v is ContractsMode {\n return v === \"off\" || v === \"ensures\" || v === \"all\";\n}\n\nfunction parseContracts(raw: Record<string, unknown>, where: string): Partial<MutationCommon> {\n const contracts = raw[\"contracts\"];\n if (contracts === undefined) return {};\n if (!isContractsMode(contracts)) {\n throw new Error(`${where}: contracts must be \"off\", \"ensures\" or \"all\"`);\n }\n return { contracts };\n}\n\nfunction parseOutputs(raw: Record<string, unknown>, where: string): Partial<MutationCommon> {\n const out: Partial<MutationCommon> = {};\n const thresholds = raw[\"thresholds\"];\n if (thresholds !== undefined) {\n if (!isRecord(thresholds)) throw new Error(`${where}: thresholds must be { break }`);\n const brk = optionalNumber(thresholds[\"break\"], `${where}: thresholds.break`);\n out.thresholds = brk === undefined ? {} : { break: brk };\n }\n const report = optionalString(raw[\"report\"], `${where}: report`);\n if (report !== undefined) out.report = report;\n const decisions = optionalString(raw[\"decisions\"], `${where}: decisions`);\n if (decisions !== undefined) out.decisions = decisions;\n return out;\n}\n\nfunction parseCommon(raw: Record<string, unknown>, where: string): MutationCommon {\n return { ...parseRun(raw, where), ...parseMutants(raw, where), ...parseOutputs(raw, where) };\n}\n\n/** Validate a loaded config's default export. `where` names the file in errors. */\nexport function parseMutationConfig(raw: unknown, where: string): MutationConfig {\n if (!isRecord(raw)) throw new Error(`${where}: the default export must be a config object`);\n // targets, then runner/tests, then the rest: the order a rendered config reads in.\n const { targets, ...common } = parseCommon(raw, where);\n const runner = raw[\"runner\"];\n if (isRecord(runner) && runner[\"kind\"] === \"command\") {\n const argv = strings(runner[\"argv\"], `${where}: runner.argv`);\n if (argv.length === 0) throw new Error(`${where}: runner.argv is empty`);\n return { targets, runner: { kind: \"command\", argv }, ...common };\n }\n if (runner !== undefined && !(isRecord(runner) && runner[\"kind\"] === \"bun-test\")) {\n throw new Error(`${where}: runner.kind must be \"bun-test\" or \"command\"`);\n }\n const tests = raw[\"tests\"];\n if (!isRecord(tests)) throw new Error(`${where}: tests.include is required`);\n const include = strings(tests[\"include\"], `${where}: tests.include`);\n if (include.length === 0) throw new Error(`${where}: tests.include is empty`);\n const preload =\n tests[\"preload\"] === undefined\n ? undefined\n : strings(tests[\"preload\"], `${where}: tests.preload`);\n return { targets, tests: preload ? { include, preload } : { include }, ...common };\n}\n\n/** Import a `polly.mutate.ts` (or `.js`) and validate its default export. */\nexport async function loadMutationConfig(path: string): Promise<MutationConfig> {\n const mod: unknown = await import(path);\n const raw = isRecord(mod) ? mod[\"default\"] : undefined;\n return parseMutationConfig(raw, path);\n}\n"
|
|
9
11
|
],
|
|
10
|
-
"mappings": ";;;;;;;;;;;;;;;;AAcA,uBAAS;AACT,iBAAS,kBAAM;AACf;AA+BA,SAAS,aAAa,CAAC,KAAqB;AAAA,EAC1C,OAAO,IAAI,QAAQ,gBAAgB,EAAE;AAAA;AAQhC,SAAS,kBAAkB,CAAC,MAAc,QAA+B;AAAA,EAC9E,MAAM,SAAS,GAAG;AAAA,EAClB,MAAM,OAAsB,CAAC;AAAA,EAC7B,WAAW,QAAQ,KAAK,MAAM;AAAA,CAAI,GAAG;AAAA,IACnC,IAAI,CAAC,KAAK,SAAS,GAAG;AAAA,MAAG;AAAA,IACzB,IAAI,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,SAAS;AAAA,MAAG;AAAA,IAC5D,IAAI,KAAK,KAAK,EAAE,WAAW,KAAK;AAAA,MAAG;AAAA,IAEnC,MAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IACjD,IAAI,MAAM,SAAS;AAAA,MAAG;AAAA,IAEtB,MAAM,OAAO,cAAc,MAAM,MAAM,EAAE;AAAA,IACzC,MAAM,QAAQ,OAAO,MAAM,EAAE;AAAA,IAC7B,MAAM,QAAQ,OAAO,MAAM,EAAE;AAAA,IAC7B,IAAI,CAAC,KAAK,WAAW,MAAM,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,MAAM,KAAK;AAAA,MAAG;AAAA,IAE5E,KAAK,KAAK,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,EAClC;AAAA,EACA,OAAO;AAAA;AAIT,eAAsB,WAAW,CAAC,MAAc,SAAkC;AAAA,EAChF,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,QAAQ,YAAY,GAAG;AAAA,IACpD,KAAK,MAAK,MAAM,OAAO;AAAA,IACvB,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAAA,EACD,OAAO,KAAK,OAAO,MAAM,QAAQ,IAAI;AAAA,IACnC,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK;AAAA,IAC/B,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK;AAAA,EACjC,CAAC;AAAA,EACD,MAAM,KAAK;AAAA,EACX,IAAI,KAAK,aAAa,GAAG;AAAA,IACvB,MAAM,IAAI,MAAM,8BAA8B,KAAK;AAAA,EAAa,KAAK;AAAA,EACvE;AAAA,EACA,OAAO,GAAG;AAAA,EAAQ;AAAA;AAGpB,SAAS,YAAY,CACnB,MACA,QACqD;AAAA,EACrD,MAAM,IAAI,OAAO;AAAA,EACjB,MAAM,SAAS,OAAO,UAAU,CAAC;AAAA,EACjC,MAAM,aAA0B,CAAC;AAAA,EACjC,MAAM,eAAyB,CAAC;AAAA,EAChC,IAAI,CAAC;AAAA,IAAG,OAAO,EAAE,YAAY,aAAa;AAAA,EAE1C,WAAW,OAAO,MAAM;AAAA,IACtB,IAAI,OAAO,IAAI,OAAO;AAAA,MACpB,IAAI,IAAI,SAAS,EAAE,SAAS,IAAI,SAAS,EAAE;AAAA,QAAO,aAAa,KAAK,IAAI,IAAI;AAAA,MAC5E;AAAA,IACF;AAAA,IACA,IAAI,IAAI,QAAQ,EAAE,OAAO;AAAA,MACvB,WAAW,KAAK,EAAE,MAAM,IAAI,MAAM,QAAQ,SAAS,UAAU,IAAI,OAAO,UAAU,EAAE,MAAM,CAAC;AAAA,IAC7F;AAAA,IACA,IAAI,IAAI,QAAQ,EAAE,OAAO;AAAA,MACvB,WAAW,KAAK,EAAE,MAAM,IAAI,MAAM,QAAQ,SAAS,UAAU,IAAI,OAAO,UAAU,EAAE,MAAM,CAAC;AAAA,IAC7F;AAAA,EACF;AAAA,EACA,OAAO,EAAE,YAAY,aAAa;AAAA;AAGpC,SAAS,kBAAkB,CACzB,MACA,QACgG;AAAA,EAChG,MAAM,qBAA+B,CAAC;AAAA,EACtC,MAAM,mBAA+D,CAAC;AAAA,EACtE,YAAY,MAAM,UAAU,OAAO,QAAQ,OAAO,UAAU,CAAC,CAAC,GAAG;AAAA,IAC/D,IAAI,CAAC,YAAW,SAAQ,MAAM,IAAI,CAAC;AAAA,MAAG,mBAAmB,KAAK,IAAI;AAAA,IAClE,MAAM,YAAY,MAAM,UAAU,KAAK;AAAA,IACvC,IAAI,CAAC,UAAU,WAAW,KAAK,KAAK,CAAC,YAAW,SAAQ,MAAM,SAAS,CAAC,GAAG;AAAA,MACzE,iBAAiB,KAAK,EAAE,MAAM,UAAU,CAAC;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,OAAO,EAAE,oBAAoB,iBAAiB;AAAA;AAIhD,eAAe,WAAW,CACxB,MACA,QACA,SACA,QACmB;AAAA,EACnB,MAAM,SAAS,OAAO,UAAU,CAAC;AAAA,EACjC,MAAM,UAAoB,CAAC;AAAA,EAC3B,MAAM,OAAO,IAAI,KAAK,GAAG,sBAAsB;AAAA,EAC/C,iBAAiB,QAAQ,KAAK,KAAK,EAAE,KAAK,MAAM,WAAW,KAAK,CAAC,GAAG;AAAA,IAClE,IAAI,KAAK,SAAS,OAAO,KAAK,gBAAgB,KAAK,IAAI,KAAK,KAAK,SAAS,aAAa,GAAG;AAAA,MACxF;AAAA,IACF;AAAA,IACA,IAAI,QAAQ,IAAI,IAAI,KAAK,OAAO;AAAA,MAAO;AAAA,IACvC,QAAQ,KAAK,IAAI;AAAA,EACnB;AAAA,EACA,OAAO,QAAQ,KAAK;AAAA;AAItB,eAAsB,gBAAgB,CACpC,MACA,MACA,QAC2B;AAAA,EAC3B,MAAM,SAAS,OAAO,UAAU;AAAA,EAChC,QAAQ,YAAY,iBAAiB,aAAa,MAAM,MAAM;AAAA,EAC9D,QAAQ,oBAAoB,qBAAqB,mBAAmB,MAAM,MAAM;AAAA,EAChF,MAAM,UAAU,MAAM,YAAY,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,MAAM;AAAA,EACxF,OAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,OAAO,qBAAqB;AAAA,EACxC;AAAA;AAIF,eAAsB,eAAe,CACnC,MACA,QACA,cAC2B;AAAA,EAC3B,MAAM,SAAS,OAAO,UAAU;AAAA,EAChC,MAAM,OAAO,gBAAiB,MAAM,YAAY,MAAM,OAAO,WAAW,GAAG;AAAA,EAC3E,MAAM,OAAO,mBAAmB,MAAM,MAAM;AAAA,EAC5C,OAAO,iBAAiB,MAAM,MAAM,MAAM;AAAA;AAKrC,SAAS,UAAU,CAAC,UAA4B,eAAiC;AAAA,EACtF,OACE,SAAS,WAAW,SAAS,KAC7B,SAAS,aAAa,SAAS,KAC/B,SAAS,mBAAmB,SAAS,KACrC,SAAS,iBAAiB,SAAS,KAClC,iBAAiB,SAAS,QAAQ,SAAS;AAAA;AAAA,IAzJ1C,cAAc;AAAA;;;ACjCpB;AACA;AASA,SAAS,gBAAgB,CAAC,OAAyC;AAAA,EACjE,OAAO,OAAO,UAAU,YAAY,UAAU;AAAA;AAGhD,eAAe,YAAY,CAAC,MAAuC;AAAA,EACjE,MAAM,MAA+B,MAAa;AAAA,EAClD,MAAM,YAAY,IAAI,aAAa,IAAI;AAAA,EACvC,IAAI,CAAC,iBAAiB,SAAS,GAAG;AAAA,IAChC,MAAM,IAAI,MAAM,GAAG,uDAAuD;AAAA,EAC5E;AAAA,EACA,OAAO;AAAA;AAST,eAAsB,kBAAkB,CACtC,MACA,cACuB;AAAA,EACvB,IAAI,cAAc;AAAA,IAChB,MAAM,MAAM,WAAW,YAAY,IAAI,eAAe,QAAQ,MAAM,YAAY;AAAA,IAChF,IAAI,CAAC,WAAW,GAAG;AAAA,MAAG,MAAM,IAAI,MAAM,8BAA8B,KAAK;AAAA,IACzE,OAAO,EAAE,QAAQ,MAAM,aAAa,GAAG,GAAG,QAAQ,IAAI;AAAA,EACxD;AAAA,EAEA,WAAW,QAAQ,CAAC,sBAAsB,oBAAoB,GAAG;AAAA,IAC/D,MAAM,MAAM,KAAK,MAAM,IAAI;AAAA,IAC3B,IAAI,WAAW,GAAG;AAAA,MAAG,OAAO,EAAE,QAAQ,MAAM,aAAa,GAAG,GAAG,QAAQ,IAAI;AAAA,EAC7E;AAAA,EACA,OAAO,EAAE,QAAQ,CAAC,GAAG,QAAQ,KAAK;AAAA;;;ACjCpC;;;ACPA,uBAAS;AACT,iBAAS,kBAAM;AACf,iBAAS;AAoBT,eAAsB,kBAAkB,CAAC,MAAiC;AAAA,EACxE,MAAM,QAAkB,CAAC;AAAA,EACzB,MAAM,SAAS,MAAK,MAAM,mBAAmB;AAAA,EAC7C,IAAI,YAAW,MAAM;AAAA,IAAG,MAAM,KAAK,MAAM;AAAA,EAEzC,MAAM,OAAO,IAAI,MAAK,4BAA4B;AAAA,EAClD,iBAAiB,OAAO,KAAK,KAAK,EAAE,KAAK,MAAM,WAAW,KAAK,CAAC,GAAG;AAAA,IACjE,MAAM,KAAK,MAAK,MAAM,GAAG,CAAC;AAAA,EAC5B;AAAA,EACA,OAAO,MAAM,KAAK;AAAA;AAGpB,SAAS,MAAM,CAAC,SAA0B;AAAA,EACxC,OAAO,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG;AAAA;AAG/E,eAAe,cAAc,CAAC,SAAiB,KAA+B;AAAA,EAC5E,IAAI,QAAQ,WAAW,GAAG;AAAA,IAAG,OAAO;AAAA,EACpC,IAAI,CAAC,OAAO,OAAO;AAAA,IAAG,OAAO,YAAW,SAAQ,KAAK,OAAO,CAAC;AAAA,EAC7D,MAAM,OAAO,IAAI,MAAK,OAAO;AAAA,EAC7B,iBAAiB,KAAK,KAAK,KAAK,EAAE,KAAK,WAAW,KAAK,CAAC;AAAA,IAAG,OAAO;AAAA,EAClE,OAAO;AAAA;AAGT,eAAe,UAAU,CACvB,YACA,OACA,UACA,KAC8B;AAAA,EAC9B,MAAM,SAA8B,CAAC;AAAA,EACrC,WAAW,WAAW,YAAY,CAAC,GAAG;AAAA,IACpC,IAAI,CAAE,MAAM,eAAe,SAAS,GAAG,GAAI;AAAA,MACzC,OAAO,KAAK,EAAE,QAAQ,YAAY,OAAO,QAAQ,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAQT,eAAsB,qBAAqB,CAAC,MAA2C;AAAA,EACrF,MAAM,UAAU,MAAM,mBAAmB,IAAI;AAAA,EAC7C,MAAM,SAA8B,CAAC;AAAA,EACrC,WAAW,cAAc,SAAS;AAAA,IAChC,MAAM,SAAS,KAAK,MAAM,aAAa,YAAY,MAAM,CAAC;AAAA,IAC1D,MAAM,YAAY,OAAO,aAAa,OAAO,KAAK;AAAA,IAClD,OAAO,KAAK,GAAI,MAAM,WAAW,YAAY,UAAU,OAAO,QAAQ,IAAI,CAAE;AAAA,IAC5E,OAAO,KAAK,GAAI,MAAM,WAAW,YAAY,aAAa,WAAW,IAAI,CAAE;AAAA,EAC7E;AAAA,EACA,OAAO,EAAE,SAAS,OAAO;AAAA;;;ADvD3B,SAAS,SAAS,CAAC,MAAsB;AAAA,EACvC,MAAM,OAAO,CAAC,SAAiB,KAAK,SAAS,IAAI;AAAA,EACjD,MAAM,WAAW,CAAC,SAAqC;AAAA,IACrD,MAAM,IAAI,KAAK,QAAQ,IAAI;AAAA,IAC3B,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK;AAAA;AAAA,EAEhC,MAAM,gBAAgB,KAAK,kBAAkB;AAAA,EAC7C,OAAO;AAAA,IACL,MAAM,QAAQ,IAAI;AAAA,IAClB,YAAY,SAAS,UAAU;AAAA,IAC/B;AAAA,IACA,aAAa,iBAAiB,KAAK,WAAW;AAAA,IAC9C,OAAO,KAAK,SAAS;AAAA,IACrB,QAAQ,CAAC,KAAK,aAAa;AAAA,IAC3B,MAAM,KAAK,QAAQ,KAAK,KAAK,IAAI;AAAA,EACnC;AAAA;AAGF,eAAe,SAAS,GAAoB;AAAA,EAC1C,MAAM,SAAmB,CAAC;AAAA,EAC1B,iBAAiB,SAAS,IAAI,MAAM,OAAO;AAAA,IAAG,OAAO,KAAK,IAAI,YAAY,EAAE,OAAO,KAAK,CAAC;AAAA,EACzF,OAAO,OAAO,KAAK,EAAE;AAAA;AAGvB,SAAS,YAAY,CAAC,GAA2B;AAAA,EAC/C,WAAW,KAAK,EAAE,oBAAoB;AAAA,IACpC,QAAQ,OAAO,MAAM,4BAA4B;AAAA,CAAK;AAAA,EACxD;AAAA,EACA,aAAa,MAAM,eAAe,EAAE,kBAAkB;AAAA,IACpD,QAAQ,OAAO,MAAM,KAAK,6BAA6B;AAAA,CAAa;AAAA,EACtE;AAAA,EACA,WAAW,KAAK,EAAE,cAAc;AAAA,IAC9B,QAAQ,OAAO,MAAM,mDAAmD;AAAA,CAAK;AAAA,EAC/E;AAAA,EACA,WAAW,KAAK,EAAE,YAAY;AAAA,IAC5B,QAAQ,OAAO,MACb,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,QAAQ,CAAC,cAAc,EAAE;AAAA,CACjE;AAAA,EACF;AAAA;AAGF,SAAS,aAAa,CAAC,GAAqB,MAAkB;AAAA,EAC5D,IAAI,EAAE,QAAQ,WAAW;AAAA,IAAG;AAAA,EAC5B,QAAQ,OAAO,MACb,GAAG,KAAK,gBAAgB,MAAM,SAAS,EAAE,QAAQ;AAAA,CACnD;AAAA,EACA,IAAI,KAAK;AAAA,IAAa,WAAW,KAAK,EAAE;AAAA,MAAS,QAAQ,OAAO,MAAM,MAAM;AAAA,CAAK;AAAA,EAC5E;AAAA,YAAQ,OAAO,MAAM;AAAA,CAAkD;AAAA;AAG9E,SAAS,YAAY,CAAC,QAAkC;AAAA,EACtD,IAAI,OAAO,OAAO,WAAW;AAAA,IAAG;AAAA,EAChC,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO;AAAA,CAAiD;AAAA,EACzF,WAAW,KAAK,OAAO,QAAQ;AAAA,IAC7B,QAAQ,OAAO,MAAM,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE;AAAA,CAAW;AAAA,EACnE;AAAA;AAGF,SAAS,QAAQ,GAAS;AAAA,EACxB,QAAQ,OAAO,MACb;AAAA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,sEACJ;AAAA;AAGF,eAAe,IAAI,GAAkB;AAAA,EACnC,MAAM,OAAO,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,EAC5C,IAAI,KAAK,MAAM;AAAA,IACb,SAAS;AAAA,IACT;AAAA,EACF;AAAA,EAEA,QAAQ,QAAQ,WAAW,MAAM,mBAAmB,KAAK,MAAM,KAAK,UAAU;AAAA,EAC9E,MAAM,SAAS,OAAO,UAAU;AAAA,EAEhC,MAAM,WAAW,KAAK,QAClB,yDAA0B,KAAK,OAAO,MAAM;AAAA,IAC1C,MAAM,OAAO,mBAAmB,MAAM,UAAU,GAAG,MAAM;AAAA,IACzD,OAAS,iBAAiB,KAAK,MAAM,MAAM,MAAM;AAAA,GAClD,IACD,MAAM,gBAAgB,KAAK,MAAM,MAAM;AAAA,EAE3C,aAAa,QAAQ;AAAA,EACrB,cAAc,UAAU,IAAI;AAAA,EAE5B,IAAI,SAA6B,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC3D,IAAI,KAAK,QAAQ;AAAA,IACf,SAAS,MAAM,sBAAsB,KAAK,IAAI;AAAA,IAC9C,aAAa,MAAM;AAAA,EACrB;AAAA,EAEA,MAAM,SAAS,WAAW,UAAU,KAAK,aAAa,KAAK,OAAO,OAAO,SAAS;AAAA,EAClF,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,OAAO,SAAS,WAAW,mBAAmB;AAAA,IACpD,MAAM,QAAQ,SAAS,KAAK;AAAA,IAC5B,MAAM,aAAa,SAAS,QAAQ,SAAS,KAAK,SAAS,QAAQ,kBAAkB;AAAA,IACrF,MAAM,aAAa,OAAO,QAAQ,SAC9B,KAAK,OAAO,QAAQ,gCACpB;AAAA,IACJ,QAAQ,OAAO,MACb,mBAAmB,SAAS,uBAAuB,OAAO,QAAQ,aAAa;AAAA,CACjF;AAAA,EACF;AAAA,EACA,QAAQ,KAAK,SAAS,IAAI,CAAC;AAAA;AAG7B,MAAM,KAAK;",
|
|
11
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "CE201D1B3DC4BC5164756E2164756E21",
|
|
12
14
|
"names": []
|
|
13
15
|
}
|
|
@@ -6,5 +6,5 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { type LoadedConfig, loadCoverageConfig } from "./discover";
|
|
8
8
|
export { type CoverageFindings, type CoverageRow, enforceCoverage, evaluateCoverage, hasFailure, parseCoverageTable, runCoverage, type Violation, } from "./enforce";
|
|
9
|
-
export { findStrykerConfigs, type MutateTargetIssue, type MutateTargetReport, validateMutateTargets, } from "./mutate-targets";
|
|
9
|
+
export { findMutateConfigs, findStrykerConfigs, type MutateConfigEntry, type MutateTargetIssue, type MutateTargetReport, validateMutateTargets, } from "./mutate-targets";
|
|
10
10
|
export type { CoverageConfig, ExemptEntry, FileThreshold } from "./types";
|