autotel-pact 2.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/attrs-DbCs1ou0.cjs +61 -0
  2. package/dist/attrs-DbCs1ou0.cjs.map +1 -0
  3. package/dist/attrs-ElwK54Ym.js +43 -0
  4. package/dist/attrs-ElwK54Ym.js.map +1 -0
  5. package/dist/audit.cjs +155 -394
  6. package/dist/audit.cjs.map +1 -1
  7. package/dist/audit.d.cts +15 -13
  8. package/dist/audit.d.cts.map +1 -0
  9. package/dist/audit.d.ts +15 -13
  10. package/dist/audit.d.ts.map +1 -0
  11. package/dist/audit.js +153 -388
  12. package/dist/audit.js.map +1 -1
  13. package/dist/auto-wrap.cjs +206 -240
  14. package/dist/auto-wrap.cjs.map +1 -1
  15. package/dist/auto-wrap.d.cts +9 -7
  16. package/dist/auto-wrap.d.cts.map +1 -0
  17. package/dist/auto-wrap.d.ts +9 -7
  18. package/dist/auto-wrap.d.ts.map +1 -0
  19. package/dist/auto-wrap.js +205 -233
  20. package/dist/auto-wrap.js.map +1 -1
  21. package/dist/broker.cjs +65 -68
  22. package/dist/broker.cjs.map +1 -1
  23. package/dist/broker.d.cts +11 -9
  24. package/dist/broker.d.cts.map +1 -0
  25. package/dist/broker.d.ts +11 -9
  26. package/dist/broker.d.ts.map +1 -0
  27. package/dist/broker.js +64 -67
  28. package/dist/broker.js.map +1 -1
  29. package/dist/cli.cjs +166 -620
  30. package/dist/cli.cjs.map +1 -1
  31. package/dist/cli.d.cts +3 -2
  32. package/dist/cli.d.cts.map +1 -0
  33. package/dist/cli.d.ts +3 -2
  34. package/dist/cli.d.ts.map +1 -0
  35. package/dist/cli.js +165 -614
  36. package/dist/cli.js.map +1 -1
  37. package/dist/index.cjs +245 -952
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +90 -86
  40. package/dist/index.d.cts.map +1 -0
  41. package/dist/index.d.ts +90 -86
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +216 -918
  44. package/dist/index.js.map +1 -1
  45. package/dist/labels-0Cwk5E-8.cjs +41 -0
  46. package/dist/labels-0Cwk5E-8.cjs.map +1 -0
  47. package/dist/labels-BQjT_Zrv.js +23 -0
  48. package/dist/labels-BQjT_Zrv.js.map +1 -0
  49. package/dist/{ledger-D88TzN1c.d.cts → ledger-BAFsRX6y.d.cts} +8 -6
  50. package/dist/ledger-BAFsRX6y.d.cts.map +1 -0
  51. package/dist/ledger-BayQwemz.cjs +267 -0
  52. package/dist/ledger-BayQwemz.cjs.map +1 -0
  53. package/dist/{ledger-BuBmfWNc.d.ts → ledger-Bzh_6tbV.d.ts} +8 -6
  54. package/dist/ledger-Bzh_6tbV.d.ts.map +1 -0
  55. package/dist/ledger-sII3Ig3Y.js +174 -0
  56. package/dist/ledger-sII3Ig3Y.js.map +1 -0
  57. package/dist/pact-file-B8QjVrC7.cjs +76 -0
  58. package/dist/pact-file-B8QjVrC7.cjs.map +1 -0
  59. package/dist/pact-file-CkE4NFZ1.js +57 -0
  60. package/dist/pact-file-CkE4NFZ1.js.map +1 -0
  61. package/dist/processor.cjs +112 -185
  62. package/dist/processor.cjs.map +1 -1
  63. package/dist/processor.d.cts +41 -40
  64. package/dist/processor.d.cts.map +1 -0
  65. package/dist/processor.d.ts +41 -40
  66. package/dist/processor.d.ts.map +1 -0
  67. package/dist/processor.js +111 -179
  68. package/dist/processor.js.map +1 -1
  69. package/dist/provider.cjs +90 -205
  70. package/dist/provider.cjs.map +1 -1
  71. package/dist/provider.d.cts +26 -25
  72. package/dist/provider.d.cts.map +1 -0
  73. package/dist/provider.d.ts +26 -25
  74. package/dist/provider.d.ts.map +1 -0
  75. package/dist/provider.js +88 -199
  76. package/dist/provider.js.map +1 -1
  77. package/dist/tag.cjs +14 -44
  78. package/dist/tag.cjs.map +1 -1
  79. package/dist/tag.d.cts +4 -2
  80. package/dist/tag.d.cts.map +1 -0
  81. package/dist/tag.d.ts +4 -2
  82. package/dist/tag.d.ts.map +1 -0
  83. package/dist/tag.js +13 -42
  84. package/dist/tag.js.map +1 -1
  85. package/dist/types-D_0kgK2e.d.cts +154 -0
  86. package/dist/types-D_0kgK2e.d.cts.map +1 -0
  87. package/dist/types-D_0kgK2e.d.ts +154 -0
  88. package/dist/types-D_0kgK2e.d.ts.map +1 -0
  89. package/package.json +6 -6
  90. package/dist/types-BHGiwqcp.d.cts +0 -157
  91. package/dist/types-BHGiwqcp.d.ts +0 -157
package/dist/audit.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/broker.ts","../src/types.ts","../src/ledger-normalize.ts","../src/ledger.ts","../src/pact-file.ts","../src/audit.ts"],"names":["entry","existsSync","readdirSync","path","readFileSync"],"mappings":"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","file":"audit.js","sourcesContent":["import type { BrokerVerification } from './types.js';\n\nexport interface BrokerConfig {\n baseUrl: string;\n token?: string;\n username?: string;\n password?: string;\n}\n\nexport interface ConsumerProviderPair {\n consumer: string;\n provider: string;\n}\n\nfunction authHeaders(config: BrokerConfig): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n if (config.token) {\n headers.Authorization = `Bearer ${config.token}`;\n } else if (config.username && config.password) {\n const encoded = Buffer.from(`${config.username}:${config.password}`).toString('base64');\n headers.Authorization = `Basic ${encoded}`;\n }\n return headers;\n}\n\nfunction trimBaseUrl(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\n/**\n * Parse Pact Broker latest verification result payload.\n */\nexport function parseBrokerVerificationResult(\n consumer: string,\n provider: string,\n json: unknown,\n): BrokerVerification | null {\n if (!json || typeof json !== 'object') return null;\n const body = json as Record<string, unknown>;\n const success =\n body.success === true ||\n (body.success === undefined && body.result === 'success');\n const verifiedAt =\n typeof body.verifiedAt === 'string'\n ? body.verifiedAt\n : typeof body.verified_at === 'string'\n ? body.verified_at\n : typeof body.createdAt === 'string'\n ? body.createdAt\n : undefined;\n\n return {\n consumer,\n provider,\n success: !!success,\n verifiedAt,\n };\n}\n\n/**\n * Fetch latest verification results for each consumer–provider pair.\n */\nexport async function fetchBrokerVerifications(\n config: BrokerConfig,\n pairs: ConsumerProviderPair[],\n): Promise<BrokerVerification[]> {\n const base = trimBaseUrl(config.baseUrl);\n const headers = authHeaders(config);\n const results: BrokerVerification[] = [];\n\n for (const { consumer, provider } of pairs) {\n const url = `${base}/pacts/provider/${encodeURIComponent(provider)}/consumer/${encodeURIComponent(consumer)}/latest/verification-results`;\n try {\n const res = await fetch(url, { headers });\n if (!res.ok) {\n results.push({\n consumer,\n provider,\n success: false,\n error: `HTTP ${res.status} ${res.statusText}`.trim(),\n });\n continue;\n }\n const json: unknown = await res.json();\n const parsed = parseBrokerVerificationResult(consumer, provider, json);\n results.push(\n parsed ?? {\n consumer,\n provider,\n success: false,\n error: 'Unparseable broker response',\n },\n );\n } catch (error) {\n results.push({\n consumer,\n provider,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n}\n\nexport function brokerConfigFromEnv(): BrokerConfig | undefined {\n const baseUrl = process.env.PACT_BROKER_BASE_URL;\n if (!baseUrl) return undefined;\n return {\n baseUrl,\n token: process.env.PACT_BROKER_TOKEN,\n username: process.env.PACT_BROKER_USERNAME,\n password: process.env.PACT_BROKER_PASSWORD,\n };\n}\n","/**\n * Kind of contract interaction observed.\n */\nexport type PactKind = 'message' | 'http';\n\nexport type PactOutcome = 'passed' | 'failed';\n\nexport type LedgerSource = 'test' | 'production';\nexport type LedgerRole = 'consumer' | 'provider';\n\nexport const LEDGER_ENTRY_SPEC = 'autotel-pact-ledger-entry/v0.2.0';\nexport const AUDIT_MATRIX_SPEC = 'autotel-pact-audit-matrix/v0.2.0';\n\n/**\n * Metadata about a single Pact interaction, derived from the reified message\n * plus the consumer/provider config. Stamped onto the span and the ledger entry.\n */\nexport interface PactInteractionMeta {\n consumer: string;\n provider: string;\n description: string;\n states: string[];\n kind: PactKind;\n interactionId?: string;\n}\n\n/**\n * Per-interaction ledger evidence (consumer exercise, provider verify, or production tag).\n */\nexport interface InteractionLedgerEntry {\n type?: 'interaction';\n spec: typeof LEDGER_ENTRY_SPEC;\n consumer: string;\n provider: string;\n interaction: string;\n interaction_id?: string;\n states: string[];\n kind: PactKind;\n outcome: PactOutcome;\n source: LedgerSource;\n role: LedgerRole;\n duration_ms: number;\n observed_at: string;\n trace_id?: string;\n span_id?: string;\n run_id?: string;\n git_sha?: string;\n error?: string;\n}\n\n/**\n * Run-level provider verification failure — does not imply per-interaction outcomes.\n */\nexport interface ProviderVerificationRunEntry {\n type: 'provider_verification_run';\n spec: typeof LEDGER_ENTRY_SPEC;\n consumer: string;\n provider: string;\n outcome: 'failed';\n source: LedgerSource;\n role: 'provider';\n observed_at: string;\n error: string;\n run_id?: string;\n git_sha?: string;\n trace_id?: string;\n span_id?: string;\n}\n\nexport type LedgerRecord = InteractionLedgerEntry | ProviderVerificationRunEntry;\n\nexport function isInteractionLedgerEntry(\n entry: LedgerRecord,\n): entry is InteractionLedgerEntry {\n return entry.type !== 'provider_verification_run';\n}\n\nexport function isProviderVerificationRun(\n entry: LedgerRecord,\n): entry is ProviderVerificationRunEntry {\n return entry.type === 'provider_verification_run';\n}\n\n/**\n * Shape of a Pact contract file on disk (subset we read).\n */\nexport interface PactFile {\n consumer: { name: string };\n provider: { name: string };\n messages?: Array<{\n description: string;\n providerStates?: Array<{ name: string }>;\n metadata?: Record<string, unknown>;\n }>;\n interactions?: Array<{\n description: string;\n providerStates?: Array<{ name: string }>;\n metadata?: Record<string, unknown>;\n }>;\n}\n\nexport interface BrokerVerification {\n consumer: string;\n provider: string;\n success: boolean;\n verifiedAt?: string;\n /**\n * Populated when the broker could not be reached or returned a non-2xx\n * response. Distinguishes \"broker said the pact is not verified\" (no error)\n * from \"we could not determine verification status\" (error set).\n */\n error?: string;\n}\n\n/**\n * One row in the audit matrix.\n */\nexport interface AuditRow {\n consumer: string;\n provider: string;\n interaction: string;\n interaction_id?: string;\n kind: PactKind;\n contracted: boolean;\n /** Any interaction-level ledger hit in the window (test or production). */\n observed: boolean;\n test_seen: boolean;\n prod_seen: boolean;\n provider_verified: boolean;\n broker_verified: boolean;\n broker_verified_at?: string;\n /** Set when the broker check failed (network error, non-2xx, parse error). */\n broker_error?: string;\n last_observed_at?: string;\n last_outcome?: PactOutcome;\n}\n\nexport interface AuditMatrix {\n spec: typeof AUDIT_MATRIX_SPEC;\n rows: AuditRow[];\n counts: {\n total: number;\n /** Any contracted row. */\n contracted: number;\n /** Any row with test_seen OR prod_seen. */\n observed: number;\n /** Contracted AND seen in a consumer test. */\n contracted_and_test_seen: number;\n /** Contracted but not seen in a consumer test (stale confidence). */\n contracted_not_test_seen: number;\n /** Seen (test or production) without a matching contract (ungoverned flow). */\n test_or_prod_seen_not_contracted: number;\n test_seen: number;\n prod_seen: number;\n provider_verified: number;\n broker_verified: number;\n };\n window_days: number;\n generated_at: string;\n verification_failures?: ProviderVerificationRunEntry[];\n}\n\nexport interface PactInteractionKey {\n consumer: string;\n provider: string;\n interaction: string;\n kind: PactKind;\n interactionId?: string;\n}\n","import {\n LEDGER_ENTRY_SPEC,\n type InteractionLedgerEntry,\n type LedgerRecord,\n type ProviderVerificationRunEntry,\n} from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Validate a parsed JSONL line and return a typed ledger record.\n * Rejects anything that does not match the current v0.2 spec.\n */\nexport function normalizeLedgerRecord(parsed: unknown): LedgerRecord | null {\n if (!isRecord(parsed) || parsed.spec !== LEDGER_ENTRY_SPEC) return null;\n\n const { consumer, provider, observed_at } = parsed;\n if (\n typeof consumer !== 'string' ||\n typeof provider !== 'string' ||\n typeof observed_at !== 'string'\n ) {\n return null;\n }\n\n if (parsed.type === 'provider_verification_run') {\n if (typeof parsed.error !== 'string') return null;\n const entry: ProviderVerificationRunEntry = {\n type: 'provider_verification_run',\n spec: LEDGER_ENTRY_SPEC,\n consumer,\n provider,\n outcome: 'failed',\n source: parsed.source === 'production' ? 'production' : 'test',\n role: 'provider',\n observed_at,\n error: parsed.error,\n };\n if (typeof parsed.run_id === 'string') entry.run_id = parsed.run_id;\n if (typeof parsed.git_sha === 'string') entry.git_sha = parsed.git_sha;\n if (typeof parsed.trace_id === 'string') entry.trace_id = parsed.trace_id;\n if (typeof parsed.span_id === 'string') entry.span_id = parsed.span_id;\n return entry;\n }\n\n if (typeof parsed.interaction !== 'string') return null;\n\n const states = Array.isArray(parsed.states)\n ? parsed.states.filter((s): s is string => typeof s === 'string')\n : [];\n\n const entry: InteractionLedgerEntry = {\n type: 'interaction',\n spec: LEDGER_ENTRY_SPEC,\n consumer,\n provider,\n interaction: parsed.interaction,\n states,\n kind: parsed.kind === 'http' ? 'http' : 'message',\n outcome: parsed.outcome === 'failed' ? 'failed' : 'passed',\n source: parsed.source === 'production' ? 'production' : 'test',\n role: parsed.role === 'provider' ? 'provider' : 'consumer',\n duration_ms:\n typeof parsed.duration_ms === 'number' && parsed.duration_ms >= 0\n ? parsed.duration_ms\n : 0,\n observed_at,\n };\n\n if (typeof parsed.interaction_id === 'string' && parsed.interaction_id.length > 0) {\n entry.interaction_id = parsed.interaction_id;\n }\n if (typeof parsed.trace_id === 'string') entry.trace_id = parsed.trace_id;\n if (typeof parsed.span_id === 'string') entry.span_id = parsed.span_id;\n if (typeof parsed.run_id === 'string') entry.run_id = parsed.run_id;\n if (typeof parsed.git_sha === 'string') entry.git_sha = parsed.git_sha;\n if (typeof parsed.error === 'string') entry.error = parsed.error;\n\n return entry;\n}\n","import {\n appendFileSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n existsSync,\n} from 'node:fs';\nimport { appendFile, mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { normalizeLedgerRecord } from './ledger-normalize.js';\nimport { LEDGER_ENTRY_SPEC, type LedgerRecord } from './types.js';\n\nexport interface LedgerOptions {\n dir?: string;\n runId?: string;\n}\n\nconst DEFAULT_DIR = '.autotel-pact';\n\nfunction resolveLedgerDir(opts: LedgerOptions = {}): string {\n return path.resolve(process.cwd(), opts.dir ?? process.env.AUTOTEL_PACT_LEDGER_DIR ?? DEFAULT_DIR);\n}\n\nfunction resolveRunId(opts: LedgerOptions = {}): string {\n const explicit = opts.runId ?? process.env.AUTOTEL_PACT_RUN_ID;\n if (explicit) return explicit;\n return `local-${new Date().toISOString().replaceAll(/[:.]/g, '-')}`;\n}\n\nexport function ledgerPath(opts: LedgerOptions = {}): string {\n const dir = resolveLedgerDir(opts);\n return path.join(dir, `ledger-${resolveRunId(opts)}.jsonl`);\n}\n\nfunction writeLine(filePath: string, entry: LedgerRecord): void {\n mkdirSync(path.dirname(filePath), { recursive: true });\n appendFileSync(filePath, JSON.stringify(entry) + '\\n', 'utf8');\n}\n\n/**\n * Append a ledger record synchronously (tests and consumer wrappers).\n */\nexport function appendLedgerEntry(\n entry: LedgerRecord,\n opts: LedgerOptions = {},\n): void {\n const filePath = ledgerPath(opts);\n const normalized: LedgerRecord =\n entry.type === 'provider_verification_run'\n ? entry\n : { ...entry, spec: LEDGER_ENTRY_SPEC, type: 'interaction' as const };\n writeLine(filePath, normalized);\n}\n\nexport function appendProviderVerificationFailure(\n entry: Omit<\n import('./types.js').ProviderVerificationRunEntry,\n 'type' | 'spec' | 'outcome' | 'role'\n > & { error: string },\n opts: LedgerOptions = {},\n): void {\n appendLedgerEntry(\n {\n type: 'provider_verification_run',\n spec: LEDGER_ENTRY_SPEC,\n outcome: 'failed',\n role: 'provider',\n source: entry.source ?? 'test',\n consumer: entry.consumer,\n provider: entry.provider,\n observed_at: entry.observed_at,\n error: entry.error,\n run_id: entry.run_id,\n git_sha: entry.git_sha,\n trace_id: entry.trace_id,\n span_id: entry.span_id,\n },\n opts,\n );\n}\n\n/**\n * Read all ledger files and return normalized records.\n */\nexport function readLedger(opts: LedgerOptions = {}): LedgerRecord[] {\n const dir = resolveLedgerDir(opts);\n if (!existsSync(dir)) return [];\n const files = readdirSync(dir).filter((f) => f.endsWith('.jsonl'));\n const entries: LedgerRecord[] = [];\n for (const file of files) {\n const text = readFileSync(path.join(dir, file), 'utf8');\n for (const line of text.split('\\n')) {\n if (!line.trim()) continue;\n try {\n const normalized = normalizeLedgerRecord(JSON.parse(line));\n if (normalized) entries.push(normalized);\n } catch {\n // skip malformed lines\n }\n }\n }\n return entries;\n}\n\n/**\n * Serialized async writes for production span processor.\n * Bounded by a producer-side backpressure threshold: once `pendingWrites`\n * reaches `MAX_PENDING_WRITES`, new callers await drainage before queueing,\n * so memory cannot grow unbounded under sustained pressure.\n */\nconst MAX_PENDING_WRITES = 4096;\nlet asyncWriteChain: Promise<void> = Promise.resolve();\nlet pendingWrites = 0;\n\nexport async function appendLedgerEntryAsync(\n entry: LedgerRecord,\n opts: LedgerOptions = {},\n): Promise<void> {\n if (pendingWrites >= MAX_PENDING_WRITES) {\n await asyncWriteChain;\n }\n\n const filePath = ledgerPath(opts);\n const normalized: LedgerRecord =\n entry.type === 'provider_verification_run'\n ? entry\n : { ...entry, spec: LEDGER_ENTRY_SPEC, type: 'interaction' as const };\n const line = JSON.stringify(normalized);\n\n pendingWrites++;\n const run = asyncWriteChain.then(async () => {\n try {\n await mkdir(path.dirname(filePath), { recursive: true });\n await appendFile(filePath, line + '\\n', 'utf8');\n } finally {\n pendingWrites--;\n }\n });\n asyncWriteChain = run.catch(() => {});\n return run;\n}\n\nexport async function flushLedgerWrites(): Promise<void> {\n await asyncWriteChain;\n}\n\n/** @internal Reset async chain between tests. */\nexport function resetLedgerWriteChainForTests(): void {\n asyncWriteChain = Promise.resolve();\n pendingWrites = 0;\n}\n\n/** @internal Expose pending write count for tests. */\nexport function pendingLedgerWriteCount(): number {\n return pendingWrites;\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport type { PactFile, PactInteractionKey } from './types.js';\n\n/**\n * Walk a directory and return absolute paths of all *.json pact files.\n */\nexport function listPactFiles(dir: string): string[] {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return [];\n const out: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n out.push(...listPactFiles(full));\n } else if (entry.isFile() && entry.name.endsWith('.json')) {\n out.push(full);\n }\n }\n return out;\n}\n\nexport function extractInteractionId(\n metadata: Record<string, unknown> | undefined,\n): string | undefined {\n if (!metadata) return undefined;\n const id = metadata.interactionId ?? metadata.interaction_id;\n return typeof id === 'string' && id.length > 0 ? id : undefined;\n}\n\n/**\n * Extract interaction tuples declared in a pact file.\n */\nexport function interactionsFromPactFile(pact: PactFile): PactInteractionKey[] {\n const consumer = pact.consumer?.name;\n const provider = pact.provider?.name;\n if (!consumer || !provider) return [];\n const keys: PactInteractionKey[] = [];\n for (const m of pact.messages ?? []) {\n keys.push({\n consumer,\n provider,\n interaction: m.description,\n kind: 'message',\n interactionId: extractInteractionId(m.metadata),\n });\n }\n for (const i of pact.interactions ?? []) {\n keys.push({\n consumer,\n provider,\n interaction: i.description,\n kind: 'http',\n interactionId: extractInteractionId(i.metadata),\n });\n }\n return keys;\n}\n\nexport function parsePactFile(filePath: string): PactFile | null {\n try {\n return JSON.parse(readFileSync(filePath, 'utf8')) as PactFile;\n } catch {\n return null;\n }\n}\n","import path from 'node:path';\nimport { fetchBrokerVerifications, type BrokerConfig } from './broker.js';\nimport { readLedger, type LedgerOptions } from './ledger.js';\nimport {\n interactionsFromPactFile,\n listPactFiles,\n parsePactFile,\n} from './pact-file.js';\nimport {\n AUDIT_MATRIX_SPEC,\n isInteractionLedgerEntry,\n isProviderVerificationRun,\n type AuditMatrix,\n type AuditRow,\n type BrokerVerification,\n type InteractionLedgerEntry,\n type LedgerRecord,\n type PactInteractionKey,\n type ProviderVerificationRunEntry,\n} from './types.js';\n\nexport interface AuditOptions extends LedgerOptions {\n pactsDir?: string;\n windowDays?: number;\n broker?: BrokerConfig;\n}\n\nconst DEFAULT_PACTS_DIR = './pacts';\nconst DEFAULT_WINDOW_DAYS = 14;\n\nexport function keyOf(k: PactInteractionKey): string {\n const identity = k.interactionId ?? k.interaction;\n return `${k.consumer}::${k.provider}::${k.kind}::${identity}`;\n}\n\nfunction pairKey(consumer: string, provider: string): string {\n return `${consumer}::${provider}`;\n}\n\nfunction inWindow(observedAt: string, cutoff: number): boolean {\n const t = Date.parse(observedAt);\n return Number.isFinite(t) && t >= cutoff;\n}\n\n/**\n * Compute the audit matrix from pact files, ledger, and optional broker data.\n */\nexport function computeAuditMatrix(input: {\n contracted: PactInteractionKey[];\n ledger: LedgerRecord[];\n brokerVerifications?: BrokerVerification[];\n windowDays?: number;\n now?: Date;\n}): AuditMatrix {\n const windowDays = input.windowDays ?? DEFAULT_WINDOW_DAYS;\n const now = input.now ?? new Date();\n const cutoff = now.getTime() - windowDays * 24 * 60 * 60 * 1000;\n\n const verificationFailures: ProviderVerificationRunEntry[] = [];\n const recentInteractions: InteractionLedgerEntry[] = [];\n\n for (const entry of input.ledger) {\n if (!inWindow(entry.observed_at, cutoff)) continue;\n if (isProviderVerificationRun(entry)) {\n verificationFailures.push(entry);\n continue;\n }\n if (isInteractionLedgerEntry(entry)) {\n recentInteractions.push(entry);\n }\n }\n\n const brokerByPair = new Map<string, BrokerVerification>();\n for (const b of input.brokerVerifications ?? []) {\n brokerByPair.set(pairKey(b.consumer, b.provider), b);\n }\n\n const testSeenByKey = new Map<string, InteractionLedgerEntry[]>();\n const prodSeenByKey = new Map<string, InteractionLedgerEntry[]>();\n const providerVerifiedByKey = new Map<string, InteractionLedgerEntry[]>();\n const anyObservedByKey = new Map<string, InteractionLedgerEntry[]>();\n\n for (const entry of recentInteractions) {\n const k = keyOf({\n consumer: entry.consumer,\n provider: entry.provider,\n interaction: entry.interaction,\n kind: entry.kind,\n interactionId: entry.interaction_id,\n });\n\n const push = (map: Map<string, InteractionLedgerEntry[]>) => {\n const arr = map.get(k) ?? [];\n arr.push(entry);\n map.set(k, arr);\n };\n\n push(anyObservedByKey);\n\n if (entry.source === 'test' && entry.role === 'consumer') {\n push(testSeenByKey);\n }\n if (entry.source === 'production') {\n push(prodSeenByKey);\n }\n if (entry.role === 'provider' && entry.outcome === 'passed') {\n push(providerVerifiedByKey);\n }\n }\n\n const contractedByKey = new Map<string, PactInteractionKey>();\n for (const c of input.contracted) {\n contractedByKey.set(keyOf(c), c);\n }\n\n const rows: AuditRow[] = [];\n\n function pushRow(parts: PactInteractionKey, k: string, isContracted: boolean): void {\n const testObs = testSeenByKey.get(k) ?? [];\n const prodObs = prodSeenByKey.get(k) ?? [];\n const providerObs = providerVerifiedByKey.get(k) ?? [];\n const allObs = anyObservedByKey.get(k) ?? [];\n const latest = allObs.toSorted((a, b) =>\n b.observed_at.localeCompare(a.observed_at),\n )[0];\n const broker = brokerByPair.get(pairKey(parts.consumer, parts.provider));\n\n rows.push({\n consumer: parts.consumer,\n provider: parts.provider,\n interaction: parts.interaction,\n interaction_id: parts.interactionId ?? latest?.interaction_id,\n kind: parts.kind,\n contracted: isContracted,\n observed: testObs.length > 0 || prodObs.length > 0,\n test_seen: testObs.length > 0,\n prod_seen: prodObs.length > 0,\n provider_verified: providerObs.length > 0,\n broker_verified: broker?.success === true,\n broker_verified_at: broker?.verifiedAt,\n broker_error: broker?.error,\n last_observed_at: latest?.observed_at,\n last_outcome: latest?.outcome,\n });\n }\n\n for (const [k, contracted] of contractedByKey) {\n pushRow(contracted, k, true);\n }\n for (const [k, observations] of anyObservedByKey) {\n if (contractedByKey.has(k)) continue;\n const first = observations[0]!;\n pushRow(\n {\n consumer: first.consumer,\n provider: first.provider,\n interaction: first.interaction,\n kind: first.kind,\n interactionId: first.interaction_id,\n },\n k,\n false,\n );\n }\n\n rows.sort((a, b) =>\n a.consumer.localeCompare(b.consumer) ||\n a.provider.localeCompare(b.provider) ||\n a.interaction.localeCompare(b.interaction),\n );\n\n const counts = {\n total: rows.length,\n contracted: rows.filter((r) => r.contracted).length,\n observed: rows.filter((r) => r.observed).length,\n contracted_and_test_seen: rows.filter((r) => r.contracted && r.test_seen).length,\n contracted_not_test_seen: rows.filter((r) => r.contracted && !r.test_seen).length,\n test_or_prod_seen_not_contracted: rows.filter(\n (r) => !r.contracted && (r.test_seen || r.prod_seen),\n ).length,\n test_seen: rows.filter((r) => r.test_seen).length,\n prod_seen: rows.filter((r) => r.prod_seen).length,\n provider_verified: rows.filter((r) => r.provider_verified).length,\n broker_verified: rows.filter((r) => r.broker_verified).length,\n };\n\n const matrix: AuditMatrix = {\n spec: AUDIT_MATRIX_SPEC,\n rows,\n counts,\n window_days: windowDays,\n generated_at: now.toISOString(),\n };\n\n if (verificationFailures.length > 0) {\n matrix.verification_failures = verificationFailures;\n }\n\n return matrix;\n}\n\nexport async function runAudit(opts: AuditOptions = {}): Promise<AuditMatrix> {\n const pactsDir = path.resolve(process.cwd(), opts.pactsDir ?? DEFAULT_PACTS_DIR);\n const contracted: PactInteractionKey[] = [];\n const pairs = new Set<string>();\n\n for (const file of listPactFiles(pactsDir)) {\n const pact = parsePactFile(file);\n if (!pact) continue;\n const interactions = interactionsFromPactFile(pact);\n contracted.push(...interactions);\n const consumer = pact.consumer?.name;\n const provider = pact.provider?.name;\n if (consumer && provider) {\n pairs.add(pairKey(consumer, provider));\n }\n }\n\n const ledger = readLedger(opts);\n\n let brokerVerifications: BrokerVerification[] | undefined;\n if (opts.broker) {\n brokerVerifications = await fetchBrokerVerifications(opts.broker, [...pairs].map((p) => {\n const [consumer, provider] = p.split('::');\n return { consumer: consumer!, provider: provider! };\n }));\n }\n\n return computeAuditMatrix({\n contracted,\n ledger,\n brokerVerifications,\n windowDays: opts.windowDays,\n });\n}\n\n/** Sync audit without broker (backward compatible for tests). */\nexport function runAuditSync(opts: Omit<AuditOptions, 'broker'> = {}): AuditMatrix {\n const pactsDir = path.resolve(process.cwd(), opts.pactsDir ?? DEFAULT_PACTS_DIR);\n const contracted: PactInteractionKey[] = [];\n for (const file of listPactFiles(pactsDir)) {\n const pact = parsePactFile(file);\n if (pact) contracted.push(...interactionsFromPactFile(pact));\n }\n const ledger = readLedger(opts);\n return computeAuditMatrix({\n contracted,\n ledger,\n windowDays: opts.windowDays,\n });\n}\n"]}
1
+ {"version":3,"file":"audit.js","names":[],"sources":["../src/audit.ts"],"sourcesContent":["import path from 'node:path';\nimport { fetchBrokerVerifications, type BrokerConfig } from './broker.js';\nimport { readLedger, type LedgerOptions } from './ledger.js';\nimport {\n interactionsFromPactFile,\n listPactFiles,\n parsePactFile,\n} from './pact-file.js';\nimport {\n AUDIT_MATRIX_SPEC,\n isInteractionLedgerEntry,\n isProviderVerificationRun,\n type AuditMatrix,\n type AuditRow,\n type BrokerVerification,\n type InteractionLedgerEntry,\n type LedgerRecord,\n type PactInteractionKey,\n type ProviderVerificationRunEntry,\n} from './types.js';\n\nexport interface AuditOptions extends LedgerOptions {\n pactsDir?: string;\n windowDays?: number;\n broker?: BrokerConfig;\n}\n\nconst DEFAULT_PACTS_DIR = './pacts';\nconst DEFAULT_WINDOW_DAYS = 14;\n\nexport function keyOf(k: PactInteractionKey): string {\n const identity = k.interactionId ?? k.interaction;\n return `${k.consumer}::${k.provider}::${k.kind}::${identity}`;\n}\n\nfunction pairKey(consumer: string, provider: string): string {\n return `${consumer}::${provider}`;\n}\n\nfunction inWindow(observedAt: string, cutoff: number): boolean {\n const t = Date.parse(observedAt);\n return Number.isFinite(t) && t >= cutoff;\n}\n\n/**\n * Compute the audit matrix from pact files, ledger, and optional broker data.\n */\nexport function computeAuditMatrix(input: {\n contracted: PactInteractionKey[];\n ledger: LedgerRecord[];\n brokerVerifications?: BrokerVerification[];\n windowDays?: number;\n now?: Date;\n}): AuditMatrix {\n const windowDays = input.windowDays ?? DEFAULT_WINDOW_DAYS;\n const now = input.now ?? new Date();\n const cutoff = now.getTime() - windowDays * 24 * 60 * 60 * 1000;\n\n const verificationFailures: ProviderVerificationRunEntry[] = [];\n const recentInteractions: InteractionLedgerEntry[] = [];\n\n for (const entry of input.ledger) {\n if (!inWindow(entry.observed_at, cutoff)) continue;\n if (isProviderVerificationRun(entry)) {\n verificationFailures.push(entry);\n continue;\n }\n if (isInteractionLedgerEntry(entry)) {\n recentInteractions.push(entry);\n }\n }\n\n const brokerByPair = new Map<string, BrokerVerification>();\n for (const b of input.brokerVerifications ?? []) {\n brokerByPair.set(pairKey(b.consumer, b.provider), b);\n }\n\n const testSeenByKey = new Map<string, InteractionLedgerEntry[]>();\n const prodSeenByKey = new Map<string, InteractionLedgerEntry[]>();\n const providerVerifiedByKey = new Map<string, InteractionLedgerEntry[]>();\n const anyObservedByKey = new Map<string, InteractionLedgerEntry[]>();\n\n for (const entry of recentInteractions) {\n const k = keyOf({\n consumer: entry.consumer,\n provider: entry.provider,\n interaction: entry.interaction,\n kind: entry.kind,\n interactionId: entry.interaction_id,\n });\n\n const push = (map: Map<string, InteractionLedgerEntry[]>) => {\n const arr = map.get(k) ?? [];\n arr.push(entry);\n map.set(k, arr);\n };\n\n push(anyObservedByKey);\n\n if (entry.source === 'test' && entry.role === 'consumer') {\n push(testSeenByKey);\n }\n if (entry.source === 'production') {\n push(prodSeenByKey);\n }\n if (entry.role === 'provider' && entry.outcome === 'passed') {\n push(providerVerifiedByKey);\n }\n }\n\n const contractedByKey = new Map<string, PactInteractionKey>();\n for (const c of input.contracted) {\n contractedByKey.set(keyOf(c), c);\n }\n\n const rows: AuditRow[] = [];\n\n function pushRow(parts: PactInteractionKey, k: string, isContracted: boolean): void {\n const testObs = testSeenByKey.get(k) ?? [];\n const prodObs = prodSeenByKey.get(k) ?? [];\n const providerObs = providerVerifiedByKey.get(k) ?? [];\n const allObs = anyObservedByKey.get(k) ?? [];\n const latest = allObs.toSorted((a, b) =>\n b.observed_at.localeCompare(a.observed_at),\n )[0];\n const broker = brokerByPair.get(pairKey(parts.consumer, parts.provider));\n\n rows.push({\n consumer: parts.consumer,\n provider: parts.provider,\n interaction: parts.interaction,\n interaction_id: parts.interactionId ?? latest?.interaction_id,\n kind: parts.kind,\n contracted: isContracted,\n observed: testObs.length > 0 || prodObs.length > 0,\n test_seen: testObs.length > 0,\n prod_seen: prodObs.length > 0,\n provider_verified: providerObs.length > 0,\n broker_verified: broker?.success === true,\n broker_verified_at: broker?.verifiedAt,\n broker_error: broker?.error,\n last_observed_at: latest?.observed_at,\n last_outcome: latest?.outcome,\n });\n }\n\n for (const [k, contracted] of contractedByKey) {\n pushRow(contracted, k, true);\n }\n for (const [k, observations] of anyObservedByKey) {\n if (contractedByKey.has(k)) continue;\n const first = observations[0]!;\n pushRow(\n {\n consumer: first.consumer,\n provider: first.provider,\n interaction: first.interaction,\n kind: first.kind,\n interactionId: first.interaction_id,\n },\n k,\n false,\n );\n }\n\n rows.sort((a, b) =>\n a.consumer.localeCompare(b.consumer) ||\n a.provider.localeCompare(b.provider) ||\n a.interaction.localeCompare(b.interaction),\n );\n\n const counts = {\n total: rows.length,\n contracted: rows.filter((r) => r.contracted).length,\n observed: rows.filter((r) => r.observed).length,\n contracted_and_test_seen: rows.filter((r) => r.contracted && r.test_seen).length,\n contracted_not_test_seen: rows.filter((r) => r.contracted && !r.test_seen).length,\n test_or_prod_seen_not_contracted: rows.filter(\n (r) => !r.contracted && (r.test_seen || r.prod_seen),\n ).length,\n test_seen: rows.filter((r) => r.test_seen).length,\n prod_seen: rows.filter((r) => r.prod_seen).length,\n provider_verified: rows.filter((r) => r.provider_verified).length,\n broker_verified: rows.filter((r) => r.broker_verified).length,\n };\n\n const matrix: AuditMatrix = {\n spec: AUDIT_MATRIX_SPEC,\n rows,\n counts,\n window_days: windowDays,\n generated_at: now.toISOString(),\n };\n\n if (verificationFailures.length > 0) {\n matrix.verification_failures = verificationFailures;\n }\n\n return matrix;\n}\n\nexport async function runAudit(opts: AuditOptions = {}): Promise<AuditMatrix> {\n const pactsDir = path.resolve(process.cwd(), opts.pactsDir ?? DEFAULT_PACTS_DIR);\n const contracted: PactInteractionKey[] = [];\n const pairs = new Set<string>();\n\n for (const file of listPactFiles(pactsDir)) {\n const pact = parsePactFile(file);\n if (!pact) continue;\n const interactions = interactionsFromPactFile(pact);\n contracted.push(...interactions);\n const consumer = pact.consumer?.name;\n const provider = pact.provider?.name;\n if (consumer && provider) {\n pairs.add(pairKey(consumer, provider));\n }\n }\n\n const ledger = readLedger(opts);\n\n let brokerVerifications: BrokerVerification[] | undefined;\n if (opts.broker) {\n brokerVerifications = await fetchBrokerVerifications(opts.broker, [...pairs].map((p) => {\n const [consumer, provider] = p.split('::');\n return { consumer: consumer!, provider: provider! };\n }));\n }\n\n return computeAuditMatrix({\n contracted,\n ledger,\n brokerVerifications,\n windowDays: opts.windowDays,\n });\n}\n\n/** Sync audit without broker (backward compatible for tests). */\nexport function runAuditSync(opts: Omit<AuditOptions, 'broker'> = {}): AuditMatrix {\n const pactsDir = path.resolve(process.cwd(), opts.pactsDir ?? DEFAULT_PACTS_DIR);\n const contracted: PactInteractionKey[] = [];\n for (const file of listPactFiles(pactsDir)) {\n const pact = parsePactFile(file);\n if (pact) contracted.push(...interactionsFromPactFile(pact));\n }\n const ledger = readLedger(opts);\n return computeAuditMatrix({\n contracted,\n ledger,\n windowDays: opts.windowDays,\n });\n}\n"],"mappings":"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"}
@@ -1,255 +1,221 @@
1
- 'use strict';
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_ledger = require('./ledger-BayQwemz.cjs');
3
+ const require_attrs = require('./attrs-DbCs1ou0.cjs');
4
+ let autotel = require("autotel");
5
+ let node_module = require("node:module");
2
6
 
3
- var autotel = require('autotel');
4
- var module$1 = require('module');
5
- var fs = require('fs');
6
- require('fs/promises');
7
- var path = require('path');
8
-
9
- var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
10
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
-
12
- var path__default = /*#__PURE__*/_interopDefault(path);
13
-
14
- // src/auto-wrap.ts
15
-
16
- // src/attrs.ts
17
- var PACT_ATTRS = {
18
- CONSUMER: "pact.consumer",
19
- PROVIDER: "pact.provider",
20
- KIND: "pact.kind",
21
- INTERACTION_DESCRIPTION: "pact.interaction.description",
22
- INTERACTION_ID: "pact.interaction.id",
23
- INTERACTION_STATES: "pact.interaction.states",
24
- CONTRACT_FILE: "pact.contract.file",
25
- OUTCOME: "pact.outcome"
26
- };
27
- function buildPactAttributes(meta, opts = {}) {
28
- const attrs = {
29
- [PACT_ATTRS.CONSUMER]: meta.consumer,
30
- [PACT_ATTRS.PROVIDER]: meta.provider,
31
- [PACT_ATTRS.KIND]: meta.kind,
32
- [PACT_ATTRS.INTERACTION_DESCRIPTION]: meta.description,
33
- [PACT_ATTRS.INTERACTION_STATES]: meta.states
34
- };
35
- if (opts.contractFile) {
36
- attrs[PACT_ATTRS.CONTRACT_FILE] = opts.contractFile;
37
- }
38
- if (meta.interactionId) {
39
- attrs[PACT_ATTRS.INTERACTION_ID] = meta.interactionId;
40
- }
41
- return attrs;
42
- }
43
- function outcomeAttribute(outcome) {
44
- return { [PACT_ATTRS.OUTCOME]: outcome };
45
- }
46
-
47
- // src/types.ts
48
- var LEDGER_ENTRY_SPEC = "autotel-pact-ledger-entry/v0.2.0";
49
-
50
- // src/ledger.ts
51
- var DEFAULT_DIR = ".autotel-pact";
52
- function resolveLedgerDir(opts = {}) {
53
- return path__default.default.resolve(process.cwd(), opts.dir ?? process.env.AUTOTEL_PACT_LEDGER_DIR ?? DEFAULT_DIR);
54
- }
55
- function resolveRunId(opts = {}) {
56
- const explicit = opts.runId ?? process.env.AUTOTEL_PACT_RUN_ID;
57
- if (explicit) return explicit;
58
- return `local-${(/* @__PURE__ */ new Date()).toISOString().replaceAll(/[:.]/g, "-")}`;
59
- }
60
- function ledgerPath(opts = {}) {
61
- const dir = resolveLedgerDir(opts);
62
- return path__default.default.join(dir, `ledger-${resolveRunId(opts)}.jsonl`);
63
- }
64
- function writeLine(filePath, entry) {
65
- fs.mkdirSync(path__default.default.dirname(filePath), { recursive: true });
66
- fs.appendFileSync(filePath, JSON.stringify(entry) + "\n", "utf8");
67
- }
68
- function appendLedgerEntry(entry, opts = {}) {
69
- const filePath = ledgerPath(opts);
70
- const normalized = entry.type === "provider_verification_run" ? entry : { ...entry, spec: LEDGER_ENTRY_SPEC, type: "interaction" };
71
- writeLine(filePath, normalized);
72
- }
73
- Promise.resolve();
74
-
75
- // src/auto-wrap.ts
76
- var INSTALLED = /* @__PURE__ */ Symbol.for("autotel-pact:auto-wrap-installed");
7
+ //#region src/auto-wrap.ts
8
+ /**
9
+ * Auto-wrap entry for vitest / jest setup files.
10
+ *
11
+ * Importing this module monkey-patches `@pact-foundation/pact`'s
12
+ * `MessageConsumerPact.prototype.verify` and `PactV3.prototype.executeTest`
13
+ * so every contract test in the project records a ledger entry without
14
+ * users having to wrap each call by hand.
15
+ *
16
+ * Usage (vitest):
17
+ *
18
+ * ```ts
19
+ * // vitest.config.ts
20
+ * import { defineConfig } from 'vitest/config';
21
+ * export default defineConfig({
22
+ * test: { setupFiles: ['autotel-pact/auto-wrap'] },
23
+ * });
24
+ * ```
25
+ *
26
+ * Usage (jest):
27
+ *
28
+ * ```js
29
+ * // jest.config.js
30
+ * module.exports = { setupFilesAfterEach: ['autotel-pact/auto-wrap'] };
31
+ * ```
32
+ *
33
+ * Configuration is via environment variables — there's no API surface,
34
+ * because setup files don't get parameters:
35
+ *
36
+ * - `AUTOTEL_PACT_RUN_ID` — tag every ledger entry with this run id
37
+ * - `AUTOTEL_PACT_LEDGER_DIR` — override the default `.autotel-pact/` dir
38
+ *
39
+ * Idempotent: importing twice is a no-op.
40
+ *
41
+ * Safe when Pact-JS isn't installed: logs a single warning and exits
42
+ * cleanly. The same setup file can stay in place for a repo whose
43
+ * non-contract test packages don't have Pact as a dependency.
44
+ */
45
+ const INSTALLED = Symbol.for("autotel-pact:auto-wrap-installed");
46
+ /**
47
+ * Install the auto-wrap. Called at module load when this file is imported.
48
+ * Exposed for tests + explicit-invocation users.
49
+ *
50
+ * @param pactModule Override Pact-JS resolution. When omitted, requires
51
+ * `@pact-foundation/pact` from disk. Tests can pass synthetic classes.
52
+ *
53
+ * Returns `true` if Pact-JS was found and patched, `false` otherwise.
54
+ */
77
55
  function installAutoWrap(pactModule) {
78
- const pactJs = pactModule ?? loadPactJs();
79
- if (!pactJs) return false;
80
- patchMessagePact(pactJs);
81
- patchHttpPact(pactJs);
82
- return true;
56
+ const pactJs = pactModule ?? loadPactJs();
57
+ if (!pactJs) return false;
58
+ patchMessagePact(pactJs);
59
+ patchHttpPact(pactJs);
60
+ return true;
83
61
  }
84
62
  function loadPactJs() {
85
- try {
86
- const require2 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('auto-wrap.cjs', document.baseURI).href)));
87
- return require2("@pact-foundation/pact");
88
- } catch {
89
- process.stderr.write(
90
- "autotel-pact/auto-wrap: @pact-foundation/pact not installed \u2014 skipping.\n"
91
- );
92
- return void 0;
93
- }
63
+ try {
64
+ return (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href)("@pact-foundation/pact");
65
+ } catch {
66
+ process.stderr.write("autotel-pact/auto-wrap: @pact-foundation/pact not installed — skipping.\n");
67
+ return;
68
+ }
94
69
  }
95
70
  function patchMessagePact(mod) {
96
- const ctor = mod.MessageConsumerPact;
97
- if (!ctor) return;
98
- const proto = ctor.prototype;
99
- if (proto[INSTALLED]) return;
100
- const originalVerify = proto.verify;
101
- proto.verify = async function patchedVerify(handler) {
102
- const start = process.hrtime.bigint();
103
- let captured;
104
- const consumer = this.config?.consumer ?? "<unknown>";
105
- const provider = this.config?.provider ?? "<unknown>";
106
- return autotel.span("pact.interaction", async (span) => {
107
- span.setAttributes({
108
- "pact.consumer": consumer,
109
- "pact.provider": provider,
110
- "pact.kind": "message"
111
- });
112
- try {
113
- const result = await originalVerify.call(this, async (reified) => {
114
- captured = reified;
115
- const meta = {
116
- consumer,
117
- provider,
118
- description: reified.description ?? "<unknown>",
119
- states: (reified.providerStates ?? []).map((s) => s.name),
120
- kind: "message"
121
- };
122
- span.setAttributes(buildPactAttributes(meta));
123
- return handler(reified);
124
- });
125
- span.setAttributes(outcomeAttribute("passed"));
126
- writeAutoLedgerEntry({
127
- consumer,
128
- provider,
129
- interaction: captured?.description ?? "<unknown>",
130
- states: (captured?.providerStates ?? []).map((s) => s.name),
131
- kind: "message",
132
- outcome: "passed",
133
- start
134
- });
135
- return result;
136
- } catch (error) {
137
- span.setAttributes(outcomeAttribute("failed"));
138
- writeAutoLedgerEntry({
139
- consumer,
140
- provider,
141
- interaction: captured?.description ?? "<unknown>",
142
- states: (captured?.providerStates ?? []).map((s) => s.name),
143
- kind: "message",
144
- outcome: "failed",
145
- start,
146
- error: error instanceof Error ? error.message : String(error)
147
- });
148
- throw error;
149
- }
150
- });
151
- };
152
- proto[INSTALLED] = true;
71
+ const ctor = mod.MessageConsumerPact;
72
+ if (!ctor) return;
73
+ const proto = ctor.prototype;
74
+ if (proto[INSTALLED]) return;
75
+ const originalVerify = proto.verify;
76
+ proto.verify = async function patchedVerify(handler) {
77
+ const start = process.hrtime.bigint();
78
+ let captured;
79
+ const consumer = this.config?.consumer ?? "<unknown>";
80
+ const provider = this.config?.provider ?? "<unknown>";
81
+ return (0, autotel.span)("pact.interaction", async (span) => {
82
+ span.setAttributes({
83
+ "pact.consumer": consumer,
84
+ "pact.provider": provider,
85
+ "pact.kind": "message"
86
+ });
87
+ try {
88
+ const result = await originalVerify.call(this, async (reified) => {
89
+ captured = reified;
90
+ const meta = {
91
+ consumer,
92
+ provider,
93
+ description: reified.description ?? "<unknown>",
94
+ states: (reified.providerStates ?? []).map((s) => s.name),
95
+ kind: "message"
96
+ };
97
+ span.setAttributes(require_attrs.buildPactAttributes(meta));
98
+ return handler(reified);
99
+ });
100
+ span.setAttributes(require_attrs.outcomeAttribute("passed"));
101
+ writeAutoLedgerEntry({
102
+ consumer,
103
+ provider,
104
+ interaction: captured?.description ?? "<unknown>",
105
+ states: (captured?.providerStates ?? []).map((s) => s.name),
106
+ kind: "message",
107
+ outcome: "passed",
108
+ start
109
+ });
110
+ return result;
111
+ } catch (error) {
112
+ span.setAttributes(require_attrs.outcomeAttribute("failed"));
113
+ writeAutoLedgerEntry({
114
+ consumer,
115
+ provider,
116
+ interaction: captured?.description ?? "<unknown>",
117
+ states: (captured?.providerStates ?? []).map((s) => s.name),
118
+ kind: "message",
119
+ outcome: "failed",
120
+ start,
121
+ error: error instanceof Error ? error.message : String(error)
122
+ });
123
+ throw error;
124
+ }
125
+ });
126
+ };
127
+ proto[INSTALLED] = true;
153
128
  }
154
129
  function patchHttpPact(mod) {
155
- const ctor = mod.PactV3;
156
- if (!ctor) return;
157
- const proto = ctor.prototype;
158
- if (proto[INSTALLED]) return;
159
- const tracked = /* @__PURE__ */ new WeakMap();
160
- const originalAdd = proto.addInteraction;
161
- proto.addInteraction = function patchedAddInteraction(interaction) {
162
- const list = tracked.get(this) ?? [];
163
- list.push(interaction);
164
- tracked.set(this, list);
165
- return originalAdd.call(this, interaction);
166
- };
167
- const originalExecute = proto.executeTest;
168
- proto.executeTest = async function patchedExecuteTest(fn) {
169
- const start = process.hrtime.bigint();
170
- const consumer = this.opts?.consumer ?? "<unknown>";
171
- const provider = this.opts?.provider ?? "<unknown>";
172
- const interactions = tracked.get(this) ?? [];
173
- tracked.set(this, []);
174
- return autotel.span("pact.interaction", async (span) => {
175
- span.setAttributes({
176
- "pact.consumer": consumer,
177
- "pact.provider": provider,
178
- "pact.kind": "http"
179
- });
180
- const first = interactions[0];
181
- if (first) {
182
- span.setAttributes(
183
- buildPactAttributes({
184
- consumer,
185
- provider,
186
- description: first.uponReceiving,
187
- states: (first.states ?? []).map((s) => s.description),
188
- kind: "http"
189
- })
190
- );
191
- }
192
- try {
193
- const result = await originalExecute.call(this, fn);
194
- span.setAttributes(outcomeAttribute("passed"));
195
- for (const i of interactions) {
196
- writeAutoLedgerEntry({
197
- consumer,
198
- provider,
199
- interaction: i.uponReceiving,
200
- states: (i.states ?? []).map((s) => s.description),
201
- kind: "http",
202
- outcome: "passed",
203
- start
204
- });
205
- }
206
- return result;
207
- } catch (error_) {
208
- span.setAttributes(outcomeAttribute("failed"));
209
- const error = error_ instanceof Error ? error_.message : String(error_);
210
- for (const i of interactions) {
211
- writeAutoLedgerEntry({
212
- consumer,
213
- provider,
214
- interaction: i.uponReceiving,
215
- states: (i.states ?? []).map((s) => s.description),
216
- kind: "http",
217
- outcome: "failed",
218
- start,
219
- error
220
- });
221
- }
222
- throw error_;
223
- }
224
- });
225
- };
226
- proto[INSTALLED] = true;
130
+ const ctor = mod.PactV3;
131
+ if (!ctor) return;
132
+ const proto = ctor.prototype;
133
+ if (proto[INSTALLED]) return;
134
+ const tracked = /* @__PURE__ */ new WeakMap();
135
+ const originalAdd = proto.addInteraction;
136
+ proto.addInteraction = function patchedAddInteraction(interaction) {
137
+ const list = tracked.get(this) ?? [];
138
+ list.push(interaction);
139
+ tracked.set(this, list);
140
+ return originalAdd.call(this, interaction);
141
+ };
142
+ const originalExecute = proto.executeTest;
143
+ proto.executeTest = async function patchedExecuteTest(fn) {
144
+ const start = process.hrtime.bigint();
145
+ const consumer = this.opts?.consumer ?? "<unknown>";
146
+ const provider = this.opts?.provider ?? "<unknown>";
147
+ const interactions = tracked.get(this) ?? [];
148
+ tracked.set(this, []);
149
+ return (0, autotel.span)("pact.interaction", async (span) => {
150
+ span.setAttributes({
151
+ "pact.consumer": consumer,
152
+ "pact.provider": provider,
153
+ "pact.kind": "http"
154
+ });
155
+ const first = interactions[0];
156
+ if (first) span.setAttributes(require_attrs.buildPactAttributes({
157
+ consumer,
158
+ provider,
159
+ description: first.uponReceiving,
160
+ states: (first.states ?? []).map((s) => s.description),
161
+ kind: "http"
162
+ }));
163
+ try {
164
+ const result = await originalExecute.call(this, fn);
165
+ span.setAttributes(require_attrs.outcomeAttribute("passed"));
166
+ for (const i of interactions) writeAutoLedgerEntry({
167
+ consumer,
168
+ provider,
169
+ interaction: i.uponReceiving,
170
+ states: (i.states ?? []).map((s) => s.description),
171
+ kind: "http",
172
+ outcome: "passed",
173
+ start
174
+ });
175
+ return result;
176
+ } catch (error_) {
177
+ span.setAttributes(require_attrs.outcomeAttribute("failed"));
178
+ const error = error_ instanceof Error ? error_.message : String(error_);
179
+ for (const i of interactions) writeAutoLedgerEntry({
180
+ consumer,
181
+ provider,
182
+ interaction: i.uponReceiving,
183
+ states: (i.states ?? []).map((s) => s.description),
184
+ kind: "http",
185
+ outcome: "failed",
186
+ start,
187
+ error
188
+ });
189
+ throw error_;
190
+ }
191
+ });
192
+ };
193
+ proto[INSTALLED] = true;
227
194
  }
228
195
  function writeAutoLedgerEntry(args) {
229
- const ctx = autotel.getActiveSpan()?.spanContext();
230
- const entry = {
231
- type: "interaction",
232
- spec: LEDGER_ENTRY_SPEC,
233
- consumer: args.consumer,
234
- provider: args.provider,
235
- interaction: args.interaction,
236
- states: args.states,
237
- kind: args.kind,
238
- source: "test",
239
- role: "consumer",
240
- outcome: args.outcome,
241
- duration_ms: Number(process.hrtime.bigint() - args.start) / 1e6,
242
- observed_at: (/* @__PURE__ */ new Date()).toISOString(),
243
- trace_id: ctx?.traceId,
244
- span_id: ctx?.spanId,
245
- run_id: process.env.AUTOTEL_PACT_RUN_ID,
246
- git_sha: process.env.GIT_SHA ?? process.env.GITHUB_SHA,
247
- error: args.error
248
- };
249
- appendLedgerEntry(entry);
196
+ const ctx = (0, autotel.getActiveSpan)()?.spanContext();
197
+ require_ledger.appendLedgerEntry({
198
+ type: "interaction",
199
+ spec: require_ledger.LEDGER_ENTRY_SPEC,
200
+ consumer: args.consumer,
201
+ provider: args.provider,
202
+ interaction: args.interaction,
203
+ states: args.states,
204
+ kind: args.kind,
205
+ source: "test",
206
+ role: "consumer",
207
+ outcome: args.outcome,
208
+ duration_ms: Number(process.hrtime.bigint() - args.start) / 1e6,
209
+ observed_at: (/* @__PURE__ */ new Date()).toISOString(),
210
+ trace_id: ctx?.traceId,
211
+ span_id: ctx?.spanId,
212
+ run_id: process.env.AUTOTEL_PACT_RUN_ID,
213
+ git_sha: process.env.GIT_SHA ?? process.env.GITHUB_SHA,
214
+ error: args.error
215
+ });
250
216
  }
251
217
  installAutoWrap();
252
218
 
219
+ //#endregion
253
220
  exports.installAutoWrap = installAutoWrap;
254
- //# sourceMappingURL=auto-wrap.cjs.map
255
221
  //# sourceMappingURL=auto-wrap.cjs.map