{"_id":"apiextender","_rev":"28-7cb49910c05e61090e56dc2a7c4c3a12","name":"apiextender","description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).   apiextender let to enable third-party developers to create abilities which extend an application  and supports the a","dist-tags":{"latest":"3.1.4"},"versions":{"0.0.1":{"name":"apiextender","version":"0.0.1","scripts":{"start":"node ./bin/www"},"dependencies":{"express":"~4.9.0","body-parser":"~1.8.1","cookie-parser":"~1.3.3","morgan":"~1.3.0","serve-favicon":"~2.1.3","debug":"~2.0.0"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"64b99044e3e15ade02fcd7ff1a00718713cc6dfe","_id":"apiextender@0.0.1","_shasum":"86dae6d43f3c535b8b366f38f76146be959f9ca8","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"86dae6d43f3c535b8b366f38f76146be959f9ca8","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-0.0.1.tgz","integrity":"sha512-Zw/TUJqGjsCuvN8ClR1UkQUfliZYysrtUWYDjfvpwPDL6sOqU/JBi/hszEII0NPuaf38zuImvsxZKDM0MznFdw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+mXb3jLpJTEUUZ2QYAK4/M1xMcOiggcoWcZNF8X3kZgIgSJTF6gK2tRyDdypknSvuNiWsEL0CGoZJjapX5ChTh1U="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/apiextender-0.0.1.tgz_1479998241542_0.24389028851874173"},"directories":{}},"0.0.2":{"name":"apiextender","version":"0.0.2","scripts":{"start":"node ./bin/www"},"dependencies":{"express":"~4.9.0","body-parser":"~1.8.1","cookie-parser":"~1.3.3","morgan":"~1.3.0","serve-favicon":"~2.1.3","debug":"~2.0.0"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"2756c6a68dc40e4a009b94a0b453cb1343df46bf","_id":"apiextender@0.0.2","_shasum":"0f31636e51a2a6e5d7f2187968daab767b1aea32","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"0f31636e51a2a6e5d7f2187968daab767b1aea32","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-0.0.2.tgz","integrity":"sha512-+/CP4Okbifx/jIsFCOv+YgtVM/mMznamHx9UWav5G88ngiJ5/UlTIKUfjm8LY+lwTrMGsBFD8gEArIvy45D6iQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC9Sws0+5gYoD/rmERJk2hR1zffUBDJkEP96XFav0qRlAIhAIkQiFyPjsrZnb4jrW8j6k3R1Vy2i0r7FfaLicM1GTPq"}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-0.0.2.tgz_1480407900059_0.4036782050970942"},"directories":{}},"0.0.3":{"name":"apiextender","version":"0.0.3","scripts":{"start":"node ./bin/www"},"dependencies":{"express":"~4.9.0","body-parser":"~1.8.1","cookie-parser":"~1.3.3","morgan":"~1.3.0","serve-favicon":"~2.1.3","debug":"~2.0.0"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"0b44f623ccfd8dff24e3c3f4a810eae15ca02739","_id":"apiextender@0.0.3","_shasum":"66320d888faaa3947e11566e297210921972a94e","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"66320d888faaa3947e11566e297210921972a94e","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-0.0.3.tgz","integrity":"sha512-va+cHL5rSIloGrKd4b3IpbejG7zzbt/URXdQL9zmhKSYt4mKpehmReNhq33MC3DA4GSEsQyuoW4VAPDGWwyUXw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGLLSjli6fBEAejPZL1td+G01P84uSp/QBsY7qPVOzxCAiAdkKtxpDFFEbqD/MPvVWibUVvxktdz3e+kRBTrN6EVZg=="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/apiextender-0.0.3.tgz_1480412196582_0.8890613284893334"},"directories":{}},"0.0.4":{"name":"apiextender","version":"0.0.4","scripts":{"start":"node ./bin/www"},"dependencies":{"express":"~4.9.0","body-parser":"~1.8.1","cookie-parser":"~1.3.3","morgan":"~1.3.0","serve-favicon":"~2.1.3","debug":"~2.0.0"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"4559341fec2b2a4f43edcdc1d4eedbc1802aafa9","_id":"apiextender@0.0.4","_shasum":"3f84b9666c4601911c167790e6be65bf2a9b1610","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"3f84b9666c4601911c167790e6be65bf2a9b1610","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-0.0.4.tgz","integrity":"sha512-i/lJXwgGux8Yk8RqWTnvXnDiozoy4FvNXy9hs9txelaKA/YGG7Q7n1OGV/vocT5P+UTS22Jbiuk3uPnXcZWQPA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9VTt2vGUq6hwqUhgmaKYCdBMD2VNzRk7fwSqInhJIigIhALfHZ1xdijqEjzln8qYH+HqW5U8Ll5sgAdEp1xBUiQVx"}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-0.0.4.tgz_1480412301344_0.9366147338878363"},"directories":{}},"0.0.5":{"name":"apiextender","version":"0.0.5","scripts":{"start":"node ./bin/www"},"dependencies":{"express":"~4.9.0","body-parser":"~1.8.1","cookie-parser":"~1.3.3","morgan":"~1.3.0","serve-favicon":"~2.1.3","debug":"~2.0.0"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"32da2c85647b241c703f2bcb664e32d1b7971dea","_id":"apiextender@0.0.5","_shasum":"324711cbdc148655538be52b70715b43e826d839","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"324711cbdc148655538be52b70715b43e826d839","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-0.0.5.tgz","integrity":"sha512-EBxAgKY2dnBkkZ37tGDyVV93HHaVQW2hW8YYkQUGN485rcK7zKoGFmgDybE2qbSMYmCThoWd3N8HvRdUK7RpRQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDex4CInU3elX+DnKJzCOk+gDzLQ/05zETnSUP4I9hxLQIgbrlyFbSRff3XwEc9dCjNw0d35TSsE2l1KTURYzDpu+8="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-0.0.5.tgz_1480412775863_0.8976540369912982"},"directories":{}},"0.0.6":{"name":"apiextender","version":"0.0.6","scripts":{"start":"node ./bin/www"},"dependencies":{"express":"~4.9.0","body-parser":"~1.8.1","cookie-parser":"~1.3.3","morgan":"~1.3.0","serve-favicon":"~2.1.3","debug":"~2.0.0"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"af6af8e3bfa43330483f0c9a060525e6a19f0b34","_id":"apiextender@0.0.6","_shasum":"b1dbedeb6041e4e6b269aa0f8a6029e0873ddb2a","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"b1dbedeb6041e4e6b269aa0f8a6029e0873ddb2a","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-0.0.6.tgz","integrity":"sha512-ZiEAQesacteqHBRi3C0pUzSm775GRoiRLUG6TOKBWslzjTYjqimvb0UqrqX7Do6qplQsxgBtAgswKAy/HnLmfQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAtE2Yy9Prg4L6m8pJ2qRGFcQ9WisRVU391uz1IDpWcWAiEAgxRkfb3dFlVdkRJH3hY2d9TSTOltbSgm6tMAVrdgnVA="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-0.0.6.tgz_1480413204687_0.4158066133968532"},"directories":{}},"0.0.7":{"name":"apiextender","version":"0.0.7","scripts":{"start":"node ./bin/www"},"dependencies":{"express":"~4.9.0","body-parser":"~1.8.1","cookie-parser":"~1.3.3","morgan":"~1.3.0","serve-favicon":"~2.1.3","debug":"~2.0.0"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"97a8c2538a058ece17d996f273624953356c5f23","_id":"apiextender@0.0.7","_shasum":"4ef8e3c6cf95f176282220b669a8a2d2d3f40807","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"4ef8e3c6cf95f176282220b669a8a2d2d3f40807","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-0.0.7.tgz","integrity":"sha512-fYrNLxg3HUEUUe0TZ28Ipy1PiNQwA2RLBecWiI0Iw7jLH7oyfkP1TKHzNFCsOB8Nmk5PK6mziHWm8nXccD9hBw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCsjN1RlXXBstO1R35GmnArI+k5AQM2un0aG6hbkO4CRAIhANn75a1tB0Fh8+IWp+1c4DH5Yf58hQ3DAkaCghUGzAyo"}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-0.0.7.tgz_1480413409662_0.06250824383459985"},"directories":{}},"1.0.0":{"name":"apiextender","version":"1.0.0","scripts":{"start":"node ./bin/www"},"dependencies":{"express":"~4.9.0","body-parser":"~1.8.1","cookie-parser":"~1.3.3","morgan":"~1.3.0","serve-favicon":"~2.1.3","debug":"~2.0.0"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"de8ef0c029e3e203defb05b0e5ac2d5bd6bc2105","_id":"apiextender@1.0.0","_shasum":"fc16f6901404aaff6e5706f585b3e4faf81e8344","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"fc16f6901404aaff6e5706f585b3e4faf81e8344","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.0.0.tgz","integrity":"sha512-6FIrNNOszfivypuGIEKSaLefQSpox1Db7nLxoXZU36G+23QfQf4QoEkh7HNN+iBDNHdGG+hIXdYUlWDMZlXVRA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA/VgD3+Bhlyzor7G9XEbKU+Svv1cVff8/SFDq1I5EqMAiBijOWXMs5iwGFurZc5y1Fdpw3KkD3zxO6oBPVp44U9sA=="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-1.0.0.tgz_1480413710469_0.07740752282552421"},"directories":{}},"1.1.0":{"name":"apiextender","version":"1.1.0","scripts":{"start":"node ./bin/www"},"dependencies":{"express":"~4.9.0","body-parser":"~1.8.1","cookie-parser":"~1.3.3","morgan":"~1.3.0","serve-favicon":"~2.1.3","debug":"~2.0.0"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"c96ae54ad89e28997dd7a20ef5866b0c51dbf3d0","_id":"apiextender@1.1.0","_shasum":"28d7dcaa0ca32ea85208f8965fcf832f6c8fdce6","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"28d7dcaa0ca32ea85208f8965fcf832f6c8fdce6","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.1.0.tgz","integrity":"sha512-MxWkvfzfzpuaqVJpLOsDbB9CuuY8eMi8bsHJJJXE8jN0bkDH223+NJqs7eak7LxVIHREYtvjSIygmEBCIWUOSg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA3GjhkRd+ftuJeB2lMwiGbuTzj57+OReN023mFiuJDIAiEAhEnqnVPlvh0/P879yESrPfdBTdxGxZE5020b/EJvUR8="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/apiextender-1.1.0.tgz_1480414046830_0.3969707314390689"},"directories":{}},"1.1.1":{"name":"apiextender","version":"1.1.1","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"f948cd6ab9461df5e100b8813185a0758241db5b","_id":"apiextender@1.1.1","_shasum":"5a113643de92419c96979c07cf183bebfe4f7243","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"5a113643de92419c96979c07cf183bebfe4f7243","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.1.1.tgz","integrity":"sha512-+J4L+Rmsfh37m/KMRp+ref3DsdYIcTmnk7ffSOmb4ePmGNQxj1aAY0l+1hrpwW+oZlnUJSQK45VunCJTszy35Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1dvU8CELuBHNMa5kSmNF4QlXjGGf6iNs8e/ylUubX6gIhAPOLZ6/nYPZUrJiNBlpnkGrT03M7w8ZDRXscmLuYCoEo"}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-1.1.1.tgz_1480429839776_0.8929495087359101"},"directories":{}},"1.1.2":{"name":"apiextender","version":"1.1.2","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"e4df7a77714aa0479e35afd979adc300af3a4e61","_id":"apiextender@1.1.2","_shasum":"11469509ace58e679392674842004d3cb834d864","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"11469509ace58e679392674842004d3cb834d864","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.1.2.tgz","integrity":"sha512-9K20BDAlsn8Fu9CSeKC+IVNFMpWj1DfdhgeUrn6gOsNEM+XxiAfWPDtxlfe8yk3Fbt/z4AB8i/Zfkf/Y5cA5Uw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFPZn5Z5MQ47hyD/XWyk7A8rmHYen233i7vbV/+0YcVpAiA8u5j3XWiN3u2a+9g3b4sd4maQ56uqFVUXLEoueEZW5A=="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-1.1.2.tgz_1480936983612_0.4722722538281232"},"directories":{}},"1.2.0":{"name":"apiextender","version":"1.2.0","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"f611135b2d445e059f37bd445f1e3047a7a731f9","_id":"apiextender@1.2.0","_shasum":"e3e51c00e901c6573ab22bd9659be4497afe4ac8","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"e3e51c00e901c6573ab22bd9659be4497afe4ac8","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.2.0.tgz","integrity":"sha512-2mGbwopf7KaNH8coscLWi6c/urkprB15sdt32QbDvtqbA7IyghLok9V08NZ4CheEc0rMGb4rn9vGlhlkqQVyDA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC8YhSAUapHzCh0i6evN6kZh9yuS9kycg/vsRVzeBzkrQIgbBs4cnW8DbGvTuDRxHWQeCdnMDir4RcXYJCcKY/YSXk="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-1.2.0.tgz_1481094040228_0.21364580048248172"},"directories":{}},"1.2.1":{"name":"apiextender","version":"1.2.1","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"20eed43357a98fb0cb0074dbc6ffef4a3faf63da","_id":"apiextender@1.2.1","_shasum":"f0a83a697d7f01606659eb3a0eac502768a386b1","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"f0a83a697d7f01606659eb3a0eac502768a386b1","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.2.1.tgz","integrity":"sha512-BsBDcdBXEjflN1NpTcvo0zM1A6lgDlR310N/MdiIKxQO/xgf0+k3pi0QxPjEx7sTWdYmgLuSbseS7rqgw+Hhgw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBqtBnFcP4mb9Iz+gNDJbcBzJIKWM6S3d3tcUYA2RqlTAiAAvvYlcbzzPeU4k9JV1pmOpi0Q0YI1tcLyivf2HK4Hxg=="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-1.2.1.tgz_1481102023465_0.32326343352906406"},"directories":{}},"1.2.2":{"name":"apiextender","version":"1.2.2","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"7e8e270672bd812816054585187b4e5550559c2c","_id":"apiextender@1.2.2","_shasum":"300d8d401a58ff9744042e12acae00dc36aaff24","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"300d8d401a58ff9744042e12acae00dc36aaff24","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.2.2.tgz","integrity":"sha512-FclW6KoFWPTwBWHUL6p1zDPILSp24dqVKcYHXHFaQ58cSiYS8b2wrRTy8SYcq079xNfM1r9ymr6EP3SOOvBVrg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCKgwSwt+Vksr7EugEQCFOptwBz84F8ihKL9x/g29ghjgIgbkdOdoajON15Rt5AViF1l6Mli9uMJpzION//uCKjAJs="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/apiextender-1.2.2.tgz_1481102504689_0.09909884887747467"},"directories":{}},"1.2.3":{"name":"apiextender","version":"1.2.3","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"3173b9e8da6dcafa03c5de4075a1a022d89b8afc","_id":"apiextender@1.2.3","_shasum":"53178965c524c4b4eb59d554aa58300a3650424b","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"53178965c524c4b4eb59d554aa58300a3650424b","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.2.3.tgz","integrity":"sha512-Y1XL/NbISU06gt+xmrhlNOVXznk8rJnQOfhC9eSlicZlVNULXtr62KrSiIUOVEh0RHvcKb5sOpsArWpa47AQTA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDEbiKJW/XRgCBE+4CWAQVHCQp5hEVIBwfembqgUmsvGQIgaHHZE13HWbftx8N4LJKp1MHNuw8hdHHVrDrIF1enlRo="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/apiextender-1.2.3.tgz_1481104503391_0.6026099803857505"},"directories":{}},"1.2.4":{"name":"apiextender","version":"1.2.4","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"880d46a9885c15ceb22d7412fc4ef3ab5a80a6b5","_id":"apiextender@1.2.4","_shasum":"b45fc49c45791d71a56e5773e538746e17968cb3","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"b45fc49c45791d71a56e5773e538746e17968cb3","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.2.4.tgz","integrity":"sha512-KkqcCK6JM0jhMyu0DYscOGBE8JeyPEM8iBQM3g1an2aZFpvpzndY6429lkgW3g4rJDT7DlSR2JZPhRmf+i9/eQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCdd76k2zl7GV0DMyW6gZqk+mmxHuNY8lIn3zU8r2wHHAIgK0uRy5QUEUqVd59cHlaLDdSHaRpH5JIYxJeSsqcZshs="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/apiextender-1.2.4.tgz_1481548187177_0.7354380958713591"},"directories":{}},"1.2.5":{"name":"apiextender","version":"1.2.5","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"8e69c373afeb09a19dd433c15a485e41ef9c1483","_id":"apiextender@1.2.5","_shasum":"dbfb9ed03d5d3716e6583ad40504f8640dc87101","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"dbfb9ed03d5d3716e6583ad40504f8640dc87101","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.2.5.tgz","integrity":"sha512-yXCFbLNfJ+vRnCcuQlEInkZLL9xTRzdKRbNyRT2TgI8VmWs4WxjuW60mqZQD9mFWc2XOSGbNpopA6SyiQ5drZg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCPU4saLDEyX26/xQvJbkLgBns89K2Bl1CLczJhM542CgIgPvrnl3XrgtFQAuUqXfsRtSi9vaIFKRlhvZjixBtFzQI="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/apiextender-1.2.5.tgz_1481549663430_0.32087388541549444"},"directories":{}},"1.3.0":{"name":"apiextender","version":"1.3.0","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"71acf01015657fcf25fb8fdd03cf9644635071aa","_id":"apiextender@1.3.0","_shasum":"9fbc7e89cd78438df848cb0977b9e9634460dd7b","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"9fbc7e89cd78438df848cb0977b9e9634460dd7b","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.3.0.tgz","integrity":"sha512-9Ft6lBTrxl1d2rLFcMbVpoW+Q3sVMy01ezQQCdKuCxwvye3bPwAqNoQLksPNE3Ashad2eNoVYV6pBVW56uIcQA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1exCmlvnwK3pEYn4AA7saTDOwRS6qnYezSVe8dysrtAIhAMfMEHQPRxDN04Ptmmn7TJ7887DUJsoPDiuIhFVfjLPm"}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/apiextender-1.3.0.tgz_1481550790444_0.9499452346935868"},"directories":{}},"1.4.0":{"name":"apiextender","version":"1.4.0","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).    apiextender let to : +   enable third-party developers to create abilities which extend an application +   support ","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"61c6bcdd9ab398f7fbf860b8c8a6bc736f4566e4","_id":"apiextender@1.4.0","_shasum":"8bd2822d8aaf8ba3a588bcd40cec09958d80fefc","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"8bd2822d8aaf8ba3a588bcd40cec09958d80fefc","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-1.4.0.tgz","integrity":"sha512-/0SH1as7j2C6fhczl4Ia1ZaWRd95FC12E1h+L4pJoAQMCEs5zye9of4lZxdL1rfh1ELmLDDuOZNzad3k9yAAzA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGidIcyKikjMd7nfl+UzDMVDY4IE9Rx2ggvEBv9m2Y6yAiBzvG11/rSVG7oX0qb1+gd6CrBAfjZ6stJPS46NWQqJ8g=="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/apiextender-1.4.0.tgz_1481559559354_0.5224027691874653"},"directories":{}},"2.0.0":{"name":"apiextender","version":"2.0.0","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).   apiextender let to enable third-party developers to create abilities which extend an application  and supports the a","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"30f25e5566c117ab00e0d0efbf7f8703bea6614e","_id":"apiextender@2.0.0","_shasum":"9032dacdf1d3e849f2b7b09d85dbd8f90ee93e4d","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.2","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"9032dacdf1d3e849f2b7b09d85dbd8f90ee93e4d","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-2.0.0.tgz","integrity":"sha512-ORaaQ4r08zwUc69E4wPGxq+i4O3+Fu1ljNAaPZ8370USSpLdT0UbTBTu+Qq1b1vQ0qlnxWhs+DHdJxU78Veitg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDFyzyOgBaZ4MFhMQrSKyCkoFDigAiK4eEiIe+2Wj4R8AIgREjKcXu6yRKG44K6IT91jQ7ezLXrEXB+M7vrzQj1mII="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/apiextender-2.0.0.tgz_1500366983853_0.9903380724135786"},"directories":{}},"3.0.0":{"name":"apiextender","version":"3.0.0","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).   apiextender let to enable third-party developers to create abilities which extend an application  and supports the a","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"f424d22e0826ea32f4b284b3388f5b3f25c2310e","_id":"apiextender@3.0.0","_shasum":"8ccf2c7f9feb422ca56b8a58ca9a585d0cce4169","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.2","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"8ccf2c7f9feb422ca56b8a58ca9a585d0cce4169","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-3.0.0.tgz","fileCount":9,"unpackedSize":72765,"integrity":"sha512-bPZfASCKcHhc9bSW2WKMoKOrdLW58AfxoiDkfLFQ1N1h2tDq5MN+HGn75Mf25mKYXknYxgzaxwfWvXPnGGz05Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCv/Z7puOh51aeGW3Kt6bWdl/VqkLzVXs1hXUJl+C/x9QIgU5vQEWUaXTIwjSA95o9+uVqWKN3xZUEVMFNCMQReyEw="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/apiextender_3.0.0_1533143517809_0.254665695505107"},"_hasShrinkwrap":false},"3.1.0":{"name":"apiextender","version":"3.1.0","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~1.3.0","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).   apiextender let to enable third-party developers to create abilities which extend an application  and supports the a","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"1553ea099d60040f0cc45d6260d23afa61c86ddd","_id":"apiextender@3.1.0","_shasum":"efed80fa13257eb1ebabda52d6d5b816d7c3dc2c","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.2","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"efed80fa13257eb1ebabda52d6d5b816d7c3dc2c","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-3.1.0.tgz","fileCount":9,"unpackedSize":73239,"integrity":"sha512-UGipgzYQcICPWxFBUU2ix7FKC1bE9IbKU5w/mDV0vRPlV595oopOMGCB1XfG4dHHHN1jLEHYYtxHm/WFu+Oz5w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH6CKaAqk49rtpjYpBB/njCwBj3KDwOfqHFHPoz/SQd6AiEAwilLywjsnn/tIqGweyOlmNfMRUmt1AeFFoKCK//WvIg="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/apiextender_3.1.0_1533144452468_0.30658977636793683"},"_hasShrinkwrap":false},"3.1.1":{"name":"apiextender","version":"3.1.1","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"~>1.9.1","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).   apiextender let to enable third-party developers to create abilities which extend an application  and supports the a","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"e499692afebfc39ad54947071536b4e34afee65f","_id":"apiextender@3.1.1","_shasum":"afc5b2b85f855eabcd7c1b499aa3739c9ef6f61c","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.2","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"afc5b2b85f855eabcd7c1b499aa3739c9ef6f61c","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-3.1.1.tgz","integrity":"sha512-Usm0Q6HJcH3bRwKmTG5mYL0MuFVS2LF/ngwQ/J90FOPVijd65pIMQSlIeB4vkCizqdDqYiFHYtALONnbHSlQrA==","fileCount":9,"unpackedSize":74240,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmkdQCRA9TVsSAnZWagAAV/AP/0Ms/O2Xo9vfqv3vU0U9\nDqpdVzwig4qvwB4rJrxniFfAylPvHRQ19cGeX2ER0Cg6GRc5pGsSqyOBIcnV\nr3RcSFwcIRmjMmdWcycR/m0og3jeoJXatS8fnXCIsA/XCH3Op8C+tra4ji2T\nLPad8WAQgOMcSmOnneQuXNcfQyQva9EiIWfBqKCDHFxx+j/kCtgpZKwLyLzB\nS7Z8tnzBCiYTBxcytmkfgmJ8CCgHiT+fXBVXjbzL4iL4CKzRVqh726PvV8wr\nj4Yz9OaSAgZns3wav+IbuNV3grTEJpguATuXxS3pZkhqYX65MOksx4tv+OKK\n12WizRCcZ5c2l7rIZ7Je+X+DT8A4cHYYkyCyAr823HGYHn3QunXmhxJCbPNU\n+TTLcOxfFaEVr/A9qKpK7F9lz5kUQroDf1N8H//lBtW68TxJ/lVV5+hZ43Vo\nX7TCXah5BTFWPlKDRZSC9uf4fd+t++gByjUJNNdFHMqFeCh53cGbAMO2nJ6G\nitM5Bd4MvPKxl7V76X9lyghm3lL8NEeWvSwWER9svfgwoe/MqhKxiEt9a0+5\nfTuUHUSt/WB7vChqV3lE2z8W8cnTumDGCgILTPoq3VldjRkDLPwJGlDtAi2x\ny9+AElU93UlrvSGqE2LtmXGRIqV8F04zcMOOAO/YDcfVk/uh4wx+AsqH54ZE\nCAyz\r\n=3Iix\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBZSkIkLk84kXadhScLcLhA3MViQUer4EfAGUOyhVR2dAiBLvis06BPbahPk1PdQhKUUqvxx/Y3cG0d18DPTmavvdw=="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/apiextender_3.1.1_1553614670406_0.7583947615728397"},"_hasShrinkwrap":false},"3.1.3":{"name":"apiextender","version":"3.1.3","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"^1.9.1","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).   apiextender let to enable third-party developers to create abilities which extend an application  and supports the a","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","gitHead":"767ae344e124c1bfc8b3efc7c633d2d960f97308","_id":"apiextender@3.1.3","_shasum":"b33744ad1f370dedd187e9e5a5765f8c95c43a16","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.2","_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"dist":{"shasum":"b33744ad1f370dedd187e9e5a5765f8c95c43a16","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-3.1.3.tgz","integrity":"sha512-7+gJWHLBjwxcpamMzRhpuc1l/rqhzSqy5u2bpQ4tIpD3gHENoCVQz/IoSg5f6+vzsm0QjbWlh4cE9W1dC8NGWw==","fileCount":9,"unpackedSize":76017,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmlZ3CRA9TVsSAnZWagAAkhoP/i6FXWlUMeZRzYGEtO/T\no8rzvmYTJmPi038aZ/hTSfFKTCzwPhSzSSHip5455fJ+g24kyHHh7nHr+XhA\nDPitHVZnuiWYTqRoq9W3cilEuAP4hzSNlTwMcHFM0M/5XNmI8/MTdyn9Ddrm\nda+gPxrINn3Muy38qmcLDxeZSzWYWSGSwOeKmYf3Uq5WEu6WDPsOeFx4zpuF\nVo4qAAT3qkKOXCxwJfIryV2cSV8btoTwkuJmXPu0ai3+njbbLMQJKYG4HJkf\nCcZEK7CC4fhgrwSf/wrhlEWV93lU26vmTQRKAYzDf4b+FJ3zpxermt+ag3Xy\nR55ihAofqwIXI59xoWdwO9tNmgdtkaeVO+Ff3BuE5vZoM+uwuNbFK8rE6aVi\n+XI7Q3GIcwGU+uHbW6w1WquloQv7D5r0lE+xeCsJJz6GvGduFQM6kSfSc7Ol\n7l0V/j95H33W06mjmewTYdHyarFNSkFd3t9iZOL091lDC7Vfz9QRKJFgYASf\nMnAL9aJLdW0bc0ZuD78K1eYyB6EpoB5ttiCeryNO2xDRRg5eQzEw3cfbhEYD\nb6kFUnMGRlKubo+X6ShsNkkfA/uYIP5/SkWZDvYiYJIvyhxZJG9dmHuRkKOv\n3ONYMp30gbUJNYKCeNOLoRDsa6t7oUnZPsdDy8H2+ovgIYCMQHp+w6IqYx/S\nqQm9\r\n=hemG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAiy41yNqYaqs88+VykyphvGmNQF4xBwuDePpAW+aM4dAiAbzDIoxQAGY4n2tVUBls5sJRWybKuHRjuGUxvZKGNlaQ=="}]},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/apiextender_3.1.3_1553618550730_0.9915659948758395"},"_hasShrinkwrap":false},"3.1.4":{"name":"apiextender","version":"3.1.4","scripts":{"start":"node ./bin/www"},"dependencies":{"async":"^2.1.4","body-parser":"~1.8.1","cookie-parser":"~1.3.3","debug":"~2.0.0","express":"~4.9.0","morgan":"^1.9.1","responseinterceptor":"^1.1.1","serve-favicon":"~2.1.3"},"description":"This module deals with to extend an API backend that adds a specific feature to an existing API as plugin(add-in, addin, add-on, addon).   apiextender let to enable third-party developers to create abilities which extend an application  and supports the a","main":"index.js","repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"homepage":"https://github.com/aromanino/apiextender#readme","_id":"apiextender@3.1.4","gitHead":"cd1ef7dfda971db2412210c1af48385da2b51ce8","_nodeVersion":"16.13.1","_npmVersion":"9.8.1","dist":{"integrity":"sha512-hTNvSsAMu9+4NY/K+QJHTDVBa103jENQ5HYcHC0FgX6S3qyg0RfqOQTjTbCricbeNTF9wsfCS/9fWP/i/Ibnmg==","shasum":"3603025544126f953f2cd53e720ecd263ce29518","tarball":"https://registry.npmjs.org/apiextender/-/apiextender-3.1.4.tgz","fileCount":8,"unpackedSize":50783,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAyIguVIgFzK74d7OcdyjxOVOSFZkNAyM/c48//hazZgAiEAkT/hcJJ76cM5dIbHcMVS1wAd4sUG335Opom6KZw5Tro="}]},"_npmUser":{"name":"aromanino","email":"a.romanino@gmail.com"},"directories":{},"maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/apiextender_3.1.4_1709544964638_0.14766061292204724"},"_hasShrinkwrap":false}},"readme":"# apiextender\nThis module allows to extend an API backend, by adding endpoints or modifying existing endpoints' behaviour.\n  This is accomplished in a plug-in fashion.\nWith apiextender you can :\n+   enable third-party developers to create functionalities extending an application\n+   support the addition of new features in a simple way\n\n[![NPM](https://nodei.co/npm/apiextender.png?downloads=true&downloadRank=true&stars=true)![NPM](https://nodei.co/npm-dl/apiextender.png?months=6&height=3)](https://nodei.co/npm/apiextender/)\n\n* [Installation](#installation) \n* [Using apiextender](#using)\n* [make your environment capable to accept plugins functions](#folder)\n* [How to write function that extends the \"API\"](#howto)\n* [Reference](#reference) \n    * [extend(app)](#extend)\n    * [install(app,extender,save)](#install)\n* [Examples](#examples)\n    *   [Examples:How to set an API extensible by plugins](#examplesapi)   \n    *   [Examples:How to write extensible plugin functions](#examplesplugin)   \n    *   [Examples:override mode](#exampleoverride)   \n    *   [Examples:before mode](#examplebefore)   \n    *   [Examples:after mode](#exampleafter)   \n    *   [Examples:before_after mode](#examplebefore_after)   \n    *   [Examples:extend throwing error](#exampleerror)   \n    *   [Examples:A Complete Example of plugin extension](#examplecomplete)   \n    *   [Example: Extend API on the fly at runtime](#exampleonFly)   \n    \n\n## <a name=\"installation\"></a>Installation\nInstall **apiextender** in your project by typing:\n\n```shell\n$ npm install apiextender\n```\n\n\n## <a name=\"using\"></a>Usage\nThis is an Express module for nodeJs. This section explains how to use it in your code to make your API extensible by plugin.\n\n### Include apiextender\nJust require it:\n```javascript\nvar apiextender = require('apiextender');\n```\n\n### Using apiextender\n\n```javascript\nvar express=require('express'); \nvar apiextender = require('apiextender');\nvar app=express();\n   \n// make your API extensible by plugin techniques in a simple and fast \n// and with one line of code. \napiextender.extend(app);  // now your API is exensible\n```\n\n## <a name=\"folder\"></a>Make your environment compliant to plugins\nPlugin functions that extends your API must be defined in a file called ```extend.js```, \nlocated in a folder named ```plugin``` in the home directory of your application.\n\n### Create plugin folder\nTo create folder type:\n```shell\n$ mkdir plugin\n```\n### Create plugin file container\nTo create ```extend.js``` type:\n```shell\n$ cd plugin\n$ vi extend.js\n```\n\n```extend.js``` contains an array of plugin functions. Now we initialize it as an empty plugin function container:\n```javascript\nvar plugins=[];\nmodule.exports = plugins;\n```\n  \n\n## <a name=\"howto\"></a>Write your functions that extend the API \nTo extend an API endpoint, you must populate the ```plugins``` array containing all functions extending the API.\n\n### extend.js structure\n```javascript\nvar plugins=[];\nmodule.exports = plugins;\n```\n**`plugins=[]`** is an array of objects , which are functions that constitutes a plugin. Each function is defined as:\n```javascript\n{\n    \"resource\":\"/resourceToExtend\",\n    \"method\":\"GET\",\n    \"mode\":\"override\",\n    \"params\":[query],\n    \"extender\": function(req,content,cType,callback){\n            callback(null,{\"Content extension\"});\n    }\n}\n``` \n\n * URI: URI of the resource to protect\n * method: HTTP method used to call the resource to protect\n * authToken : An array of Strings containing the token types authorized by this role\n\nwhere:\n*   **resource**: URI of the resource to extend\n*   **method**  : HTTP method of the resource to extend\n*   **mode**    : Mode defining how the resource must be extended. There are four\n                  different possible modes: ```override```, ```before```, ```after```, ```before_after```. In detail:\n    *   **override**    : overrides the original endpoint definition\n    *   **before**      : the plugin function is executed before the original endpoint\n    *   **after**       : the plugin function is executed after the original endpoint\n    *   **before_after**: the plugin function is executed both before and after the original endpoint\n    \n*   **params**  : Array of the fields of Express ```req``` object that must be passed to the plugin function in ```reqParams``` param\n*   **enabled** : Optional boolean parameter indicating if the plugin is enabled or not. Default is disabled\n*   **extender**: Plugin function definition. This function is invoked end executed by apiextender, defined as:  \n                  ```function(reqParams,content,contentType,callback)```\n    *   **reqParams**   : Object containing the Express request params defined in ```params``` field. \n                          E.g. if ```params=[\"query\"]```,  ```reqParams``` contains the object ```{query:req.query}```\n    *   **content**     : Response of the original endpoint when ```mode``` param is set to ```after``` or ```before_after```.  \n                          Null when mode is set to ```override``` or ```before```\n    *   **contentType** : Content Type of ```content```, e.g. ```application/json``` , ```text/html```...  \n                          Null when mode is set to ```override``` or ```before```  \n    *   **callback**    : callback function to apiextender. It must be invoked with params ```error``` and ```newContent```, defined as:  \n                          ```callback(error,newContent)```\n        *   **error** : If an error occurs, apiextender stops the request execution and sends a response to the client\n                                        with this object, that must have two fields:\n            *   **error_code**      : HTTP status code\n            *   **error_message**   : error message content   \n        *   **newContent** : response sent to the client if mode is ```override```, ```after``` or ```before_after``` \n                                (for the latter, only for what is executed in the ```after``` part). <br>\n                             If mode is set to ```before``` or ```before_after``` \n                             (for the latter, only for what is executed in the ```before``` part), it is an\n                             object whose keys are appended to Express' ```req``` .    \n    \n####<a name=\"nb\"></a> Warning: \nIf `mode` is set to `before_after`, it is mandatory to declare in `extender` param two functions, \n                        both for the `before` and `after` actions. \n                       So the `extender` parameter is not a function but an object containing two keys: \n*   **before**: the function definition for `before` actions\n*   **after** : the function definition for `after` actions\n\n######Example\n```javascript\n{\n    //.... \n    //.... \n    \"mode\":\"before_after\"\n    \"extender\":{ \n            \"before\": function(req,content,cType,callback){\n                // before logic\n                callback(null,{\"Content extension before\"});\n            },\n            \"after\": function(req,content,cType,callback){\n                // after logic\n                callback(null,{\"Content extension after\"});\n            }\n    }\n}\n``` \n\n######Example of extend.js plugin definition\n```javascript\nvar plugins=[\n    {\n        \"resource\":\"/resourceToExtend\",\n        \"method\":\"GET\",\n        \"mode\":\"override\",\n        \"params\":[query],\n        \"extender\": function(req,content,cType,callback){\n            callback(null,{\"Content extension\"});\n        }\n    },             \n    {\n        \"resource\":\"/OtherResourceToExtend\",\n        \"method\":\"GET\",\n        \"mode\":\"before\",\n        \"params\":[query],\n        \"extender\": function(req,content,cType,callback){\n            callback(null,{\"Content extension\"});\n        }\n    }\n]             \n``` \n\n\n## <a name=\"reference\"></a>Reference\n### <a name=\"extend\"></a>`extend(app)` \nFunction that extends the API. The param `app` is the application that you want extend.  \n\n### <a name=\"install\"></a>`install(app,extender,save)` \nFunction that extends an API at runtime, without stopping and restarting your application.\n* `app` is the application that you want extend  \n* `extender` is the plugin function described in section [plugin extender structure](#functionextension)  \n* `save` if true, the plugin is saved in the `extend.js` file, being appended in the `plugin` array and becoming permanent.\n\n######Example:\n```javascript\nvar express=require('express'); \nvar apiextender = require('apiextender');\nvar app=express();\n\napiextender.extend(app);  // now your API is extensible\n\n// Define an endpoint wrapping apiextender install function that lets you to extend API on the fly\n// The access to this endpoint should be protectd with token privileges\napp.post(\"/installPlugin\",function(req,res,next){\n    // check for tokens\n    //.....\n     \n    // install and run the plugin\n    apiextender.install(app,req.body.pluginExtender,req.body.save || false); \n    res.send({\"status\":\"installed\"});    \n});\n```\n\n\n## <a name=\"examples\"></a>`Examples`\n### <a name=\"examplesapi\"></a>`Examples: How to set an API extensible by plugins`\nFrom your application home directory type:\n```shell\n$ cd /Your_App_Home\n$ npm install apiextender   // install apiextender\n$ mkdir plugin              // Create plugin container folder\n$ cd plugin                 // go into plugin folder\n$ vi extend.js              // Create plugin container file\n```\n\n\nInsert this content in `extend.js`.\n```javascript\nvar plugins=[];\nmodule.exports = plugins; \n``` \n\nInclude the apiextender module in `app.js`\n```javascript\nvar express=require('express'); \nvar apiextender = require('apiextender');\nvar app=express();\n\napiextender.extend(app); \n``` \n\n### <a name=\"examplesplugin\"></a>`Examples: How to extend an API`\n\nSuppose we want to extend this API:\n```javascript\nvar express=require('express'); \nvar apiextender = require('apiextender');\nvar app=express();\n\napiextender.extend(app);  // now your API is exensible\n\napp.get('/overrideOriginal', function(req, res){\n  res.send({\"response\":\"override\"});\n});\napp.get('/beforeOriginal', function(req, res){\n  var params=req.optionalParams || null;\n  var response = params!=null ? {\"response\":\"before\", \"response_before\":params} : {\"response\":\"before\"}  \n  res.send(response);\n});\napp.get('/afterOriginal', function(req, res){\n  res.send({\"response\":\"after\"});\n});\napp.get('/before_afterOriginal', function(req, res){\nvar params=req.optionalParams || null;\n  var response = params!=null ? {\"response\":\"before_after\", \"response_before\":params} : {\"response\":\"before_after\"}  \n  res.send(response);  \n});\n``` \n\n#### <a name=\"exampleoverride\"></a>`Override mode`\nWith no plugin function defined, the endpoint response is:\n```shell\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/overrideOriginal\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 23\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"override\"} // original response because no extension function\n $ \n```\n\nNow we extend \"/overrideOriginal\" endpoint with a plugin, writing a plugin function in `extend.js`\n```javascript\nvar plugins=[\n    {\n        \"resource\":\"/overrideOriginal\",  // extend overrideOriginal endpoint\n        \"method\":\"GET\",                  // extend overrideOriginal endpoint in get method  \n        \"mode\":\"override\",               // endpoint overrideOriginal must be overrided   \n        \"params\":[query],                // express request \"req.query\" should be throw to extender function \n        \"extender\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n            // the mode is set to \"override\" so \"content,cType\" are both null\n            var username=requestParams.username || \"\"; // if username exist is set otherwise use a void string\n            callback(null,{\"response\":\"Hello \" + username + \" this is a plugin function that override\"});  \n            //        ^\n            //        |\n            //      No Error    \n        }\n    }\n];\nmodule.exports = plugins;\n``` \n\nRestart your application (or invoke `apiextender.install`) to apply the plugin function.\nIf you curl the endpoint, you can notice that the original endpoint is not executed, being overridden by the plugin function:\n```shell\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/overrideOriginal\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 60\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"Hello this is a plugin function that ovveride\"} // original response \"{\"response\":\"before\"}\" \n                                                              // overrided by extension function\n $\n```\n\n\n#### <a name=\"examplebefore\"></a>`Before mode`\nWith no plugin function defined, the endpoint response is:\n```shell\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/beforeOriginal\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 51\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"before\"} // original response because no extension function\n```\n\nNow we extend \"/beforeOriginal\" endpoint with a plugin, writing a plugin function in `extend.js`\n```javascript\nvar plugins=[\n    {\n        \"resource\":\"/beforeOriginal\",  // extend beforeOriginal endpoint\n        \"method\":\"GET\",                // extend beforeOriginal endpoint in get method  \n        \"mode\":\"before\",               // plugin function must be executed before original endpoint beforeOriginal   \n        \"params\":[query],              // express request \"req.query\" should be throw to extender function \n        \"extender\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n            // the mode is set to \"before\" so \"content,cType\" are both null\n            var username=requestParams.username || \"\"; // if username exist is set otherwise use a void string\n            callback(null,{\"optionalParams\":\"Hello \" + username + \" this is a plugin function that extend\"});  \n            //        ^\n            //        |\n            //      No Error    \n        }\n    }\n];\nmodule.exports = plugins;\n``` \n\nRestart your application (or invoke `apiextender.install`) to apply the plugin function.\nIf you curl the endpoint, you can notice that the original endpoint is extended by the plugin function:\n\n```shell \n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/beforeOriginal?username=Alex\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 90\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"before\",\"response_before\":\"Hello Alex this is a plugin function that extend\"} // original and extended response\n```\n\n\n#### <a name=\"exampleafter\"></a>`After mode`\nWith no plugin function defined, the endpoint response is:\n```shell\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/afterOriginal\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 20\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"after\"} // original response because no extension function\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/afterOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 20\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n  \n{\"response\":\"after\"} // original response because no extension function\n```\n\nNow we extend \"/afterOriginal\" endpoint with a plugin, writing a plugin function in `extend.js`\n```javascript\nvar plugins=[\n    {\n        \"resource\":\"/afterOriginal\",  // extend afterOriginal endpoint\n        \"method\":\"GET\",               // extend afterOriginal endpoint in get method  \n        \"mode\":\"after\",               // plugin function must be executed after original endpoint afterOriginal   \n        \"params\":[query],             // express request \"req.query\" should be throw to extender function \n        \"extender\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n            // the mode is set to \"after\" so \"content,cType\" are both not null\n             if(cType===\"application/json\"){  // if content is a Json\n                var username=requestParams.username || \"\"; // if username exist is set otherwise use a void string\n                content.after_response=\"Hello \" + username + \" this is a plugin function that extend\";\n             }\n            callback(null,content);  \n            //        ^\n            //        |\n            //      No Error    \n        }\n    }\n];\nmodule.exports = plugins;\n``` \n\nRestart your application (or invoke `apiextender.install`) to apply the plugin function.\nIf you curl the endpoint, you can notice that the original endpoint is extended by the plugin function:\n\n```shell\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/afterOriginal\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 82\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"after\",\"after_response\":Hello this is a plugin function that extend\"} // original response extended\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/afterOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 87\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n  \n {\"response\":\"after\",\"after_response\":Hello Alex this is a plugin function that extend\"} // original response extended\n```\n\n\n#### <a name=\"examplebefore_after\"></a>`Examples: before_after mode`\nWith no plugin function defined, the endpoint response is:\n```shell\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/before_afterOriginal\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 27\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"before_after\"} // original response because no extension function\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/before_afterOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 27\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n  Date: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n  \n{\"response\":\"before_after\"} // original response because no extension function\n```\n\nNow we extend \"/before_afterOriginal\" endpoint with a plugin, writing a plugin function in `extend.js`\n```javascript\nvar plugins=[\n    {\n        \"resource\":\"/before_afterOriginal\",  // extend before_afterOriginal endpoint\n        \"method\":\"GET\",                      // extend before_afterOriginal endpoint in get method  \n        \"mode\":\"before_after\",               // plugin function must be executed before and after original endpoint before_afterOriginal   \n        \"params\":[query],                    // express request \"req.query\" should be throw to extender function \n        \"extender\":{\n            \"before\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n                        // the mode is set to \"before_after\" so in before function \"content,cType\" are both null\n                        var username=requestParams.username || \"\"; // if username exist is set otherwise use a void string\n                        callback(null,{\"optionalParams\":\"Hello \" + username + \" this is a plugin function that extend\"});  \n                        //        ^\n                        //        |\n                        //      No Error    \n            },\n            \"after\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n                        // the mode is set to \"before _after\" so in after function \"content,cType\" are both not null\n                        if(cType===\"application/json\"){  // if content is a Json\n                            var username=requestParams.username || \"\"; // if username exist is set otherwise use a void string\n                            content.after_response=\"Hello \" + username + \" this is a plugin function that extend\";\n                        }\n                        callback(null,content);  \n                        //        ^\n                        //        |\n                        //      No Error     \n            }\n    }\n];\nmodule.exports = plugins;\n``` \n\nRestart your application (or invoke `apiextender.install`) to apply the plugin function.\nIf you curl the endpoint, you can notice that the original endpoint is extended by the plugin function:\n```shell \n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/before_afterOriginal\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 154\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n  \n {\n   \"response\":\"before_after\",\n   \"response_before\":\"Hello this is a plugin function that extend\",  // original and extended response\n   \"response_after\":\"Hello this is a plugin function that extend\"\n } \n\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/before_afterOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 164\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n \n {\n    \"response\":\"before_after\",\n    \"response_before\":\"Hello Alex this is a plugin function that extend\", // original and extended response\n    \"response_after\":\"Hello Alex this is a plugin function that extend\"\n }\n```\n\n\n#### <a name=\"exampleerror\"></a>`Error throwing`\nWith no plugin function defined, the endpoint response is:\n```shell\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/beforeOriginal\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 51\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"before\"} // original response because no extension function\n $ // now with username param (no response changes)\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/beforeOriginal?username=Alex\n  X-Powered-By: Express\n  Content-Type: application/json; charset=utf-8\n  Content-Length: 51\n  ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n  Date: Fri, 11 Nov 2016 13:16:44 GMT\n  Connection: keep-alive\n  \n  {\"response\":\"before\"} // original response because no extension function\n```\nNow we extend \"/beforeOriginal\" endpoint with a plugin, writing a plugin function in `extend.js`. Starting from the \nexample [`Examples:before mode`](#examplebefore), we edit the plugin function to throw an error if no `username` field is sent. \n```javascript\nvar plugins=[\n    {\n        \"resource\":\"/beforeOriginal\",  // extend beforeOriginal endpoint\n        \"method\":\"GET\",                  // extend beforeOriginal endpoint in get method  \n        \"mode\":\"before\",                 // endpoint beforeOriginal must be overrided   \n        \"params\":[query],                // express request \"req.query\" should be throw to extender function \n        \"extender\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n            // the mode is set to \"override\" so \"content,cType\" are both null\n            var username=requestParams.username || null; // if username exist is set otherwise use a void string\n            if(!username)\n                callback({\"error_code\":\"400\", \"error_message\":\"no username field\"},null);\n            else\n                callback(null,{\"response\":\"Hello \" + username + \" this is a plugin function that override\"});  \n                //        ^\n                //        |\n                //      No Error    \n        }\n    }\n];\nmodule.exports = plugins;\n``` \n\nRestart your application (or invoke `apiextender.install`) to apply the plugin function.\nIf you curl the endpoint, you can notice that the original endpoint is not executed after the plugin function,\nbecause no username field is sent. This is due to the fact that `before extension` function stops the execution \nwith an error message to the apiextender callback:\n\n```shell\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/beforeOriginal\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 37\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"error_message\":\"no username field\"}      // only error_message from extended function response                                                              \n $\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/beforeOriginal?username=Alex\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 90\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"before\",\"response_before\":\"Hello Alex this is a plugin function that extend\"} // original and extended response\n```\n\n\n#### <a name=\"examplecomplete\"></a>`Examples: A Complete Eexample of plugin extension`\nWith no plugin function defined, the endpoint response is:\n```shell\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/overrideOriginal?username=Alex\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 23\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"override\"} // original response because no extension function\n$\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/beforeOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 21\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n\n{\"response\":\"before\"} // original response because no extension function\n$\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/afterOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 20\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n\n{\"response\":\"after\"} // original response because no extension function\n$\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/before_afterOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 27\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n  Date: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n  \n{\"response\":\"before_after\"} // original response because no extension function\n```\n\nNow we extend \"/....Original\" endpoint with a plugin, writing a plugin function in `extend.js`. \n\n```javascript\nvar plugins=[\n    {\n            \"resource\":\"/overrideOriginal\",  // extend overrideOriginal endpoint\n            \"method\":\"GET\",                  // extend overrideOriginal endpoint in get method  \n            \"mode\":\"override\",               // endpoint overrideOriginal must be overrided   \n            \"params\":[query],                // express request \"req.query\" should be throw to extender function \n            \"extender\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n                // the mode is set to \"override\" so \"content,cType\" are both null\n                var username=requestParams.username || \"\"; // if username exist is set otherwise use a void string\n                callback(null,{\"response\":\"Hello \" + username + \" this is a plugin function that override\"});  \n                //        ^\n                //        |\n                //      No Error    \n            }\n    },\n    {\n            \"resource\":\"/overrideOriginal\",  // extend overrideOriginal endpoint\n            \"method\":\"GET\",                  // extend overrideOriginal endpoint in get method  \n            \"mode\":\"before\",                 // endpoint overrideOriginal must be overrided   \n            \"params\":[query],                // express request \"req.query\" should be throw to extender function \n            \"extender\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n                // the mode is set to \"override\" so \"content,cType\" are both null\n                var username=requestParams.username || null; // if username exist is set otherwise use a void string\n                if(!username)\n                    callback({\"error_code\":\"400\", \"error_message\":\"no username field\"},null);\n                else\n                    callback(null,{\"response\":\"Hello \" + username + \" this is a plugin function that override\"});  \n                    //        ^\n                    //        |\n                    //      No Error    \n            }\n    },\n    {\n            \"resource\":\"/afterOriginal\",  // extend afterOriginal endpoint\n            \"method\":\"GET\",               // extend afterOriginal endpoint in get method  \n            \"mode\":\"after\",               // plugin function must be executed after original endpoint afterOriginal   \n            \"params\":[query],             // express request \"req.query\" should be throw to extender function \n            \"extender\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n                // the mode is set to \"after\" so \"content,cType\" are both not null\n                 if(cType===\"application/json\"){  // if content is a Json\n                    var username=requestParams.username || \"\"; // if username exist is set otherwise use a void string\n                    content.after_response=\"Hello \" + username + \" this is a plugin function that extend\";\n                 }\n                callback(null,content);  \n                //        ^\n                //        |\n                //      No Error    \n            }\n    },    \n    {\n        \"resource\":\"/before_afterOriginal\",  // extend before_afterOriginal endpoint\n        \"method\":\"GET\",                      // extend before_afterOriginal endpoint in get method  \n        \"mode\":\"before_after\",               // plugin function must be executed before and after original endpoint before_afterOriginal   \n        \"params\":[query],                    // express request \"req.query\" should be throw to extender function \n        \"extender\":{\n            \"before\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n                        // the mode is set to \"before_after\" so in before function \"content,cType\" are both null\n                        var username=requestParams.username || \"\"; // if username exist is set otherwise use a void string\n                        callback(null,{\"optionalParams\":\"Hello \" + username + \" this is a plugin function that extend\"});  \n                        //        ^\n                        //        |\n                        //      No Error    \n            },\n            \"after\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n                        // the mode is set to \"before _after\" so in after function \"content,cType\" are both not null\n                        if(cType===\"application/json\"){  // if content is a Json\n                            var username=requestParams.username || \"\"; // if username exist is set otherwise use a void string\n                            content.after_response=\"Hello \" + username + \" this is a plugin function that extend\";\n                        }\n                        callback(null,content);  \n                        //        ^\n                        //        |\n                        //      No Error     \n            }\n    }\n];\nmodule.exports = plugins;\n``` \n\nRestart your application (or invoke `apiextender.install`) to apply the plugin function.\nIf you curl the endpoint, you can notice that the original endpoint is extended by the plugin function:\n```shell \n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/overrideOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 65\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n\n {\"response\":\"Hello Alex this is a plugin function that ovveride\"} // original response \"{\"response\":\"before\"}\" \n                                                              // overrided by extension function\n$\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/beforeOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 90\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n\n{\"response\":\"before\",\"response_before\":\"Hello Alex this is a plugin function that extend\"} // original and extended response\n$\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/afterOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 88\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n\n{\"response\":\"after\",\"after_response\":Hello Alex this is a plugin function that extend\"} // original response extended\n$\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/before_afterOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 165\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n\n{\n    \"response\":\"before_after\",\n    \"response_before\":\"Hello Alex this is a plugin function that extend\",  // original and extended response\n    \"response_after\":\"Hello Alex this is a plugin function that extend\"\n}    \n```\n\n\n\n#### <a name=\"exampleonFly\"></a>`Extend API on the fly at runtime`\nTo extend an API on the fly as described in reference section [install(app,extender,save)](#install), we need to define an\nendpoint that wraps apiextender install function. Add these code lines to you app.js:\n```javascript\nvar express=require('express'); \nvar apiextender = require('apiextender');\nvar app=express();\n   \n// .....\n// Old app.js logic\n// ..... \n\n// Define an endpoint that wrap apiextender install function that lets you to extend API on the fly\n// The access to this endpoint should be protectd with token privileges\napp.post(\"/installPlugin\",function(req,res,next){\n    // check for tokens\n    //.....\n     \n    apiextender.install(app,req.body.pluginExtender,req.body.save || false);    \n    res.send({\"status\":\"installed\"});\n});\n```\n\nWith no plugin function defined, the endpoint response is:\n```shell\n $ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/overrideOriginal?username=Alex\n X-Powered-By: Express\n Content-Type: application/json; charset=utf-8\n Content-Length: 23\n ETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\n Date: Fri, 11 Nov 2016 13:16:44 GMT\n Connection: keep-alive\n \n {\"response\":\"override\"} // original response because no extension function\n```\n\nNow we extend \"/overrideOriginal\" endpoint with a plugin, installed on the fly without defining it in `extend.js`.\nTo install, just call `/installPlugin` in POST:\n```shell\nEXTENDER='{\n            \"pluginExtender\":{\n                \"resource\":\"/overrideOriginal\",  // extend overrideOriginal endpoint\n                \"method\":\"GET\",                  // extend overrideOriginal endpoint in get method  \n                \"mode\":\"override\",               // endpoint overrideOriginal must be overrided   \n                \"params\":[query],                // express request \"req.query\" should be throw to extender function \n                \"extender\": function(requestParams,content,cType,callback){   // this is the extender Function definition\n                     // the mode is set to \"override\" so \"content,cType\" are both null\n                    var username=requestParams.username || \"\"; // if username exist is set otherwise use a void string\n                    callback(null,{\"response\":\"Hello \" + username + \" this is a plugin function that override\"});  \n                    //        ^\n                    //        |\n                    //      No Error    \n                }\n            },\n            \"save\":false; // not save extenson plugin\n}'\n$\n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X POST http://hostname/overrideOriginal?username=Alex\n    -d $EXTENDER\n    \nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 22\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n \n{\"status\":\"installed\"} // plugin extension installed\n```\n\n\nRestart your application (or invoke `apiextender.install`) to apply the plugin function.\n\n\n\n**Without restarting** your application, if you curl the endpoint, you can notice that the original endpoint is extended by the plugin function:\n```shell \n$ curl -i -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X GET http://hostname/overrideOriginal?username=Alex\nX-Powered-By: Express\nContent-Type: application/json; charset=utf-8\nContent-Length: 65\nETag: \"35-6BXjKyRXlm+rSEU9a23z/g\"\nDate: Fri, 11 Nov 2016 13:16:44 GMT\nConnection: keep-alive\n\n {\"response\":\"Hello Alex this is a plugin function that ovveride\"} // original response \"{\"response\":\"before\"}\" \n                                                                   // overrided by extension function\n$\n```\n\nLicense - \"MIT License\"\n-----------------------\n\nMIT License\n\nCopyright (c) 2016 aromanino\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nAuthor\n------\nCRS4 Microservice Core Team ([cmc.smartenv@crs4.it](mailto:cmc.smartenv@crs4.it))\n\nContributors\n------\nAlessandro Romanino ([a.romanino@gmail.com](mailto:a.romanino@gmail.com))<br>\nGuido Porruvecchio ([guido.porruvecchio@gmail.com](mailto:guido.porruvecchio@gmail.com))\n","maintainers":[{"name":"aromanino","email":"a.romanino@gmail.com"}],"time":{"modified":"2024-03-04T09:36:05.283Z","created":"2016-11-24T14:37:22.330Z","0.0.1":"2016-11-24T14:37:22.330Z","0.0.2":"2016-11-29T08:25:02.397Z","0.0.3":"2016-11-29T09:36:37.252Z","0.0.4":"2016-11-29T09:38:23.506Z","0.0.5":"2016-11-29T09:46:18.131Z","0.0.6":"2016-11-29T09:53:27.127Z","0.0.7":"2016-11-29T09:56:51.915Z","1.0.0":"2016-11-29T10:01:54.230Z","1.1.0":"2016-11-29T10:07:27.598Z","1.1.1":"2016-11-29T14:30:41.926Z","1.1.2":"2016-12-05T11:23:05.563Z","1.2.0":"2016-12-07T07:00:42.253Z","1.2.1":"2016-12-07T09:13:45.498Z","1.2.2":"2016-12-07T09:21:45.563Z","1.2.3":"2016-12-07T09:55:04.311Z","1.2.4":"2016-12-12T13:09:49.289Z","1.2.5":"2016-12-12T13:34:24.142Z","1.3.0":"2016-12-12T13:53:11.306Z","1.4.0":"2016-12-12T16:19:20.205Z","2.0.0":"2017-07-18T08:36:25.218Z","3.0.0":"2018-08-01T17:11:58.812Z","3.1.0":"2018-08-01T17:27:32.537Z","3.1.1":"2019-03-26T15:37:50.610Z","3.1.3":"2019-03-26T16:42:30.919Z","3.1.4":"2024-03-04T09:36:04.794Z"},"homepage":"https://github.com/aromanino/apiextender#readme","keywords":["api","extend","extension","plugin","plug-in","add-in","addin","add-on","addon","upgrade","update","install","feature"],"repository":{"type":"git","url":"git+https://github.com/aromanino/apiextender.git"},"author":{"name":"Alessandro Romanino","email":"a.romanino@gmail.com"},"bugs":{"url":"https://github.com/aromanino/apiextender/issues"},"license":"MIT","readmeFilename":"README.md"}