{"_id":"@aufentic/express-subdomain","_rev":"3-4e32a942bfafdcca0ee6210d7481ddfc","name":"@aufentic/express-subdomain","dist-tags":{"latest":"1.0.7"},"versions":{"1.0.5":{"name":"@aufentic/express-subdomain","version":"1.0.5","repository":{"type":"git","url":"git://github.com/Aufentic/express-subdomain.git"},"description":"Simple and lightweight middleware to handle subdomains","main":"index.js","scripts":{"test":"./test/pre-script.sh; ./node_modules/.bin/mocha --reporter spec; ./test/post-script.sh","coverage":"./test/pre-script.sh; istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage; ./test/post-script.sh"},"author":{"name":"Aufentic","email":"admin@aufentic.com"},"license":"MIT","devDependencies":{"chai":"~1.9.1","colors":"~0.6.2","composable-middleware":"^0.3.0","coveralls":"~2.10.0","express":"~4.1.1","istanbul":"~0.2.10","mocha":"~1.18.2","mocha-lcov-reporter":"0.0.1","request":"~2.34.0"},"types":"./index.d.ts","gitHead":"d57d958eff1071e8cd69dc255051386197aeaf53","bugs":{"url":"https://github.com/Aufentic/express-subdomain/issues"},"homepage":"https://github.com/Aufentic/express-subdomain#readme","_id":"@aufentic/express-subdomain@1.0.5","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-P6ngZdqDc1KyNH0SZYhPPsNx6fg7igijVXERM+qsgRrlyfgn9Agv15Ag45oplwQv1AMuOdWzE7TGMlau22rd8w==","shasum":"481cdadb607527da4c2fd7cd7354704435680eae","tarball":"https://registry.npmjs.org/@aufentic/express-subdomain/-/express-subdomain-1.0.5.tgz","fileCount":16,"unpackedSize":21774,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh+R3rCRA9TVsSAnZWagAAUicP/jb4fmD3ODtC3qtemarx\n/d5bQ+RLszQjFK4/3SFckW2oZfV0cK/4qyA3PhG7nEOToh0Q5I5rSjdg46N2\nRIL+aJDNleMpOJ2IJrPQiAlPaKb95uyCnIHqMeYKgftX+/cE+v3eGlfwwqi8\noo2EtIp97zsqobZtrWialh2kBi+ku6PQgcZim3E6338A1zbihbB+Fnxm4zAW\nCouHVcoM3WAoLepf6pA8hhdG8m6cmu8UdClz+x83vsZe3VN2E4GB0TRGE/A3\na5vkkFAg5Qem1R7uQTsJ4FqI4t1W/LnTCCHK4/c0io7pTF2CjclM70pK3XIB\nwy+qR0TBmbH1v7Yp34QIYhpzPiHgi2utm93bRvjeaSQZWa37oofyk7KgVPg1\noHms7qOkNz28jxItm4j0kGeHcD6Bm6zYOhhx2n5mvZy19PRsHxZwupdHtxEb\n8KXF1Re3R8LLFLS72W4FaTO/TdmtYMyCAP9/Lo1bFtaQoBXAzr7P0VOdPbz4\ngEVJs0oIMlC/VL1lof5dzc4lPTWonlvUEZ+q4oaIMjZIalSHhUH5tvP1OCPi\nVQhh1Q7KUamMRlbyAF0SLp57iKjp52wkWtzmxrZHdPxYrKccb79alHxUvq32\nG8QUfJKlXtQDStTxC6eLXqQR+YyyVNFqW3wyE0TgHKhdhhAZCC7l17e4dCNr\n2XhW\r\n=jR6v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA0Ncyb0FD5B+SHLszROiNVMh6KyqJJDMA2S9/CLDx8bAiApsC0zNfOImRFGhs0H2TaqHsZGsBXcgTiZQDiMutBe4w=="}]},"_npmUser":{"name":"aufentic","email":"etan8@protonmail.ch"},"directories":{},"maintainers":[{"name":"aufentic","email":"etan8@protonmail.ch"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/express-subdomain_1.0.5_1643716075575_0.418096463688997"},"_hasShrinkwrap":false},"1.0.7":{"name":"@aufentic/express-subdomain","version":"1.0.7","repository":{"type":"git","url":"git://github.com/Aufentic/express-subdomain.git"},"description":"Simple and lightweight middleware to handle subdomains","main":"index.js","scripts":{"test":"./test/pre-script.sh; ./node_modules/.bin/mocha --reporter spec; ./test/post-script.sh","coverage":"./test/pre-script.sh; istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage; ./test/post-script.sh"},"author":{"name":"Aufentic","email":"admin@aufentic.com"},"license":"MIT","devDependencies":{"chai":"~1.9.1","colors":"~0.6.2","composable-middleware":"^0.3.0","coveralls":"~2.10.0","express":"~4.1.1","istanbul":"~0.2.10","mocha":"~1.18.2","mocha-lcov-reporter":"0.0.1","request":"~2.34.0"},"types":"./index.d.ts","gitHead":"26c39a02fe384e0f1cb5f2001a8e12d84df0dda7","bugs":{"url":"https://github.com/Aufentic/express-subdomain/issues"},"homepage":"https://github.com/Aufentic/express-subdomain#readme","_id":"@aufentic/express-subdomain@1.0.7","_nodeVersion":"16.13.1","_npmVersion":"8.1.2","dist":{"integrity":"sha512-+t5nBMMIptJENjmSmcHOloHwmOzn74nHnTGIzdPLYpP8ZuycB49V7u5sk5vvxlRd/rLkfHic7mnGFoeeAXKMhw==","shasum":"2c27a9c83e84a4c217dae155ed9d22aae0faa3b7","tarball":"https://registry.npmjs.org/@aufentic/express-subdomain/-/express-subdomain-1.0.7.tgz","fileCount":17,"unpackedSize":27109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh/ER3CRA9TVsSAnZWagAAVf4QAJvast5euZTGYoj0g+AB\nRFNBFPxPpXfc1yCxG1iwzLyCRw9J6BSb5ldETIZpJtl4eeDMdC6NxTZ6x1+l\nlmdQxHV7iwyKK/wzLfbsbqNURuZ/FG/gmSHjcNiwPAHvLQhGy6VODyx5ar+u\nj5iFMf9WvtopgjeH/ll1eNG/kqbkfvnr4z/GiAb5QIxoRAidBrFiVGbIorpP\n4mIPviIK3xAZtbcqoOxDVsE408IkZnPa89LwDztIbc/hbXt6LxwRK6pSBfy4\nE9+XU4RT+xt+cCsbZtnBIda5Sz2W/axMpYj+ONZzQ02F+Ww2JW4GBLKFAJVf\nylNyVZOez7ucFe906jx1ODwWxJG1JQVEfYJggLUMU9Qp/vqRo+VLFZR1D6Rs\nh+IkBMh+E+2llZ8vMb/lpzHt4fWXSajNuP0oRdwWXQ8duUIMqWjieaAfJ62t\nq24KRHgyqOSsIRcYy3b+/UpiZna+1j3deEu3cNVP+bc7TP+lrkWhmEMBG20C\nRoL6EUekT506S8ifu65VfMQzFuypupHzfg8SwI2b+L9UPla48IHlpLZd3z2M\naWjmxK8Xipcij6mCXDxYzgdvzXyLs4bUTYF9Nn5Uf56SmbcSeesaHIfpcbCn\nNaEpi2c04+V8Jg2k9AnCGb47LOtMsgxfRhR1To1SHjKfX/HsRxa5A8A/f3Ss\nDuKL\r\n=xmzx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDFpv+Rsx01imKQfhdD66PDw8YOcp7v6bUE1nUTXfuWCAiB04FxUwLVOaS2knXD5L3u1Uv7hbQns6mZx2qgtqZAq9Q=="}]},"_npmUser":{"name":"aufentic","email":"etan8@protonmail.ch"},"directories":{},"maintainers":[{"name":"aufentic","email":"etan8@protonmail.ch"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/express-subdomain_1.0.7_1643922551031_0.7019166717425551"},"_hasShrinkwrap":false}},"time":{"created":"2022-02-01T11:47:55.575Z","1.0.5":"2022-02-01T11:47:55.725Z","modified":"2022-04-04T16:23:02.347Z","1.0.7":"2022-02-03T21:09:11.137Z"},"maintainers":[{"name":"aufentic","email":"etan8@protonmail.ch"}],"description":"Simple and lightweight middleware to handle subdomains","homepage":"https://github.com/Aufentic/express-subdomain#readme","repository":{"type":"git","url":"git://github.com/Aufentic/express-subdomain.git"},"author":{"name":"Aufentic","email":"admin@aufentic.com"},"bugs":{"url":"https://github.com/Aufentic/express-subdomain/issues"},"license":"MIT","readme":"# Maintaining\r\n\r\nAlthough pull requests and issues are welcome, the Aufentic team will keep this package and repository up to date.\r\n\r\n[Original repository thanks to bmullan91.](https://github.com/bmullan91/express-subdomain)\r\n\r\n# express-subdomain\r\n\r\nIs simply express middleware. In the examples below I am using [Express v4.x](http://expressjs.com/).\r\n\r\n## Install\r\n\r\nWith npm, saving it as a dependency.\r\n\r\n    npm i @aufentic/express-subdomain --save\r\n\r\n## Support for ES modules\r\n\r\n\r\n``` js\r\nimport subdomain from 'express-subdomain';\r\nimport express from 'express';\r\nvar app = express();\r\n\r\n// *** Code examples below go here! ***\r\n\r\n// example.com\r\napp.get('/', function(req, res) {\r\n    res.send('Homepage');\r\n});\r\n```\r\n\r\n#### API Router\r\n\r\n``` js\r\nvar router = express.Router();\r\n\r\n//api specific routes\r\nrouter.get('/', function(req, res) {\r\n    res.send('Welcome to our API!');\r\n});\r\n\r\nrouter.get('/users', function(req, res) {\r\n    res.json([\r\n        { name: \"Brian\" }\r\n    ]);\r\n});\r\n```\r\n\r\nNow register the subdomain middleware:\r\n``` js\r\napp.use(subdomain('api', router));\r\napp.listen(3000);\r\n```\r\nThe API is alive:\r\n\r\n`http://api.example.com/` --> \"Welcome to our API!\"\r\n\r\n`http://api.example.com/users` --> \"[{\"name\":\"Brian\"}]\"\r\n\r\n## Simple usage\r\n\r\nLet's say you want to provide a RESTful API via the url `http://api.example.com`\r\n\r\n#### Express boilerplate code:\r\n\r\n``` js\r\nvar subdomain = require('express-subdomain');\r\nvar express = require('express');\r\nvar app = express();\r\n\r\n// *** Code examples below go here! ***\r\n\r\n// example.com\r\napp.get('/', function(req, res) {\r\n    res.send('Homepage');\r\n});\r\n```\r\n\r\n#### API Router\r\n\r\n``` js\r\nvar router = express.Router();\r\n\r\n//api specific routes\r\nrouter.get('/', function(req, res) {\r\n    res.send('Welcome to our API!');\r\n});\r\n\r\nrouter.get('/users', function(req, res) {\r\n    res.json([\r\n        { name: \"Brian\" }\r\n    ]);\r\n});\r\n```\r\n\r\nNow register the subdomain middleware:\r\n``` js\r\napp.use(subdomain('api', router));\r\napp.listen(3000);\r\n```\r\nThe API is alive:\r\n\r\n`http://api.example.com/` --> \"Welcome to our API!\"\r\n\r\n`http://api.example.com/users` --> \"[{\"name\":\"Brian\"}]\"\r\n\r\n\r\n## Multi-level Subdomains\r\n\r\n``` js\r\napp.use(subdomain('v1.api', router)); //using the same router\r\n```\r\n\r\n`http://v1.api.example.com/` --> \"Welcome to our API!\"\r\n\r\n`http://v1.api.example.com/users` --> \"[{\"name\":\"Brian\"}]\"\r\n\r\n### Wildcards\r\n\r\nSay you wanted to ensure that the user has an API key before getting access to it... and this is across __all__ versions.\r\n\r\n_Note_:\r\nIn the example below, the passed function to subdomain can be just a pure piece of middleware.\r\n\r\n``` js\r\nvar checkUser = subdomain('*.api', function(req, res, next) {\r\n    if(!req.session.user.valid) {\r\n        return res.send('Permission denied.');\r\n    }\r\n    next();\r\n});\r\n\r\napp.use(checkUser);\r\n```\r\n\r\nThis can be used in tandem with the examples above.\r\n\r\n_Note_:\r\nThe order in which the calls to app.use() is very important. Read more about it [here](http://expressjs.com/4x/api.html#app.use).\r\n\r\n``` js\r\napp.use(checkUser);\r\napp.use(subdomain('v1.api', router));\r\n```\r\n\r\n## Divide and Conquer\r\n\r\nThe subdomains can also be chained, for example to achieve the same behaviour as above:\r\n\r\n``` js\r\nvar router = express.Router(); //main api router\r\nvar v1Routes = express.Router();\r\nvar v2Routes = express.Router();\r\n\r\nv1Routes.get('/', function(req, res) {\r\n    res.send('API - version 1');\r\n});\r\nv2Routes.get('/', function(req, res) {\r\n    res.send('API - version 2');\r\n});\r\n\r\nvar checkUser = function(req, res, next) {\r\n    if(!req.session.user.valid) {\r\n        return res.send('Permission denied.');\r\n    }\r\n    next();\r\n};\r\n\r\n//the api middleware flow\r\nrouter.use(checkUser);\r\nrouter.use(subdomain('*.v1', v1Routes));\r\nrouter.use(subdomain('*.v2', v2Routes));\r\n\r\n//basic routing..\r\nrouter.get('/', function(req, res) {\r\n    res.send('Welcome to the API!');\r\n});\r\n\r\n//attach the api\r\napp.use(subdomain('api', router));\r\napp.listen(3000);\r\n```\r\n\r\n#### Invalid user\r\n\r\n`http://api.example.com/` --> Permission denied.\r\n\r\n#### Valid user\r\n\r\n`http://api.example.com/` --> Welcome to the API!\r\n\r\n`http://v1.api.example.com/` --> API - version 1\r\n\r\n`http://abc.v1.api.example.com/` --> API - version 1\r\n\r\n`http://v2.api.example.com/` --> API - version 2\r\n\r\n`http://abc.v2.api.example.com/` --> API - version 2\r\n\r\n## Developing Locally\r\n\r\nIf you plan to use this middleware while developing locally, you'll have to\r\nensure that your subdomain is listed in your hosts file.\r\n\r\nOn Linux or OSX, add your subdomain to `/etc/hosts`:\r\n```\r\n127.0.0.1       myapp.internal\r\n127.0.0.1       subdomain.myapp.internal\r\n```\r\n\r\nYou may not have write permissions on your hosts file, in which case you can\r\ngrant them:\r\n```\r\n$ sudo chmod a+rw /etc/hosts\r\n```\r\n\r\n_Note_:\r\nExpress parses the request URL for a top level domain, so developing locally\r\nwithout one won't be possible because Express will treat the subdomain as the\r\ndomain, and the actual domain as a TLD.\r\n\r\n#### Windows\r\n\r\nOn Windows 7 and 8, the hosts file path is `%systemroot%\\system32\\drivers\\etc`.\r\n\r\n## Gotchas\r\n\r\nMultilevel TLD's, such as `.co.uk` you have to pass `api.example` as the _subdomain_:\r\n\r\n```js\r\napp.use(subdomain('api.example', router));\r\n```\r\nSee https://github.com/bmullan91/express-subdomain/issues/17 for more info. \r\n","readmeFilename":"README.md"}