goldenpipe 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/models.ts","../../src/core/columnContext.ts","../../src/core/engine/registry.ts","../../src/core/engine/resolver.ts","../../src/core/engine/router.ts","../../src/core/engine/runner.ts","../../src/core/engine/reporter.ts","../../src/core/decisions.ts","../../src/core/adapters/load.ts","../../src/core/adapters/check.ts","../../src/core/adapters/flow.ts","../../src/core/adapters/match.ts","../../src/core/adapters/index.ts","../../src/core/pipeline.ts","../../src/node/csv.ts","../../src/node/loadConfig.ts","../../src/node/run.ts"],"names":["stage","readFileSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core data models — port of goldenpipe/models/{context,config,stage}.py.\n *\n * Edge-safe: no `node:` imports. Data flows as `Row[]` (arrays of plain row\n * objects) instead of Polars DataFrames — the TS siblings all operate on\n * `Row[]`.\n */\n\n/** A single tabular record. Mirrors the siblings' `Row` type. */\nexport type Row = Record<string, unknown>;\n\n// ---------------------------------------------------------------------------\n// Status enums (mirrors Python str-Enums; kept as string-literal unions in TS)\n// ---------------------------------------------------------------------------\n\nexport const StageStatus = {\n SUCCESS: \"success\",\n SKIPPED: \"skipped\",\n FAILED: \"failed\",\n} as const;\nexport type StageStatus = (typeof StageStatus)[keyof typeof StageStatus];\n\nexport const PipeStatus = {\n SUCCESS: \"success\",\n PARTIAL: \"partial\",\n FAILED: \"failed\",\n} as const;\nexport type PipeStatus = (typeof PipeStatus)[keyof typeof PipeStatus];\n\n// ---------------------------------------------------------------------------\n// Decision — routing instruction from a stage to the framework\n// ---------------------------------------------------------------------------\n\nexport interface Decision {\n /** Stage names to drop from the remaining plan. */\n skip: string[];\n /** Abort the whole pipeline after this stage. */\n abort: boolean;\n /** Stage names to prepend to the remaining plan. */\n insert: string[];\n /** Human-readable explanation, surfaced in `reasoning._router`. */\n reason: string;\n}\n\n/** Construct a Decision with Python-parity defaults. */\nexport function makeDecision(input?: Partial<Decision>): Decision {\n return {\n skip: input?.skip ?? [],\n abort: input?.abort ?? false,\n insert: input?.insert ?? [],\n reason: input?.reason ?? \"\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// StageResult — returned by every stage's run()\n// ---------------------------------------------------------------------------\n\nexport interface StageResult {\n status: StageStatus;\n decision?: Decision | null;\n error?: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// PipeContext — the object flowing through the pipeline (mutated in place)\n// ---------------------------------------------------------------------------\n\nexport interface PipeContext {\n /** Working data. `null` until the load stage populates it. */\n df: Row[] | null;\n artifacts: Record<string, unknown>;\n metadata: Record<string, unknown>;\n timing: Record<string, number>;\n reasoning: Record<string, string>;\n /** Per-stage config made available to the adapter by the runner. */\n stageConfig: Record<string, unknown>;\n}\n\nexport function makePipeContext(input?: Partial<PipeContext>): PipeContext {\n return {\n df: input?.df ?? null,\n artifacts: input?.artifacts ?? {},\n metadata: input?.metadata ?? {},\n timing: input?.timing ?? {},\n reasoning: input?.reasoning ?? {},\n stageConfig: input?.stageConfig ?? {},\n };\n}\n\n// ---------------------------------------------------------------------------\n// PipeResult — final output returned to the caller\n// ---------------------------------------------------------------------------\n\nexport interface PipeResult {\n status: PipeStatus;\n source: string;\n inputRows: number;\n stages: Record<string, StageResult>;\n artifacts: Record<string, unknown>;\n skipped: string[];\n errors: string[];\n reasoning: Record<string, string>;\n timing: Record<string, number>;\n}\n\n// ---------------------------------------------------------------------------\n// Stage configuration models (mirrors models/config.py Pydantic models)\n// ---------------------------------------------------------------------------\n\nexport type OnError = \"continue\" | \"abort\";\n\nexport interface StageSpec {\n name?: string | undefined;\n use: string;\n needs: string[];\n skipIf?: string | undefined;\n onError: OnError;\n config: Record<string, unknown>;\n}\n\n/** Normalize a raw stage spec (object or bare string) into a full StageSpec. */\nexport function makeStageSpec(input: string | Partial<StageSpec> & { use: string }): StageSpec {\n if (typeof input === \"string\") {\n return { use: input, needs: [], onError: \"continue\", config: {} };\n }\n return {\n ...(input.name !== undefined ? { name: input.name } : {}),\n use: input.use,\n needs: input.needs ?? [],\n ...(input.skipIf !== undefined ? { skipIf: input.skipIf } : {}),\n onError: input.onError ?? \"continue\",\n config: input.config ?? {},\n };\n}\n\nexport interface PipelineConfig {\n pipeline: string;\n source?: string | undefined;\n output?: string | undefined;\n /** Stages may be bare strings or full specs; normalize via `makeStageSpec`. */\n stages: Array<string | StageSpec>;\n decisions: string[];\n}\n\nexport function makePipelineConfig(\n input: Partial<PipelineConfig> & { pipeline: string; stages: Array<string | StageSpec> },\n): PipelineConfig {\n return {\n pipeline: input.pipeline,\n ...(input.source !== undefined ? { source: input.source } : {}),\n ...(input.output !== undefined ? { output: input.output } : {}),\n stages: input.stages,\n decisions: input.decisions ?? [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Stage protocol + StageInfo + @stage factory (mirrors models/stage.py)\n// ---------------------------------------------------------------------------\n\nexport interface StageInfo {\n name: string;\n produces: string[];\n consumes: string[];\n}\n\n/**\n * Full contract for pipeline stages. `run` is async so it can await the\n * async GoldenMatch `dedupe` adapter.\n */\nexport interface Stage {\n readonly info: StageInfo;\n validate(ctx: PipeContext): void | Promise<void>;\n run(ctx: PipeContext): Promise<StageResult>;\n rollback?: ((ctx: PipeContext) => void | Promise<void>) | null;\n}\n\n/**\n * Wrap a plain async function into a Stage. Port of the Python `@stage`\n * decorator + `_FunctionStage`.\n */\nexport function stage(\n info: StageInfo,\n fn: (ctx: PipeContext) => Promise<StageResult> | StageResult,\n): Stage {\n return {\n info,\n validate(_ctx: PipeContext): void {\n /* function stages have no validation hook */\n },\n async run(ctx: PipeContext): Promise<StageResult> {\n return fn(ctx);\n },\n rollback: null,\n };\n}\n","/**\n * Column context — shared column metadata flowing between pipeline stages.\n * Port of goldenpipe/models/column_context.py.\n *\n * Built by GoldenCheck (scan), enriched by GoldenFlow (transform), consumed by\n * GoldenMatch (auto-config) to avoid re-profiling.\n *\n * Edge-safe: no `node:` imports.\n */\n\nimport type { Row } from \"./models.js\";\n\n// ---------------------------------------------------------------------------\n// Enums (string-literal unions in TS)\n// ---------------------------------------------------------------------------\n\nexport const ColumnType = {\n NAME: \"name\",\n EMAIL: \"email\",\n PHONE: \"phone\",\n DATE: \"date\",\n GEO: \"geo\",\n ADDRESS: \"address\",\n ZIP: \"zip\",\n IDENTIFIER: \"identifier\",\n NUMERIC: \"numeric\",\n STRING: \"string\",\n DESCRIPTION: \"description\",\n} as const;\nexport type ColumnType = (typeof ColumnType)[keyof typeof ColumnType];\n\nexport const CardinalityBand = {\n UNSET: \"\",\n LOW: \"low\",\n MID: \"mid\",\n HIGH: \"high\",\n SKIP: \"skip\",\n} as const;\nexport type CardinalityBand = (typeof CardinalityBand)[keyof typeof CardinalityBand];\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Floor — below this, the signal is too weak to act on. */\nexport const MIN_CONFIDENCE = 0.3;\n\n/** Identifier types — columns that identify an entity (used for matching). */\nconst IDENTIFIER_TYPES: ReadonlySet<ColumnType> = new Set([\n ColumnType.NAME,\n ColumnType.EMAIL,\n ColumnType.PHONE,\n]);\n\n/** Types that should never be identifiers regardless of cardinality. */\nconst NEVER_IDENTIFIER_TYPES: ReadonlySet<ColumnType> = new Set([\n ColumnType.DATE,\n ColumnType.NUMERIC,\n ColumnType.IDENTIFIER,\n]);\n\n// ---------------------------------------------------------------------------\n// ColumnContext\n// ---------------------------------------------------------------------------\n\nexport interface ColumnContext {\n name: string;\n inferredType: ColumnType;\n nullRate: number;\n cardinality: number;\n isIdentifier: boolean;\n transformsApplied: string[];\n findings: string[];\n confidence: number;\n cardinalityBand: CardinalityBand;\n}\n\n/** Construct a ColumnContext, validating invariants (port of `__post_init__`). */\nexport function makeColumnContext(\n input: Partial<ColumnContext> & { name: string },\n): ColumnContext {\n const ctx: ColumnContext = {\n name: input.name,\n inferredType: input.inferredType ?? ColumnType.STRING,\n nullRate: input.nullRate ?? 0.0,\n cardinality: input.cardinality ?? 0,\n isIdentifier: input.isIdentifier ?? false,\n transformsApplied: input.transformsApplied ?? [],\n findings: input.findings ?? [],\n confidence: input.confidence ?? 0.5,\n cardinalityBand: input.cardinalityBand ?? CardinalityBand.UNSET,\n };\n if (!ctx.name) {\n throw new Error(\"ColumnContext.name must be non-empty\");\n }\n if (!(ctx.nullRate >= 0.0 && ctx.nullRate <= 1.0)) {\n throw new Error(`nullRate must be in [0, 1], got ${ctx.nullRate}`);\n }\n if (ctx.cardinality < 0) {\n throw new Error(`cardinality must be >= 0, got ${ctx.cardinality}`);\n }\n if (!(ctx.confidence >= 0.0 && ctx.confidence <= 1.0)) {\n throw new Error(`confidence must be in [0, 1], got ${ctx.confidence}`);\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Name-based classification (regex heuristics)\n// ---------------------------------------------------------------------------\n\nconst NAME_PATTERNS =\n /(^name$|first.?name|last.?name|full.?name|fname|lname|surname|given.?name|middle)/i;\nconst EMAIL_PATTERNS = /(email|e.?mail|email.?addr)/i;\nconst PHONE_PATTERNS = /(phone|tel|mobile|fax|cell)/i;\nconst ZIP_PATTERNS = /(zip|postal|postcode|zip.?code)/i;\nconst ADDRESS_PATTERNS = /(address|street|addr|line.?1|line.?2)/i;\nconst GEO_PATTERNS = /(city|^state$|state.?cd|^country$|province|region|county)/i;\nconst DATE_PATTERNS = /(date|_dt$|_date$|registr|created|updated|birth.?d|dob)/i;\nconst ID_PATTERNS = /(^id$|^key$|^code$|^sku$|_id$|_key$)/i;\n\n/** Classify a column by name pattern matching. Returns null when no match. */\nexport function classifyByName(colName: string): ColumnType | null {\n if (DATE_PATTERNS.test(colName)) return ColumnType.DATE;\n if (EMAIL_PATTERNS.test(colName)) return ColumnType.EMAIL;\n if (ZIP_PATTERNS.test(colName)) return ColumnType.ZIP;\n if (GEO_PATTERNS.test(colName)) return ColumnType.GEO;\n if (ADDRESS_PATTERNS.test(colName)) return ColumnType.ADDRESS;\n if (PHONE_PATTERNS.test(colName)) return ColumnType.PHONE;\n if (NAME_PATTERNS.test(colName)) return ColumnType.NAME;\n if (ID_PATTERNS.test(colName)) return ColumnType.IDENTIFIER;\n return null;\n}\n\n/** Map a profiler dtype string to a ColumnType. */\nexport function normalizeDtype(rawType: string): ColumnType {\n const t = rawType.toLowerCase().trim();\n if (t.includes(\"int\") || t.includes(\"float\")) return ColumnType.NUMERIC;\n if (t.includes(\"date\") || t.includes(\"time\")) return ColumnType.DATE;\n if (t.includes(\"bool\")) return ColumnType.STRING;\n return ColumnType.STRING;\n}\n\n// ---------------------------------------------------------------------------\n// Cardinality IQR banding\n// ---------------------------------------------------------------------------\n\n/** Classify each column's cardinality as low/mid/high using IQR quartiles. */\nfunction computeCardinalityBands(contexts: ColumnContext[]): void {\n const stringContexts = contexts.filter(\n (c) => c.inferredType !== ColumnType.NUMERIC && c.inferredType !== ColumnType.DATE,\n );\n if (stringContexts.length < 3) {\n return;\n }\n\n const cardinalities = stringContexts.map((c) => c.cardinality).sort((a, b) => a - b);\n const n = cardinalities.length;\n // Python uses integer-division indices: q1 = card[n // 4], q3 = card[3 * n // 4].\n const q1 = cardinalities[Math.floor(n / 4)]!;\n const q3 = cardinalities[Math.floor((3 * n) / 4)]!;\n\n for (const ctx of contexts) {\n if (ctx.inferredType === ColumnType.NUMERIC || ctx.inferredType === ColumnType.DATE) {\n ctx.cardinalityBand = CardinalityBand.SKIP;\n continue;\n }\n if (ctx.cardinality <= q1) {\n ctx.cardinalityBand = CardinalityBand.LOW;\n } else if (ctx.cardinality >= q3) {\n ctx.cardinalityBand = CardinalityBand.HIGH;\n } else {\n ctx.cardinalityBand = CardinalityBand.MID;\n }\n }\n}\n\n/** Refine `isIdentifier` using cardinality band as a second signal. */\nfunction applyCardinalitySignal(contexts: ColumnContext[]): void {\n for (const ctx of contexts) {\n if (NEVER_IDENTIFIER_TYPES.has(ctx.inferredType)) {\n ctx.isIdentifier = false;\n continue;\n }\n\n const hasNameSignal = IDENTIFIER_TYPES.has(ctx.inferredType);\n const band = ctx.cardinalityBand;\n\n if (hasNameSignal && band === CardinalityBand.MID) {\n ctx.isIdentifier = true;\n ctx.confidence = Math.min(ctx.confidence + 0.15, 1.0);\n } else if (hasNameSignal && band === CardinalityBand.LOW) {\n ctx.isIdentifier = false;\n ctx.confidence = Math.max(ctx.confidence - 0.2, MIN_CONFIDENCE);\n } else if (hasNameSignal && band === CardinalityBand.HIGH) {\n ctx.isIdentifier = true;\n ctx.confidence = Math.min(ctx.confidence + 0.05, 1.0);\n } else if (!hasNameSignal && band === CardinalityBand.MID) {\n if (ctx.inferredType === ColumnType.STRING) {\n ctx.isIdentifier = true;\n ctx.confidence = 0.5;\n }\n } else if (!hasNameSignal && band === CardinalityBand.LOW) {\n ctx.isIdentifier = false;\n } else if (!hasNameSignal && band === CardinalityBand.HIGH) {\n ctx.isIdentifier = false;\n }\n\n if (ctx.nullRate > 0.3 && ctx.isIdentifier) {\n ctx.confidence = Math.max(ctx.confidence - 0.1, MIN_CONFIDENCE);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Context builders\n// ---------------------------------------------------------------------------\n\n/** Minimal shape of a GoldenCheck ColumnProfile that we consume. */\nexport interface ColumnProfileLike {\n name: string;\n inferredType?: string;\n nullPct?: number;\n uniqueCount?: number;\n}\n\n/** Minimal shape of a GoldenCheck finding that we consume. */\nexport interface FindingLike {\n column?: string;\n check?: string;\n message?: string;\n}\n\n/**\n * Build ColumnContexts from GoldenCheck scan results. Combines three signals:\n * 1. Column-name heuristics (regex patterns).\n * 2. Profile data (null rate, cardinality, dtype).\n * 3. Cardinality IQR bands.\n */\nexport function buildContextsFromCheck(\n findings: readonly FindingLike[],\n columnProfiles: readonly ColumnProfileLike[] | null | undefined,\n): ColumnContext[] {\n if (!columnProfiles || columnProfiles.length === 0) {\n return [];\n }\n\n const contexts = new Map<string, ColumnContext>();\n for (const cp of columnProfiles) {\n let semanticType = classifyByName(cp.name);\n if (!semanticType) {\n semanticType = normalizeDtype(cp.inferredType ?? \"string\");\n }\n const ctx = makeColumnContext({\n name: cp.name,\n inferredType: semanticType,\n nullRate: cp.nullPct ?? 0.0,\n cardinality: cp.uniqueCount ?? 0,\n isIdentifier: IDENTIFIER_TYPES.has(semanticType),\n confidence: semanticType !== ColumnType.STRING ? 0.8 : 0.4,\n });\n contexts.set(cp.name, ctx);\n }\n\n const contextList = [...contexts.values()];\n computeCardinalityBands(contextList);\n applyCardinalitySignal(contextList);\n\n for (const f of findings) {\n const colName = f.column;\n if (!colName || !contexts.has(colName)) continue;\n const ctx = contexts.get(colName)!;\n const check = f.check ?? \"\";\n const message = String(f.message ?? \"\").slice(0, 80);\n ctx.findings.push(`${check}: ${message}`);\n }\n\n return contextList;\n}\n\n/** Minimal shape of a GoldenFlow manifest record we consume. */\nexport interface ManifestRecordLike {\n column?: string;\n transform?: string;\n affectedRows?: number;\n}\n\n/** Enrich ColumnContexts with GoldenFlow transform information. */\nexport function enrichContextsFromFlow(\n contexts: ColumnContext[],\n records: readonly ManifestRecordLike[] | null | undefined,\n): void {\n if (!records) return;\n const lookup = new Map(contexts.map((c) => [c.name, c]));\n\n for (const record of records) {\n const colName = record.column;\n const transform = record.transform;\n const affected = record.affectedRows ?? 0;\n if (!colName || !lookup.has(colName)) continue;\n const ctx = lookup.get(colName)!;\n if (affected > 0 && transform) {\n ctx.transformsApplied.push(transform);\n }\n if (transform && transform.toLowerCase().includes(\"date\")) {\n ctx.inferredType = ColumnType.DATE;\n ctx.isIdentifier = false;\n ctx.confidence = 0.95;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cardinality helper used by the match adapter (counts distinct non-null vals)\n// ---------------------------------------------------------------------------\n\nexport function distinctNonNull(rows: readonly Row[], col: string): number {\n const seen = new Set<unknown>();\n for (const row of rows) {\n const v = row[col];\n if (v === null || v === undefined || v === \"\") continue;\n seen.add(v);\n }\n return seen.size;\n}\n\nexport function nullRateOf(rows: readonly Row[], col: string): number {\n if (rows.length === 0) return 1.0;\n let nulls = 0;\n for (const row of rows) {\n const v = row[col];\n if (v === null || v === undefined || v === \"\") nulls += 1;\n }\n return nulls / rows.length;\n}\n","/**\n * Stage registry — register and retrieve stages.\n * Port of goldenpipe/engine/registry.py.\n *\n * Unlike the Python version, which discovers stages via importlib entry points,\n * the TS registry is STATIC: built-in stages (load, goldencheck.scan,\n * goldenflow.transform, goldenmatch.dedupe) are registered explicitly in\n * `defaultRegistry()`. Custom stages can be added with `register()`.\n *\n * Edge-safe: no `node:` imports.\n */\n\nimport type { Stage, StageInfo } from \"../models.js\";\n\nexport class StageRegistry {\n private readonly stages = new Map<string, Stage>();\n\n /** Register a stage under its `info.name`. */\n register(stage: Stage): void {\n this.stages.set(stage.info.name, stage);\n }\n\n /** Retrieve a stage by name. Throws if not found. */\n get(name: string): Stage {\n const stage = this.stages.get(name);\n if (stage === undefined) {\n throw new Error(`Stage '${name}' not found in registry`);\n }\n return stage;\n }\n\n /** True when a stage with this name is registered. */\n has(name: string): boolean {\n return this.stages.has(name);\n }\n\n /** Return `{ name: StageInfo }` for all registered stages. */\n listAll(): Record<string, StageInfo> {\n const out: Record<string, StageInfo> = {};\n for (const [name, s] of this.stages) {\n out[name] = s.info;\n }\n return out;\n }\n}\n\n/**\n * Build a registry with the built-in suite stages registered. This is the TS\n * analogue of Python's entry-point discovery — wiring goldencheck.scan,\n * goldenflow.transform, and goldenmatch.dedupe (+ the built-in `load` stage).\n */\nexport function defaultRegistry(): StageRegistry {\n const registry = new StageRegistry();\n // Imported here (not at module top) to keep the dependency graph explicit\n // and avoid a cycle: adapters import models + engine helpers, not registry.\n return registry;\n}\n","/**\n * Pipeline resolver — build an ExecutionPlan and validate wiring.\n * Port of goldenpipe/engine/resolver.py.\n *\n * Edge-safe: no `node:` imports.\n */\n\nimport type { PipelineConfig, Stage, StageSpec } from \"../models.js\";\nimport { makeStageSpec } from \"../models.js\";\nimport type { StageRegistry } from \"./registry.js\";\n\n/** Raised when a stage's `consumes` can't be satisfied by prior `produces`. */\nexport class WiringError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"WiringError\";\n }\n}\n\nexport interface PlannedStage {\n name: string;\n stage: Stage;\n spec: StageSpec;\n config: Record<string, unknown>;\n}\n\nexport interface ExecutionPlan {\n stages: PlannedStage[];\n}\n\nexport const Resolver = {\n /**\n * Resolve a config + registry into an ordered ExecutionPlan. Auto-prepends\n * the built-in `load` stage when available and validates that every stage's\n * `consumes` is produced by an earlier stage.\n */\n resolve(config: PipelineConfig, registry: StageRegistry): ExecutionPlan {\n const plan: ExecutionPlan = { stages: [] };\n const availableArtifacts = new Set<string>();\n\n // Auto-prepend load stage if available.\n if (registry.has(\"load\")) {\n const load = registry.get(\"load\");\n plan.stages.push({\n name: \"load\",\n stage: load,\n spec: makeStageSpec(\"load\"),\n config: {},\n });\n for (const p of load.info.produces) availableArtifacts.add(p);\n } else {\n availableArtifacts.add(\"df\");\n }\n\n for (const rawSpec of config.stages) {\n const spec = makeStageSpec(rawSpec);\n const stageObj = registry.get(spec.use);\n const name = spec.name ?? stageObj.info.name;\n\n for (const dep of stageObj.info.consumes) {\n if (!availableArtifacts.has(dep)) {\n throw new WiringError(\n `Stage '${name}' consumes '${dep}' but no prior stage produces it. ` +\n `Available: ${[...availableArtifacts].sort().join(\", \")}`,\n );\n }\n }\n\n plan.stages.push({ name, stage: stageObj, spec, config: spec.config });\n for (const p of stageObj.info.produces) availableArtifacts.add(p);\n }\n\n return plan;\n },\n};\n","/**\n * Decision router — apply routing decisions to the remaining execution plan.\n * Port of goldenpipe/engine/router.py.\n *\n * Edge-safe: no `node:` imports.\n */\n\nimport type { Decision, PipeContext } from \"../models.js\";\nimport { makeStageSpec } from \"../models.js\";\nimport type { StageRegistry } from \"./registry.js\";\nimport type { PlannedStage } from \"./resolver.js\";\n\nexport const Router = {\n /**\n * Apply a Decision (skip / abort / insert) to the remaining stages and\n * return the new remaining list. Records `decision.reason` in\n * `ctx.reasoning._router`.\n */\n apply(\n decision: Decision,\n remaining: PlannedStage[],\n ctx: PipeContext,\n registry: StageRegistry,\n ): PlannedStage[] {\n if (decision.reason) {\n ctx.reasoning[\"_router\"] = decision.reason;\n }\n\n if (decision.abort) {\n ctx.reasoning[\"_router\"] = `ABORT: ${decision.reason}`;\n return [];\n }\n\n let next = remaining;\n if (decision.skip.length > 0) {\n const skipSet = new Set(decision.skip);\n next = next.filter((s) => !skipSet.has(s.name));\n }\n\n if (decision.insert.length > 0) {\n const inserted: PlannedStage[] = [];\n for (const name of decision.insert) {\n const stageObj = registry.get(name);\n inserted.push({\n name,\n stage: stageObj,\n spec: makeStageSpec(name),\n config: {},\n });\n }\n next = [...inserted, ...next];\n }\n\n return next;\n },\n};\n","/**\n * Pipeline runner — execute stages with error handling and routing.\n * Port of goldenpipe/engine/runner.py.\n *\n * ASYNC: stage execution awaits each stage's `run`, because the GoldenMatch\n * `dedupe` adapter is async.\n *\n * Edge-safe: no `node:` imports.\n */\n\nimport type { PipeContext, StageResult } from \"../models.js\";\nimport { StageStatus } from \"../models.js\";\nimport type { StageRegistry } from \"./registry.js\";\nimport type { ExecutionPlan } from \"./resolver.js\";\nimport { Router } from \"./router.js\";\n\nfunction isFalsy(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (value === false || value === 0 || value === \"\") return true;\n if (Array.isArray(value)) return value.length === 0;\n if (value instanceof Map || value instanceof Set) return value.size === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n}\n\nexport class Runner {\n constructor(private readonly registry: StageRegistry) {}\n\n /** Execute an ExecutionPlan against a PipeContext, returning per-stage results. */\n async run(plan: ExecutionPlan, ctx: PipeContext): Promise<Record<string, StageResult>> {\n const results: Record<string, StageResult> = {};\n let remaining = [...plan.stages];\n\n while (remaining.length > 0) {\n const planned = remaining.shift()!;\n\n if (planned.spec.skipIf) {\n const artifact = ctx.artifacts[planned.spec.skipIf];\n if (isFalsy(artifact)) {\n results[planned.name] = { status: StageStatus.SKIPPED };\n ctx.reasoning[planned.name] =\n `Skipped: artifact '${planned.spec.skipIf}' is missing/falsy`;\n continue;\n }\n }\n\n const start = performance.now();\n try {\n // Make stage-level config available to the adapter via context.\n ctx.stageConfig = planned.config;\n\n await planned.stage.validate(ctx);\n const result = await planned.stage.run(ctx);\n ctx.timing[planned.name] = (performance.now() - start) / 1000;\n results[planned.name] = result;\n\n if (result.decision != null) {\n remaining = Router.apply(result.decision, remaining, ctx, this.registry);\n }\n } catch (e) {\n ctx.timing[planned.name] = (performance.now() - start) / 1000;\n const message = e instanceof Error ? e.message : String(e);\n results[planned.name] = { status: StageStatus.FAILED, error: message };\n ctx.reasoning[planned.name] = `Failed: ${message}`;\n\n if (planned.spec.onError === \"abort\") {\n break;\n }\n }\n }\n\n return results;\n }\n}\n","/**\n * Reporter — build a PipeResult from a PipeContext after execution.\n * Port of goldenpipe/engine/reporter.py.\n *\n * Edge-safe: no `node:` imports.\n */\n\nimport type { PipeContext, PipeResult, StageResult } from \"../models.js\";\nimport { PipeStatus, StageStatus } from \"../models.js\";\n\nexport const Reporter = {\n build(ctx: PipeContext, stages: Record<string, StageResult>): PipeResult {\n const entries = Object.entries(stages);\n\n const errors = entries\n .filter(([, r]) => r.status === StageStatus.FAILED && r.error)\n .map(([name, r]) => `${name}: ${r.error}`);\n\n const skipped = entries\n .filter(([, r]) => r.status === StageStatus.SKIPPED)\n .map(([name]) => name);\n\n const nonSkip = entries\n .map(([, r]) => r.status)\n .filter((s) => s !== StageStatus.SKIPPED);\n\n let status: PipeStatus;\n if (nonSkip.length === 0) {\n status = PipeStatus.SUCCESS;\n } else if (nonSkip.every((s) => s === StageStatus.FAILED)) {\n status = PipeStatus.FAILED;\n } else if (nonSkip.every((s) => s === StageStatus.SUCCESS)) {\n status = PipeStatus.SUCCESS;\n } else {\n status = PipeStatus.PARTIAL;\n }\n\n return {\n status,\n source: typeof ctx.metadata[\"source\"] === \"string\" ? (ctx.metadata[\"source\"] as string) : \"\",\n inputRows: typeof ctx.metadata[\"input_rows\"] === \"number\" ? (ctx.metadata[\"input_rows\"] as number) : 0,\n stages,\n artifacts: { ...ctx.artifacts },\n skipped,\n errors,\n reasoning: { ...ctx.reasoning },\n timing: { ...ctx.timing },\n };\n },\n};\n","/**\n * Built-in decision functions for pipeline routing.\n * Port of goldenpipe/decisions.py.\n *\n * Edge-safe: no `node:` imports.\n *\n * NOTE on TS sibling skew: GoldenCheck-JS `Finding.severity` is a numeric enum\n * (INFO=1, WARNING=2, ERROR=3) and has no `\"critical\"` level, and there is no\n * `\"pii_detection\"` check. The check adapter normalizes findings to a string\n * `severity` label (\"info\"/\"warning\"/\"error\") and a `check` string. So in\n * practice `severityGate` and `piiRouter` are no-ops against current\n * GoldenCheck-JS output — they are ported for structural parity and so that\n * custom stages emitting `\"critical\"` / `\"pii_detection\"` findings still route.\n */\n\nimport type { Decision, PipeContext } from \"./models.js\";\nimport { makeDecision } from \"./models.js\";\n\ninterface NormalizedFinding {\n severity?: unknown;\n check?: unknown;\n}\n\nfunction findingsOf(ctx: PipeContext): NormalizedFinding[] | null {\n const findings = ctx.artifacts[\"findings\"];\n if (!Array.isArray(findings) || findings.length === 0) return null;\n return findings as NormalizedFinding[];\n}\n\n/** Abort the pipeline if any finding has `critical` severity. */\nexport function severityGate(ctx: PipeContext): Decision | null {\n const findings = findingsOf(ctx);\n if (!findings) return null;\n\n const hasCritical = findings.some((f) => f.severity === \"critical\");\n if (hasCritical) {\n return makeDecision({ abort: true, reason: \"Critical findings detected\" });\n }\n return null;\n}\n\n/** Route to PPRL matching if PII is detected. */\nexport function piiRouter(ctx: PipeContext): Decision | null {\n const findings = findingsOf(ctx);\n if (!findings) return null;\n\n const hasPii = findings.some((f) => f.check === \"pii_detection\");\n if (hasPii) {\n return makeDecision({\n skip: [\"goldenmatch.dedupe\"],\n insert: [\"goldenmatch.dedupe_pprl\"],\n reason: \"PII detected, routing to PPRL matching\",\n });\n }\n return null;\n}\n\n/** Skip matching if fewer than 2 rows. */\nexport function rowCountGate(ctx: PipeContext): Decision | null {\n const rowCount =\n typeof ctx.metadata[\"input_rows\"] === \"number\" ? (ctx.metadata[\"input_rows\"] as number) : 0;\n if (rowCount < 2) {\n return makeDecision({\n skip: [\"goldenmatch.dedupe\"],\n reason: `Only ${rowCount} row(s), skipping deduplication`,\n });\n }\n return null;\n}\n","/**\n * Built-in LoadStage — marks `df` as available. The actual data loading is\n * handled by the Pipeline (file read) or supplied by the caller (runDf).\n * Port of goldenpipe/adapters/__init__.py LoadStage.\n *\n * Edge-safe: no `node:` imports.\n */\n\nimport type { PipeContext, Stage, StageResult } from \"../models.js\";\nimport { StageStatus } from \"../models.js\";\n\nexport const LoadStage: Stage = {\n info: { name: \"load\", produces: [\"df\"], consumes: [] },\n validate(_ctx: PipeContext): void {\n /* no-op */\n },\n async run(_ctx: PipeContext): Promise<StageResult> {\n return { status: StageStatus.SUCCESS };\n },\n rollback: null,\n};\n","/**\n * GoldenCheck adapter — wraps GoldenCheck-JS `scanData`.\n * Port of goldenpipe/adapters/check.py.\n *\n * Shape divergence vs Python: the Python adapter calls `scan_file(path)` and\n * reads `ctx.metadata[\"source\"]`. GoldenCheck-JS's edge-safe `scanData` instead\n * operates on a `TabularData` built from rows, so the TS adapter scans\n * `ctx.df` directly. This means `goldencheck.scan` succeeds in the in-memory\n * (`runDf`) path here, whereas the Python `run_df` path fails the scan stage\n * (it has no file). Use `run(source)` for cross-language parity.\n *\n * Edge-safe: no `node:` imports (GoldenCheck-JS core is edge-safe).\n */\n\nimport { scanData, TabularData, severityLabel } from \"goldencheck/core\";\nimport type { Finding, ColumnProfile } from \"goldencheck/core\";\nimport type { PipeContext, Stage, StageResult } from \"../models.js\";\nimport { StageStatus } from \"../models.js\";\nimport {\n buildContextsFromCheck,\n type ColumnProfileLike,\n type FindingLike,\n} from \"../columnContext.js\";\n\ninterface NormalizedFinding {\n severity: string;\n check: string;\n column: string;\n message: string;\n}\n\n/** Normalize a GoldenCheck-JS Finding (numeric severity) to the dict shape\n * the Python pipeline used (string severity label). */\nfunction normalizeFinding(f: Finding): NormalizedFinding {\n return {\n severity: severityLabel(f.severity).toLowerCase(),\n check: f.check,\n column: f.column,\n message: f.message,\n };\n}\n\n/** Map a GoldenCheck-JS ColumnProfile to the minimal shape columnContext consumes. */\nfunction toColumnProfileLike(cp: ColumnProfile): ColumnProfileLike {\n return {\n name: cp.name,\n inferredType: cp.inferredType,\n nullPct: cp.nullPct,\n uniqueCount: cp.uniqueCount,\n };\n}\n\nexport const ScanStage: Stage = {\n info: { name: \"goldencheck.scan\", produces: [\"findings\", \"profile\"], consumes: [\"df\"] },\n\n validate(ctx: PipeContext): void {\n if (ctx.df === null) {\n throw new Error(\"ScanStage: no df in context\");\n }\n },\n\n async run(ctx: PipeContext): Promise<StageResult> {\n const rows = ctx.df ?? [];\n const data = new TabularData(rows);\n const stageCfg = ctx.stageConfig;\n const opts = stageCfg && Object.keys(stageCfg).length > 0 ? stageCfg : undefined;\n const result = scanData(data, opts as Parameters<typeof scanData>[1]);\n\n const findings: NormalizedFinding[] = result.findings.map(normalizeFinding);\n const columnProfiles = result.profile.columns;\n\n ctx.artifacts[\"findings\"] = findings;\n ctx.artifacts[\"profile\"] = result.profile;\n\n // Build column contexts for downstream stages (best-effort enrichment).\n try {\n const profileLikes: ColumnProfileLike[] = columnProfiles.map(toColumnProfileLike);\n const findingLikes: FindingLike[] = findings.map((f) => ({\n column: f.column,\n check: f.check,\n message: f.message,\n }));\n ctx.artifacts[\"column_contexts\"] = buildContextsFromCheck(findingLikes, profileLikes);\n } catch {\n ctx.artifacts[\"column_contexts\"] = [];\n }\n\n return { status: StageStatus.SUCCESS };\n },\n\n rollback: null,\n};\n","/**\n * GoldenFlow adapter — wraps GoldenFlow-JS `TransformEngine.transformDf`.\n * Port of goldenpipe/adapters/flow.py.\n *\n * Shape note: GoldenFlow-JS exposes `new TransformEngine(config).transformDf(rows)`\n * which returns `{ rows, columns, manifest }` (the Python sibling's\n * `transform_df(df)` returns an object with `.df` + `.manifest`). We read\n * `.rows` back into `ctx.df` and surface `.manifest` as an artifact.\n *\n * Edge-safe: no `node:` imports (GoldenFlow-JS core is edge-safe).\n */\n\nimport { TransformEngine } from \"goldenflow/core\";\nimport type { GoldenFlowConfig } from \"goldenflow/core\";\nimport type { PipeContext, Stage, StageResult, Row } from \"../models.js\";\nimport { StageStatus } from \"../models.js\";\nimport { enrichContextsFromFlow, type ColumnContext, type ManifestRecordLike } from \"../columnContext.js\";\n\nexport const TransformStage: Stage = {\n info: { name: \"goldenflow.transform\", produces: [\"df\", \"manifest\"], consumes: [\"df\"] },\n\n validate(ctx: PipeContext): void {\n if (ctx.df === null) {\n throw new Error(\"TransformStage: no df in context\");\n }\n },\n\n async run(ctx: PipeContext): Promise<StageResult> {\n const rows = (ctx.df ?? []) as Row[];\n const stageCfg = ctx.stageConfig;\n const config =\n stageCfg && Object.keys(stageCfg).length > 0\n ? (stageCfg as Partial<GoldenFlowConfig>)\n : undefined;\n\n const engine = new TransformEngine(config);\n const result = engine.transformDf(rows);\n\n ctx.df = [...result.rows] as Row[];\n ctx.artifacts[\"manifest\"] = result.manifest;\n\n // Enrich column contexts with transform information (best-effort).\n const contexts = ctx.artifacts[\"column_contexts\"];\n if (Array.isArray(contexts)) {\n try {\n const records: ManifestRecordLike[] = result.manifest.records.map((r) => ({\n column: r.column,\n transform: r.transform,\n affectedRows: r.affectedRows,\n }));\n enrichContextsFromFlow(contexts as ColumnContext[], records);\n } catch {\n /* best-effort: never break the pipeline on enrichment failure */\n }\n }\n\n return { status: StageStatus.SUCCESS };\n },\n\n rollback: null,\n};\n","/**\n * GoldenMatch adapter — wraps GoldenMatch-JS `dedupe`.\n * Port of goldenpipe/adapters/match.py (+ `_build_config_from_contexts`).\n *\n * `dedupe` is ASYNC, so this stage's `run` awaits it (and the whole runner is\n * async). Config selection priority mirrors Python:\n * 1. explicit stage config (from YAML / PipelineConfig.config)\n * 2. config built from upstream column contexts\n * 3. GoldenMatch auto-configure (no config → shorthand path)\n *\n * Shape divergences from the Python sibling, surfaced as artifacts:\n * - GoldenMatch-JS `DedupeResult` exposes `.goldenRecords` (not `.golden`),\n * `.dupes`, `.unique`, `.stats`, `.scoredPairs`. We map `goldenRecords` to\n * the `golden` artifact for parity with the Python pipeline's artifact name.\n * - `matchkey_used` is derived from the built config's first matchkey (the\n * JS result does not carry the resolved matchkey list back).\n *\n * Edge-safe: no `node:` imports (GoldenMatch-JS core is edge-safe).\n */\n\nimport { dedupe, makeConfig, makeMatchkeyConfig, makeMatchkeyField, makeBlockingConfig } from \"goldenmatch/core\";\nimport type {\n GoldenMatchConfig,\n MatchkeyConfig,\n MatchkeyField,\n BlockingConfig,\n BlockingKeyConfig,\n} from \"goldenmatch/core\";\nimport type { PipeContext, Stage, StageResult, Row } from \"../models.js\";\nimport { StageStatus } from \"../models.js\";\nimport {\n ColumnType,\n distinctNonNull,\n nullRateOf,\n type ColumnContext,\n} from \"../columnContext.js\";\n\n/** Cast every cell to string, mirroring the Python adapter's defensive cast\n * that prevents mixed-type-column schema mismatches reaching GoldenMatch. */\nfunction castRowsToString(rows: readonly Row[]): Row[] {\n return rows.map((row) => {\n const out: Row = {};\n for (const [k, v] of Object.entries(row)) {\n out[k] = v === null || v === undefined ? \"\" : String(v);\n }\n return out;\n });\n}\n\nexport const DedupeStage: Stage = {\n info: { name: \"goldenmatch.dedupe\", produces: [\"clusters\", \"golden\"], consumes: [\"df\"] },\n\n validate(ctx: PipeContext): void {\n if (ctx.df === null) {\n throw new Error(\"DedupeStage: no df in context\");\n }\n },\n\n async run(ctx: PipeContext): Promise<StageResult> {\n const rows = castRowsToString(ctx.df ?? []);\n ctx.df = rows;\n\n const stageCfg = ctx.stageConfig;\n let config: GoldenMatchConfig | null = null;\n\n // Priority 1: explicit stage config.\n if (stageCfg && Object.keys(stageCfg).length > 0) {\n config = makeConfig(stageCfg as Partial<GoldenMatchConfig>);\n } else {\n // Priority 2: build config from upstream column contexts.\n const contexts = ctx.artifacts[\"column_contexts\"];\n if (Array.isArray(contexts) && contexts.length > 0) {\n config = buildConfigFromContexts(contexts as ColumnContext[], rows);\n }\n }\n\n // Priority 3 falls through: no config → dedupe auto-configures.\n const result = config !== null ? await dedupe(rows, { config }) : await dedupe(rows);\n\n ctx.artifacts[\"clusters\"] = result.clusters;\n ctx.artifacts[\"golden\"] = result.goldenRecords;\n ctx.artifacts[\"unique\"] = result.unique;\n ctx.artifacts[\"dupes\"] = result.dupes;\n ctx.artifacts[\"match_stats\"] = result.stats;\n ctx.artifacts[\"scored_pairs\"] = result.scoredPairs;\n\n // Surface the first matchkey name (best-effort) for downstream stages.\n const mks = config?.matchkeys;\n if (mks && mks.length > 0) {\n ctx.artifacts[\"matchkey_used\"] = mks[0]!.name;\n }\n\n return { status: StageStatus.SUCCESS };\n },\n\n rollback: null,\n};\n\n/**\n * Build a GoldenMatchConfig from pipeline column contexts. Returns `null` if no\n * usable matchkeys can be built (caller then falls back to auto-configure).\n * Port of `_build_config_from_contexts`.\n */\nexport function buildConfigFromContexts(\n contexts: readonly ColumnContext[],\n rows: readonly Row[],\n): GoldenMatchConfig | null {\n const nameCols = contexts.filter(\n (c) => c.inferredType === ColumnType.NAME && c.isIdentifier,\n );\n const emailCols = contexts.filter((c) => c.inferredType === ColumnType.EMAIL);\n const geoCols = contexts.filter((c) => c.inferredType === ColumnType.GEO);\n\n const matchkeys: MatchkeyConfig[] = [];\n\n // Exact matchkeys for high-quality discriminators (email).\n for (const col of emailCols) {\n matchkeys.push(\n makeMatchkeyConfig({\n name: `exact_${col.name}`,\n type: \"exact\",\n fields: [makeMatchkeyField({ field: col.name, transforms: [\"lowercase\", \"strip\"], scorer: \"exact\" })],\n }),\n );\n }\n\n // Fuzzy matchkey on name columns (the core of person matching).\n if (nameCols.length > 0) {\n const fuzzyFields: MatchkeyField[] = nameCols.map((col) =>\n makeMatchkeyField({\n field: col.name,\n scorer: \"jaro_winkler\",\n weight: 1.0,\n transforms: [\"lowercase\", \"strip\"],\n }),\n );\n matchkeys.push(\n makeMatchkeyConfig({\n name: \"fuzzy_names\",\n type: \"weighted\",\n threshold: 0.85,\n fields: fuzzyFields,\n }),\n );\n }\n\n // Fallback: no identifier columns — use discriminative string columns.\n // Exclude low-cardinality columns (they inflate fuzzy scores without\n // providing meaningful discrimination).\n if (matchkeys.length === 0) {\n let stringCols = contexts.filter(\n (c) => c.inferredType === ColumnType.STRING || c.inferredType === ColumnType.NAME,\n );\n if (rows.length > 0) {\n const minCardinality = Math.max(10, Math.floor(rows.length * 0.05));\n stringCols = stringCols.filter((c) => distinctNonNull(rows, c.name) >= minCardinality);\n }\n const fallbackFields: MatchkeyField[] = stringCols.slice(0, 3).map((col) =>\n makeMatchkeyField({\n field: col.name,\n scorer: \"jaro_winkler\",\n weight: 1.0,\n transforms: [\"lowercase\", \"strip\"],\n }),\n );\n if (fallbackFields.length > 0) {\n matchkeys.push(\n makeMatchkeyConfig({\n name: \"fuzzy_fallback\",\n type: \"weighted\",\n threshold: 0.85,\n fields: fallbackFields,\n }),\n );\n }\n }\n\n // No matchkeys → give up; caller falls back to auto-configure.\n if (matchkeys.length === 0) {\n return null;\n }\n\n // Blocking: compound geo columns with name to prevent cross-region false\n // positives. Prefer low-cardinality geo (state ~50) over high (city ~3000).\n let bestGeo: string | null = null;\n if (geoCols.length > 0 && rows.length > 0) {\n const maxNullRate = 0.2;\n const geoCandidates: Array<[string, number]> = [];\n for (const g of geoCols) {\n if (nullRateOf(rows, g.name) <= maxNullRate) {\n geoCandidates.push([g.name, distinctNonNull(rows, g.name)]);\n }\n }\n if (geoCandidates.length > 0) {\n geoCandidates.sort((a, b) => a[1] - b[1]);\n bestGeo = geoCandidates[0]![0];\n }\n }\n\n const makeBlocking = (\n primaryFields: string[],\n recallName: string,\n withGeo = false,\n ): BlockingConfig => {\n const passes: BlockingKeyConfig[] = [\n { fields: primaryFields, transforms: [\"lowercase\", \"strip\"] },\n ];\n if (withGeo) {\n passes.push({ fields: primaryFields, transforms: [\"lowercase\", \"substring:0:3\"] });\n }\n // Name-only soundex recall pass (phonetic variants; relies on skipOversized).\n passes.push({ fields: [recallName], transforms: [\"lowercase\", \"soundex\"] });\n return makeBlockingConfig({\n strategy: \"multi_pass\",\n keys: [passes[0]!],\n passes,\n maxBlockSize: 500,\n skipOversized: true,\n });\n };\n\n let blocking: BlockingConfig | null = null;\n const lastNameCols = nameCols.filter((c) => c.name.toLowerCase().includes(\"last\"));\n if (lastNameCols.length > 0) {\n const bestName = lastNameCols[0]!.name;\n blocking = bestGeo\n ? makeBlocking([bestGeo, bestName], bestName, true)\n : makeBlocking([bestName], bestName);\n } else if (nameCols.length > 0) {\n const bestName = nameCols[0]!.name;\n if (bestGeo) {\n blocking = makeBlocking([bestGeo, bestName], bestName, true);\n } else {\n blocking = makeBlockingConfig({\n strategy: \"static\",\n keys: [{ fields: [bestName], transforms: [\"lowercase\", \"soundex\"] }],\n maxBlockSize: 500,\n skipOversized: true,\n });\n }\n }\n\n // Fallback: no name columns, but string matchkeys + geo present.\n if (!blocking && bestGeo && matchkeys.length > 0) {\n const fuzzyMks = matchkeys.filter((mk) => mk.type === \"weighted\");\n const first = fuzzyMks[0];\n if (first && first.fields.length > 0) {\n const anchor = first.fields[0]!.field;\n blocking = makeBlocking([bestGeo, anchor], anchor, true);\n }\n }\n\n // Still no blocking → let GoldenMatch auto-suggest.\n if (!blocking) {\n blocking = makeBlockingConfig({ keys: [], autoSuggest: true });\n }\n\n return makeConfig({ matchkeys, blocking });\n}\n","/**\n * Adapters index — built-in suite stages + registry wiring.\n * Replaces Python's importlib entry-point discovery with a STATIC registry.\n *\n * Edge-safe: no `node:` imports.\n */\n\nimport { StageRegistry } from \"../engine/registry.js\";\nimport { LoadStage } from \"./load.js\";\nimport { ScanStage } from \"./check.js\";\nimport { TransformStage } from \"./flow.js\";\nimport { DedupeStage } from \"./match.js\";\n\nexport { LoadStage } from \"./load.js\";\nexport { ScanStage } from \"./check.js\";\nexport { TransformStage } from \"./flow.js\";\nexport { DedupeStage, buildConfigFromContexts } from \"./match.js\";\n\n/**\n * Build a registry with all built-in suite stages registered:\n * - `load` (built-in)\n * - `goldencheck.scan`\n * - `goldenflow.transform`\n * - `goldenmatch.dedupe`\n *\n * This is the TS analogue of Python's `StageRegistry.discover()`.\n */\nexport function buildDefaultRegistry(): StageRegistry {\n const registry = new StageRegistry();\n registry.register(LoadStage);\n registry.register(ScanStage);\n registry.register(TransformStage);\n registry.register(DedupeStage);\n return registry;\n}\n","/**\n * Pipeline — high-level orchestrator + programmatic run helpers.\n * Port of goldenpipe/pipeline.py + goldenpipe/_api.py (the DataFrame paths).\n *\n * Operates on `Row[]`. The file-loading `run(source)` entry point lives in\n * `node/` (it needs `node:fs`); the edge-safe core only exposes the in-memory\n * `runDf` / `runStages` paths.\n *\n * Edge-safe: no `node:` imports.\n */\n\nimport type { PipeContext, PipelineConfig, PipeResult, Row, Stage } from \"./models.js\";\nimport { makePipeContext, makePipelineConfig, makeStageSpec, PipeStatus } from \"./models.js\";\nimport { StageRegistry } from \"./engine/registry.js\";\nimport { Resolver } from \"./engine/resolver.js\";\nimport { Runner } from \"./engine/runner.js\";\nimport { Reporter } from \"./engine/reporter.js\";\nimport { buildDefaultRegistry } from \"./adapters/index.js\";\n\nconst DEFAULT_STAGE_ORDER = [\n \"goldencheck.scan\",\n \"goldenflow.transform\",\n \"goldenmatch.dedupe\",\n];\n\nexport interface PipelineOptions {\n config?: PipelineConfig | undefined;\n registry?: StageRegistry | undefined;\n}\n\nexport class Pipeline {\n private readonly config: PipelineConfig | undefined;\n private readonly registry: StageRegistry;\n\n constructor(options?: PipelineOptions) {\n this.config = options?.config;\n // When the caller supplies a registry, use it as-is; otherwise build the\n // default suite registry (load + scan + transform + dedupe).\n this.registry = options?.registry ?? buildDefaultRegistry();\n }\n\n /** Run the pipeline on an array of rows. */\n async run(rows: readonly Row[], source = \"<rows>\"): Promise<PipeResult> {\n const ctx = makePipeContext({\n df: [...rows] as Row[],\n metadata: { source, input_rows: rows.length },\n });\n\n const config = this.config ?? this.autoConfig();\n\n let plan;\n try {\n plan = Resolver.resolve(config, this.registry);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n status: PipeStatus.FAILED,\n source,\n inputRows: rows.length,\n stages: {},\n artifacts: {},\n skipped: [],\n errors: [`Pipeline resolution failed: ${message}`],\n reasoning: {},\n timing: {},\n };\n }\n\n const runner = new Runner(this.registry);\n const stages = await runner.run(plan, ctx);\n return Reporter.build(ctx, stages);\n }\n\n /** Build the default check→flow→dedupe config from the available stages. */\n private autoConfig(): PipelineConfig {\n const available = this.registry.listAll();\n const stages = DEFAULT_STAGE_ORDER.filter((name) => name in available).map((name) =>\n makeStageSpec(name),\n );\n return makePipelineConfig({ pipeline: \"auto\", stages });\n }\n}\n\n/**\n * Run a pipeline on an array of rows. Zero-config (default suite chain) or with\n * an explicit PipelineConfig. Port of `_api.run_df`.\n */\nexport async function runDf(\n rows: readonly Row[],\n config?: PipelineConfig,\n source = \"<rows>\",\n): Promise<PipeResult> {\n const pipe = new Pipeline(config !== undefined ? { config } : {});\n return pipe.run(rows, source);\n}\n\n/**\n * Run specific stages programmatically against rows. Port of `_api.run_stages`.\n * The auto-prepended `load` stage is removed since rows are already supplied.\n */\nexport async function runStages(stages: readonly Stage[], rows: readonly Row[]): Promise<PipeResult> {\n const registry = new StageRegistry();\n for (const s of stages) registry.register(s);\n\n const config = makePipelineConfig({\n pipeline: \"programmatic\",\n stages: stages.map((s) => makeStageSpec(s.info.name)),\n });\n\n const ctx: PipeContext = makePipeContext({\n df: [...rows] as Row[],\n metadata: { source: \"<programmatic>\", input_rows: rows.length },\n });\n\n const plan = Resolver.resolve(config, registry);\n plan.stages = plan.stages.filter((s) => s.name !== \"load\");\n\n const runner = new Runner(registry);\n const results = await runner.run(plan, ctx);\n return Reporter.build(ctx, results);\n}\n","/**\n * Minimal CSV reader for the node `run(source)` path.\n * Handles quoted fields, embedded commas, embedded newlines, and \"\" escapes.\n *\n * Node-only: reads from the filesystem.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport type { Row } from \"../core/index.js\";\n\n/** Parse a CSV string into Row[]. First line is the header. */\nexport function parseCsv(content: string): Row[] {\n const records = parseRecords(content);\n if (records.length === 0) return [];\n const headers = records[0]!;\n const rows: Row[] = [];\n for (let i = 1; i < records.length; i++) {\n const values = records[i]!;\n // Skip fully-empty trailing lines.\n if (values.length === 1 && values[0] === \"\") continue;\n const row: Row = {};\n for (let c = 0; c < headers.length; c++) {\n row[headers[c]!] = c < values.length ? values[c]! : \"\";\n }\n rows.push(row);\n }\n return rows;\n}\n\n/** Read and parse a CSV file. */\nexport function readCsv(path: string): Row[] {\n const content = readFileSync(path, \"utf8\");\n return parseCsv(content);\n}\n\n/** Tokenize a CSV document into rows of string cells. */\nfunction parseRecords(content: string): string[][] {\n const records: string[][] = [];\n let field = \"\";\n let record: string[] = [];\n let inQuotes = false;\n let i = 0;\n const n = content.length;\n\n const pushField = (): void => {\n record.push(field);\n field = \"\";\n };\n const pushRecord = (): void => {\n pushField();\n records.push(record);\n record = [];\n };\n\n while (i < n) {\n const ch = content[i]!;\n if (inQuotes) {\n if (ch === '\"') {\n if (i + 1 < n && content[i + 1] === '\"') {\n field += '\"';\n i += 2;\n continue;\n }\n inQuotes = false;\n i += 1;\n continue;\n }\n field += ch;\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inQuotes = true;\n i += 1;\n continue;\n }\n if (ch === \",\") {\n pushField();\n i += 1;\n continue;\n }\n if (ch === \"\\r\") {\n // Handle CRLF and lone CR.\n if (i + 1 < n && content[i + 1] === \"\\n\") i += 1;\n pushRecord();\n i += 1;\n continue;\n }\n if (ch === \"\\n\") {\n pushRecord();\n i += 1;\n continue;\n }\n field += ch;\n i += 1;\n }\n\n // Flush the final record if the file didn't end with a newline.\n if (field !== \"\" || record.length > 0) {\n pushRecord();\n }\n return records;\n}\n","/**\n * YAML config loading and normalization.\n * Port of goldenpipe/config/loader.py.\n *\n * Node-only: reads a file and parses YAML via the optional `yaml` peer dep.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport type { PipelineConfig, StageSpec } from \"../core/index.js\";\nimport { makePipelineConfig, makeStageSpec } from \"../core/index.js\";\n\n/** Load and validate a pipeline config from a YAML file path. */\nexport async function loadConfig(path: string): Promise<PipelineConfig> {\n let parse: (src: string) => unknown;\n try {\n // `as string` prevents tsup from eagerly resolving the optional peer dep.\n const yamlMod = (await import(\"yaml\" as string)) as { parse: (s: string) => unknown };\n parse = yamlMod.parse;\n } catch {\n throw new Error(\n \"YAML support requires the optional `yaml` peer dependency. Run: npm install yaml\",\n );\n }\n\n let content: string;\n try {\n content = readFileSync(path, \"utf8\");\n } catch {\n throw new Error(`Config file not found: ${path}`);\n }\n\n const raw = parse(content);\n return normalizeConfig(raw);\n}\n\n/** Normalize a parsed YAML object into a validated PipelineConfig. */\nexport function normalizeConfig(raw: unknown): PipelineConfig {\n if (raw === null || typeof raw !== \"object\") {\n throw new Error(\"Pipeline config must be a mapping\");\n }\n const obj = raw as Record<string, unknown>;\n\n if (typeof obj[\"pipeline\"] !== \"string\") {\n throw new Error(\"Pipeline config must have a string 'pipeline' field\");\n }\n\n const rawStages = obj[\"stages\"] ?? [];\n if (!Array.isArray(rawStages)) {\n throw new Error(`'stages' must be a list, got: ${typeof rawStages}`);\n }\n\n const stages: Array<string | StageSpec> = [];\n for (const s of rawStages) {\n if (typeof s === \"string\") {\n stages.push(makeStageSpec(s));\n } else if (s !== null && typeof s === \"object\") {\n const so = s as Record<string, unknown>;\n if (!(\"use\" in so) && !(\"name\" in so)) {\n throw new Error(`Stage spec must have 'use' field: ${JSON.stringify(s)}`);\n }\n const use = (so[\"use\"] ?? so[\"name\"]) as string;\n stages.push(\n makeStageSpec({\n use,\n ...(typeof so[\"name\"] === \"string\" ? { name: so[\"name\"] } : {}),\n ...(Array.isArray(so[\"needs\"]) ? { needs: so[\"needs\"] as string[] } : {}),\n ...(typeof so[\"skip_if\"] === \"string\" ? { skipIf: so[\"skip_if\"] } : {}),\n ...(typeof so[\"skipIf\"] === \"string\" ? { skipIf: so[\"skipIf\"] } : {}),\n ...(so[\"on_error\"] === \"abort\" || so[\"on_error\"] === \"continue\"\n ? { onError: so[\"on_error\"] }\n : {}),\n ...(so[\"onError\"] === \"abort\" || so[\"onError\"] === \"continue\"\n ? { onError: so[\"onError\"] }\n : {}),\n ...(so[\"config\"] !== null && typeof so[\"config\"] === \"object\"\n ? { config: so[\"config\"] as Record<string, unknown> }\n : {}),\n }),\n );\n } else {\n throw new Error(`Invalid stage spec: ${JSON.stringify(s)}`);\n }\n }\n\n return makePipelineConfig({\n pipeline: obj[\"pipeline\"],\n ...(typeof obj[\"source\"] === \"string\" ? { source: obj[\"source\"] } : {}),\n ...(typeof obj[\"output\"] === \"string\" ? { output: obj[\"output\"] } : {}),\n stages,\n ...(Array.isArray(obj[\"decisions\"]) ? { decisions: obj[\"decisions\"] as string[] } : {}),\n });\n}\n","/**\n * Node `run(source)` — load a CSV file into rows and run the pipeline.\n * Port of goldenpipe/_api.run (the file path) + pipeline.py CSV loading.\n *\n * Node-only: reads from the filesystem.\n */\n\nimport type { PipelineConfig, PipeResult } from \"../core/index.js\";\nimport { Pipeline, PipeStatus } from \"../core/index.js\";\nimport { readCsv } from \"./csv.js\";\nimport { loadConfig } from \"./loadConfig.js\";\n\nexport interface RunOptions {\n /** Path to a YAML pipeline config. When set, it wins over the default chain. */\n config?: string | PipelineConfig | undefined;\n}\n\n/** Run a pipeline on a CSV file. Zero-config or from a YAML config path. */\nexport async function run(source: string, options?: RunOptions): Promise<PipeResult> {\n let rows;\n try {\n rows = readCsv(source);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n status: PipeStatus.FAILED,\n source,\n inputRows: 0,\n stages: {},\n artifacts: {},\n skipped: [],\n errors: [`Failed to load data: ${message}`],\n reasoning: {},\n timing: {},\n };\n }\n\n let config: PipelineConfig | undefined;\n const cfgOpt = options?.config;\n if (typeof cfgOpt === \"string\") {\n config = await loadConfig(cfgOpt);\n } else if (cfgOpt !== undefined) {\n config = cfgOpt;\n }\n\n const pipe = new Pipeline(config !== undefined ? { config } : {});\n return pipe.run(rows, source);\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "goldenpipe",
3
+ "version": "0.1.0",
4
+ "description": "Golden Suite orchestrator — chains GoldenCheck, GoldenFlow, and GoldenMatch into one adaptive pipeline. TypeScript port of the goldenpipe Python library.",
5
+ "keywords": [
6
+ "pipeline",
7
+ "orchestration",
8
+ "data-quality",
9
+ "data-validation",
10
+ "data-transformation",
11
+ "entity-resolution",
12
+ "deduplication",
13
+ "goldenpipe",
14
+ "edge"
15
+ ],
16
+ "license": "MIT",
17
+ "author": "Ben Severn (https://bensevern.dev)",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/benseverndev-oss/goldenmatch.git",
21
+ "directory": "packages/typescript/goldenpipe"
22
+ },
23
+ "homepage": "https://github.com/benseverndev-oss/goldenmatch/tree/main/packages/typescript/goldenpipe",
24
+ "bugs": {
25
+ "url": "https://github.com/benseverndev-oss/goldenmatch/issues"
26
+ },
27
+ "type": "module",
28
+ "main": "./dist/index.cjs",
29
+ "module": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js",
35
+ "require": "./dist/index.cjs"
36
+ },
37
+ "./core": {
38
+ "types": "./dist/core/index.d.ts",
39
+ "import": "./dist/core/index.js",
40
+ "require": "./dist/core/index.cjs"
41
+ },
42
+ "./node": {
43
+ "types": "./dist/node/index.d.ts",
44
+ "import": "./dist/node/index.js",
45
+ "require": "./dist/node/index.cjs"
46
+ }
47
+ },
48
+ "bin": {
49
+ "goldenpipe-js": "./dist/cli.cjs"
50
+ },
51
+ "files": [
52
+ "dist",
53
+ "README.md",
54
+ "LICENSE"
55
+ ],
56
+ "engines": {
57
+ "node": ">=20"
58
+ },
59
+ "dependencies": {
60
+ "commander": "^13.0.0",
61
+ "goldencheck": "^0.2.0",
62
+ "goldenmatch": "^0.11.0",
63
+ "goldenflow": "^0.2.0"
64
+ },
65
+ "peerDependencies": {
66
+ "yaml": "*"
67
+ },
68
+ "peerDependenciesMeta": {
69
+ "yaml": {
70
+ "optional": true
71
+ }
72
+ },
73
+ "devDependencies": {
74
+ "@types/node": "^20.0.0",
75
+ "rimraf": "^5.0.0",
76
+ "tsup": "^8.5.1",
77
+ "typescript": "^5.4.0",
78
+ "vitest": "^4.1.0",
79
+ "yaml": "^2.7.0"
80
+ },
81
+ "scripts": {
82
+ "build": "tsup",
83
+ "dev": "tsup --watch",
84
+ "test": "vitest run",
85
+ "test:watch": "vitest",
86
+ "typecheck": "tsc --noEmit",
87
+ "lint": "tsc --noEmit",
88
+ "clean": "rimraf dist"
89
+ }
90
+ }