{"_id":"@botler/1403-form-filler-module","_rev":"13-1e68c06617baf4356c600a08d405f6a1","name":"@botler/1403-form-filler-module","dist-tags":{"latest":"1.3.1"},"versions":{"1.0.0":{"name":"@botler/1403-form-filler-module","version":"1.0.0","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.0.0","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"595367757341c83d6d8fc7e6db2d720b1e0eb81d","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.0.0.tgz","fileCount":144,"integrity":"sha512-bFp1Isn+UolMM2qAHmEMQN8xYNG/A85qW9sWwaDGY05UsbHsKCspdMnnshlcYWHM1qDg7XGFsNiW8toZhe8GYQ==","signatures":[{"sig":"MEUCIFWw7vjZX7tCbT02Rrw2NXgJKgwmvYBoHTia7pwkHDMsAiEAvN6/Vr0IGiRCGU3fxuldl8plNdNjAyWqAvY43oP21f8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":528829},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"aaed26b5a5055c6882a49e66488a484b9f758bc2","scripts":{"build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.0.0_1770491984608_0.9035094417643554","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@botler/1403-form-filler-module","version":"1.0.1","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.0.1","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"ee6e0c2979a7c25371bd3a9ec01e570b3805cae0","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.0.1.tgz","fileCount":144,"integrity":"sha512-6jYoH0z14cGeKQJuju5C7MykXECdjmJwvpOHuv4drNAC0ADDFD4QfmpMTSE5z41u2j9OON4/xKiudc/E3R++pQ==","signatures":[{"sig":"MEQCICSSovpXbBegKyo6ynw+HglzkplXqSZ60i5Q4L8ByfNNAiA/Rm2zK/8/d3OuAKS1TuTeW5EFWHsCnuSGNMPu0I9qtg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":529821},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"aaed26b5a5055c6882a49e66488a484b9f758bc2","scripts":{"build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.0.1_1770497154320_0.47221855434218574","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@botler/1403-form-filler-module","version":"1.0.2","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.0.2","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"ab9079d80062eac1f4509c7ee16fbae9888c2f0d","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.0.2.tgz","fileCount":145,"integrity":"sha512-M3YTfDwyC4pwl1WTxrx0wBic4cc3dgkdaEz/PWlmuBuyF3L46IiVwP8er5iyYBlZjcQOc35e2V3bJT+FNueraw==","signatures":[{"sig":"MEYCIQC+G1LaMimtLGkuFRps5J0/bZgcOhiRG4h8xNMnSp0/NgIhAJirxKPbBi+XhAnz9TnFSeKjTY6OApSG9J7KmSfOtIKt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":751279},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"56059025bb299d12f16012b1228f7bd2a1e1d496","scripts":{"build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.0.2_1770497786502_0.7279868307935655","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@botler/1403-form-filler-module","version":"1.0.3","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.0.3","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"297a7d608c38adb70fc2beeb0daa71bd2052551a","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.0.3.tgz","fileCount":145,"integrity":"sha512-OLWBlL68sYwAz9wcijjzEy0704X01Sw4c1PMJWAUfbKdBzOk0+y2jD7ub0ggteo7ZafvcfPCzlkGUpf8QJUTww==","signatures":[{"sig":"MEYCIQC6lbPFNJxFWVRnhoFmPypqqOcMoQgM1xx4Yl09pFAsrAIhALPBeP+7xNa4IWpAs1fGtExXRiwjTmaDKu1ZPsD4IF6/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":751283},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"56059025bb299d12f16012b1228f7bd2a1e1d496","scripts":{"build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.0.3_1770498281457_0.017845974108966045","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@botler/1403-form-filler-module","version":"1.1.0","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.1.0","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"3a73597a5ccac1409d3aeb8d90e058ca6c0e81bf","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.1.0.tgz","fileCount":145,"integrity":"sha512-isH6GpU9VeNq46DJ1o3Wasd9uiZS8r+PYCvWlZowwj2j/76Ri58uAgCkiy4HIeQFvLN+qP6Jj0t3WVpOYYpqhw==","signatures":[{"sig":"MEYCIQDyrUs03r0El7SOUstSuTOCrSaXQijmMBOWTaV9HaOpJAIhAPd4l2gPYXLX3SU47khRfk5kigrFqVdGXrUPpP7xSHbN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":762981},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"a6e8141a25fcc898d4425beaf06f89c59f043663","scripts":{"build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.1.0_1770503517367_0.7500164504039988","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@botler/1403-form-filler-module","version":"1.2.0","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.2.0","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"6dd7d5f17fb45dec509f2e2ef38a091d0b2f4750","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.2.0.tgz","fileCount":157,"integrity":"sha512-Q/8gqrwn5UGjuVl4pS0e6vBvfxgWp90gn7s2u8iIHehGKGkSstscQ8oiQG6YF/SUBi6XKZj9+rDHfJQOOdoUhA==","signatures":[{"sig":"MEQCIEeyN5Nn91LCfuDb8l9MaM2N4EMhJatriiHVRg92KzABAiAvJQuGp2I8ZCf6+46BjYtZPtyFqjs0wtyCmoyQ+TuU+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":790121},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"70fa3c3db8d221b906019a43cc97898b87562e95","scripts":{"build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","csv-stringify":"^6.6.0","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.2.0_1770676560749_0.31314992655602025","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@botler/1403-form-filler-module","version":"1.2.1","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.2.1","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"2d5908e09b6da091bbb899b32ab539c6d2b66cd3","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.2.1.tgz","fileCount":157,"integrity":"sha512-OehEUpPvFoPc12U4sf81a0ul5glbuPVYseYBJa2mAj2lE4KlOH2aEXd9e04dNvc6tXeaSKpP2Qo9VC9593hK7A==","signatures":[{"sig":"MEQCIC4r5buap9Gbk4AndtgZBIkp3oe+LeeoQNTJ0KTiXcynAiAaH6ewozT187YM7fbnAL4zphYP+ZFYaaebRKahlC8Yjw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":790191},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"b90146d9edd0a31da1d3b7fa540d3ded04394f49","scripts":{"build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","csv-stringify":"^6.6.0","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.2.1_1770678616515_0.3592388365783812","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@botler/1403-form-filler-module","version":"1.2.2","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.2.2","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"3843f0ddd7131d9037eecfaf8a90dc0602f47548","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.2.2.tgz","fileCount":157,"integrity":"sha512-0FvIrQAIP8+XpYGSbX3eBUjun2qn1OG/7/Qbg2fAq7dQGMKVykw6+tbaGbGoRDARPIXX92FQSmeLsVrrIbx+hQ==","signatures":[{"sig":"MEUCIQCRUEMkDOwO+xL9Te17WKPJoD/2a2+aXN4I9XRiq/ZmzgIgBy3VdTpPU3HRNFu8JOMEfvvQxHia5mte65FdjOQDhmk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":791122},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"2f6703d28502e1ec0f03717367e65f3cdd598790","scripts":{"build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","csv-stringify":"^6.6.0","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.2.2_1770679421525_0.3962413581785973","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@botler/1403-form-filler-module","version":"1.2.3","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.2.3","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"c5f9e14d854e9121a75a2188530c2c370f37bb82","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.2.3.tgz","fileCount":161,"integrity":"sha512-XK7Fw9bCC3MF1UU+1z/1RPvhmmtPZuaNiwfePj4dp9O5hC+dwSuVPjJuk4GSb8HdDr0/qpX9D+pKatNWabXQYA==","signatures":[{"sig":"MEUCIHwrfR9T0nDBlD4ZOt5cfZwE39KfuTC+EZJVqGjePAAmAiEArWsnZAMmIr5cvHj03oIDDt/9h7qxdHzXkNJkRzAsOjY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":796857},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"5a31c34062665b1a0d72d389ae6e42a1b99b67b7","scripts":{"build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","csv-stringify":"^6.6.0","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.2.3_1770732715441_0.7528876160894213","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@botler/1403-form-filler-module","version":"1.2.4","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.2.4","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"aba2f6a4b6b2dd2a88cdc563a26fb5b7cae5caff","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.2.4.tgz","fileCount":161,"integrity":"sha512-J7vxGgJ5Uqw5q6XPwC/98XMszV+9/ijKhP0Al5L+BXjMuymnxpL59Jj1X5Jxc7R/fHa1NO/ajZUXzPyk6KxyIQ==","signatures":[{"sig":"MEYCIQDPBvlFBVYF4uU1IgjfIrZR4Y3Epdl7jnpb2uSMvTsmvAIhALLPBjL104pgInQF+Ehy6KB+LyTb5+MTD+qaIch6Ht11","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":797838},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"26d863cb1a1270cd52361b1a25c353374b4e9a45","scripts":{"build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","csv-stringify":"^6.6.0","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.2.4_1770900995448_0.5222048889224182","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@botler/1403-form-filler-module","version":"1.3.0","license":"UNLICENSED","_id":"@botler/1403-form-filler-module@1.3.0","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"bin":{"fill-1403":"dist/cli.js"},"dist":{"shasum":"e897290ca9ba7bc1f31d0ed400c3792b885a44e3","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.3.0.tgz","fileCount":165,"integrity":"sha512-LOHM/yp+kmb07JNZqPmIhEG77W8EXdbhSA0OIiPSLPMjun36JOOaKWbPmL1hyIvdJxZLuOTESkjRxLlKEbMsHQ==","signatures":[{"sig":"MEQCIHaiYSTVC8s/YKY+rqOHZhiTcQfJb5fvWt9ZjqomuoTAAiA0IMuWxxqti3c5f1T2PIlLFTEO6VtpfLyB0HrOrQfkRA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":808938},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","default":"./dist/cli.js","require":"./dist/cli.js"}},"gitHead":"89ab4d1a1c83cab157bec878cd1be25022ce39f4","scripts":{"test":"vitest run","build":"tsc","start":"npx tsx src/cli.ts","start:all":"npx tsx src/cli.ts --all","typecheck":"tsc --noEmit","start:single":"npx tsx src/cli.ts --id","start:dry-run":"npx tsx src/cli.ts --all --dry-run","prepublishOnly":"npm run build"},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"_npmVersion":"11.6.2","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"pg":"^8.16.3","mupdf":"^1.27.0","dotenv":"latest","pdf-lib":"^1.17.1","@vercel/og":"^0.8.5","csv-stringify":"^6.6.0","@aws-sdk/client-s3":"^3.859.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"latest","vitest":"^4.0.18","@types/pg":"latest","typescript":"latest","@types/node":"latest"},"_npmOperationalInternal":{"tmp":"tmp/1403-form-filler-module_1.3.0_1771252668152_0.8726711320108342","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@botler/1403-form-filler-module","version":"1.3.1","license":"UNLICENSED","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","main":"dist/index.js","types":"dist/index.d.ts","bin":{"fill-1403":"dist/cli.js"},"exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.js","import":"./dist/index.js","default":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","require":"./dist/cli.js","default":"./dist/cli.js"}},"scripts":{"build":"tsc","prepublishOnly":"npm run build","start":"npx tsx src/cli.ts","start:single":"npx tsx src/cli.ts --id","start:all":"npx tsx src/cli.ts --all","start:dry-run":"npx tsx src/cli.ts --all --dry-run","typecheck":"tsc --noEmit","test":"vitest run"},"dependencies":{"@aws-sdk/client-s3":"^3.859.0","@vercel/og":"^0.8.5","csv-stringify":"^6.6.0","dotenv":"latest","mupdf":"^1.27.0","pdf-lib":"^1.17.1","pg":"^8.16.3"},"devDependencies":{"@types/node":"latest","@types/pg":"latest","tsx":"latest","typescript":"latest","vitest":"^4.0.18"},"engines":{"node":">=18"},"gitHead":"542484574a86c0baba1245889031ccad68faa879","_id":"@botler/1403-form-filler-module@1.3.1","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-XN4YP88IuTVgM7F7OPaMIlVCftYi2/su6jUo3iC0OwSMJ+pvmA4lboP/ENrQWpWFDOHfDzLMgGjiKYEZNdXpXA==","shasum":"9728af338413a2ba38dcac2636f94d9b071f2418","tarball":"https://registry.npmjs.org/@botler/1403-form-filler-module/-/1403-form-filler-module-1.3.1.tgz","fileCount":165,"unpackedSize":808817,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCKRGim+N3n17f4S1baBPiwA1iFT3w7yMb3t0JUn4B+LQIgFg5a3hgWzCRu3gpaLvfqdGpdM9sYykIEYmlJLvigCwM="}]},"_npmUser":{"name":"amirmorv","email":"amir@botler.ai"},"directories":{},"maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/1403-form-filler-module_1.3.1_1772052089873_0.6150900138730424"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-07T19:19:44.606Z","modified":"2026-02-25T20:41:30.228Z","1.0.0":"2026-02-07T19:19:44.826Z","1.0.1":"2026-02-07T20:45:54.508Z","1.0.2":"2026-02-07T20:56:26.720Z","1.0.3":"2026-02-07T21:04:41.682Z","1.1.0":"2026-02-07T22:31:57.581Z","1.2.0":"2026-02-09T22:36:00.947Z","1.2.1":"2026-02-09T23:10:16.719Z","1.2.2":"2026-02-09T23:23:41.728Z","1.2.3":"2026-02-10T14:11:55.622Z","1.2.4":"2026-02-12T12:56:35.699Z","1.3.0":"2026-02-16T14:37:48.364Z","1.3.1":"2026-02-25T20:41:30.071Z"},"license":"UNLICENSED","description":"Fills Alberta Form 1403 PDFs for canvassers. Fetches data from Neon PostgreSQL, fills PDF form fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, and uploads to S3.","maintainers":[{"name":"amirmorv","email":"amir@botler.ai"}],"readme":"# @botler/1403-form-filler-module\n\nFills Alberta **Form 1403** PDFs for canvassers. Fetches data from Neon PostgreSQL, fills AcroForm fields, overlays cursive signatures, flattens to image-PDFs, merges per-batch, generates a CSV manifest of canvasser data, and uploads both to AWS S3.\n\nUsable as a **library** (`import { FormFiller }`) or as a **CLI** (`npx fill-1403 --all`).\n\n## Installation\n\n```bash\nnpm install @botler/1403-form-filler-module\n```\n\n> Requires `NPM_TOKEN` for the private `@botler` scope (see `.npmrc`).\n\n## Library usage\n\n### ESM (`.mjs` / `\"type\": \"module\"`)\n\n```js\nimport { FormFiller } from \"@botler/1403-form-filler-module\";\n\nconst filler = new FormFiller({\n   databaseUrl: process.env.WNC_TRACKING_DATABASE_URI,\n});\n\n// Single user\nconst result = await filler.fillForUser(\"user-abc-123\");\nconsole.log(result); // { success: true, userId: \"user-abc-123\", outputPath: \"...\" }\n\n// All open batches (fill → flatten → merge → S3 upload)\nconst results = await filler.fillAll();\n\n// Specific batch by ID (OPEN or FAILED batches only)\nconst batchResult = await filler.fillForBatch(\"clx1abc123\");\nconsole.log(batchResult); // { batchId, success, results, totalUsers, s3Key, ... }\n\n// Cleanup (closes DB pool if we created it)\nawait filler.destroy();\n```\n\n### CJS (`require`)\n\n```js\nconst { FormFiller } = require(\"@botler/1403-form-filler-module\");\n\nconst filler = new FormFiller({\n   databaseUrl: process.env.WNC_TRACKING_DATABASE_URI,\n});\n```\n\n### Bring your own Pool\n\nIf your app already has a `pg.Pool` connected to the same database,\npass it in to avoid creating a second connection pool:\n\n```js\nimport { FormFiller } from \"@botler/1403-form-filler-module\";\nimport pg from \"pg\";\n\nconst pool = new pg.Pool({\n   connectionString: process.env.WNC_TRACKING_DATABASE_URI,\n});\n\nconst filler = new FormFiller({ pool });\nconst result = await filler.fillForUser(\"user-abc-123\");\n\n// When pool is injected, destroy() does NOT close it — you manage its lifecycle\nawait filler.destroy();\n```\n\n## `FormFillerConfig` reference\n\nAll fields are optional — sensible defaults are applied.\n\n| Field                    | Type              | Default                                           |\n| ------------------------ | ----------------- | ------------------------------------------------- |\n| `pool`                   | `pg.Pool`         | —                                                 |\n| `databaseUrl`            | `string`          | `TEAM_DATABASE_URL` → `WNC_TRACKING_DATABASE_URI` |\n| `templatePath`           | `string`          | `\"s3://coal-forms/1403-template.pdf\"`             |\n| `outputDirectory`        | `string`          | `\"temp/filled-forms\"`                             |\n| `signatureConfig`        | `SignatureConfig` | Great Vibes cursive, 60px, black                  |\n| `proponentName`          | `string`          | `\"Corby Lund\"`                                    |\n| `proponentSignatureText` | `string`          | `\"Corby Lund\"`                                    |\n| `petitionText`           | `string`          | `\"No New Coal Mining in the Eastern Slopes…\"`     |\n| `s3Bucket`               | `string`          | `\"coal-forms\"`                                    |\n| `s3KeyPrefix`            | `string`          | `\"batches/1403\"`                                  |\n| `batchSize`              | `number`          | `10`                                              |\n| `dryRun`                 | `boolean`         | `false`                                           |\n| `skipExisting`           | `boolean`         | `true`                                            |\n| `keepTemp`               | `boolean`         | `false`                                           |\n\n## Public API\n\n```ts\nclass FormFiller {\n   constructor(config?: FormFillerConfig);\n\n   /** Fill + flatten the form for a single user */\n   fillForUser(userId: string): Promise<ProcessingResult>;\n\n   /** Fill + flatten for multiple users */\n   fillForUsers(userIds: string[]): Promise<ProcessingResult[]>;\n\n   /** Process all open EA batches (fill → merge → S3) */\n   fillAll(): Promise<ProcessingResult[]>;\n\n   /** Process a specific batch by ID (OPEN or FAILED only) */\n   fillForBatch(batchId: string): Promise<BatchFillResult>;\n\n   /** Release DB pool (no-op if pool was injected) */\n   destroy(): Promise<void>;\n}\n```\n\n### `BatchFillResult`\n\n```ts\ninterface BatchFillResult {\n   batchId: string;\n   success: boolean;\n   results: ProcessingResult[];\n   totalUsers: number;\n   successfulCount: number;\n   failedCount: number;\n   s3Key?: string;\n   csvS3Key?: string;\n   error?: string;\n}\n```\n\n## CLI usage\n\n```bash\n# Via npx (after install)\nnpx fill-1403 --all\nnpx fill-1403 --batch-id=clx1abc123\n\n# Or during development\nnpx tsx src/cli.ts --id=<userId>\nnpx tsx src/cli.ts --ids=id1,id2,id3\nnpx tsx src/cli.ts --all --dry-run\nnpx tsx src/cli.ts --batch-id=<batchId>\n```\n\n| Flag                | Description                                             |\n| ------------------- | ------------------------------------------------------- |\n| `--id <userId>`     | Process a single user by ID                             |\n| `--ids <id1,id2,…>` | Process multiple users (comma-separated)                |\n| `--all`             | Process all users from open EA submission batches       |\n| `--batch-id <ID>`   | Process a specific EA submission batch by ID            |\n| `--dry-run`         | Preview what would be processed without generating PDFs |\n| `--skip-existing`   | Skip users whose PDF already exists (default: `true`)   |\n| `--batch-size <N>`  | Records per processing batch (default: `10`)            |\n| `--keep-temp`       | Keep per-user PDF files after batch merge + S3 upload   |\n| `--help`            | Show help                                               |\n\n## Environment variables\n\n| Variable                    | Required | Description                                           |\n| --------------------------- | -------- | ----------------------------------------------------- |\n| `TEAM_DATABASE_URL`         |          | Neon PostgreSQL connection string (primary)           |\n| `WNC_TRACKING_DATABASE_URI` |          | Fallback Neon connection string (same DB)             |\n| `AWS_S3_ACCESS_KEY_ID`      | ✅       | AWS access key for S3 uploads                         |\n| `AWS_S3_SECRET_ACCESS_KEY`  | ✅       | AWS secret key for S3 uploads                         |\n| `AWS_S3_REGION`             |          | AWS region (default: `ca-central-1`)                  |\n| `LOG_LEVEL`                 |          | `debug`, `info`, `warn`, or `error` (default: `info`) |\n\n> When used as a library, pass `databaseUrl` or `pool` in `FormFillerConfig` instead.\n\n## Project structure\n\n```\nform-filler-module/\n├── src/\n│   ├── index.ts                  # Library barrel (public API exports)\n│   ├── form-filler.ts            # FormFiller class (library core)\n│   ├── cli.ts                    # CLI entry point (dotenv, arg parsing)\n│   ├── config.ts                 # CLI argument parsing & validation\n│   ├── canvasser-data-mapper.ts  # Maps DB profile → PDF filler data\n│   ├── types/\n│   │   ├── config.ts             # FormFillerConfig, ScriptConfig, etc.\n│   │   ├── db-tables.ts          # Database table interfaces & enums\n│   │   ├── canvasser-profile.ts  # CanvasserProfile interface\n│   │   └── index.ts\n│   ├── shared/\n│   │   └── logger.ts             # Console logger with level filtering\n│   ├── csv-exporter/             # CSV manifest generator\n│   │   ├── exporter.ts           # CsvExporter class (csv-stringify/sync)\n│   │   ├── types.ts              # CsvRow, CsvExportResult\n│   │   └── index.ts\n│   ├── pdf-filler/               # Vendored PDF form filler library\n│   ├── pdf-converter/            # MuPDF WASM page rasteriser\n│   ├── pdf-merger/               # pdf-lib page concatenation\n│   ├── s3/                       # S3 batch uploader (PDF + CSV)\n│   └── db/                       # Neon PostgreSQL pool & queries\n│       ├── pool.ts               # getPool / setPool / closePool\n│       ├── queries.ts\n│       └── index.ts\n├── templates/\n│   └── 1403-template.pdf              # Form 1403 template (also on S3)\n├── dist/                         # Built output (published to npm)\n├── package.json\n├── tsconfig.json\n├── .npmrc\n└── .env.example\n```\n\n## CSV manifest export\n\nWhen processing a batch (`fillForBatch()` or `fillAll()`), the module automatically generates a **CSV manifest** containing the canvasser data used to fill each PDF in the batch.\n\n### What's in the CSV?\n\nEach row corresponds to one canvasser whose form was successfully filled:\n\n| Column                   | Description                                            |\n| ------------------------ | ------------------------------------------------------ |\n| Surname                  | Canvasser's last name                                  |\n| Given Name               | Canvasser's first name                                 |\n| Middle Name              | Middle name (may be empty)                             |\n| Telephone Number         | Formatted phone number                                 |\n| Email Address            | Email (may be empty)                                   |\n| Physical Address         | Residential street address                             |\n| Physical Municipality    | City/town of physical address                          |\n| Physical Postal Code     | Postal code of physical address                        |\n| Mailing Address          | Mailing street address (empty if same as physical)     |\n| Mailing Municipality     | City/town of mailing address                           |\n| Mailing Postal Code      | Postal code of mailing address                         |\n| Canvasser Signature Date | Date canvasser signed (ISO `YYYY-MM-DD`, may be empty) |\n| Proponent Name           | Proponent name on the form                             |\n| Proponent Signature Date | Date proponent signed (ISO `YYYY-MM-DD`, may be empty) |\n\n### S3 storage\n\nThe CSV is uploaded to the **same S3 prefix** as the merged PDF, using the **same batch ID** but with a `.csv` extension:\n\n```\ns3://coal-forms/batches/1403/{batchId}.pdf   ← merged batch PDF\ns3://coal-forms/batches/1403/{batchId}.csv   ← canvasser data manifest\n```\n\nThe CSV S3 key is returned in `BatchFillResult.csvS3Key`.\n\n### Programmatic usage\n\nThe `CsvExporter` class can also be used standalone:\n\n```ts\nimport { CsvExporter } from \"@botler/1403-form-filler-module\";\n\nconst exporter = new CsvExporter();\nexporter.addRow(canvasserData);\n\nconst csvString = exporter.toCSV(); // in-memory string\nawait exporter.writeToFile(\"/tmp/manifest.csv\"); // write to disk\n```\n\n## Development\n\n```bash\n# Type-check\nnpm run typecheck\n\n# Build to dist/\nnpm run build\n\n# Run CLI in dev\nnpx tsx src/cli.ts --all\n```\n\n## Publishing\n\n```bash\n# Ensure NPM_TOKEN is set\nexport NPM_TOKEN=npm_...\n\n# Build + publish\nnpm publish --access restricted\n```\n\n## License\n\nPrivate — internal use only.\n","readmeFilename":"README.md"}