├── .gitignore ├── LICENSE ├── README.md ├── dist ├── context.js ├── generated │ └── nexus.js ├── permissions │ └── index.js ├── schema.js ├── server.js ├── types │ ├── Account.js │ ├── AuthPayload.js │ ├── Mutation.js │ ├── Post.js │ ├── Query.js │ ├── User.js │ └── index.js └── utils.js ├── package.json ├── prisma ├── migrations │ ├── 20200616132140-init │ │ ├── README.md │ │ ├── schema.prisma │ │ └── steps.json │ ├── 20200627125449-add-access-token-username │ │ ├── README.md │ │ ├── schema.prisma │ │ └── steps.json │ ├── 20200627184613-add-account-and-email │ │ ├── README.md │ │ ├── schema.prisma │ │ └── steps.json │ ├── 20200701193358-add-account │ │ ├── README.md │ │ ├── schema.prisma │ │ └── steps.json │ ├── 20200703160622-add-email-verification-token │ │ ├── README.md │ │ ├── schema.prisma │ │ └── steps.json │ └── migrate.lock ├── schema.prisma └── seed.ts ├── schema.graphql ├── src ├── context.ts ├── permissions │ └── index.ts ├── schema.ts ├── server.ts ├── types │ ├── Account.ts │ ├── AuthPayload.ts │ ├── Mutation.ts │ ├── Post.ts │ ├── Query.ts │ ├── User.ts │ └── index.ts └── utils.ts ├── tools ├── authui-demo-1.gif ├── authui-demo-2.gif ├── diagram.png ├── examples.http ├── logo-png-200.png └── templates.png ├── tsconfig.json ├── yarn-error.log └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | src/generated/ 3 | *.env* 4 | 5 | # dist -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 AuthUI, Duc Nguyen. 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AuthUI Server 2 | 3 | Authentication-as-a-service 4 | 5 | - [AuthUI repo: Login Components](https://github.com/authui/authui) 6 | - [Live Example](https://codesandbox.io/s/authui-example-with-login-component-source-code-8jswg?module=/src/LoginBox/LoginBox.tsx) 7 | 8 | 9 | 10 | ### Motivations 11 | 12 | When starting a new project, it takes some effort to implement Login / Sign-up screens. Often times we have to repeat the same implementation again and again. 13 | 14 | - Authentication should be simple to remove frictions to build a MVP (Most Viable Product) or get users started. 15 | - AuthUI takes care of user login & sign up logic. 16 | - Save dev time to focus on main ideas. 17 | 18 | 19 | 20 | - [Live Example](https://codesandbox.io/s/authui-example-with-login-component-source-code-8jswg?module=/src/LoginBox/LoginBox.tsx) 21 | - [Login Component Templates - TailwindComponents](https://tailwindcomponents.com/search?query=login) 22 | - [Login Component Templates - TailwindUI templates](https://tailwindcomponents.com/search?query=login) 23 | 24 | 25 | 26 | ### Commands 27 | 28 | Node 13.x 29 | yarn 1.22.x 30 | 31 | server.ts - update PORT 32 | 33 | Prepare Database and Seed data: 34 | ``` 35 | $ yarn generate 36 | $ yarn seed 37 | ``` 38 | 39 | Run Dev: 40 | 41 | ``` 42 | $ yarn dev 43 | ``` 44 | 45 | ### Application flows: 46 | 47 | - Include the Login Component into the main app and customize it: [Example](https://codesandbox.io/s/authui-example-with-login-component-source-code-8jswg?module=/src/LoginBox/LoginBox.tsx) 48 | - The Login Component will make requests to AuthUI login or signup graphql endpoint. 49 | - AuthUI endpoints will respond with a JWT token (contains userId). 50 | 51 | ### Contributions 52 | 53 | Please open pull requests. Any contribution is welcome! -------------------------------------------------------------------------------- /dist/context.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __assign = (this && this.__assign) || function () { 3 | __assign = Object.assign || function(t) { 4 | for (var s, i = 1, n = arguments.length; i < n; i++) { 5 | s = arguments[i]; 6 | for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) 7 | t[p] = s[p]; 8 | } 9 | return t; 10 | }; 11 | return __assign.apply(this, arguments); 12 | }; 13 | exports.__esModule = true; 14 | exports.createContext = void 0; 15 | var client_1 = require("@prisma/client"); 16 | var prisma = new client_1.PrismaClient(); 17 | function createContext(request) { 18 | return __assign(__assign({}, request), { prisma: prisma }); 19 | } 20 | exports.createContext = createContext; 21 | -------------------------------------------------------------------------------- /dist/generated/nexus.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | /** 3 | * This file was automatically generated by GraphQL Nexus 4 | * Do not make changes to this file directly 5 | */ 6 | exports.__esModule = true; 7 | -------------------------------------------------------------------------------- /dist/permissions/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 | return new (P || (P = Promise))(function (resolve, reject) { 5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 | }); 10 | }; 11 | var __generator = (this && this.__generator) || function (thisArg, body) { 12 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 13 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 14 | function verb(n) { return function (v) { return step([n, v]); }; } 15 | function step(op) { 16 | if (f) throw new TypeError("Generator is already executing."); 17 | while (_) try { 18 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 19 | if (y = 0, t) op = [op[0] & 2, t.value]; 20 | switch (op[0]) { 21 | case 0: case 1: t = op; break; 22 | case 4: _.label++; return { value: op[1], done: false }; 23 | case 5: _.label++; y = op[1]; op = [0]; continue; 24 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 25 | default: 26 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 27 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 28 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 29 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 30 | if (t[2]) _.ops.pop(); 31 | _.trys.pop(); continue; 32 | } 33 | op = body.call(thisArg, _); 34 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 35 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 36 | } 37 | }; 38 | exports.__esModule = true; 39 | exports.permissions = void 0; 40 | var graphql_shield_1 = require("graphql-shield"); 41 | var utils_1 = require("../utils"); 42 | var rules = { 43 | isAuthenticatedUser: graphql_shield_1.rule()(function (parent, args, context) { 44 | var userId = utils_1.getUserId(context); 45 | return Boolean(userId); 46 | }), 47 | isPostOwner: graphql_shield_1.rule()(function (parent, _a, context) { 48 | var id = _a.id; 49 | return __awaiter(void 0, void 0, void 0, function () { 50 | var userId, author; 51 | return __generator(this, function (_b) { 52 | switch (_b.label) { 53 | case 0: 54 | userId = utils_1.getUserId(context); 55 | return [4 /*yield*/, context.prisma.post 56 | .findOne({ 57 | where: { 58 | id: Number(id) 59 | } 60 | }) 61 | .author()]; 62 | case 1: 63 | author = _b.sent(); 64 | return [2 /*return*/, userId === author.id]; 65 | } 66 | }); 67 | }); 68 | }) 69 | }; 70 | exports.permissions = graphql_shield_1.shield({ 71 | Query: { 72 | me: rules.isAuthenticatedUser, 73 | filterPosts: rules.isAuthenticatedUser, 74 | post: rules.isAuthenticatedUser 75 | }, 76 | Mutation: { 77 | createDraft: rules.isAuthenticatedUser, 78 | deletePost: rules.isPostOwner, 79 | publish: rules.isPostOwner 80 | } 81 | }); 82 | -------------------------------------------------------------------------------- /dist/schema.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | exports.__esModule = true; 3 | exports.schema = void 0; 4 | var schema_1 = require("@nexus/schema"); 5 | var nexus_prisma_1 = require("nexus-prisma"); 6 | var types = require("./types"); 7 | exports.schema = schema_1.makeSchema({ 8 | types: types, 9 | plugins: [nexus_prisma_1.nexusPrismaPlugin()], 10 | outputs: { 11 | schema: __dirname + '/../schema.graphql', 12 | typegen: __dirname + '/generated/nexus.ts' 13 | }, 14 | typegenAutoConfig: { 15 | sources: [ 16 | { 17 | source: '@prisma/client', 18 | alias: 'client' 19 | }, 20 | { 21 | source: require.resolve('./context'), 22 | alias: 'Context' 23 | }, 24 | ], 25 | contextType: 'Context.Context' 26 | } 27 | }); 28 | -------------------------------------------------------------------------------- /dist/server.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | exports.__esModule = true; 3 | var cors = require("cors"); 4 | var graphql_yoga_1 = require("graphql-yoga"); 5 | var permissions_1 = require("./permissions"); 6 | var schema_1 = require("./schema"); 7 | var context_1 = require("./context"); 8 | var PORT = process.env.PORT || 4001; 9 | var server = new graphql_yoga_1.GraphQLServer({ 10 | schema: schema_1.schema, 11 | context: context_1.createContext, 12 | middlewares: [permissions_1.permissions] 13 | }); 14 | server.express.use(cors()); 15 | // server.express.options('*', cors()); // enable pre-flight across-the-board 16 | server.start({ 17 | port: PORT, 18 | cors: { 19 | // origin: '*' 20 | // credentials: true, 21 | // methods: 'GET,HEAD,PUT,PATCH,POST,DELETE' 22 | } 23 | }, function () { 24 | return console.log("\uD83D\uDE80 Server ready at: http://localhost:" + PORT + "\n\u2B50\uFE0F See sample queries: http://pris.ly/e/ts/graphql-auth#using-the-graphql-api"); 25 | }); 26 | -------------------------------------------------------------------------------- /dist/types/Account.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | exports.__esModule = true; 3 | exports.User = void 0; 4 | var schema_1 = require("@nexus/schema"); 5 | exports.User = schema_1.objectType({ 6 | name: 'Account', 7 | definition: function (t) { 8 | t.model.accountId(), 9 | t.model.apiKey(), 10 | t.model.name(), 11 | t.model.ownerEmail(), 12 | t.model.createdAt(), 13 | t.model.updatedAt(); 14 | } 15 | }); 16 | -------------------------------------------------------------------------------- /dist/types/AuthPayload.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | exports.__esModule = true; 3 | exports.AuthPayload = void 0; 4 | var schema_1 = require("@nexus/schema"); 5 | exports.AuthPayload = schema_1.objectType({ 6 | name: 'AuthPayload', 7 | definition: function (t) { 8 | t.string('token'); 9 | t.field('user', { type: 'User' }); 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /dist/types/Mutation.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __assign = (this && this.__assign) || function () { 3 | __assign = Object.assign || function(t) { 4 | for (var s, i = 1, n = arguments.length; i < n; i++) { 5 | s = arguments[i]; 6 | for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) 7 | t[p] = s[p]; 8 | } 9 | return t; 10 | }; 11 | return __assign.apply(this, arguments); 12 | }; 13 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 14 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 15 | return new (P || (P = Promise))(function (resolve, reject) { 16 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 17 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 18 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 19 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 20 | }); 21 | }; 22 | var __generator = (this && this.__generator) || function (thisArg, body) { 23 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 24 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 25 | function verb(n) { return function (v) { return step([n, v]); }; } 26 | function step(op) { 27 | if (f) throw new TypeError("Generator is already executing."); 28 | while (_) try { 29 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 30 | if (y = 0, t) op = [op[0] & 2, t.value]; 31 | switch (op[0]) { 32 | case 0: case 1: t = op; break; 33 | case 4: _.label++; return { value: op[1], done: false }; 34 | case 5: _.label++; y = op[1]; op = [0]; continue; 35 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 36 | default: 37 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 38 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 39 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 40 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 41 | if (t[2]) _.ops.pop(); 42 | _.trys.pop(); continue; 43 | } 44 | op = body.call(thisArg, _); 45 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 46 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 47 | } 48 | }; 49 | var __spreadArrays = (this && this.__spreadArrays) || function () { 50 | for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; 51 | for (var r = Array(s), k = 0, i = 0; i < il; i++) 52 | for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) 53 | r[k] = a[j]; 54 | return r; 55 | }; 56 | exports.__esModule = true; 57 | exports.Mutation = void 0; 58 | var schema_1 = require("@nexus/schema"); 59 | var bcryptjs_1 = require("bcryptjs"); 60 | var jsonwebtoken_1 = require("jsonwebtoken"); 61 | var utils_1 = require("../utils"); 62 | var uuid_1 = require("uuid"); 63 | var lodash_1 = require("lodash"); 64 | var path = require('path'); 65 | var result = require('dotenv').config({ path: path.resolve(__dirname, '../../prisma/.env') }); 66 | if (result.error) { 67 | throw result.error; 68 | } 69 | else { 70 | console.log('- .env loaded'); 71 | } 72 | var mailgun = require('mailgun.js'); 73 | var mg = mailgun.client({ username: 'api', key: process.env.MAILGUN_API_KEY }); 74 | var omitFields = ['id', 'accountAndEmail', 'password', 'emailVerificationToken']; 75 | // In Progress - build URL to verify email: 76 | // const emailAfterSignUp = ({ accountName, toEmail }:{ accountName: string, toEmail: string }) => { 77 | // const url ='http://nothing.com'; 78 | // mg.messages.create(process.env.MAILGUN_DOMAIN, { 79 | // from: `Registration `, 80 | // to: [toEmail], 81 | // subject: "Thank you for registering", 82 | // text: `Thanks for registering with ${accountName} \n\nPlease click on the following link to verify your email address: \n${url}` 83 | // // html: "

Testing some Mailgun awesomness!

" 84 | // }) 85 | // .then((msg: string) => console.log(msg)) // logs response data 86 | // .catch((err: any) => console.log(err)); // logs any error 87 | // } 88 | var emailForPasswordReset = function (_a) { 89 | var accountName = _a.accountName, toEmail = _a.toEmail, newPassword = _a.newPassword; 90 | mg.messages.create(process.env.MAILGUN_DOMAIN, { 91 | from: "Registration ", 92 | to: [toEmail], 93 | subject: "Your temporary password", 94 | text: "You have just made a request to reset your password for " + accountName + " \n\nBelow is your new password: \n" + newPassword 95 | // html: "

Testing some Mailgun awesomness!

" 96 | }) 97 | .then(function (msg) { return console.log(msg); }) // logs response data 98 | ["catch"](function (err) { return console.log(err); }); // logs any error 99 | }; 100 | var upsertAccount = function (_a) { 101 | var ctx = _a.ctx, accountId = _a.accountId, email = _a.email; 102 | return __awaiter(void 0, void 0, void 0, function () { 103 | var dbAccount, account; 104 | return __generator(this, function (_b) { 105 | switch (_b.label) { 106 | case 0: return [4 /*yield*/, ctx.prisma.account.findOne({ 107 | where: { 108 | accountId: accountId 109 | } 110 | })]; 111 | case 1: 112 | dbAccount = _b.sent(); 113 | if (!!dbAccount) return [3 /*break*/, 3]; 114 | return [4 /*yield*/, ctx.prisma.account.create({ 115 | data: { 116 | accountId: accountId, 117 | name: accountId, 118 | ownerEmail: email.toLowerCase() 119 | } 120 | })]; 121 | case 2: 122 | account = _b.sent(); 123 | _b.label = 3; 124 | case 3: return [2 /*return*/]; 125 | } 126 | }); 127 | }); 128 | }; 129 | exports.Mutation = schema_1.mutationType({ 130 | definition: function (t) { 131 | var _this = this; 132 | t.field('signup', { 133 | type: 'AuthPayload', 134 | args: { 135 | accountId: schema_1.stringArg(), 136 | name: schema_1.stringArg(), 137 | email: schema_1.stringArg({ nullable: false }), 138 | password: schema_1.stringArg({ nullable: false }) 139 | }, 140 | resolve: function (_parent, _a, ctx) { 141 | var accountId = _a.accountId, name = _a.name, email = _a.email, password = _a.password; 142 | return __awaiter(_this, void 0, void 0, function () { 143 | var hashedPassword, accessToken, user; 144 | return __generator(this, function (_b) { 145 | switch (_b.label) { 146 | case 0: return [4 /*yield*/, bcryptjs_1.hash(password, 10)]; 147 | case 1: 148 | hashedPassword = _b.sent(); 149 | accessToken = uuid_1.v4(); 150 | return [4 /*yield*/, upsertAccount({ ctx: ctx, accountId: accountId || '', email: email }) 151 | // create new User 152 | ]; 153 | case 2: 154 | _b.sent(); 155 | return [4 /*yield*/, ctx.prisma.user.create({ 156 | data: { 157 | accountId: accountId, 158 | name: name, 159 | email: email.toLowerCase(), 160 | accountAndEmail: accountId + "_" + email.toLowerCase(), 161 | accessToken: accessToken, 162 | password: hashedPassword 163 | } 164 | })]; 165 | case 3: 166 | user = _b.sent(); 167 | return [2 /*return*/, { 168 | token: jsonwebtoken_1.sign(__assign(__assign({}, lodash_1.omit.apply(void 0, __spreadArrays([user], omitFields))), { accessToken: accessToken }), utils_1.APP_SECRET), 169 | user: user 170 | }]; 171 | } 172 | }); 173 | }); 174 | } 175 | }); 176 | t.field('login', { 177 | type: 'AuthPayload', 178 | args: { 179 | accountId: schema_1.stringArg({ nullable: false }), 180 | email: schema_1.stringArg({ nullable: false }), 181 | password: schema_1.stringArg({ nullable: false }) 182 | }, 183 | resolve: function (_parent, _a, ctx) { 184 | var accountId = _a.accountId, email = _a.email, password = _a.password; 185 | return __awaiter(_this, void 0, void 0, function () { 186 | var user, passwordValid, accessToken, lastUA, lastReferer; 187 | var _b; 188 | return __generator(this, function (_c) { 189 | switch (_c.label) { 190 | case 0: return [4 /*yield*/, ctx.prisma.user.findOne({ 191 | where: { 192 | accountAndEmail: accountId + "_" + email.toLowerCase() 193 | } 194 | })]; 195 | case 1: 196 | user = _c.sent(); 197 | if (!user) { 198 | throw new Error("No user found for email: " + email); 199 | } 200 | if (!user.active) { 201 | throw new Error("User is not active."); 202 | } 203 | return [4 /*yield*/, bcryptjs_1.compare(password, user.password)]; 204 | case 2: 205 | passwordValid = _c.sent(); 206 | if (!passwordValid) { 207 | throw new Error('Invalid password'); 208 | } 209 | accessToken = uuid_1.v4(); 210 | lastUA = ctx.request.headers['user-agent']; 211 | lastReferer = ctx.request.headers['referer']; 212 | return [4 /*yield*/, ctx.prisma.user.update({ 213 | where: { id: (_b = user.id) !== null && _b !== void 0 ? _b : -1 }, 214 | data: { 215 | accessToken: accessToken, 216 | loginCount: (user.loginCount || 0) + 1, 217 | lastLogin: new Date(), 218 | lastUA: lastUA, 219 | lastReferer: lastReferer 220 | } 221 | })]; 222 | case 3: 223 | _c.sent(); 224 | return [2 /*return*/, { 225 | token: jsonwebtoken_1.sign(__assign(__assign({}, lodash_1.omit.apply(void 0, __spreadArrays([user], omitFields))), { accessToken: accessToken }), utils_1.APP_SECRET), 226 | user: user 227 | }]; 228 | } 229 | }); 230 | }); 231 | } 232 | }); 233 | t.field('resetPassword', { 234 | type: 'AuthPayload', 235 | args: { 236 | accountId: schema_1.stringArg(), 237 | email: schema_1.stringArg({ nullable: false }) 238 | }, 239 | resolve: function (_parent, _a, ctx) { 240 | var accountId = _a.accountId, email = _a.email; 241 | return __awaiter(_this, void 0, void 0, function () { 242 | var user, newPassword, _b, _c, _d, _e; 243 | var _f; 244 | return __generator(this, function (_g) { 245 | switch (_g.label) { 246 | case 0: return [4 /*yield*/, ctx.prisma.user.findOne({ 247 | where: { 248 | accountAndEmail: accountId + "_" + email.toLowerCase() 249 | } 250 | })]; 251 | case 1: 252 | user = _g.sent(); 253 | if (!user) { 254 | throw new Error("No user found for email: " + email); 255 | } 256 | if (!user.active) { 257 | throw new Error("User is not active."); 258 | } 259 | newPassword = uuid_1.v4(); 260 | _c = (_b = ctx.prisma.user).update; 261 | _d = { 262 | where: { id: (_f = user.id) !== null && _f !== void 0 ? _f : -1 } 263 | }; 264 | _e = {}; 265 | return [4 /*yield*/, bcryptjs_1.hash(newPassword, 10)]; 266 | case 2: return [4 /*yield*/, _c.apply(_b, [(_d.data = (_e.password = _g.sent(), 267 | _e.resetAt = new Date(), 268 | _e), 269 | _d)])]; 270 | case 3: 271 | _g.sent(); 272 | emailForPasswordReset({ accountName: (accountId || ''), toEmail: email, newPassword: newPassword }); 273 | return [2 /*return*/, { 274 | token: jsonwebtoken_1.sign(__assign(__assign({}, lodash_1.omit(user, 'id', 'accountAndEmail', 'password')), { accessToken: '' }), utils_1.APP_SECRET), 275 | user: user 276 | }]; 277 | } 278 | }); 279 | }); 280 | } 281 | }); 282 | t.field('createDraft', { 283 | type: 'Post', 284 | args: { 285 | title: schema_1.stringArg({ nullable: false }), 286 | content: schema_1.stringArg() 287 | }, 288 | resolve: function (parent, _a, ctx) { 289 | var title = _a.title, content = _a.content; 290 | var userId = utils_1.getUserId(ctx); 291 | if (!userId) 292 | throw new Error('Could not authenticate user.'); 293 | return ctx.prisma.post.create({ 294 | data: { 295 | title: title, 296 | content: content, 297 | published: false, 298 | author: { connect: { id: Number(userId) } } 299 | } 300 | }); 301 | } 302 | }); 303 | t.field('deletePost', { 304 | type: 'Post', 305 | nullable: true, 306 | args: { id: schema_1.intArg({ nullable: false }) }, 307 | resolve: function (parent, _a, ctx) { 308 | var id = _a.id; 309 | return ctx.prisma.post["delete"]({ 310 | where: { 311 | id: id 312 | } 313 | }); 314 | } 315 | }); 316 | t.field('publish', { 317 | type: 'Post', 318 | nullable: true, 319 | args: { id: schema_1.intArg() }, 320 | resolve: function (parent, _a, ctx) { 321 | var id = _a.id; 322 | return ctx.prisma.post.update({ 323 | where: { id: id !== null && id !== void 0 ? id : -1 }, 324 | data: { published: true } 325 | }); 326 | } 327 | }); 328 | } 329 | }); 330 | -------------------------------------------------------------------------------- /dist/types/Post.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | exports.__esModule = true; 3 | exports.Post = void 0; 4 | var schema_1 = require("@nexus/schema"); 5 | exports.Post = schema_1.objectType({ 6 | name: 'Post', 7 | definition: function (t) { 8 | t.model.id(); 9 | t.model.published(); 10 | t.model.title(); 11 | t.model.content(); 12 | t.model.author(); 13 | } 14 | }); 15 | -------------------------------------------------------------------------------- /dist/types/Query.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | exports.__esModule = true; 3 | exports.Query = void 0; 4 | var schema_1 = require("@nexus/schema"); 5 | var utils_1 = require("../utils"); 6 | exports.Query = schema_1.queryType({ 7 | definition: function (t) { 8 | t.field('me', { 9 | type: 'User', 10 | nullable: true, 11 | resolve: function (parent, args, ctx) { 12 | var userId = utils_1.getUserId(ctx); 13 | return ctx.prisma.user.findOne({ 14 | where: { 15 | id: Number(userId) 16 | } 17 | }); 18 | } 19 | }); 20 | t.list.field('feed', { 21 | type: 'Post', 22 | resolve: function (parent, args, ctx) { 23 | return ctx.prisma.post.findMany({ 24 | where: { published: true } 25 | }); 26 | } 27 | }); 28 | t.list.field('filterPosts', { 29 | type: 'Post', 30 | args: { 31 | searchString: schema_1.stringArg({ nullable: true }) 32 | }, 33 | resolve: function (parent, _a, ctx) { 34 | var searchString = _a.searchString; 35 | return ctx.prisma.post.findMany({ 36 | where: { 37 | OR: [ 38 | { 39 | title: { 40 | contains: searchString || '' 41 | } 42 | }, 43 | { 44 | content: { 45 | contains: searchString 46 | } 47 | }, 48 | ] 49 | } 50 | }); 51 | } 52 | }); 53 | t.field('post', { 54 | type: 'Post', 55 | nullable: true, 56 | args: { id: schema_1.intArg() }, 57 | resolve: function (parent, _a, ctx) { 58 | var id = _a.id; 59 | return ctx.prisma.post.findOne({ 60 | where: { 61 | id: Number(id) 62 | } 63 | }); 64 | } 65 | }); 66 | } 67 | }); 68 | -------------------------------------------------------------------------------- /dist/types/User.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | exports.__esModule = true; 3 | exports.User = void 0; 4 | var schema_1 = require("@nexus/schema"); 5 | exports.User = schema_1.objectType({ 6 | name: 'User', 7 | definition: function (t) { 8 | t.model.accountId(); 9 | t.model.id(); 10 | t.model.uuid(); 11 | t.model.accessToken(); 12 | t.model.name(); 13 | t.model.email(); 14 | t.model.accountAndEmail(); 15 | t.model.emailVerified(); 16 | t.model.username(); 17 | t.model.phone(); 18 | t.model.phoneVerified(); 19 | t.model.active(); 20 | t.model.posts({ pagination: false }); 21 | t.model.picUrl(); 22 | t.model.loginCount(); 23 | t.model.lastLogin(); 24 | t.model.lastIP(); 25 | t.model.lastUA(); 26 | t.model.lastReferer(); 27 | t.model.lastLocation(); 28 | t.model.createdAt(); 29 | t.model.updatedAt(); 30 | t.model.resetAt(); 31 | t.model.active(); 32 | } 33 | }); 34 | -------------------------------------------------------------------------------- /dist/types/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 | if (k2 === undefined) k2 = k; 4 | Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); 5 | }) : (function(o, m, k, k2) { 6 | if (k2 === undefined) k2 = k; 7 | o[k2] = m[k]; 8 | })); 9 | var __exportStar = (this && this.__exportStar) || function(m, exports) { 10 | for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p); 11 | }; 12 | exports.__esModule = true; 13 | __exportStar(require("./AuthPayload"), exports); 14 | __exportStar(require("./Mutation"), exports); 15 | __exportStar(require("./Post"), exports); 16 | __exportStar(require("./Query"), exports); 17 | __exportStar(require("./User"), exports); 18 | -------------------------------------------------------------------------------- /dist/utils.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | exports.__esModule = true; 3 | exports.getUserId = exports.APP_SECRET = void 0; 4 | var jsonwebtoken_1 = require("jsonwebtoken"); 5 | exports.APP_SECRET = 'appsecret321'; 6 | function getUserId(context) { 7 | var Authorization = context.request.get('Authorization'); 8 | if (Authorization) { 9 | var token = Authorization.replace('Bearer ', ''); 10 | var verifiedToken = jsonwebtoken_1.verify(token, exports.APP_SECRET); 11 | return verifiedToken && verifiedToken.userId; 12 | } 13 | } 14 | exports.getUserId = getUserId; 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "authui-server", 3 | "license": "MIT", 4 | "scripts": { 5 | "heroku-postbuild": "", 6 | "start": "node dist/server", 7 | "clean": "rm -rf dist", 8 | "build": "npm -s run clean && npm -s run generate && tsc", 9 | "generate": "npm -s run generate:prisma && npm -s run generate:nexus", 10 | "generate:prisma": "prisma generate", 11 | "generate:nexus": "ts-node --transpile-only src/schema", 12 | "postinstall": "npm -s run generate", 13 | "dev": "ts-node-dev --no-notify --respawn --transpileOnly src/server", 14 | "seed": "ts-node-dev ./prisma/seed.ts" 15 | }, 16 | "dependencies": { 17 | "@nexus/schema": "0.13.1", 18 | "@prisma/client": "2.0.0-beta.8", 19 | "@types/lodash": "^4.14.157", 20 | "bcryptjs": "2.4.3", 21 | "cors": "^2.8.5", 22 | "dotenv": "^8.2.0", 23 | "graphql": "14.6.0", 24 | "graphql-shield": "5.7.3", 25 | "graphql-yoga": "1.18.3", 26 | "jsonwebtoken": "8.5.1", 27 | "lodash": "^4.17.15", 28 | "mailgun.js": "^2.0.1", 29 | "nexus-prisma": "0.13.0", 30 | "uuid": "^8.2.0" 31 | }, 32 | "devDependencies": { 33 | "@prisma/cli": "2.0.0-beta.8", 34 | "@types/bcryptjs": "2.4.2", 35 | "@types/jsonwebtoken": "8.5.0", 36 | "@types/node": "12.12.42", 37 | "@types/uuid": "^8.0.0", 38 | "@types/ws": "7.2.4", 39 | "ts-node": "8.10.1", 40 | "ts-node-dev": "1.0.0-pre.44", 41 | "typescript": "3.9.3" 42 | }, 43 | "prettier": { 44 | "singleQuote": true, 45 | "semi": false 46 | }, 47 | "engines": { 48 | "node": ">=10.0.0" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /prisma/migrations/20200616132140-init/README.md: -------------------------------------------------------------------------------- 1 | # Migration `20200616132140-init` 2 | 3 | This migration has been generated by ducwings at 6/16/2020, 1:21:40 PM. 4 | You can check out the [state of the schema](./schema.prisma) after the migration. 5 | 6 | ## Database Steps 7 | 8 | ```sql 9 | CREATE TABLE "public"."Post" ( 10 | "authorId" integer ,"content" text ,"id" SERIAL,"published" boolean NOT NULL DEFAULT false,"title" text NOT NULL , 11 | PRIMARY KEY ("id")) 12 | 13 | CREATE TABLE "public"."User" ( 14 | "accountId" text DEFAULT E'N/A',"active" boolean NOT NULL DEFAULT true,"createdAt" timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,"email" text NOT NULL ,"emailVerified" boolean NOT NULL DEFAULT false,"id" SERIAL,"lastIP" text ,"lastLogin" timestamp(3) ,"loginCount" integer DEFAULT 0,"name" text DEFAULT E'',"password" text NOT NULL DEFAULT E'',"phone" text DEFAULT E'',"phoneVerified" boolean NOT NULL DEFAULT false,"picUrl" text DEFAULT E'',"resetAt" timestamp(3) ,"updatedAt" timestamp(3) NOT NULL ,"uuid" text NOT NULL , 15 | PRIMARY KEY ("id")) 16 | 17 | CREATE UNIQUE INDEX "User.email" ON "public"."User"("email") 18 | 19 | ALTER TABLE "public"."Post" ADD FOREIGN KEY ("authorId")REFERENCES "public"."User"("id") ON DELETE SET NULL ON UPDATE CASCADE 20 | ``` 21 | 22 | ## Changes 23 | 24 | ```diff 25 | diff --git schema.prisma schema.prisma 26 | migration ..20200616132140-init 27 | --- datamodel.dml 28 | +++ datamodel.dml 29 | @@ -1,0 +1,38 @@ 30 | +generator client { 31 | + provider = "prisma-client-js" 32 | +} 33 | + 34 | +datasource db { 35 | + provider = "postgres" 36 | + url = env("DB_URL") 37 | +} 38 | + 39 | +model Post { 40 | + id Int @default(autoincrement()) @id 41 | + title String 42 | + content String? 43 | + published Boolean @default(false) 44 | + author User? @relation(fields: [authorId], references: [id]) 45 | + authorId Int? 46 | +} 47 | + 48 | +model User { 49 | + accountId String? @default("N/A") 50 | + id Int @default(autoincrement()) @id 51 | + uuid String @default(uuid()) 52 | + email String @unique 53 | + emailVerified Boolean @default(false) 54 | + password String @default("") 55 | + name String? @default("") 56 | + phone String? @default("") 57 | + phoneVerified Boolean @default(false) 58 | + posts Post[] 59 | + picUrl String? @default("") 60 | + loginCount Int? @default(0) 61 | + lastLogin DateTime? 62 | + lastIP String? 63 | + createdAt DateTime @default(now()) 64 | + updatedAt DateTime @updatedAt 65 | + resetAt DateTime? 66 | + active Boolean @default(true) 67 | +} 68 | ``` 69 | 70 | 71 | -------------------------------------------------------------------------------- /prisma/migrations/20200616132140-init/schema.prisma: -------------------------------------------------------------------------------- 1 | generator client { 2 | provider = "prisma-client-js" 3 | } 4 | 5 | datasource db { 6 | provider = "postgres" 7 | url = "***" 8 | } 9 | 10 | model Post { 11 | id Int @default(autoincrement()) @id 12 | title String 13 | content String? 14 | published Boolean @default(false) 15 | author User? @relation(fields: [authorId], references: [id]) 16 | authorId Int? 17 | } 18 | 19 | model User { 20 | accountId String? @default("N/A") 21 | id Int @default(autoincrement()) @id 22 | uuid String @default(uuid()) 23 | email String @unique 24 | emailVerified Boolean @default(false) 25 | password String @default("") 26 | name String? @default("") 27 | phone String? @default("") 28 | phoneVerified Boolean @default(false) 29 | posts Post[] 30 | picUrl String? @default("") 31 | loginCount Int? @default(0) 32 | lastLogin DateTime? 33 | lastIP String? 34 | createdAt DateTime @default(now()) 35 | updatedAt DateTime @updatedAt 36 | resetAt DateTime? 37 | active Boolean @default(true) 38 | } -------------------------------------------------------------------------------- /prisma/migrations/20200616132140-init/steps.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.3.14-fixed", 3 | "steps": [ 4 | { 5 | "tag": "CreateSource", 6 | "source": "db" 7 | }, 8 | { 9 | "tag": "CreateArgument", 10 | "location": { 11 | "tag": "Source", 12 | "source": "db" 13 | }, 14 | "argument": "provider", 15 | "value": "\"postgres\"" 16 | }, 17 | { 18 | "tag": "CreateArgument", 19 | "location": { 20 | "tag": "Source", 21 | "source": "db" 22 | }, 23 | "argument": "url", 24 | "value": "env(\"DB_URL\")" 25 | }, 26 | { 27 | "tag": "CreateModel", 28 | "model": "Post" 29 | }, 30 | { 31 | "tag": "CreateField", 32 | "model": "Post", 33 | "field": "id", 34 | "type": "Int", 35 | "arity": "Required" 36 | }, 37 | { 38 | "tag": "CreateDirective", 39 | "location": { 40 | "path": { 41 | "tag": "Field", 42 | "model": "Post", 43 | "field": "id" 44 | }, 45 | "directive": "default" 46 | } 47 | }, 48 | { 49 | "tag": "CreateArgument", 50 | "location": { 51 | "tag": "Directive", 52 | "path": { 53 | "tag": "Field", 54 | "model": "Post", 55 | "field": "id" 56 | }, 57 | "directive": "default" 58 | }, 59 | "argument": "", 60 | "value": "autoincrement()" 61 | }, 62 | { 63 | "tag": "CreateDirective", 64 | "location": { 65 | "path": { 66 | "tag": "Field", 67 | "model": "Post", 68 | "field": "id" 69 | }, 70 | "directive": "id" 71 | } 72 | }, 73 | { 74 | "tag": "CreateField", 75 | "model": "Post", 76 | "field": "title", 77 | "type": "String", 78 | "arity": "Required" 79 | }, 80 | { 81 | "tag": "CreateField", 82 | "model": "Post", 83 | "field": "content", 84 | "type": "String", 85 | "arity": "Optional" 86 | }, 87 | { 88 | "tag": "CreateField", 89 | "model": "Post", 90 | "field": "published", 91 | "type": "Boolean", 92 | "arity": "Required" 93 | }, 94 | { 95 | "tag": "CreateDirective", 96 | "location": { 97 | "path": { 98 | "tag": "Field", 99 | "model": "Post", 100 | "field": "published" 101 | }, 102 | "directive": "default" 103 | } 104 | }, 105 | { 106 | "tag": "CreateArgument", 107 | "location": { 108 | "tag": "Directive", 109 | "path": { 110 | "tag": "Field", 111 | "model": "Post", 112 | "field": "published" 113 | }, 114 | "directive": "default" 115 | }, 116 | "argument": "", 117 | "value": "false" 118 | }, 119 | { 120 | "tag": "CreateField", 121 | "model": "Post", 122 | "field": "author", 123 | "type": "User", 124 | "arity": "Optional" 125 | }, 126 | { 127 | "tag": "CreateDirective", 128 | "location": { 129 | "path": { 130 | "tag": "Field", 131 | "model": "Post", 132 | "field": "author" 133 | }, 134 | "directive": "relation" 135 | } 136 | }, 137 | { 138 | "tag": "CreateArgument", 139 | "location": { 140 | "tag": "Directive", 141 | "path": { 142 | "tag": "Field", 143 | "model": "Post", 144 | "field": "author" 145 | }, 146 | "directive": "relation" 147 | }, 148 | "argument": "fields", 149 | "value": "[authorId]" 150 | }, 151 | { 152 | "tag": "CreateArgument", 153 | "location": { 154 | "tag": "Directive", 155 | "path": { 156 | "tag": "Field", 157 | "model": "Post", 158 | "field": "author" 159 | }, 160 | "directive": "relation" 161 | }, 162 | "argument": "references", 163 | "value": "[id]" 164 | }, 165 | { 166 | "tag": "CreateField", 167 | "model": "Post", 168 | "field": "authorId", 169 | "type": "Int", 170 | "arity": "Optional" 171 | }, 172 | { 173 | "tag": "CreateModel", 174 | "model": "User" 175 | }, 176 | { 177 | "tag": "CreateField", 178 | "model": "User", 179 | "field": "accountId", 180 | "type": "String", 181 | "arity": "Optional" 182 | }, 183 | { 184 | "tag": "CreateDirective", 185 | "location": { 186 | "path": { 187 | "tag": "Field", 188 | "model": "User", 189 | "field": "accountId" 190 | }, 191 | "directive": "default" 192 | } 193 | }, 194 | { 195 | "tag": "CreateArgument", 196 | "location": { 197 | "tag": "Directive", 198 | "path": { 199 | "tag": "Field", 200 | "model": "User", 201 | "field": "accountId" 202 | }, 203 | "directive": "default" 204 | }, 205 | "argument": "", 206 | "value": "\"N/A\"" 207 | }, 208 | { 209 | "tag": "CreateField", 210 | "model": "User", 211 | "field": "id", 212 | "type": "Int", 213 | "arity": "Required" 214 | }, 215 | { 216 | "tag": "CreateDirective", 217 | "location": { 218 | "path": { 219 | "tag": "Field", 220 | "model": "User", 221 | "field": "id" 222 | }, 223 | "directive": "default" 224 | } 225 | }, 226 | { 227 | "tag": "CreateArgument", 228 | "location": { 229 | "tag": "Directive", 230 | "path": { 231 | "tag": "Field", 232 | "model": "User", 233 | "field": "id" 234 | }, 235 | "directive": "default" 236 | }, 237 | "argument": "", 238 | "value": "autoincrement()" 239 | }, 240 | { 241 | "tag": "CreateDirective", 242 | "location": { 243 | "path": { 244 | "tag": "Field", 245 | "model": "User", 246 | "field": "id" 247 | }, 248 | "directive": "id" 249 | } 250 | }, 251 | { 252 | "tag": "CreateField", 253 | "model": "User", 254 | "field": "uuid", 255 | "type": "String", 256 | "arity": "Required" 257 | }, 258 | { 259 | "tag": "CreateDirective", 260 | "location": { 261 | "path": { 262 | "tag": "Field", 263 | "model": "User", 264 | "field": "uuid" 265 | }, 266 | "directive": "default" 267 | } 268 | }, 269 | { 270 | "tag": "CreateArgument", 271 | "location": { 272 | "tag": "Directive", 273 | "path": { 274 | "tag": "Field", 275 | "model": "User", 276 | "field": "uuid" 277 | }, 278 | "directive": "default" 279 | }, 280 | "argument": "", 281 | "value": "uuid()" 282 | }, 283 | { 284 | "tag": "CreateField", 285 | "model": "User", 286 | "field": "email", 287 | "type": "String", 288 | "arity": "Required" 289 | }, 290 | { 291 | "tag": "CreateDirective", 292 | "location": { 293 | "path": { 294 | "tag": "Field", 295 | "model": "User", 296 | "field": "email" 297 | }, 298 | "directive": "unique" 299 | } 300 | }, 301 | { 302 | "tag": "CreateField", 303 | "model": "User", 304 | "field": "emailVerified", 305 | "type": "Boolean", 306 | "arity": "Required" 307 | }, 308 | { 309 | "tag": "CreateDirective", 310 | "location": { 311 | "path": { 312 | "tag": "Field", 313 | "model": "User", 314 | "field": "emailVerified" 315 | }, 316 | "directive": "default" 317 | } 318 | }, 319 | { 320 | "tag": "CreateArgument", 321 | "location": { 322 | "tag": "Directive", 323 | "path": { 324 | "tag": "Field", 325 | "model": "User", 326 | "field": "emailVerified" 327 | }, 328 | "directive": "default" 329 | }, 330 | "argument": "", 331 | "value": "false" 332 | }, 333 | { 334 | "tag": "CreateField", 335 | "model": "User", 336 | "field": "password", 337 | "type": "String", 338 | "arity": "Required" 339 | }, 340 | { 341 | "tag": "CreateDirective", 342 | "location": { 343 | "path": { 344 | "tag": "Field", 345 | "model": "User", 346 | "field": "password" 347 | }, 348 | "directive": "default" 349 | } 350 | }, 351 | { 352 | "tag": "CreateArgument", 353 | "location": { 354 | "tag": "Directive", 355 | "path": { 356 | "tag": "Field", 357 | "model": "User", 358 | "field": "password" 359 | }, 360 | "directive": "default" 361 | }, 362 | "argument": "", 363 | "value": "\"\"" 364 | }, 365 | { 366 | "tag": "CreateField", 367 | "model": "User", 368 | "field": "name", 369 | "type": "String", 370 | "arity": "Optional" 371 | }, 372 | { 373 | "tag": "CreateDirective", 374 | "location": { 375 | "path": { 376 | "tag": "Field", 377 | "model": "User", 378 | "field": "name" 379 | }, 380 | "directive": "default" 381 | } 382 | }, 383 | { 384 | "tag": "CreateArgument", 385 | "location": { 386 | "tag": "Directive", 387 | "path": { 388 | "tag": "Field", 389 | "model": "User", 390 | "field": "name" 391 | }, 392 | "directive": "default" 393 | }, 394 | "argument": "", 395 | "value": "\"\"" 396 | }, 397 | { 398 | "tag": "CreateField", 399 | "model": "User", 400 | "field": "phone", 401 | "type": "String", 402 | "arity": "Optional" 403 | }, 404 | { 405 | "tag": "CreateDirective", 406 | "location": { 407 | "path": { 408 | "tag": "Field", 409 | "model": "User", 410 | "field": "phone" 411 | }, 412 | "directive": "default" 413 | } 414 | }, 415 | { 416 | "tag": "CreateArgument", 417 | "location": { 418 | "tag": "Directive", 419 | "path": { 420 | "tag": "Field", 421 | "model": "User", 422 | "field": "phone" 423 | }, 424 | "directive": "default" 425 | }, 426 | "argument": "", 427 | "value": "\"\"" 428 | }, 429 | { 430 | "tag": "CreateField", 431 | "model": "User", 432 | "field": "phoneVerified", 433 | "type": "Boolean", 434 | "arity": "Required" 435 | }, 436 | { 437 | "tag": "CreateDirective", 438 | "location": { 439 | "path": { 440 | "tag": "Field", 441 | "model": "User", 442 | "field": "phoneVerified" 443 | }, 444 | "directive": "default" 445 | } 446 | }, 447 | { 448 | "tag": "CreateArgument", 449 | "location": { 450 | "tag": "Directive", 451 | "path": { 452 | "tag": "Field", 453 | "model": "User", 454 | "field": "phoneVerified" 455 | }, 456 | "directive": "default" 457 | }, 458 | "argument": "", 459 | "value": "false" 460 | }, 461 | { 462 | "tag": "CreateField", 463 | "model": "User", 464 | "field": "posts", 465 | "type": "Post", 466 | "arity": "List" 467 | }, 468 | { 469 | "tag": "CreateField", 470 | "model": "User", 471 | "field": "picUrl", 472 | "type": "String", 473 | "arity": "Optional" 474 | }, 475 | { 476 | "tag": "CreateDirective", 477 | "location": { 478 | "path": { 479 | "tag": "Field", 480 | "model": "User", 481 | "field": "picUrl" 482 | }, 483 | "directive": "default" 484 | } 485 | }, 486 | { 487 | "tag": "CreateArgument", 488 | "location": { 489 | "tag": "Directive", 490 | "path": { 491 | "tag": "Field", 492 | "model": "User", 493 | "field": "picUrl" 494 | }, 495 | "directive": "default" 496 | }, 497 | "argument": "", 498 | "value": "\"\"" 499 | }, 500 | { 501 | "tag": "CreateField", 502 | "model": "User", 503 | "field": "loginCount", 504 | "type": "Int", 505 | "arity": "Optional" 506 | }, 507 | { 508 | "tag": "CreateDirective", 509 | "location": { 510 | "path": { 511 | "tag": "Field", 512 | "model": "User", 513 | "field": "loginCount" 514 | }, 515 | "directive": "default" 516 | } 517 | }, 518 | { 519 | "tag": "CreateArgument", 520 | "location": { 521 | "tag": "Directive", 522 | "path": { 523 | "tag": "Field", 524 | "model": "User", 525 | "field": "loginCount" 526 | }, 527 | "directive": "default" 528 | }, 529 | "argument": "", 530 | "value": "0" 531 | }, 532 | { 533 | "tag": "CreateField", 534 | "model": "User", 535 | "field": "lastLogin", 536 | "type": "DateTime", 537 | "arity": "Optional" 538 | }, 539 | { 540 | "tag": "CreateField", 541 | "model": "User", 542 | "field": "lastIP", 543 | "type": "String", 544 | "arity": "Optional" 545 | }, 546 | { 547 | "tag": "CreateField", 548 | "model": "User", 549 | "field": "createdAt", 550 | "type": "DateTime", 551 | "arity": "Required" 552 | }, 553 | { 554 | "tag": "CreateDirective", 555 | "location": { 556 | "path": { 557 | "tag": "Field", 558 | "model": "User", 559 | "field": "createdAt" 560 | }, 561 | "directive": "default" 562 | } 563 | }, 564 | { 565 | "tag": "CreateArgument", 566 | "location": { 567 | "tag": "Directive", 568 | "path": { 569 | "tag": "Field", 570 | "model": "User", 571 | "field": "createdAt" 572 | }, 573 | "directive": "default" 574 | }, 575 | "argument": "", 576 | "value": "now()" 577 | }, 578 | { 579 | "tag": "CreateField", 580 | "model": "User", 581 | "field": "updatedAt", 582 | "type": "DateTime", 583 | "arity": "Required" 584 | }, 585 | { 586 | "tag": "CreateDirective", 587 | "location": { 588 | "path": { 589 | "tag": "Field", 590 | "model": "User", 591 | "field": "updatedAt" 592 | }, 593 | "directive": "updatedAt" 594 | } 595 | }, 596 | { 597 | "tag": "CreateField", 598 | "model": "User", 599 | "field": "resetAt", 600 | "type": "DateTime", 601 | "arity": "Optional" 602 | }, 603 | { 604 | "tag": "CreateField", 605 | "model": "User", 606 | "field": "active", 607 | "type": "Boolean", 608 | "arity": "Required" 609 | }, 610 | { 611 | "tag": "CreateDirective", 612 | "location": { 613 | "path": { 614 | "tag": "Field", 615 | "model": "User", 616 | "field": "active" 617 | }, 618 | "directive": "default" 619 | } 620 | }, 621 | { 622 | "tag": "CreateArgument", 623 | "location": { 624 | "tag": "Directive", 625 | "path": { 626 | "tag": "Field", 627 | "model": "User", 628 | "field": "active" 629 | }, 630 | "directive": "default" 631 | }, 632 | "argument": "", 633 | "value": "true" 634 | } 635 | ] 636 | } -------------------------------------------------------------------------------- /prisma/migrations/20200627125449-add-access-token-username/README.md: -------------------------------------------------------------------------------- 1 | # Migration `20200627125449-add-access-token-username` 2 | 3 | This migration has been generated by ducwings at 6/27/2020, 12:54:49 PM. 4 | You can check out the [state of the schema](./schema.prisma) after the migration. 5 | 6 | ## Database Steps 7 | 8 | ```sql 9 | CREATE TABLE "public"."Post" ( 10 | "authorId" integer ,"content" text ,"id" SERIAL,"published" boolean NOT NULL DEFAULT false,"title" text NOT NULL , 11 | PRIMARY KEY ("id")) 12 | 13 | CREATE TABLE "public"."User" ( 14 | "accessToken" text ,"accountId" text DEFAULT E'N/A',"active" boolean NOT NULL DEFAULT true,"createdAt" timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,"email" text NOT NULL ,"emailVerified" boolean NOT NULL DEFAULT false,"id" SERIAL,"lastIP" text ,"lastLogin" timestamp(3) ,"loginCount" integer DEFAULT 0,"name" text DEFAULT E'',"password" text NOT NULL DEFAULT E'',"phone" text DEFAULT E'',"phoneVerified" boolean NOT NULL DEFAULT false,"picUrl" text DEFAULT E'',"resetAt" timestamp(3) ,"updatedAt" timestamp(3) NOT NULL ,"username" text ,"uuid" text NOT NULL , 15 | PRIMARY KEY ("id")) 16 | 17 | CREATE UNIQUE INDEX "User.email" ON "public"."User"("email") 18 | 19 | CREATE UNIQUE INDEX "User.username" ON "public"."User"("username") 20 | 21 | ALTER TABLE "public"."Post" ADD FOREIGN KEY ("authorId")REFERENCES "public"."User"("id") ON DELETE SET NULL ON UPDATE CASCADE 22 | ``` 23 | 24 | ## Changes 25 | 26 | ```diff 27 | diff --git schema.prisma schema.prisma 28 | migration 20200616132140-init..20200627125449-add-access-token-username 29 | --- datamodel.dml 30 | +++ datamodel.dml 31 | @@ -3,9 +3,9 @@ 32 | } 33 | datasource db { 34 | provider = "postgres" 35 | - url = "***" 36 | + url = env("DB_URL") 37 | } 38 | model Post { 39 | id Int @default(autoincrement()) @id 40 | @@ -19,10 +19,12 @@ 41 | model User { 42 | accountId String? @default("N/A") 43 | id Int @default(autoincrement()) @id 44 | uuid String @default(uuid()) 45 | + accessToken String? @default(uuid()) 46 | email String @unique 47 | emailVerified Boolean @default(false) 48 | + username String? @unique 49 | password String @default("") 50 | name String? @default("") 51 | phone String? @default("") 52 | phoneVerified Boolean @default(false) 53 | ``` 54 | 55 | 56 | -------------------------------------------------------------------------------- /prisma/migrations/20200627125449-add-access-token-username/schema.prisma: -------------------------------------------------------------------------------- 1 | generator client { 2 | provider = "prisma-client-js" 3 | } 4 | 5 | datasource db { 6 | provider = "postgres" 7 | url = "***" 8 | } 9 | 10 | model Post { 11 | id Int @default(autoincrement()) @id 12 | title String 13 | content String? 14 | published Boolean @default(false) 15 | author User? @relation(fields: [authorId], references: [id]) 16 | authorId Int? 17 | } 18 | 19 | model User { 20 | accountId String? @default("N/A") 21 | id Int @default(autoincrement()) @id 22 | uuid String @default(uuid()) 23 | accessToken String? @default(uuid()) 24 | email String @unique 25 | emailVerified Boolean @default(false) 26 | username String? @unique 27 | password String @default("") 28 | name String? @default("") 29 | phone String? @default("") 30 | phoneVerified Boolean @default(false) 31 | posts Post[] 32 | picUrl String? @default("") 33 | loginCount Int? @default(0) 34 | lastLogin DateTime? 35 | lastIP String? 36 | createdAt DateTime @default(now()) 37 | updatedAt DateTime @updatedAt 38 | resetAt DateTime? 39 | active Boolean @default(true) 40 | } -------------------------------------------------------------------------------- /prisma/migrations/20200627125449-add-access-token-username/steps.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.3.14-fixed", 3 | "steps": [ 4 | { 5 | "tag": "CreateField", 6 | "model": "User", 7 | "field": "accessToken", 8 | "type": "String", 9 | "arity": "Optional" 10 | }, 11 | { 12 | "tag": "CreateDirective", 13 | "location": { 14 | "path": { 15 | "tag": "Field", 16 | "model": "User", 17 | "field": "accessToken" 18 | }, 19 | "directive": "default" 20 | } 21 | }, 22 | { 23 | "tag": "CreateArgument", 24 | "location": { 25 | "tag": "Directive", 26 | "path": { 27 | "tag": "Field", 28 | "model": "User", 29 | "field": "accessToken" 30 | }, 31 | "directive": "default" 32 | }, 33 | "argument": "", 34 | "value": "uuid()" 35 | }, 36 | { 37 | "tag": "CreateField", 38 | "model": "User", 39 | "field": "username", 40 | "type": "String", 41 | "arity": "Optional" 42 | }, 43 | { 44 | "tag": "CreateDirective", 45 | "location": { 46 | "path": { 47 | "tag": "Field", 48 | "model": "User", 49 | "field": "username" 50 | }, 51 | "directive": "unique" 52 | } 53 | } 54 | ] 55 | } -------------------------------------------------------------------------------- /prisma/migrations/20200627184613-add-account-and-email/README.md: -------------------------------------------------------------------------------- 1 | # Migration `20200627184613-add-account-and-email` 2 | 3 | This migration has been generated by ducwings at 6/27/2020, 6:46:13 PM. 4 | You can check out the [state of the schema](./schema.prisma) after the migration. 5 | 6 | ## Database Steps 7 | 8 | ```sql 9 | DROP INDEX "public"."User.email" 10 | 11 | DROP INDEX "public"."User.username" 12 | 13 | ALTER TABLE "public"."User" ADD COLUMN "accountAndEmail" text , 14 | ALTER COLUMN "username" SET DEFAULT E''; 15 | 16 | CREATE UNIQUE INDEX "User.accountAndEmail" ON "public"."User"("accountAndEmail") 17 | ``` 18 | 19 | ## Changes 20 | 21 | ```diff 22 | diff --git schema.prisma schema.prisma 23 | migration 20200627125449-add-access-token-username..20200627184613-add-account-and-email 24 | --- datamodel.dml 25 | +++ datamodel.dml 26 | @@ -3,9 +3,9 @@ 27 | } 28 | datasource db { 29 | provider = "postgres" 30 | - url = "***" 31 | + url = env("DB_URL") 32 | } 33 | model Post { 34 | id Int @default(autoincrement()) @id 35 | @@ -20,11 +20,12 @@ 36 | accountId String? @default("N/A") 37 | id Int @default(autoincrement()) @id 38 | uuid String @default(uuid()) 39 | accessToken String? @default(uuid()) 40 | - email String @unique 41 | + email String 42 | emailVerified Boolean @default(false) 43 | - username String? @unique 44 | + accountAndEmail String? @unique 45 | + username String? @default("") 46 | password String @default("") 47 | name String? @default("") 48 | phone String? @default("") 49 | phoneVerified Boolean @default(false) 50 | ``` 51 | 52 | 53 | -------------------------------------------------------------------------------- /prisma/migrations/20200627184613-add-account-and-email/schema.prisma: -------------------------------------------------------------------------------- 1 | generator client { 2 | provider = "prisma-client-js" 3 | } 4 | 5 | datasource db { 6 | provider = "postgres" 7 | url = "***" 8 | } 9 | 10 | model Post { 11 | id Int @default(autoincrement()) @id 12 | title String 13 | content String? 14 | published Boolean @default(false) 15 | author User? @relation(fields: [authorId], references: [id]) 16 | authorId Int? 17 | } 18 | 19 | model User { 20 | accountId String? @default("N/A") 21 | id Int @default(autoincrement()) @id 22 | uuid String @default(uuid()) 23 | accessToken String? @default(uuid()) 24 | email String 25 | emailVerified Boolean @default(false) 26 | accountAndEmail String? @unique 27 | username String? @default("") 28 | password String @default("") 29 | name String? @default("") 30 | phone String? @default("") 31 | phoneVerified Boolean @default(false) 32 | posts Post[] 33 | picUrl String? @default("") 34 | loginCount Int? @default(0) 35 | lastLogin DateTime? 36 | lastIP String? 37 | createdAt DateTime @default(now()) 38 | updatedAt DateTime @updatedAt 39 | resetAt DateTime? 40 | active Boolean @default(true) 41 | } -------------------------------------------------------------------------------- /prisma/migrations/20200627184613-add-account-and-email/steps.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.3.14-fixed", 3 | "steps": [ 4 | { 5 | "tag": "CreateField", 6 | "model": "User", 7 | "field": "accountAndEmail", 8 | "type": "String", 9 | "arity": "Optional" 10 | }, 11 | { 12 | "tag": "CreateDirective", 13 | "location": { 14 | "path": { 15 | "tag": "Field", 16 | "model": "User", 17 | "field": "accountAndEmail" 18 | }, 19 | "directive": "unique" 20 | } 21 | }, 22 | { 23 | "tag": "DeleteDirective", 24 | "location": { 25 | "path": { 26 | "tag": "Field", 27 | "model": "User", 28 | "field": "email" 29 | }, 30 | "directive": "unique" 31 | } 32 | }, 33 | { 34 | "tag": "CreateDirective", 35 | "location": { 36 | "path": { 37 | "tag": "Field", 38 | "model": "User", 39 | "field": "username" 40 | }, 41 | "directive": "default" 42 | } 43 | }, 44 | { 45 | "tag": "CreateArgument", 46 | "location": { 47 | "tag": "Directive", 48 | "path": { 49 | "tag": "Field", 50 | "model": "User", 51 | "field": "username" 52 | }, 53 | "directive": "default" 54 | }, 55 | "argument": "", 56 | "value": "\"\"" 57 | }, 58 | { 59 | "tag": "DeleteDirective", 60 | "location": { 61 | "path": { 62 | "tag": "Field", 63 | "model": "User", 64 | "field": "username" 65 | }, 66 | "directive": "unique" 67 | } 68 | } 69 | ] 70 | } -------------------------------------------------------------------------------- /prisma/migrations/20200701193358-add-account/README.md: -------------------------------------------------------------------------------- 1 | # Migration `20200701193358-add-account` 2 | 3 | This migration has been generated by ducwings at 7/1/2020, 7:33:58 PM. 4 | You can check out the [state of the schema](./schema.prisma) after the migration. 5 | 6 | ## Database Steps 7 | 8 | ```sql 9 | ALTER TABLE "public"."User" ADD COLUMN "lastReferer" text ; 10 | ``` 11 | 12 | ## Changes 13 | 14 | ```diff 15 | diff --git schema.prisma schema.prisma 16 | migration 20200627184613-add-account-and-email..20200701193358-add-account 17 | --- datamodel.dml 18 | +++ datamodel.dml 19 | @@ -3,9 +3,9 @@ 20 | } 21 | datasource db { 22 | provider = "postgres" 23 | - url = "***" 24 | + url = env("DB_URL") 25 | } 26 | model Post { 27 | id Int @default(autoincrement()) @id 28 | @@ -15,8 +15,17 @@ 29 | author User? @relation(fields: [authorId], references: [id]) 30 | authorId Int? 31 | } 32 | +model Account { 33 | + accountId String @unique 34 | + name String? @default("") @unique 35 | + apiKey String @default(uuid()) 36 | + ownerEmail String @unique 37 | + createdAt DateTime @default(now()) 38 | + updatedAt DateTime @updatedAt 39 | +} 40 | + 41 | model User { 42 | accountId String? @default("N/A") 43 | id Int @default(autoincrement()) @id 44 | uuid String @default(uuid()) 45 | @@ -33,8 +42,11 @@ 46 | picUrl String? @default("") 47 | loginCount Int? @default(0) 48 | lastLogin DateTime? 49 | lastIP String? 50 | + lastUA String? 51 | + lastReferer String? 52 | + lastLocation String? 53 | createdAt DateTime @default(now()) 54 | updatedAt DateTime @updatedAt 55 | resetAt DateTime? 56 | active Boolean @default(true) 57 | ``` 58 | 59 | 60 | -------------------------------------------------------------------------------- /prisma/migrations/20200701193358-add-account/schema.prisma: -------------------------------------------------------------------------------- 1 | generator client { 2 | provider = "prisma-client-js" 3 | } 4 | 5 | datasource db { 6 | provider = "postgres" 7 | url = "***" 8 | } 9 | 10 | model Post { 11 | id Int @default(autoincrement()) @id 12 | title String 13 | content String? 14 | published Boolean @default(false) 15 | author User? @relation(fields: [authorId], references: [id]) 16 | authorId Int? 17 | } 18 | 19 | model Account { 20 | accountId String @unique 21 | name String? @default("") @unique 22 | apiKey String @default(uuid()) 23 | ownerEmail String @unique 24 | createdAt DateTime @default(now()) 25 | updatedAt DateTime @updatedAt 26 | } 27 | 28 | model User { 29 | accountId String? @default("N/A") 30 | id Int @default(autoincrement()) @id 31 | uuid String @default(uuid()) 32 | accessToken String? @default(uuid()) 33 | email String 34 | emailVerified Boolean @default(false) 35 | accountAndEmail String? @unique 36 | username String? @default("") 37 | password String @default("") 38 | name String? @default("") 39 | phone String? @default("") 40 | phoneVerified Boolean @default(false) 41 | posts Post[] 42 | picUrl String? @default("") 43 | loginCount Int? @default(0) 44 | lastLogin DateTime? 45 | lastIP String? 46 | lastUA String? 47 | lastReferer String? 48 | lastLocation String? 49 | createdAt DateTime @default(now()) 50 | updatedAt DateTime @updatedAt 51 | resetAt DateTime? 52 | active Boolean @default(true) 53 | } -------------------------------------------------------------------------------- /prisma/migrations/20200701193358-add-account/steps.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.3.14-fixed", 3 | "steps": [ 4 | { 5 | "tag": "CreateModel", 6 | "model": "Account" 7 | }, 8 | { 9 | "tag": "CreateField", 10 | "model": "Account", 11 | "field": "accountId", 12 | "type": "String", 13 | "arity": "Required" 14 | }, 15 | { 16 | "tag": "CreateDirective", 17 | "location": { 18 | "path": { 19 | "tag": "Field", 20 | "model": "Account", 21 | "field": "accountId" 22 | }, 23 | "directive": "unique" 24 | } 25 | }, 26 | { 27 | "tag": "CreateField", 28 | "model": "Account", 29 | "field": "name", 30 | "type": "String", 31 | "arity": "Optional" 32 | }, 33 | { 34 | "tag": "CreateDirective", 35 | "location": { 36 | "path": { 37 | "tag": "Field", 38 | "model": "Account", 39 | "field": "name" 40 | }, 41 | "directive": "default" 42 | } 43 | }, 44 | { 45 | "tag": "CreateArgument", 46 | "location": { 47 | "tag": "Directive", 48 | "path": { 49 | "tag": "Field", 50 | "model": "Account", 51 | "field": "name" 52 | }, 53 | "directive": "default" 54 | }, 55 | "argument": "", 56 | "value": "\"\"" 57 | }, 58 | { 59 | "tag": "CreateDirective", 60 | "location": { 61 | "path": { 62 | "tag": "Field", 63 | "model": "Account", 64 | "field": "name" 65 | }, 66 | "directive": "unique" 67 | } 68 | }, 69 | { 70 | "tag": "CreateField", 71 | "model": "Account", 72 | "field": "apiKey", 73 | "type": "String", 74 | "arity": "Required" 75 | }, 76 | { 77 | "tag": "CreateDirective", 78 | "location": { 79 | "path": { 80 | "tag": "Field", 81 | "model": "Account", 82 | "field": "apiKey" 83 | }, 84 | "directive": "default" 85 | } 86 | }, 87 | { 88 | "tag": "CreateArgument", 89 | "location": { 90 | "tag": "Directive", 91 | "path": { 92 | "tag": "Field", 93 | "model": "Account", 94 | "field": "apiKey" 95 | }, 96 | "directive": "default" 97 | }, 98 | "argument": "", 99 | "value": "uuid()" 100 | }, 101 | { 102 | "tag": "CreateField", 103 | "model": "Account", 104 | "field": "ownerEmail", 105 | "type": "String", 106 | "arity": "Required" 107 | }, 108 | { 109 | "tag": "CreateDirective", 110 | "location": { 111 | "path": { 112 | "tag": "Field", 113 | "model": "Account", 114 | "field": "ownerEmail" 115 | }, 116 | "directive": "unique" 117 | } 118 | }, 119 | { 120 | "tag": "CreateField", 121 | "model": "Account", 122 | "field": "createdAt", 123 | "type": "DateTime", 124 | "arity": "Required" 125 | }, 126 | { 127 | "tag": "CreateDirective", 128 | "location": { 129 | "path": { 130 | "tag": "Field", 131 | "model": "Account", 132 | "field": "createdAt" 133 | }, 134 | "directive": "default" 135 | } 136 | }, 137 | { 138 | "tag": "CreateArgument", 139 | "location": { 140 | "tag": "Directive", 141 | "path": { 142 | "tag": "Field", 143 | "model": "Account", 144 | "field": "createdAt" 145 | }, 146 | "directive": "default" 147 | }, 148 | "argument": "", 149 | "value": "now()" 150 | }, 151 | { 152 | "tag": "CreateField", 153 | "model": "Account", 154 | "field": "updatedAt", 155 | "type": "DateTime", 156 | "arity": "Required" 157 | }, 158 | { 159 | "tag": "CreateDirective", 160 | "location": { 161 | "path": { 162 | "tag": "Field", 163 | "model": "Account", 164 | "field": "updatedAt" 165 | }, 166 | "directive": "updatedAt" 167 | } 168 | }, 169 | { 170 | "tag": "CreateField", 171 | "model": "User", 172 | "field": "lastUA", 173 | "type": "String", 174 | "arity": "Optional" 175 | }, 176 | { 177 | "tag": "CreateField", 178 | "model": "User", 179 | "field": "lastReferer", 180 | "type": "String", 181 | "arity": "Optional" 182 | }, 183 | { 184 | "tag": "CreateField", 185 | "model": "User", 186 | "field": "lastLocation", 187 | "type": "String", 188 | "arity": "Optional" 189 | } 190 | ] 191 | } -------------------------------------------------------------------------------- /prisma/migrations/20200703160622-add-email-verification-token/README.md: -------------------------------------------------------------------------------- 1 | # Migration `20200703160622-add-email-verification-token` 2 | 3 | This migration has been generated by ducwings at 7/3/2020, 4:06:22 PM. 4 | You can check out the [state of the schema](./schema.prisma) after the migration. 5 | 6 | ## Database Steps 7 | 8 | ```sql 9 | CREATE UNIQUE INDEX "User.emailVerificationToken" ON "public"."User"("emailVerificationToken") 10 | ``` 11 | 12 | ## Changes 13 | 14 | ```diff 15 | diff --git schema.prisma schema.prisma 16 | migration 20200701193358-add-account..20200703160622-add-email-verification-token 17 | --- datamodel.dml 18 | +++ datamodel.dml 19 | @@ -3,9 +3,9 @@ 20 | } 21 | datasource db { 22 | provider = "postgres" 23 | - url = "***" 24 | + url = env("DB_URL") 25 | } 26 | model Post { 27 | id Int @default(autoincrement()) @id 28 | @@ -31,8 +31,9 @@ 29 | uuid String @default(uuid()) 30 | accessToken String? @default(uuid()) 31 | email String 32 | emailVerified Boolean @default(false) 33 | + emailVerificationToken String? @unique @default(uuid()) 34 | accountAndEmail String? @unique 35 | username String? @default("") 36 | password String @default("") 37 | name String? @default("") 38 | ``` 39 | 40 | 41 | -------------------------------------------------------------------------------- /prisma/migrations/20200703160622-add-email-verification-token/schema.prisma: -------------------------------------------------------------------------------- 1 | generator client { 2 | provider = "prisma-client-js" 3 | } 4 | 5 | datasource db { 6 | provider = "postgres" 7 | url = "***" 8 | } 9 | 10 | model Post { 11 | id Int @default(autoincrement()) @id 12 | title String 13 | content String? 14 | published Boolean @default(false) 15 | author User? @relation(fields: [authorId], references: [id]) 16 | authorId Int? 17 | } 18 | 19 | model Account { 20 | accountId String @unique 21 | name String? @default("") @unique 22 | apiKey String @default(uuid()) 23 | ownerEmail String @unique 24 | createdAt DateTime @default(now()) 25 | updatedAt DateTime @updatedAt 26 | } 27 | 28 | model User { 29 | accountId String? @default("N/A") 30 | id Int @default(autoincrement()) @id 31 | uuid String @default(uuid()) 32 | accessToken String? @default(uuid()) 33 | email String 34 | emailVerified Boolean @default(false) 35 | emailVerificationToken String? @unique @default(uuid()) 36 | accountAndEmail String? @unique 37 | username String? @default("") 38 | password String @default("") 39 | name String? @default("") 40 | phone String? @default("") 41 | phoneVerified Boolean @default(false) 42 | posts Post[] 43 | picUrl String? @default("") 44 | loginCount Int? @default(0) 45 | lastLogin DateTime? 46 | lastIP String? 47 | lastUA String? 48 | lastReferer String? 49 | lastLocation String? 50 | createdAt DateTime @default(now()) 51 | updatedAt DateTime @updatedAt 52 | resetAt DateTime? 53 | active Boolean @default(true) 54 | } -------------------------------------------------------------------------------- /prisma/migrations/20200703160622-add-email-verification-token/steps.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.3.14-fixed", 3 | "steps": [ 4 | { 5 | "tag": "CreateField", 6 | "model": "User", 7 | "field": "emailVerificationToken", 8 | "type": "String", 9 | "arity": "Optional" 10 | }, 11 | { 12 | "tag": "CreateDirective", 13 | "location": { 14 | "path": { 15 | "tag": "Field", 16 | "model": "User", 17 | "field": "emailVerificationToken" 18 | }, 19 | "directive": "unique" 20 | } 21 | }, 22 | { 23 | "tag": "CreateDirective", 24 | "location": { 25 | "path": { 26 | "tag": "Field", 27 | "model": "User", 28 | "field": "emailVerificationToken" 29 | }, 30 | "directive": "default" 31 | } 32 | }, 33 | { 34 | "tag": "CreateArgument", 35 | "location": { 36 | "tag": "Directive", 37 | "path": { 38 | "tag": "Field", 39 | "model": "User", 40 | "field": "emailVerificationToken" 41 | }, 42 | "directive": "default" 43 | }, 44 | "argument": "", 45 | "value": "uuid()" 46 | } 47 | ] 48 | } -------------------------------------------------------------------------------- /prisma/migrations/migrate.lock: -------------------------------------------------------------------------------- 1 | # Prisma Migrate lockfile v1 2 | 3 | 20200616132140-init 4 | 20200627125449-add-access-token-username 5 | 20200627184613-add-account-and-email 6 | 20200701193358-add-account 7 | 20200703160622-add-email-verification-token -------------------------------------------------------------------------------- /prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | generator client { 2 | provider = "prisma-client-js" 3 | } 4 | 5 | datasource db { 6 | provider = "postgres" 7 | url = env("DB_URL") 8 | } 9 | 10 | model Post { 11 | id Int @default(autoincrement()) @id 12 | title String 13 | content String? 14 | published Boolean @default(false) 15 | author User? @relation(fields: [authorId], references: [id]) 16 | authorId Int? 17 | } 18 | 19 | model Account { 20 | accountId String @unique 21 | name String? @default("") @unique 22 | apiKey String @default(uuid()) 23 | ownerEmail String @unique 24 | createdAt DateTime @default(now()) 25 | updatedAt DateTime @updatedAt 26 | } 27 | 28 | model User { 29 | accountId String? @default("N/A") 30 | id Int @default(autoincrement()) @id 31 | uuid String @default(uuid()) 32 | accessToken String? @default(uuid()) 33 | email String 34 | emailVerified Boolean @default(false) 35 | emailVerificationToken String? @unique @default(uuid()) 36 | accountAndEmail String? @unique 37 | username String? @default("") 38 | password String @default("") 39 | name String? @default("") 40 | phone String? @default("") 41 | phoneVerified Boolean @default(false) 42 | posts Post[] 43 | picUrl String? @default("") 44 | loginCount Int? @default(0) 45 | lastLogin DateTime? 46 | lastIP String? 47 | lastUA String? 48 | lastReferer String? 49 | lastLocation String? 50 | createdAt DateTime @default(now()) 51 | updatedAt DateTime @updatedAt 52 | resetAt DateTime? 53 | active Boolean @default(true) 54 | } -------------------------------------------------------------------------------- /prisma/seed.ts: -------------------------------------------------------------------------------- 1 | import { PrismaClient } from '@prisma/client' 2 | 3 | const prisma = new PrismaClient() 4 | 5 | async function main() { 6 | await prisma.user.create({ 7 | data: { 8 | email: 'alice@prisma.io', 9 | name: 'Alice', 10 | posts: { 11 | create: { 12 | title: 'Watch the talks from Prisma Day 2019', 13 | content: 'https://www.prisma.io/blog/z11sg6ipb3i1/', 14 | published: true, 15 | }, 16 | }, 17 | }, 18 | }) 19 | await prisma.user.create({ 20 | data: { 21 | email: 'bob@prisma.io', 22 | name: 'Bob', 23 | posts: { 24 | create: [ 25 | { 26 | title: 'Subscribe to GraphQL Weekly for community news', 27 | content: 'https://graphqlweekly.com/', 28 | published: true, 29 | }, 30 | { 31 | title: 'Follow Prisma on Twitter', 32 | content: 'https://twitter.com/prisma/', 33 | published: false, 34 | }, 35 | ], 36 | }, 37 | }, 38 | }) 39 | } 40 | 41 | main() 42 | .catch(e => { 43 | throw e 44 | }) 45 | .finally(async () => { 46 | await prisma.disconnect() 47 | }) -------------------------------------------------------------------------------- /schema.graphql: -------------------------------------------------------------------------------- 1 | ### This file was autogenerated by GraphQL Nexus 2 | ### Do not make changes to this file directly 3 | 4 | 5 | type AuthPayload { 6 | token: String! 7 | user: User! 8 | } 9 | 10 | scalar DateTime 11 | 12 | type Mutation { 13 | createDraft(content: String, title: String!): Post! 14 | deletePost(id: Int!): Post 15 | login(accountId: String!, email: String!, password: String!): AuthPayload! 16 | publish(id: Int): Post 17 | resetPassword(accountId: String, email: String!): AuthPayload! 18 | signup(accountId: String, email: String!, name: String, password: String!): AuthPayload! 19 | verifyEmail(emailVerificationToken: String!): AuthPayload! 20 | } 21 | 22 | type Post { 23 | author: User 24 | content: String 25 | id: Int! 26 | published: Boolean! 27 | title: String! 28 | } 29 | 30 | type Query { 31 | feed: [Post!]! 32 | filterPosts(searchString: String): [Post!]! 33 | me: User 34 | post(id: Int): Post 35 | } 36 | 37 | type User { 38 | accessToken: String 39 | accountAndEmail: String 40 | accountId: String 41 | active: Boolean! 42 | createdAt: DateTime! 43 | email: String! 44 | emailVerificationToken: String 45 | emailVerified: Boolean! 46 | id: Int! 47 | lastIP: String 48 | lastLocation: String 49 | lastLogin: DateTime 50 | lastReferer: String 51 | lastUA: String 52 | loginCount: Int 53 | name: String 54 | phone: String 55 | phoneVerified: Boolean! 56 | picUrl: String 57 | posts: [Post!]! 58 | resetAt: DateTime 59 | updatedAt: DateTime! 60 | username: String 61 | uuid: String! 62 | } 63 | -------------------------------------------------------------------------------- /src/context.ts: -------------------------------------------------------------------------------- 1 | import { PrismaClient } from '@prisma/client' 2 | import { ContextParameters } from 'graphql-yoga/dist/types' 3 | 4 | const prisma = new PrismaClient() 5 | 6 | export interface Context { 7 | prisma: PrismaClient 8 | request: any 9 | } 10 | 11 | export function createContext(request: ContextParameters) { 12 | return { 13 | ...request, 14 | prisma, 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/permissions/index.ts: -------------------------------------------------------------------------------- 1 | import { rule, shield } from 'graphql-shield' 2 | import { getUserId } from '../utils' 3 | 4 | const rules = { 5 | isAuthenticatedUser: rule()((parent, args, context) => { 6 | const userId = getUserId(context) 7 | return Boolean(userId) 8 | }), 9 | isPostOwner: rule()(async (parent, { id }, context) => { 10 | const userId = getUserId(context) 11 | const author = await context.prisma.post 12 | .findOne({ 13 | where: { 14 | id: Number(id), 15 | }, 16 | }) 17 | .author() 18 | return userId === author.id 19 | }), 20 | } 21 | 22 | export const permissions = shield({ 23 | Query: { 24 | me: rules.isAuthenticatedUser, 25 | filterPosts: rules.isAuthenticatedUser, 26 | post: rules.isAuthenticatedUser, 27 | }, 28 | Mutation: { 29 | createDraft: rules.isAuthenticatedUser, 30 | deletePost: rules.isPostOwner, 31 | publish: rules.isPostOwner, 32 | }, 33 | }) 34 | -------------------------------------------------------------------------------- /src/schema.ts: -------------------------------------------------------------------------------- 1 | import { makeSchema } from '@nexus/schema' 2 | import { nexusPrismaPlugin } from 'nexus-prisma' 3 | import * as types from './types' 4 | 5 | export const schema = makeSchema({ 6 | types, 7 | plugins: [nexusPrismaPlugin()], 8 | outputs: { 9 | schema: __dirname + '/../schema.graphql', 10 | typegen: __dirname + '/generated/nexus.ts', 11 | }, 12 | typegenAutoConfig: { 13 | sources: [ 14 | { 15 | source: '@prisma/client', 16 | alias: 'client', 17 | }, 18 | { 19 | source: require.resolve('./context'), 20 | alias: 'Context', 21 | }, 22 | ], 23 | contextType: 'Context.Context', 24 | }, 25 | }) 26 | -------------------------------------------------------------------------------- /src/server.ts: -------------------------------------------------------------------------------- 1 | import * as cors from "cors"; 2 | import { GraphQLServer } from 'graphql-yoga' 3 | import { permissions } from './permissions' 4 | import { schema } from './schema' 5 | import { createContext } from './context' 6 | 7 | const PORT = process.env.PORT || 4001 8 | 9 | const server = new GraphQLServer({ 10 | schema, 11 | context: createContext, 12 | middlewares: [permissions] 13 | }) 14 | server.express.use(cors()); 15 | // server.express.options('*', cors()); // enable pre-flight across-the-board 16 | 17 | // TODO: use "unfetch" to POST to graphql-verify 18 | server.express.get('/emailVerificationPage', async (req, res, done) => { 19 | res.type('html'); 20 | res.end(` 21 | 22 | 23 | 24 | Email Verification 25 | 26 | 27 | 28 | 29 |

30 | Thank you for verifying your email! 31 |

32 | 33 | 46 | 47 | 48 | `); 49 | }); 50 | 51 | server.start({ 52 | port: PORT, 53 | cors: { 54 | // origin: '*' 55 | // credentials: true, 56 | // methods: 'GET,HEAD,PUT,PATCH,POST,DELETE' 57 | } 58 | }, () => 59 | console.log( 60 | `🚀 Server ready at: http://localhost:${PORT}\n⭐️ See sample queries: http://pris.ly/e/ts/graphql-auth#using-the-graphql-api`, 61 | )) 62 | -------------------------------------------------------------------------------- /src/types/Account.ts: -------------------------------------------------------------------------------- 1 | import { objectType } from '@nexus/schema' 2 | 3 | export const User = objectType({ 4 | name: 'Account', 5 | definition(t) { 6 | t.model.accountId(), 7 | t.model.apiKey(), 8 | t.model.name(), 9 | t.model.ownerEmail(), 10 | t.model.createdAt(), 11 | t.model.updatedAt() 12 | }, 13 | }) 14 | -------------------------------------------------------------------------------- /src/types/AuthPayload.ts: -------------------------------------------------------------------------------- 1 | import { objectType } from '@nexus/schema' 2 | 3 | export const AuthPayload = objectType({ 4 | name: 'AuthPayload', 5 | definition(t) { 6 | t.string('token') 7 | t.field('user', { type: 'User' }) 8 | }, 9 | }) 10 | -------------------------------------------------------------------------------- /src/types/Mutation.ts: -------------------------------------------------------------------------------- 1 | import { intArg, mutationType, stringArg } from '@nexus/schema' 2 | import { compare, hash } from 'bcryptjs' 3 | import { sign } from 'jsonwebtoken' 4 | import { APP_SECRET, getUserId } from '../utils' 5 | import { v4 as uuidv4 } from 'uuid' 6 | import { omit } from 'lodash' 7 | 8 | const path = require('path') 9 | const result = require('dotenv').config({ 10 | path: path.resolve(__dirname, '../../prisma/.env'), 11 | }) 12 | if (result.error) { 13 | throw result.error 14 | } else { 15 | console.log('- .env loaded') 16 | } 17 | 18 | const mailgun = require('mailgun.js') 19 | const mg = mailgun.client({ username: 'api', key: process.env.MAILGUN_API_KEY }) 20 | 21 | const omitFields = [ 22 | 'id', 23 | 'accountAndEmail', 24 | 'password', 25 | 'emailVerificationToken', 26 | ] 27 | 28 | // In Progress - build URL to verify email: 29 | const emailAfterSignUp = ({ 30 | accountName, 31 | toEmail, 32 | emailVerificationToken, 33 | }: { 34 | accountName: string 35 | toEmail: string 36 | emailVerificationToken: string 37 | }) => { 38 | const url = `${process.env.API_BASE}/emailVerificationPage?emailVerificationToken=${emailVerificationToken}` 39 | mg.messages 40 | .create(process.env.MAILGUN_DOMAIN, { 41 | from: `Registration `, 42 | to: [toEmail], 43 | subject: 'Thank you for registering', 44 | text: `Thanks for registering with ${accountName} \n\nPlease click on the following link to verify your email address: \n${url} \n\nThanks.`, 45 | // html: "

Testing some Mailgun awesomness!

" 46 | }) 47 | .then((msg: string) => console.log(msg)) // logs response data 48 | .catch((err: any) => console.log(err)) // logs any error 49 | } 50 | 51 | const emailForPasswordReset = ({ 52 | accountName, 53 | toEmail, 54 | newPassword, 55 | }: { 56 | accountName: string 57 | toEmail: string 58 | newPassword: string 59 | }) => { 60 | mg.messages 61 | .create(process.env.MAILGUN_DOMAIN, { 62 | from: `Registration `, 63 | to: [toEmail], 64 | subject: 'Your temporary password', 65 | text: `You have just made a request to reset your password for ${accountName} \n\nBelow is your new password: \n${newPassword}`, 66 | // html: "

Testing some Mailgun awesomness!

" 67 | }) 68 | .then((msg: string) => console.log(msg)) // logs response data 69 | .catch((err: any) => console.log(err)) // logs any error 70 | } 71 | 72 | const upsertAccount = async ({ 73 | ctx, 74 | accountId, 75 | email, 76 | }: { 77 | ctx: any 78 | accountId: string 79 | email: string 80 | }) => { 81 | const dbAccount = await ctx.prisma.account.findOne({ 82 | where: { 83 | accountId, 84 | }, 85 | }) 86 | if (!dbAccount) { 87 | // create new Account 88 | const account = await ctx.prisma.account.create({ 89 | data: { 90 | accountId, 91 | name: accountId, 92 | ownerEmail: email.toLowerCase(), 93 | }, 94 | }) 95 | } 96 | } 97 | 98 | export const Mutation = mutationType({ 99 | definition(t) { 100 | t.field('signup', { 101 | type: 'AuthPayload', 102 | args: { 103 | accountId: stringArg(), 104 | name: stringArg(), 105 | email: stringArg({ nullable: false }), 106 | password: stringArg({ nullable: false }), 107 | }, 108 | resolve: async (_parent, { accountId, name, email, password }, ctx) => { 109 | const hashedPassword = await hash(password, 10) 110 | const accessToken = uuidv4() 111 | const emailVerificationToken = uuidv4() 112 | await upsertAccount({ ctx, accountId: accountId || '', email }) 113 | // create new User 114 | const user = await ctx.prisma.user.create({ 115 | data: { 116 | accountId, 117 | name, 118 | email: email.toLowerCase(), 119 | accountAndEmail: `${accountId}_${email.toLowerCase()}`, 120 | emailVerificationToken, 121 | accessToken, 122 | password: hashedPassword, 123 | }, 124 | }) 125 | emailAfterSignUp({ 126 | accountName: accountId || '', 127 | toEmail: email, 128 | emailVerificationToken, 129 | }) 130 | return { 131 | token: sign( 132 | { ...omit(user, ...omitFields), accessToken }, 133 | APP_SECRET 134 | ), 135 | user, 136 | } 137 | }, 138 | }) 139 | 140 | t.field('login', { 141 | type: 'AuthPayload', 142 | args: { 143 | accountId: stringArg({ nullable: false }), 144 | email: stringArg({ nullable: false }), 145 | password: stringArg({ nullable: false }), 146 | }, 147 | resolve: async (_parent, { accountId, email, password }, ctx) => { 148 | // console.log('ctx', ctx.request.headers['user-agent']); // 'referer' 149 | const user = await ctx.prisma.user.findOne({ 150 | where: { 151 | accountAndEmail: `${accountId}_${email.toLowerCase()}`, 152 | }, 153 | }) 154 | if (!user) { 155 | throw new Error(`No user found for email: ${email}`) 156 | } 157 | if (!user.active) { 158 | throw new Error(`User is not active.`) 159 | } 160 | const passwordValid = await compare(password, user.password) 161 | if (!passwordValid) { 162 | throw new Error('Invalid password') 163 | } 164 | // update User - generate & update login token 165 | const accessToken = uuidv4() 166 | const lastUA = ctx.request.headers['user-agent'] 167 | const lastReferer = ctx.request.headers['referer'] 168 | await ctx.prisma.user.update({ 169 | where: { id: user.id ?? -1 }, 170 | data: { 171 | accessToken, 172 | loginCount: (user.loginCount || 0) + 1, 173 | lastLogin: new Date(), // new Date().toISOString().replace('T', ' ').substr(0, 19) 174 | lastUA, 175 | lastReferer, 176 | }, 177 | }) 178 | return { 179 | token: sign( 180 | { ...omit(user, ...omitFields), accessToken }, 181 | APP_SECRET 182 | ), 183 | user, 184 | } 185 | }, 186 | }) 187 | 188 | t.field('resetPassword', { 189 | type: 'AuthPayload', 190 | args: { 191 | accountId: stringArg(), 192 | email: stringArg({ nullable: false }), 193 | }, 194 | resolve: async (_parent, { accountId, email }, ctx) => { 195 | const user = await ctx.prisma.user.findOne({ 196 | where: { 197 | accountAndEmail: `${accountId}_${email.toLowerCase()}`, 198 | }, 199 | }) 200 | if (!user) { 201 | throw new Error(`No user found for email: ${email}`) 202 | } 203 | if (!user.active) { 204 | throw new Error(`User is not active.`) 205 | } 206 | const newPassword = uuidv4() 207 | await ctx.prisma.user.update({ 208 | where: { id: user.id ?? -1 }, 209 | data: { 210 | password: await hash(newPassword, 10), 211 | resetAt: new Date(), 212 | }, 213 | }) 214 | emailForPasswordReset({ 215 | accountName: accountId || '', 216 | toEmail: email, 217 | newPassword, 218 | }) 219 | return { 220 | token: sign( 221 | { ...omit(user, omitFields), accessToken: '' }, 222 | APP_SECRET 223 | ), 224 | user, 225 | } 226 | }, 227 | }) 228 | 229 | t.field('verifyEmail', { 230 | type: 'AuthPayload', 231 | args: { 232 | // accountId: stringArg(), 233 | // email: stringArg({ nullable: false }), 234 | emailVerificationToken: stringArg({ nullable: false }), 235 | }, 236 | resolve: async (_parent, { emailVerificationToken }, ctx) => { 237 | const user = await ctx.prisma.user.findOne({ 238 | where: { 239 | emailVerificationToken, 240 | }, 241 | }) 242 | if (!user) { 243 | throw new Error(`No user found for email: ${email}`) 244 | } 245 | if (!user.active) { 246 | throw new Error(`User is not active.`) 247 | } 248 | await ctx.prisma.user.update({ 249 | where: { id: user.id ?? -1 }, 250 | data: { 251 | emailVerified: true 252 | }, 253 | }) 254 | return { 255 | token: sign( 256 | { ...omit(user, omitFields), accessToken: '' }, 257 | APP_SECRET 258 | ), 259 | user, 260 | } 261 | }, 262 | }) 263 | 264 | t.field('createDraft', { 265 | type: 'Post', 266 | args: { 267 | title: stringArg({ nullable: false }), 268 | content: stringArg(), 269 | }, 270 | resolve: (parent, { title, content }, ctx) => { 271 | const userId = getUserId(ctx) 272 | if (!userId) throw new Error('Could not authenticate user.') 273 | return ctx.prisma.post.create({ 274 | data: { 275 | title, 276 | content, 277 | published: false, 278 | author: { connect: { id: Number(userId) } }, 279 | }, 280 | }) 281 | }, 282 | }) 283 | 284 | t.field('deletePost', { 285 | type: 'Post', 286 | nullable: true, 287 | args: { id: intArg({ nullable: false }) }, 288 | resolve: (parent, { id }, ctx) => { 289 | return ctx.prisma.post.delete({ 290 | where: { 291 | id, 292 | }, 293 | }) 294 | }, 295 | }) 296 | 297 | t.field('publish', { 298 | type: 'Post', 299 | nullable: true, 300 | args: { id: intArg() }, 301 | resolve: (parent, { id }, ctx) => { 302 | return ctx.prisma.post.update({ 303 | where: { id: id ?? -1 }, 304 | data: { published: true }, 305 | }) 306 | }, 307 | }) 308 | }, 309 | }) 310 | -------------------------------------------------------------------------------- /src/types/Post.ts: -------------------------------------------------------------------------------- 1 | import { objectType } from '@nexus/schema' 2 | 3 | export const Post = objectType({ 4 | name: 'Post', 5 | definition(t) { 6 | t.model.id() 7 | t.model.published() 8 | t.model.title() 9 | t.model.content() 10 | t.model.author() 11 | }, 12 | }) 13 | -------------------------------------------------------------------------------- /src/types/Query.ts: -------------------------------------------------------------------------------- 1 | import { intArg, queryType, stringArg } from '@nexus/schema' 2 | import { getUserId } from '../utils' 3 | 4 | export const Query = queryType({ 5 | definition(t) { 6 | t.field('me', { 7 | type: 'User', 8 | nullable: true, 9 | resolve: (parent, args, ctx) => { 10 | const userId = getUserId(ctx) 11 | return ctx.prisma.user.findOne({ 12 | where: { 13 | id: Number(userId), 14 | }, 15 | }) 16 | }, 17 | }) 18 | 19 | t.list.field('feed', { 20 | type: 'Post', 21 | resolve: (parent, args, ctx) => { 22 | return ctx.prisma.post.findMany({ 23 | where: { published: true }, 24 | }) 25 | }, 26 | }) 27 | 28 | t.list.field('filterPosts', { 29 | type: 'Post', 30 | args: { 31 | searchString: stringArg({ nullable: true }), 32 | }, 33 | resolve: (parent, { searchString }, ctx) => { 34 | return ctx.prisma.post.findMany({ 35 | where: { 36 | OR: [ 37 | { 38 | title: { 39 | contains: searchString || '', 40 | }, 41 | }, 42 | { 43 | content: { 44 | contains: searchString, 45 | }, 46 | }, 47 | ], 48 | }, 49 | }) 50 | }, 51 | }) 52 | 53 | t.field('post', { 54 | type: 'Post', 55 | nullable: true, 56 | args: { id: intArg() }, 57 | resolve: (parent, { id }, ctx) => { 58 | return ctx.prisma.post.findOne({ 59 | where: { 60 | id: Number(id), 61 | }, 62 | }) 63 | }, 64 | }) 65 | }, 66 | }) 67 | -------------------------------------------------------------------------------- /src/types/User.ts: -------------------------------------------------------------------------------- 1 | import { objectType } from '@nexus/schema' 2 | 3 | export const User = objectType({ 4 | name: 'User', 5 | definition(t) { 6 | t.model.accountId() 7 | t.model.id() 8 | t.model.uuid() 9 | t.model.accessToken() 10 | t.model.name() 11 | t.model.email() 12 | t.model.accountAndEmail() 13 | t.model.emailVerified() 14 | t.model.emailVerificationToken() 15 | t.model.username() 16 | t.model.phone() 17 | t.model.phoneVerified() 18 | t.model.active() 19 | t.model.posts({ pagination: false }) 20 | t.model.picUrl() 21 | t.model.loginCount() 22 | t.model.lastLogin() 23 | t.model.lastIP() 24 | t.model.lastUA() 25 | t.model.lastReferer() 26 | t.model.lastLocation() 27 | t.model.createdAt() 28 | t.model.updatedAt() 29 | t.model.resetAt() 30 | t.model.active() 31 | }, 32 | }) 33 | -------------------------------------------------------------------------------- /src/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from './AuthPayload' 2 | export * from './Mutation' 3 | export * from './Post' 4 | export * from './Query' 5 | export * from './User' 6 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import { verify } from 'jsonwebtoken' 2 | import { Context } from './context' 3 | 4 | export const APP_SECRET = 'appsecret321' 5 | 6 | interface Token { 7 | userId: string 8 | } 9 | 10 | export function getUserId(context: Context) { 11 | const Authorization = context.request.get('Authorization') 12 | if (Authorization) { 13 | const token = Authorization.replace('Bearer ', '') 14 | const verifiedToken = verify(token, APP_SECRET) as Token 15 | return verifiedToken && verifiedToken.userId 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tools/authui-demo-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/authui/authui-server/98f4e174528046483bbb83b890f3a47b6280e438/tools/authui-demo-1.gif -------------------------------------------------------------------------------- /tools/authui-demo-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/authui/authui-server/98f4e174528046483bbb83b890f3a47b6280e438/tools/authui-demo-2.gif -------------------------------------------------------------------------------- /tools/diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/authui/authui-server/98f4e174528046483bbb83b890f3a47b6280e438/tools/diagram.png -------------------------------------------------------------------------------- /tools/examples.http: -------------------------------------------------------------------------------- 1 | ### API request examples (using vscode REST Client) 2 | 3 | @baseUrl = http://localhost:4001 4 | @testAccountId = MyProduct10 5 | @testEmail = demo10@gmail.com 6 | @testPassword = demo1010 7 | 8 | ### List Posts (with author info) 9 | 10 | POST {{baseUrl}} 11 | Content-Type: application/json 12 | X-Request-Type: GraphQL 13 | 14 | query { 15 | feed { 16 | id 17 | title 18 | content 19 | published 20 | author { 21 | id 22 | name 23 | email 24 | } 25 | } 26 | } 27 | 28 | ### Register - Sign Up 29 | 30 | POST {{baseUrl}} 31 | Content-Type: application/json 32 | X-Request-Type: GraphQL 33 | 34 | mutation { 35 | signup(accountId: "{{testAccountId}}", name: "Full Name", email: "{{testEmail}}", password: "{{testPassword}}") { 36 | token 37 | } 38 | } 39 | 40 | ### Login 41 | 42 | POST {{baseUrl}} 43 | Content-Type: application/json 44 | X-Request-Type: GraphQL 45 | 46 | mutation { 47 | login(accountId: "{{testAccountId}}", email: "{{testEmail}}", password: "{{testPassword}}") { 48 | token 49 | } 50 | } 51 | 52 | ### Verify Email 53 | 54 | POST {{baseUrl}} 55 | Content-Type: application/json 56 | X-Request-Type: GraphQL 57 | 58 | mutation { 59 | verifyEmail(accountId: "{{testAccountId}}", email: "{{testEmail}}", emailVerificationToken: "") { 60 | token 61 | } 62 | } -------------------------------------------------------------------------------- /tools/logo-png-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/authui/authui-server/98f4e174528046483bbb83b890f3a47b6280e438/tools/logo-png-200.png -------------------------------------------------------------------------------- /tools/templates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/authui/authui-server/98f4e174528046483bbb83b890f3a47b6280e438/tools/templates.png -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "dist", 4 | "rootDir": "src", 5 | "lib": ["esnext"], 6 | "strict": true 7 | }, 8 | "include": ["src/**/*"] 9 | } 10 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.0.0": 6 | version "7.10.2" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" 8 | integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== 9 | dependencies: 10 | regenerator-runtime "^0.13.4" 11 | 12 | "@nexus/schema@0.13.1": 13 | version "0.13.1" 14 | resolved "https://registry.yarnpkg.com/@nexus/schema/-/schema-0.13.1.tgz#02dadf66b121b3c270659479f2410b7023fcc4a6" 15 | integrity sha512-V7fFhkPOcqQ7KwSaAkfSTAV/klY/NlL7aIHTuEZynAUNm2cG8S6QSU+TuVlbpj0L14B9tqgPrVeO+IOe0AV+yA== 16 | dependencies: 17 | iterall "^1.2.2" 18 | tslib "^1.9.3" 19 | 20 | "@prisma/cli@2.0.0-beta.8": 21 | version "2.0.0-beta.8" 22 | resolved "https://registry.yarnpkg.com/@prisma/cli/-/cli-2.0.0-beta.8.tgz#18356d5464040339c9c01cdf9a4241c1bccc5dea" 23 | integrity sha512-l1bHUmPzjdOF87MzIkcE55AkGLDKV2apmS2D9ZuYM+7hWWMk7lcJjjquDr9RAtSDMN8nuvYQcXnFFg7JP4DUxw== 24 | 25 | "@prisma/client@2.0.0-beta.8": 26 | version "2.0.0-beta.8" 27 | resolved "https://registry.yarnpkg.com/@prisma/client/-/client-2.0.0-beta.8.tgz#1f2effb3b377fab4453fef894a04cc16bf46ef8f" 28 | integrity sha512-MOUYJ5IRsmufhEoBs+sBNlmkxkUcsE0ONY/RcvQ+F1svU8iKeGi7UNFUxKwzYCe15mmAfvhh/ZaJ34/tUkpBeQ== 29 | dependencies: 30 | pkg-up "^3.1.0" 31 | 32 | "@types/aws-lambda@8.10.13": 33 | version "8.10.13" 34 | resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.13.tgz#92cc06b1cc88b5d0b327d2671dcf3daea96923a5" 35 | integrity sha512-a1sC60Bqll4N2RYnd4+XuynrVd8LO+uZrgwCVaAER0ldMQ00LRM4iTjU2ulPoQF6P5bHZK5hL/6IF9088VJhUA== 36 | 37 | "@types/bcryptjs@2.4.2": 38 | version "2.4.2" 39 | resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae" 40 | integrity sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ== 41 | 42 | "@types/body-parser@*": 43 | version "1.19.0" 44 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" 45 | integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== 46 | dependencies: 47 | "@types/connect" "*" 48 | "@types/node" "*" 49 | 50 | "@types/connect@*": 51 | version "3.4.33" 52 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" 53 | integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== 54 | dependencies: 55 | "@types/node" "*" 56 | 57 | "@types/cors@^2.8.4": 58 | version "2.8.6" 59 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.6.tgz#cfaab33c49c15b1ded32f235111ce9123009bd02" 60 | integrity sha512-invOmosX0DqbpA+cE2yoHGUlF/blyf7nB0OGYBBiH27crcVm5NmFaZkLP4Ta1hGaesckCi5lVLlydNJCxkTOSg== 61 | dependencies: 62 | "@types/express" "*" 63 | 64 | "@types/express-serve-static-core@*": 65 | version "4.17.7" 66 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz#dfe61f870eb549dc6d7e12050901847c7d7e915b" 67 | integrity sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw== 68 | dependencies: 69 | "@types/node" "*" 70 | "@types/qs" "*" 71 | "@types/range-parser" "*" 72 | 73 | "@types/express@*", "@types/express@^4.11.1": 74 | version "4.17.6" 75 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.6.tgz#6bce49e49570507b86ea1b07b806f04697fac45e" 76 | integrity sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w== 77 | dependencies: 78 | "@types/body-parser" "*" 79 | "@types/express-serve-static-core" "*" 80 | "@types/qs" "*" 81 | "@types/serve-static" "*" 82 | 83 | "@types/graphql-deduplicator@^2.0.0": 84 | version "2.0.0" 85 | resolved "https://registry.yarnpkg.com/@types/graphql-deduplicator/-/graphql-deduplicator-2.0.0.tgz#9e577b8f3feb3d067b0ca756f4a1fb356d533922" 86 | integrity sha512-swUwj5hWF1yFzbUXStLJrUa0ksAt11B8+SwhsAjQAX0LYJ1LLioAyuDcJ9bovWbsNzIXJYXLvljSPQw8nR728w== 87 | 88 | "@types/graphql@^14.0.0": 89 | version "14.5.0" 90 | resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-14.5.0.tgz#a545fb3bc8013a3547cf2f07f5e13a33642b75d6" 91 | integrity sha512-MOkzsEp1Jk5bXuAsHsUi6BVv0zCO+7/2PTiZMXWDSsMXvNU6w/PLMQT2vHn8hy2i0JqojPz1Sz6rsFjHtsU0lA== 92 | dependencies: 93 | graphql "*" 94 | 95 | "@types/jsonwebtoken@8.5.0": 96 | version "8.5.0" 97 | resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz#2531d5e300803aa63279b232c014acf780c981c5" 98 | integrity sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg== 99 | dependencies: 100 | "@types/node" "*" 101 | 102 | "@types/lodash@^4.14.157": 103 | version "4.14.157" 104 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.157.tgz#fdac1c52448861dfde1a2e1515dbc46e54926dc8" 105 | integrity sha512-Ft5BNFmv2pHDgxV5JDsndOWTRJ+56zte0ZpYLowp03tW+K+t8u8YMOzAnpuqPgzX6WO1XpDIUm7u04M8vdDiVQ== 106 | 107 | "@types/mime@*": 108 | version "2.0.2" 109 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.2.tgz#857a118d8634c84bba7ae14088e4508490cd5da5" 110 | integrity sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q== 111 | 112 | "@types/node@*": 113 | version "14.0.13" 114 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.13.tgz#ee1128e881b874c371374c1f72201893616417c9" 115 | integrity sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA== 116 | 117 | "@types/node@12.12.42": 118 | version "12.12.42" 119 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.42.tgz#d0d1149336bd07540dd1ea576692829d575dec34" 120 | integrity sha512-R/9QdYFLL9dE9l5cWWzWIZByVGFd7lk7JVOJ7KD+E1SJ4gni7XJRLz9QTjyYQiHIqEAgku9VgxdLjMlhhUaAFg== 121 | 122 | "@types/qs@*": 123 | version "6.9.3" 124 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.3.tgz#b755a0934564a200d3efdf88546ec93c369abd03" 125 | integrity sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA== 126 | 127 | "@types/range-parser@*": 128 | version "1.2.3" 129 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 130 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 131 | 132 | "@types/serve-static@*": 133 | version "1.13.4" 134 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.4.tgz#6662a93583e5a6cabca1b23592eb91e12fa80e7c" 135 | integrity sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug== 136 | dependencies: 137 | "@types/express-serve-static-core" "*" 138 | "@types/mime" "*" 139 | 140 | "@types/strip-bom@^3.0.0": 141 | version "3.0.0" 142 | resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" 143 | integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= 144 | 145 | "@types/strip-json-comments@0.0.30": 146 | version "0.0.30" 147 | resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" 148 | integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== 149 | 150 | "@types/uuid@^8.0.0": 151 | version "8.0.0" 152 | resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.0.0.tgz#165aae4819ad2174a17476dbe66feebd549556c0" 153 | integrity sha512-xSQfNcvOiE5f9dyd4Kzxbof1aTrLobL278pGLKOZI6esGfZ7ts9Ka16CzIN6Y8hFHE1C7jIBZokULhK1bOgjRw== 154 | 155 | "@types/ws@7.2.4": 156 | version "7.2.4" 157 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.4.tgz#b3859f7b9c243b220efac9716ec42c716a72969d" 158 | integrity sha512-9S6Ask71vujkVyeEXKxjBSUV8ZUB0mjL5la4IncBoheu04bDaYyUKErh1BQcY9+WzOUOiKqz/OnpJHYckbMfNg== 159 | dependencies: 160 | "@types/node" "*" 161 | 162 | "@types/yup@0.26.18": 163 | version "0.26.18" 164 | resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.18.tgz#7f76ad65b385577fb89936ce26a7f830a9560a9c" 165 | integrity sha512-bKGlHqe+SrvdZONwB+H7hihsvl4yAaOIhN6Sgnnuo6NQOJ0bBNc53Ztfe8ORZHBcPC/OVxhFrxnJIjsGsDbR8w== 166 | 167 | "@types/zen-observable@^0.5.3": 168 | version "0.5.4" 169 | resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.5.4.tgz#b863a4191e525206819e008097ebf0fb2e3a1cdc" 170 | integrity sha512-sW6xN96wUak4tgc89d0tbTg7QDGYhGv5hvQIS6h4mRCd8h2btiZ80loPU8cyLwsBbA4ZeQt0FjvUhJ4rNhdsGg== 171 | 172 | "@wry/equality@^0.1.2": 173 | version "0.1.11" 174 | resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" 175 | integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== 176 | dependencies: 177 | tslib "^1.9.3" 178 | 179 | accepts@~1.3.7: 180 | version "1.3.7" 181 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 182 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 183 | dependencies: 184 | mime-types "~2.1.24" 185 | negotiator "0.6.2" 186 | 187 | apollo-cache-control@^0.1.0: 188 | version "0.1.1" 189 | resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.1.1.tgz#173d14ceb3eb9e7cb53de7eb8b61bee6159d4171" 190 | integrity sha512-XJQs167e9u+e5ybSi51nGYr70NPBbswdvTEHtbtXbwkZ+n9t0SLPvUcoqceayOSwjK1XYOdU/EKPawNdb3rLQA== 191 | dependencies: 192 | graphql-extensions "^0.0.x" 193 | 194 | apollo-link@^1.2.14: 195 | version "1.2.14" 196 | resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" 197 | integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== 198 | dependencies: 199 | apollo-utilities "^1.3.0" 200 | ts-invariant "^0.4.0" 201 | tslib "^1.9.3" 202 | zen-observable-ts "^0.8.21" 203 | 204 | apollo-server-core@^1.3.6, apollo-server-core@^1.4.0: 205 | version "1.4.0" 206 | resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.4.0.tgz#4faff7f110bfdd6c3f47008302ae24140f94c592" 207 | integrity sha512-BP1Vh39krgEjkQxbjTdBURUjLHbFq1zeOChDJgaRsMxGtlhzuLWwwC6lLdPatN8jEPbeHq8Tndp9QZ3iQZOKKA== 208 | dependencies: 209 | apollo-cache-control "^0.1.0" 210 | apollo-tracing "^0.1.0" 211 | graphql-extensions "^0.0.x" 212 | 213 | apollo-server-express@^1.3.6: 214 | version "1.4.0" 215 | resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-1.4.0.tgz#7d7c58d6d6f9892b83fe575669093bb66738b125" 216 | integrity sha512-zkH00nxhLnJfO0HgnNPBTfZw8qI5ILaPZ5TecMCI9+Y9Ssr2b0bFr9pBRsXy9eudPhI+/O4yqegSUsnLdF/CPw== 217 | dependencies: 218 | apollo-server-core "^1.4.0" 219 | apollo-server-module-graphiql "^1.4.0" 220 | 221 | apollo-server-lambda@1.3.6: 222 | version "1.3.6" 223 | resolved "https://registry.yarnpkg.com/apollo-server-lambda/-/apollo-server-lambda-1.3.6.tgz#bdaac37f143c6798e40b8ae75580ba673cea260e" 224 | integrity sha1-varDfxQ8Z5jkC4rnVYC6ZzzqJg4= 225 | dependencies: 226 | apollo-server-core "^1.3.6" 227 | apollo-server-module-graphiql "^1.3.4" 228 | 229 | apollo-server-module-graphiql@^1.3.4, apollo-server-module-graphiql@^1.4.0: 230 | version "1.4.0" 231 | resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.4.0.tgz#c559efa285578820709f1769bb85d3b3eed3d8ec" 232 | integrity sha512-GmkOcb5he2x5gat+TuiTvabnBf1m4jzdecal3XbXBh/Jg+kx4hcvO3TTDFQ9CuTprtzdcVyA11iqG7iOMOt7vA== 233 | 234 | apollo-tracing@^0.1.0: 235 | version "0.1.4" 236 | resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.1.4.tgz#5b8ae1b01526b160ee6e552a7f131923a9aedcc7" 237 | integrity sha512-Uv+1nh5AsNmC3m130i2u3IqbS+nrxyVV3KYimH5QKsdPjxxIQB3JAT+jJmpeDxBel8gDVstNmCh82QSLxLSIdQ== 238 | dependencies: 239 | graphql-extensions "~0.0.9" 240 | 241 | apollo-upload-server@^7.0.0: 242 | version "7.1.0" 243 | resolved "https://registry.yarnpkg.com/apollo-upload-server/-/apollo-upload-server-7.1.0.tgz#21e07b52252b3749b913468599813e13cfca805f" 244 | integrity sha512-cD9ReCeyurYwZyEDqJYb5TOc9dt8yhPzS+MtrY3iJdqw+pqiiyPngAvVXHjN+Ca7Lajvom4/AT/PBrYVDMM3Kw== 245 | dependencies: 246 | busboy "^0.2.14" 247 | fs-capacitor "^1.0.0" 248 | http-errors "^1.7.0" 249 | object-path "^0.11.4" 250 | 251 | apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: 252 | version "1.3.4" 253 | resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" 254 | integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== 255 | dependencies: 256 | "@wry/equality" "^0.1.2" 257 | fast-json-stable-stringify "^2.0.0" 258 | ts-invariant "^0.4.0" 259 | tslib "^1.10.0" 260 | 261 | arg@^4.1.0: 262 | version "4.1.3" 263 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 264 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 265 | 266 | array-find-index@^1.0.1: 267 | version "1.0.2" 268 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 269 | integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= 270 | 271 | array-flatten@1.1.1: 272 | version "1.1.1" 273 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 274 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 275 | 276 | arrify@^1.0.0: 277 | version "1.0.1" 278 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 279 | integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= 280 | 281 | async-limiter@~1.0.0: 282 | version "1.0.1" 283 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" 284 | integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== 285 | 286 | async@~0.9.0: 287 | version "0.9.2" 288 | resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" 289 | integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= 290 | 291 | at-least-node@^1.0.0: 292 | version "1.0.0" 293 | resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" 294 | integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== 295 | 296 | backo2@^1.0.2: 297 | version "1.0.2" 298 | resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" 299 | integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= 300 | 301 | balanced-match@^1.0.0: 302 | version "1.0.0" 303 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 304 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 305 | 306 | bcryptjs@2.4.3: 307 | version "2.4.3" 308 | resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" 309 | integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= 310 | 311 | body-parser-graphql@1.1.0: 312 | version "1.1.0" 313 | resolved "https://registry.yarnpkg.com/body-parser-graphql/-/body-parser-graphql-1.1.0.tgz#80a80353c7cb623562fd375750dfe018d75f0f7c" 314 | integrity sha512-bOBF4n1AnUjcY1SzLeibeIx4XOuYqEkjn/Lm4yKhnN6KedoXMv4hVqgcKHGRnxOMJP64tErqrQU+4cihhpbJXg== 315 | dependencies: 316 | body-parser "^1.18.2" 317 | 318 | body-parser@1.19.0, body-parser@^1.18.2: 319 | version "1.19.0" 320 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 321 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 322 | dependencies: 323 | bytes "3.1.0" 324 | content-type "~1.0.4" 325 | debug "2.6.9" 326 | depd "~1.1.2" 327 | http-errors "1.7.2" 328 | iconv-lite "0.4.24" 329 | on-finished "~2.3.0" 330 | qs "6.7.0" 331 | raw-body "2.4.0" 332 | type-is "~1.6.17" 333 | 334 | brace-expansion@^1.1.7: 335 | version "1.1.11" 336 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 337 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 338 | dependencies: 339 | balanced-match "^1.0.0" 340 | concat-map "0.0.1" 341 | 342 | btoa@^1.1.2: 343 | version "1.2.1" 344 | resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" 345 | integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== 346 | 347 | buffer-equal-constant-time@1.0.1: 348 | version "1.0.1" 349 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 350 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 351 | 352 | buffer-from@^1.0.0: 353 | version "1.1.1" 354 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 355 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 356 | 357 | busboy@^0.2.14: 358 | version "0.2.14" 359 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" 360 | integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= 361 | dependencies: 362 | dicer "0.2.5" 363 | readable-stream "1.1.x" 364 | 365 | busboy@^0.3.1: 366 | version "0.3.1" 367 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" 368 | integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== 369 | dependencies: 370 | dicer "0.3.0" 371 | 372 | bytes@3.1.0: 373 | version "3.1.0" 374 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 375 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 376 | 377 | camelcase-keys@^2.0.0: 378 | version "2.1.0" 379 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 380 | integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= 381 | dependencies: 382 | camelcase "^2.0.0" 383 | map-obj "^1.0.0" 384 | 385 | camelcase@^2.0.0: 386 | version "2.1.1" 387 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 388 | integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= 389 | 390 | camelcase@^6.0.0: 391 | version "6.0.0" 392 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" 393 | integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== 394 | 395 | combined-stream@~0.0.4: 396 | version "0.0.7" 397 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f" 398 | integrity sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8= 399 | dependencies: 400 | delayed-stream "0.0.5" 401 | 402 | concat-map@0.0.1: 403 | version "0.0.1" 404 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 405 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 406 | 407 | concat-stream@^1.4.7: 408 | version "1.6.2" 409 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 410 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 411 | dependencies: 412 | buffer-from "^1.0.0" 413 | inherits "^2.0.3" 414 | readable-stream "^2.2.2" 415 | typedarray "^0.0.6" 416 | 417 | content-disposition@0.5.3: 418 | version "0.5.3" 419 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 420 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 421 | dependencies: 422 | safe-buffer "5.1.2" 423 | 424 | content-type@~1.0.4: 425 | version "1.0.4" 426 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 427 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 428 | 429 | cookie-signature@1.0.6: 430 | version "1.0.6" 431 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 432 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 433 | 434 | cookie@0.4.0: 435 | version "0.4.0" 436 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 437 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 438 | 439 | core-js@^2.5.3: 440 | version "2.6.11" 441 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" 442 | integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== 443 | 444 | core-util-is@~1.0.0: 445 | version "1.0.2" 446 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 447 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 448 | 449 | cors@^2.8.4, cors@^2.8.5: 450 | version "2.8.5" 451 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 452 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 453 | dependencies: 454 | object-assign "^4" 455 | vary "^1" 456 | 457 | currently-unhandled@^0.4.1: 458 | version "0.4.1" 459 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 460 | integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= 461 | dependencies: 462 | array-find-index "^1.0.1" 463 | 464 | dateformat@~1.0.4-1.2.3: 465 | version "1.0.12" 466 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 467 | integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= 468 | dependencies: 469 | get-stdin "^4.0.1" 470 | meow "^3.3.0" 471 | 472 | debounce@^1.0.0: 473 | version "1.2.0" 474 | resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" 475 | integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== 476 | 477 | debug@2.6.9: 478 | version "2.6.9" 479 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 480 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 481 | dependencies: 482 | ms "2.0.0" 483 | 484 | decamelize@^1.1.2: 485 | version "1.2.0" 486 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 487 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 488 | 489 | delayed-stream@0.0.5: 490 | version "0.0.5" 491 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" 492 | integrity sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8= 493 | 494 | depd@~1.1.2: 495 | version "1.1.2" 496 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 497 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 498 | 499 | deprecated-decorator@^0.1.6: 500 | version "0.1.6" 501 | resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" 502 | integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= 503 | 504 | destroy@~1.0.4: 505 | version "1.0.4" 506 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 507 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 508 | 509 | dicer@0.2.5: 510 | version "0.2.5" 511 | resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" 512 | integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= 513 | dependencies: 514 | readable-stream "1.1.x" 515 | streamsearch "0.1.2" 516 | 517 | dicer@0.3.0: 518 | version "0.3.0" 519 | resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" 520 | integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== 521 | dependencies: 522 | streamsearch "0.1.2" 523 | 524 | diff@^4.0.1: 525 | version "4.0.2" 526 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 527 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 528 | 529 | dotenv@^8.2.0: 530 | version "8.2.0" 531 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" 532 | integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== 533 | 534 | dynamic-dedupe@^0.3.0: 535 | version "0.3.0" 536 | resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" 537 | integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= 538 | dependencies: 539 | xtend "^4.0.0" 540 | 541 | ecdsa-sig-formatter@1.0.11: 542 | version "1.0.11" 543 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 544 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 545 | dependencies: 546 | safe-buffer "^5.0.1" 547 | 548 | ee-first@1.1.1: 549 | version "1.1.1" 550 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 551 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 552 | 553 | encodeurl@~1.0.2: 554 | version "1.0.2" 555 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 556 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 557 | 558 | error-ex@^1.2.0: 559 | version "1.3.2" 560 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 561 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 562 | dependencies: 563 | is-arrayish "^0.2.1" 564 | 565 | es6-promise@^3.0.2: 566 | version "3.3.1" 567 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" 568 | integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= 569 | 570 | escape-html@~1.0.3: 571 | version "1.0.3" 572 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 573 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 574 | 575 | etag@~1.8.1: 576 | version "1.8.1" 577 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 578 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 579 | 580 | eventemitter3@^3.1.0: 581 | version "3.1.2" 582 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" 583 | integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== 584 | 585 | express@^4.16.3: 586 | version "4.17.1" 587 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 588 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 589 | dependencies: 590 | accepts "~1.3.7" 591 | array-flatten "1.1.1" 592 | body-parser "1.19.0" 593 | content-disposition "0.5.3" 594 | content-type "~1.0.4" 595 | cookie "0.4.0" 596 | cookie-signature "1.0.6" 597 | debug "2.6.9" 598 | depd "~1.1.2" 599 | encodeurl "~1.0.2" 600 | escape-html "~1.0.3" 601 | etag "~1.8.1" 602 | finalhandler "~1.1.2" 603 | fresh "0.5.2" 604 | merge-descriptors "1.0.1" 605 | methods "~1.1.2" 606 | on-finished "~2.3.0" 607 | parseurl "~1.3.3" 608 | path-to-regexp "0.1.7" 609 | proxy-addr "~2.0.5" 610 | qs "6.7.0" 611 | range-parser "~1.2.1" 612 | safe-buffer "5.1.2" 613 | send "0.17.1" 614 | serve-static "1.14.1" 615 | setprototypeof "1.1.1" 616 | statuses "~1.5.0" 617 | type-is "~1.6.18" 618 | utils-merge "1.0.1" 619 | vary "~1.1.2" 620 | 621 | fast-json-stable-stringify@^2.0.0: 622 | version "2.1.0" 623 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 624 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 625 | 626 | filewatcher@~3.0.0: 627 | version "3.0.1" 628 | resolved "https://registry.yarnpkg.com/filewatcher/-/filewatcher-3.0.1.tgz#f4a1957355ddaf443ccd78a895f3d55e23c8a034" 629 | integrity sha1-9KGVc1Xdr0Q8zXiolfPVXiPIoDQ= 630 | dependencies: 631 | debounce "^1.0.0" 632 | 633 | finalhandler@~1.1.2: 634 | version "1.1.2" 635 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 636 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 637 | dependencies: 638 | debug "2.6.9" 639 | encodeurl "~1.0.2" 640 | escape-html "~1.0.3" 641 | on-finished "~2.3.0" 642 | parseurl "~1.3.3" 643 | statuses "~1.5.0" 644 | unpipe "~1.0.0" 645 | 646 | find-up@^1.0.0: 647 | version "1.1.2" 648 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 649 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 650 | dependencies: 651 | path-exists "^2.0.0" 652 | pinkie-promise "^2.0.0" 653 | 654 | find-up@^3.0.0: 655 | version "3.0.0" 656 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 657 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 658 | dependencies: 659 | locate-path "^3.0.0" 660 | 661 | fn-name@~2.0.1: 662 | version "2.0.1" 663 | resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" 664 | integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= 665 | 666 | form-data@^0.2.0: 667 | version "0.2.0" 668 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.2.0.tgz#26f8bc26da6440e299cbdcfb69035c4f77a6e466" 669 | integrity sha1-Jvi8JtpkQOKZy9z7aQNcT3em5GY= 670 | dependencies: 671 | async "~0.9.0" 672 | combined-stream "~0.0.4" 673 | mime-types "~2.0.3" 674 | 675 | forwarded@~0.1.2: 676 | version "0.1.2" 677 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 678 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 679 | 680 | fresh@0.5.2: 681 | version "0.5.2" 682 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 683 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 684 | 685 | fs-capacitor@^1.0.0: 686 | version "1.0.1" 687 | resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-1.0.1.tgz#ff9dbfa14dfaf4472537720f19c3088ed9278df0" 688 | integrity sha512-XdZK0Q78WP29Vm3FGgJRhRhrBm51PagovzWtW2kJ3Q6cYJbGtZqWSGTSPwvtEkyjIirFd7b8Yes/dpOYjt4RRQ== 689 | 690 | fs-capacitor@^2.0.4: 691 | version "2.0.4" 692 | resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c" 693 | integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA== 694 | 695 | fs-extra@^9.0.0: 696 | version "9.0.1" 697 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" 698 | integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== 699 | dependencies: 700 | at-least-node "^1.0.0" 701 | graceful-fs "^4.2.0" 702 | jsonfile "^6.0.1" 703 | universalify "^1.0.0" 704 | 705 | fs.realpath@^1.0.0: 706 | version "1.0.0" 707 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 708 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 709 | 710 | get-stdin@^4.0.1: 711 | version "4.0.1" 712 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 713 | integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= 714 | 715 | glob@^7.1.3: 716 | version "7.1.6" 717 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 718 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 719 | dependencies: 720 | fs.realpath "^1.0.0" 721 | inflight "^1.0.4" 722 | inherits "2" 723 | minimatch "^3.0.4" 724 | once "^1.3.0" 725 | path-is-absolute "^1.0.0" 726 | 727 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: 728 | version "4.2.4" 729 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 730 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 731 | 732 | graphql-deduplicator@^2.0.1: 733 | version "2.0.5" 734 | resolved "https://registry.yarnpkg.com/graphql-deduplicator/-/graphql-deduplicator-2.0.5.tgz#fab59d8a4f8127e010122784638cfc8afc815a9c" 735 | integrity sha512-09yOnKej64C32saDU+jsQvIxDeYBTzDWhUkqE84AlCB6LUYuUktfgubZkOS3VdoFiYwsi2EL5Vc0wqemS9M3lg== 736 | 737 | graphql-extensions@^0.0.x, graphql-extensions@~0.0.9: 738 | version "0.0.10" 739 | resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.0.10.tgz#34bdb2546d43f6a5bc89ab23c295ec0466c6843d" 740 | integrity sha512-TnQueqUDCYzOSrpQb3q1ngDSP2otJSF+9yNLrQGPzkMsvnQ+v6e2d5tl+B35D4y+XpmvVnAn4T3ZK28mkILveA== 741 | dependencies: 742 | core-js "^2.5.3" 743 | source-map-support "^0.5.1" 744 | 745 | graphql-import@^0.7.0: 746 | version "0.7.1" 747 | resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.7.1.tgz#4add8d91a5f752d764b0a4a7a461fcd93136f223" 748 | integrity sha512-YpwpaPjRUVlw2SN3OPljpWbVRWAhMAyfSba5U47qGMOSsPLi2gYeJtngGpymjm9nk57RFWEpjqwh4+dpYuFAPw== 749 | dependencies: 750 | lodash "^4.17.4" 751 | resolve-from "^4.0.0" 752 | 753 | graphql-middleware@4.0.1: 754 | version "4.0.1" 755 | resolved "https://registry.yarnpkg.com/graphql-middleware/-/graphql-middleware-4.0.1.tgz#8c627b22cc046a47e9474a813cf9e0bd50fa0c4b" 756 | integrity sha512-r9r+pcHV4yZW7LAOcjQYTbNY6nR9SrLgpVZKbrtgXxpQW/MUc1N8q3PESciebvp5s0EEUgRchcRjUkyaArCIFw== 757 | dependencies: 758 | graphql-tools "^4.0.5" 759 | 760 | graphql-playground-html@1.6.12: 761 | version "1.6.12" 762 | resolved "https://registry.yarnpkg.com/graphql-playground-html/-/graphql-playground-html-1.6.12.tgz#8b3b34ab6013e2c877f0ceaae478fafc8ca91b85" 763 | integrity sha512-yOYFwwSMBL0MwufeL8bkrNDgRE7eF/kTHiwrqn9FiR9KLcNIl1xw9l9a+6yIRZM56JReQOHpbQFXTZn1IuSKRg== 764 | 765 | graphql-playground-middleware-express@1.7.11: 766 | version "1.7.11" 767 | resolved "https://registry.yarnpkg.com/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.11.tgz#bbffd784a37133bfa7165bdd8f429081dbf4bcf6" 768 | integrity sha512-sKItB4s3FxqlwCgXdMfwRAfssSoo31bcFsGAAg/HzaZLicY6CDlofKXP8G5iPDerB6NaoAcAaBLutLzl9sd4fQ== 769 | dependencies: 770 | graphql-playground-html "1.6.12" 771 | 772 | graphql-playground-middleware-lambda@1.7.12: 773 | version "1.7.12" 774 | resolved "https://registry.yarnpkg.com/graphql-playground-middleware-lambda/-/graphql-playground-middleware-lambda-1.7.12.tgz#1b06440a288dbcd53f935b43e5b9ca2738a06305" 775 | integrity sha512-fJ1Y0Ck5ctmfaQFoWv7vNnVP7We19P3miVmOT85YPrjpzbMYv0wPfxm4Zjt8nnqXr0KU9nGW53tz3K7/Lvzxtw== 776 | dependencies: 777 | graphql-playground-html "1.6.12" 778 | 779 | graphql-shield@5.7.3: 780 | version "5.7.3" 781 | resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-5.7.3.tgz#308daa76b66fae0ae4cc8d491b7bf1221b87f569" 782 | integrity sha512-RFy+wK0EUshhWBThA8YDUghRPNRMYcCetjVO3eu4xAdWf5K366gt5ekz0eWkYp2bR6g+t0/9O0pKW4yw/gkCHA== 783 | dependencies: 784 | "@types/yup" "0.26.18" 785 | lightercollective "^0.3.0" 786 | object-hash "^1.3.1" 787 | yup "^0.27.0" 788 | 789 | graphql-subscriptions@^0.5.8: 790 | version "0.5.8" 791 | resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-0.5.8.tgz#13a6143c546bce390404657dc73ca501def30aa7" 792 | integrity sha512-0CaZnXKBw2pwnIbvmVckby5Ge5e2ecmjofhYCdyeACbCly2j3WXDP/pl+s+Dqd2GQFC7y99NB+53jrt55CKxYQ== 793 | dependencies: 794 | iterall "^1.2.1" 795 | 796 | graphql-tools@^4.0.0, graphql-tools@^4.0.5: 797 | version "4.0.8" 798 | resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30" 799 | integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg== 800 | dependencies: 801 | apollo-link "^1.2.14" 802 | apollo-utilities "^1.0.1" 803 | deprecated-decorator "^0.1.6" 804 | iterall "^1.1.3" 805 | uuid "^3.1.0" 806 | 807 | graphql-upload@^8.0.0: 808 | version "8.1.0" 809 | resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-8.1.0.tgz#6d0ab662db5677a68bfb1f2c870ab2544c14939a" 810 | integrity sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q== 811 | dependencies: 812 | busboy "^0.3.1" 813 | fs-capacitor "^2.0.4" 814 | http-errors "^1.7.3" 815 | object-path "^0.11.4" 816 | 817 | graphql-yoga@1.18.3: 818 | version "1.18.3" 819 | resolved "https://registry.yarnpkg.com/graphql-yoga/-/graphql-yoga-1.18.3.tgz#047fa511dbef63cf6d6ea7c06a71202d37444844" 820 | integrity sha512-tR6JYbwLSBVu0Z8M7BIyt1PHhhexmRwneYM8Ru/g2pixrtsWbelBFAXU7bDPhXrqZ49Zxt2zLJ60x3bLNGo/bQ== 821 | dependencies: 822 | "@types/aws-lambda" "8.10.13" 823 | "@types/cors" "^2.8.4" 824 | "@types/express" "^4.11.1" 825 | "@types/graphql" "^14.0.0" 826 | "@types/graphql-deduplicator" "^2.0.0" 827 | "@types/zen-observable" "^0.5.3" 828 | apollo-server-express "^1.3.6" 829 | apollo-server-lambda "1.3.6" 830 | apollo-upload-server "^7.0.0" 831 | body-parser-graphql "1.1.0" 832 | cors "^2.8.4" 833 | express "^4.16.3" 834 | graphql "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0" 835 | graphql-deduplicator "^2.0.1" 836 | graphql-import "^0.7.0" 837 | graphql-middleware "4.0.1" 838 | graphql-playground-middleware-express "1.7.11" 839 | graphql-playground-middleware-lambda "1.7.12" 840 | graphql-subscriptions "^0.5.8" 841 | graphql-tools "^4.0.0" 842 | graphql-upload "^8.0.0" 843 | subscriptions-transport-ws "^0.9.8" 844 | 845 | graphql@*: 846 | version "15.1.0" 847 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.1.0.tgz#b93e28de805294ec08e1630d901db550cb8960a1" 848 | integrity sha512-0TVyfOlCGhv/DBczQkJmwXOK6fjWkjzY3Pt7wY8i0gcYXq8aogG3weCsg48m72lywKSeOqedEHvVPOvZvSD51Q== 849 | 850 | graphql@14.6.0, "graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0": 851 | version "14.6.0" 852 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.6.0.tgz#57822297111e874ea12f5cd4419616930cd83e49" 853 | integrity sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg== 854 | dependencies: 855 | iterall "^1.2.2" 856 | 857 | growly@^1.3.0: 858 | version "1.3.0" 859 | resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" 860 | integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= 861 | 862 | hosted-git-info@^2.1.4: 863 | version "2.8.8" 864 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" 865 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== 866 | 867 | http-errors@1.7.2: 868 | version "1.7.2" 869 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 870 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 871 | dependencies: 872 | depd "~1.1.2" 873 | inherits "2.0.3" 874 | setprototypeof "1.1.1" 875 | statuses ">= 1.5.0 < 2" 876 | toidentifier "1.0.0" 877 | 878 | http-errors@^1.7.0, http-errors@^1.7.3, http-errors@~1.7.2: 879 | version "1.7.3" 880 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 881 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 882 | dependencies: 883 | depd "~1.1.2" 884 | inherits "2.0.4" 885 | setprototypeof "1.1.1" 886 | statuses ">= 1.5.0 < 2" 887 | toidentifier "1.0.0" 888 | 889 | iconv-lite@0.4.24: 890 | version "0.4.24" 891 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 892 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 893 | dependencies: 894 | safer-buffer ">= 2.1.2 < 3" 895 | 896 | indent-string@^2.1.0: 897 | version "2.1.0" 898 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 899 | integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= 900 | dependencies: 901 | repeating "^2.0.0" 902 | 903 | infinity-agent@^2.0.3: 904 | version "2.0.3" 905 | resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" 906 | integrity sha1-ReDi/3qesDCyfWK3SzdEt6esQhY= 907 | 908 | inflight@^1.0.4: 909 | version "1.0.6" 910 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 911 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 912 | dependencies: 913 | once "^1.3.0" 914 | wrappy "1" 915 | 916 | inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: 917 | version "2.0.4" 918 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 919 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 920 | 921 | inherits@2.0.3: 922 | version "2.0.3" 923 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 924 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 925 | 926 | ipaddr.js@1.9.1: 927 | version "1.9.1" 928 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 929 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 930 | 931 | is-arrayish@^0.2.1: 932 | version "0.2.1" 933 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 934 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 935 | 936 | is-finite@^1.0.0: 937 | version "1.1.0" 938 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" 939 | integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== 940 | 941 | is-utf8@^0.2.0: 942 | version "0.2.1" 943 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 944 | integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 945 | 946 | is-wsl@^1.1.0: 947 | version "1.1.0" 948 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" 949 | integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= 950 | 951 | isarray@0.0.1: 952 | version "0.0.1" 953 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 954 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 955 | 956 | isarray@~1.0.0: 957 | version "1.0.0" 958 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 959 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 960 | 961 | isexe@^2.0.0: 962 | version "2.0.0" 963 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 964 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 965 | 966 | iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2: 967 | version "1.3.0" 968 | resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" 969 | integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== 970 | 971 | jsonfile@^6.0.1: 972 | version "6.0.1" 973 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" 974 | integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== 975 | dependencies: 976 | universalify "^1.0.0" 977 | optionalDependencies: 978 | graceful-fs "^4.1.6" 979 | 980 | jsonwebtoken@8.5.1: 981 | version "8.5.1" 982 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 983 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 984 | dependencies: 985 | jws "^3.2.2" 986 | lodash.includes "^4.3.0" 987 | lodash.isboolean "^3.0.3" 988 | lodash.isinteger "^4.0.4" 989 | lodash.isnumber "^3.0.3" 990 | lodash.isplainobject "^4.0.6" 991 | lodash.isstring "^4.0.1" 992 | lodash.once "^4.0.0" 993 | ms "^2.1.1" 994 | semver "^5.6.0" 995 | 996 | jwa@^1.4.1: 997 | version "1.4.1" 998 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 999 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 1000 | dependencies: 1001 | buffer-equal-constant-time "1.0.1" 1002 | ecdsa-sig-formatter "1.0.11" 1003 | safe-buffer "^5.0.1" 1004 | 1005 | jws@^3.2.2: 1006 | version "3.2.2" 1007 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 1008 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 1009 | dependencies: 1010 | jwa "^1.4.1" 1011 | safe-buffer "^5.0.1" 1012 | 1013 | lightercollective@^0.3.0: 1014 | version "0.3.0" 1015 | resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.3.0.tgz#1f07638642ec645d70bdb69ab2777676f35a28f0" 1016 | integrity sha512-RFOLSUVvwdK3xA0P8o6G7QGXLIyy1L2qv5caEI7zXN5ciaEjbAriRF182kbsoJ1S1TgvpyGcN485fMky6qxOPw== 1017 | 1018 | load-json-file@^1.0.0: 1019 | version "1.1.0" 1020 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1021 | integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 1022 | dependencies: 1023 | graceful-fs "^4.1.2" 1024 | parse-json "^2.2.0" 1025 | pify "^2.0.0" 1026 | pinkie-promise "^2.0.0" 1027 | strip-bom "^2.0.0" 1028 | 1029 | locate-path@^3.0.0: 1030 | version "3.0.0" 1031 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1032 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1033 | dependencies: 1034 | p-locate "^3.0.0" 1035 | path-exists "^3.0.0" 1036 | 1037 | lodash._arraycopy@^3.0.0: 1038 | version "3.0.0" 1039 | resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" 1040 | integrity sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE= 1041 | 1042 | lodash._arrayeach@^3.0.0: 1043 | version "3.0.0" 1044 | resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" 1045 | integrity sha1-urFWsqkNPxu9XGU0AzSeXlkz754= 1046 | 1047 | lodash._arraymap@^3.0.0: 1048 | version "3.0.0" 1049 | resolved "https://registry.yarnpkg.com/lodash._arraymap/-/lodash._arraymap-3.0.0.tgz#1a8fd0f4c0df4b61dea076d717cdc97f0a3c3e66" 1050 | integrity sha1-Go/Q9MDfS2HeoHbXF83Jfwo8PmY= 1051 | 1052 | lodash._baseassign@^3.0.0: 1053 | version "3.2.0" 1054 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 1055 | integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= 1056 | dependencies: 1057 | lodash._basecopy "^3.0.0" 1058 | lodash.keys "^3.0.0" 1059 | 1060 | lodash._basecallback@^3.0.0: 1061 | version "3.3.1" 1062 | resolved "https://registry.yarnpkg.com/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz#b7b2bb43dc2160424a21ccf26c57e443772a8e27" 1063 | integrity sha1-t7K7Q9whYEJKIczybFfkQ3cqjic= 1064 | dependencies: 1065 | lodash._baseisequal "^3.0.0" 1066 | lodash._bindcallback "^3.0.0" 1067 | lodash.isarray "^3.0.0" 1068 | lodash.pairs "^3.0.0" 1069 | 1070 | lodash._basecopy@^3.0.0: 1071 | version "3.0.1" 1072 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 1073 | integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= 1074 | 1075 | lodash._baseeach@^3.0.0: 1076 | version "3.0.4" 1077 | resolved "https://registry.yarnpkg.com/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz#cf8706572ca144e8d9d75227c990da982f932af3" 1078 | integrity sha1-z4cGVyyhROjZ11InyZDamC+TKvM= 1079 | dependencies: 1080 | lodash.keys "^3.0.0" 1081 | 1082 | lodash._basefor@^3.0.0: 1083 | version "3.0.3" 1084 | resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" 1085 | integrity sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI= 1086 | 1087 | lodash._baseisequal@^3.0.0: 1088 | version "3.0.7" 1089 | resolved "https://registry.yarnpkg.com/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz#d8025f76339d29342767dcc887ce5cb95a5b51f1" 1090 | integrity sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE= 1091 | dependencies: 1092 | lodash.isarray "^3.0.0" 1093 | lodash.istypedarray "^3.0.0" 1094 | lodash.keys "^3.0.0" 1095 | 1096 | lodash._bindcallback@^3.0.0: 1097 | version "3.0.1" 1098 | resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" 1099 | integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= 1100 | 1101 | lodash._createaggregator@^3.0.0: 1102 | version "3.0.0" 1103 | resolved "https://registry.yarnpkg.com/lodash._createaggregator/-/lodash._createaggregator-3.0.0.tgz#d66cbf39949b050d87df53461f0d059dfb08dc9f" 1104 | integrity sha1-1my/OZSbBQ2H31NGHw0FnfsI3J8= 1105 | dependencies: 1106 | lodash._basecallback "^3.0.0" 1107 | lodash._baseeach "^3.0.0" 1108 | lodash.isarray "^3.0.0" 1109 | 1110 | lodash._createassigner@^3.0.0: 1111 | version "3.1.1" 1112 | resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" 1113 | integrity sha1-g4pbri/aymOsIt7o4Z+k5taXCxE= 1114 | dependencies: 1115 | lodash._bindcallback "^3.0.0" 1116 | lodash._isiterateecall "^3.0.0" 1117 | lodash.restparam "^3.0.0" 1118 | 1119 | lodash._createwrapper@^3.0.0: 1120 | version "3.2.0" 1121 | resolved "https://registry.yarnpkg.com/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz#df453e664163217b895a454065af1c47a0ea3c4d" 1122 | integrity sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0= 1123 | dependencies: 1124 | lodash._root "^3.0.0" 1125 | 1126 | lodash._getnative@^3.0.0: 1127 | version "3.9.1" 1128 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 1129 | integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= 1130 | 1131 | lodash._isiterateecall@^3.0.0: 1132 | version "3.0.9" 1133 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 1134 | integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= 1135 | 1136 | lodash._replaceholders@^3.0.0: 1137 | version "3.0.0" 1138 | resolved "https://registry.yarnpkg.com/lodash._replaceholders/-/lodash._replaceholders-3.0.0.tgz#8abbb7126c431f7ed744f7baaf39f08bc9bd9d58" 1139 | integrity sha1-iru3EmxDH37XRPe6rznwi8m9nVg= 1140 | 1141 | lodash._root@^3.0.0: 1142 | version "3.0.1" 1143 | resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" 1144 | integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= 1145 | 1146 | lodash.assign@^3.0.0: 1147 | version "3.2.0" 1148 | resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" 1149 | integrity sha1-POnwI0tLIiPilrj6CsH+6OvKZPo= 1150 | dependencies: 1151 | lodash._baseassign "^3.0.0" 1152 | lodash._createassigner "^3.0.0" 1153 | lodash.keys "^3.0.0" 1154 | 1155 | lodash.defaults@^3.1.2: 1156 | version "3.1.2" 1157 | resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" 1158 | integrity sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw= 1159 | dependencies: 1160 | lodash.assign "^3.0.0" 1161 | lodash.restparam "^3.0.0" 1162 | 1163 | lodash.includes@^4.3.0: 1164 | version "4.3.0" 1165 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 1166 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= 1167 | 1168 | lodash.indexby@^3.1.1: 1169 | version "3.1.1" 1170 | resolved "https://registry.yarnpkg.com/lodash.indexby/-/lodash.indexby-3.1.1.tgz#f2caab0ff279837858147730d863cdd80c1c042e" 1171 | integrity sha1-8sqrD/J5g3hYFHcw2GPN2AwcBC4= 1172 | dependencies: 1173 | lodash._createaggregator "^3.0.0" 1174 | lodash.keys "^3.0.0" 1175 | 1176 | lodash.isarguments@^3.0.0: 1177 | version "3.1.0" 1178 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 1179 | integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= 1180 | 1181 | lodash.isarray@^3.0.0: 1182 | version "3.0.4" 1183 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 1184 | integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= 1185 | 1186 | lodash.isboolean@^3.0.3: 1187 | version "3.0.3" 1188 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 1189 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= 1190 | 1191 | lodash.isinteger@^4.0.4: 1192 | version "4.0.4" 1193 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 1194 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= 1195 | 1196 | lodash.isnumber@^3.0.3: 1197 | version "3.0.3" 1198 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 1199 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= 1200 | 1201 | lodash.isplainobject@^3.0.0: 1202 | version "3.2.0" 1203 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz#9a8238ae16b200432960cd7346512d0123fbf4c5" 1204 | integrity sha1-moI4rhayAEMpYM1zRlEtASP79MU= 1205 | dependencies: 1206 | lodash._basefor "^3.0.0" 1207 | lodash.isarguments "^3.0.0" 1208 | lodash.keysin "^3.0.0" 1209 | 1210 | lodash.isplainobject@^4.0.6: 1211 | version "4.0.6" 1212 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 1213 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 1214 | 1215 | lodash.isstring@^4.0.1: 1216 | version "4.0.1" 1217 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 1218 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 1219 | 1220 | lodash.istypedarray@^3.0.0: 1221 | version "3.0.6" 1222 | resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" 1223 | integrity sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I= 1224 | 1225 | lodash.keys@^3.0.0: 1226 | version "3.1.2" 1227 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 1228 | integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= 1229 | dependencies: 1230 | lodash._getnative "^3.0.0" 1231 | lodash.isarguments "^3.0.0" 1232 | lodash.isarray "^3.0.0" 1233 | 1234 | lodash.keysin@^3.0.0: 1235 | version "3.0.8" 1236 | resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-3.0.8.tgz#22c4493ebbedb1427962a54b445b2c8a767fb47f" 1237 | integrity sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8= 1238 | dependencies: 1239 | lodash.isarguments "^3.0.0" 1240 | lodash.isarray "^3.0.0" 1241 | 1242 | lodash.last@^3.0.0: 1243 | version "3.0.0" 1244 | resolved "https://registry.yarnpkg.com/lodash.last/-/lodash.last-3.0.0.tgz#242f663112dd4c6e63728c60a3c909d1bdadbd4c" 1245 | integrity sha1-JC9mMRLdTG5jcoxgo8kJ0b2tvUw= 1246 | 1247 | lodash.map@^3.1.4: 1248 | version "3.1.4" 1249 | resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-3.1.4.tgz#b483acd1b786c5c7b492c495f7b5266229bc00c2" 1250 | integrity sha1-tIOs0beGxce0ksSV97UmYim8AMI= 1251 | dependencies: 1252 | lodash._arraymap "^3.0.0" 1253 | lodash._basecallback "^3.0.0" 1254 | lodash._baseeach "^3.0.0" 1255 | lodash.isarray "^3.0.0" 1256 | lodash.keys "^3.0.0" 1257 | 1258 | lodash.merge@^3.3.2: 1259 | version "3.3.2" 1260 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-3.3.2.tgz#0d90d93ed637b1878437bb3e21601260d7afe994" 1261 | integrity sha1-DZDZPtY3sYeEN7s+IWASYNev6ZQ= 1262 | dependencies: 1263 | lodash._arraycopy "^3.0.0" 1264 | lodash._arrayeach "^3.0.0" 1265 | lodash._createassigner "^3.0.0" 1266 | lodash._getnative "^3.0.0" 1267 | lodash.isarguments "^3.0.0" 1268 | lodash.isarray "^3.0.0" 1269 | lodash.isplainobject "^3.0.0" 1270 | lodash.istypedarray "^3.0.0" 1271 | lodash.keys "^3.0.0" 1272 | lodash.keysin "^3.0.0" 1273 | lodash.toplainobject "^3.0.0" 1274 | 1275 | lodash.once@^4.0.0: 1276 | version "4.1.1" 1277 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 1278 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= 1279 | 1280 | lodash.pairs@^3.0.0: 1281 | version "3.0.1" 1282 | resolved "https://registry.yarnpkg.com/lodash.pairs/-/lodash.pairs-3.0.1.tgz#bbe08d5786eeeaa09a15c91ebf0dcb7d2be326a9" 1283 | integrity sha1-u+CNV4bu6qCaFckevw3LfSvjJqk= 1284 | dependencies: 1285 | lodash.keys "^3.0.0" 1286 | 1287 | lodash.partialright@^3.1.1: 1288 | version "3.1.1" 1289 | resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-3.1.1.tgz#e12389273ef4511da7a3af0523e2f655443faaaf" 1290 | integrity sha1-4SOJJz70UR2no68FI+L2VUQ/qq8= 1291 | dependencies: 1292 | lodash._createwrapper "^3.0.0" 1293 | lodash._replaceholders "^3.0.0" 1294 | lodash.restparam "^3.0.0" 1295 | 1296 | lodash.restparam@^3.0.0: 1297 | version "3.6.1" 1298 | resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" 1299 | integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= 1300 | 1301 | lodash.toplainobject@^3.0.0: 1302 | version "3.0.0" 1303 | resolved "https://registry.yarnpkg.com/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz#28790ad942d293d78aa663a07ecf7f52ca04198d" 1304 | integrity sha1-KHkK2ULSk9eKpmOgfs9/UsoEGY0= 1305 | dependencies: 1306 | lodash._basecopy "^3.0.0" 1307 | lodash.keysin "^3.0.0" 1308 | 1309 | lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.4: 1310 | version "4.17.15" 1311 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 1312 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 1313 | 1314 | loud-rejection@^1.0.0: 1315 | version "1.6.0" 1316 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1317 | integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= 1318 | dependencies: 1319 | currently-unhandled "^0.4.1" 1320 | signal-exit "^3.0.0" 1321 | 1322 | mailgun.js@^2.0.1: 1323 | version "2.0.1" 1324 | resolved "https://registry.yarnpkg.com/mailgun.js/-/mailgun.js-2.0.1.tgz#13d703e0c25e85da29818a03f1d424a5991d7402" 1325 | integrity sha1-E9cD4MJehdopgYoD8dQkpZkddAI= 1326 | dependencies: 1327 | btoa "^1.1.2" 1328 | es6-promise "^3.0.2" 1329 | lodash.defaults "^3.1.2" 1330 | lodash.indexby "^3.1.1" 1331 | lodash.last "^3.0.0" 1332 | lodash.map "^3.1.4" 1333 | lodash.merge "^3.3.2" 1334 | lodash.partialright "^3.1.1" 1335 | popsicle "^1.1.1" 1336 | popsicle-status "^0.2.0" 1337 | url-join "0.0.1" 1338 | 1339 | make-error@^1.1.1: 1340 | version "1.3.6" 1341 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1342 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1343 | 1344 | map-obj@^1.0.0, map-obj@^1.0.1: 1345 | version "1.0.1" 1346 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1347 | integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= 1348 | 1349 | media-typer@0.3.0: 1350 | version "0.3.0" 1351 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1352 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1353 | 1354 | meow@^3.3.0: 1355 | version "3.7.0" 1356 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1357 | integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= 1358 | dependencies: 1359 | camelcase-keys "^2.0.0" 1360 | decamelize "^1.1.2" 1361 | loud-rejection "^1.0.0" 1362 | map-obj "^1.0.1" 1363 | minimist "^1.1.3" 1364 | normalize-package-data "^2.3.4" 1365 | object-assign "^4.0.1" 1366 | read-pkg-up "^1.0.1" 1367 | redent "^1.0.0" 1368 | trim-newlines "^1.0.0" 1369 | 1370 | merge-descriptors@1.0.1: 1371 | version "1.0.1" 1372 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1373 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1374 | 1375 | methods@^1.1.1, methods@~1.1.2: 1376 | version "1.1.2" 1377 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1378 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1379 | 1380 | mime-db@1.44.0: 1381 | version "1.44.0" 1382 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 1383 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 1384 | 1385 | mime-db@~1.12.0: 1386 | version "1.12.0" 1387 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" 1388 | integrity sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc= 1389 | 1390 | mime-types@~2.0.3: 1391 | version "2.0.14" 1392 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" 1393 | integrity sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY= 1394 | dependencies: 1395 | mime-db "~1.12.0" 1396 | 1397 | mime-types@~2.1.24: 1398 | version "2.1.27" 1399 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 1400 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 1401 | dependencies: 1402 | mime-db "1.44.0" 1403 | 1404 | mime@1.6.0: 1405 | version "1.6.0" 1406 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1407 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1408 | 1409 | minimatch@^3.0.4: 1410 | version "3.0.4" 1411 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1412 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1413 | dependencies: 1414 | brace-expansion "^1.1.7" 1415 | 1416 | minimist@^1.1.3, minimist@^1.2.5: 1417 | version "1.2.5" 1418 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1419 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1420 | 1421 | mkdirp@^0.5.1: 1422 | version "0.5.5" 1423 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1424 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1425 | dependencies: 1426 | minimist "^1.2.5" 1427 | 1428 | ms@2.0.0: 1429 | version "2.0.0" 1430 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1431 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1432 | 1433 | ms@2.1.1: 1434 | version "2.1.1" 1435 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1436 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1437 | 1438 | ms@^2.1.1: 1439 | version "2.1.2" 1440 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1441 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1442 | 1443 | native-or-bluebird@^1.2.0: 1444 | version "1.2.0" 1445 | resolved "https://registry.yarnpkg.com/native-or-bluebird/-/native-or-bluebird-1.2.0.tgz#39c47bfd7825d1fb9ffad32210ae25daadf101c9" 1446 | integrity sha1-OcR7/Xgl0fuf+tMiEK4l2q3xAck= 1447 | 1448 | negotiator@0.6.2: 1449 | version "0.6.2" 1450 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1451 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1452 | 1453 | nexus-prisma@0.13.0: 1454 | version "0.13.0" 1455 | resolved "https://registry.yarnpkg.com/nexus-prisma/-/nexus-prisma-0.13.0.tgz#6454a2740d95631d8e6bf81e2c8f2245efe58c7e" 1456 | integrity sha512-P4WCd2V0B+lcbV5svQYbBN+lLDozMbvXKda+Sb8PYUYRWXYL293rpHsF8/Rz/P3EN0mvqQTJMA8VBpyd6DChXQ== 1457 | dependencies: 1458 | camelcase "^6.0.0" 1459 | fs-extra "^9.0.0" 1460 | pluralize "^8.0.0" 1461 | 1462 | node-notifier@^5.4.0: 1463 | version "5.4.3" 1464 | resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" 1465 | integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== 1466 | dependencies: 1467 | growly "^1.3.0" 1468 | is-wsl "^1.1.0" 1469 | semver "^5.5.0" 1470 | shellwords "^0.1.1" 1471 | which "^1.3.0" 1472 | 1473 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 1474 | version "2.5.0" 1475 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1476 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1477 | dependencies: 1478 | hosted-git-info "^2.1.4" 1479 | resolve "^1.10.0" 1480 | semver "2 || 3 || 4 || 5" 1481 | validate-npm-package-license "^3.0.1" 1482 | 1483 | object-assign@^4, object-assign@^4.0.1: 1484 | version "4.1.1" 1485 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1486 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1487 | 1488 | object-hash@^1.3.1: 1489 | version "1.3.1" 1490 | resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" 1491 | integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== 1492 | 1493 | object-path@^0.11.4: 1494 | version "0.11.4" 1495 | resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" 1496 | integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= 1497 | 1498 | on-finished@~2.3.0: 1499 | version "2.3.0" 1500 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1501 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1502 | dependencies: 1503 | ee-first "1.1.1" 1504 | 1505 | once@^1.3.0: 1506 | version "1.4.0" 1507 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1508 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1509 | dependencies: 1510 | wrappy "1" 1511 | 1512 | p-limit@^2.0.0: 1513 | version "2.3.0" 1514 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1515 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1516 | dependencies: 1517 | p-try "^2.0.0" 1518 | 1519 | p-locate@^3.0.0: 1520 | version "3.0.0" 1521 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1522 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1523 | dependencies: 1524 | p-limit "^2.0.0" 1525 | 1526 | p-try@^2.0.0: 1527 | version "2.2.0" 1528 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1529 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1530 | 1531 | parse-json@^2.2.0: 1532 | version "2.2.0" 1533 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1534 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 1535 | dependencies: 1536 | error-ex "^1.2.0" 1537 | 1538 | parseurl@~1.3.3: 1539 | version "1.3.3" 1540 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1541 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1542 | 1543 | path-exists@^2.0.0: 1544 | version "2.1.0" 1545 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1546 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 1547 | dependencies: 1548 | pinkie-promise "^2.0.0" 1549 | 1550 | path-exists@^3.0.0: 1551 | version "3.0.0" 1552 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1553 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1554 | 1555 | path-is-absolute@^1.0.0: 1556 | version "1.0.1" 1557 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1558 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1559 | 1560 | path-parse@^1.0.6: 1561 | version "1.0.6" 1562 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1563 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1564 | 1565 | path-to-regexp@0.1.7: 1566 | version "0.1.7" 1567 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1568 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1569 | 1570 | path-type@^1.0.0: 1571 | version "1.1.0" 1572 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1573 | integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= 1574 | dependencies: 1575 | graceful-fs "^4.1.2" 1576 | pify "^2.0.0" 1577 | pinkie-promise "^2.0.0" 1578 | 1579 | pify@^2.0.0: 1580 | version "2.3.0" 1581 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1582 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1583 | 1584 | pinkie-promise@^2.0.0: 1585 | version "2.0.1" 1586 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1587 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1588 | dependencies: 1589 | pinkie "^2.0.0" 1590 | 1591 | pinkie@^2.0.0: 1592 | version "2.0.4" 1593 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1594 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1595 | 1596 | pkg-up@^3.1.0: 1597 | version "3.1.0" 1598 | resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" 1599 | integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== 1600 | dependencies: 1601 | find-up "^3.0.0" 1602 | 1603 | pluralize@^8.0.0: 1604 | version "8.0.0" 1605 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" 1606 | integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== 1607 | 1608 | popsicle-status@^0.2.0: 1609 | version "0.2.2" 1610 | resolved "https://registry.yarnpkg.com/popsicle-status/-/popsicle-status-0.2.2.tgz#8c40b3848561b51c69fa848d06efc22d9520a7df" 1611 | integrity sha1-jECzhIVhtRxp+oSNBu/CLZUgp98= 1612 | 1613 | popsicle@^1.1.1: 1614 | version "1.4.0" 1615 | resolved "https://registry.yarnpkg.com/popsicle/-/popsicle-1.4.0.tgz#c2e38a967a6f8c4965ccdc30c04290c1f2c55bed" 1616 | integrity sha1-wuOKlnpvjEllzNwwwEKQwfLFW+0= 1617 | dependencies: 1618 | arrify "^1.0.0" 1619 | concat-stream "^1.4.7" 1620 | form-data "^0.2.0" 1621 | infinity-agent "^2.0.3" 1622 | methods "^1.1.1" 1623 | native-or-bluebird "^1.2.0" 1624 | tough-cookie "^2.0.0" 1625 | xtend "^4.0.0" 1626 | 1627 | process-nextick-args@~2.0.0: 1628 | version "2.0.1" 1629 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1630 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1631 | 1632 | property-expr@^1.5.0: 1633 | version "1.5.1" 1634 | resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" 1635 | integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== 1636 | 1637 | proxy-addr@~2.0.5: 1638 | version "2.0.6" 1639 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 1640 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 1641 | dependencies: 1642 | forwarded "~0.1.2" 1643 | ipaddr.js "1.9.1" 1644 | 1645 | psl@^1.1.28: 1646 | version "1.8.0" 1647 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" 1648 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 1649 | 1650 | punycode@^2.1.1: 1651 | version "2.1.1" 1652 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1653 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1654 | 1655 | qs@6.7.0: 1656 | version "6.7.0" 1657 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1658 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1659 | 1660 | range-parser@~1.2.1: 1661 | version "1.2.1" 1662 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1663 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1664 | 1665 | raw-body@2.4.0: 1666 | version "2.4.0" 1667 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1668 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1669 | dependencies: 1670 | bytes "3.1.0" 1671 | http-errors "1.7.2" 1672 | iconv-lite "0.4.24" 1673 | unpipe "1.0.0" 1674 | 1675 | read-pkg-up@^1.0.1: 1676 | version "1.0.1" 1677 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1678 | integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= 1679 | dependencies: 1680 | find-up "^1.0.0" 1681 | read-pkg "^1.0.0" 1682 | 1683 | read-pkg@^1.0.0: 1684 | version "1.1.0" 1685 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1686 | integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 1687 | dependencies: 1688 | load-json-file "^1.0.0" 1689 | normalize-package-data "^2.3.2" 1690 | path-type "^1.0.0" 1691 | 1692 | readable-stream@1.1.x: 1693 | version "1.1.14" 1694 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 1695 | integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= 1696 | dependencies: 1697 | core-util-is "~1.0.0" 1698 | inherits "~2.0.1" 1699 | isarray "0.0.1" 1700 | string_decoder "~0.10.x" 1701 | 1702 | readable-stream@^2.2.2: 1703 | version "2.3.7" 1704 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1705 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1706 | dependencies: 1707 | core-util-is "~1.0.0" 1708 | inherits "~2.0.3" 1709 | isarray "~1.0.0" 1710 | process-nextick-args "~2.0.0" 1711 | safe-buffer "~5.1.1" 1712 | string_decoder "~1.1.1" 1713 | util-deprecate "~1.0.1" 1714 | 1715 | redent@^1.0.0: 1716 | version "1.0.0" 1717 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 1718 | integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= 1719 | dependencies: 1720 | indent-string "^2.1.0" 1721 | strip-indent "^1.0.1" 1722 | 1723 | regenerator-runtime@^0.13.4: 1724 | version "0.13.5" 1725 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" 1726 | integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== 1727 | 1728 | repeating@^2.0.0: 1729 | version "2.0.1" 1730 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1731 | integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= 1732 | dependencies: 1733 | is-finite "^1.0.0" 1734 | 1735 | resolve-from@^4.0.0: 1736 | version "4.0.0" 1737 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1738 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1739 | 1740 | resolve@^1.0.0, resolve@^1.10.0: 1741 | version "1.17.0" 1742 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 1743 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 1744 | dependencies: 1745 | path-parse "^1.0.6" 1746 | 1747 | rimraf@^2.6.1: 1748 | version "2.7.1" 1749 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 1750 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1751 | dependencies: 1752 | glob "^7.1.3" 1753 | 1754 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1755 | version "5.1.2" 1756 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1757 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1758 | 1759 | safe-buffer@^5.0.1: 1760 | version "5.2.1" 1761 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1762 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1763 | 1764 | "safer-buffer@>= 2.1.2 < 3": 1765 | version "2.1.2" 1766 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1767 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1768 | 1769 | "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: 1770 | version "5.7.1" 1771 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1772 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1773 | 1774 | send@0.17.1: 1775 | version "0.17.1" 1776 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 1777 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 1778 | dependencies: 1779 | debug "2.6.9" 1780 | depd "~1.1.2" 1781 | destroy "~1.0.4" 1782 | encodeurl "~1.0.2" 1783 | escape-html "~1.0.3" 1784 | etag "~1.8.1" 1785 | fresh "0.5.2" 1786 | http-errors "~1.7.2" 1787 | mime "1.6.0" 1788 | ms "2.1.1" 1789 | on-finished "~2.3.0" 1790 | range-parser "~1.2.1" 1791 | statuses "~1.5.0" 1792 | 1793 | serve-static@1.14.1: 1794 | version "1.14.1" 1795 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 1796 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 1797 | dependencies: 1798 | encodeurl "~1.0.2" 1799 | escape-html "~1.0.3" 1800 | parseurl "~1.3.3" 1801 | send "0.17.1" 1802 | 1803 | setprototypeof@1.1.1: 1804 | version "1.1.1" 1805 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1806 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1807 | 1808 | shellwords@^0.1.1: 1809 | version "0.1.1" 1810 | resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" 1811 | integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== 1812 | 1813 | signal-exit@^3.0.0: 1814 | version "3.0.3" 1815 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1816 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1817 | 1818 | source-map-support@^0.5.1, source-map-support@^0.5.12, source-map-support@^0.5.17: 1819 | version "0.5.19" 1820 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 1821 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 1822 | dependencies: 1823 | buffer-from "^1.0.0" 1824 | source-map "^0.6.0" 1825 | 1826 | source-map@^0.6.0: 1827 | version "0.6.1" 1828 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1829 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1830 | 1831 | spdx-correct@^3.0.0: 1832 | version "3.1.1" 1833 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 1834 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 1835 | dependencies: 1836 | spdx-expression-parse "^3.0.0" 1837 | spdx-license-ids "^3.0.0" 1838 | 1839 | spdx-exceptions@^2.1.0: 1840 | version "2.3.0" 1841 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1842 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 1843 | 1844 | spdx-expression-parse@^3.0.0: 1845 | version "3.0.1" 1846 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 1847 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 1848 | dependencies: 1849 | spdx-exceptions "^2.1.0" 1850 | spdx-license-ids "^3.0.0" 1851 | 1852 | spdx-license-ids@^3.0.0: 1853 | version "3.0.5" 1854 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 1855 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 1856 | 1857 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 1858 | version "1.5.0" 1859 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1860 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1861 | 1862 | streamsearch@0.1.2: 1863 | version "0.1.2" 1864 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" 1865 | integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= 1866 | 1867 | string_decoder@~0.10.x: 1868 | version "0.10.31" 1869 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1870 | integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= 1871 | 1872 | string_decoder@~1.1.1: 1873 | version "1.1.1" 1874 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1875 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1876 | dependencies: 1877 | safe-buffer "~5.1.0" 1878 | 1879 | strip-bom@^2.0.0: 1880 | version "2.0.0" 1881 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1882 | integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 1883 | dependencies: 1884 | is-utf8 "^0.2.0" 1885 | 1886 | strip-bom@^3.0.0: 1887 | version "3.0.0" 1888 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1889 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1890 | 1891 | strip-indent@^1.0.1: 1892 | version "1.0.1" 1893 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 1894 | integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= 1895 | dependencies: 1896 | get-stdin "^4.0.1" 1897 | 1898 | strip-json-comments@^2.0.0: 1899 | version "2.0.1" 1900 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1901 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1902 | 1903 | subscriptions-transport-ws@^0.9.8: 1904 | version "0.9.16" 1905 | resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.16.tgz#90a422f0771d9c32069294c08608af2d47f596ec" 1906 | integrity sha512-pQdoU7nC+EpStXnCfh/+ho0zE0Z+ma+i7xvj7bkXKb1dvYHSZxgRPaU6spRP+Bjzow67c/rRDoix5RT0uU9omw== 1907 | dependencies: 1908 | backo2 "^1.0.2" 1909 | eventemitter3 "^3.1.0" 1910 | iterall "^1.2.1" 1911 | symbol-observable "^1.0.4" 1912 | ws "^5.2.0" 1913 | 1914 | symbol-observable@^1.0.4: 1915 | version "1.2.0" 1916 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" 1917 | integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== 1918 | 1919 | synchronous-promise@^2.0.6: 1920 | version "2.0.13" 1921 | resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.13.tgz#9d8c165ddee69c5a6542862b405bc50095926702" 1922 | integrity sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA== 1923 | 1924 | toidentifier@1.0.0: 1925 | version "1.0.0" 1926 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1927 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1928 | 1929 | toposort@^2.0.2: 1930 | version "2.0.2" 1931 | resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" 1932 | integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= 1933 | 1934 | tough-cookie@^2.0.0: 1935 | version "2.5.0" 1936 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 1937 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 1938 | dependencies: 1939 | psl "^1.1.28" 1940 | punycode "^2.1.1" 1941 | 1942 | tree-kill@^1.2.1: 1943 | version "1.2.2" 1944 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 1945 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 1946 | 1947 | trim-newlines@^1.0.0: 1948 | version "1.0.0" 1949 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 1950 | integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= 1951 | 1952 | ts-invariant@^0.4.0: 1953 | version "0.4.4" 1954 | resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" 1955 | integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== 1956 | dependencies: 1957 | tslib "^1.9.3" 1958 | 1959 | ts-node-dev@1.0.0-pre.44: 1960 | version "1.0.0-pre.44" 1961 | resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.0.0-pre.44.tgz#2f4d666088481fb9c4e4f5bc8f15995bd8b06ecb" 1962 | integrity sha512-M5ZwvB6FU3jtc70i5lFth86/6Qj5XR5nMMBwVxZF4cZhpO7XcbWw6tbNiJo22Zx0KfjEj9py5DANhwLOkPPufw== 1963 | dependencies: 1964 | dateformat "~1.0.4-1.2.3" 1965 | dynamic-dedupe "^0.3.0" 1966 | filewatcher "~3.0.0" 1967 | minimist "^1.1.3" 1968 | mkdirp "^0.5.1" 1969 | node-notifier "^5.4.0" 1970 | resolve "^1.0.0" 1971 | rimraf "^2.6.1" 1972 | source-map-support "^0.5.12" 1973 | tree-kill "^1.2.1" 1974 | ts-node "*" 1975 | tsconfig "^7.0.0" 1976 | 1977 | ts-node@*: 1978 | version "8.10.2" 1979 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" 1980 | integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== 1981 | dependencies: 1982 | arg "^4.1.0" 1983 | diff "^4.0.1" 1984 | make-error "^1.1.1" 1985 | source-map-support "^0.5.17" 1986 | yn "3.1.1" 1987 | 1988 | ts-node@8.10.1: 1989 | version "8.10.1" 1990 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.1.tgz#77da0366ff8afbe733596361d2df9a60fc9c9bd3" 1991 | integrity sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw== 1992 | dependencies: 1993 | arg "^4.1.0" 1994 | diff "^4.0.1" 1995 | make-error "^1.1.1" 1996 | source-map-support "^0.5.17" 1997 | yn "3.1.1" 1998 | 1999 | tsconfig@^7.0.0: 2000 | version "7.0.0" 2001 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" 2002 | integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== 2003 | dependencies: 2004 | "@types/strip-bom" "^3.0.0" 2005 | "@types/strip-json-comments" "0.0.30" 2006 | strip-bom "^3.0.0" 2007 | strip-json-comments "^2.0.0" 2008 | 2009 | tslib@^1.10.0, tslib@^1.9.3: 2010 | version "1.13.0" 2011 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 2012 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 2013 | 2014 | type-is@~1.6.17, type-is@~1.6.18: 2015 | version "1.6.18" 2016 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 2017 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 2018 | dependencies: 2019 | media-typer "0.3.0" 2020 | mime-types "~2.1.24" 2021 | 2022 | typedarray@^0.0.6: 2023 | version "0.0.6" 2024 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2025 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 2026 | 2027 | typescript@3.9.3: 2028 | version "3.9.3" 2029 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" 2030 | integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== 2031 | 2032 | universalify@^1.0.0: 2033 | version "1.0.0" 2034 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" 2035 | integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== 2036 | 2037 | unpipe@1.0.0, unpipe@~1.0.0: 2038 | version "1.0.0" 2039 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2040 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 2041 | 2042 | url-join@0.0.1: 2043 | version "0.0.1" 2044 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8" 2045 | integrity sha1-HbSK1CLTQCRpqH99l73r/k+x48g= 2046 | 2047 | util-deprecate@~1.0.1: 2048 | version "1.0.2" 2049 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2050 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2051 | 2052 | utils-merge@1.0.1: 2053 | version "1.0.1" 2054 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2055 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 2056 | 2057 | uuid@^3.1.0: 2058 | version "3.4.0" 2059 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 2060 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 2061 | 2062 | uuid@^8.2.0: 2063 | version "8.2.0" 2064 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.2.0.tgz#cb10dd6b118e2dada7d0cd9730ba7417c93d920e" 2065 | integrity sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q== 2066 | 2067 | validate-npm-package-license@^3.0.1: 2068 | version "3.0.4" 2069 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2070 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 2071 | dependencies: 2072 | spdx-correct "^3.0.0" 2073 | spdx-expression-parse "^3.0.0" 2074 | 2075 | vary@^1, vary@~1.1.2: 2076 | version "1.1.2" 2077 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2078 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 2079 | 2080 | which@^1.3.0: 2081 | version "1.3.1" 2082 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2083 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2084 | dependencies: 2085 | isexe "^2.0.0" 2086 | 2087 | wrappy@1: 2088 | version "1.0.2" 2089 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2090 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2091 | 2092 | ws@^5.2.0: 2093 | version "5.2.2" 2094 | resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" 2095 | integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== 2096 | dependencies: 2097 | async-limiter "~1.0.0" 2098 | 2099 | xtend@^4.0.0: 2100 | version "4.0.2" 2101 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2102 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2103 | 2104 | yn@3.1.1: 2105 | version "3.1.1" 2106 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 2107 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 2108 | 2109 | yup@^0.27.0: 2110 | version "0.27.0" 2111 | resolved "https://registry.yarnpkg.com/yup/-/yup-0.27.0.tgz#f8cb198c8e7dd2124beddc2457571329096b06e7" 2112 | integrity sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ== 2113 | dependencies: 2114 | "@babel/runtime" "^7.0.0" 2115 | fn-name "~2.0.1" 2116 | lodash "^4.17.11" 2117 | property-expr "^1.5.0" 2118 | synchronous-promise "^2.0.6" 2119 | toposort "^2.0.2" 2120 | 2121 | zen-observable-ts@^0.8.21: 2122 | version "0.8.21" 2123 | resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" 2124 | integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== 2125 | dependencies: 2126 | tslib "^1.9.3" 2127 | zen-observable "^0.8.0" 2128 | 2129 | zen-observable@^0.8.0: 2130 | version "0.8.15" 2131 | resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" 2132 | integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== 2133 | --------------------------------------------------------------------------------