├── .gitignore ├── LICENSE ├── README.md ├── config.js.example ├── dogs.json ├── firebase └── .gitignore ├── package-lock.json ├── package.json ├── routes.js └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | config.js 2 | node_modules 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Kim Maida for Auth0 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Node.js Firebase + Auth0 Authentication Server 2 | 3 | > Follow this tutorial to learn how to authenticate a Node.js server and Angular app with Cloud Firestore database using Auth0: [How to Authenticate Firebase and Angular with Auth0](https://auth0.com/blog/how-to-authenticate-firebase-and-angular-with-auth0-part-1/). 4 | 5 | This is an implementation of a Node server that enables authentication of [Firebase](https://firebase.google.com/) after a user has logged into an app with [Auth0](https://auth0.com). 6 | 7 | The user should log into Auth0 on the client. The client app should then call the secure `/auth/firebase` endpoint to acquire a Firebase token, which can be used to securely access Firebase real-time databases in the client app. 8 | 9 | (The proposed use of this server is to build an app that will display dog information and allow people to comment on the dog breeds in real-time using Firebase.) 10 | 11 | ## Dependencies 12 | 13 | You must have: 14 | 15 | * [Node.js and npm](https://nodejs.org) installed 16 | * An [Auth0](https://auth0.com) account with a [Client app](https://manage.auth0.com/#/clients) 17 | * An [Auth0 API](https://manage.auth0.com/#/apis) with a name, identifier `http://localhost:1337/`, and algorithm `RS256` 18 | * A [client-facing application](https://auth0.com/docs/quickstarts) where users can log in with Auth0 19 | * A [Firebase project](https://console.firebase.google.com/u/0/) with [security enabled](https://firebase.google.com/docs/database/security/quickstart#sample-rules) for Real-Time Database 20 | * A [Service Account](https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk) for your Firebase project with a **private key** generated (should download as a `.json` file) 21 | 22 | ## Setup 23 | 24 | Clone this repository and run: 25 | 26 | ``` 27 | $ npm install 28 | ``` 29 | 30 | Download the private key JSON file from your Firebase [Service Account](https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk) to this project's `/firebase` folder. 31 | 32 | Remove the `.example` extension from the `config.js.example` file and add the appropriate configuration to the file. 33 | 34 | To start the webserver, run: 35 | 36 | ``` 37 | $ node server 38 | ``` 39 | 40 | The server will be available in the browser at `http://localhost:1337`. Accessing the `/auth/firebase` route requires an Auth0 access token, acquired and sent as an `Authorization` header (`Bearer` type) by your client application with the HTTP request. 41 | 42 | ## Endpoints 43 | 44 | ### /auth/firebase (protected) 45 | 46 | This protected endpoint will return: 47 | 48 | ``` 49 | { 50 | firebaseToken: {Custom Firebase Token object} 51 | } 52 | ``` 53 | 54 | ### /api/dogs (public) 55 | 56 | This public endpoint returns an array of the 10 most popular dogs in the US in 2016, ranked by the AKC. The data takes the following shape: 57 | 58 | ``` 59 | [ 60 | { 61 | "breed": string, 62 | "rank": number (1-10), 63 | "image": string (URL to CC0 Creative Commons image) 64 | }, 65 | ... 66 | ] 67 | ``` 68 | 69 | ### /api/dog/:rank (protected) 70 | 71 | This protected endpoint returns a single dog object of the `rank` specified in the request parameters. The data takes the following shape: 72 | 73 | ``` 74 | { 75 | "breed": string, 76 | "rank": number (1-10), 77 | "description": string, 78 | "personality": string, 79 | "energy": string, 80 | "group": string, 81 | "image": string (URL to CC0 Creative Commons image), 82 | "link": string (URL to AKC breed information) 83 | } 84 | ``` 85 | 86 | ## License 87 | 88 | [MIT](LICENSE) 89 | -------------------------------------------------------------------------------- /config.js.example: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | AUTH0_DOMAIN: '', // e.g., you.auth0.com 3 | AUTH0_API_AUDIENCE: '', // e.g., http://localhost:1337/ 4 | FIREBASE_KEY: './firebase/', // e.g., your-project-firebase-adminsdk-xxxxx-xxxxxxxxxx.json 5 | FIREBASE_DB: '' // e.g., https://your-project.firebaseio.com 6 | }; 7 | -------------------------------------------------------------------------------- /dogs.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "breed": "Labrador Retriever", 4 | "rank": 1, 5 | "description": "The gentle, intelligent and family-friendly Labrador Retriever from Canada continues to be the most popular breed in the United States, according to AKC registration statistics. This versatile hunting breed comes in three colors - yellow, black and chocolate - and because of their desire to please their master they excel as guide dogs for the blind, as part of search-and-rescue teams or in narcotics detection with law enforcement.", 6 | "personality": "Friendly and outgoing, Labs play well with others", 7 | "energy": "Very Active; Labs are high-spirited and not afraid to show it.", 8 | "group": "Sporting", 9 | "image": "https://cdn.auth0.com/blog/firebase-auth0/labrador-retriever.jpg", 10 | "link": "http://www.akc.org/dog-breeds/labrador-retriever/" 11 | }, 12 | { 13 | "breed": "German Shepherd Dog", 14 | "rank": 2, 15 | "description": "Generally considered dogdom's finest all-purpose workers, German Shepherd Dogs are large, agile, muscular dogs of noble spirit and high intelligence. For such deep-chested, solid dogs, they move quickly with great nimbleness afoot. The German Shepherd's natural gait is a free-and-easy trot, but when duty calls they can turn it up a notch or two and reach great speeds. Standing as high as 26 inches at the shoulder and built like a brick doghouse, the German Shepherd Dog when viewed in outline presents a picture of smooth, graceful curves rather than angles.", 16 | "personality": "Smart, confident, courageous, and steady; a true dog lover's dog", 17 | "energy": "Very Active; These big guys were born to work; they require regular mental and physical exercise.", 18 | "group": "Herding", 19 | "image": "https://cdn.auth0.com/blog/firebase-auth0/german-shepherd-dog.jpg", 20 | "link": "http://www.akc.org/dog-breeds/german-shepherd-dog/" 21 | }, 22 | { 23 | "breed": "Golden Retriever", 24 | "rank": 3, 25 | "description": "It’s not surprising that Golden Retrievers are one of the most popular dog breeds in the United States. Along with being exuberant and friendly, they are strong dogs and hard workers. Goldens are good at whatever they do, be it hunting, serving as guide dogs, working search-and-rescue, or being devoted companions. Though they are serious about their work, they also enjoy being downright silly!", 26 | "personality": "Intelligent, friendly, and devoted.", 27 | "energy": "Very Active; This dog is active and energetic, and needs daily exercise.", 28 | "group": "Sporting", 29 | "image": "https://cdn.auth0.com/blog/firebase-auth0/golden-retriever.jpg", 30 | "link": "http://www.akc.org/dog-breeds/golden-retriever/" 31 | }, 32 | { 33 | "breed": "Bulldog", 34 | "rank": 4, 35 | "description": "Known for their loose-jointed, shuffling gait and massive, short-faced head, the Bulldog is known to be equable, resolute and dignified. A medium-sized dog, they are not your typical lap dog, but would like to be! They are one of the most popular breeds according to AKC® Registration Statistics due to their lovable and gentle dispositions and adorable wrinkles. The Bulldog may be brindle, white, red, fawn, fallow or piebald.", 36 | "personality": "Calm, courageous, and friendly; dignified but amusing.", 37 | "energy": "Not Very Active; Bulldogs won't beg to be exercised, but they require regular walks and the occasional romp.", 38 | "group": "Non Sporting", 39 | "image": "https://cdn.auth0.com/blog/firebase-auth0/bulldog.jpg", 40 | "link": "http://www.akc.org/dog-breeds/bulldog/" 41 | }, 42 | { 43 | "breed": "Beagle", 44 | "rank": 5, 45 | "description": "Not only are Beagles excellent hunting dogs and loyal companions, they are also happy-go-lucky, funny, and—thanks to their pleading expression—cute. They were bred to hunt in packs, so they enjoy the company of other dogs and of people as well. Beagles love to follow their noses, which can sometimes get them into sticky situations. These dogs are solid, sturdy, and fairly easy to care for, but they do need to run around and let off steam.", 46 | "personality": "Merry, friendly, and curious", 47 | "energy": "Very Active; This quick, energetic and compact hound dog needs plenty of exercise.", 48 | "group": "Hound", 49 | "image": "https://cdn.auth0.com/blog/firebase-auth0/beagle.jpg", 50 | "link": "http://www.akc.org/dog-breeds/beagle/" 51 | }, 52 | { 53 | "breed": "French Bulldog", 54 | "rank": 6, 55 | "description": "This affectionate and playful breed—known for its wrinkly, smushy face and bat-like ears—is a great companion for single pet-owners as well as families with young children. They need little exercise and grooming and are incredibly loyal to their people. Because of their somewhat stubborn nature, they require a bit of patience during training but are incredibly intelligent and eager to please.", 56 | "personality": "Playful, smart, adaptable, and completely irresistible", 57 | "energy": "Not Very Active; Frenchies are easygoing, not terribly athletic; brisk walks will keep them trim.", 58 | "group": "Non Sporting", 59 | "image": "https://cdn.auth0.com/blog/firebase-auth0/french-bulldog.jpg", 60 | "link": "http://www.akc.org/dog-breeds/french-bulldog/" 61 | }, 62 | { 63 | "breed": "Poodle", 64 | "rank": 7, 65 | "description": "The Poodle, though often equated to the beauty with no brains, is exceptionally smart, active and excels in obedience training. The breed comes in three size varieties, which may contribute to why Poodle is one of the most popular breeds according to AKC® Registration statistics. Poodles can be a variety of solid colors, including white, black, apricot and gray, but never parti-colored.", 66 | "personality": "Proud, active and very smart.", 67 | "energy": "Very Active; Poodles are enthusiastic walkers, runners, and swimmers. They're eager for all kinds of activity, and they enjoy keeping busy.", 68 | "group": "Non Sporting", 69 | "image": "https://cdn.auth0.com/blog/firebase-auth0/poodle.jpg", 70 | "link": "http://www.akc.org/dog-breeds/poodle/" 71 | }, 72 | { 73 | "breed": "Rottweiler", 74 | "rank": 8, 75 | "description": "Robust and powerful, the Rottweiler is happiest when given a job to perform. His intelligence, endurance and willingness to work make him suitable as a police dog, herder, service dog, therapy dog, obedience competitor and devoted companion. An inherent protector, the Rottweiler is self-confident and responds quietly and with a wait-and-see attitude to influences in his environment. He must be medium in size and his coat is black with rust to mahogany markings.", 76 | "personality": "Reserved with strangers and affectionate and loyal with his family.", 77 | "energy": "The Rottie needs at least two solid workouts daily; he would really appreciate it if these always included you! ", 78 | "group": "Working", 79 | "image": "https://cdn.auth0.com/blog/firebase-auth0/rottweiler.jpg", 80 | "link": "http://www.akc.org/dog-breeds/rottweiler/" 81 | }, 82 | { 83 | "breed": "Yorkshire Terrier", 84 | "rank": 9, 85 | "description": "Yorkshire Terriers, affectionately known as \"Yorkies,\" offer big personalities in a small package. Though members of the Toy Group, they are terriers by nature and are brave, determined, investigative and energetic. Named for the English county from which they originally hail, Yorkshire Terriers were used in the nineteenth century to catch rats in clothing mills. Surprisingly enough, in its beginnings, the Yorkie belonged to the working class, especially the weavers; in fact, facetious comments were often made about how the dogs' fine, silky coats were the ultimate product of the looms. Eventually, the breed left the workforce and became a companion animal to families of European high society.", 86 | "personality": "Sprightly, tomboyish, and affectionate", 87 | "energy": "Somewhat Active; Yorkies are moderately active and will be happy with a daily satisfying walk.", 88 | "group": "Toy", 89 | "image": "https://cdn.auth0.com/blog/firebase-auth0/yorkshire-terrier.jpg", 90 | "link": "http://www.akc.org/dog-breeds/yorkshire-terrier/" 91 | }, 92 | { 93 | "breed": "Boxer", 94 | "rank": 10, 95 | "description": "A well-conditioned Boxer is an awesome sight. A male can stand as high as 25 inches at the shoulder, females a little shorter. Their muscles ripple beneath their short, tight-fitting coat. The dark brown eyes and wrinkled forehead give the face an alert, curious look. Boxers move like the athletes they’re named for: smooth and graceful, but powerful. The coat can be fawn (tan to mahogany-red) or brindle (kind of like tiger stripes), with white markings.", 96 | "personality": "Fun-loving, bright, active and loyal", 97 | "energy": "Very Active; Boxers are strong, quick, busy dogs who need plenty of exercise; they enjoy challenges, both physical and mental.", 98 | "group": "Working", 99 | "image": "https://cdn.auth0.com/blog/firebase-auth0/boxer.jpg", 100 | "link": "http://www.akc.org/dog-breeds/boxer/" 101 | } 102 | ] 103 | -------------------------------------------------------------------------------- /firebase/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | */ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firebase-auth0-nodeserver", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@firebase/app": { 8 | "version": "0.1.3", 9 | "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.1.3.tgz", 10 | "integrity": "sha512-6fUnuPMMnctCybf6QktUifKmS3/GPrp8LRcM1/pS/CjEu+RULU+6wRBBtHIxIK+PTZ18Zfuw7rgAYI2E9Rx5HQ==", 11 | "requires": { 12 | "@firebase/util": "0.1.3" 13 | } 14 | }, 15 | "@firebase/database": { 16 | "version": "0.1.4", 17 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.1.4.tgz", 18 | "integrity": "sha512-qUkcWTZcN5anNxpF251LL0kqnaQQkc6lKzthzKlp41PIoan/PbEduJ7mDitoT/BIk0lwid+di+ibY58TEQ6t2g==", 19 | "requires": { 20 | "@firebase/util": "0.1.3", 21 | "faye-websocket": "0.11.1" 22 | } 23 | }, 24 | "@firebase/util": { 25 | "version": "0.1.3", 26 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.1.3.tgz", 27 | "integrity": "sha512-rnLhQN6q/uk15Zi4dNqYel6uowlqPeL35FLqyyVDaoMLZDigIy/bwlM0KaBGToR+FcJ6X3BFFm/9WC0wnFQ7YQ==" 28 | }, 29 | "@google-cloud/common": { 30 | "version": "0.14.0", 31 | "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.14.0.tgz", 32 | "integrity": "sha1-xWA4KXJH6nKnUNUUVegBcQl2rEM=", 33 | "requires": { 34 | "array-uniq": "1.0.3", 35 | "arrify": "1.0.1", 36 | "concat-stream": "1.6.0", 37 | "create-error-class": "3.0.2", 38 | "duplexify": "3.5.1", 39 | "ent": "2.2.0", 40 | "extend": "3.0.1", 41 | "google-auto-auth": "0.7.2", 42 | "is": "3.2.1", 43 | "log-driver": "1.2.5", 44 | "methmeth": "1.1.0", 45 | "modelo": "4.2.0", 46 | "request": "2.83.0", 47 | "retry-request": "3.3.0", 48 | "split-array-stream": "1.0.3", 49 | "stream-events": "1.0.2", 50 | "string-format-obj": "1.1.0", 51 | "through2": "2.0.3" 52 | } 53 | }, 54 | "@google-cloud/common-grpc": { 55 | "version": "0.4.3", 56 | "resolved": "https://registry.npmjs.org/@google-cloud/common-grpc/-/common-grpc-0.4.3.tgz", 57 | "integrity": "sha512-A3nErp1qV8iCWPYQniBhot7Gx+kZHTAuRzOQyoPpfbv9pLmsvZgTWzVUg1/R1ncrirQElHUDhIFXPV+kr+UJAA==", 58 | "requires": { 59 | "@google-cloud/common": "0.13.6", 60 | "dot-prop": "2.4.0", 61 | "duplexify": "3.5.1", 62 | "extend": "3.0.1", 63 | "grpc": "1.7.2", 64 | "is": "3.2.1", 65 | "modelo": "4.2.0", 66 | "retry-request": "3.3.0", 67 | "through2": "2.0.3" 68 | }, 69 | "dependencies": { 70 | "@google-cloud/common": { 71 | "version": "0.13.6", 72 | "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.6.tgz", 73 | "integrity": "sha1-qdjhN7xCmkSrqWif5qDkMxeE+FM=", 74 | "requires": { 75 | "array-uniq": "1.0.3", 76 | "arrify": "1.0.1", 77 | "concat-stream": "1.6.0", 78 | "create-error-class": "3.0.2", 79 | "duplexify": "3.5.1", 80 | "ent": "2.2.0", 81 | "extend": "3.0.1", 82 | "google-auto-auth": "0.7.2", 83 | "is": "3.2.1", 84 | "log-driver": "1.2.5", 85 | "methmeth": "1.1.0", 86 | "modelo": "4.2.0", 87 | "request": "2.83.0", 88 | "retry-request": "3.3.0", 89 | "split-array-stream": "1.0.3", 90 | "stream-events": "1.0.2", 91 | "string-format-obj": "1.1.0", 92 | "through2": "2.0.3" 93 | } 94 | } 95 | } 96 | }, 97 | "@google-cloud/firestore": { 98 | "version": "0.10.0", 99 | "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-0.10.0.tgz", 100 | "integrity": "sha512-MshvoX8AsDUb/3dSKyNZPsZvL9LkowtTe02vxR798TGm7JPXqp0yGJkGSoRb/XvuVDYMRanQs8G7tKHytWWIiA==", 101 | "requires": { 102 | "@google-cloud/common": "0.14.0", 103 | "@google-cloud/common-grpc": "0.4.3", 104 | "bun": "0.0.12", 105 | "extend": "3.0.1", 106 | "functional-red-black-tree": "1.0.1", 107 | "google-gax": "0.14.2", 108 | "grpc": "1.7.2", 109 | "is": "3.2.1", 110 | "safe-buffer": "5.1.1", 111 | "through2": "2.0.3" 112 | } 113 | }, 114 | "@google-cloud/storage": { 115 | "version": "1.5.1", 116 | "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.5.1.tgz", 117 | "integrity": "sha512-7yaYzFWQYgi+n1dw/i5ysgzHD3ACJndxR8CbFnunQNT3NduolYSTr5WbYwWdhN5/7QiKx9g+obgP4tVz904bXw==", 118 | "requires": { 119 | "@google-cloud/common": "0.15.1", 120 | "arrify": "1.0.1", 121 | "async": "2.6.0", 122 | "concat-stream": "1.6.0", 123 | "create-error-class": "3.0.2", 124 | "duplexify": "3.5.1", 125 | "extend": "3.0.1", 126 | "gcs-resumable-upload": "0.8.2", 127 | "hash-stream-validation": "0.2.1", 128 | "is": "3.2.1", 129 | "mime-types": "2.1.17", 130 | "once": "1.4.0", 131 | "pumpify": "1.3.5", 132 | "request": "2.83.0", 133 | "safe-buffer": "5.1.1", 134 | "snakeize": "0.1.0", 135 | "stream-events": "1.0.2", 136 | "string-format-obj": "1.1.0", 137 | "through2": "2.0.3" 138 | }, 139 | "dependencies": { 140 | "@google-cloud/common": { 141 | "version": "0.15.1", 142 | "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.15.1.tgz", 143 | "integrity": "sha512-cnVtHLvyiSQvb1RzXWDp7PA1sA8Jmc47+wp/xwHwdGOlQZfKog5iluZ0C/LB8iklFXpcTwlNMorqLuZ/qH0DDA==", 144 | "requires": { 145 | "array-uniq": "1.0.3", 146 | "arrify": "1.0.1", 147 | "concat-stream": "1.6.0", 148 | "create-error-class": "3.0.2", 149 | "duplexify": "3.5.1", 150 | "ent": "2.2.0", 151 | "extend": "3.0.1", 152 | "google-auto-auth": "0.8.1", 153 | "is": "3.2.1", 154 | "log-driver": "1.2.5", 155 | "methmeth": "1.1.0", 156 | "modelo": "4.2.0", 157 | "request": "2.83.0", 158 | "retry-request": "3.3.0", 159 | "split-array-stream": "1.0.3", 160 | "stream-events": "1.0.2", 161 | "string-format-obj": "1.1.0", 162 | "through2": "2.0.3" 163 | } 164 | }, 165 | "async": { 166 | "version": "2.6.0", 167 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", 168 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", 169 | "requires": { 170 | "lodash": "4.17.4" 171 | } 172 | }, 173 | "google-auth-library": { 174 | "version": "0.12.0", 175 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.12.0.tgz", 176 | "integrity": "sha512-79qCXtJ1VweBmmLr4yLq9S4clZB2p5Y+iACvuKk9gu4JitEnPc+bQFmYvtCYehVR44MQzD1J8DVmYW2w677IEw==", 177 | "requires": { 178 | "gtoken": "1.2.3", 179 | "jws": "3.1.4", 180 | "lodash.isstring": "4.0.1", 181 | "lodash.merge": "4.6.0", 182 | "request": "2.83.0" 183 | } 184 | }, 185 | "google-auto-auth": { 186 | "version": "0.8.1", 187 | "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.8.1.tgz", 188 | "integrity": "sha512-v5a4mHIkhvbtKNILxnOYgOw+cin/jfLR0pEj1ids2jn9p0OyxYUXjSJbCEciuAorQao9Y55w0zJIc8yW1rIPaA==", 189 | "requires": { 190 | "async": "2.6.0", 191 | "gcp-metadata": "0.3.1", 192 | "google-auth-library": "0.12.0", 193 | "request": "2.83.0" 194 | } 195 | }, 196 | "lodash": { 197 | "version": "4.17.4", 198 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 199 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 200 | } 201 | } 202 | }, 203 | "@protobufjs/aspromise": { 204 | "version": "1.1.2", 205 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 206 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 207 | }, 208 | "@protobufjs/base64": { 209 | "version": "1.1.2", 210 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 211 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 212 | }, 213 | "@protobufjs/codegen": { 214 | "version": "2.0.4", 215 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 216 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 217 | }, 218 | "@protobufjs/eventemitter": { 219 | "version": "1.1.0", 220 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 221 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 222 | }, 223 | "@protobufjs/fetch": { 224 | "version": "1.1.0", 225 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 226 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 227 | "requires": { 228 | "@protobufjs/aspromise": "1.1.2", 229 | "@protobufjs/inquire": "1.1.0" 230 | } 231 | }, 232 | "@protobufjs/float": { 233 | "version": "1.0.2", 234 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 235 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 236 | }, 237 | "@protobufjs/inquire": { 238 | "version": "1.1.0", 239 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 240 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 241 | }, 242 | "@protobufjs/path": { 243 | "version": "1.1.2", 244 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 245 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 246 | }, 247 | "@protobufjs/pool": { 248 | "version": "1.1.0", 249 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 250 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 251 | }, 252 | "@protobufjs/utf8": { 253 | "version": "1.1.0", 254 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 255 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 256 | }, 257 | "@types/body-parser": { 258 | "version": "1.16.8", 259 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz", 260 | "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==", 261 | "requires": { 262 | "@types/express": "4.0.39", 263 | "@types/node": "8.0.55" 264 | } 265 | }, 266 | "@types/express": { 267 | "version": "4.0.39", 268 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.0.39.tgz", 269 | "integrity": "sha512-dBUam7jEjyuEofigUXCtublUHknRZvcRgITlGsTbFgPvnTwtQUt2NgLakbsf+PsGo/Nupqr3IXCYsOpBpofyrA==", 270 | "requires": { 271 | "@types/body-parser": "1.16.8", 272 | "@types/express-serve-static-core": "4.0.57", 273 | "@types/serve-static": "1.13.1" 274 | } 275 | }, 276 | "@types/express-jwt": { 277 | "version": "0.0.34", 278 | "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.34.tgz", 279 | "integrity": "sha1-/b7kxq9cCiRu8qkz9VGZc8dxfwI=", 280 | "requires": { 281 | "@types/express": "4.0.39", 282 | "@types/express-unless": "0.0.32" 283 | } 284 | }, 285 | "@types/express-serve-static-core": { 286 | "version": "4.0.57", 287 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.0.57.tgz", 288 | "integrity": "sha512-QLAHjdLwEICm3thVbXSKRoisjfgMVI4xJH/HU8F385BR2HI7PmM6ax4ELXf8Du6sLmSpySXMYaI+xc//oQ/IFw==", 289 | "requires": { 290 | "@types/node": "8.0.55" 291 | } 292 | }, 293 | "@types/express-unless": { 294 | "version": "0.0.32", 295 | "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.0.32.tgz", 296 | "integrity": "sha512-6YpJyFNlDDnPnRjMOvJCoDYlSDDmG/OEEUsPk7yhNkL4G9hUYtgab6vi1CcWsGSSSM0CsvNlWTG+ywAGnvF03g==", 297 | "requires": { 298 | "@types/express": "4.0.39" 299 | } 300 | }, 301 | "@types/google-cloud__storage": { 302 | "version": "1.1.6", 303 | "resolved": "https://registry.npmjs.org/@types/google-cloud__storage/-/google-cloud__storage-1.1.6.tgz", 304 | "integrity": "sha512-X/hXFBpcnrfUjm6Q+9wTqVOlxKY5vC5aFMB4AIOnpuIhWmksJ5uVwry9Tr60buoYmeWbBGtx5JRWACJK9MhC+Q==", 305 | "requires": { 306 | "@types/node": "8.0.55" 307 | } 308 | }, 309 | "@types/jsonwebtoken": { 310 | "version": "7.2.3", 311 | "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-7.2.3.tgz", 312 | "integrity": "sha512-cVhxZfVCyTZd1P+2a+xXSR9to7hZTulNRLLCQMVfAevUqx2Ee+EgsiD/7pX8qvdXWP3nWgSoTjKRLMrIpdPVjQ==", 313 | "requires": { 314 | "@types/node": "8.0.55" 315 | } 316 | }, 317 | "@types/long": { 318 | "version": "3.0.32", 319 | "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", 320 | "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" 321 | }, 322 | "@types/mime": { 323 | "version": "2.0.0", 324 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", 325 | "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" 326 | }, 327 | "@types/node": { 328 | "version": "8.0.55", 329 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.55.tgz", 330 | "integrity": "sha512-K8w0FWNsIRcw615d/Et90wMRvLfg8XH1T77fC0xObbusE3+eXwnitdoF9j0CS9zBt8A57J/TKgRVe7RX9ZlT1g==" 331 | }, 332 | "@types/serve-static": { 333 | "version": "1.13.1", 334 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.1.tgz", 335 | "integrity": "sha512-jDMH+3BQPtvqZVIcsH700Dfi8Q3MIcEx16g/VdxjoqiGR/NntekB10xdBpirMKnPe9z2C5cBmL0vte0YttOr3Q==", 336 | "requires": { 337 | "@types/express-serve-static-core": "4.0.57", 338 | "@types/mime": "2.0.0" 339 | } 340 | }, 341 | "accepts": { 342 | "version": "1.3.4", 343 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", 344 | "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", 345 | "requires": { 346 | "mime-types": "2.1.17", 347 | "negotiator": "0.6.1" 348 | } 349 | }, 350 | "ajv": { 351 | "version": "5.5.1", 352 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.1.tgz", 353 | "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=", 354 | "requires": { 355 | "co": "4.6.0", 356 | "fast-deep-equal": "1.0.0", 357 | "fast-json-stable-stringify": "2.0.0", 358 | "json-schema-traverse": "0.3.1" 359 | } 360 | }, 361 | "ansi-regex": { 362 | "version": "2.1.1", 363 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 364 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 365 | }, 366 | "arguejs": { 367 | "version": "0.2.3", 368 | "resolved": "https://registry.npmjs.org/arguejs/-/arguejs-0.2.3.tgz", 369 | "integrity": "sha1-tvk59f4OPNHz+T4qqSYkJL8xKvc=" 370 | }, 371 | "array-flatten": { 372 | "version": "1.1.1", 373 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 374 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 375 | }, 376 | "array-union": { 377 | "version": "1.0.2", 378 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 379 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 380 | "requires": { 381 | "array-uniq": "1.0.3" 382 | } 383 | }, 384 | "array-uniq": { 385 | "version": "1.0.3", 386 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 387 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" 388 | }, 389 | "arrify": { 390 | "version": "1.0.1", 391 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 392 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" 393 | }, 394 | "ascli": { 395 | "version": "1.0.1", 396 | "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", 397 | "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", 398 | "requires": { 399 | "colour": "0.7.1", 400 | "optjs": "3.2.2" 401 | } 402 | }, 403 | "asn1": { 404 | "version": "0.2.3", 405 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 406 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 407 | }, 408 | "assert-plus": { 409 | "version": "1.0.0", 410 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 411 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 412 | }, 413 | "async": { 414 | "version": "1.5.2", 415 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 416 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 417 | }, 418 | "asynckit": { 419 | "version": "0.4.0", 420 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 421 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 422 | }, 423 | "aws-sign2": { 424 | "version": "0.7.0", 425 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 426 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 427 | }, 428 | "aws4": { 429 | "version": "1.6.0", 430 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 431 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 432 | }, 433 | "balanced-match": { 434 | "version": "1.0.0", 435 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 436 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 437 | }, 438 | "base64url": { 439 | "version": "2.0.0", 440 | "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", 441 | "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" 442 | }, 443 | "bcrypt-pbkdf": { 444 | "version": "1.0.1", 445 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 446 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 447 | "optional": true, 448 | "requires": { 449 | "tweetnacl": "0.14.5" 450 | } 451 | }, 452 | "body-parser": { 453 | "version": "1.18.2", 454 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 455 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 456 | "requires": { 457 | "bytes": "3.0.0", 458 | "content-type": "1.0.4", 459 | "debug": "2.6.9", 460 | "depd": "1.1.1", 461 | "http-errors": "1.6.2", 462 | "iconv-lite": "0.4.19", 463 | "on-finished": "2.3.0", 464 | "qs": "6.5.1", 465 | "raw-body": "2.3.2", 466 | "type-is": "1.6.15" 467 | } 468 | }, 469 | "boom": { 470 | "version": "4.3.1", 471 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", 472 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", 473 | "requires": { 474 | "hoek": "4.2.0" 475 | }, 476 | "dependencies": { 477 | "hoek": { 478 | "version": "4.2.0", 479 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", 480 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" 481 | } 482 | } 483 | }, 484 | "brace-expansion": { 485 | "version": "1.1.8", 486 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 487 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 488 | "requires": { 489 | "balanced-match": "1.0.0", 490 | "concat-map": "0.0.1" 491 | } 492 | }, 493 | "buffer-equal": { 494 | "version": "1.0.0", 495 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", 496 | "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" 497 | }, 498 | "buffer-equal-constant-time": { 499 | "version": "1.0.1", 500 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 501 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 502 | }, 503 | "bun": { 504 | "version": "0.0.12", 505 | "resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz", 506 | "integrity": "sha512-Toms18J9DqnT+IfWkwxVTB2EaBprHvjlMWrTIsfX4xbu3ZBqVBwrERU0em1IgtRe04wT+wJxMlKHZok24hrcSQ==", 507 | "requires": { 508 | "readable-stream": "1.0.34" 509 | }, 510 | "dependencies": { 511 | "isarray": { 512 | "version": "0.0.1", 513 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 514 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 515 | }, 516 | "readable-stream": { 517 | "version": "1.0.34", 518 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 519 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 520 | "requires": { 521 | "core-util-is": "1.0.2", 522 | "inherits": "2.0.3", 523 | "isarray": "0.0.1", 524 | "string_decoder": "0.10.31" 525 | } 526 | }, 527 | "string_decoder": { 528 | "version": "0.10.31", 529 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 530 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 531 | } 532 | } 533 | }, 534 | "bytebuffer": { 535 | "version": "5.0.1", 536 | "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", 537 | "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", 538 | "requires": { 539 | "long": "3.2.0" 540 | } 541 | }, 542 | "bytes": { 543 | "version": "3.0.0", 544 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 545 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 546 | }, 547 | "camelcase": { 548 | "version": "2.1.1", 549 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 550 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 551 | }, 552 | "capture-stack-trace": { 553 | "version": "1.0.0", 554 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", 555 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" 556 | }, 557 | "caseless": { 558 | "version": "0.12.0", 559 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 560 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 561 | }, 562 | "cliui": { 563 | "version": "3.2.0", 564 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 565 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 566 | "requires": { 567 | "string-width": "1.0.2", 568 | "strip-ansi": "3.0.1", 569 | "wrap-ansi": "2.1.0" 570 | } 571 | }, 572 | "co": { 573 | "version": "4.6.0", 574 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 575 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 576 | }, 577 | "code-point-at": { 578 | "version": "1.1.0", 579 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 580 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 581 | }, 582 | "colour": { 583 | "version": "0.7.1", 584 | "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", 585 | "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" 586 | }, 587 | "combined-stream": { 588 | "version": "1.0.5", 589 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 590 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 591 | "requires": { 592 | "delayed-stream": "1.0.0" 593 | } 594 | }, 595 | "concat-map": { 596 | "version": "0.0.1", 597 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 598 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 599 | }, 600 | "concat-stream": { 601 | "version": "1.6.0", 602 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 603 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 604 | "requires": { 605 | "inherits": "2.0.3", 606 | "readable-stream": "2.3.3", 607 | "typedarray": "0.0.6" 608 | } 609 | }, 610 | "configstore": { 611 | "version": "3.1.1", 612 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", 613 | "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", 614 | "requires": { 615 | "dot-prop": "4.2.0", 616 | "graceful-fs": "4.1.11", 617 | "make-dir": "1.1.0", 618 | "unique-string": "1.0.0", 619 | "write-file-atomic": "2.3.0", 620 | "xdg-basedir": "3.0.0" 621 | }, 622 | "dependencies": { 623 | "dot-prop": { 624 | "version": "4.2.0", 625 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 626 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 627 | "requires": { 628 | "is-obj": "1.0.1" 629 | } 630 | } 631 | } 632 | }, 633 | "content-disposition": { 634 | "version": "0.5.2", 635 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 636 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 637 | }, 638 | "content-type": { 639 | "version": "1.0.4", 640 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 641 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 642 | }, 643 | "cookie": { 644 | "version": "0.3.1", 645 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 646 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 647 | }, 648 | "cookie-signature": { 649 | "version": "1.0.6", 650 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 651 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 652 | }, 653 | "core-util-is": { 654 | "version": "1.0.2", 655 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 656 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 657 | }, 658 | "cors": { 659 | "version": "2.8.4", 660 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", 661 | "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", 662 | "requires": { 663 | "object-assign": "4.1.1", 664 | "vary": "1.1.2" 665 | } 666 | }, 667 | "create-error-class": { 668 | "version": "3.0.2", 669 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 670 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 671 | "requires": { 672 | "capture-stack-trace": "1.0.0" 673 | } 674 | }, 675 | "cryptiles": { 676 | "version": "3.1.2", 677 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", 678 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", 679 | "requires": { 680 | "boom": "5.2.0" 681 | }, 682 | "dependencies": { 683 | "boom": { 684 | "version": "5.2.0", 685 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 686 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 687 | "requires": { 688 | "hoek": "4.2.0" 689 | } 690 | }, 691 | "hoek": { 692 | "version": "4.2.0", 693 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", 694 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" 695 | } 696 | } 697 | }, 698 | "crypto-random-string": { 699 | "version": "1.0.0", 700 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 701 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" 702 | }, 703 | "dashdash": { 704 | "version": "1.14.1", 705 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 706 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 707 | "requires": { 708 | "assert-plus": "1.0.0" 709 | } 710 | }, 711 | "debug": { 712 | "version": "2.6.9", 713 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 714 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 715 | "requires": { 716 | "ms": "2.0.0" 717 | } 718 | }, 719 | "decamelize": { 720 | "version": "1.2.0", 721 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 722 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 723 | }, 724 | "delayed-stream": { 725 | "version": "1.0.0", 726 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 727 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 728 | }, 729 | "depd": { 730 | "version": "1.1.1", 731 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 732 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 733 | }, 734 | "destroy": { 735 | "version": "1.0.4", 736 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 737 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 738 | }, 739 | "dot-prop": { 740 | "version": "2.4.0", 741 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-2.4.0.tgz", 742 | "integrity": "sha1-hI4o9/HVB0DGdHqzywdnBGK2+Jw=", 743 | "requires": { 744 | "is-obj": "1.0.1" 745 | } 746 | }, 747 | "duplexify": { 748 | "version": "3.5.1", 749 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", 750 | "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", 751 | "requires": { 752 | "end-of-stream": "1.4.0", 753 | "inherits": "2.0.3", 754 | "readable-stream": "2.3.3", 755 | "stream-shift": "1.0.0" 756 | } 757 | }, 758 | "ecc-jsbn": { 759 | "version": "0.1.1", 760 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 761 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 762 | "optional": true, 763 | "requires": { 764 | "jsbn": "0.1.1" 765 | } 766 | }, 767 | "ecdsa-sig-formatter": { 768 | "version": "1.0.9", 769 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", 770 | "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", 771 | "requires": { 772 | "base64url": "2.0.0", 773 | "safe-buffer": "5.1.1" 774 | } 775 | }, 776 | "ee-first": { 777 | "version": "1.1.1", 778 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 779 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 780 | }, 781 | "encodeurl": { 782 | "version": "1.0.1", 783 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", 784 | "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" 785 | }, 786 | "end-of-stream": { 787 | "version": "1.4.0", 788 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", 789 | "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", 790 | "requires": { 791 | "once": "1.4.0" 792 | } 793 | }, 794 | "ent": { 795 | "version": "2.2.0", 796 | "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", 797 | "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" 798 | }, 799 | "escape-html": { 800 | "version": "1.0.3", 801 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 802 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 803 | }, 804 | "etag": { 805 | "version": "1.8.1", 806 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 807 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 808 | }, 809 | "express": { 810 | "version": "4.16.2", 811 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", 812 | "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", 813 | "requires": { 814 | "accepts": "1.3.4", 815 | "array-flatten": "1.1.1", 816 | "body-parser": "1.18.2", 817 | "content-disposition": "0.5.2", 818 | "content-type": "1.0.4", 819 | "cookie": "0.3.1", 820 | "cookie-signature": "1.0.6", 821 | "debug": "2.6.9", 822 | "depd": "1.1.1", 823 | "encodeurl": "1.0.1", 824 | "escape-html": "1.0.3", 825 | "etag": "1.8.1", 826 | "finalhandler": "1.1.0", 827 | "fresh": "0.5.2", 828 | "merge-descriptors": "1.0.1", 829 | "methods": "1.1.2", 830 | "on-finished": "2.3.0", 831 | "parseurl": "1.3.2", 832 | "path-to-regexp": "0.1.7", 833 | "proxy-addr": "2.0.2", 834 | "qs": "6.5.1", 835 | "range-parser": "1.2.0", 836 | "safe-buffer": "5.1.1", 837 | "send": "0.16.1", 838 | "serve-static": "1.13.1", 839 | "setprototypeof": "1.1.0", 840 | "statuses": "1.3.1", 841 | "type-is": "1.6.15", 842 | "utils-merge": "1.0.1", 843 | "vary": "1.1.2" 844 | }, 845 | "dependencies": { 846 | "setprototypeof": { 847 | "version": "1.1.0", 848 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 849 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 850 | }, 851 | "statuses": { 852 | "version": "1.3.1", 853 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 854 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 855 | } 856 | } 857 | }, 858 | "express-jwt": { 859 | "version": "5.3.0", 860 | "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.0.tgz", 861 | "integrity": "sha1-PZDNZYAuYzYlLxnmo98+FJ4MXqA=", 862 | "requires": { 863 | "async": "1.5.2", 864 | "express-unless": "0.3.1", 865 | "jsonwebtoken": "7.4.3", 866 | "lodash.set": "4.3.2" 867 | } 868 | }, 869 | "express-unless": { 870 | "version": "0.3.1", 871 | "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.1.tgz", 872 | "integrity": "sha1-JVfBRudb65A+LSR/m1ugFFJpbiA=" 873 | }, 874 | "extend": { 875 | "version": "3.0.1", 876 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 877 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 878 | }, 879 | "extsprintf": { 880 | "version": "1.3.0", 881 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 882 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 883 | }, 884 | "fast-deep-equal": { 885 | "version": "1.0.0", 886 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", 887 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" 888 | }, 889 | "fast-json-stable-stringify": { 890 | "version": "2.0.0", 891 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 892 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 893 | }, 894 | "faye-websocket": { 895 | "version": "0.11.1", 896 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", 897 | "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", 898 | "requires": { 899 | "websocket-driver": "0.7.0" 900 | } 901 | }, 902 | "finalhandler": { 903 | "version": "1.1.0", 904 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", 905 | "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", 906 | "requires": { 907 | "debug": "2.6.9", 908 | "encodeurl": "1.0.1", 909 | "escape-html": "1.0.3", 910 | "on-finished": "2.3.0", 911 | "parseurl": "1.3.2", 912 | "statuses": "1.3.1", 913 | "unpipe": "1.0.0" 914 | }, 915 | "dependencies": { 916 | "statuses": { 917 | "version": "1.3.1", 918 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 919 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 920 | } 921 | } 922 | }, 923 | "firebase-admin": { 924 | "version": "5.5.1", 925 | "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-5.5.1.tgz", 926 | "integrity": "sha1-uvmMjJw3vWdwor4yW3B1kS1JPpA=", 927 | "requires": { 928 | "@firebase/app": "0.1.3", 929 | "@firebase/database": "0.1.4", 930 | "@google-cloud/firestore": "0.10.0", 931 | "@google-cloud/storage": "1.5.1", 932 | "@types/google-cloud__storage": "1.1.6", 933 | "@types/jsonwebtoken": "7.2.3", 934 | "@types/node": "8.0.55", 935 | "faye-websocket": "0.9.3", 936 | "google-auth-library": "0.10.0", 937 | "jsonwebtoken": "7.4.3", 938 | "node-forge": "0.7.1" 939 | }, 940 | "dependencies": { 941 | "faye-websocket": { 942 | "version": "0.9.3", 943 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", 944 | "integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=", 945 | "requires": { 946 | "websocket-driver": "0.7.0" 947 | } 948 | } 949 | } 950 | }, 951 | "forever-agent": { 952 | "version": "0.6.1", 953 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 954 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 955 | }, 956 | "form-data": { 957 | "version": "2.3.1", 958 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", 959 | "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", 960 | "requires": { 961 | "asynckit": "0.4.0", 962 | "combined-stream": "1.0.5", 963 | "mime-types": "2.1.17" 964 | } 965 | }, 966 | "forwarded": { 967 | "version": "0.1.2", 968 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 969 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 970 | }, 971 | "fresh": { 972 | "version": "0.5.2", 973 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 974 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 975 | }, 976 | "fs.realpath": { 977 | "version": "1.0.0", 978 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 979 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 980 | }, 981 | "functional-red-black-tree": { 982 | "version": "1.0.1", 983 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 984 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" 985 | }, 986 | "gcp-metadata": { 987 | "version": "0.3.1", 988 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.3.1.tgz", 989 | "integrity": "sha512-5kJPX/RXuqoLmHiOOgkSDk/LI0QaXpEvZ3pvQP4ifjGGDKZKVSOjL/GcDjXA5kLxppFCOjmmsu0Uoop9d1upaQ==", 990 | "requires": { 991 | "extend": "3.0.1", 992 | "retry-request": "3.3.0" 993 | } 994 | }, 995 | "gcs-resumable-upload": { 996 | "version": "0.8.2", 997 | "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.8.2.tgz", 998 | "integrity": "sha512-PBl1OFABYxubxfYPh000I0+JLbQzBRtNqxzgxYboIQk2tdw7BvjJ2dVukk3YH4QM6GiUwqItyNqWBuxjLH8GhA==", 999 | "requires": { 1000 | "buffer-equal": "1.0.0", 1001 | "configstore": "3.1.1", 1002 | "google-auto-auth": "0.7.2", 1003 | "pumpify": "1.3.5", 1004 | "request": "2.83.0", 1005 | "stream-events": "1.0.2", 1006 | "through2": "2.0.3" 1007 | } 1008 | }, 1009 | "getpass": { 1010 | "version": "0.1.7", 1011 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1012 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1013 | "requires": { 1014 | "assert-plus": "1.0.0" 1015 | } 1016 | }, 1017 | "glob": { 1018 | "version": "7.1.2", 1019 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1020 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1021 | "requires": { 1022 | "fs.realpath": "1.0.0", 1023 | "inflight": "1.0.6", 1024 | "inherits": "2.0.3", 1025 | "minimatch": "3.0.4", 1026 | "once": "1.4.0", 1027 | "path-is-absolute": "1.0.1" 1028 | } 1029 | }, 1030 | "globby": { 1031 | "version": "6.1.0", 1032 | "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", 1033 | "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", 1034 | "requires": { 1035 | "array-union": "1.0.2", 1036 | "glob": "7.1.2", 1037 | "object-assign": "4.1.1", 1038 | "pify": "2.3.0", 1039 | "pinkie-promise": "2.0.1" 1040 | } 1041 | }, 1042 | "google-auth-library": { 1043 | "version": "0.10.0", 1044 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", 1045 | "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", 1046 | "requires": { 1047 | "gtoken": "1.2.3", 1048 | "jws": "3.1.4", 1049 | "lodash.noop": "3.0.1", 1050 | "request": "2.83.0" 1051 | } 1052 | }, 1053 | "google-auto-auth": { 1054 | "version": "0.7.2", 1055 | "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.2.tgz", 1056 | "integrity": "sha512-ux2n2AE2g3+vcLXwL4dP/M12SFMRX5dzCzBfhAEkTeAB7dpyGdOIEj7nmUx0BHKaCcUQrRWg9kT63X/Mmtk1+A==", 1057 | "requires": { 1058 | "async": "2.6.0", 1059 | "gcp-metadata": "0.3.1", 1060 | "google-auth-library": "0.10.0", 1061 | "request": "2.83.0" 1062 | }, 1063 | "dependencies": { 1064 | "async": { 1065 | "version": "2.6.0", 1066 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", 1067 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", 1068 | "requires": { 1069 | "lodash": "4.17.4" 1070 | } 1071 | }, 1072 | "lodash": { 1073 | "version": "4.17.4", 1074 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1075 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 1076 | } 1077 | } 1078 | }, 1079 | "google-gax": { 1080 | "version": "0.14.2", 1081 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.14.2.tgz", 1082 | "integrity": "sha1-Kx8rhui+mKYgBBzucQ5PTOYbbis=", 1083 | "requires": { 1084 | "extend": "3.0.1", 1085 | "globby": "6.1.0", 1086 | "google-auto-auth": "0.7.2", 1087 | "google-proto-files": "0.13.1", 1088 | "grpc": "1.7.2", 1089 | "is-stream-ended": "0.1.3", 1090 | "lodash": "4.17.4", 1091 | "process-nextick-args": "1.0.7", 1092 | "protobufjs": "6.8.3", 1093 | "readable-stream": "2.3.3", 1094 | "through2": "2.0.3" 1095 | }, 1096 | "dependencies": { 1097 | "lodash": { 1098 | "version": "4.17.4", 1099 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1100 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 1101 | }, 1102 | "protobufjs": { 1103 | "version": "6.8.3", 1104 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.3.tgz", 1105 | "integrity": "sha512-/iQhTYnSniRNmdRF9Kvw8odMSokwNOWVDOmMJjW64+EVE6igcdj/82Op/4MJ/WimgMRNac7gChlSVX4Gep/tHg==", 1106 | "requires": { 1107 | "@protobufjs/aspromise": "1.1.2", 1108 | "@protobufjs/base64": "1.1.2", 1109 | "@protobufjs/codegen": "2.0.4", 1110 | "@protobufjs/eventemitter": "1.1.0", 1111 | "@protobufjs/fetch": "1.1.0", 1112 | "@protobufjs/float": "1.0.2", 1113 | "@protobufjs/inquire": "1.1.0", 1114 | "@protobufjs/path": "1.1.2", 1115 | "@protobufjs/pool": "1.1.0", 1116 | "@protobufjs/utf8": "1.1.0", 1117 | "@types/long": "3.0.32", 1118 | "@types/node": "8.0.55", 1119 | "long": "3.2.0" 1120 | } 1121 | } 1122 | } 1123 | }, 1124 | "google-p12-pem": { 1125 | "version": "0.1.2", 1126 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", 1127 | "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", 1128 | "requires": { 1129 | "node-forge": "0.7.1" 1130 | } 1131 | }, 1132 | "google-proto-files": { 1133 | "version": "0.13.1", 1134 | "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", 1135 | "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==" 1136 | }, 1137 | "graceful-fs": { 1138 | "version": "4.1.11", 1139 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1140 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 1141 | }, 1142 | "grpc": { 1143 | "version": "1.7.2", 1144 | "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.7.2.tgz", 1145 | "integrity": "sha512-GH6xziNGjW8LAtqQ3HmYI7Tx8BIlr46iaMRXHfh46kkaOP6PNWUx47ULNTUlXSYR3P00d0Pl8uzodTLwPk805w==", 1146 | "requires": { 1147 | "arguejs": "0.2.3", 1148 | "lodash": "4.17.4", 1149 | "nan": "2.8.0", 1150 | "node-pre-gyp": "0.6.39", 1151 | "protobufjs": "5.0.2" 1152 | }, 1153 | "dependencies": { 1154 | "abbrev": { 1155 | "version": "1.0.9", 1156 | "bundled": true 1157 | }, 1158 | "ajv": { 1159 | "version": "4.11.8", 1160 | "bundled": true, 1161 | "requires": { 1162 | "co": "4.6.0", 1163 | "json-stable-stringify": "1.0.1" 1164 | } 1165 | }, 1166 | "ansi-regex": { 1167 | "version": "2.1.1", 1168 | "bundled": true 1169 | }, 1170 | "aproba": { 1171 | "version": "1.2.0", 1172 | "bundled": true 1173 | }, 1174 | "are-we-there-yet": { 1175 | "version": "1.1.4", 1176 | "bundled": true, 1177 | "requires": { 1178 | "delegates": "1.0.0", 1179 | "readable-stream": "2.3.3" 1180 | } 1181 | }, 1182 | "asn1": { 1183 | "version": "0.2.3", 1184 | "bundled": true 1185 | }, 1186 | "assert-plus": { 1187 | "version": "0.2.0", 1188 | "bundled": true 1189 | }, 1190 | "asynckit": { 1191 | "version": "0.4.0", 1192 | "bundled": true 1193 | }, 1194 | "aws-sign2": { 1195 | "version": "0.6.0", 1196 | "bundled": true 1197 | }, 1198 | "aws4": { 1199 | "version": "1.6.0", 1200 | "bundled": true 1201 | }, 1202 | "balanced-match": { 1203 | "version": "1.0.0", 1204 | "bundled": true 1205 | }, 1206 | "bcrypt-pbkdf": { 1207 | "version": "1.0.1", 1208 | "bundled": true, 1209 | "optional": true, 1210 | "requires": { 1211 | "tweetnacl": "0.14.5" 1212 | } 1213 | }, 1214 | "block-stream": { 1215 | "version": "0.0.9", 1216 | "bundled": true, 1217 | "requires": { 1218 | "inherits": "2.0.3" 1219 | } 1220 | }, 1221 | "boom": { 1222 | "version": "2.10.1", 1223 | "bundled": true, 1224 | "requires": { 1225 | "hoek": "2.16.3" 1226 | } 1227 | }, 1228 | "brace-expansion": { 1229 | "version": "1.1.8", 1230 | "bundled": true, 1231 | "requires": { 1232 | "balanced-match": "1.0.0", 1233 | "concat-map": "0.0.1" 1234 | } 1235 | }, 1236 | "caseless": { 1237 | "version": "0.12.0", 1238 | "bundled": true 1239 | }, 1240 | "co": { 1241 | "version": "4.6.0", 1242 | "bundled": true 1243 | }, 1244 | "code-point-at": { 1245 | "version": "1.1.0", 1246 | "bundled": true 1247 | }, 1248 | "combined-stream": { 1249 | "version": "1.0.5", 1250 | "bundled": true, 1251 | "requires": { 1252 | "delayed-stream": "1.0.0" 1253 | } 1254 | }, 1255 | "concat-map": { 1256 | "version": "0.0.1", 1257 | "bundled": true 1258 | }, 1259 | "console-control-strings": { 1260 | "version": "1.1.0", 1261 | "bundled": true 1262 | }, 1263 | "core-util-is": { 1264 | "version": "1.0.2", 1265 | "bundled": true 1266 | }, 1267 | "cryptiles": { 1268 | "version": "2.0.5", 1269 | "bundled": true, 1270 | "requires": { 1271 | "boom": "2.10.1" 1272 | } 1273 | }, 1274 | "dashdash": { 1275 | "version": "1.14.1", 1276 | "bundled": true, 1277 | "requires": { 1278 | "assert-plus": "1.0.0" 1279 | }, 1280 | "dependencies": { 1281 | "assert-plus": { 1282 | "version": "1.0.0", 1283 | "bundled": true 1284 | } 1285 | } 1286 | }, 1287 | "debug": { 1288 | "version": "2.6.8", 1289 | "bundled": true, 1290 | "requires": { 1291 | "ms": "2.0.0" 1292 | } 1293 | }, 1294 | "deep-extend": { 1295 | "version": "0.4.2", 1296 | "bundled": true 1297 | }, 1298 | "delayed-stream": { 1299 | "version": "1.0.0", 1300 | "bundled": true 1301 | }, 1302 | "delegates": { 1303 | "version": "1.0.0", 1304 | "bundled": true 1305 | }, 1306 | "detect-libc": { 1307 | "version": "1.0.2", 1308 | "bundled": true 1309 | }, 1310 | "ecc-jsbn": { 1311 | "version": "0.1.1", 1312 | "bundled": true, 1313 | "optional": true, 1314 | "requires": { 1315 | "jsbn": "0.1.1" 1316 | } 1317 | }, 1318 | "extend": { 1319 | "version": "3.0.1", 1320 | "bundled": true 1321 | }, 1322 | "extsprintf": { 1323 | "version": "1.3.0", 1324 | "bundled": true 1325 | }, 1326 | "forever-agent": { 1327 | "version": "0.6.1", 1328 | "bundled": true 1329 | }, 1330 | "form-data": { 1331 | "version": "2.1.4", 1332 | "bundled": true, 1333 | "requires": { 1334 | "asynckit": "0.4.0", 1335 | "combined-stream": "1.0.5", 1336 | "mime-types": "2.1.17" 1337 | } 1338 | }, 1339 | "fs.realpath": { 1340 | "version": "1.0.0", 1341 | "bundled": true 1342 | }, 1343 | "fstream": { 1344 | "version": "1.0.11", 1345 | "bundled": true, 1346 | "requires": { 1347 | "graceful-fs": "4.1.11", 1348 | "inherits": "2.0.3", 1349 | "mkdirp": "0.5.1", 1350 | "rimraf": "2.6.2" 1351 | } 1352 | }, 1353 | "fstream-ignore": { 1354 | "version": "1.0.5", 1355 | "bundled": true, 1356 | "requires": { 1357 | "fstream": "1.0.11", 1358 | "inherits": "2.0.3", 1359 | "minimatch": "3.0.4" 1360 | } 1361 | }, 1362 | "gauge": { 1363 | "version": "2.7.4", 1364 | "bundled": true, 1365 | "requires": { 1366 | "aproba": "1.2.0", 1367 | "console-control-strings": "1.1.0", 1368 | "has-unicode": "2.0.1", 1369 | "object-assign": "4.1.1", 1370 | "signal-exit": "3.0.2", 1371 | "string-width": "1.0.2", 1372 | "strip-ansi": "3.0.1", 1373 | "wide-align": "1.1.2" 1374 | } 1375 | }, 1376 | "getpass": { 1377 | "version": "0.1.7", 1378 | "bundled": true, 1379 | "requires": { 1380 | "assert-plus": "1.0.0" 1381 | }, 1382 | "dependencies": { 1383 | "assert-plus": { 1384 | "version": "1.0.0", 1385 | "bundled": true 1386 | } 1387 | } 1388 | }, 1389 | "glob": { 1390 | "version": "7.1.1", 1391 | "bundled": true, 1392 | "requires": { 1393 | "fs.realpath": "1.0.0", 1394 | "inflight": "1.0.6", 1395 | "inherits": "2.0.3", 1396 | "minimatch": "3.0.4", 1397 | "once": "1.4.0", 1398 | "path-is-absolute": "1.0.1" 1399 | } 1400 | }, 1401 | "graceful-fs": { 1402 | "version": "4.1.11", 1403 | "bundled": true 1404 | }, 1405 | "har-schema": { 1406 | "version": "1.0.5", 1407 | "bundled": true 1408 | }, 1409 | "har-validator": { 1410 | "version": "4.2.1", 1411 | "bundled": true, 1412 | "requires": { 1413 | "ajv": "4.11.8", 1414 | "har-schema": "1.0.5" 1415 | } 1416 | }, 1417 | "has-unicode": { 1418 | "version": "2.0.1", 1419 | "bundled": true 1420 | }, 1421 | "hawk": { 1422 | "version": "3.1.3", 1423 | "bundled": true, 1424 | "requires": { 1425 | "boom": "2.10.1", 1426 | "cryptiles": "2.0.5", 1427 | "hoek": "2.16.3", 1428 | "sntp": "1.0.9" 1429 | } 1430 | }, 1431 | "hoek": { 1432 | "version": "2.16.3", 1433 | "bundled": true 1434 | }, 1435 | "http-signature": { 1436 | "version": "1.1.1", 1437 | "bundled": true, 1438 | "requires": { 1439 | "assert-plus": "0.2.0", 1440 | "jsprim": "1.4.1", 1441 | "sshpk": "1.13.1" 1442 | } 1443 | }, 1444 | "inflight": { 1445 | "version": "1.0.6", 1446 | "bundled": true, 1447 | "requires": { 1448 | "once": "1.4.0", 1449 | "wrappy": "1.0.2" 1450 | } 1451 | }, 1452 | "inherits": { 1453 | "version": "2.0.3", 1454 | "bundled": true 1455 | }, 1456 | "ini": { 1457 | "version": "1.3.4", 1458 | "bundled": true 1459 | }, 1460 | "is-fullwidth-code-point": { 1461 | "version": "1.0.0", 1462 | "bundled": true, 1463 | "requires": { 1464 | "number-is-nan": "1.0.1" 1465 | } 1466 | }, 1467 | "is-typedarray": { 1468 | "version": "1.0.0", 1469 | "bundled": true 1470 | }, 1471 | "isarray": { 1472 | "version": "1.0.0", 1473 | "bundled": true 1474 | }, 1475 | "isstream": { 1476 | "version": "0.1.2", 1477 | "bundled": true 1478 | }, 1479 | "jsbn": { 1480 | "version": "0.1.1", 1481 | "bundled": true, 1482 | "optional": true 1483 | }, 1484 | "json-schema": { 1485 | "version": "0.2.3", 1486 | "bundled": true 1487 | }, 1488 | "json-stable-stringify": { 1489 | "version": "1.0.1", 1490 | "bundled": true, 1491 | "requires": { 1492 | "jsonify": "0.0.0" 1493 | } 1494 | }, 1495 | "json-stringify-safe": { 1496 | "version": "5.0.1", 1497 | "bundled": true 1498 | }, 1499 | "jsonify": { 1500 | "version": "0.0.0", 1501 | "bundled": true 1502 | }, 1503 | "jsprim": { 1504 | "version": "1.4.1", 1505 | "bundled": true, 1506 | "requires": { 1507 | "assert-plus": "1.0.0", 1508 | "extsprintf": "1.3.0", 1509 | "json-schema": "0.2.3", 1510 | "verror": "1.10.0" 1511 | }, 1512 | "dependencies": { 1513 | "assert-plus": { 1514 | "version": "1.0.0", 1515 | "bundled": true 1516 | } 1517 | } 1518 | }, 1519 | "lodash": { 1520 | "version": "4.17.4", 1521 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1522 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 1523 | }, 1524 | "mime-db": { 1525 | "version": "1.30.0", 1526 | "bundled": true 1527 | }, 1528 | "mime-types": { 1529 | "version": "2.1.17", 1530 | "bundled": true, 1531 | "requires": { 1532 | "mime-db": "1.30.0" 1533 | } 1534 | }, 1535 | "minimatch": { 1536 | "version": "3.0.4", 1537 | "bundled": true, 1538 | "requires": { 1539 | "brace-expansion": "1.1.8" 1540 | } 1541 | }, 1542 | "minimist": { 1543 | "version": "0.0.8", 1544 | "bundled": true 1545 | }, 1546 | "mkdirp": { 1547 | "version": "0.5.1", 1548 | "bundled": true, 1549 | "requires": { 1550 | "minimist": "0.0.8" 1551 | } 1552 | }, 1553 | "ms": { 1554 | "version": "2.0.0", 1555 | "bundled": true 1556 | }, 1557 | "node-pre-gyp": { 1558 | "version": "0.6.39", 1559 | "bundled": true, 1560 | "requires": { 1561 | "detect-libc": "1.0.2", 1562 | "hawk": "3.1.3", 1563 | "mkdirp": "0.5.1", 1564 | "nopt": "4.0.1", 1565 | "npmlog": "4.1.2", 1566 | "rc": "1.2.2", 1567 | "request": "2.81.0", 1568 | "rimraf": "2.6.2", 1569 | "semver": "5.4.1", 1570 | "tar": "2.2.1", 1571 | "tar-pack": "3.4.1" 1572 | }, 1573 | "dependencies": { 1574 | "nopt": { 1575 | "version": "4.0.1", 1576 | "bundled": true, 1577 | "requires": { 1578 | "abbrev": "1.0.9", 1579 | "osenv": "0.1.4" 1580 | } 1581 | } 1582 | } 1583 | }, 1584 | "npmlog": { 1585 | "version": "4.1.2", 1586 | "bundled": true, 1587 | "requires": { 1588 | "are-we-there-yet": "1.1.4", 1589 | "console-control-strings": "1.1.0", 1590 | "gauge": "2.7.4", 1591 | "set-blocking": "2.0.0" 1592 | } 1593 | }, 1594 | "number-is-nan": { 1595 | "version": "1.0.1", 1596 | "bundled": true 1597 | }, 1598 | "oauth-sign": { 1599 | "version": "0.8.2", 1600 | "bundled": true 1601 | }, 1602 | "object-assign": { 1603 | "version": "4.1.1", 1604 | "bundled": true 1605 | }, 1606 | "once": { 1607 | "version": "1.4.0", 1608 | "bundled": true, 1609 | "requires": { 1610 | "wrappy": "1.0.2" 1611 | } 1612 | }, 1613 | "os-homedir": { 1614 | "version": "1.0.2", 1615 | "bundled": true 1616 | }, 1617 | "os-tmpdir": { 1618 | "version": "1.0.2", 1619 | "bundled": true 1620 | }, 1621 | "osenv": { 1622 | "version": "0.1.4", 1623 | "bundled": true, 1624 | "requires": { 1625 | "os-homedir": "1.0.2", 1626 | "os-tmpdir": "1.0.2" 1627 | } 1628 | }, 1629 | "path-is-absolute": { 1630 | "version": "1.0.1", 1631 | "bundled": true 1632 | }, 1633 | "performance-now": { 1634 | "version": "0.2.0", 1635 | "bundled": true 1636 | }, 1637 | "process-nextick-args": { 1638 | "version": "1.0.7", 1639 | "bundled": true 1640 | }, 1641 | "punycode": { 1642 | "version": "1.4.1", 1643 | "bundled": true 1644 | }, 1645 | "qs": { 1646 | "version": "6.4.0", 1647 | "bundled": true 1648 | }, 1649 | "rc": { 1650 | "version": "1.2.2", 1651 | "bundled": true, 1652 | "requires": { 1653 | "deep-extend": "0.4.2", 1654 | "ini": "1.3.4", 1655 | "minimist": "1.2.0", 1656 | "strip-json-comments": "2.0.1" 1657 | }, 1658 | "dependencies": { 1659 | "minimist": { 1660 | "version": "1.2.0", 1661 | "bundled": true 1662 | } 1663 | } 1664 | }, 1665 | "readable-stream": { 1666 | "version": "2.3.3", 1667 | "bundled": true, 1668 | "requires": { 1669 | "core-util-is": "1.0.2", 1670 | "inherits": "2.0.3", 1671 | "isarray": "1.0.0", 1672 | "process-nextick-args": "1.0.7", 1673 | "safe-buffer": "5.1.1", 1674 | "string_decoder": "1.0.3", 1675 | "util-deprecate": "1.0.2" 1676 | } 1677 | }, 1678 | "request": { 1679 | "version": "2.81.0", 1680 | "bundled": true, 1681 | "requires": { 1682 | "aws-sign2": "0.6.0", 1683 | "aws4": "1.6.0", 1684 | "caseless": "0.12.0", 1685 | "combined-stream": "1.0.5", 1686 | "extend": "3.0.1", 1687 | "forever-agent": "0.6.1", 1688 | "form-data": "2.1.4", 1689 | "har-validator": "4.2.1", 1690 | "hawk": "3.1.3", 1691 | "http-signature": "1.1.1", 1692 | "is-typedarray": "1.0.0", 1693 | "isstream": "0.1.2", 1694 | "json-stringify-safe": "5.0.1", 1695 | "mime-types": "2.1.17", 1696 | "oauth-sign": "0.8.2", 1697 | "performance-now": "0.2.0", 1698 | "qs": "6.4.0", 1699 | "safe-buffer": "5.1.1", 1700 | "stringstream": "0.0.5", 1701 | "tough-cookie": "2.3.3", 1702 | "tunnel-agent": "0.6.0", 1703 | "uuid": "3.1.0" 1704 | } 1705 | }, 1706 | "rimraf": { 1707 | "version": "2.6.2", 1708 | "bundled": true, 1709 | "requires": { 1710 | "glob": "7.1.1" 1711 | } 1712 | }, 1713 | "safe-buffer": { 1714 | "version": "5.1.1", 1715 | "bundled": true 1716 | }, 1717 | "semver": { 1718 | "version": "5.4.1", 1719 | "bundled": true 1720 | }, 1721 | "set-blocking": { 1722 | "version": "2.0.0", 1723 | "bundled": true 1724 | }, 1725 | "signal-exit": { 1726 | "version": "3.0.2", 1727 | "bundled": true 1728 | }, 1729 | "sntp": { 1730 | "version": "1.0.9", 1731 | "bundled": true, 1732 | "requires": { 1733 | "hoek": "2.16.3" 1734 | } 1735 | }, 1736 | "sshpk": { 1737 | "version": "1.13.1", 1738 | "bundled": true, 1739 | "requires": { 1740 | "asn1": "0.2.3", 1741 | "assert-plus": "1.0.0", 1742 | "bcrypt-pbkdf": "1.0.1", 1743 | "dashdash": "1.14.1", 1744 | "ecc-jsbn": "0.1.1", 1745 | "getpass": "0.1.7", 1746 | "jsbn": "0.1.1", 1747 | "tweetnacl": "0.14.5" 1748 | }, 1749 | "dependencies": { 1750 | "assert-plus": { 1751 | "version": "1.0.0", 1752 | "bundled": true 1753 | } 1754 | } 1755 | }, 1756 | "string-width": { 1757 | "version": "1.0.2", 1758 | "bundled": true, 1759 | "requires": { 1760 | "code-point-at": "1.1.0", 1761 | "is-fullwidth-code-point": "1.0.0", 1762 | "strip-ansi": "3.0.1" 1763 | } 1764 | }, 1765 | "string_decoder": { 1766 | "version": "1.0.3", 1767 | "bundled": true, 1768 | "requires": { 1769 | "safe-buffer": "5.1.1" 1770 | } 1771 | }, 1772 | "stringstream": { 1773 | "version": "0.0.5", 1774 | "bundled": true 1775 | }, 1776 | "strip-ansi": { 1777 | "version": "3.0.1", 1778 | "bundled": true, 1779 | "requires": { 1780 | "ansi-regex": "2.1.1" 1781 | } 1782 | }, 1783 | "strip-json-comments": { 1784 | "version": "2.0.1", 1785 | "bundled": true 1786 | }, 1787 | "tar": { 1788 | "version": "2.2.1", 1789 | "bundled": true, 1790 | "requires": { 1791 | "block-stream": "0.0.9", 1792 | "fstream": "1.0.11", 1793 | "inherits": "2.0.3" 1794 | } 1795 | }, 1796 | "tar-pack": { 1797 | "version": "3.4.1", 1798 | "bundled": true, 1799 | "requires": { 1800 | "debug": "2.6.8", 1801 | "fstream": "1.0.11", 1802 | "fstream-ignore": "1.0.5", 1803 | "once": "1.4.0", 1804 | "readable-stream": "2.3.3", 1805 | "rimraf": "2.6.2", 1806 | "tar": "2.2.1", 1807 | "uid-number": "0.0.6" 1808 | } 1809 | }, 1810 | "tough-cookie": { 1811 | "version": "2.3.3", 1812 | "bundled": true, 1813 | "requires": { 1814 | "punycode": "1.4.1" 1815 | } 1816 | }, 1817 | "tunnel-agent": { 1818 | "version": "0.6.0", 1819 | "bundled": true, 1820 | "requires": { 1821 | "safe-buffer": "5.1.1" 1822 | } 1823 | }, 1824 | "tweetnacl": { 1825 | "version": "0.14.5", 1826 | "bundled": true, 1827 | "optional": true 1828 | }, 1829 | "uid-number": { 1830 | "version": "0.0.6", 1831 | "bundled": true 1832 | }, 1833 | "util-deprecate": { 1834 | "version": "1.0.2", 1835 | "bundled": true 1836 | }, 1837 | "uuid": { 1838 | "version": "3.1.0", 1839 | "bundled": true 1840 | }, 1841 | "verror": { 1842 | "version": "1.10.0", 1843 | "bundled": true, 1844 | "requires": { 1845 | "assert-plus": "1.0.0", 1846 | "core-util-is": "1.0.2", 1847 | "extsprintf": "1.3.0" 1848 | }, 1849 | "dependencies": { 1850 | "assert-plus": { 1851 | "version": "1.0.0", 1852 | "bundled": true 1853 | } 1854 | } 1855 | }, 1856 | "wide-align": { 1857 | "version": "1.1.2", 1858 | "bundled": true, 1859 | "requires": { 1860 | "string-width": "1.0.2" 1861 | } 1862 | }, 1863 | "wrappy": { 1864 | "version": "1.0.2", 1865 | "bundled": true 1866 | } 1867 | } 1868 | }, 1869 | "gtoken": { 1870 | "version": "1.2.3", 1871 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", 1872 | "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", 1873 | "requires": { 1874 | "google-p12-pem": "0.1.2", 1875 | "jws": "3.1.4", 1876 | "mime": "1.4.1", 1877 | "request": "2.83.0" 1878 | } 1879 | }, 1880 | "har-schema": { 1881 | "version": "2.0.0", 1882 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1883 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 1884 | }, 1885 | "har-validator": { 1886 | "version": "5.0.3", 1887 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 1888 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 1889 | "requires": { 1890 | "ajv": "5.5.1", 1891 | "har-schema": "2.0.0" 1892 | } 1893 | }, 1894 | "hash-stream-validation": { 1895 | "version": "0.2.1", 1896 | "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz", 1897 | "integrity": "sha1-7Mm5l7IYvluzEphii7gHhptz3NE=", 1898 | "requires": { 1899 | "through2": "2.0.3" 1900 | } 1901 | }, 1902 | "hawk": { 1903 | "version": "6.0.2", 1904 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", 1905 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", 1906 | "requires": { 1907 | "boom": "4.3.1", 1908 | "cryptiles": "3.1.2", 1909 | "hoek": "4.2.0", 1910 | "sntp": "2.1.0" 1911 | }, 1912 | "dependencies": { 1913 | "hoek": { 1914 | "version": "4.2.0", 1915 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", 1916 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" 1917 | } 1918 | } 1919 | }, 1920 | "hoek": { 1921 | "version": "2.16.3", 1922 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 1923 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" 1924 | }, 1925 | "http-errors": { 1926 | "version": "1.6.2", 1927 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 1928 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 1929 | "requires": { 1930 | "depd": "1.1.1", 1931 | "inherits": "2.0.3", 1932 | "setprototypeof": "1.0.3", 1933 | "statuses": "1.4.0" 1934 | } 1935 | }, 1936 | "http-parser-js": { 1937 | "version": "0.4.9", 1938 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", 1939 | "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=" 1940 | }, 1941 | "http-signature": { 1942 | "version": "1.2.0", 1943 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1944 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1945 | "requires": { 1946 | "assert-plus": "1.0.0", 1947 | "jsprim": "1.4.1", 1948 | "sshpk": "1.13.1" 1949 | } 1950 | }, 1951 | "iconv-lite": { 1952 | "version": "0.4.19", 1953 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 1954 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 1955 | }, 1956 | "imurmurhash": { 1957 | "version": "0.1.4", 1958 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1959 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 1960 | }, 1961 | "inflight": { 1962 | "version": "1.0.6", 1963 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1964 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1965 | "requires": { 1966 | "once": "1.4.0", 1967 | "wrappy": "1.0.2" 1968 | } 1969 | }, 1970 | "inherits": { 1971 | "version": "2.0.3", 1972 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1973 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1974 | }, 1975 | "invert-kv": { 1976 | "version": "1.0.0", 1977 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 1978 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 1979 | }, 1980 | "ipaddr.js": { 1981 | "version": "1.5.2", 1982 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", 1983 | "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" 1984 | }, 1985 | "is": { 1986 | "version": "3.2.1", 1987 | "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", 1988 | "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" 1989 | }, 1990 | "is-fullwidth-code-point": { 1991 | "version": "1.0.0", 1992 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1993 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1994 | "requires": { 1995 | "number-is-nan": "1.0.1" 1996 | } 1997 | }, 1998 | "is-obj": { 1999 | "version": "1.0.1", 2000 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 2001 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" 2002 | }, 2003 | "is-stream-ended": { 2004 | "version": "0.1.3", 2005 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.3.tgz", 2006 | "integrity": "sha1-oEc7Jnx1ZjVIa+7cfjNE5UnRUqw=" 2007 | }, 2008 | "is-typedarray": { 2009 | "version": "1.0.0", 2010 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 2011 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 2012 | }, 2013 | "isarray": { 2014 | "version": "1.0.0", 2015 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2016 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2017 | }, 2018 | "isemail": { 2019 | "version": "1.2.0", 2020 | "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", 2021 | "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" 2022 | }, 2023 | "isstream": { 2024 | "version": "0.1.2", 2025 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 2026 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 2027 | }, 2028 | "joi": { 2029 | "version": "6.10.1", 2030 | "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", 2031 | "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", 2032 | "requires": { 2033 | "hoek": "2.16.3", 2034 | "isemail": "1.2.0", 2035 | "moment": "2.19.3", 2036 | "topo": "1.1.0" 2037 | } 2038 | }, 2039 | "jsbn": { 2040 | "version": "0.1.1", 2041 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 2042 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 2043 | "optional": true 2044 | }, 2045 | "json-schema": { 2046 | "version": "0.2.3", 2047 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 2048 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 2049 | }, 2050 | "json-schema-traverse": { 2051 | "version": "0.3.1", 2052 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 2053 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 2054 | }, 2055 | "json-stringify-safe": { 2056 | "version": "5.0.1", 2057 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 2058 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 2059 | }, 2060 | "jsonwebtoken": { 2061 | "version": "7.4.3", 2062 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz", 2063 | "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=", 2064 | "requires": { 2065 | "joi": "6.10.1", 2066 | "jws": "3.1.4", 2067 | "lodash.once": "4.1.1", 2068 | "ms": "2.0.0", 2069 | "xtend": "4.0.1" 2070 | } 2071 | }, 2072 | "jsprim": { 2073 | "version": "1.4.1", 2074 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 2075 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 2076 | "requires": { 2077 | "assert-plus": "1.0.0", 2078 | "extsprintf": "1.3.0", 2079 | "json-schema": "0.2.3", 2080 | "verror": "1.10.0" 2081 | } 2082 | }, 2083 | "jwa": { 2084 | "version": "1.1.5", 2085 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", 2086 | "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", 2087 | "requires": { 2088 | "base64url": "2.0.0", 2089 | "buffer-equal-constant-time": "1.0.1", 2090 | "ecdsa-sig-formatter": "1.0.9", 2091 | "safe-buffer": "5.1.1" 2092 | } 2093 | }, 2094 | "jwks-rsa": { 2095 | "version": "1.2.1", 2096 | "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-1.2.1.tgz", 2097 | "integrity": "sha512-xg+fw7FOV4eGdDIEMqQJvPLmFv85h4uN+j/GKwJZAxlCrDQpM8ov1F709xKGEp/dG3l4TUxoSOeN6YK7+KpinQ==", 2098 | "requires": { 2099 | "@types/express-jwt": "0.0.34", 2100 | "debug": "2.6.9", 2101 | "limiter": "1.1.2", 2102 | "lru-memoizer": "1.11.1", 2103 | "ms": "2.0.0", 2104 | "request": "2.83.0" 2105 | } 2106 | }, 2107 | "jws": { 2108 | "version": "3.1.4", 2109 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", 2110 | "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", 2111 | "requires": { 2112 | "base64url": "2.0.0", 2113 | "jwa": "1.1.5", 2114 | "safe-buffer": "5.1.1" 2115 | } 2116 | }, 2117 | "lcid": { 2118 | "version": "1.0.0", 2119 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 2120 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 2121 | "requires": { 2122 | "invert-kv": "1.0.0" 2123 | } 2124 | }, 2125 | "limiter": { 2126 | "version": "1.1.2", 2127 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.2.tgz", 2128 | "integrity": "sha512-JIKZ0xb6fZZYa3deZ0BgXCgX6HgV8Nx3mFGeFHmFWW8Fb2c08e0CyE+G3nalpD0xGvGssjGb1UdFr+PprxZEbw==" 2129 | }, 2130 | "lock": { 2131 | "version": "0.1.4", 2132 | "resolved": "https://registry.npmjs.org/lock/-/lock-0.1.4.tgz", 2133 | "integrity": "sha1-/sfervF+fDoKVeHaBCgD4l2RdF0=" 2134 | }, 2135 | "lodash": { 2136 | "version": "4.5.1", 2137 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.5.1.tgz", 2138 | "integrity": "sha1-gOigdMpfOJOmscELKmNkktcQwxY=" 2139 | }, 2140 | "lodash.isstring": { 2141 | "version": "4.0.1", 2142 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 2143 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 2144 | }, 2145 | "lodash.merge": { 2146 | "version": "4.6.0", 2147 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", 2148 | "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=" 2149 | }, 2150 | "lodash.noop": { 2151 | "version": "3.0.1", 2152 | "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-3.0.1.tgz", 2153 | "integrity": "sha1-OBiPTWUKOkdCWEObluxFsyYXEzw=" 2154 | }, 2155 | "lodash.once": { 2156 | "version": "4.1.1", 2157 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 2158 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 2159 | }, 2160 | "lodash.set": { 2161 | "version": "4.3.2", 2162 | "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", 2163 | "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" 2164 | }, 2165 | "log-driver": { 2166 | "version": "1.2.5", 2167 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", 2168 | "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=" 2169 | }, 2170 | "long": { 2171 | "version": "3.2.0", 2172 | "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", 2173 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 2174 | }, 2175 | "lru-cache": { 2176 | "version": "4.0.2", 2177 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", 2178 | "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", 2179 | "requires": { 2180 | "pseudomap": "1.0.2", 2181 | "yallist": "2.1.2" 2182 | } 2183 | }, 2184 | "lru-memoizer": { 2185 | "version": "1.11.1", 2186 | "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-1.11.1.tgz", 2187 | "integrity": "sha1-BpP2EAWTkUwC4ZK/m42TiEy/UNM=", 2188 | "requires": { 2189 | "lock": "0.1.4", 2190 | "lodash": "4.5.1", 2191 | "lru-cache": "4.0.2", 2192 | "very-fast-args": "1.1.0" 2193 | } 2194 | }, 2195 | "make-dir": { 2196 | "version": "1.1.0", 2197 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", 2198 | "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", 2199 | "requires": { 2200 | "pify": "3.0.0" 2201 | }, 2202 | "dependencies": { 2203 | "pify": { 2204 | "version": "3.0.0", 2205 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2206 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 2207 | } 2208 | } 2209 | }, 2210 | "media-typer": { 2211 | "version": "0.3.0", 2212 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2213 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 2214 | }, 2215 | "merge-descriptors": { 2216 | "version": "1.0.1", 2217 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2218 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 2219 | }, 2220 | "methmeth": { 2221 | "version": "1.1.0", 2222 | "resolved": "https://registry.npmjs.org/methmeth/-/methmeth-1.1.0.tgz", 2223 | "integrity": "sha1-6AomYY5S9cQiKGG7dIUQvRDikIk=" 2224 | }, 2225 | "methods": { 2226 | "version": "1.1.2", 2227 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2228 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2229 | }, 2230 | "mime": { 2231 | "version": "1.4.1", 2232 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 2233 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 2234 | }, 2235 | "mime-db": { 2236 | "version": "1.30.0", 2237 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 2238 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 2239 | }, 2240 | "mime-types": { 2241 | "version": "2.1.17", 2242 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 2243 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 2244 | "requires": { 2245 | "mime-db": "1.30.0" 2246 | } 2247 | }, 2248 | "minimatch": { 2249 | "version": "3.0.4", 2250 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2251 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2252 | "requires": { 2253 | "brace-expansion": "1.1.8" 2254 | } 2255 | }, 2256 | "modelo": { 2257 | "version": "4.2.0", 2258 | "resolved": "https://registry.npmjs.org/modelo/-/modelo-4.2.0.tgz", 2259 | "integrity": "sha1-O0tCACOmbKfjK9uhbnEJN+FNGws=" 2260 | }, 2261 | "moment": { 2262 | "version": "2.19.3", 2263 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.3.tgz", 2264 | "integrity": "sha1-vbmdJw1tf9p4zA+6zoVeJ/59pp8=" 2265 | }, 2266 | "ms": { 2267 | "version": "2.0.0", 2268 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2269 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2270 | }, 2271 | "nan": { 2272 | "version": "2.8.0", 2273 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", 2274 | "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" 2275 | }, 2276 | "negotiator": { 2277 | "version": "0.6.1", 2278 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 2279 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 2280 | }, 2281 | "node-forge": { 2282 | "version": "0.7.1", 2283 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", 2284 | "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=" 2285 | }, 2286 | "number-is-nan": { 2287 | "version": "1.0.1", 2288 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2289 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 2290 | }, 2291 | "oauth-sign": { 2292 | "version": "0.8.2", 2293 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 2294 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 2295 | }, 2296 | "object-assign": { 2297 | "version": "4.1.1", 2298 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2299 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2300 | }, 2301 | "on-finished": { 2302 | "version": "2.3.0", 2303 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2304 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2305 | "requires": { 2306 | "ee-first": "1.1.1" 2307 | } 2308 | }, 2309 | "once": { 2310 | "version": "1.4.0", 2311 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2312 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2313 | "requires": { 2314 | "wrappy": "1.0.2" 2315 | } 2316 | }, 2317 | "optjs": { 2318 | "version": "3.2.2", 2319 | "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", 2320 | "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" 2321 | }, 2322 | "os-locale": { 2323 | "version": "1.4.0", 2324 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 2325 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 2326 | "requires": { 2327 | "lcid": "1.0.0" 2328 | } 2329 | }, 2330 | "parseurl": { 2331 | "version": "1.3.2", 2332 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 2333 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 2334 | }, 2335 | "path-is-absolute": { 2336 | "version": "1.0.1", 2337 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2338 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2339 | }, 2340 | "path-to-regexp": { 2341 | "version": "0.1.7", 2342 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2343 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2344 | }, 2345 | "performance-now": { 2346 | "version": "2.1.0", 2347 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2348 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 2349 | }, 2350 | "pify": { 2351 | "version": "2.3.0", 2352 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2353 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 2354 | }, 2355 | "pinkie": { 2356 | "version": "2.0.4", 2357 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2358 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 2359 | }, 2360 | "pinkie-promise": { 2361 | "version": "2.0.1", 2362 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2363 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2364 | "requires": { 2365 | "pinkie": "2.0.4" 2366 | } 2367 | }, 2368 | "process-nextick-args": { 2369 | "version": "1.0.7", 2370 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 2371 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 2372 | }, 2373 | "protobufjs": { 2374 | "version": "5.0.2", 2375 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", 2376 | "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", 2377 | "requires": { 2378 | "ascli": "1.0.1", 2379 | "bytebuffer": "5.0.1", 2380 | "glob": "7.1.2", 2381 | "yargs": "3.32.0" 2382 | } 2383 | }, 2384 | "proxy-addr": { 2385 | "version": "2.0.2", 2386 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", 2387 | "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", 2388 | "requires": { 2389 | "forwarded": "0.1.2", 2390 | "ipaddr.js": "1.5.2" 2391 | } 2392 | }, 2393 | "pseudomap": { 2394 | "version": "1.0.2", 2395 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 2396 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 2397 | }, 2398 | "pump": { 2399 | "version": "1.0.3", 2400 | "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", 2401 | "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", 2402 | "requires": { 2403 | "end-of-stream": "1.4.0", 2404 | "once": "1.4.0" 2405 | } 2406 | }, 2407 | "pumpify": { 2408 | "version": "1.3.5", 2409 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", 2410 | "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", 2411 | "requires": { 2412 | "duplexify": "3.5.1", 2413 | "inherits": "2.0.3", 2414 | "pump": "1.0.3" 2415 | } 2416 | }, 2417 | "punycode": { 2418 | "version": "1.4.1", 2419 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2420 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 2421 | }, 2422 | "qs": { 2423 | "version": "6.5.1", 2424 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 2425 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 2426 | }, 2427 | "range-parser": { 2428 | "version": "1.2.0", 2429 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 2430 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 2431 | }, 2432 | "raw-body": { 2433 | "version": "2.3.2", 2434 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 2435 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 2436 | "requires": { 2437 | "bytes": "3.0.0", 2438 | "http-errors": "1.6.2", 2439 | "iconv-lite": "0.4.19", 2440 | "unpipe": "1.0.0" 2441 | } 2442 | }, 2443 | "readable-stream": { 2444 | "version": "2.3.3", 2445 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 2446 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 2447 | "requires": { 2448 | "core-util-is": "1.0.2", 2449 | "inherits": "2.0.3", 2450 | "isarray": "1.0.0", 2451 | "process-nextick-args": "1.0.7", 2452 | "safe-buffer": "5.1.1", 2453 | "string_decoder": "1.0.3", 2454 | "util-deprecate": "1.0.2" 2455 | } 2456 | }, 2457 | "request": { 2458 | "version": "2.83.0", 2459 | "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", 2460 | "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", 2461 | "requires": { 2462 | "aws-sign2": "0.7.0", 2463 | "aws4": "1.6.0", 2464 | "caseless": "0.12.0", 2465 | "combined-stream": "1.0.5", 2466 | "extend": "3.0.1", 2467 | "forever-agent": "0.6.1", 2468 | "form-data": "2.3.1", 2469 | "har-validator": "5.0.3", 2470 | "hawk": "6.0.2", 2471 | "http-signature": "1.2.0", 2472 | "is-typedarray": "1.0.0", 2473 | "isstream": "0.1.2", 2474 | "json-stringify-safe": "5.0.1", 2475 | "mime-types": "2.1.17", 2476 | "oauth-sign": "0.8.2", 2477 | "performance-now": "2.1.0", 2478 | "qs": "6.5.1", 2479 | "safe-buffer": "5.1.1", 2480 | "stringstream": "0.0.5", 2481 | "tough-cookie": "2.3.3", 2482 | "tunnel-agent": "0.6.0", 2483 | "uuid": "3.1.0" 2484 | } 2485 | }, 2486 | "retry-request": { 2487 | "version": "3.3.0", 2488 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.0.tgz", 2489 | "integrity": "sha512-bCbvtnZkfgB2TnbKMUUxzSR5W4AJQyMD6D6UcCsE/wBTVmlsS59OrDQr4RKV/Kq1hiIBmUYlbxd9MZ0cfpjrAQ==", 2490 | "requires": { 2491 | "request": "2.83.0", 2492 | "through2": "2.0.3" 2493 | } 2494 | }, 2495 | "safe-buffer": { 2496 | "version": "5.1.1", 2497 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 2498 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 2499 | }, 2500 | "send": { 2501 | "version": "0.16.1", 2502 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", 2503 | "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", 2504 | "requires": { 2505 | "debug": "2.6.9", 2506 | "depd": "1.1.1", 2507 | "destroy": "1.0.4", 2508 | "encodeurl": "1.0.1", 2509 | "escape-html": "1.0.3", 2510 | "etag": "1.8.1", 2511 | "fresh": "0.5.2", 2512 | "http-errors": "1.6.2", 2513 | "mime": "1.4.1", 2514 | "ms": "2.0.0", 2515 | "on-finished": "2.3.0", 2516 | "range-parser": "1.2.0", 2517 | "statuses": "1.3.1" 2518 | }, 2519 | "dependencies": { 2520 | "statuses": { 2521 | "version": "1.3.1", 2522 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 2523 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 2524 | } 2525 | } 2526 | }, 2527 | "serve-static": { 2528 | "version": "1.13.1", 2529 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", 2530 | "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", 2531 | "requires": { 2532 | "encodeurl": "1.0.1", 2533 | "escape-html": "1.0.3", 2534 | "parseurl": "1.3.2", 2535 | "send": "0.16.1" 2536 | } 2537 | }, 2538 | "setprototypeof": { 2539 | "version": "1.0.3", 2540 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 2541 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 2542 | }, 2543 | "signal-exit": { 2544 | "version": "3.0.2", 2545 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2546 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 2547 | }, 2548 | "snakeize": { 2549 | "version": "0.1.0", 2550 | "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", 2551 | "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=" 2552 | }, 2553 | "sntp": { 2554 | "version": "2.1.0", 2555 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", 2556 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", 2557 | "requires": { 2558 | "hoek": "4.2.0" 2559 | }, 2560 | "dependencies": { 2561 | "hoek": { 2562 | "version": "4.2.0", 2563 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", 2564 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" 2565 | } 2566 | } 2567 | }, 2568 | "split-array-stream": { 2569 | "version": "1.0.3", 2570 | "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-1.0.3.tgz", 2571 | "integrity": "sha1-0rdajl4Ngk1S/eyLgiWDncLjXfo=", 2572 | "requires": { 2573 | "async": "2.6.0", 2574 | "is-stream-ended": "0.1.3" 2575 | }, 2576 | "dependencies": { 2577 | "async": { 2578 | "version": "2.6.0", 2579 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", 2580 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", 2581 | "requires": { 2582 | "lodash": "4.17.4" 2583 | } 2584 | }, 2585 | "lodash": { 2586 | "version": "4.17.4", 2587 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 2588 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 2589 | } 2590 | } 2591 | }, 2592 | "sshpk": { 2593 | "version": "1.13.1", 2594 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 2595 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 2596 | "requires": { 2597 | "asn1": "0.2.3", 2598 | "assert-plus": "1.0.0", 2599 | "bcrypt-pbkdf": "1.0.1", 2600 | "dashdash": "1.14.1", 2601 | "ecc-jsbn": "0.1.1", 2602 | "getpass": "0.1.7", 2603 | "jsbn": "0.1.1", 2604 | "tweetnacl": "0.14.5" 2605 | } 2606 | }, 2607 | "statuses": { 2608 | "version": "1.4.0", 2609 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 2610 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 2611 | }, 2612 | "stream-events": { 2613 | "version": "1.0.2", 2614 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.2.tgz", 2615 | "integrity": "sha1-q/OfZsCJCk63lbyNXoWbJhW1kLI=", 2616 | "requires": { 2617 | "stubs": "3.0.0" 2618 | } 2619 | }, 2620 | "stream-shift": { 2621 | "version": "1.0.0", 2622 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 2623 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" 2624 | }, 2625 | "string-format-obj": { 2626 | "version": "1.1.0", 2627 | "resolved": "https://registry.npmjs.org/string-format-obj/-/string-format-obj-1.1.0.tgz", 2628 | "integrity": "sha1-djVhCx7zlwE+hHi+mKFw4EmD0Gg=" 2629 | }, 2630 | "string-width": { 2631 | "version": "1.0.2", 2632 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2633 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2634 | "requires": { 2635 | "code-point-at": "1.1.0", 2636 | "is-fullwidth-code-point": "1.0.0", 2637 | "strip-ansi": "3.0.1" 2638 | } 2639 | }, 2640 | "string_decoder": { 2641 | "version": "1.0.3", 2642 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2643 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 2644 | "requires": { 2645 | "safe-buffer": "5.1.1" 2646 | } 2647 | }, 2648 | "stringstream": { 2649 | "version": "0.0.5", 2650 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 2651 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 2652 | }, 2653 | "strip-ansi": { 2654 | "version": "3.0.1", 2655 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2656 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2657 | "requires": { 2658 | "ansi-regex": "2.1.1" 2659 | } 2660 | }, 2661 | "stubs": { 2662 | "version": "3.0.0", 2663 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", 2664 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" 2665 | }, 2666 | "through2": { 2667 | "version": "2.0.3", 2668 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 2669 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 2670 | "requires": { 2671 | "readable-stream": "2.3.3", 2672 | "xtend": "4.0.1" 2673 | } 2674 | }, 2675 | "topo": { 2676 | "version": "1.1.0", 2677 | "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", 2678 | "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", 2679 | "requires": { 2680 | "hoek": "2.16.3" 2681 | } 2682 | }, 2683 | "tough-cookie": { 2684 | "version": "2.3.3", 2685 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", 2686 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", 2687 | "requires": { 2688 | "punycode": "1.4.1" 2689 | } 2690 | }, 2691 | "tunnel-agent": { 2692 | "version": "0.6.0", 2693 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2694 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2695 | "requires": { 2696 | "safe-buffer": "5.1.1" 2697 | } 2698 | }, 2699 | "tweetnacl": { 2700 | "version": "0.14.5", 2701 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2702 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2703 | "optional": true 2704 | }, 2705 | "type-is": { 2706 | "version": "1.6.15", 2707 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", 2708 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", 2709 | "requires": { 2710 | "media-typer": "0.3.0", 2711 | "mime-types": "2.1.17" 2712 | } 2713 | }, 2714 | "typedarray": { 2715 | "version": "0.0.6", 2716 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2717 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 2718 | }, 2719 | "unique-string": { 2720 | "version": "1.0.0", 2721 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 2722 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 2723 | "requires": { 2724 | "crypto-random-string": "1.0.0" 2725 | } 2726 | }, 2727 | "unpipe": { 2728 | "version": "1.0.0", 2729 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2730 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2731 | }, 2732 | "util-deprecate": { 2733 | "version": "1.0.2", 2734 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2735 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2736 | }, 2737 | "utils-merge": { 2738 | "version": "1.0.1", 2739 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2740 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2741 | }, 2742 | "uuid": { 2743 | "version": "3.1.0", 2744 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 2745 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 2746 | }, 2747 | "vary": { 2748 | "version": "1.1.2", 2749 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2750 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2751 | }, 2752 | "verror": { 2753 | "version": "1.10.0", 2754 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2755 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2756 | "requires": { 2757 | "assert-plus": "1.0.0", 2758 | "core-util-is": "1.0.2", 2759 | "extsprintf": "1.3.0" 2760 | } 2761 | }, 2762 | "very-fast-args": { 2763 | "version": "1.1.0", 2764 | "resolved": "https://registry.npmjs.org/very-fast-args/-/very-fast-args-1.1.0.tgz", 2765 | "integrity": "sha1-4W0dH6+KbllqJGQh/ZCneWPQs5Y=" 2766 | }, 2767 | "websocket-driver": { 2768 | "version": "0.7.0", 2769 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", 2770 | "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", 2771 | "requires": { 2772 | "http-parser-js": "0.4.9", 2773 | "websocket-extensions": "0.1.3" 2774 | } 2775 | }, 2776 | "websocket-extensions": { 2777 | "version": "0.1.3", 2778 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", 2779 | "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" 2780 | }, 2781 | "window-size": { 2782 | "version": "0.1.4", 2783 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 2784 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 2785 | }, 2786 | "wrap-ansi": { 2787 | "version": "2.1.0", 2788 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 2789 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 2790 | "requires": { 2791 | "string-width": "1.0.2", 2792 | "strip-ansi": "3.0.1" 2793 | } 2794 | }, 2795 | "wrappy": { 2796 | "version": "1.0.2", 2797 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2798 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2799 | }, 2800 | "write-file-atomic": { 2801 | "version": "2.3.0", 2802 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", 2803 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", 2804 | "requires": { 2805 | "graceful-fs": "4.1.11", 2806 | "imurmurhash": "0.1.4", 2807 | "signal-exit": "3.0.2" 2808 | } 2809 | }, 2810 | "xdg-basedir": { 2811 | "version": "3.0.0", 2812 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 2813 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" 2814 | }, 2815 | "xtend": { 2816 | "version": "4.0.1", 2817 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2818 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 2819 | }, 2820 | "y18n": { 2821 | "version": "3.2.1", 2822 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 2823 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 2824 | }, 2825 | "yallist": { 2826 | "version": "2.1.2", 2827 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2828 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 2829 | }, 2830 | "yargs": { 2831 | "version": "3.32.0", 2832 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 2833 | "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 2834 | "requires": { 2835 | "camelcase": "2.1.1", 2836 | "cliui": "3.2.0", 2837 | "decamelize": "1.2.0", 2838 | "os-locale": "1.4.0", 2839 | "string-width": "1.0.2", 2840 | "window-size": "0.1.4", 2841 | "y18n": "3.2.1" 2842 | } 2843 | } 2844 | } 2845 | } 2846 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firebase-auth0-nodeserver", 3 | "version": "0.1.0", 4 | "description": "Node.js server that authenticates with an Auth0 access token and returns a Firebase auth token.", 5 | "repository": "https://github.com/auth0-blog/firebase-auth0-nodeserver", 6 | "main": "server.js", 7 | "scripts": { 8 | "start": "node server" 9 | }, 10 | "author": "Kim Maida for Auth0", 11 | "license": "MIT", 12 | "dependencies": { 13 | "body-parser": "^1.18.2", 14 | "cors": "^2.8.4", 15 | "express": "^4.16.2", 16 | "express-jwt": "^5.3.0", 17 | "firebase-admin": "^5.5.1", 18 | "jwks-rsa": "^1.2.1" 19 | }, 20 | "devDependencies": {} 21 | } 22 | -------------------------------------------------------------------------------- /routes.js: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | const jwt = require('express-jwt'); 3 | const jwks = require('jwks-rsa'); 4 | const firebaseAdmin = require('firebase-admin'); 5 | // Config 6 | const config = require('./config'); 7 | 8 | module.exports = function(app) { 9 | // Auth0 athentication middleware 10 | const jwtCheck = jwt({ 11 | secret: jwks.expressJwtSecret({ 12 | cache: true, 13 | rateLimit: true, 14 | jwksRequestsPerMinute: 5, 15 | jwksUri: `https://${config.AUTH0_DOMAIN}/.well-known/jwks.json` 16 | }), 17 | audience: config.AUTH0_API_AUDIENCE, 18 | issuer: `https://${config.AUTH0_DOMAIN}/`, 19 | algorithm: 'RS256' 20 | }); 21 | 22 | // Initialize Firebase Admin with service account 23 | const serviceAccount = require(config.FIREBASE_KEY); 24 | firebaseAdmin.initializeApp({ 25 | credential: firebaseAdmin.credential.cert(serviceAccount), 26 | databaseURL: config.FIREBASE_DB 27 | }); 28 | 29 | // GET object containing Firebase custom token 30 | app.get('/auth/firebase', jwtCheck, (req, res) => { 31 | // Create UID from authenticated Auth0 user 32 | const uid = req.user.sub; 33 | // Mint token using Firebase Admin SDK 34 | firebaseAdmin.auth().createCustomToken(uid) 35 | .then(customToken => 36 | // Response must be an object or Firebase errors 37 | res.json({firebaseToken: customToken}) 38 | ) 39 | .catch(err => 40 | res.status(500).send({ 41 | message: 'Something went wrong acquiring a Firebase token.', 42 | error: err 43 | }) 44 | ); 45 | }); 46 | 47 | // Set up dogs JSON data for API 48 | const dogs = require('./dogs.json'); 49 | const getDogsBasic = () => { 50 | const dogsBasicArr = dogs.map(dog => { 51 | return { 52 | rank: dog.rank, 53 | breed: dog.breed, 54 | image: dog.image 55 | } 56 | }); 57 | return dogsBasicArr; 58 | } 59 | 60 | // GET dogs (public) 61 | app.get('/api/dogs', (req, res) => { 62 | res.send(getDogsBasic()); 63 | }); 64 | 65 | // GET dog details by rank (private) 66 | app.get('/api/dog/:rank', jwtCheck, (req, res) => { 67 | const rank = req.params.rank * 1; 68 | const thisDog = dogs.find(dog => dog.rank === rank); 69 | res.send(thisDog); 70 | }); 71 | }; 72 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | // Modules 2 | const express = require('express'); 3 | const bodyParser = require('body-parser'); 4 | const cors = require('cors'); 5 | 6 | // App 7 | const app = express(); 8 | app.use(bodyParser.json()); 9 | app.use(bodyParser.urlencoded({ extended: false })); 10 | app.use(cors()); 11 | 12 | // Set port 13 | const port = process.env.PORT || '1337'; 14 | app.set('port', port); 15 | 16 | // Routes 17 | require('./routes')(app); 18 | 19 | // Server 20 | app.listen(port, () => console.log(`Server running on localhost:${port}`)); 21 | --------------------------------------------------------------------------------