@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
|
@@ -170,6 +170,14 @@ var init_idb_helpers = __esm(() => {
|
|
|
170
170
|
});
|
|
171
171
|
|
|
172
172
|
// src/shared/lib/storage-adapter.ts
|
|
173
|
+
var exports_storage_adapter = {};
|
|
174
|
+
__export(exports_storage_adapter, {
|
|
175
|
+
ChromeStorageAdapter: () => ChromeStorageAdapter,
|
|
176
|
+
IndexedDBAdapter: () => IndexedDBAdapter,
|
|
177
|
+
MemoryStorageAdapter: () => MemoryStorageAdapter,
|
|
178
|
+
createStorageAdapter: () => createStorageAdapter
|
|
179
|
+
});
|
|
180
|
+
|
|
173
181
|
class IndexedDBAdapter {
|
|
174
182
|
dbName;
|
|
175
183
|
storeName = "state";
|
|
@@ -301,6 +309,14 @@ var init_storage_adapter = __esm(() => {
|
|
|
301
309
|
});
|
|
302
310
|
|
|
303
311
|
// src/shared/lib/sync-adapter.ts
|
|
312
|
+
var exports_sync_adapter = {};
|
|
313
|
+
__export(exports_sync_adapter, {
|
|
314
|
+
BroadcastChannelSyncAdapter: () => BroadcastChannelSyncAdapter,
|
|
315
|
+
ChromeRuntimeSyncAdapter: () => ChromeRuntimeSyncAdapter,
|
|
316
|
+
NoOpSyncAdapter: () => NoOpSyncAdapter,
|
|
317
|
+
createSyncAdapter: () => createSyncAdapter
|
|
318
|
+
});
|
|
319
|
+
|
|
304
320
|
class NoOpSyncAdapter {
|
|
305
321
|
broadcast(_message) {}
|
|
306
322
|
onMessage(_callback) {
|
|
@@ -712,4 +728,4 @@ export {
|
|
|
712
728
|
uiState
|
|
713
729
|
};
|
|
714
730
|
|
|
715
|
-
//# debugId=
|
|
731
|
+
//# debugId=332ACB0F7CF4A91E64756E2164756E21
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"// State primitives with optional sync and persistence\n\nimport { effect, type Signal, signal } from \"@preact/signals\";\nimport type { MessageBus } from \"./message-bus\";\nimport { createStorageAdapter, type StorageAdapter } from \"./storage-adapter\";\nimport { createSyncAdapter, type StateSyncMessage, type SyncAdapter } from \"./sync-adapter\";\n\n/**\n * Signal extended with .loaded promise for hydration control\n */\ntype SignalWithLoaded<T> = Signal<T> & { loaded: Promise<void> };\n\n/**\n * Signal extended with .loaded and .verify properties for verification tracking\n */\ntype SignalWithVerify<T> = Signal<T> & { loaded: Promise<void>; verify: T };\n\ntype StateEntry<T> = {\n signal: Signal<T>;\n clock: number; // Lamport clock for causal ordering\n loaded: Promise<void>;\n updating: boolean;\n};\n\ntype StateOptions<T = unknown> = {\n // Legacy MessageBus support (deprecated, will be removed in v2.0)\n bus?: MessageBus;\n\n // New adapter system (recommended)\n storage?: StorageAdapter; // Custom storage adapter\n sync?: SyncAdapter; // Custom sync adapter\n\n // Behavior options\n debounceMs?: number; // Debounce storage writes\n validator?: (value: unknown) => value is T; // Runtime type validation\n verify?: boolean; // Enable verification tracking (creates plain object mirror)\n};\n\nconst stateRegistry = new Map<string, StateEntry<unknown>>();\n\n/**\n * Shared state: synced across all contexts AND persisted to storage\n *\n * Uses Lamport clock for conflict resolution. State is automatically:\n * - Loaded from chrome.storage on initialization\n * - Synced to other contexts via broadcast messages\n * - Persisted to chrome.storage on every change\n *\n * Available in: background, popup, options, devtools, content scripts\n * ⚠️ NOT available in page scripts (use content script state instead)\n *\n * @param key - Unique identifier for this state (e.g., \"app-settings\")\n * @param initialValue - Default value if nothing is in storage\n * @param options - Optional configuration (bus, debounceMs)\n * @returns Reactive signal that stays in sync across all contexts\n *\n * @example\n * ```typescript\n * // Define once, use everywhere\n * const settings = $sharedState(\"settings\", { theme: \"dark\" })\n *\n * // Changes automatically sync\n * settings.value = { theme: \"light\" }\n * ```\n */\nexport function $sharedState<T>(\n key: string,\n initialValue: T,\n options: StateOptions<T> = {}\n): Signal<T> & { loaded: Promise<void>; verify?: T } {\n const sig = createState(key, initialValue, {\n ...options,\n enableSync: true,\n enablePersist: true,\n });\n\n // Expose loaded promise for awaiting hydration\n const entry = stateRegistry.get(key);\n if (entry) {\n (sig as unknown as SignalWithLoaded<T>).loaded = entry.loaded;\n }\n\n return sig as unknown as Signal<T> & { loaded: Promise<void> };\n}\n\n/**\n * Synced state: synced across all contexts but NOT persisted\n *\n * State is broadcast to all contexts in real-time but resets on extension reload.\n *\n * Available in: background, popup, options, devtools, content scripts\n * ⚠️ NOT available in page scripts\n *\n * @param key - Unique identifier for this state\n * @param initialValue - Default value\n * @param options - Optional configuration\n * @returns Reactive signal synced across contexts (but not persisted)\n *\n * @example\n * ```typescript\n * // Temporary shared state\n * const activeTabId = $syncedState(\"active-tab\", null)\n * ```\n */\nexport function $syncedState<T>(\n key: string,\n initialValue: T,\n options: StateOptions<T> = {}\n): Signal<T> {\n return createState(key, initialValue, {\n ...options,\n enableSync: true,\n enablePersist: false,\n });\n}\n\n/**\n * Persisted state: persisted to storage but NOT synced across contexts\n *\n * Each context has its own copy of the state, persisted independently.\n *\n * Available in: background, popup, options, devtools, content scripts\n * ⚠️ NOT available in page scripts\n *\n * @param key - Unique identifier (use prefix like \"popup:state\" to avoid collisions)\n * @param initialValue - Default value\n * @param options - Optional configuration\n * @returns Reactive signal persisted to storage (but not synced)\n *\n * @example\n * ```typescript\n * // Each context has its own persisted state\n * const popupState = $persistedState(\"popup:last-panel\", \"home\")\n * const devtoolsState = $persistedState(\"devtools:expanded\", true)\n * ```\n */\nexport function $persistedState<T>(\n key: string,\n initialValue: T,\n options: StateOptions<T> = {}\n): Signal<T> & { loaded: Promise<void> } {\n const sig = createState(key, initialValue, {\n ...options,\n enableSync: false,\n enablePersist: true,\n });\n\n // Expose loaded promise for awaiting hydration\n const entry = stateRegistry.get(key);\n if (entry) {\n (sig as unknown as SignalWithLoaded<T>).loaded = entry.loaded;\n }\n\n return sig as unknown as Signal<T> & { loaded: Promise<void> };\n}\n\n/**\n * Local state: not synced, not persisted (like regular Preact signal)\n *\n * Simple reactive state that lives only in the current context.\n * Resets on reload or context restart.\n *\n * Available in: all contexts (including page scripts)\n *\n * @param initialValue - Default value\n * @returns Reactive signal (local only)\n *\n * @example\n * ```typescript\n * // Local UI state\n * const isLoading = $state(false)\n * const error = $state<string | null>(null)\n * ```\n */\nexport function $state<T>(initialValue: T): Signal<T> {\n return signal(initialValue);\n}\n\n/** Server-side authoritative state, keyed for stable identity across the\n * process. Unlike the browser primitives it does NOT sync across contexts or\n * persist to chrome.storage — the server holds the canonical replica and is\n * the always-on peer; connected clients receive derived updates through the\n * Elysia `polly()` plugin's effect/broadcast layer rather than through this\n * signal directly. Used inside `polly({ state: { server: { ... } } })` and\n * read on the request context as `pollyState.server.<key>.value`. */\nconst serverStateRegistry = new Map<string, Signal<unknown>>();\n\n/**\n * Reactive server-only state. The first call for a `key` creates the signal;\n * later calls with the same `key` return that same signal, so a module that\n * declares its server state once gets a stable reference everywhere it is\n * read.\n *\n * @param key - Stable identifier for this server state (e.g. \"db\")\n * @param initialValue - Value held until the server mutates it\n * @returns A reactive signal holding the authoritative server value\n *\n * @example\n * ```typescript\n * import { $serverState } from \"@fairfox/polly\";\n *\n * const db = { todos: signal([]), nextId: 1 };\n * polly({ state: { server: { db: $serverState(\"db\", db) } } });\n * // in a handler: ctx.pollyState.server.db.value.todos.value = [...]\n * ```\n */\nexport function $serverState<T>(key: string, initialValue: T): Signal<T> {\n const existing = serverStateRegistry.get(key);\n // The registry erases T (it stores Signal<unknown>); the key is the\n // caller's contract that the stored signal carries their T.\n if (existing) return existing as unknown as Signal<T>;\n const sig = signal(initialValue);\n serverStateRegistry.set(key, sig as unknown as Signal<unknown>);\n return sig;\n}\n\ntype InternalStateOptions<T = unknown> = StateOptions<T> & {\n enableSync: boolean; // Whether to enable sync (avoid collision with sync?: SyncAdapter)\n enablePersist: boolean; // Whether to enable persistence\n};\n\n// Deep equality check to prevent redundant updates\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (\n !deepEqual(\n (a as unknown as Record<string, unknown>)[key],\n (b as unknown as Record<string, unknown>)[key]\n )\n )\n return false;\n }\n\n return true;\n}\n\n/**\n * Resolve storage and sync adapters with three-tier priority:\n * 1. Explicit adapters from options (highest priority)\n * 2. MessageBus adapters (legacy, deprecated)\n * 3. Auto-detected adapters (default behavior)\n */\nfunction resolveAdapters(options: InternalStateOptions): {\n storage: StorageAdapter | null;\n sync: SyncAdapter | null;\n} {\n // Priority 1: Explicit adapters (partial or full)\n if (options.storage || options.sync) {\n return {\n storage: options.storage || (options.enablePersist ? createStorageAdapter() : null),\n sync: options.sync || (options.enableSync ? createSyncAdapter() : null),\n };\n }\n\n // Priority 2: MessageBus (legacy support)\n // MessageBus doesn't provide sync adapter, only Chrome storage\n if (options.bus) {\n return {\n storage: options.bus.adapters.storage,\n sync: options.enableSync ? createSyncAdapter() : null,\n };\n }\n\n // Priority 3: Auto-detect based on enableSync and enablePersist flags\n return {\n storage: options.enablePersist ? createStorageAdapter() : null,\n sync: options.enableSync ? createSyncAdapter() : null,\n };\n}\n\nfunction createState<T>(key: string, initialValue: T, options: InternalStateOptions<T>): Signal<T> {\n // Return existing signal if already registered\n if (stateRegistry.has(key)) {\n return stateRegistry.get(key)?.signal as unknown as Signal<T>;\n }\n\n const sig = signal(initialValue);\n\n // Create verification mirror if requested\n if (options.verify) {\n // Create plain object mirror for verification\n const mirror = JSON.parse(JSON.stringify(initialValue)) as unknown as T;\n (sig as unknown as SignalWithVerify<T>).verify = mirror;\n }\n\n const entry: StateEntry<T> = {\n signal: sig,\n clock: 0,\n loaded: Promise.resolve(),\n updating: false,\n };\n\n // Resolve adapters (explicit, MessageBus, or auto-detect)\n const adapters = resolveAdapters(options);\n\n // Load from storage if persist is enabled\n if (options.enablePersist && adapters.storage) {\n entry.loaded = loadFromStorage(key, sig, entry, adapters.storage, options.validator);\n }\n\n // polly#167: the pending debounce timer lives in createState scope, not\n // inside the `loaded` callback, because the incoming-message handler below\n // has to be able to cancel a write the message supersedes.\n let debounceTimer: NodeJS.Timeout | null = null;\n\n // Watch for changes after initial load\n entry.loaded.then(() => {\n let previousValue = sig.value;\n let isFirstRun = true;\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Sync effect requires coordination of multiple state change scenarios\n effect(() => {\n // Read the signal FIRST, before any early return can happen.\n //\n // Preact re-collects an effect's dependencies on every run, so a run that\n // returns without touching `sig.value` unsubscribes the effect for good.\n // The run an incoming sync message triggers is exactly such a run.\n const value = sig.value;\n\n // Skip first run (effect fires immediately on registration)\n if (isFirstRun) {\n isFirstRun = false;\n return;\n }\n\n // An incoming message is being applied. Adopt it as the baseline — this\n // context now holds it, so the next local change is a change against it —\n // and do not broadcast, which would echo it back to the sender.\n if (entry.updating) {\n previousValue = value;\n return;\n }\n\n // Skip if value hasn't changed (deep equality check)\n if (deepEqual(value, previousValue)) {\n return;\n }\n\n previousValue = value;\n\n // Update verification mirror if enabled\n if (options.verify) {\n const verifySignal = sig as unknown as SignalWithVerify<T>;\n if (verifySignal.verify) {\n // nosemgrep: javascript.lang.security.insecure-object-assign.insecure-object-assign — internal mirror; value is a deep JSON clone, not arbitrary external input.\n Object.assign(verifySignal.verify, JSON.parse(JSON.stringify(value)));\n }\n }\n\n // Increment clock monotonically\n entry.clock++;\n\n // polly#167: bind the clock to the value HERE, where the two agree.\n //\n // `doUpdate` used to read `entry.clock` when it fired. Under\n // `debounceMs` that is a later moment, and the incoming-message handler\n // below raises `entry.clock` to any message's clock — including a\n // message whose value it rejects. So the deferred write paired this\n // value with somebody else's clock, persisted the pair, and broadcast\n // it. The persisted clock is restored on the next load, so a peer\n // re-sending the real value at that clock was then refused by the\n // strictly-greater rule and the divergence became durable.\n const clockAtWrite = entry.clock;\n\n const doUpdate = () => {\n debounceTimer = null;\n\n // Persist to storage\n if (options.enablePersist && adapters.storage) {\n persistToStorage(key, value, clockAtWrite, adapters.storage);\n }\n\n // Broadcast to other contexts\n if (options.enableSync && adapters.sync) {\n broadcastUpdate(key, value, clockAtWrite, adapters.sync);\n }\n };\n\n // Debounce if specified\n if (options.debounceMs) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(doUpdate, options.debounceMs);\n } else {\n doUpdate();\n }\n });\n });\n\n // Listen for updates from other contexts (only if sync enabled)\n if (options.enableSync && adapters.sync) {\n // Connect if needed (some adapters require explicit connection)\n if (adapters.sync.connect) {\n adapters.sync.connect();\n }\n\n /**\n * Take an incoming value this context has decided to accept.\n *\n * polly#167 put two steps in front of the apply. Both are about a pending\n * debounce timer that the message has just made wrong.\n */\n const acceptIncoming = (value: T, clock: number): void => {\n // The local value is causally older than this one, so the deferred write\n // has nothing left to say. Dropping it stops a stale broadcast that a\n // third context still below this clock would accept.\n //\n // Reached only for a value this context does not already hold: the\n // deep-equality skip below returns first, which leaves a pending timer\n // holding that same value armed, as it should be.\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n\n applyUpdate(entry, value, clock);\n\n // `applyUpdate` sets `entry.updating`, so the local effect returns\n // without writing. Persist the incoming pair here, or storage keeps\n // whatever it last held while the signal holds this value — and on the\n // next load the two disagree.\n if (options.enablePersist && adapters.storage) {\n persistToStorage(key, value, clock, adapters.storage);\n }\n };\n\n /** Whether an incoming value is one this context should take. */\n const shouldAccept = (message: StateSyncMessage<T>): boolean => {\n // Validate incoming value if validator provided\n if (options.validator && !options.validator(message.value)) {\n console.warn(\n `[Polly] State \"${key}\": Received invalid value from sync (clock: ${message.clock})`,\n message.value\n );\n return false;\n }\n\n // Skip redundant updates (deep equality check)\n return !deepEqual(entry.signal.value, message.value);\n };\n\n // Register sync message listener\n adapters.sync.onMessage<T>((message) => {\n if (message.key !== key) return;\n\n const oldClock = entry.clock;\n\n // Lamport clock rule: Always update to max(local, received)\n // This maintains causal ordering even when rejecting updates\n entry.clock = Math.max(entry.clock, message.clock);\n\n // Only accept value updates if received clock is strictly greater than old local clock\n // This ensures we only apply causally newer updates\n if (message.clock > oldClock && shouldAccept(message)) {\n acceptIncoming(message.value as unknown as T, message.clock);\n }\n });\n }\n\n stateRegistry.set(key, entry as unknown as StateEntry<unknown>);\n return sig;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Backfill keys added to the state shape since a value was persisted.\n *\n * Stored plain objects are shallow-merged over the current defaults so that a\n * field added in a later release rehydrates to its default rather than\n * `undefined`. Primitives and arrays are replaced wholesale — merging those\n * would corrupt them.\n */\nfunction reconcileWithDefaults<T>(defaults: T, stored: unknown): T {\n // Persisted values are trusted to be the T this key was registered with;\n // schema drift is handled by the merge, not by runtime validation.\n if (isPlainObject(defaults) && isPlainObject(stored)) {\n return { ...defaults, ...stored } as unknown as T;\n }\n return stored as unknown as T;\n}\n\nasync function loadFromStorage<T>(\n key: string,\n sig: Signal<T>,\n entry: StateEntry<T>,\n storage: StorageAdapter,\n validator?: (value: unknown) => value is T\n): Promise<void> {\n try {\n const result = await storage.get([key, `${key}:clock`]);\n\n if (result[key] !== undefined) {\n // sig still holds the initial value here, so it is the default base\n // for backfilling keys the persisted blob predates.\n const storedValue = reconcileWithDefaults(sig.peek(), result[key]);\n\n // Validate stored value if validator provided\n if (validator) {\n if (validator(storedValue)) {\n sig.value = storedValue;\n } else {\n console.warn(\n `[Polly] State \"${key}\": Stored value failed validation, using initial value`,\n storedValue\n );\n }\n } else {\n sig.value = storedValue as unknown as T;\n }\n }\n\n if (result[`${key}:clock`] !== undefined) {\n entry.clock = result[`${key}:clock`] as unknown as number;\n }\n } catch (error) {\n console.warn(`[Polly] Failed to load state from storage: ${key}`, error);\n }\n}\n\nfunction persistToStorage<T>(key: string, value: T, clock: number, storage: StorageAdapter): void {\n try {\n storage.set({\n [key]: value,\n [`${key}:clock`]: clock,\n });\n } catch (error) {\n console.warn(`[Polly] Failed to persist state to storage: ${key}`, error);\n }\n}\n\nfunction broadcastUpdate<T>(key: string, value: T, clock: number, sync: SyncAdapter): void {\n try {\n sync.broadcast({\n key,\n value,\n clock,\n });\n } catch (error) {\n console.warn(`[Polly] Failed to broadcast state update: ${key}`, error);\n }\n}\n\nfunction applyUpdate<T>(entry: StateEntry<T>, value: T, clock: number): void {\n entry.updating = true;\n entry.signal.value = value;\n entry.clock = clock;\n entry.updating = false;\n}\n\n/**\n * Get state by key (useful for retrieving state without re-creating)\n */\nexport function getStateByKey<T>(key: string): Signal<T> | undefined {\n const entry = stateRegistry.get(key);\n return entry?.signal as unknown as Signal<T> | undefined;\n}\n\n/**\n * Clear state registry (useful for testing)\n */\nexport function clearStateRegistry(): void {\n stateRegistry.clear();\n}\n",
|
|
10
10
|
"// Type definitions for all messages in the extension\n\n/**\n * Base message interface that all messages must satisfy.\n * This allows users to define custom messages alongside framework messages.\n */\nexport interface BaseMessage {\n type: string;\n}\n\nexport type Context =\n | \"background\"\n | \"content\"\n | \"page\"\n | \"devtools\"\n | \"popup\"\n | \"options\"\n | \"sidepanel\"\n | \"offscreen\";\n\n// All contexts (useful for broadcast)\nexport const ALL_CONTEXTS: Context[] = [\n \"background\",\n \"content\",\n \"page\",\n \"devtools\",\n \"popup\",\n \"options\",\n \"sidepanel\",\n \"offscreen\",\n] as const;\n\n// Settings schema\nexport type Settings = {\n theme: \"light\" | \"dark\" | \"auto\";\n autoSync: boolean;\n debugMode: boolean;\n notifications: boolean;\n apiEndpoint: string;\n refreshInterval: number;\n};\n\nexport const defaultSettings: Settings = {\n theme: \"auto\",\n autoSync: true,\n debugMode: false,\n notifications: true,\n apiEndpoint: \"https://api.example.com\",\n refreshInterval: 60000,\n};\n\n// Logging types\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type LogEntry = {\n id: string;\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: string;\n stack?: string;\n source: Context;\n timestamp: number;\n};\n\n// All possible messages (discriminated union)\nexport type ExtensionMessage =\n // DOM Operations (handled by Content Script)\n | { type: \"DOM_QUERY\"; selector: string }\n | { type: \"DOM_UPDATE\"; selector: string; content: string }\n | {\n type: \"DOM_INSERT\";\n position: \"beforebegin\" | \"afterbegin\" | \"beforeend\" | \"afterend\";\n html: string;\n }\n | { type: \"DOM_REMOVE\"; selector: string }\n\n // Page Script Operations (handled by Page Script)\n | { type: \"PAGE_GET_VAR\"; varName: string }\n | { type: \"PAGE_CALL_FN\"; fnName: string; args: unknown[] }\n | { type: \"PAGE_SET_VAR\"; varName: string; value: unknown }\n\n // API Operations (handled by Background)\n | {\n type: \"API_REQUEST\";\n endpoint: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n body?: unknown;\n headers?: Record<string, string>;\n }\n | {\n type: \"API_BATCH\";\n requests: Array<{ endpoint: string; method: string; body?: unknown }>;\n }\n\n // Clipboard Operations (handled by Offscreen)\n | { type: \"CLIPBOARD_WRITE\"; text: string }\n | { type: \"CLIPBOARD_WRITE_HTML\"; html: string }\n | { type: \"CLIPBOARD_WRITE_RICH\"; data: { text: string; html: string } }\n | { type: \"CLIPBOARD_READ\" }\n\n // Context Menu (handled by Background)\n | {\n type: \"CONTEXT_MENU_CLICKED\";\n menuId: string;\n info: chrome.contextMenus.OnClickData;\n tabId: number;\n }\n | {\n type: \"CONTEXT_MENU_CREATE\";\n id: string;\n title: string;\n contexts: chrome.contextMenus.ContextType[];\n }\n | { type: \"CONTEXT_MENU_REMOVE\"; id: string }\n\n // State Sync (broadcast) - Internal only, handled by state primitives\n | {\n type: \"STATE_SYNC\";\n key: string;\n value: unknown;\n clock: number;\n }\n\n // Tab Operations (handled by Background)\n | { type: \"TAB_QUERY\"; queryInfo: chrome.tabs.QueryInfo }\n | { type: \"TAB_GET_CURRENT\" }\n | { type: \"TAB_RELOAD\"; tabId: number }\n\n // DevTools Operations\n | { type: \"DEVTOOLS_INSPECT_ELEMENT\"; selector: string }\n | {\n type: \"DEVTOOLS_LOG\";\n level: \"log\" | \"warn\" | \"error\";\n message: string;\n data?: unknown;\n }\n\n // Logging (handled by Background LogStore)\n | {\n type: \"LOG\";\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: string;\n stack?: string;\n source: Context;\n timestamp: number;\n }\n | {\n type: \"LOGS_GET\";\n filters?: {\n level?: LogLevel;\n source?: Context;\n since?: number;\n limit?: number;\n };\n }\n | { type: \"LOGS_CLEAR\" }\n | { type: \"LOGS_EXPORT\" }\n\n // Test Messages (only used in tests)\n | { type: \"TEST_MESSAGE\"; data?: unknown }\n | { type: \"TEST\"; iteration?: number }\n | { type: \"CUSTOM_MESSAGE\"; data?: unknown }\n | { type: \"SETTINGS_GET\" }\n | {\n type: \"SIGNAL_UPDATE\";\n key?: string;\n value?: unknown;\n signalId?: string;\n source?: Context;\n }\n | {\n type: \"USER_DATA\";\n password?: string;\n apiKey?: string;\n [key: string]: unknown;\n };\n\n// Helper: Look up the full message type from a union based on the 'type' discriminator\ntype LookupMessage<TUnion, TType extends string> = TUnion extends { type: TType } ? TUnion : never;\n\n// Extract response type from message using phantom type\n// If message has __response field (phantom type), use it; otherwise infer from framework messages\nexport type MessageResponse<T extends BaseMessage> =\n // First, try to find the matching message in the union by type discriminator\n T extends { type: infer TType extends string }\n ? LookupMessage<T, TType> extends { readonly __response?: infer R }\n ? R // Found phantom type, use it\n : T extends ExtensionMessage\n ? // Framework message - infer from type\n // DOM Operations\n T extends { type: \"DOM_QUERY\" }\n ? {\n elements: Array<{\n tag: string;\n text: string;\n html: string;\n attrs: Record<string, string>;\n rect?: DOMRect;\n }>;\n }\n : T extends { type: \"DOM_UPDATE\" }\n ? { success: boolean }\n : T extends { type: \"DOM_INSERT\" }\n ? { success: boolean }\n : T extends { type: \"DOM_REMOVE\" }\n ? { success: boolean; count: number }\n : // Page Script Operations\n T extends { type: \"PAGE_GET_VAR\" }\n ? { value: unknown; exists: boolean }\n : T extends { type: \"PAGE_CALL_FN\" }\n ? { result: unknown; error?: string }\n : T extends { type: \"PAGE_SET_VAR\" }\n ? { success: boolean }\n : // API Operations\n T extends { type: \"API_REQUEST\" }\n ? {\n data: unknown;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n error?: string;\n }\n : T extends { type: \"API_BATCH\" }\n ? {\n results: Array<{\n data: unknown;\n status: number;\n error?: string;\n }>;\n }\n : // Clipboard Operations\n T extends { type: \"CLIPBOARD_WRITE\" }\n ? { success: boolean }\n : T extends { type: \"CLIPBOARD_WRITE_HTML\" }\n ? { success: boolean }\n : T extends { type: \"CLIPBOARD_WRITE_RICH\" }\n ? { success: boolean }\n : T extends { type: \"CLIPBOARD_READ\" }\n ? { text: string }\n : // Context Menu\n T extends { type: \"CONTEXT_MENU_CLICKED\" }\n ? undefined\n : T extends { type: \"CONTEXT_MENU_CREATE\" }\n ? { success: boolean }\n : T extends { type: \"CONTEXT_MENU_REMOVE\" }\n ? { success: boolean }\n : // State Sync\n T extends { type: \"STATE_SYNC\" }\n ? undefined\n : // Tab Operations\n T extends { type: \"TAB_QUERY\" }\n ? { tabs: chrome.tabs.Tab[] }\n : T extends {\n type: \"TAB_GET_CURRENT\";\n }\n ? { tab: chrome.tabs.Tab }\n : T extends {\n type: \"TAB_RELOAD\";\n }\n ? { success: boolean }\n : // DevTools Operations\n T extends {\n type: \"DEVTOOLS_INSPECT_ELEMENT\";\n }\n ? {\n success: boolean;\n }\n : T extends {\n type: \"DEVTOOLS_LOG\";\n }\n ? undefined\n : // Logging Operations\n T extends {\n type: \"LOG\";\n }\n ? {\n success: boolean;\n }\n : T extends {\n type: \"LOGS_GET\";\n }\n ? {\n logs: LogEntry[];\n }\n : T extends {\n type: \"LOGS_CLEAR\";\n }\n ? {\n success: boolean;\n count: number;\n }\n : T extends {\n type: \"LOGS_EXPORT\";\n }\n ? {\n json: string;\n count: number;\n }\n : T extends {\n type: \"SETTINGS_GET\";\n }\n ? {\n settings: unknown;\n }\n : undefined\n : unknown // For custom messages outside ExtensionMessage, require phantom type\n : unknown; // Fallback for messages without type field\n\n// Message handler mapping (which context handles which message)\n// Can be a single context or an array for multi-target routing\nexport type MessageHandler = {\n DOM_QUERY: \"content\";\n DOM_UPDATE: \"content\";\n DOM_INSERT: \"content\";\n DOM_REMOVE: \"content\";\n\n PAGE_GET_VAR: \"page\";\n PAGE_CALL_FN: \"page\";\n PAGE_SET_VAR: \"page\";\n\n API_REQUEST: \"background\";\n API_BATCH: \"background\";\n\n CLIPBOARD_WRITE: \"offscreen\";\n CLIPBOARD_WRITE_HTML: \"offscreen\";\n CLIPBOARD_WRITE_RICH: \"offscreen\";\n CLIPBOARD_READ: \"offscreen\";\n\n CONTEXT_MENU_CLICKED: \"background\";\n CONTEXT_MENU_CREATE: \"background\";\n CONTEXT_MENU_REMOVE: \"background\";\n\n STATE_SYNC: Context[]; // Broadcast to all contexts\n\n TAB_QUERY: \"background\";\n TAB_GET_CURRENT: \"background\";\n TAB_RELOAD: \"background\";\n\n DEVTOOLS_INSPECT_ELEMENT: \"content\";\n DEVTOOLS_LOG: \"background\";\n\n LOG: \"background\";\n LOGS_GET: \"background\";\n LOGS_CLEAR: \"background\";\n LOGS_EXPORT: \"background\";\n};\n\n// Routed message envelope\nexport type RoutedMessage<T extends BaseMessage = ExtensionMessage> = {\n id: string; // Correlation ID (UUID)\n source: Context; // Which context sent it\n targets: Context[]; // Which contexts should receive this (can be multiple)\n tabId?: number; // Required for per-tab contexts\n timestamp: number; // When it was sent\n payload: T; // The actual message\n};\n\n// Routed response envelope\nexport type RoutedResponse<T extends BaseMessage = ExtensionMessage> = {\n id: string; // Matches request ID\n success: boolean; // Whether operation succeeded\n data?: MessageResponse<T>; // Response data\n error?: string; // Error message if failed\n timestamp: number; // When response was sent\n};\n"
|
|
11
11
|
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "332ACB0F7CF4A91E64756E2164756E21",
|
|
14
14
|
"names": []
|
|
15
15
|
}
|
|
@@ -460,6 +460,15 @@ function toJson(result) {
|
|
|
460
460
|
// tools/bdd/src/run.ts
|
|
461
461
|
init_parse();
|
|
462
462
|
var DEFERRED_TAGS = new Set(["formal", "forbidden"]);
|
|
463
|
+
var CONTRACT_VIOLATIONS_KEY = "__pollyContractViolations";
|
|
464
|
+
function drainContractViolations() {
|
|
465
|
+
const list = globalThis[CONTRACT_VIOLATIONS_KEY];
|
|
466
|
+
if (!Array.isArray(list))
|
|
467
|
+
return [];
|
|
468
|
+
const messages = list.map((v) => v instanceof Error ? v.message : String(v));
|
|
469
|
+
list.length = 0;
|
|
470
|
+
return messages;
|
|
471
|
+
}
|
|
463
472
|
async function loadStepModules2(stepFiles) {
|
|
464
473
|
resetRegistry();
|
|
465
474
|
for (const file of stepFiles) {
|
|
@@ -491,10 +500,18 @@ async function runStep(world, step) {
|
|
|
491
500
|
const ret = await fn(world, ...match.args);
|
|
492
501
|
if (ret !== undefined)
|
|
493
502
|
world.lastResponse = ret;
|
|
503
|
+
const violations = drainContractViolations();
|
|
504
|
+
if (violations.length > 0) {
|
|
505
|
+
return { ...base, outcome: "fail", message: violations.join(`
|
|
506
|
+
`) };
|
|
507
|
+
}
|
|
494
508
|
return { ...base, outcome: "pass" };
|
|
495
509
|
} catch (err) {
|
|
496
510
|
world.lastError = err;
|
|
497
|
-
|
|
511
|
+
const violations = drainContractViolations();
|
|
512
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
513
|
+
return { ...base, outcome: "fail", message: [message, ...violations].join(`
|
|
514
|
+
`) };
|
|
498
515
|
}
|
|
499
516
|
}
|
|
500
517
|
async function runScenario(world, feature, scenario, reset) {
|
|
@@ -507,6 +524,7 @@ async function runScenario(world, feature, scenario, reset) {
|
|
|
507
524
|
file: feature.file
|
|
508
525
|
};
|
|
509
526
|
await reset(world);
|
|
527
|
+
drainContractViolations();
|
|
510
528
|
world.vars = {};
|
|
511
529
|
world.lastResponse = undefined;
|
|
512
530
|
world.lastError = undefined;
|
|
@@ -741,4 +759,4 @@ main().then((code) => process.exit(code)).catch((err) => {
|
|
|
741
759
|
process.exit(1);
|
|
742
760
|
});
|
|
743
761
|
|
|
744
|
-
//# debugId=
|
|
762
|
+
//# debugId=F3C0F03B5B854DE764756E2164756E21
|
|
@@ -4,16 +4,16 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Parse `.feature` files into the runner's normalized AST.\n *\n * Thin wrapper over `@cucumber/gherkin` (parser only — no cucumber runtime):\n * we keep our own {@link ParsedFeature} shape so the rest of the tool never\n * touches the gherkin message types, and swapping the parser stays a one-file\n * change. Responsibilities beyond raw parsing:\n * - normalize And/But to the preceding concrete keyword (Given/When/Then);\n * - fold Background steps into a feature-level list;\n * - expand each Scenario Outline into one concrete scenario per Examples row.\n */\nimport { AstBuilder, GherkinClassicTokenMatcher, Parser } from \"@cucumber/gherkin\";\nimport type { GherkinDocument, Scenario } from \"@cucumber/messages\";\nimport { IdGenerator } from \"@cucumber/messages\";\nimport type { ParsedFeature, ParsedScenario, ParsedStep, StepKeyword } from \"./types.ts\";\n\nfunction newParser() {\n return new Parser(new AstBuilder(IdGenerator.uuid()), new GherkinClassicTokenMatcher());\n}\n\n/** And/But inherit the previous concrete keyword; a leading And/But defaults to Given. */\nfunction normalizeKeyword(raw: string, prev: StepKeyword | null): StepKeyword {\n const k = raw.trim().toLowerCase();\n if (k === \"given\") return \"given\";\n if (k === \"when\") return \"when\";\n if (k === \"then\") return \"then\";\n return prev ?? \"given\";\n}\n\ninterface RawStep {\n keyword: string;\n text: string;\n location?: { line?: number };\n}\n\nfunction normalizeSteps(rawSteps: readonly RawStep[]): ParsedStep[] {\n const out: ParsedStep[] = [];\n let prev: StepKeyword | null = null;\n for (const s of rawSteps) {\n const keyword = normalizeKeyword(s.keyword, prev);\n prev = keyword;\n out.push({\n keyword,\n rawKeyword: s.keyword.trim(),\n text: s.text.trim(),\n line: s.location?.line ?? 0,\n });\n }\n return out;\n}\n\nfunction tagNames(tags: ReadonlyArray<{ name: string }> | undefined): string[] {\n return (tags ?? []).map((t) => t.name.replace(/^@/, \"\"));\n}\n\n/** Substitute `<placeholder>` cells from an Examples row into step text. */\nfunction fillOutline(text: string, headers: string[], cells: string[]): string {\n let filled = text;\n headers.forEach((h, i) => {\n filled = filled.split(`<${h}>`).join(cells[i] ?? \"\");\n });\n return filled;\n}\n\n/** A plain scenario, or one concrete scenario per Scenario Outline Examples row. */\nfunction buildScenarios(sc: Scenario): ParsedScenario[] {\n const baseSteps = sc.steps ?? [];\n const tags = tagNames(sc.tags);\n const examples = sc.examples ?? [];\n\n if (examples.length === 0) {\n return [\n { name: sc.name, tags, steps: normalizeSteps(baseSteps), line: sc.location?.line ?? 0 },\n ];\n }\n\n const out: ParsedScenario[] = [];\n for (const ex of examples) {\n const headers = (ex.tableHeader?.cells ?? []).map((c) => c.value);\n for (const row of ex.tableBody ?? []) {\n const cells = (row.cells ?? []).map((c) => c.value);\n const rowSteps = baseSteps.map((s) => ({\n keyword: s.keyword,\n text: fillOutline(s.text, headers, cells),\n location: s.location,\n }));\n const label = headers.map((h, i) => `${h}=${cells[i] ?? \"\"}`).join(\", \");\n out.push({\n name: `${sc.name} [${label}]`,\n tags: [...tags, ...tagNames(ex.tags)],\n steps: normalizeSteps(rowSteps),\n line: row.location?.line ?? sc.location?.line ?? 0,\n fromOutline: true,\n });\n }\n }\n return out;\n}\n\nexport function parseFeatureText(text: string, file: string): ParsedFeature {\n const doc: GherkinDocument = newParser().parse(text);\n const feature = doc.feature;\n if (!feature) {\n return { name: \"\", description: \"\", tags: [], background: [], scenarios: [], file };\n }\n\n let background: ParsedStep[] = [];\n const scenarios: ParsedScenario[] = [];\n\n for (const child of feature.children ?? []) {\n if (child.background) {\n background = normalizeSteps(child.background.steps ?? []);\n } else if (child.scenario) {\n scenarios.push(...buildScenarios(child.scenario));\n }\n }\n\n return {\n name: feature.name,\n description: (feature.description ?? \"\").trim(),\n tags: tagNames(feature.tags),\n background,\n scenarios,\n file,\n };\n}\n\nexport async function parseFeatureFile(path: string): Promise<ParsedFeature> {\n const text = await Bun.file(path).text();\n return parseFeatureText(text, path);\n}\n",
|
|
6
6
|
"/**\n * The step-binding registry and matcher.\n *\n * `defineStep()` is the consumer-facing keystone: one call registers a binding\n * that the runner executes (`given`/`when`/`then`) AND the verify extractor\n * reads (`message`/`stateExpr`). `defineWorld()` records how to build and\n * cold-reset the real-factory world.\n *\n * Patterns use a small Cucumber-expression subset: `{string}`, `{int}`,\n * `{float}`, `{word}`. Everything else is matched literally. That covers\n * declarative steps without dragging in the full cucumber-expressions library.\n *\n * The registry lives on `globalThis`, not in a module-level array, on purpose:\n * `polly bdd` ships as two bundles (the CLI and the `@fairfox/polly/bdd`\n * library export). `build-lib` runs with `splitting: false`, so this module is\n * *inlined separately into each bundle* — a module-level array would give the\n * runner and the consumer's `defineWorld` two different registries. A single\n * global slot is the standard cross-bundle-singleton fix.\n */\nimport type { StepBinding, StepKeyword, WorldDef } from \"./types.ts\";\n\ninterface CompiledBinding {\n binding: StepBinding;\n regex: RegExp;\n}\n\ninterface RegistryState {\n bindings: CompiledBinding[];\n worldDef: WorldDef | null;\n}\n\ndeclare global {\n // An ambient global declaration — `var` is the only legal form here.\n var __pollyBddRegistry__: RegistryState | undefined;\n}\n\nfunction state(): RegistryState {\n globalThis.__pollyBddRegistry__ ??= { bindings: [], worldDef: null };\n return globalThis.__pollyBddRegistry__;\n}\n\n/** Translate a Cucumber-expression pattern into an anchored RegExp. */\nexport function compilePattern(pattern: string): RegExp {\n // Escape regex metacharacters, then re-introduce capture groups for {tokens}.\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const withGroups = escaped\n // {string} — double- or single-quoted; capture the inner text. The\n // alternation MUST be wrapped in a non-capturing group, or the `|` would\n // bind to the whole pattern and shatter any step with two+ tokens.\n .replace(/\\\\\\{string\\\\\\}/g, `(?:\"([^\"]*)\"|'([^']*)')`)\n .replace(/\\\\\\{int\\\\\\}/g, \"([-+]?\\\\d+)\")\n .replace(/\\\\\\{float\\\\\\}/g, \"([-+]?\\\\d*\\\\.?\\\\d+)\")\n .replace(/\\\\\\{word\\\\\\}/g, \"([^\\\\s]+)\");\n // nosemgrep: javascript.lang.security.audit.detect-non-literal-regexp.detect-non-literal-regexp — `pattern` is a step expression from the project's own step-definition file, not external input, and every metacharacter is escaped above before the {token} groups are re-introduced.\n return new RegExp(`^${withGroups}$`);\n}\n\nexport function defineStep(binding: StepBinding): void {\n state().bindings.push({ binding, regex: compilePattern(binding.pattern) });\n}\n\nexport function defineWorld(def: WorldDef): void {\n state().worldDef = def;\n}\n\nexport function getWorldDef(): WorldDef | null {\n return state().worldDef;\n}\n\n/** Drop all registrations — used between isolated runs/tests. */\nexport function resetRegistry(): void {\n const s = state();\n s.bindings.length = 0;\n s.worldDef = null;\n}\n\nexport interface StepMatch {\n binding: StepBinding;\n args: string[];\n}\n\n/**\n * Find the binding whose pattern matches `text`. Captured groups become the\n * step arguments (the `{string}` alternation yields two groups per token, so\n * we drop the undefined half).\n *\n * When `keyword` is given, a binding that *has* the callback for that keyword\n * wins over one that merely matches the text — so the same phrase can serve as\n * a `given` precondition in one scenario and a `then` assertion in another.\n */\nexport function matchStep(text: string, keyword?: StepKeyword): StepMatch | null {\n let textOnlyFallback: StepMatch | null = null;\n for (const { binding, regex } of state().bindings) {\n const m = regex.exec(text);\n if (!m) continue;\n const args = m.slice(1).filter((g) => g !== undefined);\n if (!keyword || binding[keyword]) return { binding, args };\n textOnlyFallback ??= { binding, args };\n }\n return textOnlyFallback;\n}\n\n/** Snapshot of all registered bindings (for the verify extractor). */\nexport function registeredBindings(): StepBinding[] {\n return state().bindings.map((c) => c.binding);\n}\n",
|
|
7
|
-
"#!/usr/bin/env bun\n/**\n * `polly bdd` — author and run executable Gherkin against polly's own model.\n *\n * BDD is polly's third verification stratum. verify (TLA+) proves invariants\n * over the handler state machine; mutate
|
|
7
|
+
"#!/usr/bin/env bun\n/**\n * `polly bdd` — author and run executable Gherkin against polly's own model.\n *\n * BDD is polly's third verification stratum. verify (TLA+) proves invariants\n * over the handler state machine; mutate proves the tests have teeth;\n * BDD pins down what a feature should do *from the user's perspective*, as\n * concrete examples that run across the real factory boundary. A Gherkin\n * scenario decomposes onto the same vocabulary the other two already speak:\n * Given = state signals, When = a message type, Then = an observable outcome.\n *\n * Thin verb dispatcher over the reusable functions in this directory.\n */\nimport { resolve } from \"node:path\";\nimport { parseBddArgs } from \"./args.ts\";\nimport { checkAgainstVerify } from \"./check-verify.ts\";\nimport { resolveBddConfig } from \"./config.ts\";\nimport { formatRun, toJson } from \"./report.ts\";\nimport { runFeatures } from \"./run.ts\";\nimport { scaffoldFeature } from \"./scaffold.ts\";\n\nconst HELP = `polly bdd — executable Gherkin against polly's handlers + state\n\nThree-amigos sessions produce acceptance examples from the user's perspective;\nthis runs them across the real factory boundary and cross-checks them against\nthe verification config — so the example layer, the formal layer, and the\nmutation layer all describe the same handlers and state.\n\nUsage:\n polly bdd [run] [path] Run .feature files (default: features/**/*.feature)\n polly bdd check Cross-check scenarios against specs/verification.config.ts\n polly bdd new <name> Scaffold a feature stub seeded from the verify vocabulary\n polly bdd help Show this help\n\nFlags:\n --features <glob> feature files (default: features/**/*.feature)\n --steps <glob> step modules to load (default: features/**/*.steps.ts + features/steps.ts)\n --tags <tag> only run scenarios with this tag (~tag negates)\n --json machine-readable output\n -h, --help\n\nScenarios tagged @formal cover precondition-only behaviour (requires() is a\nruntime no-op) — the runner defers them; 'polly verify' checks them, since the\nrequires() guard is extracted into the TLA+ model.`;\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a flat verb dispatcher — the branches are the command surface.\nasync function main(): Promise<number> {\n const args = parseBddArgs(process.argv.slice(2));\n if (args.help || args.verb === \"help\") {\n console.log(HELP);\n return 0;\n }\n\n const cwd = process.cwd();\n\n switch (args.verb) {\n case \"run\": {\n const cfg = await resolveBddConfig(cwd, args);\n if (cfg.featureFiles.length === 0) {\n console.log(\"No .feature files found (looked for features/**/*.feature).\");\n return 1;\n }\n if (cfg.stepFiles.length === 0) {\n console.log(\n \"No step modules found (looked for features/**/*.steps.ts and features/steps.ts).\"\n );\n return 1;\n }\n const result = await runFeatures({\n featureFiles: cfg.featureFiles,\n stepFiles: cfg.stepFiles,\n tagFilter: args.tags,\n });\n console.log(args.json ? toJson(result) : formatRun(result, cwd));\n return result.ok ? 0 : 1;\n }\n\n case \"check\": {\n const cfg = await resolveBddConfig(cwd, args);\n const configPath = resolve(cwd, \"specs\", \"verification.config.ts\");\n const result = await checkAgainstVerify({\n featureFiles: cfg.featureFiles,\n stepFiles: cfg.stepFiles,\n configPath,\n });\n if (args.json) {\n console.log(JSON.stringify(result, null, 2));\n return result.ok ? 0 : 1;\n }\n console.log(`\\nCross-checked ${result.checked} scenario(s) against the verification config:`);\n if (result.findings.length === 0) {\n console.log(\" ✓ every When models a real message; every Given/Then names a tracked field\");\n }\n for (const f of result.findings) {\n console.log(` ${f.kind === \"error\" ? \"✗\" : \"⚠\"} ${f.scenario}\\n ${f.message}`);\n }\n console.log(result.ok ? \"\\n✓ BDD ↔ verify cross-check holds.\" : \"\\n✗ Cross-check failed.\");\n return result.ok ? 0 : 1;\n }\n\n case \"new\": {\n const name = args.rest.join(\" \").trim();\n if (!name) {\n console.log(\"usage: polly bdd new <feature name>\");\n return 1;\n }\n const configPath = resolve(cwd, \"specs\", \"verification.config.ts\");\n const res = await scaffoldFeature(cwd, name, configPath);\n if (!res.created) {\n console.log(`${res.featurePath} already exists.`);\n return 1;\n }\n console.log(`✓ wrote ${res.featurePath}`);\n console.log(\n ` seeded from ${res.messages.length} message type(s), ${res.fields.length} state field(s)`\n );\n console.log(\"\\nNext: bind the steps in features/steps.ts, then 'polly bdd run'.\");\n return 0;\n }\n\n default:\n console.log(`Unknown subcommand: ${args.verb}\\n`);\n console.log(HELP);\n return 1;\n }\n}\n\nmain()\n .then((code) => process.exit(code))\n .catch((err) => {\n console.log(`\\n❌ ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n });\n",
|
|
8
8
|
"/**\n * Argument parsing for `polly bdd`. Flat verb dispatcher, mirroring the shape\n * of `tools/mutate/src/args.ts`.\n */\nexport interface BddArgs {\n /** First positional: \"run\" | \"check\" | \"new\" (default \"run\"). */\n verb: string;\n /** Positionals after the verb (e.g. a feature path, or a new feature name). */\n rest: string[];\n /** --features <glob> override. */\n features?: string;\n /** --steps <glob> override. */\n steps?: string;\n /** --tags <expr> filter (plain tag name, optionally prefixed ~ to negate). */\n tags?: string;\n /** --json machine-readable output. */\n json: boolean;\n /** -h / --help. */\n help: boolean;\n}\n\nconst VALUE_FLAGS = new Set([\"--features\", \"--steps\", \"--tags\"]);\n\nexport function parseBddArgs(argv: string[]): BddArgs {\n const positionals: string[] = [];\n const flags = new Map<string, string>();\n const bools = new Set<string>();\n\n let i = 0;\n while (i < argv.length) {\n const a = argv[i] ?? \"\";\n if (VALUE_FLAGS.has(a)) {\n flags.set(a, argv[i + 1] ?? \"\");\n i += 2;\n } else {\n if (a.startsWith(\"-\")) bools.add(a);\n else positionals.push(a);\n i += 1;\n }\n }\n\n return {\n verb: positionals[0] ?? \"run\",\n rest: positionals.slice(1),\n features: flags.get(\"--features\"),\n steps: flags.get(\"--steps\"),\n tags: flags.get(\"--tags\"),\n json: bools.has(\"--json\"),\n help: bools.has(\"--help\") || bools.has(\"-h\"),\n };\n}\n",
|
|
9
9
|
"/**\n * The verify cross-link, half two: hold every scenario trace against the\n * verification config — the always-on, static, cheap gate (`polly bdd check`).\n * The deeper TLC reachability *witness* rides `polly verify --witness`\n * (tools/verify); this file never runs a model checker.\n *\n * Three checks, each the BDD analogue of a verify guarantee:\n * 1. every `When` message type is one the config actually models (and so has\n * a handler the model knows about) — a scenario that drives a phantom\n * message is a scenario about nothing;\n * 2. every `Given`/`Then` state expression names a field the config tracks —\n * an assertion on an unmodeled field can't be cross-checked or verified;\n * 3. every feature that filters/selects/validates carries a negative\n * complement (a scenario tagged `@negative` or `@formal`) — the mechanical\n * enforcer of the Tester's \"prove the system also says no\" rule, which is\n * exactly what mutation testing then makes teeth on.\n */\nimport { resolve } from \"node:path\";\nimport { extractTraces } from \"./extract.ts\";\nimport type { ScenarioTrace } from \"./types.ts\";\n\nexport interface Finding {\n kind: \"error\" | \"warn\";\n scenario: string;\n message: string;\n}\n\nexport interface CrossCheckResult {\n ok: boolean;\n checked: number;\n findings: Finding[];\n}\n\ninterface VerifyConfigShape {\n state?: Record<string, unknown>;\n messages?: { include?: string[]; perMessageBounds?: Record<string, number> };\n subsystems?: Record<string, { state?: string[]; handlers?: string[] }>;\n}\n\nfunction isRecord(input: unknown): input is Record<string, unknown> {\n return typeof input === \"object\" && input !== null && !Array.isArray(input);\n}\n\nfunction isStringArray(input: unknown): input is string[] {\n return Array.isArray(input) && input.every((item) => typeof item === \"string\");\n}\n\nfunction isMessagesShape(input: unknown): input is VerifyConfigShape[\"messages\"] {\n if (!isRecord(input)) return false;\n if (input[\"include\"] !== undefined && !isStringArray(input[\"include\"])) return false;\n if (input[\"perMessageBounds\"] !== undefined && !isRecord(input[\"perMessageBounds\"])) {\n return false;\n }\n return true;\n}\n\nfunction isSubsystemsShape(input: unknown): input is VerifyConfigShape[\"subsystems\"] {\n if (!isRecord(input)) return false;\n for (const sub of Object.values(input)) {\n if (!isRecord(sub)) return false;\n if (sub[\"state\"] !== undefined && !isStringArray(sub[\"state\"])) return false;\n if (sub[\"handlers\"] !== undefined && !isStringArray(sub[\"handlers\"])) return false;\n }\n return true;\n}\n\n/**\n * Narrow a dynamically imported export to the slice of the verification config\n * this file reads. A bare cast would accept a config whose `messages.include`\n * or `subsystems[x].handlers` is not an array of strings, and every check below\n * would then read an empty set and report a clean bill on nothing. Keys this\n * file does not read are left alone.\n */\nfunction isVerifyConfigShape(input: unknown): input is VerifyConfigShape {\n if (!isRecord(input)) return false;\n if (input[\"state\"] !== undefined && !isRecord(input[\"state\"])) return false;\n if (input[\"messages\"] !== undefined && !isMessagesShape(input[\"messages\"])) return false;\n if (input[\"subsystems\"] !== undefined && !isSubsystemsShape(input[\"subsystems\"])) return false;\n return true;\n}\n\nasync function loadVerifyConfig(configPath: string): Promise<VerifyConfigShape> {\n const mod = await import(`file://${resolve(configPath)}?t=${Bun.nanoseconds()}`);\n const config: unknown = mod.verificationConfig ?? mod.default;\n if (!config) throw new Error(`no verificationConfig/default export in ${configPath}`);\n if (!isVerifyConfigShape(config)) {\n throw new Error(\n `verificationConfig in ${configPath} does not match the shape this check reads ` +\n \"(state must be an object; messages.include and subsystems[*].state/handlers must be string arrays)\"\n );\n }\n return config;\n}\n\n/** Union of every message type the config models. */\nfunction messageSet(config: VerifyConfigShape): Set<string> {\n const set = new Set<string>();\n for (const t of config.messages?.include ?? []) set.add(t);\n for (const t of Object.keys(config.messages?.perMessageBounds ?? {})) set.add(t);\n for (const sub of Object.values(config.subsystems ?? {})) {\n for (const h of sub.handlers ?? []) set.add(h);\n }\n return set;\n}\n\n/** Every state field key the config tracks. */\nfunction stateKeys(config: VerifyConfigShape): string[] {\n const keys = new Set(Object.keys(config.state ?? {}));\n for (const sub of Object.values(config.subsystems ?? {})) {\n for (const f of sub.state ?? []) keys.add(f);\n }\n return [...keys];\n}\n\n/** Dotted identifier paths in an expression, minus string literals and keywords. */\nfunction fieldsIn(expr: string): string[] {\n const noStrings = expr.replace(/\"[^\"]*\"|'[^']*'/g, \"\");\n const ids = noStrings.match(/[a-zA-Z_$][\\w$]*(?:\\.[a-zA-Z_$][\\w$]*)*/g) ?? [];\n const ignore = new Set([\"true\", \"false\", \"null\", \"undefined\", \"length\", \"value\"]);\n return ids.filter((id) => !ignore.has(id) && Number.isNaN(Number(id)));\n}\n\n/** A field matches a config key if either is a dotted prefix of the other. */\nfunction fieldKnown(field: string, keys: string[]): boolean {\n return keys.some((k) => k === field || field.startsWith(`${k}.`) || k.startsWith(`${field}.`));\n}\n\nconst NEGATIVE_TAGS = new Set([\"negative\", \"formal\", \"forbidden\"]);\n\nfunction checkTrace(\n trace: ScenarioTrace,\n messages: Set<string>,\n keys: string[],\n findings: Finding[]\n): void {\n const id = `${trace.feature} › ${trace.scenario}`;\n\n for (const step of [...trace.given, ...trace.when, ...trace.then]) {\n if (step.unbound) {\n findings.push({ kind: \"warn\", scenario: id, message: `step has no binding: \"${step.text}\"` });\n }\n }\n\n for (const step of trace.when) {\n if (step.message && !messages.has(step.message)) {\n findings.push({\n kind: \"error\",\n scenario: id,\n message: `When sends \"${step.message}\", which the verification config does not model`,\n });\n }\n }\n\n for (const step of [...trace.given, ...trace.then]) {\n if (!step.stateExpr) continue;\n for (const field of fieldsIn(step.stateExpr)) {\n if (!fieldKnown(field, keys)) {\n findings.push({\n kind: \"error\",\n scenario: id,\n message: `${step.keyword} asserts on \"${field}\", absent from the config's state map`,\n });\n }\n }\n }\n}\n\n/** A feature filters/selects/validates if any Then mentions an exclusion/limit notion. */\nfunction featureNeedsNegative(traces: ScenarioTrace[]): boolean {\n return traces.some((t) =>\n t.then.some((s) => /\\bnot\\b|exclud|reject|empty|invalid|limit|forbidden/i.test(s.text))\n );\n}\n\nfunction checkNegativeComplement(traces: ScenarioTrace[], findings: Finding[]): void {\n const byFeature = new Map<string, ScenarioTrace[]>();\n for (const t of traces) {\n const arr = byFeature.get(t.feature) ?? [];\n arr.push(t);\n byFeature.set(t.feature, arr);\n }\n for (const [feature, group] of byFeature) {\n const hasNegative = group.some((t) => t.tags.some((tag) => NEGATIVE_TAGS.has(tag)));\n if (!hasNegative && featureNeedsNegative(group)) {\n findings.push({\n kind: \"warn\",\n scenario: feature,\n message:\n \"feature filters/selects/validates but has no negative complement (a @negative or @formal scenario) — an over-permissive build would still pass\",\n });\n }\n }\n}\n\nexport async function checkAgainstVerify(opts: {\n featureFiles: string[];\n stepFiles: string[];\n configPath: string;\n}): Promise<CrossCheckResult> {\n const config = await loadVerifyConfig(opts.configPath);\n const messages = messageSet(config);\n const keys = stateKeys(config);\n\n const traces = await extractTraces(opts.featureFiles, opts.stepFiles);\n const findings: Finding[] = [];\n\n for (const trace of traces) checkTrace(trace, messages, keys, findings);\n checkNegativeComplement(traces, findings);\n\n return {\n ok: findings.every((f) => f.kind !== \"error\"),\n checked: traces.length,\n findings,\n };\n}\n",
|
|
10
10
|
"/**\n * The verify cross-link, half one: reduce each scenario to a {@link ScenarioTrace}\n * over the *same vocabulary the verification config speaks* — Given (initial\n * state exprs) → When (message types) → Then (state exprs).\n *\n * This is to `.feature` files what `extractCondition` (tools/analysis) is to a\n * `requires()` call: it reads the statically-declared `message`/`stateExpr`\n * metadata off each matched step binding and hands check-verify a structure it\n * can compare against the config and the TLA+ model. Steps that match no\n * binding are kept as `unbound` so gaps are visible rather than silently empty.\n */\nimport { parseFeatureFile } from \"./parse.ts\";\nimport { matchStep, resetRegistry } from \"./steps.ts\";\nimport type { ScenarioTrace, TraceStep } from \"./types.ts\";\n\nasync function loadStepModules(stepFiles: string[]): Promise<void> {\n resetRegistry();\n for (const file of stepFiles) {\n await import(`${file}?t=${Bun.nanoseconds()}`);\n }\n}\n\nfunction toTraceStep(text: string, keyword: TraceStep[\"keyword\"]): TraceStep {\n const match = matchStep(text, keyword);\n if (!match) return { text, keyword, unbound: true };\n return {\n text,\n keyword,\n message: match.binding.message,\n stateExpr: match.binding.stateExpr,\n };\n}\n\nexport async function extractTraces(\n featureFiles: string[],\n stepFiles: string[]\n): Promise<ScenarioTrace[]> {\n await loadStepModules(stepFiles);\n const traces: ScenarioTrace[] = [];\n\n for (const file of featureFiles) {\n const feature = await parseFeatureFile(file);\n for (const scenario of feature.scenarios) {\n const allSteps = [...feature.background, ...scenario.steps];\n const trace: ScenarioTrace = {\n feature: feature.name,\n scenario: scenario.name,\n tags: [...feature.tags, ...scenario.tags],\n given: [],\n when: [],\n // biome-ignore lint/suspicious/noThenProperty: `then` is Gherkin vocabulary here, not a thenable.\n then: [],\n file,\n };\n for (const step of allSteps) {\n trace[step.keyword].push(toTraceStep(step.text, step.keyword));\n }\n traces.push(trace);\n }\n }\n return traces;\n}\n",
|
|
11
11
|
"/**\n * Resolve the feature files and step modules `polly bdd` operates on, relative\n * to the cwd it was invoked from — so a consumer's project tree works the same\n * as this repo. Convention (overridable with --features / --steps):\n * - features: features/**\\/*.feature\n * - steps: features/**\\/*.steps.ts + features/steps.ts\n * A positional path narrows the feature glob to a single file or directory.\n */\nimport { resolve } from \"node:path\";\nimport { Glob } from \"bun\";\nimport type { BddArgs } from \"./args.ts\";\n\nexport interface BddConfig {\n cwd: string;\n /** Absolute paths of `.feature` files to run. */\n featureFiles: string[];\n /** Absolute paths of step-definition modules to import (side-effect registration). */\n stepFiles: string[];\n}\n\nasync function expand(cwd: string, pattern: string): Promise<string[]> {\n const out: string[] = [];\n for await (const f of new Glob(pattern).scan({ cwd, absolute: true, onlyFiles: true })) {\n out.push(f);\n }\n return out.sort();\n}\n\nexport async function resolveBddConfig(cwd: string, args: BddArgs): Promise<BddConfig> {\n // A positional path (verb's first rest arg for `run`) narrows the features.\n const pathArg = args.verb === \"run\" ? args.rest[0] : undefined;\n\n let featurePattern = args.features ?? \"features/**/*.feature\";\n if (pathArg) {\n featurePattern = pathArg.endsWith(\".feature\")\n ? pathArg\n : `${pathArg.replace(/\\/$/, \"\")}/**/*.feature`;\n }\n\n const stepPatterns = args.steps ? [args.steps] : [\"features/**/*.steps.ts\", \"features/steps.ts\"];\n\n const featureFiles = pathArg?.endsWith(\".feature\")\n ? [resolve(cwd, pathArg)]\n : await expand(cwd, featurePattern);\n\n const stepSets = await Promise.all(stepPatterns.map((p) => expand(cwd, p)));\n const stepFiles = [...new Set(stepSets.flat())];\n\n return { cwd, featureFiles, stepFiles };\n}\n",
|
|
12
12
|
"/**\n * Human- and machine-readable formatting of a {@link RunResult}.\n */\nimport type { RunResult, ScenarioResult } from \"./types.ts\";\n\nconst MARK: Record<ScenarioResult[\"outcome\"], string> = {\n pass: \"✓\",\n fail: \"✗\",\n undefined: \"?\",\n \"deferred-formal\": \"→\",\n};\n\nfunction relFile(file: string, cwd: string): string {\n return file.startsWith(cwd) ? file.slice(cwd.length + 1) : file;\n}\n\n/** The detail lines under a failed/undefined/deferred scenario. */\nfunction scenarioDetail(s: ScenarioResult): string[] {\n if (s.outcome === \"deferred-formal\") {\n return [\n \" deferred to polly verify — precondition is formal-only (requires() is a runtime no-op)\",\n ];\n }\n if (s.outcome !== \"fail\" && s.outcome !== \"undefined\") return [];\n const lines: string[] = [];\n for (const step of s.steps) {\n if (step.outcome !== \"fail\" && step.outcome !== \"undefined\") continue;\n lines.push(` ${step.outcome === \"fail\" ? \"✗\" : \"?\"} ${step.rawKeyword} ${step.text}`);\n if (step.message) lines.push(` ↳ ${step.message}`);\n }\n return lines;\n}\n\nexport function formatRun(result: RunResult, cwd: string): string {\n const lines: string[] = [];\n let currentFeature = \"\";\n\n for (const s of result.scenarios) {\n if (s.feature !== currentFeature) {\n currentFeature = s.feature;\n lines.push(`\\nFeature: ${s.feature} (${relFile(s.file, cwd)})`);\n }\n lines.push(` ${MARK[s.outcome]} ${s.scenario}`);\n lines.push(...scenarioDetail(s));\n }\n\n lines.push(\"\");\n lines.push(\n `${result.ok ? \"✓\" : \"✗\"} ${result.passed} passed, ${result.failed} failed, ` +\n `${result.undefinedSteps} undefined, ${result.deferred} deferred (formal)`\n );\n return lines.join(\"\\n\");\n}\n\nexport function toJson(result: RunResult): string {\n return JSON.stringify(result, null, 2);\n}\n",
|
|
13
|
-
"/**\n * The runtime engine: parse features, load step modules, drive each scenario\n * against the *real* factory world the consumer built in `defineWorld`.\n *\n * What this stratum can and cannot check is deliberate. Runtime BDD asserts on\n * *observable* behaviour — state-signal changes and the response a handler\n * returns. Polly's `requires()` preconditions are runtime no-ops (they exist\n * only for the TLA+ model), so a precondition-only negative (e.g. \"a guest\n * login is rejected\") is NOT runtime-observable. Tag those `@formal`: the\n * runner defers them with a clear note, and `polly verify` is where they're\n * actually checked — the `requires()` guard is extracted into the TLA+ model.\n * This is the three strata dividing the work.\n */\nimport { parseFeatureFile } from \"./parse.ts\";\nimport { getWorldDef, matchStep, resetRegistry } from \"./steps.ts\";\nimport type {\n ParsedFeature,\n ParsedScenario,\n ParsedStep,\n RunResult,\n ScenarioResult,\n StepResult,\n World,\n} from \"./types.ts\";\n\n// Tags whose scenarios are formal-only — checked by `polly verify`, not the\n// runtime runner. `@formal` covers precondition-only negatives (requires() is a\n// runtime no-op); `@forbidden` covers safety claims (\"this state never happens\"),\n// which a single runtime execution cannot establish. Both are deferred here and\n// settled by `polly verify --witness`.\nconst DEFERRED_TAGS = new Set([\"formal\", \"forbidden\"]);\n\nexport interface RunOptions {\n featureFiles: string[];\n stepFiles: string[];\n /** Only run scenarios carrying this tag (without leading @); ~tag negates. */\n tagFilter?: string;\n}\n\n/** Import each step module so its `defineStep`/`defineWorld` side effects run. */\nasync function loadStepModules(stepFiles: string[]): Promise<void> {\n resetRegistry();\n for (const file of stepFiles) {\n // Cache-bust so repeated in-process runs re-register cleanly.\n await import(`${file}?t=${Bun.nanoseconds()}`);\n }\n}\n\nfunction tagMatches(tags: string[], filter?: string): boolean {\n if (!filter) return true;\n if (filter.startsWith(\"~\")) return !tags.includes(filter.slice(1));\n return tags.includes(filter);\n}\n\nasync function runStep(world: World, step: ParsedStep): Promise<StepResult> {\n const base = { text: step.text, rawKeyword: step.rawKeyword };\n const match = matchStep(step.text, step.keyword);\n if (!match) {\n return { ...base, outcome: \"undefined\", message: `no binding matches \"${step.text}\"` };\n }\n const fn = match.binding[step.keyword];\n if (!fn) {\n return {\n ...base,\n outcome: \"undefined\",\n message: `binding for \"${step.text}\" has no '${step.keyword}' callback`,\n };\n }\n try {\n const ret = await fn(world, ...match.args);\n // A `when` that returns the send promise gets its response captured.\n if (ret !== undefined) world.lastResponse = ret;\n return { ...base, outcome: \"pass\" };\n } catch (err) {\n world.lastError = err;\n return { ...base, outcome: \"fail\", message:
|
|
13
|
+
"/**\n * The runtime engine: parse features, load step modules, drive each scenario\n * against the *real* factory world the consumer built in `defineWorld`.\n *\n * What this stratum can and cannot check is deliberate. Runtime BDD asserts on\n * *observable* behaviour — state-signal changes and the response a handler\n * returns. Polly's `requires()` preconditions are runtime no-ops (they exist\n * only for the TLA+ model), so a precondition-only negative (e.g. \"a guest\n * login is rejected\") is NOT runtime-observable. Tag those `@formal`: the\n * runner defers them with a clear note, and `polly verify` is where they're\n * actually checked — the `requires()` guard is extracted into the TLA+ model.\n * This is the three strata dividing the work.\n */\nimport { parseFeatureFile } from \"./parse.ts\";\nimport { getWorldDef, matchStep, resetRegistry } from \"./steps.ts\";\nimport type {\n ParsedFeature,\n ParsedScenario,\n ParsedStep,\n RunResult,\n ScenarioResult,\n StepResult,\n World,\n} from \"./types.ts\";\n\n// Tags whose scenarios are formal-only — checked by `polly verify`, not the\n// runtime runner. `@formal` covers precondition-only negatives (requires() is a\n// runtime no-op); `@forbidden` covers safety claims (\"this state never happens\"),\n// which a single runtime execution cannot establish. Both are deferred here and\n// settled by `polly verify --witness`.\nconst DEFERRED_TAGS = new Set([\"formal\", \"forbidden\"]);\n\n/**\n * Where the verify primitives record a requires/ensures violation before\n * throwing (POLLY_CONTRACTS on; the key is repeated from\n * tools/verify/src/primitives/index.ts). The bus turns a handler's throw into\n * `{ success: false }`, so a step that drove the handler can pass with the\n * violation unseen; the runner fails that step instead. Off, the list never\n * exists and nothing here runs.\n */\nconst CONTRACT_VIOLATIONS_KEY = \"__pollyContractViolations\";\n\nfunction drainContractViolations(): string[] {\n const list = (globalThis as Record<string, unknown>)[CONTRACT_VIOLATIONS_KEY];\n if (!Array.isArray(list)) return [];\n const messages = list.map((v) => (v instanceof Error ? v.message : String(v)));\n list.length = 0;\n return messages;\n}\n\nexport interface RunOptions {\n featureFiles: string[];\n stepFiles: string[];\n /** Only run scenarios carrying this tag (without leading @); ~tag negates. */\n tagFilter?: string;\n}\n\n/** Import each step module so its `defineStep`/`defineWorld` side effects run. */\nasync function loadStepModules(stepFiles: string[]): Promise<void> {\n resetRegistry();\n for (const file of stepFiles) {\n // Cache-bust so repeated in-process runs re-register cleanly.\n await import(`${file}?t=${Bun.nanoseconds()}`);\n }\n}\n\nfunction tagMatches(tags: string[], filter?: string): boolean {\n if (!filter) return true;\n if (filter.startsWith(\"~\")) return !tags.includes(filter.slice(1));\n return tags.includes(filter);\n}\n\nasync function runStep(world: World, step: ParsedStep): Promise<StepResult> {\n const base = { text: step.text, rawKeyword: step.rawKeyword };\n const match = matchStep(step.text, step.keyword);\n if (!match) {\n return { ...base, outcome: \"undefined\", message: `no binding matches \"${step.text}\"` };\n }\n const fn = match.binding[step.keyword];\n if (!fn) {\n return {\n ...base,\n outcome: \"undefined\",\n message: `binding for \"${step.text}\" has no '${step.keyword}' callback`,\n };\n }\n try {\n const ret = await fn(world, ...match.args);\n // A `when` that returns the send promise gets its response captured.\n if (ret !== undefined) world.lastResponse = ret;\n const violations = drainContractViolations();\n if (violations.length > 0) {\n return { ...base, outcome: \"fail\", message: violations.join(\"\\n\") };\n }\n return { ...base, outcome: \"pass\" };\n } catch (err) {\n world.lastError = err;\n const violations = drainContractViolations();\n const message = err instanceof Error ? err.message : String(err);\n return { ...base, outcome: \"fail\", message: [message, ...violations].join(\"\\n\") };\n }\n}\n\nasync function runScenario(\n world: World,\n feature: ParsedFeature,\n scenario: ParsedScenario,\n reset: (w: World) => void | Promise<void>\n): Promise<ScenarioResult> {\n const result: ScenarioResult = {\n feature: feature.name,\n scenario: scenario.name,\n tags: scenario.tags,\n outcome: \"pass\",\n steps: [],\n file: feature.file,\n };\n\n // Cold start: reset the world (signals → initial) and clear per-scenario scratch.\n await reset(world);\n // A violation during reset belongs to no step.\n drainContractViolations();\n world.vars = {};\n world.lastResponse = undefined;\n world.lastError = undefined;\n\n const steps = [...feature.background, ...scenario.steps];\n let aborted = false;\n for (const step of steps) {\n if (aborted) {\n result.steps.push({ text: step.text, rawKeyword: step.rawKeyword, outcome: \"skipped\" });\n continue;\n }\n const sr = await runStep(world, step);\n result.steps.push(sr);\n if (sr.outcome === \"fail\") {\n result.outcome = \"fail\";\n aborted = true;\n } else if (sr.outcome === \"undefined\") {\n result.outcome = result.outcome === \"fail\" ? \"fail\" : \"undefined\";\n aborted = true;\n }\n }\n return result;\n}\n\nexport async function runFeatures(options: RunOptions): Promise<RunResult> {\n await loadStepModules(options.stepFiles);\n\n const worldDef = getWorldDef();\n if (!worldDef) {\n throw new Error(\n \"no world defined. A step module must call defineWorld({ create, reset }) — see tools/bdd/README.md.\"\n );\n }\n const world = await worldDef.create();\n\n const features = await Promise.all(options.featureFiles.map((f) => parseFeatureFile(f)));\n const scenarios: ScenarioResult[] = [];\n\n try {\n for (const feature of features) {\n for (const scenario of feature.scenarios) {\n const tags = [...feature.tags, ...scenario.tags];\n if (!tagMatches(tags, options.tagFilter)) continue;\n\n if (tags.some((t) => DEFERRED_TAGS.has(t))) {\n scenarios.push({\n feature: feature.name,\n scenario: scenario.name,\n tags,\n outcome: \"deferred-formal\",\n steps: [],\n file: feature.file,\n });\n continue;\n }\n scenarios.push(await runScenario(world, feature, { ...scenario, tags }, worldDef.reset));\n }\n }\n } finally {\n // Release any real resources the world holds (browsers, relay, sockets),\n // even when a scenario threw — otherwise the runner hangs on live handles.\n await worldDef.teardown?.(world);\n }\n\n const passed = scenarios.filter((s) => s.outcome === \"pass\").length;\n const failed = scenarios.filter((s) => s.outcome === \"fail\").length;\n const undef = scenarios.filter((s) => s.outcome === \"undefined\").length;\n const deferred = scenarios.filter((s) => s.outcome === \"deferred-formal\").length;\n\n return {\n scenarios,\n passed,\n failed,\n undefinedSteps: undef,\n deferred,\n ok: failed === 0 && undef === 0,\n };\n}\n",
|
|
14
14
|
"/**\n * `polly bdd new <feature>` — scaffold a `.feature` stub seeded from the\n * project's verification config, so a three-amigos session starts from polly's\n * real ubiquitous language (the message types and state fields the model\n * already tracks) instead of inventing terms. The session's job is to turn\n * those into declarative scenarios; this just lays the table.\n */\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\ninterface ConfigShape {\n state?: Record<string, unknown>;\n messages?: { include?: string[]; perMessageBounds?: Record<string, number> };\n subsystems?: Record<string, { handlers?: string[] }>;\n}\n\nasync function loadVocabulary(\n configPath: string\n): Promise<{ messages: string[]; fields: string[] }> {\n if (!existsSync(configPath)) return { messages: [], fields: [] };\n const mod = await import(`file://${resolve(configPath)}?t=${Bun.nanoseconds()}`);\n const config: ConfigShape = mod.verificationConfig ?? mod.default ?? {};\n const messages = new Set<string>();\n for (const t of config.messages?.include ?? []) messages.add(t);\n for (const t of Object.keys(config.messages?.perMessageBounds ?? {})) messages.add(t);\n for (const sub of Object.values(config.subsystems ?? {})) {\n for (const h of sub.handlers ?? []) messages.add(h);\n }\n return { messages: [...messages].sort(), fields: Object.keys(config.state ?? {}).sort() };\n}\n\nfunction slug(name: string): string {\n return name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nexport interface ScaffoldResult {\n created: boolean;\n featurePath: string;\n messages: string[];\n fields: string[];\n}\n\nexport async function scaffoldFeature(\n cwd: string,\n name: string,\n configPath: string\n): Promise<ScaffoldResult> {\n const { messages, fields } = await loadVocabulary(configPath);\n const featurePath = resolve(cwd, \"features\", `${slug(name)}.feature`);\n\n if (existsSync(featurePath)) {\n return { created: false, featurePath, messages, fields };\n }\n\n const body = `Feature: ${name}\n # Three-amigos: state the user story, then converge on declarative scenarios.\n # As a <role> I want <capability> so that <benefit>.\n #\n # Bind each step in features/steps.ts. The dual-use binding carries formal\n # metadata so 'polly bdd check' can cross-check it against the verify config:\n # When-steps declare \\`message\\` (a modeled message type)\n # Given/Then-steps declare \\`stateExpr\\` (a tracked state field)\n #\n # Message types this project models:\n${messages.map((m) => ` # - ${m}`).join(\"\\n\") || \" # (none found — is specs/verification.config.ts present?)\"}\n # State fields this project tracks:\n${fields.map((f) => ` # - ${f}`).join(\"\\n\") || \" # (none found)\"}\n\n Scenario: <name the behaviour by its outcome>\n Given <context that is already true>\n When <a single action>\n Then <an observable outcome>\n\n @negative\n Scenario: <the negative complement — what is excluded / rejected / empty>\n Given <context>\n When <a single action>\n Then <the system observably says no>\n`;\n\n await Bun.write(featurePath, body);\n return { created: true, featurePath, messages, fields };\n}\n"
|
|
15
15
|
],
|
|
16
|
-
"mappings": "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",
|
|
17
|
-
"debugId": "
|
|
16
|
+
"mappings": "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",
|
|
17
|
+
"debugId": "F3C0F03B5B854DE764756E2164756E21",
|
|
18
18
|
"names": []
|
|
19
19
|
}
|
|
@@ -445,6 +445,15 @@ init_parse();
|
|
|
445
445
|
// tools/bdd/src/run.ts
|
|
446
446
|
init_parse();
|
|
447
447
|
var DEFERRED_TAGS = new Set(["formal", "forbidden"]);
|
|
448
|
+
var CONTRACT_VIOLATIONS_KEY = "__pollyContractViolations";
|
|
449
|
+
function drainContractViolations() {
|
|
450
|
+
const list = globalThis[CONTRACT_VIOLATIONS_KEY];
|
|
451
|
+
if (!Array.isArray(list))
|
|
452
|
+
return [];
|
|
453
|
+
const messages = list.map((v) => v instanceof Error ? v.message : String(v));
|
|
454
|
+
list.length = 0;
|
|
455
|
+
return messages;
|
|
456
|
+
}
|
|
448
457
|
async function loadStepModules2(stepFiles) {
|
|
449
458
|
resetRegistry();
|
|
450
459
|
for (const file of stepFiles) {
|
|
@@ -476,10 +485,18 @@ async function runStep(world, step) {
|
|
|
476
485
|
const ret = await fn(world, ...match.args);
|
|
477
486
|
if (ret !== undefined)
|
|
478
487
|
world.lastResponse = ret;
|
|
488
|
+
const violations = drainContractViolations();
|
|
489
|
+
if (violations.length > 0) {
|
|
490
|
+
return { ...base, outcome: "fail", message: violations.join(`
|
|
491
|
+
`) };
|
|
492
|
+
}
|
|
479
493
|
return { ...base, outcome: "pass" };
|
|
480
494
|
} catch (err) {
|
|
481
495
|
world.lastError = err;
|
|
482
|
-
|
|
496
|
+
const violations = drainContractViolations();
|
|
497
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
498
|
+
return { ...base, outcome: "fail", message: [message, ...violations].join(`
|
|
499
|
+
`) };
|
|
483
500
|
}
|
|
484
501
|
}
|
|
485
502
|
async function runScenario(world, feature, scenario, reset) {
|
|
@@ -492,6 +509,7 @@ async function runScenario(world, feature, scenario, reset) {
|
|
|
492
509
|
file: feature.file
|
|
493
510
|
};
|
|
494
511
|
await reset(world);
|
|
512
|
+
drainContractViolations();
|
|
495
513
|
world.vars = {};
|
|
496
514
|
world.lastResponse = undefined;
|
|
497
515
|
world.lastError = undefined;
|
|
@@ -576,4 +594,4 @@ export {
|
|
|
576
594
|
runFeatures
|
|
577
595
|
};
|
|
578
596
|
|
|
579
|
-
//# debugId=
|
|
597
|
+
//# debugId=3E423EE3F7AA4C5D64756E2164756E21
|