{"_id":"@australiangreens/ag-backend-components","_rev":"8-420f059a6ad203b87bd405174cc4f6de","name":"@australiangreens/ag-backend-components","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@australiangreens/ag-backend-components","version":"0.1.0","author":{"name":"The Australian Greens","email":"webops@greens.org.au"},"license":"UNLICENSED","_id":"@australiangreens/ag-backend-components@0.1.0","maintainers":[{"name":"ineffyble","email":"dev@effy.is"},{"name":"anthonyblond","email":"anthony@unfinishedteleporter.com"},{"name":"johntwyman","email":"john.twyman@greens.org.au"},{"name":"lukek-ag","email":"luke.kugelman@greens.org.au"},{"name":"peterkmurphy-ag","email":"peter.murphy@greens.org.au"}],"homepage":"https://bitbucket.org/australian_greens/ag-backend-components#readme","bugs":{"url":"https://bitbucket.org/australian_greens/ag-backend-components/issues"},"dist":{"shasum":"2178f726c83678a4a39838ddd8f087538bc0e7aa","tarball":"https://registry.npmjs.org/@australiangreens/ag-backend-components/-/ag-backend-components-0.1.0.tgz","fileCount":44,"integrity":"sha512-0AFLsVxOy4jdvTVR4+AuSXnvJUlvhDN6fwNmVNblzXtEQIEfehZjhVx/wOMutXMJQMOA5zWkL9Zrj8K1SwtwiA==","signatures":[{"sig":"MEQCIBHPL1sn3B/oebG6LIk0KYMB+7O00CHOX/Gg5dZiwYhmAiASF5HPcQ4Bx7DktuTj1EowpWVj/Kye7qiXqI/YNgQOvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37552},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"3e6b3f210e31bfad49c9f9bb2d5b2f5c870ed329","private":false,"scripts":{"lint":"eslint src","test":"node --import=specifier-resolution-node/register node_modules/jest/bin/jest.js --runInBand","build":"tsc --build","prepare":"husky install || true","test:watch":"pnpm run test --watch","build:force":"tsc --build --force","test:coverage":"pnpm run test --coverage","prepublishOnly":"tsc --build --clean && tsc --build"},"_npmUser":{"name":"johntwyman","email":"john.twyman@greens.org.au"},"repository":{"url":"git+ssh://git@bitbucket.org/australian_greens/ag-backend-components.git","type":"git"},"_npmVersion":"11.6.1","description":"Shared backend components for Australian Greens backend applications","directories":{},"_nodeVersion":"24.10.0","dependencies":{"axios":"^1.6.0","@australiangreens/ag-error":"^0.1.7"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^8.0.3","eslint":"^9.0.0","ts-jest":"^29.1.2","prettier":"^2.8.1","jest-mock":"^29.7.0","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^22.0.0","jest-extended":"^4.0.1","typescript-eslint":"^8.0.0","@typescript-eslint/parser":"^8.0.0","specifier-resolution-node":"^1.1.4","@australiangreens/ag-error-jest":"^0.1.9","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ag-backend-components_0.1.0_1772070560500_0.23618430597672213","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@australiangreens/ag-backend-components","version":"0.2.0","author":{"name":"The Australian Greens","email":"webops@greens.org.au"},"license":"UNLICENSED","_id":"@australiangreens/ag-backend-components@0.2.0","maintainers":[{"name":"ineffyble","email":"dev@effy.is"},{"name":"anthonyblond","email":"anthony@unfinishedteleporter.com"},{"name":"johntwyman","email":"john.twyman@greens.org.au"},{"name":"lukek-ag","email":"luke.kugelman@greens.org.au"},{"name":"peterkmurphy-ag","email":"peter.murphy@greens.org.au"}],"homepage":"https://bitbucket.org/australian_greens/ag-backend-components#readme","bugs":{"url":"https://bitbucket.org/australian_greens/ag-backend-components/issues"},"dist":{"shasum":"3bf4ab0c123d28fa5c90a75fd2968dccdc4e84f4","tarball":"https://registry.npmjs.org/@australiangreens/ag-backend-components/-/ag-backend-components-0.2.0.tgz","fileCount":74,"integrity":"sha512-pMLlEzZREmHA9qEMoZonEkqszu/sEIQ+SK7gm868TruQfhgkmU0vY9Wsw6iDQQGUA5doM0/ACD/olUqKbydWXA==","signatures":[{"sig":"MEYCIQCrUkXxkplWvvuB3gftx6RtWgPujrd3hO1kkRVp3bjUqAIhAN1mGcNhGCVzvHDlPt9M1+lzeaVlcV42sN+nS749oYbe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67816},"main":"./dist/cjs/index.js","type":"module","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"gitHead":"c66216363ba90e6d1b62bd539fa6d5082b48cfac","private":false,"scripts":{"lint":"eslint src","test":"node --import=specifier-resolution-node/register node_modules/jest/bin/jest.js --runInBand","build":"pnpm build:esm && pnpm build:cjs && sh ./fixup.sh","prepare":"husky install || true","build:cjs":"tsc --project tsconfig.cjs.json","build:esm":"tsc --project tsconfig.json","test:watch":"pnpm run test --watch","build:force":"rm -rf dist && pnpm build","test:coverage":"pnpm run test --coverage","prepublishOnly":"pnpm build:force"},"_npmUser":{"name":"johntwyman","email":"john.twyman@greens.org.au"},"repository":{"url":"git+ssh://git@bitbucket.org/australian_greens/ag-backend-components.git","type":"git"},"_npmVersion":"11.5.2","description":"Shared backend components for Australian Greens backend applications","directories":{},"_nodeVersion":"22.17.0","dependencies":{"axios":"^1.6.0","@australiangreens/ag-error":"^0.1.7"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^8.0.3","eslint":"^9.0.0","ts-jest":"^29.1.2","prettier":"^2.8.1","jest-mock":"^29.7.0","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^22.0.0","jest-extended":"^4.0.1","typescript-eslint":"^8.0.0","@typescript-eslint/parser":"^8.0.0","specifier-resolution-node":"^1.1.4","@australiangreens/ag-error-jest":"^0.1.9","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ag-backend-components_0.2.0_1772074504752_0.6992896480955275","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@australiangreens/ag-backend-components","version":"0.2.2","author":{"name":"The Australian Greens","email":"webops@greens.org.au"},"license":"UNLICENSED","_id":"@australiangreens/ag-backend-components@0.2.2","maintainers":[{"name":"ineffyble","email":"dev@effy.is"},{"name":"anthonyblond","email":"anthony@unfinishedteleporter.com"},{"name":"johntwyman","email":"john.twyman@greens.org.au"},{"name":"australiangreens-cicd","email":"webops@greens.org.au"},{"name":"peterkmurphy-ag","email":"peter.murphy@greens.org.au"}],"homepage":"https://bitbucket.org/australian_greens/ag-backend-components#readme","bugs":{"url":"https://bitbucket.org/australian_greens/ag-backend-components/issues"},"dist":{"shasum":"935938e218418a97bb9bfdb75668ab5e8473d32b","tarball":"https://registry.npmjs.org/@australiangreens/ag-backend-components/-/ag-backend-components-0.2.2.tgz","fileCount":74,"integrity":"sha512-vLprtatWnW7BwYbEeQiYrAXQdEMwxYNOLxoVym2v+YVg0oGZOWoHjqQml90IiBjADA9inSGftDv/4+bv4lpxvA==","signatures":[{"sig":"MEYCIQCFzzkLeCmGTVw8glFpuT4BgntBnOOFBhRP/F5+TcRW3AIhAIG4fG9n7ylUhKQg3AWZfIH37vVE2vV/4j8mtdcOHibO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67859},"main":"./dist/cjs/index.js","type":"module","_from":"file:australiangreens-ag-backend-components-0.2.2.tgz","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"private":false,"scripts":{"lint":"eslint src","ship":"pnpm test && pnpm lint && pnpm publish --no-git-checks","test":"node --import=specifier-resolution-node/register node_modules/jest/bin/jest.js --runInBand","build":"pnpm build:esm && pnpm build:cjs && sh scripts/fixup.sh","release":"node scripts/release.js","build:cjs":"tsc --project tsconfig.cjs.json","build:esm":"tsc --project tsconfig.json","test:watch":"pnpm run test --watch","build:force":"rm -rf dist && pnpm build","test:coverage":"pnpm run test --coverage"},"_npmUser":{"name":"johntwyman","email":"john.twyman@greens.org.au"},"_resolved":"/tmp/50c657c99a17103a6c185403801c7861/australiangreens-ag-backend-components-0.2.2.tgz","_integrity":"sha512-vLprtatWnW7BwYbEeQiYrAXQdEMwxYNOLxoVym2v+YVg0oGZOWoHjqQml90IiBjADA9inSGftDv/4+bv4lpxvA==","repository":{"url":"git+ssh://git@bitbucket.org/australian_greens/ag-backend-components.git","type":"git"},"_npmVersion":"11.5.2","description":"Shared backend components for Australian Greens backend applications","directories":{},"_nodeVersion":"22.17.0","dependencies":{"axios":"^1.6.0","@australiangreens/ag-error":"^0.1.7"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","husky":"^8.0.3","eslint":"^9.0.0","ts-jest":"^29.1.2","prettier":"^2.8.1","jest-mock":"^29.7.0","typescript":"^5.4.5","@types/jest":"^29.5.12","@types/node":"^22.0.0","jest-extended":"^4.0.1","typescript-eslint":"^8.0.0","@typescript-eslint/parser":"^8.0.0","specifier-resolution-node":"^1.1.4","@australiangreens/ag-error-jest":"^0.1.9","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ag-backend-components_0.2.2_1772085270759_0.7427126254902714","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@australiangreens/ag-backend-components","version":"0.3.0","author":{"name":"The Australian Greens","email":"webops@greens.org.au"},"license":"UNLICENSED","_id":"@australiangreens/ag-backend-components@0.3.0","maintainers":[{"name":"ineffyble","email":"dev@effy.is"},{"name":"anthonyblond","email":"anthony@unfinishedteleporter.com"},{"name":"johntwyman","email":"john.twyman@greens.org.au"},{"name":"australiangreens-cicd","email":"webops@greens.org.au"},{"name":"peterkmurphy-ag","email":"peter.murphy@greens.org.au"}],"homepage":"https://bitbucket.org/australian_greens/ag-backend-components#readme","bugs":{"url":"https://bitbucket.org/australian_greens/ag-backend-components/issues"},"dist":{"shasum":"9392f8e71c734b49834937469c6034d2332b508b","tarball":"https://registry.npmjs.org/@australiangreens/ag-backend-components/-/ag-backend-components-0.3.0.tgz","fileCount":74,"integrity":"sha512-IMRu1XSmrLhF+yFwi/tMInMwQKYEE/o2us84IVMm1QeJzaV06g/oEiuIqKwTt2VPaNZEjsxh1UtBXXQo9V7AWw==","signatures":[{"sig":"MEQCIB6BMy0NiyqLz8yk/FdOUllUY+DarPNAWGDoZsPvJxmPAiBLXSllEYEtKUCm2LCkBAH4mgKH408qy+8y3get/yh2KQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67830},"main":"./dist/cjs/index.js","type":"module","_from":"file:australiangreens-ag-backend-components-0.3.0.tgz","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=24"},"exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"private":false,"scripts":{"lint":"eslint --max-warnings 0 src","ship":"pnpm publish --no-git-checks","test":"jest --runInBand","build":"pnpm build:esm && pnpm build:cjs && sh ./fixup.sh","release":"node scripts/release.js","build:cjs":"tsc --project tsconfig.cjs.json","build:esm":"tsc --project tsconfig.json","test:watch":"pnpm run test --watch","build:force":"rm -rf dist && pnpm build","test:coverage":"pnpm run test --coverage"},"_npmUser":{"name":"peterkmurphy-ag","email":"peter.murphy@greens.org.au"},"_resolved":"/tmp/387926eb307f3c28399d993999862eb7/australiangreens-ag-backend-components-0.3.0.tgz","_integrity":"sha512-IMRu1XSmrLhF+yFwi/tMInMwQKYEE/o2us84IVMm1QeJzaV06g/oEiuIqKwTt2VPaNZEjsxh1UtBXXQo9V7AWw==","repository":{"url":"git+ssh://git@bitbucket.org/australian_greens/ag-backend-components.git","type":"git"},"_npmVersion":"11.17.0","description":"Shared backend components for Australian Greens backend applications","directories":{},"_nodeVersion":"24.19.0","dependencies":{"axios":"^1.6.0","@australiangreens/ag-error":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","husky":"^8.0.3","eslint":"^9.36.0","ts-jest":"^29.4.0","prettier":"^2.8.1","jest-mock":"^30.0.0","typescript":"^6.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","jest-extended":"^6.0.0","typescript-eslint":"^8.0.0","@australiangreens/ag-error-jest":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ag-backend-components_0.3.0_1786433982557_0.26432972963717516","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@australiangreens/ag-backend-components","version":"0.3.1","author":{"name":"The Australian Greens","email":"webops@greens.org.au"},"license":"UNLICENSED","_id":"@australiangreens/ag-backend-components@0.3.1","maintainers":[{"name":"ineffyble","email":"dev@effy.is"},{"name":"anthonyblond","email":"anthony@unfinishedteleporter.com"},{"name":"johntwyman","email":"john.twyman@greens.org.au"},{"name":"australiangreens-cicd","email":"webops@greens.org.au"},{"name":"peterkmurphy-ag","email":"peter.murphy@greens.org.au"}],"homepage":"https://bitbucket.org/australian_greens/ag-backend-components#readme","bugs":{"url":"https://bitbucket.org/australian_greens/ag-backend-components/issues"},"dist":{"shasum":"cd4c3da6d779f93632d09f223b11628a74be1752","tarball":"https://registry.npmjs.org/@australiangreens/ag-backend-components/-/ag-backend-components-0.3.1.tgz","fileCount":74,"integrity":"sha512-HOccu/Jwl7MPEgpd3jIKl7EKkshjHiP/WSVICuh2ne3IsW1+XqhCtYkrlOargg73aCpTH/Nc35GLkSH0h6Ey5g==","signatures":[{"sig":"MEUCIBcJMcV8tw/vxPkVERXqAxeeJnMUsYM5lKGzKhPKF9atAiEAxyztHNs32Y6Ru0lGeXSIl7Du5RV5y6jYJSKz6DYCUKM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67839},"main":"./dist/cjs/index.js","type":"module","_from":"file:australiangreens-ag-backend-components-0.3.1.tgz","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=24"},"exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"}},"private":false,"scripts":{"lint":"eslint --max-warnings 0 src","ship":"pnpm publish --no-git-checks","test":"jest --runInBand","build":"pnpm build:esm && pnpm build:cjs && sh ./fixup.sh","release":"node scripts/release.js","build:cjs":"tsc --project tsconfig.cjs.json","build:esm":"tsc --project tsconfig.build.json","test:watch":"pnpm run test --watch","build:force":"rm -rf dist && pnpm build","test:coverage":"pnpm run test --coverage"},"_npmUser":{"name":"peterkmurphy-ag","email":"peter.murphy@greens.org.au"},"_resolved":"/tmp/05753461a4381a649b49b27bca7687a7/australiangreens-ag-backend-components-0.3.1.tgz","_integrity":"sha512-HOccu/Jwl7MPEgpd3jIKl7EKkshjHiP/WSVICuh2ne3IsW1+XqhCtYkrlOargg73aCpTH/Nc35GLkSH0h6Ey5g==","repository":{"url":"git+ssh://git@bitbucket.org/australian_greens/ag-backend-components.git","type":"git"},"_npmVersion":"11.17.0","description":"Shared backend components for Australian Greens backend applications","directories":{},"_nodeVersion":"24.19.0","dependencies":{"axios":"^1.19.0","@australiangreens/ag-error":"^0.2.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","husky":"^9.1.7","eslint":"^9.39.5","ts-jest":"^29.4.12","prettier":"^3.9.6","jest-mock":"^30.0.0","typescript":"^6.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","jest-extended":"^7.0.0","typescript-eslint":"^8.67.0","@australiangreens/ag-error-jest":"^0.3.1"},"_npmOperationalInternal":{"tmp":"tmp/ag-backend-components_0.3.1_1786582872595_0.42108370770775694","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@australiangreens/ag-backend-components","version":"0.4.0","description":"Shared backend components for Australian Greens backend applications","repository":{"type":"git","url":"git+ssh://git@bitbucket.org/australian_greens/ag-backend-components.git"},"author":{"name":"The Australian Greens","email":"webops@greens.org.au"},"license":"UNLICENSED","private":false,"type":"module","main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/esm/index.d.ts","exports":{".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"}},"engines":{"node":">=24"},"dependencies":{"@australiangreens/ag-error":"^0.4.0","axios":"^1.19.0"},"devDependencies":{"@australiangreens/ag-error-jest":"^0.4.0","@types/node":"^24.0.0","@vitest/coverage-v8":"^4.1.10","eslint":"^10.8.1","husky":"^9.1.7","jest-extended":"^7.0.0","prettier":"^3.9.6","typescript":"^6.0.0","typescript-eslint":"^8.67.0","vitest":"^4.1.10"},"scripts":{"build:esm":"tsc --project tsconfig.build.json","build:cjs":"tsc --project tsconfig.cjs.json","build":"pnpm build:esm && pnpm build:cjs && sh ./fixup.sh","build:force":"rm -rf dist && pnpm build","lint":"eslint --max-warnings 0 src","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","release":"node scripts/release.js","ship":"pnpm publish --no-git-checks"},"_id":"@australiangreens/ag-backend-components@0.4.0","bugs":{"url":"https://bitbucket.org/australian_greens/ag-backend-components/issues"},"homepage":"https://bitbucket.org/australian_greens/ag-backend-components#readme","_integrity":"sha512-Xpg0RiZfcMP9xQJNa8Olf5At+5i331ZEs+0+ChZGh9Pltfoywnbt9fSOnDTHUVd5f/kcaw5DUJ2QFY9ojUKnwg==","_resolved":"/tmp/8fbf22d0d4d6e47b3e9f1e2faf7a2f0a/australiangreens-ag-backend-components-0.4.0.tgz","_from":"file:australiangreens-ag-backend-components-0.4.0.tgz","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-Xpg0RiZfcMP9xQJNa8Olf5At+5i331ZEs+0+ChZGh9Pltfoywnbt9fSOnDTHUVd5f/kcaw5DUJ2QFY9ojUKnwg==","shasum":"1c20820a951ba3c67265c1023943b08785fac808","tarball":"https://registry.npmjs.org/@australiangreens/ag-backend-components/-/ag-backend-components-0.4.0.tgz","fileCount":74,"unpackedSize":67770,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG8odsgC9zlsxOIMamKRVZHNtd3/HEEOuAoZqWpJet7JAiEAlPJRLV45qT35CbzJSBXu1V/RCckTIah3Vb1TTHzEvVw="}]},"_npmUser":{"name":"peterkmurphy-ag","email":"peter.murphy@greens.org.au"},"directories":{},"maintainers":[{"name":"ineffyble","email":"dev@effy.is"},{"name":"anthonyblond","email":"anthony@unfinishedteleporter.com"},{"name":"johntwyman","email":"john.twyman@greens.org.au"},{"name":"australiangreens-cicd","email":"webops@greens.org.au"},{"name":"peterkmurphy-ag","email":"peter.murphy@greens.org.au"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ag-backend-components_0.4.0_1786927720821_0.8459214535721522"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-26T01:49:20.414Z","modified":"2026-08-17T00:48:41.120Z","0.1.0":"2026-02-26T01:49:20.648Z","0.2.0":"2026-02-26T02:55:04.912Z","0.2.2":"2026-02-26T05:54:30.894Z","0.3.0":"2026-08-11T07:39:42.702Z","0.3.1":"2026-08-13T01:01:12.740Z","0.4.0":"2026-08-17T00:48:40.959Z"},"bugs":{"url":"https://bitbucket.org/australian_greens/ag-backend-components/issues"},"author":{"name":"The Australian Greens","email":"webops@greens.org.au"},"license":"UNLICENSED","homepage":"https://bitbucket.org/australian_greens/ag-backend-components#readme","repository":{"type":"git","url":"git+ssh://git@bitbucket.org/australian_greens/ag-backend-components.git"},"description":"Shared backend components for Australian Greens backend applications","maintainers":[{"name":"ineffyble","email":"dev@effy.is"},{"name":"anthonyblond","email":"anthony@unfinishedteleporter.com"},{"name":"johntwyman","email":"john.twyman@greens.org.au"},{"name":"australiangreens-cicd","email":"webops@greens.org.au"},{"name":"peterkmurphy-ag","email":"peter.murphy@greens.org.au"}],"readme":"# @australiangreens/ag-backend-components\n\nShared backend components for Australian Greens applications that integrate with the CiviCRM API. This library provides the connection layer (API client, types, errors, and caching utilities) so multiple backends can reuse the same plumbing without duplicating code.\n\n## Installation\n\n```bash\npnpm add @australiangreens/ag-backend-components\n```\n\nOr with npm:\n\n```bash\nnpm install @australiangreens/ag-backend-components\n```\n\nRequires Node.js 24+ and TypeScript. The package is published to npmjs.\n\n## Releasing\n\n```sh\nnvm use\npnpm release minor   # or patch | major\npnpm ship\n```\n\n`prepublishOnly` runs lint, tests, and a clean build before publish.\n\n## Usage\n\nCreate a CiviCRM API client at app startup by passing your config (the library does not read environment variables):\n\n```typescript\nimport {\n  createCiviClient,\n  PreloadDataCache,\n  GenericPromiseCache,\n} from '@australiangreens/ag-backend-components';\n\n// One-time setup\nconst civiApiV4 = createCiviClient({\n  civicrmApiBase: 'https://civi.example.org/civicrm/ajax/api4',\n  civicrmApiKey: process.env.CIVICRM_API_KEY!,\n  civicrmSiteKey: process.env.CIVICRM_SITE_KEY!,\n  // Optional: only needed for user-authenticated (JWT) calls\n  civicrmUserApiBase: 'https://civi-{domainCode}.example.org/civicrm/ajax/api4',\n});\n\n// Call the API (key-based auth)\nconst result = await civiApiV4('Contact', 'get', {\n  select: ['id', 'display_name'],\n  limit: 10,\n});\nconsole.log(result.values);\n\n// Optional: user-scoped call with JWT\nconst userResult = await civiApiV4('Contact', 'get', {}, {\n  userAuth: { jwt: userJwt, domainCode: 'wa' },\n});\n```\n\nSee [ARCHITECTURE.md](./ARCHITECTURE.md) for full API details, error handling, and migration from existing backends.\n\n## Main exports\n\n\n| Export                                                                                                                                               | Description                                                                             |\n| ---------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |\n| `createCiviClient(config)`                                                                                                                           | Factory that returns a `civiApiV4(entity, action, params?, options?)` function.         |\n| `CiviClientConfig`, `CiviUserAuth`, `CiviApiV4Options`                                                                                               | Config and option types for the client.                                                 |\n| `CiviEntity`, `CiviEntityAction`, `CiviApiJsonObj`, `RawCiviResponse`                                                                                | Types for API calls and responses.                                                      |\n| `CiviApiError`, `CiviApiAxiosError`, `CiviApiAuth0JwtError`, `CiviApiAuthXRejectionError`, `CiviApiDomainUserPermissionError`, `CiviApiRawHTMLError` | Error classes for handling CiviCRM and auth failures.                                   |\n| `PreloadDataCache<T>`                                                                                                                                | Write-once cache for reference data, with lookup by `id` and optional extra key fields. |\n| `GenericPromiseCache<T>`                                                                                                                             | TTL cache that deduplicates in-flight requests for the same key.                        |\n\n\n## Minimal example\n\n```typescript\nimport { createCiviClient } from '@australiangreens/ag-backend-components';\n\nconst civiApiV4 = createCiviClient({\n  civicrmApiBase: 'https://civi.example.org/civicrm/ajax/api4',\n  civicrmApiKey: 'your-api-key',\n  civicrmSiteKey: 'your-site-key',\n});\n\nconst { values } = await civiApiV4('Event', 'get', { select: ['id', 'title'], limit: 5 });\n```\n\nErrors are thrown as subclasses of `CiviApiError`; you can catch and handle them by type (e.g. `CiviApiAuthXRejectionError` for 401, `CiviApiDomainUserPermissionError` for 403).","readmeFilename":"README.md"}