From ebb075ce4d5b57710c78aee596f75595ff2c2bb3 Mon Sep 17 00:00:00 2001 From: Federico Minaya Date: Sun, 25 Apr 2021 17:45:39 -0300 Subject: [PATCH] feat: sign in with credentials (#2) * feat: sign in with credentials * 1.2.0 --- .gitignore | 3 +- README.md | 57 +++- .../src/pages/api/auth/[...nextauth].ts | 5 +- .../src/pages/api/sanity/signUp.ts | 6 + .../full-example/src/pages/credentials.tsx | 86 +++++ examples/full-example/studio/schemas/user.ts | 5 + examples/full-example/studio/tsconfig.json | 3 + examples/full-example/tsconfig.json | 3 - package.json | 4 +- src/adapter.ts | 167 ++++++++++ src/client.ts | 17 + src/credentials.ts | 79 +++++ src/index.ts | 169 +--------- tsconfig.json | 6 +- yarn.lock | 298 +++++++++++++++++- 15 files changed, 716 insertions(+), 192 deletions(-) create mode 100644 examples/full-example/src/pages/api/sanity/signUp.ts create mode 100644 examples/full-example/src/pages/credentials.tsx create mode 100644 src/adapter.ts create mode 100644 src/client.ts create mode 100644 src/credentials.ts diff --git a/.gitignore b/.gitignore index a0d218e..b119bd8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules dist -.env \ No newline at end of file +.env +.next \ No newline at end of file diff --git a/README.md b/README.md index a379923..0f7f9ed 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@

-> NextAuth Adapter for Sanity +> NextAuth Adapter and Provider for Sanity ## Overview @@ -17,6 +17,8 @@ - Saving users and account in Sanity - Retrieving of full linked provider information for a user - Stale While Revalidate +- Auth with Credentials +- Hash Credentials Passwords with Argon2 ### Database sessions @@ -56,13 +58,16 @@ npm i next-auth-sanity import NextAuth, { NextAuthOptions } from 'next-auth'; import Providers from 'next-auth/providers'; import { NextApiRequest, NextApiResponse } from 'next'; -import { SanityAdapter } from 'next-auth-sanity'; -import { client } from '/your/sanity/client'; +import { SanityAdapter, SanityCredentials } from 'next-auth-sanity'; +import { client } from 'your/sanity/client'; const options: NextAuthOptions = { providers: [ - clientId: process.env.GITHUB_CLIENT_ID!, - clientSecret: process.env.GITHUB_CLIENT_SECRET!, + Providers.GitHub({ + clientId: process.env.GITHUB_CLIENT_ID, + clientSecret: process.env.GITHUB_CLIENT_SECRET + }), + SanityCredentials({ client }) // only if you use sign in with credentials ], session: { jwt: true @@ -98,6 +103,12 @@ export default { name: 'image', title: 'Image', type: 'url' + }, + { + // this is only if you use credentials provider + name: 'password', + type: 'string', + hidden: true } ] }; @@ -145,6 +156,42 @@ export default { }; ``` +### Sign Up and Sign In With Credentials + +### Setup + +`API Route` + +```ts +// pages/api/sanity/signUp.ts + +import { signUpHandler } from 'next-auth-sanity'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { client } from 'your/sanity/client'; + +export default (req: NextApiRequest, res: NextApiResponse) => + signUpHandler({ req, res, client }); +``` + +`Client` + +```ts +import { signUp } from 'next-auth-sanity/client'; +import { signIn } from 'next-auth/client'; + +const user = await signUp({ + email, + password, + name +}); + +await signIn('credentials', { + redirect: false, + email, + password +}); +``` + ## Author 👤 **Fedeya ** diff --git a/examples/full-example/src/pages/api/auth/[...nextauth].ts b/examples/full-example/src/pages/api/auth/[...nextauth].ts index bfb57be..e2def7e 100644 --- a/examples/full-example/src/pages/api/auth/[...nextauth].ts +++ b/examples/full-example/src/pages/api/auth/[...nextauth].ts @@ -1,7 +1,7 @@ import NextAuth, { NextAuthOptions } from 'next-auth'; import Providers from 'next-auth/providers'; import { NextApiRequest, NextApiResponse } from 'next'; -import { SanityAdapter } from 'next-auth-sanity'; +import { SanityAdapter, SanityCredentials } from '../../../../../../dist'; import { client } from '../../../libs/sanity'; const options: NextAuthOptions = { @@ -9,7 +9,8 @@ const options: NextAuthOptions = { Providers.GitHub({ clientId: process.env.GITHUB_CLIENT_ID, clientSecret: process.env.GITHUB_CLIENT_SECRET - }) + }), + SanityCredentials({ client }) ], session: { jwt: true diff --git a/examples/full-example/src/pages/api/sanity/signUp.ts b/examples/full-example/src/pages/api/sanity/signUp.ts new file mode 100644 index 0000000..73120fb --- /dev/null +++ b/examples/full-example/src/pages/api/sanity/signUp.ts @@ -0,0 +1,6 @@ +import { signUpHandler } from '../../../../../../dist'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { client } from '../../../libs/sanity'; + +export default (req: NextApiRequest, res: NextApiResponse) => + signUpHandler({ req, res, client }); diff --git a/examples/full-example/src/pages/credentials.tsx b/examples/full-example/src/pages/credentials.tsx new file mode 100644 index 0000000..59c190c --- /dev/null +++ b/examples/full-example/src/pages/credentials.tsx @@ -0,0 +1,86 @@ +import React, { FC, useState } from 'react'; +import { useSession, signIn, signOut } from 'next-auth/client'; +import { signUp } from '../../../../dist/client'; + +const Credentials: FC = () => { + const [email, setEmail] = useState(''); + const [session, loading] = useSession(); + const [password, setPassword] = useState(''); + const [name, setName] = useState(''); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + const user = await signUp({ + email, + password, + name + }); + + await signIn('credentials', { + redirect: false, + email, + password + }); + + console.log(user); + }; + + const handleSubmitSignIn = async (e: React.FormEvent) => { + e.preventDefault(); + await signIn('credentials', { + redirect: false, + email, + password + }); + }; + + if (loading) return

Loading...

; + + return ( +
+

User: {session?.user.name}

+

Sign Up

+
+ setEmail(e.target.value)} + /> + setPassword(e.target.value)} + /> + setName(e.target.value)} + /> + +
+ +

Sign In

+
+ setEmail(e.target.value)} + /> + setPassword(e.target.value)} + /> + +
+
+ ); +}; + +export default Credentials; diff --git a/examples/full-example/studio/schemas/user.ts b/examples/full-example/studio/schemas/user.ts index 9fb36f8..b3d0162 100644 --- a/examples/full-example/studio/schemas/user.ts +++ b/examples/full-example/studio/schemas/user.ts @@ -19,6 +19,11 @@ export default { name: 'image', title: 'Image', type: 'url' + }, + { + name: 'password', + type: 'string', + hidden: true } ] }; diff --git a/examples/full-example/studio/tsconfig.json b/examples/full-example/studio/tsconfig.json index eeb06e6..5cf7242 100644 --- a/examples/full-example/studio/tsconfig.json +++ b/examples/full-example/studio/tsconfig.json @@ -2,5 +2,8 @@ // Note: This config is only used to help editors like VS Code understand/resolve // parts, the actual transpilation is done by babel. Any compiler configuration in // here will be ignored. + "compilerOptions": { + "outDir": "dist" + }, "include": ["./node_modules/@sanity/base/types/**/*.ts", "./**/*.ts", "./**/*.tsx"] } diff --git a/examples/full-example/tsconfig.json b/examples/full-example/tsconfig.json index 3959bf1..37588c0 100644 --- a/examples/full-example/tsconfig.json +++ b/examples/full-example/tsconfig.json @@ -17,9 +17,6 @@ "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", - "paths": { - "next-auth-sanity": ["../../src"] - } }, "include": [ "next-env.d.ts", diff --git a/package.json b/package.json index 6a381c1..b74cc87 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "next-auth-sanity", "description": "NextAuth Adapter for Sanity", - "version": "1.1.1", + "version": "1.2.0", "main": "dist/index.js", "types": "dist/index.d.ts", "repository": { @@ -28,6 +28,8 @@ }, "dependencies": { "@sanity/client": "^2.8.0", + "argon2": "^0.27.2", + "axios": "^0.21.1", "groq": "^2.2.6", "lru-cache": "^6.0.0" }, diff --git a/src/adapter.ts b/src/adapter.ts new file mode 100644 index 0000000..58b5469 --- /dev/null +++ b/src/adapter.ts @@ -0,0 +1,167 @@ +import { Profile, Session } from 'next-auth/adapters'; +import { User } from 'next-auth'; +import { + getUserByIdQuery, + getUserByProviderAccountIdQuery, + getUserByEmailQuery +} from './queries'; +import LRU from 'lru-cache'; +import { SanityClient } from '@sanity/client'; + +type Options = { + client: SanityClient; +}; + +const userCache = new LRU({ + maxAge: 24 * 60 * 60 * 1000, + max: 1000 +}); + +export const SanityAdapter = ({ client }: Options) => { + const getAdapter = async () => { + async function createUser(profile: Profile): Promise { + const user = await client.create({ + _type: 'user', + email: profile.email, + name: profile.name, + image: profile.image + }); + + userCache.set(user._id, { + id: user._id, + ...user + }); + + return { + id: user._id, + ...user + }; + } + + async function getUser(id: string): Promise { + const cachedUser = userCache.get(id); + + if (cachedUser) { + (async () => { + const user = await client.fetch(getUserByIdQuery, { + id + }); + + userCache.set(user._id, { + id: user._id, + ...user + }); + })(); + + return cachedUser; + } + + const user = await client.fetch(getUserByIdQuery, { + id + }); + + return { + id: user._id, + ...user + }; + } + + async function linkAccount( + userId: string, + providerId: string, + providerType: string, + providerAccountId: string, + refreshToken: string, + accessToken: string, + accessTokenExpires: number + ): Promise { + await client.create({ + _type: 'account', + providerId, + providerType, + providerAccountId: `${providerAccountId}`, + refreshToken, + accessToken, + accessTokenExpires, + user: { + _type: 'reference', + _ref: userId + } + }); + } + + async function getUserByProviderAccountId( + providerId: string, + providerAccountId: string + ) { + const account = await client.fetch(getUserByProviderAccountIdQuery, { + providerId, + providerAccountId: String(providerAccountId) + }); + + return account?.user; + } + + async function getUserByEmail(email: string) { + const user = await client.fetch(getUserByEmailQuery, { + email + }); + + return user; + } + + async function createSession(): Promise { + console.log('[createSession] method not implemented'); + + return {} as any; + } + async function getSession(): Promise { + console.log('[getSession] method not implemented'); + return {} as any; + } + async function updateSession(): Promise { + console.log('[updateSession] method not implemented'); + return {} as any; + } + async function deleteSession() { + console.log('[deleteSession] method not implemented'); + } + + async function updateUser(user: User & { id: string }): Promise { + const { id, name, email, image } = user; + + userCache.set(id, user); + + const newUser = await client + .patch(id) + .set({ + name, + email, + image + }) + .commit(); + + return { + id: newUser._id, + ...newUser + }; + } + + return { + createUser, + getUser, + linkAccount, + getUserByProviderAccountId, + getUserByEmail, + createSession, + getSession, + updateSession, + deleteSession, + updateUser + }; + }; + + return { + getAdapter + }; +}; diff --git a/src/client.ts b/src/client.ts new file mode 100644 index 0000000..980a694 --- /dev/null +++ b/src/client.ts @@ -0,0 +1,17 @@ +import { User } from 'next-auth'; +import axios from 'axios'; + +export interface SignUpData { + email: string; + password: string; + name?: string; + image?: string; +} + +export const signUp = async (data: SignUpData) => { + const res = await axios.post('/api/sanity/signUp', { + ...data + }); + + return res.data; +}; diff --git a/src/credentials.ts b/src/credentials.ts new file mode 100644 index 0000000..81deffd --- /dev/null +++ b/src/credentials.ts @@ -0,0 +1,79 @@ +import Providers, { CredentialsProvider } from 'next-auth/providers'; +import { SanityClient } from '@sanity/client'; +import { getUserByEmailQuery } from './queries'; +import argon2 from 'argon2'; +import { IncomingMessage, ServerResponse } from 'node:http'; + +interface Options { + client: SanityClient; +} + +type CredentialsConfig = ReturnType; + +export interface Handler { + req: IncomingMessage & { body: any }; + res: ServerResponse & { + json: (body: any) => void; + }; + client: SanityClient; +} + +export const signUpHandler = async ({ req, client, res }: Handler) => { + const { email, password, name, image } = req.body; + + const user = await client.fetch(getUserByEmailQuery, { + email + }); + + if (user) { + res.json({ error: 'User already exist' }); + return; + } + + const newUser = await client.create({ + _type: 'user', + email, + password: await argon2.hash(password), + name, + image + }); + + res.json({ + email: newUser.email, + name: newUser.name, + image: newUser.image + }); +}; + +export const SanityCredentials = ({ client }: Options): CredentialsConfig => + Providers.Credentials({ + credentials: { + name: 'Credentials', + email: { + label: 'Email', + type: 'text' + }, + password: { + label: 'Password', + type: 'password' + } + }, + async authorize({ email, password }: { email: string; password: string }) { + const user = await client.fetch(getUserByEmailQuery, { + email + }); + + if (!user) throw new Error('Email does not exist'); + + if (await argon2.verify(user.password, password)) { + return { + email: user.email, + name: user.name, + image: user.image, + id: user.id + }; + } + + throw new Error('Password Invalid'); + } + }); diff --git a/src/index.ts b/src/index.ts index 58b5469..2a78a86 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,167 +1,2 @@ -import { Profile, Session } from 'next-auth/adapters'; -import { User } from 'next-auth'; -import { - getUserByIdQuery, - getUserByProviderAccountIdQuery, - getUserByEmailQuery -} from './queries'; -import LRU from 'lru-cache'; -import { SanityClient } from '@sanity/client'; - -type Options = { - client: SanityClient; -}; - -const userCache = new LRU({ - maxAge: 24 * 60 * 60 * 1000, - max: 1000 -}); - -export const SanityAdapter = ({ client }: Options) => { - const getAdapter = async () => { - async function createUser(profile: Profile): Promise { - const user = await client.create({ - _type: 'user', - email: profile.email, - name: profile.name, - image: profile.image - }); - - userCache.set(user._id, { - id: user._id, - ...user - }); - - return { - id: user._id, - ...user - }; - } - - async function getUser(id: string): Promise { - const cachedUser = userCache.get(id); - - if (cachedUser) { - (async () => { - const user = await client.fetch(getUserByIdQuery, { - id - }); - - userCache.set(user._id, { - id: user._id, - ...user - }); - })(); - - return cachedUser; - } - - const user = await client.fetch(getUserByIdQuery, { - id - }); - - return { - id: user._id, - ...user - }; - } - - async function linkAccount( - userId: string, - providerId: string, - providerType: string, - providerAccountId: string, - refreshToken: string, - accessToken: string, - accessTokenExpires: number - ): Promise { - await client.create({ - _type: 'account', - providerId, - providerType, - providerAccountId: `${providerAccountId}`, - refreshToken, - accessToken, - accessTokenExpires, - user: { - _type: 'reference', - _ref: userId - } - }); - } - - async function getUserByProviderAccountId( - providerId: string, - providerAccountId: string - ) { - const account = await client.fetch(getUserByProviderAccountIdQuery, { - providerId, - providerAccountId: String(providerAccountId) - }); - - return account?.user; - } - - async function getUserByEmail(email: string) { - const user = await client.fetch(getUserByEmailQuery, { - email - }); - - return user; - } - - async function createSession(): Promise { - console.log('[createSession] method not implemented'); - - return {} as any; - } - async function getSession(): Promise { - console.log('[getSession] method not implemented'); - return {} as any; - } - async function updateSession(): Promise { - console.log('[updateSession] method not implemented'); - return {} as any; - } - async function deleteSession() { - console.log('[deleteSession] method not implemented'); - } - - async function updateUser(user: User & { id: string }): Promise { - const { id, name, email, image } = user; - - userCache.set(id, user); - - const newUser = await client - .patch(id) - .set({ - name, - email, - image - }) - .commit(); - - return { - id: newUser._id, - ...newUser - }; - } - - return { - createUser, - getUser, - linkAccount, - getUserByProviderAccountId, - getUserByEmail, - createSession, - getSession, - updateSession, - deleteSession, - updateUser - }; - }; - - return { - getAdapter - }; -}; +export { SanityAdapter } from './adapter'; +export { SanityCredentials, signUpHandler } from './credentials'; diff --git a/tsconfig.json b/tsconfig.json index e26018a..9985023 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -67,5 +67,9 @@ /* Advanced Options */ "skipLibCheck": true, /* Skip type checking of declaration files. */ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ - } + }, + "exclude": [ + "./examples", + "./dist" + ] } diff --git a/yarn.lock b/yarn.lock index db4fc55..8dab17d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,31 @@ # yarn lockfile v1 +"@mapbox/node-pre-gyp@^1.0.1": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.4.tgz#6c76e7a40138eac39e1a4dc869a083e43e236c00" + integrity sha512-M669Qo4nRT7iDmQEjQYC7RU8Z6dpz9UmSbkJ1OFEja3uevCdLKh7IZZki7L1TZj02kRyl82snXFY8QqkyfowrQ== + dependencies: + detect-libc "^1.0.3" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.1" + nopt "^5.0.0" + npmlog "^4.1.2" + rimraf "^3.0.2" + semver "^7.3.4" + tar "^6.1.0" + "@panva/asn1.js@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@panva/asn1.js/-/asn1.js-1.0.0.tgz#dd55ae7b8129e02049f009408b97c61ccf9032f6" integrity sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw== +"@phc/format@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@phc/format/-/format-1.0.0.tgz#b5627003b3216dc4362125b13f48a4daa76680e4" + integrity sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ== + "@rexxars/eventsource-polyfill@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@rexxars/eventsource-polyfill/-/eventsource-polyfill-1.0.0.tgz#ab46f2f44da23aedd6f51f13d92a194a5367525b" @@ -78,11 +98,28 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71" integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" @@ -110,11 +147,41 @@ app-root-path@^3.0.0: resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argon2@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.27.2.tgz#f334ca15aee748739ac81f76b85d197841e8cdcc" + integrity sha512-evnzS/Q9rj6ahaaCJjLDoJo9ZuXHhVL2BrBz3wFHb5/i9zAJovBuIY+5t2En7tJjhFXs4O3rUZDeGZxBiDOLwQ== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.1" + "@phc/format" "^1.0.0" + node-addon-api "^3.0.2" + opencollective-postinstall "^2.0.3" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -170,6 +237,11 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + cli-highlight@^2.1.10: version "2.1.11" resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" @@ -191,6 +263,11 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -208,6 +285,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -225,6 +307,13 @@ crypto-js@^4.0.0: resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.0.0.tgz#2904ab2677a9d042856a2ea2ef80de92e4a36dcc" integrity sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg== +debug@4, debug@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -232,13 +321,6 @@ debug@^2.6.8: dependencies: ms "2.0.0" -debug@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -253,6 +335,16 @@ deep-assign@^2.0.0: dependencies: is-obj "^1.0.0" +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + dotenv@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" @@ -292,6 +384,11 @@ figlet@^1.1.1: resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.0.tgz#2db4d00a584e5155a96080632db919213c3e003c" integrity sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww== +follow-redirects@^1.10.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.0.tgz#f5d260f95c5f8c105894491feee5dc8993b402fe" + integrity sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg== + follow-redirects@^1.2.4: version "1.13.3" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" @@ -310,6 +407,13 @@ from2@^2.1.1: inherits "^2.0.1" readable-stream "^2.0.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -320,6 +424,20 @@ futoin-hkdf@^1.3.2: resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.3.3.tgz#6ee1c9c105dfa0995ba4f80633cf1c0c32defcb2" integrity sha512-oR75fYk3B3X9/B02Y6vusrBKucrpC6VjxhRL+C6B7FwUpuSRHbhBNG3AZbcE/xPyJmEQWsyqUFp3VeNNbA3S7A== +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -350,7 +468,7 @@ get-it@^5.0.3: tunnel-agent "^0.6.0" url-parse "^1.1.9" -glob@^7.1.6: +glob@^7.1.3, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -379,11 +497,24 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + highlight.js@^10.7.1: version "10.7.2" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360" integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg== +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -415,6 +546,18 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -541,6 +684,13 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + make-error@^1.3.0: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -558,7 +708,22 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -mkdirp@^1.0.4: +minipass@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -610,17 +775,49 @@ next-auth@*: require_optional "^1.0.1" typeorm "^0.2.30" +node-addon-api@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" + integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== + +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + nodemailer@^6.4.16: version "6.5.0" resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.5.0.tgz#d12c28d8d48778918e25f1999d97910231b175d9" integrity sha512-Tm4RPrrIZbnqDKAvX+/4M+zovEReiKlEXWDzG4iwtpL9X34MJY+D5LnQPH/+eghe8DLlAVshHAJZAZWBGhkguw== +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + oauth@^0.9.15: version "0.9.15" resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" integrity sha1-vR/vr2hslrdUda7VGWQS/2DPucE= -object-assign@^4.0.1, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -632,6 +829,11 @@ once@^1.3.0: dependencies: wrappy "1" +opencollective-postinstall@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -721,7 +923,7 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -readable-stream@^2.0.0, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -762,6 +964,13 @@ resolve-from@^2.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rxjs@^6.5.3: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" @@ -794,6 +1003,23 @@ semver@^5.1.0, semver@^5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.4: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + sha.js@^2.4.11: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -802,6 +1028,11 @@ sha.js@^2.4.11: inherits "^2.0.1" safe-buffer "^5.0.1" +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -812,6 +1043,23 @@ speedometer@~1.0.0: resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-1.0.0.tgz#cd671cb06752c22bca3370e2f334440be4fc62e2" integrity sha1-zWccsGdSwivKM3Di8zREC+T8YuI= +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" @@ -828,13 +1076,20 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0: +strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -854,6 +1109,18 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +tar@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" @@ -934,6 +1201,13 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"