{"_id":"@caracal-lynx/sluice","_rev":"32-e73e10b8f73e7c4dba590b70f9bb0901","name":"@caracal-lynx/sluice","dist-tags":{"latest":"0.11.0"},"versions":{"0.1.0":{"name":"@caracal-lynx/sluice","version":"0.1.0","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Ltd.","email":"michael.scott@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.1.0","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"3a15bde2c620953b583396a198aeab36faa0e286","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.1.0.tgz","fileCount":281,"integrity":"sha512-Cv1McvSvOpJrItlKFxKJuqAwO3MMGhZZD8Cj1bEfq69o9xzvZFALnYKm7ak1R+zZA3VoWRKpLSfrJsftxmgh4g==","signatures":[{"sig":"MEQCIBA0LFAunL2FZOpE4lDjIhEe+faE21XoZGOabbLqctjpAiAU+QMHE7HdwV0EI1Mnsv5s7+hUCwJLf/ynMxwcPKyTkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":799744},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.0.0"},"gitHead":"badd0c9ea6bd2cbd0e688bc7918dda0074998c4c","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","test:cov":"vitest run --coverage","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"},"deprecated":"Please install 0.1.1 or later — superseded by a documentation refresh.","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.13.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.4.0","dependencies":{"pg":"^8.13.0","zod":"^3.23.8","pino":"^9.5.0","xlsx":"^0.18.5","axios":"^1.7.0","dayjs":"^1.11.13","mssql":"^11.0.1","dotenv":"^16.4.5","js-yaml":"^4.1.0","commander":"^12.1.0","csv-parse":"^5.5.6","expr-eval":"^2.0.2","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.5.1","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","eslint":"^9.17.0","vitest":"^2.1.0","prettier":"^3.4.0","@types/pg":"^8.11.10","typescript":"^6.0.3","@types/node":"^24.12.2","pino-pretty":"^13.0.0","@types/mssql":"^9.1.5","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.59.1","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^2.1.0","@typescript/native-preview":"^7.0.0-dev.20260504.1"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.1.0_1777910932013_0.4640565724332957","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@caracal-lynx/sluice","version":"0.1.1","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Ltd.","email":"michael.scott@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.1.1","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"dd15aea5e4f3465031be118e610555e0c078c543","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.1.1.tgz","fileCount":281,"integrity":"sha512-5cxDqtFSslvbStzrJZbDkjCOP4Q/lWvXh1xWCGEK1rwkXAazC8oAl9+ZNC4fRDd9HHqnvkEE2nlhWlDLA+uOyw==","signatures":[{"sig":"MEYCIQCGQSpAGRIJO1rOWA/9f+N04hgtsDPkpvZYco7HDXme6QIhANb4fnTpuHHCuTgp6yjEaXcgfdNZcDt60TlY/mmqzKxL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":801346},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.0.0"},"gitHead":"98192b94a61d9efaf405b1c679bf51531fde4c3b","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","test:cov":"vitest run --coverage","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"},"deprecated":"Please install 0.1.2 or later — superseded by Phase 6 README + PLUGINS.md.","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.13.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.4.0","dependencies":{"pg":"^8.13.0","zod":"^3.23.8","pino":"^9.5.0","xlsx":"^0.18.5","axios":"^1.7.0","dayjs":"^1.11.13","mssql":"^11.0.1","dotenv":"^16.4.5","js-yaml":"^4.1.0","commander":"^12.1.0","csv-parse":"^5.5.6","expr-eval":"^2.0.2","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.5.1","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","eslint":"^9.17.0","vitest":"^2.1.0","prettier":"^3.4.0","@types/pg":"^8.11.10","typescript":"^6.0.3","@types/node":"^24.12.2","pino-pretty":"^13.0.0","@types/mssql":"^9.1.5","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.59.1","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^2.1.0","@typescript/native-preview":"^7.0.0-dev.20260504.1"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.1.1_1777916216530_0.7187495121114349","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@caracal-lynx/sluice","version":"0.1.2","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Ltd.","email":"michael.scott@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.1.2","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"d8f7d1f89f014d4e1b8ca90b29a13851b996a5b3","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.1.2.tgz","fileCount":282,"integrity":"sha512-DCsIkyv9JC6G9Lb6CwajME8OLYeQIc2NfghLDI0BAcp+7/SrVvq1606cqgKt738s8Tk1zvANB2v7+Rp7JEkkfw==","signatures":[{"sig":"MEQCIAkXdKZ9kUkGVKNkANpqJaV9wpTxvuJQ7Vd7XdRnrk0DAiByPQXfmkRU4nx1NxVMS5tOX13c5HZy1k+nJ702KSDLtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":819036},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.0.0"},"gitHead":"c563fd489d63d7003622932ce69555bb267fb820","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","test:cov":"vitest run --coverage","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.13.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.4.0","dependencies":{"pg":"^8.13.0","zod":"^3.23.8","pino":"^9.5.0","xlsx":"^0.18.5","axios":"^1.7.0","dayjs":"^1.11.13","mssql":"^11.0.1","dotenv":"^16.4.5","js-yaml":"^4.1.0","commander":"^12.1.0","csv-parse":"^5.5.6","expr-eval":"^2.0.2","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.5.1","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","eslint":"^9.17.0","vitest":"^2.1.0","prettier":"^3.4.0","@types/pg":"^8.11.10","typescript":"^6.0.3","@types/node":"^24.12.2","pino-pretty":"^13.0.0","@types/mssql":"^9.1.5","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.59.1","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^2.1.0","@typescript/native-preview":"^7.0.0-dev.20260504.1"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.1.2_1777917809510_0.7172239072150459","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@caracal-lynx/sluice","version":"0.1.3","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Ltd.","email":"michael.scott@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.1.3","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"e9ea749301c5c032b4b2a873e43050253905b09f","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.1.3.tgz","fileCount":274,"integrity":"sha512-NF8ImqCzpF2tolZQBw563a8z489/hSyNnTIGfxCmYyaaanh3IZvimgPYqr1cTMoMl54k/mD3R0eZbVo/6O46xQ==","signatures":[{"sig":"MEYCIQDMu2prVfFKF7T6WlfvYbLq8IzXiuSWtGBcqMm0mrTO4gIhAICnUHLBWgn3PrUHPEq0YKoBpOrPfMarNGYh/NT/HShj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":813249},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.0.0"},"gitHead":"44367cf12d652644f1a0ae61791087a42e512663","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"npm run build && changeset publish","version":"changeset version && npm install --package-lock-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.11.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.14.1","dependencies":{"pg":"^8.13.0","zod":"^3.23.8","pino":"^9.5.0","xlsx":"^0.18.5","axios":"^1.7.0","dayjs":"^1.11.13","mssql":"^11.0.1","dotenv":"^16.4.5","js-yaml":"^4.1.0","commander":"^12.1.0","csv-parse":"^5.5.6","expr-eval":"^2.0.2","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.5.1","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","eslint":"^9.17.0","vitest":"^2.1.0","prettier":"^3.4.0","@types/pg":"^8.11.10","typescript":"^6.0.3","@types/node":"^24.12.2","pino-pretty":"^13.0.0","@types/mssql":"^9.1.5","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.59.1","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^2.1.0","@typescript/native-preview":"^7.0.0-dev.20260504.1","@changesets/changelog-github":"^0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.1.3_1777976455278_0.17922115454617904","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@caracal-lynx/sluice","version":"0.2.0","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Ltd.","email":"michael.scott@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.2.0","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"44892988f7be7200dc6ec26ae0c1e6af2bd81e97","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.2.0.tgz","fileCount":274,"integrity":"sha512-Wst4oc95B0hv5WpcdCMNtPsy4CHVp1OowMwjTA96utGhFHGiRBL1AQ0D1cO/3EEakLqrdpbJWDfhyNiFym3ffg==","signatures":[{"sig":"MEYCIQDAF16Bha5HRahTL6mpaAEG6XMagrjPhIxAWOO+muVv0AIhAKXxbGhI9FJxVDSsijHj1T1KRESfgIMc7soov3VcrGWD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":823028},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.0.0"},"gitHead":"9fea23bd8e645cb4c5462edd1feebd37600d7ba1","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"npm run build && changeset publish","version":"changeset version && npm install --package-lock-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.11.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.14.1","dependencies":{"pg":"^8.13.0","zod":"^3.23.8","pino":"^9.5.0","xlsx":"^0.18.5","axios":"^1.16.0","dayjs":"^1.11.13","mssql":"^11.0.1","dotenv":"^16.4.5","js-yaml":"^4.1.0","commander":"^12.1.0","csv-parse":"^5.5.6","expr-eval":"^2.0.2","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.5.1","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","eslint":"^9.17.0","vitest":"^4.1.5","prettier":"^3.4.0","@types/pg":"^8.11.10","typescript":"^6.0.3","@types/node":"^24.12.2","pino-pretty":"^13.0.0","@types/mssql":"^9.1.5","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.59.1","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.5","@typescript/native-preview":"^7.0.0-dev.20260504.1","@changesets/changelog-github":"^0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.2.0_1778057479517_0.6045575609213623","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@caracal-lynx/sluice","version":"0.2.1","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Ltd.","email":"michael.scott@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.2.1","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"cbe65fe141400c5e96a86a04387e0750d0ef3ad6","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.2.1.tgz","fileCount":274,"integrity":"sha512-sLNQwUb+ygaJM4fMdDCuK1hYUU6culBUDdohp6EQZMNonTmnWgtYNp6Ng70/QeUu1bQaRSeMDBcdzljDqL6q/A==","signatures":[{"sig":"MEUCIQDjxAfnpPb/xEROo4qMMwSP1vXUBoeeNarC642fSz4GtQIgTyqyLzriVIwbISZsFGLUZKcU3qVJSo60ewUjCHooPsc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":824822},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.0.0"},"gitHead":"ed249b23a8b5130df1957540557402005780eb31","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"npm run build && changeset publish","version":"changeset version && npm install --package-lock-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.11.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.14.1","dependencies":{"pg":"^8.13.0","zod":"^3.23.8","pino":"^9.5.0","xlsx":"^0.18.5","axios":"^1.16.0","dayjs":"^1.11.13","mssql":"^11.0.1","dotenv":"^16.4.5","js-yaml":"^4.1.0","commander":"^12.1.0","csv-parse":"^5.5.6","expr-eval":"^2.0.2","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.5.1","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","eslint":"^9.17.0","vitest":"^4.1.5","prettier":"^3.4.0","@types/pg":"^8.11.10","typescript":"^6.0.3","@types/node":"^24.12.2","pino-pretty":"^13.0.0","@types/mssql":"^9.1.5","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.59.1","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.5","@typescript/native-preview":"^7.0.0-dev.20260504.1","@changesets/changelog-github":"^0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.2.1_1778148688502_0.1122815792818439","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@caracal-lynx/sluice","version":"0.3.0","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Limited","email":"sluice@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.3.0","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"f715c4c87234befeb1d3c5d64c0c1058a87c7125","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.3.0.tgz","fileCount":291,"integrity":"sha512-te/GKtIBTMNqYDcAXc+iBjxYNDjWs2xLk1UyTPEO4SvAuwWDQY8y6zvJRyvFxC0GDqO6rLVTax1OQLZ7NXYAtQ==","signatures":[{"sig":"MEUCIQDVq/k4l3cgI9eyI7OM3WkuGSFglmFtJw1/dF/hM8WCzAIgEOAGd3e0Z4HIxHCcgnsRG6SxjGC814pt2w/HH6c45Is=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":978063},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.0.0"},"gitHead":"90d41bd04792151c657bff1e95cac37f15b5726e","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"npm run build && changeset publish","version":"changeset version && npm install --package-lock-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.11.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.14.1","dependencies":{"pg":"^8.13.0","zod":"^3.23.8","pino":"^9.5.0","xlsx":"^0.18.5","axios":"^1.16.0","dayjs":"^1.11.13","mssql":"^11.0.1","dotenv":"^16.4.5","js-yaml":"^4.1.0","commander":"^12.1.0","csv-parse":"^5.5.6","expr-eval":"^2.0.2","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.5.1","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","eslint":"^9.17.0","vitest":"^4.1.5","prettier":"^3.4.0","@types/pg":"^8.11.10","typescript":"^6.0.3","@types/node":"^24.12.2","pino-pretty":"^13.0.0","@types/mssql":"^9.1.5","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.59.1","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.5","@typescript/native-preview":"^7.0.0-dev.20260504.1","@changesets/changelog-github":"^0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.3.0_1778595348446_0.7615606753533943","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@caracal-lynx/sluice","version":"0.4.0","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Limited","email":"sluice@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.4.0","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"d36c91034163dc73ea29243f860181031c3c765c","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.4.0.tgz","fileCount":295,"integrity":"sha512-XiYVMstPhNuih3UNH8zBVoJ9o3fNyLVzoBRNifJnpJSZdyKKbgI0WydWyD+msbivhM34sRCHWl80W8LmMk5E3A==","signatures":[{"sig":"MEUCIQCDVFRoiwLEENEbvq0itSx1XzQYSxRQxKMNlw8jrCeN9gIgAsb5uY40Q8ieSiTmUnzLQ2RahDGmIEugUDRQvcfvHmI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1038626},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.0.0"},"gitHead":"cc26647dc5a0818e238e30fc0ce815debcb841b8","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"npm run build && changeset publish","version":"changeset version && npm install --package-lock-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.11.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.14.1","dependencies":{"pg":"^8.13.0","zod":"^3.23.8","pino":"^9.5.0","xlsx":"^0.18.5","axios":"^1.16.0","dayjs":"^1.11.13","mssql":"^11.0.1","dotenv":"^16.4.5","js-yaml":"^4.1.0","commander":"^12.1.0","csv-parse":"^5.5.6","expr-eval":"^2.0.2","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.5.1","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","eslint":"^9.17.0","vitest":"^4.1.5","prettier":"^3.4.0","@types/pg":"^8.11.10","typescript":"^6.0.3","@types/node":"^24.12.2","pino-pretty":"^13.0.0","@types/mssql":"^9.1.5","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.59.1","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.5","@typescript/native-preview":"^7.0.0-dev.20260504.1","@changesets/changelog-github":"^0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.4.0_1778609113406_0.7311153313144949","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@caracal-lynx/sluice","version":"0.5.0","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Limited","email":"sluice@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.5.0","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"baf625bbe338f85f3ef87ca004dc550ef103bbf8","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.5.0.tgz","fileCount":295,"integrity":"sha512-KVmKdVf09EaDFOOvRi+JrnmE36KMYyY/dld1yDOfmQ7QuKPVzchfPiDiwL1XxNzv2lyVTlpqfzMl5eKe/p76oA==","signatures":[{"sig":"MEQCIGPiySgI7mD4nG3IooZ5xDpHrzXQByU1HMEKVyHi1hotAiANfaEt+yyClZ9uaBWbmEpVjftwYepTjUfBpQ3UD/x3Fg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1045497},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.15.0"},"gitHead":"a9d4512d5510dd5e02f15a93e94868e4ba24057f","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"npm run build && changeset publish","version":"changeset version && npm install --package-lock-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.12.1","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.15.0","dependencies":{"pg":"^8.20.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.16.1","dayjs":"^1.11.20","mssql":"^12.5.2","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.1.1","commander":"^14.0.3","csv-parse":"^6.2.1","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","eslint":"^10.3.0","vitest":"^4.1.6","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.12.4","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.59.3","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.6","@typescript/native-preview":"^7.0.0-dev.20260514.1","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.5.0_1778781363954_0.11537616391248484","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@caracal-lynx/sluice","version":"0.6.0","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Limited","email":"sluice@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.6.0","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"3870ff575f7f2dd1b36e022162c21b81944d6e97","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.6.0.tgz","fileCount":295,"integrity":"sha512-RVD8IYtbtCxMw2fl0Vf8gdYbvYaqsFyRJ8NXX2xsyScG9x+HTyJ0xQl3i2pFsk8TBasda/BLT6MqlOagQgexAw==","signatures":[{"sig":"MEQCIHCg+rx0RULst1HvG6/+aT5bBZEqbG6SZUcBl/q+v0iNAiBPZQqOi0vOdlaaW5NOR9YiCh4tX5WQrdkk8jgmpnbz9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1048878},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.15.0"},"gitHead":"a324412a24651733c8a8ab817a88cfb32a63cc04","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"npm run build && changeset publish","version":"changeset version && npm install --package-lock-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.12.1","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.15.0","dependencies":{"pg":"^8.20.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.16.1","dayjs":"^1.11.20","mssql":"^12.5.2","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.1.1","commander":"^14.0.3","csv-parse":"^6.2.1","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","eslint":"^10.3.0","vitest":"^4.1.6","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.12.4","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.59.3","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.6","@typescript/native-preview":"^7.0.0-dev.20260514.1","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.6.0_1778841105942_0.922823247454343","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@caracal-lynx/sluice","version":"0.6.1","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Limited","email":"sluice@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.6.1","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"02cc86f323a08faefd1443b5c1e8387dfa748801","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.6.1.tgz","fileCount":295,"integrity":"sha512-d74jndqAsHXyG6yiQCR6NHiwRan0SGAEJe6FnSiOjH87t3TnIS5s8Z0yQKJekpHHCtfzPLr1LZRMTPeUqhSEKA==","signatures":[{"sig":"MEUCIQCznjBHInJT4P8JBu330ibCIpNe5mWm4w4AEBPL1cfovQIgPtqaFVK//L7uROczjEEidqBr0dsQYYNkeq3BjOfyXnY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":967866},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0"},"gitHead":"50a0245dae3c69fd7d4eae2970e54c5c9896664c","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"npm run build && changeset publish","version":"changeset version && npm install --package-lock-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"overrides":{"tmp":">=0.2.7"},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.13.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.16.1","dayjs":"^1.11.21","mssql":"^12.5.4","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.1.1","commander":"^14.0.3","csv-parse":"^6.2.1","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.3","eslint":"^10.4.0","vitest":"^4.1.7","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.12.4","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.60.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.7","@typescript/native-preview":"^7.0.0-dev.20260527.2","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.6.1_1779974786359_0.5047749224761158","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@caracal-lynx/sluice","version":"0.6.2","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Limited","email":"sluice@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.6.2","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"8c18bc2b8c498dd3ac5baaf39a233e38348098ff","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.6.2.tgz","fileCount":295,"integrity":"sha512-lUccFA+bq46+eNgJz4iAZ1Di7NLpdk/hkWQ+7dGnkWrTQECVl4e5eh0s8tTA6XyVyVk8nGds2+YXX+L+V0COUA==","signatures":[{"sig":"MEUCID5ZN/zxyhYnwnSyt0fmAImVVq1kBvvq4fo0OApKaY5FAiEAz8rKjvMYgoDkU9S0IY8lQ30wjzRs3jPujWegsPT2Z24=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":967913},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0"},"gitHead":"da725fd0ef26346169e218f22a8b638020bf0828","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"npm run build && changeset publish","version":"changeset version && npm install --package-lock-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"overrides":{"tmp":">=0.2.7"},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.13.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.16.1","dayjs":"^1.11.21","mssql":"^12.5.4","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.1.1","commander":"^14.0.3","csv-parse":"^6.2.1","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.3","eslint":"^10.4.0","vitest":"^4.1.7","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.12.4","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.60.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.7","@typescript/native-preview":"^7.0.0-dev.20260527.2","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.6.2_1779982621197_0.255834093610529","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"@caracal-lynx/sluice","version":"0.6.3","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":{"url":"https://caracallynx.com","name":"Caracal Lynx Limited","email":"sluice@caracallynx.com"},"license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.6.3","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"e2c358f10fd930c5c8c5ec3c1908a626e2bd9435","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.6.3.tgz","fileCount":295,"integrity":"sha512-q3bjl35JiOKGd2YYtxcKNs2mpKFhk9S65EWWtQZKzzSsOClxKefv9UxoBa9AuJnJv1PaigB0ulvDa6utWx8O5w==","signatures":[{"sig":"MEYCIQDaLC0/4jrH8ljmtxp/fpgcp/KJrCjVkZZGSwFGKeM9PAIhAN+6SG4enJjzmxCNvXUGh0/ggbEH9StHX4uvIcARUfkS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.6.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":968566},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0"},"gitHead":"973a8145e613aea2ccc5061d97afa50b12cb551b","scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","prepare":"lefthook install","release":"npm run build && changeset publish","version":"changeset version && npm install --package-lock-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"overrides":{"tmp":">=0.2.7"},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"_npmVersion":"11.13.0","description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.16.1","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^6.2.1","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.4.1","vitest":"^4.1.7","lefthook":"^2.1.9","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.12.4","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.60.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.7","@typescript/native-preview":"^7.0.0-dev.20260527.2","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.6.3_1780307201278_0.6280211633115287","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@caracal-lynx/sluice","version":"0.7.0","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.7.0","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"861ccb23729050973255d01afb2a88e1ed3e3142","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.7.0.tgz","fileCount":295,"integrity":"sha512-cs9Iq6a6sFr74sPn+K/MHn+uyDj04LKHciWJ9oLX2O+XbzaVAKwVxArqDtnfwblK9xwB4f9q7dosridxCbIkzQ==","signatures":[{"sig":"MEYCIQDwb+BL8pTeELsvm1z4GBLFBTCrcltPYphz6Z4UYG68DwIhAMzMRNnmOJngweoIzcdboyGGBTtUyMPewq3OzAEmWGlk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":976307},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^6.2.1","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.7.0_1781539588318_0.334101710229987","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@caracal-lynx/sluice","version":"0.7.1","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.7.1","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"0fcab234806259b9e6abf4dfcd23ce94b0016b64","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.7.1.tgz","fileCount":299,"integrity":"sha512-nyTymRPG3tc5/0Xps0zALCF0bDBFyY8uR64nsTfjMv2ZtugsxYtT+m7kz06Q+HbrbVGrSqaI9WUlibpNOqr75w==","signatures":[{"sig":"MEYCIQDhFkE2bgkZrzMyoWBkrZKwFrv8ulUKNhig9eDLmmxDqgIhAKpCbzn/26P372c+VY2u10pHHsP7uQKGon6Lbr9wc3rR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":983846},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@vitest/eslint-plugin":"^1.6.20","@typescript/native-preview":"^7.0.0-dev.20260614.1","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.7.1_1781968834369_0.2792706396474951","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@caracal-lynx/sluice","version":"0.7.2","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.7.2","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"2a01084af8f131197f84bf071c7b98071019845d","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.7.2.tgz","fileCount":299,"integrity":"sha512-4ZWtfY0vSb7mVR35q9TYxSKAAgH2ft8azi+MSFuZoajrlkWO0KGJV1aExU6p+zPOj5VH6QkSD0oH7JiZLQiSsA==","signatures":[{"sig":"MEYCIQDjihna3btwVe0BLQcaM5ozhv1EGNFJEhDnN4WUzLZn2gIhALm4MotQbWcJSSainD7seu5SLDcLSC4YuHBgaj7w+hbj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":983905},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.7.2_1782236774446_0.9679302404340235","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"name":"@caracal-lynx/sluice","version":"0.7.3","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.7.3","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"33253cc37182f7f5366e7ac21bcc30620309cd70","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.7.3.tgz","fileCount":299,"integrity":"sha512-mObP0fIrqjr66BQ8jE2Jp6WfN9cr7NoHGb+sOFRjBTwvhKWnQOY1qCrUL4s04x0eKrgxbyvuxTrhg7Fso2HLwQ==","signatures":[{"sig":"MEQCIBK0NUpbjUl5BLJUUEudmlwh0H/8+kRfdyv5vGc/SFdpAiAJFzyVxX3SJxwT3mawtGe+rOny+Rr1sPQYbp03A5o6fA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.7.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":986209},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.7.3_1782900088961_0.6288341578250316","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@caracal-lynx/sluice","version":"0.8.0","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.8.0","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"4c6af59e98e096241fc3246beec31ef6eea666cb","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.8.0.tgz","fileCount":307,"integrity":"sha512-M2kRhu4R4fghMj6RPPlF3uJz1tNrJaUWHmHYQXUfyx2yweirrxKSwJocEF40y7dxwfBGNxNl9hVL330MPcbWKA==","signatures":[{"sig":"MEUCIBqd1orbWNyNQwjZC9YkFdVdnWdJuJB7/8mS9nfjoDx3AiEA4HzulOPUGxG4Rwu5gZJlrWRRRkacaW6xWDGsfcUCmZM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1004506},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.8.0_1782983857383_0.04895871327004553","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@caracal-lynx/sluice","version":"0.8.1","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.8.1","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"8f057ea72b8a6c7ba6a5629cf19d4a21f33ea504","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.8.1.tgz","fileCount":307,"integrity":"sha512-vGk/jMPjW4eYgwxV5kAbXMBG3labobBg/VB9aBpI9akko5sKV+aJ+4Iczo3K6mBdKENx+QWqU3HAiv4VLp8LTw==","signatures":[{"sig":"MEYCIQC7xF5pcVR233VL3ZOT3Be74oVMtGh4uqCOXtjaYQSqYwIhAOtdLGVPc1EFAiW2+0BXD7gTfLOlwrEVnli3TVJVvl8E","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1004479},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.8.1_1783335231391_0.21849590424401688","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"@caracal-lynx/sluice","version":"0.8.2","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.8.2","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"4c679732afedaf588c6833a598b0f6944dc5e037","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.8.2.tgz","fileCount":307,"integrity":"sha512-2CeBRr9mGmaQifCHcQCb9d/Vr61FbYwuhSfLCk/JHyGslENvn8P39tQDzGmAPrDOQZfxdv5Zfb4Qw8P/pFUGKQ==","signatures":[{"sig":"MEUCIQDFd6ZW1c8/Xz166+/lhMtCvcfN3ZOsNV+bA23B307UUwIgcPFL5X5U89Hzms5ioSamSXFgHwjWwpKTt0e6To3x5mc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.8.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1004479},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","exceljs":"^4.4.0","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.8.2_1783705946369_0.06685630352824967","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@caracal-lynx/sluice","version":"0.9.0","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.9.0","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"9f0f5aae8b1398c5e091277900429fa244268839","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.9.0.tgz","fileCount":307,"integrity":"sha512-59paORVnOLVFHkdxTwcDWxXdMQ9jmCc5tvd50vtvaD/Fhuye/JDdXvCZLl+Dl4DMsPFq5ssyRFoJuL++2UdiKQ==","signatures":[{"sig":"MEUCIQCh9pAvDAYaD10YbVMuTVa9JgSdA+jrVdJs04HeIoZAXwIgRmy/wMot6hPCKP2bdvNFLGlE59Zf3Vvh0Z/ogXEKXzI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1007782},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","read-excel-file":"^9.3.4","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.9.0_1785160029920_0.9063621148761574","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@caracal-lynx/sluice","version":"0.9.1","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.9.1","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"09f9fc2bd8e9f21178d032f99988b3ccd1bd7af9","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.9.1.tgz","fileCount":307,"integrity":"sha512-EUPslkr3wod1KSMPQKOY84SUWbGgVBoQ5cEXmplZOr/6uUPYaCRUnHu1GRYQp7KE271MZb7Jy6FvXtSelE+sjA==","signatures":[{"sig":"MEUCIQCIZo6r2ooSRwBwq/zU7W47eenBQZT1pR6NO492PW7xdQIgUhopFaKMDa2MzyozvRRsAsToxR8UpYxKyxUeQjqSbDE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@caracal-lynx%2fsluice@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1008433},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cecd9d58-e849-4f50-b5fc-945574f04766"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.16.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.7.0","expr-eval-fork":"^3.0.3","read-excel-file":"^9.3.4","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.9.1_1785163043673_0.9737407487272396","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@caracal-lynx/sluice","version":"0.9.2","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.9.2","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"2a1df6fb836d911bd71514d72072e7c3c2d349e2","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.9.2.tgz","fileCount":307,"integrity":"sha512-A0Uaz+WnzvwbUDdeUkbmtiUVxA3LrpZzpQE23S8a6Cy/+6pMFmsRBkxdaFH7Ixb98GjZd7Sq2sQFOxVo32afZw==","signatures":[{"sig":"MEUCIQD4jzPXRQpH8WSGrLbGyrX2f+Y8cO8J96G1w/ZtPD+VBQIgIL5+9we9DJfe6xKmbCEEfyAk6oCo8fLW9nmWQ7sHSxU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1009009},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:39fa2b03-de14-4419-9b5e-54aad69b91e3"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.6.0","expr-eval-fork":"^3.0.3","read-excel-file":"^9.3.4","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.2","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.9.2_1785502573872_0.28861793354123044","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"@caracal-lynx/sluice","version":"0.9.3","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.9.3","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"3a58a219747c20373d37aa126338222fd7f6e1c4","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.9.3.tgz","fileCount":307,"integrity":"sha512-C7YmZRYlhQvxcDZ9sVY3X4UVN9GTmmWpU1iYAGwzc/jELY2Biqaz7/55zqLs5EhrHvPEIb0yMUuYXLvffQjNKg==","signatures":[{"sig":"MEUCIH1gFe+f0ziOQEOhMldO4nnKO2xIME3zIQHAzg8KHUtOAiEAto55oonNGPBGiOY0TqlNUJw6ML1SxY2hSO7D3Zbg5uA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1009009},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:39fa2b03-de14-4419-9b5e-54aad69b91e3"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","js-yaml":"^4.2.0","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.6.0","expr-eval-fork":"^3.0.3","read-excel-file":"^9.3.4","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@types/js-yaml":"^4.0.9","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.2","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.9.3_1785506106937_0.8031944142302483","host":"s3://npm-registry-packages-npm-production"}},"0.9.4":{"name":"@caracal-lynx/sluice","version":"0.9.4","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.9.4","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"43402b7a3661e4c8d6e24762cb57084199b578c5","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.9.4.tgz","fileCount":307,"integrity":"sha512-cljaYtyTKXZkRvsYysNIq1sne1XV3Wh6IrdLRROpwl0wGRLQZ0smmDXrJ+5lODb4/exXqVM7Q9HtuE2It3diSw==","signatures":[{"sig":"MEUCIQDx2mUigBFD+sIQTPNKUR/PTIfjLP+l+laVhOHnpw1uFAIgWATxcvZHrb3rlup+ei6wJNfz8iR7BpxUqxMEUMaB6i4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1009928},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:39fa2b03-de14-4419-9b5e-54aad69b91e3"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","js-yaml":"^5.2.3","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.6.0","expr-eval-fork":"^3.0.3","read-excel-file":">=9.3.4 <9.3.5","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.2","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.9.4_1786493267843_0.846306781944808","host":"s3://npm-registry-packages-npm-production"}},"0.9.5":{"name":"@caracal-lynx/sluice","version":"0.9.5","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.9.5","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"44f582d85e1bb18a81eeedd33e7feaa6756ad2f7","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.9.5.tgz","fileCount":307,"integrity":"sha512-AJ5e2ySnDpzjFCIwBZkaYItWINsIHOMplq5p3tZlNy5utc7LSLwjidyqV7TfoT3lDlvjqf20g8kqyARiZ3zllQ==","signatures":[{"sig":"MEUCIQDeoMoeeu34fuGHD/oJ1uSL7eR7ybxGir4XhDd+ssSoPAIgLlUpW0b3L80A07YCHid38spbFkZeJNTGPYRk8539JFk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1010016},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:39fa2b03-de14-4419-9b5e-54aad69b91e3"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","js-yaml":"^5.2.3","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.6.0","expr-eval-fork":"^3.0.3","read-excel-file":">=9.3.4 <9.3.5","@duckdb/node-api":"^1.5.0-r.1"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@changesets/cli":"^2.31.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.3","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.9.5_1787068983364_0.34118522515094307","host":"s3://npm-registry-packages-npm-production"}},"0.9.6":{"name":"@caracal-lynx/sluice","version":"0.9.6","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.9.6","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"01d531e336d307d6ece113116c776eacfef632f6","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.9.6.tgz","fileCount":307,"integrity":"sha512-H+JxDCpdQyWJ8a4d3XZL66Sk5X41ngZ5xd4euhRgzUOcW5fiC31s9lQqaO1/O0Bvpe+hWkXnnz7QkyoX+3nNWw==","signatures":[{"sig":"MEYCIQCvZcK+fH+LlEXGwJK+O6dUtGqF7cDIm/Ig0h8CUwQJYgIhAKA5141dwcRh6yfo9Vc1mRslnLgMps7lSIFoKBqTbRIy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1010609},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit","typecheck:tests":"tsc -p tsconfig.test.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:39fa2b03-de14-4419-9b5e-54aad69b91e3"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.19.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","js-yaml":"^5.2.3","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.6.0","expr-eval-fork":"^3.0.3","read-excel-file":">=9.3.4 <9.3.5","@duckdb/node-api":"~1.5.5-r.4"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@changesets/cli":"^3.0.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.3","@changesets/changelog-github":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.9.6_1787421238282_0.6736849747179039","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@caracal-lynx/sluice","version":"0.10.0","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.10.0","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"2bd987738af8853b179bf499adb9988a038fae64","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.10.0.tgz","fileCount":307,"integrity":"sha512-OYaxbAHv/w+AhqaQ+MNC33saPDgOyMZbEMl8wgvosPaOfYX1fSf6ePUGRmC0A6eBjtCpc5cow0zNmmqorHCLlg==","signatures":[{"sig":"MEUCIEYjY5SNOiKbdSEdxD6YbgZU+dwOj4fFfDWZ/mfWFMmkAiEA2efWcCMz23mGnT191J4hyvz0NfWZrORebAZ9Wg21skI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1010794},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit","typecheck:tests":"tsc -p tsconfig.test.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:39fa2b03-de14-4419-9b5e-54aad69b91e3"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.19.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","js-yaml":"^5.2.3","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.6.0","expr-eval-fork":"^3.0.3","read-excel-file":">=9.3.4 <9.3.5","@duckdb/node-api":"~1.5.5-r.4"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@changesets/cli":"^3.0.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.3","@changesets/changelog-github":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.10.0_1787586646318_0.29653967384186064","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@caracal-lynx/sluice","version":"0.10.1","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","_id":"@caracal-lynx/sluice@0.10.1","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"homepage":"https://github.com/caracal-lynx/sluice#readme","bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"bin":{"sluice":"dist/cli.js"},"dist":{"shasum":"81f87dbb36dbd4712d1eb2d99c67e6ded9a7b439","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.10.1.tgz","fileCount":307,"integrity":"sha512-3rNbR8AsrQxL0PtOvDoCuBrPbE7FIoo1J9P/79fcWOBjQ+lKOf+09MHRduhDPV2N6Qy4AfK0eKzhJQISaPByoA==","signatures":[{"sig":"MEYCIQDjBwNB4pRxDS/bERkMEWvBJDwPbncc3WsMlji+JwMcBQIhAJd9tfcbKk8g3Zvl7C0g34ruqHAJdas7uDUUsys2XclL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1010998},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=24.16.0","pnpm":">=11"},"scripts":{"dev":"tsx watch src/cli.ts","lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","format":"prettier --write src tests","sluice":"tsx src/cli.ts","release":"pnpm build && changeset publish","version":"changeset version && pnpm install --lockfile-only","test:cov":"vitest run --coverage","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","typecheck:tsgo":"tsgo --noEmit","typecheck:tests":"tsc -p tsconfig.test.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:39fa2b03-de14-4419-9b5e-54aad69b91e3"}},"prettier":"@caracal-lynx/eslint-config/prettier","repository":{"url":"git+https://github.com/caracal-lynx/sluice.git","type":"git"},"description":"Config-driven ETL toolkit for ERP data migrations","directories":{},"_nodeVersion":"24.19.0","dependencies":{"pg":"^8.21.0","zod":"^3.25.76","pino":"^10.3.1","axios":"^1.17.0","dayjs":"^1.11.21","mssql":"^12.5.5","dotenv":"^17.4.2","js-yaml":"^5.2.3","commander":"^15.0.0","csv-parse":"^7.0.0","picocolors":"^1.1.1","axios-retry":"^4.5.0","cli-progress":"^3.12.0","csv-stringify":"^6.6.0","expr-eval-fork":"^3.0.3","read-excel-file":">=9.3.4 <9.3.5","@duckdb/node-api":"~1.5.5-r.4"},"publishConfig":{"access":"public","provenance":false},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","eslint":"^10.5.0","vitest":"^4.1.8","lefthook":"^2.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/node":"^24.13.2","pino-pretty":"^13.1.3","@types/mssql":"^12.3.0","@changesets/cli":"^3.0.0","typescript-eslint":"^8.61.0","@types/cli-progress":"^3.11.6","@vitest/coverage-v8":"^4.1.8","@typescript/native-preview":"^7.0.0-dev.20260614.1","@caracal-lynx/eslint-config":"^0.1.3","@changesets/changelog-github":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sluice_0.10.1_1787588755468_0.6856826813394705","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@caracal-lynx/sluice","version":"0.11.0","description":"Config-driven ETL toolkit for ERP data migrations","license":"Elastic-2.0","author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","homepage":"https://github.com/caracal-lynx/sluice#readme","repository":{"type":"git","url":"git+https://github.com/caracal-lynx/sluice.git"},"bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"type":"module","main":"dist/index.js","types":"dist/index.d.ts","bin":{"sluice":"dist/cli.js"},"publishConfig":{"access":"public","provenance":false},"prettier":"@caracal-lynx/eslint-config/prettier","engines":{"node":">=24.16.0","pnpm":">=11"},"dependencies":{"@duckdb/node-api":"~1.5.5-r.4","axios":"^1.17.0","axios-retry":"^4.5.0","cli-progress":"^3.12.0","commander":"^15.0.0","csv-parse":"^7.0.0","csv-stringify":"^6.6.0","dayjs":"^1.11.21","dotenv":"^17.4.2","expr-eval-fork":"^3.0.3","js-yaml":"^5.2.3","mssql":"^12.5.5","pg":"^8.21.0","picocolors":"^1.1.1","pino":"^10.3.1","read-excel-file":">=9.3.4 <9.3.5","zod":"^3.25.76"},"devDependencies":{"@changesets/changelog-github":"^1.0.0","@changesets/cli":"^3.0.0","@types/cli-progress":"^3.11.6","@types/mssql":"^12.3.0","@types/node":"^24.13.2","@types/pg":"^8.20.0","@typescript/native-preview":"^7.0.0-dev.20260614.1","@vitest/coverage-v8":"^4.1.8","eslint":"^10.5.0","lefthook":"^2.1.9","pino-pretty":"^13.1.3","prettier":"^3.8.4","tsx":"^4.22.4","typescript":"^6.0.3","typescript-eslint":"^8.61.0","vitest":"^4.1.8","@caracal-lynx/eslint-config":"^0.1.3"},"scripts":{"build":"tsc -p tsconfig.json","dev":"tsx watch src/cli.ts","lint":"eslint src tests","format":"prettier --write src tests","test":"vitest run","test:watch":"vitest","test:cov":"vitest run --coverage","typecheck":"tsc --noEmit","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","typecheck:tsgo":"tsgo --noEmit","sluice":"tsx src/cli.ts","changeset":"changeset","version":"changeset version && pnpm install --lockfile-only","release":"pnpm build && changeset publish"},"_nodeVersion":"24.19.0","_id":"@caracal-lynx/sluice@0.11.0","dist":{"integrity":"sha512-4GiLABEmwhP/gxMpUFBPBs8D6hea7/fPa0Uc+bY1TFX1Wm1PqqRj5jfJOQ49n3KtJWLSAZgY3WDOrYHFJnBRpQ==","shasum":"99f6baff57450cc2b384f89cd3a5ce9fa4732123","tarball":"https://registry.npmjs.org/@caracal-lynx/sluice/-/sluice-0.11.0.tgz","fileCount":307,"unpackedSize":1014248,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDDFJLz5yMsnHMpT+o/66pSk8LRwfxeFLoFzrHauv5IhQIhAKXdZKkOFkU1EPVe0EnII2cHl4ap4ol0INNq7JBwyz+0"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:39fa2b03-de14-4419-9b5e-54aad69b91e3"}},"directories":{},"maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sluice_0.11.0_1787592367983_0.09710997986464931"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-04T16:08:51.932Z","modified":"2026-08-24T17:26:08.378Z","0.1.0":"2026-05-04T16:08:52.196Z","0.1.1":"2026-05-04T17:36:56.772Z","0.1.2":"2026-05-04T18:03:29.748Z","0.1.3":"2026-05-05T10:20:55.445Z","0.2.0":"2026-05-06T08:51:19.744Z","0.2.1":"2026-05-07T10:11:28.733Z","0.3.0":"2026-05-12T14:15:48.704Z","0.4.0":"2026-05-12T18:05:13.585Z","0.5.0":"2026-05-14T17:56:04.105Z","0.6.0":"2026-05-15T10:31:46.109Z","0.6.1":"2026-05-28T13:26:26.586Z","0.6.2":"2026-05-28T15:37:01.395Z","0.6.3":"2026-06-01T09:46:41.435Z","0.7.0":"2026-06-15T16:06:28.506Z","0.7.1":"2026-06-20T15:20:34.543Z","0.7.2":"2026-06-23T17:46:14.717Z","0.7.3":"2026-07-01T10:01:29.153Z","0.8.0":"2026-07-02T09:17:37.578Z","0.8.1":"2026-07-06T10:53:51.579Z","0.8.2":"2026-07-10T17:52:26.560Z","0.9.0":"2026-07-27T13:47:10.050Z","0.9.1":"2026-07-27T14:37:23.839Z","0.9.2":"2026-07-31T12:56:14.061Z","0.9.3":"2026-07-31T13:55:07.105Z","0.9.4":"2026-08-12T00:07:48.009Z","0.9.5":"2026-08-18T16:03:03.679Z","0.9.6":"2026-08-22T17:53:58.408Z","0.10.0":"2026-08-24T15:50:46.469Z","0.10.1":"2026-08-24T16:25:55.610Z","0.11.0":"2026-08-24T17:26:08.209Z"},"bugs":{"url":"https://github.com/caracal-lynx/sluice/issues"},"author":"Caracal Lynx Limited <sluice@caracallynx.com> (https://caracallynx.com)","license":"Elastic-2.0","homepage":"https://github.com/caracal-lynx/sluice#readme","keywords":["etl","data-migration","erp","yaml","duckdb","cli","data-quality","pipeline","typescript"],"repository":{"type":"git","url":"git+https://github.com/caracal-lynx/sluice.git"},"description":"Config-driven ETL toolkit for ERP data migrations","maintainers":[{"name":"michaelscott-1963","email":"michael.scott@caracallynx.com"}],"readme":"![Sluice](./images/sluice_banner.png)\n\n> _\"A sluice is a channel that controls the flow of water. Sluice is a toolkit that controls the flow of data. Except data doesn't flood your basement. Usually.\"_\n\n**`@caracal-lynx/sluice`** — a config-driven ETL toolkit for ERP data migrations, built by [Caracal Lynx Limited](https://caracallynx.com).\n\n> **This repository is a read-only mirror.** Development happens in the Data Gubbins platform\n> monorepo and this copy is replaced on every release, so pull requests opened here cannot be merged.\n> Issues and discussions are very welcome.\n\n[![npm](https://img.shields.io/npm/v/@caracal-lynx/sluice)](https://www.npmjs.com/package/@caracal-lynx/sluice)\n[![Node 24](https://img.shields.io/badge/Node-24_LTS-green)](https://nodejs.org)\n[![TypeScript](https://img.shields.io/badge/TypeScript-6.x-blue)](https://www.typescriptlang.org)\n[![License](https://img.shields.io/badge/license-Elastic_2.0-blue)](docs/licensing-faq.md)\n[![Docs](https://img.shields.io/badge/docs-caracal--lynx.github.io-00b8d4)](https://caracal-lynx.github.io/sluice/)\n\n📖 **Full documentation:** <https://caracal-lynx.github.io/sluice/>\n\n---\n\n> **Data quality is the hidden blocker for both migrations and AI adoption.**\n>\n> Sluice is a data migration and data quality tool that validates your data _before_ it reaches its destination — not after. You describe the entire migration as a YAML file: where the data comes from, the quality rules it has to pass, how each field maps to the target. Sluice validates the source, transforms it, and loads only the clean records — the bad rows go to a rejection report so you can fix the source.\n>\n> _Clean data flows through._\n\n---\n\n## 🤔 What is this thing?\n\n![Gold Sluice](./images/sluice-for-gold.jpg)\n\nSluice takes the pain out of ERP data migrations. You know the drill — a client has 20 years of customer records in a legacy SQL database, and they need them in a shiny new ERP system by Monday. The data is a mess, the field names are cryptic, and someone has helpfully stored postcodes in a column called `ADDR5`.\n\nSluice lets you describe the entire migration as a **YAML pipeline config** — where to get the data, what quality rules to enforce, how to transform the fields, and where to load the result. The engine is written once; every client engagement is just a folder of YAML files.\n\n**No UI. No server. No cloud dependency.** Just the `sluice` CLI, TypeScript modules, and a strong cup of tea. ☕\n\n---\n\n## ✨ What it does\n\nThe data flows through four stages — like water through a sluice gate:\n\n```\n💾 Source(s)                🔍 Data Quality              ✨ Transform               🎯 Target\n─────────────────    →     ─────────────────    →     ─────────────────    →     ─────────────────\nMSSQL / CSV /              Validate rules              Map fields                 Business Central\nXLSX / REST /              Reject bad rows             Apply lookups              IFS ERP\nPostgreSQL                 Write DQ report             Cleanse values             BlueCherry ERP\n                                                       Evaluate expressions       CSV / PostgreSQL\n  (1..N sources)\n        ↓\n  🔀 Optional Merge\n   coalesce, union,\n   intersect, priority\n```\n\nUnder the bonnet, all extracted data passes through a **local DuckDB staging store** before being transformed and loaded. Think of it as a staging area where data sits while it gets its act together before being presented to the target ERP. 🦆\n\nPipelines can be **single-source** (one YAML per entity, one `source:` block) or **multi-source** — 2+ sources merged on a key column using one of four built-in strategies before DQ and transform run. See [Multi-Source Merge](#-multi-source-merge) below.\n\n---\n\n## 🏗️ Architecture\n\n### Single-source pipeline\n\n```mermaid\nflowchart LR\n    A[📄 Pipeline YAML] --> B[⚙️ Config Loader<br/>Zod validation<br/>ENV var resolution<br/>Composite rule expansion]\n    B --> C[🔌 Source Adapter<br/>mssql / pg / csv<br/>xlsx / rest]\n    C --> D[(🦆 DuckDB<br/>stg_raw)]\n    D --> E[🔍 DQ Engine<br/>Rules validation<br/>Rejection report]\n    E --> F[✨ Transform Engine<br/>Field mapping<br/>Lookup resolution<br/>Cleanse ops<br/>Custom plugins]\n    F --> G[(🦆 DuckDB<br/>stg_transformed)]\n    G --> H[🎯 Target Adapter<br/>bc / ifs / bluecherry<br/>csv / pg]\n    H --> I[📦 Output<br/>CSV / REST / DB]\n    E -->|❌ critical failures| J[🛑 Pipeline halted<br/>dq-summary.json<br/>rejected.csv]\n```\n\n### Multi-source pipeline\n\n```mermaid\nflowchart LR\n    A[📄 Pipeline YAML<br/>sources + merge] --> B[⚙️ Config Loader]\n    B --> C1[🔌 Source 1]\n    B --> C2[🔌 Source 2]\n    B --> C3[🔌 Source N]\n    C1 --> D1[(🦆 stg_raw_src1<br/>+ rename + per-source DQ)]\n    C2 --> D2[(🦆 stg_raw_src2<br/>+ rename + per-source DQ)]\n    C3 --> D3[(🦆 stg_raw_srcN<br/>+ rename + per-source DQ)]\n    D1 --> M[🔀 MergeEngine<br/>coalesce / union<br/>intersect / priority-override]\n    D2 --> M\n    D3 --> M\n    M --> G[(🦆 stg_merged<br/>+ stg_merge_conflicts.csv)]\n    G --> E[🔍 Post-merge DQ]\n    E --> F[✨ Transform → stg_transformed]\n    F --> H[🎯 Target Adapter]\n    H --> I[📦 Output]\n```\n\n---\n\n## 🧰 Tech Stack\n\n| What           | Package                       | Why                                                                               |\n| -------------- | ----------------------------- | --------------------------------------------------------------------------------- |\n| 🔤 Language    | TypeScript 5.x `strict`       | Because `any` is a cry for help                                                   |\n| 🟢 Runtime     | Node.js 24 LTS                | Active LTS until April 2028; OpenSSL 3.5; ESM-stable                              |\n| 📋 Config      | `js-yaml` + `zod`             | YAML in, typed objects out                                                        |\n| 🗄️ SQL Server  | `mssql`                       | Because the legacy DB is always SQL Server                                        |\n| 📊 Staging     | `@duckdb/node-api` (embedded) | Promise-native, ABI-stable — no server, no `npm rebuild` after Node version bumps |\n| 📁 CSV         | `csv-parse` + `csv-stringify` | Streaming, handles BOM, the works                                                 |\n| 📈 Excel       | `read-excel-file`             | Read-only — we're migrating away from it, after all                               |\n| 🌐 HTTP        | `axios` + `axios-retry`       | 3 retries, exponential backoff, rate limit respect                                |\n| 📅 Dates       | `dayjs`                       | Because time zones are already somebody else's problem                            |\n| 🖥️ CLI         | `commander` v12               | Clean commands, sane flags                                                        |\n| 📝 Logging     | `pino`                        | Structured JSON logs — pretty in dev, parseable in CI                             |\n| 🧪 Testing     | `vitest`                      | Not Jest. Never Jest.                                                             |\n| 🔒 Expressions | `expr-eval`                   | Safe expression parsing — no `eval()` here, thank you very much                   |\n\n---\n\n## 🧩 Extension model\n\nSluice's pipeline schema is fixed by design (readability, reviewability, predictable validation). Anything you can't express in the schema, you add via plugins. Three tiers, scaling from \"no code, no install\" to \"publishable npm package\":\n\n| Tier       | What it is                                                              | Where it lives                      | Best for                                                                    |\n| ---------- | ----------------------------------------------------------------------- | ----------------------------------- | --------------------------------------------------------------------------- |\n| **Tier 1** | YAML composite rules — bundle built-in DQ checks under a single ID      | `shared/rules.yaml` in your project | Reusing common check combinations across pipelines without writing code     |\n| **Tier 2** | TypeScript file plugins — `*.rule.ts` / `*.transform.ts` / `*.merge.ts` | `plugins/` next to your YAML        | Custom logic for one project; rapid iteration                               |\n| **Tier 3** | npm packages exporting `register()`                                     | npmjs.com (public or private)       | Distributing rules / adapters / strategies across teams or as paid products |\n\nSee **[PLUGINS.md](PLUGINS.md)** for the full author's guide with worked examples for all three tiers.\n\n---\n\n## 🚀 Quick Start\n\nA complete pipeline in 20 lines: read a CSV, validate emails, lowercase them, write the clean rows to a new CSV. The full file is checked into the repo at [`examples/hello-world.pipeline.yaml`](examples/hello-world.pipeline.yaml) with sample data at [`examples/data/hello-world.csv`](examples/data/hello-world.csv).\n\n```yaml\npipeline:\n  name: hello-world\n  client: demo\n  version: \"1.0\"\n  entity: Customer\n\nsource:\n  adapter: csv\n  file: ./examples/data/hello-world.csv\n\ndq:\n  rules:\n    - field: email\n      checks:\n        - { type: notNull, severity: critical }\n        - { type: email, severity: warning }\n\ntransform:\n  fields:\n    - { from: name, to: Name, type: string, cleanse: trim }\n    - { from: email, to: Email, type: string, cleanse: trim|lowercase }\n    - { from: country, to: Country, type: string, default: GB }\n\ntarget:\n  adapter: csv\n  output: ./output/hello-world-clean.csv\n```\n\nRun it end to end:\n\n```bash\n# 1. Install\nnpm install -g @caracal-lynx/sluice\n\n# 2. Validate the config without touching any data\nsluice check examples/hello-world.pipeline.yaml\n\n# 3. Dry-run: extract + DQ + transform but don't write the target\nsluice run examples/hello-world.pipeline.yaml --dry-run\n\n# 4. Live run — writes ./output/hello-world-clean.csv +\n#                        ./output/hello-world-rejected.csv (if any DQ failures)\nsluice run examples/hello-world.pipeline.yaml\n```\n\nThe sample data has one row with a malformed email — that's a `warning`, so the row is kept in the output but flagged in `output/hello-world-rejected.csv`. Open both CSVs side by side to see what passed and what got reported. Add an `unknown@bad`-style row (or strip an email entirely) to see how a `critical` failure halts the pipeline before any output is written.\n\n### Other CLI commands\n\n```bash\n# Run DQ + transform; skip the load (faster than --dry-run for spec checks)\nsluice validate customers.pipeline.yaml\n\n# Profile source data — column stats, distinct counts, samples; no DQ\nsluice profile customers.pipeline.yaml\n\n# Inspect loaded plugins and merge strategies\nsluice plugins\nsluice merge list-strategies\nsluice merge info coalesce\n```\n\n### CLI flags\n\n| Flag                                   | What it does                                                                  |\n| -------------------------------------- | ----------------------------------------------------------------------------- |\n| `--log-level debug\\|info\\|warn\\|error` | How chatty do you want the logs?                                              |\n| `--env <file>`                         | Path to your `.env` file (default: `./.env`)                                  |\n| `--output <dir>`                       | Override the output directory                                                 |\n| `--plugins <dir...>`                   | Load additional plugin directories (alongside the pipeline `plugins/` folder) |\n| `--dry-run`                            | Extract + DQ + transform, but don't write a single byte to the target         |\n\nWhen multiple plugin directories resolve to the same absolute path (for example,\n`--plugins ./plugins`), Sluice de-duplicates them before loading.\n\n### Exit codes\n\n| Code | Meaning                                       |\n| ---- | --------------------------------------------- |\n| `0`  | ✅ All good                                   |\n| `1`  | ❌ Pipeline error                             |\n| `2`  | 🛑 Critical DQ violations halted the pipeline |\n| `3`  | 📋 Config validation failed                   |\n\n---\n\n## 📄 Pipeline Config Format\n\nEach migration entity gets its own YAML file. One entity, one file. Nice and tidy.\n\n```\n💡 One YAML file = one migrated entity\n   (customers, items, vendors, styles, purchase orders, etc.)\n```\n\nA single-source pipeline has five sections:\n\n```yaml\npipeline: { name, client, version, entity, description }\nsource: { adapter, connection/file/endpoint, ... }\ndq: { rules, stopOnCritical, rejectionFile }\ntransform: { lookups, fields }\ntarget: { adapter, output/baseUrl, ... }\nrun: { mode, batchSize, logLevel, dryRun, ... } # all optional\n```\n\nA multi-source pipeline swaps `source:` for `sources:` + `merge:`:\n\n```yaml\npipeline: { ... }\nsources: [{ id, priority, adapter, ..., rename? }, ...] # 2+ entries\nmerge: { key, strategy, onUnmatched, fieldStrategies, conflictLog, incrementalSource? }\ndq: { ... } # rules can be scoped via sourceId\ntransform: { ... }\ntarget: { ... }\nrun: { ... }\n```\n\n`PipelineSchema` requires _either_ `source:` (single) _or_ both `sources:` + `merge:` (multi) — never both. The CLI auto-routes based on which shape the YAML has, so there's no flag to remember.\n\n### 📥 Source Adapters\n\n| Adapter | Use when...                                                                |\n| ------- | -------------------------------------------------------------------------- |\n| `mssql` | The legacy system is SQL Server (it's always SQL Server)                   |\n| `pg`    | The legacy system is PostgreSQL (you lucky thing)                          |\n| `csv`   | Someone emailed you a CSV export at 11pm the night before go-live          |\n| `xlsx`  | Same as above but Excel, complete with merged cells and mystery formatting |\n| `rest`  | The source system has an API! Progress!                                    |\n\n### 🎯 Target Adapters\n\n| Adapter      | Loads to...                                                              |\n| ------------ | ------------------------------------------------------------------------ |\n| `bc`         | Microsoft Dynamics 365 Business Central (via OData REST + OAuth2)        |\n| `ifs`        | IFS ERP (via fixed-format CSV import — no header, specific column order) |\n| `bluecherry` | BlueCherry ERP / CGS (CSV import, US-format dates, headers required)     |\n| `csv`        | Generic CSV — for anything else or for manual inspection                 |\n| `pg`         | PostgreSQL — useful for intermediate staging or custom targets           |\n\n### 🔍 Data Quality Rules\n\nNine built-in rule types, configurable per field:\n\n```yaml\ndq:\n  stopOnCritical: true\n  rules:\n    - field: CUST_CODE\n      checks:\n        - { type: notNull, severity: critical } # 💥 stops the pipeline\n        - { type: unique, severity: critical }\n        - { type: pattern, value: \"^[A-Z0-9]{3,10}$\", severity: warning }\n\n    - field: EMAIL\n      checks:\n        - { type: email, severity: warning } # ⚠️  flagged but not rejected\n\n    - field: POST_CODE\n      checks:\n        - { type: ukPostcode, severity: warning } # 🇬🇧 all UK formats\n```\n\n| Rule            | What it checks                           |\n| --------------- | ---------------------------------------- |\n| `notNull`       | Not null, not empty, not just whitespace |\n| `unique`        | No duplicates across the whole dataset   |\n| `pattern`       | ECMAScript regex                         |\n| `email`         | RFC 5322-ish email validation            |\n| `ukPostcode`    | All current UK postcode formats          |\n| `maxLength`     | String length cap                        |\n| `min` / `max`   | Numeric range                            |\n| `allowedValues` | Enum-style allowed value list            |\n\nSeverity levels: `critical` (row rejected, pipeline can halt) · `warning` (flagged in report, row kept) · `info` (summary only)\n\n### ✨ Transform: Field Mapping Types\n\n| Type         | What it does                                               |\n| ------------ | ---------------------------------------------------------- |\n| `string`     | Cast + optional cleanse ops + optional truncation          |\n| `number`     | Integer coercion (NaN = error)                             |\n| `decimal`    | Fixed-precision decimal stored as string                   |\n| `boolean`    | `'1','true','yes','y','t'` → true. Everything else → false |\n| `date`       | Parse source date, output in target format                 |\n| `lookup`     | Resolve via a CSV or SQL lookup table                      |\n| `concat`     | Join multiple source fields with a separator               |\n| `constant`   | Emit a fixed value (e.g. `CustomerGroup: DOMESTIC`)        |\n| `expression` | Evaluate an expression against the source row              |\n| `custom`     | Delegate to a `TransformPlugin` via `customOp` (Phase 2)   |\n\n### 🧹 Cleanse Operations\n\nPipe-chain them: `cleanse: trim|titleCase|normaliseUnicode`\n\n| Op                 | Before         | After          |\n| ------------------ | -------------- | -------------- |\n| `trim`             | `\"  hello  \"`  | `\"hello\"`      |\n| `uppercase`        | `\"hello\"`      | `\"HELLO\"`      |\n| `lowercase`        | `\"HELLO\"`      | `\"hello\"`      |\n| `titleCase`        | `\"john smith\"` | `\"John Smith\"` |\n| `stripNonAlpha`    | `\"AB-12!\"`     | `\"AB\"`         |\n| `stripNonNumeric`  | `\"AB-12!\"`     | `\"12\"`         |\n| `padStart:6:0`     | `\"42\"`         | `\"000042\"`     |\n| `nullIfEmpty`      | `\"\"`           | `null`         |\n| `normaliseUnicode` | `\"café\"`       | `\"cafe\"`       |\n| `normaliseQuotes`  | `\"it's\"`       | `\"it's\"`       |\n\n---\n\n## 📁 Repository Structure\n\n```\nsluice/\n├── src/\n│   ├── cli.ts                  ← CLI entry point (commander)\n│   ├── runner.ts               ← PipelineRunner — single-source orchestration\n│   ├── multi-source-runner.ts  ← MultiSourcePipelineRunner (Phase 3)\n│   ├── config/                 ← Zod schema, YAML loader, ENV var + composite expansion\n│   ├── adapters/\n│   │   ├── source/             ← mssql, pg, csv, xlsx, rest\n│   │   └── target/             ← bc, ifs, bluecherry, csv, pg\n│   ├── staging/                ← DuckDB wrapper (stg_raw → stg_merged → stg_transformed)\n│   ├── dq/                     ← DQ engine, rules, rejection reporter\n│   ├── transform/              ← Transform engine, lookup resolver, cleanse ops\n│   ├── merge/                  ← MergeEngine, SQL builder, 4 built-in strategies\n│   ├── plugins/                ← Rule/Transform/Merge registries + file & npm loaders\n│   └── utils/                  ← logger (pino), errors, env helpers\n├── tests/\n│   ├── fixtures/               ← sample pipeline YAMLs, CSV/rules data, plugin files\n│   ├── unit/                   ← unit tests (all I/O mocked)\n│   └── integration/            ← real DuckDB :memory: + CSV fixtures\n└── clients/                    ← 🙈 gitignored — each client has their own repo\n    ├── acme-corp/                ← Acme Corp pipelines\n    └── style-co/                  ← Style Co pipelines\n```\n\n---\n\n## ⚙️ Environment Variables\n\nConnection strings and credentials live in `.env` (never in YAML files, never in Git).\n\n```bash\n# .env\nSOURCE_MSSQL=mssql://user:password@serverlegacy.example.local/LegacyDB\nBC_BASE_URL=https://api.businesscentral.dynamics.com/v2.0\nBC_TENANT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\nBC_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\nBC_CLIENT_SECRET=your-secret-here\nBC_COMPANY=Example Company Ltd\n```\n\nReference them in YAML with `${ENV_VAR}` — resolved at runtime, never stored in config:\n\n```yaml\nsource:\n  adapter: mssql\n  connection: ${SOURCE_MSSQL}\n```\n\n---\n\n## 🧩 Phase 2: Extension System\n\nPhase 2 adds a three-tier plugin system so you can extend Sluice without touching the core engine.\n\n### Tier 1 — Composite Rules (YAML) 📋\n\nName a bundle of checks in a shared rules file and reference them like built-ins:\n\n```yaml\n# shared/rules.yaml\nrules:\n  - id: style-coStyleNo\n    checks:\n      - { type: notNull, severity: critical }\n      - { type: pattern, value: \"^[A-Z]{2}[0-9]{4}$\", severity: critical }\n      - { type: maxLength, value: 6, severity: critical }\n```\n\n```yaml\n# In your pipeline:\ndq:\n  rulesFile: ../../shared/rules.yaml\n  rules:\n    - field: STYLE_NO\n      checks:\n        - { type: style-coStyleNo } # expands to the three checks above ✨\n```\n\n### Tier 2 — Plugin Files (TypeScript) 🔌\n\nDrop a `*.rule.ts`, `*.transform.ts`, or `*.merge.ts` file into a `plugins/` folder next to your pipeline YAMLs. Auto-discovered at startup:\n\n```typescript\n// plugins/ukVatNumber.rule.ts\nexport const rule: RulePlugin = {\n  id: \"ukVatNumber\",\n  validate(value, config, rowIndex, field) {\n    const valid = /^GB([0-9]{9}|[0-9]{12}|(GD|HA)[0-9]{3})$/.test(String(value));\n    return valid\n      ? null\n      : {\n          field,\n          rowIndex,\n          value,\n          rule: \"ukVatNumber\",\n          severity: config.severity,\n          message: \"Invalid UK VAT number\",\n        };\n  },\n};\n```\n\n### Tier 3 — npm Packages 📦\n\nWhen plugins are useful across multiple clients, promote them to scoped npm packages and declare them in `sluice.config.yaml`:\n\n```yaml\n# sluice.config.yaml\nplugins:\n  - package: \"@example/sluice-rules-uk\"\n  - package: \"@example/sluice-rules-fashion\"\n  - package: \"@example/sluice-transform-ifs\"\n```\n\nAll three tiers use the same registry interfaces and are invoked identically by the engines. The engine doesn't know or care which tier a rule came from. 🤷\n\n### List Loaded Plugins\n\n```bash\nsluice plugins\n\n# Include extra plugin directories outside the pipeline folder\nsluice plugins --plugins ./shared/plugins ./team/plugins\n```\n\nOutput:\n\n```\n📋 Data Quality Rules:\n  • ukVatNumber\n  • bcAccountCode\n  • iso8601Date\n\n🔄 Transform Operations:\n  • slugGenerator\n  • normalizeCompanyName\n  • fixedDecimal\n\n🔀 Merge Strategies:\n  • coalesce\n  • priority-override\n  • union\n  • intersect\n```\n\n### Getting Started with Plugins\n\nDetailed guide: **[PLUGINS.md](./PLUGINS.md)**\n\n- Create a custom DQ rule\n- Create a custom transform operation\n- Create a custom merge strategy\n- Package plugins as npm packages\n- Test and debug plugins\n- Real-world examples\n\n---\n\n## 🔀 Multi-Source Merge\n\nPhase 3 lets a single pipeline extract from **2+ sources** and merge them on a key column before DQ and transform. Useful when the master record for an entity is scattered across systems — master data in SQL Server, pricing enrichment in an Excel sheet, product descriptions in a REST API, and so on.\n\n### Built-in merge strategies\n\n| Strategy            | Behaviour                                                                 | When to use                                                               |\n| ------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- |\n| `coalesce`          | First non-null value wins (priority-ordered; whitespace treated as blank) | Enriching a primary source with fallback data from lower-priority sources |\n| `priority-override` | Highest-priority source wins, even if null or blank                       | Strict priority — the trusted source is the trusted source, full stop     |\n| `union`             | All rows from all sources, deduplicated by key                            | Combining independent datasets (e.g. multi-warehouse inventory)           |\n| `intersect`         | Only rows present in **all** sources                                      | Reconciliation / \"find the records that agree\"                            |\n\nCustom strategies can be dropped in as `*.merge.ts` plugins or shipped as npm packages — same three-tier model as DQ rules and transforms.\n\n### A minimal multi-source pipeline\n\n```yaml\npipeline:\n  name: style-co-products-merged\n  client: style-co\n  version: \"1.0\"\n  entity: Style\n\nsources:\n  - id: sql-server # staging table: stg_raw_sql-server\n    priority: 1 # lower = higher precedence\n    adapter: mssql\n    connection: ${SOURCE_2_MSSQL}\n    query: \"SELECT STYLE_NO, STYLE_DESC, COST_PRICE FROM dbo.Styles WHERE Active = 1\"\n\n  - id: excel\n    priority: 2\n    adapter: xlsx\n    file: ./data/product-data.xlsx\n    sheet: \"Products\"\n    rename: # applied in-place after extract, before DQ\n      Style Number: STYLE_NO\n      Description: STYLE_DESC\n      Fibre: FIBRE_CONTENT\n\nmerge:\n  key: STYLE_NO # single column or array for composite keys\n  strategy: coalesce\n  onUnmatched: include # include | exclude | warn | error\n  fieldStrategies: # per-field overrides\n    - { field: FIBRE_CONTENT, source: excel } # pin to one source\n    - { field: COST_PRICE, strategy: priority-override }\n  conflictLog: ./output/style-co-products-conflicts.csv # optional CSV of field disagreements\n\ndq:\n  stopOnCritical: true\n  rules:\n    - field: STYLE_NO # 🎯 pre-merge: scoped to one source\n      sourceId: sql-server\n      checks: [{ type: notNull, severity: critical }, { type: unique, severity: critical }]\n    - field: STYLE_DESC # 🎯 post-merge: runs against stg_merged\n      checks: [{ type: notNull, severity: critical }]\n\ntransform: { ... }\ntarget: { ... }\n```\n\nPre-merge rules (`sourceId: …`) run against each source's staging table before merging and generate per-source rejection CSVs (suffixed `-{sourceId}`). Post-merge rules (no `sourceId`) run once against `stg_merged`.\n\n### Incremental multi-source\n\n```yaml\nmerge:\n  incrementalSource: sql-server # must match a source id; required in incremental mode\nrun:\n  mode: incremental\n  incrementalField: UPDATED_AT\n```\n\nOnly the named source is filtered by timestamp; other sources run full each time. The state file gains a per-source `sources` block tracking each source's last run time.\n\n### Inspect merge strategies\n\n```bash\nsluice merge list-strategies        # ids + descriptions for all registered strategies\nsluice merge info coalesce          # details for one strategy\n```\n\nA full working example lives at [tests/fixtures/style-co-products-merged.pipeline.yaml](tests/fixtures/style-co-products-merged.pipeline.yaml).\n\n---\n\n## 🧪 Testing\n\n```bash\npnpm test           # run tests once\npnpm test:watch     # watch mode (great for TDD)\npnpm test:cov       # with coverage report\n```\n\n- **Unit tests** mock all I/O with `vi.mock` — no live databases required\n- **Integration tests** use real DuckDB (`:memory:`) with CSV fixtures\n- Target: 80% line coverage across `src/dq/` and `src/transform/`\n- CI runs on `ubuntu-latest` via GitHub Actions\n\n---\n\n## 🏗️ Development\n\n```bash\npnpm build         # tsc compile\npnpm dev           # tsx watch src/cli.ts (live reload)\npnpm lint          # eslint\npnpm format        # prettier\n\n# Pretty logs in dev:\npnpm dev run customers.pipeline.yaml | pnpm exec pino-pretty\n```\n\n> **Note:** Sluice develops with **pnpm** (see [CLAUDE.md](CLAUDE.md)). Published to npm, so end users can still install with any package manager.\n>\n> **Note:** Uses `tsx`, not `ts-node`. Path aliases work correctly on Windows without extra configuration. 🪟\n\n---\n\n## 🚫 Things Sluice Is Not\n\n- ❌ A web application or dashboard (there's no UI — this is a good thing)\n- ❌ A streaming / real-time ingestion platform\n- ❌ A data warehouse\n- ❌ A multi-tenant SaaS product\n- ❌ An excuse to use `eval()` anywhere\n\n---\n\n## 🏢 Sluice + Caracal Lynx Professional Services\n\nThe Sluice core CLI is open-source and free to use. Caracal Lynx offers additional paid services built on top of it:\n\n| Service                     | What it is                                                                                                                                |\n| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |\n| **Enrichment Service**      | Async API lookups (EU VAT, UK VAT, trade tariff) — fills gaps in source data                                                              |\n| **Application Adapters**    | Pre-built ERP adapters (IFS, Business Central, BlueCherry)                                                                                |\n| **Domain Rule Packages**    | UK compliance rules, fashion/retail data standards                                                                                        |\n| **Client-Specific Plugins** | Bespoke plugins tailored to your source system and data model                                                                             |\n| **Sluice MCP Server** 🚧    | AI-assisted migration using Claude — agentic pipeline authoring, live schema inspection, automatic DQ iteration. _Coming soon — Phase 9._ |\n| **Migration Delivery**      | Full end-to-end data migration, delivered by Caracal Lynx                                                                                 |\n\n📧 **sluice@caracallynx.com**\n🌐 **[caracallynx.com](https://caracallynx.com)**\n\n---\n\n## 🤝 Community\n\n- 🐛 [Report a bug or request a feature](https://github.com/caracal-lynx/sluice/issues/new/choose)\n- 💬 [Ask a question or share a use case](https://github.com/caracal-lynx/sluice/discussions)\n- 🤲 [Contributing guide](CONTRIBUTING.md)\n- 🤝 [Code of Conduct](CODE_OF_CONDUCT.md)\n\n---\n\n## 🔐 Security\n\nFound a vulnerability? Please **do not** open a public issue. See [SECURITY.md](SECURITY.md) for the disclosure process — `security@caracallynx.com`, 48-hour acknowledgement, 90-day disclosure SLA.\n\n---\n\n## ⚖️ Licence\n\nSluice is licensed under the [Elastic Licence 2.0](LICENSE). See [docs/licensing-faq.md](docs/licensing-faq.md) for a plain-English explainer of what you can and can't do with it. Short version: use it freely for your own data migrations; don't resell it as a hosted service or strip the licence headers.\n\n---\n\n## 🏷️ About\n\nBuilt and maintained by [Caracal Lynx Limited](https://caracallynx.com) (SC826823) — Gretna, Scotland.\n\n```\nnpm package:  @caracal-lynx/sluice\nowner:        Caracal Lynx Limited (SC826823)\nauthor:       Michael Scott\nmaintainers:  Michael Scott, Carolyn Scott, Andrew Scott, Duncan Scott\n```\n\n---\n\n_Clean data flows through._ 💧\n","readmeFilename":""}