{"_id":"@alexa-skill-components/list-navigation","_rev":"9-c3b0363594a02dcc7b00d18ce610ac6d","name":"@alexa-skill-components/list-navigation","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"@alexa-skill-components/list-navigation","version":"0.0.1","license":"AmznSL-1.0","_id":"@alexa-skill-components/list-navigation@0.0.1","maintainers":[{"name":"amzn-anusha","email":"panuanu@amazon.com"},{"name":"anuprk","email":"anukatar@amazon.com"},{"name":"amzn-akeat","email":"akeat@amazon.com"},{"name":"amzn-oss","email":"osa-3p@amazon.com"}],"homepage":"https://github.com/alexa/skill-components#readme","bugs":{"url":"https://github.com/alexa/skill-components/issues"},"ask":{"srcDir":"src"},"dist":{"shasum":"e130a84b2604b5a46b1bd6168f222390018dac86","tarball":"https://registry.npmjs.org/@alexa-skill-components/list-navigation/-/list-navigation-0.0.1.tgz","fileCount":47,"integrity":"sha512-KU7l54L99aP1GdA5UlmzWpi6TLt6pjhqjYyeQ6IumHWileQS4UXaBPTlw0/qgXCmcGu2mqwhI6W2CjEMgqNHQQ==","signatures":[{"sig":"MEQCIAndLgY5xkkGwmAhfs/Wi/c5mY6GFxa0GvwLrcbaKj/NAiBaILqO8/Pr64VugAyTH1QkFatB05A7qdz03UfjSK83Og==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":372348,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi469JACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpXLA//W2bqYFBFkl9MkinYaE0MdJc8s4thD6XMQySEPKuue9sfE7ak\r\nWBViO/XGtyun3fULrmOkpw0C2lEct7aFCDKu8a2ChMyeDcQ20GVA/OPgWZqU\r\nW8fwwKgs8r9O5GY6eetbTknb+MxQqHgOZsn2mFggqxWe9nV9ttJAJMRcf7eo\r\nLg9Crqpq+FU5mdLG8LpBB90lIHzJ1GsBtmAxgO4yIdAe8VRpTqTJ8NVUwYv9\r\nTkdZLFaA34haTddTAk7nETHimH9LErC74xr/NW4zEBtoB3v88ZAGTgwQ4Zma\r\nBCxl5DugVVONwPnYA/UesN3Ukxo9SWsXZijuv/2qWW1PHVEhOCWXmEZk7vZ/\r\nhA63T6Oi3D6/vA9RO8KLoC9CoqckPUBE3t2l7ksv9tuxXawmQIVNXupBxJ65\r\nMU6mg8gGthuNtPn1O3GM191a1qj1tYKNhqEZqYrzf1KNPaDyzxQhtm5DQyKZ\r\nXAHNyZUIYl58oVrOBW2CScL24786cjavpbjnbdWyJMXoH4qsnwn7ChJMBoXN\r\nSrm+4FlJx8yA47XRV+m1Gbwfx+uY3XgjH2Xt03NMgcbftcQcWAk1WCv1kicR\r\nq8RrIf3pfFsqfKT+T6ePRJx8E0LXfnSGWrZ9nO1oBwrpeQXWCALagtFO0/Hv\r\nxF0u4JIeuZ1rKYQaLwQRYRxWII0gZbxwHd4=\r\n=tsgI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"lint":"eslint --fix --max-warnings 0 -c .eslintrc.js 'src/**/*.{ts,tsx}'","test":"jest --testTimeout=10000","build":"npm run compile && npm pack","clean":"rm -rf dist && rm -rf build && rm -rf node_modules && rm -rf *.tgz","compile":"npm run compile-ts && npm run compile-acdl","release":"npm run build && npm run lint && npm run test","compile-ts":"tsc","clean-build":"npm run clean && npm install && npm run build","compile-acdl":"acc","clean-release":"npm run clean && npm install && npm run release"},"_npmUser":{"name":"amzn-akeat","email":"akeat@amazon.com"},"publisher":"Amazon","repository":{"url":"git+ssh://git@github.com/alexa/skill-components.git","type":"git","directory":"list-navigation"},"_npmVersion":"6.14.16","description":"Alexa skill component for navigating a list of items","directories":{},"_nodeVersion":"12.22.12","dependencies":{"uuid":"^8.3.2","lodash":"^4.17.15","ask-sdk-core":"^2.10.1","ask-sdk-model":"^1.18.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^26.6.3","eslint":"^7.2.0","ts-jest":"^26.5.6","webpack":"^5.38.1","ts-loader":"^9.2.0","ts-mockito":"2.5.0","typescript":"^3.9.9","@alexa/acdl":"file:/workspaces/ASK-GitHub/src/ask-ac/packages/@alexa/acdl/","@types/jest":"^26.0.24","@types/uuid":"^8.3.4","webpack-cli":"^4.7.0","@types/lodash":"^4.14.181","jest-html-reporter":"3.2.0","eslint-plugin-import":"^2.22.1","@typescript-eslint/parser":"^3.3.0","@typescript-eslint/eslint-plugin":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/list-navigation_0.0.1_1659088712966_0.2603114893844798","host":"s3://npm-registry-packages"}},"0.0.2":{"name":"@alexa-skill-components/list-navigation","version":"0.0.2","license":"AmznSL-1.0","_id":"@alexa-skill-components/list-navigation@0.0.2","maintainers":[{"name":"amzn-anusha","email":"panuanu@amazon.com"},{"name":"anuprk","email":"anukatar@amazon.com"},{"name":"amzn-akeat","email":"akeat@amazon.com"},{"name":"amzn-oss","email":"osa-3p@amazon.com"}],"homepage":"https://github.com/alexa/skill-components#readme","bugs":{"url":"https://github.com/alexa/skill-components/issues"},"ask":{"srcDir":"src"},"dist":{"shasum":"594bba8a2b2def574832be70e3b923e897224b7f","tarball":"https://registry.npmjs.org/@alexa-skill-components/list-navigation/-/list-navigation-0.0.2.tgz","fileCount":47,"integrity":"sha512-9FkoeBqfM7khd4IyuJfsLoQeDFbhivAMFHFdvUtQc99vcIwUm+0hlVA9JDxtLt5zhjzMq8uG1XwYx0lBnA32nw==","signatures":[{"sig":"MEYCIQCVSEsZ4smK3rGyY2RY1UZruDYCbsC2zdra9Gp91JRXBwIhAJosPKZjAiSEdMStzCvEyFUp8JAO1DCEixzFAh+3lizX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":373263,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7aI8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqg0g//Z6Q/dovnRL5/SzQEDCwGeJbl4UcXQZHhPcDIK+rsOv/4DHmM\r\n88dfW/4dqjnzrs6aUiKsaBx1RCggVhfdx1KuYn5AhzHF0H7weD2lTKzx6wLg\r\no3hoBkAQZ1065TSJIwk+mviAgqzyi9dnqEQUe0gBHeXBPVt8fdsDnnIJ/F65\r\ntlwUITzqBlNeGnKvDEkN2KxOsw9PSL6WRrUm95xYsuTv3igoG2/JWCdmFX/r\r\n1kKnvwCEoh2wdWw+m85oB8VVyfjtN5JffBfnHTjysynjUHdM0o1PAwjHcITq\r\n44lAVN9GkGcZPLg4JsNA6bWiXCUCYnfYNaj+MjmrFG8RC7lqV5I1IJIWgyDT\r\n3x6or8ufd0EbyLRZ7jI9mIthz7SnfbYq4bYqvEfQ7/ZlEWJJV3Q4zgPTppPb\r\nH+Ybw5I1JSCtvSAbLoNIro8OZAjy6eDfwGnuYxuQ1HLBSHHVVKdelvQKseq2\r\ny+yaNdrGYNWRGCFFXKUPgGCV4mw440hdM1N1HObaD4kmhLL6+3jaabXKpf6N\r\nhe0r1T33wLEEwV5GaIKYLCJ4d9H/LRw2vt5fl16q1/c0pjg+iYzvC6cLklGP\r\n3AJSKW7bYu0xcpir8N1qYfC26XJh3RU8/zERfecN76LQAOLyMsGvDt92z33r\r\nFYwjft404c8R/XXXXD0dxswkADYn8CRpSXc=\r\n=JC/l\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"lint":"eslint --fix --max-warnings 0 -c .eslintrc.js 'src/**/*.{ts,tsx}'","test":"jest --testTimeout=10000","build":"npm run compile && npm pack","clean":"rm -rf dist && rm -rf build && rm -rf node_modules && rm -rf *.tgz","compile":"npm run compile-ts && npm run compile-acdl","release":"npm run build && npm run lint && npm run test","compile-ts":"tsc","clean-build":"npm run clean && npm install && npm run build","compile-acdl":"acc","clean-release":"npm run clean && npm install && npm run release"},"_npmUser":{"name":"amzn-akeat","email":"akeat@amazon.com"},"publisher":"Amazon","repository":{"url":"git+ssh://git@github.com/alexa/skill-components.git","type":"git","directory":"list-navigation"},"_npmVersion":"6.14.16","description":"Alexa skill component for navigating a list of items","directories":{},"_nodeVersion":"12.22.12","dependencies":{"uuid":"^8.3.2","lodash":"^4.17.15","ask-sdk-core":"^2.10.1","ask-sdk-model":"^1.18.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^26.6.3","eslint":"^7.2.0","ts-jest":"^26.5.6","webpack":"^5.38.1","ts-loader":"^9.2.0","ts-mockito":"2.5.0","typescript":"^3.9.9","@alexa/acdl":"file:/workspaces/ASK-GitHub/src/ask-ac/packages/@alexa/acdl/","@types/jest":"^26.0.24","@types/uuid":"^8.3.4","webpack-cli":"^4.7.0","@types/lodash":"^4.14.181","jest-html-reporter":"3.2.0","eslint-plugin-import":"^2.22.1","@typescript-eslint/parser":"^3.3.0","@typescript-eslint/eslint-plugin":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/list-navigation_0.0.2_1659740732602_0.5424608910463922","host":"s3://npm-registry-packages"}},"0.0.3":{"name":"@alexa-skill-components/list-navigation","version":"0.0.3","license":"AmznSL-1.0","_id":"@alexa-skill-components/list-navigation@0.0.3","maintainers":[{"name":"amazon-prachibh","email":"prachibh@amazon.com"},{"name":"amzn-aaditya","email":"aadified@amazon.com"},{"name":"abhjroy","email":"abhjroy@amazon.com"},{"name":"mattsb42-aws","email":"bullocm@amazon.com"},{"name":"amzn-anusha","email":"panuanu@amazon.com"},{"name":"anuprk","email":"anukatar@amazon.com"},{"name":"amzn-akeat","email":"akeat@amazon.com"},{"name":"amzn-oss","email":"osa-3p@amazon.com"}],"homepage":"https://github.com/alexa/skill-components#readme","bugs":{"url":"https://github.com/alexa/skill-components/issues"},"ask":{"srcDir":"src"},"dist":{"shasum":"23f8b0f76d86e52762b21bd8ae5b23871e703d8f","tarball":"https://registry.npmjs.org/@alexa-skill-components/list-navigation/-/list-navigation-0.0.3.tgz","fileCount":50,"integrity":"sha512-A4rj6AWpys/jshoVgzNhfhtngc8iizl2sFJibR0dswxIbVlV5xqngHfJV1I5V8oKgWu7DbUbWuaR7M52NMXeXg==","signatures":[{"sig":"MEYCIQClvK/meaMnLMxmlecbjkYPO0s9yXlm/r5GOoWALyOw7QIhAL2RktmytkzUKv4oVDFmNw8lM0LcaT/RLhTqT50W5oye","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":435237,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7iS5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmri6w/+KYOhOxGOsDMLA+l3ezv3oM+IATIf7Rs9TWIM8A85iFLYF3nx\r\nJXywhgeRGW4pcr/cfYJbjLAP1GC2nnW9e9TlSG2qss72xSOFpiWHLf4+/wDe\r\nOHS2CO6MYNBopO1q/9ha8u8eusk5ApVgh7hSjmlhV4TDmJVnqiLK3u2bCLWT\r\n4RdoSc1gw7k8Up6iH0AeSybFwUyvse/PAfbpV6L/Br+UfW/HG4iJjJWVs7id\r\nMS4Ni2XttNIjop8v1KnFpaMeV11yBav5CRyk+YbnZ/erLJgH6H1B9HzghrEf\r\n9CU48Zoh7fj4g8Fo+A9oJ3haDT5BcpCeuJlgEdI5tZfxy3RyjUEtQNOjuFKq\r\nba72fIJ4WfSSxaNJlPKYgRQj0uaUq3aFe/Q3e7rXMcYetvn2zXMFlrlxwT+0\r\nXqnpD1nO5fa3VSLg0SpeFXWvHGtUBI8FLvqbNmz6x3vDIhm/IoXcAMq9om69\r\n2HpUzvown+Cvp7ufC5eY1IgQof2ObogPrLYbK9DSgi3VAEAA5XNB0re36k8M\r\n608qoz2uPExJfL4sEY4EKfOSRZ3oN6K4nWEZva+lhH/lWrx5okhx1yq6xqq2\r\nB7UeRnNUUcNkuKj1/OTSaSTzpr2dtCRBM2orAWNw40r5oSgQIEz8PR1rkp3U\r\nCtHwD6SXMoMl95IE/m6t0fT58k+yWJkH0I4=\r\n=9Bna\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"818f5ec9b6e84b020a310efc7e382822bf2e604f","scripts":{"lint":"eslint --fix --max-warnings 0 -c .eslintrc.js 'src/**/*.{ts,tsx}'","test":"jest --testTimeout=10000","build":"npm run compile && npm pack","clean":"rm -rf dist && rm -rf build && rm -rf node_modules && rm -rf *.tgz","compile":"npm run compile-ts && npm run compile-acdl","release":"npm run build && npm run lint && npm run test","compile-ts":"tsc","clean-build":"npm run clean && npm install && npm run build","compile-acdl":"acc","clean-release":"npm run clean && npm install && npm run release"},"_npmUser":{"name":"amzn-aaditya","email":"aadified@amazon.com"},"publisher":"Amazon","repository":{"url":"git+ssh://git@github.com/alexa/skill-components.git","type":"git","directory":"list-navigation"},"_npmVersion":"8.19.3","description":"Alexa skill component for navigating a list of items","directories":{},"_nodeVersion":"19.2.0","dependencies":{"uuid":"^8.3.2","lodash":"^4.17.15","@types/node":"^18.8.4","ask-sdk-core":"^2.10.1","ask-sdk-model":"^1.39.0","@aws-sdk/util-dynamodb":"^3.186.0","@aws-sdk/client-dynamodb":"^3.186.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^26.6.3","eslint":"^7.2.0","ts-jest":"^26.5.6","webpack":"^5.38.1","ts-loader":"^9.2.0","ts-mockito":"2.5.0","typescript":"^3.9.9","@alexa/acdl":"^0.1.18","@types/jest":"^26.0.24","@types/uuid":"^8.3.4","webpack-cli":"^4.7.0","@types/lodash":"^4.14.181","jest-html-reporter":"3.2.0","ask-sdk-local-debug":"^1.1.0","eslint-plugin-import":"^2.22.1","@typescript-eslint/parser":"^3.3.0","@typescript-eslint/eslint-plugin":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/list-navigation_0.0.3_1676551353006_0.41965737785342294","host":"s3://npm-registry-packages"}},"0.0.4":{"name":"@alexa-skill-components/list-navigation","version":"0.0.4","license":"AmznSL-1.0","_id":"@alexa-skill-components/list-navigation@0.0.4","maintainers":[{"name":"amazon-prachibh","email":"prachibh@amazon.com"},{"name":"amzn-aaditya","email":"aadified@amazon.com"},{"name":"abhjroy","email":"abhjroy@amazon.com"},{"name":"mattsb42-aws","email":"bullocm@amazon.com"},{"name":"amzn-anusha","email":"panuanu@amazon.com"},{"name":"anuprk","email":"anukatar@amazon.com"},{"name":"amzn-akeat","email":"akeat@amazon.com"},{"name":"amzn-oss","email":"osa-3p@amazon.com"}],"homepage":"https://github.com/alexa/skill-components#readme","bugs":{"url":"https://github.com/alexa/skill-components/issues"},"ask":{"srcDir":"src"},"dist":{"shasum":"d391706313bbd92549be8b50b914ad6a8e893e91","tarball":"https://registry.npmjs.org/@alexa-skill-components/list-navigation/-/list-navigation-0.0.4.tgz","fileCount":51,"integrity":"sha512-QGFw6IbntEAV+VvH3irAF3vqAh/Tj2kI0KLkcxgQhM+ExF2Vkj0HC5Hjt7GahvEeRwnjd3jgSuP+Al9yD3ln1w==","signatures":[{"sig":"MEUCIFMO3ZEd8PeGY6r8M94W6PoEsPi18PpLiBzsUrqjp090AiEAxX/EKSU1ke+Ud/P4QLcixDQevuWZ+5vr+dkht9B9gfY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":448690,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkLr7cACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoMkA/9HGBNTjeZ4RWA+zbK6TgEq10otgzmmu4nyaYOH5r6N6tBsFLi\r\nZUV1cjxCtGb+kX3zsIIrK2LCVA+3q/UC/8GQby1jePKSKZBhmvxmYl26NMWu\r\neLu10OHxzHtKe3R4B7C671iV6lIufwiCrHEO3LbycfTx5xkWDwxOd5kAOzJ4\r\nGorr0FvFpA+xb/QhtMTjCALyc/2LNNZaK1vu9hFUKEu4KG2DAttawwO9evXg\r\na1wNN3sJCtYZWydhX6d6s8tWMcnMFRyzbmLfcBnO/AEUuTlnLSfJ7Ycd/BJG\r\nNix0CEPIlfyxme7Fd9igqkHrnogHbrD7Wi7rGqe/1OE3LQsr92xqyCyy8P6d\r\nm89tMJJgxdtR10YE9CXvbGN8p0IJ/YazesHZuVxEvH5Co59/A98kCBi1wVnM\r\nVVdiq/7siSD/VAuRcMyl5E+nq3l7siByeMCqVovl+Lw2kaIYyV6cx85wgYKl\r\nFISy/046r+5YhYoop+qkKufrzoZm7jjzlYO5zxocfZoLPesjTL7r3C+GXzbb\r\nZuEPCcVhXyy8PafTwKIoI0SnKsAnpRkZDEHiyTJLvHIc0wSKU/LmreQHM+z0\r\nZuuVyPFtwng2psnLrwFjKep2tn3wltNV4p/zSemyvdLm6kboQ218SZlwEgtO\r\nkcg4E6hMsBXcjKZIu9cnd2o2FsTFtUkCHQQ=\r\n=oSv6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"41c4b72ffdac3b3b346b2cd3cbb88b86eda8febb","scripts":{"lint":"eslint --fix --max-warnings 0 -c .eslintrc.js 'lambda/**/*.{ts,tsx}'","test":"jest --testTimeout=10000","build":"npm run sync-component-version && npm run compile && npm pack","clean":"rm -rf dist && rm -rf build && rm -rf node_modules && rm -rf *.tgz","compile":"npm run compile-ts && npm run compile-acdl","release":"npm run build && npm run lint && npm run test","compile-ts":"tsc","clean-build":"npm run clean && npm install && npm run build","compile-acdl":"acc","clean-release":"npm run clean && npm install && npm run release","sync-component-version":"node ../scripts/sync-component-version.js"},"_npmUser":{"name":"amzn-aaditya","email":"aadified@amazon.com"},"publisher":"Amazon","repository":{"url":"git+ssh://git@github.com/alexa/skill-components.git","type":"git","directory":"list-navigation"},"_npmVersion":"8.19.3","description":"Alexa skill component for navigating a list of items","directories":{},"_nodeVersion":"19.2.0","dependencies":{"uuid":"^8.3.2","lodash":"^4.17.15","@types/node":"^18.8.4","ask-sdk-core":"^2.10.1","ask-sdk-model":"^1.39.0","@aws-sdk/util-dynamodb":"^3.186.0","@aws-sdk/client-dynamodb":"^3.186.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^26.6.3","eslint":"^7.2.0","ts-jest":"^26.5.6","webpack":"^5.38.1","ts-loader":"^9.2.0","ts-mockito":"2.5.0","typescript":"^3.9.9","@alexa/acdl":"^0.1.18","@types/jest":"^26.0.24","@types/uuid":"^8.3.4","webpack-cli":"^4.7.0","@types/lodash":"^4.14.181","jest-html-reporter":"3.2.0","ask-sdk-local-debug":"^1.1.0","eslint-plugin-import":"^2.22.1","@typescript-eslint/parser":"^3.3.0","@typescript-eslint/eslint-plugin":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/list-navigation_0.0.4_1680785116233_0.09939485202066689","host":"s3://npm-registry-packages"}}},"time":{"created":"2022-07-29T09:58:32.918Z","modified":"2025-05-22T20:55:56.703Z","0.0.1":"2022-07-29T09:58:33.137Z","0.0.2":"2022-08-05T23:05:32.835Z","0.0.3":"2023-02-16T12:42:33.167Z","0.0.4":"2023-04-06T12:45:16.419Z"},"bugs":{"url":"https://github.com/alexa/skill-components/issues"},"license":"AmznSL-1.0","homepage":"https://github.com/alexa/skill-components#readme","repository":{"url":"git+ssh://git@github.com/alexa/skill-components.git","type":"git","directory":"list-navigation"},"description":"Alexa skill component for navigating a list of items","maintainers":[{"email":"osa-3p@amazon.com","name":"amzn-oss"},{"email":"akeat@amazon.com","name":"amzn-akeat"},{"email":"anukatar@amazon.com","name":"anuprk"},{"email":"aadified@amazon.com","name":"amzn-aaditya"},{"email":"prachibh@amazon.com","name":"amazon-prachibh"}],"readme":"<p align=\"center\">\n  <img src=\"https://m.media-amazon.com/images/G/01/ask/SkillComponents/skillcomp_listnav._CB1198675309_.png\">\n  <br/>\n  <h1 align=\"center\">List Navigation Skill Component</h1>\n</p>\n\nEnable users of your skill to easily navigate through a list of items you provide.\n\n**Please note**: Alexa Skill Components are being provided as a pre-production alpha \nrelease in Developer Preview with limited support. Our goal is to solicit feedback on our approach and design building towards their broader general availability in the future. While we will make every effort to minimize it, we do not make any backwards compatibility or rapid \nturn-around bug-fix promises with this pre-production alpha release. You can [sign \nup for the developer preview](https://build.amazonalexadev.com/2022-Skill-Components-Interest.html) here to use these components.\n\nWe will be actively making updates to these components and we look forward to mature them with your feedback. So, check back in here to get the latest and greatest version. \n\n[Sign up and join us](https://build.amazonalexadev.com/2022-Skill-Components-Interest.html) in our effort to help you build more engaging Alexa skills faster!\n\n## Table of Contents\n\n* [Introduction](#introduction)\n  * [When should I use this component?](#when-should-i-use-this-component)\n  * [Example Interaction](#example-interaction)\n* [Getting Started](#getting-started)\n* [Reference](#reference)\n* [Example skills](#example-skills)\n* [Customer Experience Design Guidelines](#customer-experience-design-guidelines)\n* [Known issues](#known-issues)\n\n## Introduction\nAlexa Skill Components encapsulate best customer experience (CX) design practices to reduce your development time. Learn more about Skill Components in the [Skill Components Getting Started guide](../README.md#getting-started).\n\nBe it a list of to-do tasks, birthdays, items from a shopping catalog or menu, the List Navigation Skill Component helps you offer your customer a simple way to paginate through the list and make a selection.\n\n### When should I use this component?\nAre you building an app in which your customers will need to select from a list of options? Use the pre-built interaction patterns within the List Navigation Skill Component to build out and customize such interactions.  \n\n### Example Interaction\n\nThis component allows a given list to be paginated (multiple items at once) through until a user selects a item. The following interaction sample is taken from the included [BooksNav example skill](./examples/BooksNav).\n\n```\nUser  > What books do you have?\nAlexa > How about The Shining by Stephen King, Dune by Frank Herbert, or Hyperion by Dan Simmons?\nUser  > show me more\nAlexa > How about The Notebook by Nicholas Sparks, The Hobbit by JRR Tolkien, or A Game of Thrones by George R R Martin?\nUser  > the second one\nAlexa > The Hobbit by JRR Tolkien is a fantasy novel, the summary is: a hobbit, a wizard, and some dwarves go on an adventure\n```\n\n## Getting Started\n\n### 1. Familiarize yourself with Alexa Skill Components\n\nRead [Skill Components Getting Started guide](../README.md#getting-started)\n\nFor those unfamiliar with skill development, the [flight search example skill tutorial](https://developer.amazon.com/en-US/docs/alexa/workshops/acdl-flightsearch-tutorial/get-started/index.html) is a good starting place.\n\n### 2. Install component in your skill\n\nNote that if a `package.json` file does not already exist in the skill's root directory, then one can be created with:\n```\nnpm init\n```\n\nInstall the component either from public release or a local build of the component:\n\n**Public Release**\n\nIn your skill's root directory, install using npm:\n```\nnpm install --save @alexa-skill-components/list-navigation\nnpm install\n```\n\nAlso install the component as a dependency in your API code (lambda):\n```\nnpm install --save @alexa-skill-components/list-navigation\nnpm install\n```\n\n**Local Build (not working due to CLI bug)**\n\nIn a seperate directory from your skill, build component from source:\n```\ngit clone git@github.com:alexa/skill-components.git\ncd skill-components\ncd list-navigation\nnpm run clean-build\n```\n\nthen, in your skill's root directory, use npm to install the local build:\n```\nnpm install --save \"<path>/skill-components/list-navigation\"\nnpm install\n```\n\nAlso install the component as a dependency in your API code (lambda):\n```\nnpm install --save \"<path>/skill-components/list-navigation\"\nnpm install\n```\n\n### 3. Call reusable dialog\n\nImport and call the [`navigateList`](./docs/REFERENCE.md#navigatelist) ACDL reusable dialog provided by this component from your skill's own custom sample dialogs; providing the configuration for your skill and a \nreference to the list you wish to allow user to navigate through.\n\n**1. Import the component's reusable dialogs and types into you skill's ACDL**\n```\nnamespace examples.books_nav\n\nimport com.amazon.alexa.skill.components.list_navigation.*\nimport com.amazon.alexa.skill.components.list_navigation.types.*\n```\n\n**2. Define a type for the items in your list**\n\nMake sure the type has a \"label\" property (needed by default [`presentPageResponse`](./docs/REFERENCE.md#buildnavigationconfig)) and a \"name\" property (needed by defualt [`indexOfItemByNameApi`](./docs/REFERENCE.md#buildnavigationconfig)) alongside any other properties your items contain:\n\n```\ntype BookItem {\n    ...\n\n    String label\n    String name\n}\n```\n\nNote: If you're using the [`DDBListProvider`](./docs/REFERENCE.md#class-ddblistprovider), make sure your DynamoDB table has \"label\" and \"name\" attributes.\n\n**3. Define actions and events required to use list navigation component**\n\nThe following actions are currently required to be defined in your skill's ACDL (due to limitations in ACDL); the names of the actions may be whatever you would like, but the types and argument names must be as defined (referencing your item type defined in the prior step) for the component to function properly.\n```\naction Page<BookItem> getBooksPageApi(\n    ListReference listRef, \n    Optional<String> pageToken)\naction BookItem selectBookApi(\n    ListReference listRef, \n    Page<BookItem> page,\n    NUMBER index)\n```\n\nTo enable selecting a item by name during pagination, a catalog type for possible item names must be defined and used in a event and action as well.\n```\n// interaction model\n\"types\": [\n    {\n        \"name\": \"TITLE\",\n        \"values\": [\n            {\n                \"name\": { \"value\": \"The Shining\" }\n            },\n            ...\n        ]\n    }\n]\n```\n```\n// your skill's ACDL\nimport slotTypes.TITLE\n\nselectBookByTitleEvent = utterances<ItemNameSlotWrapper<TITLE>>(\n    defaultSelectItemByNameUtterances)\naction NUMBER indexOfBookByNameApi(\n    ListReference listRef, \n    Page<BookItem> page, \n    TITLE name)\n```\n\n**4. Define a action to return a list reference**\n\nYou must have a action defined which will provide a reference to the list you would like to allow the user to navigate through:\n```\naction ListReference getBooks()\n```\nThis action can have whatever name and arguments are desired.\n\n**5. Build configuration object**\n\nCall the [`buildNavigationConfig`](./docs/REFERENCE.md#buildnavigationconfig) ACDL reusable dialog in your\nskill's sample to build the configuration object needed for list navigation to function, passing in the actions \nand events defined in prior steps:\n\n```\nbooksNavigationConfig = buildNavigationConfig<BookItem, TITLE>(\n    getPageApi = getBooksPageApi,\n    selectItemApi = selectBookApi,\n    selectItemByNameEvent = selectBookByTitleEvent,\n    indexOfItemByNameApi = indexOfBookByNameApi,\n)\n```\n\n**6. Call reusable dialog**\n\nIn one of your skill's samples, call the action your defined previously to get a reference to the list you wish to navigate and then call the [`navigateList`](./docs/REFERENCE.md#navigatelist) reusable dialog, passing in the previously built config and list reference, to generate dialog flows allowing the user to navigate through the list until a item is selected:\n\n```\nlistRef = getBooks()\n\nbook = navigateList<BookItem, TITLE>(\n    config = booksNavigationConfig,\n\n    listRef = listRef\n)\n```\n\nThe book returned by the dialog call can be used to pass to another API call or used in a response (which can reference the [`selectItemApi`](./docs/REFERENCE.md#buildnavigationconfig) that was passed in when building \nthe config object):\n```\nresponse(\n    act = Notify { actionName = selectBookApi },\n    response = presentItemPrompt,\n    payload = BookItemPayload { book = book }\n)\n```\n\nCombing everything together should result in a ACDL sample similar to [what is defined in the BooksNav example skill](./examples/BooksNav/skill-package/conversations/pagination.acdl).\n\n\n### 4. Setup API Handlers\n\n**1. Register API handlers**\n\nImport and call the [`ListNav.createHandlers`](./docs/REFERENCE.md#class-listnav) function to construct all the request handlers required by the list navigation component into your skill's API code (where they will live alongside your skill's other request handlers). Make sure to pass in the fully qualified name of the actions you were required to define earlier.\n\n**TypeScript**\n```\nimport { ListNav } from '@alexa-skill-components/list-navigation';\n\n...\n\nexport const handler = SkillBuilders.custom()\n    .addRequestHandlers(\n        ...\n        \n        ...ListNav.createHandlers(\n            \"examples.books_nav.getBooksPageApi\",\n            \"examples.books_nav.selectBookApi\",\n            \"examples.books_nav.indexOfBookByNameApi\"\n        )\n    )\n    .lambda();\n```\n\n**JavaScript**\n```\nconst listNav = require('@alexa-skill-components/list-navigation')\n\n...\n\nexports.handler = Alexa.SkillBuilders.custom()\n    .addRequestHandlers(\n        ...\n        \n        ...listNav.ListNav.createHandlers(\n            \"examples.books_nav.getBooksPageApi\",\n            \"examples.books_nav.selectBookApi\",\n            \"examples.books_nav.indexOfBookByNameApi\"\n        )\n    )\n    .lambda();\n```\n\n**2. Setup List Provider**\n\nIn the handler for the action you defined to return a list reference, use the [`FixedListProvider`](./docs/REFERENCE.md#class-fixedlistprovider) class or the [`DDBListProvider`](./docs/REFERENCE.md#class-ddblistprovider) class bundled with the component (or make your own implementing the [`ListProvider`](./docs/REFERENCE.md#interface-listprovider) interface) to generate the list reference that is passed into the component.\n\n**Typescript**\n```\nimport { Utils, ListNav, FixedListProvider } from '@alexa-skill-components/list-navigation';\n\n...\n\nBOOKS = [ /* fixed list of data */ ];\ndefaultPageSize = 3; // allowed sizes: 1-5\n\nexport class GetBooksHandler implements RequestHandler {\n    canHandle(handlerInput : HandlerInput) : boolean {\n        return Utils.isApiRequest(handlerInput, `examples.books_nav.getBooks`);\n\t}\n\n    handle(handlerInput: HandlerInput) {\n        const listRef = ListNav.buildListReference(\n            handlerInput,\n            new FixedListProvider(BOOKS),\n            defaultPageSize\n        );\n\n        return handlerInput.responseBuilder\n            .withApiResponse(listRef)\n            .withShouldEndSession(false)\n            .getResponse();\n    }\n}\n```\n\n**JavaScript**\n```\nconst listNav = require('@alexa-skill-components/list-navigation')\n\n...\n\nBOOKS = [ /* fixed list of data */ ];\ndefaultPageSize = 3; // allowed sizes: 1-5\n\nconst GetBooksHandler = {\n    canHandle(handlerInput) {\n        return listNav.Utils.isApiRequest(handlerInput, \"examples.books_nav.getBooks\");\n\t},\n\n    handle(handlerInput) {\n        const listRef = listNav.ListNav.buildListReference(\n            handlerInput,\n            new listNav.FixedListProvider(BOOKS),\n            defaultPageSize\n        );\n\n        return handlerInput.responseBuilder\n            .withApiResponse(listRef)\n            .withShouldEndSession(false)\n            .getResponse();\n    }\n};\n```\n\nRefer to [BooksNav example skill](./examples/BooksNav/lambda/handlers/pagination/get-books.ts) for more details.\n\n### 5. Compile and deploy the Skill\n\nBuild your skill as one would normally; the component's dialogs samples and API handlers (that were integrated into\nthe skill) will be built along-side your skill's own custom dialog samples and handlers.\n\n```\naskx compile && askx deploy\n```\n\nNote that a Alexa Conversations skill deployment can take 20-40 minutes to complete.\n\n### 6. Test the Skill.\nTo do so via CLI, you can run the following:\n```\naskx dialog -s <YOUR_SKILL_ID> -l en-US -g development\n```\nOr you can use the Developer Console via the \"Test\" tab to simulate apart from your Alexa device.  \n\n### 7. Iterate\n\nAfter testing the default behavior of the component, look into the [reference doc](./docs/REFERENCE.md) to see possible customizations to suit your use case. \n\nAlso look through the [Example Skills](#example-skills), and [CX Design Guidelines](#customer-experience-design-guidelines) for more information.\n\nTo deploy any changes, run compile and deploy again:\n```\naskx compile && askx deploy\n```\n\n## Recipes\n\n* [Setup the Fixed List Provider](./docs/RECIPES.md#setup-the-fixed-list-provider)\n* [Setup the DDB List Provider](./docs/RECIPES.md#setup-the-ddb-list-provider)\n* [Creating a custom List Provider](./docs/RECIPES.md#creating-a-custom-list-provider)\n* [Customizing Page Size](./docs/RECIPES.md#customizing-page-size)\n\n## Reference\n\nDetails on all dialogs and API handlers can be found in the [Reference doc](./docs/REFERENCE.md)\n\n## Example Skills\n\n* [BooksNav](./examples/BooksNav)\n\n## Customer Experience Design Guidelines\n\nIf customizing the default CX for this component, it's a good idea to follow some [design guidelines](./docs/CX_DESIGN_GUIDELINES.md).\n\n## Known Issues\n\n### Session doesn't end after navigation ends\nThe navigation dialog flows generated by a call to the [`navigateList`](./docs/REFERENCE.md#navigatelist) dialog always end in a call to the [`selectItemApi`](./docs/REFERENCE.md#buildnavigationconfig) provided in the config object; this API will always return `false` for the [`shouldEndSession`](https://developer.amazon.com/en-US/docs/alexa/custom-skills/manage-skill-session-and-session-attributes.html#session-lifecycle) flag as the component does not know whether a caller wants to end the session after navigation or not.\n\nIf you wish to end the session after navigation, then:\n\n**1. define a custom `endSession` API in your skill**\n```\nnamespace examples.books_nav\n\naction endSession(BookItem book)\n```\n\n**2. Register the provided handler for the API**\n```\nimport { EndSessionHandler } from '@alexa-skill-components/list-navigation';\n\n...\n\nexport const handler = SkillBuilders.custom()\n    .addRequestHandlers(\n        ...\n\n        new EndSessionHandler(`examples.books_nav.endSession`)\n    )\n    .lambda();\n```\n\n**3. Call `endSession` API after navigation**\n```\nbook = navigateList<BookItem, TITLE>(\n    config = booksNavigationConfig,\n\n    listRef = listRef\n)\n\nendSession(book)\n\nresponse(\n    act = Notify { actionName = endSession },\n    response = presentItemPrompt,\n    payload = BookItemPayload { book = book }\n)\n```\n\nNote that the final response has a `Notify` response act that now refers to the `endSession` API.\n\n### Component can only be used for a single type of list\nWhile the [`navigateList`](./docs/REFERENCE.md#navigatelist) dialog can be called multiple times across a single skill's various samples, all calls must use the same type parameters and config object; only possibly varying in the list reference that is passed into the dialog.\n\nFailure to adhere to this limitation can lead to inaccuracies in the skill at run-time.\n","readmeFilename":"README.md"}