├── .DS_Store ├── .gitignore ├── README.md ├── handler.js ├── package-lock.json ├── package.json ├── serverless.yml └── src ├── index.js └── user └── routes.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mguay22/express-serverless-api/ef79a05ec4611f3ed03a56f3437f6c0ea4251de1/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # express-serverless-api 2 | -------------------------------------------------------------------------------- /handler.js: -------------------------------------------------------------------------------- 1 | const awsServerlessExpress = require('aws-serverless-express'); 2 | const app = require('./src/index'); 3 | 4 | const server = awsServerlessExpress.createServer(app); 5 | 6 | exports.handler = (event, context) => { 7 | return awsServerlessExpress.proxy(server, event, context); 8 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.7", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 11 | "requires": { 12 | "mime-types": "~2.1.24", 13 | "negotiator": "0.6.2" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 20 | }, 21 | "aws-serverless-express": { 22 | "version": "3.3.8", 23 | "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.3.8.tgz", 24 | "integrity": "sha512-2TQdF5EhxnAtGeEi+wSi2M3xCfpiemuImnpU7HKih3onH0izJ/G2tkM+gwcGHZEsW/gLWFl/JjQAYGa3fILfvw==", 25 | "requires": { 26 | "binary-case": "^1.0.0", 27 | "type-is": "^1.6.16" 28 | } 29 | }, 30 | "binary-case": { 31 | "version": "1.1.4", 32 | "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz", 33 | "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg==" 34 | }, 35 | "body-parser": { 36 | "version": "1.19.0", 37 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 38 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 39 | "requires": { 40 | "bytes": "3.1.0", 41 | "content-type": "~1.0.4", 42 | "debug": "2.6.9", 43 | "depd": "~1.1.2", 44 | "http-errors": "1.7.2", 45 | "iconv-lite": "0.4.24", 46 | "on-finished": "~2.3.0", 47 | "qs": "6.7.0", 48 | "raw-body": "2.4.0", 49 | "type-is": "~1.6.17" 50 | } 51 | }, 52 | "bytes": { 53 | "version": "3.1.0", 54 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 55 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 56 | }, 57 | "content-disposition": { 58 | "version": "0.5.3", 59 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 60 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 61 | "requires": { 62 | "safe-buffer": "5.1.2" 63 | } 64 | }, 65 | "content-type": { 66 | "version": "1.0.4", 67 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 68 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 69 | }, 70 | "cookie": { 71 | "version": "0.4.0", 72 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 73 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 74 | }, 75 | "cookie-signature": { 76 | "version": "1.0.6", 77 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 78 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 79 | }, 80 | "cors": { 81 | "version": "2.8.5", 82 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 83 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 84 | "requires": { 85 | "object-assign": "^4", 86 | "vary": "^1" 87 | } 88 | }, 89 | "debug": { 90 | "version": "2.6.9", 91 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 92 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 93 | "requires": { 94 | "ms": "2.0.0" 95 | } 96 | }, 97 | "depd": { 98 | "version": "1.1.2", 99 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 100 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 101 | }, 102 | "destroy": { 103 | "version": "1.0.4", 104 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 105 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 106 | }, 107 | "ee-first": { 108 | "version": "1.1.1", 109 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 110 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 111 | }, 112 | "encodeurl": { 113 | "version": "1.0.2", 114 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 115 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 116 | }, 117 | "escape-html": { 118 | "version": "1.0.3", 119 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 120 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 121 | }, 122 | "etag": { 123 | "version": "1.8.1", 124 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 125 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 126 | }, 127 | "express": { 128 | "version": "4.17.1", 129 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 130 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 131 | "requires": { 132 | "accepts": "~1.3.7", 133 | "array-flatten": "1.1.1", 134 | "body-parser": "1.19.0", 135 | "content-disposition": "0.5.3", 136 | "content-type": "~1.0.4", 137 | "cookie": "0.4.0", 138 | "cookie-signature": "1.0.6", 139 | "debug": "2.6.9", 140 | "depd": "~1.1.2", 141 | "encodeurl": "~1.0.2", 142 | "escape-html": "~1.0.3", 143 | "etag": "~1.8.1", 144 | "finalhandler": "~1.1.2", 145 | "fresh": "0.5.2", 146 | "merge-descriptors": "1.0.1", 147 | "methods": "~1.1.2", 148 | "on-finished": "~2.3.0", 149 | "parseurl": "~1.3.3", 150 | "path-to-regexp": "0.1.7", 151 | "proxy-addr": "~2.0.5", 152 | "qs": "6.7.0", 153 | "range-parser": "~1.2.1", 154 | "safe-buffer": "5.1.2", 155 | "send": "0.17.1", 156 | "serve-static": "1.14.1", 157 | "setprototypeof": "1.1.1", 158 | "statuses": "~1.5.0", 159 | "type-is": "~1.6.18", 160 | "utils-merge": "1.0.1", 161 | "vary": "~1.1.2" 162 | } 163 | }, 164 | "finalhandler": { 165 | "version": "1.1.2", 166 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 167 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 168 | "requires": { 169 | "debug": "2.6.9", 170 | "encodeurl": "~1.0.2", 171 | "escape-html": "~1.0.3", 172 | "on-finished": "~2.3.0", 173 | "parseurl": "~1.3.3", 174 | "statuses": "~1.5.0", 175 | "unpipe": "~1.0.0" 176 | } 177 | }, 178 | "forwarded": { 179 | "version": "0.1.2", 180 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 181 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 182 | }, 183 | "fresh": { 184 | "version": "0.5.2", 185 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 186 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 187 | }, 188 | "http-errors": { 189 | "version": "1.7.2", 190 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 191 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 192 | "requires": { 193 | "depd": "~1.1.2", 194 | "inherits": "2.0.3", 195 | "setprototypeof": "1.1.1", 196 | "statuses": ">= 1.5.0 < 2", 197 | "toidentifier": "1.0.0" 198 | } 199 | }, 200 | "iconv-lite": { 201 | "version": "0.4.24", 202 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 203 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 204 | "requires": { 205 | "safer-buffer": ">= 2.1.2 < 3" 206 | } 207 | }, 208 | "inherits": { 209 | "version": "2.0.3", 210 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 211 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 212 | }, 213 | "ipaddr.js": { 214 | "version": "1.9.1", 215 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 216 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 217 | }, 218 | "media-typer": { 219 | "version": "0.3.0", 220 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 221 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 222 | }, 223 | "merge-descriptors": { 224 | "version": "1.0.1", 225 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 226 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 227 | }, 228 | "methods": { 229 | "version": "1.1.2", 230 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 231 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 232 | }, 233 | "mime": { 234 | "version": "1.6.0", 235 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 236 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 237 | }, 238 | "mime-db": { 239 | "version": "1.44.0", 240 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 241 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 242 | }, 243 | "mime-types": { 244 | "version": "2.1.27", 245 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 246 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 247 | "requires": { 248 | "mime-db": "1.44.0" 249 | } 250 | }, 251 | "ms": { 252 | "version": "2.0.0", 253 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 254 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 255 | }, 256 | "negotiator": { 257 | "version": "0.6.2", 258 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 259 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 260 | }, 261 | "object-assign": { 262 | "version": "4.1.1", 263 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 264 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 265 | }, 266 | "on-finished": { 267 | "version": "2.3.0", 268 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 269 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 270 | "requires": { 271 | "ee-first": "1.1.1" 272 | } 273 | }, 274 | "parseurl": { 275 | "version": "1.3.3", 276 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 277 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 278 | }, 279 | "path-to-regexp": { 280 | "version": "0.1.7", 281 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 282 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 283 | }, 284 | "proxy-addr": { 285 | "version": "2.0.6", 286 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 287 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 288 | "requires": { 289 | "forwarded": "~0.1.2", 290 | "ipaddr.js": "1.9.1" 291 | } 292 | }, 293 | "qs": { 294 | "version": "6.7.0", 295 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 296 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 297 | }, 298 | "range-parser": { 299 | "version": "1.2.1", 300 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 301 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 302 | }, 303 | "raw-body": { 304 | "version": "2.4.0", 305 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 306 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 307 | "requires": { 308 | "bytes": "3.1.0", 309 | "http-errors": "1.7.2", 310 | "iconv-lite": "0.4.24", 311 | "unpipe": "1.0.0" 312 | } 313 | }, 314 | "safe-buffer": { 315 | "version": "5.1.2", 316 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 317 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 318 | }, 319 | "safer-buffer": { 320 | "version": "2.1.2", 321 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 322 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 323 | }, 324 | "send": { 325 | "version": "0.17.1", 326 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 327 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 328 | "requires": { 329 | "debug": "2.6.9", 330 | "depd": "~1.1.2", 331 | "destroy": "~1.0.4", 332 | "encodeurl": "~1.0.2", 333 | "escape-html": "~1.0.3", 334 | "etag": "~1.8.1", 335 | "fresh": "0.5.2", 336 | "http-errors": "~1.7.2", 337 | "mime": "1.6.0", 338 | "ms": "2.1.1", 339 | "on-finished": "~2.3.0", 340 | "range-parser": "~1.2.1", 341 | "statuses": "~1.5.0" 342 | }, 343 | "dependencies": { 344 | "ms": { 345 | "version": "2.1.1", 346 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 347 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 348 | } 349 | } 350 | }, 351 | "serve-static": { 352 | "version": "1.14.1", 353 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 354 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 355 | "requires": { 356 | "encodeurl": "~1.0.2", 357 | "escape-html": "~1.0.3", 358 | "parseurl": "~1.3.3", 359 | "send": "0.17.1" 360 | } 361 | }, 362 | "setprototypeof": { 363 | "version": "1.1.1", 364 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 365 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 366 | }, 367 | "statuses": { 368 | "version": "1.5.0", 369 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 370 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 371 | }, 372 | "toidentifier": { 373 | "version": "1.0.0", 374 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 375 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 376 | }, 377 | "type-is": { 378 | "version": "1.6.18", 379 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 380 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 381 | "requires": { 382 | "media-typer": "0.3.0", 383 | "mime-types": "~2.1.24" 384 | } 385 | }, 386 | "unpipe": { 387 | "version": "1.0.0", 388 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 389 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 390 | }, 391 | "utils-merge": { 392 | "version": "1.0.1", 393 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 394 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 395 | }, 396 | "vary": { 397 | "version": "1.1.2", 398 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 399 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 400 | } 401 | } 402 | } 403 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Michael Guay", 10 | "license": "ISC", 11 | "dependencies": { 12 | "aws-serverless-express": "^3.3.8", 13 | "body-parser": "^1.19.0", 14 | "cors": "^2.8.5", 15 | "express": "^4.17.1" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | # Welcome to Serverless! 2 | # 3 | # This file is the main config file for your service. 4 | # It's very minimal at this point and uses default values. 5 | # You can always add more config options for more control. 6 | # We've included some commented out config examples here. 7 | # Just uncomment any of them to get that config option. 8 | # 9 | # For full config options, check the docs: 10 | # docs.serverless.com 11 | # 12 | # Happy Coding! 13 | 14 | service: api 15 | # app and org for use with dashboard.serverless.com 16 | #app: your-app-name 17 | #org: your-org-name 18 | 19 | # You can pin your service to only deploy with a specific Serverless version 20 | # Check out our docs for more details 21 | # frameworkVersion: "=X.X.X" 22 | 23 | provider: 24 | name: aws 25 | runtime: nodejs12.x 26 | 27 | # you can overwrite defaults here 28 | # stage: dev 29 | # region: us-east-1 30 | 31 | # you can add statements to the Lambda function's IAM Role here 32 | # iamRoleStatements: 33 | # - Effect: "Allow" 34 | # Action: 35 | # - "s3:ListBucket" 36 | # Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ] } 37 | # - Effect: "Allow" 38 | # Action: 39 | # - "s3:PutObject" 40 | # Resource: 41 | # Fn::Join: 42 | # - "" 43 | # - - "arn:aws:s3:::" 44 | # - "Ref" : "ServerlessDeploymentBucket" 45 | # - "/*" 46 | 47 | # you can define service wide environment variables here 48 | # environment: 49 | # variable1: value1 50 | 51 | # you can add packaging information here 52 | #package: 53 | # include: 54 | # - include-me.js 55 | # - include-me-dir/** 56 | # exclude: 57 | # - exclude-me.js 58 | # - exclude-me-dir/** 59 | 60 | functions: 61 | app-api: 62 | handler: handler.handler 63 | events: 64 | - http: 65 | path: / 66 | method: get 67 | cors: true 68 | - http: 69 | path: /{proxy+} 70 | method: any 71 | cors: true 72 | # The following are a few example events you can configure 73 | # NOTE: Please make sure to change your handler code to work with those events 74 | # Check the event documentation for details 75 | # events: 76 | # - http: 77 | # path: users/create 78 | # method: get 79 | # - websocket: $connect 80 | # - s3: ${env:BUCKET} 81 | # - schedule: rate(10 minutes) 82 | # - sns: greeter-topic 83 | # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000 84 | # - alexaSkill: amzn1.ask.skill.xx-xx-xx-xx 85 | # - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx 86 | # - iot: 87 | # sql: "SELECT * FROM 'some_topic'" 88 | # - cloudwatchEvent: 89 | # event: 90 | # source: 91 | # - "aws.ec2" 92 | # detail-type: 93 | # - "EC2 Instance State-change Notification" 94 | # detail: 95 | # state: 96 | # - pending 97 | # - cloudwatchLog: '/aws/lambda/hello' 98 | # - cognitoUserPool: 99 | # pool: MyUserPool 100 | # trigger: PreSignUp 101 | # - alb: 102 | # listenerArn: arn:aws:elasticloadbalancing:us-east-1:XXXXXX:listener/app/my-load-balancer/50dc6c495c0c9188/ 103 | # priority: 1 104 | # conditions: 105 | # host: example.com 106 | # path: /hello 107 | 108 | # Define function environment variables here 109 | # environment: 110 | # variable2: value2 111 | 112 | # you can add CloudFormation resource templates here 113 | #resources: 114 | # Resources: 115 | # NewResource: 116 | # Type: AWS::S3::Bucket 117 | # Properties: 118 | # BucketName: my-new-bucket 119 | # Outputs: 120 | # NewOutput: 121 | # Description: "Description for the output" 122 | # Value: "Some output value" 123 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const bodyParser = require('body-parser'); 3 | const cors = require('cors'); 4 | 5 | const { 6 | routes: userRoutes, 7 | } = require('./user/routes'); 8 | 9 | const app = express(); 10 | 11 | app.use(cors()); 12 | app.use(bodyParser.json()); 13 | app.use('/user', userRoutes); 14 | 15 | module.exports = app; -------------------------------------------------------------------------------- /src/user/routes.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | 3 | const routes = express.Router({ 4 | mergeParams: true 5 | }); 6 | 7 | routes.get('/', (req, res) => { 8 | res.status(200).json({}); 9 | }); 10 | 11 | module.exports = { 12 | routes, 13 | }; 14 | 15 | --------------------------------------------------------------------------------