[improvement] Multiplayer + cursors (#457)

* bump versions, improve cursors

* Spline cursors
This commit is contained in:
Steve Ruiz 2021-12-22 00:14:38 +00:00 committed by GitHub
parent 3b220f0afe
commit 7c2777966f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
39 changed files with 467 additions and 459 deletions

View file

@ -5,6 +5,8 @@ import { createRequire } from 'module'
const pkg = createRequire(import.meta.url)('../package.json')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -30,10 +32,10 @@ async function main() {
},
})
console.log(`${pkg.name}: Build completed.`)
jslog(`${pkg.name}: Build completed.`)
} catch (e) {
console.log(`× ${pkg.name}: Build failed due to an error.`)
console.log(e)
jslog(`× ${pkg.name}: Build failed due to an error.`)
jslog(e)
}
}

View file

@ -5,6 +5,8 @@ import dotenv from 'dotenv'
dotenv.config()
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -28,7 +30,7 @@ async function main() {
},
watch: {
onRebuild(err) {
err ? error('❌ Failed') : log('✅ Updated')
err ? error('❌ Failed') : jslog('✅ Updated')
},
},
},

View file

@ -2,6 +2,8 @@
const fs = require('fs')
const esbuild = require('esbuild')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -25,10 +27,10 @@ async function main() {
tsconfig: './tsconfig.json',
external: ['vscode'],
})
console.log(`Built package.`)
jslog(`Built package.`)
} catch (e) {
console.log(`× Build failed due to an error.`)
console.log(e)
jslog(`× Build failed due to an error.`)
jslog(e)
}
}

View file

@ -2,6 +2,8 @@
const fs = require('fs')
const esbuild = require('esbuild')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -28,15 +30,15 @@ async function main() {
incremental: true,
watch: {
onRebuild(err) {
err ? console.error('❌ Failed') : console.log('✅ Updated')
err ? console.error('❌ Failed') : jslog('✅ Updated')
},
},
})
console.log(`Built package.`)
jslog(`Built package.`)
} catch (e) {
console.log(`× Build failed due to an error.`)
console.log(e)
jslog(`× Build failed due to an error.`)
jslog(e)
}
}

View file

@ -4,6 +4,8 @@ const fs = require('fs')
const pkg = require('../package.json')
const { exec } = require('child_process')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./editor')) {
fs.rmSync('./editor', { recursive: true }, (e) => {
@ -35,8 +37,8 @@ async function main() {
}
)
} catch (e) {
console.log(`× ${pkg.name}: Build failed due to an error.`)
console.log(e)
jslog(`× ${pkg.name}: Build failed due to an error.`)
jslog(e)
}
}

View file

@ -1,5 +1,5 @@
import * as React from 'react'
import { signIn, signOut } from 'next-auth/client'
import { signIn, signOut } from 'next-auth/react'
export function useAccountHandlers() {
const onSignIn = React.useCallback(() => {

View file

@ -5,7 +5,6 @@ const withTM = require('next-transpile-modules')(['@tldraw/tldraw', '@tldraw/cor
const {
GITHUB_ID,
GITHUB_SECRET,
GITHUB_API_SECRET,
NEXT_PUBLIC_SENTRY_DSN: SENTRY_DSN,
SENTRY_ORG,
@ -34,7 +33,6 @@ module.exports = withPWA(
NEXT_PUBLIC_COMMIT_SHA: VERCEL_GIT_COMMIT_SHA,
GA_MEASUREMENT_ID,
GITHUB_ID,
GITHUB_SECRET,
GITHUB_API_SECRET,
},
webpack: (config, options) => {

View file

@ -18,19 +18,19 @@
"lint": "next lint"
},
"dependencies": {
"@liveblocks/client": "^0.13.0-beta.1",
"@liveblocks/react": "^0.13.0-beta.1",
"@liveblocks/client": "^0.13.1",
"@liveblocks/react": "^0.13.1",
"@sentry/integrations": "^6.13.2",
"@sentry/node": "^6.13.2",
"@sentry/react": "^6.13.2",
"@sentry/tracing": "^6.13.2",
"@stitches/react": "^1.2.5",
"@tldraw/core": "^1.2.8",
"@tldraw/tldraw": "^1.2.8",
"@tldraw/core": "*",
"@tldraw/tldraw": "*",
"@types/next-auth": "^3.15.0",
"next": "^12.0.1",
"next-auth": "^3.29.0",
"next-pwa": "^5.4.0",
"next": "^12.0.7",
"next-auth": "^4.0.5",
"next-pwa": "^5.4.4",
"next-themes": "^0.0.15",
"next-transpile-modules": "^9.0.0",
"react": "17.0.2",

View file

@ -1,34 +1,38 @@
import { isSponsoringMe } from 'utils/isSponsoringMe'
import { isSignedInUserSponsoringMe } from 'utils/github'
import type { NextApiHandler, NextApiRequest, NextApiResponse } from 'next'
import NextAuth from 'next-auth'
import Providers from 'next-auth/providers'
import GithubProvider from 'next-auth/providers/github'
export default function Auth(
req: NextApiRequest,
res: NextApiResponse
): ReturnType<NextApiHandler> {
return NextAuth(req, res, {
theme: {
colorScheme: 'light',
},
providers: [
Providers.GitHub({
GithubProvider({
clientId: process.env.GITHUB_ID,
clientSecret: process.env.GITHUB_SECRET,
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
scope: 'read:user',
}),
],
secret: process.env.NEXTAUTH_SECRET,
callbacks: {
async redirect(url, baseUrl) {
async redirect({ baseUrl }) {
return baseUrl
},
async signIn(user, account, profile: { login?: string }) {
if (profile?.login) {
const canLogin = await isSponsoringMe(profile.login)
if (canLogin) {
return canLogin
}
async signIn() {
return true
},
async session({ session, token, user }) {
if (token) {
session.isSponsor = await isSignedInUserSponsoringMe()
}
return '/'
return session
},
},
})

View file

@ -19,7 +19,7 @@ export default async function GetSponsors(_req: NextApiRequest, res: NextApiResp
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'bearer ' + process.env.GITHUB_API_SECRET,
Authorization: 'bearer ' + process.env.GITHUB_SECRET,
},
body: JSON.stringify({
query: `{

View file

@ -1,6 +1,6 @@
import dynamic from 'next/dynamic'
import type { GetServerSideProps } from 'next'
import { getSession } from 'next-auth/client'
import { getSession } from 'next-auth/react'
import Head from 'next/head'
const Editor = dynamic(() => import('components/Editor'), { ssr: false })
@ -27,7 +27,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => {
return {
props: {
isUser: session?.user ? true : false,
isSponsor: session?.user ? true : false,
isSponsor: session?.isSponsor,
},
}
}

View file

@ -1,6 +1,6 @@
import * as React from 'react'
import type { GetServerSideProps } from 'next'
import { getSession } from 'next-auth/client'
import { getSession } from 'next-auth/react'
import dynamic from 'next/dynamic'
const MultiplayerEditor = dynamic(() => import('components/MultiplayerEditor'), { ssr: false })
@ -16,14 +16,12 @@ export default function Room({ id, isUser, isSponsor }: RoomProps): JSX.Element
export const getServerSideProps: GetServerSideProps = async (context) => {
const session = await getSession(context)
const id = context.query.id?.toString()
return {
props: {
id,
isUser: session?.user ? true : false,
isSponsor: session?.user ? true : false,
isSponsor: session.isSponsor,
},
}
}

View file

@ -1,12 +1,12 @@
import { styled } from 'styles'
import { getSession, signin, signout, useSession } from 'next-auth/client'
import { getSession, signIn, signOut, useSession } from 'next-auth/react'
import type { GetServerSideProps } from 'next'
import Link from 'next/link'
import React from 'react'
import Head from 'next/head'
export default function Sponsorware(): JSX.Element {
const [session, loading] = useSession()
const { data, status } = useSession()
return (
<>
@ -51,14 +51,14 @@ export default function Sponsorware(): JSX.Element {
(at any level) and sign in below.
</p>
<StyledButtonGroup>
{session ? (
{data ? (
<>
<StyledButton variant="secondary" onClick={() => signout()}>
<StyledButton variant="secondary" onClick={() => signOut()}>
Sign Out
</StyledButton>
<StyledDetail>
Signed in as {session?.user?.name} ({session?.user?.email}), but it looks like
you&apos;re not yet a sponsor.
Signed in as {data.user?.name} ({data.user?.email}), but it looks like you&apos;re
not yet a sponsor.
<br />
Something wrong? Try <Link href="/">reloading the page</Link> or DM me on{' '}
<a
@ -73,8 +73,8 @@ export default function Sponsorware(): JSX.Element {
</>
) : (
<>
<StyledButton variant="primary" onClick={() => signin('github')}>
{loading ? 'Loading...' : 'Sign in with GitHub'}
<StyledButton variant="primary" onClick={() => signIn('github')}>
{status === 'loading' ? 'Loading...' : 'Sign in with GitHub'}
</StyledButton>
<StyledDetail>Already a sponsor? Just sign in to visit the app.</StyledDetail>
</>

View file

@ -19,7 +19,9 @@
"rootDir": ".",
"baseUrl": ".",
"paths": {
"*": ["./*"]
"*": ["./*"],
"@tldraw/core": ["../../packages/core"],
"@tldraw/tldraw": ["../../packages/tldraw"]
}
},
"references": [

53
apps/www/utils/github.ts Normal file
View file

@ -0,0 +1,53 @@
/**
* Send a GraphQL query to the Github API
*/
async function queryGithubApi(query: string) {
const res = await fetch('https://api.github.com/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'bearer ' + process.env.GITHUB_API_SECRET,
},
body: JSON.stringify({
query,
}),
})
return await res.json()
}
/**
* What is the signed in user's login name?
*/
async function getSignedInUser(): Promise<{ login: 'steveruizok ' }> {
const res = await queryGithubApi(`
query {
viewer {
login
}
}`)
return res?.data?.viewer
}
/**
* Is user with the login A sponsoring the user with the login B?
*/
async function isASponsoringB(loginA: string, loginB: string) {
const res = await queryGithubApi(`
query {
user(login: "${loginB}") {
isSponsoredBy(accountLogin: "${loginA}")
}
}`)
return res?.data?.user?.isSponsoredBy
}
const whitelist = ['steveruizok']
/**
* Is the current user sponsoring me?
*/
export async function isSignedInUserSponsoringMe() {
const user = await getSignedInUser()
if (whitelist.includes(user.login)) return true
return isASponsoringB('steveruizok', user.login)
}

View file

@ -1,24 +0,0 @@
const whitelist = ['steveruizok']
export async function isSponsoringMe(login: string) {
if (whitelist.includes(login)) return true
const res = await fetch('https://api.github.com/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'bearer ' + process.env.GITHUB_API_SECRET,
},
body: JSON.stringify({
query: `
query {
user(login: "steveruizok") {
isSponsoredBy(accountLogin: "${login}")
}
}
`,
}),
}).then((res) => res.json())
return res?.data?.user?.isSponsoredBy
}

View file

@ -5,6 +5,8 @@ import { createRequire } from 'module'
const pkg = createRequire(import.meta.url)('../package.json')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -36,10 +38,10 @@ async function main() {
if (err) throw err
})
console.log(`${pkg.name}: Build completed.`)
jslog(`${pkg.name}: Build completed.`)
} catch (e) {
console.log(`× ${pkg.name}: Build failed due to an error.`)
console.log(e)
jslog(`× ${pkg.name}: Build failed due to an error.`)
jslog(e)
}
}

View file

@ -2,6 +2,8 @@
import fs from 'fs'
import esbuildServe from 'esbuild-serve'
const { log: jslog } = console
async function main() {
if (!fs.existsSync('./dist')) {
fs.mkdirSync('./dist')
@ -26,7 +28,7 @@ async function main() {
},
watch: {
onRebuild(err) {
err ? error('❌ Failed') : log('✅ Updated')
err ? error('❌ Failed') : jslog('✅ Updated')
},
},
},

View file

@ -188,8 +188,6 @@ export default function App({ onMount }: AppProps): JSX.Element {
const hideBounds = appState.isInAny('transformingSelection', 'translating', 'creating')
// const hideBounds = appState.isInAny('transformingSelection', 'translating', 'creating')
const firstShapeId = appState.data.pageState.selectedIds[0]
const firstShape = firstShapeId ? appState.data.page.shapes[firstShapeId] : null
const hideResizeHandles = firstShape

View file

@ -5,6 +5,8 @@ import { createRequire } from 'module'
const pkg = createRequire(import.meta.url)('../package.json')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -36,10 +38,10 @@ async function main() {
if (err) throw err
})
console.log(`${pkg.name}: Build completed.`)
jslog(`${pkg.name}: Build completed.`)
} catch (e) {
console.log(`× ${pkg.name}: Build failed due to an error.`)
console.log(e)
jslog(`× ${pkg.name}: Build failed due to an error.`)
jslog(e)
}
}

View file

@ -2,6 +2,8 @@
import fs from 'fs'
import esbuildServe from 'esbuild-serve'
const { log: jslog } = console
async function main() {
if (!fs.existsSync('./dist')) {
fs.mkdirSync('./dist')
@ -26,7 +28,7 @@ async function main() {
},
watch: {
onRebuild(err) {
err ? error('❌ Failed') : log('✅ Updated')
err ? error('❌ Failed') : jslog('✅ Updated')
},
},
},

View file

@ -6,6 +6,8 @@ import { createRequire } from 'module'
const pkg = createRequire(import.meta.url)('../package.json')
const { log: jslog } = console
async function main() {
try {
esbuild.buildSync({
@ -31,10 +33,10 @@ async function main() {
if (err) throw err
})
)
console.log(`${pkg.name}: Build completed.`)
jslog(`${pkg.name}: Build completed.`)
} catch (e) {
console.log(`× ${pkg.name}: Build failed due to an error.`)
console.log(e)
jslog(`× ${pkg.name}: Build failed due to an error.`)
jslog(e)
}
}

View file

@ -6,6 +6,8 @@ import dotenv from 'dotenv'
dotenv.config()
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -40,7 +42,7 @@ async function main() {
},
watch: {
onRebuild(err) {
err ? error('❌ Failed') : log('✅ Updated')
err ? error('❌ Failed') : jslog('✅ Updated')
},
},
},

View file

@ -9,10 +9,14 @@
"emitDeclarationOnly": false,
"paths": {
"~*": ["./src/*"],
"@tldraw/core": ["../../packages/core"],
"@tldraw/tldraw": ["../../packages/tldraw"]
}
},
"references": [
{
"path": "../../packages/core"
},
{
"path": "../../packages/tldraw"
}

View file

@ -4,6 +4,8 @@ const esbuild = require('esbuild')
const { gzip } = require('zlib')
const pkg = require('../package.json')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -51,7 +53,7 @@ async function main() {
fs.readFile('./dist/esm/index.js', (_err, data) => {
gzip(data, (_err, result) => {
console.log(
jslog(
`${pkg.name}: Built package. ${(esmSize / 1000).toFixed(2)}kb (${(
result.length / 1000
).toFixed(2)}kb minified)`
@ -59,8 +61,8 @@ async function main() {
})
})
} catch (e) {
console.log(`× ${pkg.name}: Build failed due to an error.`)
console.log(e)
jslog(`× ${pkg.name}: Build failed due to an error.`)
jslog(e)
}
}

View file

@ -2,6 +2,8 @@
const esbuild = require('esbuild')
const pkg = require('../package.json')
const { log: jslog } = console
async function main() {
esbuild.build({
entryPoints: ['./src/index.ts'],
@ -19,10 +21,10 @@ async function main() {
watch: {
onRebuild(error) {
if (error) {
console.log(`× ${pkg.name}: An error in prevented the rebuild.`)
jslog(`× ${pkg.name}: An error in prevented the rebuild.`)
return
}
console.log(`${pkg.name}: Rebuilt.`)
jslog(`${pkg.name}: Rebuilt.`)
},
},
})

View file

@ -1,4 +1,8 @@
/* eslint-disable no-inner-declarations */
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import Vec from '@tldraw/vec'
import * as React from 'react'
import { useCursorAnimation } from '~hooks'
import type { TLShape, TLUser } from '~types'
interface UserProps {
@ -6,15 +10,15 @@ interface UserProps {
}
export function User({ user }: UserProps) {
const rUser = React.useRef<HTMLDivElement>(null)
const rCursor = React.useRef<HTMLDivElement>(null)
useCursorAnimation(rCursor, user.point)
return (
<div
ref={rUser}
ref={rCursor}
className="tl-absolute tl-user"
style={{
backgroundColor: user.color,
transform: `translate(${user.point[0]}px, ${user.point[1]}px)`,
willChange: 'transform',
}}
/>
)

View file

@ -15,3 +15,4 @@ export * from './usePreventNavigation'
export * from './useBoundsEvents'
export * from './usePosition'
export * from './useKeyEvents'
export * from './useCursorAnimation'

View file

@ -0,0 +1,139 @@
import Vec from '@tldraw/vec'
import * as React from 'react'
type AnimationState = 'stopped' | 'idle' | 'animating'
type Animation = {
curve: boolean
from: number[]
to: number[]
start: number
distance: number
timeStamp: number
duration: number
}
export function useCursorAnimation(ref: any, point: number[]) {
const rState = React.useRef<AnimationState>('idle')
const rPrevPoint = React.useRef(point)
const rQueue = React.useRef<Animation[]>([])
const rTimestamp = React.useRef(performance.now())
const rLastRequestId = React.useRef<any>(0)
const rTimeoutId = React.useRef<any>(0)
const rSpline = React.useRef(new Spline())
// Animate an animation
const animateNext = React.useCallback((animation: Animation) => {
const start = performance.now()
function loop() {
const t = (performance.now() - start) / animation.duration
if (t <= 1) {
const elm = ref.current
if (!elm) return
const point = animation.curve
? rSpline.current.getSplinePoint(t + animation.start)
: Vec.lrp(animation.from, animation.to, t)
elm.style.setProperty('transform', `translate(${point[0]}px, ${point[1]}px)`)
rLastRequestId.current = requestAnimationFrame(loop)
return
}
const next = rQueue.current.shift()
if (next) {
rState.current = 'animating'
animateNext(next)
} else {
rState.current = 'idle'
rTimeoutId.current = setTimeout(() => {
rState.current = 'stopped'
}, 250)
}
}
loop()
}, [])
// When the point changes, add a new animation
React.useLayoutEffect(() => {
const now = performance.now()
const spline = rSpline.current
if (rState.current === 'stopped') {
rTimestamp.current = now
spline.clear()
}
spline.addPoint(point)
const animation: Animation = {
distance: spline.totalLength,
curve: spline.points.length > 3,
start: spline.points.length - 3,
from: rPrevPoint.current,
to: point,
timeStamp: now,
duration: Math.min(now - rTimestamp.current, 500),
}
rPrevPoint.current = point
rTimestamp.current = now
switch (rState.current) {
case 'stopped': {
rPrevPoint.current = point
rState.current = 'idle'
break
}
case 'idle': {
rState.current = 'animating'
animateNext(animation)
break
}
case 'animating': {
rQueue.current.push(animation)
break
}
}
return () => {
clearTimeout(rTimeoutId.current)
}
}, [point])
}
class Spline {
points: number[][] = []
lengths: number[] = []
totalLength = 0
private prev?: number[]
addPoint(point: number[]) {
if (this.prev) {
const length = Vec.dist(this.prev, point)
this.lengths.push(length)
this.totalLength += length
this.points.push(point)
}
this.prev = point
}
getSplinePoint(t: number): number[] {
const { points } = this
const l = points.length - 1
const d = Math.trunc(t)
const p1 = Math.min(d + 1, l)
const p2 = Math.min(p1 + 1, l)
const p3 = Math.min(p2 + 1, l)
const p0 = p1 - 1
t = t - d
const tt = t * t,
ttt = tt * t,
q1 = -ttt + 2 * tt - t,
q2 = 3 * ttt - 5 * tt + 2,
q3 = -3 * ttt + 4 * tt + t,
q4 = ttt - tt
return [
0.5 * (points[p0][0] * q1 + points[p1][0] * q2 + points[p2][0] * q3 + points[p3][0] * q4),
0.5 * (points[p0][1] * q1 + points[p1][1] * q2 + points[p2][1] * q3 + points[p3][1] * q4),
]
}
clear() {
this.points = []
this.totalLength = 0
}
}

View file

@ -4,6 +4,8 @@ const esbuild = require('esbuild')
const { gzip } = require('zlib')
const pkg = require('../package.json')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -45,7 +47,7 @@ async function main() {
fs.readFile('./dist/esm/index.js', (_err, data) => {
gzip(data, (_err, result) => {
console.log(
jslog(
`${pkg.name}: Built package. ${(esmSize / 1000).toFixed(2)}kb (${(
result.length / 1000
).toFixed(2)}kb minified)`
@ -53,8 +55,8 @@ async function main() {
})
})
} catch (e) {
console.log(`× ${pkg.name}: Build failed due to an error.`)
console.log(e)
jslog(`× ${pkg.name}: Build failed due to an error.`)
jslog(e)
}
}

View file

@ -2,6 +2,8 @@
const esbuild = require('esbuild')
const pkg = require('../package.json')
const { log: jslog } = console
async function main() {
try {
await esbuild.build({
@ -17,7 +19,7 @@ async function main() {
},
watch: {
onRebuild(err) {
err ? error('❌ Failed') : log('✅ Updated')
err ? error('❌ Failed') : jslog('✅ Updated')
},
},
})

View file

@ -82,63 +82,6 @@ export function getTLBezierCurveSegments(
return results
}
/**
* Find a point along a curve segment, via pomax.
* @param t
* @param points [cpx1, cpy1, cpx2, cpy2, px, py][]
*/
export function computePointOnCurve(t: number, points: number[][]): number[] {
// shortcuts
if (t === 0) {
return points[0]
}
const order = points.length - 1
if (t === 1) {
return points[order]
}
const mt = 1 - t
let p = points // constant?
if (order === 0) {
return points[0]
} // linear?
if (order === 1) {
return [mt * p[0][0] + t * p[1][0], mt * p[0][1] + t * p[1][1]]
} // quadratic/cubic curve?
// if (order < 4) {
const mt2 = mt * mt
const t2 = t * t
let a: number
let b: number
let c: number
let d = 0
if (order === 2) {
p = [p[0], p[1], p[2], [0, 0]]
a = mt2
b = mt * t * 2
c = t2
// } else if (order === 3) {
} else {
a = mt2 * mt
b = mt2 * t * 3
c = mt * t2 * 3
d = t * t2
}
return [
a * p[0][0] + b * p[1][0] + c * p[2][0] + d * p[3][0],
a * p[0][1] + b * p[1][1] + c * p[2][1] + d * p[3][1],
]
// } // higher order curves: use de Casteljau's computation
}
/**
* Evaluate a 2d cubic bezier at a point t on the x axis.
* @param tx
@ -197,28 +140,11 @@ export function cubicBezier(tx: number, x1: number, y1: number, x2: number, y2:
* @param points An array of points formatted as [x, y]
* @param k Tension
*/
export function getSpline(
pts: number[][],
k = 0.5
): {
cp1x: number
cp1y: number
cp2x: number
cp2y: number
px: number
py: number
}[] {
export function getSpline(pts: number[][], k = 0.5): number[][] {
let p0: number[]
let [p1, p2, p3] = pts
const results: {
cp1x: number
cp1y: number
cp2x: number
cp2y: number
px: number
py: number
}[] = []
const results: number[][] = []
for (let i = 1, len = pts.length; i < len; i++) {
p0 = p1
@ -226,19 +152,76 @@ export function getSpline(
p2 = p3
p3 = pts[i + 2] ? pts[i + 2] : p2
results.push({
cp1x: p1[0] + ((p2[0] - p0[0]) / 6) * k,
cp1y: p1[1] + ((p2[1] - p0[1]) / 6) * k,
cp2x: p2[0] - ((p3[0] - p1[0]) / 6) * k,
cp2y: p2[1] - ((p3[1] - p1[1]) / 6) * k,
px: pts[i][0],
py: pts[i][1],
})
results.push([
p1[0] + ((p2[0] - p0[0]) / 6) * k,
p1[1] + ((p2[1] - p0[1]) / 6) * k,
p2[0] - ((p3[0] - p1[0]) / 6) * k,
p2[1] - ((p3[1] - p1[1]) / 6) * k,
pts[i][0],
pts[i][1],
])
}
return results
}
/**
* Find a point along a curve segment, via pomax.
* @param t
* @param points [cpx1, cpy1, cpx2, cpy2, px, py][]
*/
export function computePointOnSpline(t: number, points: number[][]): number[] {
// shortcuts
if (t === 0) {
return points[0]
}
const order = points.length - 1
if (t === 1) {
return points[order]
}
const mt = 1 - t
let p = points // constant?
if (order === 0) {
return points[0]
} // linear?
if (order === 1) {
return [mt * p[0][0] + t * p[1][0], mt * p[0][1] + t * p[1][1]]
} // quadratic/cubic curve?
// if (order < 4) {
const mt2 = mt * mt
const t2 = t * t
let a: number
let b: number
let c: number
let d = 0
if (order === 2) {
p = [p[0], p[1], p[2], [0, 0]]
a = mt2
b = mt * t * 2
c = t2
// } else if (order === 3) {
} else {
a = mt2 * mt
b = mt2 * t * 3
c = mt * t2 * 3
d = t * t2
}
return [
a * p[0][0] + b * p[1][0] + c * p[2][0] + d * p[3][0],
a * p[0][1] + b * p[1][1] + c * p[2][1] + d * p[3][1],
]
// } // higher order curves: use de Casteljau's computation
}
/**
* Get a bezier curve data for a spline that fits an array of points.
* @param pts
@ -271,7 +254,7 @@ export function getCurvePoints(
// The algorithm require a previous and next point to the actual point array.
// Check if we will draw closed or open curve.
// If closed, copy end points to beginning and first points to end
// If open, duplicate first points to befinning, end points to end
// If open, duplicate first points to beginning, end points to end
if (isClosed) {
_pts.unshift(_pts[len - 1])
_pts.push(_pts[0])

View file

@ -4,6 +4,8 @@ const esbuild = require('esbuild')
const { gzip } = require('zlib')
const pkg = require('../package.json')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -47,7 +49,7 @@ async function main() {
fs.readFile('./dist/esm/index.js', (_err, data) => {
gzip(data, (_err, result) => {
console.log(
jslog(
`${pkg.name}: Built package. ${(esmSize / 1000).toFixed(2)}kb (${(
result.length / 1000
).toFixed(2)}kb minified)`
@ -55,8 +57,8 @@ async function main() {
})
})
} catch (e) {
console.log(`× ${pkg.name}: Build failed due to an error.`)
console.log(e)
jslog(`× ${pkg.name}: Build failed due to an error.`)
jslog(e)
}
}

View file

@ -2,6 +2,8 @@
const esbuild = require('esbuild')
const pkg = require('../package.json')
const { log: jslog } = console
async function main() {
try {
await esbuild.build({
@ -17,7 +19,7 @@ async function main() {
},
watch: {
onRebuild(err) {
err ? error('❌ Failed') : log('✅ Updated')
err ? error('❌ Failed') : jslog('✅ Updated')
},
},
})

View file

@ -4,6 +4,8 @@ const esbuild = require('esbuild')
const { gzip } = require('zlib')
const pkg = require('../package.json')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -49,7 +51,7 @@ async function main() {
fs.readFile('./dist/esm/index.js', (_err, data) => {
gzip(data, (_err, result) => {
console.log(
jslog(
`${pkg.name}: Built pkg. ${(esmSize / 1000).toFixed(2)}kb (${(
result.length / 1000
).toFixed(2)}kb minified)`
@ -57,8 +59,8 @@ async function main() {
})
})
} catch (e) {
console.log(`× ${pkg.name}: Build failed due to an error.`)
console.log(e)
jslog(`× ${pkg.name}: Build failed due to an error.`)
jslog(e)
}
}

View file

@ -2,6 +2,8 @@
const esbuild = require('esbuild')
const pkg = require('../package.json')
const { log: jslog } = console
async function main() {
esbuild.build({
entryPoints: ['./src/index.ts'],
@ -19,10 +21,10 @@ async function main() {
watch: {
onRebuild(error) {
if (error) {
console.log(`× ${pkg.name}: An error in prevented the rebuild.`)
jslog(`× ${pkg.name}: An error in prevented the rebuild.`)
return
}
console.log(`${pkg.name}: Rebuilt.`)
jslog(`${pkg.name}: Rebuilt.`)
},
},
})

View file

@ -4,6 +4,8 @@ const esbuild = require('esbuild')
const { gzip } = require('zlib')
const pkg = require('../package.json')
const { log: jslog } = console
async function main() {
if (fs.existsSync('./dist')) {
fs.rmSync('./dist', { recursive: true }, (e) => {
@ -45,7 +47,7 @@ async function main() {
fs.readFile('./dist/esm/index.js', (_err, data) => {
gzip(data, (_err, result) => {
console.log(
jslog(
`${pkg.name}: Built package. ${(esmSize / 1000).toFixed(2)}kb (${(
result.length / 1000
).toFixed(2)}kb minified)`
@ -53,8 +55,8 @@ async function main() {
})
})
} catch (e) {
console.log(`× ${pkg.name}: Build failed due to an error.`)
console.log(e)
jslog(`× ${pkg.name}: Build failed due to an error.`)
jslog(e)
}
}

View file

@ -2,6 +2,8 @@
const esbuild = require('esbuild')
const pkg = require('../package.json')
const { log: jslog } = console
async function main() {
try {
await esbuild.build({
@ -17,7 +19,7 @@ async function main() {
},
watch: {
onRebuild(err) {
err ? error('❌ Failed') : log('✅ Updated')
err ? error('❌ Failed') : jslog('✅ Updated')
},
},
})

322
yarn.lock
View file

@ -901,7 +901,7 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.0", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
version "7.16.3"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5"
integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==
@ -2004,11 +2004,21 @@
resolved "https://registry.yarnpkg.com/@liveblocks/client/-/client-0.13.0-beta.1.tgz#baee31dbefb7c40c954ab61b8c421562a85f729e"
integrity sha512-LW1CygndCQeITYFsnaEZgbe2qqIZKo4iVH/qGYEXVLptc/1PP0nzEi8Hr2lfw4JOUw003FTeQ+BSI/raP22mgg==
"@liveblocks/react@0.13.0-beta.1", "@liveblocks/react@^0.13.0-beta.1":
"@liveblocks/client@^0.13.1":
version "0.13.1"
resolved "https://registry.yarnpkg.com/@liveblocks/client/-/client-0.13.1.tgz#601b7f077abb0220307ff57cae39887f17d582f7"
integrity sha512-0yOjcy3qx+qGJxTIJnsPYLzwdgZoJ53CrAKrjxAp1gKdg7T0Ub3LwDrUCw+ukgn1O2aE96FL71GQEscsvjD7TA==
"@liveblocks/react@0.13.0-beta.1":
version "0.13.0-beta.1"
resolved "https://registry.yarnpkg.com/@liveblocks/react/-/react-0.13.0-beta.1.tgz#e71bc47511480967c2a11042aa920399674b5c3d"
integrity sha512-odOO5WCVfV3B70Yy8k/11XFY/5dVSBpIPKnx+ZDxZkw/yzrA39NqS+GH7go/RvVAGSeHbg9phknOtg4X9gziAQ==
"@liveblocks/react@^0.13.1":
version "0.13.1"
resolved "https://registry.yarnpkg.com/@liveblocks/react/-/react-0.13.1.tgz#e134305575f38901f03a7db84596a9610a5467f0"
integrity sha512-//XYlFQZnhSrguRdfuGUu5G1sMl/rSBwHDB/pUHGoDCiS94zwVhweao5wKJpph3TklxVHEV2gR3n3+EYo7D91w==
"@malept/cross-spawn-promise@^1.1.0":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d"
@ -2044,22 +2054,6 @@
resolved "https://registry.yarnpkg.com/@napi-rs/triples/-/triples-1.1.0.tgz#88c35b72e79a20b79bb4c9b3e2817241a1c9f4f9"
integrity sha512-XQr74QaLeMiqhStEhLn1im9EOMnkypp7MZOwQhGzqp2Weu5eQJbpPxWxixxlYRKWPOmJjsk6qYfYH9kq43yc2w==
"@next-auth/prisma-legacy-adapter@0.1.2":
version "0.1.2"
resolved "https://registry.yarnpkg.com/@next-auth/prisma-legacy-adapter/-/prisma-legacy-adapter-0.1.2.tgz#d19b65696bf16bda5dbc88f85da98aee6f30e2f3"
integrity sha512-QpGcRvrnFERkvVFroqS89qDbnskw9AjhvWxO095u3xl/8QVI++Y+doluQdZWuV6PewjrV7xY+uVUEnRhnGM8yQ==
dependencies:
"@babel/runtime" "^7.14.0"
"@next-auth/typeorm-legacy-adapter@0.1.4":
version "0.1.4"
resolved "https://registry.yarnpkg.com/@next-auth/typeorm-legacy-adapter/-/typeorm-legacy-adapter-0.1.4.tgz#a250498613669b736d76b36a2a46f7eafc9e6ed5"
integrity sha512-UDnctrPiUU0yaPNeFhD6uw0FAuWGvx6IUVwUYTEzZm26RCEe/BBjkpGLYk43M3rcnkBPfkiljomAs/O7Uzh12w==
dependencies:
"@babel/runtime" "^7.14.0"
require_optional "^1.0.1"
typeorm "^0.2.30"
"@next/env@12.0.7":
version "12.0.7"
resolved "https://registry.yarnpkg.com/@next/env/-/env-12.0.7.tgz#316f7bd1b6b69f554d2676cfc91a16bc7e32ee79"
@ -2379,11 +2373,6 @@
dependencies:
"@octokit/openapi-types" "^11.2.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==
"@panva/hkdf@^1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.0.1.tgz#ed0da773bd5f794d0603f5a5b5cee6d2354e5660"
@ -2971,11 +2960,6 @@
dependencies:
"@sinonjs/commons" "^1.7.0"
"@sqltools/formatter@^1.2.2":
version "1.2.3"
resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20"
integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==
"@state-designer/core@latest":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@state-designer/core/-/core-3.0.0.tgz#c716d99f8862dd0e58fe48250c4cf875ecc76570"
@ -3443,11 +3427,6 @@
dependencies:
"@types/node" "*"
"@types/zen-observable@0.8.3":
version "0.8.3"
resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3"
integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==
"@typescript-eslint/eslint-plugin@^4.19.0", "@typescript-eslint/eslint-plugin@^4.31.1":
version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276"
@ -3804,11 +3783,6 @@ app-module-path@^2.2.0:
resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5"
integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU=
app-root-path@^3.0.0:
version "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, aproba@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
@ -4468,11 +4442,6 @@ buffer-crc32@~0.2.3:
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
buffer-equal-constant-time@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
buffer-equal@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
@ -4509,14 +4478,6 @@ buffer@^5.1.0, buffer@^5.2.1, buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
buffer@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
dependencies:
base64-js "^1.3.1"
ieee754 "^1.2.1"
builder-util-runtime@8.9.1:
version "8.9.1"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz#25f066b3fbc20b3e6236a9b956b1ebb0e33ff66a"
@ -4907,18 +4868,6 @@ cli-cursor@^3.1.0:
dependencies:
restore-cursor "^3.1.0"
cli-highlight@^2.1.11:
version "2.1.11"
resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf"
integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==
dependencies:
chalk "^4.0.0"
highlight.js "^10.7.1"
mz "^2.4.0"
parse5 "^5.1.1"
parse5-htmlparser2-tree-adapter "^6.0.0"
yargs "^16.0.0"
cli-truncate@2.1.0, cli-truncate@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
@ -6164,11 +6113,6 @@ dotenv@^10.0.0:
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81"
integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==
dotenv@^8.2.0:
version "8.6.0"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b"
integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
dotenv@^9.0.2:
version "9.0.2"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05"
@ -6202,13 +6146,6 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
ecdsa-sig-formatter@1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
dependencies:
safe-buffer "^5.0.1"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -7360,6 +7297,13 @@ fragment-cache@^0.2.1:
dependencies:
map-cache "^0.2.2"
framesync@6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.0.1.tgz#5e32fc01f1c42b39c654c35b16440e07a25d6f20"
integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==
dependencies:
tslib "^2.1.0"
fresh@~0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
@ -7443,11 +7387,6 @@ functional-red-black-tree@^1.0.1:
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
futoin-hkdf@^1.3.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.4.2.tgz#fd534e848e0e50339b8bfbd81250b09cbff10ba3"
integrity sha512-2BggwLEJOTfXzKq4Tl2bIT37p0IqqKkblH4e0cMp2sXTdmwg/ADBKMxvxaEytYYcgdxgng8+acsi3WgMVUl6CQ==
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@ -7952,10 +7891,10 @@ he@1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
highlight.js@^10.7.1:
version "10.7.3"
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==
hey-listen@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68"
integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==
history@^4.9.0:
version "4.10.1"
@ -8186,7 +8125,7 @@ idb@^6.1.4:
resolved "https://registry.yarnpkg.com/idb/-/idb-6.1.5.tgz#dbc53e7adf1ac7c59f9b2bf56e00b4ea4fce8c7b"
integrity sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==
ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1:
ieee754@^1.1.13, ieee754@^1.1.4:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
@ -9354,13 +9293,6 @@ joi@^17.4.2:
"@sideway/formula" "^3.0.0"
"@sideway/pinpoint" "^2.0.0"
jose@^1.27.2:
version "1.28.1"
resolved "https://registry.yarnpkg.com/jose/-/jose-1.28.1.tgz#34a0f851a534be59ffab82a6e8845f6874e8c128"
integrity sha512-6JK28rFu5ENp/yxMwM+iN7YeaInnY9B9Bggjkz5fuwLiJhbVrl2O4SJr65bdNBPl9y27fdC3Mymh+FVCvozLIg==
dependencies:
"@panva/asn1.js" "^1.0.0"
jose@^4.1.2, jose@^4.1.4:
version "4.3.7"
resolved "https://registry.yarnpkg.com/jose/-/jose-4.3.7.tgz#5000e4a2d41ae411a5abdd11e6baf63fc2973a69"
@ -9376,7 +9308,7 @@ jpeg-js@^0.4.2:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-yaml@4.1.0, js-yaml@^4.0.0, js-yaml@^4.1.0:
js-yaml@4.1.0, js-yaml@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
@ -9524,22 +9456,6 @@ jsonpointer@^5.0.0:
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072"
integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==
jsonwebtoken@^8.5.1:
version "8.5.1"
resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
dependencies:
jws "^3.2.2"
lodash.includes "^4.3.0"
lodash.isboolean "^3.0.3"
lodash.isinteger "^4.0.4"
lodash.isnumber "^3.0.3"
lodash.isplainobject "^4.0.6"
lodash.isstring "^4.0.1"
lodash.once "^4.0.0"
ms "^2.1.1"
semver "^5.6.0"
jsprim@^1.2.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
@ -9558,23 +9474,6 @@ jsprim@^1.2.2:
array-includes "^3.1.3"
object.assign "^4.1.2"
jwa@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
dependencies:
buffer-equal-constant-time "1.0.1"
ecdsa-sig-formatter "1.0.11"
safe-buffer "^5.0.1"
jws@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
dependencies:
jwa "^1.4.1"
safe-buffer "^5.0.1"
keygrip@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226"
@ -9944,51 +9843,16 @@ lodash.get@^4.4.2:
resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
lodash.includes@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=
lodash.isboolean@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=
lodash.isinteger@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=
lodash.ismatch@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37"
integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=
lodash.isnumber@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=
lodash.isplainobject@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
lodash.isstring@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
lodash.once@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
lodash.set@^4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
@ -10494,7 +10358,7 @@ mkdirp-promise@^5.0.1:
dependencies:
mkdirp "*"
mkdirp@*, mkdirp@^1.0.4:
mkdirp@*:
version "1.0.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
@ -10644,7 +10508,7 @@ mute-stream@~0.0.4:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
mz@^2.4.0, mz@^2.5.0:
mz@^2.5.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
@ -10720,25 +10584,22 @@ next-auth@*:
preact-render-to-string "^5.1.19"
uuid "^8.3.2"
next-auth@^3.29.0:
version "3.29.0"
resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-3.29.0.tgz#60ddbfc7ed8ae7d43ebb02c16dc58eebf5dcb337"
integrity sha512-B//4QTv/1Of0D+roZ82URmI6L2JSbkKgeaKI7Mdrioq8lAzp9ff8NdmouvZL/7zwrPe2cUyM6MLYlasfuI3ZIQ==
next-auth@^4.0.5:
version "4.0.5"
resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.0.5.tgz#a41cdbe41f8a8dad42f4b3fb510ef1fb7035667e"
integrity sha512-POrV6c29Uu3+kVhOe8h3go2ytjeB2jPdW4GJwudUbK6OB++dkpT6yialmm8whM7hyoW4Xy3FbsoldGn8bVHhYg==
dependencies:
"@babel/runtime" "^7.14.0"
"@next-auth/prisma-legacy-adapter" "0.1.2"
"@next-auth/typeorm-legacy-adapter" "0.1.4"
futoin-hkdf "^1.3.2"
jose "^1.27.2"
jsonwebtoken "^8.5.1"
nodemailer "^6.4.16"
"@babel/runtime" "^7.15.4"
"@panva/hkdf" "^1.0.0"
cookie "^0.4.1"
jose "^4.1.2"
oauth "^0.9.15"
pkce-challenge "^2.1.0"
preact "^10.4.1"
preact-render-to-string "^5.1.14"
querystring "^0.2.0"
openid-client "^5.0.2"
preact "^10.5.14"
preact-render-to-string "^5.1.19"
uuid "^8.3.2"
next-pwa@^5.4.0:
next-pwa@^5.4.4:
version "5.4.4"
resolved "https://registry.yarnpkg.com/next-pwa/-/next-pwa-5.4.4.tgz#00f1678091f05662e54c25106664e79c26c337ef"
integrity sha512-Wo7DctXO9ZZzMCuRK/q2U3x5k49LBRv7p31woJIUfiR6tJChSMoojHUvvgeCY72gSo4mtovS5KRm6iHIs/kxeg==
@ -10763,7 +10624,7 @@ next-transpile-modules@^9.0.0:
enhanced-resolve "^5.7.0"
escalade "^3.1.1"
next@^12.0.1:
next@^12.0.7:
version "12.0.7"
resolved "https://registry.yarnpkg.com/next/-/next-12.0.7.tgz#33ebf229b81b06e583ab5ae7613cffe1ca2103fc"
integrity sha512-sKO8GJJYfuk9c+q+zHSNumvff+wP7ufmOlwT6BuzwiYfFJ61VTTkfTcDLSJ+95ErQJiC54uS4Yg5JEE8H6jXRA==
@ -10924,11 +10785,6 @@ node-source-walk@^4.0.0, node-source-walk@^4.2.0:
dependencies:
"@babel/parser" "^7.0.0"
nodemailer@^6.4.16:
version "6.7.2"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.7.2.tgz#44b2ad5f7ed71b7067f7a21c4fedabaec62b85e0"
integrity sha512-Dz7zVwlef4k5R71fdmxwR8Q39fiboGbu3xgswkzGwczUfjp873rVxt1O46+Fh0j1ORnAC6L9+heI8uUpO6DT7Q==
nopt@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
@ -11528,7 +11384,7 @@ parse-url@^6.0.0:
parse-path "^4.0.0"
protocols "^1.4.0"
parse5-htmlparser2-tree-adapter@^6.0.0, parse5-htmlparser2-tree-adapter@^6.0.1:
parse5-htmlparser2-tree-adapter@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6"
integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==
@ -11540,11 +11396,6 @@ parse5@6.0.1, parse5@^6.0.1:
resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
parse5@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
parseurl@^1.3.2, parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@ -11710,11 +11561,6 @@ pirates@^4.0.1:
dependencies:
node-modules-regexp "^1.0.0"
pkce-challenge@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/pkce-challenge/-/pkce-challenge-2.2.0.tgz#02622e0498b82aab248c8c7dbf6507e8bbe20abf"
integrity sha512-Ly0Y0OwhtG2N1ynk5ruqoyJxkrWhAPmvdRk0teiLh9Dp2+J4URKpv1JSKWD0j1Sd+QCeiwO9lTl0EjmrB2jWeA==
pkg-dir@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
@ -11790,6 +11636,16 @@ pngjs@^5.0.0:
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==
popmotion@^11.0.3:
version "11.0.3"
resolved "https://registry.yarnpkg.com/popmotion/-/popmotion-11.0.3.tgz#565c5f6590bbcddab7a33a074bb2ba97e24b0cc9"
integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==
dependencies:
framesync "6.0.1"
hey-listen "^1.0.8"
style-value-types "5.0.0"
tslib "^2.1.0"
posix-character-classes@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
@ -11822,14 +11678,14 @@ postcss@^8.1.7:
picocolors "^1.0.0"
source-map-js "^1.0.1"
preact-render-to-string@^5.1.14, preact-render-to-string@^5.1.19:
preact-render-to-string@^5.1.19:
version "5.1.19"
resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.1.19.tgz#ffae7c3bd1680be5ecf5991d41fe3023b3051e0e"
integrity sha512-bj8sn/oytIKO6RtOGSS/1+5CrQyRSC99eLUnEVbqUa6MzJX5dYh7wu9bmT0d6lm/Vea21k9KhCQwvr2sYN3rrQ==
dependencies:
pretty-format "^3.8.0"
preact@^10.4.1, preact@^10.5.14:
preact@^10.5.14:
version "10.6.2"
resolved "https://registry.yarnpkg.com/preact/-/preact-10.6.2.tgz#c849f91df9ad36bfa64d1a5d5880977f767c69e5"
integrity sha512-ppDjurt75nSxyikpyali+uKwRl8CK9N6ntOPovGIEGQagjMLVzEgVqFEsUUyUrqyE9Ch90KE0jmFc9q2QcPLBA==
@ -12093,11 +11949,6 @@ querystring-es3@0.2.1:
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
querystring@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd"
integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
@ -12445,11 +12296,6 @@ redent@^3.0.0:
indent-string "^4.0.0"
strip-indent "^3.0.0"
reflect-metadata@^0.1.13:
version "0.1.13"
resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
regenerate-unicode-properties@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326"
@ -12596,14 +12442,6 @@ require-main-filename@^2.0.0:
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
require_optional@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==
dependencies:
resolve-from "^2.0.0"
semver "^5.1.0"
requirejs-config-file@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz#4244da5dd1f59874038cc1091d078d620abb6ebc"
@ -12646,11 +12484,6 @@ resolve-dependency-path@^2.0.0:
resolved "https://registry.yarnpkg.com/resolve-dependency-path/-/resolve-dependency-path-2.0.0.tgz#11700e340717b865d216c66cabeb4a2a3c696736"
integrity sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w==
resolve-from@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=
resolve-from@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
@ -13013,7 +12846,7 @@ setprototypeof@1.2.0:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
sha.js@^2.4.0, sha.js@^2.4.8:
version "2.4.11"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
@ -13658,6 +13491,14 @@ strong-log-transformer@^2.0.0:
minimist "^1.2.0"
through "^2.3.4"
style-value-types@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-5.0.0.tgz#76c35f0e579843d523187989da866729411fc8ad"
integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==
dependencies:
hey-listen "^1.0.8"
tslib "^2.1.0"
styled-jsx@5.0.0-beta.3:
version "5.0.0-beta.3"
resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.0-beta.3.tgz#400d16179b5dff10d5954ab8be27a9a1b7780dd2"
@ -14273,28 +14114,6 @@ typedoc@^0.22.3:
minimatch "^3.0.4"
shiki "^0.9.12"
typeorm@^0.2.30:
version "0.2.41"
resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.41.tgz#88758101ac158dc0a0a903d70eaacea2974281cc"
integrity sha512-/d8CLJJxKPgsnrZWiMyPI0rz2MFZnBQrnQ5XP3Vu3mswv2WPexb58QM6BEtmRmlTMYN5KFWUz8SKluze+wS9xw==
dependencies:
"@sqltools/formatter" "^1.2.2"
app-root-path "^3.0.0"
buffer "^6.0.3"
chalk "^4.1.0"
cli-highlight "^2.1.11"
debug "^4.3.1"
dotenv "^8.2.0"
glob "^7.1.6"
js-yaml "^4.0.0"
mkdirp "^1.0.4"
reflect-metadata "^0.1.13"
sha.js "^2.4.11"
tslib "^2.1.0"
xml2js "^0.4.23"
yargs "^17.0.1"
zen-observable-ts "^1.0.0"
typescript@4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3"
@ -15222,7 +15041,7 @@ yargs-unparser@2.0.0:
flat "^5.0.2"
is-plain-obj "^2.1.0"
yargs@16.2.0, yargs@^16.0.0, yargs@^16.2.0:
yargs@16.2.0, yargs@^16.2.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
@ -15290,19 +15109,6 @@ yocto-queue@^0.1.0:
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
zen-observable-ts@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83"
integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==
dependencies:
"@types/zen-observable" "0.8.3"
zen-observable "0.8.15"
zen-observable@0.8.15:
version "0.8.15"
resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
zustand@^3.6.5:
version "3.6.6"
resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.6.6.tgz#3b7473a15813f7af9784233abd052c3b4560bbcc"