@fabricorg/databricks-bdd 0.8.0 → 0.8.2

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.
@@ -2,9 +2,8 @@ import { runAction } from './chunk-6JC65RH2.js';
2
2
  import { sharedFixtures } from './chunk-SZL3KWW7.js';
3
3
  import { ScopedState, sharedState } from './chunk-HTKRJLVX.js';
4
4
  import { World } from '@cucumber/cucumber';
5
- import { resolveProfile, createExecutionContext } from '@fabricorg/databricks-testkit';
5
+ import { resolveProfile, createExecutionContext, waitForDatabricksRun } from '@fabricorg/databricks-testkit';
6
6
  export { waitForPipelineUpdate } from '@fabricorg/databricks-testkit';
7
- import { waitForDatabricksRun } from '@fabric-harness/databricks';
8
7
 
9
8
  var DatabricksWorld = class extends World {
10
9
  profile;
@@ -311,5 +310,5 @@ async function startPipelineUpdate(client, pipelineId, options = {}) {
311
310
  }
312
311
 
313
312
  export { DatabricksWorld, LIVE_ONLY_TAGS, capabilitiesFromEnv, capabilityTagReason, coerceMatchRows, inferFixture, liveOnlyReason, resolveJobId, resolvePipelineId, runJobToTerminal, scenarioSkipReason, startPipelineUpdate };
314
- //# sourceMappingURL=chunk-3XDMBHFP.js.map
315
- //# sourceMappingURL=chunk-3XDMBHFP.js.map
313
+ //# sourceMappingURL=chunk-WUKSKMYY.js.map
314
+ //# sourceMappingURL=chunk-WUKSKMYY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/world.ts","../src/profile.ts","../src/infer.ts","../src/jobs.ts","../src/pipelines.ts"],"names":[],"mappings":"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","file":"chunk-WUKSKMYY.js","sourcesContent":["import { type IWorldOptions, World } from '@cucumber/cucumber';\nimport {\n type ExecutionContext,\n type TestProfile,\n createExecutionContext,\n resolveProfile,\n} from '@fabricorg/databricks-testkit';\nimport { type ScenarioAction, runAction as executeAction } from './actions.js';\nimport { type FixtureSetup, sharedFixtures } from './fixtures.js';\nimport type { StepOutputCapture } from './output-capture.js';\nimport { ScopedState, type StateScope, sharedState } from './scoped-state.js';\n\nexport interface DatabricksWorldParameters {\n /** Default schema for the execution context; overridable per scenario via the catalog/schema step. */\n schema?: string;\n /** Arbitrary typed runner configuration, comparable to behave `-D` userdata. */\n userdata?: Record<string, string | number | boolean>;\n}\n\ntype Cleanup = () => void | Promise<void>;\n\n/**\n * Cucumber World holding one ExecutionContext per scenario. The context is\n * created lazily on first use so `Given catalog ... and schema ...` can run\n * first; it is closed by the After hook registered in ./steps.ts.\n */\nexport class DatabricksWorld extends World<DatabricksWorldParameters> {\n readonly profile: TestProfile;\n /** Rows from the last `When I run the SQL` / `When I query table` step. */\n lastRows: Record<string, unknown>[] | null = null;\n /** Error captured from the last statement, for `Then the statement fails ...`. */\n lastError: Error | null = null;\n /** Terminal run record from the last `When I run job ...` step. */\n lastRun: Record<string, unknown> | null = null;\n /** Pipeline update handle from `When I start a full refresh of pipeline ...`. */\n lastPipelineUpdate: { pipelineId: string; updateId: string } | null = null;\n schemaOverride: string | undefined;\n catalogOverride: string | undefined;\n lastSql: string | undefined;\n lastStatementId: string | undefined;\n featureUri: string | undefined;\n scenarioName: string | undefined;\n effectiveTags: readonly string[] = [];\n stepOutputCapture: StepOutputCapture | undefined;\n lakebasePool:\n | { query<T extends Record<string, unknown>>(sql: string): Promise<{ rows: T[] }> }\n | undefined;\n private ctx: ExecutionContext | undefined;\n private activeCtx: ExecutionContext | undefined;\n private scopedState: ScopedState | undefined;\n private readonly cleanups: Cleanup[] = [];\n\n constructor(options: IWorldOptions<DatabricksWorldParameters>) {\n super(options);\n this.profile = resolveProfile();\n }\n\n async context(): Promise<ExecutionContext> {\n if (this.activeCtx) return this.activeCtx;\n if (!this.ctx) {\n const env = this.catalogOverride\n ? { ...process.env, DBX_TEST_CATALOG: this.catalogOverride }\n : process.env;\n this.ctx = await createExecutionContext({\n profile: this.profile,\n env,\n schema: this.schemaOverride ?? this.parameters.schema,\n onStatement: ({ sql, statementId }) => {\n this.lastSql = sql;\n this.lastStatementId = statementId;\n },\n });\n }\n return this.ctx;\n }\n\n /** Route subsequent steps through a scenario-owned secondary identity. */\n useExecutionContext(context: ExecutionContext): void {\n if (this.activeCtx) throw new Error('A secondary execution context is already active');\n this.activeCtx = context;\n this.addCleanup(async () => {\n await context.close();\n this.activeCtx = undefined;\n });\n }\n\n /** Register scenario-scoped cleanup. Cleanups run in reverse order. */\n addCleanup(cleanup: Cleanup): void {\n this.cleanups.push(cleanup);\n }\n\n /** Initialize Behave-style feature/scenario metadata and layered state. */\n initializeScenario(featureUri: string, scenarioName: string, tags: readonly string[]): void {\n this.featureUri = featureUri;\n this.scenarioName = scenarioName;\n this.effectiveTags = [...tags];\n this.scopedState = new ScopedState(sharedState.run(), sharedState.feature(featureUri));\n }\n\n /** Set typed state at run, feature, or scenario scope. */\n setState<T>(scope: StateScope, key: string, value: T): T {\n return this.state().set(scope, key, value);\n }\n\n /** Resolve state using scenario → feature → run precedence. */\n getState<T>(key: string): T | undefined {\n return this.state().get<T>(key);\n }\n\n /** Resolve required layered state or fail with a useful message. */\n requireState<T>(key: string): T {\n return this.state().require<T>(key);\n }\n\n /** Compose a reusable typed action without reparsing textual Gherkin. */\n runAction<Args extends readonly unknown[], Result>(\n action: ScenarioAction<Args, Result>,\n ...args: Args\n ): Promise<Awaited<Result>> {\n return executeAction(this, action, ...args);\n }\n\n /** Setup a resource once for this Cucumber run and clean it up in AfterAll. */\n runFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n return sharedFixtures.runFixture(key, setup);\n }\n\n /**\n * Setup a resource once per feature file. It is isolated by feature URI and\n * cleaned in AfterAll because cucumber-js has no reliable after-feature hook.\n */\n featureFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n if (!this.featureUri) {\n throw new Error('featureFixture is only available after the scenario Before hook');\n }\n return sharedFixtures.featureFixture(this.featureUri, key, setup);\n }\n\n /** Resolve runner userdata from worldParameters first, then DBX_TEST_USERDATA_* env. */\n userdata(name: string): string | number | boolean | undefined {\n const configured = this.parameters.userdata?.[name];\n if (configured !== undefined) return configured;\n return process.env[`DBX_TEST_USERDATA_${name.replace(/[^A-Za-z0-9]/g, '_').toUpperCase()}`];\n }\n\n scopeTo(catalog: string, schema: string): void {\n if (this.ctx) {\n throw new Error(\n 'Given catalog/schema must run before any step that touches the warehouse in the scenario',\n );\n }\n // Feature files stay portable and readable with illustrative names. A live\n // runner may redirect every scenario into its provisioned scratch scope.\n this.catalogOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_CATALOG ?? catalog) : catalog;\n this.schemaOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_SCHEMA ?? schema) : schema;\n }\n\n async dispose(): Promise<void> {\n this.stepOutputCapture?.stop();\n this.stepOutputCapture = undefined;\n const errors: unknown[] = [];\n for (const cleanup of this.cleanups.splice(0).reverse()) {\n try {\n await cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n try {\n await this.ctx?.close();\n } catch (error) {\n errors.push(error);\n }\n this.ctx = undefined;\n this.scopedState?.clearScenario();\n this.scopedState = undefined;\n if (errors.length > 0) throw new AggregateError(errors, 'Scenario cleanup failed');\n }\n\n private state(): ScopedState {\n if (!this.scopedState) {\n throw new Error('BDD scoped state is only available after the scenario Before hook');\n }\n return this.scopedState;\n }\n}\n","import type { TestProfile } from '@fabricorg/databricks-testkit';\n\n/**\n * Tags that require a live workspace (or a long budget). Scenarios carrying\n * any of them are skipped under the `local` profile — see ADR-0006.\n */\nexport const LIVE_ONLY_TAGS = [\n '@live',\n '@jobs',\n '@dlt',\n '@pipeline',\n '@autoloader',\n '@lakebase',\n '@slow',\n] as const;\n\n/** Returns a skip reason when the scenario cannot run under the given profile, else null. */\nexport function liveOnlyReason(tags: readonly string[], profile: TestProfile): string | null {\n if (profile === 'live') return null;\n const blocking = tags.filter((t) => (LIVE_ONLY_TAGS as readonly string[]).includes(t));\n if (blocking.length === 0) return null;\n return `requires a live workspace (${blocking.join(', ')}); running under DBX_TEST_PROFILE=local`;\n}\n\nexport type CapabilityValue = string | number | boolean;\nexport type CapabilityMap = Readonly<Record<string, CapabilityValue>>;\n\n/** Build the runtime capability map used by active-tag predicates. */\nexport function capabilitiesFromEnv(\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): CapabilityMap {\n const capabilities: Record<string, CapabilityValue> = { profile };\n const builtins: Array<[string, string | undefined]> = [\n ['cloud', env.DBX_TEST_CLOUD],\n ['compute', env.DBX_TEST_COMPUTE_MODE ?? env.DBX_TEST_COMPUTE],\n ['stage', env.DBX_TEST_STAGE],\n ];\n for (const [key, value] of builtins) {\n if (value !== undefined && value !== '') capabilities[key] = value;\n }\n for (const [name, value] of Object.entries(env)) {\n if (!name.startsWith('DBX_TEST_CAPABILITY_') || value === undefined) continue;\n capabilities[normalizeCapabilityKey(name.slice('DBX_TEST_CAPABILITY_'.length))] = value;\n }\n return capabilities;\n}\n\n/**\n * Evaluate TypeScript-native active tags.\n *\n * Supported forms:\n * - `@requires.cloud=azure` / `@requires.serverless`\n * - `@excludes.compute=classic`\n * - Behave-compatible aliases `@use.with_cloud=azure` and\n * `@not.with_cloud=azure`\n */\nexport function capabilityTagReason(\n tags: readonly string[],\n capabilities: CapabilityMap,\n): string | null {\n const normalized = new Map(\n Object.entries(capabilities).map(([key, value]) => [\n normalizeCapabilityKey(key),\n String(value).toLowerCase(),\n ]),\n );\n\n for (const tag of tags) {\n const predicate = parseCapabilityTag(tag);\n if (!predicate) continue;\n const actual = normalized.get(normalizeCapabilityKey(predicate.key));\n const matches = predicate.expected\n ? actual === predicate.expected.toLowerCase()\n : actual !== undefined && !['', '0', 'false', 'no', 'off'].includes(actual);\n if (predicate.kind === 'requires' && !matches) {\n return `${tag} requires capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}; actual ${actual ?? 'unset'}`;\n }\n if (predicate.kind === 'excludes' && matches) {\n return `${tag} excludes capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}`;\n }\n }\n return null;\n}\n\n/** Combined local/live and active-capability skip policy. */\nexport function scenarioSkipReason(\n tags: readonly string[],\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): string | null {\n return (\n liveOnlyReason(tags, profile) ?? capabilityTagReason(tags, capabilitiesFromEnv(profile, env))\n );\n}\n\nfunction parseCapabilityTag(\n tag: string,\n): { kind: 'requires' | 'excludes'; key: string; expected?: string } | undefined {\n const direct = tag.match(/^@(requires|excludes)\\.([^=]+)(?:=(.+))?$/i);\n if (direct?.[1] && direct[2]) {\n return {\n kind: direct[1].toLowerCase() as 'requires' | 'excludes',\n key: direct[2],\n ...(direct[3] ? { expected: direct[3] } : {}),\n };\n }\n const behave = tag.match(/^@(use|not)\\.with_([^=]+)=(.+)$/i);\n if (behave?.[1] && behave[2] && behave[3]) {\n return {\n kind: behave[1].toLowerCase() === 'use' ? 'requires' : 'excludes',\n key: behave[2],\n expected: behave[3],\n };\n }\n return undefined;\n}\n\nfunction normalizeCapabilityKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_');\n}\n","import type { TableFixture } from '@fabricorg/databricks-testkit';\n\nconst INT_RE = /^-?\\d+$/;\nconst FLOAT_RE = /^-?\\d+\\.\\d+$/;\nconst TIMESTAMP_RE = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(:\\d{2})?/;\nconst BOOL_RE = /^(true|false)$/i;\n\n/**\n * Turn a Gherkin data table (header row + string cells) into a TableFixture,\n * inferring portable column types from the values: BIGINT, DOUBLE,\n * TIMESTAMP, BOOLEAN, else STRING. Empty cells become NULL.\n */\nexport function inferFixture(table: string, raw: readonly (readonly string[])[]): TableFixture {\n if (raw.length < 2) {\n throw new Error(`Data table for ${table} needs a header row and at least one data row`);\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n const types = header.map((_, col) => inferColumnType(body.map((row) => row[col] ?? '')));\n const schema = header.map((name, i) => `\"${name}\" ${types[i]}`).join(', ');\n const rows = body.map((row) => row.map((cell, i) => coerceCell(cell, types[i] ?? 'STRING')));\n return { table, schema, rows };\n}\n\n/** Coerce data-table string cells to typed values for row matching (no header row). */\nexport function coerceMatchRows(raw: readonly (readonly string[])[]): Record<string, unknown>[] {\n if (raw.length < 2) {\n throw new Error('Match table needs a header row and at least one data row');\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n return body.map((row) => {\n const out: Record<string, unknown> = {};\n header.forEach((name, i) => {\n out[name] = coerceCell(row[i] ?? '', inferColumnType([row[i] ?? '']));\n });\n return out;\n });\n}\n\nfunction inferColumnType(cells: readonly string[]): string {\n const present = cells.filter((c) => c !== '');\n if (present.length === 0) return 'STRING';\n if (present.every((c) => INT_RE.test(c))) return 'BIGINT';\n if (present.every((c) => FLOAT_RE.test(c) || INT_RE.test(c))) return 'DOUBLE';\n if (present.every((c) => TIMESTAMP_RE.test(c))) return 'TIMESTAMP';\n if (present.every((c) => BOOL_RE.test(c))) return 'BOOLEAN';\n return 'STRING';\n}\n\nfunction coerceCell(cell: string, type: string): unknown {\n if (cell === '') return null;\n if (type === 'BIGINT' || type === 'DOUBLE') return Number(cell);\n if (type === 'BOOLEAN') return /^true$/i.test(cell);\n return cell;\n}\n","import { type WorkspaceClientLike, waitForDatabricksRun } from '@fabricorg/databricks-testkit';\n\nexport interface RunJobOptions {\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface JobRunResult {\n runId: number;\n lifeCycleState: string;\n resultState: string;\n run: Record<string, unknown>;\n}\n\n/** Resolve a job by numeric id or by exact name via /api/2.1/jobs/list. */\nexport async function resolveJobId(client: WorkspaceClientLike, nameOrId: string): Promise<number> {\n if (/^\\d+$/.test(nameOrId)) return Number(nameOrId);\n const response = await client.get<{ jobs?: { job_id: number; settings?: { name?: string } }[] }>(\n '/api/2.1/jobs/list',\n { name: nameOrId },\n );\n const match = (response.jobs ?? []).find((j) => j.settings?.name === nameOrId);\n if (!match) throw new Error(`No Databricks job named '${nameOrId}' found`);\n return match.job_id;\n}\n\n/** run-now a job and poll its run to a terminal state. */\nexport async function runJobToTerminal(\n client: WorkspaceClientLike,\n nameOrId: string,\n options: RunJobOptions = {},\n): Promise<JobRunResult> {\n const jobId = await resolveJobId(client, nameOrId);\n const submitted = await client.post<{ run_id: number }>('/api/2.1/jobs/run-now', {\n job_id: jobId,\n });\n const run = await waitForDatabricksRun(client, submitted.run_id, {\n pollIntervalMs: options.pollIntervalMs,\n timeoutMs: options.timeoutMs,\n });\n const state = (run as { state?: { life_cycle_state?: string; result_state?: string } }).state;\n return {\n runId: submitted.run_id,\n lifeCycleState: state?.life_cycle_state ?? 'UNKNOWN',\n resultState: state?.result_state ?? 'UNKNOWN',\n run,\n };\n}\n","import {\n type PollOptions,\n type WorkspaceClientLike,\n waitForPipelineUpdate,\n} from '@fabricorg/databricks-testkit';\n\nexport type PipelineWaitOptions = PollOptions;\n\n/** Resolve a DLT/Lakeflow pipeline by id or exact name via /api/2.0/pipelines. */\nexport async function resolvePipelineId(\n client: WorkspaceClientLike,\n nameOrId: string,\n): Promise<string> {\n if (/^[0-9a-f]{8}-[0-9a-f-]{27,}$/i.test(nameOrId)) return nameOrId;\n const response = await client.get<{ statuses?: { pipeline_id: string; name?: string }[] }>(\n '/api/2.0/pipelines',\n { filter: `name LIKE '${nameOrId}'` },\n );\n const match = (response.statuses ?? []).find((p) => p.name === nameOrId);\n if (!match) throw new Error(`No Databricks pipeline named '${nameOrId}' found`);\n return match.pipeline_id;\n}\n\n/** Start a pipeline update; returns the update id to poll. */\nexport async function startPipelineUpdate(\n client: WorkspaceClientLike,\n pipelineId: string,\n options: { fullRefresh?: boolean } = {},\n): Promise<string> {\n const response = await client.post<{ update_id: string }>(\n `/api/2.0/pipelines/${encodeURIComponent(pipelineId)}/updates`,\n { full_refresh: options.fullRefresh ?? false },\n );\n return response.update_id;\n}\n\n/** Poll an update to a terminal state; throws on timeout or non-COMPLETED terminal states. */\nexport { waitForPipelineUpdate };\n"]}
package/dist/index.cjs CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  var cucumber = require('@cucumber/cucumber');
4
4
  var databricksTestkit = require('@fabricorg/databricks-testkit');
5
- var databricks = require('@fabric-harness/databricks');
6
5
  var child_process = require('child_process');
7
6
  var module$1 = require('module');
8
7
  var path = require('path');
@@ -420,7 +419,7 @@ async function runJobToTerminal(client, nameOrId, options = {}) {
420
419
  const submitted = await client.post("/api/2.1/jobs/run-now", {
421
420
  job_id: jobId
422
421
  });
423
- const run = await databricks.waitForDatabricksRun(client, submitted.run_id, {
422
+ const run = await databricksTestkit.waitForDatabricksRun(client, submitted.run_id, {
424
423
  pollIntervalMs: options.pollIntervalMs,
425
424
  timeoutMs: options.timeoutMs
426
425
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/actions.ts","../src/fixtures.ts","../src/scoped-state.ts","../src/world.ts","../src/profile.ts","../src/infer.ts","../src/jobs.ts","../src/pipelines.ts","../src/run-features.ts","../src/parameter-types.ts","../src/evidence-formatter.ts","../src/output-capture.ts","../src/cardinality.ts"],"names":["World","resolveProfile","createExecutionContext","waitForDatabricksRun","require","createRequire","join","dirname","execFile","format"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DatabricksWorld } from './world.js';\n\n/**\n * A reusable, typed scenario action.\n *\n * Behave suites sometimes compose behavior with `context.execute_steps()`. In\n * TypeScript, composing ordinary functions preserves type checking, stack\n * traces, and direct unit-testability without reparsing Gherkin at runtime.\n */\nexport type ScenarioAction<Args extends readonly unknown[] = readonly unknown[], Result = void> = (\n world: DatabricksWorld,\n ...args: Args\n) => Result | Promise<Result>;\n\n/** Preserve inference while declaring a reusable scenario action. */\nexport function defineAction<Args extends readonly unknown[], Result>(\n action: ScenarioAction<Args, Result>,\n): ScenarioAction<Args, Result> {\n return action;\n}\n\n/** Execute a typed action against the current scenario World. */\nexport async function runAction<Args extends readonly unknown[], Result>(\n world: DatabricksWorld,\n action: ScenarioAction<Args, Result>,\n ...args: Args\n): Promise<Awaited<Result>> {\n return (await action(world, ...args)) as Awaited<Result>;\n}\n","/**\n * Behave-style shared fixtures for expensive Databricks resources.\n *\n * Cucumber Worlds are scenario-scoped. These registries provide the two\n * broader scopes users commonly need when migrating Behave suites:\n *\n * - runFixture: setup once for the entire Cucumber run;\n * - featureFixture: setup once per feature URI.\n *\n * Both scopes are drained by the package AfterAll hook. Deferring feature\n * cleanup until AfterAll is intentional: cucumber-js may interleave scenarios\n * and does not expose an after-feature hook. The resource is still isolated by\n * feature URI and is never reused by another feature.\n */\n\nexport type FixtureCleanup = () => void | Promise<void>;\nexport type FixtureSetup<T> = () =>\n | T\n | Promise<T>\n | { value: T; cleanup: FixtureCleanup }\n | Promise<{ value: T; cleanup: FixtureCleanup }>;\n\ninterface FixtureEntry<T = unknown> {\n value: Promise<T>;\n cleanup?: FixtureCleanup;\n}\n\nfunction isFixtureResult<T>(value: T | { value: T; cleanup: FixtureCleanup }): value is {\n value: T;\n cleanup: FixtureCleanup;\n} {\n return (\n typeof value === 'object' &&\n value !== null &&\n Object.prototype.hasOwnProperty.call(value, 'value') &&\n typeof (value as { cleanup?: unknown }).cleanup === 'function'\n );\n}\n\nexport class SharedFixtureRegistry {\n private readonly runEntries = new Map<string, FixtureEntry>();\n private readonly featureEntries = new Map<string, Map<string, FixtureEntry>>();\n private readonly cleanupOrder: FixtureEntry[] = [];\n\n runFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n return this.resolve(this.runEntries, key, setup);\n }\n\n featureFixture<T>(featureUri: string, key: string, setup: FixtureSetup<T>): Promise<T> {\n if (!featureUri) throw new Error('featureFixture requires a feature URI');\n let feature = this.featureEntries.get(featureUri);\n if (!feature) {\n feature = new Map();\n this.featureEntries.set(featureUri, feature);\n }\n return this.resolve(feature, key, setup);\n }\n\n private resolve<T>(entries: Map<string, FixtureEntry>, key: string, setup: FixtureSetup<T>) {\n if (!key.trim()) throw new Error('Fixture key must not be empty');\n const existing = entries.get(key);\n if (existing) return existing.value as Promise<T>;\n\n const entry: FixtureEntry<T> = {\n value: Promise.resolve()\n .then(setup)\n .then((result) => {\n if (isFixtureResult(result)) {\n entry.cleanup = result.cleanup;\n return result.value;\n }\n return result;\n })\n .catch((error) => {\n entries.delete(key);\n const index = this.cleanupOrder.indexOf(entry);\n if (index >= 0) this.cleanupOrder.splice(index, 1);\n throw error;\n }),\n };\n entries.set(key, entry);\n this.cleanupOrder.push(entry);\n return entry.value;\n }\n\n async dispose(): Promise<void> {\n const errors: unknown[] = [];\n for (const entry of this.cleanupOrder.splice(0).reverse()) {\n try {\n // Ensure setup has settled before attempting its cleanup.\n await entry.value.catch(() => undefined);\n await entry.cleanup?.();\n } catch (error) {\n errors.push(error);\n }\n }\n this.runEntries.clear();\n this.featureEntries.clear();\n if (errors.length > 0) throw new AggregateError(errors, 'Shared fixture cleanup failed');\n }\n}\n\nexport const sharedFixtures = new SharedFixtureRegistry();\n","export type StateScope = 'run' | 'feature' | 'scenario';\n\ntype StateValues = Map<string, unknown>;\n\n/**\n * Process-local state backing Behave-style run and feature context layers.\n * Scenario values stay on the scenario World and are never shared.\n */\nexport class SharedStateRegistry {\n private readonly runValues: StateValues = new Map();\n private readonly featureValues = new Map<string, StateValues>();\n\n run(): StateValues {\n return this.runValues;\n }\n\n feature(featureUri: string): StateValues {\n if (!featureUri) throw new Error('Feature state requires a feature URI');\n let values = this.featureValues.get(featureUri);\n if (!values) {\n values = new Map();\n this.featureValues.set(featureUri, values);\n }\n return values;\n }\n\n clear(): void {\n this.runValues.clear();\n this.featureValues.clear();\n }\n}\n\n/** Layered state lookup: scenario overrides feature, which overrides run. */\nexport class ScopedState {\n private readonly scenarioValues: StateValues = new Map();\n\n constructor(\n private readonly runValues: StateValues,\n private readonly featureValues: StateValues,\n ) {}\n\n set<T>(scope: StateScope, key: string, value: T): T {\n this.values(scope).set(validateKey(key), value);\n return value;\n }\n\n get<T>(key: string): T | undefined {\n const validKey = validateKey(key);\n if (this.scenarioValues.has(validKey)) return this.scenarioValues.get(validKey) as T;\n if (this.featureValues.has(validKey)) return this.featureValues.get(validKey) as T;\n return this.runValues.get(validKey) as T | undefined;\n }\n\n require<T>(key: string): T {\n const value = this.get<T>(key);\n if (value === undefined) throw new Error(`Required BDD state '${key}' is not set`);\n return value;\n }\n\n has(key: string): boolean {\n const validKey = validateKey(key);\n return (\n this.scenarioValues.has(validKey) ||\n this.featureValues.has(validKey) ||\n this.runValues.has(validKey)\n );\n }\n\n delete(scope: StateScope, key: string): boolean {\n return this.values(scope).delete(validateKey(key));\n }\n\n clearScenario(): void {\n this.scenarioValues.clear();\n }\n\n private values(scope: StateScope): StateValues {\n if (scope === 'run') return this.runValues;\n if (scope === 'feature') return this.featureValues;\n return this.scenarioValues;\n }\n}\n\nfunction validateKey(key: string): string {\n const trimmed = key.trim();\n if (!trimmed) throw new Error('BDD state key must not be empty');\n return trimmed;\n}\n\nexport const sharedState = new SharedStateRegistry();\n","import { type IWorldOptions, World } from '@cucumber/cucumber';\nimport {\n type ExecutionContext,\n type TestProfile,\n createExecutionContext,\n resolveProfile,\n} from '@fabricorg/databricks-testkit';\nimport { type ScenarioAction, runAction as executeAction } from './actions.js';\nimport { type FixtureSetup, sharedFixtures } from './fixtures.js';\nimport type { StepOutputCapture } from './output-capture.js';\nimport { ScopedState, type StateScope, sharedState } from './scoped-state.js';\n\nexport interface DatabricksWorldParameters {\n /** Default schema for the execution context; overridable per scenario via the catalog/schema step. */\n schema?: string;\n /** Arbitrary typed runner configuration, comparable to behave `-D` userdata. */\n userdata?: Record<string, string | number | boolean>;\n}\n\ntype Cleanup = () => void | Promise<void>;\n\n/**\n * Cucumber World holding one ExecutionContext per scenario. The context is\n * created lazily on first use so `Given catalog ... and schema ...` can run\n * first; it is closed by the After hook registered in ./steps.ts.\n */\nexport class DatabricksWorld extends World<DatabricksWorldParameters> {\n readonly profile: TestProfile;\n /** Rows from the last `When I run the SQL` / `When I query table` step. */\n lastRows: Record<string, unknown>[] | null = null;\n /** Error captured from the last statement, for `Then the statement fails ...`. */\n lastError: Error | null = null;\n /** Terminal run record from the last `When I run job ...` step. */\n lastRun: Record<string, unknown> | null = null;\n /** Pipeline update handle from `When I start a full refresh of pipeline ...`. */\n lastPipelineUpdate: { pipelineId: string; updateId: string } | null = null;\n schemaOverride: string | undefined;\n catalogOverride: string | undefined;\n lastSql: string | undefined;\n lastStatementId: string | undefined;\n featureUri: string | undefined;\n scenarioName: string | undefined;\n effectiveTags: readonly string[] = [];\n stepOutputCapture: StepOutputCapture | undefined;\n lakebasePool:\n | { query<T extends Record<string, unknown>>(sql: string): Promise<{ rows: T[] }> }\n | undefined;\n private ctx: ExecutionContext | undefined;\n private activeCtx: ExecutionContext | undefined;\n private scopedState: ScopedState | undefined;\n private readonly cleanups: Cleanup[] = [];\n\n constructor(options: IWorldOptions<DatabricksWorldParameters>) {\n super(options);\n this.profile = resolveProfile();\n }\n\n async context(): Promise<ExecutionContext> {\n if (this.activeCtx) return this.activeCtx;\n if (!this.ctx) {\n const env = this.catalogOverride\n ? { ...process.env, DBX_TEST_CATALOG: this.catalogOverride }\n : process.env;\n this.ctx = await createExecutionContext({\n profile: this.profile,\n env,\n schema: this.schemaOverride ?? this.parameters.schema,\n onStatement: ({ sql, statementId }) => {\n this.lastSql = sql;\n this.lastStatementId = statementId;\n },\n });\n }\n return this.ctx;\n }\n\n /** Route subsequent steps through a scenario-owned secondary identity. */\n useExecutionContext(context: ExecutionContext): void {\n if (this.activeCtx) throw new Error('A secondary execution context is already active');\n this.activeCtx = context;\n this.addCleanup(async () => {\n await context.close();\n this.activeCtx = undefined;\n });\n }\n\n /** Register scenario-scoped cleanup. Cleanups run in reverse order. */\n addCleanup(cleanup: Cleanup): void {\n this.cleanups.push(cleanup);\n }\n\n /** Initialize Behave-style feature/scenario metadata and layered state. */\n initializeScenario(featureUri: string, scenarioName: string, tags: readonly string[]): void {\n this.featureUri = featureUri;\n this.scenarioName = scenarioName;\n this.effectiveTags = [...tags];\n this.scopedState = new ScopedState(sharedState.run(), sharedState.feature(featureUri));\n }\n\n /** Set typed state at run, feature, or scenario scope. */\n setState<T>(scope: StateScope, key: string, value: T): T {\n return this.state().set(scope, key, value);\n }\n\n /** Resolve state using scenario → feature → run precedence. */\n getState<T>(key: string): T | undefined {\n return this.state().get<T>(key);\n }\n\n /** Resolve required layered state or fail with a useful message. */\n requireState<T>(key: string): T {\n return this.state().require<T>(key);\n }\n\n /** Compose a reusable typed action without reparsing textual Gherkin. */\n runAction<Args extends readonly unknown[], Result>(\n action: ScenarioAction<Args, Result>,\n ...args: Args\n ): Promise<Awaited<Result>> {\n return executeAction(this, action, ...args);\n }\n\n /** Setup a resource once for this Cucumber run and clean it up in AfterAll. */\n runFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n return sharedFixtures.runFixture(key, setup);\n }\n\n /**\n * Setup a resource once per feature file. It is isolated by feature URI and\n * cleaned in AfterAll because cucumber-js has no reliable after-feature hook.\n */\n featureFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n if (!this.featureUri) {\n throw new Error('featureFixture is only available after the scenario Before hook');\n }\n return sharedFixtures.featureFixture(this.featureUri, key, setup);\n }\n\n /** Resolve runner userdata from worldParameters first, then DBX_TEST_USERDATA_* env. */\n userdata(name: string): string | number | boolean | undefined {\n const configured = this.parameters.userdata?.[name];\n if (configured !== undefined) return configured;\n return process.env[`DBX_TEST_USERDATA_${name.replace(/[^A-Za-z0-9]/g, '_').toUpperCase()}`];\n }\n\n scopeTo(catalog: string, schema: string): void {\n if (this.ctx) {\n throw new Error(\n 'Given catalog/schema must run before any step that touches the warehouse in the scenario',\n );\n }\n // Feature files stay portable and readable with illustrative names. A live\n // runner may redirect every scenario into its provisioned scratch scope.\n this.catalogOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_CATALOG ?? catalog) : catalog;\n this.schemaOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_SCHEMA ?? schema) : schema;\n }\n\n async dispose(): Promise<void> {\n this.stepOutputCapture?.stop();\n this.stepOutputCapture = undefined;\n const errors: unknown[] = [];\n for (const cleanup of this.cleanups.splice(0).reverse()) {\n try {\n await cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n try {\n await this.ctx?.close();\n } catch (error) {\n errors.push(error);\n }\n this.ctx = undefined;\n this.scopedState?.clearScenario();\n this.scopedState = undefined;\n if (errors.length > 0) throw new AggregateError(errors, 'Scenario cleanup failed');\n }\n\n private state(): ScopedState {\n if (!this.scopedState) {\n throw new Error('BDD scoped state is only available after the scenario Before hook');\n }\n return this.scopedState;\n }\n}\n","import type { TestProfile } from '@fabricorg/databricks-testkit';\n\n/**\n * Tags that require a live workspace (or a long budget). Scenarios carrying\n * any of them are skipped under the `local` profile — see ADR-0006.\n */\nexport const LIVE_ONLY_TAGS = [\n '@live',\n '@jobs',\n '@dlt',\n '@pipeline',\n '@autoloader',\n '@lakebase',\n '@slow',\n] as const;\n\n/** Returns a skip reason when the scenario cannot run under the given profile, else null. */\nexport function liveOnlyReason(tags: readonly string[], profile: TestProfile): string | null {\n if (profile === 'live') return null;\n const blocking = tags.filter((t) => (LIVE_ONLY_TAGS as readonly string[]).includes(t));\n if (blocking.length === 0) return null;\n return `requires a live workspace (${blocking.join(', ')}); running under DBX_TEST_PROFILE=local`;\n}\n\nexport type CapabilityValue = string | number | boolean;\nexport type CapabilityMap = Readonly<Record<string, CapabilityValue>>;\n\n/** Build the runtime capability map used by active-tag predicates. */\nexport function capabilitiesFromEnv(\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): CapabilityMap {\n const capabilities: Record<string, CapabilityValue> = { profile };\n const builtins: Array<[string, string | undefined]> = [\n ['cloud', env.DBX_TEST_CLOUD],\n ['compute', env.DBX_TEST_COMPUTE_MODE ?? env.DBX_TEST_COMPUTE],\n ['stage', env.DBX_TEST_STAGE],\n ];\n for (const [key, value] of builtins) {\n if (value !== undefined && value !== '') capabilities[key] = value;\n }\n for (const [name, value] of Object.entries(env)) {\n if (!name.startsWith('DBX_TEST_CAPABILITY_') || value === undefined) continue;\n capabilities[normalizeCapabilityKey(name.slice('DBX_TEST_CAPABILITY_'.length))] = value;\n }\n return capabilities;\n}\n\n/**\n * Evaluate TypeScript-native active tags.\n *\n * Supported forms:\n * - `@requires.cloud=azure` / `@requires.serverless`\n * - `@excludes.compute=classic`\n * - Behave-compatible aliases `@use.with_cloud=azure` and\n * `@not.with_cloud=azure`\n */\nexport function capabilityTagReason(\n tags: readonly string[],\n capabilities: CapabilityMap,\n): string | null {\n const normalized = new Map(\n Object.entries(capabilities).map(([key, value]) => [\n normalizeCapabilityKey(key),\n String(value).toLowerCase(),\n ]),\n );\n\n for (const tag of tags) {\n const predicate = parseCapabilityTag(tag);\n if (!predicate) continue;\n const actual = normalized.get(normalizeCapabilityKey(predicate.key));\n const matches = predicate.expected\n ? actual === predicate.expected.toLowerCase()\n : actual !== undefined && !['', '0', 'false', 'no', 'off'].includes(actual);\n if (predicate.kind === 'requires' && !matches) {\n return `${tag} requires capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}; actual ${actual ?? 'unset'}`;\n }\n if (predicate.kind === 'excludes' && matches) {\n return `${tag} excludes capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}`;\n }\n }\n return null;\n}\n\n/** Combined local/live and active-capability skip policy. */\nexport function scenarioSkipReason(\n tags: readonly string[],\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): string | null {\n return (\n liveOnlyReason(tags, profile) ?? capabilityTagReason(tags, capabilitiesFromEnv(profile, env))\n );\n}\n\nfunction parseCapabilityTag(\n tag: string,\n): { kind: 'requires' | 'excludes'; key: string; expected?: string } | undefined {\n const direct = tag.match(/^@(requires|excludes)\\.([^=]+)(?:=(.+))?$/i);\n if (direct?.[1] && direct[2]) {\n return {\n kind: direct[1].toLowerCase() as 'requires' | 'excludes',\n key: direct[2],\n ...(direct[3] ? { expected: direct[3] } : {}),\n };\n }\n const behave = tag.match(/^@(use|not)\\.with_([^=]+)=(.+)$/i);\n if (behave?.[1] && behave[2] && behave[3]) {\n return {\n kind: behave[1].toLowerCase() === 'use' ? 'requires' : 'excludes',\n key: behave[2],\n expected: behave[3],\n };\n }\n return undefined;\n}\n\nfunction normalizeCapabilityKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_');\n}\n","import type { TableFixture } from '@fabricorg/databricks-testkit';\n\nconst INT_RE = /^-?\\d+$/;\nconst FLOAT_RE = /^-?\\d+\\.\\d+$/;\nconst TIMESTAMP_RE = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(:\\d{2})?/;\nconst BOOL_RE = /^(true|false)$/i;\n\n/**\n * Turn a Gherkin data table (header row + string cells) into a TableFixture,\n * inferring portable column types from the values: BIGINT, DOUBLE,\n * TIMESTAMP, BOOLEAN, else STRING. Empty cells become NULL.\n */\nexport function inferFixture(table: string, raw: readonly (readonly string[])[]): TableFixture {\n if (raw.length < 2) {\n throw new Error(`Data table for ${table} needs a header row and at least one data row`);\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n const types = header.map((_, col) => inferColumnType(body.map((row) => row[col] ?? '')));\n const schema = header.map((name, i) => `\"${name}\" ${types[i]}`).join(', ');\n const rows = body.map((row) => row.map((cell, i) => coerceCell(cell, types[i] ?? 'STRING')));\n return { table, schema, rows };\n}\n\n/** Coerce data-table string cells to typed values for row matching (no header row). */\nexport function coerceMatchRows(raw: readonly (readonly string[])[]): Record<string, unknown>[] {\n if (raw.length < 2) {\n throw new Error('Match table needs a header row and at least one data row');\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n return body.map((row) => {\n const out: Record<string, unknown> = {};\n header.forEach((name, i) => {\n out[name] = coerceCell(row[i] ?? '', inferColumnType([row[i] ?? '']));\n });\n return out;\n });\n}\n\nfunction inferColumnType(cells: readonly string[]): string {\n const present = cells.filter((c) => c !== '');\n if (present.length === 0) return 'STRING';\n if (present.every((c) => INT_RE.test(c))) return 'BIGINT';\n if (present.every((c) => FLOAT_RE.test(c) || INT_RE.test(c))) return 'DOUBLE';\n if (present.every((c) => TIMESTAMP_RE.test(c))) return 'TIMESTAMP';\n if (present.every((c) => BOOL_RE.test(c))) return 'BOOLEAN';\n return 'STRING';\n}\n\nfunction coerceCell(cell: string, type: string): unknown {\n if (cell === '') return null;\n if (type === 'BIGINT' || type === 'DOUBLE') return Number(cell);\n if (type === 'BOOLEAN') return /^true$/i.test(cell);\n return cell;\n}\n","import { type DatabricksRestClient, waitForDatabricksRun } from '@fabric-harness/databricks';\nimport type { WorkspaceClientLike } from '@fabricorg/databricks-testkit';\n\nexport interface RunJobOptions {\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface JobRunResult {\n runId: number;\n lifeCycleState: string;\n resultState: string;\n run: Record<string, unknown>;\n}\n\n/** Resolve a job by numeric id or by exact name via /api/2.1/jobs/list. */\nexport async function resolveJobId(client: WorkspaceClientLike, nameOrId: string): Promise<number> {\n if (/^\\d+$/.test(nameOrId)) return Number(nameOrId);\n const response = await client.get<{ jobs?: { job_id: number; settings?: { name?: string } }[] }>(\n '/api/2.1/jobs/list',\n { name: nameOrId },\n );\n const match = (response.jobs ?? []).find((j) => j.settings?.name === nameOrId);\n if (!match) throw new Error(`No Databricks job named '${nameOrId}' found`);\n return match.job_id;\n}\n\n/** run-now a job and poll its run to a terminal state. */\nexport async function runJobToTerminal(\n client: WorkspaceClientLike,\n nameOrId: string,\n options: RunJobOptions = {},\n): Promise<JobRunResult> {\n const jobId = await resolveJobId(client, nameOrId);\n const submitted = await client.post<{ run_id: number }>('/api/2.1/jobs/run-now', {\n job_id: jobId,\n });\n const run = await waitForDatabricksRun(client as DatabricksRestClient, submitted.run_id, {\n pollIntervalMs: options.pollIntervalMs,\n timeoutMs: options.timeoutMs,\n });\n const state = (run as { state?: { life_cycle_state?: string; result_state?: string } }).state;\n return {\n runId: submitted.run_id,\n lifeCycleState: state?.life_cycle_state ?? 'UNKNOWN',\n resultState: state?.result_state ?? 'UNKNOWN',\n run,\n };\n}\n","import {\n type PollOptions,\n type WorkspaceClientLike,\n waitForPipelineUpdate,\n} from '@fabricorg/databricks-testkit';\n\nexport type PipelineWaitOptions = PollOptions;\n\n/** Resolve a DLT/Lakeflow pipeline by id or exact name via /api/2.0/pipelines. */\nexport async function resolvePipelineId(\n client: WorkspaceClientLike,\n nameOrId: string,\n): Promise<string> {\n if (/^[0-9a-f]{8}-[0-9a-f-]{27,}$/i.test(nameOrId)) return nameOrId;\n const response = await client.get<{ statuses?: { pipeline_id: string; name?: string }[] }>(\n '/api/2.0/pipelines',\n { filter: `name LIKE '${nameOrId}'` },\n );\n const match = (response.statuses ?? []).find((p) => p.name === nameOrId);\n if (!match) throw new Error(`No Databricks pipeline named '${nameOrId}' found`);\n return match.pipeline_id;\n}\n\n/** Start a pipeline update; returns the update id to poll. */\nexport async function startPipelineUpdate(\n client: WorkspaceClientLike,\n pipelineId: string,\n options: { fullRefresh?: boolean } = {},\n): Promise<string> {\n const response = await client.post<{ update_id: string }>(\n `/api/2.0/pipelines/${encodeURIComponent(pipelineId)}/updates`,\n { full_refresh: options.fullRefresh ?? false },\n );\n return response.update_id;\n}\n\n/** Poll an update to a terminal state; throws on timeout or non-COMPLETED terminal states. */\nexport { waitForPipelineUpdate };\n","import { execFile } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\n\nexport interface RunFeaturesOptions {\n /** Directory containing the cucumber config / features. */\n cwd: string;\n /** Extra CLI args, e.g. ['--tags', 'not @slow'] or ['features/foo.feature']. */\n args?: string[];\n /** Extra environment (merged over process.env). */\n env?: Record<string, string>;\n /** Load TypeScript support code via tsx (default true). */\n tsx?: boolean;\n timeoutMs?: number;\n}\n\nexport interface RunFeaturesResult {\n success: boolean;\n exitCode: number;\n output: string;\n}\n\n/**\n * Vitest bridge: run cucumber-js as a subprocess so feature suites can be\n * embedded in an existing vitest run (one CI entry point) without fighting\n * over cucumber's global step registry or vitest's module transforms.\n */\nexport async function runFeatures(options: RunFeaturesOptions): Promise<RunFeaturesResult> {\n const require = createRequire(import.meta.url);\n // The bin path is not in the package's exports map — resolve it relative\n // to package.json (which is exported).\n const pkgPath = require.resolve('@cucumber/cucumber/package.json');\n const pkg = require(pkgPath) as { bin: Record<string, string> };\n const bin = join(dirname(pkgPath), pkg.bin['cucumber-js'] ?? 'bin/cucumber.js');\n const env: NodeJS.ProcessEnv = { ...process.env, ...options.env };\n if (options.tsx ?? true) {\n const tsxImport = '--import tsx';\n env.NODE_OPTIONS = env.NODE_OPTIONS ? `${env.NODE_OPTIONS} ${tsxImport}` : tsxImport;\n }\n return new Promise((resolve) => {\n execFile(\n process.execPath,\n [bin, ...(options.args ?? [])],\n { cwd: options.cwd, env, timeout: options.timeoutMs ?? 120_000, maxBuffer: 16 * 1024 * 1024 },\n (error, stdout, stderr) => {\n const exitCode =\n error && typeof (error as { code?: unknown }).code === 'number'\n ? ((error as { code?: number }).code ?? 1)\n : error\n ? 1\n : 0;\n resolve({ success: exitCode === 0, exitCode, output: `${stdout}\\n${stderr}` });\n },\n );\n });\n}\n","import { defineParameterType } from '@cucumber/cucumber';\n\nexport const RUN_STATES = ['SUCCESS', 'FAILED', 'CANCELED', 'TIMEDOUT'] as const;\nexport type RunState = (typeof RUN_STATES)[number];\n\nexport function parseDuration(value: string): number {\n const match = value.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*(milliseconds?|ms|seconds?|s|minutes?|m)$/i);\n if (!match) throw new Error(`Invalid duration '${value}'`);\n const amount = Number(match[1]);\n const unit = match[2]?.toLowerCase() ?? '';\n if (unit === 'ms' || unit.startsWith('millisecond')) return amount;\n if (unit === 's' || unit.startsWith('second')) return amount * 1_000;\n return amount * 60_000;\n}\n\nexport function parseTableIdentifier(value: string): string {\n const identifier = value.trim();\n const part = '(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)';\n if (!new RegExp(`^${part}(?:\\\\.${part}){0,2}$`).test(identifier)) {\n throw new Error(`Invalid 1-3 part table identifier '${value}'`);\n }\n return identifier;\n}\n\nexport function registerParameterTypes(): void {\n defineParameterType({\n name: 'runState',\n regexp: /SUCCESS|FAILED|CANCELED|TIMEDOUT/,\n transformer: (value: string): RunState => value as RunState,\n });\n\n defineParameterType({\n name: 'duration',\n regexp: /\\d+(?:\\.\\d+)?\\s*(?:milliseconds?|ms|seconds?|s|minutes?|m)/,\n transformer: parseDuration,\n });\n\n defineParameterType({\n name: 'table',\n regexp: /(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)(?:\\.(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)){0,2}/,\n transformer: parseTableIdentifier,\n });\n}\n","import { Formatter, type IFormatterOptions } from '@cucumber/cucumber';\n\n/**\n * Evidence formatter: schema-versioned, secret-redacted JSON summary of a\n * BDD run, shared in spirit with the live check runner's evidence output so\n * nightly runs double as audit artifacts. Wire it up in cucumber config:\n *\n * format: [['@fabricorg/databricks-bdd/evidence-formatter', 'reports/evidence.json']]\n */\nexport interface EvidenceScenario {\n name: string;\n uri: string;\n tags: string[];\n status: string;\n durationMs: number;\n error?: string;\n failures?: StepFailureEvidence[];\n}\n\nexport interface StepFailureEvidence {\n step: string;\n statementId?: string;\n sql?: string;\n output?: string;\n outputBytes?: number;\n outputTruncated?: boolean;\n}\n\nexport interface EvidenceReport {\n schemaVersion: 2;\n kind: 'databricks-bdd';\n profile: string;\n finishedAt: string;\n success: boolean;\n summary: Record<string, number>;\n scenarios: EvidenceScenario[];\n}\n\ninterface Envelope {\n attachment?: {\n body: string;\n contentEncoding: 'IDENTITY' | 'BASE64';\n mediaType: string;\n testCaseStartedId?: string;\n };\n pickle?: { id: string; name: string; uri: string; tags?: { name: string }[] };\n testCase?: { id: string; pickleId: string };\n testCaseStarted?: { id: string; testCaseId: string };\n testStepFinished?: {\n testCaseStartedId: string;\n testStepResult: {\n status: string;\n message?: string;\n duration?: { seconds: number; nanos: number };\n };\n };\n testRunFinished?: { success?: boolean; timestamp?: { seconds: number; nanos: number } };\n}\n\nexport const FAILURE_EVIDENCE_MEDIA_TYPE = 'application/vnd.fabric.databricks-bdd.failure+json';\n\nconst STATUS_RANK = ['UNKNOWN', 'PASSED', 'SKIPPED', 'PENDING', 'UNDEFINED', 'AMBIGUOUS', 'FAILED'];\n\nexport default class EvidenceFormatter extends Formatter {\n private readonly pickles = new Map<string, NonNullable<Envelope['pickle']>>();\n private readonly testCases = new Map<string, string>(); // testCaseId → pickleId\n private readonly attempts = new Map<\n string,\n {\n pickleId: string;\n status: string;\n durationMs: number;\n error?: string;\n failures: StepFailureEvidence[];\n }\n >();\n\n constructor(options: IFormatterOptions) {\n super(options);\n options.eventBroadcaster.on('envelope', (envelope: Envelope) => this.onEnvelope(envelope));\n }\n\n private onEnvelope(envelope: Envelope): void {\n if (envelope.pickle) this.pickles.set(envelope.pickle.id, envelope.pickle);\n if (envelope.testCase) this.testCases.set(envelope.testCase.id, envelope.testCase.pickleId);\n if (envelope.testCaseStarted) {\n this.attempts.set(envelope.testCaseStarted.id, {\n pickleId: this.testCases.get(envelope.testCaseStarted.testCaseId) ?? '',\n status: 'UNKNOWN',\n durationMs: 0,\n failures: [],\n });\n }\n if (envelope.attachment?.testCaseStartedId) {\n const attempt = this.attempts.get(envelope.attachment.testCaseStartedId);\n const failure = parseFailureEvidenceAttachment(envelope.attachment);\n if (attempt && failure) attempt.failures.push(failure);\n }\n if (envelope.testStepFinished) {\n const attempt = this.attempts.get(envelope.testStepFinished.testCaseStartedId);\n if (attempt) {\n const result = envelope.testStepFinished.testStepResult;\n if (STATUS_RANK.indexOf(result.status) > STATUS_RANK.indexOf(attempt.status)) {\n attempt.status = result.status;\n if (result.message) attempt.error = redactSecrets(result.message);\n }\n const d = result.duration;\n if (d) attempt.durationMs += d.seconds * 1000 + d.nanos / 1e6;\n }\n }\n if (envelope.testRunFinished) this.finish(envelope.testRunFinished);\n }\n\n private finish(finished: NonNullable<Envelope['testRunFinished']>): void {\n const scenarios: EvidenceScenario[] = [];\n const summary: Record<string, number> = {};\n for (const attempt of this.attempts.values()) {\n const pickle = this.pickles.get(attempt.pickleId);\n const status = attempt.status.toLowerCase();\n summary[status] = (summary[status] ?? 0) + 1;\n scenarios.push({\n name: pickle?.name ?? attempt.pickleId,\n uri: pickle?.uri ?? '',\n tags: (pickle?.tags ?? []).map((t) => t.name),\n status,\n durationMs: Math.round(attempt.durationMs),\n ...(attempt.error ? { error: attempt.error } : {}),\n ...(attempt.failures.length > 0 ? { failures: attempt.failures } : {}),\n });\n }\n const report: EvidenceReport = {\n schemaVersion: 2,\n kind: 'databricks-bdd',\n profile: process.env.DBX_TEST_PROFILE ?? 'local',\n finishedAt: new Date().toISOString(),\n success: finished.success ?? !scenarios.some((s) => s.status === 'failed'),\n summary,\n scenarios,\n };\n this.log(`${JSON.stringify(report, null, 2)}\\n`);\n }\n}\n\n/** Decode the structured attachment emitted by the failure hook. */\nexport function parseFailureEvidenceAttachment(\n attachment: NonNullable<Envelope['attachment']>,\n): StepFailureEvidence | null {\n if (attachment.mediaType !== FAILURE_EVIDENCE_MEDIA_TYPE) return null;\n try {\n const body =\n attachment.contentEncoding === 'BASE64'\n ? Buffer.from(attachment.body, 'base64').toString('utf8')\n : attachment.body;\n const parsed = JSON.parse(redactSecrets(body)) as Partial<StepFailureEvidence>;\n if (typeof parsed.step !== 'string') return null;\n return {\n step: parsed.step,\n ...(typeof parsed.statementId === 'string' ? { statementId: parsed.statementId } : {}),\n ...(typeof parsed.sql === 'string' ? { sql: parsed.sql } : {}),\n ...(typeof parsed.output === 'string' ? { output: parsed.output } : {}),\n ...(typeof parsed.outputBytes === 'number' ? { outputBytes: parsed.outputBytes } : {}),\n ...(typeof parsed.outputTruncated === 'boolean'\n ? { outputTruncated: parsed.outputTruncated }\n : {}),\n };\n } catch {\n return null;\n }\n}\n\nconst SECRET_ENV_RE = /(TOKEN|SECRET|PASSWORD|BEARER|KEY)/;\n\n/** Replace values of secret-looking env vars anywhere they appear in text. */\nexport function redactSecrets(\n text: string,\n env: Record<string, string | undefined> = process.env,\n): string {\n let out = text;\n for (const [name, value] of Object.entries(env)) {\n if (!value || value.length < 6) continue;\n if (!SECRET_ENV_RE.test(name)) continue;\n out = out.split(value).join('[REDACTED]');\n }\n return out;\n}\n","import type { Writable } from 'node:stream';\nimport { format } from 'node:util';\n\nexport type CapturedStream = 'stdout' | 'stderr';\n\nexport interface CapturedStepOutput {\n /** Ordered stdout/stderr output with stream labels. */\n text: string;\n /** True when output exceeded the configured byte budget. */\n truncated: boolean;\n /** Total bytes emitted before truncation. */\n totalBytes: number;\n}\n\nexport interface StepOutputCapture {\n stop(): CapturedStepOutput;\n}\n\nexport interface StepOutputCaptureOptions {\n /** Maximum UTF-8 bytes retained for one step. Defaults to 32 KiB. */\n maxBytes?: number;\n /** Forward output while capturing. Defaults to false, matching Behave capture semantics. */\n passthrough?: boolean;\n}\n\ninterface CapturedChunk {\n stream: CapturedStream;\n text: string;\n}\n\ntype Write = Writable['write'];\ntype ConsoleMethod = 'debug' | 'error' | 'info' | 'log' | 'warn';\n\nconst DEFAULT_MAX_BYTES = 32 * 1024;\n\n/**\n * Capture process stdout/stderr until stop() is called. Console output and\n * Pino's standard destination both flow through these streams. Child\n * processes that inherit the OS file descriptors directly are intentionally\n * outside this in-process capture boundary.\n */\nexport function startStepOutputCapture(options: StepOutputCaptureOptions = {}): StepOutputCapture {\n const maxBytes = Math.max(0, options.maxBytes ?? DEFAULT_MAX_BYTES);\n const stdout = process.stdout;\n const stderr = process.stderr;\n const originalStdoutWrite = stdout.write;\n const originalStderrWrite = stderr.write;\n const originalConsole = Object.fromEntries(\n (['debug', 'error', 'info', 'log', 'warn'] as const).map((method) => [method, console[method]]),\n ) as Record<ConsoleMethod, typeof console.log>;\n const chunks: CapturedChunk[] = [];\n let retainedBytes = 0;\n let totalBytes = 0;\n let stopped = false;\n\n const capture = (stream: CapturedStream, chunk: unknown): void => {\n const text = chunkToString(chunk);\n const bytes = Buffer.byteLength(text);\n totalBytes += bytes;\n const remaining = maxBytes - retainedBytes;\n if (remaining <= 0 || bytes === 0) return;\n const retained = bytes <= remaining ? text : truncateUtf8(text, remaining);\n retainedBytes += Buffer.byteLength(retained);\n if (retained) chunks.push({ stream, text: retained });\n };\n\n stdout.write = interceptedWrite(\n stdout,\n 'stdout',\n originalStdoutWrite,\n capture,\n options.passthrough,\n );\n stderr.write = interceptedWrite(\n stderr,\n 'stderr',\n originalStderrWrite,\n capture,\n options.passthrough,\n );\n if (!options.passthrough) {\n for (const method of ['debug', 'info', 'log'] as const) {\n console[method] = (...args: unknown[]) => capture('stdout', `${format(...args)}\\n`);\n }\n for (const method of ['error', 'warn'] as const) {\n console[method] = (...args: unknown[]) => capture('stderr', `${format(...args)}\\n`);\n }\n }\n\n return {\n stop(): CapturedStepOutput {\n if (!stopped) {\n stdout.write = originalStdoutWrite;\n stderr.write = originalStderrWrite;\n for (const method of Object.keys(originalConsole) as ConsoleMethod[]) {\n console[method] = originalConsole[method];\n }\n stopped = true;\n }\n return {\n text: renderChunks(chunks),\n truncated: totalBytes > retainedBytes,\n totalBytes,\n };\n },\n };\n}\n\nfunction interceptedWrite(\n destination: Writable,\n stream: CapturedStream,\n original: Write,\n capture: (stream: CapturedStream, chunk: unknown) => void,\n passthrough = false,\n): Write {\n return function write(chunk: unknown, encodingOrCallback?: unknown, callback?: unknown): boolean {\n capture(stream, chunk);\n if (passthrough) {\n return original.call(\n destination,\n chunk as never,\n encodingOrCallback as never,\n callback as never,\n );\n }\n const done = typeof encodingOrCallback === 'function' ? encodingOrCallback : callback;\n if (typeof done === 'function') queueMicrotask(() => done());\n return true;\n } as Write;\n}\n\nfunction chunkToString(chunk: unknown): string {\n if (typeof chunk === 'string') return chunk;\n if (Buffer.isBuffer(chunk)) return chunk.toString('utf8');\n if (chunk instanceof Uint8Array) return Buffer.from(chunk).toString('utf8');\n return String(chunk);\n}\n\nfunction truncateUtf8(value: string, maxBytes: number): string {\n return Buffer.from(value)\n .subarray(0, maxBytes)\n .toString('utf8')\n .replace(/\\uFFFD$/u, '');\n}\n\nfunction renderChunks(chunks: readonly CapturedChunk[]): string {\n let rendered = '';\n let previous: CapturedStream | undefined;\n for (const chunk of chunks) {\n if (chunk.stream !== previous) {\n if (rendered && !rendered.endsWith('\\n')) rendered += '\\n';\n rendered += `[${chunk.stream}]\\n`;\n previous = chunk.stream;\n }\n rendered += chunk.text;\n }\n return rendered.trimEnd();\n}\n","/** Cardinalities supported by Behave's cfparse fields. */\nexport type FieldCardinality = '?' | '*' | '+';\n\nexport interface CardinalityOptions {\n /** Delimiter between values. Defaults to a comma with optional whitespace. */\n separator?: string | RegExp;\n /** Human-readable field name used in validation errors. */\n fieldName?: string;\n}\n\nexport type CardinalityResult<T, C extends FieldCardinality> = C extends '?' ? T | undefined : T[];\n\n/**\n * Parse a Cucumber string parameter with cfparse-compatible cardinality.\n *\n * Use `?` for zero-or-one, `*` for zero-or-more, and `+` for one-or-more.\n * This keeps the capability in TypeScript while allowing standard Cucumber\n * Expressions and readable comma-separated parameters.\n */\nexport function parseCardinalityField<T, C extends FieldCardinality>(\n value: string,\n cardinality: C,\n transform: (item: string, index: number) => T,\n options: CardinalityOptions = {},\n): CardinalityResult<T, C> {\n const fieldName = options.fieldName ?? 'field';\n const trimmed = value.trim();\n const items = trimmed\n ? trimmed.split(options.separator ?? /\\s*,\\s*/).map((item) => item.trim())\n : [];\n if (items.some((item) => !item)) {\n throw new Error(`${fieldName} contains an empty value`);\n }\n\n if (cardinality === '?' && items.length > 1) {\n throw new Error(`${fieldName} expects zero or one value, received ${items.length}`);\n }\n if (cardinality === '+' && items.length === 0) {\n throw new Error(`${fieldName} expects one or more values`);\n }\n\n const parsed = items.map(transform);\n if (cardinality === '?') return parsed[0] as CardinalityResult<T, C>;\n return parsed as CardinalityResult<T, C>;\n}\n"]}
1
+ {"version":3,"sources":["../src/actions.ts","../src/fixtures.ts","../src/scoped-state.ts","../src/world.ts","../src/profile.ts","../src/infer.ts","../src/jobs.ts","../src/pipelines.ts","../src/run-features.ts","../src/parameter-types.ts","../src/evidence-formatter.ts","../src/output-capture.ts","../src/cardinality.ts"],"names":["World","resolveProfile","createExecutionContext","waitForDatabricksRun","require","createRequire","join","dirname","execFile","format"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DatabricksWorld } from './world.js';\n\n/**\n * A reusable, typed scenario action.\n *\n * Behave suites sometimes compose behavior with `context.execute_steps()`. In\n * TypeScript, composing ordinary functions preserves type checking, stack\n * traces, and direct unit-testability without reparsing Gherkin at runtime.\n */\nexport type ScenarioAction<Args extends readonly unknown[] = readonly unknown[], Result = void> = (\n world: DatabricksWorld,\n ...args: Args\n) => Result | Promise<Result>;\n\n/** Preserve inference while declaring a reusable scenario action. */\nexport function defineAction<Args extends readonly unknown[], Result>(\n action: ScenarioAction<Args, Result>,\n): ScenarioAction<Args, Result> {\n return action;\n}\n\n/** Execute a typed action against the current scenario World. */\nexport async function runAction<Args extends readonly unknown[], Result>(\n world: DatabricksWorld,\n action: ScenarioAction<Args, Result>,\n ...args: Args\n): Promise<Awaited<Result>> {\n return (await action(world, ...args)) as Awaited<Result>;\n}\n","/**\n * Behave-style shared fixtures for expensive Databricks resources.\n *\n * Cucumber Worlds are scenario-scoped. These registries provide the two\n * broader scopes users commonly need when migrating Behave suites:\n *\n * - runFixture: setup once for the entire Cucumber run;\n * - featureFixture: setup once per feature URI.\n *\n * Both scopes are drained by the package AfterAll hook. Deferring feature\n * cleanup until AfterAll is intentional: cucumber-js may interleave scenarios\n * and does not expose an after-feature hook. The resource is still isolated by\n * feature URI and is never reused by another feature.\n */\n\nexport type FixtureCleanup = () => void | Promise<void>;\nexport type FixtureSetup<T> = () =>\n | T\n | Promise<T>\n | { value: T; cleanup: FixtureCleanup }\n | Promise<{ value: T; cleanup: FixtureCleanup }>;\n\ninterface FixtureEntry<T = unknown> {\n value: Promise<T>;\n cleanup?: FixtureCleanup;\n}\n\nfunction isFixtureResult<T>(value: T | { value: T; cleanup: FixtureCleanup }): value is {\n value: T;\n cleanup: FixtureCleanup;\n} {\n return (\n typeof value === 'object' &&\n value !== null &&\n Object.prototype.hasOwnProperty.call(value, 'value') &&\n typeof (value as { cleanup?: unknown }).cleanup === 'function'\n );\n}\n\nexport class SharedFixtureRegistry {\n private readonly runEntries = new Map<string, FixtureEntry>();\n private readonly featureEntries = new Map<string, Map<string, FixtureEntry>>();\n private readonly cleanupOrder: FixtureEntry[] = [];\n\n runFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n return this.resolve(this.runEntries, key, setup);\n }\n\n featureFixture<T>(featureUri: string, key: string, setup: FixtureSetup<T>): Promise<T> {\n if (!featureUri) throw new Error('featureFixture requires a feature URI');\n let feature = this.featureEntries.get(featureUri);\n if (!feature) {\n feature = new Map();\n this.featureEntries.set(featureUri, feature);\n }\n return this.resolve(feature, key, setup);\n }\n\n private resolve<T>(entries: Map<string, FixtureEntry>, key: string, setup: FixtureSetup<T>) {\n if (!key.trim()) throw new Error('Fixture key must not be empty');\n const existing = entries.get(key);\n if (existing) return existing.value as Promise<T>;\n\n const entry: FixtureEntry<T> = {\n value: Promise.resolve()\n .then(setup)\n .then((result) => {\n if (isFixtureResult(result)) {\n entry.cleanup = result.cleanup;\n return result.value;\n }\n return result;\n })\n .catch((error) => {\n entries.delete(key);\n const index = this.cleanupOrder.indexOf(entry);\n if (index >= 0) this.cleanupOrder.splice(index, 1);\n throw error;\n }),\n };\n entries.set(key, entry);\n this.cleanupOrder.push(entry);\n return entry.value;\n }\n\n async dispose(): Promise<void> {\n const errors: unknown[] = [];\n for (const entry of this.cleanupOrder.splice(0).reverse()) {\n try {\n // Ensure setup has settled before attempting its cleanup.\n await entry.value.catch(() => undefined);\n await entry.cleanup?.();\n } catch (error) {\n errors.push(error);\n }\n }\n this.runEntries.clear();\n this.featureEntries.clear();\n if (errors.length > 0) throw new AggregateError(errors, 'Shared fixture cleanup failed');\n }\n}\n\nexport const sharedFixtures = new SharedFixtureRegistry();\n","export type StateScope = 'run' | 'feature' | 'scenario';\n\ntype StateValues = Map<string, unknown>;\n\n/**\n * Process-local state backing Behave-style run and feature context layers.\n * Scenario values stay on the scenario World and are never shared.\n */\nexport class SharedStateRegistry {\n private readonly runValues: StateValues = new Map();\n private readonly featureValues = new Map<string, StateValues>();\n\n run(): StateValues {\n return this.runValues;\n }\n\n feature(featureUri: string): StateValues {\n if (!featureUri) throw new Error('Feature state requires a feature URI');\n let values = this.featureValues.get(featureUri);\n if (!values) {\n values = new Map();\n this.featureValues.set(featureUri, values);\n }\n return values;\n }\n\n clear(): void {\n this.runValues.clear();\n this.featureValues.clear();\n }\n}\n\n/** Layered state lookup: scenario overrides feature, which overrides run. */\nexport class ScopedState {\n private readonly scenarioValues: StateValues = new Map();\n\n constructor(\n private readonly runValues: StateValues,\n private readonly featureValues: StateValues,\n ) {}\n\n set<T>(scope: StateScope, key: string, value: T): T {\n this.values(scope).set(validateKey(key), value);\n return value;\n }\n\n get<T>(key: string): T | undefined {\n const validKey = validateKey(key);\n if (this.scenarioValues.has(validKey)) return this.scenarioValues.get(validKey) as T;\n if (this.featureValues.has(validKey)) return this.featureValues.get(validKey) as T;\n return this.runValues.get(validKey) as T | undefined;\n }\n\n require<T>(key: string): T {\n const value = this.get<T>(key);\n if (value === undefined) throw new Error(`Required BDD state '${key}' is not set`);\n return value;\n }\n\n has(key: string): boolean {\n const validKey = validateKey(key);\n return (\n this.scenarioValues.has(validKey) ||\n this.featureValues.has(validKey) ||\n this.runValues.has(validKey)\n );\n }\n\n delete(scope: StateScope, key: string): boolean {\n return this.values(scope).delete(validateKey(key));\n }\n\n clearScenario(): void {\n this.scenarioValues.clear();\n }\n\n private values(scope: StateScope): StateValues {\n if (scope === 'run') return this.runValues;\n if (scope === 'feature') return this.featureValues;\n return this.scenarioValues;\n }\n}\n\nfunction validateKey(key: string): string {\n const trimmed = key.trim();\n if (!trimmed) throw new Error('BDD state key must not be empty');\n return trimmed;\n}\n\nexport const sharedState = new SharedStateRegistry();\n","import { type IWorldOptions, World } from '@cucumber/cucumber';\nimport {\n type ExecutionContext,\n type TestProfile,\n createExecutionContext,\n resolveProfile,\n} from '@fabricorg/databricks-testkit';\nimport { type ScenarioAction, runAction as executeAction } from './actions.js';\nimport { type FixtureSetup, sharedFixtures } from './fixtures.js';\nimport type { StepOutputCapture } from './output-capture.js';\nimport { ScopedState, type StateScope, sharedState } from './scoped-state.js';\n\nexport interface DatabricksWorldParameters {\n /** Default schema for the execution context; overridable per scenario via the catalog/schema step. */\n schema?: string;\n /** Arbitrary typed runner configuration, comparable to behave `-D` userdata. */\n userdata?: Record<string, string | number | boolean>;\n}\n\ntype Cleanup = () => void | Promise<void>;\n\n/**\n * Cucumber World holding one ExecutionContext per scenario. The context is\n * created lazily on first use so `Given catalog ... and schema ...` can run\n * first; it is closed by the After hook registered in ./steps.ts.\n */\nexport class DatabricksWorld extends World<DatabricksWorldParameters> {\n readonly profile: TestProfile;\n /** Rows from the last `When I run the SQL` / `When I query table` step. */\n lastRows: Record<string, unknown>[] | null = null;\n /** Error captured from the last statement, for `Then the statement fails ...`. */\n lastError: Error | null = null;\n /** Terminal run record from the last `When I run job ...` step. */\n lastRun: Record<string, unknown> | null = null;\n /** Pipeline update handle from `When I start a full refresh of pipeline ...`. */\n lastPipelineUpdate: { pipelineId: string; updateId: string } | null = null;\n schemaOverride: string | undefined;\n catalogOverride: string | undefined;\n lastSql: string | undefined;\n lastStatementId: string | undefined;\n featureUri: string | undefined;\n scenarioName: string | undefined;\n effectiveTags: readonly string[] = [];\n stepOutputCapture: StepOutputCapture | undefined;\n lakebasePool:\n | { query<T extends Record<string, unknown>>(sql: string): Promise<{ rows: T[] }> }\n | undefined;\n private ctx: ExecutionContext | undefined;\n private activeCtx: ExecutionContext | undefined;\n private scopedState: ScopedState | undefined;\n private readonly cleanups: Cleanup[] = [];\n\n constructor(options: IWorldOptions<DatabricksWorldParameters>) {\n super(options);\n this.profile = resolveProfile();\n }\n\n async context(): Promise<ExecutionContext> {\n if (this.activeCtx) return this.activeCtx;\n if (!this.ctx) {\n const env = this.catalogOverride\n ? { ...process.env, DBX_TEST_CATALOG: this.catalogOverride }\n : process.env;\n this.ctx = await createExecutionContext({\n profile: this.profile,\n env,\n schema: this.schemaOverride ?? this.parameters.schema,\n onStatement: ({ sql, statementId }) => {\n this.lastSql = sql;\n this.lastStatementId = statementId;\n },\n });\n }\n return this.ctx;\n }\n\n /** Route subsequent steps through a scenario-owned secondary identity. */\n useExecutionContext(context: ExecutionContext): void {\n if (this.activeCtx) throw new Error('A secondary execution context is already active');\n this.activeCtx = context;\n this.addCleanup(async () => {\n await context.close();\n this.activeCtx = undefined;\n });\n }\n\n /** Register scenario-scoped cleanup. Cleanups run in reverse order. */\n addCleanup(cleanup: Cleanup): void {\n this.cleanups.push(cleanup);\n }\n\n /** Initialize Behave-style feature/scenario metadata and layered state. */\n initializeScenario(featureUri: string, scenarioName: string, tags: readonly string[]): void {\n this.featureUri = featureUri;\n this.scenarioName = scenarioName;\n this.effectiveTags = [...tags];\n this.scopedState = new ScopedState(sharedState.run(), sharedState.feature(featureUri));\n }\n\n /** Set typed state at run, feature, or scenario scope. */\n setState<T>(scope: StateScope, key: string, value: T): T {\n return this.state().set(scope, key, value);\n }\n\n /** Resolve state using scenario → feature → run precedence. */\n getState<T>(key: string): T | undefined {\n return this.state().get<T>(key);\n }\n\n /** Resolve required layered state or fail with a useful message. */\n requireState<T>(key: string): T {\n return this.state().require<T>(key);\n }\n\n /** Compose a reusable typed action without reparsing textual Gherkin. */\n runAction<Args extends readonly unknown[], Result>(\n action: ScenarioAction<Args, Result>,\n ...args: Args\n ): Promise<Awaited<Result>> {\n return executeAction(this, action, ...args);\n }\n\n /** Setup a resource once for this Cucumber run and clean it up in AfterAll. */\n runFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n return sharedFixtures.runFixture(key, setup);\n }\n\n /**\n * Setup a resource once per feature file. It is isolated by feature URI and\n * cleaned in AfterAll because cucumber-js has no reliable after-feature hook.\n */\n featureFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n if (!this.featureUri) {\n throw new Error('featureFixture is only available after the scenario Before hook');\n }\n return sharedFixtures.featureFixture(this.featureUri, key, setup);\n }\n\n /** Resolve runner userdata from worldParameters first, then DBX_TEST_USERDATA_* env. */\n userdata(name: string): string | number | boolean | undefined {\n const configured = this.parameters.userdata?.[name];\n if (configured !== undefined) return configured;\n return process.env[`DBX_TEST_USERDATA_${name.replace(/[^A-Za-z0-9]/g, '_').toUpperCase()}`];\n }\n\n scopeTo(catalog: string, schema: string): void {\n if (this.ctx) {\n throw new Error(\n 'Given catalog/schema must run before any step that touches the warehouse in the scenario',\n );\n }\n // Feature files stay portable and readable with illustrative names. A live\n // runner may redirect every scenario into its provisioned scratch scope.\n this.catalogOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_CATALOG ?? catalog) : catalog;\n this.schemaOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_SCHEMA ?? schema) : schema;\n }\n\n async dispose(): Promise<void> {\n this.stepOutputCapture?.stop();\n this.stepOutputCapture = undefined;\n const errors: unknown[] = [];\n for (const cleanup of this.cleanups.splice(0).reverse()) {\n try {\n await cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n try {\n await this.ctx?.close();\n } catch (error) {\n errors.push(error);\n }\n this.ctx = undefined;\n this.scopedState?.clearScenario();\n this.scopedState = undefined;\n if (errors.length > 0) throw new AggregateError(errors, 'Scenario cleanup failed');\n }\n\n private state(): ScopedState {\n if (!this.scopedState) {\n throw new Error('BDD scoped state is only available after the scenario Before hook');\n }\n return this.scopedState;\n }\n}\n","import type { TestProfile } from '@fabricorg/databricks-testkit';\n\n/**\n * Tags that require a live workspace (or a long budget). Scenarios carrying\n * any of them are skipped under the `local` profile — see ADR-0006.\n */\nexport const LIVE_ONLY_TAGS = [\n '@live',\n '@jobs',\n '@dlt',\n '@pipeline',\n '@autoloader',\n '@lakebase',\n '@slow',\n] as const;\n\n/** Returns a skip reason when the scenario cannot run under the given profile, else null. */\nexport function liveOnlyReason(tags: readonly string[], profile: TestProfile): string | null {\n if (profile === 'live') return null;\n const blocking = tags.filter((t) => (LIVE_ONLY_TAGS as readonly string[]).includes(t));\n if (blocking.length === 0) return null;\n return `requires a live workspace (${blocking.join(', ')}); running under DBX_TEST_PROFILE=local`;\n}\n\nexport type CapabilityValue = string | number | boolean;\nexport type CapabilityMap = Readonly<Record<string, CapabilityValue>>;\n\n/** Build the runtime capability map used by active-tag predicates. */\nexport function capabilitiesFromEnv(\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): CapabilityMap {\n const capabilities: Record<string, CapabilityValue> = { profile };\n const builtins: Array<[string, string | undefined]> = [\n ['cloud', env.DBX_TEST_CLOUD],\n ['compute', env.DBX_TEST_COMPUTE_MODE ?? env.DBX_TEST_COMPUTE],\n ['stage', env.DBX_TEST_STAGE],\n ];\n for (const [key, value] of builtins) {\n if (value !== undefined && value !== '') capabilities[key] = value;\n }\n for (const [name, value] of Object.entries(env)) {\n if (!name.startsWith('DBX_TEST_CAPABILITY_') || value === undefined) continue;\n capabilities[normalizeCapabilityKey(name.slice('DBX_TEST_CAPABILITY_'.length))] = value;\n }\n return capabilities;\n}\n\n/**\n * Evaluate TypeScript-native active tags.\n *\n * Supported forms:\n * - `@requires.cloud=azure` / `@requires.serverless`\n * - `@excludes.compute=classic`\n * - Behave-compatible aliases `@use.with_cloud=azure` and\n * `@not.with_cloud=azure`\n */\nexport function capabilityTagReason(\n tags: readonly string[],\n capabilities: CapabilityMap,\n): string | null {\n const normalized = new Map(\n Object.entries(capabilities).map(([key, value]) => [\n normalizeCapabilityKey(key),\n String(value).toLowerCase(),\n ]),\n );\n\n for (const tag of tags) {\n const predicate = parseCapabilityTag(tag);\n if (!predicate) continue;\n const actual = normalized.get(normalizeCapabilityKey(predicate.key));\n const matches = predicate.expected\n ? actual === predicate.expected.toLowerCase()\n : actual !== undefined && !['', '0', 'false', 'no', 'off'].includes(actual);\n if (predicate.kind === 'requires' && !matches) {\n return `${tag} requires capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}; actual ${actual ?? 'unset'}`;\n }\n if (predicate.kind === 'excludes' && matches) {\n return `${tag} excludes capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}`;\n }\n }\n return null;\n}\n\n/** Combined local/live and active-capability skip policy. */\nexport function scenarioSkipReason(\n tags: readonly string[],\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): string | null {\n return (\n liveOnlyReason(tags, profile) ?? capabilityTagReason(tags, capabilitiesFromEnv(profile, env))\n );\n}\n\nfunction parseCapabilityTag(\n tag: string,\n): { kind: 'requires' | 'excludes'; key: string; expected?: string } | undefined {\n const direct = tag.match(/^@(requires|excludes)\\.([^=]+)(?:=(.+))?$/i);\n if (direct?.[1] && direct[2]) {\n return {\n kind: direct[1].toLowerCase() as 'requires' | 'excludes',\n key: direct[2],\n ...(direct[3] ? { expected: direct[3] } : {}),\n };\n }\n const behave = tag.match(/^@(use|not)\\.with_([^=]+)=(.+)$/i);\n if (behave?.[1] && behave[2] && behave[3]) {\n return {\n kind: behave[1].toLowerCase() === 'use' ? 'requires' : 'excludes',\n key: behave[2],\n expected: behave[3],\n };\n }\n return undefined;\n}\n\nfunction normalizeCapabilityKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_');\n}\n","import type { TableFixture } from '@fabricorg/databricks-testkit';\n\nconst INT_RE = /^-?\\d+$/;\nconst FLOAT_RE = /^-?\\d+\\.\\d+$/;\nconst TIMESTAMP_RE = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(:\\d{2})?/;\nconst BOOL_RE = /^(true|false)$/i;\n\n/**\n * Turn a Gherkin data table (header row + string cells) into a TableFixture,\n * inferring portable column types from the values: BIGINT, DOUBLE,\n * TIMESTAMP, BOOLEAN, else STRING. Empty cells become NULL.\n */\nexport function inferFixture(table: string, raw: readonly (readonly string[])[]): TableFixture {\n if (raw.length < 2) {\n throw new Error(`Data table for ${table} needs a header row and at least one data row`);\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n const types = header.map((_, col) => inferColumnType(body.map((row) => row[col] ?? '')));\n const schema = header.map((name, i) => `\"${name}\" ${types[i]}`).join(', ');\n const rows = body.map((row) => row.map((cell, i) => coerceCell(cell, types[i] ?? 'STRING')));\n return { table, schema, rows };\n}\n\n/** Coerce data-table string cells to typed values for row matching (no header row). */\nexport function coerceMatchRows(raw: readonly (readonly string[])[]): Record<string, unknown>[] {\n if (raw.length < 2) {\n throw new Error('Match table needs a header row and at least one data row');\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n return body.map((row) => {\n const out: Record<string, unknown> = {};\n header.forEach((name, i) => {\n out[name] = coerceCell(row[i] ?? '', inferColumnType([row[i] ?? '']));\n });\n return out;\n });\n}\n\nfunction inferColumnType(cells: readonly string[]): string {\n const present = cells.filter((c) => c !== '');\n if (present.length === 0) return 'STRING';\n if (present.every((c) => INT_RE.test(c))) return 'BIGINT';\n if (present.every((c) => FLOAT_RE.test(c) || INT_RE.test(c))) return 'DOUBLE';\n if (present.every((c) => TIMESTAMP_RE.test(c))) return 'TIMESTAMP';\n if (present.every((c) => BOOL_RE.test(c))) return 'BOOLEAN';\n return 'STRING';\n}\n\nfunction coerceCell(cell: string, type: string): unknown {\n if (cell === '') return null;\n if (type === 'BIGINT' || type === 'DOUBLE') return Number(cell);\n if (type === 'BOOLEAN') return /^true$/i.test(cell);\n return cell;\n}\n","import { type WorkspaceClientLike, waitForDatabricksRun } from '@fabricorg/databricks-testkit';\n\nexport interface RunJobOptions {\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface JobRunResult {\n runId: number;\n lifeCycleState: string;\n resultState: string;\n run: Record<string, unknown>;\n}\n\n/** Resolve a job by numeric id or by exact name via /api/2.1/jobs/list. */\nexport async function resolveJobId(client: WorkspaceClientLike, nameOrId: string): Promise<number> {\n if (/^\\d+$/.test(nameOrId)) return Number(nameOrId);\n const response = await client.get<{ jobs?: { job_id: number; settings?: { name?: string } }[] }>(\n '/api/2.1/jobs/list',\n { name: nameOrId },\n );\n const match = (response.jobs ?? []).find((j) => j.settings?.name === nameOrId);\n if (!match) throw new Error(`No Databricks job named '${nameOrId}' found`);\n return match.job_id;\n}\n\n/** run-now a job and poll its run to a terminal state. */\nexport async function runJobToTerminal(\n client: WorkspaceClientLike,\n nameOrId: string,\n options: RunJobOptions = {},\n): Promise<JobRunResult> {\n const jobId = await resolveJobId(client, nameOrId);\n const submitted = await client.post<{ run_id: number }>('/api/2.1/jobs/run-now', {\n job_id: jobId,\n });\n const run = await waitForDatabricksRun(client, submitted.run_id, {\n pollIntervalMs: options.pollIntervalMs,\n timeoutMs: options.timeoutMs,\n });\n const state = (run as { state?: { life_cycle_state?: string; result_state?: string } }).state;\n return {\n runId: submitted.run_id,\n lifeCycleState: state?.life_cycle_state ?? 'UNKNOWN',\n resultState: state?.result_state ?? 'UNKNOWN',\n run,\n };\n}\n","import {\n type PollOptions,\n type WorkspaceClientLike,\n waitForPipelineUpdate,\n} from '@fabricorg/databricks-testkit';\n\nexport type PipelineWaitOptions = PollOptions;\n\n/** Resolve a DLT/Lakeflow pipeline by id or exact name via /api/2.0/pipelines. */\nexport async function resolvePipelineId(\n client: WorkspaceClientLike,\n nameOrId: string,\n): Promise<string> {\n if (/^[0-9a-f]{8}-[0-9a-f-]{27,}$/i.test(nameOrId)) return nameOrId;\n const response = await client.get<{ statuses?: { pipeline_id: string; name?: string }[] }>(\n '/api/2.0/pipelines',\n { filter: `name LIKE '${nameOrId}'` },\n );\n const match = (response.statuses ?? []).find((p) => p.name === nameOrId);\n if (!match) throw new Error(`No Databricks pipeline named '${nameOrId}' found`);\n return match.pipeline_id;\n}\n\n/** Start a pipeline update; returns the update id to poll. */\nexport async function startPipelineUpdate(\n client: WorkspaceClientLike,\n pipelineId: string,\n options: { fullRefresh?: boolean } = {},\n): Promise<string> {\n const response = await client.post<{ update_id: string }>(\n `/api/2.0/pipelines/${encodeURIComponent(pipelineId)}/updates`,\n { full_refresh: options.fullRefresh ?? false },\n );\n return response.update_id;\n}\n\n/** Poll an update to a terminal state; throws on timeout or non-COMPLETED terminal states. */\nexport { waitForPipelineUpdate };\n","import { execFile } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\n\nexport interface RunFeaturesOptions {\n /** Directory containing the cucumber config / features. */\n cwd: string;\n /** Extra CLI args, e.g. ['--tags', 'not @slow'] or ['features/foo.feature']. */\n args?: string[];\n /** Extra environment (merged over process.env). */\n env?: Record<string, string>;\n /** Load TypeScript support code via tsx (default true). */\n tsx?: boolean;\n timeoutMs?: number;\n}\n\nexport interface RunFeaturesResult {\n success: boolean;\n exitCode: number;\n output: string;\n}\n\n/**\n * Vitest bridge: run cucumber-js as a subprocess so feature suites can be\n * embedded in an existing vitest run (one CI entry point) without fighting\n * over cucumber's global step registry or vitest's module transforms.\n */\nexport async function runFeatures(options: RunFeaturesOptions): Promise<RunFeaturesResult> {\n const require = createRequire(import.meta.url);\n // The bin path is not in the package's exports map — resolve it relative\n // to package.json (which is exported).\n const pkgPath = require.resolve('@cucumber/cucumber/package.json');\n const pkg = require(pkgPath) as { bin: Record<string, string> };\n const bin = join(dirname(pkgPath), pkg.bin['cucumber-js'] ?? 'bin/cucumber.js');\n const env: NodeJS.ProcessEnv = { ...process.env, ...options.env };\n if (options.tsx ?? true) {\n const tsxImport = '--import tsx';\n env.NODE_OPTIONS = env.NODE_OPTIONS ? `${env.NODE_OPTIONS} ${tsxImport}` : tsxImport;\n }\n return new Promise((resolve) => {\n execFile(\n process.execPath,\n [bin, ...(options.args ?? [])],\n { cwd: options.cwd, env, timeout: options.timeoutMs ?? 120_000, maxBuffer: 16 * 1024 * 1024 },\n (error, stdout, stderr) => {\n const exitCode =\n error && typeof (error as { code?: unknown }).code === 'number'\n ? ((error as { code?: number }).code ?? 1)\n : error\n ? 1\n : 0;\n resolve({ success: exitCode === 0, exitCode, output: `${stdout}\\n${stderr}` });\n },\n );\n });\n}\n","import { defineParameterType } from '@cucumber/cucumber';\n\nexport const RUN_STATES = ['SUCCESS', 'FAILED', 'CANCELED', 'TIMEDOUT'] as const;\nexport type RunState = (typeof RUN_STATES)[number];\n\nexport function parseDuration(value: string): number {\n const match = value.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*(milliseconds?|ms|seconds?|s|minutes?|m)$/i);\n if (!match) throw new Error(`Invalid duration '${value}'`);\n const amount = Number(match[1]);\n const unit = match[2]?.toLowerCase() ?? '';\n if (unit === 'ms' || unit.startsWith('millisecond')) return amount;\n if (unit === 's' || unit.startsWith('second')) return amount * 1_000;\n return amount * 60_000;\n}\n\nexport function parseTableIdentifier(value: string): string {\n const identifier = value.trim();\n const part = '(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)';\n if (!new RegExp(`^${part}(?:\\\\.${part}){0,2}$`).test(identifier)) {\n throw new Error(`Invalid 1-3 part table identifier '${value}'`);\n }\n return identifier;\n}\n\nexport function registerParameterTypes(): void {\n defineParameterType({\n name: 'runState',\n regexp: /SUCCESS|FAILED|CANCELED|TIMEDOUT/,\n transformer: (value: string): RunState => value as RunState,\n });\n\n defineParameterType({\n name: 'duration',\n regexp: /\\d+(?:\\.\\d+)?\\s*(?:milliseconds?|ms|seconds?|s|minutes?|m)/,\n transformer: parseDuration,\n });\n\n defineParameterType({\n name: 'table',\n regexp: /(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)(?:\\.(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)){0,2}/,\n transformer: parseTableIdentifier,\n });\n}\n","import { Formatter, type IFormatterOptions } from '@cucumber/cucumber';\n\n/**\n * Evidence formatter: schema-versioned, secret-redacted JSON summary of a\n * BDD run, shared in spirit with the live check runner's evidence output so\n * nightly runs double as audit artifacts. Wire it up in cucumber config:\n *\n * format: [['@fabricorg/databricks-bdd/evidence-formatter', 'reports/evidence.json']]\n */\nexport interface EvidenceScenario {\n name: string;\n uri: string;\n tags: string[];\n status: string;\n durationMs: number;\n error?: string;\n failures?: StepFailureEvidence[];\n}\n\nexport interface StepFailureEvidence {\n step: string;\n statementId?: string;\n sql?: string;\n output?: string;\n outputBytes?: number;\n outputTruncated?: boolean;\n}\n\nexport interface EvidenceReport {\n schemaVersion: 2;\n kind: 'databricks-bdd';\n profile: string;\n finishedAt: string;\n success: boolean;\n summary: Record<string, number>;\n scenarios: EvidenceScenario[];\n}\n\ninterface Envelope {\n attachment?: {\n body: string;\n contentEncoding: 'IDENTITY' | 'BASE64';\n mediaType: string;\n testCaseStartedId?: string;\n };\n pickle?: { id: string; name: string; uri: string; tags?: { name: string }[] };\n testCase?: { id: string; pickleId: string };\n testCaseStarted?: { id: string; testCaseId: string };\n testStepFinished?: {\n testCaseStartedId: string;\n testStepResult: {\n status: string;\n message?: string;\n duration?: { seconds: number; nanos: number };\n };\n };\n testRunFinished?: { success?: boolean; timestamp?: { seconds: number; nanos: number } };\n}\n\nexport const FAILURE_EVIDENCE_MEDIA_TYPE = 'application/vnd.fabric.databricks-bdd.failure+json';\n\nconst STATUS_RANK = ['UNKNOWN', 'PASSED', 'SKIPPED', 'PENDING', 'UNDEFINED', 'AMBIGUOUS', 'FAILED'];\n\nexport default class EvidenceFormatter extends Formatter {\n private readonly pickles = new Map<string, NonNullable<Envelope['pickle']>>();\n private readonly testCases = new Map<string, string>(); // testCaseId → pickleId\n private readonly attempts = new Map<\n string,\n {\n pickleId: string;\n status: string;\n durationMs: number;\n error?: string;\n failures: StepFailureEvidence[];\n }\n >();\n\n constructor(options: IFormatterOptions) {\n super(options);\n options.eventBroadcaster.on('envelope', (envelope: Envelope) => this.onEnvelope(envelope));\n }\n\n private onEnvelope(envelope: Envelope): void {\n if (envelope.pickle) this.pickles.set(envelope.pickle.id, envelope.pickle);\n if (envelope.testCase) this.testCases.set(envelope.testCase.id, envelope.testCase.pickleId);\n if (envelope.testCaseStarted) {\n this.attempts.set(envelope.testCaseStarted.id, {\n pickleId: this.testCases.get(envelope.testCaseStarted.testCaseId) ?? '',\n status: 'UNKNOWN',\n durationMs: 0,\n failures: [],\n });\n }\n if (envelope.attachment?.testCaseStartedId) {\n const attempt = this.attempts.get(envelope.attachment.testCaseStartedId);\n const failure = parseFailureEvidenceAttachment(envelope.attachment);\n if (attempt && failure) attempt.failures.push(failure);\n }\n if (envelope.testStepFinished) {\n const attempt = this.attempts.get(envelope.testStepFinished.testCaseStartedId);\n if (attempt) {\n const result = envelope.testStepFinished.testStepResult;\n if (STATUS_RANK.indexOf(result.status) > STATUS_RANK.indexOf(attempt.status)) {\n attempt.status = result.status;\n if (result.message) attempt.error = redactSecrets(result.message);\n }\n const d = result.duration;\n if (d) attempt.durationMs += d.seconds * 1000 + d.nanos / 1e6;\n }\n }\n if (envelope.testRunFinished) this.finish(envelope.testRunFinished);\n }\n\n private finish(finished: NonNullable<Envelope['testRunFinished']>): void {\n const scenarios: EvidenceScenario[] = [];\n const summary: Record<string, number> = {};\n for (const attempt of this.attempts.values()) {\n const pickle = this.pickles.get(attempt.pickleId);\n const status = attempt.status.toLowerCase();\n summary[status] = (summary[status] ?? 0) + 1;\n scenarios.push({\n name: pickle?.name ?? attempt.pickleId,\n uri: pickle?.uri ?? '',\n tags: (pickle?.tags ?? []).map((t) => t.name),\n status,\n durationMs: Math.round(attempt.durationMs),\n ...(attempt.error ? { error: attempt.error } : {}),\n ...(attempt.failures.length > 0 ? { failures: attempt.failures } : {}),\n });\n }\n const report: EvidenceReport = {\n schemaVersion: 2,\n kind: 'databricks-bdd',\n profile: process.env.DBX_TEST_PROFILE ?? 'local',\n finishedAt: new Date().toISOString(),\n success: finished.success ?? !scenarios.some((s) => s.status === 'failed'),\n summary,\n scenarios,\n };\n this.log(`${JSON.stringify(report, null, 2)}\\n`);\n }\n}\n\n/** Decode the structured attachment emitted by the failure hook. */\nexport function parseFailureEvidenceAttachment(\n attachment: NonNullable<Envelope['attachment']>,\n): StepFailureEvidence | null {\n if (attachment.mediaType !== FAILURE_EVIDENCE_MEDIA_TYPE) return null;\n try {\n const body =\n attachment.contentEncoding === 'BASE64'\n ? Buffer.from(attachment.body, 'base64').toString('utf8')\n : attachment.body;\n const parsed = JSON.parse(redactSecrets(body)) as Partial<StepFailureEvidence>;\n if (typeof parsed.step !== 'string') return null;\n return {\n step: parsed.step,\n ...(typeof parsed.statementId === 'string' ? { statementId: parsed.statementId } : {}),\n ...(typeof parsed.sql === 'string' ? { sql: parsed.sql } : {}),\n ...(typeof parsed.output === 'string' ? { output: parsed.output } : {}),\n ...(typeof parsed.outputBytes === 'number' ? { outputBytes: parsed.outputBytes } : {}),\n ...(typeof parsed.outputTruncated === 'boolean'\n ? { outputTruncated: parsed.outputTruncated }\n : {}),\n };\n } catch {\n return null;\n }\n}\n\nconst SECRET_ENV_RE = /(TOKEN|SECRET|PASSWORD|BEARER|KEY)/;\n\n/** Replace values of secret-looking env vars anywhere they appear in text. */\nexport function redactSecrets(\n text: string,\n env: Record<string, string | undefined> = process.env,\n): string {\n let out = text;\n for (const [name, value] of Object.entries(env)) {\n if (!value || value.length < 6) continue;\n if (!SECRET_ENV_RE.test(name)) continue;\n out = out.split(value).join('[REDACTED]');\n }\n return out;\n}\n","import type { Writable } from 'node:stream';\nimport { format } from 'node:util';\n\nexport type CapturedStream = 'stdout' | 'stderr';\n\nexport interface CapturedStepOutput {\n /** Ordered stdout/stderr output with stream labels. */\n text: string;\n /** True when output exceeded the configured byte budget. */\n truncated: boolean;\n /** Total bytes emitted before truncation. */\n totalBytes: number;\n}\n\nexport interface StepOutputCapture {\n stop(): CapturedStepOutput;\n}\n\nexport interface StepOutputCaptureOptions {\n /** Maximum UTF-8 bytes retained for one step. Defaults to 32 KiB. */\n maxBytes?: number;\n /** Forward output while capturing. Defaults to false, matching Behave capture semantics. */\n passthrough?: boolean;\n}\n\ninterface CapturedChunk {\n stream: CapturedStream;\n text: string;\n}\n\ntype Write = Writable['write'];\ntype ConsoleMethod = 'debug' | 'error' | 'info' | 'log' | 'warn';\n\nconst DEFAULT_MAX_BYTES = 32 * 1024;\n\n/**\n * Capture process stdout/stderr until stop() is called. Console output and\n * Pino's standard destination both flow through these streams. Child\n * processes that inherit the OS file descriptors directly are intentionally\n * outside this in-process capture boundary.\n */\nexport function startStepOutputCapture(options: StepOutputCaptureOptions = {}): StepOutputCapture {\n const maxBytes = Math.max(0, options.maxBytes ?? DEFAULT_MAX_BYTES);\n const stdout = process.stdout;\n const stderr = process.stderr;\n const originalStdoutWrite = stdout.write;\n const originalStderrWrite = stderr.write;\n const originalConsole = Object.fromEntries(\n (['debug', 'error', 'info', 'log', 'warn'] as const).map((method) => [method, console[method]]),\n ) as Record<ConsoleMethod, typeof console.log>;\n const chunks: CapturedChunk[] = [];\n let retainedBytes = 0;\n let totalBytes = 0;\n let stopped = false;\n\n const capture = (stream: CapturedStream, chunk: unknown): void => {\n const text = chunkToString(chunk);\n const bytes = Buffer.byteLength(text);\n totalBytes += bytes;\n const remaining = maxBytes - retainedBytes;\n if (remaining <= 0 || bytes === 0) return;\n const retained = bytes <= remaining ? text : truncateUtf8(text, remaining);\n retainedBytes += Buffer.byteLength(retained);\n if (retained) chunks.push({ stream, text: retained });\n };\n\n stdout.write = interceptedWrite(\n stdout,\n 'stdout',\n originalStdoutWrite,\n capture,\n options.passthrough,\n );\n stderr.write = interceptedWrite(\n stderr,\n 'stderr',\n originalStderrWrite,\n capture,\n options.passthrough,\n );\n if (!options.passthrough) {\n for (const method of ['debug', 'info', 'log'] as const) {\n console[method] = (...args: unknown[]) => capture('stdout', `${format(...args)}\\n`);\n }\n for (const method of ['error', 'warn'] as const) {\n console[method] = (...args: unknown[]) => capture('stderr', `${format(...args)}\\n`);\n }\n }\n\n return {\n stop(): CapturedStepOutput {\n if (!stopped) {\n stdout.write = originalStdoutWrite;\n stderr.write = originalStderrWrite;\n for (const method of Object.keys(originalConsole) as ConsoleMethod[]) {\n console[method] = originalConsole[method];\n }\n stopped = true;\n }\n return {\n text: renderChunks(chunks),\n truncated: totalBytes > retainedBytes,\n totalBytes,\n };\n },\n };\n}\n\nfunction interceptedWrite(\n destination: Writable,\n stream: CapturedStream,\n original: Write,\n capture: (stream: CapturedStream, chunk: unknown) => void,\n passthrough = false,\n): Write {\n return function write(chunk: unknown, encodingOrCallback?: unknown, callback?: unknown): boolean {\n capture(stream, chunk);\n if (passthrough) {\n return original.call(\n destination,\n chunk as never,\n encodingOrCallback as never,\n callback as never,\n );\n }\n const done = typeof encodingOrCallback === 'function' ? encodingOrCallback : callback;\n if (typeof done === 'function') queueMicrotask(() => done());\n return true;\n } as Write;\n}\n\nfunction chunkToString(chunk: unknown): string {\n if (typeof chunk === 'string') return chunk;\n if (Buffer.isBuffer(chunk)) return chunk.toString('utf8');\n if (chunk instanceof Uint8Array) return Buffer.from(chunk).toString('utf8');\n return String(chunk);\n}\n\nfunction truncateUtf8(value: string, maxBytes: number): string {\n return Buffer.from(value)\n .subarray(0, maxBytes)\n .toString('utf8')\n .replace(/\\uFFFD$/u, '');\n}\n\nfunction renderChunks(chunks: readonly CapturedChunk[]): string {\n let rendered = '';\n let previous: CapturedStream | undefined;\n for (const chunk of chunks) {\n if (chunk.stream !== previous) {\n if (rendered && !rendered.endsWith('\\n')) rendered += '\\n';\n rendered += `[${chunk.stream}]\\n`;\n previous = chunk.stream;\n }\n rendered += chunk.text;\n }\n return rendered.trimEnd();\n}\n","/** Cardinalities supported by Behave's cfparse fields. */\nexport type FieldCardinality = '?' | '*' | '+';\n\nexport interface CardinalityOptions {\n /** Delimiter between values. Defaults to a comma with optional whitespace. */\n separator?: string | RegExp;\n /** Human-readable field name used in validation errors. */\n fieldName?: string;\n}\n\nexport type CardinalityResult<T, C extends FieldCardinality> = C extends '?' ? T | undefined : T[];\n\n/**\n * Parse a Cucumber string parameter with cfparse-compatible cardinality.\n *\n * Use `?` for zero-or-one, `*` for zero-or-more, and `+` for one-or-more.\n * This keeps the capability in TypeScript while allowing standard Cucumber\n * Expressions and readable comma-separated parameters.\n */\nexport function parseCardinalityField<T, C extends FieldCardinality>(\n value: string,\n cardinality: C,\n transform: (item: string, index: number) => T,\n options: CardinalityOptions = {},\n): CardinalityResult<T, C> {\n const fieldName = options.fieldName ?? 'field';\n const trimmed = value.trim();\n const items = trimmed\n ? trimmed.split(options.separator ?? /\\s*,\\s*/).map((item) => item.trim())\n : [];\n if (items.some((item) => !item)) {\n throw new Error(`${fieldName} contains an empty value`);\n }\n\n if (cardinality === '?' && items.length > 1) {\n throw new Error(`${fieldName} expects zero or one value, received ${items.length}`);\n }\n if (cardinality === '+' && items.length === 0) {\n throw new Error(`${fieldName} expects one or more values`);\n }\n\n const parsed = items.map(transform);\n if (cardinality === '?') return parsed[0] as CardinalityResult<T, C>;\n return parsed as CardinalityResult<T, C>;\n}\n"]}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { DatabricksWorld, LIVE_ONLY_TAGS, capabilitiesFromEnv, capabilityTagReason, coerceMatchRows, inferFixture, liveOnlyReason, resolveJobId, resolvePipelineId, runJobToTerminal, scenarioSkipReason, startPipelineUpdate, waitForPipelineUpdate } from './chunk-3XDMBHFP.js';
1
+ export { DatabricksWorld, LIVE_ONLY_TAGS, capabilitiesFromEnv, capabilityTagReason, coerceMatchRows, inferFixture, liveOnlyReason, resolveJobId, resolvePipelineId, runJobToTerminal, scenarioSkipReason, startPipelineUpdate, waitForPipelineUpdate } from './chunk-WUKSKMYY.js';
2
2
  export { defineAction, runAction } from './chunk-6JC65RH2.js';
3
3
  export { parseCardinalityField } from './chunk-K5LJ7WSW.js';
4
4
  export { FAILURE_EVIDENCE_MEDIA_TYPE, parseFailureEvidenceAttachment, redactSecrets } from './chunk-UQAKGVJS.js';
package/dist/steps.cjs CHANGED
@@ -5,7 +5,6 @@ var promises = require('fs/promises');
5
5
  var path = require('path');
6
6
  var cucumber = require('@cucumber/cucumber');
7
7
  var databricksTestkit = require('@fabricorg/databricks-testkit');
8
- var databricks = require('@fabric-harness/databricks');
9
8
  var util = require('util');
10
9
 
11
10
  // src/steps.ts
@@ -138,7 +137,7 @@ async function runJobToTerminal(client, nameOrId, options = {}) {
138
137
  const submitted = await client.post("/api/2.1/jobs/run-now", {
139
138
  job_id: jobId
140
139
  });
141
- const run = await databricks.waitForDatabricksRun(client, submitted.run_id, {
140
+ const run = await databricksTestkit.waitForDatabricksRun(client, submitted.run_id, {
142
141
  pollIntervalMs: options.pollIntervalMs,
143
142
  timeoutMs: options.timeoutMs
144
143
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/evidence-formatter.ts","../src/fixtures.ts","../src/infer.ts","../src/jobs.ts","../src/output-capture.ts","../src/parameter-types.ts","../src/pipelines.ts","../src/profile.ts","../src/scoped-state.ts","../src/actions.ts","../src/world.ts","../src/steps.ts"],"names":["waitForDatabricksRun","format","defineParameterType","World","resolveProfile","createExecutionContext","setWorldConstructor","setDefaultTimeout","BeforeAll","Before","AfterAll","BeforeStep","After","AfterStep","Given","createLakebaseTestProvider","normalizeVolumeRoot","randomUUID","ensureVolumeDirectory","resolve","relative","isAbsolute","basename","uploadVolumeFile","readFile","deleteVolumeFile","When","createClientFromEnv","parseJobOrchestrationLiveSpec","DatabricksJobsAdapter","notebookSubmitCheck","dbtBuildCheck","Then","expectTable","assertDeltaContract","compareToGolden","waitForPipelineUpdate"],"mappings":"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","file":"steps.cjs","sourcesContent":["import { Formatter, type IFormatterOptions } from '@cucumber/cucumber';\n\n/**\n * Evidence formatter: schema-versioned, secret-redacted JSON summary of a\n * BDD run, shared in spirit with the live check runner's evidence output so\n * nightly runs double as audit artifacts. Wire it up in cucumber config:\n *\n * format: [['@fabricorg/databricks-bdd/evidence-formatter', 'reports/evidence.json']]\n */\nexport interface EvidenceScenario {\n name: string;\n uri: string;\n tags: string[];\n status: string;\n durationMs: number;\n error?: string;\n failures?: StepFailureEvidence[];\n}\n\nexport interface StepFailureEvidence {\n step: string;\n statementId?: string;\n sql?: string;\n output?: string;\n outputBytes?: number;\n outputTruncated?: boolean;\n}\n\nexport interface EvidenceReport {\n schemaVersion: 2;\n kind: 'databricks-bdd';\n profile: string;\n finishedAt: string;\n success: boolean;\n summary: Record<string, number>;\n scenarios: EvidenceScenario[];\n}\n\ninterface Envelope {\n attachment?: {\n body: string;\n contentEncoding: 'IDENTITY' | 'BASE64';\n mediaType: string;\n testCaseStartedId?: string;\n };\n pickle?: { id: string; name: string; uri: string; tags?: { name: string }[] };\n testCase?: { id: string; pickleId: string };\n testCaseStarted?: { id: string; testCaseId: string };\n testStepFinished?: {\n testCaseStartedId: string;\n testStepResult: {\n status: string;\n message?: string;\n duration?: { seconds: number; nanos: number };\n };\n };\n testRunFinished?: { success?: boolean; timestamp?: { seconds: number; nanos: number } };\n}\n\nexport const FAILURE_EVIDENCE_MEDIA_TYPE = 'application/vnd.fabric.databricks-bdd.failure+json';\n\nconst STATUS_RANK = ['UNKNOWN', 'PASSED', 'SKIPPED', 'PENDING', 'UNDEFINED', 'AMBIGUOUS', 'FAILED'];\n\nexport default class EvidenceFormatter extends Formatter {\n private readonly pickles = new Map<string, NonNullable<Envelope['pickle']>>();\n private readonly testCases = new Map<string, string>(); // testCaseId → pickleId\n private readonly attempts = new Map<\n string,\n {\n pickleId: string;\n status: string;\n durationMs: number;\n error?: string;\n failures: StepFailureEvidence[];\n }\n >();\n\n constructor(options: IFormatterOptions) {\n super(options);\n options.eventBroadcaster.on('envelope', (envelope: Envelope) => this.onEnvelope(envelope));\n }\n\n private onEnvelope(envelope: Envelope): void {\n if (envelope.pickle) this.pickles.set(envelope.pickle.id, envelope.pickle);\n if (envelope.testCase) this.testCases.set(envelope.testCase.id, envelope.testCase.pickleId);\n if (envelope.testCaseStarted) {\n this.attempts.set(envelope.testCaseStarted.id, {\n pickleId: this.testCases.get(envelope.testCaseStarted.testCaseId) ?? '',\n status: 'UNKNOWN',\n durationMs: 0,\n failures: [],\n });\n }\n if (envelope.attachment?.testCaseStartedId) {\n const attempt = this.attempts.get(envelope.attachment.testCaseStartedId);\n const failure = parseFailureEvidenceAttachment(envelope.attachment);\n if (attempt && failure) attempt.failures.push(failure);\n }\n if (envelope.testStepFinished) {\n const attempt = this.attempts.get(envelope.testStepFinished.testCaseStartedId);\n if (attempt) {\n const result = envelope.testStepFinished.testStepResult;\n if (STATUS_RANK.indexOf(result.status) > STATUS_RANK.indexOf(attempt.status)) {\n attempt.status = result.status;\n if (result.message) attempt.error = redactSecrets(result.message);\n }\n const d = result.duration;\n if (d) attempt.durationMs += d.seconds * 1000 + d.nanos / 1e6;\n }\n }\n if (envelope.testRunFinished) this.finish(envelope.testRunFinished);\n }\n\n private finish(finished: NonNullable<Envelope['testRunFinished']>): void {\n const scenarios: EvidenceScenario[] = [];\n const summary: Record<string, number> = {};\n for (const attempt of this.attempts.values()) {\n const pickle = this.pickles.get(attempt.pickleId);\n const status = attempt.status.toLowerCase();\n summary[status] = (summary[status] ?? 0) + 1;\n scenarios.push({\n name: pickle?.name ?? attempt.pickleId,\n uri: pickle?.uri ?? '',\n tags: (pickle?.tags ?? []).map((t) => t.name),\n status,\n durationMs: Math.round(attempt.durationMs),\n ...(attempt.error ? { error: attempt.error } : {}),\n ...(attempt.failures.length > 0 ? { failures: attempt.failures } : {}),\n });\n }\n const report: EvidenceReport = {\n schemaVersion: 2,\n kind: 'databricks-bdd',\n profile: process.env.DBX_TEST_PROFILE ?? 'local',\n finishedAt: new Date().toISOString(),\n success: finished.success ?? !scenarios.some((s) => s.status === 'failed'),\n summary,\n scenarios,\n };\n this.log(`${JSON.stringify(report, null, 2)}\\n`);\n }\n}\n\n/** Decode the structured attachment emitted by the failure hook. */\nexport function parseFailureEvidenceAttachment(\n attachment: NonNullable<Envelope['attachment']>,\n): StepFailureEvidence | null {\n if (attachment.mediaType !== FAILURE_EVIDENCE_MEDIA_TYPE) return null;\n try {\n const body =\n attachment.contentEncoding === 'BASE64'\n ? Buffer.from(attachment.body, 'base64').toString('utf8')\n : attachment.body;\n const parsed = JSON.parse(redactSecrets(body)) as Partial<StepFailureEvidence>;\n if (typeof parsed.step !== 'string') return null;\n return {\n step: parsed.step,\n ...(typeof parsed.statementId === 'string' ? { statementId: parsed.statementId } : {}),\n ...(typeof parsed.sql === 'string' ? { sql: parsed.sql } : {}),\n ...(typeof parsed.output === 'string' ? { output: parsed.output } : {}),\n ...(typeof parsed.outputBytes === 'number' ? { outputBytes: parsed.outputBytes } : {}),\n ...(typeof parsed.outputTruncated === 'boolean'\n ? { outputTruncated: parsed.outputTruncated }\n : {}),\n };\n } catch {\n return null;\n }\n}\n\nconst SECRET_ENV_RE = /(TOKEN|SECRET|PASSWORD|BEARER|KEY)/;\n\n/** Replace values of secret-looking env vars anywhere they appear in text. */\nexport function redactSecrets(\n text: string,\n env: Record<string, string | undefined> = process.env,\n): string {\n let out = text;\n for (const [name, value] of Object.entries(env)) {\n if (!value || value.length < 6) continue;\n if (!SECRET_ENV_RE.test(name)) continue;\n out = out.split(value).join('[REDACTED]');\n }\n return out;\n}\n","/**\n * Behave-style shared fixtures for expensive Databricks resources.\n *\n * Cucumber Worlds are scenario-scoped. These registries provide the two\n * broader scopes users commonly need when migrating Behave suites:\n *\n * - runFixture: setup once for the entire Cucumber run;\n * - featureFixture: setup once per feature URI.\n *\n * Both scopes are drained by the package AfterAll hook. Deferring feature\n * cleanup until AfterAll is intentional: cucumber-js may interleave scenarios\n * and does not expose an after-feature hook. The resource is still isolated by\n * feature URI and is never reused by another feature.\n */\n\nexport type FixtureCleanup = () => void | Promise<void>;\nexport type FixtureSetup<T> = () =>\n | T\n | Promise<T>\n | { value: T; cleanup: FixtureCleanup }\n | Promise<{ value: T; cleanup: FixtureCleanup }>;\n\ninterface FixtureEntry<T = unknown> {\n value: Promise<T>;\n cleanup?: FixtureCleanup;\n}\n\nfunction isFixtureResult<T>(value: T | { value: T; cleanup: FixtureCleanup }): value is {\n value: T;\n cleanup: FixtureCleanup;\n} {\n return (\n typeof value === 'object' &&\n value !== null &&\n Object.prototype.hasOwnProperty.call(value, 'value') &&\n typeof (value as { cleanup?: unknown }).cleanup === 'function'\n );\n}\n\nexport class SharedFixtureRegistry {\n private readonly runEntries = new Map<string, FixtureEntry>();\n private readonly featureEntries = new Map<string, Map<string, FixtureEntry>>();\n private readonly cleanupOrder: FixtureEntry[] = [];\n\n runFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n return this.resolve(this.runEntries, key, setup);\n }\n\n featureFixture<T>(featureUri: string, key: string, setup: FixtureSetup<T>): Promise<T> {\n if (!featureUri) throw new Error('featureFixture requires a feature URI');\n let feature = this.featureEntries.get(featureUri);\n if (!feature) {\n feature = new Map();\n this.featureEntries.set(featureUri, feature);\n }\n return this.resolve(feature, key, setup);\n }\n\n private resolve<T>(entries: Map<string, FixtureEntry>, key: string, setup: FixtureSetup<T>) {\n if (!key.trim()) throw new Error('Fixture key must not be empty');\n const existing = entries.get(key);\n if (existing) return existing.value as Promise<T>;\n\n const entry: FixtureEntry<T> = {\n value: Promise.resolve()\n .then(setup)\n .then((result) => {\n if (isFixtureResult(result)) {\n entry.cleanup = result.cleanup;\n return result.value;\n }\n return result;\n })\n .catch((error) => {\n entries.delete(key);\n const index = this.cleanupOrder.indexOf(entry);\n if (index >= 0) this.cleanupOrder.splice(index, 1);\n throw error;\n }),\n };\n entries.set(key, entry);\n this.cleanupOrder.push(entry);\n return entry.value;\n }\n\n async dispose(): Promise<void> {\n const errors: unknown[] = [];\n for (const entry of this.cleanupOrder.splice(0).reverse()) {\n try {\n // Ensure setup has settled before attempting its cleanup.\n await entry.value.catch(() => undefined);\n await entry.cleanup?.();\n } catch (error) {\n errors.push(error);\n }\n }\n this.runEntries.clear();\n this.featureEntries.clear();\n if (errors.length > 0) throw new AggregateError(errors, 'Shared fixture cleanup failed');\n }\n}\n\nexport const sharedFixtures = new SharedFixtureRegistry();\n","import type { TableFixture } from '@fabricorg/databricks-testkit';\n\nconst INT_RE = /^-?\\d+$/;\nconst FLOAT_RE = /^-?\\d+\\.\\d+$/;\nconst TIMESTAMP_RE = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(:\\d{2})?/;\nconst BOOL_RE = /^(true|false)$/i;\n\n/**\n * Turn a Gherkin data table (header row + string cells) into a TableFixture,\n * inferring portable column types from the values: BIGINT, DOUBLE,\n * TIMESTAMP, BOOLEAN, else STRING. Empty cells become NULL.\n */\nexport function inferFixture(table: string, raw: readonly (readonly string[])[]): TableFixture {\n if (raw.length < 2) {\n throw new Error(`Data table for ${table} needs a header row and at least one data row`);\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n const types = header.map((_, col) => inferColumnType(body.map((row) => row[col] ?? '')));\n const schema = header.map((name, i) => `\"${name}\" ${types[i]}`).join(', ');\n const rows = body.map((row) => row.map((cell, i) => coerceCell(cell, types[i] ?? 'STRING')));\n return { table, schema, rows };\n}\n\n/** Coerce data-table string cells to typed values for row matching (no header row). */\nexport function coerceMatchRows(raw: readonly (readonly string[])[]): Record<string, unknown>[] {\n if (raw.length < 2) {\n throw new Error('Match table needs a header row and at least one data row');\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n return body.map((row) => {\n const out: Record<string, unknown> = {};\n header.forEach((name, i) => {\n out[name] = coerceCell(row[i] ?? '', inferColumnType([row[i] ?? '']));\n });\n return out;\n });\n}\n\nfunction inferColumnType(cells: readonly string[]): string {\n const present = cells.filter((c) => c !== '');\n if (present.length === 0) return 'STRING';\n if (present.every((c) => INT_RE.test(c))) return 'BIGINT';\n if (present.every((c) => FLOAT_RE.test(c) || INT_RE.test(c))) return 'DOUBLE';\n if (present.every((c) => TIMESTAMP_RE.test(c))) return 'TIMESTAMP';\n if (present.every((c) => BOOL_RE.test(c))) return 'BOOLEAN';\n return 'STRING';\n}\n\nfunction coerceCell(cell: string, type: string): unknown {\n if (cell === '') return null;\n if (type === 'BIGINT' || type === 'DOUBLE') return Number(cell);\n if (type === 'BOOLEAN') return /^true$/i.test(cell);\n return cell;\n}\n","import { type DatabricksRestClient, waitForDatabricksRun } from '@fabric-harness/databricks';\nimport type { WorkspaceClientLike } from '@fabricorg/databricks-testkit';\n\nexport interface RunJobOptions {\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface JobRunResult {\n runId: number;\n lifeCycleState: string;\n resultState: string;\n run: Record<string, unknown>;\n}\n\n/** Resolve a job by numeric id or by exact name via /api/2.1/jobs/list. */\nexport async function resolveJobId(client: WorkspaceClientLike, nameOrId: string): Promise<number> {\n if (/^\\d+$/.test(nameOrId)) return Number(nameOrId);\n const response = await client.get<{ jobs?: { job_id: number; settings?: { name?: string } }[] }>(\n '/api/2.1/jobs/list',\n { name: nameOrId },\n );\n const match = (response.jobs ?? []).find((j) => j.settings?.name === nameOrId);\n if (!match) throw new Error(`No Databricks job named '${nameOrId}' found`);\n return match.job_id;\n}\n\n/** run-now a job and poll its run to a terminal state. */\nexport async function runJobToTerminal(\n client: WorkspaceClientLike,\n nameOrId: string,\n options: RunJobOptions = {},\n): Promise<JobRunResult> {\n const jobId = await resolveJobId(client, nameOrId);\n const submitted = await client.post<{ run_id: number }>('/api/2.1/jobs/run-now', {\n job_id: jobId,\n });\n const run = await waitForDatabricksRun(client as DatabricksRestClient, submitted.run_id, {\n pollIntervalMs: options.pollIntervalMs,\n timeoutMs: options.timeoutMs,\n });\n const state = (run as { state?: { life_cycle_state?: string; result_state?: string } }).state;\n return {\n runId: submitted.run_id,\n lifeCycleState: state?.life_cycle_state ?? 'UNKNOWN',\n resultState: state?.result_state ?? 'UNKNOWN',\n run,\n };\n}\n","import type { Writable } from 'node:stream';\nimport { format } from 'node:util';\n\nexport type CapturedStream = 'stdout' | 'stderr';\n\nexport interface CapturedStepOutput {\n /** Ordered stdout/stderr output with stream labels. */\n text: string;\n /** True when output exceeded the configured byte budget. */\n truncated: boolean;\n /** Total bytes emitted before truncation. */\n totalBytes: number;\n}\n\nexport interface StepOutputCapture {\n stop(): CapturedStepOutput;\n}\n\nexport interface StepOutputCaptureOptions {\n /** Maximum UTF-8 bytes retained for one step. Defaults to 32 KiB. */\n maxBytes?: number;\n /** Forward output while capturing. Defaults to false, matching Behave capture semantics. */\n passthrough?: boolean;\n}\n\ninterface CapturedChunk {\n stream: CapturedStream;\n text: string;\n}\n\ntype Write = Writable['write'];\ntype ConsoleMethod = 'debug' | 'error' | 'info' | 'log' | 'warn';\n\nconst DEFAULT_MAX_BYTES = 32 * 1024;\n\n/**\n * Capture process stdout/stderr until stop() is called. Console output and\n * Pino's standard destination both flow through these streams. Child\n * processes that inherit the OS file descriptors directly are intentionally\n * outside this in-process capture boundary.\n */\nexport function startStepOutputCapture(options: StepOutputCaptureOptions = {}): StepOutputCapture {\n const maxBytes = Math.max(0, options.maxBytes ?? DEFAULT_MAX_BYTES);\n const stdout = process.stdout;\n const stderr = process.stderr;\n const originalStdoutWrite = stdout.write;\n const originalStderrWrite = stderr.write;\n const originalConsole = Object.fromEntries(\n (['debug', 'error', 'info', 'log', 'warn'] as const).map((method) => [method, console[method]]),\n ) as Record<ConsoleMethod, typeof console.log>;\n const chunks: CapturedChunk[] = [];\n let retainedBytes = 0;\n let totalBytes = 0;\n let stopped = false;\n\n const capture = (stream: CapturedStream, chunk: unknown): void => {\n const text = chunkToString(chunk);\n const bytes = Buffer.byteLength(text);\n totalBytes += bytes;\n const remaining = maxBytes - retainedBytes;\n if (remaining <= 0 || bytes === 0) return;\n const retained = bytes <= remaining ? text : truncateUtf8(text, remaining);\n retainedBytes += Buffer.byteLength(retained);\n if (retained) chunks.push({ stream, text: retained });\n };\n\n stdout.write = interceptedWrite(\n stdout,\n 'stdout',\n originalStdoutWrite,\n capture,\n options.passthrough,\n );\n stderr.write = interceptedWrite(\n stderr,\n 'stderr',\n originalStderrWrite,\n capture,\n options.passthrough,\n );\n if (!options.passthrough) {\n for (const method of ['debug', 'info', 'log'] as const) {\n console[method] = (...args: unknown[]) => capture('stdout', `${format(...args)}\\n`);\n }\n for (const method of ['error', 'warn'] as const) {\n console[method] = (...args: unknown[]) => capture('stderr', `${format(...args)}\\n`);\n }\n }\n\n return {\n stop(): CapturedStepOutput {\n if (!stopped) {\n stdout.write = originalStdoutWrite;\n stderr.write = originalStderrWrite;\n for (const method of Object.keys(originalConsole) as ConsoleMethod[]) {\n console[method] = originalConsole[method];\n }\n stopped = true;\n }\n return {\n text: renderChunks(chunks),\n truncated: totalBytes > retainedBytes,\n totalBytes,\n };\n },\n };\n}\n\nfunction interceptedWrite(\n destination: Writable,\n stream: CapturedStream,\n original: Write,\n capture: (stream: CapturedStream, chunk: unknown) => void,\n passthrough = false,\n): Write {\n return function write(chunk: unknown, encodingOrCallback?: unknown, callback?: unknown): boolean {\n capture(stream, chunk);\n if (passthrough) {\n return original.call(\n destination,\n chunk as never,\n encodingOrCallback as never,\n callback as never,\n );\n }\n const done = typeof encodingOrCallback === 'function' ? encodingOrCallback : callback;\n if (typeof done === 'function') queueMicrotask(() => done());\n return true;\n } as Write;\n}\n\nfunction chunkToString(chunk: unknown): string {\n if (typeof chunk === 'string') return chunk;\n if (Buffer.isBuffer(chunk)) return chunk.toString('utf8');\n if (chunk instanceof Uint8Array) return Buffer.from(chunk).toString('utf8');\n return String(chunk);\n}\n\nfunction truncateUtf8(value: string, maxBytes: number): string {\n return Buffer.from(value)\n .subarray(0, maxBytes)\n .toString('utf8')\n .replace(/\\uFFFD$/u, '');\n}\n\nfunction renderChunks(chunks: readonly CapturedChunk[]): string {\n let rendered = '';\n let previous: CapturedStream | undefined;\n for (const chunk of chunks) {\n if (chunk.stream !== previous) {\n if (rendered && !rendered.endsWith('\\n')) rendered += '\\n';\n rendered += `[${chunk.stream}]\\n`;\n previous = chunk.stream;\n }\n rendered += chunk.text;\n }\n return rendered.trimEnd();\n}\n","import { defineParameterType } from '@cucumber/cucumber';\n\nexport const RUN_STATES = ['SUCCESS', 'FAILED', 'CANCELED', 'TIMEDOUT'] as const;\nexport type RunState = (typeof RUN_STATES)[number];\n\nexport function parseDuration(value: string): number {\n const match = value.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*(milliseconds?|ms|seconds?|s|minutes?|m)$/i);\n if (!match) throw new Error(`Invalid duration '${value}'`);\n const amount = Number(match[1]);\n const unit = match[2]?.toLowerCase() ?? '';\n if (unit === 'ms' || unit.startsWith('millisecond')) return amount;\n if (unit === 's' || unit.startsWith('second')) return amount * 1_000;\n return amount * 60_000;\n}\n\nexport function parseTableIdentifier(value: string): string {\n const identifier = value.trim();\n const part = '(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)';\n if (!new RegExp(`^${part}(?:\\\\.${part}){0,2}$`).test(identifier)) {\n throw new Error(`Invalid 1-3 part table identifier '${value}'`);\n }\n return identifier;\n}\n\nexport function registerParameterTypes(): void {\n defineParameterType({\n name: 'runState',\n regexp: /SUCCESS|FAILED|CANCELED|TIMEDOUT/,\n transformer: (value: string): RunState => value as RunState,\n });\n\n defineParameterType({\n name: 'duration',\n regexp: /\\d+(?:\\.\\d+)?\\s*(?:milliseconds?|ms|seconds?|s|minutes?|m)/,\n transformer: parseDuration,\n });\n\n defineParameterType({\n name: 'table',\n regexp: /(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)(?:\\.(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)){0,2}/,\n transformer: parseTableIdentifier,\n });\n}\n","import {\n type PollOptions,\n type WorkspaceClientLike,\n waitForPipelineUpdate,\n} from '@fabricorg/databricks-testkit';\n\nexport type PipelineWaitOptions = PollOptions;\n\n/** Resolve a DLT/Lakeflow pipeline by id or exact name via /api/2.0/pipelines. */\nexport async function resolvePipelineId(\n client: WorkspaceClientLike,\n nameOrId: string,\n): Promise<string> {\n if (/^[0-9a-f]{8}-[0-9a-f-]{27,}$/i.test(nameOrId)) return nameOrId;\n const response = await client.get<{ statuses?: { pipeline_id: string; name?: string }[] }>(\n '/api/2.0/pipelines',\n { filter: `name LIKE '${nameOrId}'` },\n );\n const match = (response.statuses ?? []).find((p) => p.name === nameOrId);\n if (!match) throw new Error(`No Databricks pipeline named '${nameOrId}' found`);\n return match.pipeline_id;\n}\n\n/** Start a pipeline update; returns the update id to poll. */\nexport async function startPipelineUpdate(\n client: WorkspaceClientLike,\n pipelineId: string,\n options: { fullRefresh?: boolean } = {},\n): Promise<string> {\n const response = await client.post<{ update_id: string }>(\n `/api/2.0/pipelines/${encodeURIComponent(pipelineId)}/updates`,\n { full_refresh: options.fullRefresh ?? false },\n );\n return response.update_id;\n}\n\n/** Poll an update to a terminal state; throws on timeout or non-COMPLETED terminal states. */\nexport { waitForPipelineUpdate };\n","import type { TestProfile } from '@fabricorg/databricks-testkit';\n\n/**\n * Tags that require a live workspace (or a long budget). Scenarios carrying\n * any of them are skipped under the `local` profile — see ADR-0006.\n */\nexport const LIVE_ONLY_TAGS = [\n '@live',\n '@jobs',\n '@dlt',\n '@pipeline',\n '@autoloader',\n '@lakebase',\n '@slow',\n] as const;\n\n/** Returns a skip reason when the scenario cannot run under the given profile, else null. */\nexport function liveOnlyReason(tags: readonly string[], profile: TestProfile): string | null {\n if (profile === 'live') return null;\n const blocking = tags.filter((t) => (LIVE_ONLY_TAGS as readonly string[]).includes(t));\n if (blocking.length === 0) return null;\n return `requires a live workspace (${blocking.join(', ')}); running under DBX_TEST_PROFILE=local`;\n}\n\nexport type CapabilityValue = string | number | boolean;\nexport type CapabilityMap = Readonly<Record<string, CapabilityValue>>;\n\n/** Build the runtime capability map used by active-tag predicates. */\nexport function capabilitiesFromEnv(\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): CapabilityMap {\n const capabilities: Record<string, CapabilityValue> = { profile };\n const builtins: Array<[string, string | undefined]> = [\n ['cloud', env.DBX_TEST_CLOUD],\n ['compute', env.DBX_TEST_COMPUTE_MODE ?? env.DBX_TEST_COMPUTE],\n ['stage', env.DBX_TEST_STAGE],\n ];\n for (const [key, value] of builtins) {\n if (value !== undefined && value !== '') capabilities[key] = value;\n }\n for (const [name, value] of Object.entries(env)) {\n if (!name.startsWith('DBX_TEST_CAPABILITY_') || value === undefined) continue;\n capabilities[normalizeCapabilityKey(name.slice('DBX_TEST_CAPABILITY_'.length))] = value;\n }\n return capabilities;\n}\n\n/**\n * Evaluate TypeScript-native active tags.\n *\n * Supported forms:\n * - `@requires.cloud=azure` / `@requires.serverless`\n * - `@excludes.compute=classic`\n * - Behave-compatible aliases `@use.with_cloud=azure` and\n * `@not.with_cloud=azure`\n */\nexport function capabilityTagReason(\n tags: readonly string[],\n capabilities: CapabilityMap,\n): string | null {\n const normalized = new Map(\n Object.entries(capabilities).map(([key, value]) => [\n normalizeCapabilityKey(key),\n String(value).toLowerCase(),\n ]),\n );\n\n for (const tag of tags) {\n const predicate = parseCapabilityTag(tag);\n if (!predicate) continue;\n const actual = normalized.get(normalizeCapabilityKey(predicate.key));\n const matches = predicate.expected\n ? actual === predicate.expected.toLowerCase()\n : actual !== undefined && !['', '0', 'false', 'no', 'off'].includes(actual);\n if (predicate.kind === 'requires' && !matches) {\n return `${tag} requires capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}; actual ${actual ?? 'unset'}`;\n }\n if (predicate.kind === 'excludes' && matches) {\n return `${tag} excludes capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}`;\n }\n }\n return null;\n}\n\n/** Combined local/live and active-capability skip policy. */\nexport function scenarioSkipReason(\n tags: readonly string[],\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): string | null {\n return (\n liveOnlyReason(tags, profile) ?? capabilityTagReason(tags, capabilitiesFromEnv(profile, env))\n );\n}\n\nfunction parseCapabilityTag(\n tag: string,\n): { kind: 'requires' | 'excludes'; key: string; expected?: string } | undefined {\n const direct = tag.match(/^@(requires|excludes)\\.([^=]+)(?:=(.+))?$/i);\n if (direct?.[1] && direct[2]) {\n return {\n kind: direct[1].toLowerCase() as 'requires' | 'excludes',\n key: direct[2],\n ...(direct[3] ? { expected: direct[3] } : {}),\n };\n }\n const behave = tag.match(/^@(use|not)\\.with_([^=]+)=(.+)$/i);\n if (behave?.[1] && behave[2] && behave[3]) {\n return {\n kind: behave[1].toLowerCase() === 'use' ? 'requires' : 'excludes',\n key: behave[2],\n expected: behave[3],\n };\n }\n return undefined;\n}\n\nfunction normalizeCapabilityKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_');\n}\n","export type StateScope = 'run' | 'feature' | 'scenario';\n\ntype StateValues = Map<string, unknown>;\n\n/**\n * Process-local state backing Behave-style run and feature context layers.\n * Scenario values stay on the scenario World and are never shared.\n */\nexport class SharedStateRegistry {\n private readonly runValues: StateValues = new Map();\n private readonly featureValues = new Map<string, StateValues>();\n\n run(): StateValues {\n return this.runValues;\n }\n\n feature(featureUri: string): StateValues {\n if (!featureUri) throw new Error('Feature state requires a feature URI');\n let values = this.featureValues.get(featureUri);\n if (!values) {\n values = new Map();\n this.featureValues.set(featureUri, values);\n }\n return values;\n }\n\n clear(): void {\n this.runValues.clear();\n this.featureValues.clear();\n }\n}\n\n/** Layered state lookup: scenario overrides feature, which overrides run. */\nexport class ScopedState {\n private readonly scenarioValues: StateValues = new Map();\n\n constructor(\n private readonly runValues: StateValues,\n private readonly featureValues: StateValues,\n ) {}\n\n set<T>(scope: StateScope, key: string, value: T): T {\n this.values(scope).set(validateKey(key), value);\n return value;\n }\n\n get<T>(key: string): T | undefined {\n const validKey = validateKey(key);\n if (this.scenarioValues.has(validKey)) return this.scenarioValues.get(validKey) as T;\n if (this.featureValues.has(validKey)) return this.featureValues.get(validKey) as T;\n return this.runValues.get(validKey) as T | undefined;\n }\n\n require<T>(key: string): T {\n const value = this.get<T>(key);\n if (value === undefined) throw new Error(`Required BDD state '${key}' is not set`);\n return value;\n }\n\n has(key: string): boolean {\n const validKey = validateKey(key);\n return (\n this.scenarioValues.has(validKey) ||\n this.featureValues.has(validKey) ||\n this.runValues.has(validKey)\n );\n }\n\n delete(scope: StateScope, key: string): boolean {\n return this.values(scope).delete(validateKey(key));\n }\n\n clearScenario(): void {\n this.scenarioValues.clear();\n }\n\n private values(scope: StateScope): StateValues {\n if (scope === 'run') return this.runValues;\n if (scope === 'feature') return this.featureValues;\n return this.scenarioValues;\n }\n}\n\nfunction validateKey(key: string): string {\n const trimmed = key.trim();\n if (!trimmed) throw new Error('BDD state key must not be empty');\n return trimmed;\n}\n\nexport const sharedState = new SharedStateRegistry();\n","import type { DatabricksWorld } from './world.js';\n\n/**\n * A reusable, typed scenario action.\n *\n * Behave suites sometimes compose behavior with `context.execute_steps()`. In\n * TypeScript, composing ordinary functions preserves type checking, stack\n * traces, and direct unit-testability without reparsing Gherkin at runtime.\n */\nexport type ScenarioAction<Args extends readonly unknown[] = readonly unknown[], Result = void> = (\n world: DatabricksWorld,\n ...args: Args\n) => Result | Promise<Result>;\n\n/** Preserve inference while declaring a reusable scenario action. */\nexport function defineAction<Args extends readonly unknown[], Result>(\n action: ScenarioAction<Args, Result>,\n): ScenarioAction<Args, Result> {\n return action;\n}\n\n/** Execute a typed action against the current scenario World. */\nexport async function runAction<Args extends readonly unknown[], Result>(\n world: DatabricksWorld,\n action: ScenarioAction<Args, Result>,\n ...args: Args\n): Promise<Awaited<Result>> {\n return (await action(world, ...args)) as Awaited<Result>;\n}\n","import { type IWorldOptions, World } from '@cucumber/cucumber';\nimport {\n type ExecutionContext,\n type TestProfile,\n createExecutionContext,\n resolveProfile,\n} from '@fabricorg/databricks-testkit';\nimport { type ScenarioAction, runAction as executeAction } from './actions.js';\nimport { type FixtureSetup, sharedFixtures } from './fixtures.js';\nimport type { StepOutputCapture } from './output-capture.js';\nimport { ScopedState, type StateScope, sharedState } from './scoped-state.js';\n\nexport interface DatabricksWorldParameters {\n /** Default schema for the execution context; overridable per scenario via the catalog/schema step. */\n schema?: string;\n /** Arbitrary typed runner configuration, comparable to behave `-D` userdata. */\n userdata?: Record<string, string | number | boolean>;\n}\n\ntype Cleanup = () => void | Promise<void>;\n\n/**\n * Cucumber World holding one ExecutionContext per scenario. The context is\n * created lazily on first use so `Given catalog ... and schema ...` can run\n * first; it is closed by the After hook registered in ./steps.ts.\n */\nexport class DatabricksWorld extends World<DatabricksWorldParameters> {\n readonly profile: TestProfile;\n /** Rows from the last `When I run the SQL` / `When I query table` step. */\n lastRows: Record<string, unknown>[] | null = null;\n /** Error captured from the last statement, for `Then the statement fails ...`. */\n lastError: Error | null = null;\n /** Terminal run record from the last `When I run job ...` step. */\n lastRun: Record<string, unknown> | null = null;\n /** Pipeline update handle from `When I start a full refresh of pipeline ...`. */\n lastPipelineUpdate: { pipelineId: string; updateId: string } | null = null;\n schemaOverride: string | undefined;\n catalogOverride: string | undefined;\n lastSql: string | undefined;\n lastStatementId: string | undefined;\n featureUri: string | undefined;\n scenarioName: string | undefined;\n effectiveTags: readonly string[] = [];\n stepOutputCapture: StepOutputCapture | undefined;\n lakebasePool:\n | { query<T extends Record<string, unknown>>(sql: string): Promise<{ rows: T[] }> }\n | undefined;\n private ctx: ExecutionContext | undefined;\n private activeCtx: ExecutionContext | undefined;\n private scopedState: ScopedState | undefined;\n private readonly cleanups: Cleanup[] = [];\n\n constructor(options: IWorldOptions<DatabricksWorldParameters>) {\n super(options);\n this.profile = resolveProfile();\n }\n\n async context(): Promise<ExecutionContext> {\n if (this.activeCtx) return this.activeCtx;\n if (!this.ctx) {\n const env = this.catalogOverride\n ? { ...process.env, DBX_TEST_CATALOG: this.catalogOverride }\n : process.env;\n this.ctx = await createExecutionContext({\n profile: this.profile,\n env,\n schema: this.schemaOverride ?? this.parameters.schema,\n onStatement: ({ sql, statementId }) => {\n this.lastSql = sql;\n this.lastStatementId = statementId;\n },\n });\n }\n return this.ctx;\n }\n\n /** Route subsequent steps through a scenario-owned secondary identity. */\n useExecutionContext(context: ExecutionContext): void {\n if (this.activeCtx) throw new Error('A secondary execution context is already active');\n this.activeCtx = context;\n this.addCleanup(async () => {\n await context.close();\n this.activeCtx = undefined;\n });\n }\n\n /** Register scenario-scoped cleanup. Cleanups run in reverse order. */\n addCleanup(cleanup: Cleanup): void {\n this.cleanups.push(cleanup);\n }\n\n /** Initialize Behave-style feature/scenario metadata and layered state. */\n initializeScenario(featureUri: string, scenarioName: string, tags: readonly string[]): void {\n this.featureUri = featureUri;\n this.scenarioName = scenarioName;\n this.effectiveTags = [...tags];\n this.scopedState = new ScopedState(sharedState.run(), sharedState.feature(featureUri));\n }\n\n /** Set typed state at run, feature, or scenario scope. */\n setState<T>(scope: StateScope, key: string, value: T): T {\n return this.state().set(scope, key, value);\n }\n\n /** Resolve state using scenario → feature → run precedence. */\n getState<T>(key: string): T | undefined {\n return this.state().get<T>(key);\n }\n\n /** Resolve required layered state or fail with a useful message. */\n requireState<T>(key: string): T {\n return this.state().require<T>(key);\n }\n\n /** Compose a reusable typed action without reparsing textual Gherkin. */\n runAction<Args extends readonly unknown[], Result>(\n action: ScenarioAction<Args, Result>,\n ...args: Args\n ): Promise<Awaited<Result>> {\n return executeAction(this, action, ...args);\n }\n\n /** Setup a resource once for this Cucumber run and clean it up in AfterAll. */\n runFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n return sharedFixtures.runFixture(key, setup);\n }\n\n /**\n * Setup a resource once per feature file. It is isolated by feature URI and\n * cleaned in AfterAll because cucumber-js has no reliable after-feature hook.\n */\n featureFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n if (!this.featureUri) {\n throw new Error('featureFixture is only available after the scenario Before hook');\n }\n return sharedFixtures.featureFixture(this.featureUri, key, setup);\n }\n\n /** Resolve runner userdata from worldParameters first, then DBX_TEST_USERDATA_* env. */\n userdata(name: string): string | number | boolean | undefined {\n const configured = this.parameters.userdata?.[name];\n if (configured !== undefined) return configured;\n return process.env[`DBX_TEST_USERDATA_${name.replace(/[^A-Za-z0-9]/g, '_').toUpperCase()}`];\n }\n\n scopeTo(catalog: string, schema: string): void {\n if (this.ctx) {\n throw new Error(\n 'Given catalog/schema must run before any step that touches the warehouse in the scenario',\n );\n }\n // Feature files stay portable and readable with illustrative names. A live\n // runner may redirect every scenario into its provisioned scratch scope.\n this.catalogOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_CATALOG ?? catalog) : catalog;\n this.schemaOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_SCHEMA ?? schema) : schema;\n }\n\n async dispose(): Promise<void> {\n this.stepOutputCapture?.stop();\n this.stepOutputCapture = undefined;\n const errors: unknown[] = [];\n for (const cleanup of this.cleanups.splice(0).reverse()) {\n try {\n await cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n try {\n await this.ctx?.close();\n } catch (error) {\n errors.push(error);\n }\n this.ctx = undefined;\n this.scopedState?.clearScenario();\n this.scopedState = undefined;\n if (errors.length > 0) throw new AggregateError(errors, 'Scenario cleanup failed');\n }\n\n private state(): ScopedState {\n if (!this.scopedState) {\n throw new Error('BDD scoped state is only available after the scenario Before hook');\n }\n return this.scopedState;\n }\n}\n","/**\n * The Databricks step library. Importing this module registers hooks and\n * steps with cucumber's global support registry — add it to your cucumber\n * config: `import: ['node_modules/@fabricorg/databricks-bdd/dist/steps.js']`\n * (or 'src/steps.ts' inside this repo, running cucumber under tsx).\n *\n * Keep step text engine-neutral (no TS-isms). Fabric's runner is TypeScript;\n * the wording stays portable if a customer later adds another Gherkin engine.\n */\nimport { randomUUID } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport { basename, isAbsolute, relative, resolve } from 'node:path';\nimport {\n After,\n AfterAll,\n AfterStep,\n Before,\n BeforeAll,\n BeforeStep,\n type DataTable,\n Given,\n Then,\n When,\n setDefaultTimeout,\n setWorldConstructor,\n} from '@cucumber/cucumber';\nimport {\n DatabricksJobsAdapter,\n assertDeltaContract,\n compareToGolden,\n createClientFromEnv,\n createExecutionContext,\n createLakebaseTestProvider,\n dbtBuildCheck,\n deleteVolumeFile,\n ensureVolumeDirectory,\n expectTable,\n normalizeVolumeRoot,\n notebookSubmitCheck,\n parseJobOrchestrationLiveSpec,\n resolveProfile,\n uploadVolumeFile,\n} from '@fabricorg/databricks-testkit';\nimport { FAILURE_EVIDENCE_MEDIA_TYPE, redactSecrets } from './evidence-formatter.js';\nimport { sharedFixtures } from './fixtures.js';\nimport { coerceMatchRows, inferFixture } from './infer.js';\nimport { runJobToTerminal } from './jobs.js';\nimport { startStepOutputCapture } from './output-capture.js';\nimport { parseTableIdentifier, registerParameterTypes } from './parameter-types.js';\nimport { resolvePipelineId, startPipelineUpdate, waitForPipelineUpdate } from './pipelines.js';\nimport { scenarioSkipReason } from './profile.js';\nimport { sharedState } from './scoped-state.js';\nimport { DatabricksWorld } from './world.js';\n\nsetWorldConstructor(DatabricksWorld);\n// Live workload steps may legitimately wait on a pipeline or serverless\n// compute startup. The duration in the Gherkin step remains the operation's\n// own deadline; this outer timeout prevents Cucumber from aborting it first.\nsetDefaultTimeout(resolveProfile() === 'live' ? 20 * 60_000 : 60_000);\nregisterParameterTypes();\n\nBeforeAll(async () => {\n if (resolveProfile() !== 'live') return;\n const context = await createExecutionContext({ profile: 'live' });\n try {\n const rows = await context.query('SELECT 1 AS dbx_bdd_preflight');\n if (Number(rows[0]?.dbx_bdd_preflight) !== 1) {\n throw new Error('Databricks BDD preflight returned an unexpected value');\n }\n } finally {\n await context.close();\n }\n});\n\nBefore(function (this: DatabricksWorld, { pickle }) {\n const tags = pickle.tags.map((t) => t.name);\n this.initializeScenario(pickle.uri, pickle.name, tags);\n const reason = scenarioSkipReason(tags, this.profile);\n if (reason) return 'skipped';\n return undefined;\n});\n\nAfterAll(async () => {\n try {\n await sharedFixtures.dispose();\n } finally {\n sharedState.clear();\n }\n});\n\nBeforeStep(function (this: DatabricksWorld) {\n const captureMode = process.env.DBX_TEST_CAPTURE_OUTPUT?.toLowerCase();\n if (captureMode === 'off') return;\n this.stepOutputCapture?.stop();\n this.stepOutputCapture = startStepOutputCapture({ passthrough: captureMode === 'passthrough' });\n});\n\nAfter(async function (this: DatabricksWorld) {\n await this.dispose();\n});\n\nAfterStep(async function (this: DatabricksWorld, { result, pickleStep }) {\n const captured = this.stepOutputCapture?.stop();\n this.stepOutputCapture = undefined;\n if (result.status !== 'FAILED') return;\n const evidence = {\n step: pickleStep.text,\n ...(this.lastStatementId ? { statementId: this.lastStatementId } : {}),\n ...(this.lastSql ? { sql: redactSecrets(this.lastSql).slice(0, 4_000) } : {}),\n ...(captured?.text\n ? {\n output: redactSecrets(captured.text),\n outputBytes: captured.totalBytes,\n outputTruncated: captured.truncated,\n }\n : {}),\n };\n await this.attach(JSON.stringify(evidence, null, 2), FAILURE_EVIDENCE_MEDIA_TYPE);\n});\n\n// ---------------------------------------------------------------- Given ----\n\nGiven('a Databricks workspace', async function (this: DatabricksWorld) {\n // local profile: DuckDB stands in — nothing to validate.\n // live profile: eagerly resolve auth + warehouse so misconfiguration fails here.\n if (this.profile === 'live') await this.context();\n});\n\nGiven('a Lakebase database', async function (this: DatabricksWorld) {\n if (this.profile !== 'live') {\n throw new Error('Lakebase steps require DBX_TEST_PROFILE=live and the @lakebase tag');\n }\n const provider = createLakebaseTestProvider(process.env);\n this.lakebasePool = provider.getPool();\n this.addCleanup(async () => {\n this.lakebasePool = undefined;\n await provider.close();\n });\n await this.lakebasePool.query('SELECT 1 AS dbx_bdd_lakebase');\n});\n\nGiven(\n 'catalog {string} and schema {string}',\n function (this: DatabricksWorld, catalog: string, schema: string) {\n this.scopeTo(catalog, schema);\n },\n);\n\nGiven(\n 'a table {string} with:',\n async function (this: DatabricksWorld, table: string, data: DataTable) {\n const ctx = await this.context();\n await ctx.loadFixture(inferFixture(table, data.raw()));\n },\n);\n\nGiven(\n 'a table {string} with schema {string} and rows:',\n async function (this: DatabricksWorld, table: string, schema: string, data: DataTable) {\n const ctx = await this.context();\n await ctx.loadFixture({ table, schema, rows: data.hashes() });\n },\n);\n\nGiven(\n 'an empty table {string} with schema {string}',\n async function (this: DatabricksWorld, table: string, schema: string) {\n const ctx = await this.context();\n await ctx.loadFixture({ table, schema, rows: [] });\n },\n);\n\nGiven(\n 'a table {string} with schema {string} from fixture {string}',\n async function (this: DatabricksWorld, table: string, schema: string, ndjsonFile: string) {\n const ctx = await this.context();\n await ctx.loadFixture({ table, schema, ndjsonFile });\n },\n);\n\nGiven(\n 'fixture files uploaded to volume {string}:',\n async function (this: DatabricksWorld, configuredVolume: string, data: DataTable) {\n if (this.profile !== 'live') {\n throw new Error('Volume upload steps require DBX_TEST_PROFILE=live and the @live tag');\n }\n const volumeValue = configuredVolume.startsWith('$')\n ? process.env[configuredVolume.slice(1)]\n : configuredVolume;\n if (!volumeValue) throw new Error(`Volume '${configuredVolume}' is not configured`);\n const root = normalizeVolumeRoot(volumeValue);\n const rows = data.hashes();\n const uploadPrefix = rows[0]?.prefix?.trim() ?? '';\n if (uploadPrefix && !/^[A-Za-z0-9_.-]+(?:\\/[A-Za-z0-9_.-]+)*$/.test(uploadPrefix)) {\n throw new Error(`Invalid volume fixture prefix '${uploadPrefix}'`);\n }\n if (rows.some((row) => (row.prefix?.trim() ?? '') !== uploadPrefix)) {\n throw new Error('All fixture rows in one upload step must use the same prefix');\n }\n const runPrefix = `${(process.env.DBX_TEST_ENV_NAME ?? 'bdd').replace(/[^A-Za-z0-9_.-]/g, '_')}/${randomUUID()}`;\n const directory = `${root}${uploadPrefix ? `/${uploadPrefix}` : ''}/${runPrefix}`;\n await ensureVolumeDirectory(process.env, directory);\n const paths = rows.map((row) => row.path).filter((path): path is string => Boolean(path));\n if (paths.length === 0) throw new Error('Fixture upload table requires a path column');\n for (const source of paths) {\n const absolute = resolve(process.cwd(), source);\n const fromCwd = relative(process.cwd(), absolute);\n if (fromCwd.startsWith('..') || isAbsolute(fromCwd)) {\n throw new Error(`Fixture path escapes the feature workspace: ${source}`);\n }\n const destination = `${directory}/${basename(source)}`;\n await uploadVolumeFile(process.env, destination, new Uint8Array(await readFile(absolute)));\n this.addCleanup(() => deleteVolumeFile(process.env, destination));\n }\n },\n);\n\nGiven(\n 'service principal {string} with grants:',\n async function (this: DatabricksWorld, principalKey: string, data: DataTable) {\n if (this.profile !== 'live') {\n throw new Error('Service-principal scenarios require DBX_TEST_PROFILE=live and @live');\n }\n const envPrefix = `DBX_TEST_PRINCIPAL_${principalKey.replace(/[^A-Za-z0-9]/g, '_').toUpperCase()}`;\n const clientId = process.env[`${envPrefix}_CLIENT_ID`];\n const clientSecret = process.env[`${envPrefix}_CLIENT_SECRET`];\n const principalName = process.env[`${envPrefix}_NAME`] ?? principalKey;\n if (!clientId || !clientSecret) {\n throw new Error(`Missing ${envPrefix}_CLIENT_ID and ${envPrefix}_CLIENT_SECRET`);\n }\n const primary = await this.context();\n const grants = data.hashes().map((row) => normalizeGrant(row));\n if (grants.length === 0) throw new Error('Grant table contains no rows');\n const quotedPrincipal = `\\`${principalName.replaceAll('`', '``')}\\``;\n for (const grant of grants) {\n await primary.exec(\n `GRANT ${grant.privileges.join(', ')} ON ${grant.securableType} ${grant.securable} TO ${quotedPrincipal}`,\n );\n }\n this.addCleanup(async () => {\n for (const grant of [...grants].reverse()) {\n await primary.exec(\n `REVOKE ${grant.privileges.join(', ')} ON ${grant.securableType} ${grant.securable} FROM ${quotedPrincipal}`,\n );\n }\n });\n const secondaryEnv = {\n ...process.env,\n DATABRICKS_BEARER: undefined,\n DATABRICKS_TOKEN: undefined,\n DATABRICKS_CLIENT_ID: clientId,\n DATABRICKS_CLIENT_SECRET: clientSecret,\n };\n const secondary = await createExecutionContext({\n profile: 'live',\n env: secondaryEnv,\n schema: this.schemaOverride ?? this.parameters.schema,\n onStatement: ({ sql, statementId }) => {\n this.lastSql = sql;\n this.lastStatementId = statementId;\n },\n });\n this.useExecutionContext(secondary);\n },\n);\n\n// ----------------------------------------------------------------- When ----\n\nWhen('I run the SQL:', async function (this: DatabricksWorld, sql: string) {\n const ctx = await this.context();\n this.lastSql = sql;\n this.lastError = null;\n this.lastRows = null;\n try {\n this.lastRows = await ctx.query(sql);\n } catch (error) {\n this.lastError = error instanceof Error ? error : new Error(String(error));\n }\n});\n\nWhen('I query Lakebase:', async function (this: DatabricksWorld, sql: string) {\n if (!this.lakebasePool) {\n throw new Error('No Lakebase database in this scenario — add Given a Lakebase database');\n }\n this.lastSql = sql;\n this.lastError = null;\n this.lastRows = null;\n try {\n const result = await this.lakebasePool.query(sql);\n this.lastRows = result.rows;\n } catch (error) {\n this.lastError = error instanceof Error ? error : new Error(String(error));\n }\n});\n\nWhen('I query table {string}', async function (this: DatabricksWorld, table: string) {\n const ctx = await this.context();\n this.lastRows = await ctx.query(`SELECT * FROM ${ctx.qual(table)}`);\n});\n\nWhen('I run job {string}', async function (this: DatabricksWorld, nameOrId: string) {\n const client = createClientFromEnv(process.env);\n const result = await runJobToTerminal(client, nameOrId);\n this.lastRun = { result_state: result.resultState, life_cycle_state: result.lifeCycleState };\n});\n\nWhen('I submit the job orchestration:', async function (this: DatabricksWorld, json: string) {\n const spec = parseJobOrchestrationLiveSpec(json);\n const adapter = new DatabricksJobsAdapter(createClientFromEnv(process.env));\n const runId = await adapter.submit(spec.request);\n const run = await adapter.wait(runId, {\n timeoutMs: Number(process.env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(process.env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n this.lastRun = {\n run_id: run.runId,\n result_state: run.resultState,\n life_cycle_state: run.lifeCycleState,\n tasks: run.tasks,\n };\n});\n\nWhen('I start the job orchestration:', async function (this: DatabricksWorld, json: string) {\n const spec = parseJobOrchestrationLiveSpec(json);\n const adapter = new DatabricksJobsAdapter(createClientFromEnv(process.env));\n const runId = await adapter.submit(spec.request);\n this.lastRun = { run_id: runId, life_cycle_state: 'PENDING', result_state: '' };\n});\n\nWhen('I wait for the current job run', async function (this: DatabricksWorld) {\n const runId = Number(this.lastRun?.run_id);\n if (!Number.isFinite(runId)) throw new Error('No submitted job run in this scenario');\n const adapter = new DatabricksJobsAdapter(createClientFromEnv(process.env));\n const run = await adapter.wait(runId, {\n timeoutMs: Number(process.env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(process.env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n this.lastRun = {\n run_id: run.runId,\n result_state: run.resultState,\n life_cycle_state: run.lifeCycleState,\n tasks: run.tasks,\n };\n});\n\nWhen('I cancel the current job run', async function (this: DatabricksWorld) {\n const runId = Number(this.lastRun?.run_id);\n if (!Number.isFinite(runId)) {\n throw new Error('No submitted job run in this scenario');\n }\n const adapter = new DatabricksJobsAdapter(createClientFromEnv(process.env));\n await adapter.cancel(runId);\n});\n\nWhen('I repair failed tasks in the current job run', async function (this: DatabricksWorld) {\n const runId = Number(this.lastRun?.run_id);\n const tasks = Array.isArray(this.lastRun?.tasks)\n ? (this.lastRun.tasks as Array<{ taskKey?: string; resultState?: string }>)\n : [];\n if (!Number.isFinite(runId)) {\n throw new Error('No submitted job run in this scenario');\n }\n const failed = tasks\n .filter((task) => task.resultState === 'FAILED' && task.taskKey)\n .map((task) => task.taskKey as string);\n const adapter = new DatabricksJobsAdapter(createClientFromEnv(process.env));\n const repairId = await adapter.repair(runId, {\n rerunTasks: failed.length > 0 ? failed : undefined,\n rerunDependentTasks: true,\n });\n const repaired = await adapter.waitForRepair(runId, repairId, {\n timeoutMs: Number(process.env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(process.env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n this.lastRun = {\n run_id: repaired.runId,\n result_state: repaired.resultState,\n life_cycle_state: repaired.lifeCycleState,\n tasks: repaired.tasks,\n };\n});\n\nWhen('I submit notebook {string}', async function (this: DatabricksWorld, notebookPath: string) {\n const client = createClientFromEnv(process.env);\n await notebookSubmitCheck().run({\n env: { ...process.env, DBX_TEST_NOTEBOOK_PATH: notebookPath },\n warehouse: await this.context(),\n client,\n });\n this.lastRun = { result_state: 'SUCCESS', life_cycle_state: 'TERMINATED' };\n});\n\nWhen('I run dbt build for {string}', async function (this: DatabricksWorld, project: string) {\n const client = createClientFromEnv(process.env);\n await dbtBuildCheck().run({\n env: { ...process.env, DBX_TEST_DBT_PROJECT_DIR: project },\n warehouse: await this.context(),\n client,\n });\n this.lastRun = { result_state: 'SUCCESS', life_cycle_state: 'TERMINATED' };\n});\n\nWhen(\n 'I start a full refresh of pipeline {string}',\n async function (this: DatabricksWorld, nameOrId: string) {\n const isolated = process.env.DBX_TEST_AUTOLOADER_PIPELINE_ID;\n const requested = nameOrId.startsWith('$') ? process.env[nameOrId.slice(1)] : nameOrId;\n if (!isolated || !requested || requested !== isolated) {\n throw new Error(\n 'Full refresh is restricted to DBX_TEST_AUTOLOADER_PIPELINE_ID; production pipelines are never full-refreshed by BDD tests',\n );\n }\n const client = createClientFromEnv(process.env);\n const pipelineId = await resolvePipelineId(client, requested);\n const updateId = await startPipelineUpdate(client, pipelineId, { fullRefresh: true });\n this.lastPipelineUpdate = { pipelineId, updateId };\n },\n);\n\nWhen(\n 'I start a refresh of pipeline {string}',\n async function (this: DatabricksWorld, nameOrId: string) {\n const requested = nameOrId.startsWith('$') ? process.env[nameOrId.slice(1)] : nameOrId;\n if (!requested) throw new Error(`Pipeline '${nameOrId}' is not configured`);\n const client = createClientFromEnv(process.env);\n const pipelineId = await resolvePipelineId(client, requested);\n const updateId = await startPipelineUpdate(client, pipelineId, { fullRefresh: false });\n this.lastPipelineUpdate = { pipelineId, updateId };\n },\n);\n\n// ----------------------------------------------------------------- Then ----\n\nThen(\n 'table {string} has {int} rows',\n async function (this: DatabricksWorld, table: string, n: number) {\n await expectTable(await this.context(), table).toHaveRowCount(n);\n },\n);\n\nThen(\n 'table {string} contains rows matching:',\n async function (this: DatabricksWorld, table: string, data: DataTable) {\n await expectTable(await this.context(), table).toContainRows(coerceMatchRows(data.raw()));\n },\n);\n\nThen(\n 'table {string} contains exactly:',\n async function (this: DatabricksWorld, table: string, data: DataTable) {\n const ctx = await this.context();\n const expected = coerceMatchRows(data.raw());\n const header = (data.raw()[0] ?? []).join(', ');\n const rows = await ctx.query(`SELECT ${header} FROM ${ctx.qual(table)}`);\n if (rows.length !== expected.length) {\n throw new Error(`Expected exactly ${expected.length} rows in ${table}, found ${rows.length}`);\n }\n await expectTable(ctx, table).toContainRows(expected);\n },\n);\n\nThen(\n 'table {string} matches golden {string} ordered by {string}',\n async function (this: DatabricksWorld, table: string, golden: string, orderBy: string) {\n await expectTable(await this.context(), table).toMatchGolden(golden, { orderBy });\n },\n);\n\nThen(\n 'table {string} matches schema contract {string}',\n async function (this: DatabricksWorld, table: string, contractFile: string) {\n const absolute = resolve(process.cwd(), contractFile);\n const fromCwd = relative(process.cwd(), absolute);\n if (fromCwd.startsWith('..') || isAbsolute(fromCwd)) {\n throw new Error(`Schema contract path escapes the feature workspace: ${contractFile}`);\n }\n const parsed = JSON.parse(await readFile(absolute, 'utf8')) as\n | { columns?: { name: string; type?: string }[] }\n | { name: string; type?: string }[];\n const columns = Array.isArray(parsed) ? parsed : parsed.columns;\n if (!columns || columns.length === 0) {\n throw new Error(`Schema contract ${contractFile} contains no columns`);\n }\n const ctx = await this.context();\n const rows = await ctx.query(`DESCRIBE TABLE ${ctx.qual(table)}`);\n assertDeltaContract(table, rows, columns);\n },\n);\n\nThen('the result has {int} rows', function (this: DatabricksWorld, n: number) {\n requireRows(this);\n if (this.lastRows?.length !== n) {\n throw new Error(`Expected ${n} result rows, got ${this.lastRows?.length}`);\n }\n});\n\nThen('the result contains rows matching:', function (this: DatabricksWorld, data: DataTable) {\n requireRows(this);\n const rows = this.lastRows ?? [];\n for (const partial of coerceMatchRows(data.raw())) {\n const hit = rows.some((row) =>\n Object.entries(partial).every(([key, value]) => cellEqual(row[key], value)),\n );\n if (!hit) {\n throw new Error(\n `Result does not contain a row matching ${JSON.stringify(partial)} — rows: ${JSON.stringify(rows.slice(0, 5))}`,\n );\n }\n }\n});\n\nThen('the result matches golden {string}', async function (this: DatabricksWorld, golden: string) {\n requireRows(this);\n await compareToGolden(golden, this.lastRows ?? [], 'result');\n});\n\nThen('the statement fails with {string}', function (this: DatabricksWorld, fragment: string) {\n if (!this.lastError)\n throw new Error(`Expected the statement to fail with '${fragment}', but it succeeded`);\n if (!this.lastError.message.toLowerCase().includes(fragment.toLowerCase())) {\n throw new Error(`Statement failed, but with a different error: ${this.lastError.message}`);\n }\n});\n\nThen('the statement fails with permission denied', function (this: DatabricksWorld) {\n if (!this.lastError) throw new Error('Expected a permission error, but the statement succeeded');\n if (!/permission.?denied|insufficient.?priv|403|unauthoriz/i.test(this.lastError.message)) {\n throw new Error(`Statement failed, but not with a permission error: ${this.lastError.message}`);\n }\n});\n\nThen(\n 'no rows were rescued in table {string}',\n async function (this: DatabricksWorld, table: string) {\n const ctx = await this.context();\n const rows = await ctx.query(\n `SELECT COUNT(*) AS n FROM ${ctx.qual(table)} WHERE _rescued_data IS NOT NULL`,\n );\n const n = Number(rows[0]?.n ?? Number.NaN);\n if (n !== 0) {\n throw new Error(`${n} rescued rows in ${table} — the ingestion contract drifted`);\n }\n },\n);\n\nThen(\n 'configured table {string} has at least {int} rows',\n async function (this: DatabricksWorld, configuredTable: string, minimum: number) {\n const table = resolveConfiguredValue(configuredTable, 'table');\n parseTableIdentifier(table);\n const rows = await (await this.context()).query(`SELECT COUNT(*) AS n FROM ${table}`);\n const count = Number(rows[0]?.n ?? Number.NaN);\n if (!Number.isFinite(count) || count < minimum) {\n throw new Error(`Expected at least ${minimum} rows in ${table}, found ${count}`);\n }\n },\n);\n\nThen(\n 'no rows were rescued in configured table {string}',\n async function (this: DatabricksWorld, configuredTable: string) {\n const table = resolveConfiguredValue(configuredTable, 'table');\n parseTableIdentifier(table);\n const rows = await (await this.context()).query(\n `SELECT COUNT(*) AS n FROM ${table} WHERE _rescued_data IS NOT NULL`,\n );\n const count = Number(rows[0]?.n ?? Number.NaN);\n if (count !== 0) throw new Error(`${count} rescued rows in ${table}`);\n },\n);\n\nThen(\n 'row count of {string} is within {int}% of {int}',\n async function (this: DatabricksWorld, table: string, pct: number, target: number) {\n const ctx = await this.context();\n const rows = await ctx.query(`SELECT COUNT(*) AS n FROM ${ctx.qual(table)}`);\n const n = Number(rows[0]?.n ?? Number.NaN);\n const tolerance = (target * pct) / 100;\n if (Math.abs(n - target) > tolerance) {\n throw new Error(`Row count ${n} of ${table} is outside ${target} ± ${tolerance}`);\n }\n },\n);\n\nThen('the job run reaches {runState}', function (this: DatabricksWorld, state: string) {\n if (!this.lastRun) throw new Error('No job run in this scenario — add a When I run job step');\n if (this.lastRun.result_state !== state) {\n throw new Error(`Job run ended in ${this.lastRun.result_state}, expected ${state}`);\n }\n});\n\nThen(\n 'task {string} reaches {runState}',\n function (this: DatabricksWorld, taskKey: string, state: string) {\n const tasks = Array.isArray(this.lastRun?.tasks)\n ? (this.lastRun.tasks as Array<{ taskKey?: string; resultState?: string }>)\n : [];\n const task = tasks.find((candidate) => candidate.taskKey === taskKey);\n if (!task) throw new Error(`Job run does not contain task '${taskKey}'`);\n if (task.resultState !== state) {\n throw new Error(\n `Task '${taskKey}' ended in ${task.resultState ?? 'UNKNOWN'}, expected ${state}`,\n );\n }\n },\n);\n\nThen('the job run has {int} tasks', function (this: DatabricksWorld, count: number) {\n const tasks = Array.isArray(this.lastRun?.tasks) ? this.lastRun.tasks : [];\n if (tasks.length !== count) {\n throw new Error(`Job run has ${tasks.length} tasks, expected ${count}`);\n }\n});\n\nThen(\n 'the pipeline update completes within {duration}',\n async function (this: DatabricksWorld, durationMs: number) {\n if (!this.lastPipelineUpdate) {\n throw new Error('No pipeline update in this scenario — add a When I start ... pipeline step');\n }\n const client = createClientFromEnv(process.env);\n await waitForPipelineUpdate(\n client,\n this.lastPipelineUpdate.pipelineId,\n this.lastPipelineUpdate.updateId,\n { timeoutMs: durationMs },\n );\n },\n);\n\n// ------------------------------------------------------------------ util ---\n\nfunction requireRows(world: DatabricksWorld): void {\n if (world.lastError) {\n throw new Error(`The last statement failed: ${world.lastError.message}`);\n }\n if (world.lastRows === null) {\n throw new Error('No result captured — add a When I run the SQL / I query table step first');\n }\n}\n\nfunction cellEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a === 'number' && typeof b === 'number') return Math.abs(a - b) < 1e-9;\n if (typeof a === 'string' && typeof b === 'string') {\n return (\n a.replace('T', ' ').replace(/(\\.\\d+)?Z?$/, '') ===\n b.replace('T', ' ').replace(/(\\.\\d+)?Z?$/, '')\n );\n }\n return false;\n}\n\nfunction resolveConfiguredValue(value: string, label: string): string {\n if (!value.startsWith('$')) return value;\n const resolved = process.env[value.slice(1)];\n if (!resolved) throw new Error(`${label} '${value}' is not configured`);\n return resolved;\n}\n\nconst ALLOWED_PRIVILEGES = new Set([\n 'ALL PRIVILEGES',\n 'USE CATALOG',\n 'USE SCHEMA',\n 'SELECT',\n 'MODIFY',\n 'READ VOLUME',\n 'WRITE VOLUME',\n]);\n\nfunction normalizeGrant(row: Record<string, string>): {\n securableType: string;\n securable: string;\n privileges: string[];\n} {\n const securableType = (row.securable_type ?? 'SCHEMA').trim().toUpperCase();\n if (!['CATALOG', 'SCHEMA', 'TABLE', 'VOLUME'].includes(securableType)) {\n throw new Error(`Unsupported securable_type '${securableType}'`);\n }\n const securable = parseTableIdentifier(row.securable ?? '');\n const privileges = (row.privilege ?? row.privileges ?? '')\n .split(',')\n .map((value) => value.trim().toUpperCase())\n .filter(Boolean);\n if (privileges.length === 0 || privileges.some((value) => !ALLOWED_PRIVILEGES.has(value))) {\n throw new Error(`Unsupported or empty privileges '${row.privilege ?? row.privileges ?? ''}'`);\n }\n return { securableType, securable, privileges };\n}\n"]}
1
+ {"version":3,"sources":["../src/evidence-formatter.ts","../src/fixtures.ts","../src/infer.ts","../src/jobs.ts","../src/output-capture.ts","../src/parameter-types.ts","../src/pipelines.ts","../src/profile.ts","../src/scoped-state.ts","../src/actions.ts","../src/world.ts","../src/steps.ts"],"names":["waitForDatabricksRun","format","defineParameterType","World","resolveProfile","createExecutionContext","setWorldConstructor","setDefaultTimeout","BeforeAll","Before","AfterAll","BeforeStep","After","AfterStep","Given","createLakebaseTestProvider","normalizeVolumeRoot","randomUUID","ensureVolumeDirectory","resolve","relative","isAbsolute","basename","uploadVolumeFile","readFile","deleteVolumeFile","When","createClientFromEnv","parseJobOrchestrationLiveSpec","DatabricksJobsAdapter","notebookSubmitCheck","dbtBuildCheck","Then","expectTable","assertDeltaContract","compareToGolden","waitForPipelineUpdate"],"mappings":"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","file":"steps.cjs","sourcesContent":["import { Formatter, type IFormatterOptions } from '@cucumber/cucumber';\n\n/**\n * Evidence formatter: schema-versioned, secret-redacted JSON summary of a\n * BDD run, shared in spirit with the live check runner's evidence output so\n * nightly runs double as audit artifacts. Wire it up in cucumber config:\n *\n * format: [['@fabricorg/databricks-bdd/evidence-formatter', 'reports/evidence.json']]\n */\nexport interface EvidenceScenario {\n name: string;\n uri: string;\n tags: string[];\n status: string;\n durationMs: number;\n error?: string;\n failures?: StepFailureEvidence[];\n}\n\nexport interface StepFailureEvidence {\n step: string;\n statementId?: string;\n sql?: string;\n output?: string;\n outputBytes?: number;\n outputTruncated?: boolean;\n}\n\nexport interface EvidenceReport {\n schemaVersion: 2;\n kind: 'databricks-bdd';\n profile: string;\n finishedAt: string;\n success: boolean;\n summary: Record<string, number>;\n scenarios: EvidenceScenario[];\n}\n\ninterface Envelope {\n attachment?: {\n body: string;\n contentEncoding: 'IDENTITY' | 'BASE64';\n mediaType: string;\n testCaseStartedId?: string;\n };\n pickle?: { id: string; name: string; uri: string; tags?: { name: string }[] };\n testCase?: { id: string; pickleId: string };\n testCaseStarted?: { id: string; testCaseId: string };\n testStepFinished?: {\n testCaseStartedId: string;\n testStepResult: {\n status: string;\n message?: string;\n duration?: { seconds: number; nanos: number };\n };\n };\n testRunFinished?: { success?: boolean; timestamp?: { seconds: number; nanos: number } };\n}\n\nexport const FAILURE_EVIDENCE_MEDIA_TYPE = 'application/vnd.fabric.databricks-bdd.failure+json';\n\nconst STATUS_RANK = ['UNKNOWN', 'PASSED', 'SKIPPED', 'PENDING', 'UNDEFINED', 'AMBIGUOUS', 'FAILED'];\n\nexport default class EvidenceFormatter extends Formatter {\n private readonly pickles = new Map<string, NonNullable<Envelope['pickle']>>();\n private readonly testCases = new Map<string, string>(); // testCaseId → pickleId\n private readonly attempts = new Map<\n string,\n {\n pickleId: string;\n status: string;\n durationMs: number;\n error?: string;\n failures: StepFailureEvidence[];\n }\n >();\n\n constructor(options: IFormatterOptions) {\n super(options);\n options.eventBroadcaster.on('envelope', (envelope: Envelope) => this.onEnvelope(envelope));\n }\n\n private onEnvelope(envelope: Envelope): void {\n if (envelope.pickle) this.pickles.set(envelope.pickle.id, envelope.pickle);\n if (envelope.testCase) this.testCases.set(envelope.testCase.id, envelope.testCase.pickleId);\n if (envelope.testCaseStarted) {\n this.attempts.set(envelope.testCaseStarted.id, {\n pickleId: this.testCases.get(envelope.testCaseStarted.testCaseId) ?? '',\n status: 'UNKNOWN',\n durationMs: 0,\n failures: [],\n });\n }\n if (envelope.attachment?.testCaseStartedId) {\n const attempt = this.attempts.get(envelope.attachment.testCaseStartedId);\n const failure = parseFailureEvidenceAttachment(envelope.attachment);\n if (attempt && failure) attempt.failures.push(failure);\n }\n if (envelope.testStepFinished) {\n const attempt = this.attempts.get(envelope.testStepFinished.testCaseStartedId);\n if (attempt) {\n const result = envelope.testStepFinished.testStepResult;\n if (STATUS_RANK.indexOf(result.status) > STATUS_RANK.indexOf(attempt.status)) {\n attempt.status = result.status;\n if (result.message) attempt.error = redactSecrets(result.message);\n }\n const d = result.duration;\n if (d) attempt.durationMs += d.seconds * 1000 + d.nanos / 1e6;\n }\n }\n if (envelope.testRunFinished) this.finish(envelope.testRunFinished);\n }\n\n private finish(finished: NonNullable<Envelope['testRunFinished']>): void {\n const scenarios: EvidenceScenario[] = [];\n const summary: Record<string, number> = {};\n for (const attempt of this.attempts.values()) {\n const pickle = this.pickles.get(attempt.pickleId);\n const status = attempt.status.toLowerCase();\n summary[status] = (summary[status] ?? 0) + 1;\n scenarios.push({\n name: pickle?.name ?? attempt.pickleId,\n uri: pickle?.uri ?? '',\n tags: (pickle?.tags ?? []).map((t) => t.name),\n status,\n durationMs: Math.round(attempt.durationMs),\n ...(attempt.error ? { error: attempt.error } : {}),\n ...(attempt.failures.length > 0 ? { failures: attempt.failures } : {}),\n });\n }\n const report: EvidenceReport = {\n schemaVersion: 2,\n kind: 'databricks-bdd',\n profile: process.env.DBX_TEST_PROFILE ?? 'local',\n finishedAt: new Date().toISOString(),\n success: finished.success ?? !scenarios.some((s) => s.status === 'failed'),\n summary,\n scenarios,\n };\n this.log(`${JSON.stringify(report, null, 2)}\\n`);\n }\n}\n\n/** Decode the structured attachment emitted by the failure hook. */\nexport function parseFailureEvidenceAttachment(\n attachment: NonNullable<Envelope['attachment']>,\n): StepFailureEvidence | null {\n if (attachment.mediaType !== FAILURE_EVIDENCE_MEDIA_TYPE) return null;\n try {\n const body =\n attachment.contentEncoding === 'BASE64'\n ? Buffer.from(attachment.body, 'base64').toString('utf8')\n : attachment.body;\n const parsed = JSON.parse(redactSecrets(body)) as Partial<StepFailureEvidence>;\n if (typeof parsed.step !== 'string') return null;\n return {\n step: parsed.step,\n ...(typeof parsed.statementId === 'string' ? { statementId: parsed.statementId } : {}),\n ...(typeof parsed.sql === 'string' ? { sql: parsed.sql } : {}),\n ...(typeof parsed.output === 'string' ? { output: parsed.output } : {}),\n ...(typeof parsed.outputBytes === 'number' ? { outputBytes: parsed.outputBytes } : {}),\n ...(typeof parsed.outputTruncated === 'boolean'\n ? { outputTruncated: parsed.outputTruncated }\n : {}),\n };\n } catch {\n return null;\n }\n}\n\nconst SECRET_ENV_RE = /(TOKEN|SECRET|PASSWORD|BEARER|KEY)/;\n\n/** Replace values of secret-looking env vars anywhere they appear in text. */\nexport function redactSecrets(\n text: string,\n env: Record<string, string | undefined> = process.env,\n): string {\n let out = text;\n for (const [name, value] of Object.entries(env)) {\n if (!value || value.length < 6) continue;\n if (!SECRET_ENV_RE.test(name)) continue;\n out = out.split(value).join('[REDACTED]');\n }\n return out;\n}\n","/**\n * Behave-style shared fixtures for expensive Databricks resources.\n *\n * Cucumber Worlds are scenario-scoped. These registries provide the two\n * broader scopes users commonly need when migrating Behave suites:\n *\n * - runFixture: setup once for the entire Cucumber run;\n * - featureFixture: setup once per feature URI.\n *\n * Both scopes are drained by the package AfterAll hook. Deferring feature\n * cleanup until AfterAll is intentional: cucumber-js may interleave scenarios\n * and does not expose an after-feature hook. The resource is still isolated by\n * feature URI and is never reused by another feature.\n */\n\nexport type FixtureCleanup = () => void | Promise<void>;\nexport type FixtureSetup<T> = () =>\n | T\n | Promise<T>\n | { value: T; cleanup: FixtureCleanup }\n | Promise<{ value: T; cleanup: FixtureCleanup }>;\n\ninterface FixtureEntry<T = unknown> {\n value: Promise<T>;\n cleanup?: FixtureCleanup;\n}\n\nfunction isFixtureResult<T>(value: T | { value: T; cleanup: FixtureCleanup }): value is {\n value: T;\n cleanup: FixtureCleanup;\n} {\n return (\n typeof value === 'object' &&\n value !== null &&\n Object.prototype.hasOwnProperty.call(value, 'value') &&\n typeof (value as { cleanup?: unknown }).cleanup === 'function'\n );\n}\n\nexport class SharedFixtureRegistry {\n private readonly runEntries = new Map<string, FixtureEntry>();\n private readonly featureEntries = new Map<string, Map<string, FixtureEntry>>();\n private readonly cleanupOrder: FixtureEntry[] = [];\n\n runFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n return this.resolve(this.runEntries, key, setup);\n }\n\n featureFixture<T>(featureUri: string, key: string, setup: FixtureSetup<T>): Promise<T> {\n if (!featureUri) throw new Error('featureFixture requires a feature URI');\n let feature = this.featureEntries.get(featureUri);\n if (!feature) {\n feature = new Map();\n this.featureEntries.set(featureUri, feature);\n }\n return this.resolve(feature, key, setup);\n }\n\n private resolve<T>(entries: Map<string, FixtureEntry>, key: string, setup: FixtureSetup<T>) {\n if (!key.trim()) throw new Error('Fixture key must not be empty');\n const existing = entries.get(key);\n if (existing) return existing.value as Promise<T>;\n\n const entry: FixtureEntry<T> = {\n value: Promise.resolve()\n .then(setup)\n .then((result) => {\n if (isFixtureResult(result)) {\n entry.cleanup = result.cleanup;\n return result.value;\n }\n return result;\n })\n .catch((error) => {\n entries.delete(key);\n const index = this.cleanupOrder.indexOf(entry);\n if (index >= 0) this.cleanupOrder.splice(index, 1);\n throw error;\n }),\n };\n entries.set(key, entry);\n this.cleanupOrder.push(entry);\n return entry.value;\n }\n\n async dispose(): Promise<void> {\n const errors: unknown[] = [];\n for (const entry of this.cleanupOrder.splice(0).reverse()) {\n try {\n // Ensure setup has settled before attempting its cleanup.\n await entry.value.catch(() => undefined);\n await entry.cleanup?.();\n } catch (error) {\n errors.push(error);\n }\n }\n this.runEntries.clear();\n this.featureEntries.clear();\n if (errors.length > 0) throw new AggregateError(errors, 'Shared fixture cleanup failed');\n }\n}\n\nexport const sharedFixtures = new SharedFixtureRegistry();\n","import type { TableFixture } from '@fabricorg/databricks-testkit';\n\nconst INT_RE = /^-?\\d+$/;\nconst FLOAT_RE = /^-?\\d+\\.\\d+$/;\nconst TIMESTAMP_RE = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(:\\d{2})?/;\nconst BOOL_RE = /^(true|false)$/i;\n\n/**\n * Turn a Gherkin data table (header row + string cells) into a TableFixture,\n * inferring portable column types from the values: BIGINT, DOUBLE,\n * TIMESTAMP, BOOLEAN, else STRING. Empty cells become NULL.\n */\nexport function inferFixture(table: string, raw: readonly (readonly string[])[]): TableFixture {\n if (raw.length < 2) {\n throw new Error(`Data table for ${table} needs a header row and at least one data row`);\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n const types = header.map((_, col) => inferColumnType(body.map((row) => row[col] ?? '')));\n const schema = header.map((name, i) => `\"${name}\" ${types[i]}`).join(', ');\n const rows = body.map((row) => row.map((cell, i) => coerceCell(cell, types[i] ?? 'STRING')));\n return { table, schema, rows };\n}\n\n/** Coerce data-table string cells to typed values for row matching (no header row). */\nexport function coerceMatchRows(raw: readonly (readonly string[])[]): Record<string, unknown>[] {\n if (raw.length < 2) {\n throw new Error('Match table needs a header row and at least one data row');\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n return body.map((row) => {\n const out: Record<string, unknown> = {};\n header.forEach((name, i) => {\n out[name] = coerceCell(row[i] ?? '', inferColumnType([row[i] ?? '']));\n });\n return out;\n });\n}\n\nfunction inferColumnType(cells: readonly string[]): string {\n const present = cells.filter((c) => c !== '');\n if (present.length === 0) return 'STRING';\n if (present.every((c) => INT_RE.test(c))) return 'BIGINT';\n if (present.every((c) => FLOAT_RE.test(c) || INT_RE.test(c))) return 'DOUBLE';\n if (present.every((c) => TIMESTAMP_RE.test(c))) return 'TIMESTAMP';\n if (present.every((c) => BOOL_RE.test(c))) return 'BOOLEAN';\n return 'STRING';\n}\n\nfunction coerceCell(cell: string, type: string): unknown {\n if (cell === '') return null;\n if (type === 'BIGINT' || type === 'DOUBLE') return Number(cell);\n if (type === 'BOOLEAN') return /^true$/i.test(cell);\n return cell;\n}\n","import { type WorkspaceClientLike, waitForDatabricksRun } from '@fabricorg/databricks-testkit';\n\nexport interface RunJobOptions {\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface JobRunResult {\n runId: number;\n lifeCycleState: string;\n resultState: string;\n run: Record<string, unknown>;\n}\n\n/** Resolve a job by numeric id or by exact name via /api/2.1/jobs/list. */\nexport async function resolveJobId(client: WorkspaceClientLike, nameOrId: string): Promise<number> {\n if (/^\\d+$/.test(nameOrId)) return Number(nameOrId);\n const response = await client.get<{ jobs?: { job_id: number; settings?: { name?: string } }[] }>(\n '/api/2.1/jobs/list',\n { name: nameOrId },\n );\n const match = (response.jobs ?? []).find((j) => j.settings?.name === nameOrId);\n if (!match) throw new Error(`No Databricks job named '${nameOrId}' found`);\n return match.job_id;\n}\n\n/** run-now a job and poll its run to a terminal state. */\nexport async function runJobToTerminal(\n client: WorkspaceClientLike,\n nameOrId: string,\n options: RunJobOptions = {},\n): Promise<JobRunResult> {\n const jobId = await resolveJobId(client, nameOrId);\n const submitted = await client.post<{ run_id: number }>('/api/2.1/jobs/run-now', {\n job_id: jobId,\n });\n const run = await waitForDatabricksRun(client, submitted.run_id, {\n pollIntervalMs: options.pollIntervalMs,\n timeoutMs: options.timeoutMs,\n });\n const state = (run as { state?: { life_cycle_state?: string; result_state?: string } }).state;\n return {\n runId: submitted.run_id,\n lifeCycleState: state?.life_cycle_state ?? 'UNKNOWN',\n resultState: state?.result_state ?? 'UNKNOWN',\n run,\n };\n}\n","import type { Writable } from 'node:stream';\nimport { format } from 'node:util';\n\nexport type CapturedStream = 'stdout' | 'stderr';\n\nexport interface CapturedStepOutput {\n /** Ordered stdout/stderr output with stream labels. */\n text: string;\n /** True when output exceeded the configured byte budget. */\n truncated: boolean;\n /** Total bytes emitted before truncation. */\n totalBytes: number;\n}\n\nexport interface StepOutputCapture {\n stop(): CapturedStepOutput;\n}\n\nexport interface StepOutputCaptureOptions {\n /** Maximum UTF-8 bytes retained for one step. Defaults to 32 KiB. */\n maxBytes?: number;\n /** Forward output while capturing. Defaults to false, matching Behave capture semantics. */\n passthrough?: boolean;\n}\n\ninterface CapturedChunk {\n stream: CapturedStream;\n text: string;\n}\n\ntype Write = Writable['write'];\ntype ConsoleMethod = 'debug' | 'error' | 'info' | 'log' | 'warn';\n\nconst DEFAULT_MAX_BYTES = 32 * 1024;\n\n/**\n * Capture process stdout/stderr until stop() is called. Console output and\n * Pino's standard destination both flow through these streams. Child\n * processes that inherit the OS file descriptors directly are intentionally\n * outside this in-process capture boundary.\n */\nexport function startStepOutputCapture(options: StepOutputCaptureOptions = {}): StepOutputCapture {\n const maxBytes = Math.max(0, options.maxBytes ?? DEFAULT_MAX_BYTES);\n const stdout = process.stdout;\n const stderr = process.stderr;\n const originalStdoutWrite = stdout.write;\n const originalStderrWrite = stderr.write;\n const originalConsole = Object.fromEntries(\n (['debug', 'error', 'info', 'log', 'warn'] as const).map((method) => [method, console[method]]),\n ) as Record<ConsoleMethod, typeof console.log>;\n const chunks: CapturedChunk[] = [];\n let retainedBytes = 0;\n let totalBytes = 0;\n let stopped = false;\n\n const capture = (stream: CapturedStream, chunk: unknown): void => {\n const text = chunkToString(chunk);\n const bytes = Buffer.byteLength(text);\n totalBytes += bytes;\n const remaining = maxBytes - retainedBytes;\n if (remaining <= 0 || bytes === 0) return;\n const retained = bytes <= remaining ? text : truncateUtf8(text, remaining);\n retainedBytes += Buffer.byteLength(retained);\n if (retained) chunks.push({ stream, text: retained });\n };\n\n stdout.write = interceptedWrite(\n stdout,\n 'stdout',\n originalStdoutWrite,\n capture,\n options.passthrough,\n );\n stderr.write = interceptedWrite(\n stderr,\n 'stderr',\n originalStderrWrite,\n capture,\n options.passthrough,\n );\n if (!options.passthrough) {\n for (const method of ['debug', 'info', 'log'] as const) {\n console[method] = (...args: unknown[]) => capture('stdout', `${format(...args)}\\n`);\n }\n for (const method of ['error', 'warn'] as const) {\n console[method] = (...args: unknown[]) => capture('stderr', `${format(...args)}\\n`);\n }\n }\n\n return {\n stop(): CapturedStepOutput {\n if (!stopped) {\n stdout.write = originalStdoutWrite;\n stderr.write = originalStderrWrite;\n for (const method of Object.keys(originalConsole) as ConsoleMethod[]) {\n console[method] = originalConsole[method];\n }\n stopped = true;\n }\n return {\n text: renderChunks(chunks),\n truncated: totalBytes > retainedBytes,\n totalBytes,\n };\n },\n };\n}\n\nfunction interceptedWrite(\n destination: Writable,\n stream: CapturedStream,\n original: Write,\n capture: (stream: CapturedStream, chunk: unknown) => void,\n passthrough = false,\n): Write {\n return function write(chunk: unknown, encodingOrCallback?: unknown, callback?: unknown): boolean {\n capture(stream, chunk);\n if (passthrough) {\n return original.call(\n destination,\n chunk as never,\n encodingOrCallback as never,\n callback as never,\n );\n }\n const done = typeof encodingOrCallback === 'function' ? encodingOrCallback : callback;\n if (typeof done === 'function') queueMicrotask(() => done());\n return true;\n } as Write;\n}\n\nfunction chunkToString(chunk: unknown): string {\n if (typeof chunk === 'string') return chunk;\n if (Buffer.isBuffer(chunk)) return chunk.toString('utf8');\n if (chunk instanceof Uint8Array) return Buffer.from(chunk).toString('utf8');\n return String(chunk);\n}\n\nfunction truncateUtf8(value: string, maxBytes: number): string {\n return Buffer.from(value)\n .subarray(0, maxBytes)\n .toString('utf8')\n .replace(/\\uFFFD$/u, '');\n}\n\nfunction renderChunks(chunks: readonly CapturedChunk[]): string {\n let rendered = '';\n let previous: CapturedStream | undefined;\n for (const chunk of chunks) {\n if (chunk.stream !== previous) {\n if (rendered && !rendered.endsWith('\\n')) rendered += '\\n';\n rendered += `[${chunk.stream}]\\n`;\n previous = chunk.stream;\n }\n rendered += chunk.text;\n }\n return rendered.trimEnd();\n}\n","import { defineParameterType } from '@cucumber/cucumber';\n\nexport const RUN_STATES = ['SUCCESS', 'FAILED', 'CANCELED', 'TIMEDOUT'] as const;\nexport type RunState = (typeof RUN_STATES)[number];\n\nexport function parseDuration(value: string): number {\n const match = value.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*(milliseconds?|ms|seconds?|s|minutes?|m)$/i);\n if (!match) throw new Error(`Invalid duration '${value}'`);\n const amount = Number(match[1]);\n const unit = match[2]?.toLowerCase() ?? '';\n if (unit === 'ms' || unit.startsWith('millisecond')) return amount;\n if (unit === 's' || unit.startsWith('second')) return amount * 1_000;\n return amount * 60_000;\n}\n\nexport function parseTableIdentifier(value: string): string {\n const identifier = value.trim();\n const part = '(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)';\n if (!new RegExp(`^${part}(?:\\\\.${part}){0,2}$`).test(identifier)) {\n throw new Error(`Invalid 1-3 part table identifier '${value}'`);\n }\n return identifier;\n}\n\nexport function registerParameterTypes(): void {\n defineParameterType({\n name: 'runState',\n regexp: /SUCCESS|FAILED|CANCELED|TIMEDOUT/,\n transformer: (value: string): RunState => value as RunState,\n });\n\n defineParameterType({\n name: 'duration',\n regexp: /\\d+(?:\\.\\d+)?\\s*(?:milliseconds?|ms|seconds?|s|minutes?|m)/,\n transformer: parseDuration,\n });\n\n defineParameterType({\n name: 'table',\n regexp: /(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)(?:\\.(?:[A-Za-z_][A-Za-z0-9_]*|`[^`]+`)){0,2}/,\n transformer: parseTableIdentifier,\n });\n}\n","import {\n type PollOptions,\n type WorkspaceClientLike,\n waitForPipelineUpdate,\n} from '@fabricorg/databricks-testkit';\n\nexport type PipelineWaitOptions = PollOptions;\n\n/** Resolve a DLT/Lakeflow pipeline by id or exact name via /api/2.0/pipelines. */\nexport async function resolvePipelineId(\n client: WorkspaceClientLike,\n nameOrId: string,\n): Promise<string> {\n if (/^[0-9a-f]{8}-[0-9a-f-]{27,}$/i.test(nameOrId)) return nameOrId;\n const response = await client.get<{ statuses?: { pipeline_id: string; name?: string }[] }>(\n '/api/2.0/pipelines',\n { filter: `name LIKE '${nameOrId}'` },\n );\n const match = (response.statuses ?? []).find((p) => p.name === nameOrId);\n if (!match) throw new Error(`No Databricks pipeline named '${nameOrId}' found`);\n return match.pipeline_id;\n}\n\n/** Start a pipeline update; returns the update id to poll. */\nexport async function startPipelineUpdate(\n client: WorkspaceClientLike,\n pipelineId: string,\n options: { fullRefresh?: boolean } = {},\n): Promise<string> {\n const response = await client.post<{ update_id: string }>(\n `/api/2.0/pipelines/${encodeURIComponent(pipelineId)}/updates`,\n { full_refresh: options.fullRefresh ?? false },\n );\n return response.update_id;\n}\n\n/** Poll an update to a terminal state; throws on timeout or non-COMPLETED terminal states. */\nexport { waitForPipelineUpdate };\n","import type { TestProfile } from '@fabricorg/databricks-testkit';\n\n/**\n * Tags that require a live workspace (or a long budget). Scenarios carrying\n * any of them are skipped under the `local` profile — see ADR-0006.\n */\nexport const LIVE_ONLY_TAGS = [\n '@live',\n '@jobs',\n '@dlt',\n '@pipeline',\n '@autoloader',\n '@lakebase',\n '@slow',\n] as const;\n\n/** Returns a skip reason when the scenario cannot run under the given profile, else null. */\nexport function liveOnlyReason(tags: readonly string[], profile: TestProfile): string | null {\n if (profile === 'live') return null;\n const blocking = tags.filter((t) => (LIVE_ONLY_TAGS as readonly string[]).includes(t));\n if (blocking.length === 0) return null;\n return `requires a live workspace (${blocking.join(', ')}); running under DBX_TEST_PROFILE=local`;\n}\n\nexport type CapabilityValue = string | number | boolean;\nexport type CapabilityMap = Readonly<Record<string, CapabilityValue>>;\n\n/** Build the runtime capability map used by active-tag predicates. */\nexport function capabilitiesFromEnv(\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): CapabilityMap {\n const capabilities: Record<string, CapabilityValue> = { profile };\n const builtins: Array<[string, string | undefined]> = [\n ['cloud', env.DBX_TEST_CLOUD],\n ['compute', env.DBX_TEST_COMPUTE_MODE ?? env.DBX_TEST_COMPUTE],\n ['stage', env.DBX_TEST_STAGE],\n ];\n for (const [key, value] of builtins) {\n if (value !== undefined && value !== '') capabilities[key] = value;\n }\n for (const [name, value] of Object.entries(env)) {\n if (!name.startsWith('DBX_TEST_CAPABILITY_') || value === undefined) continue;\n capabilities[normalizeCapabilityKey(name.slice('DBX_TEST_CAPABILITY_'.length))] = value;\n }\n return capabilities;\n}\n\n/**\n * Evaluate TypeScript-native active tags.\n *\n * Supported forms:\n * - `@requires.cloud=azure` / `@requires.serverless`\n * - `@excludes.compute=classic`\n * - Behave-compatible aliases `@use.with_cloud=azure` and\n * `@not.with_cloud=azure`\n */\nexport function capabilityTagReason(\n tags: readonly string[],\n capabilities: CapabilityMap,\n): string | null {\n const normalized = new Map(\n Object.entries(capabilities).map(([key, value]) => [\n normalizeCapabilityKey(key),\n String(value).toLowerCase(),\n ]),\n );\n\n for (const tag of tags) {\n const predicate = parseCapabilityTag(tag);\n if (!predicate) continue;\n const actual = normalized.get(normalizeCapabilityKey(predicate.key));\n const matches = predicate.expected\n ? actual === predicate.expected.toLowerCase()\n : actual !== undefined && !['', '0', 'false', 'no', 'off'].includes(actual);\n if (predicate.kind === 'requires' && !matches) {\n return `${tag} requires capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}; actual ${actual ?? 'unset'}`;\n }\n if (predicate.kind === 'excludes' && matches) {\n return `${tag} excludes capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}`;\n }\n }\n return null;\n}\n\n/** Combined local/live and active-capability skip policy. */\nexport function scenarioSkipReason(\n tags: readonly string[],\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): string | null {\n return (\n liveOnlyReason(tags, profile) ?? capabilityTagReason(tags, capabilitiesFromEnv(profile, env))\n );\n}\n\nfunction parseCapabilityTag(\n tag: string,\n): { kind: 'requires' | 'excludes'; key: string; expected?: string } | undefined {\n const direct = tag.match(/^@(requires|excludes)\\.([^=]+)(?:=(.+))?$/i);\n if (direct?.[1] && direct[2]) {\n return {\n kind: direct[1].toLowerCase() as 'requires' | 'excludes',\n key: direct[2],\n ...(direct[3] ? { expected: direct[3] } : {}),\n };\n }\n const behave = tag.match(/^@(use|not)\\.with_([^=]+)=(.+)$/i);\n if (behave?.[1] && behave[2] && behave[3]) {\n return {\n kind: behave[1].toLowerCase() === 'use' ? 'requires' : 'excludes',\n key: behave[2],\n expected: behave[3],\n };\n }\n return undefined;\n}\n\nfunction normalizeCapabilityKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_');\n}\n","export type StateScope = 'run' | 'feature' | 'scenario';\n\ntype StateValues = Map<string, unknown>;\n\n/**\n * Process-local state backing Behave-style run and feature context layers.\n * Scenario values stay on the scenario World and are never shared.\n */\nexport class SharedStateRegistry {\n private readonly runValues: StateValues = new Map();\n private readonly featureValues = new Map<string, StateValues>();\n\n run(): StateValues {\n return this.runValues;\n }\n\n feature(featureUri: string): StateValues {\n if (!featureUri) throw new Error('Feature state requires a feature URI');\n let values = this.featureValues.get(featureUri);\n if (!values) {\n values = new Map();\n this.featureValues.set(featureUri, values);\n }\n return values;\n }\n\n clear(): void {\n this.runValues.clear();\n this.featureValues.clear();\n }\n}\n\n/** Layered state lookup: scenario overrides feature, which overrides run. */\nexport class ScopedState {\n private readonly scenarioValues: StateValues = new Map();\n\n constructor(\n private readonly runValues: StateValues,\n private readonly featureValues: StateValues,\n ) {}\n\n set<T>(scope: StateScope, key: string, value: T): T {\n this.values(scope).set(validateKey(key), value);\n return value;\n }\n\n get<T>(key: string): T | undefined {\n const validKey = validateKey(key);\n if (this.scenarioValues.has(validKey)) return this.scenarioValues.get(validKey) as T;\n if (this.featureValues.has(validKey)) return this.featureValues.get(validKey) as T;\n return this.runValues.get(validKey) as T | undefined;\n }\n\n require<T>(key: string): T {\n const value = this.get<T>(key);\n if (value === undefined) throw new Error(`Required BDD state '${key}' is not set`);\n return value;\n }\n\n has(key: string): boolean {\n const validKey = validateKey(key);\n return (\n this.scenarioValues.has(validKey) ||\n this.featureValues.has(validKey) ||\n this.runValues.has(validKey)\n );\n }\n\n delete(scope: StateScope, key: string): boolean {\n return this.values(scope).delete(validateKey(key));\n }\n\n clearScenario(): void {\n this.scenarioValues.clear();\n }\n\n private values(scope: StateScope): StateValues {\n if (scope === 'run') return this.runValues;\n if (scope === 'feature') return this.featureValues;\n return this.scenarioValues;\n }\n}\n\nfunction validateKey(key: string): string {\n const trimmed = key.trim();\n if (!trimmed) throw new Error('BDD state key must not be empty');\n return trimmed;\n}\n\nexport const sharedState = new SharedStateRegistry();\n","import type { DatabricksWorld } from './world.js';\n\n/**\n * A reusable, typed scenario action.\n *\n * Behave suites sometimes compose behavior with `context.execute_steps()`. In\n * TypeScript, composing ordinary functions preserves type checking, stack\n * traces, and direct unit-testability without reparsing Gherkin at runtime.\n */\nexport type ScenarioAction<Args extends readonly unknown[] = readonly unknown[], Result = void> = (\n world: DatabricksWorld,\n ...args: Args\n) => Result | Promise<Result>;\n\n/** Preserve inference while declaring a reusable scenario action. */\nexport function defineAction<Args extends readonly unknown[], Result>(\n action: ScenarioAction<Args, Result>,\n): ScenarioAction<Args, Result> {\n return action;\n}\n\n/** Execute a typed action against the current scenario World. */\nexport async function runAction<Args extends readonly unknown[], Result>(\n world: DatabricksWorld,\n action: ScenarioAction<Args, Result>,\n ...args: Args\n): Promise<Awaited<Result>> {\n return (await action(world, ...args)) as Awaited<Result>;\n}\n","import { type IWorldOptions, World } from '@cucumber/cucumber';\nimport {\n type ExecutionContext,\n type TestProfile,\n createExecutionContext,\n resolveProfile,\n} from '@fabricorg/databricks-testkit';\nimport { type ScenarioAction, runAction as executeAction } from './actions.js';\nimport { type FixtureSetup, sharedFixtures } from './fixtures.js';\nimport type { StepOutputCapture } from './output-capture.js';\nimport { ScopedState, type StateScope, sharedState } from './scoped-state.js';\n\nexport interface DatabricksWorldParameters {\n /** Default schema for the execution context; overridable per scenario via the catalog/schema step. */\n schema?: string;\n /** Arbitrary typed runner configuration, comparable to behave `-D` userdata. */\n userdata?: Record<string, string | number | boolean>;\n}\n\ntype Cleanup = () => void | Promise<void>;\n\n/**\n * Cucumber World holding one ExecutionContext per scenario. The context is\n * created lazily on first use so `Given catalog ... and schema ...` can run\n * first; it is closed by the After hook registered in ./steps.ts.\n */\nexport class DatabricksWorld extends World<DatabricksWorldParameters> {\n readonly profile: TestProfile;\n /** Rows from the last `When I run the SQL` / `When I query table` step. */\n lastRows: Record<string, unknown>[] | null = null;\n /** Error captured from the last statement, for `Then the statement fails ...`. */\n lastError: Error | null = null;\n /** Terminal run record from the last `When I run job ...` step. */\n lastRun: Record<string, unknown> | null = null;\n /** Pipeline update handle from `When I start a full refresh of pipeline ...`. */\n lastPipelineUpdate: { pipelineId: string; updateId: string } | null = null;\n schemaOverride: string | undefined;\n catalogOverride: string | undefined;\n lastSql: string | undefined;\n lastStatementId: string | undefined;\n featureUri: string | undefined;\n scenarioName: string | undefined;\n effectiveTags: readonly string[] = [];\n stepOutputCapture: StepOutputCapture | undefined;\n lakebasePool:\n | { query<T extends Record<string, unknown>>(sql: string): Promise<{ rows: T[] }> }\n | undefined;\n private ctx: ExecutionContext | undefined;\n private activeCtx: ExecutionContext | undefined;\n private scopedState: ScopedState | undefined;\n private readonly cleanups: Cleanup[] = [];\n\n constructor(options: IWorldOptions<DatabricksWorldParameters>) {\n super(options);\n this.profile = resolveProfile();\n }\n\n async context(): Promise<ExecutionContext> {\n if (this.activeCtx) return this.activeCtx;\n if (!this.ctx) {\n const env = this.catalogOverride\n ? { ...process.env, DBX_TEST_CATALOG: this.catalogOverride }\n : process.env;\n this.ctx = await createExecutionContext({\n profile: this.profile,\n env,\n schema: this.schemaOverride ?? this.parameters.schema,\n onStatement: ({ sql, statementId }) => {\n this.lastSql = sql;\n this.lastStatementId = statementId;\n },\n });\n }\n return this.ctx;\n }\n\n /** Route subsequent steps through a scenario-owned secondary identity. */\n useExecutionContext(context: ExecutionContext): void {\n if (this.activeCtx) throw new Error('A secondary execution context is already active');\n this.activeCtx = context;\n this.addCleanup(async () => {\n await context.close();\n this.activeCtx = undefined;\n });\n }\n\n /** Register scenario-scoped cleanup. Cleanups run in reverse order. */\n addCleanup(cleanup: Cleanup): void {\n this.cleanups.push(cleanup);\n }\n\n /** Initialize Behave-style feature/scenario metadata and layered state. */\n initializeScenario(featureUri: string, scenarioName: string, tags: readonly string[]): void {\n this.featureUri = featureUri;\n this.scenarioName = scenarioName;\n this.effectiveTags = [...tags];\n this.scopedState = new ScopedState(sharedState.run(), sharedState.feature(featureUri));\n }\n\n /** Set typed state at run, feature, or scenario scope. */\n setState<T>(scope: StateScope, key: string, value: T): T {\n return this.state().set(scope, key, value);\n }\n\n /** Resolve state using scenario → feature → run precedence. */\n getState<T>(key: string): T | undefined {\n return this.state().get<T>(key);\n }\n\n /** Resolve required layered state or fail with a useful message. */\n requireState<T>(key: string): T {\n return this.state().require<T>(key);\n }\n\n /** Compose a reusable typed action without reparsing textual Gherkin. */\n runAction<Args extends readonly unknown[], Result>(\n action: ScenarioAction<Args, Result>,\n ...args: Args\n ): Promise<Awaited<Result>> {\n return executeAction(this, action, ...args);\n }\n\n /** Setup a resource once for this Cucumber run and clean it up in AfterAll. */\n runFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n return sharedFixtures.runFixture(key, setup);\n }\n\n /**\n * Setup a resource once per feature file. It is isolated by feature URI and\n * cleaned in AfterAll because cucumber-js has no reliable after-feature hook.\n */\n featureFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n if (!this.featureUri) {\n throw new Error('featureFixture is only available after the scenario Before hook');\n }\n return sharedFixtures.featureFixture(this.featureUri, key, setup);\n }\n\n /** Resolve runner userdata from worldParameters first, then DBX_TEST_USERDATA_* env. */\n userdata(name: string): string | number | boolean | undefined {\n const configured = this.parameters.userdata?.[name];\n if (configured !== undefined) return configured;\n return process.env[`DBX_TEST_USERDATA_${name.replace(/[^A-Za-z0-9]/g, '_').toUpperCase()}`];\n }\n\n scopeTo(catalog: string, schema: string): void {\n if (this.ctx) {\n throw new Error(\n 'Given catalog/schema must run before any step that touches the warehouse in the scenario',\n );\n }\n // Feature files stay portable and readable with illustrative names. A live\n // runner may redirect every scenario into its provisioned scratch scope.\n this.catalogOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_CATALOG ?? catalog) : catalog;\n this.schemaOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_SCHEMA ?? schema) : schema;\n }\n\n async dispose(): Promise<void> {\n this.stepOutputCapture?.stop();\n this.stepOutputCapture = undefined;\n const errors: unknown[] = [];\n for (const cleanup of this.cleanups.splice(0).reverse()) {\n try {\n await cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n try {\n await this.ctx?.close();\n } catch (error) {\n errors.push(error);\n }\n this.ctx = undefined;\n this.scopedState?.clearScenario();\n this.scopedState = undefined;\n if (errors.length > 0) throw new AggregateError(errors, 'Scenario cleanup failed');\n }\n\n private state(): ScopedState {\n if (!this.scopedState) {\n throw new Error('BDD scoped state is only available after the scenario Before hook');\n }\n return this.scopedState;\n }\n}\n","/**\n * The Databricks step library. Importing this module registers hooks and\n * steps with cucumber's global support registry — add it to your cucumber\n * config: `import: ['node_modules/@fabricorg/databricks-bdd/dist/steps.js']`\n * (or 'src/steps.ts' inside this repo, running cucumber under tsx).\n *\n * Keep step text engine-neutral (no TS-isms). Fabric's runner is TypeScript;\n * the wording stays portable if a customer later adds another Gherkin engine.\n */\nimport { randomUUID } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport { basename, isAbsolute, relative, resolve } from 'node:path';\nimport {\n After,\n AfterAll,\n AfterStep,\n Before,\n BeforeAll,\n BeforeStep,\n type DataTable,\n Given,\n Then,\n When,\n setDefaultTimeout,\n setWorldConstructor,\n} from '@cucumber/cucumber';\nimport {\n DatabricksJobsAdapter,\n assertDeltaContract,\n compareToGolden,\n createClientFromEnv,\n createExecutionContext,\n createLakebaseTestProvider,\n dbtBuildCheck,\n deleteVolumeFile,\n ensureVolumeDirectory,\n expectTable,\n normalizeVolumeRoot,\n notebookSubmitCheck,\n parseJobOrchestrationLiveSpec,\n resolveProfile,\n uploadVolumeFile,\n} from '@fabricorg/databricks-testkit';\nimport { FAILURE_EVIDENCE_MEDIA_TYPE, redactSecrets } from './evidence-formatter.js';\nimport { sharedFixtures } from './fixtures.js';\nimport { coerceMatchRows, inferFixture } from './infer.js';\nimport { runJobToTerminal } from './jobs.js';\nimport { startStepOutputCapture } from './output-capture.js';\nimport { parseTableIdentifier, registerParameterTypes } from './parameter-types.js';\nimport { resolvePipelineId, startPipelineUpdate, waitForPipelineUpdate } from './pipelines.js';\nimport { scenarioSkipReason } from './profile.js';\nimport { sharedState } from './scoped-state.js';\nimport { DatabricksWorld } from './world.js';\n\nsetWorldConstructor(DatabricksWorld);\n// Live workload steps may legitimately wait on a pipeline or serverless\n// compute startup. The duration in the Gherkin step remains the operation's\n// own deadline; this outer timeout prevents Cucumber from aborting it first.\nsetDefaultTimeout(resolveProfile() === 'live' ? 20 * 60_000 : 60_000);\nregisterParameterTypes();\n\nBeforeAll(async () => {\n if (resolveProfile() !== 'live') return;\n const context = await createExecutionContext({ profile: 'live' });\n try {\n const rows = await context.query('SELECT 1 AS dbx_bdd_preflight');\n if (Number(rows[0]?.dbx_bdd_preflight) !== 1) {\n throw new Error('Databricks BDD preflight returned an unexpected value');\n }\n } finally {\n await context.close();\n }\n});\n\nBefore(function (this: DatabricksWorld, { pickle }) {\n const tags = pickle.tags.map((t) => t.name);\n this.initializeScenario(pickle.uri, pickle.name, tags);\n const reason = scenarioSkipReason(tags, this.profile);\n if (reason) return 'skipped';\n return undefined;\n});\n\nAfterAll(async () => {\n try {\n await sharedFixtures.dispose();\n } finally {\n sharedState.clear();\n }\n});\n\nBeforeStep(function (this: DatabricksWorld) {\n const captureMode = process.env.DBX_TEST_CAPTURE_OUTPUT?.toLowerCase();\n if (captureMode === 'off') return;\n this.stepOutputCapture?.stop();\n this.stepOutputCapture = startStepOutputCapture({ passthrough: captureMode === 'passthrough' });\n});\n\nAfter(async function (this: DatabricksWorld) {\n await this.dispose();\n});\n\nAfterStep(async function (this: DatabricksWorld, { result, pickleStep }) {\n const captured = this.stepOutputCapture?.stop();\n this.stepOutputCapture = undefined;\n if (result.status !== 'FAILED') return;\n const evidence = {\n step: pickleStep.text,\n ...(this.lastStatementId ? { statementId: this.lastStatementId } : {}),\n ...(this.lastSql ? { sql: redactSecrets(this.lastSql).slice(0, 4_000) } : {}),\n ...(captured?.text\n ? {\n output: redactSecrets(captured.text),\n outputBytes: captured.totalBytes,\n outputTruncated: captured.truncated,\n }\n : {}),\n };\n await this.attach(JSON.stringify(evidence, null, 2), FAILURE_EVIDENCE_MEDIA_TYPE);\n});\n\n// ---------------------------------------------------------------- Given ----\n\nGiven('a Databricks workspace', async function (this: DatabricksWorld) {\n // local profile: DuckDB stands in — nothing to validate.\n // live profile: eagerly resolve auth + warehouse so misconfiguration fails here.\n if (this.profile === 'live') await this.context();\n});\n\nGiven('a Lakebase database', async function (this: DatabricksWorld) {\n if (this.profile !== 'live') {\n throw new Error('Lakebase steps require DBX_TEST_PROFILE=live and the @lakebase tag');\n }\n const provider = createLakebaseTestProvider(process.env);\n this.lakebasePool = provider.getPool();\n this.addCleanup(async () => {\n this.lakebasePool = undefined;\n await provider.close();\n });\n await this.lakebasePool.query('SELECT 1 AS dbx_bdd_lakebase');\n});\n\nGiven(\n 'catalog {string} and schema {string}',\n function (this: DatabricksWorld, catalog: string, schema: string) {\n this.scopeTo(catalog, schema);\n },\n);\n\nGiven(\n 'a table {string} with:',\n async function (this: DatabricksWorld, table: string, data: DataTable) {\n const ctx = await this.context();\n await ctx.loadFixture(inferFixture(table, data.raw()));\n },\n);\n\nGiven(\n 'a table {string} with schema {string} and rows:',\n async function (this: DatabricksWorld, table: string, schema: string, data: DataTable) {\n const ctx = await this.context();\n await ctx.loadFixture({ table, schema, rows: data.hashes() });\n },\n);\n\nGiven(\n 'an empty table {string} with schema {string}',\n async function (this: DatabricksWorld, table: string, schema: string) {\n const ctx = await this.context();\n await ctx.loadFixture({ table, schema, rows: [] });\n },\n);\n\nGiven(\n 'a table {string} with schema {string} from fixture {string}',\n async function (this: DatabricksWorld, table: string, schema: string, ndjsonFile: string) {\n const ctx = await this.context();\n await ctx.loadFixture({ table, schema, ndjsonFile });\n },\n);\n\nGiven(\n 'fixture files uploaded to volume {string}:',\n async function (this: DatabricksWorld, configuredVolume: string, data: DataTable) {\n if (this.profile !== 'live') {\n throw new Error('Volume upload steps require DBX_TEST_PROFILE=live and the @live tag');\n }\n const volumeValue = configuredVolume.startsWith('$')\n ? process.env[configuredVolume.slice(1)]\n : configuredVolume;\n if (!volumeValue) throw new Error(`Volume '${configuredVolume}' is not configured`);\n const root = normalizeVolumeRoot(volumeValue);\n const rows = data.hashes();\n const uploadPrefix = rows[0]?.prefix?.trim() ?? '';\n if (uploadPrefix && !/^[A-Za-z0-9_.-]+(?:\\/[A-Za-z0-9_.-]+)*$/.test(uploadPrefix)) {\n throw new Error(`Invalid volume fixture prefix '${uploadPrefix}'`);\n }\n if (rows.some((row) => (row.prefix?.trim() ?? '') !== uploadPrefix)) {\n throw new Error('All fixture rows in one upload step must use the same prefix');\n }\n const runPrefix = `${(process.env.DBX_TEST_ENV_NAME ?? 'bdd').replace(/[^A-Za-z0-9_.-]/g, '_')}/${randomUUID()}`;\n const directory = `${root}${uploadPrefix ? `/${uploadPrefix}` : ''}/${runPrefix}`;\n await ensureVolumeDirectory(process.env, directory);\n const paths = rows.map((row) => row.path).filter((path): path is string => Boolean(path));\n if (paths.length === 0) throw new Error('Fixture upload table requires a path column');\n for (const source of paths) {\n const absolute = resolve(process.cwd(), source);\n const fromCwd = relative(process.cwd(), absolute);\n if (fromCwd.startsWith('..') || isAbsolute(fromCwd)) {\n throw new Error(`Fixture path escapes the feature workspace: ${source}`);\n }\n const destination = `${directory}/${basename(source)}`;\n await uploadVolumeFile(process.env, destination, new Uint8Array(await readFile(absolute)));\n this.addCleanup(() => deleteVolumeFile(process.env, destination));\n }\n },\n);\n\nGiven(\n 'service principal {string} with grants:',\n async function (this: DatabricksWorld, principalKey: string, data: DataTable) {\n if (this.profile !== 'live') {\n throw new Error('Service-principal scenarios require DBX_TEST_PROFILE=live and @live');\n }\n const envPrefix = `DBX_TEST_PRINCIPAL_${principalKey.replace(/[^A-Za-z0-9]/g, '_').toUpperCase()}`;\n const clientId = process.env[`${envPrefix}_CLIENT_ID`];\n const clientSecret = process.env[`${envPrefix}_CLIENT_SECRET`];\n const principalName = process.env[`${envPrefix}_NAME`] ?? principalKey;\n if (!clientId || !clientSecret) {\n throw new Error(`Missing ${envPrefix}_CLIENT_ID and ${envPrefix}_CLIENT_SECRET`);\n }\n const primary = await this.context();\n const grants = data.hashes().map((row) => normalizeGrant(row));\n if (grants.length === 0) throw new Error('Grant table contains no rows');\n const quotedPrincipal = `\\`${principalName.replaceAll('`', '``')}\\``;\n for (const grant of grants) {\n await primary.exec(\n `GRANT ${grant.privileges.join(', ')} ON ${grant.securableType} ${grant.securable} TO ${quotedPrincipal}`,\n );\n }\n this.addCleanup(async () => {\n for (const grant of [...grants].reverse()) {\n await primary.exec(\n `REVOKE ${grant.privileges.join(', ')} ON ${grant.securableType} ${grant.securable} FROM ${quotedPrincipal}`,\n );\n }\n });\n const secondaryEnv = {\n ...process.env,\n DATABRICKS_BEARER: undefined,\n DATABRICKS_TOKEN: undefined,\n DATABRICKS_CLIENT_ID: clientId,\n DATABRICKS_CLIENT_SECRET: clientSecret,\n };\n const secondary = await createExecutionContext({\n profile: 'live',\n env: secondaryEnv,\n schema: this.schemaOverride ?? this.parameters.schema,\n onStatement: ({ sql, statementId }) => {\n this.lastSql = sql;\n this.lastStatementId = statementId;\n },\n });\n this.useExecutionContext(secondary);\n },\n);\n\n// ----------------------------------------------------------------- When ----\n\nWhen('I run the SQL:', async function (this: DatabricksWorld, sql: string) {\n const ctx = await this.context();\n this.lastSql = sql;\n this.lastError = null;\n this.lastRows = null;\n try {\n this.lastRows = await ctx.query(sql);\n } catch (error) {\n this.lastError = error instanceof Error ? error : new Error(String(error));\n }\n});\n\nWhen('I query Lakebase:', async function (this: DatabricksWorld, sql: string) {\n if (!this.lakebasePool) {\n throw new Error('No Lakebase database in this scenario — add Given a Lakebase database');\n }\n this.lastSql = sql;\n this.lastError = null;\n this.lastRows = null;\n try {\n const result = await this.lakebasePool.query(sql);\n this.lastRows = result.rows;\n } catch (error) {\n this.lastError = error instanceof Error ? error : new Error(String(error));\n }\n});\n\nWhen('I query table {string}', async function (this: DatabricksWorld, table: string) {\n const ctx = await this.context();\n this.lastRows = await ctx.query(`SELECT * FROM ${ctx.qual(table)}`);\n});\n\nWhen('I run job {string}', async function (this: DatabricksWorld, nameOrId: string) {\n const client = createClientFromEnv(process.env);\n const result = await runJobToTerminal(client, nameOrId);\n this.lastRun = { result_state: result.resultState, life_cycle_state: result.lifeCycleState };\n});\n\nWhen('I submit the job orchestration:', async function (this: DatabricksWorld, json: string) {\n const spec = parseJobOrchestrationLiveSpec(json);\n const adapter = new DatabricksJobsAdapter(createClientFromEnv(process.env));\n const runId = await adapter.submit(spec.request);\n const run = await adapter.wait(runId, {\n timeoutMs: Number(process.env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(process.env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n this.lastRun = {\n run_id: run.runId,\n result_state: run.resultState,\n life_cycle_state: run.lifeCycleState,\n tasks: run.tasks,\n };\n});\n\nWhen('I start the job orchestration:', async function (this: DatabricksWorld, json: string) {\n const spec = parseJobOrchestrationLiveSpec(json);\n const adapter = new DatabricksJobsAdapter(createClientFromEnv(process.env));\n const runId = await adapter.submit(spec.request);\n this.lastRun = { run_id: runId, life_cycle_state: 'PENDING', result_state: '' };\n});\n\nWhen('I wait for the current job run', async function (this: DatabricksWorld) {\n const runId = Number(this.lastRun?.run_id);\n if (!Number.isFinite(runId)) throw new Error('No submitted job run in this scenario');\n const adapter = new DatabricksJobsAdapter(createClientFromEnv(process.env));\n const run = await adapter.wait(runId, {\n timeoutMs: Number(process.env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(process.env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n this.lastRun = {\n run_id: run.runId,\n result_state: run.resultState,\n life_cycle_state: run.lifeCycleState,\n tasks: run.tasks,\n };\n});\n\nWhen('I cancel the current job run', async function (this: DatabricksWorld) {\n const runId = Number(this.lastRun?.run_id);\n if (!Number.isFinite(runId)) {\n throw new Error('No submitted job run in this scenario');\n }\n const adapter = new DatabricksJobsAdapter(createClientFromEnv(process.env));\n await adapter.cancel(runId);\n});\n\nWhen('I repair failed tasks in the current job run', async function (this: DatabricksWorld) {\n const runId = Number(this.lastRun?.run_id);\n const tasks = Array.isArray(this.lastRun?.tasks)\n ? (this.lastRun.tasks as Array<{ taskKey?: string; resultState?: string }>)\n : [];\n if (!Number.isFinite(runId)) {\n throw new Error('No submitted job run in this scenario');\n }\n const failed = tasks\n .filter((task) => task.resultState === 'FAILED' && task.taskKey)\n .map((task) => task.taskKey as string);\n const adapter = new DatabricksJobsAdapter(createClientFromEnv(process.env));\n const repairId = await adapter.repair(runId, {\n rerunTasks: failed.length > 0 ? failed : undefined,\n rerunDependentTasks: true,\n });\n const repaired = await adapter.waitForRepair(runId, repairId, {\n timeoutMs: Number(process.env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(process.env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n this.lastRun = {\n run_id: repaired.runId,\n result_state: repaired.resultState,\n life_cycle_state: repaired.lifeCycleState,\n tasks: repaired.tasks,\n };\n});\n\nWhen('I submit notebook {string}', async function (this: DatabricksWorld, notebookPath: string) {\n const client = createClientFromEnv(process.env);\n await notebookSubmitCheck().run({\n env: { ...process.env, DBX_TEST_NOTEBOOK_PATH: notebookPath },\n warehouse: await this.context(),\n client,\n });\n this.lastRun = { result_state: 'SUCCESS', life_cycle_state: 'TERMINATED' };\n});\n\nWhen('I run dbt build for {string}', async function (this: DatabricksWorld, project: string) {\n const client = createClientFromEnv(process.env);\n await dbtBuildCheck().run({\n env: { ...process.env, DBX_TEST_DBT_PROJECT_DIR: project },\n warehouse: await this.context(),\n client,\n });\n this.lastRun = { result_state: 'SUCCESS', life_cycle_state: 'TERMINATED' };\n});\n\nWhen(\n 'I start a full refresh of pipeline {string}',\n async function (this: DatabricksWorld, nameOrId: string) {\n const isolated = process.env.DBX_TEST_AUTOLOADER_PIPELINE_ID;\n const requested = nameOrId.startsWith('$') ? process.env[nameOrId.slice(1)] : nameOrId;\n if (!isolated || !requested || requested !== isolated) {\n throw new Error(\n 'Full refresh is restricted to DBX_TEST_AUTOLOADER_PIPELINE_ID; production pipelines are never full-refreshed by BDD tests',\n );\n }\n const client = createClientFromEnv(process.env);\n const pipelineId = await resolvePipelineId(client, requested);\n const updateId = await startPipelineUpdate(client, pipelineId, { fullRefresh: true });\n this.lastPipelineUpdate = { pipelineId, updateId };\n },\n);\n\nWhen(\n 'I start a refresh of pipeline {string}',\n async function (this: DatabricksWorld, nameOrId: string) {\n const requested = nameOrId.startsWith('$') ? process.env[nameOrId.slice(1)] : nameOrId;\n if (!requested) throw new Error(`Pipeline '${nameOrId}' is not configured`);\n const client = createClientFromEnv(process.env);\n const pipelineId = await resolvePipelineId(client, requested);\n const updateId = await startPipelineUpdate(client, pipelineId, { fullRefresh: false });\n this.lastPipelineUpdate = { pipelineId, updateId };\n },\n);\n\n// ----------------------------------------------------------------- Then ----\n\nThen(\n 'table {string} has {int} rows',\n async function (this: DatabricksWorld, table: string, n: number) {\n await expectTable(await this.context(), table).toHaveRowCount(n);\n },\n);\n\nThen(\n 'table {string} contains rows matching:',\n async function (this: DatabricksWorld, table: string, data: DataTable) {\n await expectTable(await this.context(), table).toContainRows(coerceMatchRows(data.raw()));\n },\n);\n\nThen(\n 'table {string} contains exactly:',\n async function (this: DatabricksWorld, table: string, data: DataTable) {\n const ctx = await this.context();\n const expected = coerceMatchRows(data.raw());\n const header = (data.raw()[0] ?? []).join(', ');\n const rows = await ctx.query(`SELECT ${header} FROM ${ctx.qual(table)}`);\n if (rows.length !== expected.length) {\n throw new Error(`Expected exactly ${expected.length} rows in ${table}, found ${rows.length}`);\n }\n await expectTable(ctx, table).toContainRows(expected);\n },\n);\n\nThen(\n 'table {string} matches golden {string} ordered by {string}',\n async function (this: DatabricksWorld, table: string, golden: string, orderBy: string) {\n await expectTable(await this.context(), table).toMatchGolden(golden, { orderBy });\n },\n);\n\nThen(\n 'table {string} matches schema contract {string}',\n async function (this: DatabricksWorld, table: string, contractFile: string) {\n const absolute = resolve(process.cwd(), contractFile);\n const fromCwd = relative(process.cwd(), absolute);\n if (fromCwd.startsWith('..') || isAbsolute(fromCwd)) {\n throw new Error(`Schema contract path escapes the feature workspace: ${contractFile}`);\n }\n const parsed = JSON.parse(await readFile(absolute, 'utf8')) as\n | { columns?: { name: string; type?: string }[] }\n | { name: string; type?: string }[];\n const columns = Array.isArray(parsed) ? parsed : parsed.columns;\n if (!columns || columns.length === 0) {\n throw new Error(`Schema contract ${contractFile} contains no columns`);\n }\n const ctx = await this.context();\n const rows = await ctx.query(`DESCRIBE TABLE ${ctx.qual(table)}`);\n assertDeltaContract(table, rows, columns);\n },\n);\n\nThen('the result has {int} rows', function (this: DatabricksWorld, n: number) {\n requireRows(this);\n if (this.lastRows?.length !== n) {\n throw new Error(`Expected ${n} result rows, got ${this.lastRows?.length}`);\n }\n});\n\nThen('the result contains rows matching:', function (this: DatabricksWorld, data: DataTable) {\n requireRows(this);\n const rows = this.lastRows ?? [];\n for (const partial of coerceMatchRows(data.raw())) {\n const hit = rows.some((row) =>\n Object.entries(partial).every(([key, value]) => cellEqual(row[key], value)),\n );\n if (!hit) {\n throw new Error(\n `Result does not contain a row matching ${JSON.stringify(partial)} — rows: ${JSON.stringify(rows.slice(0, 5))}`,\n );\n }\n }\n});\n\nThen('the result matches golden {string}', async function (this: DatabricksWorld, golden: string) {\n requireRows(this);\n await compareToGolden(golden, this.lastRows ?? [], 'result');\n});\n\nThen('the statement fails with {string}', function (this: DatabricksWorld, fragment: string) {\n if (!this.lastError)\n throw new Error(`Expected the statement to fail with '${fragment}', but it succeeded`);\n if (!this.lastError.message.toLowerCase().includes(fragment.toLowerCase())) {\n throw new Error(`Statement failed, but with a different error: ${this.lastError.message}`);\n }\n});\n\nThen('the statement fails with permission denied', function (this: DatabricksWorld) {\n if (!this.lastError) throw new Error('Expected a permission error, but the statement succeeded');\n if (!/permission.?denied|insufficient.?priv|403|unauthoriz/i.test(this.lastError.message)) {\n throw new Error(`Statement failed, but not with a permission error: ${this.lastError.message}`);\n }\n});\n\nThen(\n 'no rows were rescued in table {string}',\n async function (this: DatabricksWorld, table: string) {\n const ctx = await this.context();\n const rows = await ctx.query(\n `SELECT COUNT(*) AS n FROM ${ctx.qual(table)} WHERE _rescued_data IS NOT NULL`,\n );\n const n = Number(rows[0]?.n ?? Number.NaN);\n if (n !== 0) {\n throw new Error(`${n} rescued rows in ${table} — the ingestion contract drifted`);\n }\n },\n);\n\nThen(\n 'configured table {string} has at least {int} rows',\n async function (this: DatabricksWorld, configuredTable: string, minimum: number) {\n const table = resolveConfiguredValue(configuredTable, 'table');\n parseTableIdentifier(table);\n const rows = await (await this.context()).query(`SELECT COUNT(*) AS n FROM ${table}`);\n const count = Number(rows[0]?.n ?? Number.NaN);\n if (!Number.isFinite(count) || count < minimum) {\n throw new Error(`Expected at least ${minimum} rows in ${table}, found ${count}`);\n }\n },\n);\n\nThen(\n 'no rows were rescued in configured table {string}',\n async function (this: DatabricksWorld, configuredTable: string) {\n const table = resolveConfiguredValue(configuredTable, 'table');\n parseTableIdentifier(table);\n const rows = await (await this.context()).query(\n `SELECT COUNT(*) AS n FROM ${table} WHERE _rescued_data IS NOT NULL`,\n );\n const count = Number(rows[0]?.n ?? Number.NaN);\n if (count !== 0) throw new Error(`${count} rescued rows in ${table}`);\n },\n);\n\nThen(\n 'row count of {string} is within {int}% of {int}',\n async function (this: DatabricksWorld, table: string, pct: number, target: number) {\n const ctx = await this.context();\n const rows = await ctx.query(`SELECT COUNT(*) AS n FROM ${ctx.qual(table)}`);\n const n = Number(rows[0]?.n ?? Number.NaN);\n const tolerance = (target * pct) / 100;\n if (Math.abs(n - target) > tolerance) {\n throw new Error(`Row count ${n} of ${table} is outside ${target} ± ${tolerance}`);\n }\n },\n);\n\nThen('the job run reaches {runState}', function (this: DatabricksWorld, state: string) {\n if (!this.lastRun) throw new Error('No job run in this scenario — add a When I run job step');\n if (this.lastRun.result_state !== state) {\n throw new Error(`Job run ended in ${this.lastRun.result_state}, expected ${state}`);\n }\n});\n\nThen(\n 'task {string} reaches {runState}',\n function (this: DatabricksWorld, taskKey: string, state: string) {\n const tasks = Array.isArray(this.lastRun?.tasks)\n ? (this.lastRun.tasks as Array<{ taskKey?: string; resultState?: string }>)\n : [];\n const task = tasks.find((candidate) => candidate.taskKey === taskKey);\n if (!task) throw new Error(`Job run does not contain task '${taskKey}'`);\n if (task.resultState !== state) {\n throw new Error(\n `Task '${taskKey}' ended in ${task.resultState ?? 'UNKNOWN'}, expected ${state}`,\n );\n }\n },\n);\n\nThen('the job run has {int} tasks', function (this: DatabricksWorld, count: number) {\n const tasks = Array.isArray(this.lastRun?.tasks) ? this.lastRun.tasks : [];\n if (tasks.length !== count) {\n throw new Error(`Job run has ${tasks.length} tasks, expected ${count}`);\n }\n});\n\nThen(\n 'the pipeline update completes within {duration}',\n async function (this: DatabricksWorld, durationMs: number) {\n if (!this.lastPipelineUpdate) {\n throw new Error('No pipeline update in this scenario — add a When I start ... pipeline step');\n }\n const client = createClientFromEnv(process.env);\n await waitForPipelineUpdate(\n client,\n this.lastPipelineUpdate.pipelineId,\n this.lastPipelineUpdate.updateId,\n { timeoutMs: durationMs },\n );\n },\n);\n\n// ------------------------------------------------------------------ util ---\n\nfunction requireRows(world: DatabricksWorld): void {\n if (world.lastError) {\n throw new Error(`The last statement failed: ${world.lastError.message}`);\n }\n if (world.lastRows === null) {\n throw new Error('No result captured — add a When I run the SQL / I query table step first');\n }\n}\n\nfunction cellEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a === 'number' && typeof b === 'number') return Math.abs(a - b) < 1e-9;\n if (typeof a === 'string' && typeof b === 'string') {\n return (\n a.replace('T', ' ').replace(/(\\.\\d+)?Z?$/, '') ===\n b.replace('T', ' ').replace(/(\\.\\d+)?Z?$/, '')\n );\n }\n return false;\n}\n\nfunction resolveConfiguredValue(value: string, label: string): string {\n if (!value.startsWith('$')) return value;\n const resolved = process.env[value.slice(1)];\n if (!resolved) throw new Error(`${label} '${value}' is not configured`);\n return resolved;\n}\n\nconst ALLOWED_PRIVILEGES = new Set([\n 'ALL PRIVILEGES',\n 'USE CATALOG',\n 'USE SCHEMA',\n 'SELECT',\n 'MODIFY',\n 'READ VOLUME',\n 'WRITE VOLUME',\n]);\n\nfunction normalizeGrant(row: Record<string, string>): {\n securableType: string;\n securable: string;\n privileges: string[];\n} {\n const securableType = (row.securable_type ?? 'SCHEMA').trim().toUpperCase();\n if (!['CATALOG', 'SCHEMA', 'TABLE', 'VOLUME'].includes(securableType)) {\n throw new Error(`Unsupported securable_type '${securableType}'`);\n }\n const securable = parseTableIdentifier(row.securable ?? '');\n const privileges = (row.privilege ?? row.privileges ?? '')\n .split(',')\n .map((value) => value.trim().toUpperCase())\n .filter(Boolean);\n if (privileges.length === 0 || privileges.some((value) => !ALLOWED_PRIVILEGES.has(value))) {\n throw new Error(`Unsupported or empty privileges '${row.privilege ?? row.privileges ?? ''}'`);\n }\n return { securableType, securable, privileges };\n}\n"]}
package/dist/steps.js CHANGED
@@ -1,4 +1,4 @@
1
- import { DatabricksWorld, scenarioSkipReason, inferFixture, runJobToTerminal, resolvePipelineId, startPipelineUpdate, coerceMatchRows, waitForPipelineUpdate } from './chunk-3XDMBHFP.js';
1
+ import { DatabricksWorld, scenarioSkipReason, inferFixture, runJobToTerminal, resolvePipelineId, startPipelineUpdate, coerceMatchRows, waitForPipelineUpdate } from './chunk-WUKSKMYY.js';
2
2
  import './chunk-6JC65RH2.js';
3
3
  import { redactSecrets, FAILURE_EVIDENCE_MEDIA_TYPE } from './chunk-UQAKGVJS.js';
4
4
  import { sharedFixtures } from './chunk-SZL3KWW7.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabricorg/databricks-bdd",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "description": "Gherkin (cucumber-js) step library for testing Databricks artifacts — one .feature file runs on DuckDB locally and on a live workspace.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -80,8 +80,7 @@
80
80
  },
81
81
  "dependencies": {
82
82
  "@cucumber/cucumber": "^13.0.0",
83
- "@fabric-harness/databricks": "^1.6.0",
84
- "@fabricorg/databricks-testkit": "^0.7.0"
83
+ "@fabricorg/databricks-testkit": "^0.8.0"
85
84
  },
86
85
  "peerDependencies": {
87
86
  "@duckdb/node-api": ">=1.4.0"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/world.ts","../src/profile.ts","../src/infer.ts","../src/jobs.ts","../src/pipelines.ts"],"names":[],"mappings":";;;;;;;;AA0BO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAiC;AAAA,EAC3D,OAAA;AAAA;AAAA,EAET,QAAA,GAA6C,IAAA;AAAA;AAAA,EAE7C,SAAA,GAA0B,IAAA;AAAA;AAAA,EAE1B,OAAA,GAA0C,IAAA;AAAA;AAAA,EAE1C,kBAAA,GAAsE,IAAA;AAAA,EACtE,cAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAmC,EAAC;AAAA,EACpC,iBAAA;AAAA,EACA,YAAA;AAAA,EAGQ,GAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACS,WAAsB,EAAC;AAAA,EAExC,YAAY,OAAA,EAAmD;AAC7D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,UAAU,cAAA,EAAe;AAAA,EAChC;AAAA,EAEA,MAAM,OAAA,GAAqC;AACzC,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAChC,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,eAAA,GACb,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,gBAAA,EAAkB,IAAA,CAAK,eAAA,EAAgB,GACzD,OAAA,CAAQ,GAAA;AACZ,MAAA,IAAA,CAAK,GAAA,GAAM,MAAM,sBAAA,CAAuB;AAAA,QACtC,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,GAAA;AAAA,QACA,MAAA,EAAQ,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,UAAA,CAAW,MAAA;AAAA,QAC/C,WAAA,EAAa,CAAC,EAAE,GAAA,EAAK,aAAY,KAAM;AACrC,UAAA,IAAA,CAAK,OAAA,GAAU,GAAA;AACf,UAAA,IAAA,CAAK,eAAA,GAAkB,WAAA;AAAA,QACzB;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AAAA;AAAA,EAGA,oBAAoB,OAAA,EAAiC;AACnD,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,MAAM,iDAAiD,CAAA;AACrF,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AACjB,IAAA,IAAA,CAAK,WAAW,YAAY;AAC1B,MAAA,MAAM,QAAQ,KAAA,EAAM;AACpB,MAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAAA,IACnB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,WAAW,OAAA,EAAwB;AACjC,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,kBAAA,CAAmB,UAAA,EAAoB,YAAA,EAAsB,IAAA,EAA+B;AAC1F,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,GAAG,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY,WAAA,CAAY,KAAI,EAAG,WAAA,CAAY,OAAA,CAAQ,UAAU,CAAC,CAAA;AAAA,EACvF;AAAA;AAAA,EAGA,QAAA,CAAY,KAAA,EAAmB,GAAA,EAAa,KAAA,EAAa;AACvD,IAAA,OAAO,KAAK,KAAA,EAAM,CAAE,GAAA,CAAI,KAAA,EAAO,KAAK,KAAK,CAAA;AAAA,EAC3C;AAAA;AAAA,EAGA,SAAY,GAAA,EAA4B;AACtC,IAAA,OAAO,IAAA,CAAK,KAAA,EAAM,CAAE,GAAA,CAAO,GAAG,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,aAAgB,GAAA,EAAgB;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAA,EAAM,CAAE,OAAA,CAAW,GAAG,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,SAAA,CACE,WACG,IAAA,EACuB;AAC1B,IAAA,OAAO,SAAA,CAAc,IAAA,EAAM,MAAA,EAAQ,GAAG,IAAI,CAAA;AAAA,EAC5C;AAAA;AAAA,EAGA,UAAA,CAAc,KAAa,KAAA,EAAoC;AAC7D,IAAA,OAAO,cAAA,CAAe,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,CAAkB,KAAa,KAAA,EAAoC;AACjE,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,cAAA,CAAe,cAAA,CAAe,IAAA,CAAK,UAAA,EAAY,KAAK,KAAK,CAAA;AAAA,EAClE;AAAA;AAAA,EAGA,SAAS,IAAA,EAAqD;AAC5D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,QAAA,GAAW,IAAI,CAAA;AAClD,IAAA,IAAI,UAAA,KAAe,QAAW,OAAO,UAAA;AACrC,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqB,IAAA,CAAK,OAAA,CAAQ,iBAAiB,GAAG,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,CAAA;AAAA,EAC5F;AAAA,EAEA,OAAA,CAAQ,SAAiB,MAAA,EAAsB;AAC7C,IAAA,IAAI,KAAK,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,kBACH,IAAA,CAAK,OAAA,KAAY,SAAU,OAAA,CAAQ,GAAA,CAAI,oBAAoB,OAAA,GAAW,OAAA;AACxE,IAAA,IAAA,CAAK,iBACH,IAAA,CAAK,OAAA,KAAY,SAAU,OAAA,CAAQ,GAAA,CAAI,mBAAmB,MAAA,GAAU,MAAA;AAAA,EACxE;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,mBAAmB,IAAA,EAAK;AAC7B,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzB,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,QAAA,CAAS,OAAO,CAAC,CAAA,CAAE,SAAQ,EAAG;AACvD,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,EAAQ;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AACA,IAAA,IAAA,CAAK,GAAA,GAAM,MAAA;AACX,IAAA,IAAA,CAAK,aAAa,aAAA,EAAc;AAChC,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,IAAI,OAAO,MAAA,GAAS,CAAA,QAAS,IAAI,cAAA,CAAe,QAAQ,yBAAyB,CAAA;AAAA,EACnF;AAAA,EAEQ,KAAA,GAAqB;AAC3B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAAA,IACrF;AACA,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AACF;;;ACrLO,IAAM,cAAA,GAAiB;AAAA,EAC5B,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;AAGO,SAAS,cAAA,CAAe,MAAyB,OAAA,EAAqC;AAC3F,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,IAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,CAAC,MAAO,cAAA,CAAqC,QAAA,CAAS,CAAC,CAAC,CAAA;AACrF,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,OAAO,CAAA,2BAAA,EAA8B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,uCAAA,CAAA;AAC1D;AAMO,SAAS,mBAAA,CACd,OAAA,EACA,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAClB;AACf,EAAA,MAAM,YAAA,GAAgD,EAAE,OAAA,EAAQ;AAChE,EAAA,MAAM,QAAA,GAAgD;AAAA,IACpD,CAAC,OAAA,EAAS,GAAA,CAAI,cAAc,CAAA;AAAA,IAC5B,CAAC,SAAA,EAAW,GAAA,CAAI,qBAAA,IAAyB,IAAI,gBAAgB,CAAA;AAAA,IAC7D,CAAC,OAAA,EAAS,GAAA,CAAI,cAAc;AAAA,GAC9B;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,QAAA,EAAU;AACnC,IAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,EAAA,EAAI,YAAA,CAAa,GAAG,CAAA,GAAI,KAAA;AAAA,EAC/D;AACA,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,sBAAsB,CAAA,IAAK,UAAU,MAAA,EAAW;AACrE,IAAA,YAAA,CAAa,uBAAuB,IAAA,CAAK,KAAA,CAAM,uBAAuB,MAAM,CAAC,CAAC,CAAA,GAAI,KAAA;AAAA,EACpF;AACA,EAAA,OAAO,YAAA;AACT;AAWO,SAAS,mBAAA,CACd,MACA,YAAA,EACe;AACf,EAAA,MAAM,aAAa,IAAI,GAAA;AAAA,IACrB,MAAA,CAAO,QAAQ,YAAY,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAAA,MACjD,uBAAuB,GAAG,CAAA;AAAA,MAC1B,MAAA,CAAO,KAAK,CAAA,CAAE,WAAA;AAAY,KAC3B;AAAA,GACH;AAEA,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,SAAA,GAAY,mBAAmB,GAAG,CAAA;AACxC,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,SAAS,UAAA,CAAW,GAAA,CAAI,sBAAA,CAAuB,SAAA,CAAU,GAAG,CAAC,CAAA;AACnE,IAAA,MAAM,UAAU,SAAA,CAAU,QAAA,GACtB,WAAW,SAAA,CAAU,QAAA,CAAS,aAAY,GAC1C,MAAA,KAAW,UAAa,CAAC,CAAC,IAAI,GAAA,EAAK,OAAA,EAAS,MAAM,KAAK,CAAA,CAAE,SAAS,MAAM,CAAA;AAC5E,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,UAAA,IAAc,CAAC,OAAA,EAAS;AAC7C,MAAA,OAAO,CAAA,EAAG,GAAG,CAAA,qBAAA,EAAwB,SAAA,CAAU,GAAG,CAAA,EAAG,SAAA,CAAU,QAAA,GAAW,CAAA,CAAA,EAAI,UAAU,QAAQ,CAAA,CAAA,GAAK,EAAE,CAAA,SAAA,EAAY,UAAU,OAAO,CAAA,CAAA;AAAA,IACtI;AACA,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,UAAA,IAAc,OAAA,EAAS;AAC5C,MAAA,OAAO,CAAA,EAAG,GAAG,CAAA,qBAAA,EAAwB,SAAA,CAAU,GAAG,CAAA,EAAG,SAAA,CAAU,QAAA,GAAW,CAAA,CAAA,EAAI,SAAA,CAAU,QAAQ,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,IACzG;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,kBAAA,CACd,IAAA,EACA,OAAA,EACA,GAAA,GAAyB,QAAQ,GAAA,EAClB;AACf,EAAA,OACE,cAAA,CAAe,MAAM,OAAO,CAAA,IAAK,oBAAoB,IAAA,EAAM,mBAAA,CAAoB,OAAA,EAAS,GAAG,CAAC,CAAA;AAEhG;AAEA,SAAS,mBACP,GAAA,EAC+E;AAC/E,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,4CAA4C,CAAA;AACrE,EAAA,IAAI,MAAA,GAAS,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,MAC5B,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,MACb,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,EAAE,UAAU,MAAA,CAAO,CAAC,CAAA,EAAE,GAAI;AAAC,KAC7C;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,kCAAkC,CAAA;AAC3D,EAAA,IAAI,MAAA,GAAS,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,EAAG;AACzC,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,KAAM,QAAQ,UAAA,GAAa,UAAA;AAAA,MACvD,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,MACb,QAAA,EAAU,OAAO,CAAC;AAAA,KACpB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,uBAAuB,GAAA,EAAqB;AACnD,EAAA,OAAO,IACJ,IAAA,EAAK,CACL,aAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA;AAC/B;;;ACzHA,IAAM,MAAA,GAAS,SAAA;AACf,IAAM,QAAA,GAAW,cAAA;AACjB,IAAM,YAAA,GAAe,4CAAA;AACrB,IAAM,OAAA,GAAU,iBAAA;AAOT,SAAS,YAAA,CAAa,OAAe,GAAA,EAAmD;AAC7F,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,KAAK,CAAA,6CAAA,CAA+C,CAAA;AAAA,EACxF;AACA,EAAA,MAAM,CAAC,MAAA,EAAQ,GAAG,IAAI,CAAA,GAAI,GAAA;AAC1B,EAAA,MAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,QAAQ,eAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,CAAC,QAAQ,GAAA,CAAI,GAAG,CAAA,IAAK,EAAE,CAAC,CAAC,CAAA;AACvF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,MAAM,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACzE,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM,WAAW,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,IAAK,QAAQ,CAAC,CAAC,CAAA;AAC3F,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAK;AAC/B;AAGO,SAAS,gBAAgB,GAAA,EAAgE;AAC9F,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,IAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,EAC5E;AACA,EAAA,MAAM,CAAC,MAAA,EAAQ,GAAG,IAAI,CAAA,GAAI,GAAA;AAC1B,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AAC1B,MAAA,GAAA,CAAI,IAAI,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,IAAK,EAAA,EAAI,eAAA,CAAgB,CAAC,GAAA,CAAI,CAAC,CAAA,IAAK,EAAE,CAAC,CAAC,CAAA;AAAA,IACtE,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEA,SAAS,gBAAgB,KAAA,EAAkC;AACzD,EAAA,MAAM,UAAU,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,EAAE,CAAA;AAC5C,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,QAAA;AACjC,EAAA,IAAI,OAAA,CAAQ,MAAM,CAAC,CAAA,KAAM,OAAO,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAO,QAAA;AACjD,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,GAAG,OAAO,QAAA;AACrE,EAAA,IAAI,OAAA,CAAQ,MAAM,CAAC,CAAA,KAAM,aAAa,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAO,WAAA;AACvD,EAAA,IAAI,OAAA,CAAQ,MAAM,CAAC,CAAA,KAAM,QAAQ,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAO,SAAA;AAClD,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,UAAA,CAAW,MAAc,IAAA,EAAuB;AACvD,EAAA,IAAI,IAAA,KAAS,IAAI,OAAO,IAAA;AACxB,EAAA,IAAI,SAAS,QAAA,IAAY,IAAA,KAAS,QAAA,EAAU,OAAO,OAAO,IAAI,CAAA;AAC9D,EAAA,IAAI,IAAA,KAAS,SAAA,EAAW,OAAO,SAAA,CAAU,KAAK,IAAI,CAAA;AAClD,EAAA,OAAO,IAAA;AACT;ACrCA,eAAsB,YAAA,CAAa,QAA6B,QAAA,EAAmC;AACjG,EAAA,IAAI,QAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,OAAO,QAAQ,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,IAC5B,oBAAA;AAAA,IACA,EAAE,MAAM,QAAA;AAAS,GACnB;AACA,EAAA,MAAM,KAAA,GAAA,CAAS,QAAA,CAAS,IAAA,IAAQ,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,EAAU,IAAA,KAAS,QAAQ,CAAA;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,QAAQ,CAAA,OAAA,CAAS,CAAA;AACzE,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAGA,eAAsB,gBAAA,CACpB,MAAA,EACA,QAAA,EACA,OAAA,GAAyB,EAAC,EACH;AACvB,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,MAAA,EAAQ,QAAQ,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,IAAA,CAAyB,uBAAA,EAAyB;AAAA,IAC/E,MAAA,EAAQ;AAAA,GACT,CAAA;AACD,EAAA,MAAM,GAAA,GAAM,MAAM,oBAAA,CAAqB,MAAA,EAAgC,UAAU,MAAA,EAAQ;AAAA,IACvF,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,WAAW,OAAA,CAAQ;AAAA,GACpB,CAAA;AACD,EAAA,MAAM,QAAS,GAAA,CAAyE,KAAA;AACxF,EAAA,OAAO;AAAA,IACL,OAAO,SAAA,CAAU,MAAA;AAAA,IACjB,cAAA,EAAgB,OAAO,gBAAA,IAAoB,SAAA;AAAA,IAC3C,WAAA,EAAa,OAAO,YAAA,IAAgB,SAAA;AAAA,IACpC;AAAA,GACF;AACF;ACvCA,eAAsB,iBAAA,CACpB,QACA,QAAA,EACiB;AACjB,EAAA,IAAI,+BAAA,CAAgC,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,QAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,IAC5B,oBAAA;AAAA,IACA,EAAE,MAAA,EAAQ,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA,CAAA;AAAI,GACtC;AACA,EAAA,MAAM,KAAA,GAAA,CAAS,QAAA,CAAS,QAAA,IAAY,EAAC,EAAG,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA;AACvE,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,QAAQ,CAAA,OAAA,CAAS,CAAA;AAC9E,EAAA,OAAO,KAAA,CAAM,WAAA;AACf;AAGA,eAAsB,mBAAA,CACpB,MAAA,EACA,UAAA,EACA,OAAA,GAAqC,EAAC,EACrB;AACjB,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,IAC5B,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,UAAU,CAAC,CAAA,QAAA,CAAA;AAAA,IACpD,EAAE,YAAA,EAAc,OAAA,CAAQ,WAAA,IAAe,KAAA;AAAM,GAC/C;AACA,EAAA,OAAO,QAAA,CAAS,SAAA;AAClB","file":"chunk-3XDMBHFP.js","sourcesContent":["import { type IWorldOptions, World } from '@cucumber/cucumber';\nimport {\n type ExecutionContext,\n type TestProfile,\n createExecutionContext,\n resolveProfile,\n} from '@fabricorg/databricks-testkit';\nimport { type ScenarioAction, runAction as executeAction } from './actions.js';\nimport { type FixtureSetup, sharedFixtures } from './fixtures.js';\nimport type { StepOutputCapture } from './output-capture.js';\nimport { ScopedState, type StateScope, sharedState } from './scoped-state.js';\n\nexport interface DatabricksWorldParameters {\n /** Default schema for the execution context; overridable per scenario via the catalog/schema step. */\n schema?: string;\n /** Arbitrary typed runner configuration, comparable to behave `-D` userdata. */\n userdata?: Record<string, string | number | boolean>;\n}\n\ntype Cleanup = () => void | Promise<void>;\n\n/**\n * Cucumber World holding one ExecutionContext per scenario. The context is\n * created lazily on first use so `Given catalog ... and schema ...` can run\n * first; it is closed by the After hook registered in ./steps.ts.\n */\nexport class DatabricksWorld extends World<DatabricksWorldParameters> {\n readonly profile: TestProfile;\n /** Rows from the last `When I run the SQL` / `When I query table` step. */\n lastRows: Record<string, unknown>[] | null = null;\n /** Error captured from the last statement, for `Then the statement fails ...`. */\n lastError: Error | null = null;\n /** Terminal run record from the last `When I run job ...` step. */\n lastRun: Record<string, unknown> | null = null;\n /** Pipeline update handle from `When I start a full refresh of pipeline ...`. */\n lastPipelineUpdate: { pipelineId: string; updateId: string } | null = null;\n schemaOverride: string | undefined;\n catalogOverride: string | undefined;\n lastSql: string | undefined;\n lastStatementId: string | undefined;\n featureUri: string | undefined;\n scenarioName: string | undefined;\n effectiveTags: readonly string[] = [];\n stepOutputCapture: StepOutputCapture | undefined;\n lakebasePool:\n | { query<T extends Record<string, unknown>>(sql: string): Promise<{ rows: T[] }> }\n | undefined;\n private ctx: ExecutionContext | undefined;\n private activeCtx: ExecutionContext | undefined;\n private scopedState: ScopedState | undefined;\n private readonly cleanups: Cleanup[] = [];\n\n constructor(options: IWorldOptions<DatabricksWorldParameters>) {\n super(options);\n this.profile = resolveProfile();\n }\n\n async context(): Promise<ExecutionContext> {\n if (this.activeCtx) return this.activeCtx;\n if (!this.ctx) {\n const env = this.catalogOverride\n ? { ...process.env, DBX_TEST_CATALOG: this.catalogOverride }\n : process.env;\n this.ctx = await createExecutionContext({\n profile: this.profile,\n env,\n schema: this.schemaOverride ?? this.parameters.schema,\n onStatement: ({ sql, statementId }) => {\n this.lastSql = sql;\n this.lastStatementId = statementId;\n },\n });\n }\n return this.ctx;\n }\n\n /** Route subsequent steps through a scenario-owned secondary identity. */\n useExecutionContext(context: ExecutionContext): void {\n if (this.activeCtx) throw new Error('A secondary execution context is already active');\n this.activeCtx = context;\n this.addCleanup(async () => {\n await context.close();\n this.activeCtx = undefined;\n });\n }\n\n /** Register scenario-scoped cleanup. Cleanups run in reverse order. */\n addCleanup(cleanup: Cleanup): void {\n this.cleanups.push(cleanup);\n }\n\n /** Initialize Behave-style feature/scenario metadata and layered state. */\n initializeScenario(featureUri: string, scenarioName: string, tags: readonly string[]): void {\n this.featureUri = featureUri;\n this.scenarioName = scenarioName;\n this.effectiveTags = [...tags];\n this.scopedState = new ScopedState(sharedState.run(), sharedState.feature(featureUri));\n }\n\n /** Set typed state at run, feature, or scenario scope. */\n setState<T>(scope: StateScope, key: string, value: T): T {\n return this.state().set(scope, key, value);\n }\n\n /** Resolve state using scenario → feature → run precedence. */\n getState<T>(key: string): T | undefined {\n return this.state().get<T>(key);\n }\n\n /** Resolve required layered state or fail with a useful message. */\n requireState<T>(key: string): T {\n return this.state().require<T>(key);\n }\n\n /** Compose a reusable typed action without reparsing textual Gherkin. */\n runAction<Args extends readonly unknown[], Result>(\n action: ScenarioAction<Args, Result>,\n ...args: Args\n ): Promise<Awaited<Result>> {\n return executeAction(this, action, ...args);\n }\n\n /** Setup a resource once for this Cucumber run and clean it up in AfterAll. */\n runFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n return sharedFixtures.runFixture(key, setup);\n }\n\n /**\n * Setup a resource once per feature file. It is isolated by feature URI and\n * cleaned in AfterAll because cucumber-js has no reliable after-feature hook.\n */\n featureFixture<T>(key: string, setup: FixtureSetup<T>): Promise<T> {\n if (!this.featureUri) {\n throw new Error('featureFixture is only available after the scenario Before hook');\n }\n return sharedFixtures.featureFixture(this.featureUri, key, setup);\n }\n\n /** Resolve runner userdata from worldParameters first, then DBX_TEST_USERDATA_* env. */\n userdata(name: string): string | number | boolean | undefined {\n const configured = this.parameters.userdata?.[name];\n if (configured !== undefined) return configured;\n return process.env[`DBX_TEST_USERDATA_${name.replace(/[^A-Za-z0-9]/g, '_').toUpperCase()}`];\n }\n\n scopeTo(catalog: string, schema: string): void {\n if (this.ctx) {\n throw new Error(\n 'Given catalog/schema must run before any step that touches the warehouse in the scenario',\n );\n }\n // Feature files stay portable and readable with illustrative names. A live\n // runner may redirect every scenario into its provisioned scratch scope.\n this.catalogOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_CATALOG ?? catalog) : catalog;\n this.schemaOverride =\n this.profile === 'live' ? (process.env.DBX_TEST_SCHEMA ?? schema) : schema;\n }\n\n async dispose(): Promise<void> {\n this.stepOutputCapture?.stop();\n this.stepOutputCapture = undefined;\n const errors: unknown[] = [];\n for (const cleanup of this.cleanups.splice(0).reverse()) {\n try {\n await cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n try {\n await this.ctx?.close();\n } catch (error) {\n errors.push(error);\n }\n this.ctx = undefined;\n this.scopedState?.clearScenario();\n this.scopedState = undefined;\n if (errors.length > 0) throw new AggregateError(errors, 'Scenario cleanup failed');\n }\n\n private state(): ScopedState {\n if (!this.scopedState) {\n throw new Error('BDD scoped state is only available after the scenario Before hook');\n }\n return this.scopedState;\n }\n}\n","import type { TestProfile } from '@fabricorg/databricks-testkit';\n\n/**\n * Tags that require a live workspace (or a long budget). Scenarios carrying\n * any of them are skipped under the `local` profile — see ADR-0006.\n */\nexport const LIVE_ONLY_TAGS = [\n '@live',\n '@jobs',\n '@dlt',\n '@pipeline',\n '@autoloader',\n '@lakebase',\n '@slow',\n] as const;\n\n/** Returns a skip reason when the scenario cannot run under the given profile, else null. */\nexport function liveOnlyReason(tags: readonly string[], profile: TestProfile): string | null {\n if (profile === 'live') return null;\n const blocking = tags.filter((t) => (LIVE_ONLY_TAGS as readonly string[]).includes(t));\n if (blocking.length === 0) return null;\n return `requires a live workspace (${blocking.join(', ')}); running under DBX_TEST_PROFILE=local`;\n}\n\nexport type CapabilityValue = string | number | boolean;\nexport type CapabilityMap = Readonly<Record<string, CapabilityValue>>;\n\n/** Build the runtime capability map used by active-tag predicates. */\nexport function capabilitiesFromEnv(\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): CapabilityMap {\n const capabilities: Record<string, CapabilityValue> = { profile };\n const builtins: Array<[string, string | undefined]> = [\n ['cloud', env.DBX_TEST_CLOUD],\n ['compute', env.DBX_TEST_COMPUTE_MODE ?? env.DBX_TEST_COMPUTE],\n ['stage', env.DBX_TEST_STAGE],\n ];\n for (const [key, value] of builtins) {\n if (value !== undefined && value !== '') capabilities[key] = value;\n }\n for (const [name, value] of Object.entries(env)) {\n if (!name.startsWith('DBX_TEST_CAPABILITY_') || value === undefined) continue;\n capabilities[normalizeCapabilityKey(name.slice('DBX_TEST_CAPABILITY_'.length))] = value;\n }\n return capabilities;\n}\n\n/**\n * Evaluate TypeScript-native active tags.\n *\n * Supported forms:\n * - `@requires.cloud=azure` / `@requires.serverless`\n * - `@excludes.compute=classic`\n * - Behave-compatible aliases `@use.with_cloud=azure` and\n * `@not.with_cloud=azure`\n */\nexport function capabilityTagReason(\n tags: readonly string[],\n capabilities: CapabilityMap,\n): string | null {\n const normalized = new Map(\n Object.entries(capabilities).map(([key, value]) => [\n normalizeCapabilityKey(key),\n String(value).toLowerCase(),\n ]),\n );\n\n for (const tag of tags) {\n const predicate = parseCapabilityTag(tag);\n if (!predicate) continue;\n const actual = normalized.get(normalizeCapabilityKey(predicate.key));\n const matches = predicate.expected\n ? actual === predicate.expected.toLowerCase()\n : actual !== undefined && !['', '0', 'false', 'no', 'off'].includes(actual);\n if (predicate.kind === 'requires' && !matches) {\n return `${tag} requires capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}; actual ${actual ?? 'unset'}`;\n }\n if (predicate.kind === 'excludes' && matches) {\n return `${tag} excludes capability ${predicate.key}${predicate.expected ? `=${predicate.expected}` : ''}`;\n }\n }\n return null;\n}\n\n/** Combined local/live and active-capability skip policy. */\nexport function scenarioSkipReason(\n tags: readonly string[],\n profile: TestProfile,\n env: NodeJS.ProcessEnv = process.env,\n): string | null {\n return (\n liveOnlyReason(tags, profile) ?? capabilityTagReason(tags, capabilitiesFromEnv(profile, env))\n );\n}\n\nfunction parseCapabilityTag(\n tag: string,\n): { kind: 'requires' | 'excludes'; key: string; expected?: string } | undefined {\n const direct = tag.match(/^@(requires|excludes)\\.([^=]+)(?:=(.+))?$/i);\n if (direct?.[1] && direct[2]) {\n return {\n kind: direct[1].toLowerCase() as 'requires' | 'excludes',\n key: direct[2],\n ...(direct[3] ? { expected: direct[3] } : {}),\n };\n }\n const behave = tag.match(/^@(use|not)\\.with_([^=]+)=(.+)$/i);\n if (behave?.[1] && behave[2] && behave[3]) {\n return {\n kind: behave[1].toLowerCase() === 'use' ? 'requires' : 'excludes',\n key: behave[2],\n expected: behave[3],\n };\n }\n return undefined;\n}\n\nfunction normalizeCapabilityKey(key: string): string {\n return key\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_');\n}\n","import type { TableFixture } from '@fabricorg/databricks-testkit';\n\nconst INT_RE = /^-?\\d+$/;\nconst FLOAT_RE = /^-?\\d+\\.\\d+$/;\nconst TIMESTAMP_RE = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(:\\d{2})?/;\nconst BOOL_RE = /^(true|false)$/i;\n\n/**\n * Turn a Gherkin data table (header row + string cells) into a TableFixture,\n * inferring portable column types from the values: BIGINT, DOUBLE,\n * TIMESTAMP, BOOLEAN, else STRING. Empty cells become NULL.\n */\nexport function inferFixture(table: string, raw: readonly (readonly string[])[]): TableFixture {\n if (raw.length < 2) {\n throw new Error(`Data table for ${table} needs a header row and at least one data row`);\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n const types = header.map((_, col) => inferColumnType(body.map((row) => row[col] ?? '')));\n const schema = header.map((name, i) => `\"${name}\" ${types[i]}`).join(', ');\n const rows = body.map((row) => row.map((cell, i) => coerceCell(cell, types[i] ?? 'STRING')));\n return { table, schema, rows };\n}\n\n/** Coerce data-table string cells to typed values for row matching (no header row). */\nexport function coerceMatchRows(raw: readonly (readonly string[])[]): Record<string, unknown>[] {\n if (raw.length < 2) {\n throw new Error('Match table needs a header row and at least one data row');\n }\n const [header, ...body] = raw as [readonly string[], ...(readonly string[])[]];\n return body.map((row) => {\n const out: Record<string, unknown> = {};\n header.forEach((name, i) => {\n out[name] = coerceCell(row[i] ?? '', inferColumnType([row[i] ?? '']));\n });\n return out;\n });\n}\n\nfunction inferColumnType(cells: readonly string[]): string {\n const present = cells.filter((c) => c !== '');\n if (present.length === 0) return 'STRING';\n if (present.every((c) => INT_RE.test(c))) return 'BIGINT';\n if (present.every((c) => FLOAT_RE.test(c) || INT_RE.test(c))) return 'DOUBLE';\n if (present.every((c) => TIMESTAMP_RE.test(c))) return 'TIMESTAMP';\n if (present.every((c) => BOOL_RE.test(c))) return 'BOOLEAN';\n return 'STRING';\n}\n\nfunction coerceCell(cell: string, type: string): unknown {\n if (cell === '') return null;\n if (type === 'BIGINT' || type === 'DOUBLE') return Number(cell);\n if (type === 'BOOLEAN') return /^true$/i.test(cell);\n return cell;\n}\n","import { type DatabricksRestClient, waitForDatabricksRun } from '@fabric-harness/databricks';\nimport type { WorkspaceClientLike } from '@fabricorg/databricks-testkit';\n\nexport interface RunJobOptions {\n pollIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface JobRunResult {\n runId: number;\n lifeCycleState: string;\n resultState: string;\n run: Record<string, unknown>;\n}\n\n/** Resolve a job by numeric id or by exact name via /api/2.1/jobs/list. */\nexport async function resolveJobId(client: WorkspaceClientLike, nameOrId: string): Promise<number> {\n if (/^\\d+$/.test(nameOrId)) return Number(nameOrId);\n const response = await client.get<{ jobs?: { job_id: number; settings?: { name?: string } }[] }>(\n '/api/2.1/jobs/list',\n { name: nameOrId },\n );\n const match = (response.jobs ?? []).find((j) => j.settings?.name === nameOrId);\n if (!match) throw new Error(`No Databricks job named '${nameOrId}' found`);\n return match.job_id;\n}\n\n/** run-now a job and poll its run to a terminal state. */\nexport async function runJobToTerminal(\n client: WorkspaceClientLike,\n nameOrId: string,\n options: RunJobOptions = {},\n): Promise<JobRunResult> {\n const jobId = await resolveJobId(client, nameOrId);\n const submitted = await client.post<{ run_id: number }>('/api/2.1/jobs/run-now', {\n job_id: jobId,\n });\n const run = await waitForDatabricksRun(client as DatabricksRestClient, submitted.run_id, {\n pollIntervalMs: options.pollIntervalMs,\n timeoutMs: options.timeoutMs,\n });\n const state = (run as { state?: { life_cycle_state?: string; result_state?: string } }).state;\n return {\n runId: submitted.run_id,\n lifeCycleState: state?.life_cycle_state ?? 'UNKNOWN',\n resultState: state?.result_state ?? 'UNKNOWN',\n run,\n };\n}\n","import {\n type PollOptions,\n type WorkspaceClientLike,\n waitForPipelineUpdate,\n} from '@fabricorg/databricks-testkit';\n\nexport type PipelineWaitOptions = PollOptions;\n\n/** Resolve a DLT/Lakeflow pipeline by id or exact name via /api/2.0/pipelines. */\nexport async function resolvePipelineId(\n client: WorkspaceClientLike,\n nameOrId: string,\n): Promise<string> {\n if (/^[0-9a-f]{8}-[0-9a-f-]{27,}$/i.test(nameOrId)) return nameOrId;\n const response = await client.get<{ statuses?: { pipeline_id: string; name?: string }[] }>(\n '/api/2.0/pipelines',\n { filter: `name LIKE '${nameOrId}'` },\n );\n const match = (response.statuses ?? []).find((p) => p.name === nameOrId);\n if (!match) throw new Error(`No Databricks pipeline named '${nameOrId}' found`);\n return match.pipeline_id;\n}\n\n/** Start a pipeline update; returns the update id to poll. */\nexport async function startPipelineUpdate(\n client: WorkspaceClientLike,\n pipelineId: string,\n options: { fullRefresh?: boolean } = {},\n): Promise<string> {\n const response = await client.post<{ update_id: string }>(\n `/api/2.0/pipelines/${encodeURIComponent(pipelineId)}/updates`,\n { full_refresh: options.fullRefresh ?? false },\n );\n return response.update_id;\n}\n\n/** Poll an update to a terminal state; throws on timeout or non-COMPLETED terminal states. */\nexport { waitForPipelineUpdate };\n"]}