├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── src ├── api │ ├── controllers │ │ └── UserContoller.ts │ ├── routes │ │ ├── index.ts │ │ └── v1 │ │ │ ├── index.ts │ │ │ └── user │ │ │ └── index.ts │ └── services │ │ └── UserService.ts ├── app.ts └── server.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Node-Express-Typescript 2 | Node Express Typescript Boiler Plate 3 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescipt-express-boiler", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/body-parser": { 8 | "version": "1.19.0", 9 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 10 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 11 | "dev": true, 12 | "requires": { 13 | "@types/connect": "*", 14 | "@types/node": "*" 15 | } 16 | }, 17 | "@types/connect": { 18 | "version": "3.4.33", 19 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", 20 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", 21 | "dev": true, 22 | "requires": { 23 | "@types/node": "*" 24 | } 25 | }, 26 | "@types/express": { 27 | "version": "4.17.2", 28 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.2.tgz", 29 | "integrity": "sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA==", 30 | "dev": true, 31 | "requires": { 32 | "@types/body-parser": "*", 33 | "@types/express-serve-static-core": "*", 34 | "@types/serve-static": "*" 35 | } 36 | }, 37 | "@types/express-serve-static-core": { 38 | "version": "4.17.2", 39 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.2.tgz", 40 | "integrity": "sha512-El9yMpctM6tORDAiBwZVLMcxoTMcqqRO9dVyYcn7ycLWbvR8klrDn8CAOwRfZujZtWD7yS/mshTdz43jMOejbg==", 41 | "dev": true, 42 | "requires": { 43 | "@types/node": "*", 44 | "@types/range-parser": "*" 45 | } 46 | }, 47 | "@types/mime": { 48 | "version": "2.0.1", 49 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", 50 | "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", 51 | "dev": true 52 | }, 53 | "@types/node": { 54 | "version": "13.7.4", 55 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.4.tgz", 56 | "integrity": "sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw==", 57 | "dev": true 58 | }, 59 | "@types/range-parser": { 60 | "version": "1.2.3", 61 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 62 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", 63 | "dev": true 64 | }, 65 | "@types/serve-static": { 66 | "version": "1.13.3", 67 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", 68 | "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", 69 | "dev": true, 70 | "requires": { 71 | "@types/express-serve-static-core": "*", 72 | "@types/mime": "*" 73 | } 74 | }, 75 | "accepts": { 76 | "version": "1.3.7", 77 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 78 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 79 | "requires": { 80 | "mime-types": "~2.1.24", 81 | "negotiator": "0.6.2" 82 | } 83 | }, 84 | "array-flatten": { 85 | "version": "1.1.1", 86 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 87 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 88 | }, 89 | "body-parser": { 90 | "version": "1.19.0", 91 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 92 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 93 | "requires": { 94 | "bytes": "3.1.0", 95 | "content-type": "~1.0.4", 96 | "debug": "2.6.9", 97 | "depd": "~1.1.2", 98 | "http-errors": "1.7.2", 99 | "iconv-lite": "0.4.24", 100 | "on-finished": "~2.3.0", 101 | "qs": "6.7.0", 102 | "raw-body": "2.4.0", 103 | "type-is": "~1.6.17" 104 | } 105 | }, 106 | "bytes": { 107 | "version": "3.1.0", 108 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 109 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 110 | }, 111 | "content-disposition": { 112 | "version": "0.5.3", 113 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 114 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 115 | "requires": { 116 | "safe-buffer": "5.1.2" 117 | } 118 | }, 119 | "content-type": { 120 | "version": "1.0.4", 121 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 122 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 123 | }, 124 | "cookie": { 125 | "version": "0.4.0", 126 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 127 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 128 | }, 129 | "cookie-signature": { 130 | "version": "1.0.6", 131 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 132 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 133 | }, 134 | "debug": { 135 | "version": "2.6.9", 136 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 137 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 138 | "requires": { 139 | "ms": "2.0.0" 140 | } 141 | }, 142 | "depd": { 143 | "version": "1.1.2", 144 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 145 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 146 | }, 147 | "destroy": { 148 | "version": "1.0.4", 149 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 150 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 151 | }, 152 | "ee-first": { 153 | "version": "1.1.1", 154 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 155 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 156 | }, 157 | "encodeurl": { 158 | "version": "1.0.2", 159 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 160 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 161 | }, 162 | "escape-html": { 163 | "version": "1.0.3", 164 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 165 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 166 | }, 167 | "etag": { 168 | "version": "1.8.1", 169 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 170 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 171 | }, 172 | "express": { 173 | "version": "4.17.1", 174 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 175 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 176 | "requires": { 177 | "accepts": "~1.3.7", 178 | "array-flatten": "1.1.1", 179 | "body-parser": "1.19.0", 180 | "content-disposition": "0.5.3", 181 | "content-type": "~1.0.4", 182 | "cookie": "0.4.0", 183 | "cookie-signature": "1.0.6", 184 | "debug": "2.6.9", 185 | "depd": "~1.1.2", 186 | "encodeurl": "~1.0.2", 187 | "escape-html": "~1.0.3", 188 | "etag": "~1.8.1", 189 | "finalhandler": "~1.1.2", 190 | "fresh": "0.5.2", 191 | "merge-descriptors": "1.0.1", 192 | "methods": "~1.1.2", 193 | "on-finished": "~2.3.0", 194 | "parseurl": "~1.3.3", 195 | "path-to-regexp": "0.1.7", 196 | "proxy-addr": "~2.0.5", 197 | "qs": "6.7.0", 198 | "range-parser": "~1.2.1", 199 | "safe-buffer": "5.1.2", 200 | "send": "0.17.1", 201 | "serve-static": "1.14.1", 202 | "setprototypeof": "1.1.1", 203 | "statuses": "~1.5.0", 204 | "type-is": "~1.6.18", 205 | "utils-merge": "1.0.1", 206 | "vary": "~1.1.2" 207 | } 208 | }, 209 | "finalhandler": { 210 | "version": "1.1.2", 211 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 212 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 213 | "requires": { 214 | "debug": "2.6.9", 215 | "encodeurl": "~1.0.2", 216 | "escape-html": "~1.0.3", 217 | "on-finished": "~2.3.0", 218 | "parseurl": "~1.3.3", 219 | "statuses": "~1.5.0", 220 | "unpipe": "~1.0.0" 221 | } 222 | }, 223 | "forwarded": { 224 | "version": "0.1.2", 225 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 226 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 227 | }, 228 | "fresh": { 229 | "version": "0.5.2", 230 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 231 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 232 | }, 233 | "http-errors": { 234 | "version": "1.7.2", 235 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 236 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 237 | "requires": { 238 | "depd": "~1.1.2", 239 | "inherits": "2.0.3", 240 | "setprototypeof": "1.1.1", 241 | "statuses": ">= 1.5.0 < 2", 242 | "toidentifier": "1.0.0" 243 | } 244 | }, 245 | "iconv-lite": { 246 | "version": "0.4.24", 247 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 248 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 249 | "requires": { 250 | "safer-buffer": ">= 2.1.2 < 3" 251 | } 252 | }, 253 | "inherits": { 254 | "version": "2.0.3", 255 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 256 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 257 | }, 258 | "ipaddr.js": { 259 | "version": "1.9.1", 260 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 261 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 262 | }, 263 | "media-typer": { 264 | "version": "0.3.0", 265 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 266 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 267 | }, 268 | "merge-descriptors": { 269 | "version": "1.0.1", 270 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 271 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 272 | }, 273 | "methods": { 274 | "version": "1.1.2", 275 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 276 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 277 | }, 278 | "mime": { 279 | "version": "1.6.0", 280 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 281 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 282 | }, 283 | "mime-db": { 284 | "version": "1.43.0", 285 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 286 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" 287 | }, 288 | "mime-types": { 289 | "version": "2.1.26", 290 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 291 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 292 | "requires": { 293 | "mime-db": "1.43.0" 294 | } 295 | }, 296 | "ms": { 297 | "version": "2.0.0", 298 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 299 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 300 | }, 301 | "negotiator": { 302 | "version": "0.6.2", 303 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 304 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 305 | }, 306 | "on-finished": { 307 | "version": "2.3.0", 308 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 309 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 310 | "requires": { 311 | "ee-first": "1.1.1" 312 | } 313 | }, 314 | "parseurl": { 315 | "version": "1.3.3", 316 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 317 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 318 | }, 319 | "path-to-regexp": { 320 | "version": "0.1.7", 321 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 322 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 323 | }, 324 | "proxy-addr": { 325 | "version": "2.0.6", 326 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 327 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 328 | "requires": { 329 | "forwarded": "~0.1.2", 330 | "ipaddr.js": "1.9.1" 331 | } 332 | }, 333 | "qs": { 334 | "version": "6.7.0", 335 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 336 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 337 | }, 338 | "range-parser": { 339 | "version": "1.2.1", 340 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 341 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 342 | }, 343 | "raw-body": { 344 | "version": "2.4.0", 345 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 346 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 347 | "requires": { 348 | "bytes": "3.1.0", 349 | "http-errors": "1.7.2", 350 | "iconv-lite": "0.4.24", 351 | "unpipe": "1.0.0" 352 | } 353 | }, 354 | "safe-buffer": { 355 | "version": "5.1.2", 356 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 357 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 358 | }, 359 | "safer-buffer": { 360 | "version": "2.1.2", 361 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 362 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 363 | }, 364 | "send": { 365 | "version": "0.17.1", 366 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 367 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 368 | "requires": { 369 | "debug": "2.6.9", 370 | "depd": "~1.1.2", 371 | "destroy": "~1.0.4", 372 | "encodeurl": "~1.0.2", 373 | "escape-html": "~1.0.3", 374 | "etag": "~1.8.1", 375 | "fresh": "0.5.2", 376 | "http-errors": "~1.7.2", 377 | "mime": "1.6.0", 378 | "ms": "2.1.1", 379 | "on-finished": "~2.3.0", 380 | "range-parser": "~1.2.1", 381 | "statuses": "~1.5.0" 382 | }, 383 | "dependencies": { 384 | "ms": { 385 | "version": "2.1.1", 386 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 387 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 388 | } 389 | } 390 | }, 391 | "serve-static": { 392 | "version": "1.14.1", 393 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 394 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 395 | "requires": { 396 | "encodeurl": "~1.0.2", 397 | "escape-html": "~1.0.3", 398 | "parseurl": "~1.3.3", 399 | "send": "0.17.1" 400 | } 401 | }, 402 | "setprototypeof": { 403 | "version": "1.1.1", 404 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 405 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 406 | }, 407 | "statuses": { 408 | "version": "1.5.0", 409 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 410 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 411 | }, 412 | "toidentifier": { 413 | "version": "1.0.0", 414 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 415 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 416 | }, 417 | "type-is": { 418 | "version": "1.6.18", 419 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 420 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 421 | "requires": { 422 | "media-typer": "0.3.0", 423 | "mime-types": "~2.1.24" 424 | } 425 | }, 426 | "unpipe": { 427 | "version": "1.0.0", 428 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 429 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 430 | }, 431 | "utils-merge": { 432 | "version": "1.0.1", 433 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 434 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 435 | }, 436 | "vary": { 437 | "version": "1.1.2", 438 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 439 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 440 | } 441 | } 442 | } 443 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescipt-express-boiler", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "tsc", 8 | "local": "ts-node ./src/server.ts", 9 | "dev": "npm run build && NODE_ENV=development node build/server.js", 10 | "stage": "npm run build && NODE_ENV=staging node build/server.js" 11 | }, 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "express": "^4.17.1" 16 | }, 17 | "devDependencies": { 18 | "@types/express": "^4.17.2" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/api/controllers/UserContoller.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response, NextFunction } from 'express'; 2 | import UserService from '../services/UserService'; 3 | 4 | export class UserController { 5 | public static getUserProfileData(req: Request, res: Response, next: NextFunction) { 6 | try { 7 | const data = UserService.userProfileData(); 8 | res.send(data).status(200); 9 | } catch (e) { 10 | throw e; 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/api/routes/index.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response, Application } from 'express'; 2 | import v1 from './v1'; 3 | export class Routes { 4 | 5 | public routes(app: Application): void { 6 | app.route('/_status') 7 | .get((req: Request, res: Response) => { 8 | res.status(200).send('Healthy!!!'); 9 | }); 10 | app.use('/v1', v1); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/api/routes/v1/index.ts: -------------------------------------------------------------------------------- 1 | import * as express from 'express'; 2 | import user from './user'; 3 | 4 | const router = express.Router(); 5 | router.use('/user', user); 6 | 7 | export default router; 8 | -------------------------------------------------------------------------------- /src/api/routes/v1/user/index.ts: -------------------------------------------------------------------------------- 1 | import * as express from 'express'; 2 | import { UserController } from '../../../controllers/UserContoller'; 3 | const router = express.Router(); 4 | 5 | router.get('/profile', UserController.getUserProfileData); 6 | 7 | export default router; 8 | -------------------------------------------------------------------------------- /src/api/services/UserService.ts: -------------------------------------------------------------------------------- 1 | 2 | interface IUserData { 3 | name: string, 4 | id: number 5 | } 6 | 7 | interface IUserService { 8 | userProfileData() : IUserData 9 | } 10 | 11 | class UserService implements IUserService { 12 | public userProfileData() : IUserData { 13 | try { 14 | return { 15 | name: 'Rishabh', 16 | id: 1820 17 | } 18 | } catch (e) { 19 | throw e; 20 | } 21 | } 22 | } 23 | 24 | export default new UserService(); -------------------------------------------------------------------------------- /src/app.ts: -------------------------------------------------------------------------------- 1 | import express, { Application, Request, Response, NextFunction } from 'express'; 2 | import bodyParser from 'body-parser'; 3 | import { Routes } from './api/routes'; 4 | 5 | class App { 6 | public app: Application; 7 | public routePrv: Routes = new Routes(); 8 | 9 | constructor() { 10 | this.app = express(); 11 | this.config(); 12 | this.routePrv.routes(this.app); 13 | 14 | } 15 | 16 | private config(): void { 17 | this.app.use((req: Request, res: Response, next: NextFunction) => { 18 | res.header('Access-Control-Allow-Origin', '*'); 19 | res.header('Access-Control-Allow-Methods', 'GET,POST,DELETE,OPTIONS,PUT'); 20 | res.header('Access-Control-Allow-Headers', '*'); 21 | next(); 22 | }); 23 | this.app.use(bodyParser.json()); 24 | this.app.use(bodyParser.urlencoded({ extended: false })); 25 | } 26 | } 27 | 28 | export default new App().app; -------------------------------------------------------------------------------- /src/server.ts: -------------------------------------------------------------------------------- 1 | import app from './app'; 2 | 3 | const port = 3000; 4 | 5 | app.listen(port, () => { 6 | console.log(`App Started on ${port}`); 7 | }); 8 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ 5 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 6 | "sourceMap": true, /* Generates corresponding '.map' file. */ 7 | "outDir": "./build", /* Redirect output structure to the directory. */ 8 | "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 9 | "strict": true, /* Enable all strict type-checking options. */ 10 | "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 11 | "baseUrl": "./src", /* Base directory to resolve non-absolute module names. */ 12 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 13 | "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ 14 | "resolveJsonModule": true /* Enable to load json file as an object. */ 15 | }, 16 | "include": [ 17 | "src/**/*" 18 | ], 19 | "exclude": [ 20 | "node_modules" 21 | ] 22 | } 23 | --------------------------------------------------------------------------------