diff --git a/docs/docs/reference/adapters/index.md b/docs/docs/reference/adapters/index.md index 5165f60f2d..8a64a717ec 100644 --- a/docs/docs/reference/adapters/index.md +++ b/docs/docs/reference/adapters/index.md @@ -69,6 +69,10 @@ Using an Auth.js / NextAuth.js adapter you can connect to any database service o

Supabase Adapter

+ + +

SurrealDB Adapter

+

TypeORM Adapter

diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 6831d3d024..1d1abc2ef9 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -299,6 +299,7 @@ const docusaurusConfig = { typedocAdapter("TypeORM"), typedocAdapter("Sequelize"), typedocAdapter("Supabase"), + typedocAdapter("SurrealDB"), typedocAdapter("Upstash Redis"), typedocAdapter("Xata"), ]), diff --git a/docs/sidebars.js b/docs/sidebars.js index 1db5d36ce3..f2b94eeff9 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -61,6 +61,7 @@ module.exports = { { type: "doc", id: "reference/adapter/prisma/index" }, { type: "doc", id: "reference/adapter/sequelize/index" }, { type: "doc", id: "reference/adapter/supabase/index" }, + { type: "doc", id: "reference/adapter/surrealdb/index" }, { type: "doc", id: "reference/adapter/typeorm/index" }, { type: "doc", id: "reference/adapter/upstash-redis/index" }, { type: "doc", id: "reference/adapter/xata/index" }, diff --git a/docs/static/img/adapters/surreal.png b/docs/static/img/adapters/surreal.png new file mode 100644 index 0000000000..b171137606 Binary files /dev/null and b/docs/static/img/adapters/surreal.png differ diff --git a/packages/adapter-surrealdb/README.md b/packages/adapter-surrealdb/README.md new file mode 100644 index 0000000000..2bb5a90034 --- /dev/null +++ b/packages/adapter-surrealdb/README.md @@ -0,0 +1,28 @@ +

+
+
+ + + + + +

Surreal DB Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

+

+ +--- + +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/surrealdb). diff --git a/packages/adapter-surrealdb/package.json b/packages/adapter-surrealdb/package.json new file mode 100644 index 0000000000..2ce0fe36c3 --- /dev/null +++ b/packages/adapter-surrealdb/package.json @@ -0,0 +1,60 @@ +{ + "name": "@next-auth/surrealdb-adapter", + "version": "0.0.0", + "description": "SurrealDB adapter for next-auth.", + "homepage": "https://authjs.dev", + "repository": "https://github.com/nextauthjs/next-auth", + "bugs": { + "url": "https://github.com/nextauthjs/next-auth/issues" + }, + "author": "Martin Schaer ", + "contributors": [ + "Thang Huu Vu " + ], + "type": "module", + "types": "./index.d.ts", + "files": [ + "*.js", + "*.d.ts*", + "src" + ], + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./index.js" + } + }, + "license": "ISC", + "keywords": [ + "next-auth", + "next.js", + "oauth", + "mongodb", + "adapter" + ], + "private": false, + "publishConfig": { + "access": "public" + }, + "scripts": { + "test": "./tests/test.sh", + "test:watch": "./tests/test.sh -w", + "build": "tsc" + }, + "dependencies": { + "@auth/core": "workspace:*" + }, + "peerDependencies": { + "surrealdb.js": "^0.9.0" + }, + "devDependencies": { + "@types/node-fetch": "^2.5.11", + "@auth/adapter-test": "workspace:*", + "@auth/tsconfig": "workspace:*", + "jest": "^27.4.3", + "node-fetch": "^2.6.1" + }, + "jest": { + "preset": "@auth/adapter-test/jest" + } +} diff --git a/packages/adapter-surrealdb/src/index.ts b/packages/adapter-surrealdb/src/index.ts new file mode 100644 index 0000000000..06c141d6c0 --- /dev/null +++ b/packages/adapter-surrealdb/src/index.ts @@ -0,0 +1,366 @@ +import Surreal, { ExperimentalSurrealHTTP } from "surrealdb.js" +import type { + Adapter, + AdapterUser, + AdapterAccount, + AdapterSession, + VerificationToken, +} from "@auth/core/adapters" +import type { ProviderType } from "@auth/core/providers" + +type Document = Record & { id: string } +export type UserDoc = Document & { email: string } +export type AccountDoc = { + id: string + userId: T + refresh_token?: string + access_token?: string + type: Extract + provider: string + providerAccountId: string + expires_at?: number +} +export type SessionDoc = Document & { userId: T } + +const extractId = (surrealId: string) => surrealId.split(":")[1] ?? surrealId + +// Convert DB object to AdapterUser +export const docToUser = (doc: UserDoc): AdapterUser => ({ + ...doc, + id: extractId(doc.id), + emailVerified: doc.emailVerified ? new Date(doc.emailVerified) : null, +}) + +// Convert DB object to AdapterAccount +export const docToAccount = (doc: AccountDoc) => { + const account: AdapterAccount = { + ...doc, + id: extractId(doc.id), + userId: doc.userId ? extractId(doc.userId) : "", + } + return account +} + +// Convert DB object to AdapterSession +export const docToSession = ( + doc: SessionDoc +): AdapterSession => ({ + userId: extractId( + typeof doc.userId === "string" ? doc.userId : doc.userId.id + ), + expires: new Date(doc.expires ?? ""), + sessionToken: doc.sessionToken ?? "", +}) + +// Convert AdapterUser to DB object +const userToDoc = ( + user: Omit | Partial +): Omit => { + const doc = { + ...user, + emailVerified: user.emailVerified?.toISOString(), + } + return doc +} + +// Convert AdapterAccount to DB object +const accountToDoc = (account: AdapterAccount): Omit => { + const doc = { + ...account, + userId: `user:${account.userId}`, + } + return doc +} + +// Convert AdapterSession to DB object +export const sessionToDoc = ( + session: AdapterSession +): Omit => { + const doc = { + ...session, + expires: session.expires.toISOString(), + } + return doc +} + +export function SurrealDBAdapter( + client: Promise> + // options = {} +): Adapter { + return { + async createUser(user: Omit) { + const surreal = await client + const doc = userToDoc(user) + const userDoc = await surreal.create>("user", doc) + if (userDoc.length) { + return docToUser(userDoc[0]) + } + throw new Error("User not created") + }, + async getUser(id: string) { + const surreal = await client + try { + const queryResult = await surreal.query<[UserDoc[]]>( + "SELECT * FROM $user", + { + user: `user:${id}`, + } + ) + const doc = queryResult[0].result?.[0] + if (doc) { + return docToUser(doc) + } + } catch (e) { } + return null + }, + async getUserByEmail(email: string) { + const surreal = await client + try { + const users = await surreal.query<[UserDoc[]]>( + `SELECT * FROM user WHERE email = $email`, + { email } + ) + const doc = users[0].result?.[0] + if (doc) return docToUser(doc) + } catch (e) { } + return null + }, + async getUserByAccount({ + providerAccountId, + provider, + }: Pick) { + const surreal = await client + try { + const users = await surreal.query<[AccountDoc[]]>( + `SELECT userId + FROM account + WHERE providerAccountId = $providerAccountId + AND provider = $provider + FETCH userId`, + { providerAccountId, provider } + ) + const user = users[0].result?.[0] + ?.userId + if (user) return docToUser(user) + } catch (e) { } + return null + }, + async updateUser(user: Partial) { + const surreal = await client + const doc = { ...user, emailVerified: user.emailVerified?.toISOString(), id: undefined } + let updatedUser = await surreal.merge>(`user:${user.id}`, doc) + if (updatedUser.length) { + return docToUser(updatedUser[0]) + } else { + throw new Error("User not updated") + } + }, + async deleteUser(userId: string) { + const surreal = await client + + // delete account + try { + const accounts = await surreal.query<[AccountDoc[]]>( + `SELECT * + FROM account + WHERE userId = $userId + LIMIT 1`, + { userId: `user:${userId}` } + ) + const account = accounts[0].result?.[0] + if (account) { + const accountId = extractId(account.id) + await surreal.delete(`account:${accountId}`) + } + } catch (e) { } + + // delete session + try { + const sessions = await surreal.query<[SessionDoc[]]>( + `SELECT * + FROM session + WHERE userId = $userId + LIMIT 1`, + { userId: `user:${userId}` } + ) + const session = sessions[0].result?.[0] + if (session) { + const sessionId = extractId(session.id) + await surreal.delete(`session:${sessionId}`) + } + } catch (e) { } + + // delete user + await surreal.delete(`user:${userId}`) + + // TODO: put all 3 deletes inside a Promise all + }, + async linkAccount(account: AdapterAccount) { + const surreal = await client + const doc = await surreal.create("account", accountToDoc(account)) + return docToAccount(doc[0]) + }, + async unlinkAccount({ + providerAccountId, + provider, + }: Pick) { + const surreal = await client + try { + const accounts = await surreal.query<[AccountDoc[]]>( + `SELECT * + FROM account + WHERE providerAccountId = $providerAccountId + AND provider = $provider + LIMIT 1`, + { providerAccountId, provider } + ) + const account = accounts[0].result?.[0] + if (account) { + const accountId = extractId(account.id) + await surreal.delete(`account:${accountId}`) + } + } catch (e) { } + }, + async createSession({ + sessionToken, + userId, + expires, + }: { + sessionToken: string + userId: string + expires: Date + }) { + const surreal = await client + const doc = { + sessionToken, + userId: `user:${userId}`, + expires, + } + const result = await surreal.create("session", doc) + return result[0] ?? null + }, + async getSessionAndUser(sessionToken: string) { + const surreal = await client + try { + // Can't use limit 1 because it prevent userId to be fetched. + // Works setting limit to 2 + const sessions = await surreal.query<[SessionDoc[]]>( + `SELECT * + FROM session + WHERE sessionToken = $sessionToken + FETCH userId`, + { sessionToken } + ) + const session = sessions[0].result?.[0] + if (session) { + const userDoc = session.userId + if (!userDoc) return null + return { + user: docToUser(userDoc), + session: docToSession({ + ...session, + userId: userDoc.id, + }), + } + } + } catch (e) { } + return null + }, + async updateSession( + session: Partial & Pick + ) { + const surreal = await client + try { + const sessions = await surreal.query<[SessionDoc[]]>( + `SELECT * + FROM session + WHERE sessionToken = $sessionToken + LIMIT 1`, + { sessionToken: session.sessionToken } + ) + const sessionDoc = sessions[0].result?.[0] + if (sessionDoc && session.expires) { + const sessionId = extractId(sessionDoc.id) + let updatedSession = await surreal.merge>( + `session:${sessionId}`, + sessionToDoc({ + ...sessionDoc, + ...session, + userId: sessionDoc.userId, + expires: session.expires, + }) + ) + if (updatedSession.length) { + return docToSession(updatedSession[0]) + } else { + return null + } + } + } catch (e) { } + return null + }, + async deleteSession(sessionToken: string) { + const surreal = await client + try { + const sessions = await surreal.query<[SessionDoc[]]>( + `SELECT * + FROM session + WHERE sessionToken = $sessionToken + LIMIT 1`, + { sessionToken } + ) + const session = sessions[0].result?.[0] + if (session) { + const sessionId = extractId(session.id) + await surreal.delete(`session:${sessionId}`) + return + } + } catch (e) { } + }, + async createVerificationToken({ + identifier, + expires, + token, + }: VerificationToken) { + const surreal = await client + const doc = { + identifier, + expires, + token, + } + const result = await surreal.create("verification_token", doc) + return result[0] ?? null + }, + async useVerificationToken({ + identifier, + token, + }: { + identifier: string + token: string + }) { + const surreal = await client + try { + const tokens = await surreal.query<[{ identifier: string, expires: string, token: string, id: string }[]]>( + `SELECT * + FROM verification_token + WHERE identifier = $identifier + AND token = $verificationToken + LIMIT 1`, + { identifier, verificationToken: token } + ) + if (tokens.length && tokens[0].result) { + const vt = tokens[0].result[0] + if (vt) { + await surreal.delete(vt.id) + return { + identifier: vt.identifier, + expires: new Date(vt.expires), + token: vt.token, + } + } + } else { return null } + } catch (e) { } + return null + }, + } +} diff --git a/packages/adapter-surrealdb/tests/common.ts b/packages/adapter-surrealdb/tests/common.ts new file mode 100644 index 0000000000..197e2e2178 --- /dev/null +++ b/packages/adapter-surrealdb/tests/common.ts @@ -0,0 +1,77 @@ +import Surreal, { ExperimentalSurrealHTTP } from "surrealdb.js" +import fetch from "node-fetch" + +import { + SurrealDBAdapter, + docToUser, + docToAccount, + docToSession, +} from "../src/index" +import type { UserDoc, AccountDoc, SessionDoc } from "../src/index" + +export const config = ( + clientPromise: Promise> +) => ({ + adapter: SurrealDBAdapter(clientPromise), + db: { + async disconnect() { + const surreal = await clientPromise + if (surreal.close) surreal.close() + }, + async user(id: string) { + const surreal = await clientPromise + try { + const users = await surreal.query<[UserDoc[]]>("SELECT * FROM $user", { + user: `user:${id}`, + }) + const user = users[0] + if (user.result?.[0] !== undefined) + return docToUser(user.result[0]) + } catch (e) { } + return null + }, + async account({ provider, providerAccountId }) { + const surreal = await clientPromise + const accounts = await surreal.query<[AccountDoc[]]>( + `SELECT * FROM account WHERE provider = $provider AND providerAccountId = $providerAccountId`, + { provider, providerAccountId } + ) + const account = accounts[0] + if (account.result?.[0] !== undefined) + return docToAccount(account.result[0]) + return null + }, + async session(sessionToken: string) { + const surreal = await clientPromise + const sessions = await surreal.query<[SessionDoc[]]>( + `SELECT * FROM session WHERE sessionToken = $sessionToken`, + { sessionToken } + ) + const session = sessions[0].result?.[0] + if (session !== undefined) { + return docToSession(session) + } + return null + }, + async verificationToken({ identifier, token }) { + const surreal = await clientPromise + const tokens = await surreal.query<[{ identifier: string, expires: string, token: string, id: string }[]]>( + `SELECT * + FROM verification_token + WHERE identifier = $identifier + AND token = $verificationToken + LIMIT 1`, + { identifier, verificationToken: token } + ) + const verificationToken = tokens[0].result?.[0] + if (verificationToken) { + return { + identifier: verificationToken.identifier, + expires: new Date(verificationToken.expires), + token: verificationToken.token, + } + } + return null + }, + }, +}) diff --git a/packages/adapter-surrealdb/tests/index.test.ts b/packages/adapter-surrealdb/tests/index.test.ts new file mode 100644 index 0000000000..8c546b5ec2 --- /dev/null +++ b/packages/adapter-surrealdb/tests/index.test.ts @@ -0,0 +1,23 @@ +import Surreal from "surrealdb.js" +import { runBasicTests } from "@auth/adapter-test" + +import { config } from "./common" + +const clientPromise = new Promise(async (resolve, reject) => { + const db = new Surreal(); + try { + await db.connect('http://0.0.0.0:8000/rpc', { + ns: "test", + db: "test", + auth: { + user: "test", + pass: "test", + } + }) + resolve(db) + } catch (e) { + reject(e) + } +}) + +runBasicTests(config(clientPromise)) diff --git a/packages/adapter-surrealdb/tests/rest.test.ts b/packages/adapter-surrealdb/tests/rest.test.ts new file mode 100644 index 0000000000..45290e29db --- /dev/null +++ b/packages/adapter-surrealdb/tests/rest.test.ts @@ -0,0 +1,27 @@ +test("TODO: test rest", () => { + expect(true).toBe(true) +}) +// import { ExperimentalSurrealHTTP } from "surrealdb.js" +// import { runBasicTests } from "@auth/adapter-test" +// import fetch from "node-fetch" + +// import { config } from "./common" + +// const clientPromise = new Promise>(async (resolve, reject) => { +// try { +// const db = new ExperimentalSurrealHTTP("http://0.0.0.0:8000", { +// fetch, +// auth: { +// user: "test", +// pass: "test", +// }, +// ns: "test", +// db: "test", +// }) +// resolve(db) +// } catch (e) { +// reject(e) +// } +// }) + +// runBasicTests(config(clientPromise)) diff --git a/packages/adapter-surrealdb/tests/test.sh b/packages/adapter-surrealdb/tests/test.sh new file mode 100755 index 0000000000..8483c06eb9 --- /dev/null +++ b/packages/adapter-surrealdb/tests/test.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +CONTAINER_NAME=next-auth-surrealdb-test + +JEST_WATCH=false + +# Is the watch flag passed to the script? +while getopts w flag +do + case "${flag}" in + w) JEST_WATCH=true;; + *) continue;; + esac +done + +# Start db +docker run -d --rm -p 8000:8000 --name ${CONTAINER_NAME} surrealdb/surrealdb:latest start --log debug --user test --pass test memory + +echo "Waiting 3 sec for db to start..." +sleep 3 + +if $JEST_WATCH; then + # Run jest in watch mode + npx jest tests --watch + # Only stop the container after jest has been quit + docker stop "${CONTAINER_NAME}" +else + # Always stop container, but exit with 1 when tests are failing + if npx jest;then + docker stop ${CONTAINER_NAME} + else + docker stop ${CONTAINER_NAME} && exit 1 + fi +fi diff --git a/packages/adapter-surrealdb/tsconfig.json b/packages/adapter-surrealdb/tsconfig.json new file mode 100644 index 0000000000..44e6eeee55 --- /dev/null +++ b/packages/adapter-surrealdb/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "@auth/tsconfig/tsconfig.base.json", + "compilerOptions": { + "allowJs": true, + "baseUrl": ".", + "isolatedModules": true, + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "node", + "outDir": ".", + "rootDir": "src", + "skipDefaultLibCheck": true, + "strictNullChecks": true, + "stripInternal": true, + "declarationMap": true, + "declaration": true + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "*.js", + "*.d.ts", + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a59143b18..eb54a1583d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -709,6 +709,31 @@ importers: specifier: ^27.4.3 version: 27.5.1 + packages/adapter-surrealdb: + dependencies: + '@auth/core': + specifier: workspace:* + version: link:../core + surrealdb.js: + specifier: ^0.9.0 + version: 0.9.0 + devDependencies: + '@auth/adapter-test': + specifier: workspace:* + version: link:../adapter-test + '@auth/tsconfig': + specifier: workspace:* + version: link:../tsconfig + '@types/node-fetch': + specifier: ^2.5.11 + version: 2.6.2 + jest: + specifier: ^27.4.3 + version: 27.5.1 + node-fetch: + specifier: ^2.6.1 + version: 2.6.9 + packages/adapter-test: devDependencies: '@auth/core': @@ -8942,30 +8967,6 @@ packages: slash: 3.0.0 dev: true - /@jest/console@29.2.1: - resolution: {integrity: sha512-MF8Adcw+WPLZGBiNxn76DOuczG3BhODTcMlDCA4+cFi41OkaY/lyI0XUUhi73F88Y+7IHoGmD80pN5CtxQUdSw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/node': 17.0.45 - chalk: 4.1.2 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - slash: 3.0.0 - dev: true - - /@jest/console@29.3.1: - resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/node': 17.0.45 - chalk: 4.1.2 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - slash: 3.0.0 - dev: true - /@jest/console@29.5.0: resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9115,10 +9116,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.2.1 - '@jest/reporters': 29.3.0 + '@jest/console': 29.5.0 + '@jest/reporters': 29.5.0 '@jest/test-result': 29.5.0 - '@jest/transform': 29.3.0 + '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@types/node': 17.0.45 ansi-escapes: 4.3.2 @@ -9126,19 +9127,19 @@ packages: ci-info: 3.7.0 exit: 0.1.2 graceful-fs: 4.2.10 - jest-changed-files: 29.2.0 + jest-changed-files: 29.5.0 jest-config: 29.5.0(@types/node@17.0.45) - jest-haste-map: 29.3.0 - jest-message-util: 29.2.1 - jest-regex-util: 29.2.0 - jest-resolve: 29.3.0 - jest-resolve-dependencies: 29.3.0 - jest-runner: 29.3.0 - jest-runtime: 29.3.0 - jest-snapshot: 29.3.0 + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-resolve-dependencies: 29.5.0 + jest-runner: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 jest-util: 29.5.0 jest-validate: 29.5.0 - jest-watcher: 29.2.2 + jest-watcher: 29.5.0 micromatch: 4.0.5 pretty-format: 29.2.1 slash: 3.0.0 @@ -9157,10 +9158,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.3.1 - '@jest/reporters': 29.3.1 + '@jest/console': 29.5.0 + '@jest/reporters': 29.5.0 '@jest/test-result': 29.5.0 - '@jest/transform': 29.3.1 + '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@types/node': 17.0.45 ansi-escapes: 4.3.2 @@ -9168,19 +9169,19 @@ packages: ci-info: 3.7.0 exit: 0.1.2 graceful-fs: 4.2.10 - jest-changed-files: 29.2.0 + jest-changed-files: 29.5.0 jest-config: 29.5.0(@types/node@17.0.45) - jest-haste-map: 29.3.1 - jest-message-util: 29.3.1 - jest-regex-util: 29.2.0 - jest-resolve: 29.3.1 - jest-resolve-dependencies: 29.3.1 - jest-runner: 29.3.1 - jest-runtime: 29.3.1 - jest-snapshot: 29.3.1 + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-resolve-dependencies: 29.5.0 + jest-runner: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 jest-util: 29.5.0 jest-validate: 29.5.0 - jest-watcher: 29.3.1 + jest-watcher: 29.5.0 micromatch: 4.0.5 pretty-format: 29.3.1 slash: 3.0.0 @@ -9263,10 +9264,10 @@ packages: resolution: {integrity: sha512-9auVQ2GzQ7nrU+lAr8KyY838YahElTX9HVjbQPPS2XjlxQ+na18G113OoBhyBGBtD6ZnO/SrUy5WR8EzOj1/Uw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@jest/fake-timers': 28.1.1 + '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 '@types/node': 17.0.45 - jest-mock: 28.1.1 + jest-mock: 28.1.3 dev: true /@jest/environment@28.1.3: @@ -9362,7 +9363,7 @@ packages: '@sinonjs/fake-timers': 9.1.2 '@types/node': 17.0.45 jest-message-util: 28.1.3 - jest-mock: 28.1.1 + jest-mock: 28.1.3 jest-util: 28.1.3 dev: true @@ -9541,80 +9542,6 @@ packages: - supports-color dev: true - /@jest/reporters@29.3.0: - resolution: {integrity: sha512-MV76tB3Kd80vcv2yMDZfQpMkwkHaY9hlvVhCtHXkVRCWwN+SX3EOmCdX8pT/X4Xh+NusA7l2Rc3yhx4q5p3+Fg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 17.0.45 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.0 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.4 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - jest-worker: 29.5.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.3.1: - resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 17.0.45 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.0 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.4 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - jest-worker: 29.5.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /@jest/reporters@29.5.0: resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9860,52 +9787,6 @@ packages: - supports-color dev: true - /@jest/transform@29.3.0: - resolution: {integrity: sha512-4T8h61ItCakAlJkdYa7XVWP3r39QldlCeOSNmRpiJisi5PrrlzwZdpJDIH13ZZjh+MlSPQ2cq8YbUs3TuH+tRA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.22.1 - '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.17 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.10 - jest-haste-map: 29.5.0 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/transform@29.3.1: - resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.22.1 - '@jest/types': 29.5.0 - '@jridgewell/trace-mapping': 0.3.17 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.10 - jest-haste-map: 29.5.0 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - /@jest/transform@29.5.0: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -18578,7 +18459,7 @@ packages: '@jest/expect-utils': 29.3.1 jest-get-type: 29.2.0 jest-matcher-utils: 29.3.1 - jest-message-util: 29.3.1 + jest-message-util: 29.5.0 jest-util: 29.5.0 dev: true @@ -21179,7 +21060,7 @@ packages: /isomorphic-fetch@3.0.0: resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} dependencies: - node-fetch: 2.6.7 + node-fetch: 2.6.9 whatwg-fetch: 3.6.2 transitivePeerDependencies: - encoding @@ -21275,14 +21156,6 @@ packages: throat: 6.0.1 dev: true - /jest-changed-files@29.2.0: - resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - p-limit: 3.1.0 - dev: true - /jest-changed-files@29.5.0: resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -21993,44 +21866,6 @@ packages: fsevents: 2.3.2 dev: true - /jest-haste-map@29.3.0: - resolution: {integrity: sha512-ugdLIreycMRRg3+6AjiExECmuFI2D9PS+BmNU7eGvBt3fzVMKybb9USAZXN6kw4Q6Mn8DSK+7OFCloY2rN820Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/graceful-fs': 4.1.5 - '@types/node': 17.0.45 - anymatch: 3.1.3 - fb-watchman: 2.0.1 - graceful-fs: 4.2.10 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 - jest-worker: 29.5.0 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-haste-map@29.3.1: - resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/graceful-fs': 4.1.5 - '@types/node': 17.0.45 - anymatch: 3.1.3 - fb-watchman: 2.0.1 - graceful-fs: 4.2.10 - jest-regex-util: 29.4.3 - jest-util: 29.5.0 - jest-worker: 29.5.0 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /jest-haste-map@29.5.0: resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -22250,36 +22085,6 @@ packages: stack-utils: 2.0.5 dev: true - /jest-message-util@29.2.1: - resolution: {integrity: sha512-Dx5nEjw9V8C1/Yj10S/8ivA8F439VS8vTq1L7hEgwHFn9ovSKNpYW/kwNh7UglaEgXO42XxzKJB+2x0nSglFVw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.21.4 - '@jest/types': 29.5.0 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 29.5.0 - slash: 3.0.0 - stack-utils: 2.0.5 - dev: true - - /jest-message-util@29.3.1: - resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.21.4 - '@jest/types': 29.5.0 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 29.5.0 - slash: 3.0.0 - stack-utils: 2.0.5 - dev: true - /jest-message-util@29.5.0: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -22372,7 +22177,7 @@ packages: jest-resolve: 28.1.1 dev: true - /jest-pnp-resolver@1.2.2(jest-resolve@29.3.0): + /jest-pnp-resolver@1.2.2(jest-resolve@29.5.0): resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} peerDependencies: @@ -22381,31 +22186,7 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 29.3.0 - dev: true - - /jest-pnp-resolver@1.2.2(jest-resolve@29.3.1): - resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.3.1 - dev: true - - /jest-pnp-resolver@1.2.2(jest-resolve@29.5.0): - resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.5.0 + jest-resolve: 29.5.0 dev: true /jest-regex-util@26.0.0: @@ -22423,11 +22204,6 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: true - /jest-regex-util@29.2.0: - resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /jest-regex-util@29.4.3: resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -22465,26 +22241,6 @@ packages: - supports-color dev: true - /jest-resolve-dependencies@29.3.0: - resolution: {integrity: sha512-ykSbDbWmIaHprOBig57AExw7i6Fj0y69M6baiAd75Ivx1UMQt4wsM6A+SNqIhycV6Zy8XV3L40Ac3HYSrDSq7w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve-dependencies@29.3.1: - resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.4.3 - jest-snapshot: 29.5.0 - transitivePeerDependencies: - - supports-color - dev: true - /jest-resolve-dependencies@29.5.0: resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -22540,36 +22296,6 @@ packages: slash: 3.0.0 dev: true - /jest-resolve@29.3.0: - resolution: {integrity: sha512-xH6C6loDlOWEWHdCgioLDlbpmsolNdNsV/UR35ChuK217x0ttHuhyEPdh5wa6CTQ/Eq4OGW2/EZTlh0ay5aojQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.10 - jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.2(jest-resolve@29.3.0) - jest-util: 29.5.0 - jest-validate: 29.5.0 - resolve: 1.22.1 - resolve.exports: 1.1.0 - slash: 3.0.0 - dev: true - - /jest-resolve@29.3.1: - resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.10 - jest-haste-map: 29.5.0 - jest-pnp-resolver: 1.2.2(jest-resolve@29.3.1) - jest-util: 29.5.0 - jest-validate: 29.5.0 - resolve: 1.22.1 - resolve.exports: 1.1.0 - slash: 3.0.0 - dev: true - /jest-resolve@29.5.0: resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -22678,64 +22404,6 @@ packages: - supports-color dev: true - /jest-runner@29.3.0: - resolution: {integrity: sha512-E/ROzAVj7gy44FvIe+Tbz0xGWG1sa8WLkhUg/hsXHewPC0Z48kqWySdfYRtXkB7RmMn4OcWE+hIBfsRAMVV+sQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.5.0 - '@jest/environment': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 17.0.45 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.10 - jest-docblock: 29.4.3 - jest-environment-node: 29.5.0 - jest-haste-map: 29.5.0 - jest-leak-detector: 29.5.0 - jest-message-util: 29.5.0 - jest-resolve: 29.5.0 - jest-runtime: 29.5.0 - jest-util: 29.5.0 - jest-watcher: 29.5.0 - jest-worker: 29.5.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runner@29.3.1: - resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.5.0 - '@jest/environment': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 17.0.45 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.10 - jest-docblock: 29.4.3 - jest-environment-node: 29.5.0 - jest-haste-map: 29.5.0 - jest-leak-detector: 29.5.0 - jest-message-util: 29.5.0 - jest-resolve: 29.5.0 - jest-runtime: 29.5.0 - jest-util: 29.5.0 - jest-watcher: 29.5.0 - jest-worker: 29.5.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - /jest-runner@29.5.0: resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -22865,66 +22533,6 @@ packages: - supports-color dev: true - /jest-runtime@29.3.0: - resolution: {integrity: sha512-ufgX/hbpa7MLnjWRW82T5mVF73FBk3W38dGCLPXWtYZ5Zr1ZFh8QnaAtITKJt0p3kGXR8ZqlIjadSiBTk/QJ/A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/globals': 29.5.0 - '@jest/source-map': 29.4.3 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 17.0.45 - chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 - jest-mock: 29.5.0 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@29.3.1: - resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.5.0 - '@jest/fake-timers': 29.5.0 - '@jest/globals': 29.5.0 - '@jest/source-map': 29.4.3 - '@jest/test-result': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 17.0.45 - chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-haste-map: 29.5.0 - jest-message-util: 29.5.0 - jest-mock: 29.5.0 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-snapshot: 29.5.0 - jest-util: 29.5.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /jest-runtime@29.5.0: resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -23056,70 +22664,6 @@ packages: - supports-color dev: true - /jest-snapshot@29.3.0: - resolution: {integrity: sha512-+4mX3T8XI3ABbZFzBd/AM74mfwOb6gMpYVFNTc0Cgg2F2fGYvHii8D6jWWka99a3wyNFmni3ov8meEVTF8n13Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.22.1 - '@babel/generator': 7.22.3 - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.22.1) - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.1) - '@babel/traverse': 7.22.4 - '@babel/types': 7.22.4 - '@jest/expect-utils': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/babel__traverse': 7.17.1 - '@types/prettier': 2.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.1) - chalk: 4.1.2 - expect: 29.5.0 - graceful-fs: 4.2.10 - jest-diff: 29.5.0 - jest-get-type: 29.4.3 - jest-haste-map: 29.5.0 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - natural-compare: 1.4.0 - pretty-format: 29.5.0 - semver: 7.5.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.3.1: - resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.22.1 - '@babel/generator': 7.22.3 - '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.22.1) - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.1) - '@babel/traverse': 7.22.4 - '@babel/types': 7.22.4 - '@jest/expect-utils': 29.5.0 - '@jest/transform': 29.5.0 - '@jest/types': 29.5.0 - '@types/babel__traverse': 7.17.1 - '@types/prettier': 2.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.1) - chalk: 4.1.2 - expect: 29.5.0 - graceful-fs: 4.2.10 - jest-diff: 29.5.0 - jest-get-type: 29.4.3 - jest-haste-map: 29.5.0 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - natural-compare: 1.4.0 - pretty-format: 29.5.0 - semver: 7.5.1 - transitivePeerDependencies: - - supports-color - dev: true - /jest-snapshot@29.5.0: resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -23329,34 +22873,6 @@ packages: string-length: 4.0.2 dev: true - /jest-watcher@29.2.2: - resolution: {integrity: sha512-j2otfqh7mOvMgN2WlJ0n7gIx9XCMWntheYGlBK7+5g3b1Su13/UAK7pdKGyd4kDlrLwtH2QPvRv5oNIxWvsJ1w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 17.0.45 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.5.0 - string-length: 4.0.2 - dev: true - - /jest-watcher@29.3.1: - resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.5.0 - '@jest/types': 29.5.0 - '@types/node': 17.0.45 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.5.0 - string-length: 4.0.2 - dev: true - /jest-watcher@29.5.0: resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -23721,7 +23237,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 10.0.0 - ws: 8.11.0 + ws: 8.14.1 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -25405,7 +24921,7 @@ packages: inquirer: 8.2.4 is-node-process: 1.0.1 js-levenshtein: 1.1.6 - node-fetch: 2.6.7 + node-fetch: 2.6.9 outvariant: 1.3.0 path-to-regexp: 6.2.1 statuses: 2.0.1 @@ -30363,6 +29879,16 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /surrealdb.js@0.9.0: + resolution: {integrity: sha512-JV1lSzeSF4GftfxSvrOd0fDAw0AwRTSTsn+smp4BzhVuvcfJH/2zceEMwsMLzQcUao386pq4xk5JKoieayFJqQ==} + dependencies: + unws: 0.2.4(ws@8.14.1) + ws: 8.14.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /svelte-check@2.10.1(svelte@3.54.0): resolution: {integrity: sha512-uscZovyuOPA89NuAkc4vO27mzx//2wFBNtwTsgYcNs7JwaFpJ2TqBawQ/avG7gkieYQ3QXqFUggJZ+s51fQGDQ==} hasBin: true @@ -31806,6 +31332,15 @@ packages: engines: {node: '>=8'} dev: false + /unws@0.2.4(ws@8.14.1): + resolution: {integrity: sha512-/N1ajiqrSp0A/26/LBg7r10fOcPtGXCqJRJ61sijUFoGZMr6ESWGYn7i0cwr7fR7eEECY5HsitqtjGHDZLAu2w==} + engines: {node: '>=16.14.0'} + peerDependencies: + ws: '*' + dependencies: + ws: 8.14.1 + dev: false + /unzipper@0.10.11: resolution: {integrity: sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==} dependencies: @@ -32483,7 +32018,7 @@ packages: spdy: 4.0.2 webpack: 5.75.0 webpack-dev-middleware: 5.3.3(webpack@5.75.0) - ws: 8.11.0 + ws: 8.14.1 transitivePeerDependencies: - bufferutil - debug @@ -32827,18 +32362,17 @@ packages: utf-8-validate: optional: true - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + /ws@8.14.1: + resolution: {integrity: sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - dev: true /xdg-basedir@4.0.0: resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}