diff --git a/.env.example b/.env.example index 0b17a06..93be53f 100644 --- a/.env.example +++ b/.env.example @@ -2,4 +2,7 @@ DATABASE_URL="postgresql://postgres:postgres@localhost:5432/simple-logging-serve PORT=4500 DEFAULT_NUM_OF_MONTHS_TO_DELETE=8 SERVER_URI="http://localhost:4500" -FREEZE_DB_WRITES="false" \ No newline at end of file +FREEZE_DB_WRITES="false" + +GITHUB_CLIENT_ID="xxxx" +GITHUB_CLIENT_SECRET="xxxx" \ No newline at end of file diff --git a/drizzle.config.ts b/drizzle.config.ts index c953bc3..ce53326 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -8,7 +8,7 @@ if (!DB_URL) { } export default defineConfig({ - schema: "./src/config/db/schema.ts", + schema: "./src/config/db/schema.mts", out: "./drizzle", dialect: "postgresql", dbCredentials: { diff --git a/drizzle/0003_smart_azazel.sql b/drizzle/0003_smart_azazel.sql new file mode 100644 index 0000000..2b96f85 --- /dev/null +++ b/drizzle/0003_smart_azazel.sql @@ -0,0 +1,57 @@ +CREATE TABLE IF NOT EXISTS "sessions" ( + "id" text PRIMARY KEY NOT NULL, + "user_id" text NOT NULL, + "expires_at" timestamp with time zone NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "tenants" ( + "id" text PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "workspace" text NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT "tenants_workspace_unique" UNIQUE("workspace") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "users" ( + "id" text PRIMARY KEY NOT NULL, + "username" text NOT NULL, + "github_id" text, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL, + CONSTRAINT "users_github_id_unique" UNIQUE("github_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "users_to_tenants" ( + "user_id" text NOT NULL, + "tenant_id" text NOT NULL, + CONSTRAINT "users_to_tenants_user_id_tenant_id_pk" PRIMARY KEY("user_id","tenant_id") +); +--> statement-breakpoint +ALTER TABLE "services" ADD COLUMN "tenant_id" text;--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "sessions" ADD CONSTRAINT "sessions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "users_to_tenants" ADD CONSTRAINT "users_to_tenants_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "users_to_tenants" ADD CONSTRAINT "users_to_tenants_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE cascade ON UPDATE cascade; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "services" ADD CONSTRAINT "services_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "service_tenant_idx" ON "services" USING btree ("tenant_id"); \ No newline at end of file diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json index 92c46c5..ce8e626 100644 --- a/drizzle/meta/0000_snapshot.json +++ b/drizzle/meta/0000_snapshot.json @@ -1,10 +1,8 @@ { - "version": "5", - "dialect": "pg", - "id": "4c7a7f60-c5a1-472e-a4d2-d6e324943bb3", - "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", "tables": { - "logs": { + "public.logs": { "name": "logs", "schema": "", "columns": { @@ -66,25 +64,40 @@ }, "indexes": { "log_created_at_idx": { + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "with": {}, "name": "log_created_at_idx", - "columns": ["created_at"], - "isUnique": false + "isUnique": false, + "method": "btree", + "concurrently": false } }, "foreignKeys": { "logs_service_id_services_id_fk": { "name": "logs_service_id_services_id_fk", "tableFrom": "logs", + "columnsFrom": [ + "service_id" + ], "tableTo": "services", - "columnsFrom": ["service_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" + "columnsTo": [ + "id" + ], + "onUpdate": "cascade", + "onDelete": "cascade" } }, - "compositePrimaryKeys": {} + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, - "services": { + "public.services": { "name": "services", "schema": "", "columns": { @@ -128,13 +141,24 @@ }, "indexes": { "service_created_at_idx": { + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "with": {}, "name": "service_created_at_idx", - "columns": ["created_at"], - "isUnique": false + "isUnique": false, + "method": "btree", + "concurrently": false } }, "foreignKeys": {}, - "compositePrimaryKeys": {} + "compositePrimaryKeys": {}, + "uniqueConstraints": {} } }, "enums": {}, @@ -143,5 +167,7 @@ "schemas": {}, "tables": {}, "columns": {} - } -} + }, + "id": "4c7a7f60-c5a1-472e-a4d2-d6e324943bb3", + "prevId": "00000000-0000-0000-0000-000000000000" +} \ No newline at end of file diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json index afe53e1..6024b4b 100644 --- a/drizzle/meta/0001_snapshot.json +++ b/drizzle/meta/0001_snapshot.json @@ -1,10 +1,8 @@ { - "version": "5", - "dialect": "pg", - "id": "19b9ab6a-21fa-4bb0-91c2-2460725df8c5", - "prevId": "4c7a7f60-c5a1-472e-a4d2-d6e324943bb3", + "version": "7", + "dialect": "postgresql", "tables": { - "logs": { + "public.logs": { "name": "logs", "schema": "", "columns": { @@ -66,25 +64,40 @@ }, "indexes": { "log_created_at_idx": { + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "with": {}, "name": "log_created_at_idx", - "columns": ["created_at"], - "isUnique": false + "isUnique": false, + "method": "btree", + "concurrently": false } }, "foreignKeys": { "logs_service_id_services_id_fk": { "name": "logs_service_id_services_id_fk", "tableFrom": "logs", + "columnsFrom": [ + "service_id" + ], "tableTo": "services", - "columnsFrom": ["service_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" + "columnsTo": [ + "id" + ], + "onUpdate": "cascade", + "onDelete": "cascade" } }, - "compositePrimaryKeys": {} + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, - "services": { + "public.services": { "name": "services", "schema": "", "columns": { @@ -128,13 +141,24 @@ }, "indexes": { "service_created_at_idx": { + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "with": {}, "name": "service_created_at_idx", - "columns": ["created_at"], - "isUnique": false + "isUnique": false, + "method": "btree", + "concurrently": false } }, "foreignKeys": {}, - "compositePrimaryKeys": {} + "compositePrimaryKeys": {}, + "uniqueConstraints": {} } }, "enums": {}, @@ -143,5 +167,7 @@ "schemas": {}, "tables": {}, "columns": {} - } -} + }, + "id": "19b9ab6a-21fa-4bb0-91c2-2460725df8c5", + "prevId": "4c7a7f60-c5a1-472e-a4d2-d6e324943bb3" +} \ No newline at end of file diff --git a/drizzle/meta/0002_snapshot.json b/drizzle/meta/0002_snapshot.json index 14ba2ea..ef5fd43 100644 --- a/drizzle/meta/0002_snapshot.json +++ b/drizzle/meta/0002_snapshot.json @@ -1,10 +1,8 @@ { - "id": "ce2127be-1277-4db7-b4c3-789c393f369a", - "prevId": "19b9ab6a-21fa-4bb0-91c2-2460725df8c5", - "version": "5", - "dialect": "pg", + "version": "7", + "dialect": "postgresql", "tables": { - "logs": { + "public.logs": { "name": "logs", "schema": "", "columns": { @@ -73,39 +71,55 @@ }, "indexes": { "log_created_at_idx": { - "name": "log_created_at_idx", "columns": [ - "created_at" + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "with": {}, + "name": "log_created_at_idx", + "isUnique": false, + "method": "btree", + "concurrently": false }, "log_level_idx": { - "name": "log_level_idx", "columns": [ - "level" + { + "expression": "level", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "with": {}, + "name": "log_level_idx", + "isUnique": false, + "method": "btree", + "concurrently": false } }, "foreignKeys": { "logs_service_id_services_id_fk": { "name": "logs_service_id_services_id_fk", "tableFrom": "logs", - "tableTo": "services", "columnsFrom": [ "service_id" ], + "tableTo": "services", "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "cascade" + "onUpdate": "cascade", + "onDelete": "cascade" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "services": { + "public.services": { "name": "services", "schema": "", "columns": { @@ -149,11 +163,19 @@ }, "indexes": { "service_created_at_idx": { - "name": "service_created_at_idx", "columns": [ - "created_at" + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } ], - "isUnique": false + "with": {}, + "name": "service_created_at_idx", + "isUnique": false, + "method": "btree", + "concurrently": false } }, "foreignKeys": {}, @@ -164,8 +186,10 @@ "enums": {}, "schemas": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} - } + "tables": {}, + "columns": {} + }, + "id": "ce2127be-1277-4db7-b4c3-789c393f369a", + "prevId": "19b9ab6a-21fa-4bb0-91c2-2460725df8c5" } \ No newline at end of file diff --git a/drizzle/meta/0003_snapshot.json b/drizzle/meta/0003_snapshot.json new file mode 100644 index 0000000..fab56cc --- /dev/null +++ b/drizzle/meta/0003_snapshot.json @@ -0,0 +1,436 @@ +{ + "id": "0619ef67-3610-4f0b-9c47-3ae955ebd7c1", + "prevId": "ce2127be-1277-4db7-b4c3-789c393f369a", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.logs": { + "name": "logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "environment": { + "name": "environment", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ip": { + "name": "ip", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "data": { + "name": "data", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "service_id": { + "name": "service_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "level": { + "name": "level", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'info'" + }, + "lookup_filter_value": { + "name": "lookup_filter_value", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_persisted": { + "name": "is_persisted", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "log_created_at_idx": { + "name": "log_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "log_level_idx": { + "name": "log_level_idx", + "columns": [ + { + "expression": "level", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "logs_service_id_services_id_fk": { + "name": "logs_service_id_services_id_fk", + "tableFrom": "logs", + "tableTo": "services", + "columnsFrom": [ + "service_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.services": { + "name": "services", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "is_persisted": { + "name": "is_persisted", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "is_admin": { + "name": "is_admin", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "tenant_id": { + "name": "tenant_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "service_created_at_idx": { + "name": "service_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "service_tenant_idx": { + "name": "service_tenant_idx", + "columns": [ + { + "expression": "tenant_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "services_tenant_id_tenants_id_fk": { + "name": "services_tenant_id_tenants_id_fk", + "tableFrom": "services", + "tableTo": "tenants", + "columnsFrom": [ + "tenant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.tenants": { + "name": "tenants", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workspace": { + "name": "workspace", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "tenants_workspace_unique": { + "name": "tenants_workspace_unique", + "nullsNotDistinct": false, + "columns": [ + "workspace" + ] + } + } + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "github_id": { + "name": "github_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_github_id_unique": { + "name": "users_github_id_unique", + "nullsNotDistinct": false, + "columns": [ + "github_id" + ] + } + } + }, + "public.users_to_tenants": { + "name": "users_to_tenants", + "schema": "", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tenant_id": { + "name": "tenant_id", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "users_to_tenants_user_id_users_id_fk": { + "name": "users_to_tenants_user_id_users_id_fk", + "tableFrom": "users_to_tenants", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "users_to_tenants_tenant_id_tenants_id_fk": { + "name": "users_to_tenants_tenant_id_tenants_id_fk", + "tableFrom": "users_to_tenants", + "tableTo": "tenants", + "columnsFrom": [ + "tenant_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "users_to_tenants_user_id_tenant_id_pk": { + "name": "users_to_tenants_user_id_tenant_id_pk", + "columns": [ + "user_id", + "tenant_id" + ] + } + }, + "uniqueConstraints": {} + } + }, + "enums": {}, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index c9c5c34..bedc3e3 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -22,6 +22,13 @@ "when": 1704635877860, "tag": "0002_aromatic_nightcrawler", "breakpoints": true + }, + { + "idx": 3, + "version": "7", + "when": 1719289067156, + "tag": "0003_smart_azazel", + "breakpoints": true } ] } \ No newline at end of file diff --git a/migrator.ts b/migrator.ts deleted file mode 100644 index d3399f3..0000000 --- a/migrator.ts +++ /dev/null @@ -1,30 +0,0 @@ -import "dotenv/config"; - -import { drizzle } from "drizzle-orm/postgres-js"; -import { migrate } from "drizzle-orm/postgres-js/migrator"; -import postgres from "postgres"; - -const DB_URL = process.env.DATABASE_URL; - -if (!DB_URL) { - throw new Error("DATABASE_URL is not defined"); -} - -const main = async () => { - const start = new Date(); - - const client = postgres(DB_URL, { max: 1 }); - const db = drizzle(client); - - await migrate(db, { migrationsFolder: "./drizzle" }); - await client.end(); - - const end = new Date(); - console.log(`Migrations complete in ${end.getTime() - start.getTime()}ms`); - process.exit(0); -}; - -main().catch((err) => { - console.error(err); - process.exit(1); -}); diff --git a/package.json b/package.json index 7f887b2..1cac592 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,42 @@ { "name": "simple-logging-server", "license": "MIT", - "version": "2.3.1", + "version": "2.3.2", "description": "This is a simple API for logging messages", "author": "Sean Cassiere", "keywords": [], "private": true, - "packageManager": "pnpm@9.3.0", - "main": "dist/index.js", + "packageManager": "pnpm@9.4.0", + "main": "dist/index.mjs", + "type": "module", "scripts": { "lint": "eslint --max-warnings=0 src", "lint:fix": "eslint --fix --max-warnings=0 src", "format": "prettier --write 'src/**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc", - "start": "NODE_ENV=production node dist/index.js", - "dev": "NODE_ENV=development tsx --watch ./src/index.ts", + "start": "NODE_ENV=production node dist/index.mjs", + "dev": "NODE_ENV=development tsx --watch ./src/index.mts", "test": "NODE_ENV=test vitest", "test:ci": "NODE_ENV=ci vitest run", "build:kill-dist": "rimraf ./dist", - "build:code": "tsc && tscpaths -p tsconfig.json -s ./src -o ./dist", + "build:code": "tsc && tsc-alias", "build": "pnpm run build:kill-dist && pnpm run build:code", "postbuild": "node postbuild.mjs", "db:explorer": "drizzle-kit studio", - "db:migrate-generate": "drizzle-kit generate:pg", - "db:migrate-run": "tsx ./migrator.ts" + "db:migrate-generate": "drizzle-kit generate", + "db:migrate-run": "drizzle-kit migrate" }, "devDependencies": { "@types/node": "^20.14.8", "@typescript-eslint/eslint-plugin": "^6.18.0", "@typescript-eslint/parser": "^6.18.0", - "drizzle-kit": "^0.22.7", + "drizzle-kit": "^0.22.8", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.2", "pg": "^8.12.0", "prettier": "^3.3.2", "rimraf": "^5.0.7", - "tscpaths": "^0.0.9", + "tsc-alias": "^1.8.10", "tsx": "^4.15.7", "typescript": "^5.5.2", "vite-tsconfig-paths": "^4.3.2", @@ -44,11 +45,13 @@ "dependencies": { "@hono/node-server": "^1.11.4", "@paralleldrive/cuid2": "^2.2.2", - "@scalar/hono-api-reference": "^0.5.77", + "@scalar/hono-api-reference": "^0.5.87", + "arctic": "^1.9.1", "dotenv": "^16.4.5", "drizzle-orm": "^0.31.2", - "hono": "^4.4.7", - "hono-rate-limiter": "^0.3.0", + "hono": "^4.4.10", + "hono-rate-limiter": "^0.4.0", + "lucia": "^3.2.0", "postgres": "^3.4.4", "zod": "^3.23.8" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1f0693..0b8eb3c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,11 @@ importers: specifier: ^2.2.2 version: 2.2.2 '@scalar/hono-api-reference': - specifier: ^0.5.77 - version: 0.5.77(postcss@8.4.38)(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) + specifier: ^0.5.87 + version: 0.5.87(postcss@8.4.38)(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) + arctic: + specifier: ^1.9.1 + version: 1.9.1 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -24,11 +27,14 @@ importers: specifier: ^0.31.2 version: 0.31.2(pg@8.12.0)(postgres@3.4.4) hono: - specifier: ^4.4.7 - version: 4.4.7 + specifier: ^4.4.10 + version: 4.4.10 hono-rate-limiter: - specifier: ^0.3.0 - version: 0.3.0(hono@4.4.7) + specifier: ^0.4.0 + version: 0.4.0(hono@4.4.10) + lucia: + specifier: ^3.2.0 + version: 3.2.0 postgres: specifier: ^3.4.4 version: 3.4.4 @@ -46,8 +52,8 @@ importers: specifier: ^6.18.0 version: 6.18.0(eslint@8.56.0)(typescript@5.5.2) drizzle-kit: - specifier: ^0.22.7 - version: 0.22.7 + specifier: ^0.22.8 + version: 0.22.8 eslint: specifier: ^8.56.0 version: 8.56.0 @@ -66,9 +72,9 @@ importers: rimraf: specifier: ^5.0.7 version: 5.0.7 - tscpaths: - specifier: ^0.0.9 - version: 0.0.9 + tsc-alias: + specifier: ^1.8.10 + version: 1.8.10 tsx: specifier: ^4.15.7 version: 4.15.7 @@ -124,46 +130,11 @@ packages: resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} - '@codemirror/autocomplete@6.16.3': - resolution: {integrity: sha512-Vl/tIeRVVUCRDuOG48lttBasNQu8usGgXQawBXI7WJAiUDSFOfzflmEsZFZo48mAvAaa4FZ/4/yLLxFtdJaKYA==} - peerDependencies: - '@codemirror/language': ^6.0.0 - '@codemirror/state': ^6.0.0 - '@codemirror/view': ^6.0.0 - '@lezer/common': ^1.0.0 - - '@codemirror/commands@6.6.0': - resolution: {integrity: sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==} - - '@codemirror/lang-css@6.2.1': - resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} - - '@codemirror/lang-html@6.4.9': - resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} - - '@codemirror/lang-javascript@6.2.2': - resolution: {integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==} - - '@codemirror/lang-json@6.0.1': - resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} - - '@codemirror/lang-yaml@6.1.1': - resolution: {integrity: sha512-HV2NzbK9bbVnjWxwObuZh5FuPCowx51mEfoFT9y3y+M37fA3+pbxx4I7uePuygFzDsAmCTwQSc/kXh/flab4uw==} + '@emnapi/core@0.45.0': + resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} - '@codemirror/language@6.10.2': - resolution: {integrity: sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==} - - '@codemirror/lint@6.8.1': - resolution: {integrity: sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==} - - '@codemirror/search@6.5.6': - resolution: {integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==} - - '@codemirror/state@6.4.1': - resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} - - '@codemirror/view@6.28.2': - resolution: {integrity: sha512-A3DmyVfjgPsGIjiJqM/zvODUAPQdQl3ci0ghehYNnbt5x+o76xq+dL5+mMBuysDXnI3kapgOkoeJ0sbtL/3qPw==} + '@emnapi/runtime@0.45.0': + resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} '@esbuild-kit/core-utils@3.1.0': resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} @@ -668,46 +639,188 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@lezer/common@1.2.1': - resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} + '@noble/hashes@1.3.1': + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} - '@lezer/css@1.1.8': - resolution: {integrity: sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==} + '@node-rs/argon2-android-arm-eabi@1.7.0': + resolution: {integrity: sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] - '@lezer/highlight@1.2.0': - resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==} + '@node-rs/argon2-android-arm64@1.7.0': + resolution: {integrity: sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] - '@lezer/html@1.3.10': - resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} + '@node-rs/argon2-darwin-arm64@1.7.0': + resolution: {integrity: sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] - '@lezer/javascript@1.4.17': - resolution: {integrity: sha512-bYW4ctpyGK+JMumDApeUzuIezX01H76R1foD6LcRX224FWfyYit/HYxiPGDjXXe/wQWASjCvVGoukTH68+0HIA==} + '@node-rs/argon2-darwin-x64@1.7.0': + resolution: {integrity: sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] - '@lezer/json@1.0.2': - resolution: {integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==} + '@node-rs/argon2-freebsd-x64@1.7.0': + resolution: {integrity: sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] - '@lezer/lr@1.4.1': - resolution: {integrity: sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==} + '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': + resolution: {integrity: sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] - '@lezer/yaml@1.0.3': - resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + '@node-rs/argon2-linux-arm64-gnu@1.7.0': + resolution: {integrity: sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - '@mrmlnc/readdir-enhanced@2.2.1': - resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} - engines: {node: '>=4'} + '@node-rs/argon2-linux-arm64-musl@1.7.0': + resolution: {integrity: sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - '@noble/hashes@1.3.1': - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} - engines: {node: '>= 16'} + '@node-rs/argon2-linux-x64-gnu@1.7.0': + resolution: {integrity: sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/argon2-linux-x64-musl@1.7.0': + resolution: {integrity: sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/argon2-wasm32-wasi@1.7.0': + resolution: {integrity: sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@node-rs/argon2-win32-arm64-msvc@1.7.0': + resolution: {integrity: sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@node-rs/argon2-win32-ia32-msvc@1.7.0': + resolution: {integrity: sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@node-rs/argon2-win32-x64-msvc@1.7.0': + resolution: {integrity: sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@node-rs/argon2@1.7.0': + resolution: {integrity: sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==} + engines: {node: '>= 10'} + + '@node-rs/bcrypt-android-arm-eabi@1.9.0': + resolution: {integrity: sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@node-rs/bcrypt-android-arm64@1.9.0': + resolution: {integrity: sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@node-rs/bcrypt-darwin-arm64@1.9.0': + resolution: {integrity: sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@node-rs/bcrypt-darwin-x64@1.9.0': + resolution: {integrity: sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@node-rs/bcrypt-freebsd-x64@1.9.0': + resolution: {integrity: sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': + resolution: {integrity: sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': + resolution: {integrity: sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@node-rs/bcrypt-linux-arm64-musl@1.9.0': + resolution: {integrity: sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@node-rs/bcrypt-linux-x64-gnu@1.9.0': + resolution: {integrity: sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/bcrypt-linux-x64-musl@1.9.0': + resolution: {integrity: sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/bcrypt-wasm32-wasi@1.9.0': + resolution: {integrity: sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': + resolution: {integrity: sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': + resolution: {integrity: sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@node-rs/bcrypt-win32-x64-msvc@1.9.0': + resolution: {integrity: sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@node-rs/bcrypt@1.9.0': + resolution: {integrity: sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig==} + engines: {node: '>= 10'} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - '@nodelib/fs.stat@1.1.3': - resolution: {integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==} - engines: {node: '>= 6'} - '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} @@ -727,12 +840,8 @@ packages: resolution: {integrity: sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@replit/codemirror-css-color-picker@6.1.1': - resolution: {integrity: sha512-e/wYHcgt3HRDpvYuwqXyjv3LEY6VyFjJeDQK1UtFmaykp86R6Cbw3ULH9pvuJuelaW6nS4CVtIRHuOfbFLlqwQ==} - peerDependencies: - '@codemirror/language': ^6.0.0 - '@codemirror/state': ^6.0.0 - '@codemirror/view': ^6.0.0 + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} '@rollup/rollup-android-arm-eabi@4.18.0': resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} @@ -814,44 +923,36 @@ packages: cpu: [x64] os: [win32] - '@scalar/api-client-modal@0.0.12': - resolution: {integrity: sha512-v8YGy8dUomuUGPaqlzgcd+b7TlRT76O/yavGwpSbgROLDxwYkaPZRNSIdTA0jJGguscvcCd5fJWtHAvE6L9Ssw==} + '@scalar/api-client@2.0.3': + resolution: {integrity: sha512-8B9RQB16FwAqFmB6xCcQoXCy5PFLsvK/G3CfJVqZXUlf0DkN+Q7PCWN89kmOIkmQT/A1YR1x5JT6QiDYvcarqA==} engines: {node: '>=18'} - '@scalar/api-client@1.3.15': - resolution: {integrity: sha512-Q4hkPfiEAyZPzLfg8VgpIPxjFT+9s0vS9e0vaRR9SZgJ6kxQ2AEFNSjrcwazTQ/F5IPQzeQNFLj/OLn7s9CwSA==} + '@scalar/api-reference@1.24.26': + resolution: {integrity: sha512-RdSy6yURczgAfjQ4RavqgpqFdvDYNYXt0YSWOKmBXoxUhxhRjc5hhYdFNEAOSu1qFVhRJGaHYwNlkNbB+qljFw==} engines: {node: '>=18'} - '@scalar/api-reference@1.24.16': - resolution: {integrity: sha512-OIngEQx9yGAQ2mVi8+FlcfS0BhZPC5mbzBxEfDlHkZjKANc/Uw9CUf7bnyWuTpBnqAvsM5xZg/tJcT+/I6p1QA==} + '@scalar/code-highlight@0.0.5': + resolution: {integrity: sha512-/8Q68WBvrVeqda5sW6E0mxmLwK0vbuDPHyfuugkYlHj9F7o5lKV+VviBxeaUh18nbGp3qWjdxv6X2mbUe2TyNA==} engines: {node: '>=18'} - '@scalar/client-app@0.1.10': - resolution: {integrity: sha512-yUaVGFr8mMhUHNCnn+po1Rsv4atAXe6V9MpZE6F+y9aHfiSm0PqKitPs++JpxxC2q16VU2KYLnvAc4t7MxXNuQ==} + '@scalar/components@0.12.7': + resolution: {integrity: sha512-COOBcra5QuoISpLqr6UqrwgOOSJPEQxmDtgDf+JrjbqTfDBLc513y7SJd93JYPtMo1+k5idLVePCrHRmuAQC8A==} engines: {node: '>=18'} - '@scalar/code-highlight@0.0.4': - resolution: {integrity: sha512-BRSIM787nQ05aZYqDs/dPI3DMJn62ioD8iFr7tYcdWXNNH7lcsXxCddW2hL3xlpJR8lc70rebRVhg5nDqyVqaA==} + '@scalar/draggable@0.1.3': + resolution: {integrity: sha512-A6lUgTV8q/zJGkzHerY1T+X3l3GXmCCg09Z7OU7j6yDyyuj2BSTblthncoD5sN3BdwLjHwkm9ecehfvaE0pj5w==} engines: {node: '>=18'} - '@scalar/components@0.12.0': - resolution: {integrity: sha512-SxFJQ59jzeJnY6L7Di7IvMwR2S5ASaZPYTd+jK36FlP9DietGOCayWIcjCtbEDLhqHRFUvonb68qdBNmtZkOyQ==} + '@scalar/hono-api-reference@0.5.87': + resolution: {integrity: sha512-EHmX04IjQ2KPH2w8Uil3SeO+7y0R2ivSzX3Spvc22WTLBohWC2VYfeycJWrcTlWJhCnJQwlBNR3V/1Jt2qb+0A==} engines: {node: '>=18'} - '@scalar/draggable@0.1.2': - resolution: {integrity: sha512-fcQMzJDWNCJkKxiua20LiZB0J3rkEANVdCX+2+z4x2uEpmRcQx3TqT2/aETs9OmNqr/jlNMtSubUqAgBnDpc/A==} + '@scalar/oas-utils@0.2.7': + resolution: {integrity: sha512-b987Y2gVHGMSuuLYvPftcb5NUdpLf08k1fLFnbDW3bdE/nBZWiCWuNrBce7rAM5708lcNj9k3LnnZGpIb1oVag==} engines: {node: '>=18'} - '@scalar/hono-api-reference@0.5.77': - resolution: {integrity: sha512-SypiZst89mXfbVGRKl2PXtM3fLpKBoSfistz5Cpm/cwl2L6zfNYYbqrd/gsnYgkjIn891a6G8qH3k6obnzBfeA==} - engines: {node: '>=18'} - - '@scalar/oas-utils@0.2.3': - resolution: {integrity: sha512-3cS88eNtds38LR3hZrG6ztY7Z8yb5YG2B4AMG2gLSXeGKUKNM1V1Me6jdAHoKEXbM/nMIYTqsXM3Y08D5Ttd+g==} - engines: {node: '>=18'} - - '@scalar/object-utils@1.1.1': - resolution: {integrity: sha512-U9hf1vA48qQQtyfvdWIdybn1csVid0bsxr9lqpYs++6Q/aaB+9E+tzAysLKiJYDbRmKcOh6O51GZhOXtikN6IA==} + '@scalar/object-utils@1.1.2': + resolution: {integrity: sha512-93Yhb68Lt5WWSyI8HIpqNZUlnxhx8v/XW7Mxt6V7NFXbOmp9wY3MlTf1qsbWaYfmkqcwEAhO/2rAy1RB9tLJvg==} engines: {node: '>=18'} '@scalar/openapi-parser@0.7.1': @@ -879,20 +980,16 @@ packages: '@scalar/snippetz@0.1.6': resolution: {integrity: sha512-z3DEpT/FIZq9yeHL/tz2v6WvdHIiZ4uvK96RdeTPKUUJ0IXvA5vONG3PF5LE0Q/408PCzWsZpGs9f97ztaeJSQ==} - '@scalar/themes@0.9.5': - resolution: {integrity: sha512-++Esv6gHpJrcVWpZTk3Om4zWmqXb5rBbM62eWJDaq560ABAyZLShMs3eQXITb3o9PixrQTd2gwfedvsPEi1SHQ==} + '@scalar/themes@0.9.9': + resolution: {integrity: sha512-6S2A+EU6tiSKFx3E9xLDdysUmhPs32e/Y3/uGtcUkH2oGaaeYIPHKbJtrTUwEXls9NvqbJeTd/9MH45MyH+3CQ==} engines: {node: '>=18'} - '@scalar/use-codemirror@0.11.2': - resolution: {integrity: sha512-GaVXI8I1ONBquV07i+CBnH1Tr3mIEVtctaN4MUoSJ+2OxiEEfzK2uDvmqtXaS1aFh/4aU2u9aIvkmBoeYf+5hQ==} + '@scalar/use-toasts@0.7.4': + resolution: {integrity: sha512-LvnY0Gl0G09kgf65A3ArtZ1pOjB3Y7Rs29IS2GRlVKICGYOgdiWEdeWzXZCMtvvmIEM+LH5FTbuoqpiwXJ1OXg==} engines: {node: '>=18'} - '@scalar/use-toasts@0.7.2': - resolution: {integrity: sha512-trMGfjL0VmZA8Kgk4xUTBxnHHlnvaVNjFWo3dl+bkh9AzH3nYVcRrqh47Yu9M/gzydf8QNn5JWuV/CxsCrIzIA==} - engines: {node: '>=18'} - - '@scalar/use-tooltip@1.0.0': - resolution: {integrity: sha512-cK71eP6dlI1dbu/MZK2rrDmtbperBARnttNHTUfQdpCARiedmLqNIBx3bOy49P96VotT800oAvZFS3/7RCcqkA==} + '@scalar/use-tooltip@1.0.2': + resolution: {integrity: sha512-bj3RkmGGtCPNgEuopNLOXfQtFM3KnsfAQc9LQEr6iC9FNUa+Ddrlq85wgAK4W740aducchrgK+fBZDpXQbzQTw==} engines: {node: '>=18'} '@sinclair/typebox@0.27.8': @@ -967,6 +1064,9 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' + '@tybys/wasm-util@0.8.3': + resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -988,9 +1088,6 @@ packages: '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - '@types/har-format@1.2.15': resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} @@ -1009,9 +1106,6 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -1097,13 +1191,6 @@ packages: resolution: {integrity: sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==} engines: {node: ^16.0.0 || >=18.0.0} - '@uiw/codemirror-themes@4.22.2': - resolution: {integrity: sha512-gsLHn6SUuV5iboBvGrM7YimzLFHQmsNlkGIYs3UaVUJTo/A/ZrKoSJNyPziShLRjBXA2UwKdBTIU6VhHyyaChw==} - peerDependencies: - '@codemirror/language': '>=6.0.0' - '@codemirror/state': '>=6.0.0' - '@codemirror/view': '>=6.0.0' - '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -1258,6 +1345,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arctic@1.9.1: + resolution: {integrity: sha512-ZHSeTdB+W2uvIAqH5yaBjepct0NrutQehe+nRJa5n4ONGEULUyCehf2m53W/0hyrs4nidqKhVUerrS8MuvUmPg==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -1274,53 +1364,20 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - - arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - - arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} - array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - - array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1334,10 +1391,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -1348,10 +1401,6 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -1363,17 +1412,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} - call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} - call-me-maybe@1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1417,21 +1459,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} - codemirror@6.0.1: - resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} - - collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} - color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1452,15 +1483,13 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1468,13 +1497,6 @@ packages: confbox@0.1.7: resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - - crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1498,14 +1520,6 @@ packages: typescript: optional: true - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1518,10 +1532,6 @@ packages: decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - deep-eql@4.1.4: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} @@ -1541,18 +1551,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} - - define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} - - define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -1574,10 +1572,6 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dir-glob@2.2.2: - resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} - engines: {node: '>=4'} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1599,8 +1593,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - drizzle-kit@0.22.7: - resolution: {integrity: sha512-9THPCb2l1GPt7wxhws9LvTR0YG565ZlVgTuqGMwjs590Kch1pXu4GyjEArVijSF5m0OBj3qgdeKmuJXhKXgWFw==} + drizzle-kit@0.22.8: + resolution: {integrity: sha512-VjI4wsJjk3hSqHSa3TwBf+uvH6M6pRHyxyoVbt935GUzP9tUR/BRZ+MhEJNgryqbzN2Za1KP0eJMTgKEPsalYQ==} hasBin: true drizzle-orm@0.31.2: @@ -1805,35 +1799,15 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-diff@1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - fast-glob@2.2.7: - resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==} - engines: {node: '>=4.0.0'} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -1854,10 +1828,6 @@ packages: file-system-cache@2.3.0: resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} - fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -1885,10 +1855,6 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -1901,14 +1867,13 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} - fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} - fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} + fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1941,22 +1906,12 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-tsconfig@4.6.2: - resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==} - get-tsconfig@4.7.5: resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} - get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1965,9 +1920,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regexp@0.3.0: - resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==} - glob@10.3.10: resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} @@ -1985,10 +1937,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globby@9.2.0: - resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} - engines: {node: '>=6'} - globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -2027,22 +1975,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - - has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - - has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - - has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -2102,13 +2034,13 @@ packages: highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - hono-rate-limiter@0.3.0: - resolution: {integrity: sha512-QUS1N+DCZs8CKjpoHugvEvAp/+e+LUllPPnaIlATK9GyT26niQxn4H4V+O5kHwcsXjD3P3JOc0jMb7fnW6gpFQ==} + hono-rate-limiter@0.4.0: + resolution: {integrity: sha512-7RWU2HZvxPtfBrvjXKDiQ3F6ZH8k49JhxVkHquUz5UZKjauj5PrP29MvISykThtfpy4mGG6kqxFBHW1ed9wwnA==} peerDependencies: hono: ^4.1.1 - hono@4.4.7: - resolution: {integrity: sha512-WoQWFQyVFEVRtIzP5sHPv7nvIw+RYL/HRnvnOCDxj6A+BtrwuC9S0vryZbV4IyFcNgOJ87r/phDiC1x2eEo4Gg==} + hono@4.4.10: + resolution: {integrity: sha512-z6918u9rXRU5CCisMHd2uUVoQXcNyUrUMmYY7VH10v4HJG7+hqgMK/G8YNTd13C6s4rBfzF09iz8VpOip9qG3A==} engines: {node: '>=16.0.0'} hookable@5.5.3: @@ -2128,10 +2060,6 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} - ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -2163,10 +2091,6 @@ packages: resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-accessor-descriptor@1.0.1: - resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} - engines: {node: '>= 0.10'} - is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -2186,9 +2110,6 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -2197,30 +2118,10 @@ packages: resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} engines: {node: '>= 0.4'} - is-data-descriptor@1.0.1: - resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} - engines: {node: '>= 0.4'} - is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} - is-descriptor@0.1.7: - resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} - engines: {node: '>= 0.4'} - - is-descriptor@1.0.3: - resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} - engines: {node: '>= 0.4'} - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2233,10 +2134,6 @@ packages: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} - is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2249,10 +2146,6 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} - is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2269,10 +2162,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -2313,30 +2202,12 @@ packages: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - isomorphic.js@0.2.5: - resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} @@ -2345,6 +2216,10 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2374,18 +2249,6 @@ packages: just-clone@6.2.0: resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==} - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - - kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - leven@4.0.0: resolution: {integrity: sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2394,11 +2257,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lib0@0.2.94: - resolution: {integrity: sha512-hZ3p54jL4Wpu7IOg26uC7dnEWiMyNlUrb9KoG7+xYs45WkQwpVvKFndVq2+pqLYKe1u8Fp3+zAfZHVvTK34PvQ==} - engines: {node: '>=16'} - hasBin: true - lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -2441,6 +2299,9 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lucia@3.2.0: + resolution: {integrity: sha512-eXMxXwk6hqtjRTj4W/x3EnTUtAztLPm0p2N2TEBMDEbakDLXiYnDQ9z/qahjPdPdhPguQc+vwO0/88zIWxlpuw==} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -2448,17 +2309,9 @@ packages: magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - map-or-similar@1.5.0: resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} - map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} - markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} @@ -2498,6 +2351,13 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + memfs-browser@3.5.10302: + resolution: {integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + memoizerific@1.11.3: resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} @@ -2592,10 +2452,6 @@ packages: micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} - micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -2627,19 +2483,16 @@ packages: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} - mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} - mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + mylas@2.1.13: + resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} + engines: {node: '>=12.0.0'} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -2653,10 +2506,6 @@ packages: engines: {node: ^18 || >=20} hasBin: true - nanomatch@1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2676,10 +2525,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} - object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} @@ -2696,18 +2541,10 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} - object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2719,6 +2556,9 @@ packages: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} + oslo@1.2.0: + resolution: {integrity: sha512-OoFX6rDsNcOQVAD2gQD/z03u4vEjWZLzJtwkmgfRF+KpQUXwdgEXErD7zNhyowmHwHefP+PM9Pw13pgpHMRlzw==} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2742,13 +2582,6 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - - path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2772,10 +2605,6 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} - path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -2831,14 +2660,6 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -2846,9 +2667,9 @@ packages: pkg-types@1.1.1: resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} - posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} + plimit-lit@1.6.1: + resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==} + engines: {node: '>=12'} possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} @@ -2958,6 +2779,10 @@ packages: resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} engines: {node: '>=0.6'} + queue-lit@1.5.2: + resolution: {integrity: sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==} + engines: {node: '>=12'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2989,10 +2814,6 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} @@ -3033,14 +2854,6 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -3052,18 +2865,10 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true - ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3086,9 +2891,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -3102,10 +2904,6 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3125,45 +2923,17 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - slash@2.0.0: - resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} - engines: {node: '>=6'} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - - snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - - snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} - source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3171,10 +2941,6 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - split2@4.1.0: resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} engines: {node: '>= 10.x'} @@ -3182,10 +2948,6 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} - std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} @@ -3231,9 +2993,6 @@ packages: strip-literal@2.1.0: resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - style-mod@4.1.2: - resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} - sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -3290,26 +3049,17 @@ packages: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} + tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} - - to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -3329,6 +3079,10 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tsc-alias@1.8.10: + resolution: {integrity: sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw==} + hasBin: true + tsconfck@3.1.0: resolution: {integrity: sha512-CMjc5zMnyAjcS9sPLytrbFmj89st2g+JYtY/c02ug4Q+CZaAtCgbyviI0n1YvjZE/pzoc6FbNsINS13DOL1B9w==} engines: {node: ^18 || >=20} @@ -3339,10 +3093,6 @@ packages: typescript: optional: true - tscpaths@0.0.9: - resolution: {integrity: sha512-tz4qimSJTCjYtHVsoY7pvxLcxhmhgmwzm7fyMEiL3/kPFFVyUuZOwuwcWwjkAsIrSUKJK22A7fNuJUwxzQ+H+w==} - hasBin: true - tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -3384,10 +3134,6 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} @@ -3410,21 +3156,9 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - - use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3533,9 +3267,6 @@ packages: typescript: optional: true - w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -3579,13 +3310,6 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - y-codemirror.next@0.3.5: - resolution: {integrity: sha512-VluNu3e5HfEXybnypnsGwKAj+fKLd4iAnR7JuX1Sfyydmn1jCBS5wwEL/uS04Ch2ib0DnMAOF6ZRR/8kK3wyGw==} - peerDependencies: - '@codemirror/state': ^6.0.0 - '@codemirror/view': ^6.0.0 - yjs: ^13.5.6 - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -3594,10 +3318,6 @@ packages: engines: {node: '>= 14'} hasBin: true - yjs@13.6.18: - resolution: {integrity: sha512-GBTjO4QCmv2HFKFkYIJl7U77hIB1o22vSCSQD1Ge8ZxWbIbn8AltI4gyXbtL+g5/GJep67HCMq3Y5AmNwDSyEg==} - engines: {node: '>=16.0.0', npm: '>=8.0.0'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -3653,96 +3373,15 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@codemirror/autocomplete@6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1)': + '@emnapi/core@0.45.0': dependencies: - '@codemirror/language': 6.10.2 - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - '@lezer/common': 1.2.1 - - '@codemirror/commands@6.6.0': - dependencies: - '@codemirror/language': 6.10.2 - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - '@lezer/common': 1.2.1 - - '@codemirror/lang-css@6.2.1(@codemirror/view@6.28.2)': - dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) - '@codemirror/language': 6.10.2 - '@codemirror/state': 6.4.1 - '@lezer/common': 1.2.1 - '@lezer/css': 1.1.8 - transitivePeerDependencies: - - '@codemirror/view' - - '@codemirror/lang-html@6.4.9': - dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) - '@codemirror/lang-css': 6.2.1(@codemirror/view@6.28.2) - '@codemirror/lang-javascript': 6.2.2 - '@codemirror/language': 6.10.2 - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - '@lezer/common': 1.2.1 - '@lezer/css': 1.1.8 - '@lezer/html': 1.3.10 - - '@codemirror/lang-javascript@6.2.2': - dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) - '@codemirror/language': 6.10.2 - '@codemirror/lint': 6.8.1 - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - '@lezer/common': 1.2.1 - '@lezer/javascript': 1.4.17 - - '@codemirror/lang-json@6.0.1': - dependencies: - '@codemirror/language': 6.10.2 - '@lezer/json': 1.0.2 - - '@codemirror/lang-yaml@6.1.1(@codemirror/view@6.28.2)': - dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) - '@codemirror/language': 6.10.2 - '@codemirror/state': 6.4.1 - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/yaml': 1.0.3 - transitivePeerDependencies: - - '@codemirror/view' - - '@codemirror/language@6.10.2': - dependencies: - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.1 - style-mod: 4.1.2 - - '@codemirror/lint@6.8.1': - dependencies: - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - crelt: 1.0.6 - - '@codemirror/search@6.5.6': - dependencies: - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - crelt: 1.0.6 - - '@codemirror/state@6.4.1': {} + tslib: 2.6.2 + optional: true - '@codemirror/view@6.28.2': + '@emnapi/runtime@0.45.0': dependencies: - '@codemirror/state': 6.4.1 - style-mod: 4.1.2 - w3c-keyname: 2.2.8 + tslib: 2.6.2 + optional: true '@esbuild-kit/core-utils@3.1.0': dependencies: @@ -3752,7 +3391,7 @@ snapshots: '@esbuild-kit/esm-loader@2.5.5': dependencies: '@esbuild-kit/core-utils': 3.1.0 - get-tsconfig: 4.6.2 + get-tsconfig: 4.7.5 '@esbuild/aix-ppc64@0.19.11': optional: true @@ -4062,60 +3701,141 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@lezer/common@1.2.1': {} + '@noble/hashes@1.3.1': {} - '@lezer/css@1.1.8': - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.1 + '@node-rs/argon2-android-arm-eabi@1.7.0': + optional: true - '@lezer/highlight@1.2.0': - dependencies: - '@lezer/common': 1.2.1 + '@node-rs/argon2-android-arm64@1.7.0': + optional: true - '@lezer/html@1.3.10': - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.1 + '@node-rs/argon2-darwin-arm64@1.7.0': + optional: true - '@lezer/javascript@1.4.17': - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.1 + '@node-rs/argon2-darwin-x64@1.7.0': + optional: true - '@lezer/json@1.0.2': - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.1 + '@node-rs/argon2-freebsd-x64@1.7.0': + optional: true - '@lezer/lr@1.4.1': - dependencies: - '@lezer/common': 1.2.1 + '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': + optional: true + + '@node-rs/argon2-linux-arm64-gnu@1.7.0': + optional: true + + '@node-rs/argon2-linux-arm64-musl@1.7.0': + optional: true + + '@node-rs/argon2-linux-x64-gnu@1.7.0': + optional: true - '@lezer/yaml@1.0.3': + '@node-rs/argon2-linux-x64-musl@1.7.0': + optional: true + + '@node-rs/argon2-wasm32-wasi@1.7.0': dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.1 + '@emnapi/core': 0.45.0 + '@emnapi/runtime': 0.45.0 + '@tybys/wasm-util': 0.8.3 + memfs-browser: 3.5.10302 + optional: true + + '@node-rs/argon2-win32-arm64-msvc@1.7.0': + optional: true + + '@node-rs/argon2-win32-ia32-msvc@1.7.0': + optional: true - '@mrmlnc/readdir-enhanced@2.2.1': + '@node-rs/argon2-win32-x64-msvc@1.7.0': + optional: true + + '@node-rs/argon2@1.7.0': + optionalDependencies: + '@node-rs/argon2-android-arm-eabi': 1.7.0 + '@node-rs/argon2-android-arm64': 1.7.0 + '@node-rs/argon2-darwin-arm64': 1.7.0 + '@node-rs/argon2-darwin-x64': 1.7.0 + '@node-rs/argon2-freebsd-x64': 1.7.0 + '@node-rs/argon2-linux-arm-gnueabihf': 1.7.0 + '@node-rs/argon2-linux-arm64-gnu': 1.7.0 + '@node-rs/argon2-linux-arm64-musl': 1.7.0 + '@node-rs/argon2-linux-x64-gnu': 1.7.0 + '@node-rs/argon2-linux-x64-musl': 1.7.0 + '@node-rs/argon2-wasm32-wasi': 1.7.0 + '@node-rs/argon2-win32-arm64-msvc': 1.7.0 + '@node-rs/argon2-win32-ia32-msvc': 1.7.0 + '@node-rs/argon2-win32-x64-msvc': 1.7.0 + + '@node-rs/bcrypt-android-arm-eabi@1.9.0': + optional: true + + '@node-rs/bcrypt-android-arm64@1.9.0': + optional: true + + '@node-rs/bcrypt-darwin-arm64@1.9.0': + optional: true + + '@node-rs/bcrypt-darwin-x64@1.9.0': + optional: true + + '@node-rs/bcrypt-freebsd-x64@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-arm64-musl@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-x64-gnu@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-x64-musl@1.9.0': + optional: true + + '@node-rs/bcrypt-wasm32-wasi@1.9.0': dependencies: - call-me-maybe: 1.0.2 - glob-to-regexp: 0.3.0 + '@emnapi/core': 0.45.0 + '@emnapi/runtime': 0.45.0 + '@tybys/wasm-util': 0.8.3 + memfs-browser: 3.5.10302 + optional: true - '@noble/hashes@1.3.1': {} + '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': + optional: true + + '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': + optional: true + + '@node-rs/bcrypt-win32-x64-msvc@1.9.0': + optional: true + + '@node-rs/bcrypt@1.9.0': + optionalDependencies: + '@node-rs/bcrypt-android-arm-eabi': 1.9.0 + '@node-rs/bcrypt-android-arm64': 1.9.0 + '@node-rs/bcrypt-darwin-arm64': 1.9.0 + '@node-rs/bcrypt-darwin-x64': 1.9.0 + '@node-rs/bcrypt-freebsd-x64': 1.9.0 + '@node-rs/bcrypt-linux-arm-gnueabihf': 1.9.0 + '@node-rs/bcrypt-linux-arm64-gnu': 1.9.0 + '@node-rs/bcrypt-linux-arm64-musl': 1.9.0 + '@node-rs/bcrypt-linux-x64-gnu': 1.9.0 + '@node-rs/bcrypt-linux-x64-musl': 1.9.0 + '@node-rs/bcrypt-wasm32-wasi': 1.9.0 + '@node-rs/bcrypt-win32-arm64-msvc': 1.9.0 + '@node-rs/bcrypt-win32-ia32-msvc': 1.9.0 + '@node-rs/bcrypt-win32-x64-msvc': 1.9.0 '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@1.1.3': {} - '@nodelib/fs.stat@2.0.5': {} '@nodelib/fs.walk@1.2.8': @@ -4132,11 +3852,7 @@ snapshots: '@pkgr/core@0.1.0': {} - '@replit/codemirror-css-color-picker@6.1.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)': - dependencies: - '@codemirror/language': 6.10.2 - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 + '@popperjs/core@2.11.8': {} '@rollup/rollup-android-arm-eabi@4.18.0': optional: true @@ -4186,77 +3902,27 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true - '@scalar/api-client-modal@0.0.12(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8))': - dependencies: - '@scalar/client-app': 0.1.10(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) - '@scalar/components': 0.12.0(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) - '@scalar/oas-utils': 0.2.3 - vue: 3.4.30(typescript@5.5.2) - vue-router: 4.4.0(vue@3.4.30(typescript@5.5.2)) - transitivePeerDependencies: - - '@jest/globals' - - '@types/bun' - - '@types/jest' - - '@vue/composition-api' - - debug - - jest - - supports-color - - tailwindcss - - typescript - - vitest - - '@scalar/api-client@1.3.15(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8))': - dependencies: - '@floating-ui/vue': 1.0.6(vue@3.4.30(typescript@5.5.2)) - '@headlessui/vue': 1.7.22(vue@3.4.30(typescript@5.5.2)) - '@scalar/components': 0.12.0(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) - '@scalar/oas-utils': 0.2.3 - '@scalar/openapi-parser': 0.7.1 - '@scalar/themes': 0.9.5(typescript@5.5.2) - '@scalar/use-codemirror': 0.11.2(typescript@5.5.2) - '@scalar/use-toasts': 0.7.2(typescript@5.5.2) - '@scalar/use-tooltip': 1.0.0(typescript@5.5.2) - '@vueuse/core': 10.11.0(vue@3.4.30(typescript@5.5.2)) - axios: 1.7.2 - httpsnippet-lite: 3.0.5 - nanoid: 5.0.7 - pretty-bytes: 6.1.1 - pretty-ms: 8.0.0 - vue: 3.4.30(typescript@5.5.2) - transitivePeerDependencies: - - '@jest/globals' - - '@types/bun' - - '@types/jest' - - '@vue/composition-api' - - debug - - jest - - supports-color - - typescript - - vitest - - '@scalar/api-reference@1.24.16(postcss@8.4.38)(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8))': + '@scalar/api-client@2.0.3(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8))': dependencies: + '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.4) '@headlessui/vue': 1.7.22(vue@3.4.30(typescript@5.5.2)) - '@scalar/api-client': 1.3.15(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) - '@scalar/api-client-modal': 0.0.12(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) - '@scalar/components': 0.12.0(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) - '@scalar/oas-utils': 0.2.3 + '@scalar/components': 0.12.7(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) + '@scalar/draggable': 0.1.3(typescript@5.5.2) + '@scalar/oas-utils': 0.2.7 + '@scalar/object-utils': 1.1.2 '@scalar/openapi-parser': 0.7.1 - '@scalar/snippetz': 0.1.6 - '@scalar/themes': 0.9.5(typescript@5.5.2) - '@scalar/use-toasts': 0.7.2(typescript@5.5.2) - '@scalar/use-tooltip': 1.0.0(typescript@5.5.2) - '@unhead/schema': 1.9.14 - '@unhead/vue': 1.9.14(vue@3.4.30(typescript@5.5.2)) + '@scalar/use-toasts': 0.7.4(typescript@5.5.2) + '@scalar/use-tooltip': 1.0.2(typescript@5.5.2) '@vueuse/core': 10.11.0(vue@3.4.30(typescript@5.5.2)) axios: 1.7.2 - fuse.js: 7.0.0 - github-slugger: 2.0.0 - httpsnippet-lite: 3.0.5 - postcss-nested: 6.0.1(postcss@8.4.38) - unhead: 1.9.14 - unified: 11.0.5 + cva: 1.0.0-beta.1(typescript@5.5.2) + js-cookie: 3.0.5 + nanoid: 5.0.7 + pretty-bytes: 6.1.1 + pretty-ms: 8.0.0 vue: 3.4.30(typescript@5.5.2) + vue-router: 4.4.0(vue@3.4.30(typescript@5.5.2)) + zod: 3.23.8 transitivePeerDependencies: - '@jest/globals' - '@types/bun' @@ -4264,32 +3930,35 @@ snapshots: - '@vue/composition-api' - debug - jest - - postcss - supports-color - tailwindcss - typescript - vitest - '@scalar/client-app@0.1.10(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8))': + '@scalar/api-reference@1.24.26(postcss@8.4.38)(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8))': dependencies: - '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.4) + '@floating-ui/vue': 1.0.6(vue@3.4.30(typescript@5.5.2)) '@headlessui/vue': 1.7.22(vue@3.4.30(typescript@5.5.2)) - '@scalar/components': 0.12.0(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) - '@scalar/draggable': 0.1.2(typescript@5.5.2) - '@scalar/oas-utils': 0.2.3 - '@scalar/object-utils': 1.1.1 + '@scalar/api-client': 2.0.3(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) + '@scalar/components': 0.12.7(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) + '@scalar/oas-utils': 0.2.7 '@scalar/openapi-parser': 0.7.1 - '@scalar/use-toasts': 0.7.2(typescript@5.5.2) - '@scalar/use-tooltip': 1.0.0(typescript@5.5.2) + '@scalar/snippetz': 0.1.6 + '@scalar/themes': 0.9.9(typescript@5.5.2) + '@scalar/use-toasts': 0.7.4(typescript@5.5.2) + '@scalar/use-tooltip': 1.0.2(typescript@5.5.2) + '@unhead/schema': 1.9.14 + '@unhead/vue': 1.9.14(vue@3.4.30(typescript@5.5.2)) '@vueuse/core': 10.11.0(vue@3.4.30(typescript@5.5.2)) axios: 1.7.2 - cva: 1.0.0-beta.1(typescript@5.5.2) + fuse.js: 7.0.0 + github-slugger: 2.0.0 + httpsnippet-lite: 3.0.5 nanoid: 5.0.7 - pretty-bytes: 6.1.1 - pretty-ms: 8.0.0 + postcss-nested: 6.0.1(postcss@8.4.38) + unhead: 1.9.14 + unified: 11.0.5 vue: 3.4.30(typescript@5.5.2) - vue-router: 4.4.0(vue@3.4.30(typescript@5.5.2)) - zod: 3.23.8 transitivePeerDependencies: - '@jest/globals' - '@types/bun' @@ -4297,12 +3966,13 @@ snapshots: - '@vue/composition-api' - debug - jest + - postcss - supports-color - tailwindcss - typescript - vitest - '@scalar/code-highlight@0.0.4': + '@scalar/code-highlight@0.0.5': dependencies: hast-util-to-text: 4.0.2 highlight.js: 11.9.0 @@ -4324,13 +3994,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@scalar/components@0.12.0(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8))': + '@scalar/components@0.12.7(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8))': dependencies: '@floating-ui/utils': 0.2.2 '@floating-ui/vue': 1.0.6(vue@3.4.30(typescript@5.5.2)) '@headlessui/vue': 1.7.22(vue@3.4.30(typescript@5.5.2)) - '@scalar/code-highlight': 0.0.4 - '@scalar/oas-utils': 0.2.3 + '@scalar/code-highlight': 0.0.5 '@storybook/test': 8.1.10(vitest@1.6.0(@types/node@20.14.8)) '@vueuse/core': 10.11.0(vue@3.4.30(typescript@5.5.2)) cva: 1.0.0-beta.1(typescript@5.5.2) @@ -4343,22 +4012,21 @@ snapshots: - '@types/bun' - '@types/jest' - '@vue/composition-api' - - debug - jest - supports-color - typescript - vitest - '@scalar/draggable@0.1.2(typescript@5.5.2)': + '@scalar/draggable@0.1.3(typescript@5.5.2)': dependencies: vue: 3.4.30(typescript@5.5.2) transitivePeerDependencies: - typescript - '@scalar/hono-api-reference@0.5.77(postcss@8.4.38)(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8))': + '@scalar/hono-api-reference@0.5.87(postcss@8.4.38)(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8))': dependencies: - '@scalar/api-reference': 1.24.16(postcss@8.4.38)(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) - hono: 4.4.7 + '@scalar/api-reference': 1.24.26(postcss@8.4.38)(tailwindcss@3.4.4)(typescript@5.5.2)(vitest@1.6.0(@types/node@20.14.8)) + hono: 4.4.10 transitivePeerDependencies: - '@jest/globals' - '@types/bun' @@ -4372,7 +4040,7 @@ snapshots: - typescript - vitest - '@scalar/oas-utils@0.2.3': + '@scalar/oas-utils@0.2.7': dependencies: axios: 1.7.2 nanoid: 5.0.7 @@ -4381,7 +4049,7 @@ snapshots: transitivePeerDependencies: - debug - '@scalar/object-utils@1.1.1': + '@scalar/object-utils@1.1.2': dependencies: just-clone: 6.2.0 @@ -4427,37 +4095,13 @@ snapshots: '@scalar/snippetz-plugin-node-ofetch': 0.1.1 '@scalar/snippetz-plugin-node-undici': 0.1.6 - '@scalar/themes@0.9.5(typescript@5.5.2)': + '@scalar/themes@0.9.9(typescript@5.5.2)': dependencies: vue: 3.4.30(typescript@5.5.2) transitivePeerDependencies: - typescript - '@scalar/use-codemirror@0.11.2(typescript@5.5.2)': - dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) - '@codemirror/commands': 6.6.0 - '@codemirror/lang-css': 6.2.1(@codemirror/view@6.28.2) - '@codemirror/lang-html': 6.4.9 - '@codemirror/lang-json': 6.0.1 - '@codemirror/lang-yaml': 6.1.1(@codemirror/view@6.28.2) - '@codemirror/language': 6.10.2 - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.1 - '@replit/codemirror-css-color-picker': 6.1.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2) - '@uiw/codemirror-themes': 4.22.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2) - codemirror: 6.0.1(@lezer/common@1.2.1) - vue: 3.4.30(typescript@5.5.2) - optionalDependencies: - y-codemirror.next: 0.3.5(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(yjs@13.6.18) - yjs: 13.6.18 - transitivePeerDependencies: - - typescript - - '@scalar/use-toasts@0.7.2(typescript@5.5.2)': + '@scalar/use-toasts@0.7.4(typescript@5.5.2)': dependencies: nanoid: 5.0.7 vue: 3.4.30(typescript@5.5.2) @@ -4465,12 +4109,11 @@ snapshots: transitivePeerDependencies: - typescript - '@scalar/use-tooltip@1.0.0(typescript@5.5.2)': + '@scalar/use-tooltip@1.0.2(typescript@5.5.2)': dependencies: - radix-vue: 1.8.4(vue@3.4.30(typescript@5.5.2)) + tippy.js: 6.3.7 vue: 3.4.30(typescript@5.5.2) transitivePeerDependencies: - - '@vue/composition-api' - typescript '@sinclair/typebox@0.27.8': {} @@ -4589,6 +4232,11 @@ snapshots: dependencies: '@testing-library/dom': 9.3.4 + '@tybys/wasm-util@0.8.3': + dependencies: + tslib: 2.6.2 + optional: true + '@types/aria-query@5.0.4': {} '@types/body-parser@1.19.5': @@ -4620,11 +4268,6 @@ snapshots: '@types/qs': 6.9.15 '@types/serve-static': 1.15.7 - '@types/glob@7.2.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.14.8 - '@types/har-format@1.2.15': {} '@types/hast@3.0.4': @@ -4641,8 +4284,6 @@ snapshots: '@types/mime@1.3.5': {} - '@types/minimatch@5.1.2': {} - '@types/ms@0.7.34': {} '@types/node@20.14.8': @@ -4756,12 +4397,6 @@ snapshots: '@typescript-eslint/types': 6.18.0 eslint-visitor-keys: 3.4.3 - '@uiw/codemirror-themes@4.22.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)': - dependencies: - '@codemirror/language': 6.10.2 - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - '@ungap/structured-clone@1.2.0': {} '@unhead/dom@1.9.14': @@ -4964,6 +4599,10 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arctic@1.9.1: + dependencies: + oslo: 1.2.0 + arg@5.0.2: {} argparse@2.0.1: {} @@ -4980,35 +4619,17 @@ snapshots: dependencies: dequal: 2.0.3 - arr-diff@4.0.0: {} - - arr-flatten@1.1.0: {} - - arr-union@3.1.0: {} - array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - array-union@1.0.2: - dependencies: - array-uniq: 1.0.3 - array-union@2.1.0: {} - array-uniq@1.0.3: {} - - array-unique@0.3.2: {} - assertion-error@1.1.0: {} - assign-symbols@1.0.0: {} - asynckit@0.4.0: {} - atob@2.1.2: {} - available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -5025,16 +4646,6 @@ snapshots: balanced-match@1.0.2: {} - base@0.11.2: - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.1 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - binary-extensions@2.3.0: {} brace-expansion@1.1.11: @@ -5046,21 +4657,6 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@2.3.2: - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - braces@3.0.2: dependencies: fill-range: 7.0.1 @@ -5069,18 +4665,6 @@ snapshots: cac@6.7.14: {} - cache-base@1.0.1: - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.1 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 - call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -5089,8 +4673,6 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 - call-me-maybe@1.0.2: {} - callsites@3.1.0: {} camelcase-css@2.0.1: {} @@ -5145,32 +4727,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - class-utils@0.3.6: - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - clsx@2.0.0: {} - codemirror@6.0.1(@lezer/common@1.2.1): - dependencies: - '@codemirror/autocomplete': 6.16.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(@lezer/common@1.2.1) - '@codemirror/commands': 6.6.0 - '@codemirror/language': 6.10.2 - '@codemirror/lint': 6.8.1 - '@codemirror/search': 6.5.6 - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - transitivePeerDependencies: - - '@lezer/common' - - collection-visit@1.0.0: - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -5189,20 +4747,14 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@2.20.3: {} - commander@4.1.1: {} - component-emitter@1.3.1: {} + commander@9.5.0: {} concat-map@0.0.1: {} confbox@0.1.7: {} - copy-descriptor@0.1.1: {} - - crelt@1.0.6: {} - cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -5221,10 +4773,6 @@ snapshots: optionalDependencies: typescript: 5.5.2 - debug@2.6.9: - dependencies: - ms: 2.0.0 - debug@4.3.4: dependencies: ms: 2.1.2 @@ -5233,8 +4781,6 @@ snapshots: dependencies: character-entities: 2.0.2 - decode-uri-component@0.2.2: {} - deep-eql@4.1.4: dependencies: type-detect: 4.0.8 @@ -5274,19 +4820,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - define-property@0.2.5: - dependencies: - is-descriptor: 0.1.7 - - define-property@1.0.0: - dependencies: - is-descriptor: 1.0.3 - - define-property@2.0.2: - dependencies: - is-descriptor: 1.0.3 - isobject: 3.0.1 - defu@6.1.4: {} delayed-stream@1.0.0: {} @@ -5301,10 +4834,6 @@ snapshots: diff-sequences@29.6.3: {} - dir-glob@2.2.2: - dependencies: - path-type: 3.0.0 - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -5321,7 +4850,7 @@ snapshots: dotenv@16.4.5: {} - drizzle-kit@0.22.7: + drizzle-kit@0.22.8: dependencies: '@esbuild-kit/esm-loader': 2.5.5 esbuild: 0.19.11 @@ -5549,57 +5078,12 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - expand-brackets@2.1.4: - dependencies: - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - - extend-shallow@3.0.2: - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - extend@3.0.2: {} - extglob@2.0.4: - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - fast-deep-equal@3.1.3: {} fast-diff@1.2.0: {} - fast-glob@2.2.7: - dependencies: - '@mrmlnc/readdir-enhanced': 2.2.1 - '@nodelib/fs.stat': 1.1.3 - glob-parent: 3.1.0 - is-glob: 4.0.3 - merge2: 1.4.1 - micromatch: 3.1.10 - transitivePeerDependencies: - - supports-color - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5625,13 +5109,6 @@ snapshots: fs-extra: 11.1.1 ramda: 0.29.0 - fill-range@4.0.0: - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 @@ -5654,8 +5131,6 @@ snapshots: dependencies: is-callable: 1.2.7 - for-in@1.0.2: {} - foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 @@ -5672,16 +5147,15 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 - fragment-cache@0.2.1: - dependencies: - map-cache: 0.2.2 - fs-extra@11.1.1: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 + fs-monkey@1.0.6: + optional: true + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -5707,23 +5181,12 @@ snapshots: get-stream@8.0.1: {} - get-tsconfig@4.6.2: - dependencies: - resolve-pkg-maps: 1.0.0 - get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 - get-value@2.0.6: {} - github-slugger@2.0.0: {} - glob-parent@3.1.0: - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -5732,8 +5195,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regexp@0.3.0: {} - glob@10.3.10: dependencies: foreground-child: 3.1.1 @@ -5764,19 +5225,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globby@9.2.0: - dependencies: - '@types/glob': 7.2.0 - array-union: 1.0.2 - dir-glob: 2.2.2 - fast-glob: 2.2.7 - glob: 7.2.3 - ignore: 4.0.6 - pify: 4.0.1 - slash: 2.0.0 - transitivePeerDependencies: - - supports-color - globrex@0.1.2: {} gopd@1.0.1: @@ -5805,25 +5253,6 @@ snapshots: dependencies: has-symbols: 1.0.3 - has-value@0.3.1: - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - - has-value@1.0.0: - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - - has-values@0.1.4: {} - - has-values@1.0.0: - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -5949,11 +5378,11 @@ snapshots: highlightjs-vue@1.0.0: {} - hono-rate-limiter@0.3.0(hono@4.4.7): + hono-rate-limiter@0.4.0(hono@4.4.10): dependencies: - hono: 4.4.7 + hono: 4.4.10 - hono@4.4.7: {} + hono@4.4.10: {} hookable@5.5.3: {} @@ -5969,8 +5398,6 @@ snapshots: human-signals@5.0.0: {} - ignore@4.0.6: {} - ignore@5.2.4: {} import-fresh@3.3.0: @@ -5997,10 +5424,6 @@ snapshots: is-absolute-url@4.0.1: {} - is-accessor-descriptor@1.0.1: - dependencies: - hasown: 2.0.2 - is-arguments@1.1.1: dependencies: call-bind: 1.0.7 @@ -6024,38 +5447,16 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-buffer@1.1.6: {} - is-callable@1.2.7: {} is-core-module@2.14.0: dependencies: hasown: 2.0.2 - is-data-descriptor@1.0.1: - dependencies: - hasown: 2.0.2 - is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - is-descriptor@0.1.7: - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - - is-descriptor@1.0.3: - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - - is-extendable@0.1.1: {} - - is-extendable@1.0.1: - dependencies: - is-plain-object: 2.0.4 - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -6064,10 +5465,6 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-glob@3.1.0: - dependencies: - is-extglob: 2.1.1 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -6078,10 +5475,6 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-number@3.0.0: - dependencies: - kind-of: 3.2.2 - is-number@7.0.0: {} is-obj@1.0.1: {} @@ -6090,10 +5483,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -6128,23 +5517,10 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.2.4 - is-windows@1.0.2: {} - - isarray@1.0.0: {} - isarray@2.0.5: {} isexe@2.0.0: {} - isobject@2.1.0: - dependencies: - isarray: 1.0.0 - - isobject@3.0.1: {} - - isomorphic.js@0.2.5: - optional: true - jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 @@ -6153,6 +5529,8 @@ snapshots: jiti@1.21.6: {} + js-cookie@3.0.5: {} + js-tokens@4.0.0: {} js-tokens@9.0.0: {} @@ -6177,16 +5555,6 @@ snapshots: just-clone@6.2.0: {} - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - - kind-of@4.0.0: - dependencies: - is-buffer: 1.1.6 - - kind-of@6.0.3: {} - leven@4.0.0: {} levn@0.4.1: @@ -6194,11 +5562,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lib0@0.2.94: - dependencies: - isomorphic.js: 0.2.5 - optional: true - lilconfig@2.1.0: {} lilconfig@3.1.2: {} @@ -6236,20 +5599,18 @@ snapshots: dependencies: yallist: 4.0.0 + lucia@3.2.0: + dependencies: + oslo: 1.2.0 + lz-string@1.5.0: {} magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - map-cache@0.2.2: {} - map-or-similar@1.5.0: {} - map-visit@1.0.0: - dependencies: - object-visit: 1.0.1 - markdown-table@3.0.3: {} mdast-util-find-and-replace@3.0.1: @@ -6365,6 +5726,16 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + memfs-browser@3.5.10302: + dependencies: + memfs: 3.5.3 + optional: true + + memfs@3.5.3: + dependencies: + fs-monkey: 1.0.6 + optional: true + memoizerific@1.11.3: dependencies: map-or-similar: 1.5.0 @@ -6564,24 +5935,6 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@3.1.10: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - micromatch@4.0.5: dependencies: braces: 3.0.2 @@ -6607,11 +5960,6 @@ snapshots: minipass@7.0.4: {} - mixin-deep@1.3.2: - dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - mlly@1.7.1: dependencies: acorn: 8.12.0 @@ -6619,10 +5967,10 @@ snapshots: pkg-types: 1.1.1 ufo: 1.5.3 - ms@2.0.0: {} - ms@2.1.2: {} + mylas@2.1.13: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -6633,22 +5981,6 @@ snapshots: nanoid@5.0.7: {} - nanomatch@1.2.13: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - natural-compare@1.4.0: {} node-domexception@1.0.0: {} @@ -6661,12 +5993,6 @@ snapshots: object-assign@4.1.1: {} - object-copy@0.1.0: - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - object-hash@3.0.0: {} object-inspect@1.13.2: {} @@ -6678,10 +6004,6 @@ snapshots: object-keys@1.1.1: {} - object-visit@1.0.1: - dependencies: - isobject: 3.0.1 - object.assign@4.1.5: dependencies: call-bind: 1.0.7 @@ -6689,10 +6011,6 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 - object.pick@1.3.0: - dependencies: - isobject: 3.0.1 - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -6710,6 +6028,11 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + oslo@1.2.0: + dependencies: + '@node-rs/argon2': 1.7.0 + '@node-rs/bcrypt': 1.9.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -6732,10 +6055,6 @@ snapshots: dependencies: entities: 4.5.0 - pascalcase@0.1.1: {} - - path-dirname@1.0.2: {} - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -6751,10 +6070,6 @@ snapshots: lru-cache: 10.1.0 minipass: 7.0.4 - path-type@3.0.0: - dependencies: - pify: 3.0.0 - path-type@4.0.0: {} pathe@1.1.2: {} @@ -6802,10 +6117,6 @@ snapshots: pify@2.3.0: {} - pify@3.0.0: {} - - pify@4.0.1: {} - pirates@4.0.6: {} pkg-types@1.1.1: @@ -6814,7 +6125,9 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 - posix-character-classes@0.1.1: {} + plimit-lit@1.6.1: + dependencies: + queue-lit: 1.5.2 possible-typed-array-names@1.0.0: {} @@ -6903,6 +6216,8 @@ snapshots: dependencies: side-channel: 1.0.6 + queue-lit@1.5.2: {} + queue-microtask@1.2.3: {} radix-vue@1.8.4(vue@3.4.30(typescript@5.5.2)): @@ -6943,11 +6258,6 @@ snapshots: regenerator-runtime@0.14.1: {} - regex-not@1.0.2: - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 @@ -7048,26 +6358,18 @@ snapshots: mdast-util-to-markdown: 2.1.0 unified: 11.0.5 - repeat-element@1.1.4: {} - - repeat-string@1.6.1: {} - require-from-string@2.0.2: {} resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} - resolve-url@0.2.1: {} - resolve@1.22.8: dependencies: is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - ret@0.1.15: {} - reusify@1.0.4: {} rimraf@3.0.2: @@ -7104,10 +6406,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-regex@1.1.0: - dependencies: - ret: 0.1.15 - semver@7.5.4: dependencies: lru-cache: 6.0.0 @@ -7128,13 +6426,6 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - set-value@2.0.1: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -7152,69 +6443,23 @@ snapshots: signal-exit@4.1.0: {} - slash@2.0.0: {} - slash@3.0.0: {} - snapdragon-node@2.1.1: - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - - snapdragon-util@3.0.1: - dependencies: - kind-of: 3.2.2 - - snapdragon@0.8.2: - dependencies: - base: 0.11.2 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - source-map-js@1.2.0: {} - source-map-resolve@0.5.3: - dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - source-map-url@0.4.1: {} - - source-map@0.5.7: {} - source-map@0.6.1: {} space-separated-tokens@2.0.2: {} - split-string@3.1.0: - dependencies: - extend-shallow: 3.0.2 - split2@4.1.0: {} stackback@0.0.2: {} - static-extend@0.1.2: - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - std-env@3.7.0: {} stop-iteration-iterator@1.0.0: @@ -7264,8 +6509,6 @@ snapshots: dependencies: js-tokens: 9.0.0 - style-mod@4.1.2: {} - sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -7344,28 +6587,16 @@ snapshots: tinyspy@2.2.1: {} - to-fast-properties@2.0.0: {} - - to-object-path@0.3.0: + tippy.js@6.3.7: dependencies: - kind-of: 3.2.2 + '@popperjs/core': 2.11.8 - to-regex-range@2.1.1: - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - to-regex@3.0.2: - dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - trim-lines@3.0.1: {} trough@2.2.0: {} @@ -7378,17 +6609,19 @@ snapshots: ts-interface-checker@0.1.13: {} + tsc-alias@1.8.10: + dependencies: + chokidar: 3.6.0 + commander: 9.5.0 + globby: 11.1.0 + mylas: 2.1.13 + normalize-path: 3.0.0 + plimit-lit: 1.6.1 + tsconfck@3.1.0(typescript@5.5.2): optionalDependencies: typescript: 5.5.2 - tscpaths@0.0.9: - dependencies: - commander: 2.20.3 - globby: 9.2.0 - transitivePeerDependencies: - - supports-color - tslib@2.6.2: {} tsx@4.15.7: @@ -7431,13 +6664,6 @@ snapshots: trough: 2.2.0 vfile: 6.0.1 - union-value@1.0.1: - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.2 @@ -7468,19 +6694,10 @@ snapshots: universalify@2.0.1: {} - unset-value@1.0.0: - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - uri-js@4.4.1: dependencies: punycode: 2.1.1 - urix@0.1.0: {} - - use@3.1.1: {} - util-deprecate@1.0.2: {} util@0.12.5: @@ -7598,8 +6815,6 @@ snapshots: optionalDependencies: typescript: 5.5.2 - w3c-keyname@2.2.8: {} - web-namespaces@2.0.1: {} web-streams-polyfill@4.0.0-beta.3: {} @@ -7652,23 +6867,10 @@ snapshots: xtend@4.0.2: {} - y-codemirror.next@0.3.5(@codemirror/state@6.4.1)(@codemirror/view@6.28.2)(yjs@13.6.18): - dependencies: - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.28.2 - lib0: 0.2.94 - yjs: 13.6.18 - optional: true - yallist@4.0.0: {} yaml@2.4.5: {} - yjs@13.6.18: - dependencies: - lib0: 0.2.94 - optional: true - yocto-queue@0.1.0: {} yocto-queue@1.0.0: {} diff --git a/src/config/db/drizzle.ts b/src/config/db/drizzle.mts similarity index 70% rename from src/config/db/drizzle.ts rename to src/config/db/drizzle.mts index 846e2b6..85b70a9 100644 --- a/src/config/db/drizzle.ts +++ b/src/config/db/drizzle.mts @@ -1,8 +1,8 @@ import { drizzle } from "drizzle-orm/postgres-js"; import postgres from "postgres"; -import { env } from "@/config/env"; -import * as schema from "./schema"; +import { env } from "@/config/env.mjs"; +import * as schema from "./schema.mjs"; const client = postgres(env.DATABASE_URL); export const db = drizzle(client, { schema, logger: true }); diff --git a/src/config/db/index.mts b/src/config/db/index.mts new file mode 100644 index 0000000..e8c27dc --- /dev/null +++ b/src/config/db/index.mts @@ -0,0 +1 @@ +export { db } from "./drizzle.mjs"; diff --git a/src/config/db/index.ts b/src/config/db/index.ts deleted file mode 100644 index 04565f6..0000000 --- a/src/config/db/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { db } from "./drizzle"; diff --git a/src/config/db/schema.mts b/src/config/db/schema.mts new file mode 100644 index 0000000..facadf4 --- /dev/null +++ b/src/config/db/schema.mts @@ -0,0 +1,137 @@ +import { relations } from "drizzle-orm"; +import { boolean, index, jsonb, pgTable, primaryKey, text, timestamp } from "drizzle-orm/pg-core"; + +export const logs = pgTable( + "logs", + { + id: text("id").primaryKey().notNull(), + action: text("action").notNull(), + environment: text("environment").notNull(), + ip: text("ip"), + data: jsonb("data"), + createdAt: timestamp("created_at", { precision: 3, mode: "string" }).defaultNow().notNull(), + serviceId: text("service_id") + .notNull() + .references(() => services.id, { onDelete: "cascade", onUpdate: "cascade" }), + level: text("level").default("info").notNull(), + lookupFilterValue: text("lookup_filter_value"), + isPersisted: boolean("is_persisted").notNull(), + }, + (table) => { + return { + createdAtIdx: index("log_created_at_idx").on(table.createdAt), + levelIdx: index("log_level_idx").on(table.level), + }; + }, +); + +export const logRelations = relations(logs, ({ one }) => ({ + service: one(services, { + fields: [logs.serviceId], + references: [services.id], + }), +})); + +export const services = pgTable( + "services", + { + id: text("id").primaryKey().notNull(), + name: text("name").notNull(), + isActive: boolean("is_active").notNull(), + createdAt: timestamp("created_at", { precision: 3, mode: "string" }).defaultNow().notNull(), + isPersisted: boolean("is_persisted").notNull(), + isAdmin: boolean("is_admin").notNull(), + tenantId: text("tenant_id").references(() => tenants.id), + }, + (table) => { + return { + createdAtIdx: index("service_created_at_idx").on(table.createdAt), + serviceTenantIdx: index("service_tenant_idx").on(table.tenantId), + }; + }, +); + +export const serviceRelations = relations(services, ({ many, one }) => ({ + logs: many(logs), + tenant: one(tenants, { + fields: [services.tenantId], + references: [tenants.id], + }), +})); + +export const tenants = pgTable("tenants", { + id: text("id").primaryKey().notNull(), + name: text("name").notNull(), + workspace: text("workspace").notNull().unique(), + createdAt: timestamp("created_at", { withTimezone: true, mode: "date" }).defaultNow().notNull(), + updatedAt: timestamp("updated_at", { withTimezone: true, mode: "date" }).defaultNow().notNull(), +}); + +export const tenantRelations = relations(tenants, ({ many }) => ({ + usersToTenants: many(usersToTenants), + services: many(services), +})); + +export const users = pgTable("users", { + id: text("id").primaryKey().notNull(), + username: text("username").notNull(), + githubId: text("github_id").unique(), + createdAt: timestamp("created_at", { withTimezone: true, mode: "date" }).defaultNow().notNull(), + updatedAt: timestamp("updated_at", { withTimezone: true, mode: "date" }).defaultNow().notNull(), +}); + +export const userRelations = relations(users, ({ many }) => ({ + usersToTenants: many(usersToTenants), + sessions: many(sessions), +})); + +export const usersToTenants = pgTable( + "users_to_tenants", + { + userId: text("user_id") + .notNull() + .references(() => users.id, { + onDelete: "cascade", + onUpdate: "cascade", + }), + tenantId: text("tenant_id") + .notNull() + .references(() => tenants.id, { + onDelete: "cascade", + onUpdate: "cascade", + }), + }, + (t) => ({ + id: primaryKey({ columns: [t.userId, t.tenantId] }), + }), +); + +export const usersToTenantsRelations = relations(usersToTenants, ({ one }) => ({ + tenant: one(tenants, { + fields: [usersToTenants.tenantId], + references: [tenants.id], + }), + user: one(users, { + fields: [usersToTenants.userId], + references: [users.id], + }), +})); + +export const sessions = pgTable("sessions", { + id: text("id").primaryKey().notNull(), + userId: text("user_id") + .notNull() + .references(() => users.id, { onDelete: "cascade", onUpdate: "cascade" }), + expiresAt: timestamp("expires_at", { + withTimezone: true, + mode: "date", + }).notNull(), + createdAt: timestamp("created_at", { withTimezone: true, mode: "date" }).defaultNow().notNull(), +}); + +export const sessionRelations = relations(sessions, ({ one }) => ({ + user: one(users, { + fields: [sessions.userId], + references: [users.id], + }), +})); diff --git a/src/config/db/schema.ts b/src/config/db/schema.ts deleted file mode 100644 index 5924885..0000000 --- a/src/config/db/schema.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { relations } from "drizzle-orm"; -import { boolean, index, jsonb, pgTable, text, timestamp } from "drizzle-orm/pg-core"; - -export const logs = pgTable( - "logs", - { - id: text("id").primaryKey().notNull(), - action: text("action").notNull(), - environment: text("environment").notNull(), - ip: text("ip"), - data: jsonb("data"), - createdAt: timestamp("created_at", { precision: 3, mode: "string" }).defaultNow().notNull(), - serviceId: text("service_id") - .notNull() - .references(() => services.id, { onDelete: "cascade", onUpdate: "cascade" }), - level: text("level").default("info").notNull(), - lookupFilterValue: text("lookup_filter_value"), - isPersisted: boolean("is_persisted").notNull(), - }, - (table) => { - return { - createdAtIdx: index("log_created_at_idx").on(table.createdAt), - levelIdx: index("log_level_idx").on(table.level), - }; - }, -); - -export const logRelations = relations(logs, ({ one }) => ({ - service: one(services, { - fields: [logs.serviceId], - references: [services.id], - }), -})); - -export const services = pgTable( - "services", - { - id: text("id").primaryKey().notNull(), - name: text("name").notNull(), - isActive: boolean("is_active").notNull(), - createdAt: timestamp("created_at", { precision: 3, mode: "string" }).defaultNow().notNull(), - isPersisted: boolean("is_persisted").notNull(), - isAdmin: boolean("is_admin").notNull(), - }, - (table) => { - return { - createdAtIdx: index("service_created_at_idx").on(table.createdAt), - }; - }, -); - -export const serviceRelations = relations(services, ({ many }) => ({ - logs: many(logs), -})); diff --git a/src/config/env.ts b/src/config/env.mts similarity index 93% rename from src/config/env.ts rename to src/config/env.mts index 924846d..72f9a8b 100644 --- a/src/config/env.ts +++ b/src/config/env.mts @@ -10,6 +10,8 @@ const envSchema = z.object({ DEFAULT_NUM_OF_MONTHS_TO_DELETE: z.string().default("8"), SERVER_URI: z.string().default("http://localhost"), FREEZE_DB_WRITES: z.preprocess((val) => val === "true" || val === "1", z.boolean()).default(false), + GITHUB_CLIENT_ID: z.string(), + GITHUB_CLIENT_SECRET: z.string(), }); const envData = envSchema.safeParse(process.env); diff --git a/src/config/lucia/adapter.mts b/src/config/lucia/adapter.mts new file mode 100644 index 0000000..7bc47d2 --- /dev/null +++ b/src/config/lucia/adapter.mts @@ -0,0 +1,83 @@ +import type { db } from "@/config/db/index.mjs"; +import type { sessions, users } from "@/config/db/schema.mjs"; +import { eq, lte } from "drizzle-orm"; +import type { Adapter, DatabaseSession, DatabaseUser, UserId } from "lucia"; + +type Database = typeof db; +type DatabaseSessionTable = typeof sessions; +type DatabaseUserTable = typeof users; + +export class DrizzleLuciaAdapter implements Adapter { + db: Database; + sessionTable: DatabaseSessionTable; + userTable: DatabaseUserTable; + + constructor(dbInstance: Database, sessionTable: DatabaseSessionTable, usersTable: DatabaseUserTable) { + this.db = dbInstance; + this.sessionTable = sessionTable; + this.userTable = usersTable; + } + + public async getSessionAndUser( + sessionId: string, + ): Promise<[session: DatabaseSession | null, user: DatabaseUser | null]> { + const result = await this.db + .select({ user: this.userTable, session: this.sessionTable }) + .from(this.sessionTable) + .innerJoin(this.userTable, eq(this.sessionTable.userId, this.userTable.id)) + .where(eq(this.sessionTable.id, sessionId)) + .execute(); + + if (result.length !== 1) return [null, null]; + + const { session, user } = result[0]!; + + return [transformIntoDatabaseSession(session), transformIntoDatabaseUser(user)]; + } + public async getUserSessions(userId: UserId): Promise { + const result = await this.db.select().from(this.sessionTable).where(eq(this.sessionTable.userId, userId)); + return result.map((val) => { + return transformIntoDatabaseSession(val); + }); + } + public async setSession(session: DatabaseSession): Promise { + await this.db.insert(this.sessionTable).values({ + id: session.id, + userId: session.userId, + expiresAt: session.expiresAt, + ...session.attributes, + }); + } + public async updateSessionExpiration(sessionId: string, expiresAt: Date): Promise { + await this.db + .update(this.sessionTable) + .set({ + expiresAt: expiresAt, + }) + .where(eq(this.sessionTable.id, sessionId)); + } + public async deleteSession(sessionId: string): Promise { + await this.db.delete(this.sessionTable).where(eq(this.sessionTable.id, sessionId)); + } + public async deleteUserSessions(userId: UserId): Promise { + await this.db.delete(this.sessionTable).where(eq(this.sessionTable.userId, userId)); + } + public async deleteExpiredSessions(): Promise { + await this.db.delete(this.sessionTable).where(lte(this.sessionTable.expiresAt, new Date())); + } +} + +function transformIntoDatabaseSession(raw: typeof sessions.$inferSelect): DatabaseSession { + const { id, userId, expiresAt, ...attributes } = raw; + return { + userId, + id, + expiresAt, + attributes, + }; +} + +function transformIntoDatabaseUser(raw: typeof users.$inferSelect): DatabaseUser { + const { id, ...attributes } = raw; + return { id, attributes: attributes } as unknown as DatabaseUser; +} diff --git a/src/config/lucia/index.mts b/src/config/lucia/index.mts new file mode 100644 index 0000000..7c4ccdf --- /dev/null +++ b/src/config/lucia/index.mts @@ -0,0 +1,38 @@ +import { GitHub } from "arctic"; +import type { DatabaseUser } from "lucia"; +import { Lucia } from "lucia"; + +import { db } from "@/config/db/index.mjs"; +import { sessions, users } from "@/config/db/schema.mjs"; +import { env } from "@/config/env.mjs"; +import { DrizzleLuciaAdapter } from "./adapter.mjs"; + +export interface LuciaUser extends DatabaseUser { + username: (typeof users.$inferSelect)["username"]; + githubId: (typeof users.$inferSelect)["githubId"]; +} + +const adapter = new DrizzleLuciaAdapter(db, sessions, users); + +export const lucia = new Lucia(adapter, { + sessionCookie: { + attributes: { + secure: process.env.NODE_ENV === "production", + }, + }, + getUserAttributes: (attributes) => { + return { + githubId: attributes.githubId, + username: attributes.username, + }; + }, +}); + +export const github = new GitHub(env.GITHUB_CLIENT_ID, env.GITHUB_CLIENT_SECRET); + +declare module "lucia" { + interface Register { + Lucia: typeof lucia; + DatabaseUserAttributes: Omit; + } +} diff --git a/src/index.ts b/src/index.mts similarity index 81% rename from src/index.ts rename to src/index.mts index 5e63bea..24beabc 100644 --- a/src/index.ts +++ b/src/index.mts @@ -1,12 +1,12 @@ import { serve } from "@hono/node-server"; -import { env } from "@/config/env"; -import { openapiYmlVersioner, transformOpenapiYmlDoc } from "@/utils/openapi-docs"; -import { getPackageInfo } from "@/utils/package"; +import { env } from "@/config/env.mjs"; +import { openapiYmlVersioner, transformOpenapiYmlDoc } from "@/utils/openapi-docs.mjs"; +import { getPackageInfo } from "@/utils/package.mjs"; const packageJson = getPackageInfo(); -import server from "./server"; +import server from "./server.mjs"; if (env.FREEZE_DB_WRITES) { console.warn("\nšŸšØ Database writes are currently frozen!!!\n"); diff --git a/src/routers/app/auth/github.mts b/src/routers/app/auth/github.mts new file mode 100644 index 0000000..c5eac73 --- /dev/null +++ b/src/routers/app/auth/github.mts @@ -0,0 +1,108 @@ +import { OAuth2RequestError, generateState } from "arctic"; +import { Hono } from "hono"; +import { getCookie, setCookie } from "hono/cookie"; +import { z } from "zod"; + +import { db } from "@/config/db/index.mjs"; +import { + tenants as tenantsTable, + users as usersTable, + usersToTenants as usersToTenantsTable, +} from "@/config/db/schema.mjs"; +import { env } from "@/config/env.mjs"; +import { github, lucia } from "@/config/lucia/index.mjs"; +import { createDbId } from "@/utils/db.mjs"; + +import type { ServerContext } from "@/types/hono.mjs"; + +const app = new Hono(); + +app.get("/", async (c) => { + const state = generateState(); + const url = await github.createAuthorizationURL(state); + + setCookie(c, "github_oauth_state", state, { + path: "/", + secure: env.NODE_ENV === "production", + httpOnly: true, + maxAge: 60 * 10, + sameSite: "Lax", + }); + + setCookie(c, "post_login_redirect", "/app", { + path: "/", + secure: env.NODE_ENV === "production", + httpOnly: true, + maxAge: 60 * 10, + sameSite: "Lax", + }); + + return c.redirect(url.toString()); +}); + +const githubUserSchema = z.object({ + id: z.number(), + login: z.string(), +}); + +app.get("/callback", async (c) => { + const code = c.req.query("code")?.toString() ?? null; + const state = c.req.query("state")?.toString() ?? null; + const storedState = getCookie(c).github_oauth_state ?? null; + + if (!code || !state || !storedState || state !== storedState) { + return c.body(null, 400); + } + + const postLoginRedirect = getCookie(c).post_login_redirect ?? "/app"; + + try { + const tokens = await github.validateAuthorizationCode(code); + const githubUserResponse = await fetch("https://api.github.com/user", { + headers: { + Authorization: `Bearer ${tokens.accessToken}`, + }, + }); + const githubUserJson = await githubUserResponse.json(); + const githubUser = githubUserSchema.parse(githubUserJson); + + const existingUser = await db.query.users.findFirst({ + where: (fields, { eq }) => eq(fields.githubId, githubUser.id.toString()), + }); + + if (existingUser) { + const session = await lucia.createSession(existingUser.id, {}); + c.header("Set-Cookie", lucia.createSessionCookie(session.id).serialize(), { append: true }); + return c.redirect(postLoginRedirect); + } + + const tenantId = createDbId("tenant"); + const userId = createDbId("user"); + + await db.transaction(async (tx) => { + // create the default tenant + await tx.insert(tenantsTable).values({ id: tenantId, name: "default", workspace: tenantId }); + + // create the user + await tx + .insert(usersTable) + .values({ id: userId, githubId: githubUser.id.toString(), username: githubUser.login }); + + // connect user to default tenant + await tx.insert(usersToTenantsTable).values({ userId, tenantId }); + }); + + const session = await lucia.createSession(userId, {}); + c.header("Set-Cookie", lucia.createSessionCookie(session.id).serialize(), { append: true }); + + return c.redirect(postLoginRedirect); + } catch (error) { + if (error instanceof OAuth2RequestError && error.message === "bad_verification_code") { + // invalid code + return c.body(null, 400); + } + return c.body(null, 500); + } +}); + +export default app; diff --git a/src/routers/app/auth/index.mts b/src/routers/app/auth/index.mts new file mode 100644 index 0000000..2190021 --- /dev/null +++ b/src/routers/app/auth/index.mts @@ -0,0 +1,25 @@ +import type { ServerContext } from "@/types/hono.mjs"; +import { Hono } from "hono"; + +import { lucia } from "@/config/lucia/index.mjs"; + +import githubAuthRouter from "./github.mjs"; + +const app = new Hono(); + +app.route("/login/github", githubAuthRouter); + +app.get("/logout", async (c) => { + const session = c.get("session"); + if (!session) { + return c.body(null, 401); + } + + await lucia.invalidateSession(session.id); + + c.header("Set-Cookie", lucia.createBlankSessionCookie().serialize(), { append: true }); + + return c.redirect("/app"); +}); + +export default app; diff --git a/src/routers/app/index.mts b/src/routers/app/index.mts new file mode 100644 index 0000000..f364c4e --- /dev/null +++ b/src/routers/app/index.mts @@ -0,0 +1,37 @@ +import type { ServerContext } from "@/types/hono.mjs"; +import { Hono } from "hono"; + +import { lucia } from "@/config/lucia/index.mjs"; + +import authRouter from "./auth/index.mjs"; +import uiRouter from "./ui/index.js"; + +const app = new Hono(); + +app.use("*", async (c, next) => { + const sessionId = lucia.readSessionCookie(c.req.header("Cookie") ?? ""); + if (!sessionId) { + c.set("user", null); + c.set("session", null); + return await next(); + } + + const { session, user } = await lucia.validateSession(sessionId); + if (session && session.fresh) { + c.header("Set-Cookie", lucia.createSessionCookie(session.id).serialize(), { append: true }); + } + + if (!session) { + c.header("Set-Cookie", lucia.createBlankSessionCookie().serialize(), { append: true }); + } + + c.set("user", user); + c.set("session", session); + + return await next(); +}); + +app.route("", authRouter); +app.route("", uiRouter); + +export default app; diff --git a/src/routers/app/ui/components/button.tsx b/src/routers/app/ui/components/button.tsx new file mode 100644 index 0000000..ea6677d --- /dev/null +++ b/src/routers/app/ui/components/button.tsx @@ -0,0 +1,31 @@ +import type { PropsWithChildren } from "hono/jsx"; + +const buttonStyles = { + primary: + "border border-transparent text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 shadow-sm", + secondary: + "border border-transparent text-indigo-700 bg-indigo-100 hover:bg-indigo-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500", +}; + +const buttonSize = { + xs: "px-3 py-2 text-sm leading-4 font-medium rounded-md", + sm: "px-4 py-2 text-sm font-medium rounded-md", + md: "px-4 py-2 text-base font-medium rounded-md", +}; + +export function getButtonStyles(variant: keyof typeof buttonStyles, size: keyof typeof buttonSize = "md") { + return ["inline-flex items-center justify-center", buttonStyles[variant], buttonSize[size]].join(" "); +} + +export function Button({ + children, + variant = "primary", + size = "md", + ...props +}: PropsWithChildren<{ variant?: keyof typeof buttonStyles; size?: keyof typeof buttonSize }>) { + return ( + + ); +} diff --git a/src/routers/app/ui/components/card.tsx b/src/routers/app/ui/components/card.tsx new file mode 100644 index 0000000..d665563 --- /dev/null +++ b/src/routers/app/ui/components/card.tsx @@ -0,0 +1,9 @@ +import type { FC, PropsWithChildren } from "hono/jsx"; + +export const Card: FC> = ({ class: className, children }) => { + return ( +
+ {children} +
+ ); +}; diff --git a/src/routers/app/ui/components/icons.tsx b/src/routers/app/ui/components/icons.tsx new file mode 100644 index 0000000..e85c1be --- /dev/null +++ b/src/routers/app/ui/components/icons.tsx @@ -0,0 +1,35 @@ +export const icons = { + Github: ({ class: className }: { class?: string }) => ( + + + + + + + + + + + + + + + + + + + + + ), +}; diff --git a/src/routers/app/ui/index.tsx b/src/routers/app/ui/index.tsx new file mode 100644 index 0000000..bef0dc7 --- /dev/null +++ b/src/routers/app/ui/index.tsx @@ -0,0 +1,77 @@ +import { Hono } from "hono"; + +import { db } from "@/config/db/index.mjs"; + +import { DashboardLandingPage } from "./pages/dashboard-landing.js"; +import { LoginPage } from "./pages/login.js"; +import { WorkspaceLandingPage } from "./pages/workspace-landing.js"; +import { WorkspaceEditPage } from "./pages/workspace-edit.js"; +import { ServiceLandingPage } from "./pages/service-landing.js"; +import { ServiceEditPage } from "./pages/service-edit.js"; + +import { checkTenantMembership, checkUserAuthed, checkServiceTenantMembership } from "./utils/middleware.mjs"; + +import type { ServerContext } from "@/types/hono.mjs"; + +const app = new Hono(); + +app.get("/", checkUserAuthed, async (c) => { + const user = c.var.user!; + + const relationships = await db.query.usersToTenants.findMany({ + where: (fields, { eq }) => eq(fields.userId, user.id), + with: { tenant: true }, + }); + + const tenants = relationships.map((r) => r.tenant); + + return c.html(); +}); + +app.get("/login", async (c) => { + const user = c.var.user; + + if (user) { + return c.redirect("/app"); + } + + return c.html(); +}); + +app.get("/:workspace", checkUserAuthed, checkTenantMembership, async (c) => { + const tenant = c.var.tenant!; + + const services = await db.query.services.findMany({ + where: (fields, { eq }) => eq(fields.tenantId, tenant.id), + }); + + return c.html(); +}); + +app.get("/:workspace/edit", checkUserAuthed, checkTenantMembership, async (c) => { + const tenant = c.var.tenant!; + + return c.html(); +}); + +app.get("/:workspace/:service_id", checkUserAuthed, checkTenantMembership, checkServiceTenantMembership, async (c) => { + const tenant = c.var.tenant!; + const service = c.var.service!; + + return c.html(); +}); + +app.get( + "/:workspace/:service_id/edit", + checkUserAuthed, + checkTenantMembership, + checkServiceTenantMembership, + async (c) => { + const tenant = c.var.tenant!; + const service = c.var.service!; + + return c.html(); + }, +); + +export default app; diff --git a/src/routers/app/ui/layouts/root-document.tsx b/src/routers/app/ui/layouts/root-document.tsx new file mode 100644 index 0000000..7fab664 --- /dev/null +++ b/src/routers/app/ui/layouts/root-document.tsx @@ -0,0 +1,15 @@ +import type { FC, PropsWithChildren } from "hono/jsx"; + +export const RootDocument: FC> = ({ title, children }) => { + return ( + + + + + {title} + + + {children} + + ); +}; diff --git a/src/routers/app/ui/pages/dashboard-landing.tsx b/src/routers/app/ui/pages/dashboard-landing.tsx new file mode 100644 index 0000000..1fe20c9 --- /dev/null +++ b/src/routers/app/ui/pages/dashboard-landing.tsx @@ -0,0 +1,79 @@ +import type { FC } from "hono/jsx"; +import type { User } from "lucia"; + +import { RootDocument } from "../layouts/root-document.js"; +import { Card } from "../components/card.js"; +import { getButtonStyles } from "../components/button.js"; +import { dateFormatter } from "../utils/date.mjs"; + +import type { TenantRecord } from "@/types/db.mjs"; + +export const DashboardLandingPage: FC<{ + user: User; + tenants: Array; +}> = ({ user, tenants }) => { + const githubId = user.githubId; + const githubMessage = + user && githubId ? `, ${user.username} with a github id of "${githubId}"` : " user with no github-id"; + + return ( + +
+ +
+

Organizations

+

{`Hello${githubMessage}`}

+ +

Select the organization you want to view or edit.

+
+
+ + + + + + + + + + {tenants.map((tenant) => ( + + + + + + ))} + +
+ Name + + Created at + + Edit +
+ + {tenant.name} + + + {dateFormatter.humanReadable(tenant.createdAt)} + + + Edit, {tenant.name} + +
+
+
+
+
+ ); +}; diff --git a/src/routers/app/ui/pages/login.tsx b/src/routers/app/ui/pages/login.tsx new file mode 100644 index 0000000..b9cd5fb --- /dev/null +++ b/src/routers/app/ui/pages/login.tsx @@ -0,0 +1,27 @@ +import type { FC } from "hono/jsx"; + +import { RootDocument } from "../layouts/root-document.js"; +import { Card } from "../components/card.js"; +import { getButtonStyles } from "../components/button.js"; +import { icons } from "../components/icons.js"; + +export const LoginPage: FC = () => { + return ( + +
+ +
+

Login

+

You must first sign in with GitHub to access the application.

+
+ +
+
+
+ ); +}; diff --git a/src/routers/app/ui/pages/service-edit.tsx b/src/routers/app/ui/pages/service-edit.tsx new file mode 100644 index 0000000..3dea024 --- /dev/null +++ b/src/routers/app/ui/pages/service-edit.tsx @@ -0,0 +1,27 @@ +import type { FC } from "hono/jsx"; + +import { RootDocument } from "../layouts/root-document.js"; +import { Card } from "../components/card.js"; +import { getButtonStyles } from "../components/button.js"; + +import type { ServiceRecord, TenantRecord } from "@/types/db.mjs"; + +export const ServiceEditPage: FC<{ tenant: TenantRecord; service: ServiceRecord }> = ({ tenant, service }) => { + return ( + +
+ +
+

"{service.name}" Service Edit

+

You can edit the service here.

+ +
+
+
+
+ ); +}; diff --git a/src/routers/app/ui/pages/service-landing.tsx b/src/routers/app/ui/pages/service-landing.tsx new file mode 100644 index 0000000..8fb7a70 --- /dev/null +++ b/src/routers/app/ui/pages/service-landing.tsx @@ -0,0 +1,36 @@ +import type { FC } from "hono/jsx"; + +import { RootDocument } from "../layouts/root-document.js"; +import { Card } from "../components/card.js"; +import { getButtonStyles } from "../components/button.js"; + +import type { ServiceRecord, TenantRecord } from "@/types/db.mjs"; + +export const ServiceLandingPage: FC<{ + tenant: TenantRecord; + service: ServiceRecord; +}> = ({ service, tenant }) => { + return ( + +
+ +
+

Service: {service.name}

+

Service landing page.

+ +
+
+
+
+ ); +}; diff --git a/src/routers/app/ui/pages/workspace-edit.tsx b/src/routers/app/ui/pages/workspace-edit.tsx new file mode 100644 index 0000000..144d89f --- /dev/null +++ b/src/routers/app/ui/pages/workspace-edit.tsx @@ -0,0 +1,27 @@ +import type { FC } from "hono/jsx"; + +import { RootDocument } from "../layouts/root-document.js"; +import { Card } from "../components/card.js"; +import { getButtonStyles } from "../components/button.js"; + +import type { TenantRecord } from "@/types/db.mjs"; + +export const WorkspaceEditPage: FC<{ tenant: TenantRecord }> = ({ tenant }) => { + return ( + +
+ +
+

"{tenant.name}" Workspace Edit

+

You can edit the workspace here.

+ +
+
+
+
+ ); +}; diff --git a/src/routers/app/ui/pages/workspace-landing.tsx b/src/routers/app/ui/pages/workspace-landing.tsx new file mode 100644 index 0000000..c1b79fb --- /dev/null +++ b/src/routers/app/ui/pages/workspace-landing.tsx @@ -0,0 +1,82 @@ +import type { FC } from "hono/jsx"; + +import { RootDocument } from "../layouts/root-document.js"; +import { Card } from "../components/card.js"; +import { getButtonStyles } from "../components/button.js"; +import { dateFormatter } from "../utils/date.mjs"; + +import type { ServiceRecord, TenantRecord } from "@/types/db.mjs"; + +export const WorkspaceLandingPage: FC<{ + tenant: TenantRecord; + services: Array; +}> = ({ tenant, services }) => { + return ( + +
+ +
+

Services

+

These are the services managed by this organization ({tenant.name}).

+ +

+ You can view and edit the services managed by this organization here. +

+
+
+ + + + + + + + + + {services.map((service) => ( + + + + + + ))} + +
+ Service name + + Created at + + Edit +
+ + {service.name} + + + {dateFormatter.humanReadable(new Date(service.createdAt))} + + + Edit, {service.name} + +
+
+
+
+
+ ); +}; diff --git a/src/routers/app/ui/utils/date.mts b/src/routers/app/ui/utils/date.mts new file mode 100644 index 0000000..aa281bf --- /dev/null +++ b/src/routers/app/ui/utils/date.mts @@ -0,0 +1,14 @@ +function intlDateFormatter(date: Date) { + return new Intl.DateTimeFormat(undefined, { + year: "numeric", + month: "long", + day: "numeric", + hour: "numeric", + minute: "numeric", + second: "numeric", + }).format(date); +} + +export const dateFormatter = { + humanReadable: intlDateFormatter, +}; diff --git a/src/routers/app/ui/utils/middleware.mts b/src/routers/app/ui/utils/middleware.mts new file mode 100644 index 0000000..2f8fa08 --- /dev/null +++ b/src/routers/app/ui/utils/middleware.mts @@ -0,0 +1,58 @@ +import { createMiddleware } from "hono/factory"; +import { HTTPException } from "hono/http-exception"; + +import { db } from "@/config/db/index.mjs"; + +import type { ServerContext } from "@/types/hono.mjs"; + +export const checkUserAuthed = createMiddleware(async (c, next) => { + const user = c.var.user; + + if (!user) { + return c.redirect("/app/login"); + } + + return await next(); +}); + +export const checkTenantMembership = createMiddleware(async (c, next) => { + const userId = c.var.user!.id; + const workspace = c.req.param("workspace"); + + const tenant = await db.query.tenants.findFirst({ + where: (fields, { eq }) => eq(fields.workspace, workspace), + }); + + if (!tenant) { + throw new HTTPException(404, { message: "Workspace not found." }); + } + + const relationship = await db.query.usersToTenants.findFirst({ + where: (fields, { and, eq }) => and(eq(fields.userId, userId), eq(fields.tenantId, tenant.id)), + }); + + if (!relationship) { + throw new HTTPException(403, { message: "You do not have access to this workspace." }); + } + + c.set("tenant", tenant); + + return await next(); +}); + +export const checkServiceTenantMembership = createMiddleware(async (c, next) => { + const tenant = c.var.tenant!; + const serviceId = c.req.param("service_id"); + + const service = await db.query.services.findFirst({ + where: (fields, { and, eq }) => and(eq(fields.id, serviceId), eq(fields.tenantId, tenant.id)), + }); + + if (!service) { + throw new HTTPException(404, { message: "Service not found." }); + } + + c.set("service", service); + + return await next(); +}); diff --git a/src/routers/docs/index.ts b/src/routers/docs/index.mts similarity index 66% rename from src/routers/docs/index.ts rename to src/routers/docs/index.mts index 0b06d04..dd90664 100644 --- a/src/routers/docs/index.ts +++ b/src/routers/docs/index.mts @@ -1,8 +1,8 @@ import { Hono } from "hono"; -import type { ServerContext } from "@/types/hono"; +import type { ServerContext } from "@/types/hono.mjs"; -import v2DocsRouter from "./v2"; +import v2DocsRouter from "./v2.mjs"; const app = new Hono(); diff --git a/src/routers/docs/v2.ts b/src/routers/docs/v2.mts similarity index 85% rename from src/routers/docs/v2.ts rename to src/routers/docs/v2.mts index 7b00edf..696b071 100644 --- a/src/routers/docs/v2.ts +++ b/src/routers/docs/v2.mts @@ -1,7 +1,7 @@ import { apiReference } from "@scalar/hono-api-reference"; import { Hono } from "hono"; -import type { ServerContext } from "@/types/hono"; +import type { ServerContext } from "@/types/hono.mjs"; const app = new Hono(); diff --git a/src/routers/v2/index.ts b/src/routers/v2/index.mts similarity index 77% rename from src/routers/v2/index.ts rename to src/routers/v2/index.mts index e30a96f..747979a 100644 --- a/src/routers/v2/index.ts +++ b/src/routers/v2/index.mts @@ -1,10 +1,10 @@ import { Hono } from "hono"; import { rateLimiter } from "hono-rate-limiter"; -import type { ServerContext } from "@/types/hono"; +import type { ServerContext } from "@/types/hono.mjs"; -import logsRouter from "./logging"; -import servicesRouter from "./services"; +import logsRouter from "./logging/index.mjs"; +import servicesRouter from "./services/index.mjs"; const app = new Hono(); diff --git a/src/routers/v2/logging/index.ts b/src/routers/v2/logging/index.mts similarity index 91% rename from src/routers/v2/logging/index.ts rename to src/routers/v2/logging/index.mts index 78bcee7..f317da5 100644 --- a/src/routers/v2/logging/index.ts +++ b/src/routers/v2/logging/index.mts @@ -2,15 +2,15 @@ import { and, eq, lt } from "drizzle-orm"; import { Hono } from "hono"; import { HTTPException } from "hono/http-exception"; -import { db } from "@/config/db"; -import { logs as logsTable } from "@/config/db/schema"; -import { env } from "@/config/env"; -import type { ServerContext } from "@/types/hono"; -import { createDbId } from "@/utils/db"; -import { ENDPOINT_MESSAGES } from "@/utils/messages"; -import { createV2ErrResponse, parseSearchParams, v2_serviceValidation } from "@/utils/server-helpers"; - -import { createLogOutputSchema, createLogSchema, getLogsFiltersSchema, getLogsOutputSchema } from "./schemas"; +import { db } from "@/config/db/index.mjs"; +import { logs as logsTable } from "@/config/db/schema.mjs"; +import { env } from "@/config/env.mjs"; +import type { ServerContext } from "@/types/hono.mjs"; +import { createDbId } from "@/utils/db.mjs"; +import { ENDPOINT_MESSAGES } from "@/utils/messages.mjs"; +import { createV2ErrResponse, parseSearchParams, v2_serviceValidation } from "@/utils/server-helpers.mjs"; + +import { createLogOutputSchema, createLogSchema, getLogsFiltersSchema, getLogsOutputSchema } from "./schemas.mjs"; const app = new Hono(); diff --git a/src/routers/v2/logging/schemas.ts b/src/routers/v2/logging/schemas.mts similarity index 100% rename from src/routers/v2/logging/schemas.ts rename to src/routers/v2/logging/schemas.mts diff --git a/src/routers/v2/services/index.ts b/src/routers/v2/services/index.mts similarity index 93% rename from src/routers/v2/services/index.ts rename to src/routers/v2/services/index.mts index 7482fac..fe83593 100644 --- a/src/routers/v2/services/index.ts +++ b/src/routers/v2/services/index.mts @@ -2,17 +2,17 @@ import { eq } from "drizzle-orm"; import { Hono } from "hono"; import { HTTPException } from "hono/http-exception"; -import { db } from "@/config/db"; -import { services as servicesTable } from "@/config/db/schema"; -import type { ServerContext } from "@/types/hono"; -import { createDbId } from "@/utils/db"; -import { ENDPOINT_MESSAGES } from "@/utils/messages"; +import { db } from "@/config/db/index.mjs"; +import { services as servicesTable } from "@/config/db/schema.mjs"; +import type { ServerContext } from "@/types/hono.mjs"; +import { createDbId } from "@/utils/db.mjs"; +import { ENDPOINT_MESSAGES } from "@/utils/messages.mjs"; import { adminServiceValidation, createV2ErrResponse, parseSearchParams, v2_serviceValidation, -} from "@/utils/server-helpers"; +} from "@/utils/server-helpers.mjs"; import { createServiceInputSchema, @@ -20,7 +20,7 @@ import { getServiceFiltersSchema, getServiceOutputSchema, getServicesOutputSchema, -} from "./schemas"; +} from "./schemas.mjs"; const app = new Hono(); diff --git a/src/routers/v2/services/schemas.ts b/src/routers/v2/services/schemas.mts similarity index 100% rename from src/routers/v2/services/schemas.ts rename to src/routers/v2/services/schemas.mts diff --git a/src/server.ts b/src/server.mts similarity index 81% rename from src/server.ts rename to src/server.mts index 16f196e..776f3b6 100644 --- a/src/server.ts +++ b/src/server.mts @@ -1,3 +1,4 @@ +import type { ServerContext } from "@/types/hono.mjs"; import { serveStatic } from "@hono/node-server/serve-static"; import { Hono } from "hono"; import { rateLimiter } from "hono-rate-limiter"; @@ -9,19 +10,21 @@ import { HTTPException } from "hono/http-exception"; import { logger } from "hono/logger"; import { secureHeaders } from "hono/secure-headers"; import { timeout } from "hono/timeout"; +import { trimTrailingSlash } from "hono/trailing-slash"; -import docsRouter from "@/routers/docs"; -import v2Router from "@/routers/v2"; - -import type { ServerContext } from "@/types/hono"; +import appRouter from "@/routers/app/index.mjs"; +import docsRouter from "@/routers/docs/index.mjs"; +import v2Router from "@/routers/v2/index.mjs"; const app = new Hono(); + app.use(cors({ origin: "*" })); app.use(compress()); app.use(csrf()); app.use(etag()); app.use(logger()); app.use(secureHeaders()); +app.use(trimTrailingSlash()); const limiter = rateLimiter({ windowMs: 15 * 60 * 1000, // 15 minutes @@ -32,8 +35,7 @@ const limiter = rateLimiter({ app.use("*", async (c, next) => { c.set("service", null); - - await next(); + return await next(); }); app.use("/api/", timeout(5000)); @@ -42,6 +44,7 @@ app.route("/api/v2", v2Router); app.use(limiter); app.route("/docs", docsRouter); +app.route("/app", appRouter); app.get( "/*", diff --git a/src/types/db.mts b/src/types/db.mts new file mode 100644 index 0000000..9a6a48a --- /dev/null +++ b/src/types/db.mts @@ -0,0 +1,5 @@ +import type { services, tenants, users } from "@/config/db/schema.mjs"; + +export type ServiceRecord = typeof services.$inferSelect; +export type UserRecord = typeof users.$inferSelect; +export type TenantRecord = typeof tenants.$inferSelect; diff --git a/src/types/hono.mts b/src/types/hono.mts new file mode 100644 index 0000000..d33032c --- /dev/null +++ b/src/types/hono.mts @@ -0,0 +1,18 @@ +import type { HttpBindings } from "@hono/node-server"; +import type { Session, User } from "lucia"; + +import type { ServiceRecord, TenantRecord } from "./db.mjs"; + +type Bindings = HttpBindings & {}; + +type Variables = { + service: ServiceRecord | null; + tenant: TenantRecord | null; + user: User | null; + session: Session | null; +}; + +export type ServerContext = { + Bindings: Bindings; + Variables: Variables; +}; diff --git a/src/types/hono.ts b/src/types/hono.ts deleted file mode 100644 index 10f3c8a..0000000 --- a/src/types/hono.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { services as servicesTable } from "@/config/db/schema"; -import type { HttpBindings } from "@hono/node-server"; - -type Service = typeof servicesTable.$inferSelect; - -type Bindings = HttpBindings & {}; - -type Variables = { - service: Service | null; -}; - -export type ServerContext = { - Bindings: Bindings; - Variables: Variables; -}; diff --git a/src/utils/db.mts b/src/utils/db.mts new file mode 100644 index 0000000..6674b8a --- /dev/null +++ b/src/utils/db.mts @@ -0,0 +1,32 @@ +import { env } from "@/config/env.mjs"; +import { createId } from "@paralleldrive/cuid2"; + +const dbPrefixes = { + log: "log_", + service: "ser_", + user: "user_", + session: "sess_", + tenant: "ten_", +} as const; +const dbEnv = { + live: "live_", + test: "test_", + dev: "dev_", +}; +/** + * Returns a unique database ID + * @param key_prefix + * @param key_env + * @returns + * @example + * ```ts + * createDbId("user", "live"); + * //=> "user_live_01B1E5Z5KQZ + * ``` + */ +export const createDbId = ( + key_prefix: keyof typeof dbPrefixes, + key_env: keyof typeof dbEnv = env.NODE_ENV === "production" ? "live" : "dev", +) => { + return [dbPrefixes[key_prefix], dbEnv[key_env], createId()].filter(Boolean).join(""); +}; diff --git a/src/utils/db.ts b/src/utils/db.ts deleted file mode 100644 index ceb0e86..0000000 --- a/src/utils/db.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { createId } from "@paralleldrive/cuid2"; - -const dbPrefixes = { - log: "log", - service: "ser", -} as const; -export const createDbId = (key: keyof typeof dbPrefixes) => `${dbPrefixes[key]}_${createId()}`; diff --git a/src/utils/messages.ts b/src/utils/messages.mts similarity index 100% rename from src/utils/messages.ts rename to src/utils/messages.mts diff --git a/src/utils/openapi-docs.ts b/src/utils/openapi-docs.mts similarity index 89% rename from src/utils/openapi-docs.ts rename to src/utils/openapi-docs.mts index a2e5219..96eae71 100644 --- a/src/utils/openapi-docs.ts +++ b/src/utils/openapi-docs.mts @@ -9,8 +9,10 @@ type OpenApiDocTransformer = (filename: string, source_path: string, dirVersion: export function transformOpenapiYmlDoc(dir_version: string, transformers: OpenApiDocTransformer[] = []): void { const openapiFilename = `openapi.${dir_version}.yaml`; - const openapiYmlSourcePath = join(__dirname, "..", "docs", openapiFilename); - const outDir = join(__dirname, "..", "..", "public", "static"); + const dirname = import.meta.dirname; + + const openapiYmlSourcePath = join(dirname, "..", "docs", openapiFilename); + const outDir = join(dirname, "..", "..", "public", "static"); const openapiYmlOutPath = join(outDir, openapiFilename); const openapiYmlInputDoc = readFileSync(openapiYmlSourcePath, "utf-8").toString(); diff --git a/src/utils/package.ts b/src/utils/package.mts similarity index 100% rename from src/utils/package.ts rename to src/utils/package.mts diff --git a/src/utils/server-helpers.ts b/src/utils/server-helpers.mts similarity index 94% rename from src/utils/server-helpers.ts rename to src/utils/server-helpers.mts index d2d2ef7..0050d73 100644 --- a/src/utils/server-helpers.ts +++ b/src/utils/server-helpers.mts @@ -1,12 +1,12 @@ import { createFactory } from "hono/factory"; import { HTTPException } from "hono/http-exception"; -import { db } from "@/config/db"; -import { env } from "@/config/env"; -import type { ServerContext } from "@/types/hono"; +import { db } from "@/config/db/index.mjs"; +import { env } from "@/config/env.mjs"; +import type { ServerContext } from "@/types/hono.mjs"; import type { Context } from "hono"; -import { ENDPOINT_MESSAGES } from "./messages"; +import { ENDPOINT_MESSAGES } from "./messages.mjs"; /** * Takes a string URL and returns an object with the query string parameters, multiple of the same key will be an array diff --git a/tsconfig.json b/tsconfig.json index 79b8906..eff9436 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,12 +4,14 @@ "lib": ["ESNext"], "experimentalDecorators": true, "emitDecoratorMetadata": true, - "module": "CommonJS", - "moduleResolution": "Node", + "module": "NodeNext", + "moduleResolution": "NodeNext", "resolveJsonModule": true, "outDir": "./dist", "removeComments": true, "esModuleInterop": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx", "forceConsistentCasingInFileNames": true, "allowSyntheticDefaultImports": true, "strict": true,