├── .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 |
--------------------------------------------------------------------------------