From 575aecd33fe29cf73c56e677bf81d50d69b13174 Mon Sep 17 00:00:00 2001 From: Sven Sauleau Date: Wed, 22 Feb 2023 16:49:51 +0000 Subject: [PATCH] test neon --- .github/workflows/deploy.yml | 3 +- backend/src/accounts/getAccount.ts | 2 +- backend/src/activitypub/peers.ts | 19 +- backend/src/database/d1.ts | 31 +- backend/src/database/index.ts | 20 +- backend/src/database/local.ts | 105 ++ backend/src/database/neon.ts | 116 ++ backend/src/mastodon/timeline.ts | 18 +- backend/src/middleware/main.ts | 2 +- backend/src/types/env.ts | 8 + backend/src/webfinger/index.ts | 3 +- backend/test/mastodon/apps.spec.ts | 2 + backend/test/mastodon/statuses.spec.ts | 4 +- backend/test/utils.ts | 6 +- consumer/package.json | 7 +- consumer/src/deliver.ts | 4 +- consumer/src/inbox.ts | 2 +- consumer/src/index.ts | 2 +- consumer/yarn.lock | 1263 +++++++++-------- .../routes/(admin)/oauth/authorize/index.tsx | 7 +- .../[accountId]/[statusId]/index.tsx | 10 +- .../routes/(frontend)/[accountId]/index.tsx | 3 +- .../routes/(frontend)/[accountId]/layout.tsx | 5 +- .../[accountId]/with_replies/index.tsx | 3 +- .../src/routes/(frontend)/explore/index.tsx | 3 +- .../src/routes/(frontend)/public/index.tsx | 3 +- .../routes/(frontend)/public/local/index.tsx | 3 +- functions/.well-known/webfinger.ts | 2 +- functions/ap/o/[id].ts | 2 +- functions/ap/users/[id].ts | 2 +- functions/ap/users/[id]/followers.ts | 2 +- functions/ap/users/[id]/followers/page.ts | 2 +- functions/ap/users/[id]/following.ts | 2 +- functions/ap/users/[id]/following/page.ts | 2 +- functions/ap/users/[id]/inbox.ts | 2 +- functions/ap/users/[id]/outbox.ts | 2 +- functions/ap/users/[id]/outbox/page.ts | 2 +- functions/api/v1/accounts/[id].ts | 2 +- functions/api/v1/accounts/[id]/follow.ts | 2 +- functions/api/v1/accounts/[id]/followers.ts | 2 +- functions/api/v1/accounts/[id]/following.ts | 2 +- functions/api/v1/accounts/[id]/statuses.ts | 8 +- functions/api/v1/accounts/[id]/unfollow.ts | 2 +- functions/api/v1/accounts/relationships.ts | 2 +- .../api/v1/accounts/update_credentials.ts | 2 +- .../api/v1/accounts/verify_credentials.ts | 2 +- functions/api/v1/apps.ts | 2 +- functions/api/v1/apps/verify_credentials.ts | 3 +- functions/api/v1/instance/peers.ts | 2 +- functions/api/v1/notifications/[id].ts | 2 +- functions/api/v1/push/subscription.ts | 4 +- functions/api/v1/statuses.ts | 2 +- functions/api/v1/statuses/[id].ts | 4 +- functions/api/v1/statuses/[id]/context.ts | 2 +- functions/api/v1/statuses/[id]/favourite.ts | 2 +- functions/api/v1/statuses/[id]/reblog.ts | 2 +- functions/api/v1/tags/[tag].ts | 2 +- functions/api/v1/timelines/public.ts | 2 +- functions/api/v1/timelines/tag/[tag].ts | 2 +- functions/api/v2/instance.ts | 2 +- functions/api/v2/media.ts | 2 +- functions/api/v2/media/[id].ts | 2 +- functions/api/v2/search.ts | 2 +- functions/api/wb/settings/account/alias.ts | 2 +- functions/first-login.ts | 2 +- functions/oauth/authorize.ts | 2 +- functions/oauth/token.ts | 2 +- functions/test.ts | 13 + package.json | 4 + postgresql.sql | 165 +++ tf/main.tf | 2 +- yarn.lock | 180 ++- 72 files changed, 1354 insertions(+), 755 deletions(-) create mode 100644 backend/src/database/local.ts create mode 100644 backend/src/database/neon.ts create mode 100644 functions/test.ts create mode 100644 postgresql.sql diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 24d4cb7..ed22101 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,7 +2,7 @@ name: Deploy on: push: branches: - - main + - sven/neon repository_dispatch: jobs: deploy: @@ -273,6 +273,7 @@ jobs: echo -e "DOMAIN=\"${{ vars.CF_DEPLOY_DOMAIN }}\"\n" >> consumer/wrangler.toml echo -e "ADMIN_EMAIL=\"${{ vars.ADMIN_EMAIL }}\"\n" >> consumer/wrangler.toml + yarn yarn --cwd consumer/ echo "******" command: publish --config consumer/wrangler.toml diff --git a/backend/src/accounts/getAccount.ts b/backend/src/accounts/getAccount.ts index 304ba8a..959e3fc 100644 --- a/backend/src/accounts/getAccount.ts +++ b/backend/src/accounts/getAccount.ts @@ -24,7 +24,7 @@ export async function getAccount(domain: string, accountId: string, db: Database } } -async function getRemoteAccount(handle: Handle, acct: string, db: D1Database): Promise { +async function getRemoteAccount(handle: Handle, acct: string, db: Database): Promise { // TODO: using webfinger isn't the optimal implementation. We could cache // the object in D1 and directly query the remote API, indicated by the actor's // url field. For now, let's keep it simple. diff --git a/backend/src/activitypub/peers.ts b/backend/src/activitypub/peers.ts index 3f05220..3246c3e 100644 --- a/backend/src/activitypub/peers.ts +++ b/backend/src/activitypub/peers.ts @@ -9,13 +9,18 @@ export async function getPeers(db: Database): Promise> { } export async function addPeer(db: Database, domain: string): Promise { - const query = ` - INSERT OR IGNORE INTO peers (domain) - VALUES (?) - ` + try { + const query = ` + INSERT INTO peers (domain) + VALUES (?) + ` - const out = await db.prepare(query).bind(domain).run() - if (!out.success) { - throw new Error('SQL error: ' + out.error) + const out = await db.prepare(query).bind(domain).run() + if (!out.success) { + throw new Error('SQL error: ' + out.error) + } + } catch (err: any) { + console.warn(err.stack); + // handle peer already exists for psql } } diff --git a/backend/src/database/d1.ts b/backend/src/database/d1.ts index 576bdce..9b30171 100644 --- a/backend/src/database/d1.ts +++ b/backend/src/database/d1.ts @@ -1,6 +1,31 @@ -import { type Database } from 'wildebeest/backend/src/database' +import { type Database, QueryBuilder } from 'wildebeest/backend/src/database' import type { Env } from 'wildebeest/backend/src/types/env' -export default function make(env: Env): Database { - return env.DATABASE +const qb: QueryBuilder = { + jsonExtract(obj: string, prop: string): string { + return `json_extract(${obj}, '$.${prop}')` + }, + + jsonExtractIsNull(obj: string, prop: string): string { + return `${qb.jsonExtract(obj, prop)} IS NULL` + }, + + set(array: string): string { + return `(SELECT value FROM json_each(${array}))` + }, + + psql(raw: string): string { + return '' + }, + + epoch(): string { + return '00-00-00 00:00:00' + }, +} + +export default function make(env: Env): Database { + const db = env.DATABASE as any + db.qb = qb + + return db as Database } diff --git a/backend/src/database/index.ts b/backend/src/database/index.ts index ca8fbe4..e0ea419 100644 --- a/backend/src/database/index.ts +++ b/backend/src/database/index.ts @@ -1,5 +1,6 @@ import type { Env } from 'wildebeest/backend/src/types/env' import d1 from './d1' +import neon from './neon' export interface Result { results?: T[] @@ -9,6 +10,7 @@ export interface Result { } export interface Database { + qb: QueryBuilder prepare(query: string): PreparedStatement dump(): Promise batch(statements: PreparedStatement[]): Promise[]> @@ -23,6 +25,20 @@ export interface PreparedStatement { raw(): Promise } -export function getDatabase(env: Env): Database { - return d1(env) +export interface QueryBuilder { + jsonExtract(obj: string, prop: string): string + jsonExtractIsNull(obj: string, prop: string): string + set(array: string): string + psql(raw: string): string + epoch(): string +} + +const isTesting = typeof jest !== 'undefined' + +export async function getDatabase(env: Env): Promise { + if (isTesting) { + return d1(env) + } else { + return neon(env) + } } diff --git a/backend/src/database/local.ts b/backend/src/database/local.ts new file mode 100644 index 0000000..c93d912 --- /dev/null +++ b/backend/src/database/local.ts @@ -0,0 +1,105 @@ +import * as pg from 'pg' +import type { Database, Result } from 'wildebeest/backend/src/database' +import type { Env } from 'wildebeest/backend/src/types/env' + +function sqliteToPsql(query: string): string { + let c = 0 + return query.replaceAll(/\?([0-9])?/g, (match: string, p1: string) => { + c += 1 + return `$${p1 || c}` + }) +} + +export default function make(env: Env): Database { + return { + prepare(query: string) { + return new PreparedStatement(env, query, []) + }, + + dump() { + throw new Error('not implemented') + }, + + async batch(statements: PreparedStatement[]): Promise[]> { + console.log(statements) + throw new Error('not implemented') + }, + + async exec(query: string): Promise> { + console.log(query) + throw new Error('not implemented') + }, + } +} + +export class PreparedStatement { + private env: Env + private query: string + private values: any[] + + constructor(env: Env, query: string, values: any[]) { + this.env = env + this.query = query + this.values = values + } + + bind(...values: any[]): PreparedStatement { + return new PreparedStatement(this.env, this.query, [...this.values, ...values]) + } + + private async connect() { + const s = 'postgres://postgres:postgres@127.0.0.1/postgres' + const client = new pg.Client(s) + await client.connect() + + return client + } + + async first(colName?: string): Promise { + const conn = await this.connect() + try { + if (colName) { + throw new Error('not implemented') + } + const query = sqliteToPsql(this.query) + + console.log(query, this.values) + const results = await conn.query(query, this.values) + console.log({ rowCount: results.rowCount }) + if (results.rows.length !== 1) { + throw new Error(`expected a single row, returned ${results.rows.length} row(s)`) + } + + return results.rows[0] as T + } finally { + await conn.end() + } + } + + async run(): Promise> { + return this.all() + } + + async all(): Promise> { + const conn = await this.connect() + + try { + const query = sqliteToPsql(this.query) + console.log(query, this.values) + const results = await conn.query(query, this.values) + console.log({ rowCount: results.rowCount }) + + return { + results: results.rows as T[], + success: true, + meta: {}, + } + } finally { + await conn.end() + } + } + + async raw(): Promise { + throw new Error('not implemented') + } +} diff --git a/backend/src/database/neon.ts b/backend/src/database/neon.ts new file mode 100644 index 0000000..62b7791 --- /dev/null +++ b/backend/src/database/neon.ts @@ -0,0 +1,116 @@ +import * as neon from '@neondatabase/serverless' +import type { Database, Result, QueryBuilder } from 'wildebeest/backend/src/database' +import type { Env } from 'wildebeest/backend/src/types/env' + +function sqliteToPsql(query: string): string { + let c = 0 + return query.replaceAll(/\?([0-9])?/g, (match: string, p1: string) => { + c += 1 + return `$${p1 || c}` + }) +} + +const qb: QueryBuilder = { + jsonExtract(obj: string, prop: string): string { + return `json_extract_path(${obj}::json, '${prop}')::text` + }, + + jsonExtractIsNull(obj: string, prop: string): string { + return `${qb.jsonExtract(obj, prop)} = 'null'` + }, + + set(array: string): string { + return `(SELECT value::text FROM json_array_elements_text(${array}))` + }, + + psql(raw: string): string { + return raw + }, + + epoch(): string { + return 'epoch' + }, +} + +export default async function make(env: Env): Promise { + const client = new neon.Client(env.NEON_DATABASE_URL!) + console.log(env.NEON_DATABASE_URL!) + await client.connect() + + return { + qb, + + prepare(query: string) { + return new PreparedStatement(env, query, [], client) + }, + + dump() { + throw new Error('not implemented') + }, + + async batch(statements: PreparedStatement[]): Promise[]> { + console.log(statements) + throw new Error('not implemented') + }, + + async exec(query: string): Promise> { + console.log(query) + throw new Error('not implemented') + }, + } +} + +export class PreparedStatement { + private env: Env + private client: neon.Client + private query: string + private values: any[] + + constructor(env: Env, query: string, values: any[], client: neon.Client) { + this.env = env + this.query = query + this.values = values + this.client = client + } + + bind(...values: any[]): PreparedStatement { + return new PreparedStatement(this.env, this.query, [...this.values, ...values], this.client) + } + + async first(colName?: string): Promise { + if (colName) { + throw new Error('not implemented') + } + const query = sqliteToPsql(this.query) + + console.log(query, this.values) + const results = await this.client.query(query, this.values) + console.log({ results }) + if (results.rows.length !== 1) { + throw new Error(`expected a single row, returned ${results.rows.length} row(s)`) + } + + return results.rows[0] as T + } + + async run(): Promise> { + return this.all() + } + + async all(): Promise> { + const query = sqliteToPsql(this.query) + console.log(query, this.values) + const results = await this.client.query(query, this.values) + console.log({ results }) + + return { + results: results.rows as T[], + success: true, + meta: {}, + } + } + + async raw(): Promise { + throw new Error('not implemented') + } +} diff --git a/backend/src/mastodon/timeline.ts b/backend/src/mastodon/timeline.ts index 57c945b..c09323f 100644 --- a/backend/src/mastodon/timeline.ts +++ b/backend/src/mastodon/timeline.ts @@ -16,7 +16,7 @@ export async function getHomeTimeline(domain: string, db: Database, actor: Actor ` SELECT actor_following.target_actor_id as id, - json_extract(actors.properties, '$.followers') as actorFollowersURL + ${db.qb.jsonExtract('actors.properties', 'followers')} as actorFollowersURL FROM actor_following INNER JOIN actors ON actors.id = actor_following.target_actor_id WHERE actor_id=? AND state='accepted' @@ -60,10 +60,10 @@ INNER JOIN objects ON objects.id = outbox_objects.object_id INNER JOIN actors ON actors.id = outbox_objects.actor_id WHERE objects.type = 'Note' - AND outbox_objects.actor_id IN (SELECT value FROM json_each(?2)) - AND json_extract(objects.properties, '$.inReplyTo') IS NULL - AND (outbox_objects.target = '${PUBLIC_GROUP}' OR outbox_objects.target IN (SELECT value FROM json_each(?3))) -GROUP BY objects.id + AND outbox_objects.actor_id IN ${db.qb.set('?2')} + AND ${db.qb.jsonExtractIsNull('objects.properties', 'inReplyTo')} + AND (outbox_objects.target = '${PUBLIC_GROUP}' OR outbox_objects.target IN ${db.qb.set('?3')}) +GROUP BY objects.id ${db.qb.psql(', actors.id, outbox_objects.actor_id, outbox_objects.published_date')} ORDER by outbox_objects.published_date DESC LIMIT ?4 ` @@ -101,7 +101,7 @@ export enum LocalPreference { function localPreferenceQuery(preference: LocalPreference): string { switch (preference) { case LocalPreference.NotSet: - return '1' + return 'true' case LocalPreference.OnlyLocal: return 'objects.local = 1' case LocalPreference.OnlyRemote: @@ -136,10 +136,12 @@ INNER JOIN actors ON actors.id=outbox_objects.actor_id LEFT JOIN note_hashtags ON objects.id=note_hashtags.object_id WHERE objects.type='Note' AND ${localPreferenceQuery(localPreference)} - AND json_extract(objects.properties, '$.inReplyTo') IS NULL + AND ${db.qb.jsonExtractIsNull('objects.properties', 'inReplyTo')} AND outbox_objects.target = '${PUBLIC_GROUP}' ${hashtagFilter} -GROUP BY objects.id +GROUP BY objects.id ${db.qb.psql( + ', actors.id, actors.cdate, actors.properties, outbox_objects.actor_id, outbox_objects.published_date' + )} ORDER by outbox_objects.published_date DESC LIMIT ?1 OFFSET ?2 ` diff --git a/backend/src/middleware/main.ts b/backend/src/middleware/main.ts index dd10e80..f226e8b 100644 --- a/backend/src/middleware/main.ts +++ b/backend/src/middleware/main.ts @@ -97,7 +97,7 @@ export async function main(context: EventContext) { // configuration, which are used to verify the JWT. // TODO: since we don't load the instance configuration anymore, we // don't need to load the user before anymore. - if (!(await loadContextData(getDatabase(context.env), clientId, payload.email, context))) { + if (!(await loadContextData(await getDatabase(context.env), clientId, payload.email, context))) { return errors.notAuthorized('failed to load context data') } diff --git a/backend/src/types/env.ts b/backend/src/types/env.ts index d849c5e..51525dd 100644 --- a/backend/src/types/env.ts +++ b/backend/src/types/env.ts @@ -25,4 +25,12 @@ export interface Env { SENTRY_DSN: string SENTRY_ACCESS_CLIENT_ID: string SENTRY_ACCESS_CLIENT_SECRET: string + + NEON_DATABASE_URL?: string + + PSQL_DATABASE_URL?: string + + PSCALE_HOST?: string + PSCALE_USERNAME?: string + PSCALE_PASSWORD?: string } diff --git a/backend/src/webfinger/index.ts b/backend/src/webfinger/index.ts index e0f8502..5fd011b 100644 --- a/backend/src/webfinger/index.ts +++ b/backend/src/webfinger/index.ts @@ -1,4 +1,5 @@ import * as actors from '../activitypub/actors' +import { type Database } from 'wildebeest/backend/src/database' import type { Actor } from '../activitypub/actors' export type WebFingerResponse = { @@ -11,7 +12,7 @@ const headers = { accept: 'application/jrd+json', } -export async function queryAcct(domain: string, db: D1Database, acct: string): Promise { +export async function queryAcct(domain: string, db: Database, acct: string): Promise { const url = await queryAcctLink(domain, acct) if (url === null) { return null diff --git a/backend/test/mastodon/apps.spec.ts b/backend/test/mastodon/apps.spec.ts index b80edc7..998a2fa 100644 --- a/backend/test/mastodon/apps.spec.ts +++ b/backend/test/mastodon/apps.spec.ts @@ -76,12 +76,14 @@ describe('Mastodon APIs', () => { }) test('GET /apps is bad request', async () => { + const db = await makeDB() const vapidKeys = await generateVAPIDKeys() const request = new Request('https://example.com') const ctx: any = { next: () => new Response(), data: null, env: { + DATABASE: db, VAPID_JWK: JSON.stringify(vapidKeys), }, request, diff --git a/backend/test/mastodon/statuses.spec.ts b/backend/test/mastodon/statuses.spec.ts index d81c05f..3e834dd 100644 --- a/backend/test/mastodon/statuses.spec.ts +++ b/backend/test/mastodon/statuses.spec.ts @@ -81,7 +81,7 @@ describe('Mastodon APIs', () => { .prepare( ` SELECT - json_extract(properties, '$.content') as content, + ${db.qb.jsonExtract('properties', 'content')} as content, original_actor_id, original_object_id FROM objects @@ -758,7 +758,7 @@ describe('Mastodon APIs', () => { const row = await db .prepare( ` - SELECT json_extract(properties, '$.inReplyTo') as inReplyTo + SELECT ${db.qb.jsonExtract('properties', 'inReplyTo')} as inReplyTo FROM objects WHERE mastodon_id=? ` diff --git a/backend/test/utils.ts b/backend/test/utils.ts index f0b1471..8aadb94 100644 --- a/backend/test/utils.ts +++ b/backend/test/utils.ts @@ -8,7 +8,8 @@ import { promises as fs } from 'fs' import * as path from 'path' import { BetaDatabase } from '@miniflare/d1' import * as SQLiteDatabase from 'better-sqlite3' -import { type Database } from 'wildebeest/backend/src/database' +import { type Database, getDatabase } from 'wildebeest/backend/src/database' +import d1 from 'wildebeest/backend/src/database/d1' export function isUrlValid(s: string) { let url @@ -32,7 +33,8 @@ export async function makeDB(): Promise { db.exec(content) } - return db2 as unknown as Database + const env = { DATABASE: db2 } as any + return d1(env) } export function assertCORS(response: Response) { diff --git a/consumer/package.json b/consumer/package.json index daa98d5..514ac50 100644 --- a/consumer/package.json +++ b/consumer/package.json @@ -3,9 +3,14 @@ "version": "0.0.0", "devDependencies": { "@cloudflare/workers-types": "^4.20221111.1", + "@neondatabase/serverless": "^0.2.5", "toucan-js": "^3.1.0", "typescript": "^4.9.4", "wrangler": "2.7.1" }, - "private": true + "private": true, + "dependencies": { + "@planetscale/database": "^1.5.0", + "pg": "^8.9.0" + } } diff --git a/consumer/src/deliver.ts b/consumer/src/deliver.ts index 0e4021b..6877857 100644 --- a/consumer/src/deliver.ts +++ b/consumer/src/deliver.ts @@ -8,12 +8,12 @@ import { deliverToActor } from 'wildebeest/backend/src/activitypub/deliver' export async function handleDeliverMessage(env: Env, actor: Actor, message: DeliverMessageBody) { const toActorId = new URL(message.toActorId) - const targetActor = await actors.getAndCache(toActorId, getDatabase(env as any)) + const targetActor = await actors.getAndCache(toActorId, await getDatabase(env as any)) if (targetActor === null) { console.warn(`actor ${toActorId} not found`) return } - const signingKey = await getSigningKey(message.userKEK, getDatabase(env as any), actor) + const signingKey = await getSigningKey(message.userKEK, await getDatabase(env as any), actor) await deliverToActor(signingKey, actor, targetActor, message.activity, env.DOMAIN) } diff --git a/consumer/src/inbox.ts b/consumer/src/inbox.ts index 8c54d5b..69db723 100644 --- a/consumer/src/inbox.ts +++ b/consumer/src/inbox.ts @@ -9,7 +9,7 @@ import type { Env } from './' export async function handleInboxMessage(env: Env, actor: Actor, message: InboxMessageBody) { const domain = env.DOMAIN - const db = getDatabase(env as any) + const db = await getDatabase(env as any) const adminEmail = env.ADMIN_EMAIL const cache = cacheFromEnv(env) const activity = message.activity diff --git a/consumer/src/index.ts b/consumer/src/index.ts index 0881094..f36f2d1 100644 --- a/consumer/src/index.ts +++ b/consumer/src/index.ts @@ -20,7 +20,7 @@ export type Env = { export default { async queue(batch: MessageBatch, env: Env, ctx: ExecutionContext) { const sentry = initSentryQueue(env, ctx) - const db = getDatabase(env as any) + const db = await getDatabase(env as any) try { for (const message of batch.messages) { diff --git a/consumer/yarn.lock b/consumer/yarn.lock index b27d472..2733895 100644 --- a/consumer/yarn.lock +++ b/consumer/yarn.lock @@ -3,584 +3,499 @@ "@cloudflare/kv-asset-handler@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz#c9959bbd7a1c40bd7c674adae98aa8c8d0e5ca68" - integrity sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A== + "integrity" "sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==" + "resolved" "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz" + "version" "0.2.0" dependencies: - mime "^3.0.0" + "mime" "^3.0.0" "@cloudflare/workers-types@^4.20221111.1": - version "4.20230115.0" - resolved "https://registry.yarnpkg.com/@cloudflare/workers-types/-/workers-types-4.20230115.0.tgz#84e6c7b1a753098dbc7cd718fdcf191c215225af" - integrity sha512-GPJEiO8AFN+jUpA+DHJ1qdVmk4s/hq8JYKjOV/+U7avGquQbVnj905+Kg6uAEfrq16muwmRKl+XJGqsvlBlDNg== + "integrity" "sha512-GPJEiO8AFN+jUpA+DHJ1qdVmk4s/hq8JYKjOV/+U7avGquQbVnj905+Kg6uAEfrq16muwmRKl+XJGqsvlBlDNg==" + "resolved" "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20230115.0.tgz" + "version" "4.20230115.0" "@esbuild-plugins/node-globals-polyfill@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz#a313ab3efbb2c17c8ce376aa216c627c9b40f9d7" - integrity sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg== + "integrity" "sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==" + "resolved" "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz" + "version" "0.1.1" "@esbuild-plugins/node-modules-polyfill@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.1.4.tgz#eb2f55da11967b2986c913f1a7957d1c868849c0" - integrity sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg== + "integrity" "sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==" + "resolved" "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.1.4.tgz" + "version" "0.1.4" dependencies: - escape-string-regexp "^4.0.0" - rollup-plugin-node-polyfills "^0.2.1" + "escape-string-regexp" "^4.0.0" + "rollup-plugin-node-polyfills" "^0.2.1" "@iarna/toml@^2.2.5": - version "2.2.5" - resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" - integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + "integrity" "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + "resolved" "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz" + "version" "2.2.5" "@miniflare/cache@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/cache/-/cache-2.11.0.tgz#e13f4a860ebe01fc67f0169e76be93350c29d7ff" - integrity sha512-L/kc9AzidPwFuk2fwHpAEePi0kNBk6FWUq3ln+9beRCDrPEpfVrDRFpNleF1NFZz5//oeVMuo8F0IVUQGzR7+Q== + "integrity" "sha512-L/kc9AzidPwFuk2fwHpAEePi0kNBk6FWUq3ln+9beRCDrPEpfVrDRFpNleF1NFZz5//oeVMuo8F0IVUQGzR7+Q==" + "resolved" "https://registry.npmjs.org/@miniflare/cache/-/cache-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/core" "2.11.0" "@miniflare/shared" "2.11.0" - http-cache-semantics "^4.1.0" - undici "5.9.1" + "http-cache-semantics" "^4.1.0" + "undici" "5.9.1" "@miniflare/cli-parser@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/cli-parser/-/cli-parser-2.11.0.tgz#47f517731791c9e652e9849d590fde3235737529" - integrity sha512-JUmyRzEGAS6CouvXJwBh8p44onfw3KRpfq5JGXEuHModOGjTp6li7PQyCTNPV2Hv/7StAXWnTFGXeAqyDHuTig== + "integrity" "sha512-JUmyRzEGAS6CouvXJwBh8p44onfw3KRpfq5JGXEuHModOGjTp6li7PQyCTNPV2Hv/7StAXWnTFGXeAqyDHuTig==" + "resolved" "https://registry.npmjs.org/@miniflare/cli-parser/-/cli-parser-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/shared" "2.11.0" - kleur "^4.1.4" + "kleur" "^4.1.4" "@miniflare/core@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/core/-/core-2.11.0.tgz#68efb7c9bab0d56bdf284b704089b035cd0b1a28" - integrity sha512-UFMFiCG0co36VpZkgFrSBnrxo71uf1x+cjlzzJi3khmMyDlnLu4RuIQsAqvKbYom6fi3G9Q8lTgM7JuOXFyjhw== + "integrity" "sha512-UFMFiCG0co36VpZkgFrSBnrxo71uf1x+cjlzzJi3khmMyDlnLu4RuIQsAqvKbYom6fi3G9Q8lTgM7JuOXFyjhw==" + "resolved" "https://registry.npmjs.org/@miniflare/core/-/core-2.11.0.tgz" + "version" "2.11.0" dependencies: "@iarna/toml" "^2.2.5" "@miniflare/queues" "2.11.0" "@miniflare/shared" "2.11.0" "@miniflare/watcher" "2.11.0" - busboy "^1.6.0" - dotenv "^10.0.0" - kleur "^4.1.4" - set-cookie-parser "^2.4.8" - undici "5.9.1" - urlpattern-polyfill "^4.0.3" + "busboy" "^1.6.0" + "dotenv" "^10.0.0" + "kleur" "^4.1.4" + "set-cookie-parser" "^2.4.8" + "undici" "5.9.1" + "urlpattern-polyfill" "^4.0.3" "@miniflare/d1@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/d1/-/d1-2.11.0.tgz#1c340abe1c50cce27432b100d78b345b45e60b10" - integrity sha512-aDdBVQZ2C0Zs3+Y9ZbRctmuQxozPfpumwJ/6NG6fBadANvune/hW7ddEoxyteIEU9W3IgzVj8s4by4VvasX90A== + "integrity" "sha512-aDdBVQZ2C0Zs3+Y9ZbRctmuQxozPfpumwJ/6NG6fBadANvune/hW7ddEoxyteIEU9W3IgzVj8s4by4VvasX90A==" + "resolved" "https://registry.npmjs.org/@miniflare/d1/-/d1-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/core" "2.11.0" "@miniflare/shared" "2.11.0" "@miniflare/durable-objects@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/durable-objects/-/durable-objects-2.11.0.tgz#4c53c27a939e022a1de47ee338cec395cbb9e24d" - integrity sha512-0cKJaMgraTEU1b4kqK8cjD2oTeOjA6QU3Y+lWiZT/k1PMHZULovrSFnjii7qZ8npf4VHSIN6XYPxhyxRyEM65Q== + "integrity" "sha512-0cKJaMgraTEU1b4kqK8cjD2oTeOjA6QU3Y+lWiZT/k1PMHZULovrSFnjii7qZ8npf4VHSIN6XYPxhyxRyEM65Q==" + "resolved" "https://registry.npmjs.org/@miniflare/durable-objects/-/durable-objects-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/core" "2.11.0" "@miniflare/shared" "2.11.0" "@miniflare/storage-memory" "2.11.0" - undici "5.9.1" + "undici" "5.9.1" "@miniflare/html-rewriter@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/html-rewriter/-/html-rewriter-2.11.0.tgz#5e5e1292876feca3002b3a729dd8f892f7ef0d0c" - integrity sha512-olTqmuYTHnoTNtiA0vjQ/ixRfbwgPzDrAUbtXDCYW45VFbHfDVJrJGZX3Jg0HpSlxy86Zclle1SUxGbVDzxsBg== + "integrity" "sha512-olTqmuYTHnoTNtiA0vjQ/ixRfbwgPzDrAUbtXDCYW45VFbHfDVJrJGZX3Jg0HpSlxy86Zclle1SUxGbVDzxsBg==" + "resolved" "https://registry.npmjs.org/@miniflare/html-rewriter/-/html-rewriter-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/core" "2.11.0" "@miniflare/shared" "2.11.0" - html-rewriter-wasm "^0.4.1" - undici "5.9.1" + "html-rewriter-wasm" "^0.4.1" + "undici" "5.9.1" "@miniflare/http-server@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/http-server/-/http-server-2.11.0.tgz#76d2e2c6549528d965e5f48a8ddc3448c28d4569" - integrity sha512-sMLcrDFzqqAvnQmAUH0hRTo8sBjW79VZYfnIH5FAGSGcKX6kdAGs9RStdYZ4CftQCBAEQScX0KBsMx5FwJRe9Q== + "integrity" "sha512-sMLcrDFzqqAvnQmAUH0hRTo8sBjW79VZYfnIH5FAGSGcKX6kdAGs9RStdYZ4CftQCBAEQScX0KBsMx5FwJRe9Q==" + "resolved" "https://registry.npmjs.org/@miniflare/http-server/-/http-server-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/core" "2.11.0" "@miniflare/shared" "2.11.0" "@miniflare/web-sockets" "2.11.0" - kleur "^4.1.4" - selfsigned "^2.0.0" - undici "5.9.1" - ws "^8.2.2" - youch "^2.2.2" + "kleur" "^4.1.4" + "selfsigned" "^2.0.0" + "undici" "5.9.1" + "ws" "^8.2.2" + "youch" "^2.2.2" "@miniflare/kv@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/kv/-/kv-2.11.0.tgz#af162567e2d49ae533be60bca29eaf9486408a68" - integrity sha512-3m9dL2HBBN170V1JvwjjucR5zl4G3mlcsV6C1E7A2wLl2Z2TWvIx/tSY9hrhkD96dFnejwJ9qmPMbXMMuynhjg== + "integrity" "sha512-3m9dL2HBBN170V1JvwjjucR5zl4G3mlcsV6C1E7A2wLl2Z2TWvIx/tSY9hrhkD96dFnejwJ9qmPMbXMMuynhjg==" + "resolved" "https://registry.npmjs.org/@miniflare/kv/-/kv-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/shared" "2.11.0" "@miniflare/queues@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/queues/-/queues-2.11.0.tgz#feb48d1934b4f98d9bc605d0967140f8e70cc5be" - integrity sha512-fLHjdrNLKhn0LZM/aii/9GsAttFd+lWlGzK8HOg1R0vhfKBwEub4zntjMmOfFbDm1ntc21tdMK7n3ldUphwh5w== + "integrity" "sha512-fLHjdrNLKhn0LZM/aii/9GsAttFd+lWlGzK8HOg1R0vhfKBwEub4zntjMmOfFbDm1ntc21tdMK7n3ldUphwh5w==" + "resolved" "https://registry.npmjs.org/@miniflare/queues/-/queues-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/shared" "2.11.0" "@miniflare/r2@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/r2/-/r2-2.11.0.tgz#52f19d22b63b4d5e72d2b96ee514333a810dce7a" - integrity sha512-MKuyJ/gGNsK3eWbGdygvozqcyaZhM3C6NGHvoaZwH503dwN569j5DpatTWiHGFeDeSu64VqcIsGehz05GDUaag== + "integrity" "sha512-MKuyJ/gGNsK3eWbGdygvozqcyaZhM3C6NGHvoaZwH503dwN569j5DpatTWiHGFeDeSu64VqcIsGehz05GDUaag==" + "resolved" "https://registry.npmjs.org/@miniflare/r2/-/r2-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/shared" "2.11.0" - undici "5.9.1" + "undici" "5.9.1" "@miniflare/runner-vm@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/runner-vm/-/runner-vm-2.11.0.tgz#801c16ddbd360c3c8fcca84c43faaecfd2d4ef70" - integrity sha512-bkVSuvCf5+VylqN8lTiLxIYqYcKFbl+BywZGwGQndPC/3wh42J00mM0jw4hRbvXgwuBhlUyCVpEXtYlftFFT/g== + "integrity" "sha512-bkVSuvCf5+VylqN8lTiLxIYqYcKFbl+BywZGwGQndPC/3wh42J00mM0jw4hRbvXgwuBhlUyCVpEXtYlftFFT/g==" + "resolved" "https://registry.npmjs.org/@miniflare/runner-vm/-/runner-vm-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/shared" "2.11.0" "@miniflare/scheduler@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/scheduler/-/scheduler-2.11.0.tgz#2568d44f571e73355369be6a6da4481aa4af25c8" - integrity sha512-DPdzINhdWeS99eIicGoluMsD4pLTTAWNQbgCv3CTwgdKA3dxdvMSCkNqZzQLiALzvk9+rSfj46FlH++HE7o7/w== + "integrity" "sha512-DPdzINhdWeS99eIicGoluMsD4pLTTAWNQbgCv3CTwgdKA3dxdvMSCkNqZzQLiALzvk9+rSfj46FlH++HE7o7/w==" + "resolved" "https://registry.npmjs.org/@miniflare/scheduler/-/scheduler-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/core" "2.11.0" "@miniflare/shared" "2.11.0" - cron-schedule "^3.0.4" + "cron-schedule" "^3.0.4" "@miniflare/shared@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/shared/-/shared-2.11.0.tgz#12905f4b4310bdcc28169667d024ca6fab35a035" - integrity sha512-fWMqq3ZkWAg+k7CnyzMV/rZHugwn+/JxvVzCxrtvxzwotTN547THlOxgZe8JAP23U9BiTxOfpTfnLvFEjAmegw== + "integrity" "sha512-fWMqq3ZkWAg+k7CnyzMV/rZHugwn+/JxvVzCxrtvxzwotTN547THlOxgZe8JAP23U9BiTxOfpTfnLvFEjAmegw==" + "resolved" "https://registry.npmjs.org/@miniflare/shared/-/shared-2.11.0.tgz" + "version" "2.11.0" dependencies: "@types/better-sqlite3" "^7.6.0" - kleur "^4.1.4" - npx-import "^1.1.3" - picomatch "^2.3.1" + "kleur" "^4.1.4" + "npx-import" "^1.1.3" + "picomatch" "^2.3.1" "@miniflare/sites@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/sites/-/sites-2.11.0.tgz#f7849ed6cc13fd3a96a329b815828ed5e4f22df3" - integrity sha512-qbefKdWZUJgsdLf+kCw03sn3h/92LZgJAbkOpP6bCrfWkXlJ37EQXO4KWdhn4Ghc7A6GwU1s1I/mdB64B3AewQ== + "integrity" "sha512-qbefKdWZUJgsdLf+kCw03sn3h/92LZgJAbkOpP6bCrfWkXlJ37EQXO4KWdhn4Ghc7A6GwU1s1I/mdB64B3AewQ==" + "resolved" "https://registry.npmjs.org/@miniflare/sites/-/sites-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/kv" "2.11.0" "@miniflare/shared" "2.11.0" "@miniflare/storage-file" "2.11.0" "@miniflare/storage-file@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/storage-file/-/storage-file-2.11.0.tgz#eaa30899d6a369f9a0dca32859ff1b36db1f0bac" - integrity sha512-beWF/lTX74x7AiaSB+xQxywPSNdhtEKvqDkRui8eOJ5kqN2o4UaleLKQGgqmCw3WyHRIsckV7If1qpbNiLtWMw== + "integrity" "sha512-beWF/lTX74x7AiaSB+xQxywPSNdhtEKvqDkRui8eOJ5kqN2o4UaleLKQGgqmCw3WyHRIsckV7If1qpbNiLtWMw==" + "resolved" "https://registry.npmjs.org/@miniflare/storage-file/-/storage-file-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/shared" "2.11.0" "@miniflare/storage-memory" "2.11.0" "@miniflare/storage-memory@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/storage-memory/-/storage-memory-2.11.0.tgz#24b6ba299435a96dbe8929308c49cdd2346d2d25" - integrity sha512-s0AhPww7fq/Jz80NbPb+ffhcVRKnfPi7H1dHTRTre2Ud23EVJjAWl2gat42x8NOT/Fu3/o/7A72DWQQJqfO98A== + "integrity" "sha512-s0AhPww7fq/Jz80NbPb+ffhcVRKnfPi7H1dHTRTre2Ud23EVJjAWl2gat42x8NOT/Fu3/o/7A72DWQQJqfO98A==" + "resolved" "https://registry.npmjs.org/@miniflare/storage-memory/-/storage-memory-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/shared" "2.11.0" "@miniflare/watcher@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/watcher/-/watcher-2.11.0.tgz#4cfe96ed8131118de31287d7b2690758925f4505" - integrity sha512-RUfjz2iYcsQXLcGySemJl98CJ2iierbWsPGWZhIVZI+NNhROkEy77g/Q+lvP2ATwexG3/dUSfdJ3P8aH+sI4Ig== + "integrity" "sha512-RUfjz2iYcsQXLcGySemJl98CJ2iierbWsPGWZhIVZI+NNhROkEy77g/Q+lvP2ATwexG3/dUSfdJ3P8aH+sI4Ig==" + "resolved" "https://registry.npmjs.org/@miniflare/watcher/-/watcher-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/shared" "2.11.0" "@miniflare/web-sockets@2.11.0": - version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/web-sockets/-/web-sockets-2.11.0.tgz#1d4ef353c618a971c882efcc33ed37df9fa01af1" - integrity sha512-NC8RKrmxrO0hZmwpzn5g4hPGA2VblnFTIBobmWoxuK95eW49zfs7dtE/PyFs+blsGv3CjTIjHVSQ782K+C6HFA== + "integrity" "sha512-NC8RKrmxrO0hZmwpzn5g4hPGA2VblnFTIBobmWoxuK95eW49zfs7dtE/PyFs+blsGv3CjTIjHVSQ782K+C6HFA==" + "resolved" "https://registry.npmjs.org/@miniflare/web-sockets/-/web-sockets-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/core" "2.11.0" "@miniflare/shared" "2.11.0" - undici "5.9.1" - ws "^8.2.2" + "undici" "5.9.1" + "ws" "^8.2.2" + +"@neondatabase/serverless@^0.2.5": + "integrity" "sha512-Qu/nNZftfoqw4ojVCXU/EgYlfII3mzLm82iXNOUljFumPhoZ/Wp8NJG5DgSAKCWC0zwTyJsojdPLQDj/UPs2vg==" + "resolved" "https://registry.npmjs.org/@neondatabase/serverless/-/serverless-0.2.5.tgz" + "version" "0.2.5" + +"@planetscale/database@^1.5.0": + "integrity" "sha512-Qwh7Or1W5dB5mZ9EQqDkgvkDKhBBmQe58KIVUy0SGocNtr5fP4JAWtvZ6EdLAV6C6hVpzNlCA2xIg9lKTswm1Q==" + "resolved" "https://registry.npmjs.org/@planetscale/database/-/database-1.5.0.tgz" + "version" "1.5.0" "@sentry/core@7.28.1": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.28.1.tgz#c712ce17469b18b01606108817be24a99ed2116e" - integrity sha512-7wvnuvn/mrAfcugWoCG/3pqDIrUgH5t+HisMJMGw0h9Tc33KqrmqMDCQVvjlrr2pWrw/vuUCFdm8CbUHJ832oQ== + "integrity" "sha512-7wvnuvn/mrAfcugWoCG/3pqDIrUgH5t+HisMJMGw0h9Tc33KqrmqMDCQVvjlrr2pWrw/vuUCFdm8CbUHJ832oQ==" + "resolved" "https://registry.npmjs.org/@sentry/core/-/core-7.28.1.tgz" + "version" "7.28.1" dependencies: "@sentry/types" "7.28.1" "@sentry/utils" "7.28.1" - tslib "^1.9.3" + "tslib" "^1.9.3" "@sentry/types@7.28.1": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.28.1.tgz#9018b4c152b475de9bedd267237393d3c9b1253d" - integrity sha512-DvSplMVrVEmOzR2M161V5+B8Up3vR71xMqJOpWTzE9TqtFJRGPtqT/5OBsNJJw1+/j2ssMcnKwbEo9Q2EGeS6g== + "integrity" "sha512-DvSplMVrVEmOzR2M161V5+B8Up3vR71xMqJOpWTzE9TqtFJRGPtqT/5OBsNJJw1+/j2ssMcnKwbEo9Q2EGeS6g==" + "resolved" "https://registry.npmjs.org/@sentry/types/-/types-7.28.1.tgz" + "version" "7.28.1" "@sentry/utils@7.28.1": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.28.1.tgz#0a7b6aa4b09e91e4d1aded2a8c8dbaf818cee96e" - integrity sha512-75/jzLUO9HH09iC9TslNimGbxOP3jgn89P+q7uR+rp2fJfRExHVeKJZQdK0Ij4/SmE7TJ3Uh2r154N0INZEx1g== + "integrity" "sha512-75/jzLUO9HH09iC9TslNimGbxOP3jgn89P+q7uR+rp2fJfRExHVeKJZQdK0Ij4/SmE7TJ3Uh2r154N0INZEx1g==" + "resolved" "https://registry.npmjs.org/@sentry/utils/-/utils-7.28.1.tgz" + "version" "7.28.1" dependencies: "@sentry/types" "7.28.1" - tslib "^1.9.3" + "tslib" "^1.9.3" "@types/better-sqlite3@^7.6.0": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.3.tgz#117c3c182e300799b84d1b7e1781c27d8d536505" - integrity sha512-YS64N9SNDT/NAvou3QNdzAu3E2om/W/0dhORimtPGLef+zSK5l1vDzfsWb4xgXOgfhtOI5ZDTRxnvRPb22AIVQ== + "integrity" "sha512-YS64N9SNDT/NAvou3QNdzAu3E2om/W/0dhORimtPGLef+zSK5l1vDzfsWb4xgXOgfhtOI5ZDTRxnvRPb22AIVQ==" + "resolved" "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.3.tgz" + "version" "7.6.3" dependencies: "@types/node" "*" "@types/node@*": - version "18.13.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" - integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== + "integrity" "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz" + "version" "18.13.0" "@types/stack-trace@0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.29.tgz#eb7a7c60098edb35630ed900742a5ecb20cfcb4d" - integrity sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g== + "integrity" "sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==" + "resolved" "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.29.tgz" + "version" "0.0.29" -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== +"anymatch@~3.1.2": + "integrity" "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==" + "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + "version" "3.1.3" dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" + "normalize-path" "^3.0.0" + "picomatch" "^2.0.4" -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +"binary-extensions@^2.0.0": + "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + "version" "2.2.0" -blake3-wasm@^2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/blake3-wasm/-/blake3-wasm-2.1.5.tgz#b22dbb84bc9419ed0159caa76af4b1b132e6ba52" - integrity sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g== +"blake3-wasm@^2.1.5": + "integrity" "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==" + "resolved" "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz" + "version" "2.1.5" -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +"braces@~3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" dependencies: - fill-range "^7.0.1" + "fill-range" "^7.0.1" -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +"buffer-from@^1.0.0": + "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + "version" "1.1.2" -builtins@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== +"buffer-writer@2.0.0": + "integrity" "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + "resolved" "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz" + "version" "2.0.0" + +"builtins@^5.0.0": + "integrity" "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==" + "resolved" "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz" + "version" "5.0.1" dependencies: - semver "^7.0.0" + "semver" "^7.0.0" -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== +"busboy@^1.6.0": + "integrity" "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==" + "resolved" "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + "version" "1.6.0" dependencies: - streamsearch "^1.1.0" + "streamsearch" "^1.1.0" -chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +"chokidar@^3.5.3": + "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==" + "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + "version" "3.5.3" dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" + "anymatch" "~3.1.2" + "braces" "~3.0.2" + "glob-parent" "~5.1.2" + "is-binary-path" "~2.1.0" + "is-glob" "~4.0.1" + "normalize-path" "~3.0.0" + "readdirp" "~3.6.0" optionalDependencies: - fsevents "~2.3.2" + "fsevents" "~2.3.2" -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +"cookie@^0.4.1": + "integrity" "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + "version" "0.4.2" -cron-schedule@^3.0.4: - version "3.0.6" - resolved "https://registry.yarnpkg.com/cron-schedule/-/cron-schedule-3.0.6.tgz#7d0a3ad9154112fc3720fe43238a43d50e8465e7" - integrity sha512-izfGgKyzzIyLaeb1EtZ3KbglkS6AKp9cv7LxmiyoOu+fXfol1tQDC0Cof0enVZGNtudTHW+3lfuW9ZkLQss4Wg== +"cron-schedule@^3.0.4": + "integrity" "sha512-izfGgKyzzIyLaeb1EtZ3KbglkS6AKp9cv7LxmiyoOu+fXfol1tQDC0Cof0enVZGNtudTHW+3lfuW9ZkLQss4Wg==" + "resolved" "https://registry.npmjs.org/cron-schedule/-/cron-schedule-3.0.6.tgz" + "version" "3.0.6" -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +"cross-spawn@^7.0.3": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + "version" "7.0.3" dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +"dotenv@^10.0.0": + "integrity" "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" + "version" "10.0.0" -esbuild-android-64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.51.tgz#414a087cb0de8db1e347ecca6c8320513de433db" - integrity sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ== +"esbuild-linux-64@0.14.51": + "integrity" "sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==" + "resolved" "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.51.tgz" + "version" "0.14.51" -esbuild-android-arm64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.51.tgz#55de3bce2aab72bcd2b606da4318ad00fb9c8151" - integrity sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A== - -esbuild-darwin-64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.51.tgz#4259f23ed6b4cea2ec8a28d87b7fb9801f093754" - integrity sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA== - -esbuild-darwin-arm64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.51.tgz#d77b4366a71d84e530ba019d540b538b295d494a" - integrity sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow== - -esbuild-freebsd-64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.51.tgz#27b6587b3639f10519c65e07219d249b01f2ad38" - integrity sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g== - -esbuild-freebsd-arm64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.51.tgz#63c435917e566808c71fafddc600aca4d78be1ec" - integrity sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg== - -esbuild-linux-32@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.51.tgz#c3da774143a37e7f11559b9369d98f11f997a5d9" - integrity sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w== - -esbuild-linux-64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.51.tgz#5d92b67f674e02ae0b4a9de9a757ba482115c4ae" - integrity sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA== - -esbuild-linux-arm64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.51.tgz#dac84740516e859d8b14e1ecc478dd5241b10c93" - integrity sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw== - -esbuild-linux-arm@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.51.tgz#b3ae7000696cd53ed95b2b458554ff543a60e106" - integrity sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg== - -esbuild-linux-mips64le@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.51.tgz#dad10770fac94efa092b5a0643821c955a9dd385" - integrity sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A== - -esbuild-linux-ppc64le@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.51.tgz#b68c2f8294d012a16a88073d67e976edd4850ae0" - integrity sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ== - -esbuild-linux-riscv64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.51.tgz#608a318b8697123e44c1e185cdf6708e3df50b93" - integrity sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA== - -esbuild-linux-s390x@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.51.tgz#c9e7791170a3295dba79b93aa452beb9838a8625" - integrity sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw== - -esbuild-netbsd-64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.51.tgz#0abd40b8c2e37fda6f5cc41a04cb2b690823d891" - integrity sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A== - -esbuild-openbsd-64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.51.tgz#4adba0b7ea7eb1428bb00d8e94c199a949b130e8" - integrity sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA== - -esbuild-sunos-64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.51.tgz#4b8a6d97dfedda30a6e39607393c5c90ebf63891" - integrity sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA== - -esbuild-windows-32@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.51.tgz#d31d8ca0c1d314fb1edea163685a423b62e9ac17" - integrity sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg== - -esbuild-windows-64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.51.tgz#7d3c09c8652d222925625637bdc7e6c223e0085d" - integrity sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA== - -esbuild-windows-arm64@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.51.tgz#0220d2304bfdc11bc27e19b2aaf56edf183e4ae9" - integrity sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g== - -esbuild@0.14.51: - version "0.14.51" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.51.tgz#1c8ecbc8db3710da03776211dc3ee3448f7aa51e" - integrity sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw== +"esbuild@*", "esbuild@0.14.51": + "integrity" "sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==" + "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.14.51.tgz" + "version" "0.14.51" optionalDependencies: - esbuild-android-64 "0.14.51" - esbuild-android-arm64 "0.14.51" - esbuild-darwin-64 "0.14.51" - esbuild-darwin-arm64 "0.14.51" - esbuild-freebsd-64 "0.14.51" - esbuild-freebsd-arm64 "0.14.51" - esbuild-linux-32 "0.14.51" - esbuild-linux-64 "0.14.51" - esbuild-linux-arm "0.14.51" - esbuild-linux-arm64 "0.14.51" - esbuild-linux-mips64le "0.14.51" - esbuild-linux-ppc64le "0.14.51" - esbuild-linux-riscv64 "0.14.51" - esbuild-linux-s390x "0.14.51" - esbuild-netbsd-64 "0.14.51" - esbuild-openbsd-64 "0.14.51" - esbuild-sunos-64 "0.14.51" - esbuild-windows-32 "0.14.51" - esbuild-windows-64 "0.14.51" - esbuild-windows-arm64 "0.14.51" + "esbuild-android-64" "0.14.51" + "esbuild-android-arm64" "0.14.51" + "esbuild-darwin-64" "0.14.51" + "esbuild-darwin-arm64" "0.14.51" + "esbuild-freebsd-64" "0.14.51" + "esbuild-freebsd-arm64" "0.14.51" + "esbuild-linux-32" "0.14.51" + "esbuild-linux-64" "0.14.51" + "esbuild-linux-arm" "0.14.51" + "esbuild-linux-arm64" "0.14.51" + "esbuild-linux-mips64le" "0.14.51" + "esbuild-linux-ppc64le" "0.14.51" + "esbuild-linux-riscv64" "0.14.51" + "esbuild-linux-s390x" "0.14.51" + "esbuild-netbsd-64" "0.14.51" + "esbuild-openbsd-64" "0.14.51" + "esbuild-sunos-64" "0.14.51" + "esbuild-windows-32" "0.14.51" + "esbuild-windows-64" "0.14.51" + "esbuild-windows-arm64" "0.14.51" -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +"escape-string-regexp@^4.0.0": + "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + "version" "4.0.0" -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== +"estree-walker@^0.6.1": + "integrity" "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz" + "version" "0.6.1" -execa@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" - integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== +"execa@^6.1.0": + "integrity" "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==" + "resolved" "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz" + "version" "6.1.0" dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^3.0.1" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" + "cross-spawn" "^7.0.3" + "get-stream" "^6.0.1" + "human-signals" "^3.0.1" + "is-stream" "^3.0.0" + "merge-stream" "^2.0.0" + "npm-run-path" "^5.1.0" + "onetime" "^6.0.0" + "signal-exit" "^3.0.7" + "strip-final-newline" "^3.0.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +"fill-range@^7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" dependencies: - to-regex-range "^5.0.1" + "to-regex-range" "^5.0.1" -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +"get-stream@^6.0.1": + "integrity" "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + "version" "6.0.1" -get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== +"glob-parent@~5.1.2": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" dependencies: - is-glob "^4.0.1" + "is-glob" "^4.0.1" -html-rewriter-wasm@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/html-rewriter-wasm/-/html-rewriter-wasm-0.4.1.tgz#235e3d96c1aa4bfd2182661ee13881e290ff5ff2" - integrity sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q== +"html-rewriter-wasm@^0.4.1": + "integrity" "sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q==" + "resolved" "https://registry.npmjs.org/html-rewriter-wasm/-/html-rewriter-wasm-0.4.1.tgz" + "version" "0.4.1" -http-cache-semantics@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== +"http-cache-semantics@^4.1.0": + "integrity" "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "resolved" "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" + "version" "4.1.1" -human-signals@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" - integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== +"human-signals@^3.0.1": + "integrity" "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==" + "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz" + "version" "3.0.1" -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== +"is-binary-path@~2.1.0": + "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + "version" "2.1.0" dependencies: - binary-extensions "^2.0.0" + "binary-extensions" "^2.0.0" -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +"is-extglob@^2.1.1": + "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== +"is-glob@^4.0.1", "is-glob@~4.0.1": + "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + "version" "4.0.3" dependencies: - is-extglob "^2.1.1" + "is-extglob" "^2.1.1" -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +"is-number@^7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== +"is-stream@^3.0.0": + "integrity" "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" + "version" "3.0.0" -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +"isexe@^2.0.0": + "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" -kleur@^4.1.4: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== +"kleur@^4.1.4": + "integrity" "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + "resolved" "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" + "version" "4.1.5" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" dependencies: - yallist "^4.0.0" + "yallist" "^4.0.0" -magic-string@^0.25.3: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== +"magic-string@^0.25.3": + "integrity" "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==" + "resolved" "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" + "version" "0.25.9" dependencies: - sourcemap-codec "^1.4.8" + "sourcemap-codec" "^1.4.8" -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +"merge-stream@^2.0.0": + "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + "version" "2.0.0" -mime@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== +"mime@^3.0.0": + "integrity" "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" + "resolved" "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz" + "version" "3.0.0" -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +"mimic-fn@^4.0.0": + "integrity" "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" + "version" "4.0.0" -miniflare@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/miniflare/-/miniflare-2.11.0.tgz#36c575e1e75451c416f136d188b744896becc352" - integrity sha512-QA18I1VQXdCo4nBtPJUcUDxW8c9xbc5ex5F61jwhkGVOISSnYdEheolESmjr8MYk28xwi0XD1ozS4rLaTONd+w== +"miniflare@2.11.0": + "integrity" "sha512-QA18I1VQXdCo4nBtPJUcUDxW8c9xbc5ex5F61jwhkGVOISSnYdEheolESmjr8MYk28xwi0XD1ozS4rLaTONd+w==" + "resolved" "https://registry.npmjs.org/miniflare/-/miniflare-2.11.0.tgz" + "version" "2.11.0" dependencies: "@miniflare/cache" "2.11.0" "@miniflare/cli-parser" "2.11.0" @@ -599,243 +514,326 @@ miniflare@2.11.0: "@miniflare/storage-file" "2.11.0" "@miniflare/storage-memory" "2.11.0" "@miniflare/web-sockets" "2.11.0" - kleur "^4.1.4" - semiver "^1.1.0" - source-map-support "^0.5.20" - undici "5.9.1" + "kleur" "^4.1.4" + "semiver" "^1.1.0" + "source-map-support" "^0.5.20" + "undici" "5.9.1" -mustache@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== +"mustache@^4.2.0": + "integrity" "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" + "resolved" "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz" + "version" "4.2.0" -nanoid@^3.3.3: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +"nanoid@^3.3.3": + "integrity" "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + "version" "3.3.4" -node-forge@^1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +"node-forge@^1": + "integrity" "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + "resolved" "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + "version" "1.3.1" -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +"normalize-path@^3.0.0", "normalize-path@~3.0.0": + "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + "version" "3.0.0" -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== +"npm-run-path@^5.1.0": + "integrity" "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==" + "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" + "version" "5.1.0" dependencies: - path-key "^4.0.0" + "path-key" "^4.0.0" -npx-import@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/npx-import/-/npx-import-1.1.4.tgz#0ee9a27484c633255528f7ec2e4c2adeaa1fcda3" - integrity sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA== +"npx-import@^1.1.3": + "integrity" "sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA==" + "resolved" "https://registry.npmjs.org/npx-import/-/npx-import-1.1.4.tgz" + "version" "1.1.4" dependencies: - execa "^6.1.0" - parse-package-name "^1.0.0" - semver "^7.3.7" - validate-npm-package-name "^4.0.0" + "execa" "^6.1.0" + "parse-package-name" "^1.0.0" + "semver" "^7.3.7" + "validate-npm-package-name" "^4.0.0" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== +"onetime@^6.0.0": + "integrity" "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==" + "resolved" "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" + "version" "6.0.0" dependencies: - mimic-fn "^4.0.0" + "mimic-fn" "^4.0.0" -parse-package-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-package-name/-/parse-package-name-1.0.0.tgz#1a108757e4ffc6889d5e78bcc4932a97c097a5a7" - integrity sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg== +"packet-reader@1.0.0": + "integrity" "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + "resolved" "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz" + "version" "1.0.0" -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +"parse-package-name@^1.0.0": + "integrity" "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==" + "resolved" "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz" + "version" "1.0.0" -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== +"path-key@^3.1.0": + "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" -path-to-regexp@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" - integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== +"path-key@^4.0.0": + "integrity" "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" + "version" "4.0.0" -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +"path-to-regexp@^6.2.0": + "integrity" "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" + "version" "6.2.1" -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== +"pg-connection-string@^2.5.0": + "integrity" "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + "resolved" "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz" + "version" "2.5.0" + +"pg-int8@1.0.1": + "integrity" "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + "resolved" "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz" + "version" "1.0.1" + +"pg-pool@^3.5.2": + "integrity" "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==" + "resolved" "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz" + "version" "3.5.2" + +"pg-protocol@^1.6.0": + "integrity" "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + "resolved" "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz" + "version" "1.6.0" + +"pg-types@^2.1.0": + "integrity" "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==" + "resolved" "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz" + "version" "2.2.0" dependencies: - picomatch "^2.2.1" + "pg-int8" "1.0.1" + "postgres-array" "~2.0.0" + "postgres-bytea" "~1.0.0" + "postgres-date" "~1.0.4" + "postgres-interval" "^1.1.0" -rollup-plugin-inject@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz#e4233855bfba6c0c12a312fd6649dff9a13ee9f4" - integrity sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w== +"pg@^8.9.0", "pg@>=8.0": + "integrity" "sha512-ZJM+qkEbtOHRuXjmvBtOgNOXOtLSbxiMiUVMgE4rV6Zwocy03RicCVvDXgx8l4Biwo8/qORUnEqn2fdQzV7KCg==" + "resolved" "https://registry.npmjs.org/pg/-/pg-8.9.0.tgz" + "version" "8.9.0" dependencies: - estree-walker "^0.6.1" - magic-string "^0.25.3" - rollup-pluginutils "^2.8.1" + "buffer-writer" "2.0.0" + "packet-reader" "1.0.0" + "pg-connection-string" "^2.5.0" + "pg-pool" "^3.5.2" + "pg-protocol" "^1.6.0" + "pg-types" "^2.1.0" + "pgpass" "1.x" -rollup-plugin-node-polyfills@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz#53092a2744837164d5b8a28812ba5f3ff61109fd" - integrity sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA== +"pgpass@1.x": + "integrity" "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==" + "resolved" "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz" + "version" "1.0.5" dependencies: - rollup-plugin-inject "^3.0.0" + "split2" "^4.1.0" -rollup-pluginutils@^2.8.1: - version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" - integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== +"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1": + "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + "version" "2.3.1" + +"postgres-array@~2.0.0": + "integrity" "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + "resolved" "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" + "version" "2.0.0" + +"postgres-bytea@~1.0.0": + "integrity" "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" + "resolved" "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz" + "version" "1.0.0" + +"postgres-date@~1.0.4": + "integrity" "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + "resolved" "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz" + "version" "1.0.7" + +"postgres-interval@^1.1.0": + "integrity" "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==" + "resolved" "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz" + "version" "1.2.0" dependencies: - estree-walker "^0.6.1" + "xtend" "^4.0.0" -selfsigned@^2.0.0, selfsigned@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== +"readdirp@~3.6.0": + "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" + "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + "version" "3.6.0" dependencies: - node-forge "^1" + "picomatch" "^2.2.1" -semiver@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/semiver/-/semiver-1.1.0.tgz#9c97fb02c21c7ce4fcf1b73e2c7a24324bdddd5f" - integrity sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg== - -semver@^7.0.0, semver@^7.3.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +"rollup-plugin-inject@^3.0.0": + "integrity" "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==" + "resolved" "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz" + "version" "3.0.2" dependencies: - lru-cache "^6.0.0" + "estree-walker" "^0.6.1" + "magic-string" "^0.25.3" + "rollup-pluginutils" "^2.8.1" -set-cookie-parser@^2.4.8: - version "2.5.1" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" - integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== +"rollup-plugin-node-polyfills@^0.2.1": + "integrity" "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==" + "resolved" "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz" + "version" "0.2.1" dependencies: - shebang-regex "^3.0.0" + "rollup-plugin-inject" "^3.0.0" -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -source-map-support@^0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== +"rollup-pluginutils@^2.8.1": + "integrity" "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==" + "resolved" "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz" + "version" "2.8.2" dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" + "estree-walker" "^0.6.1" -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -stack-trace@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== +"selfsigned@^2.0.0", "selfsigned@^2.0.1": + "integrity" "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==" + "resolved" "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" + "version" "2.1.1" dependencies: - is-number "^7.0.0" + "node-forge" "^1" -toucan-js@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/toucan-js/-/toucan-js-3.1.0.tgz#412cf43c259e702f46427e465adb2f588b7eea85" - integrity sha512-bRbq/HB+aSfwbsSoCNI6qyPXx2bhsscxSYxnAY63xXv9lIeOLUYfvYdOIBWfAVj9QHNST+X83GQ0lj/llvHpVg== +"semiver@^1.1.0": + "integrity" "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==" + "resolved" "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz" + "version" "1.1.0" + +"semver@^7.0.0", "semver@^7.3.7": + "integrity" "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + "version" "7.3.8" + dependencies: + "lru-cache" "^6.0.0" + +"set-cookie-parser@^2.4.8": + "integrity" "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==" + "resolved" "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz" + "version" "2.5.1" + +"shebang-command@^2.0.0": + "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "shebang-regex" "^3.0.0" + +"shebang-regex@^3.0.0": + "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" + +"signal-exit@^3.0.7": + "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + "version" "3.0.7" + +"source-map-support@^0.5.20": + "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" + "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + "version" "0.5.21" + dependencies: + "buffer-from" "^1.0.0" + "source-map" "^0.6.0" + +"source-map@^0.6.0": + "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + "version" "0.6.1" + +"source-map@^0.7.4": + "integrity" "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + "version" "0.7.4" + +"sourcemap-codec@^1.4.8": + "integrity" "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "resolved" "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + "version" "1.4.8" + +"split2@^4.1.0": + "integrity" "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + "resolved" "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz" + "version" "4.1.0" + +"stack-trace@0.0.10": + "integrity" "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + "resolved" "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + "version" "0.0.10" + +"streamsearch@^1.1.0": + "integrity" "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + "resolved" "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + "version" "1.1.0" + +"strip-final-newline@^3.0.0": + "integrity" "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" + "version" "3.0.0" + +"to-regex-range@^5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "is-number" "^7.0.0" + +"toucan-js@^3.1.0": + "integrity" "sha512-bRbq/HB+aSfwbsSoCNI6qyPXx2bhsscxSYxnAY63xXv9lIeOLUYfvYdOIBWfAVj9QHNST+X83GQ0lj/llvHpVg==" + "resolved" "https://registry.npmjs.org/toucan-js/-/toucan-js-3.1.0.tgz" + "version" "3.1.0" dependencies: "@sentry/core" "7.28.1" "@sentry/types" "7.28.1" "@sentry/utils" "7.28.1" -tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +"tslib@^1.9.3": + "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + "version" "1.14.1" -typescript@^4.9.4: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +"typescript@^4.9.4": + "integrity" "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" + "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + "version" "4.9.5" -undici@5.9.1: - version "5.9.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.9.1.tgz#fc9fd85dd488f965f153314a63d9426a11f3360b" - integrity sha512-6fB3a+SNnWEm4CJbgo0/CWR8RGcOCQP68SF4X0mxtYTq2VNN8T88NYrWVBAeSX+zb7bny2dx2iYhP3XHi00omg== +"undici@5.9.1": + "integrity" "sha512-6fB3a+SNnWEm4CJbgo0/CWR8RGcOCQP68SF4X0mxtYTq2VNN8T88NYrWVBAeSX+zb7bny2dx2iYhP3XHi00omg==" + "resolved" "https://registry.npmjs.org/undici/-/undici-5.9.1.tgz" + "version" "5.9.1" -urlpattern-polyfill@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-4.0.3.tgz#c1fa7a73eb4e6c6a1ffb41b24cf31974f7392d3b" - integrity sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ== +"urlpattern-polyfill@^4.0.3": + "integrity" "sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==" + "resolved" "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-4.0.3.tgz" + "version" "4.0.3" -validate-npm-package-name@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" - integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== +"validate-npm-package-name@^4.0.0": + "integrity" "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==" + "resolved" "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz" + "version" "4.0.0" dependencies: - builtins "^5.0.0" + "builtins" "^5.0.0" -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== +"which@^2.0.1": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" dependencies: - isexe "^2.0.0" + "isexe" "^2.0.0" -wrangler@2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/wrangler/-/wrangler-2.7.1.tgz#adb9d06c0dde3fc434e4a85a286c1da3f485cade" - integrity sha512-SKoe+UTOCX0J+RfEDE6MEdnNy1lDSnB1BfpAEblgvDHjmEunPFu0w6GxcyOYAl/fTl3/VjXZO3p+Ybm9zenzWg== +"wrangler@2.7.1": + "integrity" "sha512-SKoe+UTOCX0J+RfEDE6MEdnNy1lDSnB1BfpAEblgvDHjmEunPFu0w6GxcyOYAl/fTl3/VjXZO3p+Ybm9zenzWg==" + "resolved" "https://registry.npmjs.org/wrangler/-/wrangler-2.7.1.tgz" + "version" "2.7.1" dependencies: "@cloudflare/kv-asset-handler" "^0.2.0" "@esbuild-plugins/node-globals-polyfill" "^0.1.1" @@ -843,39 +841,44 @@ wrangler@2.7.1: "@miniflare/core" "2.11.0" "@miniflare/d1" "2.11.0" "@miniflare/durable-objects" "2.11.0" - blake3-wasm "^2.1.5" - chokidar "^3.5.3" - esbuild "0.14.51" - miniflare "2.11.0" - nanoid "^3.3.3" - path-to-regexp "^6.2.0" - selfsigned "^2.0.1" - source-map "^0.7.4" - xxhash-wasm "^1.0.1" + "blake3-wasm" "^2.1.5" + "chokidar" "^3.5.3" + "esbuild" "0.14.51" + "miniflare" "2.11.0" + "nanoid" "^3.3.3" + "path-to-regexp" "^6.2.0" + "selfsigned" "^2.0.1" + "source-map" "^0.7.4" + "xxhash-wasm" "^1.0.1" optionalDependencies: - fsevents "~2.3.2" + "fsevents" "~2.3.2" -ws@^8.2.2: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" - integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== +"ws@^8.2.2": + "integrity" "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==" + "resolved" "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz" + "version" "8.12.0" -xxhash-wasm@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz#ecc0f813219b727af4d5f3958ca6becee2f2f1ff" - integrity sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A== +"xtend@^4.0.0": + "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + "version" "4.0.2" -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +"xxhash-wasm@^1.0.1": + "integrity" "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==" + "resolved" "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz" + "version" "1.0.2" -youch@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/youch/-/youch-2.2.2.tgz#cb87a359a5c524ebd35eb07ca3a1521dbc7e1a3e" - integrity sha512-/FaCeG3GkuJwaMR34GHVg0l8jCbafZLHiFowSjqLlqhC6OMyf2tPJBu8UirF7/NI9X/R5ai4QfEKUCOxMAGxZQ== +"yallist@^4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" + +"youch@^2.2.2": + "integrity" "sha512-/FaCeG3GkuJwaMR34GHVg0l8jCbafZLHiFowSjqLlqhC6OMyf2tPJBu8UirF7/NI9X/R5ai4QfEKUCOxMAGxZQ==" + "resolved" "https://registry.npmjs.org/youch/-/youch-2.2.2.tgz" + "version" "2.2.2" dependencies: "@types/stack-trace" "0.0.29" - cookie "^0.4.1" - mustache "^4.2.0" - stack-trace "0.0.10" + "cookie" "^0.4.1" + "mustache" "^4.2.0" + "stack-trace" "0.0.10" diff --git a/frontend/src/routes/(admin)/oauth/authorize/index.tsx b/frontend/src/routes/(admin)/oauth/authorize/index.tsx index 7b6c3f8..45d370d 100644 --- a/frontend/src/routes/(admin)/oauth/authorize/index.tsx +++ b/frontend/src/routes/(admin)/oauth/authorize/index.tsx @@ -8,12 +8,13 @@ import { Avatar } from '~/components/avatar' import { getPersonByEmail } from 'wildebeest/backend/src/activitypub/actors' import { getErrorHtml } from '~/utils/getErrorHtml/getErrorHtml' import { buildRedirect } from 'wildebeest/functions/oauth/authorize' +import { getDatabase } from 'wildebeest/backend/src/database' export const clientLoader = loader$, { DATABASE: D1Database }>(async ({ platform, query, html }) => { const client_id = query.get('client_id') || '' let client: Client | null = null try { - client = await getClientById(platform.DATABASE, client_id) + client = await getClientById(await getDatabase(platform as any), client_id) } catch (e: unknown) { const error = e as { stack: string; cause: string } console.warn(error.stack, error.cause) @@ -48,10 +49,10 @@ export const userLoader = loader$< throw html(500, getErrorHtml("The Access JWT doesn't contain an email")) } - const person = await getPersonByEmail(platform.DATABASE, payload.email) + const person = await getPersonByEmail(await getDatabase(platform as any), payload.email) if (person === null) { const isFirstLogin = true - const res = await buildRedirect(platform.DATABASE, request as Request, isFirstLogin, jwt.value) + const res = await buildRedirect(await getDatabase(platform as any), request as Request, isFirstLogin, jwt.value) if (res.status === 302) { throw redirect(302, res.headers.get('location') || '') } else { diff --git a/frontend/src/routes/(frontend)/[accountId]/[statusId]/index.tsx b/frontend/src/routes/(frontend)/[accountId]/[statusId]/index.tsx index 0b8307a..eff9f2a 100644 --- a/frontend/src/routes/(frontend)/[accountId]/[statusId]/index.tsx +++ b/frontend/src/routes/(frontend)/[accountId]/[statusId]/index.tsx @@ -1,4 +1,5 @@ import { component$ } from '@builder.io/qwik' +import { getDatabase } from 'wildebeest/backend/src/database' import { MastodonStatus, StatusContext } from '~/types' import Status from '~/components/Status' import * as statusAPI from 'wildebeest/functions/api/v1/statuses/[id]' @@ -17,7 +18,12 @@ export const statusLoader = loader$< const domain = new URL(request.url).hostname let statusText = '' try { - const statusResponse = await statusAPI.handleRequestGet(platform.DATABASE, params.statusId, domain, {} as Person) + const statusResponse = await statusAPI.handleRequestGet( + await getDatabase(platform as any), + params.statusId, + domain, + {} as Person + ) statusText = await statusResponse.text() } catch (e: unknown) { const error = e as { stack: string; cause: string } @@ -31,7 +37,7 @@ export const statusLoader = loader$< const statusTextContent = await getTextContent(status.content) try { - const contextResponse = await contextAPI.handleRequest(domain, platform.DATABASE, params.statusId) + const contextResponse = await contextAPI.handleRequest(domain, await getDatabase(platform as any), params.statusId) const contextText = await contextResponse.text() const context = JSON.parse(contextText ?? null) as StatusContext | null if (!context) { diff --git a/frontend/src/routes/(frontend)/[accountId]/index.tsx b/frontend/src/routes/(frontend)/[accountId]/index.tsx index 90e549d..58a6c23 100644 --- a/frontend/src/routes/(frontend)/[accountId]/index.tsx +++ b/frontend/src/routes/(frontend)/[accountId]/index.tsx @@ -1,4 +1,5 @@ import { $, component$ } from '@builder.io/qwik' +import { getDatabase } from 'wildebeest/backend/src/database' import { loader$ } from '@builder.io/qwik-city' import { getErrorHtml } from '~/utils/getErrorHtml/getErrorHtml' import type { MastodonStatus } from '~/types' @@ -21,7 +22,7 @@ export const statusesLoader = loader$< const handle = parseHandle(accountId) accountId = handle.localPart - const response = await getLocalStatuses(request as Request, platform.DATABASE, handle, 0, false) + const response = await getLocalStatuses(request as Request, await getDatabase(platform as any), handle, 0, false) statuses = await response.json>() } catch { throw html( diff --git a/frontend/src/routes/(frontend)/[accountId]/layout.tsx b/frontend/src/routes/(frontend)/[accountId]/layout.tsx index 0a65ecd..0543c18 100644 --- a/frontend/src/routes/(frontend)/[accountId]/layout.tsx +++ b/frontend/src/routes/(frontend)/[accountId]/layout.tsx @@ -1,4 +1,5 @@ import { component$, Slot, useStyles$ } from '@builder.io/qwik' +import { getDatabase } from 'wildebeest/backend/src/database' import { type DocumentHead, loader$, useLocation, Link } from '@builder.io/qwik-city' import { MastodonAccount } from 'wildebeest/backend/src/types' import StickyHeader from '~/components/StickyHeader/StickyHeader' @@ -24,14 +25,14 @@ export const accountPageLoader = loader$< const accountId = url.pathname.split('/')[1] try { - const statusResponse = await statusAPI.handleRequestGet(platform.DATABASE, params.statusId, domain) + const statusResponse = await statusAPI.handleRequestGet(await getDatabase(platform as any), params.statusId, domain) const statusText = await statusResponse.text() isValidStatus = !!statusText } catch { isValidStatus = false } - account = await getAccount(domain, accountId, platform.DATABASE) + account = await getAccount(domain, accountId, await getDatabase(platform as any)) } catch { throw html( 500, diff --git a/frontend/src/routes/(frontend)/[accountId]/with_replies/index.tsx b/frontend/src/routes/(frontend)/[accountId]/with_replies/index.tsx index 5ffce57..1162dd4 100644 --- a/frontend/src/routes/(frontend)/[accountId]/with_replies/index.tsx +++ b/frontend/src/routes/(frontend)/[accountId]/with_replies/index.tsx @@ -1,4 +1,5 @@ import { $, component$, useStyles$ } from '@builder.io/qwik' +import { getDatabase } from 'wildebeest/backend/src/database' import { loader$ } from '@builder.io/qwik-city' import styles from '../../../../utils/innerHtmlContent.scss?inline' import { getErrorHtml } from '~/utils/getErrorHtml/getErrorHtml' @@ -22,7 +23,7 @@ export const statusesLoader = loader$< const handle = parseHandle(accountId) accountId = handle.localPart - const response = await getLocalStatuses(request as Request, platform.DATABASE, handle, 0, true) + const response = await getLocalStatuses(request as Request, await getDatabase(platform as any), handle, 0, true) statuses = await response.json>() } catch { throw html( diff --git a/frontend/src/routes/(frontend)/explore/index.tsx b/frontend/src/routes/(frontend)/explore/index.tsx index e3678c8..f2bd7ce 100644 --- a/frontend/src/routes/(frontend)/explore/index.tsx +++ b/frontend/src/routes/(frontend)/explore/index.tsx @@ -1,4 +1,5 @@ import { $, component$ } from '@builder.io/qwik' +import { getDatabase } from 'wildebeest/backend/src/database' import { DocumentHead, loader$ } from '@builder.io/qwik-city' import * as timelines from 'wildebeest/functions/api/v1/timelines/public' import { StatusesPanel } from '~/components/StatusesPanel/StatusesPanel' @@ -10,7 +11,7 @@ export const statusesLoader = loader$, { DATABASE: D1D async ({ platform, html }) => { try { // TODO: use the "trending" API endpoint here. - const response = await timelines.handleRequest(platform.domain, platform.DATABASE) + const response = await timelines.handleRequest(platform.domain, await getDatabase(platform as any)) const results = await response.text() // Manually parse the JSON to ensure that Qwik finds the resulting objects serializable. return JSON.parse(results) as MastodonStatus[] diff --git a/frontend/src/routes/(frontend)/public/index.tsx b/frontend/src/routes/(frontend)/public/index.tsx index 2fee643..f2f7d1a 100644 --- a/frontend/src/routes/(frontend)/public/index.tsx +++ b/frontend/src/routes/(frontend)/public/index.tsx @@ -1,4 +1,5 @@ import { $, component$ } from '@builder.io/qwik' +import { getDatabase } from 'wildebeest/backend/src/database' import { MastodonStatus } from '~/types' import * as timelines from 'wildebeest/functions/api/v1/timelines/public' import { DocumentHead, loader$ } from '@builder.io/qwik-city' @@ -11,7 +12,7 @@ export const statusesLoader = loader$, { DATABASE: D1D async ({ platform, html }) => { try { // TODO: use the "trending" API endpoint here. - const response = await timelines.handleRequest(platform.domain, platform.DATABASE) + const response = await timelines.handleRequest(platform.domain, await getDatabase(platform as any)) const results = await response.text() // Manually parse the JSON to ensure that Qwik finds the resulting objects serializable. return JSON.parse(results) as MastodonStatus[] diff --git a/frontend/src/routes/(frontend)/public/local/index.tsx b/frontend/src/routes/(frontend)/public/local/index.tsx index d523ccd..ecd38ae 100644 --- a/frontend/src/routes/(frontend)/public/local/index.tsx +++ b/frontend/src/routes/(frontend)/public/local/index.tsx @@ -1,4 +1,5 @@ import { $, component$ } from '@builder.io/qwik' +import { getDatabase } from 'wildebeest/backend/src/database' import { MastodonStatus } from '~/types' import * as timelines from 'wildebeest/functions/api/v1/timelines/public' import { DocumentHead, loader$ } from '@builder.io/qwik-city' @@ -11,7 +12,7 @@ export const statusesLoader = loader$, { DATABASE: D1D async ({ platform, html }) => { try { // TODO: use the "trending" API endpoint here. - const response = await timelines.handleRequest(platform.domain, platform.DATABASE, { local: true }) + const response = await timelines.handleRequest(platform.domain, await getDatabase(platform as any), { local: true }) const results = await response.text() // Manually parse the JSON to ensure that Qwik finds the resulting objects serializable. return JSON.parse(results) as MastodonStatus[] diff --git a/functions/.well-known/webfinger.ts b/functions/.well-known/webfinger.ts index 9786aba..72d79e1 100644 --- a/functions/.well-known/webfinger.ts +++ b/functions/.well-known/webfinger.ts @@ -7,7 +7,7 @@ import type { WebFingerResponse } from '../../backend/src/webfinger' import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequest: PagesFunction = async ({ request, env }) => { - return handleRequest(request, getDatabase(env)) + return handleRequest(request, await getDatabase(env)) } const headers = { diff --git a/functions/ap/o/[id].ts b/functions/ap/o/[id].ts index 6ead150..8c401ff 100644 --- a/functions/ap/o/[id].ts +++ b/functions/ap/o/[id].ts @@ -5,7 +5,7 @@ import * as objects from 'wildebeest/backend/src/activitypub/objects' export const onRequest: PagesFunction = async ({ params, request, env }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), params.id as string) + return handleRequest(domain, await getDatabase(env), params.id as string) } const headers = { diff --git a/functions/ap/users/[id].ts b/functions/ap/users/[id].ts index 3ef7862..ddfba06 100644 --- a/functions/ap/users/[id].ts +++ b/functions/ap/users/[id].ts @@ -7,7 +7,7 @@ import * as actors from 'wildebeest/backend/src/activitypub/actors' export const onRequest: PagesFunction = async ({ params, request, env }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), params.id as string) + return handleRequest(domain, await getDatabase(env), params.id as string) } const headers = { diff --git a/functions/ap/users/[id]/followers.ts b/functions/ap/users/[id]/followers.ts index 931be69..b865bad 100644 --- a/functions/ap/users/[id]/followers.ts +++ b/functions/ap/users/[id]/followers.ts @@ -11,7 +11,7 @@ const headers = { export const onRequest: PagesFunction = async ({ params, request, env }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), params.id as string) + return handleRequest(domain, await getDatabase(env), params.id as string) } export async function handleRequest(domain: string, db: Database, id: string): Promise { diff --git a/functions/ap/users/[id]/followers/page.ts b/functions/ap/users/[id]/followers/page.ts index 499b1f3..ff23c70 100644 --- a/functions/ap/users/[id]/followers/page.ts +++ b/functions/ap/users/[id]/followers/page.ts @@ -8,7 +8,7 @@ import type { Env } from 'wildebeest/backend/src/types/env' export const onRequest: PagesFunction = async ({ request, env, params }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), params.id as string) + return handleRequest(domain, await getDatabase(env), params.id as string) } const headers = { diff --git a/functions/ap/users/[id]/following.ts b/functions/ap/users/[id]/following.ts index 5e40c08..0e09c44 100644 --- a/functions/ap/users/[id]/following.ts +++ b/functions/ap/users/[id]/following.ts @@ -11,7 +11,7 @@ const headers = { export const onRequest: PagesFunction = async ({ params, request, env }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), params.id as string) + return handleRequest(domain, await getDatabase(env), params.id as string) } export async function handleRequest(domain: string, db: Database, id: string): Promise { diff --git a/functions/ap/users/[id]/following/page.ts b/functions/ap/users/[id]/following/page.ts index f79ee9c..bef7e30 100644 --- a/functions/ap/users/[id]/following/page.ts +++ b/functions/ap/users/[id]/following/page.ts @@ -8,7 +8,7 @@ import type { Env } from 'wildebeest/backend/src/types/env' export const onRequest: PagesFunction = async ({ request, env, params }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), params.id as string) + return handleRequest(domain, await getDatabase(env), params.id as string) } const headers = { diff --git a/functions/ap/users/[id]/inbox.ts b/functions/ap/users/[id]/inbox.ts index 0913eae..52bd370 100644 --- a/functions/ap/users/[id]/inbox.ts +++ b/functions/ap/users/[id]/inbox.ts @@ -41,7 +41,7 @@ export const onRequest: PagesFunction = async ({ params, request, env const domain = new URL(request.url).hostname return handleRequest( domain, - getDatabase(env), + await getDatabase(env), params.id as string, activity, env.QUEUE, diff --git a/functions/ap/users/[id]/outbox.ts b/functions/ap/users/[id]/outbox.ts index 8ba8d9a..a7717e4 100644 --- a/functions/ap/users/[id]/outbox.ts +++ b/functions/ap/users/[id]/outbox.ts @@ -7,7 +7,7 @@ import type { Env } from 'wildebeest/backend/src/types/env' export const onRequest: PagesFunction = async ({ request, env, params }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), params.id as string, env.userKEK) + return handleRequest(domain, await getDatabase(env), params.id as string, env.userKEK) } const headers = { diff --git a/functions/ap/users/[id]/outbox/page.ts b/functions/ap/users/[id]/outbox/page.ts index 6b91c55..b574a63 100644 --- a/functions/ap/users/[id]/outbox/page.ts +++ b/functions/ap/users/[id]/outbox/page.ts @@ -12,7 +12,7 @@ import { PUBLIC_GROUP } from 'wildebeest/backend/src/activitypub/activities' export const onRequest: PagesFunction = async ({ request, env, params }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), params.id as string) + return handleRequest(domain, await getDatabase(env), params.id as string) } const headers = { diff --git a/functions/api/v1/accounts/[id].ts b/functions/api/v1/accounts/[id].ts index e3861d1..8101380 100644 --- a/functions/api/v1/accounts/[id].ts +++ b/functions/api/v1/accounts/[id].ts @@ -13,7 +13,7 @@ const headers = { export const onRequest: PagesFunction = async ({ request, env, params }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, params.id as string, getDatabase(env)) + return handleRequest(domain, params.id as string, await getDatabase(env)) } export async function handleRequest(domain: string, id: string, db: Database): Promise { diff --git a/functions/api/v1/accounts/[id]/follow.ts b/functions/api/v1/accounts/[id]/follow.ts index ad74505..da9b916 100644 --- a/functions/api/v1/accounts/[id]/follow.ts +++ b/functions/api/v1/accounts/[id]/follow.ts @@ -13,7 +13,7 @@ import type { Relationship } from 'wildebeest/backend/src/types/account' import { addFollowing } from 'wildebeest/backend/src/mastodon/follow' export const onRequest: PagesFunction = async ({ request, env, params, data }) => { - return handleRequest(request, getDatabase(env), params.id as string, data.connectedActor, env.userKEK) + return handleRequest(request, await getDatabase(env), params.id as string, data.connectedActor, env.userKEK) } export async function handleRequest( diff --git a/functions/api/v1/accounts/[id]/followers.ts b/functions/api/v1/accounts/[id]/followers.ts index 21b4e6d..f093537 100644 --- a/functions/api/v1/accounts/[id]/followers.ts +++ b/functions/api/v1/accounts/[id]/followers.ts @@ -16,7 +16,7 @@ import { getFollowers, loadActors } from 'wildebeest/backend/src/activitypub/act import * as localFollow from 'wildebeest/backend/src/mastodon/follow' export const onRequest: PagesFunction = async ({ params, request, env }) => { - return handleRequest(request, getDatabase(env), params.id as string) + return handleRequest(request, await getDatabase(env), params.id as string) } export async function handleRequest(request: Request, db: Database, id: string): Promise { diff --git a/functions/api/v1/accounts/[id]/following.ts b/functions/api/v1/accounts/[id]/following.ts index 8db6e49..cc2ecac 100644 --- a/functions/api/v1/accounts/[id]/following.ts +++ b/functions/api/v1/accounts/[id]/following.ts @@ -16,7 +16,7 @@ import * as webfinger from 'wildebeest/backend/src/webfinger' import { getFollowing, loadActors } from 'wildebeest/backend/src/activitypub/actors/follow' export const onRequest: PagesFunction = async ({ params, request, env }) => { - return handleRequest(request, getDatabase(env), params.id as string) + return handleRequest(request, await getDatabase(env), params.id as string) } export async function handleRequest(request: Request, db: Database, id: string): Promise { diff --git a/functions/api/v1/accounts/[id]/statuses.ts b/functions/api/v1/accounts/[id]/statuses.ts index a79fe5e..a45e8cf 100644 --- a/functions/api/v1/accounts/[id]/statuses.ts +++ b/functions/api/v1/accounts/[id]/statuses.ts @@ -26,7 +26,7 @@ const headers = { } export const onRequest: PagesFunction = async ({ request, env, params }) => { - return handleRequest(request, getDatabase(env), params.id as string) + return handleRequest(request, await getDatabase(env), params.id as string) } export async function handleRequest(request: Request, db: Database, id: string): Promise { @@ -140,10 +140,10 @@ FROM outbox_objects INNER JOIN objects ON objects.id=outbox_objects.object_id INNER JOIN actors ON actors.id=outbox_objects.actor_id WHERE objects.type='Note' - ${withReplies ? '' : "AND json_extract(objects.properties, '$.inReplyTo') IS NULL"} + ${withReplies ? '' : 'AND ' + db.qb.jsonExtractIsNull('objects.properties', 'inReplyTo')} AND outbox_objects.target = '${PUBLIC_GROUP}' AND outbox_objects.actor_id = ?1 - AND outbox_objects.cdate > ?2 + AND outbox_objects.cdate > ?2${db.qb.psql('::timestamp')} ORDER by outbox_objects.published_date DESC LIMIT ?3 OFFSET ?4 ` @@ -161,7 +161,7 @@ LIMIT ?3 OFFSET ?4 return new Response(JSON.stringify(out), { headers }) } - let afterCdate = '00-00-00 00:00:00' + let afterCdate = db.qb.epoch() if (url.searchParams.has('max_id')) { // Client asked to retrieve statuses after the max_id // As opposed to Mastodon we don't use incremental ID but UUID, we need diff --git a/functions/api/v1/accounts/[id]/unfollow.ts b/functions/api/v1/accounts/[id]/unfollow.ts index 693022b..3b8ca1f 100644 --- a/functions/api/v1/accounts/[id]/unfollow.ts +++ b/functions/api/v1/accounts/[id]/unfollow.ts @@ -12,7 +12,7 @@ import type { Relationship } from 'wildebeest/backend/src/types/account' import { removeFollowing } from 'wildebeest/backend/src/mastodon/follow' export const onRequest: PagesFunction = async ({ request, env, params, data }) => { - return handleRequest(request, getDatabase(env), params.id as string, data.connectedActor, env.userKEK) + return handleRequest(request, await getDatabase(env), params.id as string, data.connectedActor, env.userKEK) } export async function handleRequest( diff --git a/functions/api/v1/accounts/relationships.ts b/functions/api/v1/accounts/relationships.ts index 0894f2d..1bbf96c 100644 --- a/functions/api/v1/accounts/relationships.ts +++ b/functions/api/v1/accounts/relationships.ts @@ -8,7 +8,7 @@ import type { ContextData } from 'wildebeest/backend/src/types/context' import { getFollowingAcct, getFollowingRequestedAcct } from 'wildebeest/backend/src/mastodon/follow' export const onRequest: PagesFunction = async ({ request, env, data }) => { - return handleRequest(request, getDatabase(env), data.connectedActor) + return handleRequest(request, await getDatabase(env), data.connectedActor) } export async function handleRequest(req: Request, db: Database, connectedActor: Person): Promise { diff --git a/functions/api/v1/accounts/update_credentials.ts b/functions/api/v1/accounts/update_credentials.ts index 82991c3..e015c97 100644 --- a/functions/api/v1/accounts/update_credentials.ts +++ b/functions/api/v1/accounts/update_credentials.ts @@ -22,7 +22,7 @@ const headers = { export const onRequest: PagesFunction = async ({ request, data, env }) => { return handleRequest( - getDatabase(env), + await getDatabase(env), request, data.connectedActor, env.CF_ACCOUNT_ID, diff --git a/functions/api/v1/accounts/verify_credentials.ts b/functions/api/v1/accounts/verify_credentials.ts index 0cd2ecb..84d06f7 100644 --- a/functions/api/v1/accounts/verify_credentials.ts +++ b/functions/api/v1/accounts/verify_credentials.ts @@ -12,7 +12,7 @@ export const onRequest: PagesFunction = async ({ data, en if (!data.connectedActor) { return errors.notAuthorized('no connected user') } - const user = await loadLocalMastodonAccount(getDatabase(env), data.connectedActor) + const user = await loadLocalMastodonAccount(await getDatabase(env), data.connectedActor) const res: CredentialAccount = { ...user, diff --git a/functions/api/v1/apps.ts b/functions/api/v1/apps.ts index c341820..32d9f17 100644 --- a/functions/api/v1/apps.ts +++ b/functions/api/v1/apps.ts @@ -17,7 +17,7 @@ type AppsPost = { } export const onRequest: PagesFunction = async ({ request, env }) => { - return handleRequest(getDatabase(env), request, getVAPIDKeys(env)) + return handleRequest(await getDatabase(env), request, getVAPIDKeys(env)) } export async function handleRequest(db: Database, request: Request, vapidKeys: JWK) { diff --git a/functions/api/v1/apps/verify_credentials.ts b/functions/api/v1/apps/verify_credentials.ts index 9cbae78..e229d56 100644 --- a/functions/api/v1/apps/verify_credentials.ts +++ b/functions/api/v1/apps/verify_credentials.ts @@ -1,5 +1,6 @@ // https://docs.joinmastodon.org/methods/apps/#verify_credentials +import { type Database } from 'wildebeest/backend/src/database' import { cors } from 'wildebeest/backend/src/utils/cors' import { VAPIDPublicKey } from 'wildebeest/backend/src/mastodon/subscription' import { getVAPIDKeys } from 'wildebeest/backend/src/config' @@ -24,7 +25,7 @@ export const onRequest: PagesFunction = async ({ request, return handleRequest(env.DATABASE, request, getVAPIDKeys(env)) } -export async function handleRequest(db: D1Database, request: Request, vapidKeys: JWK) { +export async function handleRequest(db: Database, request: Request, vapidKeys: JWK) { if (request.method !== 'GET') { return new Response('', { status: 400 }) } diff --git a/functions/api/v1/instance/peers.ts b/functions/api/v1/instance/peers.ts index e5535a6..d087d76 100644 --- a/functions/api/v1/instance/peers.ts +++ b/functions/api/v1/instance/peers.ts @@ -4,7 +4,7 @@ import type { Env } from 'wildebeest/backend/src/types/env' import { getPeers } from 'wildebeest/backend/src/activitypub/peers' export const onRequest: PagesFunction = async ({ env }) => { - return handleRequest(getDatabase(env)) + return handleRequest(await getDatabase(env)) } export async function handleRequest(db: Database): Promise { diff --git a/functions/api/v1/notifications/[id].ts b/functions/api/v1/notifications/[id].ts index 2a1fff4..af67df3 100644 --- a/functions/api/v1/notifications/[id].ts +++ b/functions/api/v1/notifications/[id].ts @@ -15,7 +15,7 @@ const headers = { export const onRequest: PagesFunction = async ({ data, request, env, params }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, params.id as string, getDatabase(env), data.connectedActor) + return handleRequest(domain, params.id as string, await getDatabase(env), data.connectedActor) } export async function handleRequest( diff --git a/functions/api/v1/push/subscription.ts b/functions/api/v1/push/subscription.ts index ad83cb0..c5ba357 100644 --- a/functions/api/v1/push/subscription.ts +++ b/functions/api/v1/push/subscription.ts @@ -12,11 +12,11 @@ import { VAPIDPublicKey } from 'wildebeest/backend/src/mastodon/subscription' import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequestGet: PagesFunction = async ({ request, env, data }) => { - return handleGetRequest(getDatabase(env), request, data.connectedActor, data.clientId, getVAPIDKeys(env)) + return handleGetRequest(await getDatabase(env), request, data.connectedActor, data.clientId, getVAPIDKeys(env)) } export const onRequestPost: PagesFunction = async ({ request, env, data }) => { - return handlePostRequest(getDatabase(env), request, data.connectedActor, data.clientId, getVAPIDKeys(env)) + return handlePostRequest(await getDatabase(env), request, data.connectedActor, data.clientId, getVAPIDKeys(env)) } const headers = { diff --git a/functions/api/v1/statuses.ts b/functions/api/v1/statuses.ts index 3b7ba94..15c0207 100644 --- a/functions/api/v1/statuses.ts +++ b/functions/api/v1/statuses.ts @@ -39,7 +39,7 @@ type StatusCreate = { } export const onRequest: PagesFunction = async ({ request, env, data }) => { - return handleRequest(request, getDatabase(env), data.connectedActor, env.userKEK, env.QUEUE, cacheFromEnv(env)) + return handleRequest(request, await getDatabase(env), data.connectedActor, env.userKEK, env.QUEUE, cacheFromEnv(env)) } // FIXME: add tests for delivery to followers and mentions to a specific Actor. diff --git a/functions/api/v1/statuses/[id].ts b/functions/api/v1/statuses/[id].ts index c813bfa..7194978 100644 --- a/functions/api/v1/statuses/[id].ts +++ b/functions/api/v1/statuses/[id].ts @@ -20,13 +20,13 @@ import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequestGet: PagesFunction = async ({ params, env, request, data }) => { const domain = new URL(request.url).hostname - return handleRequestGet(getDatabase(env), params.id as UUID, domain, data.connectedActor) + return handleRequestGet(await getDatabase(env), params.id as UUID, domain, data.connectedActor) } export const onRequestDelete: PagesFunction = async ({ params, env, request, data }) => { const domain = new URL(request.url).hostname return handleRequestDelete( - getDatabase(env), + await getDatabase(env), params.id as UUID, data.connectedActor, domain, diff --git a/functions/api/v1/statuses/[id]/context.ts b/functions/api/v1/statuses/[id]/context.ts index 710fda6..e5af0df 100644 --- a/functions/api/v1/statuses/[id]/context.ts +++ b/functions/api/v1/statuses/[id]/context.ts @@ -10,7 +10,7 @@ import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequest: PagesFunction = async ({ request, env, params }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), params.id as string) + return handleRequest(domain, await getDatabase(env), params.id as string) } const headers = { diff --git a/functions/api/v1/statuses/[id]/favourite.ts b/functions/api/v1/statuses/[id]/favourite.ts index 5ec5692..10c9080 100644 --- a/functions/api/v1/statuses/[id]/favourite.ts +++ b/functions/api/v1/statuses/[id]/favourite.ts @@ -17,7 +17,7 @@ import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequest: PagesFunction = async ({ env, data, params, request }) => { const domain = new URL(request.url).hostname - return handleRequest(getDatabase(env), params.id as string, data.connectedActor, env.userKEK, domain) + return handleRequest(await getDatabase(env), params.id as string, data.connectedActor, env.userKEK, domain) } export async function handleRequest( diff --git a/functions/api/v1/statuses/[id]/reblog.ts b/functions/api/v1/statuses/[id]/reblog.ts index 15296ce..456437b 100644 --- a/functions/api/v1/statuses/[id]/reblog.ts +++ b/functions/api/v1/statuses/[id]/reblog.ts @@ -17,7 +17,7 @@ import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequest: PagesFunction = async ({ env, data, params, request }) => { const domain = new URL(request.url).hostname - return handleRequest(getDatabase(env), params.id as string, data.connectedActor, env.userKEK, env.QUEUE, domain) + return handleRequest(await getDatabase(env), params.id as string, data.connectedActor, env.userKEK, env.QUEUE, domain) } export async function handleRequest( diff --git a/functions/api/v1/tags/[tag].ts b/functions/api/v1/tags/[tag].ts index 6c2b9eb..8b71c04 100644 --- a/functions/api/v1/tags/[tag].ts +++ b/functions/api/v1/tags/[tag].ts @@ -14,7 +14,7 @@ const headers = { export const onRequestGet: PagesFunction = async ({ params, env, request }) => { const domain = new URL(request.url).hostname - return handleRequestGet(getDatabase(env), domain, params.tag as string) + return handleRequestGet(await getDatabase(env), domain, params.tag as string) } export async function handleRequestGet(db: Database, domain: string, value: string): Promise { diff --git a/functions/api/v1/timelines/public.ts b/functions/api/v1/timelines/public.ts index ec946c1..2b2dc96 100644 --- a/functions/api/v1/timelines/public.ts +++ b/functions/api/v1/timelines/public.ts @@ -16,7 +16,7 @@ export const onRequest: PagesFunction = async ({ request, const only_media = searchParams.get('only_media') === 'true' const offset = Number.parseInt(searchParams.get('offset') ?? '0') const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), { local, remote, only_media, offset }) + return handleRequest(domain, await getDatabase(env), { local, remote, only_media, offset }) } export async function handleRequest( diff --git a/functions/api/v1/timelines/tag/[tag].ts b/functions/api/v1/timelines/tag/[tag].ts index 01a9654..9074fe4 100644 --- a/functions/api/v1/timelines/tag/[tag].ts +++ b/functions/api/v1/timelines/tag/[tag].ts @@ -11,7 +11,7 @@ const headers = { export const onRequest: PagesFunction = async ({ request, env, params }) => { const domain = new URL(request.url).hostname - return handleRequest(getDatabase(env), request, domain, params.tag as string) + return handleRequest(await getDatabase(env), request, domain, params.tag as string) } export async function handleRequest(db: Database, request: Request, domain: string, tag: string): Promise { diff --git a/functions/api/v2/instance.ts b/functions/api/v2/instance.ts index eea8c43..adc34b2 100644 --- a/functions/api/v2/instance.ts +++ b/functions/api/v2/instance.ts @@ -7,7 +7,7 @@ import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequest: PagesFunction = async ({ env, request }) => { const domain = new URL(request.url).hostname - return handleRequest(domain, getDatabase(env), env) + return handleRequest(domain, await getDatabase(env), env) } export async function handleRequest(domain: string, db: Database, env: Env) { diff --git a/functions/api/v2/media.ts b/functions/api/v2/media.ts index f19b3f5..f3c5bd5 100644 --- a/functions/api/v2/media.ts +++ b/functions/api/v2/media.ts @@ -9,7 +9,7 @@ import { mastodonIdSymbol } from 'wildebeest/backend/src/activitypub/objects' import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequestPost: PagesFunction = async ({ request, env, data }) => { - return handleRequestPost(request, getDatabase(env), data.connectedActor, env.CF_ACCOUNT_ID, env.CF_API_TOKEN) + return handleRequestPost(request, await getDatabase(env), data.connectedActor, env.CF_ACCOUNT_ID, env.CF_API_TOKEN) } export async function handleRequestPost( diff --git a/functions/api/v2/media/[id].ts b/functions/api/v2/media/[id].ts index 2d1fa03..8e40cde 100644 --- a/functions/api/v2/media/[id].ts +++ b/functions/api/v2/media/[id].ts @@ -14,7 +14,7 @@ import { updateObjectProperty } from 'wildebeest/backend/src/activitypub/objects import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequestPut: PagesFunction = async ({ params, env, request }) => { - return handleRequestPut(getDatabase(env), params.id as UUID, request) + return handleRequestPut(await getDatabase(env), params.id as UUID, request) } type UpdateMedia = { diff --git a/functions/api/v2/search.ts b/functions/api/v2/search.ts index 019e54c..622de8c 100644 --- a/functions/api/v2/search.ts +++ b/functions/api/v2/search.ts @@ -22,7 +22,7 @@ type SearchResult = { } export const onRequest: PagesFunction = async ({ request, env }) => { - return handleRequest(getDatabase(env), request) + return handleRequest(await getDatabase(env), request) } export async function handleRequest(db: Database, request: Request): Promise { diff --git a/functions/api/wb/settings/account/alias.ts b/functions/api/wb/settings/account/alias.ts index a8ef1b1..6eaa3ca 100644 --- a/functions/api/wb/settings/account/alias.ts +++ b/functions/api/wb/settings/account/alias.ts @@ -8,7 +8,7 @@ import * as errors from 'wildebeest/backend/src/errors' import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequestPost: PagesFunction = async ({ env, request, data }) => { - return handleRequestPost(getDatabase(env), request, data.connectedActor) + return handleRequestPost(await getDatabase(env), request, data.connectedActor) } type AddAliasRequest = { diff --git a/functions/first-login.ts b/functions/first-login.ts index 8d0c418..c175aec 100644 --- a/functions/first-login.ts +++ b/functions/first-login.ts @@ -9,7 +9,7 @@ import * as access from 'wildebeest/backend/src/access' import { type Database, getDatabase } from 'wildebeest/backend/src/database' export const onRequestPost: PagesFunction = async ({ request, env }) => { - return handlePostRequest(request, getDatabase(env), env.userKEK, env.ACCESS_AUTH_DOMAIN, env.ACCESS_AUD) + return handlePostRequest(request, await getDatabase(env), env.userKEK, env.ACCESS_AUTH_DOMAIN, env.ACCESS_AUD) } export async function handlePostRequest( diff --git a/functions/oauth/authorize.ts b/functions/oauth/authorize.ts index 7bda1c2..f0ed5bd 100644 --- a/functions/oauth/authorize.ts +++ b/functions/oauth/authorize.ts @@ -13,7 +13,7 @@ import { type Database, getDatabase } from 'wildebeest/backend/src/database' const extractJWTFromRequest = (request: Request) => request.headers.get('Cf-Access-Jwt-Assertion') || '' export const onRequestPost: PagesFunction = async ({ request, env }) => { - return handleRequestPost(request, getDatabase(env), env.userKEK, env.ACCESS_AUTH_DOMAIN, env.ACCESS_AUD) + return handleRequestPost(request, await getDatabase(env), env.userKEK, env.ACCESS_AUTH_DOMAIN, env.ACCESS_AUD) } export async function buildRedirect( diff --git a/functions/oauth/token.ts b/functions/oauth/token.ts index e44e940..ffc7478 100644 --- a/functions/oauth/token.ts +++ b/functions/oauth/token.ts @@ -12,7 +12,7 @@ type Body = { } export const onRequest: PagesFunction = async ({ request, env }) => { - return handleRequest(getDatabase(env), request) + return handleRequest(await getDatabase(env), request) } export async function handleRequest(db: Database, request: Request): Promise { diff --git a/functions/test.ts b/functions/test.ts new file mode 100644 index 0000000..ed8eec7 --- /dev/null +++ b/functions/test.ts @@ -0,0 +1,13 @@ +import type { Env } from 'wildebeest/backend/src/types/env' +import { getDatabase } from 'wildebeest/backend/src/database' +import type { ContextData } from 'wildebeest/backend/src/types/context' +import * as neon from '@neondatabase/serverless' + +export const onRequestGet: PagesFunction = async ({ env }) => { + const client = new neon.Client(env.NEON_DATABASE_URL!) + console.log(env.NEON_DATABASE_URL!) + await client.connect() + + const res = await client.query('select 2') + return new Response(JSON.stringify(res)) +} diff --git a/package.json b/package.json index 0f4ed09..c04a3b1 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "@playwright/test": "^1.30.0", "@types/jest": "^29.2.4", "@types/node": "^18.11.11", + "@types/pg": "^8.6.6", "@typescript-eslint/eslint-plugin": "^5.46.1", "@typescript-eslint/parser": "^5.46.1", "better-sqlite3": "8", @@ -44,9 +45,12 @@ "deploy": "yarn build && yarn database:migrate && yarn pages publish frontend/dist --project-name=wildebeest" }, "dependencies": { + "@neondatabase/serverless": "^0.2.5", + "@planetscale/database": "^1.5.0", "@types/cookie": "^0.5.1", "cookie": "^0.5.0", "http-message-signatures": "^0.1.2", + "pg": "^8.9.0", "toucan-js": "^3.1.0" } } diff --git a/postgresql.sql b/postgresql.sql new file mode 100644 index 0000000..3f24723 --- /dev/null +++ b/postgresql.sql @@ -0,0 +1,165 @@ +-- Migration number: 0000 2022-12-05T20:27:34.391Z + +CREATE TABLE IF NOT EXISTS actors ( + id TEXT PRIMARY KEY, + type TEXT NOT NULL, + email TEXT, + privkey bytea, + privkey_salt bytea, + pubkey TEXT, + cdate timestamp NOT NULL DEFAULT (now()), + properties TEXT NOT NULL DEFAULT ('{}') +); + +CREATE INDEX IF NOT EXISTS actors_email ON actors(email); + +CREATE TABLE IF NOT EXISTS actor_following ( + id TEXT PRIMARY KEY, + actor_id TEXT NOT NULL, + target_actor_id TEXT NOT NULL, + target_actor_acct TEXT NOT NULL, + state TEXT NOT NULL DEFAULT 'pending', + cdate timestamp NOT NULL DEFAULT (now()) +); + +CREATE INDEX IF NOT EXISTS actor_following_actor_id ON actor_following(actor_id); +CREATE INDEX IF NOT EXISTS actor_following_target_actor_id ON actor_following(target_actor_id); + +CREATE TABLE IF NOT EXISTS objects ( + id TEXT PRIMARY KEY, + mastodon_id TEXT UNIQUE NOT NULL, + type TEXT NOT NULL, + cdate timestamp NOT NULL DEFAULT (now()), + original_actor_id TEXT, + original_object_id TEXT UNIQUE, + reply_to_object_id TEXT, + properties TEXT NOT NULL DEFAULT ('{}'), + local INTEGER NOT NULL +); + +CREATE TABLE IF NOT EXISTS inbox_objects ( + id TEXT PRIMARY KEY, + actor_id TEXT NOT NULL, + object_id TEXT NOT NULL, + cdate timestamp NOT NULL DEFAULT (now()) +); + +CREATE TABLE IF NOT EXISTS outbox_objects ( + id TEXT PRIMARY KEY, + actor_id TEXT NOT NULL, + object_id TEXT NOT NULL, + cdate timestamp NOT NULL DEFAULT (now()), + published_date timestamp NOT NULL DEFAULT (now()) + +); + +CREATE TABLE IF NOT EXISTS actor_notifications ( + id SERIAL PRIMARY KEY, + type TEXT NOT NULL, + actor_id TEXT NOT NULL, + from_actor_id TEXT NOT NULL, + object_id TEXT, + cdate timestamp NOT NULL DEFAULT (now()) + +); + +CREATE INDEX IF NOT EXISTS actor_notifications_actor_id ON actor_notifications(actor_id); + +CREATE TABLE IF NOT EXISTS actor_favourites ( + id TEXT PRIMARY KEY, + actor_id TEXT NOT NULL, + object_id TEXT NOT NULL, + cdate timestamp NOT NULL DEFAULT (now()) + +); + +CREATE INDEX IF NOT EXISTS actor_favourites_actor_id ON actor_favourites(actor_id); +CREATE INDEX IF NOT EXISTS actor_favourites_object_id ON actor_favourites(object_id); + +CREATE TABLE IF NOT EXISTS actor_reblogs ( + id TEXT PRIMARY KEY, + actor_id TEXT NOT NULL, + object_id TEXT NOT NULL, + cdate timestamp NOT NULL DEFAULT (now()) + +); + +CREATE INDEX IF NOT EXISTS actor_reblogs_actor_id ON actor_reblogs(actor_id); +CREATE INDEX IF NOT EXISTS actor_reblogs_object_id ON actor_reblogs(object_id); + +CREATE TABLE IF NOT EXISTS clients ( + id TEXT PRIMARY KEY, + secret TEXT NOT NULL, + name TEXT NOT NULL, + redirect_uris TEXT NOT NULL, + website TEXT, + scopes TEXT, + cdate timestamp NOT NULL DEFAULT (now()) +); + +CREATE TABLE IF NOT EXISTS actor_replies ( + id TEXT PRIMARY KEY, + actor_id TEXT NOT NULL, + object_id TEXT NOT NULL, + in_reply_to_object_id TEXT NOT NULL, + cdate timestamp NOT NULL DEFAULT (now()) + +); + +CREATE INDEX IF NOT EXISTS actor_replies_in_reply_to_object_id ON actor_replies(in_reply_to_object_id); +-- Migration number: 0001 2023-01-16T13:09:04.033Z + +CREATE UNIQUE INDEX unique_actor_following ON actor_following (actor_id, target_actor_id); +-- Migration number: 0002 2023-01-16T13:46:54.975Z + +ALTER TABLE outbox_objects + ADD target TEXT NOT NULL DEFAULT 'https://www.w3.org/ns/activitystreams#Public'; +-- Migration number: 0003 2023-02-02T15:03:27.478Z + +CREATE TABLE IF NOT EXISTS peers ( + domain TEXT UNIQUE NOT NULL +); +-- Migration number: 0004 2023-02-03T17:17:19.099Z + +CREATE INDEX IF NOT EXISTS outbox_objects_actor_id ON outbox_objects(actor_id); +CREATE INDEX IF NOT EXISTS outbox_objects_target ON outbox_objects(target); +-- Migration number: 0005 2023-02-07T10:57:21.848Z + +CREATE TABLE IF NOT EXISTS idempotency_keys ( + key TEXT PRIMARY KEY, + object_id TEXT NOT NULL, + expires_at timestamp NOT NULL + +); +-- Migration number: 0006 2023-02-13T11:18:03.485Z + +CREATE TABLE IF NOT EXISTS note_hashtags ( + value TEXT NOT NULL, + object_id TEXT NOT NULL, + cdate timestamp NOT NULL DEFAULT (now()) + +); +-- Migration number: 0007 2023-02-15T11:01:46.585Z + +CREATE TABLE subscriptions ( + id SERIAL PRIMARY KEY, + actor_id TEXT NOT NULL, + client_id TEXT NOT NULL, + endpoint TEXT NOT NULL, + key_p256dh TEXT NOT NULL, + key_auth TEXT NOT NULL, + alert_mention INTEGER NOT NULL, + alert_status INTEGER NOT NULL, + alert_reblog INTEGER NOT NULL, + alert_follow INTEGER NOT NULL, + alert_follow_request INTEGER NOT NULL, + alert_favourite INTEGER NOT NULL, + alert_poll INTEGER NOT NULL, + alert_update INTEGER NOT NULL, + alert_admin_sign_up INTEGER NOT NULL, + alert_admin_report INTEGER NOT NULL, + policy TEXT NOT NULL, + cdate timestamp NOT NULL DEFAULT (now()), + + UNIQUE(actor_id, client_id) +); diff --git a/tf/main.tf b/tf/main.tf index f5384da..d6aba73 100644 --- a/tf/main.tf +++ b/tf/main.tf @@ -101,7 +101,7 @@ resource "random_password" "user_key" { resource "cloudflare_pages_project" "wildebeest_pages_project" { account_id = var.cloudflare_account_id name = "wildebeest-${lower(var.name_suffix)}" - production_branch = "main" + production_branch = "sven/neon" deployment_configs { production { diff --git a/yarn.lock b/yarn.lock index 0e7addd..bb2795d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -316,12 +316,12 @@ "@databases/split-sql-query@1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@databases/split-sql-query/-/split-sql-query-1.0.3.tgz#de2a14b16be14769b79de77e9b62f4a4aded13f9" + resolved "https://registry.npmjs.org/@databases/split-sql-query/-/split-sql-query-1.0.3.tgz" integrity sha512-Q3UYX85e34yE9KXa095AJtJhBQ0NpLfC0kS9ydFKuNB25cto4YddY52RuXN81m2t0pS1Atg31ylNpKfNCnUPdA== "@databases/sql@3.2.0": version "3.2.0" - resolved "https://registry.yarnpkg.com/@databases/sql/-/sql-3.2.0.tgz#ac55ddaed5408c98e3891362ac5b70d06d7a89ff" + resolved "https://registry.npmjs.org/@databases/sql/-/sql-3.2.0.tgz" integrity sha512-xQZzKIa0lvcdo0MYxnyFMVS1TRla9lpDSCYkobJl19vQEOJ9TqE4o8QBGRJNUfhSkbQIWyvMeBl3KBBbqyUVQQ== "@esbuild-plugins/node-globals-polyfill@^0.1.1": @@ -636,7 +636,7 @@ "@miniflare/cli-parser@2.11.0": version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/cli-parser/-/cli-parser-2.11.0.tgz#47f517731791c9e652e9849d590fde3235737529" + resolved "https://registry.npmjs.org/@miniflare/cli-parser/-/cli-parser-2.11.0.tgz" integrity sha512-JUmyRzEGAS6CouvXJwBh8p44onfw3KRpfq5JGXEuHModOGjTp6li7PQyCTNPV2Hv/7StAXWnTFGXeAqyDHuTig== dependencies: "@miniflare/shared" "2.11.0" @@ -688,7 +688,7 @@ "@miniflare/http-server@2.11.0": version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/http-server/-/http-server-2.11.0.tgz#76d2e2c6549528d965e5f48a8ddc3448c28d4569" + resolved "https://registry.npmjs.org/@miniflare/http-server/-/http-server-2.11.0.tgz" integrity sha512-sMLcrDFzqqAvnQmAUH0hRTo8sBjW79VZYfnIH5FAGSGcKX6kdAGs9RStdYZ4CftQCBAEQScX0KBsMx5FwJRe9Q== dependencies: "@miniflare/core" "2.11.0" @@ -731,7 +731,7 @@ "@miniflare/scheduler@2.11.0": version "2.11.0" - resolved "https://registry.yarnpkg.com/@miniflare/scheduler/-/scheduler-2.11.0.tgz#2568d44f571e73355369be6a6da4481aa4af25c8" + resolved "https://registry.npmjs.org/@miniflare/scheduler/-/scheduler-2.11.0.tgz" integrity sha512-DPdzINhdWeS99eIicGoluMsD4pLTTAWNQbgCv3CTwgdKA3dxdvMSCkNqZzQLiALzvk9+rSfj46FlH++HE7o7/w== dependencies: "@miniflare/core" "2.11.0" @@ -807,6 +807,11 @@ undici "5.9.1" ws "^8.2.2" +"@neondatabase/serverless@^0.2.5": + version "0.2.5" + resolved "https://registry.npmjs.org/@neondatabase/serverless/-/serverless-0.2.5.tgz" + integrity sha512-Qu/nNZftfoqw4ojVCXU/EgYlfII3mzLm82iXNOUljFumPhoZ/Wp8NJG5DgSAKCWC0zwTyJsojdPLQDj/UPs2vg== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -828,9 +833,14 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@planetscale/database@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@planetscale/database/-/database-1.5.0.tgz" + integrity sha512-Qwh7Or1W5dB5mZ9EQqDkgvkDKhBBmQe58KIVUy0SGocNtr5fP4JAWtvZ6EdLAV6C6hVpzNlCA2xIg9lKTswm1Q== + "@playwright/test@^1.30.0": version "1.30.0" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.30.0.tgz#8c0c4930ff2c7be7b3ec3fd434b2a3b4465ed7cb" + resolved "https://registry.npmjs.org/@playwright/test/-/test-1.30.0.tgz" integrity sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw== dependencies: "@types/node" "*" @@ -838,7 +848,7 @@ "@sentry/core@7.28.1": version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.28.1.tgz#c712ce17469b18b01606108817be24a99ed2116e" + resolved "https://registry.npmjs.org/@sentry/core/-/core-7.28.1.tgz" integrity sha512-7wvnuvn/mrAfcugWoCG/3pqDIrUgH5t+HisMJMGw0h9Tc33KqrmqMDCQVvjlrr2pWrw/vuUCFdm8CbUHJ832oQ== dependencies: "@sentry/types" "7.28.1" @@ -847,12 +857,12 @@ "@sentry/types@7.28.1": version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.28.1.tgz#9018b4c152b475de9bedd267237393d3c9b1253d" + resolved "https://registry.npmjs.org/@sentry/types/-/types-7.28.1.tgz" integrity sha512-DvSplMVrVEmOzR2M161V5+B8Up3vR71xMqJOpWTzE9TqtFJRGPtqT/5OBsNJJw1+/j2ssMcnKwbEo9Q2EGeS6g== "@sentry/utils@7.28.1": version "7.28.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.28.1.tgz#0a7b6aa4b09e91e4d1aded2a8c8dbaf818cee96e" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-7.28.1.tgz" integrity sha512-75/jzLUO9HH09iC9TslNimGbxOP3jgn89P+q7uR+rp2fJfRExHVeKJZQdK0Ij4/SmE7TJ3Uh2r154N0INZEx1g== dependencies: "@sentry/types" "7.28.1" @@ -919,7 +929,7 @@ "@types/cookie@^0.5.1": version "0.5.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.5.1.tgz#b29aa1f91a59f35e29ff8f7cb24faf1a3a750554" + resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz" integrity sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g== "@types/graceful-fs@^4.1.3": @@ -966,6 +976,15 @@ resolved "https://registry.npmjs.org/@types/node/-/node-18.11.11.tgz" integrity sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g== +"@types/pg@^8.6.6": + version "8.6.6" + resolved "https://registry.npmjs.org/@types/pg/-/pg-8.6.6.tgz" + integrity sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + "@types/prettier@^2.1.5": version "2.7.1" resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz" @@ -1159,7 +1178,7 @@ array-union@^2.1.0: available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== babel-jest@^29.3.1: @@ -1310,6 +1329,11 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== + buffer@^5.5.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" @@ -1334,7 +1358,7 @@ busboy@^1.6.0: call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -2520,21 +2544,21 @@ is-stream@^3.0.0: is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== dependencies: available-typed-arrays "^1.0.5" @@ -2545,7 +2569,7 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.9: is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" @@ -3173,7 +3197,7 @@ mimic-response@^3.1.0: miniflare@2.11.0: version "2.11.0" - resolved "https://registry.yarnpkg.com/miniflare/-/miniflare-2.11.0.tgz#36c575e1e75451c416f136d188b744896becc352" + resolved "https://registry.npmjs.org/miniflare/-/miniflare-2.11.0.tgz" integrity sha512-QA18I1VQXdCo4nBtPJUcUDxW8c9xbc5ex5F61jwhkGVOISSnYdEheolESmjr8MYk28xwi0XD1ozS4rLaTONd+w== dependencies: "@miniflare/cache" "2.11.0" @@ -3247,7 +3271,7 @@ natural-compare@^1.4.0: nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-abi@^3.3.0: @@ -3274,7 +3298,7 @@ node-releases@^2.0.6: normalize-package-data@^2.3.2: version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -3289,7 +3313,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: npm-run-all@^4.1.5: version "4.1.5" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + resolved "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz" integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== dependencies: ansi-styles "^3.2.1" @@ -3328,17 +3352,17 @@ npx-import@^1.1.3: object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.4: version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" @@ -3412,6 +3436,11 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +packet-reader@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz" + integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -3421,7 +3450,7 @@ parent-module@^1.0.0: parse-json@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" @@ -3489,6 +3518,57 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pg-connection-string@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz" + integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz" + integrity sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w== + +pg-protocol@*, pg-protocol@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== + +pg-types@^2.1.0, pg-types@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.9.0: + version "8.9.0" + resolved "https://registry.npmjs.org/pg/-/pg-8.9.0.tgz" + integrity sha512-ZJM+qkEbtOHRuXjmvBtOgNOXOtLSbxiMiUVMgE4rV6Zwocy03RicCVvDXgx8l4Biwo8/qORUnEqn2fdQzV7KCg== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.5.0" + pg-pool "^3.5.2" + pg-protocol "^1.6.0" + pg-types "^2.1.0" + pgpass "1.x" + +pgpass@1.x: + version "1.0.5" + resolved "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" @@ -3526,6 +3606,28 @@ playwright-core@1.30.0: resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.30.0.tgz#de987cea2e86669e3b85732d230c277771873285" integrity sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g== +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + prebuild-install@^7.1.0: version "7.1.1" resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz" @@ -3905,6 +4007,11 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== +split2@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz" + integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" @@ -4095,7 +4202,7 @@ to-regex-range@^5.0.1: toucan-js@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/toucan-js/-/toucan-js-3.1.0.tgz#412cf43c259e702f46427e465adb2f588b7eea85" + resolved "https://registry.npmjs.org/toucan-js/-/toucan-js-3.1.0.tgz" integrity sha512-bRbq/HB+aSfwbsSoCNI6qyPXx2bhsscxSYxnAY63xXv9lIeOLUYfvYdOIBWfAVj9QHNST+X83GQ0lj/llvHpVg== dependencies: "@sentry/core" "7.28.1" @@ -4104,7 +4211,7 @@ toucan-js@^3.1.0: tree-kill@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== ts-jest@^29.0.3: @@ -4128,7 +4235,7 @@ tslib@^1.8.1, tslib@^1.9.3: tslib@^2.1.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== tsutils@^3.21.0: @@ -4169,7 +4276,7 @@ type-fest@^0.21.3: typed-array-length@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== dependencies: call-bind "^1.0.2" @@ -4183,7 +4290,7 @@ typescript@^4.9.4: unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -4232,7 +4339,7 @@ v8-to-istanbul@^9.0.1: validate-npm-package-license@^3.0.1: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -4254,7 +4361,7 @@ walker@^1.0.8: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -4265,7 +4372,7 @@ which-boxed-primitive@^1.0.2: which-typed-array@^1.1.9: version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== dependencies: available-typed-arrays "^1.0.5" @@ -4277,7 +4384,7 @@ which-typed-array@^1.1.9: which@^1.2.9: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" @@ -4296,7 +4403,7 @@ word-wrap@^1.2.3: wrangler@2.7.1: version "2.7.1" - resolved "https://registry.yarnpkg.com/wrangler/-/wrangler-2.7.1.tgz#adb9d06c0dde3fc434e4a85a286c1da3f485cade" + resolved "https://registry.npmjs.org/wrangler/-/wrangler-2.7.1.tgz" integrity sha512-SKoe+UTOCX0J+RfEDE6MEdnNy1lDSnB1BfpAEblgvDHjmEunPFu0w6GxcyOYAl/fTl3/VjXZO3p+Ybm9zenzWg== dependencies: "@cloudflare/kv-asset-handler" "^0.2.0" @@ -4344,6 +4451,11 @@ ws@^8.2.2: resolved "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz" integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + xxhash-wasm@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz"