{"_id":"6e","_rev":"13-d371b287e231b888b05a5cc5bf488608","name":"6e","dist-tags":{"latest":"0.0.92"},"versions":{"0.0.1":{"name":"6e","version":"0.0.1","description":"","main":"router.js","scripts":{"t":"nodemon -r esm btn.js","w":"wrangler publish"},"license":"ISC","dependencies":{"dateformat":"^3.0.3","esm":"^3.2.25","firebase-firestore-lite":"^1.0.2","form-data":"^4.0.0","is-plain-obj":"^4.0.0","isomorphic-unfetch":"^3.1.0","jimp":"^0.16.1","smart-promisify":"^1.0.5","text-image":"^0.7.0"},"devDependencies":{},"_id":"6e@0.0.1","_nodeVersion":"15.9.0","_npmVersion":"7.8.0","dist":{"integrity":"sha512-g4BYwrsJLzGcxFkJADPhIZjwIxT0WRPuWByl+f2BMsbFLwKuWAVYljvKVjFjFGLJvMZE84zO0a3IZUiwaVbUQg==","shasum":"6a5dffbd7fb9fec9a1e39cc5e191abeb65384e12","tarball":"https://registry.npmjs.org/6e/-/6e-0.0.1.tgz","fileCount":30,"unpackedSize":1284052,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghyVNCRA9TVsSAnZWagAAoCAP/2v+Qundc7UnmIoqU49u\nfb/v0i1OwcwuOxc8cJoA21gnTJ0IqdQ6vy869y5lyaHxhWk1+NPK5SSHhYEa\nUqUDM1llwud6w5nhUdzlaaA+GBBYqZ+yogpCg9Nw6BJ6vf1wRqGfpZHGJVxx\noxyKoCFISbZKTaKozaUjwZW7wQjA75EceBqVAcB01R2S57Mh1hYIrP4KHLXy\nVHRXlhHEe3N3G5rSNQkyFgDOXLMz82h1Z3hucAZ0Ny/12Fx4acKEoy4TqeeU\nEa76hPf5lWmQED4Pd/MGzkKgoCqnbaiEjSVwyQEpMPtcvKn45pjyDiyeeCLF\nOkeiEJIgMcGPRvaeNTBBEvbBgepAowogllTxxkzLsozLMoxz5sEKx2ac4n8L\nH/e5zw/Fj2JLQKWbn+n2o0BDPXBRifLqO3BEhIGUKwXDv2TGyOxpK0sSNs6c\n+2tAR54pfF1PdN08KIkJkpkxf9FDGQZAmaLoF1fjSVgR+PNKIG9TIbzZt2qj\nHcPMjCqhUH30wa+i+vxfOUCCaH6DPC6wthFvYKRnJchUyDdzLIUGdbNnObQ1\nCj95DxOgcBaonn9FcLYIPzogbFOesC2n8/RzYghl91BCul1yobNqyzYOeQ7Q\nwBpr3xbOycBZhb3nIYiYggMaCXIf7tChvrWImtP9t8XxJgq+PCguffIq4/7S\na+1q\r\n=qpMM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICeTVhUyMyhDwJ7HutHS4XzsGsOPP/mtfKbK3ygrnSanAiEA5rf6DgjJdb9Qi9bowQcuCcO2DmIRyKgA5SJzmhgi36c="}]},"_npmUser":{"name":"vsamaru","email":"vsamaru@gmail.com"},"directories":{},"maintainers":[{"name":"vsamaru","email":"vsamaru@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/6e_0.0.1_1619469644586_0.4035573453388741"},"_hasShrinkwrap":false},"0.0.2":{"name":"6e","version":"0.0.2","main":"dist/source","types":"dist/source","scripts":{"u":"ncu -u && npm update","build":"tsc","example-js":"node examples/main-javascript.js","start":"ts-node examples/main-typescript.ts"},"dependencies":{"typegram":"^3.3.1"},"devDependencies":{"@types/node":"^15.0.0","telegraf":"^4.3.0","ts-node":"^9.1.1","typescript":"^4.2.4"},"description":"[![NPM Version](https://img.shields.io/npm/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![node](https://img.shields.io/node/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![Build Stat","_id":"6e@0.0.2","_nodeVersion":"15.9.0","_npmVersion":"7.8.0","dist":{"integrity":"sha512-tzW7I3ykvKRYfKgrLcDdoDzbQVucBhKnRE1PSUKHQrD8fQmfoEfmbwg3peCOWEPL3zdhZvkcaJNq30lA+UHErQ==","shasum":"91c720d4a6c1debef9824be03c49e3a8aab44ef0","tarball":"https://registry.npmjs.org/6e/-/6e-0.0.2.tgz","fileCount":45,"unpackedSize":137884,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghyoOCRA9TVsSAnZWagAAcCoQAIR4k7mefFoedw2/Yvq4\nroKQFdDvqOCmJn46gBV31iAAG9+O2hvLOG8benA878D2kciJsNB9ibyo46qf\nVrlBFHYmQASgSwx0ziKqfRxU5rsCnU8EHEWp6kIaeiGgyJD3OneOuAozymJx\naOSMPIT7fAa0u6f1wr3GEsCl5j93BPvadajeaa/eQlJlQR6/oUW0Gcu8rOTi\nfXJ3ZlIgE2QmG+x/75GpjYz20EBGFU5Jzsn3nsRL2u/Lb3xaljYu62YXOcyT\nMfc2fIFDvB3W1x35yGbRY5z2oiyS1QB+oAbpGsDgooWV74GWYxUx6cdHUH0Z\nLeoZ6LR+OCFWRvMYq2cWOmBsev3AWjENEP8ATmlAEdnDcfD7V2h8cNZbpZDz\nM9bTD7RML1FHpZYDRS8ivlVqlg4GAmbzYbhq+2GrJsOA6dc9N8bhX+nKq49B\nKhTwPht972pq4oVbfMKkeIhVM/Fab4f4mkHDBc724jQYkGDaS7a+RU7vTTle\n2KHwpFuIYZa4cU9AcfytVJVmu+F8mNzqbM233BRnGtV3RpzXDHupMaN/7cxt\nz6Pn9LKk7+Trn8kjuhvn8NpXCbU+izqd71ZsHrySXGzbazCyfCoT19TcqthS\n2Z17LPvkEXSY6QOZrMkJfTORCZ/koHN1BFlXL202nRhiOa4dC6y51p7m8u8a\ngGmh\r\n=Qehw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPLxNZnmALDSw1ZO2EB3KRfeQ5MYVIxp3Utk/srSiGaAIhAKW/VAfyxddqFfKkB1oKfva0cydrQmwxJXCE41WUXlH/"}]},"_npmUser":{"name":"vsamaru","email":"vsamaru@gmail.com"},"directories":{},"maintainers":[{"name":"vsamaru","email":"vsamaru@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/6e_0.0.2_1619470861555_0.45076588030050724"},"_hasShrinkwrap":false},"0.0.3":{"name":"6e","version":"0.0.3","main":"dist/source","types":"dist/source","scripts":{"u":"ncu -u && npm update","build":"tsc","e":"node examples/main-javascript.js","start":"ts-node examples/main-typescript.ts"},"dependencies":{"typegram":"^3.3.1"},"devDependencies":{"@types/node":"^15.0.0","telegraf":"^4.3.0","ts-node":"^9.1.1","typescript":"^4.2.4"},"description":"[![NPM Version](https://img.shields.io/npm/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![node](https://img.shields.io/node/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![Build Stat","_id":"6e@0.0.3","_nodeVersion":"15.9.0","_npmVersion":"7.8.0","dist":{"integrity":"sha512-nUPt8MNCDKdFmFk1Y3wgUoXICQX9fxdO+XFEd3yQHQXoh+7qL5PVcrmC9m15yO9sIEZIfikCXhZYw0gmhMasqg==","shasum":"a0fea7039abdbcb63a84e286f2c54bdbae5385d7","tarball":"https://registry.npmjs.org/6e/-/6e-0.0.3.tgz","fileCount":72,"unpackedSize":326118,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghyvmCRA9TVsSAnZWagAAGdEP/iIaoYqCELKfrQy83Kne\nbLPiDMz3dVHc6rkRLf+ScmYnphWeyae+ff9/7Dlc8B+ki8u7idF5S3GqbuWG\nG0OEKTsJHYTInhLJa2hJF8nkZ1ToSW/C0be1VZe9ID0KiRBrNVmWHRvD+CQf\ngqkWk6rBwLa+f8CxUxezurj8u+JfkntyHJ4/y7hPli3FZOOdzfvLFNZ4IRnr\n8UVqQOX0ajSqTOpjfDJxxypU51g8b6702bWIwZfUh+VW8Aj6Lh/2wjrKyJJP\nN7cyKnyP33FGFStg9UB+UQ0MbuT1gGP11NtvaIXYIvnMB2Lb7Wr7EvWDUrob\nsn8Q6E+UBC0oaUKTz+idJcJ8EvUoV8CU1PNBE4U1LZj+lrPo+KOzD+3zwj7J\nhQoMFBgye05IoCqjhSuGGiOqthea+d+wT0YsMu/N+6/JQhdgpqC0EAcMph0b\nzCpC3f+FbChu7lVl4VeQlv0ROFaSesbOHS7Qmyz6S0dA7zQpQ64VOri5Qo6b\nYqks1SDcl5b7ycby5+MgDT89fm3ZMga7KSzAt5dxGGGveQ0NBnEFC9C+repv\nTtk+llvuWK+C5ipk2pQIJ54aybXWXQtSctWr0lP3awmGIwXVTnQCIWmsnlFu\n/l0fTzBXVKVC3r8CA7WfuD9sZOZi8LvR1/DvsxD8schF9Ky5laC2w9MIVqQh\nnsPd\r\n=RdEa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAHD9Eq0POsOOyGBo+isxTrSo3e4HYnNRgkcXjouIJSvAiEA+ak43z52KWmpHn0/YRzaHtNf53ZQFOP+c3V7GT/1Mt8="}]},"_npmUser":{"name":"vsamaru","email":"vsamaru@gmail.com"},"directories":{},"maintainers":[{"name":"vsamaru","email":"vsamaru@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/6e_0.0.3_1619471334248_0.4841278787864298"},"_hasShrinkwrap":false},"0.0.4":{"name":"6e","version":"0.0.4","main":"dist/source","types":"dist/source","scripts":{"u":"ncu -u && npm update","build":"tsc","e":"node examples/main-javascript.js","start":"nodemon index.js"},"dependencies":{"1te":"^4.0.7","6e":"^0.0.3","typegram":"^3.3.1"},"devDependencies":{"@types/node":"^15.0.0","ts-node":"^9.1.1","typescript":"^4.2.4"},"description":"[![NPM Version](https://img.shields.io/npm/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![node](https://img.shields.io/node/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![Build Stat","_id":"6e@0.0.4","_nodeVersion":"15.9.0","_npmVersion":"7.8.0","dist":{"integrity":"sha512-5q2lPmD3eD24PmBE0D3MIh0s4uoHnGI1e+GLMHVqaa0dxfGMAx7Ieg22R9SHlSXewBdf2qDxOX6uWAuW2fXWRA==","shasum":"dfe2c56f8963e6e10bc140694c5878ad145e9563","tarball":"https://registry.npmjs.org/6e/-/6e-0.0.4.tgz","fileCount":31,"unpackedSize":106971,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghy5YCRA9TVsSAnZWagAAXxkP/1QwwFQaTlD1pBqifmdt\nk5vz3GP4X/41xQsg3059J+g2jIZKjM6IxTFctATzpxpU0ZWpSvXlAfm+pmAl\nY5GQV73q7aTVb2iqcy7J8I02g+Rti+3KlVTBXn4+4atFhMHlGNMabj9yFelQ\ni8yd9fiMRD+Wi9yFhFDjTkRkYeUZSbfrtUYZAk5Dce4wMgFjwIEZ3ZxxmIgi\nWSwYz5pWpjl8zLTr11XAqOF97U5Gx8iB8MqC7kZrUHB9+spv957uLQ/zJ2Z0\nfxHDDd2JkoIyB/czXhJK6JMZIMiw5fRLLp4spdoSGBbl68Yo7qwIUYXIjI64\nOEWgz8gPgyZobICBHj3Xvq+oFIH03ukY2yMivN1oWSbrNMLXualLQEWljEOo\n7FsU9Na8w8pwCRZ31qYDtsZAR8PbXPvsOXXT0M4NX6mKcyvaVU5G3R3wi/9k\n2EPpnGCBTnwm5lmArIHPz7nlZgiqeJTiugR43K8Wf0FSRCySaYhnd3zpgSST\nVttYhAcsDfyVw0j04qdGzArx/XHGJEed3qu+uBQ1OBRrPwykG/z/3srkZHSr\nk3fn4NLAReDS2enBFw2r2JcdbufpJQro43XVANNvepIrXuH4eBWOswtWcG+U\nY63fNTxtdYe8qURf+HH9jyR1EWjqvEvdaZcZLlme+FVNCpEW6grgANogIj4J\nMOcL\r\n=n0dt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDcJP3opAnRZikbB5z3Wsvw27tvVMXXXlQAo0ZXyMhr/AIhAOm+s7aChICINYonsvCQPE5YCIHJQeF1MyRWyzu0KAzO"}]},"_npmUser":{"name":"vsamaru","email":"vsamaru@gmail.com"},"directories":{},"maintainers":[{"name":"vsamaru","email":"vsamaru@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/6e_0.0.4_1619471959582_0.17241259670072062"},"_hasShrinkwrap":false},"0.0.5":{"name":"6e","version":"0.0.5","main":"dist/source","types":"dist/source","scripts":{"u":"ncu -u && npm update","build":"tsc","e":"node examples/main-javascript.js","start":"nodemon index.js"},"dependencies":{"1te":"^4.0.7","typegram":"^3.3.1"},"devDependencies":{"@types/node":"^15.0.0","ts-node":"^9.1.1","typescript":"^4.2.4"},"description":"[![NPM Version](https://img.shields.io/npm/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![node](https://img.shields.io/node/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![Build Stat","_id":"6e@0.0.5","_nodeVersion":"15.9.0","_npmVersion":"7.8.0","dist":{"integrity":"sha512-LFu3Ioyob174PMGjplel8unkXmdOOXZ0OocMbckx7bSmUQNdev3UP0ZZ8Llv9ariBIC2JgJw8RyMMgd57Saz9g==","shasum":"1d5cb589d28db8840fcc38269973fa5456cf316a","tarball":"https://registry.npmjs.org/6e/-/6e-0.0.5.tgz","fileCount":31,"unpackedSize":106955,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghy+VCRA9TVsSAnZWagAAX/wQAJerBAEdmIRagBRUXCGs\nxX2gnv8ArjfhVN5zJTpFDmMOv8P4nqcSAxuv897+yKtigohrgE2xxgsJCRpp\neJWzCPma/83z9qJswH3qQgO8ShIGuUE69YlE7rxNNnDomm4mQCmSOFhp02gJ\nM8jn+oeDncxL8zWJx2Pg2DhOsLKOgRNlolcvCX9PL+zHE/rSFyuo9cvJkwN4\nYzuX9LKZCPfPl0iwGtbYgvIlEMFwci4xEldBgUm0skE+IHygNTAwkwWBqL1A\nQNOvH5kr2L0NMbS5OkBiA38Ol3rlgO6g/Oa6TsVhhRrx/f9qjkFDaFn7wqFy\nCM882cjpCtzoMr+1PAnSB2Wl/7631yL2dMQGM/j2alyEtcwEFyynVjvjB1fy\nQis22Awoo6g3Y210iJLq8G6t8Yb7pQasSUeUu2KAcnTxuOK9InHBuwXgWaIE\neccp+A2DfyDUVpz8lYhVuARLjaieTYqNGUBSBtkQUdaJuXrCVD0bm9+Fh90P\nHiXkPyEEbI+/ZS9ZWl/UNSs+fduBR1ZLXoDqKsBSukWryiTEFQOKee1puzJd\nKlQRdbvmqFQN4Su9UWX1CHKpgjN6OH+Gb2lcKtmB5Pn9hfgnC9DjEnkHDHmn\nLnpf2iLl8ielFyTMJHScl5ZJWjYLRhvgYeQm5KgLV6ZLo0jFSvBeyI7c0BQF\nKTXm\r\n=/kqp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIElKHJfgP6YThNtSu7XvWfIy3r8V9hxqxXWPhtBqM3xBAiAesepAi3BXrophttU87mHzrqd+6Xet4QPiia4I287A7w=="}]},"_npmUser":{"name":"vsamaru","email":"vsamaru@gmail.com"},"directories":{},"maintainers":[{"name":"vsamaru","email":"vsamaru@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/6e_0.0.5_1619472277355_0.5404299751545696"},"_hasShrinkwrap":false},"0.0.7":{"name":"6e","version":"0.0.7","main":"dist/source","types":"dist/source","scripts":{"u":"ncu -u && npm update","build":"tsc"},"dependencies":{"1te":"^4.0.7","typegram":"^3.3.1"},"devDependencies":{"@types/node":"^15.0.0","ts-node":"^9.1.1","typescript":"^4.2.4"},"description":"[![NPM Version](https://img.shields.io/npm/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![node](https://img.shields.io/node/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![Build Stat","_id":"6e@0.0.7","_nodeVersion":"15.9.0","_npmVersion":"7.8.0","dist":{"integrity":"sha512-Yfo60Uyhuwl4IefDSPXz2hE/6wQadQVNi5Ta8SgI+uzLgBZlMP/7pwwcmtBmK29pdONjzl/r45V9KTWcqyLC2A==","shasum":"5f9436a24c3dc050003e541a96b1fadfc9b034d2","tarball":"https://registry.npmjs.org/6e/-/6e-0.0.7.tgz","fileCount":28,"unpackedSize":90447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghzDBCRA9TVsSAnZWagAAdPcQAIBJS1yZAmAeya4YDVMO\nwYjtMXcGfYukWa5c+Kct3T9smUeu2SMO34QWfdtKW8WRsCmol6fn1lpIcK9F\na1w9Nnq+9mY9quVrr4bUj3F9C6o4qolACxmLeCuUcW+UcVhXSfhbvqUR9Qpc\nJdl5V6VsgG+m91deSR/OkG05ZpfMLB+3ij+97GZpFnKmESMc7mlspmIohlmy\nLK00dZ4ZvOWX0E+bgnL1ipCCZtxc0dkWZYeh9yLd5jjP64DXj2+/ZZ/f/cH3\nK2Tg4C60hEJkmfAkK2+GAeXU2xgZ2hcw++zB5Pm+dlKuTjJHrYDvGdCaSNfV\nyo2noUY0GzRL8F9E9MHAGlpUvoUO8Kph/d5MOwOLBJ9YiQDGZg1S+2567FjR\nV+2aLUJDMWFVvX6CZ9hlBUR+Zrw9GPmO2nzAkK/NTZIzh5Qd5rK2OUr+u7N4\nBeGdLhIef5StLUdkEyiN6jn8foIIpVdtRsc4QSSjQdB0nxhyNzBclS9hQ4Et\n0KHn+TJMzjOy3gbFTSr/iZCxZPcphyGrs60etJq/fmCLZgFuTAz+cD3HAYyV\nELSSbKvBiLeabCpk0jUWq+l/z/UeT6RrH3o/PHPKEeY2FKR0c9IJd+YD3ZVn\nni39q8mc8BDvIOR/2/Z+cSC9gjK43lWtwLCdR7Y7a7Ou9LlynWxOADHi19MA\nDV5G\r\n=vPt7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9f1mj2qD81nbS0EYdOGCP+oj17B83iIE+86uNJkVaNgIgej4nMh95m9BqKUq78YELRyS/ahxtbZZH9xrhZxuZHys="}]},"_npmUser":{"name":"vsamaru","email":"vsamaru@gmail.com"},"directories":{},"maintainers":[{"name":"vsamaru","email":"vsamaru@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/6e_0.0.7_1619472577081_0.6382926676533847"},"_hasShrinkwrap":false},"0.0.8":{"name":"6e","version":"0.0.8","main":"dist/source","types":"dist/source","scripts":{"u":"ncu -u && npm update","build":"tsc"},"dependencies":{"1te":"^4.0.7","typegram":"^3.3.1"},"devDependencies":{"@types/node":"^15.0.0","ts-node":"^9.1.1","typescript":"^4.2.4"},"description":"[![NPM Version](https://img.shields.io/npm/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![node](https://img.shields.io/node/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![Build Stat","_id":"6e@0.0.8","_nodeVersion":"15.9.0","_npmVersion":"7.8.0","dist":{"integrity":"sha512-3B+5VPnVolNzrxhHIRQtVQvkalYRvTsV0xkVaW0k0xjg7I9YN/YS5PWA/bkLcq2Ie+3m+K/Y5dF6RBGZAAxZeg==","shasum":"ce843761d05e013027e7ec7c380570e63929a0f1","tarball":"https://registry.npmjs.org/6e/-/6e-0.0.8.tgz","fileCount":53,"unpackedSize":212633,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghzFZCRA9TVsSAnZWagAA5gAP/i5SZ9I7HZMZlMWa//uG\n3eg6LF+h/fhhunHxPdpVugPIfw27onocROhAYNoBsUYid53GsbJ9V6iHcDMI\nhQPJDr3z31+sMRJINRE0qiz+1sWSGRBNPPrzgUoWA2w1nv3ewVPaDY87RwW+\nSVRVQoZaCgx6NejPNEpVuVODq2kHjUqTKuaBX6Vfrpv9IZiHS6zhFjN/ediJ\nE3QP8axaDkXkX5U/QtWreWVkR/XNTXyv/gu8Js7MVrhpK6qDtT0yoHODO5uA\nGpMLNwQguy4H7cx9GK547iW5TGb7oMRukPyq11yokza6/U/ncEQ3260X3ZqR\n3FVHxc83M0CibelG2NClKbOxcJ0uP0nqOSZSMET9/KcLjpYI2dFKg9OPvNmu\nSWqiVMt3AXgZ31hbHRAkN/XnEO98NRk7md479z9GB2TKttJ40DnF6ZyTPH4q\nclelm+tYsx3HvF609hK88zBs0Mi4/STQ8Vd/xGQhKwKi24TD+I1sLOBWNHbx\nGA0BB/ml/GEv6mhYcMwjVgEefuyO84S9osSsUnxEnolxyzG0oSDQGZuXuaa9\n3EKcmKz1QMi4EypruvqB5fJNAg1PXJQDX86sjLuXZexf1W87Tv//jum+dLxp\nVUevs55Bh/9Sre5twPDp94EpQK98utMhZ+Bz3RyuXiTAz9g9gystB4vLNwy8\nBVkX\r\n=0HRv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnUFfcxVboWUVMD3GXXsakraBEK9fQs/UleTZVh0EXiwIgLPT8t7GE08SefQz7rF6VStTIUPlM4tkPcP8VdYJGuBU="}]},"_npmUser":{"name":"vsamaru","email":"vsamaru@gmail.com"},"directories":{},"maintainers":[{"name":"vsamaru","email":"vsamaru@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/6e_0.0.8_1619472728638_0.8306657693221389"},"_hasShrinkwrap":false},"0.0.9":{"name":"6e","version":"0.0.9","description":"A library that makes the Fetch API a breeze","main":"dist/index-cjs.js","module":"dist/index.mjs","browser":"dist/index.js","scripts":{"u":"ncu -u && npm update && npm install","test":"jest","test:watch":"jest --watch","build":"rollup -c","prepublish":"npm run test && npm run build","release":"np --no-publish && npm publish"},"dependencies":{"@babel/runtime":"^7.13.17","btoa":"^1.2.1","cross-fetch":"^3.1.4"},"devDependencies":{"@babel/core":"^7.13.16","@babel/plugin-transform-runtime":"^7.13.15","@babel/preset-env":"^7.13.15","@rollup/plugin-commonjs":"^18.0.0","@rollup/plugin-json":"^4.1.0","@rollup/plugin-node-resolve":"^11.2.1","@types/jest":"^26.0.23","babel-jest":"^26.6.3","body-parser":"^1.19.0","express":"^4.17.1","form-data":"^4.0.0","jest":"^26.6.3","jest-extended":"^0.11.5","np":"^7.5.0","portastic":"^1.0.1","rimraf":"^3.0.2","rollup":"^2.45.2","rollup-plugin-babel":"^4.3.3","rollup-plugin-node-builtins":"^2.1.2","rollup-plugin-node-globals":"^1.4.0","rollup-plugin-terser":"^7.0.2","standard":"^16.0.3","supertest":"^6.1.3"},"_id":"6e@0.0.9","_nodeVersion":"15.9.0","_npmVersion":"7.8.0","dist":{"integrity":"sha512-Xvt+f/EUlr9ZODGTZtd+grrttfkUbJwKXQZxuRHsgIUYFrrUPgRAeEJfte//IQ0eOkO0rvPBsreJKiUGD9osZg==","shasum":"98a4f9bfb9c1e92db0e6e2d2814a4d5da7641dfa","tarball":"https://registry.npmjs.org/6e/-/6e-0.0.9.tgz","fileCount":20,"unpackedSize":41593,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgh0BCCRA9TVsSAnZWagAAUqYP/3T1B0AzBuaBs/8Z6EpQ\nY1RZCa4HAtV4Ozi+g3lItdfZiQWkufYgQyJ6iYbB7R8O1p8ycF2CRlplARxk\nfmZAvEIAWTKJWCdBMBn7y+qsSuHs/4DBvMEvzr5R0JtBCp7a3fMf9V0GHLDz\na23eiA1rj/yYn6I64+ZWxs24yaqRsPa023SLSKEvLnseRoCGlEVcoGeM9Irm\nsKiEiuwk5AMc58BKWzYF2lI+Np5+p4EpCYqUeQWb+haqQPikHcjtMCpzEjdn\nQua2/zIyAMj6UOkx6N7oXLUsvjDGtnIJHI7fpJbgAW3n1ErFfsmQlqxx1pIm\n7MPAXXaXnemx4VaEtEA6tTNeGLm5KT9jFdddEL9SSccNUhAkyjr1avjw6cLD\n8zri5/O9MsqAOVrYZOguOpa0lJZ7C5/Tfo/Z7XNFBus0CTwDi8ykUnKI/YzN\nhTMWX2WILYQajd5xOiHYROKjKpj189YAU+TM0N6Uvi6xXXfRQameEaLm0mV+\nfIPvWCC8jh1eqsJXFadFzbo6pP7Zx+qVu60U3v5yXzVEeuNI6BGLU7e1WZZA\nOifjO+llmFxfDcplTcToCfgv6EwJZHgEmaSTNXpJVos5mTeYSaNj9M6Nc8mT\nEry8a7yyMBo8yLGxku6Q+vcO6J4f29bsjVzMgGhXT9zEsB+hBU/rr0vNO6kh\nUzIe\r\n=6/6p\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMXEcMEVRkuBuhhgWczebtXLHlv4eFSOG4uw3Lcr0+UAIhAL9Va8VqIzCezoP6Wx4USKPKW3nv1veMGzjncaBtumT8"}]},"_npmUser":{"name":"vsamaru","email":"vsamaru@gmail.com"},"directories":{},"maintainers":[{"name":"vsamaru","email":"vsamaru@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/6e_0.0.9_1619476546506_0.2172830256714562"},"_hasShrinkwrap":false},"0.0.91":{"name":"6e","version":"0.0.91","description":"A library that makes the Fetch API a breeze","main":"dist/index-cjs.js","module":"dist/index.mjs","browser":"dist/index.js","scripts":{"u":"ncu -u && npm update && npm install","test":"jest","test:watch":"jest --watch","build":"rollup -c","prepublish":"npm run test && npm run build","release":"np --no-publish && npm publish"},"dependencies":{"@babel/runtime":"^7.13.17","btoa":"^1.2.1","cross-fetch":"^3.1.4"},"devDependencies":{"@babel/core":"^7.13.16","@babel/plugin-transform-runtime":"^7.13.15","@babel/preset-env":"^7.13.15","@rollup/plugin-commonjs":"^18.0.0","@rollup/plugin-json":"^4.1.0","@rollup/plugin-node-resolve":"^11.2.1","@types/jest":"^26.0.23","babel-jest":"^26.6.3","body-parser":"^1.19.0","express":"^4.17.1","form-data":"^4.0.0","jest":"^26.6.3","jest-extended":"^0.11.5","np":"^7.5.0","portastic":"^1.0.1","rimraf":"^3.0.2","rollup":"^2.45.2","rollup-plugin-babel":"^4.3.3","rollup-plugin-node-builtins":"^2.1.2","rollup-plugin-node-globals":"^1.4.0","rollup-plugin-terser":"^7.0.2","standard":"^16.0.3","supertest":"^6.1.3"},"_id":"6e@0.0.91","_nodeVersion":"15.9.0","_npmVersion":"7.8.0","dist":{"integrity":"sha512-T2+W1ry8a7s3SlWzbCWPBGKVYxpU1t7f5/fsUQLvj+uut2DYT8exHlwjljPzZEan/YjDNiD0k5vTlydfAZWwmw==","shasum":"5c48d65bacbce6ed39260002e307c9391880ebb3","tarball":"https://registry.npmjs.org/6e/-/6e-0.0.91.tgz","fileCount":20,"unpackedSize":41371,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgh0GlCRA9TVsSAnZWagAAUGYP/RPxqP/V8nmnVW9CP4KG\nOcO/i1SWTNdY8zHQAjz4RkvR8LhEkjXBT/viCWjU05UU68JOGwe/mt/sjXoL\nK6FLXhlLwZIDtWriK5TvDNzonn1cdNveCcgO+jts+Qh3RsrIvOm2JX2N1AM1\nGgBmxZsILnXo4I0EGtnxSB4hvRd7MKmhEkJi+05NDiXPM5iiDlKXYmdDll//\nvzql2/mejmXpKG+mHat2y9sASOnPei3WH/ZHyqcpVYyKkNDoNbtlGt2Jgft6\nNB0jvAgEPOsAqPh4QwPbfJnaqoZjEw+baTXLxPc9bDKE6tJwHLoCtfyjzBNk\n4lbIf1YUGrC5Il5+ah1iUwMSGk2Ne/ZVWzXwkM2gumHrTjzyBTN9p/xO2VcU\nfuI8JI5fUw8Xmwc7qEoBMnAVCU1Z33NGiyMtCGtuH1/4zG4PvGRVx7EgBbaQ\nHWuGEqrgvhLWV0x2BGkrzYKcm9HMgFzGDnsF7PhdDyY6NpAU4pQUwEAT3Gyl\n5L63cOhY7IhKfbVv4sl5u50lf+CacKLCmgtSPb0xgMt13R6Nl5+pnVY99NP/\npOqaFKQ/7JKxCQj+4Nngq+L2ld5NOLXrwrlO4Q4G1JVbEk9rnZ/hXcxynsOl\nNV6WJofGQaLf6riLiBon+2R9PFxR9bzT6uCbwVWg7KUkZwdoxPyyG7HN3XDS\nxwcU\r\n=9HrU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFKMpQr96y/iv3rhgiCMHZD2gvrqF9hhLm07yYmxFbI+AiBejqZXL2nLQ8ZVXFVcY+aaVeiOouMh41HrJopY6srVVg=="}]},"_npmUser":{"name":"vsamaru","email":"vsamaru@gmail.com"},"directories":{},"maintainers":[{"name":"vsamaru","email":"vsamaru@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/6e_0.0.91_1619476901249_0.8874553019618423"},"_hasShrinkwrap":false},"0.0.92":{"name":"6e","version":"0.0.92","main":"index.js","scripts":{"u":"ncu -u && npm update"},"dependencies":{"1te":"^4.0.7","typegram":"^3.3.1"},"devDependencies":{"@types/node":"^15.0.0"},"description":"[![NPM Version](https://img.shields.io/npm/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![node](https://img.shields.io/node/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![Build Stat","_id":"6e@0.0.92","_nodeVersion":"15.9.0","_npmVersion":"7.8.0","dist":{"integrity":"sha512-fRSsQ7HEV8q5gHbz6FGC6TR2FBFijejWHhUMqSdsqJeuR/wU2V4M6UTReVzdJlU7ffbtJ+9/E+5VSN7ukE0odQ==","shasum":"1664957acb223a7261afe62affa74a8ed6c39152","tarball":"https://registry.npmjs.org/6e/-/6e-0.0.92.tgz","fileCount":4,"unpackedSize":28227,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgh0T4CRA9TVsSAnZWagAAI3QP/3opa1AhtTvxQZlBCTEa\nS95aXTeQtQwC8mV6bBIuo83lfMrfok6Jwxte0gwjSVl/F93u6pnLq12REPgO\nJO6Bros1cxs6pdnU6Efg525ZomcXjdUJsoYLn6zVlXjnlM5gf34oe3ano2Lk\nZZZGtHFkTn7UdvWpf7PIKQld6xrBNGIQtDEh9Cm0Ra1M9gdc/ut4ixG8qtd2\nlNelRTwbQPwan/+4UJnxfRamH4Uxz82kvSrfesfUFsu6rrMcdYhSGOrW7QXy\nLS7A9sqGkj2uk0j2bK7rv+1rRCBM3ez10Up17lubefvPPX2EDquauwHSnD59\nFv9oH9npyiPWhga9C/Zag2sZQNnE6lNSSTz/n2czMksoDLaMpO8q3JWZzfYP\ngzWOtQMH60GIbdRLoaPgRjRDDyoxL2gulwYLhKYnApfpwZgwHtjFhf69FqUA\nn4/AJnQdgkKuiGQS7Q9NYhvoB/0w7eJOPaU3LAxDIFDOpMaCPHl/ViP05xwF\nNZzSQDn4qhT48hQp6DGgCFlVmAu9Q2xQYG2HPKbu72MjsXqnhlLFPVQs4yyN\nHaRI29/Lzsqbkn7WauinRefWoZVIfIdu7xIWXZGm7lzswxfmYTsPUgEUkvJl\n0S9CnTKPGywlbYxYsOXlKvMxU4UM+Kyvv+lUhgdztWz+SS1t7Z084tUFEp90\n5Q8U\r\n=XCRK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFRJ8fBjIuIdp3Cvb28PwKUdMSTQVWAr0b6De/Jugxd6AiAuv1CD9GjWUEcAom33LFTUsbi67Rc92q2LjqtCK3gb8w=="}]},"_npmUser":{"name":"vsamaru","email":"vsamaru@gmail.com"},"directories":{},"maintainers":[{"name":"vsamaru","email":"vsamaru@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/6e_0.0.92_1619477751854_0.16008397350922743"},"_hasShrinkwrap":false}},"time":{"created":"2021-04-26T20:40:44.585Z","0.0.1":"2021-04-26T20:40:44.772Z","modified":"2023-02-20T18:36:19.382Z","0.0.2":"2021-04-26T21:01:01.705Z","0.0.3":"2021-04-26T21:08:54.571Z","0.0.4":"2021-04-26T21:19:19.790Z","0.0.5":"2021-04-26T21:24:37.497Z","0.0.7":"2021-04-26T21:29:37.244Z","0.0.8":"2021-04-26T21:32:08.814Z","0.0.9":"2021-04-26T22:35:46.656Z","0.0.91":"2021-04-26T22:41:41.433Z","0.0.92":"2021-04-26T22:55:51.994Z"},"maintainers":[{"email":"dad2vad@gmail.com","name":"dad22"},{"email":"zbndmt@gmail.com","name":"zbndm"},{"email":"vsamaru@gmail.com","name":"o6"}],"readme":"# Telegraf Inline Menu\n\n[![NPM Version](https://img.shields.io/npm/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu)\n[![node](https://img.shields.io/node/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu)\n[![Build Status](https://github.com/EdJoPaTo/telegraf-inline-menu/workflows/NodeJS/badge.svg)](https://github.com/EdJoPaTo/telegraf-inline-menu/actions)\n[![Last Commit](https://img.shields.io/github/last-commit/EdJoPaTo/telegraf-inline-menu.svg)](https://github.com/EdJoPaTo/telegraf-inline-menu)\n[![Dependency Status](https://david-dm.org/EdJoPaTo/telegraf-inline-menu/status.svg)](https://david-dm.org/EdJoPaTo/telegraf-inline-menu)\n[![Peer Dependency Status](https://david-dm.org/EdJoPaTo/telegraf-inline-menu/peer-status.svg)](https://david-dm.org/EdJoPaTo/telegraf-inline-menu?type=peer)\n[![Dev Dependency Status](https://david-dm.org/EdJoPaTo/telegraf-inline-menu/dev-status.svg)](https://david-dm.org/EdJoPaTo/telegraf-inline-menu?type=dev)\n\nThis menu library is made to easily create an inline menu for your Telegram bot.\n\n![Example shown as a gif](media/example-food.gif)\n\n# Installation\n\n```\n$ npm install telegraf-inline-menu\n```\n\nor using `yarn`:\n\n```\n$ yarn add telegraf-inline-menu\n```\n\nConsider using TypeScript with this library as it helps with finding some common mistakes faster.\n\nA good starting point for TypeScript and Telegraf bots might be this repo: [EdJoPaTo/telegram-typescript-bot-template](https://github.com/EdJoPaTo/telegram-typescript-bot-template)\n\n# Examples\n\n## Basic Example\n\n```ts\nconst {Telegraf} = require('telegraf')\nconst {MenuTemplate, MenuMiddleware} = require('telegraf-inline-menu')\n// or\nimport {Telegraf} from 'telegraf'\nimport {MenuTemplate, MenuMiddleware} from 'telegraf-inline-menu'\n\nconst menuTemplate = new MenuTemplate<MyContext>(ctx => `Hey ${ctx.from.first_name}!`)\n\nmenuTemplate.interact('I am excited!', 'a', {\n  do: async ctx => ctx.reply('As am I!')\n})\n\nconst bot = new Telegraf(process.env.BOT_TOKEN)\n\nconst menuMiddleware = new MenuMiddleware('/', menuTemplate)\nbot.command('start', ctx => menuMiddleware.replyToContext(ctx))\nbot.use(menuMiddleware)\n\nbot.launch()\n```\n\n## More interesting one\n\n![Example shown as a gif](media/example-food.gif)\n\nLook at the code here: [TypeScript](examples/main-typescript.ts) / [JavaScript (consider using TypeScript)](examples/main-javascript.js)\n\n# Migrate from version 4 to version 5\n\nIf your project still uses version 4 of this library see [v4 documentation](https://github.com/EdJoPaTo/telegraf-inline-menu/blob/v4.0.1/README.md) and consider refactoring to version 5.\n\nList of things to migrate:\n\n- `TelegrafInlineMenu` was splitted into multiple classes.\n  When you used `new TelegrafInlineMenu(text)` you will use `new MenuTemplate(body)` now.\n- Applying the menu to the bot via `bot.use` changed. This can now be done with the `MenuMiddleware`. Check the [Basic Example](#Basic-Example)\n- `button` and `simpleButton` are combined and renamed into `interact`. See [How can I run a simple method when pressing a button?](#how-can-i-run-a-simple-method-when-pressing-a-button)\n- `selectSubmenu` was renamed to `chooseIntoSubmenu`\n- `select` was splitted into `choose` and `select`. See [Whats the difference between choose and select?](#Whats-the-difference-between-choose-and-select)\n- `question` is moved into a seperate library. see [Didnt this menu had a question function?](#Didnt-this-menu-had-a-question-function)\n- The menu does not automatically add back and main menu buttons anymore.\n  Use `menuTemplate.manualRow(createBackMainMenuButtons())` for that at each menu which should include these buttons.\n- `setCommand` and `replyMenuMiddleware` were replaced by multiple different functions. See [Can I send the menu manually?](#Can-I-send-the-menu-manually)\n\n# Migrate from version 5 to version 6\n\nVersion 6 switched from telegraf 3.38 to 4.0. See the [telegraf migration guide for this set of changes](https://github.com/telegraf/telegraf/releases/tag/v4.0.0).\n\ntelegraf-inline-menu is relativly unaffected by this.\nThe only change required besides the telegraf changes is the change of `ctx.match`.\nSimply add `match` to your `MyContext` type:\n```ts\nexport interface MyContext extends TelegrafContext {\n\treadonly match: RegExpExecArray | undefined;\n\t…\n}\n```\n\ntelegraf knows when match is available or not.\nThe default Context does not have match anymore.\ntelegraf-inline-menu should also know this in a future release.\n\n# How does it work\n\nTelegrams inline keyboards have buttons.\nThese buttons have a text and callback data.\n\nWhen a button is hit the callback data is sent to the bot.\nYou know this from Telegraf from `bot.action`.\n\nThis library both creates the buttons and listens for callback data events.\nWhen a button is pressed and its callback data is occuring the function relevant to the button is executed.\n\nIn order to handle tree like menu structures with submenus the buttons itself use a tree like structure to differentiate between the buttons.\nImagine it as the file structure on a PC.\n\nThe main menu uses `/` as callback data.\nA button in the main menu will use `/my-button` as callback data.\nWhen you create a submenu it will end with a `/` again: `/my-submenu/`.\n\nThis way the library knows what do to when an action occurs:\nIf the callback data ends with a `/` it will show the corresponding menu.\nIf it does not end with a `/` it is an interaction to be executed.\n\nYou can use a Telegraf middleware in order to see which callback data is used when you hit a button:\n\n```ts\nbot.use((ctx, next) => {\n\tif (ctx.callbackQuery) {\n\t\tconsole.log('callback data just happened', ctx.callbackQuery.data)\n\t}\n\n\treturn next()\n})\n\nbot.use(menuMiddleware)\n```\n\nYou can also take a look on all the regular expressions the menu middleware is using to notice a button click with `console.log(menuMiddleware.tree())`.\nDont be scared by the output and try to find where you can find the structure in the sourcecode.\nWhen you hit a button the specific callback data will be matched by one of the regular expressions.\nAlso try to create a new button and find it within the tree.\n\nIf you want to manually send your submenu `/my-submenu/` you have to supply the same path that is used when you press the button in the menu.\n\n## Improve the docs\n\nIf you have any questions on how the library works head out to the issues and ask ahead.\nYou can also join the [Telegraf community chat](https://t.me/TelegrafJSChat) in order to talk about the questions on your mind.\n\nWhen you think there is something to improve on this explanation, feel free to open a Pull Request!\nI am already stuck in my bubble on how this is working.\nYou are the expert on getting the knowledge about this library.\nLets improve things together!\n\n# FAQ\n\n## Can I use HTML / MarkdownV2 in the message body?\n\nMaybe this is also useful: [npm package telegram-format](https://github.com/EdJoPaTo/telegram-format)\n\n```ts\nconst menuTemplate = new MenuTemplate<MyContext>(ctx => {\n\tconst text = '_Hey_ *there*!'\n\treturn {text, parse_mode: 'Markdown'}\n})\n```\n\n## Can the menu body be some media?\n\nThe menu body can be an object containing `media` and `type` for media.\nThe `media` and `type` is the same as [Telegrams InputMedia](https://core.telegram.org/bots/api#inputmedia).\nThe media is just passed to telegraf so check its documentation on [how to work with files](https://telegraf.js.org/#/?id=working-with-files).\n\nThe [example](examples/main-typescript.ts) features a media submenu with all currently supported media types.\n\n```ts\nconst menuTemplate = new MenuTemplate<MyContext>((ctx, path) => {\n\t// Do something\n\n\treturn {\n\t\ttype: 'photo',\n\t\tmedia: {\n\t\t\tsource: `./${ctx.from.id}.jpg`\n\t\t},\n\t\ttext: 'Some *caption*',\n\t\tparse_mode: 'Markdown'\n\t}\n})\n```\n\nThe argument of the `MenuTemplate` can be passed a body or a function returning a body.\nA body can be a string or an object with options like seen above.\nWhen using as a function the arguments are the context and the path of the menu when called.\n\n## How can I run a simple method when pressing a button?\n\n```ts\nmenuTemplate.interact('Text', 'unique', {\n\tdo: async ctx => {\n\t\tawait ctx.answerCbQuery('yaay')\n\t\treturn false\n\t}\n})\n```\n\n## Why do I have to return a boolean or string for the do/set function?\n\nYou can control if you want to update the menu afterwards or not.\nWhen the user presses a button which changes something in the menu text you want the user to see the updated content.\nYou can return a relative path to go to afterwards or a simple boolean (yes = `true`, no = `false`).\n\nUsing paths can become super handy.\nFor example when you want to return to the parent menu you can use the path `..`.\nOr to a sibling menu with `../sibling`.\n\nIf you just want to navigate without doing logic you should prefer `.navigate(…)`.\n\n```ts\nmenuTemplate.interact('Text', 'unique', {\n\tdo: async ctx => {\n\t\tawait ctx.answerCbQuery('go to parent menu after doing some logic')\n\t\treturn '..'\n\t}\n})\n```\n\n## How to use a dynamic text of a button?\n\nThis is often required when translating ([telegraf-i18n](https://github.com/telegraf/telegraf-i18n)) your bot.\n\nAlso check out other buttons like [toggle](#how-can-i-toggle-a-value-easily) as they do some formatting of the button text for you.\n\n```ts\nmenuTemplate.interact(ctx => ctx.i18n.t('button'), 'unique', {\n\tdo: async ctx => {\n\t\tawait ctx.answerCbQuery(ctx.i18n.t('reponse'))\n\t\treturn '.'\n\t}\n})\n```\n\n## How can I show an url button?\n\n```ts\nmenuTemplate.url('Text', 'https://edjopato.de')\n```\n\n## How can I display two buttons in the same row?\n\nUse `joinLastRow` in the second button\n\n```ts\nmenuTemplate.interact('Text', 'unique', {\n\tdo: async ctx => ctx.answerCbQuery('yaay')\n})\n\nmenuTemplate.interact('Text', 'unique', {\n\tjoinLastRow: true,\n\tdo: async ctx => ctx.answerCbQuery('yaay')\n})\n```\n\n## How can I toggle a value easily?\n\n```ts\nmenuTemplate.toggle('Text', 'unique', {\n\tisSet: ctx => ctx.session.isFunny,\n\tset: (ctx, newState) => {\n\t\tctx.session.isFunny = newState\n\t}\n})\n```\n\n## How can I select one of many values?\n\n```ts\nmenuTemplate.select('unique', ['human', 'bird'], {\n\tisSet: (ctx, key) => ctx.session.choice === key,\n\tset: (ctx, key) => {\n\t\tctx.session.choice = key\n\t}\n})\n```\n\n## How can I toggle many values?\n\n```ts\nmenuTemplate.select('unique', ['has arms', 'has legs', 'has eyes', 'has wings'], {\n\tshowFalseEmoji: true,\n\tisSet: (ctx, key) => Boolean(ctx.session.bodyparts[key]),\n\tset: (ctx, key, newState) => {\n\t\tctx.session.bodyparts[key] = newState\n\t}\n})\n```\n\n## How can I interact with many values based on the pressed button?\n\n```ts\nmenuTemplate.choose('unique', ['walk', 'swim'], {\n\tdo: async (ctx, key) => {\n\t\tawait ctx.answerCbQuery(`Lets ${key}`)\n\t\t// You can also go back to the parent menu afterwards for some 'quick' interactions in submenus\n\t\treturn '..'\n\t}\n})\n```\n\n## Whats the difference between choose and select?\n\nIf you want to do something based on the choice use `menuTemplate.choose(…)`.\nIf you want to change the state of something, select one out of many options for example, use `menuTemplate.select(…)`.\n\n`menuTemplate.select(…)` automatically updates the menu on pressing the button and shows what it currently selected.\n`menuTemplate.choose(…)` runs the method you want to run.\n\n## How can I use dynamic text for many values with choose or select?\n\nOne way of doing so is via `Record<string, string>` as input for the choices:\n\n```ts\nconst choices: Record<string, string> = {\n\ta: 'Alphabet',\n\tb: 'Beta',\n\tc: 'Canada'\n}\n\nmenuTemplate.choose('unique', choices, …)\n```\n\nYou can also use the `buttonText` function for `.choose(…)` or `formatState` for `.select(…)` (and `.toggle(…)`)\n\n```ts\nmenuTemplate.choose('unique', ['a', 'b'], {\n\tdo: …,\n\tbuttonText: (context, text) => {\n\t\treturn text.toUpperCase()\n\t}\n})\n```\n\n## I have too much content for one message. Can I use a pagination?\n\n`menuTemplate.pagination` is basically a glorified `choose`.\nYou can supply the amount of pages you have and whats your current page is and it tells you which page the user whats to see.\nSplitting your content into pages is still your job to do.\nThis allows you for all kinds of variations on your side.\n\n```ts\nmenuTemplate.pagination('unique', {\n\tgetTotalPages: () => 42,\n\tgetCurrentPage: context => context.session.page,\n\tsetPage: (context, page) => {\n\t\tcontext.session.page = page\n\t}\n})\n```\n\n## My choose/select has too many choices. Can I use a pagination?\n\nIf you dont use a pagination you might have noticed that not all of your choices are displayed.\nPer default only the first page is shown.\nYou can select the amount of rows and columns via `maxRows` and `columns`.\nThe pagination works similar to `menuTemplate.pagination` but you do not need to supply the amount of total pages as this is calculated from your choices.\n\n```ts\nmenuTemplate.choose('eat', ['cheese', 'bread', 'salad', 'tree', …], {\n\tcolumns: 1,\n\tmaxRows: 2,\n\tgetCurrentPage: context => context.session.page,\n\tsetPage: (context, page) => {\n\t\tcontext.session.page = page\n\t}\n})\n```\n\n## How can I use a submenu?\n\n```ts\nconst submenu = new MenuTemplate<MyContext>('I am a submenu')\nsubmenuTemplate.interact('Text', 'unique', {\n\tdo: async ctx => ctx.answerCbQuery('You hit a button in a submenu')\n})\nsubmenuTemplate.manualRow(createBackMainMenuButtons())\n\nmenuTemplate.submenu('Text', 'unique', submenuTemplate)\n```\n\n## How can I use a submenu with many choices?\n\n```ts\nconst submenuTemplate = new MenuTemplate<MyContext>(ctx => `You chose city ${ctx.match[1]}`)\nsubmenuTemplate.interact('Text', 'unique', {\n\tdo: async ctx => {\n\t\tconsole.log('Take a look at ctx.match. It contains the chosen city', ctx.match)\n\t\treturn ctx.answerCbQuery('You hit a button in a submenu')\n\t}\n})\nsubmenuTemplate.manualRow(createBackMainMenuButtons())\n\nmenuTemplate.chooseIntoSubmenu('unique', ['Gotham', 'Mos Eisley', 'Springfield'], submenuTemplate)\n```\n\n## Can I close the menu?\n\nYou can delete the message like you would do with telegraf: `context.deleteMessage()`.\nKeep in mind: You can not delete messages which are older than 48 hours.\n\n`deleteMenuFromContext` tries to help you with that:\nIt tries to delete the menu.\nIf that does not work the keyboard is removed from the message so the user will not accidentally press something.\n\n```ts\nmenuTemplate.interact('Delete the menu', 'unique', {\n\tdo: async context => {\n\t\tawait deleteMenuFromContext(context)\n\t}\n})\n```\n\n## Can I send the menu manually?\n\nIf you want to send the root menu use `ctx => menuMiddleware.replyToContext(ctx)`\n\n```ts\nconst menuMiddleware = new MenuMiddleware('/', menuTemplate)\nbot.command('start', ctx => menuMiddleware.replyToContext(ctx))\n```\n\nYou can also specify a path to the `replyToContext` function for the specific submenu you want to open.\nSee [How does it work](#how-does-it-work) to understand which path you have to supply as the last argument.\n\n```ts\nconst menuMiddleware = new MenuMiddleware('/', menuTemplate)\nbot.command('start', ctx => menuMiddleware.replyToContext(ctx, path))\n```\n\nYou can also use sendMenu functions like `replyMenuToContext` to send a menu manually.\n\n```ts\nimport {MenuTemplate, replyMenuToContext} from 'telegraf-inline-menu'\nconst settingsMenu = new MenuTemplate('Settings')\nbot.command('settings', async ctx => replyMenuToContext(settingsMenu, ctx, '/settings/'))\n```\n\n## Can I send the menu from external events?\n\nWhen sending from external events you still have to supply the context to the message or some parts of your menu might not work as expected!\n\nSee [How does it work](#how-does-it-work) to understand which path you have to supply as the last argument of `generateSendMenuToChatFunction`.\n\n```ts\nconst sendMenuFunction = generateSendMenuToChatFunction(bot.telegram, menu, '/settings/')\n\nasync function externalEventOccured() {\n\tawait sendMenuFunction(userId, context)\n}\n```\n\n## Didnt this menu had a question function?\n\nYes. It was moved into a seperate library with version 5 as it made the source code overly complicated.\n\nWhen you want to use it check [telegraf-stateless-question](https://github.com/EdJoPaTo/telegraf-stateless-question).\n\n```ts\nimport {getMenuOfPath} from 'telegraf-inline-menu'\n\nconst myQuestion = new TelegrafStatelessQuestion<MyContext>('unique', async (context, additionalState) => {\n\tconst answer = context.message.text\n\tconsole.log('user responded with', answer)\n\tawait replyMenuToContext(menuTemplate, context, additionalState)\n})\n\nbot.use(myQuestion.middleware())\n\nmenuTemplate.interact('Question', 'unique', {\n\tdo: async (context, path) => {\n\t\tconst text = 'Tell me the answer to the world and everything.'\n\t\tconst additionalState = getMenuOfPath(path)\n\t\tawait myQuestion.replyWithMarkdown(context, text, additionalState)\n\t}\n})\n```\n\n# Documentation\n\nThe methods should have explaining documentation by itself.\nAlso there should be multiple @example entries in the docs to see different ways of using the method.\n\nIf you think the jsdoc / readme can be improved just go ahead and create a Pull Request.\nLets improve things together!\n","readmeFilename":"README.md","description":"[![NPM Version](https://img.shields.io/npm/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![node](https://img.shields.io/node/v/telegraf-inline-menu.svg)](https://www.npmjs.com/package/telegraf-inline-menu) [![Build Stat"}