diff --git a/.github/ISSUE_TEMPLATE/3_bug_adapter.yml b/.github/ISSUE_TEMPLATE/3_bug_adapter.yml index 46696d17c2..ce3ed08f35 100644 --- a/.github/ISSUE_TEMPLATE/3_bug_adapter.yml +++ b/.github/ISSUE_TEMPLATE/3_bug_adapter.yml @@ -35,6 +35,7 @@ body: - "@auth/mongodb-adapter" - "@auth/neo4j-adapter" - "@auth/pg-adapter" + - "@auth/pgjs-adapter" - "@auth/pouchdb-adapter" - "@auth/prisma-adapter" - "@auth/sequelize-adapter" diff --git a/.github/pr-labeler.yml b/.github/pr-labeler.yml index 89af700064..72a2d4f09c 100644 --- a/.github/pr-labeler.yml +++ b/.github/pr-labeler.yml @@ -19,6 +19,7 @@ mongodb: ["packages/adapter-mongodb/**/*"] neo4j: ["packages/adapter-neo4j/**/*"] next-auth: ["packages/next-auth/**/*"] pg: ["packages/adapter-pg/**/*"] +pgjs: ["packages/adapter-pgjs/**/*"] neon: ["packages/adapter-neon/**/*"] playgrounds: ["apps/playgrounds/**/*"] pouchdb: ["packages/adapter-pouchdb/**/*"] diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1ee78afa19..8098d21899 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,6 +36,7 @@ on: - "@auth/mongodb-adapter" - "@auth/neo4j-adapter" - "@auth/pg-adapter" + - "@auth/pgjs-adapter" - "@auth/pouchdb-adapter" - "@auth/prisma-adapter" - "@auth/sequelize-adapter" diff --git a/docs/pages/data/manifest.json b/docs/pages/data/manifest.json index 7fef03e029..f32f109798 100644 --- a/docs/pages/data/manifest.json +++ b/docs/pages/data/manifest.json @@ -36,6 +36,7 @@ "mongodb": "MongoDB", "neo4j": "Neo4j", "pg": "pg", + "pgjs": "PostgresJS", "pouchdb": "PouchDB", "sequelize": "Sequelize", "surrealdb": "SurrealDB", diff --git a/docs/pages/getting-started/adapters/_meta.js b/docs/pages/getting-started/adapters/_meta.js index 153672f783..f52ebd4f9f 100644 --- a/docs/pages/getting-started/adapters/_meta.js +++ b/docs/pages/getting-started/adapters/_meta.js @@ -13,7 +13,8 @@ export default { mongodb: "MongoDB", neo4j: "Neo4j", neon: "Neon", - pg: "PostgreSQL", + pg: "PostgreSQL - PG", + pgjs: "PostgreSQL - PostgresJS", pouchdb: "PouchDB", prisma: "Prisma", sequelize: "Sequelize", diff --git a/docs/pages/getting-started/adapters/pgjs.mdx b/docs/pages/getting-started/adapters/pgjs.mdx new file mode 100644 index 0000000000..dfc2368c0d --- /dev/null +++ b/docs/pages/getting-started/adapters/pgjs.mdx @@ -0,0 +1,320 @@ +import { Code } from "@/components/Code" +import { Callout } from "nextra/components" + + + +# PostgresJS Adapter + +## Resources + +- [Official PostgreSQL Docs](https://www.postgresql.org/docs/) +- [PostgresJS Client Docs](https://github.com/porsager/postgres) + +## Setup + +### Installation + +```bash npm2yarn +npm install @auth/pgjs-adapter postgres +``` + +### Environment Variables + +```ts +import postgres from "postgres" +// Default connection +const sql = postgres(process.env.PGSQL) + +// Connection instance + options. Refer to PostgresJS docs for full info +const sql = postgres(process.env.PGSQL, { + host: "", // Postgres ip address[s] or domain name[s] + port: 5432, // Postgres server port[s] + database: "", // Name of database to connect to + username: "", // Username of database user + password: "", // Password + max: 20, // max connections +}) +``` + +### Configuration + + + + +```ts filename="./auth.ts" +import NextAuth from "next-auth" +import PostgresJSAdapter from "@auth/pgjs-adapter" +import postgres from "postgres" + +const sql = postgres(process.env.PGSQL, { + host: "", // Postgres ip address[s] or domain name[s] + port: 5432, // Postgres server port[s] + database: "", // Name of database to connect to + username: "", // Username of database user + password: "", // Password + max: 20, // max connections +}) + +export const { handlers, auth, signIn, signOut } = NextAuth({ + adapter: PostgresJSAdapter(sql), + providers: [], +}) +``` + + + + +```ts filename="/src/routes/plugin@auth.ts" +import { QwikAuth$ } from "@auth/qwik" +import PostgresJSAdapter from "@auth/pgjs-adapter" +import postgres from "postgres" + +const sql = postgres(process.env.PGSQL, { + host: "", // Postgres ip address[s] or domain name[s] + port: 5432, // Postgres server port[s] + database: "", // Name of database to connect to + username: "", // Username of database user + password: "", // Password + max: 20, // max connections +}) + +export const { onRequest, useSession, useSignIn, useSignOut } = QwikAuth$( + () => ({ + providers: [], + adapter: PostgresJSAdapter(sql), + }) +) +``` + + + + +```ts filename="./src/auth.ts" +import { SvelteKitAuth } from "@auth/sveltekit" +import PostgresJSAdapter from "@auth/pgjs-adapter" +import postgres from "postgres" + +const sql = postgres(process.env.PGSQL, { + host: "", // Postgres ip address[s] or domain name[s] + port: 5432, // Postgres server port[s] + database: "", // Name of database to connect to + username: "", // Username of database user + password: "", // Password + max: 20, // max connections +}) + +export const { handle, signIn, signOut } = SvelteKitAuth({ + adapter: PostgresJSAdapter(sql), + providers: [], +}) +``` + + + + +```ts filename="./src/routes/auth.route.ts" +import { ExpressAuth } from "@auth/express" +import PostgresJSAdapter from "@auth/pgjs-adapter" +import postgres from "postgres" + +const sql = postgres(process.env.PGSQL, { + host: "", // Postgres ip address[s] or domain name[s] + port: 5432, // Postgres server port[s] + database: "", // Name of database to connect to + username: "", // Username of database user + password: "", // Password + max: 20, // max connections +}) + +const app = express() + +app.set("trust proxy", true) +app.use( + "/auth/*", + ExpressAuth({ + providers: [], + adapter: PostgresJSAdapter(sql), + }) +) +``` + + + + +### Schema + +The SQL schema for the tables used by this adapter is as follows. Learn more about the models at our +doc page on [Database Models](/guides/creating-a-database-adapter). + + +For `userId`, this schema uses [nanoid](https://github.com/viascom/nanoid-postgres) server-side. +This is **entirely optional** and merely to showcase an alternative ID implementation. + + +```sql filename="./schema.sql" +--Credit [Supabase](https://supabase.com/docs/guides/database/postgres/dropping-all-tables-in-schema) +do $$ declare + r record; +begin + for r in (select tablename from pg_tables where schemaname = 'public') loop + execute 'drop table if exists ' || quote_ident(r.tablename) || ' cascade'; + end loop; +end $$; + +--Credit [Nikola Stanković](https://github.com/viascom/nanoid-postgres) +CREATE EXTENSION IF NOT EXISTS pgcrypto; +DROP FUNCTION IF EXISTS nanoid(int, text, float); +CREATE OR REPLACE FUNCTION nanoid( + size int DEFAULT 7, -- The number of symbols in the NanoId String. Must be greater than 0. + alphabet text DEFAULT '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', -- The symbols used in the NanoId String. Must contain between 1 and 255 symbols. + additionalBytesFactor float DEFAULT 1.02 -- The additional bytes factor used for calculating the step size. Must be equal or greater then 1. +) + RETURNS text -- A randomly generated NanoId String + LANGUAGE plpgsql + VOLATILE + PARALLEL SAFE + -- LEAKPROOF // This option requires superuser privileges + +AS +$$ +DECLARE + alphabetArray text[]; + alphabetLength int := 64; + mask int := 63; + step int := 34; +BEGIN + IF size IS NULL OR size < 1 THEN + RAISE EXCEPTION 'The size must be defined and greater than 0!'; + END IF; + + IF alphabet IS NULL OR length(alphabet) = 0 OR length(alphabet) > 255 THEN + RAISE EXCEPTION 'The alphabet can''t be undefined, zero or bigger than 255 symbols!'; + END IF; + + IF additionalBytesFactor IS NULL OR additionalBytesFactor < 1 THEN + RAISE EXCEPTION 'The additional bytes factor can''t be less than 1!'; + END IF; + + alphabetArray := regexp_split_to_array(alphabet, ''); + alphabetLength := array_length(alphabetArray, 1); + mask := (2 << cast(floor(log(alphabetLength - 1) / log(2)) as int)) - 1; + step := cast(ceil(additionalBytesFactor * mask * size / alphabetLength) AS int); + + IF step > 1024 THEN + step := 1024; -- The step size % can''t be bigger then 1024! + END IF; + + RETURN nanoid_optimized(size, alphabet, mask, step); +END +$$; + +-- Generates an optimized random string of a specified size using the given alphabet, mask, and step. +-- This optimized version is designed for higher performance and lower memory overhead. +-- No checks are performed! Use it only if you really know what you are doing. +DROP FUNCTION IF EXISTS nanoid_optimized(int, text, int, int); +CREATE OR REPLACE FUNCTION nanoid_optimized( + size int, -- The desired length of the generated string. + alphabet text, -- The set of characters to choose from for generating the string. + mask int, -- The mask used for mapping random bytes to alphabet indices. Should be `(2^n) - 1` where `n` is a power of 2 less than or equal to the alphabet size. + step int -- The number of random bytes to generate in each iteration. A larger value may speed up the function but increase memory usage. +) + RETURNS text -- A randomly generated NanoId String + LANGUAGE plpgsql + VOLATILE + PARALLEL SAFE + -- LEAKPROOF // This option requires superuser privileges +AS +$$ +DECLARE + idBuilder text := ''; + counter int := 0; + bytes bytea; + alphabetIndex int; + alphabetArray text[]; + alphabetLength int := 64; +BEGIN + alphabetArray := regexp_split_to_array(alphabet, ''); + alphabetLength := array_length(alphabetArray, 1); + + LOOP + bytes := gen_random_bytes(step); + FOR counter IN 0..step - 1 + LOOP + alphabetIndex := (get_byte(bytes, counter) & mask) + 1; + IF alphabetIndex <= alphabetLength THEN + idBuilder := idBuilder || alphabetArray[alphabetIndex]; + IF length(idBuilder) = size THEN + RETURN idBuilder; + END IF; + END IF; + END LOOP; + END LOOP; +END +$$; +--- + +CREATE TABLE users +( + id TEXT NOT NULL DEFAULT nanoid(), + ---id TEXT NOT NULL, --- Auth.js default - UUID's generated client-side. + ---id SERIAL NOT NULL,--- Auto-Incrementing Ids - Dont forget to change "userId" ForeignKeys to INTEGER + name TEXT, + email TEXT, + "emailVerified" TIMESTAMPTZ, + image TEXT, + + PRIMARY KEY(id) + +); + +CREATE TABLE verification_token +( + identifier TEXT NOT NULL, + expires TIMESTAMPTZ NOT NULL, + token TEXT NOT NULL, + + PRIMARY KEY (identifier, token) +); + +CREATE TABLE accounts +( + "userId" TEXT NOT NULL REFERENCES users(id) ON UPDATE no action ON DELETE cascade, + type TEXT NOT NULL, + provider TEXT NOT NULL, + "providerAccountId" TEXT NOT NULL, + refresh_token TEXT, + access_token TEXT, + expires_at INT, + id_token TEXT, + scope TEXT, + session_state TEXT, + token_type TEXT, + + PRIMARY KEY (provider, "providerAccountId") +); + +CREATE TABLE sessions +( + "userId" TEXT NOT NULL REFERENCES users(id) ON UPDATE no action ON DELETE cascade, + expires TIMESTAMPTZ NOT NULL, + "sessionToken" TEXT NOT NULL, + + PRIMARY KEY ("sessionToken") +); + +create table authenticators +( +id text not null, +"credentialID" text unique not null, +"userId" TEXT NOT NULL REFERENCES users(id) ON UPDATE no action ON DELETE cascade, +"providerAccountId" text not null, +"credentialPublicKey" text not null, +counter integer not null, +"credentialDeviceType" text not null, +"credentialBackedUp" boolean not null, +transports text, + +primary key (id) + +); +``` diff --git a/docs/public/img/adapters/pgjs.svg b/docs/public/img/adapters/pgjs.svg new file mode 100644 index 0000000000..f4826dd71b --- /dev/null +++ b/docs/public/img/adapters/pgjs.svg @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/packages/adapter-pgjs/README.md b/packages/adapter-pgjs/README.md new file mode 100755 index 0000000000..5952ae8713 --- /dev/null +++ b/packages/adapter-pgjs/README.md @@ -0,0 +1,28 @@ +

+
+ + + + + + +

PostgresJS Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + GitHub Stars + +

+

+ +--- + +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/pgjs). diff --git a/packages/adapter-pgjs/package.json b/packages/adapter-pgjs/package.json new file mode 100755 index 0000000000..c186a43083 --- /dev/null +++ b/packages/adapter-pgjs/package.json @@ -0,0 +1,22 @@ +{ + "name": "@auth/pgjs-adapter", + "version": "2.10.0", + "description": "PostgresJS adapter for next-auth.", + "homepage": "https://authjs.dev/reference/adapter/pgjs", + "repository": "https://github.com/nextauthjs/next-auth", + "bugs": {"url": "https://github.com/nextauthjs/next-auth/issues"}, + "author": "Mustaqim Arifin ", + "license": "ISC", + "keywords": [ + "next-auth", "@auth" , "Auth.js" , "next.js" , "oauth" , "postgres" + ], + "type": "module", + "exports": { ".": {"types": "./index.d.ts", "import": "./index.js"} }, + "files": ["*.d.ts*", "*.js", "src"], + "private": false, + "publishConfig": {"access": "public"}, + "scripts": {"test": "./test/test.sh", "build": "tsc"}, + "dependencies": {"@auth/core": "workspace:*"}, + "peerDependencies": {"postgres": "^3"}, + "devDependencies": {"postgres": "3.4.7"} +} diff --git a/packages/adapter-pgjs/schema.sql b/packages/adapter-pgjs/schema.sql new file mode 100755 index 0000000000..ffb44397b3 --- /dev/null +++ b/packages/adapter-pgjs/schema.sql @@ -0,0 +1,162 @@ +\set ON_ERROR_STOP true + +--- Drop All Tables +--- Credit [Supabase](https://supabase.com/docs/guides/database/postgres/dropping-all-tables-in-schema) + +do $$ declare + r record; +begin + for r in (select tablename from pg_tables where schemaname = 'public') loop + execute 'drop table if exists ' || quote_ident(r.tablename) || ' cascade'; + end loop; +end $$; + +--- PG-NANOID [Optional ID generation server-side] +--- Credit [Nikola Stanković](https://github.com/viascom/nanoid-postgres) + +CREATE EXTENSION IF NOT EXISTS pgcrypto; + +DROP FUNCTION IF EXISTS nanoid(int, text, float); + +CREATE OR REPLACE FUNCTION nanoid( + size int DEFAULT 7, -- The number of symbols in the NanoId String. Must be greater than 0. + alphabet text DEFAULT '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', -- The symbols used in the NanoId String. Must contain between 1 and 255 symbols. + additionalBytesFactor float DEFAULT 1.02 -- The additional bytes factor used for calculating the step size. Must be equal or greater then 1. +) + RETURNS text -- A randomly generated NanoId String + LANGUAGE plpgsql + VOLATILE + PARALLEL SAFE +--- Uncomment the following line if you have superuser privileges +--- LEAKPROOF +AS +$$ +DECLARE + alphabetArray text[]; + alphabetLength int := 64; + mask int := 63; + step int := 34; +BEGIN + IF size IS NULL OR size < 1 THEN + RAISE EXCEPTION 'The size must be defined and greater than 0!'; + END IF; + + IF alphabet IS NULL OR length(alphabet) = 0 OR length(alphabet) > 255 THEN + RAISE EXCEPTION 'The alphabet can''t be undefined, zero or bigger than 255 symbols!'; + END IF; + + IF additionalBytesFactor IS NULL OR additionalBytesFactor < 1 THEN + RAISE EXCEPTION 'The additional bytes factor can''t be less than 1!'; + END IF; + + alphabetArray := regexp_split_to_array(alphabet, ''); + alphabetLength := array_length(alphabetArray, 1); + mask := (2 << cast(floor(log(alphabetLength - 1) / log(2)) as int)) - 1; + step := cast(ceil(additionalBytesFactor * mask * size / alphabetLength) AS int); + + IF step > 1024 THEN + step := 1024; -- The step size % can''t be bigger then 1024! + END IF; + + RETURN nanoid_optimized(size, alphabet, mask, step); +END +$$; + +-- Generates an optimized random string of a specified size using the given alphabet, mask, and step. +-- This optimized version is designed for higher performance and lower memory overhead. +-- No checks are performed! Use it only if you really know what you are doing. +DROP FUNCTION IF EXISTS nanoid_optimized (int, text, int, int); + +CREATE OR REPLACE FUNCTION nanoid_optimized( + size int, -- The desired length of the generated string. + alphabet text, -- The set of characters to choose from for generating the string. + mask int, -- The mask used for mapping random bytes to alphabet indices. Should be `(2^n) - 1` where `n` is a power of 2 less than or equal to the alphabet size. + step int -- The number of random bytes to generate in each iteration. A larger value may speed up the function but increase memory usage. +) + RETURNS text -- A randomly generated NanoId String + LANGUAGE plpgsql + VOLATILE + PARALLEL SAFE + -- Uncomment the following line if you have superuser privileges + --LEAKPROOF +AS +$$ +DECLARE + idBuilder text := ''; + counter int := 0; + bytes bytea; + alphabetIndex int; + alphabetArray text[]; + alphabetLength int := 64; +BEGIN + alphabetArray := regexp_split_to_array(alphabet, ''); + alphabetLength := array_length(alphabetArray, 1); + + LOOP + bytes := gen_random_bytes(step); + FOR counter IN 0..step - 1 + LOOP + alphabetIndex := (get_byte(bytes, counter) & mask) + 1; + IF alphabetIndex <= alphabetLength THEN + idBuilder := idBuilder || alphabetArray[alphabetIndex]; + IF length(idBuilder) = size THEN + RETURN idBuilder; + END IF; + END IF; + END LOOP; + END LOOP; +END +$$; + +-- SCHEMA + +CREATE TABLE users ( + id TEXT NOT NULL DEFAULT nanoid (), + name TEXT, + email TEXT, + "emailVerified" TIMESTAMPTZ, + image TEXT, + PRIMARY KEY (id) +); + +CREATE TABLE verification_token ( + identifier TEXT NOT NULL, + expires TIMESTAMPTZ NOT NULL, + token TEXT NOT NULL, + PRIMARY KEY (identifier, token) +); + +CREATE TABLE accounts ( + "userId" TEXT NOT NULL REFERENCES users (id) ON DELETE cascade, + type TEXT NOT NULL, + provider TEXT NOT NULL, + "providerAccountId" TEXT NOT NULL, + refresh_token TEXT, + access_token TEXT, + expires_at INT, + id_token TEXT, + scope TEXT, + session_state TEXT, + token_type TEXT, + PRIMARY KEY (provider, "providerAccountId") +); + +CREATE TABLE sessions ( + "userId" TEXT NOT NULL REFERENCES users (id) ON DELETE cascade, + expires TIMESTAMPTZ NOT NULL, + "sessionToken" TEXT NOT NULL, + PRIMARY KEY ("sessionToken") +); + +create table authenticators ( + "credentialID" text unique not null, + "userId" TEXT NOT NULL, + "providerAccountId" text not null, + "credentialPublicKey" text not null, + counter integer not null, + "credentialDeviceType" text not null, + "credentialBackedUp" boolean not null, + transports text, + PRIMARY KEY ("userId", "credentialID"), + CONSTRAINT "auth_user_fkey" FOREIGN KEY ("userId") REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE +); \ No newline at end of file diff --git a/packages/adapter-pgjs/src/index.ts b/packages/adapter-pgjs/src/index.ts new file mode 100755 index 0000000000..3c13440208 --- /dev/null +++ b/packages/adapter-pgjs/src/index.ts @@ -0,0 +1,214 @@ +/** + *
+ *

An official PostgreSQL adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn + * npm install next-auth @auth/pgjs-adapter postgres + * ``` + * + * @module @auth/pgjs-adapter + */ + +import type { + Adapter, + AdapterAccount, + AdapterUser, + VerificationToken, + AdapterSession, + AdapterAuthenticator, +} from "@auth/core/adapters" +import type postgres from "postgres" +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +type SQL = postgres.Sql<{}> +export default function pgjsAdapter (sql: SQL): Adapter { + return { + async createVerificationToken ( + v: VerificationToken + ): Promise { + const data = { + identifier: v.identifier, + expires: v.expires, + token: v.token, + } + await sql`insert into verification_token ${sql(data)}` + return v + }, + async useVerificationToken ({ + identifier, + token, + }: { + identifier: string + token: string + }): Promise { + const [res] = await sql< + VerificationToken[] + >`delete from verification_token where identifier = ${identifier} and token = ${token} RETURNING identifier, expires, token` + return res ?? null + }, + async createUser (data): Promise { + const { id, ...user } = data + const [res] = await sql`INSERT INTO users ${sql( + user + )} RETURNING *` + return res + }, + async getUser (id) { + try { + const res = await sql< + AdapterUser[] + >`select * from users where id = ${id}` + return res.count === 0 ? null : res[0] + } catch (_e) { + return null + } + }, + async getUserByEmail (email) { + try { + const res = await sql< + AdapterUser[] + >`select * from users where email = ${email}` + return res.count === 0 ? null : res[0] + } catch (_e) { + return null + } + }, + async getUserByAccount ({ + providerAccountId, + provider, + }): Promise { + const res = await sql` + select u.* from users u join accounts a on u.id = a."userId" + where a.provider = ${provider} and a."providerAccountId" = ${providerAccountId}` + return res.count !== 0 ? res[0] : null + }, + async getAccount (providerAccountId: string, provider: string) { + const res = await sql` + select * from accounts where provider = ${provider} and "providerAccountId" = ${providerAccountId}` + return res.count !== 0 ? res[0] : null + }, + async updateUser (user: Partial): Promise { + const [oldUser] = await sql< + AdapterUser[] + >`select * from users where id = ${user.id!}` + const newUser = { ...oldUser, ...user } + + const { id, name, email, emailVerified, image } = newUser + const [newData] = await sql`UPDATE users set + name = ${name!}, email = ${email!}, "emailVerified" = ${emailVerified}, + image = ${image!} where id = ${id!} RETURNING *` + + return newData + }, + async linkAccount (acc: AdapterAccount) { + await sql`insert into accounts ${sql(acc)}` + return acc + }, + async createSession ({ sessionToken, userId, expires }) { + if (userId === undefined) { + throw Error(`userId is undef in createSession`) + } + const [res] = await sql< + AdapterSession[] + >`insert into sessions ("userId", expires, "sessionToken") values (${userId}, ${expires}, ${sessionToken}) RETURNING *` + return res + }, + async getSessionAndUser (sessionToken: string | undefined): Promise<{ + session: AdapterSession + user: AdapterUser + } | null> { + if (sessionToken === undefined) { + return null + } + const result1 = await sql< + AdapterSession[] + >`select * from sessions where "sessionToken" = ${sessionToken}` + if (result1.count === 0) { + return null + } + const session: AdapterSession = result1[0] + + const result2 = await sql< + AdapterUser[] + >`select * from users where id = ${session.userId}` + if (result2.count === 0) { + return null + } + const user = result2[0] + return { + session, + user, + } + }, + async updateSession ( + session: Partial & Pick + ): Promise { + const { sessionToken } = session + const r1 = await sql< + AdapterSession[] + >`select * from sessions where "sessionToken" = ${sessionToken}` + if (r1.count === 0) { + return null + } + const newSession: AdapterSession = { ...r1[0], ...session } + const [result] = await sql`update sessions set + ${sql(newSession)} where "sessionToken" = ${newSession.sessionToken}` + return result + }, + async deleteSession (sessionToken) { + await sql`delete from sessions where "sessionToken" = ${sessionToken}` + }, + async unlinkAccount ({ providerAccountId, provider }) { + await sql`delete from accounts where provider = ${provider} and "providerAccountId" = ${providerAccountId}` + }, + async deleteUser (userId: string) { + await sql.begin((sql) => [ + sql`delete from users where id = ${userId}`, + sql`delete from sessions where "userId" = ${userId}`, + sql`delete from accounts where "userId" = ${userId}`, + ]) + }, + async createAuthenticator ( + data: AdapterAuthenticator + ): Promise { + const [res] = await sql< + AdapterAuthenticator[] + >`insert into authenticators ${sql(data)} RETURNING *` + return res + }, + async getAuthenticator (credentialID: string) { + try { + const res = await sql< + AdapterAuthenticator[] + >`select * from authenticators where "credentialID" = ${credentialID}` + return res.count === 0 ? null : res[0] + } catch (_e) { + return null + } + }, + async listAuthenticatorsByUserId ( + userId: string + ): Promise { + const res = await sql< + AdapterAuthenticator[] + >`select * from authenticators where "userId" = ${userId}` + return res + }, + async updateAuthenticatorCounter ( + credentialID: string, + newCounter: number + ): Promise { + + const res = await sql< + AdapterAuthenticator[] + >`UPDATE authenticators set counter = ${newCounter} where "credentialID" = ${credentialID} RETURNING *` + return res[0] ?? Promise.reject(Error("")) + + }, + } +} diff --git a/packages/adapter-pgjs/test/index.test.ts b/packages/adapter-pgjs/test/index.test.ts new file mode 100755 index 0000000000..96d1e7fe3f --- /dev/null +++ b/packages/adapter-pgjs/test/index.test.ts @@ -0,0 +1,47 @@ +import { runBasicTests } from "utils/adapter" +import PostgresJSAdapter from "../src" +import postgres from "postgres" + +const sql = postgres({ + host: "127.0.0.1", + database: "pgjs", + user: "pgjs", + password: "pgjs", + port: 6969, + max: 20, +}) + +runBasicTests({ + adapter: PostgresJSAdapter(sql), + testWebAuthnMethods: true, + db: { + disconnect: async () => { + await sql.end() + }, + user: async (id: string) => { + const result = await sql`select * from users where id = ${id}` + return result.count !== 0 ? result[0] : null + }, + account: async (account) => { + const result = + await sql`select * from accounts where "providerAccountId" = ${account.providerAccountId}` + return result.count !== 0 ? result[0] : null + }, + session: async (sessionToken) => { + const result = await sql` + select * from sessions where "sessionToken" = ${sessionToken}` + return result.count !== 0 ? result[0] : null + }, + async verificationToken (identifier_token) { + const { identifier, token } = identifier_token + const result = + await sql` select * from verification_token where identifier = ${identifier} and token = ${token}` + return result.count !== 0 ? result[0] : null + }, + authenticator: async (credentialID) => { + const result = + await sql`select * from authenticators where "credentialID" = ${credentialID}` + return result[0] + }, + }, +}) \ No newline at end of file diff --git a/packages/adapter-pgjs/test/test.sh b/packages/adapter-pgjs/test/test.sh new file mode 100755 index 0000000000..047e4849ee --- /dev/null +++ b/packages/adapter-pgjs/test/test.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +echo "Initializing container for PostgresJS Tests." + +PGUSER=pgjs +PGPASSWORD=pgjs +PGDATABASE=pgjs +PGPORT=6969 +PG_CONTAINER_NAME=authjs-pgjs-test + +docker run -d --rm \ + -e POSTGRES_USER=${PGUSER} \ + -e POSTGRES_PASSWORD=${PGPASSWORD} \ + -e POSTGRES_DB=${PGDATABASE} \ + -e POSTGRES_HOST_AUTH_METHOD=trust \ + --name "${PG_CONTAINER_NAME}" \ + -p ${PGPORT}:5432 \ + -v "$(pwd)"/schema.sql:/docker-entrypoint-initdb.d/schema.sql \ + postgres:latest + +echo "Waiting 5s for db to start..." && sleep 5 + +if vitest run -c ../utils/vitest.config.ts ./test/index.test.ts; then + docker stop ${PG_CONTAINER_NAME} +else + docker stop ${PG_CONTAINER_NAME} && exit 1 +fi diff --git a/packages/adapter-pgjs/tsconfig.json b/packages/adapter-pgjs/tsconfig.json new file mode 100755 index 0000000000..df8621c516 --- /dev/null +++ b/packages/adapter-pgjs/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "utils/tsconfig.json", + "compilerOptions": { + "outDir": ".", + "rootDir": "src" + }, + "exclude": ["*.js", "*.d.ts"], + "include": ["src/**/*"] +} diff --git a/packages/adapter-pgjs/typedoc.config.cjs b/packages/adapter-pgjs/typedoc.config.cjs new file mode 100644 index 0000000000..fc7e7369f1 --- /dev/null +++ b/packages/adapter-pgjs/typedoc.config.cjs @@ -0,0 +1,14 @@ +// @ts-check + +/** + * @type {import('typedoc').TypeDocOptions & import('typedoc-plugin-markdown').MarkdownTheme} + */ +module.exports = { + entryPoints: ["src/index.ts"], + entryPointStrategy: "expand", + tsconfig: "./tsconfig.json", + entryModule: "@auth/pgjs-adapter", + entryFileName: "../pgjs-adapter.mdx", + includeVersion: true, + readme: 'none', +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6fe6e4264..1a453db4e4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,7 +42,7 @@ importers: version: 6.19.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.3.3) '@vitest/coverage-v8': specifier: 1.2.1 - version: 1.2.1(vitest@1.2.2(@types/node@20.12.7)(@vitest/ui@1.2.2)(sass@1.70.0)(terser@5.27.0)) + version: 1.2.1(vitest@1.2.2) '@vitest/ui': specifier: ^1.2.2 version: 1.2.2(vitest@1.2.2) @@ -66,7 +66,7 @@ importers: version: 7.33.2(eslint@9.9.1(jiti@1.21.6)) eslint-plugin-svelte: specifier: ^2.38.0 - version: 2.38.0(eslint@9.9.1(jiti@1.21.6))(svelte@4.2.19)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)) + version: 2.38.0(eslint@9.9.1(jiti@1.21.6))(svelte@4.2.19)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.3.3)) fake-smtp-server: specifier: ^0.8.0 version: 0.8.0 @@ -234,7 +234,7 @@ importers: version: 4.2.19 svelte-check: specifier: 2.10.2 - version: 2.10.2(@babel/core@7.23.9)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)))(postcss@8.4.47)(pug@3.0.2)(sass@1.70.0)(svelte@4.2.19) + version: 2.10.2(@babel/core@7.23.9)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.2.2)))(postcss@8.4.47)(pug@3.0.2)(sass@1.70.0)(svelte@4.2.19) typescript: specifier: 5.2.2 version: 5.2.2 @@ -249,7 +249,7 @@ importers: version: 3.8.3(@algolia/client-search@5.20.0)(@types/react@18.2.78)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2) '@inkeep/widgets': specifier: ^0.2.289 - version: 0.2.289(@internationalized/date@3.5.2)(@types/react@18.2.78)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + version: 0.2.289(@internationalized/date@3.5.6)(@types/react@18.2.78)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) '@next/third-parties': specifier: ^14.2.15 version: 14.2.15(next@14.2.21(@opentelemetry/api@1.7.0)(@playwright/test@1.41.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.70.0))(react@18.3.1) @@ -310,7 +310,7 @@ importers: version: 1.22.0 tailwindcss: specifier: ^3.4.13 - version: 3.4.13(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.6.3)) + version: 3.4.13(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.6.3)) typedoc: specifier: ^0.27.6 version: 0.27.8(typescript@5.6.3) @@ -377,7 +377,7 @@ importers: version: 0.23.0 drizzle-orm: specifier: ^0.32.0 - version: 0.32.1(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.6.0)(@neondatabase/serverless@0.10.4)(@opentelemetry/api@1.7.0)(@prisma/client@6.0.0)(@types/better-sqlite3@7.6.9)(@types/pg@8.11.6)(@types/react@18.2.78)(@xata.io/client@0.28.0(typescript@5.3.3))(better-sqlite3@9.6.0)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.9.7)(pg@8.11.3)(sqlite3@5.1.6))(kysely@0.27.5)(mysql2@3.9.7)(pg@8.11.3)(postgres@3.4.3)(react@18.3.1)(sqlite3@5.1.6) + version: 0.32.1(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.6.0)(@neondatabase/serverless@0.10.4)(@opentelemetry/api@1.7.0)(@prisma/client@6.0.0(prisma@6.0.0))(@types/better-sqlite3@7.6.9)(@types/pg@8.11.6)(@types/react@18.2.78)(@xata.io/client@0.28.0(typescript@5.6.3))(better-sqlite3@9.6.0)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.9.7)(pg@8.11.3)(sqlite3@5.1.6(encoding@0.1.13)))(kysely@0.27.5)(mysql2@3.9.7)(pg@8.11.3)(postgres@3.4.3)(prisma@6.0.0)(react@18.3.1)(sqlite3@5.1.6(encoding@0.1.13)) libsql: specifier: ^0.3.18 version: 0.3.18 @@ -425,7 +425,7 @@ importers: version: 1.3.1 fauna-shell: specifier: 1.2.1 - version: 1.2.1(@swc/core@1.3.106)(@types/node@22.13.5)(encoding@0.1.13)(typescript@5.6.3) + version: 1.2.1(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(encoding@0.1.13)(typescript@5.6.3) packages/adapter-firebase: dependencies: @@ -496,7 +496,7 @@ importers: devDependencies: mongodb: specifier: ^6.0.0 - version: 6.9.0(@aws-sdk/credential-providers@3.499.0)(gcp-metadata@5.3.0)(socks@2.7.1) + version: 6.9.0(@aws-sdk/credential-providers@3.499.0)(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) packages/adapter-neo4j: dependencies: @@ -540,6 +540,16 @@ importers: specifier: ^8.7.1 version: 8.11.3 + packages/adapter-pgjs: + dependencies: + '@auth/core': + specifier: workspace:* + version: link:../core + devDependencies: + postgres: + specifier: 3.4.7 + version: 3.4.7 + packages/adapter-pouchdb: dependencies: '@auth/core': @@ -573,7 +583,7 @@ importers: version: 1.1.0(@prisma/client@6.0.0(prisma@6.0.0)) mongodb: specifier: ^6.9.0 - version: 6.9.0(@aws-sdk/credential-providers@3.499.0)(gcp-metadata@5.3.0)(socks@2.7.1) + version: 6.9.0(@aws-sdk/credential-providers@3.499.0)(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1) prisma: specifier: ^6.0.0 version: 6.0.0 @@ -630,10 +640,10 @@ importers: version: 8.11.3 typeorm: specifier: 0.3.17 - version: 0.3.17(ioredis@5.4.1)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(pg@8.11.3)(redis@4.6.12)(sqlite3@5.1.6(encoding@0.1.13))(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)) + version: 0.3.17(ioredis@5.4.1)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(pg@8.11.3)(redis@4.6.12)(sqlite3@5.1.6(encoding@0.1.13))(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)) typeorm-naming-strategies: specifier: ^4.1.0 - version: 4.1.0(typeorm@0.3.17(ioredis@5.4.1)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(pg@8.11.3)(redis@4.6.12)(sqlite3@5.1.6(encoding@0.1.13))(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3))) + version: 4.1.0(typeorm@0.3.17(ioredis@5.4.1)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(pg@8.11.3)(redis@4.6.12)(sqlite3@5.1.6(encoding@0.1.13))(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3))) packages/adapter-unstorage: dependencies: @@ -11201,6 +11211,10 @@ packages: resolution: {integrity: sha512-iHJn4+M9vbTdHSdDzNkC0crHq+1CUdFhx+YqCE+SqWxPjm+Zu63jq7yZborOBF64c8pc58O5uMudyL1FQcHacA==} engines: {node: '>=12'} + postgres@3.4.7: + resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} + engines: {node: '>=12'} + pouchdb-abstract-mapreduce@8.0.1: resolution: {integrity: sha512-BxJRHdfiC8gID8h4DPS0Xy6wsa2VBHRHMv9hsm0BhGTWTqS4k8ivItVSeU2dMoXiTBYp+7SerYmovUQNGSX1GA==} @@ -14213,7 +14227,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@ark-ui/anatomy@0.1.0(@internationalized/date@3.5.2)': + '@ark-ui/anatomy@0.1.0(@internationalized/date@3.5.6)': dependencies: '@zag-js/accordion': 0.20.0 '@zag-js/anatomy': 0.20.0 @@ -14224,7 +14238,7 @@ snapshots: '@zag-js/color-utils': 0.20.0 '@zag-js/combobox': 0.20.0 '@zag-js/date-picker': 0.20.0 - '@zag-js/date-utils': 0.20.0(@internationalized/date@3.5.2) + '@zag-js/date-utils': 0.20.0(@internationalized/date@3.5.6) '@zag-js/dialog': 0.20.0 '@zag-js/editable': 0.20.0 '@zag-js/hover-card': 0.20.0 @@ -14250,7 +14264,7 @@ snapshots: transitivePeerDependencies: - '@internationalized/date' - '@ark-ui/react@0.15.0(@internationalized/date@3.5.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ark-ui/react@0.15.0(@internationalized/date@3.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@zag-js/accordion': 0.19.1 '@zag-js/anatomy': 0.19.1 @@ -14262,7 +14276,7 @@ snapshots: '@zag-js/combobox': 0.19.1 '@zag-js/core': 0.19.1 '@zag-js/date-picker': 0.19.1 - '@zag-js/date-utils': 0.19.1(@internationalized/date@3.5.2) + '@zag-js/date-utils': 0.19.1(@internationalized/date@3.5.6) '@zag-js/dialog': 0.19.1 '@zag-js/editable': 0.19.1 '@zag-js/hover-card': 0.19.1 @@ -17141,11 +17155,11 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@inkeep/components@0.0.24(@ark-ui/react@0.15.0(@internationalized/date@3.5.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@internationalized/date@3.5.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@inkeep/components@0.0.24(@ark-ui/react@0.15.0(@internationalized/date@3.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@internationalized/date@3.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@ark-ui/react': 0.15.0(@internationalized/date@3.5.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@inkeep/preset': 0.0.24(@internationalized/date@3.5.2)(typescript@5.6.3) - '@inkeep/preset-chakra': 0.0.24(@internationalized/date@3.5.2)(typescript@5.6.3) + '@ark-ui/react': 0.15.0(@internationalized/date@3.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@inkeep/preset': 0.0.24(@internationalized/date@3.5.6)(typescript@5.6.3) + '@inkeep/preset-chakra': 0.0.24(@internationalized/date@3.5.6)(typescript@5.6.3) '@inkeep/shared': 0.0.25 '@inkeep/styled-system': 0.0.44 '@pandacss/dev': 0.22.1(typescript@5.6.3) @@ -17157,9 +17171,9 @@ snapshots: - jsdom - typescript - '@inkeep/preset-chakra@0.0.24(@internationalized/date@3.5.2)(typescript@5.6.3)': + '@inkeep/preset-chakra@0.0.24(@internationalized/date@3.5.6)(typescript@5.6.3)': dependencies: - '@ark-ui/anatomy': 0.1.0(@internationalized/date@3.5.2) + '@ark-ui/anatomy': 0.1.0(@internationalized/date@3.5.6) '@inkeep/shared': 0.0.25 '@pandacss/dev': 0.22.1(typescript@5.6.3) transitivePeerDependencies: @@ -17167,10 +17181,10 @@ snapshots: - jsdom - typescript - '@inkeep/preset@0.0.24(@internationalized/date@3.5.2)(typescript@5.6.3)': + '@inkeep/preset@0.0.24(@internationalized/date@3.5.6)(typescript@5.6.3)': dependencies: - '@ark-ui/anatomy': 0.1.0(@internationalized/date@3.5.2) - '@inkeep/preset-chakra': 0.0.24(@internationalized/date@3.5.2)(typescript@5.6.3) + '@ark-ui/anatomy': 0.1.0(@internationalized/date@3.5.6) + '@inkeep/preset-chakra': 0.0.24(@internationalized/date@3.5.6)(typescript@5.6.3) '@inkeep/shared': 0.0.25 '@pandacss/dev': 0.22.1(typescript@5.6.3) colorjs.io: 0.4.5 @@ -17185,14 +17199,14 @@ snapshots: '@inkeep/styled-system@0.0.46': {} - '@inkeep/widgets@0.2.289(@internationalized/date@3.5.2)(@types/react@18.2.78)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@inkeep/widgets@0.2.289(@internationalized/date@3.5.6)(@types/react@18.2.78)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: '@apollo/client': 3.9.5(@types/react@18.2.78)(graphql-ws@5.14.3(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ark-ui/react': 0.15.0(@internationalized/date@3.5.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ark-ui/react': 0.15.0(@internationalized/date@3.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@inkeep/color-mode': 0.0.24(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@inkeep/components': 0.0.24(@ark-ui/react@0.15.0(@internationalized/date@3.5.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@internationalized/date@3.5.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@inkeep/preset': 0.0.24(@internationalized/date@3.5.2)(typescript@5.6.3) - '@inkeep/preset-chakra': 0.0.24(@internationalized/date@3.5.2)(typescript@5.6.3) + '@inkeep/components': 0.0.24(@ark-ui/react@0.15.0(@internationalized/date@3.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@internationalized/date@3.5.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@inkeep/preset': 0.0.24(@internationalized/date@3.5.6)(typescript@5.6.3) + '@inkeep/preset-chakra': 0.0.24(@internationalized/date@3.5.6)(typescript@5.6.3) '@inkeep/shared': 0.0.25 '@inkeep/styled-system': 0.0.46 '@types/lodash.isequal': 4.5.8 @@ -17589,7 +17603,7 @@ snapshots: optionalDependencies: '@mikro-orm/sqlite': 5.9.7(@mikro-orm/core@5.9.7)(better-sqlite3@9.6.0)(encoding@0.1.13)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(mysql@2.18.1)(pg@8.11.3) - '@mikro-orm/knex@5.9.7(@mikro-orm/core@5.9.7(@mikro-orm/sqlite@5.9.7))(better-sqlite3@9.6.0)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(mysql@2.18.1)(pg@8.11.3)(sqlite3@5.1.6(encoding@0.1.13))': + '@mikro-orm/knex@5.9.7(@mikro-orm/core@5.9.7)(better-sqlite3@9.6.0)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(mysql@2.18.1)(pg@8.11.3)(sqlite3@5.1.6(encoding@0.1.13))': dependencies: '@mikro-orm/core': 5.9.7(@mikro-orm/sqlite@5.9.7) fs-extra: 11.1.1 @@ -17610,7 +17624,7 @@ snapshots: '@mikro-orm/sqlite@5.9.7(@mikro-orm/core@5.9.7)(better-sqlite3@9.6.0)(encoding@0.1.13)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(mysql@2.18.1)(pg@8.11.3)': dependencies: '@mikro-orm/core': 5.9.7(@mikro-orm/sqlite@5.9.7) - '@mikro-orm/knex': 5.9.7(@mikro-orm/core@5.9.7(@mikro-orm/sqlite@5.9.7))(better-sqlite3@9.6.0)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(mysql@2.18.1)(pg@8.11.3)(sqlite3@5.1.6(encoding@0.1.13)) + '@mikro-orm/knex': 5.9.7(@mikro-orm/core@5.9.7)(better-sqlite3@9.6.0)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(mysql@2.18.1)(pg@8.11.3)(sqlite3@5.1.6(encoding@0.1.13)) fs-extra: 11.1.1 sqlite3: 5.1.6(encoding@0.1.13) sqlstring-sqlite: 0.1.1 @@ -17811,7 +17825,7 @@ snapshots: supports-color: 8.1.1 tslib: 2.8.1 - '@oclif/core@2.15.0(@swc/core@1.3.106)(@types/node@22.13.5)(typescript@5.6.3)': + '@oclif/core@2.15.0(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)': dependencies: '@types/cli-progress': 3.11.5 ansi-escapes: 4.3.2 @@ -17836,7 +17850,7 @@ snapshots: strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 - ts-node: 10.9.2(@swc/core@1.3.106)(@types/node@22.13.5)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3) tslib: 2.7.0 widest-line: 3.1.0 wordwrap: 1.0.0 @@ -17857,19 +17871,19 @@ snapshots: '@oclif/linewrap@1.0.0': {} - '@oclif/plugin-help@5.2.20(@swc/core@1.3.106)(@types/node@22.13.5)(typescript@5.6.3)': + '@oclif/plugin-help@5.2.20(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)': dependencies: - '@oclif/core': 2.15.0(@swc/core@1.3.106)(@types/node@22.13.5)(typescript@5.6.3) + '@oclif/core': 2.15.0(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - typescript - '@oclif/plugin-plugins@2.4.7(@swc/core@1.3.106)(@types/node@22.13.5)(typescript@5.6.3)': + '@oclif/plugin-plugins@2.4.7(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)': dependencies: '@oclif/color': 1.0.13 - '@oclif/core': 2.15.0(@swc/core@1.3.106)(@types/node@22.13.5)(typescript@5.6.3) + '@oclif/core': 2.15.0(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3) chalk: 4.1.2 debug: 4.3.7(supports-color@8.1.1) fs-extra: 9.1.0 @@ -20140,7 +20154,7 @@ snapshots: dependencies: '@upstash/redis': 1.25.1 - '@vitest/coverage-v8@1.2.1(vitest@1.2.2(@types/node@20.12.7)(@vitest/ui@1.2.2)(sass@1.70.0)(terser@5.27.0))': + '@vitest/coverage-v8@1.2.1(vitest@1.2.2)': dependencies: '@ampproject/remapping': 2.2.1 '@bcoe/v8-coverage': 0.2.3 @@ -20326,11 +20340,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@xata.io/client@0.28.0(typescript@5.3.3)': - dependencies: - typescript: 5.3.3 - optional: true - '@xata.io/client@0.28.0(typescript@5.6.3)': dependencies: typescript: 5.6.3 @@ -20539,9 +20548,9 @@ snapshots: dependencies: '@internationalized/date': 3.5.2 - '@zag-js/date-utils@0.20.0(@internationalized/date@3.5.2)': + '@zag-js/date-utils@0.19.1(@internationalized/date@3.5.6)': dependencies: - '@internationalized/date': 3.5.2 + '@internationalized/date': 3.5.6 '@zag-js/date-utils@0.20.0(@internationalized/date@3.5.6)': dependencies: @@ -22729,7 +22738,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.32.1(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.6.0)(@neondatabase/serverless@0.10.4)(@opentelemetry/api@1.7.0)(@prisma/client@6.0.0)(@types/better-sqlite3@7.6.9)(@types/pg@8.11.6)(@types/react@18.2.78)(@xata.io/client@0.28.0(typescript@5.3.3))(better-sqlite3@9.6.0)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.9.7)(pg@8.11.3)(sqlite3@5.1.6))(kysely@0.27.5)(mysql2@3.9.7)(pg@8.11.3)(postgres@3.4.3)(react@18.3.1)(sqlite3@5.1.6): + drizzle-orm@0.32.1(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.6.0)(@neondatabase/serverless@0.10.4)(@opentelemetry/api@1.7.0)(@prisma/client@6.0.0(prisma@6.0.0))(@types/better-sqlite3@7.6.9)(@types/pg@8.11.6)(@types/react@18.2.78)(@xata.io/client@0.28.0(typescript@5.6.3))(better-sqlite3@9.6.0)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.9.7)(pg@8.11.3)(sqlite3@5.1.6(encoding@0.1.13)))(kysely@0.27.5)(mysql2@3.9.7)(pg@8.11.3)(postgres@3.4.3)(prisma@6.0.0)(react@18.3.1)(sqlite3@5.1.6(encoding@0.1.13)): optionalDependencies: '@cloudflare/workers-types': 4.20240117.0 '@libsql/client': 0.6.0 @@ -22739,13 +22748,14 @@ snapshots: '@types/better-sqlite3': 7.6.9 '@types/pg': 8.11.6 '@types/react': 18.2.78 - '@xata.io/client': 0.28.0(typescript@5.3.3) + '@xata.io/client': 0.28.0(typescript@5.6.3) better-sqlite3: 9.6.0 knex: 2.5.1(better-sqlite3@9.6.0)(mysql2@3.9.7)(mysql@2.18.1)(pg@8.11.3)(sqlite3@5.1.6(encoding@0.1.13)) kysely: 0.27.5 mysql2: 3.9.7 pg: 8.11.3 postgres: 3.4.3 + prisma: 6.0.0 react: 18.3.1 sqlite3: 5.1.6(encoding@0.1.13) @@ -23157,7 +23167,7 @@ snapshots: semver: 6.3.1 string.prototype.matchall: 4.0.10 - eslint-plugin-svelte@2.38.0(eslint@9.9.1(jiti@1.21.6))(svelte@4.2.19)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)): + eslint-plugin-svelte@2.38.0(eslint@9.9.1(jiti@1.21.6))(svelte@4.2.19)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.3.3)): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)) '@jridgewell/sourcemap-codec': 1.5.0 @@ -23167,7 +23177,7 @@ snapshots: esutils: 2.0.3 known-css-properties: 0.30.0 postcss: 8.4.47 - postcss-load-config: 3.1.4(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)) + postcss-load-config: 3.1.4(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.3.3)) postcss-safe-parser: 6.0.0(postcss@8.4.47) postcss-selector-parser: 6.0.16 semver: 7.6.3 @@ -23529,12 +23539,12 @@ snapshots: dependencies: format: 0.2.2 - fauna-shell@1.2.1(@swc/core@1.3.106)(@types/node@22.13.5)(encoding@0.1.13)(typescript@5.6.3): + fauna-shell@1.2.1(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(encoding@0.1.13)(typescript@5.6.3): dependencies: '@inquirer/prompts': 3.3.2 - '@oclif/core': 2.15.0(@swc/core@1.3.106)(@types/node@22.13.5)(typescript@5.6.3) - '@oclif/plugin-help': 5.2.20(@swc/core@1.3.106)(@types/node@22.13.5)(typescript@5.6.3) - '@oclif/plugin-plugins': 2.4.7(@swc/core@1.3.106)(@types/node@22.13.5)(typescript@5.6.3) + '@oclif/core': 2.15.0(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3) + '@oclif/plugin-help': 5.2.20(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3) + '@oclif/plugin-plugins': 2.4.7(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3) chalk: 4.1.2 cli-table: 0.3.11 cli-ux: 4.9.3 @@ -23865,7 +23875,7 @@ snapshots: wide-align: 1.1.5 optional: true - gaxios@5.1.3: + gaxios@5.1.3(encoding@0.1.13): dependencies: extend: 3.0.2 https-proxy-agent: 5.0.1 @@ -23888,9 +23898,9 @@ snapshots: - supports-color optional: true - gcp-metadata@5.3.0: + gcp-metadata@5.3.0(encoding@0.1.13): dependencies: - gaxios: 5.1.3 + gaxios: 5.1.3(encoding@0.1.13) json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -26435,14 +26445,14 @@ snapshots: '@types/whatwg-url': 11.0.4 whatwg-url: 13.0.0 - mongodb@6.9.0(@aws-sdk/credential-providers@3.499.0)(gcp-metadata@5.3.0)(socks@2.7.1): + mongodb@6.9.0(@aws-sdk/credential-providers@3.499.0)(gcp-metadata@5.3.0(encoding@0.1.13))(socks@2.7.1): dependencies: '@mongodb-js/saslprep': 1.1.9 bson: 6.8.0 mongodb-connection-string-url: 3.0.0 optionalDependencies: '@aws-sdk/credential-providers': 3.499.0 - gcp-metadata: 5.3.0 + gcp-metadata: 5.3.0(encoding@0.1.13) socks: 2.7.1 morgan@1.10.0: @@ -27298,30 +27308,30 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.47 - postcss-load-config@3.1.4(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)): + postcss-load-config@3.1.4(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.3.3)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.3.3) + ts-node: 10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.3.3) - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.6.3)): dependencies: lilconfig: 3.1.1 yaml: 2.3.4 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.3.3) - optional: true + ts-node: 10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.6.3) - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.6.3)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.2.2)): dependencies: lilconfig: 3.1.1 yaml: 2.3.4 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.2.2) + optional: true postcss-merge-rules@6.1.1(postcss@8.4.47): dependencies: @@ -27415,6 +27425,8 @@ snapshots: postgres@3.4.3: {} + postgres@3.4.7: {} + pouchdb-abstract-mapreduce@8.0.1(encoding@0.1.13): dependencies: pouchdb-binary-utils: 8.0.1 @@ -29111,7 +29123,7 @@ snapshots: transitivePeerDependencies: - ws - svelte-check@2.10.2(@babel/core@7.23.9)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)))(postcss@8.4.47)(pug@3.0.2)(sass@1.70.0)(svelte@4.2.19): + svelte-check@2.10.2(@babel/core@7.23.9)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.2.2)))(postcss@8.4.47)(pug@3.0.2)(sass@1.70.0)(svelte@4.2.19): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 @@ -29120,7 +29132,7 @@ snapshots: picocolors: 1.0.0 sade: 1.8.1 svelte: 4.2.19 - svelte-preprocess: 4.10.7(@babel/core@7.23.9)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)))(postcss@8.4.47)(pug@3.0.2)(sass@1.70.0)(svelte@4.2.19)(typescript@5.4.5) + svelte-preprocess: 4.10.7(@babel/core@7.23.9)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.2.2)))(postcss@8.4.47)(pug@3.0.2)(sass@1.70.0)(svelte@4.2.19)(typescript@5.4.5) typescript: 5.4.5 transitivePeerDependencies: - '@babel/core' @@ -29160,7 +29172,7 @@ snapshots: dependencies: svelte: 4.2.19 - svelte-preprocess@4.10.7(@babel/core@7.23.9)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)))(postcss@8.4.47)(pug@3.0.2)(sass@1.70.0)(svelte@4.2.19)(typescript@5.4.5): + svelte-preprocess@4.10.7(@babel/core@7.23.9)(postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.2.2)))(postcss@8.4.47)(pug@3.0.2)(sass@1.70.0)(svelte@4.2.19)(typescript@5.4.5): dependencies: '@types/pug': 2.0.10 '@types/sass': 1.45.0 @@ -29172,7 +29184,7 @@ snapshots: optionalDependencies: '@babel/core': 7.23.9 postcss: 8.4.47 - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.2.2)) pug: 3.0.2 sass: 1.70.0 typescript: 5.4.5 @@ -29221,7 +29233,7 @@ snapshots: tabbable@6.2.0: {} - tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.6.3)): + tailwindcss@3.4.13(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.6.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -29240,7 +29252,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.6.3)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.6.3)) postcss-nested: 6.0.1(postcss@8.4.47) postcss-selector-parser: 6.0.16 resolve: 1.22.8 @@ -29459,27 +29471,28 @@ snapshots: '@ts-morph/common': 0.20.0 code-block-writer: 12.0.0 - ts-node@10.9.2(@swc/core@1.3.106)(@types/node@22.13.5)(typescript@5.6.3): + ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.3.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.13.5 + '@types/node': 20.12.7 acorn: 8.12.1 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.3 + typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.3.106(@swc/helpers@0.5.15) + optional: true - ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3): + ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@20.12.7)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -29493,30 +29506,54 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.3.106(@swc/helpers@0.5.15) optional: true - ts-node@10.9.2(@types/node@20.12.7)(typescript@5.6.3): + ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.2.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.12.7 + '@types/node': 22.13.5 acorn: 8.12.1 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.3 + typescript: 5.2.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.3.106(@swc/helpers@0.5.15) optional: true + ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.13.5 + acorn: 8.12.1 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.6.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.3.106(@swc/helpers@0.5.15) + ts-pattern@5.0.5: {} tsconfck@2.1.2(typescript@5.6.3): @@ -29672,11 +29709,11 @@ snapshots: typescript: 5.6.3 yaml: 2.7.0 - typeorm-naming-strategies@4.1.0(typeorm@0.3.17(ioredis@5.4.1)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(pg@8.11.3)(redis@4.6.12)(sqlite3@5.1.6(encoding@0.1.13))(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3))): + typeorm-naming-strategies@4.1.0(typeorm@0.3.17(ioredis@5.4.1)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(pg@8.11.3)(redis@4.6.12)(sqlite3@5.1.6(encoding@0.1.13))(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3))): dependencies: - typeorm: 0.3.17(ioredis@5.4.1)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(pg@8.11.3)(redis@4.6.12)(sqlite3@5.1.6(encoding@0.1.13))(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)) + typeorm: 0.3.17(ioredis@5.4.1)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(pg@8.11.3)(redis@4.6.12)(sqlite3@5.1.6(encoding@0.1.13))(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)) - typeorm@0.3.17(ioredis@5.4.1)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(pg@8.11.3)(redis@4.6.12)(sqlite3@5.1.6(encoding@0.1.13))(ts-node@10.9.2(@types/node@20.12.7)(typescript@5.3.3)): + typeorm@0.3.17(ioredis@5.4.1)(mssql@7.3.5(encoding@0.1.13))(mysql2@3.9.7)(pg@8.11.3)(redis@4.6.12)(sqlite3@5.1.6(encoding@0.1.13))(ts-node@10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3)): dependencies: '@sqltools/formatter': 1.2.5 app-root-path: 3.1.0 @@ -29700,7 +29737,7 @@ snapshots: pg: 8.11.3 redis: 4.6.12 sqlite3: 5.1.6(encoding@0.1.13) - ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.3.3) + ts-node: 10.9.2(@swc/core@1.3.106(@swc/helpers@0.5.15))(@types/node@22.13.5)(typescript@5.6.3) transitivePeerDependencies: - supports-color diff --git a/turbo.json b/turbo.json index 240427e652..1939565ce8 100644 --- a/turbo.json +++ b/turbo.json @@ -107,6 +107,7 @@ "@auth/mongodb-adapter#build", "@auth/neo4j-adapter#build", "@auth/pg-adapter#build", + "@auth/pgjs-adapter#build", "@auth/pouchdb-adapter#build", "@auth/prisma-adapter#build", "@auth/sequelize-adapter#build",