├── firebase.json ├── .firebaserc ├── functions ├── src │ └── index.ts ├── tsconfig.json ├── package.json └── yarn.lock ├── LICENSE ├── .gitignore └── README.md /firebase.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "functions-typescript" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /functions/src/index.ts: -------------------------------------------------------------------------------- 1 | var functions = require('firebase-functions'); 2 | 3 | // // Create and Deploy Your First Cloud Functions 4 | // // https://firebase.google.com/docs/functions/write-firebase-functions 5 | // 6 | exports.helloWorld = functions.https.onRequest((request, response) => { 7 | response.send("Hello from Firebase!\n\n"); 8 | }); 9 | -------------------------------------------------------------------------------- /functions/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["es6", "es2015.promise"], 4 | "module": "commonjs", 5 | "noImplicitAny": false, 6 | "outDir": "", 7 | "sourceMap": true, 8 | "target": "es5", 9 | "typeRoots": [ 10 | "node_modules/@types" 11 | ] 12 | }, 13 | "include": [ 14 | "src/**/*.ts", 15 | "spec/**/*.ts" 16 | ] 17 | } -------------------------------------------------------------------------------- /functions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Cloud Functions for Firebase", 4 | "dependencies": { 5 | "firebase-admin": "~4.2.1", 6 | "firebase-functions": "^0.5.7" 7 | }, 8 | "devDependencies": { 9 | "typescript": "^2.3.2" 10 | }, 11 | "scripts": { 12 | "build": "tsc", 13 | "watch": "tsc --watch", 14 | "deploy": "tsc && firebase deploy --only functions" 15 | }, 16 | "private": true 17 | } 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Sarah Allen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | ## ignore generated JavaScript files 40 | functions/**/*.js 41 | functions/**/*.js.map 42 | 43 | # Typescript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Cloud Functions for Firebase: getting started with TypeScript 2 | 3 | This is an example Firebase project for using TypeScript with 4 | [Cloud Functions for Firebase](https://firebase.google.com/products/functions) 5 | 6 | Pre-requistes: 7 | 8 | ``` 9 | npm install -g firebase-tools 10 | ``` 11 | 12 | Also, I highly recommend using [yarn](https://yarnpkg.com), 13 | which locks the versions of your npm modules. I also like to use 14 | [homebrew](https://brew.sh/) to install dependencies on the Mac. These aren't 15 | required for Cloud Functions or Firebase, but are used in the instructions. 16 | 17 | ``` 18 | brew install yarn 19 | ``` 20 | 21 | 22 | Steps: 23 | 24 | 1. Create a project in the [Firebase Console](https://console.firebase.google.com/) 25 | in this example, I called mine `functions-typescript` 26 | 2. Create a directory for your project and do the following steps inside that 27 | directory, for example: 28 | ``` 29 | mkdir firebase-functions-typescript 30 | cd firebase-functions-typescript 31 | ``` 32 | 2. Then to set up the firebase project 33 | ``` 34 | firebase init 35 | ``` 36 | 3. You will be prompted to select the Firebase project you just created in the 37 | Console UI and choose which Firebase features you want to use. Select 38 | Functions and whatever other features you want to use, then type "n" when 39 | prompted to install dependencies with npm: 40 | ``` 41 | You're about to initialize a Firebase project in this directory: 42 | 43 | /Users/.../functions-typescript 44 | 45 | ? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter 46 | to confirm your choices. Functions: Configure and deploy Cloud Functions 47 | 48 | === Project Setup 49 | 50 | First, let's associate this project directory with a Firebase project. 51 | You can create multiple project aliases by running firebase use --add, 52 | but for now we'll just set up a default project. 53 | 54 | i .firebaserc already has a default project, skipping 55 | 56 | === Functions Setup 57 | 58 | A functions directory will be created in your project with a Node.js 59 | package pre-configured. Functions can be deployed with firebase deploy. 60 | 61 | ✔ Wrote functions/package.json 62 | ✔ Wrote functions/index.js 63 | ? Do you want to install dependencies with npm now? No 64 | 65 | i Writing configuration info to firebase.json... 66 | i Writing project information to .firebaserc... 67 | 68 | ✔ Firebase initialization complete! 69 | ``` 70 | 4. create a `src` directory and move index.js into it (changing the suffix) 71 | ``` 72 | cd functions 73 | mkdir src 74 | mv index.js src/index.ts 75 | ``` 76 | 5. add the following dev dependencies and scripts to functions/package.json 77 | ``` 78 | "devDependencies": { 79 | "typescript": "^2.3.2" 80 | }, 81 | "scripts": { 82 | "build": "tsc", 83 | "watch": "tsc --watch", 84 | "deploy": "tsc && firebase deploy --only functions" 85 | }, 86 | ``` 87 | 6. install dependencies with yarn (still in `functions` directory) 88 | ``` 89 | yarn install 90 | ``` 91 | 7. create a `tsconfig.json` file: 92 | ``` 93 | { 94 | "compilerOptions": { 95 | "lib": ["es6", "es2015.promise"], 96 | "module": "commonjs", 97 | "noImplicitAny": false, 98 | "outDir": "", 99 | "sourceMap": true, 100 | "target": "es5", 101 | "typeRoots": [ 102 | "node_modules/@types" 103 | ] 104 | }, 105 | "include": [ 106 | "src/**/*.ts", 107 | "spec/**/*.ts" 108 | ] 109 | } 110 | ``` 111 | 8. I like to exclude node_modules and compiled js files from git, so 112 | I add this to a root level `.gitignore` file 113 | ``` 114 | node_modules/ 115 | jspm_packages/ 116 | 117 | ## ignore generated JavaScript files 118 | functions/**/*.js 119 | functions/**/*.js.map 120 | 121 | ``` 122 | 9. in `index.ts` remove comments around the sample function (and 123 | add a couple of newlines to make the output easier to see): 124 | ``` 125 | exports.helloWorld = functions.https.onRequest((request, response) => { 126 | response.send("Hello from Firebase!\n\n"); 127 | }); 128 | ``` 129 | 9. in `functions` directory, use the npm build script created 130 | above to build TypeScript files and deploy: 131 | ``` 132 | npm run deploy 133 | ``` 134 | You will see a bunch of output and at the end it will show you the URL for your deployed function. 135 | 10. test YOUR function with curl. For mine I can do this: 136 | ``` 137 | curl https://us-central1-functions-typescript.cloudfunctions.net/helloWorld 138 | ``` 139 | 140 | Now start developing in TypeScript! 141 | 142 | Initial steps were based on [nice article](https://medium.com/@wcandillon/writing-cloud-functions-with-typescript-61d86e282752) by [@wcandillon](https://twitter.com/wcandillon) which 143 | -------------------------------------------------------------------------------- /functions/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/express-serve-static-core@*": 6 | version "4.0.45" 7 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.45.tgz#71bb1f87d7187482d0d8851f5b294458e1c78667" 8 | dependencies: 9 | "@types/node" "*" 10 | 11 | "@types/express@^4.0.33": 12 | version "4.0.35" 13 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.35.tgz#6267c7b60a51fac473467b3c4a02cd1e441805fe" 14 | dependencies: 15 | "@types/express-serve-static-core" "*" 16 | "@types/serve-static" "*" 17 | 18 | "@types/jsonwebtoken@^7.1.32", "@types/jsonwebtoken@^7.1.33": 19 | version "7.2.0" 20 | resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-7.2.0.tgz#0fed32c8501da80ac9839d2d403a65c83d776ffd" 21 | dependencies: 22 | "@types/node" "*" 23 | 24 | "@types/lodash@^4.14.34": 25 | version "4.14.64" 26 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.64.tgz#979cf3a3d4a368670840bf9b3e448dc33ffe84ee" 27 | 28 | "@types/mime@*": 29 | version "0.0.29" 30 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b" 31 | 32 | "@types/node@*": 33 | version "7.0.22" 34 | resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.22.tgz#4593f4d828bdd612929478ea40c67b4f403ca255" 35 | 36 | "@types/serve-static@*": 37 | version "1.7.31" 38 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.31.tgz#15456de8d98d6b4cff31be6c6af7492ae63f521a" 39 | dependencies: 40 | "@types/express-serve-static-core" "*" 41 | "@types/mime" "*" 42 | 43 | "@types/sha1@^1.1.0": 44 | version "1.1.0" 45 | resolved "https://registry.yarnpkg.com/@types/sha1/-/sha1-1.1.0.tgz#461eb18906d25e8d07c4678a0ed4f9ca07e46dd9" 46 | dependencies: 47 | "@types/node" "*" 48 | 49 | accepts@~1.3.3: 50 | version "1.3.3" 51 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" 52 | dependencies: 53 | mime-types "~2.1.11" 54 | negotiator "0.6.1" 55 | 56 | array-flatten@1.1.1: 57 | version "1.1.1" 58 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 59 | 60 | base64url@2.0.0, base64url@^2.0.0: 61 | version "2.0.0" 62 | resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" 63 | 64 | buffer-equal-constant-time@1.0.1: 65 | version "1.0.1" 66 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 67 | 68 | "charenc@>= 0.0.1": 69 | version "0.0.2" 70 | resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" 71 | 72 | content-disposition@0.5.2: 73 | version "0.5.2" 74 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 75 | 76 | content-type@~1.0.2: 77 | version "1.0.2" 78 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" 79 | 80 | cookie-signature@1.0.6: 81 | version "1.0.6" 82 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 83 | 84 | cookie@0.3.1: 85 | version "0.3.1" 86 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 87 | 88 | "crypt@>= 0.0.1": 89 | version "0.0.2" 90 | resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" 91 | 92 | debug@2.6.7: 93 | version "2.6.7" 94 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" 95 | dependencies: 96 | ms "2.0.0" 97 | 98 | depd@1.1.0, depd@~1.1.0: 99 | version "1.1.0" 100 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" 101 | 102 | destroy@~1.0.4: 103 | version "1.0.4" 104 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 105 | 106 | ecdsa-sig-formatter@1.0.9: 107 | version "1.0.9" 108 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" 109 | dependencies: 110 | base64url "^2.0.0" 111 | safe-buffer "^5.0.1" 112 | 113 | ee-first@1.1.1: 114 | version "1.1.1" 115 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 116 | 117 | encodeurl@~1.0.1: 118 | version "1.0.1" 119 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" 120 | 121 | escape-html@~1.0.3: 122 | version "1.0.3" 123 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 124 | 125 | etag@~1.8.0: 126 | version "1.8.0" 127 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" 128 | 129 | express@^4.0.33: 130 | version "4.15.3" 131 | resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" 132 | dependencies: 133 | accepts "~1.3.3" 134 | array-flatten "1.1.1" 135 | content-disposition "0.5.2" 136 | content-type "~1.0.2" 137 | cookie "0.3.1" 138 | cookie-signature "1.0.6" 139 | debug "2.6.7" 140 | depd "~1.1.0" 141 | encodeurl "~1.0.1" 142 | escape-html "~1.0.3" 143 | etag "~1.8.0" 144 | finalhandler "~1.0.3" 145 | fresh "0.5.0" 146 | merge-descriptors "1.0.1" 147 | methods "~1.1.2" 148 | on-finished "~2.3.0" 149 | parseurl "~1.3.1" 150 | path-to-regexp "0.1.7" 151 | proxy-addr "~1.1.4" 152 | qs "6.4.0" 153 | range-parser "~1.2.0" 154 | send "0.15.3" 155 | serve-static "1.12.3" 156 | setprototypeof "1.0.3" 157 | statuses "~1.3.1" 158 | type-is "~1.6.15" 159 | utils-merge "1.0.0" 160 | vary "~1.1.1" 161 | 162 | faye-websocket@0.9.3: 163 | version "0.9.3" 164 | resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.9.3.tgz#482a505b0df0ae626b969866d3bd740cdb962e83" 165 | dependencies: 166 | websocket-driver ">=0.5.1" 167 | 168 | finalhandler@~1.0.3: 169 | version "1.0.3" 170 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" 171 | dependencies: 172 | debug "2.6.7" 173 | encodeurl "~1.0.1" 174 | escape-html "~1.0.3" 175 | on-finished "~2.3.0" 176 | parseurl "~1.3.1" 177 | statuses "~1.3.1" 178 | unpipe "~1.0.0" 179 | 180 | firebase-admin@~4.2.1: 181 | version "4.2.1" 182 | resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-4.2.1.tgz#91794bfc214ee21decc765d308411166a05c0b20" 183 | dependencies: 184 | "@types/jsonwebtoken" "^7.1.33" 185 | faye-websocket "0.9.3" 186 | jsonwebtoken "7.1.9" 187 | 188 | firebase-functions@^0.5.7: 189 | version "0.5.7" 190 | resolved "https://registry.yarnpkg.com/firebase-functions/-/firebase-functions-0.5.7.tgz#e0310817a2aac3a657f1802b32949c2749c0ee22" 191 | dependencies: 192 | "@types/express" "^4.0.33" 193 | "@types/jsonwebtoken" "^7.1.32" 194 | "@types/lodash" "^4.14.34" 195 | "@types/sha1" "^1.1.0" 196 | express "^4.0.33" 197 | jsonwebtoken "^7.1.9" 198 | lodash "^4.6.1" 199 | sha1 "^1.1.1" 200 | 201 | forwarded@~0.1.0: 202 | version "0.1.0" 203 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" 204 | 205 | fresh@0.5.0: 206 | version "0.5.0" 207 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" 208 | 209 | hoek@2.x.x: 210 | version "2.16.3" 211 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 212 | 213 | http-errors@~1.6.1: 214 | version "1.6.1" 215 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" 216 | dependencies: 217 | depd "1.1.0" 218 | inherits "2.0.3" 219 | setprototypeof "1.0.3" 220 | statuses ">= 1.3.1 < 2" 221 | 222 | inherits@2.0.3: 223 | version "2.0.3" 224 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 225 | 226 | ipaddr.js@1.3.0: 227 | version "1.3.0" 228 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" 229 | 230 | isemail@1.x.x: 231 | version "1.2.0" 232 | resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" 233 | 234 | joi@^6.10.1: 235 | version "6.10.1" 236 | resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" 237 | dependencies: 238 | hoek "2.x.x" 239 | isemail "1.x.x" 240 | moment "2.x.x" 241 | topo "1.x.x" 242 | 243 | jsonwebtoken@7.1.9, jsonwebtoken@^7.1.9: 244 | version "7.1.9" 245 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.1.9.tgz#847804e5258bec5a9499a8dc4a5e7a3bae08d58a" 246 | dependencies: 247 | joi "^6.10.1" 248 | jws "^3.1.3" 249 | lodash.once "^4.0.0" 250 | ms "^0.7.1" 251 | xtend "^4.0.1" 252 | 253 | jwa@^1.1.4: 254 | version "1.1.5" 255 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" 256 | dependencies: 257 | base64url "2.0.0" 258 | buffer-equal-constant-time "1.0.1" 259 | ecdsa-sig-formatter "1.0.9" 260 | safe-buffer "^5.0.1" 261 | 262 | jws@^3.1.3: 263 | version "3.1.4" 264 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" 265 | dependencies: 266 | base64url "^2.0.0" 267 | jwa "^1.1.4" 268 | safe-buffer "^5.0.1" 269 | 270 | lodash.once@^4.0.0: 271 | version "4.1.1" 272 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 273 | 274 | lodash@^4.6.1: 275 | version "4.17.4" 276 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 277 | 278 | media-typer@0.3.0: 279 | version "0.3.0" 280 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 281 | 282 | merge-descriptors@1.0.1: 283 | version "1.0.1" 284 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 285 | 286 | methods@~1.1.2: 287 | version "1.1.2" 288 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 289 | 290 | mime-db@~1.27.0: 291 | version "1.27.0" 292 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" 293 | 294 | mime-types@~2.1.11, mime-types@~2.1.15: 295 | version "2.1.15" 296 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" 297 | dependencies: 298 | mime-db "~1.27.0" 299 | 300 | mime@1.3.4: 301 | version "1.3.4" 302 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 303 | 304 | moment@2.x.x: 305 | version "2.18.1" 306 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" 307 | 308 | ms@2.0.0: 309 | version "2.0.0" 310 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 311 | 312 | ms@^0.7.1: 313 | version "0.7.3" 314 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" 315 | 316 | negotiator@0.6.1: 317 | version "0.6.1" 318 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 319 | 320 | on-finished@~2.3.0: 321 | version "2.3.0" 322 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 323 | dependencies: 324 | ee-first "1.1.1" 325 | 326 | parseurl@~1.3.1: 327 | version "1.3.1" 328 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" 329 | 330 | path-to-regexp@0.1.7: 331 | version "0.1.7" 332 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 333 | 334 | proxy-addr@~1.1.4: 335 | version "1.1.4" 336 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" 337 | dependencies: 338 | forwarded "~0.1.0" 339 | ipaddr.js "1.3.0" 340 | 341 | qs@6.4.0: 342 | version "6.4.0" 343 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 344 | 345 | range-parser@~1.2.0: 346 | version "1.2.0" 347 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 348 | 349 | safe-buffer@^5.0.1: 350 | version "5.0.1" 351 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 352 | 353 | send@0.15.3: 354 | version "0.15.3" 355 | resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" 356 | dependencies: 357 | debug "2.6.7" 358 | depd "~1.1.0" 359 | destroy "~1.0.4" 360 | encodeurl "~1.0.1" 361 | escape-html "~1.0.3" 362 | etag "~1.8.0" 363 | fresh "0.5.0" 364 | http-errors "~1.6.1" 365 | mime "1.3.4" 366 | ms "2.0.0" 367 | on-finished "~2.3.0" 368 | range-parser "~1.2.0" 369 | statuses "~1.3.1" 370 | 371 | serve-static@1.12.3: 372 | version "1.12.3" 373 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" 374 | dependencies: 375 | encodeurl "~1.0.1" 376 | escape-html "~1.0.3" 377 | parseurl "~1.3.1" 378 | send "0.15.3" 379 | 380 | setprototypeof@1.0.3: 381 | version "1.0.3" 382 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 383 | 384 | sha1@^1.1.1: 385 | version "1.1.1" 386 | resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" 387 | dependencies: 388 | charenc ">= 0.0.1" 389 | crypt ">= 0.0.1" 390 | 391 | "statuses@>= 1.3.1 < 2", statuses@~1.3.1: 392 | version "1.3.1" 393 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 394 | 395 | topo@1.x.x: 396 | version "1.1.0" 397 | resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" 398 | dependencies: 399 | hoek "2.x.x" 400 | 401 | type-is@~1.6.15: 402 | version "1.6.15" 403 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" 404 | dependencies: 405 | media-typer "0.3.0" 406 | mime-types "~2.1.15" 407 | 408 | typescript@^2.3.2: 409 | version "2.3.3" 410 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.3.tgz#9639f3c3b40148e8ca97fe08a51dd1891bb6be22" 411 | 412 | unpipe@~1.0.0: 413 | version "1.0.0" 414 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 415 | 416 | utils-merge@1.0.0: 417 | version "1.0.0" 418 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" 419 | 420 | vary@~1.1.1: 421 | version "1.1.1" 422 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" 423 | 424 | websocket-driver@>=0.5.1: 425 | version "0.6.5" 426 | resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" 427 | dependencies: 428 | websocket-extensions ">=0.1.1" 429 | 430 | websocket-extensions@>=0.1.1: 431 | version "0.1.1" 432 | resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" 433 | 434 | xtend@^4.0.1: 435 | version "4.0.1" 436 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 437 | --------------------------------------------------------------------------------