{"_id":"@afidos/ussd-engine","_rev":"12-139fea64062dc6018e5f8ca8a4fcf502","name":"@afidos/ussd-engine","dist-tags":{"latest":"2.0.2"},"versions":{"1.0.0":{"name":"@afidos/ussd-engine","version":"1.0.0","license":"MIT","_id":"@afidos/ussd-engine@1.0.0","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"dist":{"shasum":"e89528a8afafbbefb8f7342407a91c92121f2748","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-1.0.0.tgz","fileCount":45,"integrity":"sha512-Wf4C+hkdkKqF5zrTcDCWfFmXU5M/l4qHXRMoiN93vLboPZHoawbysuJ0EgA+/Ynd5hsU/55weSTAptzYtq19UA==","signatures":[{"sig":"MEUCIEV51wOfMJVSnJ+Xdkcs0tqfi7yEgzaTALsvpVlLBF7yAiEAnmIDUjtkhbF6ByyyriuQjVpGED0l2tmRsKaBFqsncW4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172927},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"c77436345e6f866376fd6315c1892c4cc44633c6","scripts":{"build":"tsc -p tsconfig.lib.json"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"_npmVersion":"10.8.3","description":"Librairie NestJS réutilisable","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_1.0.0_1746264905124_0.09353408434247057","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@afidos/ussd-engine","version":"1.0.1","license":"MIT","_id":"@afidos/ussd-engine@1.0.1","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"dist":{"shasum":"fc70509faf4d70cae82dca67b063a801ff21ed1d","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-1.0.1.tgz","fileCount":45,"integrity":"sha512-MlEcJ25NqQ+d0PUlj6MiJiDYum7GAXVs8ELSJaGKfTUfel7R/yxLeXoDSDyymwVzHn6z9jnJd/JVY5AU3SBZUw==","signatures":[{"sig":"MEUCIQDU0bXeUw8wFZg570/VSt4bsNxyFDJlcXwaq/FGsqx6OwIgYhtPcqlHVFPrVxgC/u7Wl7F4YA2MtnBMrlylvnzrFvM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191829},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"28a2294b61ac83971d8f2e2ea8326b962eee4cc3","scripts":{"build":"tsc -p tsconfig.lib.json","publish":"npm publish --access public"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"repository":{"url":"git+https://github.com/afidos-ussd/ussd-engine.git","type":"git"},"_npmVersion":"10.8.3","description":"Librairie ussd NestJS","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_1.0.1_1746360089858_0.6851524006972394","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@afidos/ussd-engine","version":"1.1.0","license":"MIT","_id":"@afidos/ussd-engine@1.1.0","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"dist":{"shasum":"6adf0faccd34a5f0dd9a67d73554952cf67a15c6","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-1.1.0.tgz","fileCount":45,"integrity":"sha512-wS3hKO2TSU0/qS84dvrGUOb77hkBeRJYmUuU8WPtYd5NUpTXa6ocGf1VbFM0YyrFZHzqhh6lwrfyib/ygZPauA==","signatures":[{"sig":"MEUCIDkw076+GyU30Te1JuvljvVkdA1GPSpzCPQqeYvbHTDLAiEA1YpGDvjUGO9MfpMwxDMVhbtztpAx9OUAtI+w56ekP4w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191846},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"9414dfbe78e96785b69a807694aeeaf662851e99","scripts":{"build":"tsc -p tsconfig.lib.json","publish":"npm run build && npm publish --access public"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"repository":{"url":"git+https://github.com/afidos-ussd/ussd-engine.git","type":"git"},"_npmVersion":"10.8.3","description":"Librairie ussd NestJS","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_1.1.0_1746360396483_0.5947785946981095","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@afidos/ussd-engine","version":"1.1.1","license":"MIT","_id":"@afidos/ussd-engine@1.1.1","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"dist":{"shasum":"1f3a7e7f211456a248b9c8a4df549ba47e7904e0","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-1.1.1.tgz","fileCount":46,"integrity":"sha512-8kiFSHcDDcKgsvZP/fjYtSqWx/eBa54QOeRD42dneLSZBZM3DyLSIamn3CEvVhlz5FzGOeO0tPjHGCHCkHpoWg==","signatures":[{"sig":"MEUCIH/zEX0woOJ/RCeQbILKOS4c6W6UqdBCMfa1MRH4xOlJAiEA0Zk6ek4cYCQLebRf0greAoRhsrc9FQdOrII1m/RoLdo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220268},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"8efeb88665dab1425c45d8dbf193eae297848e74","scripts":{"build":"tsc -p tsconfig.lib.json","build:publish":"npm run build && npm publish --access public"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"repository":{"url":"git+https://github.com/afidos-ussd/ussd-engine.git","type":"git"},"_npmVersion":"10.8.3","description":"Librairie ussd NestJS","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_1.1.1_1746658477312_0.003266791195370544","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@afidos/ussd-engine","version":"1.1.2","license":"MIT","_id":"@afidos/ussd-engine@1.1.2","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"dist":{"shasum":"7ead14caf3b10fd61df0228c855ebb41da7b6a6d","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-1.1.2.tgz","fileCount":46,"integrity":"sha512-4BI1ndyT8LGWJjgjAN/CTKeMeTd+4+jROnI40UcCXe5b/sdn6I4plV3+VWEFNRL8eAyXH6OyHgG7SlxtbHAydw==","signatures":[{"sig":"MEYCIQDbl9HoDPUNvjdFyRQj3A1yUGTs75g9jblI5RWD2Sos0wIhAPQzdcqBwBAym3BHVYu6CJH/ApJhRNrUj3rSnaRUAsHm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220325},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"c1c3c24a88b1ef06efafc28d9d36b951ee00b8d7","scripts":{"build":"tsc -p tsconfig.lib.json","build:publish":"npm run build && npm publish --access public"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"repository":{"url":"git+https://github.com/afidos-ussd/ussd-engine.git","type":"git","directory":"libs/ussd-engine"},"_npmVersion":"10.8.3","description":"Librairie ussd NestJS","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_1.1.2_1746658924705_0.12604226752661218","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@afidos/ussd-engine","version":"1.2.2","license":"MIT","_id":"@afidos/ussd-engine@1.2.2","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"dist":{"shasum":"114abef0e449fefe65880cf3a51740c3ad05bc90","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-1.2.2.tgz","fileCount":46,"integrity":"sha512-a1wT7SAV2vGhG2ETgj7gKQbtnR7jqjPrd93sGuoz2H0ZxheFYbfBkmly9MQvMZZ1Vj2xgtzH9IeWpIa2jMhxVg==","signatures":[{"sig":"MEYCIQD996NdZ20y9MkyR//KrCNjG/Yl/NZayog4/Ksl2BD2NAIhAI101sUmdTipDiSfqlTiwYdvFo9mx/8rontEY7CN40Bm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220769},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"a0055654c024e3d08299ebd634e4c15cc79cadf4","scripts":{"build":"tsc -p tsconfig.lib.json","build:publish":"npm run build && npm publish --access public"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"repository":{"url":"git+https://github.com/afidos-ussd/ussd-engine.git","type":"git","directory":"libs/ussd-engine"},"_npmVersion":"10.8.3","description":"Librairie ussd NestJS","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_1.2.2_1746980596531_0.556847384331659","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@afidos/ussd-engine","version":"1.2.3","license":"MIT","_id":"@afidos/ussd-engine@1.2.3","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"dist":{"shasum":"472b6b933e5207d8c5a2824d8cf22d1fe7ab818a","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-1.2.3.tgz","fileCount":46,"integrity":"sha512-qnGG31NdvibBX4Sf8uvl3N4X/BI9AGZTfxDV84n7qZY9l+rtIe6Wv+c0HP0mO0vAnAw6Iw7Za5lsUW1IbEIH9A==","signatures":[{"sig":"MEUCID8nkEDyDtPgEQCgri7QqOw4j+U6UrW630IP66wGYP5SAiEA+jNTZxTT4Cma0tAJP5hNvvvJpwMXQ6zCGuGhDWdSlMo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220769},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"9c94e756132cc0a5d0accaa485c8411782b467e8","scripts":{"build":"tsc -p tsconfig.lib.json","build:publish":"npm run build && npm publish --access public"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"repository":{"url":"git+https://github.com/afidos-ussd/ussd-engine.git","type":"git","directory":"libs/ussd-engine"},"_npmVersion":"10.8.3","description":"Librairie ussd NestJS","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_1.2.3_1749947587936_0.28145624394743507","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@afidos/ussd-engine","version":"1.2.4","license":"MIT","_id":"@afidos/ussd-engine@1.2.4","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"dist":{"shasum":"840f9ad9949a7e3c6a2af97ef5ab4223830eb95c","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-1.2.4.tgz","fileCount":52,"integrity":"sha512-ZpR/0xbZ+/ukPAOpRWEgudYTNfuxC42wg6qweo9rNkXDy890tYNpnWKIez26eYZ2PlFRLJzEcxoKWvU2cGRghw==","signatures":[{"sig":"MEUCICZsgzss9bKiHP/UJ+cNEIyrC1lGj1TBJXh7ipb+ETUzAiEAjqPue/l2/TzitsPw4Hq4kCf6r/PyDCyEmIJho4tNO8Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":221251},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"bff190992f6f381acbf979326baceb9c60134280","scripts":{"build":"tsc -p tsconfig.lib.json","build:publish":"npm run build && npm publish --access public","prepublishOnly":"npm run build"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"repository":{"url":"git+https://github.com/afidos-ussd/ussd-engine.git","type":"git","directory":"libs/ussd-engine"},"_npmVersion":"10.8.3","description":"Librairie ussd NestJS","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_1.2.4_1749947989534_0.14864499151563648","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@afidos/ussd-engine","version":"1.3.0","license":"MIT","_id":"@afidos/ussd-engine@1.3.0","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"dist":{"shasum":"77960f5a69be7b2489e7424087eb0172282f2362","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-1.3.0.tgz","fileCount":53,"integrity":"sha512-XyRc3mNv2u7qQdcg4433yM7G9deUcTS3bVFBWxguT8m0MpF22+AXX0GEgFK4+QWs0OBAy0JV8AVOUYA666cfsg==","signatures":[{"sig":"MEQCIBHNkwfesmGk1kYQ4S2tDJHZrdRkIvaCp9Fp1h0ZOPPsAiBcKxq9iD/T+8zTZ3CL2oVc1y3Qxg48IAkYY3RXVFDdng==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":234520},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"79d5020bc76ad1c0c076335c1429aa24c524db03","scripts":{"build":"tsc -p tsconfig.lib.json","build:publish":"npm run build && npm publish --access public","prepublishOnly":"npm run build"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"repository":{"url":"git+https://github.com/afidos-ussd/ussd-engine.git","type":"git","directory":"libs/ussd-engine"},"_npmVersion":"10.8.3","description":"Librairie ussd NestJS","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_1.3.0_1749977353479_0.1454172666524156","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@afidos/ussd-engine","version":"2.0.0","license":"MIT","_id":"@afidos/ussd-engine@2.0.0","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"dist":{"shasum":"8ef27cfed955f73679e0ac30a060de44928b08a8","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-2.0.0.tgz","fileCount":56,"integrity":"sha512-krYvhyTNMVvrHnjFY63+jELxBRcpFE4H3eN7KYMOj5yz2m7bAbL7tr9v0DMOG2681fxDxwlZ9d1NkIfMBgNYoQ==","signatures":[{"sig":"MEQCIChRsGUDnmqgfQW9ilLiFP0fH733Bft+xCG+c5rRYLGuAiAUb+r3ny2XxOjLW3yyJbac8OLTmEc4GNbgjoUa/RuuwQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":239099},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"a5cd271ecd3b5207a98619baa396f2e8ec3c522b","scripts":{"build":"tsc -p tsconfig.lib.json","build:publish":"npm run build && npm publish --access public","prepublishOnly":"npm run build"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"repository":{"url":"git+https://github.com/afidos-ussd/ussd-engine.git","type":"git","directory":"libs/ussd-engine"},"_npmVersion":"10.8.3","description":"Librairie ussd NestJS","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_2.0.0_1750023278492_0.8681101732286394","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@afidos/ussd-engine","version":"2.0.1","license":"MIT","_id":"@afidos/ussd-engine@2.0.1","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"dist":{"shasum":"c5e18e6f986d3d03a10e3cde983748439890f164","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-2.0.1.tgz","fileCount":56,"integrity":"sha512-CR0UiMubbzGnuhdVlGj/nEwp9LG0mXENILlG8ZRp7apseLEhTLle/lIdouPHK41JVG1X60g3BWpEZ5rkxr03Pw==","signatures":[{"sig":"MEYCIQDaJerbOYaxNyzSL9yV9m78bVGJrMvMMnHcQlR+51YUggIhANRMHP9IXbfN3lawjoPiVP90WD6khVtUvX3Di/+Za31v","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":239337},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"b4673547a7ed65f4fb85557bd2410ff3e5007fc5","scripts":{"build":"tsc -p tsconfig.lib.json","build:publish":"npm run build && npm publish --access public","prepublishOnly":"npm run build"},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"},"repository":{"url":"git+https://github.com/afidos-ussd/ussd-engine.git","type":"git","directory":"libs/ussd-engine"},"_npmVersion":"10.8.3","description":"Librairie ussd NestJS","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"peerDependencies":{"@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ussd-engine_2.0.1_1750027663510_0.13717340958415458","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@afidos/ussd-engine","version":"2.0.2","description":"Librairie ussd NestJS","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc -p tsconfig.lib.json","build:publish":"npm run build && npm publish --access public","prepublishOnly":"npm run build"},"repository":{"type":"git","url":"git+https://github.com/afidos-ussd/ussd-engine.git","directory":"libs/ussd-engine"},"peerDependencies":{"@nestjs/common":"^10.0.0","@nestjs/core":"^10.0.0"},"license":"MIT","_id":"@afidos/ussd-engine@2.0.2","gitHead":"5898e1fd560c7f2c86bf521904a58963ea4f52d3","bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"homepage":"https://github.com/afidos-ussd/ussd-engine#readme","_nodeVersion":"18.17.0","_npmVersion":"10.8.3","dist":{"integrity":"sha512-hSZPetM554dGAKuGptJ/zprXkSWYJhh+7jqA1C+67OUc561LxGEexakycvdAQ/HbNSOvAEhuYFAxNVc0ImGp/g==","shasum":"46190e744e0e3bbce6e9f7272dc0f3e59531ef40","tarball":"https://registry.npmjs.org/@afidos/ussd-engine/-/ussd-engine-2.0.2.tgz","fileCount":56,"unpackedSize":239808,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDzT2y1ZF7A7vXeJALKuImTJtLC27JwJW6QFnfqcxVUqwIhAJxEn0kYiUM90L05tKtQ/59HkhBhd3jUlqxRJJMCuuq0"}]},"_npmUser":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com","actor":{"name":"afidoss","email":"fiacre.ayedoun@gmail.com","type":"user"}},"directories":{},"maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ussd-engine_2.0.2_1751925334544_0.5482676012276777"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-03T09:35:05.053Z","modified":"2025-07-07T21:55:34.926Z","1.0.0":"2025-05-03T09:35:05.357Z","1.0.1":"2025-05-04T12:01:30.064Z","1.1.0":"2025-05-04T12:06:36.663Z","1.1.1":"2025-05-07T22:54:37.481Z","1.1.2":"2025-05-07T23:02:04.959Z","1.2.2":"2025-05-11T16:23:16.754Z","1.2.3":"2025-06-15T00:33:08.129Z","1.2.4":"2025-06-15T00:39:49.724Z","1.3.0":"2025-06-15T08:49:13.676Z","2.0.0":"2025-06-15T21:34:38.714Z","2.0.1":"2025-06-15T22:47:43.704Z","2.0.2":"2025-07-07T21:55:34.753Z"},"bugs":{"url":"https://github.com/afidos-ussd/ussd-engine/issues"},"license":"MIT","homepage":"https://github.com/afidos-ussd/ussd-engine#readme","repository":{"type":"git","url":"git+https://github.com/afidos-ussd/ussd-engine.git","directory":"libs/ussd-engine"},"description":"Librairie ussd NestJS","maintainers":[{"name":"afidoss","email":"fiacre.ayedoun@gmail.com"}],"readme":"# @afidos/ussd-engine\n\nA powerful Node.js framework for creating, managing, and deploying USSD (Unstructured Supplementary Service Data) applications simply and effectively. Ideal for developing mobile services accessible without internet in emerging markets.\n\n[![npm version](https://img.shields.io/npm/v/@afidos/ussd-engine.svg)](https://www.npmjs.com/package/@afidos/ussd-engine)\n[![License](https://img.shields.io/npm/l/@afidos/ussd-engine.svg)](https://github.com/afidosstar/ussd-engine/blob/master/LICENSE)\n\n\n<a href=\"https://www.buymeacoffee.com/afidosstar\"><img src=\"https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=afidosstar&button_colour=5F7FFF&font_colour=ffffff&font_family=Cookie&outline_colour=000000&coffee_colour=FFDD00\" /></a>\n\n[IN FRENCH](./readme-fr.md)\n\n## 🚀 Features\n\n- 🔄 **Standardized API**: Abstraction of differences between telecom operators\n- 📱 **Advanced menu management**: Intuitive API for creating interactive menus with static and dynamic options\n- 💾 **Robust session management**: Persistent storage of user data between requests\n- 🛠️ **Flexible storage adapters**: Support for memory, MongoDB, and PostgreSQL\n- 🧩 **Native NestJS integration**: Ready-to-use module and interceptors\n- 🌍 **Multi-operator**: Support for different operators (Moov, Celtis, etc.)\n- 📝 **Input fields**: Easy creation of USSD forms with built-in validation\n- 🔄 **Contextual navigation**: Navigation system with history and back functionality\n\n## 📋 Table of Contents\n\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Architecture](#architecture)\n- [Usage Guide](#usage-guide)\n  - [Creating Menus](#creating-menus)\n  - [Session Management](#session-management)\n  - [Navigation Between Menus](#navigation-between-menus)\n  - [Input Fields](#input-fields)\n  - [Dynamic Options](#dynamic-options)\n  - [Validation and Error Handling](#validation-and-error-handling)\n- [Storage Adapters](#storage-adapters)\n  - [In-Memory Storage](#in-memory-storage)\n  - [MongoDB Storage](#mongodb-storage)\n  - [PostgreSQL Storage](#postgresql-storage)\n- [Operator Formatters](#operator-formatters)\n  - [Moov Formatter](#moov-formatter)\n  - [Celtis Formatter](#celtis-formatter)\n- [NestJS Integration](#nestjs-integration)\n  - [USSD Engine Module](#ussd-engine-module)\n  - [Interceptors](#interceptors)\n  - [Decorators](#decorators)\n- [Complete Examples](#complete-examples)\n- [API Reference](#api-reference)\n- [Best Practices](#best-practices)\n- [FAQ](#faq)\n- [Contribution](#contribution)\n- [License](#license)\n\n## 📦 Installation\n\n```bash\nnpm install @afidos/ussd-engine\n```\n\nOr with Yarn:\n\n```bash\nyarn add @afidos/ussd-engine\n```\n\n## 🏁 Quick Start\n\nHere's a minimal example to create a USSD application:\n\n```typescript\nimport { USSDMenuBuilder, USSDService, InMemoryAdapter } from '@afidos/ussd-engine';\n\n// Create the menu builder\nconst menuBuilder = new USSDMenuBuilder();\n\n// Define menus\nmenuBuilder\n  .createMenu('main', 'Main Menu')\n  .addOption('main', 'balance', 'Check balance', async (session) => {\n    // Simulate balance retrieval\n    session.setData('balance', 5000);\n    return USSDService.createNavigator().navigateTo('showBalance')(session);\n  })\n  .addOption('main', 'transfer', 'Transfer', async (session) => {\n    return USSDService.createNavigator().navigateTo('transferAmount')(session);\n  })\n  .createMenu('showBalance', (session) => `Your balance is ${session.getData('balance')} FCFA`)\n  .addOption('showBalance', 'back', 'Back', USSDService.createNavigator().goBack())\n  .addOption('showBalance', 'exit', 'Exit', USSDService.createNavigator().endSession('Thank you for using our service!'))\n  .createInputField('transferAmount', 'Enter the amount to transfer:', \n     USSDService.createNavigator().createInputField('amount', 'transferRecipient'))\n  .createInputField('transferRecipient', 'Enter the recipient number:',\n     USSDService.createNavigator().createInputField('recipient', 'confirmTransfer'))\n  .createMenu('confirmTransfer', (session) => \n    `Transfer of ${session.getData('amount')} FCFA to ${session.getData('recipient')}. Confirm?`)\n  .addOption('confirmTransfer', 'confirm', 'Confirm', async (session) => {\n    // Transfer logic here\n    return USSDService.createNavigator().endSession('Transfer completed successfully!')(session);\n  })\n  .addOption('confirmTransfer', 'cancel', 'Cancel', USSDService.createNavigator().endSession('Transfer cancelled.'));\n\n// Create the USSD service with an in-memory storage adapter\nconst storageAdapter = new InMemoryAdapter();\nconst ussdService = new USSDService(menuBuilder.build(), storageAdapter);\n\n// Example of request processing\nasync function handleRequest(request) {\n  const response = await ussdService.processRequest({\n    sessionId: request.sessionId,\n    phoneNumber: request.phoneNumber,\n    text: request.text,\n    serviceCode: request.serviceCode\n  });\n  \n  return response;\n}\n```\n\n## 🏛️ Architecture\n\nUSSD Engine's architecture is designed to be modular and extensible:\n\n```\n@afidos/ussd-engine\n├── core            - Core USSD service logic\n├── menu            - Menu management and navigation\n├── session         - User session management\n├── storage         - Adapters for different storage systems\n├── transformer     - Formatters for different telecom operators\n├── types           - Common interfaces and types\n└── ussd-engine     - NestJS module and integration\n```\n\n## 📚 Usage Guide\n\n### Creating Menus\n\nCreating USSD menus is done with the `USSDMenuBuilder` class:\n\n```typescript\nconst menuBuilder = new USSDMenuBuilder();\n\n// Simple menu with static title\nmenuBuilder.createMenu('main', 'Welcome to our service');\n\n// Menu with dynamic title based on session data\nmenuBuilder.createMenu('profile', (session) => `Hello ${session.getData('username')}`);\n\n// Adding options to a menu\nmenuBuilder.addOption('main', 'profile', 'My profile', (session) => {\n  return USSDService.createNavigator().navigateTo('profile')(session);\n});\n\n// Option with custom action\nmenuBuilder.addOption('main', 'balance', 'Check balance', async (session) => {\n  const balance = await fetchBalanceFromAPI(session.phoneNumber);\n  session.setData('balance', balance);\n  return USSDService.createNavigator().navigateTo('showBalance')(session);\n});\n```\n\n### Custom Option Indexes\n\nYou can define custom indexes for menu options instead of using automatic sequential numbering (1, 2, 3...):\n\n```typescript\nconst menuBuilder = new USSDMenuBuilder();\n\nmenuBuilder\n  .createMenu('main', 'What would you like to do?')\n  // Automatic index (will be 1)\n  .addOption('main', 'balance', 'Check balance', balanceAction)\n  // Automatic index (will be 2) \n  .addOption('main', 'transfer', 'Transfer money', transferAction)\n  // Custom index 9 for help\n  .addOption('main', 'help', {index: 9, text: 'Help'}, helpAction)\n  // Custom index 0 for back/exit\n  .addOption('main', 'exit', {index: 0, text: 'Exit'}, exitAction);\n```\n\n**Display result:**\n```\nWhat would you like to do?\n0. Exit\n1. Check balance  \n2. Transfer money\n9. Help\n```\n\n**Supported text formats:**\n- `'Simple text'` - Automatic sequential index\n- `{index: 5, text: 'Custom index 5'}` - Custom index  \n- `(session) => 'Dynamic text'` - Dynamic function (automatic index)\n\n**Benefits:**\n- **Consistent UX**: Keep same indexes across different menus (0 = back, 9 = help)\n- **User-friendly**: Users can memorize shortcuts\n- **Flexible**: Mix automatic and custom indexes as needed\n- **Backward compatible**: Existing code continues to work\n\n### Session Management\n\nThe `USSDSession` class allows managing user data between interactions:\n\n```typescript\n// In an action handler\nasync function handleProfileUpdate(session) {\n  // Storing data\n  session.setData('username', 'John Doe');\n  session.setData('lastLogin', new Date().toISOString());\n  \n  // Retrieving data\n  const username = session.getData('username');\n  \n  // Retrieving all data\n  const allUserData = session.getAllData();\n  \n  // Saving changes\n  await session.save();\n  \n  // Ending the session\n  await session.end();\n}\n```\n\n### Navigation Between Menus\n\nNavigation is managed by the `Navigator` via the `createNavigator()` method:\n\n```typescript\n// Get a navigator\nconst navigator = USSDService.createNavigator();\n\n// Navigate to another menu\nmenuBuilder.addOption('main', 'settings', 'Settings', navigator.navigateTo('settingsMenu'));\n\n// Return to previous menu\nmenuBuilder.addOption('settings', 'back', 'Back', navigator.goBack());\n\n// End the session with a message\nmenuBuilder.addOption('main', 'exit', 'Exit', navigator.endSession('Thank you for using our service!'));\n```\n\n### Input Fields\n\nCreating fields to collect information:\n\n```typescript\n// Simple input field\nmenuBuilder.createInputField(\n  'enterName',              // Field ID\n  'Enter your name:',       // Prompt\n  (input, session) => {     // Processing handler\n    session.setData('name', input);\n    return navigator.navigateTo('nextMenu')(session);\n  }\n);\n\n// Field with validation\nmenuBuilder.createInputField(\n  'enterPhone',\n  'Enter your phone number:',\n  navigator.createInputField('phone', 'confirmation', 'Invalid format', \n    (input) => /^\\d{8}$/.test(input)) // Validation: 8 digits\n);\n```\n\n### Dynamic Options\n\nGenerating options based on data with custom indexes:\n\n```typescript\nmenuBuilder\n  .createMenu('products', 'Our products')\n  .addDynamicOptions('products', async (session) => {\n    // Retrieve products from an API \n    const products = await fetchProductsFromAPI();\n    \n    // Generate options with custom indexes\n    const options = products.map((product, index) => ({\n      id: `product_${product.id}`,\n      text: {index: index + 1, text: `${product.name} - ${product.price} FCFA`},\n      action: async (session) => {\n        session.setData('selectedProduct', product);\n        return navigator.navigateTo('productDetails')(session);\n      }\n    }));\n\n    // Add common navigation options\n    options.push(\n      {\n        id: 'back',\n        text: {index: 0, text: 'Back to main menu'},\n        action: navigator.goBack()\n      },\n      {\n        id: 'help',\n        text: {index: 9, text: 'Help'},\n        action: navigator.navigateTo('help')\n      }\n    );\n\n    return options;\n  });\n```\n\n### Validation and Error Handling\n\n```typescript\n// Add a validator to a menu\nmenuBuilder.setValidator('transferAmount', (input, session) => {\n  const amount = parseInt(input);\n  return !isNaN(amount) && amount > 0 && amount <= 1000000;\n});\n\n// Add a custom error handler\nmenuBuilder.setErrorHandler('transferAmount', (error, session) => {\n  console.error('Transfer error:', error);\n  return {\n    text: 'An error occurred during the transfer. Please try again later.',\n    type: 'end'\n  };\n});\n```\n\n## 🗄️ Storage Adapters\n\n### In-Memory Storage\n\nIdeal for testing and development:\n\n```typescript\nimport { InMemoryAdapter } from '@afidos/ussd-engine';\n\n// Simple storage\nconst adapter = new InMemoryAdapter();\n\n// With session expiration (TTL)\nconst adapter = new InMemoryAdapter({ ttlMs: 5 * 60 * 1000 }); // 5 minutes\n```\n\n### MongoDB Storage\n\nFor production environments with MongoDB:\n\n```typescript\nimport { MongoAdapter } from '@afidos/ussd-engine';\n\n// Creating the adapter\nconst adapter = await MongoAdapter.create(\n  'mongodb://localhost:27017',   // Connection URL\n  'ussd_database',              // Database name\n  'ussd_sessions',             // Collection name\n  { ttlSeconds: 3600 }        // Expiration after 1 hour\n);\n```\n\n### PostgreSQL Storage\n\nFor production environments with PostgreSQL:\n\n```typescript\nimport { PgAdapter } from '@afidos/ussd-engine';\n\n// Creating the adapter\nconst adapter = await PgAdapter.create(\n  'postgresql://user:password@localhost:5432/ussd_db',\n  'ussd_sessions' // Table name\n);\n```\n\n## 🔄 Operator Formatters\n\n### Moov Formatter\n\nFor Moov operator requests:\n\n```typescript\nimport { MoovFormatter, USSDInterceptor } from '@afidos/ussd-engine';\n\n// Creating a Moov interceptor\nconst moovInterceptor = new USSDInterceptor({\n  formatter: new MoovFormatter()\n});\n```\n\n### Celtis Formatter\n\nFor Celtis operator requests:\n\n```typescript\nimport { CeltisFormatter, USSDInterceptor } from '@afidos/ussd-engine';\n\n// Creating a Celtis interceptor\nconst celtisInterceptor = new USSDInterceptor({\n  formatter: new CeltisFormatter()\n});\n```\n\n## 🦁 NestJS Integration\n\n### USSD Engine Module\n\n```typescript\nimport { Module } from '@nestjs/common';\nimport { UssdEngineModule, InMemoryAdapter, USSDMenuBuilder } from '@afidos/ussd-engine';\n\n@Module({\n  imports: [\n    UssdEngineModule.register({\n      storageAdapter: new InMemoryAdapter(),\n      menuBuilderFactory: () => {\n        // Menu configuration\n        return new USSDMenuBuilder()\n          .createMenu('main', 'Main Menu')\n          // ...other menu configurations\n          .build();\n      }\n    })\n  ]\n})\nexport class AppModule {}\n```\n\n### Interceptors\n\n```typescript\nimport { Controller, Post, UseInterceptors } from '@nestjs/common';\nimport { \n  USSDInterceptor, \n  MoovFormatter, \n  CeltisFormatter,\n  UssdParam,\n  USSDRequest,\n  USSDResponse\n} from '@afidos/ussd-engine';\n\n@Controller('ussd')\nexport class UssdController {\n  constructor(private readonly ussdService: USSDService) {}\n\n  @Post('moov')\n  @UseInterceptors(new USSDInterceptor({ formatter: new MoovFormatter() }))\n  async handleMoovRequest(@UssdParam() request: USSDRequest): Promise<USSDResponse> {\n    return this.ussdService.processRequest(request);\n  }\n\n  @Post('celtis')\n  @UseInterceptors(new USSDInterceptor({ formatter: new CeltisFormatter() }))\n  async handleCeltisRequest(@UssdParam() request: USSDRequest): Promise<USSDResponse> {\n    return this.ussdService.processRequest(request);\n  }\n}\n```\n\n### Decorators\n\nThe `@UssdParam()` decorator makes it easy to extract standardized USSD data:\n\n```typescript\n// Extract the entire request\n@UssdParam() request: USSDRequest\n\n// Extract specific properties\n@UssdParam('phoneNumber') phoneNumber: string\n@UssdParam('text') userInput: string\n@UssdParam('sessionId') sessionId: string\n```\n\n## 📝 Complete Examples\n\n### USSD Banking Service\n\n```typescript\nconst menuBuilder = new USSDMenuBuilder();\n\nmenuBuilder\n  // Main menu\n  .createMenu('main', 'My Bank - Menu')\n  .addOption('main', 'account', 'My account', navigator.navigateTo('accountMenu'))\n  .addOption('main', 'transfer', 'Transfer', navigator.navigateTo('transferAmount'))\n  .addOption('main', 'payment', 'Bill payment', navigator.navigateTo('paymentMenu'))\n  .addOption('main', 'help', 'Help', navigator.navigateTo('helpMenu'))\n\n  // Account menu\n  .createMenu('accountMenu', 'Account Menu')\n  .addOption('accountMenu', 'balance', 'Balance', async (session) => {\n    // Get balance from API\n    const balance = await bankAPI.getBalance(session.phoneNumber);\n    session.setData('balance', balance);\n    return navigator.navigateTo('showBalance')(session);\n  })\n  .addOption('accountMenu', 'statement', 'Mini statement', navigator.navigateTo('statementMenu'))\n  .addOption('accountMenu', 'back', 'Back', navigator.goBack())\n\n  // Balance display\n  .createMenu('showBalance', (session) => \n    `Your balance is: ${session.getData('balance')} FCFA`)\n  .addOption('showBalance', 'back', 'Back', navigator.goBack())\n  .addOption('showBalance', 'exit', 'Exit', \n    navigator.endSession('Thank you for using My Bank!'))\n\n  // Transfer: amount entry\n  .createInputField('transferAmount', 'Enter amount to transfer:',\n    navigator.createInputField('amount', 'transferRecipient', 'Invalid amount',\n      (input) => !isNaN(input) && parseInt(input) > 0))\n\n  // Transfer: recipient entry\n  .createInputField('transferRecipient', 'Enter recipient number:',\n    navigator.createInputField('recipient', 'confirmTransfer', 'Invalid number',\n      (input) => /^\\d{8}$/.test(input)))\n\n  // Transfer confirmation\n  .createMenu('confirmTransfer', (session) => \n    `Confirm transfer of ${session.getData('amount')} FCFA to ${session.getData('recipient')}?`)\n  .addOption('confirmTransfer', 'confirm', 'Confirm', async (session) => {\n    try {\n      await bankAPI.transfer(\n        session.phoneNumber,\n        session.getData('recipient'),\n        session.getData('amount')\n      );\n      return navigator.endSession('Transfer completed successfully!')(session);\n    } catch (error) {\n      return navigator.endSession('Transfer failed: ' + error.message)(session);\n    }\n  })\n  .addOption('confirmTransfer', 'cancel', 'Cancel', \n    navigator.endSession('Transfer cancelled.'));\n```\n\n## 📘 API Reference\n\n### Main Classes\n\n- `USSDMenuBuilder`: USSD menu builder\n- `USSDService`: Main service for processing USSD requests\n- `USSDSession`: User session management\n- `USSDInterceptor`: NestJS interceptor for transforming requests/responses\n\n### Key Interfaces\n\n- `USSDRequest`: Standardized format for USSD requests\n- `USSDResponse`: Standardized format for USSD responses with title and options\n- `USSDMenu`: USSD menu structure\n- `MenuOption`: USSD menu option with flexible text format\n- `MenuOptionConfig`: Configuration object for custom option indexes\n- `StorageAdapter`: Interface for storage adapters\n- `USSDFormatter`: Interface for operator formatters\n\n### Updated Interface Definitions\n\n```typescript\nexport interface USSDResponse {\n  title: string;\n  options?: Record<number, string>;\n  type: 'continue' | 'end';\n}\n\nexport interface MenuOptionConfig {\n  index: number;\n  text: string;\n}\n\nexport interface MenuOption {\n  id: string;\n  text: string | MenuOptionConfig | ((session: USSDSessionInterface) => string | Promise<string>);\n  action: (session: USSDSessionInterface) => Promise<USSDResponse> | USSDResponse;\n}\n```\n\n### Important Methods\n\n**USSDMenuBuilder**:\n- `createMenu(id, title)`: Creates a new menu\n- `createInputField(id, title, processInput)`: Creates an input field\n- `addOption(menuId, optionId, text, action)`: Adds an option to a menu\n- `addDynamicOptions(menuId, generator)`: Adds dynamic options\n- `setValidator(menuId, validator)`: Sets a validator for a menu\n- `setErrorHandler(menuId, handler)`: Sets an error handler\n- `build()`: Builds and returns the menu map\n\n**USSDService**:\n- `processRequest(request)`: Processes a USSD request\n- `createNavigator()`: Creates a navigation object\n\n**USSDSession**:\n- `setData(key, value)`: Stores data\n- `getData(key)`: Retrieves data\n- `getAllData()`: Retrieves all data\n- `save()`: Saves the session\n- `end()`: Ends the session\n\n## 💡 Best Practices\n\n1. **Menu Structure**: Limit navigation depth to 3-4 levels maximum for a better user experience.\n\n2. **Short Texts**: USSD screens have limitations (often 160-182 characters), keep your texts concise.\n\n3. **State Management**: Use `session.setData()` to store important data between requests.\n\n4. **Validation**: Always validate user inputs with appropriate validators.\n\n5. **Intuitive Navigation**: Always provide back and exit options.\n\n6. **Performance**: For menus with many options, use pagination or group them by categories.\n\n7. **Error Handling**: Implement custom error handlers for each critical menu.\n\n8. **Testing**: Test your USSD menus on different devices and with different operators.\n\n## ❓ FAQ\n\n**Q: Can I use USSD Engine without NestJS?**  \nA: Yes, USSD Engine works independently. NestJS integration is optional.\n\n**Q: How to handle expired sessions?**  \nA: Use TTL options in storage adapters to automatically clean up inactive sessions.\n\n**Q: Does the application support Unicode/accented characters?**  \nA: Yes, but be careful as some USSD terminals may have limited support.\n\n**Q: How to debug my USSD application?**  \nA: Use detailed logs and the InMemoryAdapter during development to inspect session states.\n\n**Q: How to test my USSD service without real equipment?**  \nA: You can simulate USSD requests with tools like Postman by following your telecom operator's format.\n\n## 🤝 Contribution\n\nContributions are welcome! Feel free to submit pull requests.\n\n1. Fork the project\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n","readmeFilename":"readme.md"}