{"_id":"hierarchical-approval","_rev":"44-9ea6684ea0e8353e4b952984922f8db7","name":"hierarchical-approval","dist-tags":{"latest":"4.0.7"},"versions":{"0.1.0":{"name":"hierarchical-approval","version":"0.1.0","keywords":["approval","workflow","erp","hierarchical","typescript"],"author":"","license":"MIT","_id":"hierarchical-approval@0.1.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"dist":{"shasum":"28d28fc2fb3123ef651014ca55203d2defadd2ef","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.1.0.tgz","fileCount":30,"integrity":"sha512-KWi+6LvwG0msP9xS6cJeJ1gjs+O6xlNKqijnnN3FMkGKDRqyHx/zDQUZ4lpzhGRDzJobb91P9FQeKk7P8KT1bA==","signatures":[{"sig":"MEUCIQD5ce4Ix4d8dzsOK4wKcQxomls6BHloDYvOLEn7iafeDQIgMZZhAm+UZxvsy1N2DSmbls9bf75cLcK1tbCkRa6yHf4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1231752},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"}},"scripts":{"dev":"tsup --watch","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"matthewswong","email":"matthewswong2610@gmail.com"},"_npmVersion":"11.16.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8"},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.1.0_1782019035375_0.17676427516680726","host":"s3://npm-registry-packages-npm-production"},"peerDependenciesOptional":{"pg":true}},"0.1.1":{"name":"hierarchical-approval","version":"0.1.1","keywords":["approval","workflow","erp","hierarchical","typescript"],"author":"","license":"MIT","_id":"hierarchical-approval@0.1.1","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"dist":{"shasum":"01972c1f4eca710395d6cd634d4565f4ac61dc7e","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.1.1.tgz","fileCount":30,"integrity":"sha512-Z8IOqiqZ+QcVYjetv6N8R4UlkS5I4AGQ9SpgfJFjsXh3rqYPwWN4z+irczEL1CYdcqoZhZfJvtDWdi+T86FQ4w==","signatures":[{"sig":"MEYCIQD6vVZfYJG/B2RMbu8RvWw3hEvqva6624ULomPdr7fsoQIhAKYmwkToh3YZekJ0CmkNuaMCLMYBgL86SS4cTG3+Rr84","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1232862},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"}},"scripts":{"dev":"tsup --watch","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"matthewswong","email":"matthewswong2610@gmail.com"},"_npmVersion":"11.16.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8"},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.1.1_1782020492119_0.5242296646505831","host":"s3://npm-registry-packages-npm-production"},"peerDependenciesOptional":{"pg":true}},"0.2.0":{"name":"hierarchical-approval","version":"0.2.0","keywords":["approval","workflow","erp","hierarchical","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@0.2.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"664850c7773e8f91f4a01e3125a678a67e783ad0","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.2.0.tgz","fileCount":31,"integrity":"sha512-u+WAUiOkn5sM1AAvKlPXA+Ba6r2WKR9LhY4N03H1fM2G330/uQ6HfBM5Ro4nuhtmCYqKNgCf6twDJuHT16l5vg==","signatures":[{"sig":"MEUCIBdXcv5wwZDKEpjJPXxHBn9+arSkJE761bcL427gYesmAiEA6vY+Ek/vxjX8BanhuwzpwKUMbsxIjuiYQczS/Dh4m0k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1365392},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"}},"gitHead":"6c853f0c3efcd0041c2b27290f5a5146196e5f4a","scripts":{"dev":"tsup --watch","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.17.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8"},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.2.0_1782230598274_0.5597870470340525","host":"s3://npm-registry-packages-npm-production"},"peerDependenciesOptional":{"pg":true}},"0.2.1":{"name":"hierarchical-approval","version":"0.2.1","keywords":["approval","workflow","erp","hierarchical","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@0.2.1","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"0d4234496048b45287522393bfea0757ac862d45","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.2.1.tgz","fileCount":31,"integrity":"sha512-k/ZO1ucw3VBs5RBhqiEgnglif8T1XxQUaPfnGAgqmKrKX73Vl6cGRRdHzSH37q8AABsqrRGnylPLz/TpvvPyzA==","signatures":[{"sig":"MEQCICI7qopo65wSdEhjh2d+gVuNvis64kZh4M0yXdhKJHuWAiBmi+nSnuH1iOqELmQlcz61Iu7uNtqhS4/0zAIZzBg8tg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1369425},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"}},"gitHead":"cc0feae6b270c3566c766373b56a69eaa96165b3","scripts":{"dev":"tsup --watch","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.17.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8"},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.2.1_1782234386209_0.06948640200613476","host":"s3://npm-registry-packages-npm-production"},"peerDependenciesOptional":{"pg":true}},"0.3.0":{"name":"hierarchical-approval","version":"0.3.0","keywords":["approval","workflow","erp","hierarchical","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@0.3.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"d58f48de245305adca8ecd49adad6e95c92b5d98","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.3.0.tgz","fileCount":70,"integrity":"sha512-+JtY/8o7TrW4szjTcCfzWJHXft7JjPtJqy9R3HWu6gem8sUix3NyZ5hmzHkX5TezfAX2U7IdpgA+GOFOFdn0NQ==","signatures":[{"sig":"MEQCIG+/bx+uDhvdCiBjDWTPfOVmxp5/DkYfdlRq/L4LpM8QAiAmB8BBE/OjP2HT+oqUQL9KJ+gCwtGjVmHri0BajVpViA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1903611},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"30377f4913f63045e388b977218b498ace8246fa","scripts":{"dev":"tsup --watch","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.17.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8"},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.3.0_1782467231441_0.1462930886876861","host":"s3://npm-registry-packages-npm-production"},"peerDependenciesOptional":{"pg":true}},"0.3.1":{"name":"hierarchical-approval","version":"0.3.1","keywords":["approval","workflow","erp","hierarchical","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@0.3.1","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"abe6c53c5f2818fec1189e99110c06d7b9873120","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.3.1.tgz","fileCount":70,"integrity":"sha512-EFcCOQXszxz8OYqOJPYjFr7ZtSIpNXnDmzwiFYhq//bufwCrj9TzpdGbGYN1A+DisCkToZaTRNH981jJZYtIlQ==","signatures":[{"sig":"MEYCIQD/Dq/JlZh6XBrw3J40ehhQU1KT66Z5eZoeTqd5sLD0hAIhAPNli8Ef/Y1o4iJcIm4v340kcsH0jXxKhcR1I9mdonjW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1903745},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"d1ce7aa22cb5f1cd8699af2d36a89471f0efdd22","scripts":{"dev":"tsup --watch","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.17.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8"},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.3.1_1782467604652_0.7958147423689022","host":"s3://npm-registry-packages-npm-production"},"peerDependenciesOptional":{"pg":true}},"0.4.0":{"name":"hierarchical-approval","version":"0.4.0","keywords":["approval","workflow","erp","hierarchical","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@0.4.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"7d29467091b6632df9fb979a970e4aa4847a779e","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.4.0.tgz","fileCount":78,"integrity":"sha512-rz11N6c7DFlnFdiBLgT1EEeoZD4sdShVv0WMAaZEpL4ms1mx5Sm5Rl0f3omDH/1bAKLSJfGm9nZh58n/EzMz/g==","signatures":[{"sig":"MEQCICF6AElFj5OIqKdV5FV73V56bD85LWhe5IWi4M5xXk3gAiB3L0zSZt05RLtDvOGBTynw7SfC7LKlO7hG7s4TvhfrZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1979568},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"39e90f37251ca53e87e6257d0715d077146095c4","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.18.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8"},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.4.0_1784809029523_0.6008525367590274","host":"s3://npm-registry-packages-npm-production"},"peerDependenciesOptional":{"pg":true}},"0.5.0":{"name":"hierarchical-approval","version":"0.5.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@0.5.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"deb7f2b0c2b3119b86421ee60d8a2f47bd77ad64","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.5.0.tgz","fileCount":84,"integrity":"sha512-3a+EI3sHo6CL4eiAZ9WGPQC/3gTysxnlM6Cznud1Qq0K9oReemdzet6l5KcpV0gD8Wc5BxfUemosrkfh6WIvog==","signatures":[{"sig":"MEUCIQCsg5XR6hszVz9THIVCHUo/d85cxiV/Al2RAOtzVUQlegIgXkCcKKkKPKvkruUg+sJ2x3FgaWxmfMgkXhlWR9SYrC8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2498437},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"1f93027f5eb7aec272cb8c1c3d1e08528a7495db","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.18.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.5.0_1784816831758_0.17026238349420786","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"hierarchical-approval","version":"0.6.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@0.6.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"ffeaf9e4065e1a0a1ac251f2152ac8a6b1ae29cd","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.6.0.tgz","fileCount":98,"integrity":"sha512-B/zDqrl9BkexrXtP1dcgohSULrAJByXiajUfZN/8onphYX9Wa0HcfW0++PLl/efD+r7QOI7wcncHAMNx06g7tg==","signatures":[{"sig":"MEYCIQCHTAe0br6FU+yLo0anEVSyyOPVXdxisHsJgyfXNrDSHgIhAIUl+5DDzYinorM5Tqd+7QRhEGuzNsdw8Wsi8bAzI6WR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2879051},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"30860b4d46759a1bbda5f04b482670d0eb349469","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.6.0_1787315087895_0.8554645799818086","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"hierarchical-approval","version":"0.7.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@0.7.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"b81144791ce9d99b3afab8716f28826ed8e4e5df","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.7.0.tgz","fileCount":98,"integrity":"sha512-6OORAPb0Ybj3tftir8tMVvDYhR21Pa5KA9P0lYpoit7o/c4dfhu9rleHypeMnwPLjy6FyL2yL8U96wyqHS4IEg==","signatures":[{"sig":"MEUCIA9Ar2stHMvEsVytG7lS1QY+G8Pp9A7A7HBVNEJWch47AiEAhaJerLIRFOP8uFl5j3VQmwvAIYQg0dN49Nfi5JC8zMQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2914581},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"e3ebf3452002e90bc33ca1f58dbb535d290bd44a","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.7.0_1788455796139_0.8692704776866327","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"hierarchical-approval","version":"0.8.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@0.8.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"87a2c5c58fe474b277ee0f2ce5b14bdb2c6121b7","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.8.0.tgz","fileCount":98,"integrity":"sha512-XvTQJH/ggZlWkXC9sqB/E+wqbnt6zEPMrO7ANP6FhUCYqJM/e6brPWScARyZLj/WYFdcXN+ORe0wmIRJNqo1ow==","signatures":[{"sig":"MEUCIQDpEtBZrYqiOGAlHvA2xJWLrF1Zz9jTPE4ZqKzS9TPeTAIgIgj4aDvNaxQsn+pfdBqhg6to7pw5MQ2OLq+YMSx6jiA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2982698},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"899456af99fedc766c613d6c904f7c2bbe0ad075","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.8.0_1788461697130_0.029726658848776122","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"hierarchical-approval","version":"0.9.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@0.9.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"6fbb6c3df269344eb3671107a045a2ee77c0ebb4","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-0.9.0.tgz","fileCount":98,"integrity":"sha512-tEOA9NJKqPgPQFep8dRoDXNAMkG7wzNR/SwyyAQGbV0fDhXoOTsD29w3eIXZG5kIk1kQyrxaIzgHDaFXeiaARQ==","signatures":[{"sig":"MEUCIGlPYFyMvTdXzbBGx0d6MEOQ3Of3/27YHN1LPQ9Us7bLAiEA4tOKZT73FNNdrKN1Jt9N7ZJ3oDUp17xDFHUehJx4aUU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3127251},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"d6f10add828809ba28645ec2d24147defe85fcd9","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_0.9.0_1788462004702_0.9323167543840354","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"hierarchical-approval","version":"1.0.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@1.0.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"b654dcb04d058802d27ff4eed77e1f7db9a74dc4","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-1.0.0.tgz","fileCount":98,"integrity":"sha512-BnwpiU5Wrq6OHPIebBLJ0rv0+dnkyD27CbZAUwTE+dYuWKzPPehFNif5I759e31e4wL3tcbQelmWP/op97bcyQ==","signatures":[{"sig":"MEUCIQCOWsBIH1RhV8VHEZsWtQsGjN1H1JJOVIQA578gfhJw2gIgf6OYPzU8WgsQn1+mjCKriZ86mZA79cXSwATto8eBJro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3255844},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"fd100601e5e24339d3bf89be58f6008be2f7506e","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_1.0.0_1788462367086_0.22410753122054072","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"hierarchical-approval","version":"1.1.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@1.1.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"114d594b5244b703a0701b35f406dd61c6a502e0","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-1.1.0.tgz","fileCount":98,"integrity":"sha512-tu8U106j1RfQYH1ZCGSorldU5yLfoKrtVtgNKTDpFakvSn9aadUCXL7Mx/i2PBRKXtU5dcSRYdgECiTEtqAtlw==","signatures":[{"sig":"MEUCIQCrVX2fr/xAo0+4t5LstgDFAOoHDCwiEeavyXbbxzPadgIgCXT10xGoIEb6BHor5p89Ei8PsIe2eU8w2G5cxqAfp4s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3376721},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"4f937f5f3fbb6188995fb8fa2044f3df2f20e5fb","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_1.1.0_1788462726168_0.5979438095619658","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"hierarchical-approval","version":"1.2.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@1.2.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"9a9aa39144d1f18c6ef57f0665a4031238f617a2","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-1.2.0.tgz","fileCount":98,"integrity":"sha512-w49ms9JiqG3OpESxVE03mWQ/PpCuPj9f7owdjmtccl+JTvreYYmt7XCmFSAhq+s4m/sYIoZa1H3vnHcXPFHkhA==","signatures":[{"sig":"MEQCIES7878xN3hr0ShyBAkTbzwyv0KMMBRztjAKIgshUwhiAiARlkPTZdLxaDJ6om4n0i/Cn4yHEAHcOOMy3lEdJIDUpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3433119},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"66b1acdfaa495364f7d2988a1c67b826c0280d44","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_1.2.0_1788462962074_0.013216044584413833","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"hierarchical-approval","version":"1.3.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@1.3.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"baa13238f1891477ab5bfff4e35509515e7f5000","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-1.3.0.tgz","fileCount":98,"integrity":"sha512-JIWQt+RYL9V5hRsCEo7OQEi9N/Q5Nx0LKCvHIm/RyLy1ZvVdnMR723w4RuDmNSjmuYTF0aDm0mutKEXAW67/sA==","signatures":[{"sig":"MEYCIQCgEGwbk5HQLVLjtJFFwBF7y86zg9glpzgsgWe+dhZfmAIhANo0jgxPzO4ijhlOBOHnp2LkrDc5Hw+oACrHYbuAnBpn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3473251},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"48cfcb17d8e48fdea92e0a66138f41d8565a2b4d","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_1.3.0_1788463162763_0.24251218115823625","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"hierarchical-approval","version":"1.4.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@1.4.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"4679d9ade2517a5843e53fb638b7099591bdefed","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-1.4.0.tgz","fileCount":98,"integrity":"sha512-36Y7I1ShC3PEbvkQaAPSJ8iDKQmHJ/Co1uLHbpQfnnigwGL3CqPW/23ZHS6d6tCENVt9+1jy1FQ2A/POVYkgnA==","signatures":[{"sig":"MEQCIA0tDlVBGxXyVS+edVos1pQdul11gL+WdnyHwnHXQCpXAiAHQNg1n2MQ1O6mMDqrWwS5sYzRVPKMjheUZ0VNRKOT7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3504287},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"c59d28871c7de45724ad0eb3566d5bfb4cb1232b","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_1.4.0_1788463354391_0.2280017587484391","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"hierarchical-approval","version":"1.5.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@1.5.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"29e38a8131ae09695df305d9a051514aa45336c4","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-1.5.0.tgz","fileCount":98,"integrity":"sha512-IN6uYRG5aVVnd+SkS0W4rkkN+5AJ+0JsEQwlBc2lVMWRkW+S1SZTdfeGfad0FUQ1YUgnc7SDTj0cePSrd6xlsA==","signatures":[{"sig":"MEQCIGpD87GBjfM3uRC3yIEVuCxg2i8BokKKSt+47wtQSdl0AiBHn4LXzCriHvaxBYxBI1aXyVNRhGFCaL0c4kJAGxE8eA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3654376},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"3a58550a2ed138c028c6b4e6ea782500ec78934e","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_1.5.0_1788463536479_0.283656914116974","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"hierarchical-approval","version":"1.6.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@1.6.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"105e8584b7b1b620907c4b051fcb8c23cfcd79d1","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-1.6.0.tgz","fileCount":98,"integrity":"sha512-nSvBi+V4m5eL7LWJLDh7XSwOvAgpt0HVnSd1fZuQX2QSwD29wB27d2bgXDI+mC/X3LCDMheQZruVJz+OEgh9sg==","signatures":[{"sig":"MEYCIQCBAAA8Lwzdiv3s2Jip1QRXeALZ/r+RbFusSWoFLgIwCAIhAPsw87I+4GQYtbpy8kTR419R80jEYDvbwiUlK0VniT1a","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3663437},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"20753be469cc7eda332291c3da567dd4cf6fe161","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_1.6.0_1788463806719_0.1516713873538571","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"hierarchical-approval","version":"1.7.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@1.7.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"83b96d6f0d0dbce8ae5d5fd19dbed602441b5e12","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-1.7.0.tgz","fileCount":98,"integrity":"sha512-mvL3Za2FWQBTlsZ+3ZIanuaBLgzcXoIYcxIzzONRpkLaNV69QFTVIjmzI4TOPE17K3sWjuQWlhDuZGBf//jj7A==","signatures":[{"sig":"MEYCIQDFeJlswNsgL3nCmRSRPXarMXX27zDNJi7ZxUWXOO/v9gIhAK1l1V9fdMVDrHJG9oQqgvceQxXAFkE0HhuiyvIgjCZW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3796733},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"a641e5942ec6cc723e9e838a9da4fb2f59db30b9","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_1.7.0_1788464007289_0.13729508095286325","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"hierarchical-approval","version":"1.8.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@1.8.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"1578073cc6986e07e921d7684f0d0a59a5a9a965","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-1.8.0.tgz","fileCount":98,"integrity":"sha512-WJUz9sENbylmmDA5T5Kfbv31yOrdA/mHoSa6PvWhGq9BfWxWvwU2ODqkM4aXXkziPgUYI5+MnuBE1iXXgJoGoQ==","signatures":[{"sig":"MEUCIEEG/HJriAoCufaJFUGCLni/md0WWrtg2UyU0X1NiE1EAiEAx8N2FXkBDyfpmnMDAAu6ZJVVZaprgi7e7DmvHz7XR1s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@1.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3876998},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"51ba22475200994d1912c682a9d531488d8e1f0e","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_1.8.0_1788464219243_0.06348643042889335","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"hierarchical-approval","version":"1.9.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@1.9.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"6559f1e18bf54c05b8adf09a6a9900f330a23cf1","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-1.9.0.tgz","fileCount":98,"integrity":"sha512-7J/rEJvMCAojauANdB0Kmri57GjQSG4G4w+wlS1Vqu1d/sjJ1K/JUYNZjcodZksxVy5wc64jqpO9NR91ZT82qQ==","signatures":[{"sig":"MEUCIQDVGkr5sY2PCydPYwkh1TiD7J/ezQPeDliEVVmhUjVAQQIgE3weV45VAvLTyhmoAInaChF35R+lnvHeZl5nqirGb6w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@1.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3935019},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"bf4e4cf72e99e2ad1801ff94ccca65d1e50ed5ce","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_1.9.0_1788464365897_0.504819726804246","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"hierarchical-approval","version":"2.0.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@2.0.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"91d11298fb2c8df85be75a334bb32838fe873a80","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-2.0.0.tgz","fileCount":98,"integrity":"sha512-3yh0/xvmMDpTdZ8+ByyQeeFF5/+LBkj3cqmh0fNaGvDvzoUtYT7KgqT61lEBO22hWuu2JKVsfFzfE0K+kVwkjg==","signatures":[{"sig":"MEYCIQDTh+0GxWYJgN0TpDq3TGd9DR9I4RTRFw/H1Io32Od/qgIhALwbG/XC//2wdRSjN+Jrz0HBwnOYzHrBVl2L5hf7T9e7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3942782},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"800f1b615d306226ae56e02c8a707b41e6445a06","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_2.0.0_1788464614604_0.6955588190949764","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"hierarchical-approval","version":"2.1.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@2.1.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"80e33300b78de30e10ddc2d8c43aa12a3f606cf7","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-2.1.0.tgz","fileCount":98,"integrity":"sha512-YXwzTsYL/WUUg2IOfFT221QabnSh1gpSZV+yHe5NmHT6C66AwGZdjtHS5aJo3akAeOBdOO62CcTBwi3kCYcfkA==","signatures":[{"sig":"MEYCIQD9www0h1OJlyxZ+NTWTfa+h0C6uMmuc1RRCSJno06jUgIhAORxo5+tHKZhXYH3/96yxqK+pgdI83es8V++CGHbb4pO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4150474},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"562064af404d45217f9358379130fc6f4b3ee187","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_2.1.0_1788465062320_0.686861555103923","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"hierarchical-approval","version":"2.2.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@2.2.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"b3ee3038adbe20b23df0f750f771ce43811e3aaa","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-2.2.0.tgz","fileCount":98,"integrity":"sha512-25uD8peyYSxk+78qVl3wkLhkmNFtR/JjPNTMpo/X3hkpvI0yLeFpqQJCRWOg+qpGXB7DJr3/XDWd+RZTyvrTKg==","signatures":[{"sig":"MEQCIA5QTXXVV4VN6CRYizaxO3nXrS8iQtDTyLxj72Y6l/sRAiB5gsOJTcU6pqj2NOURyovd43YwMXeoY8HbnEBce4q1aQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4240499},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"9131ba54559fdd59fb8c1dbf25a1edcde2b4e97f","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_2.2.0_1788465247049_0.995051679889362","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"hierarchical-approval","version":"2.3.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@2.3.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"4f8e549719402cfb8983b6c0c69a7bb43ad942a8","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-2.3.0.tgz","fileCount":98,"integrity":"sha512-qzSfD9HhIsxTmgEW6+EmP7zTjhJq5PPn89X0ag+KaVNUg8PMlXtwk22+Aa4M7iaw58rD8yEA+lXUJrrqs2YOHg==","signatures":[{"sig":"MEMCH03y/I2ffsvbNnVD4M5lCykEL5ssXk+02Cypg0YUW8ECIFmaOZDFZEeHwy+R8W5r9vVLu+eGxwBQFPk3AyudP5Sm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4314983},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"9897beee1994ab7d7ca915697edde272458f3945","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_2.3.0_1788465434536_0.6085418679880141","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"hierarchical-approval","version":"2.4.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@2.4.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"b61d089ab5fbb1c886a693e2401c15068b7fad8e","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-2.4.0.tgz","fileCount":98,"integrity":"sha512-vW/ACTL/ut/6ARNsPk5eFd6FCqs4Eoz2R6zBGyuIFE2Y6qrR+qTcFhlLx3fK/B61XUMiYSOzupqBau9PwI91Yw==","signatures":[{"sig":"MEUCIB/O885UUz4iwcWpDBkF3U3jwhmj9dHhM0XbVAySgzT6AiEAjYsWep0Fbs28uOPI309be7oXQ6GO5pweJ/Uwlh3+19w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@2.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4350233},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"6fbe79f37a2dbd1ed6cff10096fd770027e5e6ca","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_2.4.0_1788465588522_0.3117983503606008","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"hierarchical-approval","version":"2.5.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@2.5.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"e7a78f71c19558aaf9fa82e0f66597cb2f553486","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-2.5.0.tgz","fileCount":98,"integrity":"sha512-6DFUHitJv7dlHyxGLCBSqLltNWRIfOWH08yeWqwV+P7AFpFMyRJIuAqFHpKKmiD+IMYvx0OlsPffMdIfriMl+A==","signatures":[{"sig":"MEUCICHCk3agZTrYRETCkUXpS+d5OIUby85BipFbZbx4+CzyAiEA6U2Joc8/Lb1fGQWggr488dZ5BxrXiDAirQYYSsu2BDo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@2.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4415693},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"2ed328e92798c2cc78ffdadbcc488ab24a353839","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_2.5.0_1788465832712_0.5711051068684676","host":"s3://npm-registry-packages-npm-production"}},"2.6.0":{"name":"hierarchical-approval","version":"2.6.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@2.6.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"f99d1f572e3971494a6381172f890dfba15a4744","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-2.6.0.tgz","fileCount":98,"integrity":"sha512-E9Pz7VMZGXbTxkc/LYRoh3YOVb6QNXpZhsTGlc/jswfkdUXCqbmkGtnVgbg/lEA/aDBL/i8Mu91EMxBXU5Rx4A==","signatures":[{"sig":"MEYCIQC4Xis8Y70XS+9UkQrG+t+N7p6tveYBndfCccoouJ6z1wIhAM0PMznXY6RohesFz1gcqVA4+Q5E4ID780zilLCUs4r8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@2.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4475388},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"33b76a861cfe95beb94e75ce06e064200ed69682","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_2.6.0_1788466036524_0.308400163257017","host":"s3://npm-registry-packages-npm-production"}},"2.7.0":{"name":"hierarchical-approval","version":"2.7.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@2.7.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"6f9ad1ac69b6fb7c4de172c2dd1a3f407fa0b53f","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-2.7.0.tgz","fileCount":98,"integrity":"sha512-q2oYILSH51Ik+UrMDBwZlmyPWJwhvYQs7jcczriZDxLgW3asNsj5iwTxiWPEW04v6wW/zFhTugIaNOh0NMqDTQ==","signatures":[{"sig":"MEQCIF+D1HXlyYwFxnb1cRGcV5ctGIPI80IgHqw1lTIR0LtAAiB6Cg/DEDKsGT47awnE1PgAPrzf3czTovfDcbpnTREUNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@2.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4561697},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"0ec1e2387992c2e2a4b9bf14ef8cd614db8125b5","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_2.7.0_1788466203407_0.15498163584691782","host":"s3://npm-registry-packages-npm-production"}},"2.8.0":{"name":"hierarchical-approval","version":"2.8.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@2.8.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"1004babf1aa378ea275bf854eaf86c0b02f16402","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-2.8.0.tgz","fileCount":98,"integrity":"sha512-Au5TJROc+0WHTuwhtb9y+mZbn1WywYXds0FIGkMtwpJ+1JpOvtWq2p6i+Shk9sseq7dMmTIIbofk8j1oLf9oag==","signatures":[{"sig":"MEUCIQCowiikmnkyVeL2Zs5h361cRJrbuVzxOVBObaGE9p/HjgIgHhxQ5W0w08rrwkMLgKcJqX/JPEguUxFenqAK9fx9jdo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@2.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4618328},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"215a06c80c2161b2fd4d7c6475ca6e3033656537","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_2.8.0_1788466437891_0.9460051840714234","host":"s3://npm-registry-packages-npm-production"}},"2.9.0":{"name":"hierarchical-approval","version":"2.9.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@2.9.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"5b8f405d72493494150e2959c4cb57e30e30b650","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-2.9.0.tgz","fileCount":98,"integrity":"sha512-GuaDe7AJhTh9RYDdv3DZSaIgCJXL9glLmMLOXZxlcJOw/JIi/d02b5C9KyEHbwn9Iyl93d1qt1V15lvaHTDLgg==","signatures":[{"sig":"MEUCICq9p5UHI/vF+ggVHlVIYOtC5LRq3IdVk3Z+ph8Auot1AiEA1bNkhd6jKohL/7GG3KXHEAGRX29btwDiSvdMminfOcs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@2.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4773411},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"730d4572e7595e0d514565fcc05dca8ba79bec36","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_2.9.0_1788466649257_0.968700097671868","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"hierarchical-approval","version":"3.0.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@3.0.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"fce5a51d460097cc82102190d6ed1430e518fd0a","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-3.0.0.tgz","fileCount":98,"integrity":"sha512-FvHsyyyJh+MEx3uhAWidpJG04I3PfP9pMhjPYgqbK2m/Dqz3WsO8+x9yCD1gdZKbP3zyytptVNjn0mRnFiXJXw==","signatures":[{"sig":"MEUCIQCM/H4hWq9L945KmoH8jciCLKoYWls1hM+ty6VuP1A8DAIgCEV2GbfVsGGgKtf808QFypDtRXZzpoVIFExVfYjfaN0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4837263},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"3e8186764b13045926ebecf2488025cb02427c79","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_3.0.0_1788483784923_0.07442154778676469","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"hierarchical-approval","version":"3.1.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@3.1.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"9457d895a665345cd7786b61f38626d158f71562","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-3.1.0.tgz","fileCount":98,"integrity":"sha512-kLk7vfq4T9KNzsxrP1jYXHYTsxZDxEiyu4l1rQZrkHCn5Pptv/nOltS3bgWqNF3srv0NNS1Pt/MQw5ys72Cj7g==","signatures":[{"sig":"MEUCIQCGvLSqo90sCLzRN2zFp1peHo/Pc0AGKXNGxGARLFOXsQIgWgRSxkdi13Qxo33f6ArJadXkhFOJ7xDqUV9S9WJZIQc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4844066},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"f32e4bc207413767bfc46d60513f3a24f92c32ec","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_3.1.0_1788484842443_0.31459205142133495","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"hierarchical-approval","version":"3.2.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@3.2.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"350f2c3daf2f08e78a0d46e339a628c7ec503d02","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-3.2.0.tgz","fileCount":98,"integrity":"sha512-Hax2SK5l2LfSOwa+pbWzp2gwwmbqtsZhtxSKVn9JotJHzRjSDuPrOUj3KFtJV/T+zt6yZ+mcTs/yD9sKaWgONw==","signatures":[{"sig":"MEQCIQCsEl4q1kuQal4U3iUpLs1D9xSPafPs4UiqQx0Z5gkMmgIfLQ0P8J6zuo5zP6JferIegIQTpUHoI90YMLg/PZ8Xog==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4849540},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"22d72b2d3257708868faed2bc18857a32b64ce5c","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_3.2.0_1788485547143_0.970724035387381","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"hierarchical-approval","version":"3.3.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@3.3.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"0985ef72c2942aa76da6fd93d13aec25a08dd3a6","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-3.3.0.tgz","fileCount":98,"integrity":"sha512-IYqZq4K95r2ZMfgzWYa9aaw3MR5C3mGyr+MfYhG5Ep2V3155/xWs4/Ji6JwkbVDFZ2UFODiqv1IzABzkZ8IO+w==","signatures":[{"sig":"MEYCIQD5AjoA0ZJs5BTfl6x10vF2rajKCTZmMOq2wFpG2xvaygIhAMLI2FMfw6mDLU0wmNaS0Vaqi/H+1VmG0xsRvpWiNaYN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@3.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4851859},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"f271d7386775aa64e7ff009415be06cc591c6609","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_3.3.0_1788486630664_0.07501326470481073","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"hierarchical-approval","version":"4.0.0","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@4.0.0","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"9b55747cb9bd50a97c3a86fceb62022c4bcad1ef","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-4.0.0.tgz","fileCount":98,"integrity":"sha512-vTCgpN1Ac9IoQVaY50+rYguDLMDyVkwqTgcpOAfXztyw7tcB7oAVG+RBhWdzUhLkqu8+VMTy6pgsRKJApUIuEQ==","signatures":[{"sig":"MEUCIQD0/mS5j7u8/oxB5UdY+tt4YvRsjZOQl8SW5JIN3qgSIwIgaV1bFX2bJzdtN4jPSLGrgI5SqfimT1vse4BsvSkUzSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5000928},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"cad0618d6d5a8fd4decce7a1254f63acf6b5a090","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_4.0.0_1788488087269_0.05238797351141877","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"hierarchical-approval","version":"4.0.1","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@4.0.1","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"d6361e15df5fcae51328b63389913cf6d8eef8f7","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-4.0.1.tgz","fileCount":98,"integrity":"sha512-FWhxeK+yP4qxHJyS9JYS/ilO90H5xfAdiYTzyZl3ugnp00TMRHiKvXAfU2tq+untRii3m/6ITvop0pWW5mIq5Q==","signatures":[{"sig":"MEYCIQDBm+t4X7bCU8UUD5ORh3PNbyV3uok8RWQKZ578wD4sxAIhAOP+3Ya4pR15GqdEBx7ITlwiMX5BvKo25UwaUOMKyjX5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICBtacuI9AS82yi1mQo0WQyLO2gBLFF570eBrd6vWgfSAiBGkXJOgual7sMuKUHS5+4pslE/e1uaZ1RyjFTwop70kA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@4.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5027861},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"6330c9546994fc5b01e5f6406d82994ff2c8e799","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_4.0.1_1789391402304_0.20921035229690976","host":"s3://npm-registry-packages-npm-production"}},"4.0.2":{"name":"hierarchical-approval","version":"4.0.2","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@4.0.2","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"0aca9e027f85bb8c421cf822bf4463edf350625f","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-4.0.2.tgz","fileCount":98,"integrity":"sha512-G1v0bu0djqJlk6XXRN4DHfAZ7HWe9qBNfREou0qYwQjT3C2OWlzZrrxy9IOuLb8XGJaQ94w4oL9nmew+VIVe+w==","signatures":[{"sig":"MEUCIHRxQx14BgP6XGDHBTcSEHEOzbNx1g0SzR7B2GKJ44uPAiEAijz1W9lGHF/mCZ5sFDbIf/HZDwM30QjSXG5aN6y1Lu4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC/5ob50jEPvpo4HiiK99wGiUUmyb5EJ44H0C54t5pJMQIgYvibqjoopjmwnvEvKuXTWS8lKWasg50x+HRgfDIFJMQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@4.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5206328},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"b9cf227b5792ad914772cadcdd6550ed916e7f2c","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_4.0.2_1789909846236_0.08377986816783944","host":"s3://npm-registry-packages-npm-production"}},"4.0.3":{"name":"hierarchical-approval","version":"4.0.3","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@4.0.3","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"6b18902e1b27da70921599eb149296d164377292","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-4.0.3.tgz","fileCount":98,"integrity":"sha512-2AeCWwE4K0VAo0XqYhmgHl84SGE92Q6VcHpcNAwE08tw3gYcqPSwJKyJJnyPRgIi5exRDnxuzfI3NqqRb78sFw==","signatures":[{"sig":"MEYCIQCIZK1UkIRzutP7XuhADrHtVO8sL5WNGRuq1kZjXyWIgwIhAK4EsKbJ4U2d6lDuGBtxZXMAuEEOvPjDXxqMJasLf4+F","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIArHTdQjaUN9ALuLm8RSEmHuM2kMhChzxXyvLHkCdj82AiBjrcipop1kSKvl0Vxq67s8Bv1n5OXT8fMlIyo2p0dCew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@4.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5253015},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"88640989cb82eac51aa8185fee0b035773993c24","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.19.1","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_4.0.3_1790062086313_0.5069854741505506","host":"s3://npm-registry-packages-npm-production"}},"4.0.4":{"name":"hierarchical-approval","version":"4.0.4","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@4.0.4","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"e06c0f8c3b0683164061fd2196056f98ac09b87b","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-4.0.4.tgz","fileCount":98,"integrity":"sha512-+Ma/EFqF2ygX7My6kXSzE1qG0/xyittzodDbTSGJyUQpdmWNWy1ciIy5vqvSTlq4fpcs+K7lVRxNEdP7/UoFZw==","signatures":[{"sig":"MEUCIQCQGzGD1myZeDjq2iAikv6LpYvHJlx13M+1ivEYz2qUMAIgQcyLDcYyYUC2pKmYYlz60X3CUjMEehddoogqLXisnWs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC7I5zye5llgDqA0Rn/LDhcMoRFHaG3J301ZdTdlNzZpgIgeVeLfLXQmyTIc4a7V2srEju7UbKEo2sR0oJtAbZC1po=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@4.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5294867},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"1a6e92f61535b3b933e25687a0893ed2a2c34f97","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.20.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_4.0.4_1790211014066_0.1259501686555904","host":"s3://npm-registry-packages-npm-production"}},"4.0.5":{"name":"hierarchical-approval","version":"4.0.5","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@4.0.5","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"f1f362e48ce0da82b0309f67f7bd9c6f85d0095e","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-4.0.5.tgz","fileCount":98,"integrity":"sha512-HUDj8O/70mJp5IWr7075oViac7huxsgsBGsJaXMyRFumcucz0+2NsR62lYdHACSQdY8iJT+oPYUidWpBRW9+cw==","signatures":[{"sig":"MEQCIFa6UN4njRmHAV9N+eex4J5UX1zlUgOe580ir5nJeatSAiAL0bdWUC/ASxfHXxiP4g09n1ydSFkdbWMZ6zzlOKrtxw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCyOh0auU6QzC3KA0UWJ7sHf2pPwEWVT2aO29LgaYHFNAIgapd7LrhmqHqTmPIylVBCfwl8by0dNBpO5o/A8rTRl1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@4.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5319243},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"121435f1e1292b555f7d693510abb2132844e286","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.20.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_4.0.5_1790297231545_0.17731113755282002","host":"s3://npm-registry-packages-npm-production"}},"4.0.6":{"name":"hierarchical-approval","version":"4.0.6","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","_id":"hierarchical-approval@4.0.6","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"homepage":"https://hierarchical-approval.matthewswong.com","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"b7c4ce91500b14a6025b8546ff5e2c80928bba94","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-4.0.6.tgz","fileCount":98,"integrity":"sha512-yzvGzaQO55HTwQw0Lg/HDi0GeAHPK+gDsM7VVAaYa7D9rcHeIcvNpVQ+DUrzi4G6LSVfCF38ppWB1iCHf4wh7w==","signatures":[{"sig":"MEUCICaDBZiugPkJgwdpc1meQQkPZnGgdlaWTtps35BMIiHQAiEA3ii5y5qQi5JtR+yfV675T4mmTD/AXKs+F3Icwb2kDIw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDGVuYrIt1jdf73vaHv536raGMd+avx8bCzpqqOSp1eeAiBp5guygJLv81J+EBdr/9gxMzkiAaHLKBDCT+68NiCEMA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@4.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5329445},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"c751701d0ca93e544567cc5e2110623a16640257","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.20.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hierarchical-approval_4.0.6_1790428421905_0.7563394285375904","host":"s3://npm-registry-packages-npm-production"}},"4.0.7":{"_id":"hierarchical-approval@4.0.7","bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"dist":{"shasum":"9d3e5207f8db451e43642f0f88d607684eb06653","tarball":"https://registry.npmjs.org/hierarchical-approval/-/hierarchical-approval-4.0.7.tgz","fileCount":98,"integrity":"sha512-8g2CSB8LDcctDzJReOefxCGmFG4lSwXw9K11jUlzsEEpcgvgNYEc2/aqZSQwSJQAFmuVDidNrTGY0k8WlJ3l/Q==","signatures":[{"sig":"MEQCIANTZlpB2YooFBeRLc5lCot9uf7sJMWoxjErkrPQpP/xAiBWFfsStYjTuvPCuYogs1Cywufs3N++1/aD/Vre5iYPGA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHiV4X4JAFUVToKlnheIE3UVR50G2wn9V+zO0t424+XwAiBNN1tOF8u26NTRpI+XVM1VjO+8rTPRxEzmw1bD7TIE6A=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/hierarchical-approval@4.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5336969},"main":"./dist/index.cjs","name":"hierarchical-approval","type":"module","types":"./dist/index.d.ts","author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./nestjs":{"types":"./dist/nestjs.d.ts","import":"./dist/nestjs.js","require":"./dist/nestjs.cjs"},"./testing":{"types":"./dist/testing.d.ts","import":"./dist/testing.js","require":"./dist/testing.cjs"},"./plugins/audit":{"types":"./dist/plugins/audit.d.ts","import":"./dist/plugins/audit.js","require":"./dist/plugins/audit.cjs"},"./plugins/notify":{"types":"./dist/plugins/notify.d.ts","import":"./dist/plugins/notify.js","require":"./dist/plugins/notify.cjs"},"./adapters/memory":{"types":"./dist/adapters/MemoryAdapter.d.ts","import":"./dist/adapters/MemoryAdapter.js","require":"./dist/adapters/MemoryAdapter.cjs"},"./plugins/metrics":{"types":"./dist/plugins/metrics.d.ts","import":"./dist/plugins/metrics.js","require":"./dist/plugins/metrics.cjs"},"./plugins/tracing":{"types":"./dist/plugins/tracing.d.ts","import":"./dist/plugins/tracing.js","require":"./dist/plugins/tracing.cjs"},"./plugins/webhook":{"types":"./dist/plugins/webhook.d.ts","import":"./dist/plugins/webhook.js","require":"./dist/plugins/webhook.cjs"},"./adapters/postgres":{"types":"./dist/adapters/PostgresAdapter.d.ts","import":"./dist/adapters/PostgresAdapter.js","require":"./dist/adapters/PostgresAdapter.cjs"},"./plugins/scheduler":{"types":"./dist/plugins/scheduler.d.ts","import":"./dist/plugins/scheduler.js","require":"./dist/plugins/scheduler.cjs"},"./plugins/resilience":{"types":"./dist/plugins/resilience.d.ts","import":"./dist/plugins/resilience.js","require":"./dist/plugins/resilience.cjs"}},"gitHead":"e5eda1d733fb93b24742bba0e98b816e6288fc4a","license":"MIT","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src tests","test":"vitest run","build":"tsup","format":"prettier --write src tests","typecheck":"tsc --noEmit","docs:watch":"typedoc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage"},"version":"4.0.7","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f1d5b9fc-3dea-4f87-b9d7-27b2549961d5"}},"homepage":"https://hierarchical-approval.matthewswong.com","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"_npmVersion":"11.20.0","description":"TypeScript-first hierarchical approval engine for ERP developers","directories":{},"maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.21.0","dependencies":{"zod":"^4.4.3","eventemitter3":"^5.0.4"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.2","tsup":"^8.5.1","eslint":"^10.5.0","vitest":"^4.1.9","typedoc":"^0.28.20","prettier":"^3.8.4","@types/pg":"^8.20.0","typescript":"^5.9.3","@nestjs/core":"^11.1.28","@nestjs/common":"^11.1.28","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^4.1.9","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.61.1","@typescript-eslint/eslint-plugin":"^8.61.1"},"peerDependencies":{"pg":">=8","@nestjs/common":">=10"},"peerDependenciesMeta":{"pg":{"optional":true},"@nestjs/common":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/hierarchical-approval_4.0.7_1790601283530_0.66349814598613"}}},"time":{"created":"2026-06-21T05:17:15.236Z","modified":"2026-09-28T13:14:44.064Z","0.1.0":"2026-06-21T05:17:15.559Z","0.1.1":"2026-06-21T05:41:32.273Z","0.2.0":"2026-06-23T16:03:18.432Z","0.2.1":"2026-06-23T17:06:26.434Z","0.3.0":"2026-06-26T09:47:11.600Z","0.3.1":"2026-06-26T09:53:24.840Z","0.4.0":"2026-07-23T12:17:09.686Z","0.5.0":"2026-07-23T14:27:11.939Z","0.6.0":"2026-08-21T12:24:48.057Z","0.7.0":"2026-09-03T17:16:36.308Z","0.8.0":"2026-09-03T18:54:57.289Z","0.9.0":"2026-09-03T19:00:04.850Z","1.0.0":"2026-09-03T19:06:07.270Z","1.1.0":"2026-09-03T19:12:06.366Z","1.2.0":"2026-09-03T19:16:02.280Z","1.3.0":"2026-09-03T19:19:22.912Z","1.4.0":"2026-09-03T19:22:34.591Z","1.5.0":"2026-09-03T19:25:36.641Z","1.6.0":"2026-09-03T19:30:06.900Z","1.7.0":"2026-09-03T19:33:27.480Z","1.8.0":"2026-09-03T19:36:59.405Z","1.9.0":"2026-09-03T19:39:26.073Z","2.0.0":"2026-09-03T19:43:34.797Z","2.1.0":"2026-09-03T19:51:02.570Z","2.2.0":"2026-09-03T19:54:07.298Z","2.3.0":"2026-09-03T19:57:14.722Z","2.4.0":"2026-09-03T19:59:48.733Z","2.5.0":"2026-09-03T20:03:52.936Z","2.6.0":"2026-09-03T20:07:16.701Z","2.7.0":"2026-09-03T20:10:03.741Z","2.8.0":"2026-09-03T20:13:58.351Z","2.9.0":"2026-09-03T20:17:29.441Z","3.0.0":"2026-09-04T01:03:05.106Z","3.1.0":"2026-09-04T01:20:42.651Z","3.2.0":"2026-09-04T01:32:27.336Z","3.3.0":"2026-09-04T01:50:30.837Z","4.0.0":"2026-09-04T02:14:47.452Z","4.0.1":"2026-09-14T13:10:02.427Z","4.0.2":"2026-09-20T13:10:46.352Z","4.0.3":"2026-09-22T07:28:06.425Z","4.0.4":"2026-09-24T00:50:14.165Z","4.0.5":"2026-09-25T00:47:11.687Z","4.0.6":"2026-09-26T13:13:42.045Z","4.0.7":"2026-09-28T13:14:43.697Z"},"bugs":{"url":"https://github.com/matthews-wong/hierarchical-approval/issues"},"author":{"name":"Matthews Wong","email":"matthews.wong@commsult.id"},"license":"MIT","homepage":"https://hierarchical-approval.matthewswong.com","keywords":["approval","approval-workflow","approval-chain","multi-level-approval","workflow","workflow-engine","maker-checker","four-eyes","segregation-of-duties","delegation","escalation","audit-trail","state-machine","erp","hierarchical","approvals","nestjs","postgres","typescript"],"repository":{"url":"git+https://github.com/matthews-wong/hierarchical-approval.git","type":"git"},"description":"TypeScript-first hierarchical approval engine for ERP developers","maintainers":[{"name":"matthewswong","email":"matthewswong2610@gmail.com"}],"readme":"<div align=\"center\">\n\n# hierarchical-approval\n\n**TypeScript-first multi-level approval workflows for enterprise systems.**\nMulti-tenant · audit-ready · fully pluggable · zero runtime dependencies you don't opt into.\n\n[![npm version](https://img.shields.io/npm/v/hierarchical-approval.svg?logo=npm&color=cb3837)](https://www.npmjs.com/package/hierarchical-approval)\n[![npm downloads](https://img.shields.io/npm/dm/hierarchical-approval.svg?color=cb3837)](https://www.npmjs.com/package/hierarchical-approval)\n[![CI](https://github.com/matthews-wong/hierarchical-approval/actions/workflows/ci.yml/badge.svg)](https://github.com/matthews-wong/hierarchical-approval/actions/workflows/ci.yml)\n[![types](https://img.shields.io/npm/types/hierarchical-approval.svg?logo=typescript&logoColor=white&color=3178c6)](https://www.typescriptlang.org/)\n[![minzipped size](https://img.shields.io/bundlephobia/minzip/hierarchical-approval?color=44cc11)](https://bundlephobia.com/package/hierarchical-approval)\n[![license](https://img.shields.io/npm/l/hierarchical-approval.svg?color=blue)](./LICENSE)\n[![tests](https://img.shields.io/badge/tests-1271%20passing-44cc11.svg?logo=vitest&logoColor=white)](./tests)\n\n[**Documentation**](https://hierarchical-approval.matthewswong.com) ·\n[**npm**](https://www.npmjs.com/package/hierarchical-approval) ·\n[**Changelog**](./IMPROVEMENTS.md) ·\n[**Examples**](./examples)\n\n</div>\n\n```sh\nnpm install hierarchical-approval\n# peer dep for Postgres only\nnpm install pg @types/pg\n```\n\n> 📖 Full docs & live guides: **[hierarchical-approval.matthewswong.com](https://hierarchical-approval.matthewswong.com)**\n\n### ▶️ Try it live (no install)\n\n- **[Run in your browser on RunKit →](https://npm.runkit.com/hierarchical-approval)** — `require('hierarchical-approval')` in an instant notebook.\n- **[Open the interactive playground on StackBlitz →](https://stackblitz.com/github/matthews-wong/hierarchical-approval/tree/main/examples/playground)** — a full purchase-order approval chain running in-browser.\n\n<details>\n<summary><strong>Table of contents</strong></summary>\n\n- [Why another approval library?](#why-another-approval-library)\n- [How it works](#how-it-works) — the 30-second mental model + diagrams\n- [Quick start](#quick-start)\n- [Core concepts](#core-concepts)\n- [Installation and setup](#installation-and-setup)\n- [`new ApprovalEngine(options)`](#new-approvalengineoptions)\n- [Approver types](#approver-types)\n- [Lifecycle operations](#lifecycle-operations)\n- [Queries](#queries)\n- [Template management](#template-management)\n- [Utility methods](#utility-methods)\n- [Events](#events)\n- [Enterprise adapters](#enterprise-adapters)\n- [Custom storage adapter](#custom-storage-adapter)\n- [Testing](#testing)\n- [Error handling](#error-handling)\n- [Multi-tenancy](#multi-tenancy)\n- [Template reference](#template-reference)\n- [FAQ](#faq)\n- [License](#license)\n\n</details>\n\n---\n\n## Why another approval library?\n\nApproval workflows are deceptively simple until they aren't. Most teams start with `if (amount > 1000) notifyManager()` and end up with hundreds of lines of procedural logic entangled with their database, email service, and audit code — and rewrite it whenever a new requirement arrives.\n\n`hierarchical-approval` gives that logic a permanent, tested home:\n\n| Pain point                                             | What this library does                                                                                   |\n| ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- |\n| Hardcoded approval chains                              | Named **templates** — define once, reuse across any document type                                        |\n| Race conditions on concurrent approvals                | **Optimistic locking** with a version field + configurable retry policy                                  |\n| Duplicate submissions (network retry, double-click)    | Built-in **idempotency** keyed by tenant + document + template                                           |\n| No compliance trail                                    | Immutable **audit log** with old/new state diff on every mutation                                        |\n| `new Date()` in production code makes tests unreliable | Injectable **Clock** interface — freeze time without monkey-patching                                     |\n| \"Escalate to skip-level manager after 48 h\"            | Built-in **escalation scheduler** with delegation + time-limited proxying                                |\n| SLA as an afterthought                                 | **SLA tracking** baked in; `approval:sla_breached` event fires automatically                             |\n| Test suites hit a real database                        | **`ApprovalTestKit`** + **`ManualClock`** — deterministic, zero I/O                                      |\n| Kafka/Datadog/BullMQ integration needed                | Six **pluggable adapter interfaces** for notifications, metrics, audit, scheduling, auth, and middleware |\n\n### Compared to existing libraries\n\n**`approval-flow`** — Single-level only; no multi-tenancy; no audit trail; last published 2020.  \n**`workflow-engine`** — Generic state machine; you implement every guard, every condition, every audit entry yourself.  \n**`node-approval`** — No TypeScript; no idempotency; no optimistic locking.  \n**Hand-rolled** — You _will_ hit the concurrent-approval race condition eventually. This library has 195 tests covering it.\n\n---\n\n## How it works\n\n**The 30-second mental model:** you define a reusable **template** (the approval blueprint), then **submit** documents against it. Each submission becomes an **instance** that walks through the template's **levels** one at a time. At each level the configured **approvers** act, and the level's **mode** decides when that level is satisfied. When the last level passes, the instance is `approved`.\n\n| Term         | What it is                                                                                                                                               |\n| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Template** | A named, reusable blueprint — ordered levels, approvers, modes, conditions, escalation, SLA. Define once, reuse for every document of that type.         |\n| **Instance** | One running approval: a specific document moving through a template. Holds the live state, the audit log, and a snapshot of the template at submit time. |\n| **Level**    | A single step in the chain (e.g. \"Manager\", then \"Finance\"). Levels run **sequentially**.                                                                |\n| **Approver** | Who may act on a level — a fixed `user`, a `role`, or someone resolved dynamically at runtime.                                                           |\n| **Mode**     | How a level passes: `any`, `all`, `majority`, `quorum` (N-of-M), or `weighted`.                                                                          |\n\n### The status lifecycle\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/matthews-wong/hierarchical-approval/main/assets/diagrams/lifecycle.png\" alt=\"Status lifecycle: pending advances on approve, and resolves to approved, rejected, cancelled, or expired.\" width=\"640\">\n</p>\n\n> `submit()` creates the instance in `pending`; `resubmit()` on a rejected instance spawns a new linked instance starting again at level 1.\n\n### How an approval flows\n\nA level is satisfied according to its mode (`any`, `all`, `majority`, `quorum`, or `weighted`):\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/matthews-wong/hierarchical-approval/main/assets/diagrams/flow.png\" alt=\"Approval flow: submit, resolve approvers, approvers act; when the level threshold is met advance to the next level or complete; rejection ends the instance.\" width=\"380\">\n</p>\n\n### Architecture — a small core with pluggable ports\n\nThe engine never talks to your database, queue, or notification service directly — it talks to **interfaces you implement** (or use the built-ins). Only storage is required; everything else is opt-in.\n\nSolid arrow = required (storage). Dotted arrows = optional ports you can plug in:\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/matthews-wong/hierarchical-approval/main/assets/diagrams/architecture.png\" alt=\"Architecture: your application calls ApprovalEngine, which requires an IStorageAdapter (Memory, Postgres, or custom) and optionally plugs into notification, audit, metrics, scheduler, authorization, and middleware ports.\" width=\"560\">\n</p>\n\n---\n\n## Quick start\n\n```ts\nimport { ApprovalEngine } from 'hierarchical-approval';\nimport { MemoryAdapter } from 'hierarchical-approval/adapters/memory';\n\nconst engine = new ApprovalEngine({\n  adapter: new MemoryAdapter(),\n  tenantId: 'acme',\n});\n\n// 1. Define a reusable template\nawait engine.defineTemplate({\n  name: 'purchase-order',\n  documentType: 'purchase_order',\n  levels: [\n    {\n      level: 1,\n      name: 'Manager',\n      approvers: [{ type: 'user', userId: 'mgr-1' }],\n      mode: 'any',\n    },\n    {\n      level: 2,\n      name: 'Finance',\n      approvers: [{ type: 'role', role: 'finance-team' }],\n      mode: 'any',\n    },\n  ],\n  // Finance level only activates above $10 k\n  conditions: [\n    {\n      when: { field: 'amount', operator: '>', value: 10000 },\n      addLevels: [\n        {\n          level: 2,\n          name: 'Finance',\n          approvers: [{ type: 'user', userId: 'fin-1' }],\n          mode: 'any',\n        },\n      ],\n    },\n  ],\n  slaDeadlineDays: 2,\n  allowOverride: true,\n});\n\n// 2. Submit a document\nconst instance = await engine.submit({\n  templateName: 'purchase-order',\n  documentId: 'po-0042',\n  documentType: 'purchase_order',\n  submittedBy: 'alice',\n  data: { amount: 15000, vendor: 'Acme Corp' },\n});\n// instance.levels has two levels because amount > 10000\n\n// 3. Manager approves\nawait engine.approve(instance.id, { approverId: 'mgr-1', comment: 'Looks good' });\n\n// 4. Finance approves — instance is now 'approved'\nawait engine.approve(instance.id, { approverId: 'fin-1' });\n\nawait engine.shutdown();\n```\n\n---\n\n## Core concepts\n\n### Templates\n\nA **template** is the reusable definition of an approval chain. It specifies who must approve (by user ID, role, or custom resolver), in what order, under what conditions, and what SLA applies.\n\nTemplates are **snapshotted** at submit time. You can update a template (via `updateTemplate()`) without affecting any in-flight instances — each instance carries a `templateSnapshot` with the escalation and SLA config that was in effect when it was submitted. Each template also carries a `version` counter and `previousVersionId` for lineage tracking.\n\n### Instances\n\nAn **instance** is a single document moving through a template. Key fields:\n\n| Field              | Type                                                                | Description                                           |\n| ------------------ | ------------------------------------------------------------------- | ----------------------------------------------------- |\n| `id`               | `string`                                                            | Unique instance ID                                    |\n| `status`           | `'pending' \\| 'approved' \\| 'rejected' \\| 'cancelled' \\| 'expired'` | Current status                                        |\n| `currentLevel`     | `number`                                                            | Active level number                                   |\n| `version`          | `number`                                                            | Optimistic lock version                               |\n| `levels`           | `ApprovalLevelInstance[]`                                           | Per-level state (approverIds, approvedBy, rejectedBy) |\n| `auditLog`         | `AuditEntry[]`                                                      | Full immutable history                                |\n| `idempotencyKey`   | `string`                                                            | Dedup key — same submit returns the same instance     |\n| `slaDeadlineAt`    | `Date?`                                                             | When the SLA expires                                  |\n| `slaBreachedAt`    | `Date?`                                                             | When the SLA was breached (set automatically)         |\n| `expiresAt`        | `Date?`                                                             | Hard deadline — instance auto-expires after this      |\n| `deadlineAction`   | `'cancel' \\| 'reject'`                                              | What to do when `expiresAt` passes                    |\n| `parentInstanceId` | `string?`                                                           | Set on resubmitted instances                          |\n| `templateSnapshot` | `object`                                                            | Frozen copy of escalation/SLA config at submit time   |\n\n### Approval modes\n\nEach level's `mode` field controls how many approvers are required:\n\n| Mode         | Required                                         | Extra config                    |\n| ------------ | ------------------------------------------------ | ------------------------------- |\n| `'any'`      | One approver is enough                           | —                               |\n| `'all'`      | Every listed approver must act                   | —                               |\n| `'majority'` | More than half must approve                      | —                               |\n| `'quorum'`   | A fixed **N-of-M** threshold approves            | `minApprovals`                  |\n| `'weighted'` | Cumulative approver **weight** meets a threshold | `threshold`, optional `weights` |\n\nA level is **rejected** as soon as the outcome becomes mathematically impossible — e.g. a `quorum` of 2-of-3 is rejected after the second rejection (only one approver remains), and a `weighted` level is rejected once the weight still achievable falls below `threshold`.\n\n```ts\n// Quorum: any 2 of these 3 directors must approve\n{\n  level: 1,\n  name: 'Board',\n  mode: 'quorum',\n  minApprovals: 2,\n  approvers: [\n    { type: 'user', userId: 'd1' },\n    { type: 'user', userId: 'd2' },\n    { type: 'user', userId: 'd3' },\n  ],\n}\n\n// Weighted: the CFO's vote (weight 3) clears the threshold alone;\n// otherwise three default-weight (1) approvers are needed.\n{\n  level: 1,\n  name: 'Exec Committee',\n  mode: 'weighted',\n  threshold: 3,\n  weights: { cfo: 3 }, // unlisted approvers default to weight 1\n  approvers: [\n    { type: 'user', userId: 'cfo' },\n    { type: 'user', userId: 'mgr' },\n  ],\n}\n```\n\n### Conditional chains\n\nConditions are evaluated **once at submit time** against `data` and determine which levels the instance will include:\n\n```ts\nconditions: [\n  // Add level 3 only when amount exceeds $50k\n  {\n    when: { field: 'amount', operator: '>', value: 50000 },\n    addLevels: [\n      { level: 3, name: 'CFO', approvers: [{ type: 'user', userId: 'cfo' }], mode: 'any' },\n    ],\n  },\n  // Skip manager level for internal transfers\n  {\n    when: { field: 'category', operator: '==', value: 'internal_transfer' },\n    skipLevels: [1],\n  },\n  // Multi-condition AND (array form)\n  {\n    when: [\n      { field: 'region', operator: 'in', value: ['APAC', 'EMEA'] },\n      { field: 'amount', operator: '>=', value: 5000 },\n    ],\n    addLevels: [\n      {\n        level: 4,\n        name: 'Regional VP',\n        approvers: [{ type: 'role', role: 'regional-vp' }],\n        mode: 'any',\n      },\n    ],\n  },\n];\n```\n\n**Built-in operators:** `>`, `<`, `>=`, `<=`, `==`, `!=`, `in`, `not_in`\n\n#### Combining conditions\n\nA `when` can be a single condition, an array (every element must hold), or a\nboolean group — `all`, `any`, `not` — which nest to any depth:\n\n```ts\nconditions: [\n  {\n    // (amount > 1000 AND dept is engineering) OR an explicit override flag\n    when: {\n      any: [\n        {\n          all: [\n            { field: 'amount', operator: '>', value: 1000 },\n            { field: 'dept', operator: '==', value: 'engineering' },\n          ],\n        },\n        { field: 'override', operator: '==', value: true },\n      ],\n    },\n    addLevels: [{ level: 3, name: 'CFO', approvers: [{ type: 'user', userId: 'cfo' }], mode: 'any' }],\n  },\n  {\n    // Everything outside the US skips the domestic finance review\n    when: { not: { field: 'region', operator: '==', value: 'US' } },\n    skipLevels: [2],\n  },\n]\n```\n\nA group sets exactly one of `all` / `any` / `not`. `any` short-circuits on the\nfirst child that holds. An array is shorthand for `all`, so every template\nwritten before groups existed keeps working unchanged.\n\nGroups are checked when the template is defined, not when a document is\nsubmitted — `validateTemplate()` and `defineTemplate()` reject an empty `all`,\na group setting two combinators, or a leaf missing its `field`/`operator`, and\nreport the offending path (`conditions[0].when.any[1].operator`). Operator\n*names* are deliberately not checked there, since custom operators may be\nregistered after the template is defined.\n\n#### How values are compared\n\n`==` and `!=` compare **strictly** — `'100'` does not equal `100`.\n\nThe numeric operators (`>`, `<`, `>=`, `<=`) match only when **both** sides are\nunambiguously numeric: finite numbers, bigints, `Date` (compared as epoch\nmilliseconds), and numeric strings such as `'100'` or `' 1e3 '` — because ERP\npayloads routinely arrive as JSON strings. Anything else — `null`, `undefined`,\n`true`/`false`, arrays, objects, blank strings, `NaN`, `Infinity` — is treated as\n*not comparable*, and the condition reports **no match**.\n\nThis matters for safety. A rule that skips levels on small amounts must not fire\non a document whose amount was never populated:\n\n```ts\n{ when: { field: 'amount', operator: '<', value: 5000 }, skipLevels: [2, 3] }\n\n// amount: 4999  -> matches, levels 2 and 3 are skipped\n// amount: null  -> NO match, every level is kept\n// amount: ''    -> NO match, every level is kept\n```\n\nField paths resolve **own properties only**, so an inherited or polluted\n`Object.prototype` member can never satisfy a condition. A path segment that is\nnot an own property — including `__proto__`, `constructor`, and `prototype` —\nresolves to `undefined`, exactly as a genuinely absent field does.\n\n**Register custom operators** at engine level:\n\n```ts\nengine.registerConditionOperator(\n  'contains',\n  (actual, expected) => typeof actual === 'string' && actual.includes(String(expected)),\n);\n```\n\nCustom numeric operators should reuse the same strictness via the exported\n`toComparableNumber` helper, which returns `null` for anything that is not\nunambiguously a number:\n\n```ts\nimport { toComparableNumber } from 'hierarchical-approval';\n\nengine.registerConditionOperator('between', (actual, expected) => {\n  const value = toComparableNumber(actual);\n  if (value === null || !Array.isArray(expected) || expected.length !== 2) return false;\n  const min = toComparableNumber(expected[0]);\n  const max = toComparableNumber(expected[1]);\n  if (min === null || max === null) return false;\n  return value >= min && value <= max;\n});\n```\n\n### Writing a custom storage adapter\n\nImplement `IStorageAdapter`. Most methods map straightforwardly onto a table;\none deserves a note:\n\n```ts\ncountInstances(tenantId: string, filter: InstanceFilter): Promise<number>;\n```\n\nReporting asks for counts far more often than rows, so this exists to let the\ndatabase answer with a real `COUNT(*)` rather than fetching a page and reading\nits total. If you have nothing better to hand, one line is a valid start:\n\n```ts\ncountInstances = (tenantId, filter) =>\n  this.getInstancesByFilter(tenantId, filter, { limit: 1, offset: 0 }).then((r) => r.total);\n```\n\n### Who is holding things up\n\n`getStatistics()` answers how the tenant is doing; `getWorkload()` answers who\nis holding it up — the question behind rebalancing a queue or deciding whom to\nhand a departing colleague's work to:\n\n```ts\nconst workload = await engine.getWorkload({ documentType: 'purchase_order' });\n// [\n//   { approverId: 'alice', pending: 12, instances: 11, overdue: 3, onHold: 1,\n//     oldestPendingAt: 2026-01-02T…, oldestAgeMs: 604800000 },\n//   ...\n// ]\n```\n\nBusiest queue first. `pending` counts open **levels**, `instances` counts\ndistinct documents — they differ when one person holds several branches of a\nparallel group. An approver who has already voted on a level that is still\ncollecting other votes owes nothing more and is not counted.\n\nComputed from pending instances rather than a dedicated index, so it works on\nany adapter with no new adapter methods — but it reads every pending instance in\nthe tenant. It is a reporting call, not something for a hot path.\n\n### Transferring a person's queue\n\nSomeone leaves, changes team, or goes on long-term leave, and their open\napprovals have to go somewhere:\n\n```ts\nconst result = await engine.transferApprovals({\n  fromApprover: 'alice',\n  toApprover: 'bob',\n  transferredBy: 'workflow-admin',\n  reason: 'Alice left the company',\n  documentType: 'purchase_order',  // optional scoping\n  dryRun: true,                    // see what would move first\n});\n// { transferred: [{ instanceId, level, documentId }], failed: [...], scanned, dryRun }\n```\n\nEach move goes through `reassign()`, so every guard, audit entry, event and\nauthorization check that applies to a single reassignment applies here too —\nthere is no bulk short-cut around them. Inside a parallel group each open branch\nis moved separately, since one person can hold several open levels on the same\ndocument.\n\nThe sweep is **not atomic**: it reports per-instance failures rather than rolling\nback. A partial transfer is the useful outcome — the approvals that can move\nshould move, and the ones that cannot are named so a human can look at them.\n\n### Comment threads\n\nComments are addressable objects, so approvers can reply to each other and name\nthe person a remark is aimed at:\n\n```ts\nawait engine.addComment(id, { actorId: 'mgr-1', comment: 'Need the quote.' });\nconst [question] = await engine.getComments(id);\n\nawait engine.addComment(id, {\n  actorId: 'buyer-1',\n  comment: 'Attached now, @mgr-1.',\n  parentCommentId: question.id,\n  mentions: ['mgr-1'],\n});\n```\n\n`getComments()` returns a flat list carrying `parentCommentId`, oldest first — a\nUI that wants threads can build them, and one that wants a chronological feed\n(what most approval screens show) does not have to flatten a structure it never\nwanted.\n\n`approval:commented` is addressed to the people the comment **mentions**, not to\nthe current approvers: a remark aimed at somebody should reach them, and one\naimed at nobody should not page the whole level. Comments are still written to\nthe audit trail, since the record of who said what belongs there.\n\n### Dry-running a workflow\n\n`explainChain()` says what the chain will be; `simulate()` says what happens to\nit — \"if the CFO rejects at level 3, does it go back to the submitter or die?\":\n\n```ts\nconst result = await engine.simulate({\n  templateName: 'purchase-order',\n  data: { amount: 20000 },\n  submittedBy: 'buyer-1',\n  decisions: [\n    { approve: 'mgr-1' },\n    { approve: 'fin-1' },\n    { reject: 'cfo', reason: 'over budget' },\n  ],\n});\n// { finalStatus: 'rejected', levels: [...], transcript: [...], unreachedLevels: [], incomplete: false }\n```\n\nThe run executes against a **private in-memory store** seeded with a copy of the\ntemplate, so your storage is untouched and no events reach your notification\nadapters. Custom resolvers and approver types are copied across — a simulation\nthat couldn't resolve your own `dynamic` approvers would answer a different\nquestion from the one you asked.\n\nA refused decision (wrong approver, wrong level, already acted) stops the run\nand appears in the transcript with its reason rather than throwing: the refusal\nis usually the answer you were looking for.\n\n### Why does this chain look like this?\n\n`previewApprovalChain()` answers *what* the chain will be. `explainChain()`\nanswers *why* — the question behind \"why does this purchase order have a CFO\nlevel?\":\n\n```ts\nconst explanation = await engine.explainChain('purchase-order', data, 'buyer-1');\n// {\n//   templateName: 'purchase-order',\n//   levels: [\n//     { level: 1, name: 'Manager', source: 'template', resolvedApprovers: ['mgr-1'], … },\n//     { level: 3, name: 'CFO', source: 'condition', addedByRule: 0, resolvedApprovers: ['cfo'], … },\n//   ],\n//   skipped: [{ level: 2, name: 'Finance', skippedByRule: 1 }],\n//   rules: [\n//     { index: 0, matched: true,  addsLevels: [3], skipsLevels: [] },\n//     { index: 1, matched: true,  addsLevels: [], skipsLevels: [2] },\n//   ],\n// }\n```\n\nEvery rule is reported, matched or not, along with what it *would* do — which is\nusually how you find the rule that was supposed to fire and didn't. A level\nwhose approvers cannot be resolved is still listed, with `resolutionError`\nnaming the reason; a rule that throws is reported against that rule rather than\nfailing the whole explanation, since the explanation is least useful at exactly\nthe moment a broken rule would make it throw.\n\nReads nothing and writes nothing, so it is safe to expose to a support UI.\n\n### Escalation ladders\n\nA single `escalation` fires once, so a request that stalls past its second\ndeadline has nowhere further to go. `escalationSteps` is a ladder:\n\n```ts\nescalationSteps: [\n  { afterDays: 2, escalateTo: { type: 'user', userId: 'director' } },\n  { afterDays: 4, escalateTo: { type: 'user', userId: 'vp' } },\n  { afterDays: 7, escalateTo: { type: 'role', role: 'exec' } },\n]\n```\n\nRungs are sorted by delay and fire in order, each **adding** an approver without\nremoving anyone already assigned — escalation widens the pool rather than\nhanding the work over.\n\nEvery delay is measured **from the moment the level opened**, not from the\nprevious escalation, so the ladder reads the way it is written: late at day 2,\nlater at day 4, latest at day 7. Rungs accept `afterHours` too, counted through\nthe working-hours calendar if one is configured.\n\nA per-level `escalationAfterDays`/`escalationAfterHours` still wins for *when*\nthe first rung fires — it is the more specific statement about that level — while\nthe ladder supplies *who*. Templates with only the single-step `escalation`\nbehave exactly as before.\n\n### SLAs in working hours\n\nDeadlines were whole days, so \"respond within four working hours\" could only be\napproximated. Levels take `escalationAfterHours` and templates take\n`slaDeadlineHours`, counted through a working-hours calendar:\n\n```ts\nimport { businessHoursCalendar } from 'hierarchical-approval';\n\nconst engine = new ApprovalEngine({\n  adapter,\n  calendar: businessHoursCalendar({ workdayStartHour: 9, workdayEndHour: 17 }),\n});\n\n// Submitted Friday 16:00, escalationAfterHours: 4  ->  due Monday 12:00\n```\n\nEvenings, weekends and holidays are skipped, and a request arriving outside\nworking hours starts counting from the next working moment — so one submitted at\n20:00 is not already overdue by morning.\n\n`weekendCalendar` knows whole days only. Give it an hour-based deadline and the\nengine falls back to **elapsed clock time**, rather than quietly pretending the\ncalendar applied; use `businessHoursCalendar` when hours should skip\nnon-working time. Days and hours are mutually exclusive on the same level or\ntemplate, and `validateTemplate()` rejects setting both.\n\n### Retention\n\nApproval tables only grow, and data-minimisation rules eventually require old\nrecords to go:\n\n```ts\nconst result = await engine.purgeInstances({\n  olderThan: new Date('2024-01-01'),\n  statuses: ['approved', 'rejected'],   // terminal statuses only\n  documentType: 'purchase_order',       // optional\n  limit: 1000,                          // default 1000\n  dryRun: true,                         // see what would go first\n});\n```\n\n**Only terminal instances are eligible.** A pending approval is live work, and\ndeleting one would strand a document with no way to finish and no record of why.\nPassing a non-terminal status is rejected rather than quietly ignored.\n\nThis is irreversible and removes the audit trail with the instance. In many\ndeployments that trail *is* the compliance record — which is why the underlying\n`deleteInstance` is an **optional** adapter method. An adapter that does not\nimplement it makes purging unavailable, and the call throws rather than\nreporting a successful purge of nothing.\n\n### Promoting templates between environments\n\nApproval configuration is authored somewhere safe, reviewed, then promoted.\n`exportTemplates()` produces a portable bundle and `importTemplates()` applies\nit:\n\n```ts\nconst bundle = await sandbox.exportTemplates(['PO', 'INV']);   // omit names for all\nconst result = await production.importTemplates(bundle, { mode: 'upsert', dryRun: true });\n// { created: [], updated: ['PO', 'INV'], skipped: [], errors: [], dryRun: true }\n```\n\nA bundle is plain JSON and carries **no** `id`, `tenantId`, `createdAt`,\n`version` or `previousVersionId` — those describe one row in one database, and\nimporting them would either collide with the target's ids or claim a lineage the\ntarget never had. The target assigns its own.\n\n`mode: 'create'` (the default) skips templates that already exist; `'upsert'`\nupdates them, bumping the version and recording `previousVersionId` as a normal\n`updateTemplate()` would.\n\n**Every template is validated before any is written.** A half-applied bundle\nleaves the tenant matching neither environment with no way to tell which half\nlanded, so a bundle that fails validation is rejected whole, naming the\noffending template.\n\n### Sub-workflows\n\nA level can delegate to a whole separate approval instead of to a list of\napprovers — \"a capital request over 1M needs its own board approval before this\npurchase order can proceed\" — without flattening the board's chain into the\npurchase order's:\n\n```ts\nlevels: [\n  { level: 1, name: 'Manager', approvers: [{ type: 'user', userId: 'mgr' }], mode: 'any' },\n  { level: 2, name: 'Board approval', mode: 'any', approvers: [],\n    subWorkflow: { templateName: 'BOARD' } },\n  { level: 3, name: 'CEO', approvers: [{ type: 'user', userId: 'ceo' }], mode: 'any' },\n]\n```\n\nWhen level 2 opens, a child instance is submitted against `BOARD`, carrying the\nparent's document data so the child's own conditions see the same document. The\nparent level stays open, with no approvers of its own, until the child finishes.\n\n| Child outcome | Parent |\n|---|---|\n| `approved` | Level approved; the chain advances |\n| `rejected`, `cancelled`, `expired` | Parent rejected |\n\nCollapsing the non-approved outcomes into one rejection is deliberate: a parent\nthat treated a cancelled child as \"carry on\" would advance past a gate nobody\ncleared.\n\n**A finished parent ends its children.** If a parent is cancelled or rejected\nwhile a child is still running, the child is cancelled too, with the reason\nnaming the parent — otherwise it would keep asking people to decide something\nwhose outcome nobody will read. A child that already finished is left alone.\n`purgeInstances()` likewise removes a whole sub-workflow family together, so a\nchild is never orphaned behind a deleted parent.\n\nChildren link back via `parentInstanceId` and `parentLevel`, and the level\nrecords `childInstanceId`. Nesting is allowed up to five levels deep, and\n`validateTemplate()` rejects a template that would spawn itself. Emits\n`approval:subworkflow_started` / `approval:subworkflow_completed`.\n\n### Attachments\n\nAttach supporting evidence — a quote PDF, a signed contract, a screenshot of a\nsystem of record:\n\n```ts\nconst withQuote = await engine.addAttachment(instance.id, {\n  actorId: 'buyer-1',\n  name: 'quote.pdf',\n  uri: 's3://procurement/quotes/q-1.pdf',   // a reference, not bytes\n  contentType: 'application/pdf',\n  sizeBytes: 48_120,\n});\n\nawait engine.removeAttachment(instance.id, {\n  actorId: 'buyer-1',\n  attachmentId: withQuote.attachments[0].id,\n  reason: 'superseded by revised quote',\n});\n```\n\n**The engine stores references, never bytes.** Approval documents belong in the\nobject store or DMS you already run, which handles retention, virus scanning and\naccess control far better than an approval table could — copying them here would\nmake the audit database the largest and least governed copy of them.\n\nRemoving detaches the reference; it never deletes from the underlying store,\nwhich is the DMS's call. The audit entry keeps the name and URI of what was\nremoved, so the trail still shows an approver saw evidence that is no longer\nlisted.\n\nEmits `approval:attachment_added` / `approval:attachment_removed`. Allowed on\nany non-terminal instance, subject to your authorization policy.\n\n### Asking the submitter a question\n\nApprovers routinely need one fact before they can decide. `requestInfo()` puts\nthe approval on hold without rejecting it:\n\n```ts\nawait engine.requestInfo(instance.id, {\n  approverId: 'mgr-1',\n  question: 'Which cost centre should this book to?',\n});\n\n// ...later\nawait engine.provideInfo(instance.id, {\n  respondedBy: 'buyer-1',\n  response: 'CC-42',\n});\n```\n\nThe instance stays `pending` and keeps its approvers — this is a question, not a\ndecision. What changes is the clock: **escalation, SLA, reminder and expiry\ndeadlines stop advancing while the question is open**, and on answer every one\nis pushed out by exactly how long the hold lasted. An approver gets back the\ntime they had before asking, rather than being penalised for asking.\n\nEmits `approval:info_requested` (addressed to the submitter) and\n`approval:info_provided` (addressed to the waiting approvers, carrying\n`heldForMs`), and records `info_requested` / `info_provided` audit entries.\n\nOnly one question can be open at a time; answer it before asking another.\n\n### Filtering by document data\n\nEvery query filter accepts `data`, matching against the document body itself —\n\"every purchase order for vendor ACME\" without fetching pages and filtering in\napplication code:\n\n```ts\nconst { items } = await engine.queryInstances({\n  status: 'pending',\n  data: { 'vendor.id': 'v-1', region: 'EU' },   // dot-paths; all pairs must match\n});\n```\n\nValues compare by deep equality, so an object or array value matches\nstructurally. Keys resolve over **own** properties only, mirroring how\nconditions read field paths, so an inherited prototype member can never make an\ninstance match. Works with `queryInstances()`, `queryInstancesByCursor()` and\n`getStatistics()`.\n\nOn PostgreSQL this becomes a parameterised JSONB path lookup — the path travels\nas a parameter and is never interpolated into SQL. Index the paths you filter on\noften:\n\n```sql\nCREATE INDEX ON approval_instances ((data #> '{vendor,id}'));\n```\n\n### Out-of-office cover\n\nApprovers go on leave, and a chain that waits on an absent person stalls.\nConfigure a provider and absent approvers are swapped for their stand-in\nwherever approvers are resolved — at submit, when a level activates, on\nescalation, and in `previewApprovalChain()`:\n\n```ts\nconst engine = new ApprovalEngine({\n  adapter,\n  outOfOfficeProvider: {\n    // Return the stand-in, or null when the approver is available.\n    getDelegateFor: async (userId, at) => hr.coverFor(userId, at),\n  },\n});\n```\n\nAbsence lives in the HR or directory system that already tracks leave, so this\nis an injected provider rather than engine-owned state — duplicating that data\nhere would guarantee the two disagree. The resolution time is passed in, so\ncover can be date-bound.\n\nSubstitution is transitive (A away → B, B away → C lands on C) up to five hops.\nA cover *cycle* stops rather than looping, and a provider that throws is treated\nas \"no cover known\" — an HR lookup failing must not stop an approval being\nrouted at all.\n\n### Template inheritance\n\nERP tenants run many near-identical workflows — one per region, entity or\ndocument class — that share a spine and differ in a level or two. `extends`\nderives one template from another:\n\n```ts\nawait engine.defineTemplate({\n  name: 'PO-EU',\n  extends: 'PO-base',\n  documentType: 'purchase_order',\n  removeLevels: [2],                       // drop an inherited level\n  levels: [\n    { level: 3, approvers: [{ type: 'user', userId: 'eu-fin' }] },  // override just the approvers\n    { level: 4, name: 'EU Compliance', approvers: [...], mode: 'any' }, // add a new level\n  ],\n});\n```\n\n| Field | Merge rule |\n|---|---|\n| `levels` | Keyed by level number: a child level overrides the base level *field by field*, child-only levels are appended, `removeLevels` drops inherited ones |\n| `conditions` | Replaced wholesale when the child supplies them |\n| `escalation`, `slaDeadlineDays`, `allowOverride` | Child value if set, otherwise inherited |\n\n**Resolution happens once, at define time, and the flattened result is stored.**\nEditing a base later never silently reshapes a derived template or an instance\nalready running against one — the same insulation `templateSnapshot` gives\nin-flight instances. A base that itself extends something is already flattened,\nso chains resolve naturally and cycles cannot form.\n\nValidation runs on the *flattened* template, so a derived config that strips its\nwhole chain is rejected at definition time.\n\n### Reminders\n\nEscalation reassigns work; a reminder only nudges, which is usually what an\noverdue-but-not-yet-critical approval needs. Configure it per level:\n\n```ts\n{\n  level: 1,\n  name: 'Manager',\n  approvers: [{ type: 'user', userId: 'mgr-1' }],\n  mode: 'any',\n  reminderAfterDays: 2,   // first nudge two days after the level opens\n  reminderEveryDays: 1,   // then daily\n  maxReminders: 3,        // default is 3\n}\n```\n\nEmits `approval:reminder` with `level`, `recipients` and `reminderNumber`, and\nrecords a `reminded` audit entry. Recipients exclude anyone who has already\nvoted, so a half-decided quorum level stops pestering the approvers who did\ntheir part. Reminders stop when the level closes or the cap is reached, and they\nnever change who can approve or when the level escalates.\n\nRequires the escalation scheduler to be running (it is by default).\n\n### Reading the approval frontier\n\n`instance.openLevels` lists every level currently collecting decisions —\none entry for a sequential chain, several inside a parallel group, none once the\ninstance is terminal:\n\n```ts\nconst { openLevels, currentLevel } = await engine.getInstance(id);\n// sequential:      openLevels [2],    currentLevel 2\n// parallel group:  openLevels [2, 3], currentLevel 2\nawait engine.getOpenLevels(id);   // same list, without the whole instance\n```\n\n**`currentLevel` names only the lowest open level.** That is the whole frontier\nfor a sequential chain and one branch of a parallel group, so use `openLevels`\nto decide who may act, what to notify, or what is overdue. Reading `currentLevel`\nas the frontier was the root cause of six defects fixed across 3.x.\n\nBoth are maintained by the engine; `currentLevel` is derived from `openLevels`\nand recomputed on every write.\n\n### Parallel branch groups\n\nGive levels the same `group` name and they activate together, joining before\nthe chain moves on — \"Finance and Legal review concurrently, then it goes to the\nCEO\":\n\n```ts\nlevels: [\n  { level: 1, name: 'Manager', approvers: [{ type: 'user', userId: 'mgr' }], mode: 'any' },\n  { level: 2, name: 'Finance', group: 'review', approvers: [{ type: 'role', role: 'finance' }], mode: 'any' },\n  { level: 3, name: 'Legal',   group: 'review', approvers: [{ type: 'role', role: 'legal' }],   mode: 'any' },\n  { level: 4, name: 'CEO',     approvers: [{ type: 'user', userId: 'ceo' }], mode: 'any' },\n]\n```\n\nBoth branches open at once when the group is reached, decisions can arrive in\neither order, and level 4 stays `waiting` until every branch is approved.\nRejecting any branch rejects the instance. A group may also lead the chain, in\nwhich case it opens at submit.\n\n`getCurrentApprovers()` returns the union across every open branch. A level\nwithout a `group` is its own group of one, so existing sequential templates\nbehave exactly as before.\n\n**When one person sits on two open branches**, `approve()` refuses to guess and\nthrows — pass `level` to say which branch the decision is for:\n\n```ts\nawait engine.approve(id, { approverId: 'cfo', level: 2 });\n```\n\nA group's levels must occupy a contiguous run of level numbers;\n`validateTemplate()` rejects an interleaved group.\n\n### Editing a document mid-flight\n\nDocuments change after submission — a line item is corrected, a vendor\nreclassified, an amount revised. `updateData()` applies the change and\nre-evaluates the template's conditions, so the chain reflects the corrected\ndocument without cancelling and resubmitting (which would throw away the\napprovals already collected):\n\n```ts\nconst updated = await engine.updateData(instance.id, {\n  updatedBy: 'buyer-1',\n  data: { amount: 20000 },   // merged into existing data\n  reason: 'Corrected line items',\n});\n// amount crossed the 10k threshold -> the CFO level is now in the chain\n```\n\n| Option | Default | Meaning |\n|---|---|---|\n| `data` | required | Fields to apply |\n| `mode` | `'merge'` | `'merge'` keeps untouched keys; `'replace'` swaps the whole object |\n| `reason` | — | Recorded on the audit entry |\n| `recomputeChain` | `true` | Set `false` to correct data without touching the chain |\n\n**Decided history is frozen.** Only levels *after* the current one are\nrecomputed. A level that is already approved, or is actively collecting\ndecisions, is never removed — a `skipLevels` condition that would drop it is\nignored, because an approval that has been given cannot be retracted by editing\ndata. A condition that would *insert* a level at or before the current one\nthrows rather than silently dropping a required approval step; cancel and\nresubmit if the chain genuinely must change retroactively.\n\nEmits `approval:data_updated` with `changedFields`, `addedLevels` and\n`removedLevels`, and records a `data_updated` audit entry holding the before and\nafter data. Only pending instances can be edited.\n\n---\n\n## Installation and setup\n\n### PostgreSQL (production)\n\n```ts\nimport { ApprovalEngine } from 'hierarchical-approval';\nimport { PostgresAdapter } from 'hierarchical-approval/adapters/postgres';\n\nconst adapter = new PostgresAdapter({\n  connectionString: process.env.DATABASE_URL,\n  // or: pool — bring your own pg.Pool\n  schema: 'public', // default\n  tablePrefix: 'ha', // prefix for all table names (validated: /^[a-z][a-z0-9_]*$/)\n  statementTimeoutMs: 5000,\n  ssl: { rejectUnauthorized: true },\n});\n\nconst engine = new ApprovalEngine({ adapter, tenantId: 'acme' });\n```\n\n### In-memory (development / tests)\n\n```ts\nimport { MemoryAdapter } from 'hierarchical-approval/adapters/memory';\n// or via the main export:\nimport { MemoryAdapter } from 'hierarchical-approval';\n\nconst engine = new ApprovalEngine({ adapter: new MemoryAdapter(), tenantId: 'dev' });\n```\n\n---\n\n## `new ApprovalEngine(options)`\n\nAll options except `adapter` are optional.\n\n| Option                     | Type                     | Default                                             | Description                                                |\n| -------------------------- | ------------------------ | --------------------------------------------------- | ---------------------------------------------------------- |\n| `adapter`                  | `IStorageAdapter`        | **required**                                        | Storage backend                                            |\n| `tenantId`                 | `string`                 | `'default'`                                         | Tenant scope — all data is isolated per tenant             |\n| `clock`                    | `Clock`                  | `systemClock`                                       | Injectable time source — `{ now(): Date }`                 |\n| `generateId`               | `IdGeneratorFn`          | timestamp + random                                  | Custom ID generator (ULID, UUID v7, etc.)                  |\n| `retryPolicy`              | `RetryPolicy`            | `{ maxAttempts: 3, baseDelayMs: 50, jitter: true }` | Optimistic lock retry behaviour                            |\n| `idempotencyKeyFn`         | `IdempotencyKeyFn`       | SHA-256 of tenant+docType+docId+template            | Custom dedup key strategy                                  |\n| `notificationAdapter`      | `INotificationAdapter`   | —                                                   | Typed events after each approval action                    |\n| `auditAdapter`             | `IAuditAdapter`          | —                                                   | Write-once external audit sink                             |\n| `metricsAdapter`           | `IMetricsAdapter`        | —                                                   | Prometheus / Datadog counters + timings                    |\n| `schedulerAdapter`         | `ISchedulerAdapter`      | built-in `setInterval` poll                         | BullMQ / Temporal / EventBridge escalation                 |\n| `authorizationPolicy`      | `IAuthorizationPolicy`   | —                                                   | Per-operation authorization rules                          |\n| `middleware`               | `IOperationMiddleware[]` | —                                                   | Before / after / onError hooks on every operation          |\n| `orgProvider`              | `OrgProvider`            | —                                                   | Resolves role members and org hierarchy                    |\n| `logger`                   | `Logger`                 | `noopLogger`                                        | Pino-compatible logger                                     |\n| `escalationPollIntervalMs` | `number`                 | `60_000`                                            | Escalation poll interval (ms) — set `0` to disable polling |\n| `maxBulkItems`             | `number`                 | `200`                                               | Max instances per `bulkApprove` / `bulkReject` call        |\n\n---\n\n## Approver types\n\n### Built-in types\n\n```ts\n// Exact user ID\n{ type: 'user', userId: 'alice' }\n\n// Role — resolved via orgProvider.getUsersByRole()\n{ type: 'role', role: 'finance-team' }\n\n// Dynamic — resolved via a named resolver registered with engine.registerResolver()\n{ type: 'dynamic', resolver: 'direct-manager' }\nengine.registerResolver('direct-manager', async (submittedBy, data) => {\n  const manager = await hrSystem.getManager(submittedBy);\n  return manager.id;\n});\n```\n\n### Custom approver types\n\nRegister any type beyond the built-in three:\n\n```ts\nengine.registerApproverType('department', async (config, ctx) => {\n  // config is the raw approver object from the template\n  const dept = config.department as string;\n  return ctx.orgProvider?.getUsersByDepartment?.(dept) ?? [];\n});\n\n// Use it in a template:\n{ type: 'department', department: 'legal' }\n```\n\nThe `OrgProvider` interface also exposes optional methods for richer org traversal:\n\n```ts\ninterface OrgProvider {\n  getUsersByRole(role: string, tenantId?: string): Promise<string[]> | string[];\n  getUsersByDepartment?(dept: string, tenantId?: string): Promise<string[]> | string[];\n  getManagerOf?(userId: string, tenantId?: string): Promise<string | null> | string | null;\n  getSkipLevelManagerOf?(userId: string, tenantId?: string): Promise<string | null> | string | null;\n  getUsersByAttribute?(\n    attr: string,\n    value: unknown,\n    tenantId?: string,\n  ): Promise<string[]> | string[];\n}\n```\n\n---\n\n## Lifecycle operations\n\n### Submit\n\n```ts\nconst instance = await engine.submit({\n  templateName: 'purchase-order', // must exist\n  documentId: 'po-0042',\n  documentType: 'purchase_order',\n  submittedBy: 'alice',\n  data: { amount: 15000 }, // evaluated against template conditions\n  metadata: { source: 'web-ui' }, // arbitrary metadata, not evaluated\n  expiresAt: new Date('2025-12-31'), // hard deadline (optional)\n  deadlineAction: 'reject', // what to do when deadline passes (default: 'cancel')\n});\n```\n\nSubmitting the same `(tenantId, documentType, documentId, templateName)` again while the instance is still pending returns the **existing instance** rather than creating a duplicate.\n\n### Approve\n\n```ts\nawait engine.approve(instanceId, {\n  approverId: 'mgr-1',\n  comment: 'Approved for Q4 budget', // optional\n});\n```\n\nAdvancing the last level sets `instance.status = 'approved'` and emits `approval:completed`.\n\n### Reject\n\n```ts\nawait engine.reject(instanceId, {\n  approverId: 'mgr-1',\n  reason: 'Over budget cap', // required\n  returnTo: 'previous', // optional: 'originator' | 'previous'\n});\n```\n\n- Omitting `returnTo`: instance is marked `'rejected'`\n- `returnTo: 'previous'`: resets the previous level so the chain can continue\n- `returnTo: 'originator'`: same as default — marks `'rejected'`\n\n### Delegate\n\n```ts\nawait engine.delegate(instanceId, {\n  fromApprover: 'mgr-1',\n  toApprover: 'deputy-mgr',\n  reason: 'On leave',\n  until: new Date('2025-11-15'), // optional — delegation auto-reverts after this date\n});\n```\n\n### Reassign\n\nAdministratively swap an approver on the current level — for when an assigned approver is unavailable and a third party (e.g. an admin) needs to hand the task to someone else. Unlike `delegate`, the original approver doesn't initiate it. The approver being replaced must still be pending (one who has already approved or rejected cannot be reassigned), and the new approver must not already be on the level.\n\n```ts\nawait engine.reassign(instanceId, {\n  reassignedBy: 'workflow-admin',\n  fromApprover: 'mgr-1',\n  toApprover: 'mgr-2',\n  reason: 'Approver left the company',\n});\n```\n\nEmits `approval:reassigned` and records a `reassigned` audit entry.\n\n### Escalate\n\n```ts\nawait engine.escalate(instanceId, { escalatedBy: 'system' });\n```\n\nAdds the escalation approver (from `template.escalation.escalateTo`) to the current level's approver list. Also fires automatically via the scheduler when `escalationAfterDays` elapses.\n\n#### Business-day deadlines\n\nBy default `escalationAfterDays` and `slaDeadlineDays` count plain calendar days. Pass a `calendar` to the engine to count **business days** instead — skipping weekends and holidays:\n\n```ts\nimport { ApprovalEngine, weekendCalendar } from 'hierarchical-approval';\n\nconst engine = new ApprovalEngine({\n  adapter,\n  calendar: weekendCalendar({\n    holidays: [new Date('2026-12-25'), new Date('2027-01-01')],\n    // weekendDays: [5, 6], // optional — e.g. Fri/Sat weekend\n  }),\n});\n```\n\nWith this calendar, a level whose `escalationAfterDays: 2` is submitted on a Friday becomes due the following Tuesday rather than Sunday. Provide your own `BusinessCalendar` implementation for region-specific rules.\n\n### Cancel\n\n```ts\nawait engine.cancel(instanceId, {\n  cancelledBy: 'alice',\n  reason: 'PO no longer needed',\n});\n```\n\n### Resubmit\n\nCreates a new instance linked to the rejected original via `parentInstanceId`:\n\n```ts\nconst newInstance = await engine.resubmit(instanceId, {\n  resubmittedBy: 'alice',\n  reason: 'Revised amount',\n  updatedData: { amount: 9000 }, // merged with original data\n});\n```\n\n### Override\n\nBypasses all remaining levels. Requires `template.allowOverride: true`:\n\n```ts\nawait engine.override(instanceId, {\n  overriddenBy: 'cfo',\n  justification: 'Board resolution 2025-Q4-001',\n});\n```\n\n### Add comment\n\nAdds a comment to the audit log without changing state:\n\n```ts\nawait engine.addComment(instanceId, {\n  actorId: 'legal-team',\n  comment: 'Legal review completed — no issues found',\n});\n```\n\n### Bulk operations\n\n```ts\nconst result = await engine.bulkApprove(['id-1', 'id-2', 'id-3'], {\n  approverId: 'mgr-1',\n  comment: 'Year-end batch approval',\n});\n// result: { succeeded: ApprovalInstance[], failed: { instanceId, error }[], total: number }\n\nconst result = await engine.bulkReject(['id-4', 'id-5'], {\n  approverId: 'mgr-1',\n  reason: 'Over budget',\n});\n```\n\nIndividual failures do not abort the batch — they are collected in `result.failed`.\n\n### Audit context\n\nEvery mutating operation accepts an optional second argument to attach request metadata to the audit entry:\n\n```ts\nawait engine.approve(\n  instanceId,\n  { approverId: 'mgr-1' },\n  {\n    ipAddress: req.ip,\n    userAgent: req.headers['user-agent'],\n    sessionId: req.session.id,\n  },\n);\n```\n\n---\n\n## Queries\n\n### Single instance\n\n```ts\nconst instance = await engine.getInstance(instanceId);\n```\n\n### Pending work for an approver\n\n```ts\nconst { items, total } = await engine.getPendingFor('mgr-1', { limit: 20, offset: 0 });\n```\n\n### Filtered list (offset pagination)\n\n```ts\nconst { items, total } = await engine.queryInstances(\n  {\n    status: 'pending', // optional\n    documentType: 'invoice', // optional\n    submittedBy: 'alice', // optional\n    fromDate: new Date('2025-01-01'), // optional\n    toDate: new Date('2025-12-31'), // optional\n  },\n  { limit: 50, offset: 0 },\n);\n```\n\n### Cursor pagination (large datasets)\n\n```ts\nlet cursor: string | undefined;\ndo {\n  const page = await engine.queryInstancesByCursor({ status: 'pending' }, { limit: 100, cursor });\n  await processPage(page.items);\n  cursor = page.nextCursor;\n} while (cursor);\n```\n\nReturns `{ items, nextCursor, prevCursor, hasMore }`. Requires the storage adapter to implement `getInstancesByCursor()` — both `MemoryAdapter` and `PostgresAdapter` do.\n\n### Audit history\n\n```ts\nconst entries: AuditEntry[] = await engine.getHistory(instanceId);\n// entries[n]: { action, actorId, level, timestamp, comment?, reason?, oldValue?, newValue? }\n```\n\n### Current approvers\n\n```ts\nconst approverIds: string[] = await engine.getCurrentApprovers(instanceId);\n// [] if not pending\n```\n\n---\n\n## Template management\n\n```ts\n// Define (throws if name already exists)\nconst templateId = await engine.defineTemplate({ name, documentType, levels, ... });\n\n// Update — increments version, sets previousVersionId, never breaks in-flight instances\nconst newTemplateId = await engine.updateTemplate({ name, documentType, levels, ... });\n\n// Read\nconst template = await engine.getTemplate('purchase-order');\n// template.version, template.previousVersionId, template.createdAt\n\nconst all = await engine.listTemplates();\n\n// Validate without persisting (synchronous, never throws)\nconst { valid, errors } = engine.validateTemplate(config);\n// errors: [{ field: string, message: string }]\n```\n\n---\n\n## Utility methods\n\n### Preview the approval chain\n\nSee which levels would be active for a given document's data — without creating an instance:\n\n```ts\nconst preview = await engine.previewApprovalChain(\n  'purchase-order',\n  { amount: 15000 },\n  'alice', // submittedBy — needed for dynamic resolver context\n);\n// preview.levels: [{ level, name, resolvedApprovers, mode }]\n// preview.conditionsApplied: [0, 1]  — 0-based indices of conditions that fired\n```\n\n### Check eligibility\n\n```ts\nconst result = await engine.canApprove(instanceId, 'mgr-1');\n// result.eligible: boolean\n// result.reason: 'not_an_approver' | 'already_acted' | 'self_approval' | 'wrong_status' | 'delegated_away'\n```\n\nNever throws — always returns a structured result.\n\n### Statistics\n\nAggregate counts for dashboards. Pass an optional filter (`documentType`, `submittedBy`, `fromDate`/`toDate`) to scope the numbers; `status` is ignored since every status is counted.\n\n```ts\nconst stats = await engine.getStatistics({ documentType: 'purchase_order' });\n// {\n//   total: number,\n//   byStatus: { pending, approved, rejected, cancelled, expired },\n//   overdue: number,        // pending past an escalation/expiry deadline\n//   approvalRate: number,   // approved / (approved + rejected); 0 when none resolved\n//   byTemplate: Record<string, { total, approved, rejected, pending }>,\n//   cycleTime: CycleTimeStats,\n//   cycleTimeByTemplate: Record<string, CycleTimeStats>,\n// }\n```\n\n`byTemplate` breaks the same counts down per template name (only populated for templates with at least one matching instance).\n\n**Cycle-time analytics.** `cycleTime` (and its per-template mirror `cycleTimeByTemplate`) reports time-to-decision, in milliseconds, as `{ count, averageMs, p50Ms, p95Ms, minMs, maxMs }`:\n\n```ts\nconsole.log(`Median time-to-decision: ${(stats.cycleTime.p50Ms / 60_000).toFixed(1)} min`);\nconsole.log(`p95 over ${stats.cycleTime.count} completed instances: ${stats.cycleTime.p95Ms}ms`);\n\nfor (const [templateName, timing] of Object.entries(stats.cycleTimeByTemplate)) {\n  console.log(templateName, timing.averageMs);\n}\n```\n\nOnly instances in status `approved`, `rejected`, or `cancelled` count as \"completed\" for this calculation — **`expired` is deliberately excluded**: its terminal timestamp reflects a scheduler deadline firing, not a decision being made, so including it would skew the distribution rather than describe it. Elapsed time per instance is `updatedAt - createdAt`. When `count` is `0` every other field is `0`, never `NaN`.\n\n### Health check\n\n```ts\nconst health = await engine.healthCheck();\n// {\n//   status: 'healthy' | 'degraded' | 'unhealthy',\n//   adapter: 'connected' | 'error',\n//   pendingCount: number,\n//   overdueCount: number,     // > 0 → status becomes 'degraded'\n//   escalationRunning: boolean,\n//   lastTickAt?: Date,\n// }\n```\n\n### Shutdown\n\nAlways call `shutdown()` before process exit to stop the escalation scheduler and any custom `schedulerAdapter`:\n\n```ts\nawait engine.shutdown();\n```\n\n---\n\n## Events\n\n```ts\nengine.on('approval:submitted', (payload) => {\n  /* instance submitted */\n});\nengine.on('approval:approved', (payload) => {\n  /* level or fully approved */\n});\nengine.on('approval:rejected', (payload) => {\n  /* level rejected */\n});\nengine.on('approval:level_advanced', (payload) => {\n  /* moved to next level */\n});\nengine.on('approval:delegated', (payload) => {\n  /* approver delegated */\n});\nengine.on('approval:reassigned', (payload) => {\n  /* approver reassigned by admin */\n});\nengine.on('approval:escalated', (payload) => {\n  /* escalated to new approver */\n});\nengine.on('approval:cancelled', (payload) => {\n  /* cancelled */\n});\nengine.on('approval:expired', (payload) => {\n  /* deadline passed */\n});\nengine.on('approval:overridden', (payload) => {\n  /* override applied */\n});\nengine.on('approval:resubmitted', (payload) => {\n  /* new instance from rejected */\n});\nengine.on('approval:sla_breached', (payload) => {\n  /* SLA deadline passed */\n});\nengine.on('approval:completed', (instance) => {\n  /* fully approved or overridden */\n});\n\nengine.off('approval:approved', handler);\n```\n\nEach event payload contains `instanceId`, `documentId`, `documentType`, `timestamp`, plus event-specific fields (e.g., `approverId`, `level`, `isFinal` on `approval:approved`).\n\n---\n\n## Enterprise adapters\n\nAll adapters are **fail-safe** — a failure in any adapter is caught, logged via the configured `Logger`, and swallowed. A broken Kafka connection will never prevent an approval from completing.\n\n### `INotificationAdapter` — send notifications on every event\n\n```ts\nimport type { INotificationAdapter, NotificationEvent } from 'hierarchical-approval';\n\nclass SlackNotifier implements INotificationAdapter {\n  async notify(event: NotificationEvent): Promise<void> {\n    // event.type        — e.g. 'approval:approved'\n    // event.instanceId  — approval instance ID\n    // event.recipients  — current level's approverIds\n    // event.templateName\n    // event.tenantId\n    // event.payload     — full typed event payload\n    if (event.type === 'approval:level_advanced') {\n      await slack.post(event.recipients, `Your approval is needed on ${event.documentId}`);\n    }\n  }\n}\n\nconst engine = new ApprovalEngine({ adapter, notificationAdapter: new SlackNotifier() });\n```\n\n### `IAuditAdapter` — write-once external audit sink\n\nCalled in addition to the storage adapter's built-in audit log. Use for Kafka, S3, CloudTrail, or any WORM sink:\n\n```ts\nimport type { IAuditAdapter } from 'hierarchical-approval';\n\nclass KafkaAudit implements IAuditAdapter {\n  async append(\n    tenantId: string,\n    instanceId: string,\n    entry: AuditEntry,\n    instance: Readonly<ApprovalInstance>,\n  ): Promise<void> {\n    await producer.send({\n      topic: 'approvals.audit',\n      messages: [\n        { value: JSON.stringify({ tenantId, instanceId, entry, version: instance.version }) },\n      ],\n    });\n  }\n}\n```\n\n### `IMetricsAdapter` — Prometheus / Datadog / OpenTelemetry\n\n```ts\nimport type { IMetricsAdapter, MetricName } from 'hierarchical-approval';\n\nclass PrometheusAdapter implements IMetricsAdapter {\n  increment(metric: MetricName, labels?: Record<string, string>): void {\n    counters[metric].labels(labels ?? {}).inc();\n  }\n  timing(metric: MetricName, durationMs: number, labels?: Record<string, string>): void {\n    histograms[metric].labels(labels ?? {}).observe(durationMs / 1000);\n  }\n}\n```\n\nBuilt-in metric names: `approval.submitted`, `approval.approved`, `approval.rejected`, `approval.cancelled`, `approval.expired`, `approval.sla_breached`, `approval.escalated`, `approval.overridden`, `approval.conflict_retry`, `approval.operation_duration_ms`.\n\nAll increments include a `tenantId` label. Duration metrics include an `operation` label.\n\n### `ISchedulerAdapter` — BullMQ, Temporal, EventBridge\n\nReplace the built-in `setInterval` poll with a proper job queue:\n\n```ts\nimport type { ISchedulerAdapter } from 'hierarchical-approval';\n\nclass BullMQScheduler implements ISchedulerAdapter {\n  async scheduleAt(id: string, runAt: Date, callback: () => Promise<void>): Promise<string> {\n    const job = await queue.add('tick', { id }, { delay: runAt.getTime() - Date.now() });\n    // store job → callback mapping in your queue worker\n    return job.id;\n  }\n  async cancel(handle: string): Promise<void> {\n    await queue.remove(handle);\n  }\n  async shutdown(): Promise<void> {\n    await queue.close();\n  }\n}\n```\n\n### `IAuthorizationPolicy` — per-operation access control\n\nCalled after input validation, before any state changes:\n\n```ts\nimport type { IAuthorizationPolicy, AuthorizationContext } from 'hierarchical-approval';\nimport { ApprovalForbiddenError } from 'hierarchical-approval';\n\nclass SigningAuthorityPolicy implements IAuthorizationPolicy {\n  async authorize(ctx: AuthorizationContext): Promise<string | undefined> {\n    // ctx.operation — 'approve' | 'reject' | 'delegate' | 'reassign' | 'cancel' | 'escalate'\n    //               | 'override' | 'resubmit' | 'addComment' | 'submit'\n    // ctx.actorId   — who is performing the action\n    // ctx.instance  — current instance (read-only)\n    // ctx.level     — current level instance (read-only, on level operations)\n    // ctx.opts      — raw operation options\n    if (ctx.operation === 'override') {\n      const cap = await budgetSystem.getSigningCap(ctx.actorId);\n      const amount = ctx.instance.data.amount as number;\n      if (amount > cap) {\n        return `Signing cap exceeded: ${ctx.actorId} can approve up to ${cap}`;\n      }\n    }\n    return undefined; // undefined = allow; string = deny with that message\n  }\n}\n```\n\n### `IOperationMiddleware` — before / after / onError hooks\n\nUseful for OpenTelemetry tracing, audit enrichment, or quota enforcement:\n\n```ts\nimport type { IOperationMiddleware, OperationContext } from 'hierarchical-approval';\n\nclass TracingMiddleware implements IOperationMiddleware {\n  private spans = new Map<string, Span>();\n\n  async before(ctx: OperationContext): Promise<void> {\n    // ctx.operation — operation name\n    // ctx.instanceId, ctx.actorId, ctx.tenantId, ctx.input\n    const span = tracer.startSpan(`approval.${ctx.operation}`);\n    this.spans.set(ctx.instanceId ?? ctx.operation, span);\n  }\n\n  async after(ctx: OperationContext, result: ApprovalInstance | void): Promise<void> {\n    this.spans.get(ctx.instanceId ?? ctx.operation)?.finish();\n  }\n\n  async onError(ctx: OperationContext, error: ApprovalError): Promise<void> {\n    const span = this.spans.get(ctx.instanceId ?? ctx.operation);\n    span?.setTag('error', error.code).finish();\n  }\n}\n\nconst engine = new ApprovalEngine({\n  adapter,\n  middleware: [new TracingMiddleware(), new AnotherMiddleware()],\n});\n```\n\nMiddleware errors are caught and logged — they never propagate to callers.\n\n---\n\n## Built-in enterprise plug-ins\n\nThe interfaces above are ports. The library also ships production-grade implementations of them, each on its own import subpath so you only pull in what you use (fully tree-shakeable, zero extra dependencies — `node:crypto` only).\n\n### `plugins/audit` — tamper-evident & PII-safe audit\n\n```ts\nimport {\n  HashChainAuditAdapter,\n  RedactingAuditAdapter,\n  CompositeAuditAdapter,\n} from 'hierarchical-approval/plugins/audit';\n\n// Each entry is SHA-256-chained to the previous one (per tenant+instance).\nconst chain = new HashChainAuditAdapter();\n\n// Redact PII before it reaches external sinks (originals are never mutated).\nconst redacted = new RedactingAuditAdapter({\n  inner: chain,\n  fieldPaths: ['newValue.applicant.ssn', 'newValue.card.*'],\n  freeTextFields: ['comment', 'reason'],\n});\n\nconst engine = new ApprovalEngine({ adapter, auditAdapter: redacted });\n\n// Later — prove the log was not altered, deleted, or reordered:\nconst result = chain.verify(tenantId, instanceId);\n// { ok: true } | { ok: false, b","readmeFilename":"README.md"}