diff --git a/.env.example b/.env.example
index 28fa9d4de..d643c1194 100644
--- a/.env.example
+++ b/.env.example
@@ -34,6 +34,10 @@ DB_URL='FULL_PATH_TO_YOUR_SQLITE_DB_FILE'
# DB_PASSWORD='password'
# DB_NAME='name-of-database'
+# The following is an example on how to use the node-postgres driver:
+# DB_DRIVER='node-postgres'
+# DB_URL='postgres://user:password@host:port/database'
+
# The below path can be used to store trusted certificates, it is not required and can be left empty.
# If it is empty, it will default to `/appdata/trusted-certificates` in production.
# If it is used, please use the full path to the directory where the certificates are stored.
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 5097b8569..840d382a5 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -33,6 +33,7 @@ body:
options:
# The below comment is used to insert a new version with on-release.yml
#NEXT_VERSION#
+ - 1.34.0
- 1.33.0
- 1.32.0
- 1.31.0
diff --git a/.run/db_migration_postgresql_generate.run copy.xml b/.run/db_migration_postgresql_generate.run copy.xml
new file mode 100644
index 000000000..4bc02bdba
--- /dev/null
+++ b/.run/db_migration_postgresql_generate.run copy.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/development/development.docker-compose.yml b/development/development.docker-compose.yml
index 0ee173260..f19ed787d 100644
--- a/development/development.docker-compose.yml
+++ b/development/development.docker-compose.yml
@@ -26,5 +26,29 @@ services:
volumes:
- mysql_data:/var/lib/mysql
+ postgresql:
+ image: postgres
+ restart: always
+ # set shared memory limit when using docker compose
+ shm_size: 128mb
+ # or set shared memory limit when deploy via swarm stack
+ #volumes:
+ # - type: tmpfs
+ # target: /dev/shm
+ # tmpfs:
+ # size: 134217728 # 128*2^20 bytes = 128Mb
+ environment:
+ POSTGRES_PASSWORD: homarr
+ POSTGRES_USER: homarr
+ POSTGRES_DB: homarrdb
+ PGDATA: /var/lib/postgresql/data/pgdata
+ volumes:
+ - postgresql_data:/var/lib/postgresql/data
+ ports:
+ - 5432:5432
+ # if already run PostgreSQL, change port number to use container's service
+ # - 2345:5432
+
volumes:
- mysql_data:
\ No newline at end of file
+ mysql_data:
+ postgresql_data:
\ No newline at end of file
diff --git a/package.json b/package.json
index a574a3918..73be82e66 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,8 @@
"cli": "pnpm with-env tsx packages/cli/index.ts",
"db:migration:mysql:generate": "pnpm -F db migration:mysql:generate",
"db:migration:mysql:run": "pnpm -F db migration:mysql:run",
+ "db:migration:postgresql:generate": "pnpm -F db migration:postgresql:generate",
+ "db:migration:postgresql:run": "pnpm -F db migration:postgresql:run",
"db:migration:sqlite:generate": "pnpm -F db migration:sqlite:generate",
"db:migration:sqlite:run": "pnpm -F db migration:sqlite:run",
"db:push": "pnpm -F db push:sqlite",
@@ -73,10 +75,28 @@
"tree-sitter-json"
],
"overrides": {
- "proxmox-api>undici": "7.14.0"
+ "@babel/helpers@<7.26.10": ">=7.26.10",
+ "@babel/runtime@<7.26.10": ">=7.26.10",
+ "axios@>=1.0.0 <1.8.2": ">=1.8.2",
+ "brace-expansion@>=2.0.0 <=2.0.1": ">=2.0.2",
+ "brace-expansion@>=1.0.0 <=1.1.11": ">=1.1.12",
+ "esbuild@<=0.24.2": ">=0.25.0",
+ "form-data@>=4.0.0 <4.0.4": ">=4.0.4",
+ "hono@<4.6.5": ">=4.6.5",
+ "linkifyjs@<4.3.2": ">=4.3.2",
+ "nanoid@>=4.0.0 <5.0.9": ">=5.0.9",
+ "prismjs@<1.30.0": ">=1.30.0",
+ "proxmox-api>undici": "7.14.0",
+ "rollup@>=4.0.0 <4.22.4": ">=4.22.4",
+ "sha.js@<=2.4.11": ">=2.4.12",
+ "tar-fs@>=3.0.0 <3.0.9": ">=3.0.9",
+ "tar-fs@>=2.0.0 <2.1.3": ">=2.1.3",
+ "tmp@<=0.2.3": ">=0.2.4",
+ "vite@>=5.0.0 <=5.4.18": ">=5.4.19"
},
"patchedDependencies": {
- "@types/node-unifi": "patches/@types__node-unifi.patch"
+ "@types/node-unifi": "patches/@types__node-unifi.patch",
+ "trpc-to-openapi": "patches/trpc-to-openapi.patch"
},
"allowUnusedPatches": true,
"ignoredBuiltDependencies": [
diff --git a/packages/common/env.ts b/packages/common/env.ts
index 2a7cd43d5..cbccc8b70 100644
--- a/packages/common/env.ts
+++ b/packages/common/env.ts
@@ -1,7 +1,7 @@
import { randomBytes } from "crypto";
import { z } from "zod/v4";
-import { createEnv } from "@homarr/core/infrastructure/env";
+import { createBooleanSchema, createEnv } from "@homarr/core/infrastructure/env";
const errorSuffix = `, please generate a 64 character secret in hex format or use the following: "${randomBytes(32).toString("hex")}"`;
@@ -23,9 +23,11 @@ export const env = createEnv({
.regex(/^[0-9a-fA-F]{64}$/, {
message: `SECRET_ENCRYPTION_KEY must only contain hex characters${errorSuffix}`,
}),
+ NO_EXTERNAL_CONNECTION: createBooleanSchema(false),
},
runtimeEnv: {
SECRET_ENCRYPTION_KEY: process.env.SECRET_ENCRYPTION_KEY,
NODE_ENV: process.env.NODE_ENV,
+ NO_EXTERNAL_CONNECTION: process.env.NO_EXTERNAL_CONNECTION,
},
});
diff --git a/packages/cron-jobs/src/jobs/analytics.ts b/packages/cron-jobs/src/jobs/analytics.ts
index 100ba79d4..128c4bc89 100644
--- a/packages/cron-jobs/src/jobs/analytics.ts
+++ b/packages/cron-jobs/src/jobs/analytics.ts
@@ -1,4 +1,5 @@
import { sendServerAnalyticsAsync } from "@homarr/analytics";
+import { env } from "@homarr/common/env";
import { EVERY_WEEK } from "@homarr/cron-jobs-core/expressions";
import { db } from "@homarr/db";
import { getServerSettingByKeyAsync } from "@homarr/db/queries";
@@ -9,6 +10,7 @@ export const analyticsJob = createCronJob("analytics", EVERY_WEEK, {
runOnStart: true,
preventManualExecution: true,
}).withCallback(async () => {
+ if (env.NO_EXTERNAL_CONNECTION) return;
const analyticSetting = await getServerSettingByKeyAsync(db, "analytics");
if (!analyticSetting.enableGeneral) {
diff --git a/packages/cron-jobs/src/jobs/icons-updater.ts b/packages/cron-jobs/src/jobs/icons-updater.ts
index 8308661ef..64332de51 100644
--- a/packages/cron-jobs/src/jobs/icons-updater.ts
+++ b/packages/cron-jobs/src/jobs/icons-updater.ts
@@ -1,4 +1,5 @@
import { createId, splitToNChunks, Stopwatch } from "@homarr/common";
+import { env } from "@homarr/common/env";
import { EVERY_WEEK } from "@homarr/cron-jobs-core/expressions";
import type { InferInsertModel } from "@homarr/db";
import { db, handleTransactionsAsync, inArray, sql } from "@homarr/db";
@@ -12,6 +13,8 @@ export const iconsUpdaterJob = createCronJob("iconsUpdater", EVERY_WEEK, {
runOnStart: true,
expectedMaximumDurationInMillis: 10 * 1000,
}).withCallback(async () => {
+ if (env.NO_EXTERNAL_CONNECTION) return;
+
logger.info("Updating icon repository cache...");
const stopWatch = new Stopwatch();
const repositoryIconGroups = await fetchIconsAsync();
diff --git a/packages/db/collection.ts b/packages/db/collection.ts
index 1bcbb9316..6a44b44c2 100644
--- a/packages/db/collection.ts
+++ b/packages/db/collection.ts
@@ -2,7 +2,7 @@ import type { InferInsertModel } from "drizzle-orm";
import { objectEntries } from "@homarr/common";
-import type { HomarrDatabase, HomarrDatabaseMysql } from "./driver";
+import type { HomarrDatabase, HomarrDatabaseMysql, HomarrDatabasePostgresql } from "./driver";
import { env } from "./env";
import * as schema from "./schema";
@@ -10,6 +10,14 @@ type TableKey = {
[K in keyof typeof schema]: (typeof schema)[K] extends { _: { brand: "Table" } } ? K : never;
}[keyof typeof schema];
+export function isMysql(): boolean {
+ return env.DB_DRIVER === "mysql2";
+}
+
+export function isPostgresql(): boolean {
+ return env.DB_DRIVER === "node-postgres";
+}
+
export const createDbInsertCollectionForTransaction = (
tablesInInsertOrder: TTableKey[],
) => {
@@ -35,8 +43,10 @@ export const createDbInsertCollectionForTransaction = {
- await db.transaction(async (transaction) => {
+ // We allow any database that supports async passed here but then fallback to mysql to prevent typescript errors
+ insertAllAsync: async (db: HomarrDatabaseMysql | HomarrDatabasePostgresql) => {
+ const innerDb = db as HomarrDatabaseMysql;
+ await innerDb.transaction(async (transaction) => {
for (const [key, values] of objectEntries(context)) {
if (values.length >= 1) {
// Below is actually the mysqlSchema when the driver is mysql
@@ -56,12 +66,18 @@ export const createDbInsertCollectionWithoutTransaction = {
- if (env.DB_DRIVER !== "mysql2") {
- insertAll(db);
- return;
+ switch (env.DB_DRIVER) {
+ case "mysql2":
+ case "node-postgres":
+ // For mysql2 and node-postgres, we can use the async insertAllAsync method
+ await insertAllAsync(db as unknown as HomarrDatabaseMysql | HomarrDatabasePostgresql);
+ return;
+ default:
+ // For better-sqlite3, we need to use the synchronous insertAll method
+ // default assumes better-sqlite3. It's original implementation.
+ insertAll(db);
+ break;
}
-
- await insertAllAsync(db as unknown as HomarrDatabaseMysql);
},
};
};
diff --git a/packages/db/configs/postgresql.config.ts b/packages/db/configs/postgresql.config.ts
new file mode 100644
index 000000000..a37115dfa
--- /dev/null
+++ b/packages/db/configs/postgresql.config.ts
@@ -0,0 +1,20 @@
+import type { Config } from "drizzle-kit";
+
+import { env } from "../env";
+
+export default {
+ dialect: "postgresql",
+ schema: "./schema",
+ casing: "snake_case",
+
+ dbCredentials: env.DB_URL
+ ? { url: env.DB_URL }
+ : {
+ host: env.DB_HOST,
+ port: env.DB_PORT,
+ user: env.DB_USER,
+ password: env.DB_PASSWORD,
+ database: env.DB_NAME,
+ },
+ out: "./migrations/postgresql",
+} satisfies Config;
diff --git a/packages/db/driver.ts b/packages/db/driver.ts
index c5159fd9d..9ed5c899f 100644
--- a/packages/db/driver.ts
+++ b/packages/db/driver.ts
@@ -5,17 +5,22 @@ import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3";
import type { MySql2Database } from "drizzle-orm/mysql2";
import { drizzle as drizzleMysql } from "drizzle-orm/mysql2";
+import type { NodePgDatabase } from "drizzle-orm/node-postgres";
+import { drizzle as drizzlePg } from "drizzle-orm/node-postgres";
import type { Pool as MysqlConnectionPool } from "mysql2";
import mysql from "mysql2";
+import { Pool as PostgresPool } from "pg";
import { logger } from "@homarr/log";
import { env } from "./env";
import * as mysqlSchema from "./schema/mysql";
+import * as pgSchema from "./schema/postgresql";
import * as sqliteSchema from "./schema/sqlite";
export type HomarrDatabase = BetterSQLite3Database;
export type HomarrDatabaseMysql = MySql2Database;
+export type HomarrDatabasePostgresql = NodePgDatabase;
const init = () => {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
@@ -24,6 +29,9 @@ const init = () => {
case "mysql2":
initMySQL2();
break;
+ case "node-postgres":
+ initNodePostgres();
+ break;
default:
initBetterSqlite();
break;
@@ -31,7 +39,7 @@ const init = () => {
}
};
-export let connection: BetterSqlite3Connection | MysqlConnectionPool;
+export let connection: BetterSqlite3Connection | MysqlConnectionPool | PostgresPool;
export let database: HomarrDatabase;
class WinstonDrizzleLogger implements Logger {
@@ -73,4 +81,33 @@ const initMySQL2 = () => {
}) as unknown as HomarrDatabase;
};
+const initNodePostgres = () => {
+ if (!env.DB_HOST) {
+ connection = new PostgresPool({
+ connectionString: env.DB_URL,
+ max: 0,
+ idleTimeoutMillis: 60000,
+ allowExitOnIdle: false,
+ });
+ } else {
+ connection = new PostgresPool({
+ host: env.DB_HOST,
+ database: env.DB_NAME,
+ port: env.DB_PORT,
+ user: env.DB_USER,
+ password: env.DB_PASSWORD,
+ max: 0,
+ idleTimeoutMillis: 60000,
+ allowExitOnIdle: false,
+ });
+ }
+
+ database = drizzlePg({
+ logger: new WinstonDrizzleLogger(),
+ schema: pgSchema,
+ casing: "snake_case",
+ client: connection,
+ }) as unknown as HomarrDatabase;
+};
+
init();
diff --git a/packages/db/env.ts b/packages/db/env.ts
index f02c35b8e..9d8932a7d 100644
--- a/packages/db/env.ts
+++ b/packages/db/env.ts
@@ -6,6 +6,7 @@ import { createEnv } from "@homarr/core/infrastructure/env";
const drivers = {
betterSqlite3: "better-sqlite3",
mysql2: "mysql2",
+ nodePostgres: "node-postgres",
} as const;
const isDriver = (driver: (typeof drivers)[keyof typeof drivers]) => process.env.DB_DRIVER === driver;
@@ -21,7 +22,7 @@ export const env = createEnv({
*/
server: {
DB_DRIVER: z
- .union([z.literal(drivers.betterSqlite3), z.literal(drivers.mysql2)], {
+ .union([z.literal(drivers.betterSqlite3), z.literal(drivers.mysql2), z.literal(drivers.nodePostgres)], {
message: `Invalid database driver, supported are ${Object.keys(drivers).join(", ")}`,
})
.default(drivers.betterSqlite3),
@@ -42,7 +43,7 @@ export const env = createEnv({
.regex(/\d+/)
.transform(Number)
.refine((number) => number >= 1)
- .default(3306),
+ .default(isDriver(drivers.mysql2) ? 3306 : 5432),
DB_USER: z.string(),
DB_PASSWORD: z.string(),
DB_NAME: z.string(),
diff --git a/packages/db/index.ts b/packages/db/index.ts
index dd98d8a1b..b796d2fa4 100644
--- a/packages/db/index.ts
+++ b/packages/db/index.ts
@@ -7,6 +7,6 @@ export * from "drizzle-orm";
export const db = database;
export type Database = typeof db;
-export type { HomarrDatabaseMysql } from "./driver";
+export type { HomarrDatabaseMysql, HomarrDatabasePostgresql } from "./driver";
export { handleDiffrentDbDriverOperationsAsync as handleTransactionsAsync } from "./transactions";
diff --git a/packages/db/migrations/custom/0002_app_widget_show_description_tooltip_to_display_mode.ts b/packages/db/migrations/custom/0002_app_widget_show_description_tooltip_to_display_mode.ts
new file mode 100644
index 000000000..6934878a2
--- /dev/null
+++ b/packages/db/migrations/custom/0002_app_widget_show_description_tooltip_to_display_mode.ts
@@ -0,0 +1,43 @@
+import SuperJSON from "superjson";
+
+import { eq } from "../..";
+import type { Database } from "../..";
+import { items } from "../../schema";
+
+/**
+ * To support showing the description in the widget itself we replaced
+ * the tooltip show option with display mode.
+ */
+export async function migrateAppWidgetShowDescriptionTooltipToDisplayModeAsync(db: Database) {
+ const existingAppItems = await db.query.items.findMany({
+ where: (table, { eq }) => eq(table.kind, "app"),
+ });
+
+ const itemsToUpdate = existingAppItems
+ .map((item) => ({
+ id: item.id,
+ options: SuperJSON.parse<{ showDescriptionTooltip?: boolean }>(item.options),
+ }))
+ .filter((item) => item.options.showDescriptionTooltip !== undefined);
+
+ console.log(
+ `Migrating app items with showDescriptionTooltip to descriptionDisplayMode count=${itemsToUpdate.length}`,
+ );
+
+ await Promise.all(
+ itemsToUpdate.map(async (item) => {
+ const { showDescriptionTooltip, ...options } = item.options;
+ await db
+ .update(items)
+ .set({
+ options: SuperJSON.stringify({
+ ...options,
+ descriptionDisplayMode: showDescriptionTooltip ? "tooltip" : "hidden",
+ }),
+ })
+ .where(eq(items.id, item.id));
+ }),
+ );
+
+ console.log(`Migrated app items with showDescriptionTooltip to descriptionDisplayMode count=${itemsToUpdate.length}`);
+}
diff --git a/packages/db/migrations/custom/index.ts b/packages/db/migrations/custom/index.ts
index 03a48cbbd..a6a002733 100644
--- a/packages/db/migrations/custom/index.ts
+++ b/packages/db/migrations/custom/index.ts
@@ -1,8 +1,10 @@
import type { Database } from "../..";
import { migrateReleaseWidgetProviderToOptionsAsync } from "./0000_release_widget_provider_to_options";
import { migrateOpnsenseCredentialsAsync } from "./0001_opnsense_credentials";
+import { migrateAppWidgetShowDescriptionTooltipToDisplayModeAsync } from "./0002_app_widget_show_description_tooltip_to_display_mode";
export const applyCustomMigrationsAsync = async (db: Database) => {
await migrateReleaseWidgetProviderToOptionsAsync(db);
await migrateOpnsenseCredentialsAsync(db);
+ await migrateAppWidgetShowDescriptionTooltipToDisplayModeAsync(db);
};
diff --git a/packages/db/migrations/postgresql/0000_initial.sql b/packages/db/migrations/postgresql/0000_initial.sql
new file mode 100644
index 000000000..fd4d20cbe
--- /dev/null
+++ b/packages/db/migrations/postgresql/0000_initial.sql
@@ -0,0 +1,322 @@
+CREATE TABLE "account" (
+ "user_id" varchar(64) NOT NULL,
+ "type" text NOT NULL,
+ "provider" varchar(64) NOT NULL,
+ "provider_account_id" varchar(64) NOT NULL,
+ "refresh_token" text,
+ "access_token" text,
+ "expires_at" integer,
+ "token_type" text,
+ "scope" text,
+ "id_token" text,
+ "session_state" text,
+ CONSTRAINT "account_provider_provider_account_id_pk" PRIMARY KEY("provider","provider_account_id")
+);
+--> statement-breakpoint
+CREATE TABLE "apiKey" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "api_key" text NOT NULL,
+ "salt" text NOT NULL,
+ "user_id" varchar(64) NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "app" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "name" text NOT NULL,
+ "description" text,
+ "icon_url" text NOT NULL,
+ "href" text,
+ "ping_url" text
+);
+--> statement-breakpoint
+CREATE TABLE "boardGroupPermission" (
+ "board_id" varchar(64) NOT NULL,
+ "group_id" varchar(64) NOT NULL,
+ "permission" varchar(128) NOT NULL,
+ CONSTRAINT "boardGroupPermission_board_id_group_id_permission_pk" PRIMARY KEY("board_id","group_id","permission")
+);
+--> statement-breakpoint
+CREATE TABLE "boardUserPermission" (
+ "board_id" varchar(64) NOT NULL,
+ "user_id" varchar(64) NOT NULL,
+ "permission" varchar(128) NOT NULL,
+ CONSTRAINT "boardUserPermission_board_id_user_id_permission_pk" PRIMARY KEY("board_id","user_id","permission")
+);
+--> statement-breakpoint
+CREATE TABLE "board" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "name" varchar(256) NOT NULL,
+ "is_public" boolean DEFAULT false NOT NULL,
+ "creator_id" varchar(64),
+ "page_title" text,
+ "meta_title" text,
+ "logo_image_url" text,
+ "favicon_image_url" text,
+ "background_image_url" text,
+ "background_image_attachment" text DEFAULT 'fixed' NOT NULL,
+ "background_image_repeat" text DEFAULT 'no-repeat' NOT NULL,
+ "background_image_size" text DEFAULT 'cover' NOT NULL,
+ "primary_color" text DEFAULT '#fa5252' NOT NULL,
+ "secondary_color" text DEFAULT '#fd7e14' NOT NULL,
+ "opacity" integer DEFAULT 100 NOT NULL,
+ "custom_css" text,
+ "icon_color" text,
+ "item_radius" text DEFAULT 'lg' NOT NULL,
+ "disable_status" boolean DEFAULT false NOT NULL,
+ CONSTRAINT "board_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "cron_job_configuration" (
+ "name" varchar(256) PRIMARY KEY NOT NULL,
+ "cron_expression" varchar(32) NOT NULL,
+ "is_enabled" boolean DEFAULT true NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "groupMember" (
+ "group_id" varchar(64) NOT NULL,
+ "user_id" varchar(64) NOT NULL,
+ CONSTRAINT "groupMember_group_id_user_id_pk" PRIMARY KEY("group_id","user_id")
+);
+--> statement-breakpoint
+CREATE TABLE "groupPermission" (
+ "group_id" varchar(64) NOT NULL,
+ "permission" text NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "group" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "name" varchar(64) NOT NULL,
+ "owner_id" varchar(64),
+ "home_board_id" varchar(64),
+ "mobile_home_board_id" varchar(64),
+ "position" smallint NOT NULL,
+ CONSTRAINT "group_name_unique" UNIQUE("name")
+);
+--> statement-breakpoint
+CREATE TABLE "iconRepository" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "slug" varchar(150) NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "icon" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "name" varchar(250) NOT NULL,
+ "url" text NOT NULL,
+ "checksum" text NOT NULL,
+ "icon_repository_id" varchar(64) NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "integrationGroupPermissions" (
+ "integration_id" varchar(64) NOT NULL,
+ "group_id" varchar(64) NOT NULL,
+ "permission" varchar(128) NOT NULL,
+ CONSTRAINT "integration_group_permission__pk" PRIMARY KEY("integration_id","group_id","permission")
+);
+--> statement-breakpoint
+CREATE TABLE "integration_item" (
+ "item_id" varchar(64) NOT NULL,
+ "integration_id" varchar(64) NOT NULL,
+ CONSTRAINT "integration_item_item_id_integration_id_pk" PRIMARY KEY("item_id","integration_id")
+);
+--> statement-breakpoint
+CREATE TABLE "integrationSecret" (
+ "kind" varchar(16) NOT NULL,
+ "value" text NOT NULL,
+ "updated_at" timestamp NOT NULL,
+ "integration_id" varchar(64) NOT NULL,
+ CONSTRAINT "integrationSecret_integration_id_kind_pk" PRIMARY KEY("integration_id","kind")
+);
+--> statement-breakpoint
+CREATE TABLE "integrationUserPermission" (
+ "integration_id" varchar(64) NOT NULL,
+ "user_id" varchar(64) NOT NULL,
+ "permission" varchar(128) NOT NULL,
+ CONSTRAINT "integrationUserPermission_integration_id_user_id_permission_pk" PRIMARY KEY("integration_id","user_id","permission")
+);
+--> statement-breakpoint
+CREATE TABLE "integration" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "name" text NOT NULL,
+ "url" text NOT NULL,
+ "kind" varchar(128) NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "invite" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "token" varchar(512) NOT NULL,
+ "expiration_date" timestamp NOT NULL,
+ "creator_id" varchar(64) NOT NULL,
+ CONSTRAINT "invite_token_unique" UNIQUE("token")
+);
+--> statement-breakpoint
+CREATE TABLE "item_layout" (
+ "item_id" varchar(64) NOT NULL,
+ "section_id" varchar(64) NOT NULL,
+ "layout_id" varchar(64) NOT NULL,
+ "x_offset" integer NOT NULL,
+ "y_offset" integer NOT NULL,
+ "width" integer NOT NULL,
+ "height" integer NOT NULL,
+ CONSTRAINT "item_layout_item_id_section_id_layout_id_pk" PRIMARY KEY("item_id","section_id","layout_id")
+);
+--> statement-breakpoint
+CREATE TABLE "item" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "board_id" varchar(64) NOT NULL,
+ "kind" text NOT NULL,
+ "options" text DEFAULT '{"json": {}}' NOT NULL,
+ "advanced_options" text DEFAULT '{"json": {}}' NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "layout" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "name" varchar(32) NOT NULL,
+ "board_id" varchar(64) NOT NULL,
+ "column_count" smallint NOT NULL,
+ "breakpoint" smallint DEFAULT 0 NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "media" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "name" varchar(512) NOT NULL,
+ "content" "bytea" NOT NULL,
+ "content_type" text NOT NULL,
+ "size" integer NOT NULL,
+ "created_at" timestamp DEFAULT now() NOT NULL,
+ "creator_id" varchar(64)
+);
+--> statement-breakpoint
+CREATE TABLE "onboarding" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "step" varchar(64) NOT NULL,
+ "previous_step" varchar(64)
+);
+--> statement-breakpoint
+CREATE TABLE "search_engine" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "icon_url" text NOT NULL,
+ "name" varchar(64) NOT NULL,
+ "short" varchar(8) NOT NULL,
+ "description" text,
+ "url_template" text,
+ "type" varchar(64) DEFAULT 'generic' NOT NULL,
+ "integration_id" varchar(64),
+ CONSTRAINT "search_engine_short_unique" UNIQUE("short")
+);
+--> statement-breakpoint
+CREATE TABLE "section_collapse_state" (
+ "user_id" varchar(64) NOT NULL,
+ "section_id" varchar(64) NOT NULL,
+ "collapsed" boolean DEFAULT false NOT NULL,
+ CONSTRAINT "section_collapse_state_user_id_section_id_pk" PRIMARY KEY("user_id","section_id")
+);
+--> statement-breakpoint
+CREATE TABLE "section_layout" (
+ "section_id" varchar(64) NOT NULL,
+ "layout_id" varchar(64) NOT NULL,
+ "parent_section_id" varchar(64),
+ "x_offset" integer NOT NULL,
+ "y_offset" integer NOT NULL,
+ "width" integer NOT NULL,
+ "height" integer NOT NULL,
+ CONSTRAINT "section_layout_section_id_layout_id_pk" PRIMARY KEY("section_id","layout_id")
+);
+--> statement-breakpoint
+CREATE TABLE "section" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "board_id" varchar(64) NOT NULL,
+ "kind" text NOT NULL,
+ "x_offset" integer,
+ "y_offset" integer,
+ "name" text,
+ "options" text DEFAULT '{"json": {}}'
+);
+--> statement-breakpoint
+CREATE TABLE "serverSetting" (
+ "setting_key" varchar(64) PRIMARY KEY NOT NULL,
+ "value" text DEFAULT '{"json": {}}' NOT NULL,
+ CONSTRAINT "serverSetting_settingKey_unique" UNIQUE("setting_key")
+);
+--> statement-breakpoint
+CREATE TABLE "session" (
+ "session_token" varchar(512) PRIMARY KEY NOT NULL,
+ "user_id" varchar(64) NOT NULL,
+ "expires" timestamp NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "trusted_certificate_hostname" (
+ "hostname" varchar(256) NOT NULL,
+ "thumbprint" varchar(128) NOT NULL,
+ "certificate" text NOT NULL,
+ CONSTRAINT "trusted_certificate_hostname_hostname_thumbprint_pk" PRIMARY KEY("hostname","thumbprint")
+);
+--> statement-breakpoint
+CREATE TABLE "user" (
+ "id" varchar(64) PRIMARY KEY NOT NULL,
+ "name" text,
+ "email" text,
+ "email_verified" timestamp,
+ "image" text,
+ "password" text,
+ "salt" text,
+ "provider" varchar(64) DEFAULT 'credentials' NOT NULL,
+ "home_board_id" varchar(64),
+ "mobile_home_board_id" varchar(64),
+ "default_search_engine_id" varchar(64),
+ "open_search_in_new_tab" boolean DEFAULT false NOT NULL,
+ "color_scheme" varchar(5) DEFAULT 'dark' NOT NULL,
+ "first_day_of_week" smallint DEFAULT 1 NOT NULL,
+ "ping_icons_enabled" boolean DEFAULT false NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "verificationToken" (
+ "identifier" varchar(64) NOT NULL,
+ "token" varchar(512) NOT NULL,
+ "expires" timestamp NOT NULL,
+ CONSTRAINT "verificationToken_identifier_token_pk" PRIMARY KEY("identifier","token")
+);
+--> statement-breakpoint
+ALTER TABLE "account" ADD CONSTRAINT "account_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "apiKey" ADD CONSTRAINT "apiKey_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "boardGroupPermission" ADD CONSTRAINT "boardGroupPermission_board_id_board_id_fk" FOREIGN KEY ("board_id") REFERENCES "public"."board"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "boardGroupPermission" ADD CONSTRAINT "boardGroupPermission_group_id_group_id_fk" FOREIGN KEY ("group_id") REFERENCES "public"."group"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "boardUserPermission" ADD CONSTRAINT "boardUserPermission_board_id_board_id_fk" FOREIGN KEY ("board_id") REFERENCES "public"."board"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "boardUserPermission" ADD CONSTRAINT "boardUserPermission_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "board" ADD CONSTRAINT "board_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "groupMember" ADD CONSTRAINT "groupMember_group_id_group_id_fk" FOREIGN KEY ("group_id") REFERENCES "public"."group"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "groupMember" ADD CONSTRAINT "groupMember_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "groupPermission" ADD CONSTRAINT "groupPermission_group_id_group_id_fk" FOREIGN KEY ("group_id") REFERENCES "public"."group"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "group" ADD CONSTRAINT "group_owner_id_user_id_fk" FOREIGN KEY ("owner_id") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "group" ADD CONSTRAINT "group_home_board_id_board_id_fk" FOREIGN KEY ("home_board_id") REFERENCES "public"."board"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "group" ADD CONSTRAINT "group_mobile_home_board_id_board_id_fk" FOREIGN KEY ("mobile_home_board_id") REFERENCES "public"."board"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "icon" ADD CONSTRAINT "icon_icon_repository_id_iconRepository_id_fk" FOREIGN KEY ("icon_repository_id") REFERENCES "public"."iconRepository"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "integrationGroupPermissions" ADD CONSTRAINT "integrationGroupPermissions_integration_id_integration_id_fk" FOREIGN KEY ("integration_id") REFERENCES "public"."integration"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "integrationGroupPermissions" ADD CONSTRAINT "integrationGroupPermissions_group_id_group_id_fk" FOREIGN KEY ("group_id") REFERENCES "public"."group"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "integration_item" ADD CONSTRAINT "integration_item_item_id_item_id_fk" FOREIGN KEY ("item_id") REFERENCES "public"."item"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "integration_item" ADD CONSTRAINT "integration_item_integration_id_integration_id_fk" FOREIGN KEY ("integration_id") REFERENCES "public"."integration"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "integrationSecret" ADD CONSTRAINT "integrationSecret_integration_id_integration_id_fk" FOREIGN KEY ("integration_id") REFERENCES "public"."integration"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "integrationUserPermission" ADD CONSTRAINT "integrationUserPermission_integration_id_integration_id_fk" FOREIGN KEY ("integration_id") REFERENCES "public"."integration"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "integrationUserPermission" ADD CONSTRAINT "integrationUserPermission_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "invite" ADD CONSTRAINT "invite_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "item_layout" ADD CONSTRAINT "item_layout_item_id_item_id_fk" FOREIGN KEY ("item_id") REFERENCES "public"."item"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "item_layout" ADD CONSTRAINT "item_layout_section_id_section_id_fk" FOREIGN KEY ("section_id") REFERENCES "public"."section"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "item_layout" ADD CONSTRAINT "item_layout_layout_id_layout_id_fk" FOREIGN KEY ("layout_id") REFERENCES "public"."layout"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "item" ADD CONSTRAINT "item_board_id_board_id_fk" FOREIGN KEY ("board_id") REFERENCES "public"."board"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "layout" ADD CONSTRAINT "layout_board_id_board_id_fk" FOREIGN KEY ("board_id") REFERENCES "public"."board"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "media" ADD CONSTRAINT "media_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "search_engine" ADD CONSTRAINT "search_engine_integration_id_integration_id_fk" FOREIGN KEY ("integration_id") REFERENCES "public"."integration"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "section_collapse_state" ADD CONSTRAINT "section_collapse_state_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "section_collapse_state" ADD CONSTRAINT "section_collapse_state_section_id_section_id_fk" FOREIGN KEY ("section_id") REFERENCES "public"."section"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "section_layout" ADD CONSTRAINT "section_layout_section_id_section_id_fk" FOREIGN KEY ("section_id") REFERENCES "public"."section"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "section_layout" ADD CONSTRAINT "section_layout_layout_id_layout_id_fk" FOREIGN KEY ("layout_id") REFERENCES "public"."layout"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "section_layout" ADD CONSTRAINT "section_layout_parent_section_id_section_id_fk" FOREIGN KEY ("parent_section_id") REFERENCES "public"."section"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "section" ADD CONSTRAINT "section_board_id_board_id_fk" FOREIGN KEY ("board_id") REFERENCES "public"."board"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "session" ADD CONSTRAINT "session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "user" ADD CONSTRAINT "user_home_board_id_board_id_fk" FOREIGN KEY ("home_board_id") REFERENCES "public"."board"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "user" ADD CONSTRAINT "user_mobile_home_board_id_board_id_fk" FOREIGN KEY ("mobile_home_board_id") REFERENCES "public"."board"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "user" ADD CONSTRAINT "user_default_search_engine_id_search_engine_id_fk" FOREIGN KEY ("default_search_engine_id") REFERENCES "public"."search_engine"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
+CREATE INDEX "userId_idx" ON "account" USING btree ("user_id");--> statement-breakpoint
+CREATE INDEX "integration_secret__kind_idx" ON "integrationSecret" USING btree ("kind");--> statement-breakpoint
+CREATE INDEX "integration_secret__updated_at_idx" ON "integrationSecret" USING btree ("updated_at");--> statement-breakpoint
+CREATE INDEX "integration__kind_idx" ON "integration" USING btree ("kind");--> statement-breakpoint
+CREATE INDEX "user_id_idx" ON "session" USING btree ("user_id");
\ No newline at end of file
diff --git a/packages/db/migrations/postgresql/meta/0000_snapshot.json b/packages/db/migrations/postgresql/meta/0000_snapshot.json
new file mode 100644
index 000000000..1e2688b84
--- /dev/null
+++ b/packages/db/migrations/postgresql/meta/0000_snapshot.json
@@ -0,0 +1,1991 @@
+{
+ "id": "7ee22b38-c9db-4844-a3ff-bf8e1f4c71e8",
+ "prevId": "00000000-0000-0000-0000-000000000000",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.account": {
+ "name": "account",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "type": {
+ "name": "type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider": {
+ "name": "provider",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "provider_account_id": {
+ "name": "provider_account_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "refresh_token": {
+ "name": "refresh_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "access_token": {
+ "name": "access_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "token_type": {
+ "name": "token_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "scope": {
+ "name": "scope",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "id_token": {
+ "name": "id_token",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "session_state": {
+ "name": "session_state",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "userId_idx": {
+ "name": "userId_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "account_user_id_user_id_fk": {
+ "name": "account_user_id_user_id_fk",
+ "tableFrom": "account",
+ "tableTo": "user",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "account_provider_provider_account_id_pk": {
+ "name": "account_provider_provider_account_id_pk",
+ "columns": ["provider", "provider_account_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.apiKey": {
+ "name": "apiKey",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "api_key": {
+ "name": "api_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "salt": {
+ "name": "salt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "apiKey_user_id_user_id_fk": {
+ "name": "apiKey_user_id_user_id_fk",
+ "tableFrom": "apiKey",
+ "tableTo": "user",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.app": {
+ "name": "app",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "icon_url": {
+ "name": "icon_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "href": {
+ "name": "href",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "ping_url": {
+ "name": "ping_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.boardGroupPermission": {
+ "name": "boardGroupPermission",
+ "schema": "",
+ "columns": {
+ "board_id": {
+ "name": "board_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "permission": {
+ "name": "permission",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "boardGroupPermission_board_id_board_id_fk": {
+ "name": "boardGroupPermission_board_id_board_id_fk",
+ "tableFrom": "boardGroupPermission",
+ "tableTo": "board",
+ "columnsFrom": ["board_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "boardGroupPermission_group_id_group_id_fk": {
+ "name": "boardGroupPermission_group_id_group_id_fk",
+ "tableFrom": "boardGroupPermission",
+ "tableTo": "group",
+ "columnsFrom": ["group_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "boardGroupPermission_board_id_group_id_permission_pk": {
+ "name": "boardGroupPermission_board_id_group_id_permission_pk",
+ "columns": ["board_id", "group_id", "permission"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.boardUserPermission": {
+ "name": "boardUserPermission",
+ "schema": "",
+ "columns": {
+ "board_id": {
+ "name": "board_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "permission": {
+ "name": "permission",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "boardUserPermission_board_id_board_id_fk": {
+ "name": "boardUserPermission_board_id_board_id_fk",
+ "tableFrom": "boardUserPermission",
+ "tableTo": "board",
+ "columnsFrom": ["board_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "boardUserPermission_user_id_user_id_fk": {
+ "name": "boardUserPermission_user_id_user_id_fk",
+ "tableFrom": "boardUserPermission",
+ "tableTo": "user",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "boardUserPermission_board_id_user_id_permission_pk": {
+ "name": "boardUserPermission_board_id_user_id_permission_pk",
+ "columns": ["board_id", "user_id", "permission"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.board": {
+ "name": "board",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_public": {
+ "name": "is_public",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "creator_id": {
+ "name": "creator_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "page_title": {
+ "name": "page_title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "meta_title": {
+ "name": "meta_title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "logo_image_url": {
+ "name": "logo_image_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "favicon_image_url": {
+ "name": "favicon_image_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "background_image_url": {
+ "name": "background_image_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "background_image_attachment": {
+ "name": "background_image_attachment",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'fixed'"
+ },
+ "background_image_repeat": {
+ "name": "background_image_repeat",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'no-repeat'"
+ },
+ "background_image_size": {
+ "name": "background_image_size",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'cover'"
+ },
+ "primary_color": {
+ "name": "primary_color",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'#fa5252'"
+ },
+ "secondary_color": {
+ "name": "secondary_color",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'#fd7e14'"
+ },
+ "opacity": {
+ "name": "opacity",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 100
+ },
+ "custom_css": {
+ "name": "custom_css",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "icon_color": {
+ "name": "icon_color",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "item_radius": {
+ "name": "item_radius",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'lg'"
+ },
+ "disable_status": {
+ "name": "disable_status",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "board_creator_id_user_id_fk": {
+ "name": "board_creator_id_user_id_fk",
+ "tableFrom": "board",
+ "tableTo": "user",
+ "columnsFrom": ["creator_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "board_name_unique": {
+ "name": "board_name_unique",
+ "nullsNotDistinct": false,
+ "columns": ["name"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.cron_job_configuration": {
+ "name": "cron_job_configuration",
+ "schema": "",
+ "columns": {
+ "name": {
+ "name": "name",
+ "type": "varchar(256)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "cron_expression": {
+ "name": "cron_expression",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_enabled": {
+ "name": "is_enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.groupMember": {
+ "name": "groupMember",
+ "schema": "",
+ "columns": {
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "groupMember_group_id_group_id_fk": {
+ "name": "groupMember_group_id_group_id_fk",
+ "tableFrom": "groupMember",
+ "tableTo": "group",
+ "columnsFrom": ["group_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "groupMember_user_id_user_id_fk": {
+ "name": "groupMember_user_id_user_id_fk",
+ "tableFrom": "groupMember",
+ "tableTo": "user",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "groupMember_group_id_user_id_pk": {
+ "name": "groupMember_group_id_user_id_pk",
+ "columns": ["group_id", "user_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.groupPermission": {
+ "name": "groupPermission",
+ "schema": "",
+ "columns": {
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "permission": {
+ "name": "permission",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "groupPermission_group_id_group_id_fk": {
+ "name": "groupPermission_group_id_group_id_fk",
+ "tableFrom": "groupPermission",
+ "tableTo": "group",
+ "columnsFrom": ["group_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.group": {
+ "name": "group",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "owner_id": {
+ "name": "owner_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "home_board_id": {
+ "name": "home_board_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mobile_home_board_id": {
+ "name": "mobile_home_board_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "position": {
+ "name": "position",
+ "type": "smallint",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "group_owner_id_user_id_fk": {
+ "name": "group_owner_id_user_id_fk",
+ "tableFrom": "group",
+ "tableTo": "user",
+ "columnsFrom": ["owner_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "group_home_board_id_board_id_fk": {
+ "name": "group_home_board_id_board_id_fk",
+ "tableFrom": "group",
+ "tableTo": "board",
+ "columnsFrom": ["home_board_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "group_mobile_home_board_id_board_id_fk": {
+ "name": "group_mobile_home_board_id_board_id_fk",
+ "tableFrom": "group",
+ "tableTo": "board",
+ "columnsFrom": ["mobile_home_board_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "group_name_unique": {
+ "name": "group_name_unique",
+ "nullsNotDistinct": false,
+ "columns": ["name"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.iconRepository": {
+ "name": "iconRepository",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "slug": {
+ "name": "slug",
+ "type": "varchar(150)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.icon": {
+ "name": "icon",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(250)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "url": {
+ "name": "url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "checksum": {
+ "name": "checksum",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "icon_repository_id": {
+ "name": "icon_repository_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "icon_icon_repository_id_iconRepository_id_fk": {
+ "name": "icon_icon_repository_id_iconRepository_id_fk",
+ "tableFrom": "icon",
+ "tableTo": "iconRepository",
+ "columnsFrom": ["icon_repository_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.integrationGroupPermissions": {
+ "name": "integrationGroupPermissions",
+ "schema": "",
+ "columns": {
+ "integration_id": {
+ "name": "integration_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "group_id": {
+ "name": "group_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "permission": {
+ "name": "permission",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "integrationGroupPermissions_integration_id_integration_id_fk": {
+ "name": "integrationGroupPermissions_integration_id_integration_id_fk",
+ "tableFrom": "integrationGroupPermissions",
+ "tableTo": "integration",
+ "columnsFrom": ["integration_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "integrationGroupPermissions_group_id_group_id_fk": {
+ "name": "integrationGroupPermissions_group_id_group_id_fk",
+ "tableFrom": "integrationGroupPermissions",
+ "tableTo": "group",
+ "columnsFrom": ["group_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "integration_group_permission__pk": {
+ "name": "integration_group_permission__pk",
+ "columns": ["integration_id", "group_id", "permission"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.integration_item": {
+ "name": "integration_item",
+ "schema": "",
+ "columns": {
+ "item_id": {
+ "name": "item_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "integration_id": {
+ "name": "integration_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "integration_item_item_id_item_id_fk": {
+ "name": "integration_item_item_id_item_id_fk",
+ "tableFrom": "integration_item",
+ "tableTo": "item",
+ "columnsFrom": ["item_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "integration_item_integration_id_integration_id_fk": {
+ "name": "integration_item_integration_id_integration_id_fk",
+ "tableFrom": "integration_item",
+ "tableTo": "integration",
+ "columnsFrom": ["integration_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "integration_item_item_id_integration_id_pk": {
+ "name": "integration_item_item_id_integration_id_pk",
+ "columns": ["item_id", "integration_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.integrationSecret": {
+ "name": "integrationSecret",
+ "schema": "",
+ "columns": {
+ "kind": {
+ "name": "kind",
+ "type": "varchar(16)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "integration_id": {
+ "name": "integration_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "integration_secret__kind_idx": {
+ "name": "integration_secret__kind_idx",
+ "columns": [
+ {
+ "expression": "kind",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "integration_secret__updated_at_idx": {
+ "name": "integration_secret__updated_at_idx",
+ "columns": [
+ {
+ "expression": "updated_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "integrationSecret_integration_id_integration_id_fk": {
+ "name": "integrationSecret_integration_id_integration_id_fk",
+ "tableFrom": "integrationSecret",
+ "tableTo": "integration",
+ "columnsFrom": ["integration_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "integrationSecret_integration_id_kind_pk": {
+ "name": "integrationSecret_integration_id_kind_pk",
+ "columns": ["integration_id", "kind"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.integrationUserPermission": {
+ "name": "integrationUserPermission",
+ "schema": "",
+ "columns": {
+ "integration_id": {
+ "name": "integration_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "permission": {
+ "name": "permission",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "integrationUserPermission_integration_id_integration_id_fk": {
+ "name": "integrationUserPermission_integration_id_integration_id_fk",
+ "tableFrom": "integrationUserPermission",
+ "tableTo": "integration",
+ "columnsFrom": ["integration_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "integrationUserPermission_user_id_user_id_fk": {
+ "name": "integrationUserPermission_user_id_user_id_fk",
+ "tableFrom": "integrationUserPermission",
+ "tableTo": "user",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "integrationUserPermission_integration_id_user_id_permission_pk": {
+ "name": "integrationUserPermission_integration_id_user_id_permission_pk",
+ "columns": ["integration_id", "user_id", "permission"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.integration": {
+ "name": "integration",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "url": {
+ "name": "url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "kind": {
+ "name": "kind",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "integration__kind_idx": {
+ "name": "integration__kind_idx",
+ "columns": [
+ {
+ "expression": "kind",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.invite": {
+ "name": "invite",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expiration_date": {
+ "name": "expiration_date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "creator_id": {
+ "name": "creator_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "invite_creator_id_user_id_fk": {
+ "name": "invite_creator_id_user_id_fk",
+ "tableFrom": "invite",
+ "tableTo": "user",
+ "columnsFrom": ["creator_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "invite_token_unique": {
+ "name": "invite_token_unique",
+ "nullsNotDistinct": false,
+ "columns": ["token"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.item_layout": {
+ "name": "item_layout",
+ "schema": "",
+ "columns": {
+ "item_id": {
+ "name": "item_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "section_id": {
+ "name": "section_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "layout_id": {
+ "name": "layout_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "x_offset": {
+ "name": "x_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "y_offset": {
+ "name": "y_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "width": {
+ "name": "width",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "height": {
+ "name": "height",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "item_layout_item_id_item_id_fk": {
+ "name": "item_layout_item_id_item_id_fk",
+ "tableFrom": "item_layout",
+ "tableTo": "item",
+ "columnsFrom": ["item_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "item_layout_section_id_section_id_fk": {
+ "name": "item_layout_section_id_section_id_fk",
+ "tableFrom": "item_layout",
+ "tableTo": "section",
+ "columnsFrom": ["section_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "item_layout_layout_id_layout_id_fk": {
+ "name": "item_layout_layout_id_layout_id_fk",
+ "tableFrom": "item_layout",
+ "tableTo": "layout",
+ "columnsFrom": ["layout_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "item_layout_item_id_section_id_layout_id_pk": {
+ "name": "item_layout_item_id_section_id_layout_id_pk",
+ "columns": ["item_id", "section_id", "layout_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.item": {
+ "name": "item",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "board_id": {
+ "name": "board_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "kind": {
+ "name": "kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "options": {
+ "name": "options",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{\"json\": {}}'"
+ },
+ "advanced_options": {
+ "name": "advanced_options",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{\"json\": {}}'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "item_board_id_board_id_fk": {
+ "name": "item_board_id_board_id_fk",
+ "tableFrom": "item",
+ "tableTo": "board",
+ "columnsFrom": ["board_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.layout": {
+ "name": "layout",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(32)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "board_id": {
+ "name": "board_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "column_count": {
+ "name": "column_count",
+ "type": "smallint",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "breakpoint": {
+ "name": "breakpoint",
+ "type": "smallint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "layout_board_id_board_id_fk": {
+ "name": "layout_board_id_board_id_fk",
+ "tableFrom": "layout",
+ "tableTo": "board",
+ "columnsFrom": ["board_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.media": {
+ "name": "media",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "bytea",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content_type": {
+ "name": "content_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "size": {
+ "name": "size",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "creator_id": {
+ "name": "creator_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "media_creator_id_user_id_fk": {
+ "name": "media_creator_id_user_id_fk",
+ "tableFrom": "media",
+ "tableTo": "user",
+ "columnsFrom": ["creator_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.onboarding": {
+ "name": "onboarding",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "step": {
+ "name": "step",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "previous_step": {
+ "name": "previous_step",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.search_engine": {
+ "name": "search_engine",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "icon_url": {
+ "name": "icon_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "short": {
+ "name": "short",
+ "type": "varchar(8)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "url_template": {
+ "name": "url_template",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "type": {
+ "name": "type",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'generic'"
+ },
+ "integration_id": {
+ "name": "integration_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "search_engine_integration_id_integration_id_fk": {
+ "name": "search_engine_integration_id_integration_id_fk",
+ "tableFrom": "search_engine",
+ "tableTo": "integration",
+ "columnsFrom": ["integration_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "search_engine_short_unique": {
+ "name": "search_engine_short_unique",
+ "nullsNotDistinct": false,
+ "columns": ["short"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.section_collapse_state": {
+ "name": "section_collapse_state",
+ "schema": "",
+ "columns": {
+ "user_id": {
+ "name": "user_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "section_id": {
+ "name": "section_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "collapsed": {
+ "name": "collapsed",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "section_collapse_state_user_id_user_id_fk": {
+ "name": "section_collapse_state_user_id_user_id_fk",
+ "tableFrom": "section_collapse_state",
+ "tableTo": "user",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "section_collapse_state_section_id_section_id_fk": {
+ "name": "section_collapse_state_section_id_section_id_fk",
+ "tableFrom": "section_collapse_state",
+ "tableTo": "section",
+ "columnsFrom": ["section_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "section_collapse_state_user_id_section_id_pk": {
+ "name": "section_collapse_state_user_id_section_id_pk",
+ "columns": ["user_id", "section_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.section_layout": {
+ "name": "section_layout",
+ "schema": "",
+ "columns": {
+ "section_id": {
+ "name": "section_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "layout_id": {
+ "name": "layout_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "parent_section_id": {
+ "name": "parent_section_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "x_offset": {
+ "name": "x_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "y_offset": {
+ "name": "y_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "width": {
+ "name": "width",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "height": {
+ "name": "height",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "section_layout_section_id_section_id_fk": {
+ "name": "section_layout_section_id_section_id_fk",
+ "tableFrom": "section_layout",
+ "tableTo": "section",
+ "columnsFrom": ["section_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "section_layout_layout_id_layout_id_fk": {
+ "name": "section_layout_layout_id_layout_id_fk",
+ "tableFrom": "section_layout",
+ "tableTo": "layout",
+ "columnsFrom": ["layout_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "section_layout_parent_section_id_section_id_fk": {
+ "name": "section_layout_parent_section_id_section_id_fk",
+ "tableFrom": "section_layout",
+ "tableTo": "section",
+ "columnsFrom": ["parent_section_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {
+ "section_layout_section_id_layout_id_pk": {
+ "name": "section_layout_section_id_layout_id_pk",
+ "columns": ["section_id", "layout_id"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.section": {
+ "name": "section",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "board_id": {
+ "name": "board_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "kind": {
+ "name": "kind",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "x_offset": {
+ "name": "x_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "y_offset": {
+ "name": "y_offset",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "options": {
+ "name": "options",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false,
+ "default": "'{\"json\": {}}'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "section_board_id_board_id_fk": {
+ "name": "section_board_id_board_id_fk",
+ "tableFrom": "section",
+ "tableTo": "board",
+ "columnsFrom": ["board_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.serverSetting": {
+ "name": "serverSetting",
+ "schema": "",
+ "columns": {
+ "setting_key": {
+ "name": "setting_key",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "value": {
+ "name": "value",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'{\"json\": {}}'"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "serverSetting_settingKey_unique": {
+ "name": "serverSetting_settingKey_unique",
+ "nullsNotDistinct": false,
+ "columns": ["setting_key"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.session": {
+ "name": "session",
+ "schema": "",
+ "columns": {
+ "session_token": {
+ "name": "session_token",
+ "type": "varchar(512)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires": {
+ "name": "expires",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "user_id_idx": {
+ "name": "user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "session_user_id_user_id_fk": {
+ "name": "session_user_id_user_id_fk",
+ "tableFrom": "session",
+ "tableTo": "user",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.trusted_certificate_hostname": {
+ "name": "trusted_certificate_hostname",
+ "schema": "",
+ "columns": {
+ "hostname": {
+ "name": "hostname",
+ "type": "varchar(256)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "thumbprint": {
+ "name": "thumbprint",
+ "type": "varchar(128)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "certificate": {
+ "name": "certificate",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {
+ "trusted_certificate_hostname_hostname_thumbprint_pk": {
+ "name": "trusted_certificate_hostname_hostname_thumbprint_pk",
+ "columns": ["hostname", "thumbprint"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.user": {
+ "name": "user",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(64)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "email_verified": {
+ "name": "email_verified",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "image": {
+ "name": "image",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "password": {
+ "name": "password",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "salt": {
+ "name": "salt",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "provider": {
+ "name": "provider",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'credentials'"
+ },
+ "home_board_id": {
+ "name": "home_board_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "mobile_home_board_id": {
+ "name": "mobile_home_board_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "default_search_engine_id": {
+ "name": "default_search_engine_id",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "open_search_in_new_tab": {
+ "name": "open_search_in_new_tab",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "color_scheme": {
+ "name": "color_scheme",
+ "type": "varchar(5)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'dark'"
+ },
+ "first_day_of_week": {
+ "name": "first_day_of_week",
+ "type": "smallint",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "ping_icons_enabled": {
+ "name": "ping_icons_enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {
+ "user_home_board_id_board_id_fk": {
+ "name": "user_home_board_id_board_id_fk",
+ "tableFrom": "user",
+ "tableTo": "board",
+ "columnsFrom": ["home_board_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "user_mobile_home_board_id_board_id_fk": {
+ "name": "user_mobile_home_board_id_board_id_fk",
+ "tableFrom": "user",
+ "tableTo": "board",
+ "columnsFrom": ["mobile_home_board_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ },
+ "user_default_search_engine_id_search_engine_id_fk": {
+ "name": "user_default_search_engine_id_search_engine_id_fk",
+ "tableFrom": "user",
+ "tableTo": "search_engine",
+ "columnsFrom": ["default_search_engine_id"],
+ "columnsTo": ["id"],
+ "onDelete": "set null",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.verificationToken": {
+ "name": "verificationToken",
+ "schema": "",
+ "columns": {
+ "identifier": {
+ "name": "identifier",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "token": {
+ "name": "token",
+ "type": "varchar(512)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "expires": {
+ "name": "expires",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {
+ "verificationToken_identifier_token_pk": {
+ "name": "verificationToken_identifier_token_pk",
+ "columns": ["identifier", "token"]
+ }
+ },
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {},
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
diff --git a/packages/db/migrations/postgresql/meta/_journal.json b/packages/db/migrations/postgresql/meta/_journal.json
new file mode 100644
index 000000000..44e76ff19
--- /dev/null
+++ b/packages/db/migrations/postgresql/meta/_journal.json
@@ -0,0 +1,13 @@
+{
+ "version": "7",
+ "dialect": "postgresql",
+ "entries": [
+ {
+ "idx": 0,
+ "version": "7",
+ "when": 1754853510707,
+ "tag": "0000_initial",
+ "breakpoints": true
+ }
+ ]
+}
diff --git a/packages/db/migrations/postgresql/migrate.ts b/packages/db/migrations/postgresql/migrate.ts
new file mode 100644
index 000000000..6e97f7a1b
--- /dev/null
+++ b/packages/db/migrations/postgresql/migrate.ts
@@ -0,0 +1,45 @@
+import { drizzle } from "drizzle-orm/node-postgres";
+import { migrate } from "drizzle-orm/node-postgres/migrator";
+import { Pool } from "pg";
+
+import type { Database } from "../..";
+import { env } from "../../env";
+import * as pgSchema from "../../schema/postgresql";
+import { applyCustomMigrationsAsync } from "../custom";
+import { seedDataAsync } from "../seed";
+
+const migrationsFolder = process.argv[2] ?? ".";
+
+const migrateAsync = async () => {
+ const pool = new Pool(
+ env.DB_URL
+ ? { connectionString: env.DB_URL }
+ : {
+ host: env.DB_HOST,
+ database: env.DB_NAME,
+ port: env.DB_PORT,
+ user: env.DB_USER,
+ password: env.DB_PASSWORD,
+ },
+ );
+
+ const db = drizzle({
+ schema: pgSchema,
+ casing: "snake_case",
+ client: pool,
+ });
+
+ await migrate(db, { migrationsFolder });
+ await seedDataAsync(db as unknown as Database);
+ await applyCustomMigrationsAsync(db as unknown as Database);
+};
+
+migrateAsync()
+ .then(() => {
+ console.log("Migration complete");
+ process.exit(0);
+ })
+ .catch((err) => {
+ console.log("Migration failed", err);
+ process.exit(1);
+ });
diff --git a/packages/db/migrations/seed.ts b/packages/db/migrations/seed.ts
index 4a1efdafc..e3d16bfdc 100644
--- a/packages/db/migrations/seed.ts
+++ b/packages/db/migrations/seed.ts
@@ -15,9 +15,8 @@ import {
insertServerSettingByKeyAsync,
updateServerSettingByKeyAsync,
} from "../queries/server-setting";
-import { integrations, onboarding, searchEngines } from "../schema";
+import { groups, integrations, onboarding, searchEngines } from "../schema";
import type { Integration } from "../schema";
-import { groups } from "../schema/mysql";
export const seedDataAsync = async (db: Database) => {
await seedEveryoneGroupAsync(db);
diff --git a/packages/db/package.json b/packages/db/package.json
index 8bbae94a6..317d35b25 100644
--- a/packages/db/package.json
+++ b/packages/db/package.json
@@ -16,8 +16,9 @@
"main": "./index.ts",
"types": "./index.ts",
"scripts": {
- "build": "pnpm run build:sqlite && pnpm run build:mysql",
+ "build": "pnpm run build:sqlite && pnpm run build:mysql && pnpm run build:postgresql",
"build:mysql": "esbuild migrations/mysql/migrate.ts --bundle --platform=node --outfile=migrations/mysql/migrate.cjs",
+ "build:postgresql": "esbuild migrations/postgresql/migrate.ts --bundle --platform=node --outfile=migrations/postgresql/migrate.cjs",
"build:sqlite": "esbuild migrations/sqlite/migrate.ts --bundle --platform=node --outfile=migrations/sqlite/migrate.cjs",
"clean": "rm -rf .turbo node_modules",
"format": "prettier --check . --ignore-path ../../.gitignore",
@@ -26,10 +27,14 @@
"migration:mysql:drop": "pnpm with-env drizzle-kit drop --config ./configs/mysql.config.ts",
"migration:mysql:generate": "pnpm with-env drizzle-kit generate --config ./configs/mysql.config.ts",
"migration:mysql:run": "pnpm with-env drizzle-kit migrate --config ./configs/mysql.config.ts && pnpm run seed && pnpm run migration:custom",
+ "migration:postgresql:drop": "pnpm with-env drizzle-kit drop --config ./configs/postgresql.config.ts",
+ "migration:postgresql:generate": "pnpm with-env drizzle-kit generate --config ./configs/postgresql.config.ts",
+ "migration:postgresql:run": "pnpm with-env drizzle-kit migrate --config ./configs/postgresql.config.ts && pnpm run seed && pnpm run migration:custom",
"migration:sqlite:drop": "pnpm with-env drizzle-kit drop --config ./configs/sqlite.config.ts",
"migration:sqlite:generate": "pnpm with-env drizzle-kit generate --config ./configs/sqlite.config.ts",
"migration:sqlite:run": "pnpm with-env drizzle-kit migrate --config ./configs/sqlite.config.ts && pnpm run seed && pnpm run migration:custom",
"push:mysql": "pnpm with-env drizzle-kit push --config ./configs/mysql.config.ts",
+ "push:postgresql": "pnpm with-env drizzle-kit push --config ./configs/postgresql.config.ts",
"push:sqlite": "pnpm with-env drizzle-kit push --config ./configs/sqlite.config.ts",
"seed": "pnpm with-env tsx ./migrations/run-seed.ts",
"studio": "pnpm with-env drizzle-kit studio --config ./configs/sqlite.config.ts",
@@ -47,12 +52,14 @@
"@mantine/core": "^8.2.5",
"@paralleldrive/cuid2": "^2.2.2",
"@testcontainers/mysql": "^11.5.1",
+ "@testcontainers/postgresql": "^11.4.0",
"better-sqlite3": "^12.2.0",
"dotenv": "^17.2.1",
"drizzle-kit": "^0.31.4",
"drizzle-orm": "^0.44.4",
"drizzle-zod": "^0.8.3",
"mysql2": "3.14.3",
+ "pg": "^8.16.3",
"superjson": "2.2.2"
},
"devDependencies": {
@@ -60,6 +67,7 @@
"@homarr/prettier-config": "workspace:^0.1.0",
"@homarr/tsconfig": "workspace:^0.1.0",
"@types/better-sqlite3": "7.6.13",
+ "@types/pg": "^8.15.4",
"dotenv-cli": "^10.0.0",
"esbuild": "^0.25.9",
"eslint": "^9.33.0",
diff --git a/packages/db/schema/index.ts b/packages/db/schema/index.ts
index 1b9d143c2..52a1b9cdb 100644
--- a/packages/db/schema/index.ts
+++ b/packages/db/schema/index.ts
@@ -1,11 +1,20 @@
import type { InferSelectModel } from "drizzle-orm";
+import { env } from "../env";
import * as mysqlSchema from "./mysql";
+import * as pgSchema from "./postgresql";
import * as sqliteSchema from "./sqlite";
+export type PostgreSqlSchema = typeof pgSchema;
+export type MySqlSchema = typeof mysqlSchema;
type Schema = typeof sqliteSchema;
-const schema = process.env.DB_DRIVER === "mysql2" ? (mysqlSchema as unknown as Schema) : sqliteSchema;
+const schema =
+ env.DB_DRIVER === "mysql2"
+ ? (mysqlSchema as unknown as Schema)
+ : env.DB_DRIVER === "node-postgres"
+ ? (pgSchema as unknown as Schema)
+ : sqliteSchema;
// Sadly we can't use export * from here as we have multiple possible exports
export const {
diff --git a/packages/db/schema/mysql.ts b/packages/db/schema/mysql.ts
index a5607c7b5..29ca741a8 100644
--- a/packages/db/schema/mysql.ts
+++ b/packages/db/schema/mysql.ts
@@ -528,6 +528,7 @@ export const userRelations = relations(users, ({ one, many }) => ({
groups: many(groupMembers),
ownedGroups: many(groups),
invites: many(invites),
+ medias: many(medias),
defaultSearchEngine: one(searchEngines, {
fields: [users.defaultSearchEngineId],
references: [searchEngines.id],
diff --git a/packages/db/schema/postgresql.ts b/packages/db/schema/postgresql.ts
new file mode 100644
index 000000000..d84c816e9
--- /dev/null
+++ b/packages/db/schema/postgresql.ts
@@ -0,0 +1,775 @@
+import type { AdapterAccount } from "@auth/core/adapters";
+import type { MantineSize } from "@mantine/core";
+import type { DayOfWeek } from "@mantine/dates";
+import { relations } from "drizzle-orm";
+import type { AnyPgColumn } from "drizzle-orm/pg-core";
+import {
+ boolean,
+ customType,
+ index,
+ integer,
+ pgTable,
+ primaryKey,
+ smallint,
+ text,
+ timestamp,
+ varchar,
+} from "drizzle-orm/pg-core";
+
+import {
+ backgroundImageAttachments,
+ backgroundImageRepeats,
+ backgroundImageSizes,
+ emptySuperJSON,
+} from "@homarr/definitions";
+import type {
+ BackgroundImageAttachment,
+ BackgroundImageRepeat,
+ BackgroundImageSize,
+ BoardPermission,
+ ColorScheme,
+ GroupPermissionKey,
+ IntegrationKind,
+ IntegrationPermission,
+ IntegrationSecretKind,
+ OnboardingStep,
+ SearchEngineType,
+ SectionKind,
+ SupportedAuthProvider,
+ WidgetKind,
+} from "@homarr/definitions";
+
+const customBlob = customType<{ data: Buffer }>({
+ dataType() {
+ return "bytea";
+ },
+});
+
+export const apiKeys = pgTable("apiKey", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ apiKey: text().notNull(),
+ salt: text().notNull(),
+ userId: varchar({ length: 64 })
+ .notNull()
+ .references((): AnyPgColumn => users.id, {
+ onDelete: "cascade",
+ }),
+});
+
+export const users = pgTable("user", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ name: text(),
+ email: text(),
+ emailVerified: timestamp(),
+ image: text(),
+ password: text(),
+ salt: text(),
+ provider: varchar({ length: 64 }).$type().default("credentials").notNull(),
+ homeBoardId: varchar({ length: 64 }).references((): AnyPgColumn => boards.id, {
+ onDelete: "set null",
+ }),
+ mobileHomeBoardId: varchar({ length: 64 }).references((): AnyPgColumn => boards.id, {
+ onDelete: "set null",
+ }),
+ defaultSearchEngineId: varchar({ length: 64 }).references(() => searchEngines.id, {
+ onDelete: "set null",
+ }),
+ openSearchInNewTab: boolean().default(false).notNull(),
+ colorScheme: varchar({ length: 5 }).$type().default("dark").notNull(),
+ firstDayOfWeek: smallint().$type().default(1).notNull(), // Defaults to Monday
+ pingIconsEnabled: boolean().default(false).notNull(),
+});
+
+export const accounts = pgTable(
+ "account",
+ {
+ userId: varchar({ length: 64 })
+ .notNull()
+ .references(() => users.id, { onDelete: "cascade" }),
+ type: text().$type().notNull(),
+ provider: varchar({ length: 64 }).notNull(),
+ providerAccountId: varchar({ length: 64 }).notNull(),
+ refresh_token: text(),
+ access_token: text(),
+ expires_at: integer(),
+ token_type: text(),
+ scope: text(),
+ id_token: text(),
+ session_state: text(),
+ },
+ (account) => ({
+ compoundKey: primaryKey({
+ columns: [account.provider, account.providerAccountId],
+ }),
+ userIdIdx: index("userId_idx").on(account.userId),
+ }),
+);
+
+export const sessions = pgTable(
+ "session",
+ {
+ sessionToken: varchar({ length: 512 }).notNull().primaryKey(),
+ userId: varchar({ length: 64 })
+ .notNull()
+ .references(() => users.id, { onDelete: "cascade" }),
+ expires: timestamp().notNull(),
+ },
+ (session) => ({
+ userIdIdx: index("user_id_idx").on(session.userId),
+ }),
+);
+
+export const verificationTokens = pgTable(
+ "verificationToken",
+ {
+ identifier: varchar({ length: 64 }).notNull(),
+ token: varchar({ length: 512 }).notNull(),
+ expires: timestamp().notNull(),
+ },
+ (verificationToken) => ({
+ compoundKey: primaryKey({
+ columns: [verificationToken.identifier, verificationToken.token],
+ }),
+ }),
+);
+
+export const groupMembers = pgTable(
+ "groupMember",
+ {
+ groupId: varchar({ length: 64 })
+ .notNull()
+ .references(() => groups.id, { onDelete: "cascade" }),
+ userId: varchar({ length: 64 })
+ .notNull()
+ .references(() => users.id, { onDelete: "cascade" }),
+ },
+ (groupMember) => ({
+ compoundKey: primaryKey({
+ columns: [groupMember.groupId, groupMember.userId],
+ }),
+ }),
+);
+
+export const groups = pgTable("group", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ name: varchar({ length: 64 }).unique().notNull(),
+ ownerId: varchar({ length: 64 }).references(() => users.id, {
+ onDelete: "set null",
+ }),
+ homeBoardId: varchar({ length: 64 }).references(() => boards.id, {
+ onDelete: "set null",
+ }),
+ mobileHomeBoardId: varchar({ length: 64 }).references(() => boards.id, {
+ onDelete: "set null",
+ }),
+ position: smallint().notNull(),
+});
+
+export const groupPermissions = pgTable("groupPermission", {
+ groupId: varchar({ length: 64 })
+ .notNull()
+ .references(() => groups.id, { onDelete: "cascade" }),
+ permission: text().$type().notNull(),
+});
+
+export const invites = pgTable("invite", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ token: varchar({ length: 512 }).notNull().unique(),
+ expirationDate: timestamp().notNull(),
+ creatorId: varchar({ length: 64 })
+ .notNull()
+ .references(() => users.id, { onDelete: "cascade" }),
+});
+
+export const medias = pgTable("media", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ name: varchar({ length: 512 }).notNull(),
+ content: customBlob().notNull(),
+ contentType: text().notNull(),
+ size: integer().notNull(),
+ createdAt: timestamp({ mode: "date" }).notNull().defaultNow(),
+ creatorId: varchar({ length: 64 }).references(() => users.id, { onDelete: "set null" }),
+});
+
+export const integrations = pgTable(
+ "integration",
+ {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ name: text().notNull(),
+ url: text().notNull(),
+ kind: varchar({ length: 128 }).$type().notNull(),
+ },
+ (integrations) => ({
+ kindIdx: index("integration__kind_idx").on(integrations.kind),
+ }),
+);
+
+export const integrationSecrets = pgTable(
+ "integrationSecret",
+ {
+ kind: varchar({ length: 16 }).$type().notNull(),
+ value: text().$type<`${string}.${string}`>().notNull(),
+ updatedAt: timestamp()
+ .$onUpdateFn(() => new Date())
+ .notNull(),
+ integrationId: varchar({ length: 64 })
+ .notNull()
+ .references(() => integrations.id, { onDelete: "cascade" }),
+ },
+ (integrationSecret) => ({
+ compoundKey: primaryKey({
+ columns: [integrationSecret.integrationId, integrationSecret.kind],
+ }),
+ kindIdx: index("integration_secret__kind_idx").on(integrationSecret.kind),
+ updatedAtIdx: index("integration_secret__updated_at_idx").on(integrationSecret.updatedAt),
+ }),
+);
+
+export const integrationUserPermissions = pgTable(
+ "integrationUserPermission",
+ {
+ integrationId: varchar({ length: 64 })
+ .notNull()
+ .references(() => integrations.id, { onDelete: "cascade" }),
+ userId: varchar({ length: 64 })
+ .notNull()
+ .references(() => users.id, { onDelete: "cascade" }),
+ permission: varchar({ length: 128 }).$type().notNull(),
+ },
+ (table) => ({
+ compoundKey: primaryKey({
+ columns: [table.integrationId, table.userId, table.permission],
+ }),
+ }),
+);
+
+export const integrationGroupPermissions = pgTable(
+ "integrationGroupPermissions",
+ {
+ integrationId: varchar({ length: 64 })
+ .notNull()
+ .references(() => integrations.id, { onDelete: "cascade" }),
+ groupId: varchar({ length: 64 })
+ .notNull()
+ .references(() => groups.id, { onDelete: "cascade" }),
+ permission: varchar({ length: 128 }).$type().notNull(),
+ },
+ (table) => ({
+ compoundKey: primaryKey({
+ columns: [table.integrationId, table.groupId, table.permission],
+ name: "integration_group_permission__pk",
+ }),
+ }),
+);
+
+export const boards = pgTable("board", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ name: varchar({ length: 256 }).unique().notNull(),
+ isPublic: boolean().default(false).notNull(),
+ creatorId: varchar({ length: 64 }).references(() => users.id, {
+ onDelete: "set null",
+ }),
+ pageTitle: text(),
+ metaTitle: text(),
+ logoImageUrl: text(),
+ faviconImageUrl: text(),
+ backgroundImageUrl: text(),
+ backgroundImageAttachment: text()
+ .$type()
+ .default(backgroundImageAttachments.defaultValue)
+ .notNull(),
+ backgroundImageRepeat: text().$type().default(backgroundImageRepeats.defaultValue).notNull(),
+ backgroundImageSize: text().$type().default(backgroundImageSizes.defaultValue).notNull(),
+ primaryColor: text().default("#fa5252").notNull(),
+ secondaryColor: text().default("#fd7e14").notNull(),
+ opacity: integer().default(100).notNull(),
+ customCss: text(),
+ iconColor: text(),
+ itemRadius: text().$type().default("lg").notNull(),
+ disableStatus: boolean().default(false).notNull(),
+});
+
+export const boardUserPermissions = pgTable(
+ "boardUserPermission",
+ {
+ boardId: varchar({ length: 64 })
+ .notNull()
+ .references(() => boards.id, { onDelete: "cascade" }),
+ userId: varchar({ length: 64 })
+ .notNull()
+ .references(() => users.id, { onDelete: "cascade" }),
+ permission: varchar({ length: 128 }).$type().notNull(),
+ },
+ (table) => ({
+ compoundKey: primaryKey({
+ columns: [table.boardId, table.userId, table.permission],
+ }),
+ }),
+);
+
+export const boardGroupPermissions = pgTable(
+ "boardGroupPermission",
+ {
+ boardId: varchar({ length: 64 })
+ .notNull()
+ .references(() => boards.id, { onDelete: "cascade" }),
+ groupId: varchar({ length: 64 })
+ .notNull()
+ .references(() => groups.id, { onDelete: "cascade" }),
+ permission: varchar({ length: 128 }).$type().notNull(),
+ },
+ (table) => ({
+ compoundKey: primaryKey({
+ columns: [table.boardId, table.groupId, table.permission],
+ }),
+ }),
+);
+
+export const layouts = pgTable("layout", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ name: varchar({ length: 32 }).notNull(),
+ boardId: varchar({ length: 64 })
+ .notNull()
+ .references(() => boards.id, { onDelete: "cascade" }),
+ columnCount: smallint().notNull(),
+ breakpoint: smallint().notNull().default(0),
+});
+
+export const itemLayouts = pgTable(
+ "item_layout",
+ {
+ itemId: varchar({ length: 64 })
+ .notNull()
+ .references(() => items.id, { onDelete: "cascade" }),
+ sectionId: varchar({ length: 64 })
+ .notNull()
+ .references(() => sections.id, { onDelete: "cascade" }),
+ layoutId: varchar({ length: 64 })
+ .notNull()
+ .references(() => layouts.id, { onDelete: "cascade" }),
+ xOffset: integer().notNull(),
+ yOffset: integer().notNull(),
+ width: integer().notNull(),
+ height: integer().notNull(),
+ },
+ (table) => ({
+ compoundKey: primaryKey({
+ columns: [table.itemId, table.sectionId, table.layoutId],
+ }),
+ }),
+);
+
+export const sectionLayouts = pgTable(
+ "section_layout",
+ {
+ sectionId: varchar({ length: 64 })
+ .notNull()
+ .references(() => sections.id, { onDelete: "cascade" }),
+ layoutId: varchar({ length: 64 })
+ .notNull()
+ .references(() => layouts.id, { onDelete: "cascade" }),
+ parentSectionId: varchar({ length: 64 }).references((): AnyPgColumn => sections.id, {
+ onDelete: "cascade",
+ }),
+ xOffset: integer().notNull(),
+ yOffset: integer().notNull(),
+ width: integer().notNull(),
+ height: integer().notNull(),
+ },
+ (table) => ({
+ compoundKey: primaryKey({
+ columns: [table.sectionId, table.layoutId],
+ }),
+ }),
+);
+
+export const sections = pgTable("section", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ boardId: varchar({ length: 64 })
+ .notNull()
+ .references(() => boards.id, { onDelete: "cascade" }),
+ kind: text().$type().notNull(),
+ xOffset: integer(),
+ yOffset: integer(),
+ name: text(),
+ options: text().default(emptySuperJSON),
+});
+
+export const sectionCollapseStates = pgTable(
+ "section_collapse_state",
+ {
+ userId: varchar({ length: 64 })
+ .notNull()
+ .references(() => users.id, { onDelete: "cascade" }),
+ sectionId: varchar({ length: 64 })
+ .notNull()
+ .references(() => sections.id, { onDelete: "cascade" }),
+ collapsed: boolean().default(false).notNull(),
+ },
+ (table) => ({
+ compoundKey: primaryKey({
+ columns: [table.userId, table.sectionId],
+ }),
+ }),
+);
+
+export const items = pgTable("item", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ boardId: varchar({ length: 64 })
+ .notNull()
+ .references(() => boards.id, { onDelete: "cascade" }),
+ kind: text().$type().notNull(),
+ options: text().default(emptySuperJSON).notNull(),
+ advancedOptions: text().default(emptySuperJSON).notNull(),
+});
+
+export const apps = pgTable("app", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ name: text().notNull(),
+ description: text(),
+ iconUrl: text().notNull(),
+ href: text(),
+ pingUrl: text(),
+});
+
+export const integrationItems = pgTable(
+ "integration_item",
+ {
+ itemId: varchar({ length: 64 })
+ .notNull()
+ .references(() => items.id, { onDelete: "cascade" }),
+ integrationId: varchar({ length: 64 })
+ .notNull()
+ .references(() => integrations.id, { onDelete: "cascade" }),
+ },
+ (table) => ({
+ compoundKey: primaryKey({
+ columns: [table.itemId, table.integrationId],
+ }),
+ }),
+);
+
+export const icons = pgTable("icon", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ name: varchar({ length: 250 }).notNull(),
+ url: text().notNull(),
+ checksum: text().notNull(),
+ iconRepositoryId: varchar({ length: 64 })
+ .notNull()
+ .references(() => iconRepositories.id, { onDelete: "cascade" }),
+});
+
+export const iconRepositories = pgTable("iconRepository", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ slug: varchar({ length: 150 }).notNull(),
+});
+
+export const serverSettings = pgTable("serverSetting", {
+ settingKey: varchar({ length: 64 }).notNull().unique().primaryKey(),
+ value: text().default(emptySuperJSON).notNull(),
+});
+
+export const apiKeyRelations = relations(apiKeys, ({ one }) => ({
+ user: one(users, {
+ fields: [apiKeys.userId],
+ references: [users.id],
+ }),
+}));
+
+export const searchEngines = pgTable("search_engine", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ iconUrl: text().notNull(),
+ name: varchar({ length: 64 }).notNull(),
+ short: varchar({ length: 8 }).unique().notNull(),
+ description: text(),
+ urlTemplate: text(),
+ type: varchar({ length: 64 }).$type().notNull().default("generic"),
+ integrationId: varchar({ length: 64 }).references(() => integrations.id, { onDelete: "cascade" }),
+});
+
+export const onboarding = pgTable("onboarding", {
+ id: varchar({ length: 64 }).notNull().primaryKey(),
+ step: varchar({ length: 64 }).$type().notNull(),
+ previousStep: varchar({ length: 64 }).$type(),
+});
+
+export const trustedCertificateHostnames = pgTable(
+ "trusted_certificate_hostname",
+ {
+ hostname: varchar({ length: 256 }).notNull(),
+ thumbprint: varchar({ length: 128 }).notNull(),
+ certificate: text().notNull(),
+ },
+ (table) => ({
+ compoundKey: primaryKey({
+ columns: [table.hostname, table.thumbprint],
+ }),
+ }),
+);
+
+export const cronJobConfigurations = pgTable("cron_job_configuration", {
+ name: varchar({ length: 256 }).notNull().primaryKey(),
+ cronExpression: varchar({ length: 32 }).notNull(),
+ isEnabled: boolean().default(true).notNull(),
+});
+
+export const accountRelations = relations(accounts, ({ one }) => ({
+ user: one(users, {
+ fields: [accounts.userId],
+ references: [users.id],
+ }),
+}));
+
+export const userRelations = relations(users, ({ one, many }) => ({
+ accounts: many(accounts),
+ boards: many(boards),
+ boardPermissions: many(boardUserPermissions),
+ groups: many(groupMembers),
+ ownedGroups: many(groups),
+ invites: many(invites),
+ medias: many(medias),
+ defaultSearchEngine: one(searchEngines, {
+ fields: [users.defaultSearchEngineId],
+ references: [searchEngines.id],
+ }),
+}));
+
+export const mediaRelations = relations(medias, ({ one }) => ({
+ creator: one(users, {
+ fields: [medias.creatorId],
+ references: [users.id],
+ }),
+}));
+
+export const iconRelations = relations(icons, ({ one }) => ({
+ repository: one(iconRepositories, {
+ fields: [icons.iconRepositoryId],
+ references: [iconRepositories.id],
+ }),
+}));
+
+export const iconRepositoryRelations = relations(iconRepositories, ({ many }) => ({
+ icons: many(icons),
+}));
+
+export const inviteRelations = relations(invites, ({ one }) => ({
+ creator: one(users, {
+ fields: [invites.creatorId],
+ references: [users.id],
+ }),
+}));
+
+export const sessionRelations = relations(sessions, ({ one }) => ({
+ user: one(users, {
+ fields: [sessions.userId],
+ references: [users.id],
+ }),
+}));
+
+export const groupMemberRelations = relations(groupMembers, ({ one }) => ({
+ group: one(groups, {
+ fields: [groupMembers.groupId],
+ references: [groups.id],
+ }),
+ user: one(users, {
+ fields: [groupMembers.userId],
+ references: [users.id],
+ }),
+}));
+
+export const groupRelations = relations(groups, ({ one, many }) => ({
+ permissions: many(groupPermissions),
+ boardPermissions: many(boardGroupPermissions),
+ members: many(groupMembers),
+ owner: one(users, {
+ fields: [groups.ownerId],
+ references: [users.id],
+ }),
+ homeBoard: one(boards, {
+ fields: [groups.homeBoardId],
+ references: [boards.id],
+ relationName: "groupRelations__board__homeBoardId",
+ }),
+ mobileHomeBoard: one(boards, {
+ fields: [groups.mobileHomeBoardId],
+ references: [boards.id],
+ relationName: "groupRelations__board__mobileHomeBoardId",
+ }),
+}));
+
+export const groupPermissionRelations = relations(groupPermissions, ({ one }) => ({
+ group: one(groups, {
+ fields: [groupPermissions.groupId],
+ references: [groups.id],
+ }),
+}));
+
+export const boardUserPermissionRelations = relations(boardUserPermissions, ({ one }) => ({
+ user: one(users, {
+ fields: [boardUserPermissions.userId],
+ references: [users.id],
+ }),
+ board: one(boards, {
+ fields: [boardUserPermissions.boardId],
+ references: [boards.id],
+ }),
+}));
+
+export const boardGroupPermissionRelations = relations(boardGroupPermissions, ({ one }) => ({
+ group: one(groups, {
+ fields: [boardGroupPermissions.groupId],
+ references: [groups.id],
+ }),
+ board: one(boards, {
+ fields: [boardGroupPermissions.boardId],
+ references: [boards.id],
+ }),
+}));
+
+export const integrationRelations = relations(integrations, ({ many }) => ({
+ secrets: many(integrationSecrets),
+ items: many(integrationItems),
+ userPermissions: many(integrationUserPermissions),
+ groupPermissions: many(integrationGroupPermissions),
+}));
+
+export const integrationUserPermissionRelations = relations(integrationUserPermissions, ({ one }) => ({
+ user: one(users, {
+ fields: [integrationUserPermissions.userId],
+ references: [users.id],
+ }),
+ integration: one(integrations, {
+ fields: [integrationUserPermissions.integrationId],
+ references: [integrations.id],
+ }),
+}));
+
+export const integrationGroupPermissionRelations = relations(integrationGroupPermissions, ({ one }) => ({
+ group: one(groups, {
+ fields: [integrationGroupPermissions.groupId],
+ references: [groups.id],
+ }),
+ integration: one(integrations, {
+ fields: [integrationGroupPermissions.integrationId],
+ references: [integrations.id],
+ }),
+}));
+
+export const integrationSecretRelations = relations(integrationSecrets, ({ one }) => ({
+ integration: one(integrations, {
+ fields: [integrationSecrets.integrationId],
+ references: [integrations.id],
+ }),
+}));
+
+export const boardRelations = relations(boards, ({ many, one }) => ({
+ sections: many(sections),
+ items: many(items),
+ creator: one(users, {
+ fields: [boards.creatorId],
+ references: [users.id],
+ }),
+ userPermissions: many(boardUserPermissions),
+ groupPermissions: many(boardGroupPermissions),
+ layouts: many(layouts),
+ groupHomes: many(groups, {
+ relationName: "groupRelations__board__homeBoardId",
+ }),
+ mobileHomeBoard: many(groups, {
+ relationName: "groupRelations__board__mobileHomeBoardId",
+ }),
+}));
+
+export const sectionRelations = relations(sections, ({ many, one }) => ({
+ board: one(boards, {
+ fields: [sections.boardId],
+ references: [boards.id],
+ }),
+ collapseStates: many(sectionCollapseStates),
+ layouts: many(sectionLayouts, {
+ relationName: "sectionLayoutRelations__section__sectionId",
+ }),
+ children: many(sectionLayouts, {
+ relationName: "sectionLayoutRelations__section__parentSectionId",
+ }),
+}));
+
+export const sectionCollapseStateRelations = relations(sectionCollapseStates, ({ one }) => ({
+ user: one(users, {
+ fields: [sectionCollapseStates.userId],
+ references: [users.id],
+ }),
+ section: one(sections, {
+ fields: [sectionCollapseStates.sectionId],
+ references: [sections.id],
+ }),
+}));
+
+export const itemRelations = relations(items, ({ one, many }) => ({
+ integrations: many(integrationItems),
+ layouts: many(itemLayouts),
+ board: one(boards, {
+ fields: [items.boardId],
+ references: [boards.id],
+ }),
+}));
+
+export const integrationItemRelations = relations(integrationItems, ({ one }) => ({
+ integration: one(integrations, {
+ fields: [integrationItems.integrationId],
+ references: [integrations.id],
+ }),
+ item: one(items, {
+ fields: [integrationItems.itemId],
+ references: [items.id],
+ }),
+}));
+
+export const searchEngineRelations = relations(searchEngines, ({ one, many }) => ({
+ integration: one(integrations, {
+ fields: [searchEngines.integrationId],
+ references: [integrations.id],
+ }),
+ usersWithDefault: many(users),
+}));
+
+export const itemLayoutRelations = relations(itemLayouts, ({ one }) => ({
+ item: one(items, {
+ fields: [itemLayouts.itemId],
+ references: [items.id],
+ }),
+ section: one(sections, {
+ fields: [itemLayouts.sectionId],
+ references: [sections.id],
+ }),
+ layout: one(layouts, {
+ fields: [itemLayouts.layoutId],
+ references: [layouts.id],
+ }),
+}));
+
+export const sectionLayoutRelations = relations(sectionLayouts, ({ one }) => ({
+ section: one(sections, {
+ fields: [sectionLayouts.sectionId],
+ references: [sections.id],
+ relationName: "sectionLayoutRelations__section__sectionId",
+ }),
+ layout: one(layouts, {
+ fields: [sectionLayouts.layoutId],
+ references: [layouts.id],
+ }),
+ parentSection: one(sections, {
+ fields: [sectionLayouts.parentSectionId],
+ references: [sections.id],
+ relationName: "sectionLayoutRelations__section__parentSectionId",
+ }),
+}));
+
+export const layoutRelations = relations(layouts, ({ one, many }) => ({
+ items: many(itemLayouts),
+ sections: many(sectionLayouts),
+ board: one(boards, {
+ fields: [layouts.boardId],
+ references: [boards.id],
+ }),
+}));
diff --git a/packages/db/test/postgresql-migration.spec.ts b/packages/db/test/postgresql-migration.spec.ts
new file mode 100644
index 000000000..40dd28e46
--- /dev/null
+++ b/packages/db/test/postgresql-migration.spec.ts
@@ -0,0 +1,46 @@
+import path from "path";
+import { PostgreSqlContainer } from "@testcontainers/postgresql";
+import { drizzle } from "drizzle-orm/node-postgres";
+import { migrate } from "drizzle-orm/node-postgres/migrator";
+import { Pool } from "pg";
+import { describe, test } from "vitest";
+
+import * as pgSchema from "../schema/postgresql";
+
+describe("PostgreSql Migration", () => {
+ test("should add all tables and keys specified in migration files", async () => {
+ const container = new PostgreSqlContainer("postgres:latest");
+ const postgreSqlContainer = await container.start();
+
+ const pool = new Pool({
+ user: postgreSqlContainer.getUsername(),
+ database: postgreSqlContainer.getDatabase(),
+ password: postgreSqlContainer.getPassword(),
+ port: postgreSqlContainer.getPort(),
+ host: postgreSqlContainer.getHost(),
+ keepAlive: true,
+ max: 0,
+ idleTimeoutMillis: 60000,
+ allowExitOnIdle: false,
+ });
+
+ const database = drizzle({
+ schema: pgSchema,
+ casing: "snake_case",
+ client: pool,
+ });
+
+ // Run migrations and check if it works
+ await migrate(database, {
+ migrationsFolder: path.join(__dirname, "..", "migrations", "postgresql"),
+ });
+
+ // Check if users table exists
+ await database.query.users.findMany();
+
+ // Close the pool to release resources
+ await pool.end();
+ // Stop the container
+ await postgreSqlContainer.stop();
+ }, 40_000);
+});
diff --git a/packages/db/test/schema.spec.ts b/packages/db/test/schema.spec.ts
index 3de1cd5a9..246219547 100644
--- a/packages/db/test/schema.spec.ts
+++ b/packages/db/test/schema.spec.ts
@@ -1,15 +1,17 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import type { Column, InferSelectModel } from "drizzle-orm";
import type { ForeignKey as MysqlForeignKey, MySqlTableWithColumns } from "drizzle-orm/mysql-core";
+import type { PgTableWithColumns, ForeignKey as PostgresqlForeignKey } from "drizzle-orm/pg-core";
import type { ForeignKey as SqliteForeignKey, SQLiteTableWithColumns } from "drizzle-orm/sqlite-core";
import { expect, expectTypeOf, test } from "vitest";
import { objectEntries } from "@homarr/common";
import * as mysqlSchema from "../schema/mysql";
+import * as postgresqlSchema from "../schema/postgresql";
import * as sqliteSchema from "../schema/sqlite";
-// We need the following two types as there is currently no support for Buffer in mysql and
+// We need the following three types as there is currently no support for Buffer in mysql & pg and
// so we use a custom type which results in the config beeing different
type FixedMysqlConfig = {
[key in keyof MysqlConfig]: {
@@ -22,6 +24,22 @@ type FixedMysqlConfig = {
};
};
+type FixedPostgresqlConfig = {
+ [key in keyof PostgreisqlConfig]: {
+ [column in keyof PostgreisqlConfig[key]]: {
+ [property in Exclude<
+ keyof PostgreisqlConfig[key][column],
+ "dataType" | "data"
+ >]: PostgreisqlConfig[key][column][property];
+ } & {
+ dataType: PostgreisqlConfig[key][column]["data"] extends Buffer
+ ? "buffer"
+ : PostgreisqlConfig[key][column]["dataType"];
+ data: PostgreisqlConfig[key][column]["data"] extends Buffer ? Buffer : PostgreisqlConfig[key][column]["data"];
+ };
+ };
+};
+
type FixedSqliteConfig = {
[key in keyof SqliteConfig]: {
[column in keyof SqliteConfig[key]]: {
@@ -117,6 +135,91 @@ test("schemas should match", () => {
});
});
+test("schemas should match for postgresql", () => {
+ expectTypeOf().toEqualTypeOf();
+ expectTypeOf().toEqualTypeOf();
+ expectTypeOf().toEqualTypeOf();
+ expectTypeOf().toEqualTypeOf();
+
+ objectEntries(sqliteSchema).forEach(([tableName, sqliteTable]) => {
+ // keys of sqliteSchema and postgresqlSchema are the same, so we can safely use tableName as key
+ // skipcq: JS-E1007
+ const postgresqlTable = postgresqlSchema[tableName];
+ Object.entries(sqliteTable).forEach(([columnName, sqliteColumn]: [string, object]) => {
+ if (!("isUnique" in sqliteColumn)) return;
+ if (!("uniqueName" in sqliteColumn)) return;
+ if (!("primary" in sqliteColumn)) return;
+
+ const postgresqlColumn = postgresqlTable[columnName as keyof typeof postgresqlTable] as object;
+ if (!("isUnique" in postgresqlColumn)) return;
+ if (!("uniqueName" in postgresqlColumn)) return;
+ if (!("primary" in postgresqlColumn)) return;
+
+ expect(
+ sqliteColumn.isUnique,
+ `expect unique of column ${columnName} in table ${tableName} to be the same for both schemas`,
+ ).toEqual(postgresqlColumn.isUnique);
+ expect(
+ sqliteColumn.uniqueName,
+ `expect uniqueName of column ${columnName} in table ${tableName} to be the same for both schemas`,
+ ).toEqual(postgresqlColumn.uniqueName);
+ expect(
+ sqliteColumn.primary,
+ `expect primary of column ${columnName} in table ${tableName} to be the same for both schemas`,
+ ).toEqual(postgresqlColumn.primary);
+ });
+
+ const sqliteForeignKeys = sqliteTable[Symbol.for("drizzle:SQLiteInlineForeignKeys") as keyof typeof sqliteTable] as
+ | SqliteForeignKey[]
+ | undefined;
+ const postgresqlForeignKeys = postgresqlTable[
+ Symbol.for("drizzle:PgInlineForeignKeys") as keyof typeof postgresqlTable
+ ] as PostgresqlForeignKey[] | undefined;
+ if (!sqliteForeignKeys && !postgresqlForeignKeys) return;
+
+ expect(postgresqlForeignKeys, `postgresql foreign key for ${tableName} to be defined`).toBeDefined();
+ expect(sqliteForeignKeys, `sqlite foreign key for ${tableName} to be defined`).toBeDefined();
+
+ expect(
+ sqliteForeignKeys!.length,
+ `expect number of foreign keys in table ${tableName} to be the same for both schemas`,
+ ).toEqual(postgresqlForeignKeys?.length);
+
+ sqliteForeignKeys?.forEach((sqliteForeignKey) => {
+ sqliteForeignKey.getName();
+ const postgresqlForeignKey = postgresqlForeignKeys!.find((key) => key.getName() === sqliteForeignKey.getName());
+ expect(
+ postgresqlForeignKey,
+ `expect foreign key ${sqliteForeignKey.getName()} to be defined in postgresql schema`,
+ ).toBeDefined();
+
+ // In PostgreSql, onDelete is "no action" by default, so it is treated as undefined to match Sqlite.
+ expect(
+ sqliteForeignKey.onDelete,
+ `expect foreign key (${sqliteForeignKey.getName()}) onDelete to be the same for both schemas`,
+ ).toEqual(postgresqlForeignKey!.onDelete === "no action" ? undefined : postgresqlForeignKey!.onDelete);
+
+ // In PostgreSql, onUpdate is "no action" by default, so it is treated as undefined to match Sqlite.
+ expect(
+ sqliteForeignKey.onUpdate,
+ `expect foreign key (${sqliteForeignKey.getName()}) onUpdate to be the same for both schemas`,
+ ).toEqual(postgresqlForeignKey!.onUpdate === "no action" ? undefined : postgresqlForeignKey!.onUpdate);
+
+ sqliteForeignKey.reference().foreignColumns.forEach((column) => {
+ expect(
+ postgresqlForeignKey!.reference().foreignColumns.map((column) => column.name),
+ `expect foreign key (${sqliteForeignKey.getName()}) columns to be the same for both schemas`,
+ ).toContainEqual(column.name);
+ });
+
+ expect(
+ Object.keys(sqliteForeignKey.reference().foreignTable),
+ `expect foreign key (${sqliteForeignKey.getName()}) table to be the same for both schemas`,
+ ).toEqual(Object.keys(postgresqlForeignKey!.reference().foreignTable).filter((key) => key !== "enableRLS"));
+ });
+ });
+});
+
type SqliteTables = {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[K in keyof typeof sqliteSchema]: (typeof sqliteSchema)[K] extends SQLiteTableWithColumns
@@ -130,6 +233,13 @@ type MysqlTables = {
: never;
};
+type PostgresqlTables = {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ [K in keyof typeof postgresqlSchema]: (typeof postgresqlSchema)[K] extends PgTableWithColumns
+ ? InferSelectModel<(typeof postgresqlSchema)[K]>
+ : never;
+};
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type InferColumnConfig> =
T extends Column ? Omit : never;
@@ -155,3 +265,14 @@ type MysqlConfig = {
}
: never;
};
+
+type PostgreisqlConfig = {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ [K in keyof typeof postgresqlSchema]: (typeof postgresqlSchema)[K] extends PgTableWithColumns
+ ? {
+ [C in keyof (typeof postgresqlSchema)[K]["_"]["config"]["columns"]]: InferColumnConfig<
+ (typeof postgresqlSchema)[K]["_"]["config"]["columns"][C]
+ >;
+ }
+ : never;
+};
diff --git a/packages/db/transactions.ts b/packages/db/transactions.ts
index e7da4ae16..1ad35b3dd 100644
--- a/packages/db/transactions.ts
+++ b/packages/db/transactions.ts
@@ -1,11 +1,10 @@
+import { isMysql, isPostgresql } from "./collection";
import type { HomarrDatabase, HomarrDatabaseMysql } from "./driver";
-import { env } from "./env";
-import * as mysqlSchema from "./schema/mysql";
-
-type MysqlSchema = typeof mysqlSchema;
+import type { MySqlSchema } from "./schema";
+import * as schema from "./schema";
interface HandleTransactionInput {
- handleAsync: (db: HomarrDatabaseMysql, schema: MysqlSchema) => Promise;
+ handleAsync: (db: HomarrDatabaseMysql, schema: MySqlSchema) => Promise;
handleSync: (db: HomarrDatabase) => void;
}
@@ -15,10 +14,10 @@ interface HandleTransactionInput {
* But it can also generally be used when dealing with different database drivers.
*/
export const handleDiffrentDbDriverOperationsAsync = async (db: HomarrDatabase, input: HandleTransactionInput) => {
- if (env.DB_DRIVER !== "mysql2") {
+ if (isMysql() || isPostgresql()) {
+ // Schema type is always the correct one based on env variables
+ await input.handleAsync(db as unknown as HomarrDatabaseMysql, schema as unknown as MySqlSchema);
+ } else {
input.handleSync(db);
- return;
}
-
- await input.handleAsync(db as unknown as HomarrDatabaseMysql, mysqlSchema);
};
diff --git a/packages/old-import/src/mappers/map-item.ts b/packages/old-import/src/mappers/map-item.ts
index b31344925..f4c471728 100644
--- a/packages/old-import/src/mappers/map-item.ts
+++ b/packages/old-import/src/mappers/map-item.ts
@@ -37,9 +37,9 @@ export const mapApp = (
appId: appsMap.get(app.id)?.id!,
openInNewTab: app.behaviour.isOpeningNewTab,
pingEnabled: app.network.enabledStatusChecker,
- showDescriptionTooltip: app.behaviour.tooltipDescription !== "",
showTitle: app.appearance.appNameStatus === "normal",
layout: app.appearance.positionAppName,
+ descriptionDisplayMode: app.behaviour.tooltipDescription !== "" ? "tooltip" : "hidden",
} satisfies WidgetComponentProps<"app">["options"]),
layouts: boardSizes.map((size) => {
const shapeForSize = app.shape[size];
diff --git a/packages/request-handler/src/update-checker.ts b/packages/request-handler/src/update-checker.ts
index bd9a52361..a12e63564 100644
--- a/packages/request-handler/src/update-checker.ts
+++ b/packages/request-handler/src/update-checker.ts
@@ -3,6 +3,7 @@ import { Octokit } from "octokit";
import { compareSemVer, isValidSemVer } from "semver-parser";
import { fetchWithTimeout } from "@homarr/common";
+import { env } from "@homarr/common/env";
import { logger } from "@homarr/log";
import { createChannelWithLatestAndEvents } from "@homarr/redis";
import { createCachedRequestHandler } from "@homarr/request-handler/lib/cached-request-handler";
@@ -13,6 +14,11 @@ export const updateCheckerRequestHandler = createCachedRequestHandler({
queryKey: "homarr-update-checker",
cacheDuration: dayjs.duration(1, "hour"),
async requestAsync(_) {
+ if (env.NO_EXTERNAL_CONNECTION)
+ return {
+ availableUpdates: [],
+ };
+
const octokit = new Octokit({
request: {
fetch: fetchWithTimeout,
diff --git a/packages/translation/src/lang/cs.json b/packages/translation/src/lang/cs.json
index 52a0ad44b..262497b71 100644
--- a/packages/translation/src/lang/cs.json
+++ b/packages/translation/src/lang/cs.json
@@ -44,7 +44,7 @@
"apps": "Aplikace",
"boards": "Plochy",
"integrations": "Integrace",
- "credentialUsers": ""
+ "credentialUsers": "Uživatelské oprávnění"
}
},
"tokenModal": {
@@ -52,7 +52,7 @@
"field": {
"token": {
"label": "Token",
- "description": ""
+ "description": "Zadejte zobrazený importní token z předchozí instance homarr"
}
},
"notification": {
diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json
index e360b8446..cfd2eabb3 100644
--- a/packages/translation/src/lang/en.json
+++ b/packages/translation/src/lang/en.json
@@ -1266,9 +1266,6 @@
"showTitle": {
"label": "Show app name"
},
- "showDescriptionTooltip": {
- "label": "Show description tooltip"
- },
"pingEnabled": {
"label": "Enable status check"
},
@@ -1280,6 +1277,15 @@
"column": "Vertical",
"column-reverse": "Vertical (reversed)"
}
+ },
+ "descriptionDisplayMode": {
+ "label": "Description display mode",
+ "description": "Choose how to display the app description",
+ "option": {
+ "normal": "Within widget",
+ "tooltip": "As tooltip",
+ "hidden": "Hidden"
+ }
}
},
"error": {
diff --git a/packages/translation/src/lang/es.json b/packages/translation/src/lang/es.json
index 2e2bca47c..db3f14f95 100644
--- a/packages/translation/src/lang/es.json
+++ b/packages/translation/src/lang/es.json
@@ -1958,7 +1958,7 @@
"label": "Columnas a mostrar"
},
"enableRowSorting": {
- "label": ""
+ "label": "Habilitar ordenar elementos"
},
"defaultSort": {
"label": ""
diff --git a/packages/translation/src/lang/vi.json b/packages/translation/src/lang/vi.json
index cde9121c1..991dcbdca 100644
--- a/packages/translation/src/lang/vi.json
+++ b/packages/translation/src/lang/vi.json
@@ -3,18 +3,18 @@
"step": {
"start": {
"title": "Chào mừng đến với Homarr",
- "subtitle": "Hãy bắt đầu cài đặt phiên bản Homarr của bạn.",
- "description": "Để bắt đầu, hãy chọn cách bạn muốn cài đặt phiên bản Homarr của mình.",
+ "subtitle": "Hãy bắt đầu cài đặt ứng dụng Homarr của bạn.",
+ "description": "Để bắt đầu, hãy chọn cách bạn muốn cài đặt ứng dụng Homarr của mình.",
"action": {
"scratch": "Bắt đầu từ đầu",
- "importOldmarr": "Nhập từ Homarr trước phiên bản 1.0"
+ "importOldmarr": "Nhập dữ liệu từ Homarr phiên bản trước 1.0"
}
},
"import": {
"title": "Nhập dữ liệu",
"subtitle": "Bạn có thể nhập dữ liệu từ một phiên bản Homarr có sẵn.",
"dropzone": {
- "title": "Kéo tệp tin zip vào đây hoặc nhấp để chọn",
+ "title": "Kéo tệp tin zip vào đây hoặc nhấp chuột để chọn",
"description": "Tệp tin zip đã tải lên sẽ được xử lý và bạn sẽ có thể chọn những gì bạn muốn nhập"
},
"fileInfo": {
@@ -92,13 +92,13 @@
},
"finish": {
"title": "Hoàn tất cài đặt",
- "subtitle": "Đã sẵn sàng để tiếp tục!",
+ "subtitle": "Bạn đã sẵn sàng để tiếp tục!",
"description": "",
"action": {
"goToBoard": "",
"createBoard": "",
"inviteUser": "",
- "docs": "Hãy đọc tài liệu này"
+ "docs": "Đọc tài liệu hướng dẫn"
}
}
},
@@ -156,7 +156,7 @@
"label": "Công cụ tìm kiếm mặc định"
},
"openSearchInNewTab": {
- "label": ""
+ "label": "Mở kết quả tìm kiếm trong thẻ mới"
}
},
"error": {
@@ -169,7 +169,7 @@
"notification": {
"success": {
"title": "Đăng nhập thành công",
- "message": "Bạn đã đăng nhập"
+ "message": "Bạn đã được đăng nhập"
},
"error": {
"title": "Đăng nhập không thành công",
@@ -177,7 +177,7 @@
}
},
"forgotPassword": {
- "label": "Quên mật khẩu?",
+ "label": "Bạn đã quên mật khẩu?",
"description": ""
}
},
@@ -189,8 +189,8 @@
"message": "Vui lòng đăng nhập để tiếp tục"
},
"error": {
- "title": "Tạo tài khoản thất bại",
- "message": "Tài khoản của bạn không thể được tạo"
+ "title": "Tạo tài khoản không thành công",
+ "message": "Không thể tạo tài khoản bạn được"
}
}
},
@@ -287,7 +287,7 @@
},
"delete": {
"label": "Xóa người dùng vĩnh viễn",
- "description": "Xóa người dùng này bao gồm cài đặt của họ. Sẽ không xóa các bảng. Người dùng sẽ không được thông báo.",
+ "description": "Xóa người dùng này và những cài đặt cá nhân của họ. Hành động này sẽ không xóa các bảng. Người dùng bị xóa sẽ không nhận thông báo.",
"confirm": "Bạn có chắc chắn muốn xóa tài khoản {username} cùng với các cài đặt?"
},
"select": {
@@ -409,8 +409,8 @@
"title": "Khác",
"item": {
"view-logs": {
- "label": "Xem nhật ký",
- "description": "Cho phép thành viên xem nhật ký"
+ "label": "Xem nhật ký máy",
+ "description": "Cho phép thành viên xem nhật ký máy"
}
}
},
@@ -419,11 +419,11 @@
"item": {
"create": {
"label": "Tạo công cụ tìm kiếm",
- "description": ""
+ "description": "Cho phép thành viên nhóm này tạo công cụ tìm kiếm"
},
"modify-all": {
- "label": "",
- "description": ""
+ "label": "Sửa đổi tất cả công cụ tìm kiếm",
+ "description": "Cho phép thành viên nhóm này sửa đổi tất cả công cụ tìm kiếm"
},
"full-all": {
"label": "",
@@ -441,23 +441,23 @@
},
"action": {
"create": {
- "label": "",
+ "label": "Nhóm mới",
"notification": {
"success": {
- "message": ""
+ "message": "Đã tạo nhóm thành công"
},
"error": {
- "message": ""
+ "message": "Nhóm này không thể tạo được"
}
}
},
"transfer": {
- "label": "",
- "description": "",
- "confirm": "",
+ "label": "Chuyển quyền sở hữu",
+ "description": "Chuyển quyền sở hữu nhóm này cho một người dùng khác",
+ "confirm": "Bạn chắc chắn muốn chuyển quyền sở hữu nhóm {name} cho {username}?",
"notification": {
"success": {
- "message": ""
+ "message": "Đã chuyển thành công quyền sở hữu nhóm {group} cho {username}"
},
"error": {
"message": ""
@@ -465,19 +465,19 @@
}
},
"addMember": {
- "label": "Thêm thành viên"
+ "label": "Thêm thành viên vào nhóm"
},
"removeMember": {
- "label": "Xóa thành viên",
+ "label": "Xóa thành viên khỏi nhóm",
"confirm": ""
},
"delete": {
"label": "Xóa nhóm",
"description": "",
- "confirm": "",
+ "confirm": "Bạn chắc chắn muốn xóa nhóm {name}?",
"notification": {
"success": {
- "message": ""
+ "message": "Đã xóa nhóm {name} thành công"
},
"error": {
"message": ""
@@ -537,7 +537,7 @@
},
"defaultGroup": {
"name": "Nhóm mặc định",
- "description": ""
+ "description": "{name} - Tất cả những người dùng đã đăng nhập"
}
},
"app": {
@@ -546,7 +546,7 @@
"list": {
"title": "Ứng dụng",
"noResults": {
- "title": "",
+ "title": "Chưa có ứng dụng nào cả",
"action": "Tạo ứng dụng của bạn trước"
}
},
@@ -596,7 +596,7 @@
"label": "Tên"
},
"description": {
- "label": "Thông tin chi tiết"
+ "label": "Mô tả"
},
"url": {
"label": "Url"
@@ -612,14 +612,14 @@
"select": {
"label": "Chọn ứng dụng",
"notFound": "Không tìm thấy ứng dụng",
- "search": "",
+ "search": "Tìm một ứng dụng",
"noResults": "Không có kết quả",
"action": "Chọn {app}",
"title": ""
},
"create": {
- "title": "",
- "description": "",
+ "title": "Tạo ứng dụng mới",
+ "description": "Tạo ứng dụng mới",
"action": ""
},
"add": ""
@@ -887,7 +887,7 @@
"message": ""
},
"invalidJson": {
- "title": "",
+ "title": "JSON không hợp lệ",
"message": ""
},
"wrongPath": {
@@ -943,7 +943,7 @@
},
"topic": {
"label": "",
- "newLabel": ""
+ "newLabel": "Chủ đề mới"
},
"opnsenseApiKey": {
"label": "",
@@ -1009,7 +1009,7 @@
"action": {
"add": "Thêm",
"apply": "Áp dụng",
- "backToOverview": "",
+ "backToOverview": "Trở về mục tổng quan",
"create": "Tạo nên",
"createAnother": "",
"edit": "Sửa",
@@ -1083,7 +1083,7 @@
"userAvatar": {
"menu": {
"switchToDarkMode": "",
- "switchToLightMode": "",
+ "switchToLightMode": "Đổi qua chế độ nền sáng",
"management": "",
"preferences": "Cá nhân hoá",
"logout": "",
@@ -2856,7 +2856,7 @@
"boards": "Bảng",
"apps": "Ứng dụng",
"integrations": "",
- "searchEngies": "",
+ "searchEngies": "Công cụ tìm kiếm",
"medias": "",
"users": {
"label": "Người dùng",
@@ -2976,7 +2976,7 @@
"mobile": ""
}
},
- "search": "",
+ "search": "Tìm",
"firstDayOfWeek": "Ngày đầu tiên trong tuần",
"accessibility": "Trợ năng"
}
@@ -3077,7 +3077,7 @@
},
"members": {
"title": "",
- "search": "",
+ "search": "Tìm một thành viên",
"notFound": ""
},
"permissions": {
@@ -3158,9 +3158,9 @@
}
},
"search": {
- "title": "",
+ "title": "Tìm",
"defaultSearchEngine": {
- "label": "",
+ "label": "Công cụ tìm kiếm mặc định cho toàn hệ thống",
"description": ""
}
},
@@ -3895,7 +3895,7 @@
},
"search": {
"placeholder": "",
- "nothingFound": "",
+ "nothingFound": "Không tìm được gì cả",
"error": {
"fetch": ""
},
diff --git a/packages/widgets/src/app/component.tsx b/packages/widgets/src/app/component.tsx
index 2ad1a27fc..8511eb7b0 100644
--- a/packages/widgets/src/app/component.tsx
+++ b/packages/widgets/src/app/component.tsx
@@ -2,7 +2,7 @@
import type { PropsWithChildren } from "react";
import { Fragment, Suspense } from "react";
-import { Flex, Text, Tooltip, UnstyledButton } from "@mantine/core";
+import { Flex, rem, Stack, Text, Tooltip, UnstyledButton } from "@mantine/core";
import { IconLoader } from "@tabler/icons-react";
import combineClasses from "clsx";
@@ -74,7 +74,7 @@ export default function AppWidget({ options, isEditMode, height, width }: Widget
))}
position="right-start"
multiline
- disabled={!options.showDescriptionTooltip || !app.description}
+ disabled={options.descriptionDisplayMode !== "tooltip" || !app.description || isEditMode}
styles={{ tooltip: { maxWidth: 300 } }}
>
- {options.showTitle && (
-
- {app.name}
-
- )}
+
+ {options.showTitle && (
+
+ {app.name}
+
+ )}
+ {options.descriptionDisplayMode === "normal" && (
+
+ {app.description?.split("\n").map((line, index) => (
+
+ {line}
+
+
+ ))}
+
+ )}
+
{data.length > 1 && height > 40 && !hovered && (
diff --git a/patches/trpc-to-openapi.patch b/patches/trpc-to-openapi.patch
new file mode 100644
index 000000000..6542bcddb
--- /dev/null
+++ b/patches/trpc-to-openapi.patch
@@ -0,0 +1,13 @@
+diff --git a/dist/esm/utils/zod.mjs b/dist/esm/utils/zod.mjs
+index a3fda1a5b5403a659bfc70653a94102e607f8b80..070d9728f9b41add50e5d30d3aa559be91018ccd 100644
+--- a/dist/esm/utils/zod.mjs
++++ b/dist/esm/utils/zod.mjs
+@@ -62,7 +62,7 @@ export const instanceofZodTypeLikeString = (_type) => {
+ }
+ return instanceofZodTypeKind(type, 'string');
+ };
+-export const zodSupportsCoerce = 'coerce' in z;
++export const zodSupportsCoerce = true //'coerce' in z;
+ export const instanceofZodTypeCoercible = (_type) => {
+ const type = unwrapZodType(_type, false);
+ return (instanceofZodTypeKind(type, 'number') ||
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 60e4227ec..c7ea78cf1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,12 +5,32 @@ settings:
excludeLinksFromLockfile: false
overrides:
+ '@babel/helpers@<7.26.10': '>=7.26.10'
+ '@babel/runtime@<7.26.10': '>=7.26.10'
+ axios@>=1.0.0 <1.8.2: '>=1.8.2'
+ brace-expansion@>=2.0.0 <=2.0.1: '>=2.0.2'
+ brace-expansion@>=1.0.0 <=1.1.11: '>=1.1.12'
+ esbuild@<=0.24.2: '>=0.25.0'
+ form-data@>=4.0.0 <4.0.4: '>=4.0.4'
+ hono@<4.6.5: '>=4.6.5'
+ linkifyjs@<4.3.2: '>=4.3.2'
+ nanoid@>=4.0.0 <5.0.9: '>=5.0.9'
+ prismjs@<1.30.0: '>=1.30.0'
proxmox-api>undici: 7.14.0
+ rollup@>=4.0.0 <4.22.4: '>=4.22.4'
+ sha.js@<=2.4.11: '>=2.4.12'
+ tar-fs@>=3.0.0 <3.0.9: '>=3.0.9'
+ tar-fs@>=2.0.0 <2.1.3: '>=2.1.3'
+ tmp@<=0.2.3: '>=0.2.4'
+ vite@>=5.0.0 <=5.4.18: '>=5.4.19'
patchedDependencies:
'@types/node-unifi':
hash: 5e6ae51e2a17a7f9729bfa30b0eb3d0842a5810ac6db47603ab4a6efa1ed84c5
path: patches/@types__node-unifi.patch
+ trpc-to-openapi:
+ hash: 2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c
+ path: patches/trpc-to-openapi.patch
importers:
@@ -45,7 +65,7 @@ importers:
version: 2.5.6(@types/node@22.17.2)(typescript@5.9.2)
'@vitejs/plugin-react':
specifier: ^5.0.1
- version: 5.0.1(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0))
+ version: 5.0.1(vite@7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1))
'@vitest/coverage-v8':
specifier: ^3.2.4
version: 3.2.4(vitest@3.2.4)
@@ -78,10 +98,10 @@ importers:
version: 5.9.2
vite-tsconfig-paths:
specifier: ^5.1.4
- version: 5.1.4(typescript@5.9.2)(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0))
+ version: 5.1.4(typescript@5.9.2)(vite@7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1))
vitest:
specifier: ^3.2.4
- version: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)
+ version: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1)
apps/nextjs:
dependencies:
@@ -210,7 +230,7 @@ importers:
version: 8.2.5(@mantine/core@8.2.5(@mantine/hooks@8.2.5(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.5(react@19.1.1))(@tiptap/extension-link@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1))(@tiptap/react@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
'@million/lint':
specifier: 1.0.14
- version: 1.0.14(rollup@4.21.3)(webpack-sources@3.2.3)
+ version: 1.0.14(rollup@4.48.1)(webpack-sources@3.2.3)
'@tabler/icons-react':
specifier: ^3.34.1
version: 3.34.1(react@19.1.1)
@@ -273,7 +293,7 @@ importers:
version: 15.5.0(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0)
postcss-preset-mantine:
specifier: ^1.18.0
- version: 1.18.0(postcss@8.4.47)
+ version: 1.18.0(postcss@8.5.6)
prismjs:
specifier: ^1.30.0
version: 1.30.0
@@ -634,7 +654,7 @@ importers:
version: 2.2.2
trpc-to-openapi:
specifier: ^3.0.1
- version: 3.0.1(@trpc/server@11.4.4(typescript@5.9.2))(zod-openapi@5.3.0(zod@4.0.17))(zod@4.0.17)
+ version: 3.0.1(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.4.4(typescript@5.9.2))(zod-openapi@5.3.0(zod@4.0.17))(zod@4.0.17)
zod:
specifier: ^4.0.17
version: 4.0.17
@@ -1120,6 +1140,9 @@ importers:
'@testcontainers/mysql':
specifier: ^11.5.1
version: 11.5.1
+ '@testcontainers/postgresql':
+ specifier: ^11.4.0
+ version: 11.4.0
better-sqlite3:
specifier: ^12.2.0
version: 12.2.0
@@ -1131,13 +1154,16 @@ importers:
version: 0.31.4
drizzle-orm:
specifier: ^0.44.4
- version: 0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3)
+ version: 0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.15.4)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3)(pg@8.16.3)
drizzle-zod:
specifier: ^0.8.3
- version: 0.8.3(drizzle-orm@0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3))(zod@4.0.17)
+ version: 0.8.3(drizzle-orm@0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.15.4)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3)(pg@8.16.3))(zod@4.0.17)
mysql2:
specifier: 3.14.3
version: 3.14.3
+ pg:
+ specifier: ^8.16.3
+ version: 8.16.3
superjson:
specifier: 2.2.2
version: 2.2.2
@@ -1154,6 +1180,9 @@ importers:
'@types/better-sqlite3':
specifier: 7.6.13
version: 7.6.13
+ '@types/pg':
+ specifier: ^8.15.4
+ version: 8.15.4
dotenv-cli:
specifier: ^10.0.0
version: 10.0.0
@@ -2538,10 +2567,6 @@ packages:
resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
engines: {node: '>=6.9.0'}
- '@babel/helpers@7.26.0':
- resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
- engines: {node: '>=6.9.0'}
-
'@babel/helpers@7.28.3':
resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==}
engines: {node: '>=6.9.0'}
@@ -2577,8 +2602,8 @@ packages:
resolution: {integrity: sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA==}
engines: {node: '>=6.9.0'}
- '@babel/runtime@7.25.6':
- resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==}
+ '@babel/runtime@7.28.3':
+ resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==}
engines: {node: '>=6.9.0'}
'@babel/template@7.25.9':
@@ -2746,402 +2771,102 @@ packages:
resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==}
deprecated: 'Merged into tsx: https://tsx.is'
- '@esbuild/aix-ppc64@0.20.2':
- resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [aix]
-
- '@esbuild/aix-ppc64@0.21.5':
- resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [aix]
-
'@esbuild/aix-ppc64@0.25.9':
resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.18.20':
- resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
-
- '@esbuild/android-arm64@0.20.2':
- resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
-
- '@esbuild/android-arm64@0.21.5':
- resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
-
'@esbuild/android-arm64@0.25.9':
resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.18.20':
- resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [android]
-
- '@esbuild/android-arm@0.20.2':
- resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [android]
-
- '@esbuild/android-arm@0.21.5':
- resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [android]
-
'@esbuild/android-arm@0.25.9':
resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.18.20':
- resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
-
- '@esbuild/android-x64@0.20.2':
- resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
-
- '@esbuild/android-x64@0.21.5':
- resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
-
'@esbuild/android-x64@0.25.9':
resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.18.20':
- resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
-
- '@esbuild/darwin-arm64@0.20.2':
- resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
-
- '@esbuild/darwin-arm64@0.21.5':
- resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
-
'@esbuild/darwin-arm64@0.25.9':
resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.18.20':
- resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [darwin]
-
- '@esbuild/darwin-x64@0.20.2':
- resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [darwin]
-
- '@esbuild/darwin-x64@0.21.5':
- resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [darwin]
-
'@esbuild/darwin-x64@0.25.9':
resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.18.20':
- resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
-
- '@esbuild/freebsd-arm64@0.20.2':
- resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
-
- '@esbuild/freebsd-arm64@0.21.5':
- resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
-
'@esbuild/freebsd-arm64@0.25.9':
resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.18.20':
- resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
-
- '@esbuild/freebsd-x64@0.20.2':
- resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
-
- '@esbuild/freebsd-x64@0.21.5':
- resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
-
'@esbuild/freebsd-x64@0.25.9':
resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.18.20':
- resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
-
- '@esbuild/linux-arm64@0.20.2':
- resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
-
- '@esbuild/linux-arm64@0.21.5':
- resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
-
'@esbuild/linux-arm64@0.25.9':
resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.18.20':
- resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [linux]
-
- '@esbuild/linux-arm@0.20.2':
- resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [linux]
-
- '@esbuild/linux-arm@0.21.5':
- resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [linux]
-
'@esbuild/linux-arm@0.25.9':
resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.18.20':
- resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [linux]
-
- '@esbuild/linux-ia32@0.20.2':
- resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [linux]
-
- '@esbuild/linux-ia32@0.21.5':
- resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [linux]
-
'@esbuild/linux-ia32@0.25.9':
resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.18.20':
- resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
- engines: {node: '>=12'}
- cpu: [loong64]
- os: [linux]
-
- '@esbuild/linux-loong64@0.20.2':
- resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
- engines: {node: '>=12'}
- cpu: [loong64]
- os: [linux]
-
- '@esbuild/linux-loong64@0.21.5':
- resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
- engines: {node: '>=12'}
- cpu: [loong64]
- os: [linux]
-
'@esbuild/linux-loong64@0.25.9':
resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.18.20':
- resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
-
- '@esbuild/linux-mips64el@0.20.2':
- resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
-
- '@esbuild/linux-mips64el@0.21.5':
- resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
-
'@esbuild/linux-mips64el@0.25.9':
resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.18.20':
- resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
-
- '@esbuild/linux-ppc64@0.20.2':
- resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
-
- '@esbuild/linux-ppc64@0.21.5':
- resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
-
'@esbuild/linux-ppc64@0.25.9':
resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.18.20':
- resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
-
- '@esbuild/linux-riscv64@0.20.2':
- resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
-
- '@esbuild/linux-riscv64@0.21.5':
- resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
-
'@esbuild/linux-riscv64@0.25.9':
resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.18.20':
- resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
-
- '@esbuild/linux-s390x@0.20.2':
- resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
-
- '@esbuild/linux-s390x@0.21.5':
- resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
-
'@esbuild/linux-s390x@0.25.9':
resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.18.20':
- resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
-
- '@esbuild/linux-x64@0.20.2':
- resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
-
- '@esbuild/linux-x64@0.21.5':
- resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
-
'@esbuild/linux-x64@0.25.9':
resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==}
engines: {node: '>=18'}
@@ -3154,24 +2879,6 @@ packages:
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.18.20':
- resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
-
- '@esbuild/netbsd-x64@0.20.2':
- resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
-
- '@esbuild/netbsd-x64@0.21.5':
- resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
-
'@esbuild/netbsd-x64@0.25.9':
resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==}
engines: {node: '>=18'}
@@ -3184,24 +2891,6 @@ packages:
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.18.20':
- resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
-
- '@esbuild/openbsd-x64@0.20.2':
- resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
-
- '@esbuild/openbsd-x64@0.21.5':
- resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
-
'@esbuild/openbsd-x64@0.25.9':
resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==}
engines: {node: '>=18'}
@@ -3214,96 +2903,24 @@ packages:
cpu: [arm64]
os: [openharmony]
- '@esbuild/sunos-x64@0.18.20':
- resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
-
- '@esbuild/sunos-x64@0.20.2':
- resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
-
- '@esbuild/sunos-x64@0.21.5':
- resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
-
'@esbuild/sunos-x64@0.25.9':
resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.18.20':
- resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
-
- '@esbuild/win32-arm64@0.20.2':
- resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
-
- '@esbuild/win32-arm64@0.21.5':
- resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
-
'@esbuild/win32-arm64@0.25.9':
resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.18.20':
- resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
-
- '@esbuild/win32-ia32@0.20.2':
- resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
-
- '@esbuild/win32-ia32@0.21.5':
- resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
-
'@esbuild/win32-ia32@0.25.9':
resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.18.20':
- resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [win32]
-
- '@esbuild/win32-x64@0.20.2':
- resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [win32]
-
- '@esbuild/win32-x64@0.21.5':
- resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [win32]
-
'@esbuild/win32-x64@0.25.9':
resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==}
engines: {node: '>=18'}
@@ -3441,7 +3058,7 @@ packages:
resolution: {integrity: sha512-kz323qIQkNQElEGroo/E9MKPDuIR5pkuk/XEWd50K+cSEKdmdiYx0PKWUdaNY2ecJYngtF+njDMsMKplL6zfEg==}
engines: {node: '>=18.14.1'}
peerDependencies:
- hono: ^4
+ hono: '>=4.6.5'
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
@@ -3625,7 +3242,7 @@ packages:
'@jellyfin/sdk@0.11.0':
resolution: {integrity: sha512-WmM4as9ptqH+CvC2YsUefNWQDmu2aWIamwAoj7h2BFR6l019pcRFG5FT22egwbdizR6DfdpmsoAWB4x9QCzcEQ==}
peerDependencies:
- axios: ^1.3.4
+ axios: '>=1.8.2'
'@jridgewell/gen-mapping@0.3.12':
resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==}
@@ -4119,68 +3736,88 @@ packages:
resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
engines: {node: '>=14.0.0'}
peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ rollup: '>=4.22.4'
peerDependenciesMeta:
rollup:
optional: true
- '@rollup/rollup-android-arm-eabi@4.21.3':
- resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==}
+ '@rollup/rollup-android-arm-eabi@4.48.1':
+ resolution: {integrity: sha512-rGmb8qoG/zdmKoYELCBwu7vt+9HxZ7Koos3pD0+sH5fR3u3Wb/jGcpnqxcnWsPEKDUyzeLSqksN8LJtgXjqBYw==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.21.3':
- resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==}
+ '@rollup/rollup-android-arm64@4.48.1':
+ resolution: {integrity: sha512-4e9WtTxrk3gu1DFE+imNJr4WsL13nWbD/Y6wQcyku5qadlKHY3OQ3LJ/INrrjngv2BJIHnIzbqMk1GTAC2P8yQ==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.21.3':
- resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==}
+ '@rollup/rollup-darwin-arm64@4.48.1':
+ resolution: {integrity: sha512-+XjmyChHfc4TSs6WUQGmVf7Hkg8ferMAE2aNYYWjiLzAS/T62uOsdfnqv+GHRjq7rKRnYh4mwWb4Hz7h/alp8A==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.21.3':
- resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==}
+ '@rollup/rollup-darwin-x64@4.48.1':
+ resolution: {integrity: sha512-upGEY7Ftw8M6BAJyGwnwMw91rSqXTcOKZnnveKrVWsMTF8/k5mleKSuh7D4v4IV1pLxKAk3Tbs0Lo9qYmii5mQ==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-linux-arm-gnueabihf@4.21.3':
- resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==}
+ '@rollup/rollup-freebsd-arm64@4.48.1':
+ resolution: {integrity: sha512-P9ViWakdoynYFUOZhqq97vBrhuvRLAbN/p2tAVJvhLb8SvN7rbBnJQcBu8e/rQts42pXGLVhfsAP0k9KXWa3nQ==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.48.1':
+ resolution: {integrity: sha512-VLKIwIpnBya5/saccM8JshpbxfyJt0Dsli0PjXozHwbSVaHTvWXJH1bbCwPXxnMzU4zVEfgD1HpW3VQHomi2AQ==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.48.1':
+ resolution: {integrity: sha512-3zEuZsXfKaw8n/yF7t8N6NNdhyFw3s8xJTqjbTDXlipwrEHo4GtIKcMJr5Ed29leLpB9AugtAQpAHW0jvtKKaQ==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm-musleabihf@4.21.3':
- resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==}
+ '@rollup/rollup-linux-arm-musleabihf@4.48.1':
+ resolution: {integrity: sha512-leo9tOIlKrcBmmEypzunV/2w946JeLbTdDlwEZ7OnnsUyelZ72NMnT4B2vsikSgwQifjnJUbdXzuW4ToN1wV+Q==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm64-gnu@4.21.3':
- resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==}
+ '@rollup/rollup-linux-arm64-gnu@4.48.1':
+ resolution: {integrity: sha512-Vy/WS4z4jEyvnJm+CnPfExIv5sSKqZrUr98h03hpAMbE2aI0aD2wvK6GiSe8Gx2wGp3eD81cYDpLLBqNb2ydwQ==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-arm64-musl@4.21.3':
- resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==}
+ '@rollup/rollup-linux-arm64-musl@4.48.1':
+ resolution: {integrity: sha512-x5Kzn7XTwIssU9UYqWDB9VpLpfHYuXw5c6bJr4Mzv9kIv242vmJHbI5PJJEnmBYitUIfoMCODDhR7KoZLot2VQ==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-powerpc64le-gnu@4.21.3':
- resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==}
+ '@rollup/rollup-linux-loongarch64-gnu@4.48.1':
+ resolution: {integrity: sha512-yzCaBbwkkWt/EcgJOKDUdUpMHjhiZT/eDktOPWvSRpqrVE04p0Nd6EGV4/g7MARXXeOqstflqsKuXVM3H9wOIQ==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.48.1':
+ resolution: {integrity: sha512-UK0WzWUjMAJccHIeOpPhPcKBqax7QFg47hwZTp6kiMhQHeOYJeaMwzeRZe1q5IiTKsaLnHu9s6toSYVUlZ2QtQ==}
cpu: [ppc64]
os: [linux]
- '@rollup/rollup-linux-riscv64-gnu@4.21.3':
- resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==}
+ '@rollup/rollup-linux-riscv64-gnu@4.48.1':
+ resolution: {integrity: sha512-3NADEIlt+aCdCbWVZ7D3tBjBX1lHpXxcvrLt/kdXTiBrOds8APTdtk2yRL2GgmnSVeX4YS1JIf0imFujg78vpw==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-s390x-gnu@4.21.3':
- resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==}
+ '@rollup/rollup-linux-riscv64-musl@4.48.1':
+ resolution: {integrity: sha512-euuwm/QTXAMOcyiFCcrx0/S2jGvFlKJ2Iro8rsmYL53dlblp3LkUQVFzEidHhvIPPvcIsxDhl2wkBE+I6YVGzA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.48.1':
+ resolution: {integrity: sha512-w8mULUjmPdWLJgmTYJx/W6Qhln1a+yqvgwmGXcQl2vFBkWsKGUBRbtLRuKJUln8Uaimf07zgJNxOhHOvjSQmBQ==}
cpu: [s390x]
os: [linux]
- '@rollup/rollup-linux-x64-gnu@4.21.3':
- resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==}
+ '@rollup/rollup-linux-x64-gnu@4.48.1':
+ resolution: {integrity: sha512-90taWXCWxTbClWuMZD0DKYohY1EovA+W5iytpE89oUPmT5O1HFdf8cuuVIylE6vCbrGdIGv85lVRzTcpTRZ+kA==}
cpu: [x64]
os: [linux]
@@ -4189,23 +3826,23 @@ packages:
cpu: [x64]
os: [linux]
- '@rollup/rollup-linux-x64-musl@4.21.3':
- resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==}
+ '@rollup/rollup-linux-x64-musl@4.48.1':
+ resolution: {integrity: sha512-2Gu29SkFh1FfTRuN1GR1afMuND2GKzlORQUP3mNMJbqdndOg7gNsa81JnORctazHRokiDzQ5+MLE5XYmZW5VWg==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-win32-arm64-msvc@4.21.3':
- resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==}
+ '@rollup/rollup-win32-arm64-msvc@4.48.1':
+ resolution: {integrity: sha512-6kQFR1WuAO50bxkIlAVeIYsz3RUx+xymwhTo9j94dJ+kmHe9ly7muH23sdfWduD0BA8pD9/yhonUvAjxGh34jQ==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.21.3':
- resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==}
+ '@rollup/rollup-win32-ia32-msvc@4.48.1':
+ resolution: {integrity: sha512-RUyZZ/mga88lMI3RlXFs4WQ7n3VyU07sPXmMG7/C1NOi8qisUg57Y7LRarqoGoAiopmGmChUhSwfpvQ3H5iGSQ==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.21.3':
- resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==}
+ '@rollup/rollup-win32-x64-msvc@4.48.1':
+ resolution: {integrity: sha512-8a/caCUN4vkTChxkaIJcMtwIVcBhi4X2PQRoT+yCK3qRYaZ7cURrmJFL5Ux9H9RaMIXj9RuihckdmkBX3zZsgg==}
cpu: [x64]
os: [win32]
@@ -4483,6 +4120,9 @@ packages:
'@testcontainers/mysql@11.5.1':
resolution: {integrity: sha512-znonzVMlcCLQ6t7zDH0TOEcbGkz6iwIk5x5ZP5GqEdN0z3GLUu/jEF7yQUtfCY+PbVnCkigRg4WYS4bt6+zhyA==}
+ '@testcontainers/postgresql@11.4.0':
+ resolution: {integrity: sha512-WiKsz3Np5twNZGp2kgatqGaE/KqNR271CPwvIgAvFyN7E581P34glQljM4iLfxdv1XpzVYGWRO6PbQAVDbehBQ==}
+
'@testcontainers/redis@11.5.1':
resolution: {integrity: sha512-ThGaUPUCFW4Vwmx6kfPYhhTQjq/3UXJQrU/xxiYLqgvFJNtvtYlWmzXrwORLhPkkqnoFUnfFaX3u9u1GnrlDkw==}
@@ -4865,12 +4505,12 @@ packages:
'@types/estree-jsx@1.0.5':
resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
- '@types/estree@1.0.5':
- resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
-
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
'@types/express-serve-static-core@4.19.5':
resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==}
@@ -4943,6 +4583,9 @@ packages:
'@types/normalize-package-data@2.4.4':
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+ '@types/pg@8.15.4':
+ resolution: {integrity: sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==}
+
'@types/prismjs@1.26.5':
resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==}
@@ -5103,7 +4746,7 @@ packages:
resolution: {integrity: sha512-DE4UNaBXwtVoDJ0ccBdLVjFTWL70NRuWNCxEieTI3lrq9ORB9aOCQEKstwDXBl87NvFdbqh/p7eINGyj0BthJA==}
engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
- vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
+ vite: '>=5.4.19'
'@vitest/coverage-v8@3.2.4':
resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==}
@@ -5121,7 +4764,7 @@ packages:
resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==}
peerDependencies:
msw: ^2.4.9
- vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
+ vite: '>=5.4.19'
peerDependenciesMeta:
msw:
optional: true
@@ -5488,9 +5131,6 @@ packages:
resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==}
engines: {node: '>=4'}
- axios@1.7.7:
- resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==}
-
axios@1.9.0:
resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==}
@@ -5510,6 +5150,10 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ balanced-match@3.0.1:
+ resolution: {integrity: sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==}
+ engines: {node: '>= 16'}
+
bare-events@2.5.4:
resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==}
@@ -5588,12 +5232,13 @@ packages:
resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==}
engines: {node: '>=10'}
- brace-expansion@1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
-
brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ brace-expansion@4.0.1:
+ resolution: {integrity: sha512-YClrbvTCXGe70pU2JiEiPLYXO9gQkyxYeKpJIQHVS/gOs6EWMQP2RYBwjFLNT322Ji8TOC3IMPfsYCedNpzKfA==}
+ engines: {node: '>= 18'}
+
braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
@@ -5741,9 +5386,6 @@ packages:
resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==}
engines: {node: '>= 14.16.0'}
- chownr@1.1.4:
- resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
-
chroma-js@3.1.2:
resolution: {integrity: sha512-IJnETTalXbsLx1eKEgx19d5L6SRM7cH4vINw/99p/M11HCuXGRWL+6YmCm7FWFGIo6dtWuQoQi1dc5yQ7ESIHg==}
@@ -5874,9 +5516,6 @@ packages:
resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==}
engines: {node: '>= 14'}
- concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
concurrently@9.2.0:
resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==}
engines: {node: '>=18'}
@@ -6547,22 +6186,7 @@ packages:
esbuild-register@3.6.0:
resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
peerDependencies:
- esbuild: '>=0.12 <1'
-
- esbuild@0.18.20:
- resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
- engines: {node: '>=12'}
- hasBin: true
-
- esbuild@0.20.2:
- resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
- engines: {node: '>=12'}
- hasBin: true
-
- esbuild@0.21.5:
- resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
- engines: {node: '>=12'}
- hasBin: true
+ esbuild: '>=0.25.0'
esbuild@0.25.9:
resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==}
@@ -6849,6 +6473,15 @@ packages:
picomatch:
optional: true
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
fecha@4.2.3:
resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
@@ -6941,8 +6574,8 @@ packages:
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
engines: {node: '>=14'}
- form-data@4.0.1:
- resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
+ form-data@4.0.4:
+ resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==}
engines: {node: '>= 6'}
format@0.2.2:
@@ -6952,9 +6585,6 @@ packages:
from2@2.3.0:
resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==}
- fs-constants@1.0.0:
- resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
-
fs-extra@10.1.0:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
@@ -7225,9 +6855,9 @@ packages:
highlightjs-vue@1.0.0:
resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==}
- hono@4.6.1:
- resolution: {integrity: sha512-6NGwvttY1+HAFii08VYiEKI6ETPAFbpLntpm2M/MogEsAFWdZV74UNT+2M4bmqX90cIQhjlpBSP+tO+CfB0uww==}
- engines: {node: '>=16.0.0'}
+ hono@4.9.4:
+ resolution: {integrity: sha512-61hl6MF6ojTl/8QSRu5ran6GXt+6zsngIUN95KzF5v5UjiX/xnrLR358BNRawwIRO49JwUqJqQe3Rb2v559R8Q==}
+ engines: {node: '>=16.9.0'}
hook-std@3.0.0:
resolution: {integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==}
@@ -7897,8 +7527,8 @@ packages:
linkify-it@5.0.0:
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
- linkifyjs@4.2.0:
- resolution: {integrity: sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==}
+ linkifyjs@4.3.2:
+ resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==}
load-json-file@4.0.0:
resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
@@ -8306,13 +7936,18 @@ packages:
nan@2.20.0:
resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==}
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
nanoid@3.3.9:
resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- nanoid@5.0.7:
- resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==}
+ nanoid@5.1.5:
+ resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==}
engines: {node: ^18 || >=20}
hasBin: true
@@ -8683,10 +8318,6 @@ packages:
orderedmap@2.1.1:
resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==}
- os-tmpdir@1.0.2:
- resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
- engines: {node: '>=0.10.0'}
-
own-keys@1.0.1:
resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
engines: {node: '>= 0.4'}
@@ -8853,6 +8484,40 @@ packages:
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
engines: {node: '>= 14.16'}
+ pg-cloudflare@1.2.7:
+ resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==}
+
+ pg-connection-string@2.9.1:
+ resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==}
+
+ pg-int8@1.0.1:
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+ engines: {node: '>=4.0.0'}
+
+ pg-pool@3.10.1:
+ resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==}
+ peerDependencies:
+ pg: '>=8.0'
+
+ pg-protocol@1.10.3:
+ resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==}
+
+ pg-types@2.2.0:
+ resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+ engines: {node: '>=4'}
+
+ pg@8.16.3:
+ resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==}
+ engines: {node: '>= 16.0.0'}
+ peerDependencies:
+ pg-native: '>=3.0.1'
+ peerDependenciesMeta:
+ pg-native:
+ optional: true
+
+ pgpass@1.0.5:
+ resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+
picocolors@1.0.1:
resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
@@ -8871,6 +8536,10 @@ packages:
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
engines: {node: '>=12'}
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
pify@3.0.0:
resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
engines: {node: '>=4'}
@@ -8951,6 +8620,26 @@ packages:
resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14}
+ postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postgres-array@2.0.0:
+ resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
+ engines: {node: '>=4'}
+
+ postgres-bytea@1.0.0:
+ resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-date@1.0.7:
+ resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-interval@1.2.0:
+ resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+ engines: {node: '>=0.10.0'}
+
preact-render-to-string@6.5.11:
resolution: {integrity: sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==}
peerDependencies:
@@ -8989,10 +8678,6 @@ packages:
resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
engines: {node: '>=18'}
- prismjs@1.27.0:
- resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==}
- engines: {node: '>=6'}
-
prismjs@1.30.0:
resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
engines: {node: '>=6'}
@@ -9373,9 +9058,6 @@ packages:
refractor@3.6.0:
resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==}
- regenerator-runtime@0.14.1:
- resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
-
regexp.prototype.flags@1.5.2:
resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
engines: {node: '>= 0.4'}
@@ -9489,8 +9171,8 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
- rollup@4.21.3:
- resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==}
+ rollup@4.48.1:
+ resolution: {integrity: sha512-jVG20NvbhTYDkGAty2/Yh7HK6/q3DGSRH4o8ALKGArmMuaauM9kLfoMZ+WliPwA5+JHr2lTn3g557FxBV87ifg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -9669,8 +9351,9 @@ packages:
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
- sha.js@2.4.11:
- resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
+ sha.js@2.4.12:
+ resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==}
+ engines: {node: '>= 0.10'}
hasBin: true
sharp@0.34.3:
@@ -10050,19 +9733,9 @@ packages:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
- tar-fs@2.1.2:
- resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==}
-
- tar-fs@3.0.8:
- resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==}
-
tar-fs@3.1.0:
resolution: {integrity: sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==}
- tar-stream@2.2.0:
- resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
- engines: {node: '>=6'}
-
tar-stream@3.1.7:
resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
@@ -10172,18 +9845,14 @@ packages:
resolution: {integrity: sha512-Oh/CqRQ1NXNY7cy9NkTPUauOWiTro0jEYZTioGbOmcQh6EC45oribyIMJp0OJO3677r13tO6SKdWoGZUx2BDFw==}
hasBin: true
- tmp@0.0.33:
- resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
- engines: {node: '>=0.6.0'}
-
- tmp@0.2.3:
- resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
- engines: {node: '>=14.14'}
-
tmp@0.2.4:
resolution: {integrity: sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==}
engines: {node: '>=14.14'}
+ to-buffer@1.2.1:
+ resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==}
+ engines: {node: '>= 0.4'}
+
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@@ -10697,27 +10366,32 @@ packages:
vite-tsconfig-paths@5.1.4:
resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==}
peerDependencies:
- vite: '*'
+ vite: '>=5.4.19'
peerDependenciesMeta:
vite:
optional: true
- vite@5.4.5:
- resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==}
- engines: {node: ^18.0.0 || >=20.0.0}
+ vite@7.1.3:
+ resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
- '@types/node': ^18.0.0 || >=20.0.0
- less: '*'
+ '@types/node': ^20.19.0 || >=22.12.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
lightningcss: ^1.21.0
- sass: '*'
- sass-embedded: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
peerDependenciesMeta:
'@types/node':
optional: true
+ jiti:
+ optional: true
less:
optional: true
lightningcss:
@@ -10732,6 +10406,10 @@ packages:
optional: true
terser:
optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
vitest@3.2.4:
resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==}
@@ -11115,7 +10793,7 @@ snapshots:
'@babel/generator': 7.26.2
'@babel/helper-compilation-targets': 7.25.9
'@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
- '@babel/helpers': 7.26.0
+ '@babel/helpers': 7.28.3
'@babel/parser': 7.26.2
'@babel/template': 7.25.9
'@babel/traverse': 7.25.9
@@ -11236,11 +10914,6 @@ snapshots:
'@babel/helper-validator-option@7.27.1': {}
- '@babel/helpers@7.26.0':
- dependencies:
- '@babel/template': 7.25.9
- '@babel/types': 7.28.2
-
'@babel/helpers@7.28.3':
dependencies:
'@babel/template': 7.27.2
@@ -11272,9 +10945,7 @@ snapshots:
dependencies:
core-js-pure: 3.38.1
- '@babel/runtime@7.25.6':
- dependencies:
- regenerator-runtime: 0.14.1
+ '@babel/runtime@7.28.3': {}
'@babel/template@7.25.9':
dependencies:
@@ -11483,7 +11154,7 @@ snapshots:
'@esbuild-kit/core-utils@3.3.2':
dependencies:
- esbuild: 0.18.20
+ esbuild: 0.25.9
source-map-support: 0.5.21
'@esbuild-kit/esm-loader@2.6.5':
@@ -11491,285 +11162,81 @@ snapshots:
'@esbuild-kit/core-utils': 3.3.2
get-tsconfig: 4.8.1
- '@esbuild/aix-ppc64@0.20.2':
- optional: true
-
- '@esbuild/aix-ppc64@0.21.5':
- optional: true
-
'@esbuild/aix-ppc64@0.25.9':
optional: true
- '@esbuild/android-arm64@0.18.20':
- optional: true
-
- '@esbuild/android-arm64@0.20.2':
- optional: true
-
- '@esbuild/android-arm64@0.21.5':
- optional: true
-
'@esbuild/android-arm64@0.25.9':
optional: true
- '@esbuild/android-arm@0.18.20':
- optional: true
-
- '@esbuild/android-arm@0.20.2':
- optional: true
-
- '@esbuild/android-arm@0.21.5':
- optional: true
-
'@esbuild/android-arm@0.25.9':
optional: true
- '@esbuild/android-x64@0.18.20':
- optional: true
-
- '@esbuild/android-x64@0.20.2':
- optional: true
-
- '@esbuild/android-x64@0.21.5':
- optional: true
-
'@esbuild/android-x64@0.25.9':
optional: true
- '@esbuild/darwin-arm64@0.18.20':
- optional: true
-
- '@esbuild/darwin-arm64@0.20.2':
- optional: true
-
- '@esbuild/darwin-arm64@0.21.5':
- optional: true
-
'@esbuild/darwin-arm64@0.25.9':
optional: true
- '@esbuild/darwin-x64@0.18.20':
- optional: true
-
- '@esbuild/darwin-x64@0.20.2':
- optional: true
-
- '@esbuild/darwin-x64@0.21.5':
- optional: true
-
'@esbuild/darwin-x64@0.25.9':
optional: true
- '@esbuild/freebsd-arm64@0.18.20':
- optional: true
-
- '@esbuild/freebsd-arm64@0.20.2':
- optional: true
-
- '@esbuild/freebsd-arm64@0.21.5':
- optional: true
-
'@esbuild/freebsd-arm64@0.25.9':
optional: true
- '@esbuild/freebsd-x64@0.18.20':
- optional: true
-
- '@esbuild/freebsd-x64@0.20.2':
- optional: true
-
- '@esbuild/freebsd-x64@0.21.5':
- optional: true
-
'@esbuild/freebsd-x64@0.25.9':
optional: true
- '@esbuild/linux-arm64@0.18.20':
- optional: true
-
- '@esbuild/linux-arm64@0.20.2':
- optional: true
-
- '@esbuild/linux-arm64@0.21.5':
- optional: true
-
'@esbuild/linux-arm64@0.25.9':
optional: true
- '@esbuild/linux-arm@0.18.20':
- optional: true
-
- '@esbuild/linux-arm@0.20.2':
- optional: true
-
- '@esbuild/linux-arm@0.21.5':
- optional: true
-
'@esbuild/linux-arm@0.25.9':
optional: true
- '@esbuild/linux-ia32@0.18.20':
- optional: true
-
- '@esbuild/linux-ia32@0.20.2':
- optional: true
-
- '@esbuild/linux-ia32@0.21.5':
- optional: true
-
'@esbuild/linux-ia32@0.25.9':
optional: true
- '@esbuild/linux-loong64@0.18.20':
- optional: true
-
- '@esbuild/linux-loong64@0.20.2':
- optional: true
-
- '@esbuild/linux-loong64@0.21.5':
- optional: true
-
'@esbuild/linux-loong64@0.25.9':
optional: true
- '@esbuild/linux-mips64el@0.18.20':
- optional: true
-
- '@esbuild/linux-mips64el@0.20.2':
- optional: true
-
- '@esbuild/linux-mips64el@0.21.5':
- optional: true
-
'@esbuild/linux-mips64el@0.25.9':
optional: true
- '@esbuild/linux-ppc64@0.18.20':
- optional: true
-
- '@esbuild/linux-ppc64@0.20.2':
- optional: true
-
- '@esbuild/linux-ppc64@0.21.5':
- optional: true
-
'@esbuild/linux-ppc64@0.25.9':
optional: true
- '@esbuild/linux-riscv64@0.18.20':
- optional: true
-
- '@esbuild/linux-riscv64@0.20.2':
- optional: true
-
- '@esbuild/linux-riscv64@0.21.5':
- optional: true
-
'@esbuild/linux-riscv64@0.25.9':
optional: true
- '@esbuild/linux-s390x@0.18.20':
- optional: true
-
- '@esbuild/linux-s390x@0.20.2':
- optional: true
-
- '@esbuild/linux-s390x@0.21.5':
- optional: true
-
'@esbuild/linux-s390x@0.25.9':
optional: true
- '@esbuild/linux-x64@0.18.20':
- optional: true
-
- '@esbuild/linux-x64@0.20.2':
- optional: true
-
- '@esbuild/linux-x64@0.21.5':
- optional: true
-
'@esbuild/linux-x64@0.25.9':
optional: true
'@esbuild/netbsd-arm64@0.25.9':
optional: true
- '@esbuild/netbsd-x64@0.18.20':
- optional: true
-
- '@esbuild/netbsd-x64@0.20.2':
- optional: true
-
- '@esbuild/netbsd-x64@0.21.5':
- optional: true
-
'@esbuild/netbsd-x64@0.25.9':
optional: true
'@esbuild/openbsd-arm64@0.25.9':
optional: true
- '@esbuild/openbsd-x64@0.18.20':
- optional: true
-
- '@esbuild/openbsd-x64@0.20.2':
- optional: true
-
- '@esbuild/openbsd-x64@0.21.5':
- optional: true
-
'@esbuild/openbsd-x64@0.25.9':
optional: true
'@esbuild/openharmony-arm64@0.25.9':
optional: true
- '@esbuild/sunos-x64@0.18.20':
- optional: true
-
- '@esbuild/sunos-x64@0.20.2':
- optional: true
-
- '@esbuild/sunos-x64@0.21.5':
- optional: true
-
'@esbuild/sunos-x64@0.25.9':
optional: true
- '@esbuild/win32-arm64@0.18.20':
- optional: true
-
- '@esbuild/win32-arm64@0.20.2':
- optional: true
-
- '@esbuild/win32-arm64@0.21.5':
- optional: true
-
'@esbuild/win32-arm64@0.25.9':
optional: true
- '@esbuild/win32-ia32@0.18.20':
- optional: true
-
- '@esbuild/win32-ia32@0.20.2':
- optional: true
-
- '@esbuild/win32-ia32@0.21.5':
- optional: true
-
'@esbuild/win32-ia32@0.25.9':
optional: true
- '@esbuild/win32-x64@0.18.20':
- optional: true
-
- '@esbuild/win32-x64@0.20.2':
- optional: true
-
- '@esbuild/win32-x64@0.21.5':
- optional: true
-
'@esbuild/win32-x64@0.25.9':
optional: true
@@ -11946,9 +11413,9 @@ snapshots:
- undici
- utf-8-validate
- '@hono/node-server@1.13.0(hono@4.6.1)':
+ '@hono/node-server@1.13.0(hono@4.9.4)':
dependencies:
- hono: 4.6.1
+ hono: 4.9.4
'@humanfs/core@0.19.1': {}
@@ -12142,7 +11609,7 @@ snapshots:
'@types/node': 22.17.2
'@types/node-fetch': 2.6.12
'@types/stream-buffers': 3.0.7
- form-data: 4.0.1
+ form-data: 4.0.4
hpagent: 1.2.0
isomorphic-ws: 5.0.0(ws@8.18.3)
js-yaml: 4.1.0
@@ -12152,7 +11619,7 @@ snapshots:
rfc4648: 1.5.3
socks-proxy-agent: 8.0.5
stream-buffers: 3.0.3
- tar-fs: 3.0.8
+ tar-fs: 3.1.0
ws: 8.18.3
transitivePeerDependencies:
- bare-buffer
@@ -12273,26 +11740,26 @@ snapshots:
cli-high: 0.4.3
diff: 5.2.0
effect: 3.13.10
- nanoid: 5.0.7
+ nanoid: 5.1.5
recast: 0.23.11
xycolors: 0.1.2
- '@million/lint@1.0.14(rollup@4.21.3)(webpack-sources@3.2.3)':
+ '@million/lint@1.0.14(rollup@4.48.1)(webpack-sources@3.2.3)':
dependencies:
'@axiomhq/js': 1.0.0-rc.3
'@babel/core': 7.26.0
'@babel/types': 7.26.0
- '@hono/node-server': 1.13.0(hono@4.6.1)
+ '@hono/node-server': 1.13.0(hono@4.9.4)
'@million/install': 1.0.14
- '@rollup/pluginutils': 5.1.0(rollup@4.21.3)
+ '@rollup/pluginutils': 5.1.0(rollup@4.48.1)
'@rrweb/types': 2.0.0-alpha.16
babel-plugin-syntax-hermes-parser: 0.21.1
ci-info: 4.0.0
- esbuild: 0.20.2
+ esbuild: 0.25.9
faster-babel-types: 0.1.0(@babel/types@7.26.0)
- hono: 4.6.1
+ hono: 4.9.4
isomorphic-fetch: 3.0.0
- nanoid: 5.0.7
+ nanoid: 5.1.5
ohash: 1.1.4
pako: 2.1.0
pathe: 1.1.2
@@ -12304,7 +11771,7 @@ snapshots:
semver: 7.6.3
socket.io: 4.8.1
socket.io-client: 4.7.5
- tmp: 0.2.3
+ tmp: 0.2.4
unplugin: 1.14.1(webpack-sources@3.2.3)
update-notifier-cjs: 5.1.6
transitivePeerDependencies:
@@ -12628,63 +12095,75 @@ snapshots:
'@rolldown/pluginutils@1.0.0-beta.32': {}
- '@rollup/pluginutils@5.1.0(rollup@4.21.3)':
+ '@rollup/pluginutils@5.1.0(rollup@4.48.1)':
dependencies:
'@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 2.3.1
optionalDependencies:
- rollup: 4.21.3
+ rollup: 4.48.1
- '@rollup/rollup-android-arm-eabi@4.21.3':
+ '@rollup/rollup-android-arm-eabi@4.48.1':
optional: true
- '@rollup/rollup-android-arm64@4.21.3':
+ '@rollup/rollup-android-arm64@4.48.1':
optional: true
- '@rollup/rollup-darwin-arm64@4.21.3':
+ '@rollup/rollup-darwin-arm64@4.48.1':
optional: true
- '@rollup/rollup-darwin-x64@4.21.3':
+ '@rollup/rollup-darwin-x64@4.48.1':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.21.3':
+ '@rollup/rollup-freebsd-arm64@4.48.1':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.21.3':
+ '@rollup/rollup-freebsd-x64@4.48.1':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.21.3':
+ '@rollup/rollup-linux-arm-gnueabihf@4.48.1':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.21.3':
+ '@rollup/rollup-linux-arm-musleabihf@4.48.1':
optional: true
- '@rollup/rollup-linux-powerpc64le-gnu@4.21.3':
+ '@rollup/rollup-linux-arm64-gnu@4.48.1':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.21.3':
+ '@rollup/rollup-linux-arm64-musl@4.48.1':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.21.3':
+ '@rollup/rollup-linux-loongarch64-gnu@4.48.1':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.21.3':
+ '@rollup/rollup-linux-ppc64-gnu@4.48.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.48.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.48.1':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.48.1':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.48.1':
optional: true
'@rollup/rollup-linux-x64-gnu@4.6.1':
optional: true
- '@rollup/rollup-linux-x64-musl@4.21.3':
+ '@rollup/rollup-linux-x64-musl@4.48.1':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.21.3':
+ '@rollup/rollup-win32-arm64-msvc@4.48.1':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.21.3':
+ '@rollup/rollup-win32-ia32-msvc@4.48.1':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.21.3':
+ '@rollup/rollup-win32-x64-msvc@4.48.1':
optional: true
'@rrweb/types@2.0.0-alpha.16':
@@ -13238,6 +12717,13 @@ snapshots:
- bare-buffer
- supports-color
+ '@testcontainers/postgresql@11.4.0':
+ dependencies:
+ testcontainers: 11.5.1
+ transitivePeerDependencies:
+ - bare-buffer
+ - supports-color
+
'@testcontainers/redis@11.5.1':
dependencies:
testcontainers: 11.5.1
@@ -13335,7 +12821,7 @@ snapshots:
dependencies:
'@tiptap/core': 2.26.1(@tiptap/pm@2.26.1)
'@tiptap/pm': 2.26.1
- linkifyjs: 4.2.0
+ linkifyjs: 4.3.2
'@tiptap/extension-list-item@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))':
dependencies:
@@ -13666,10 +13152,10 @@ snapshots:
dependencies:
'@types/estree': 1.0.6
- '@types/estree@1.0.5': {}
-
'@types/estree@1.0.6': {}
+ '@types/estree@1.0.8': {}
+
'@types/express-serve-static-core@4.19.5':
dependencies:
'@types/node': 22.17.2
@@ -13736,7 +13222,7 @@ snapshots:
'@types/node-fetch@2.6.12':
dependencies:
'@types/node': 22.17.2
- form-data: 4.0.1
+ form-data: 4.0.4
'@types/node-unifi@2.5.1(patch_hash=5e6ae51e2a17a7f9729bfa30b0eb3d0842a5810ac6db47603ab4a6efa1ed84c5)':
dependencies:
@@ -13752,6 +13238,12 @@ snapshots:
'@types/normalize-package-data@2.4.4': {}
+ '@types/pg@8.15.4':
+ dependencies:
+ '@types/node': 22.17.2
+ pg-protocol: 1.10.3
+ pg-types: 2.2.0
+
'@types/prismjs@1.26.5': {}
'@types/qs@6.9.16': {}
@@ -13930,7 +13422,7 @@ snapshots:
'@videojs/http-streaming@3.17.2(video.js@8.23.4)':
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
'@videojs/vhs-utils': 4.1.1
aes-decrypter: 4.0.2
global: 4.4.0
@@ -13941,22 +13433,22 @@ snapshots:
'@videojs/vhs-utils@4.0.0':
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
global: 4.4.0
url-toolkit: 2.2.5
'@videojs/vhs-utils@4.1.1':
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
global: 4.4.0
'@videojs/xhr@2.7.0':
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
global: 4.4.0
is-function: 1.0.2
- '@vitejs/plugin-react@5.0.1(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0))':
+ '@vitejs/plugin-react@5.0.1(vite@7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1))':
dependencies:
'@babel/core': 7.28.3
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3)
@@ -13964,7 +13456,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.32
'@types/babel__core': 7.20.5
react-refresh: 0.17.0
- vite: 5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)
+ vite: 7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1)
transitivePeerDependencies:
- supports-color
@@ -13983,7 +13475,7 @@ snapshots:
std-env: 3.9.0
test-exclude: 7.0.1
tinyrainbow: 2.0.0
- vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1)
transitivePeerDependencies:
- supports-color
@@ -13995,13 +13487,13 @@ snapshots:
chai: 5.2.0
tinyrainbow: 2.0.0
- '@vitest/mocker@3.2.4(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0))':
+ '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1))':
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.17
optionalDependencies:
- vite: 5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)
+ vite: 7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1)
'@vitest/pretty-format@3.2.4':
dependencies:
@@ -14032,7 +13524,7 @@ snapshots:
sirv: 3.0.1
tinyglobby: 0.2.14
tinyrainbow: 2.0.0
- vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1)
'@vitest/utils@3.2.4':
dependencies:
@@ -14165,7 +13657,7 @@ snapshots:
aes-decrypter@4.0.2:
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
'@videojs/vhs-utils': 4.1.1
global: 4.4.0
pkcs7: 1.0.4
@@ -14444,18 +13936,10 @@ snapshots:
axe-core@4.10.0: {}
- axios@1.7.7:
- dependencies:
- follow-redirects: 1.15.9
- form-data: 4.0.1
- proxy-from-env: 1.1.0
- transitivePeerDependencies:
- - debug
-
axios@1.9.0:
dependencies:
follow-redirects: 1.15.9
- form-data: 4.0.1
+ form-data: 4.0.4
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
@@ -14472,6 +13956,8 @@ snapshots:
balanced-match@1.0.2: {}
+ balanced-match@3.0.1: {}
+
bare-events@2.5.4:
optional: true
@@ -14522,6 +14008,8 @@ snapshots:
dependencies:
bindings: 1.5.0
prebuild-install: 7.1.2
+ transitivePeerDependencies:
+ - bare-buffer
big.js@5.2.2: {}
@@ -14548,15 +14036,14 @@ snapshots:
widest-line: 3.1.0
wrap-ansi: 7.0.0
- brace-expansion@1.1.11:
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
-
brace-expansion@2.0.1:
dependencies:
balanced-match: 1.0.2
+ brace-expansion@4.0.1:
+ dependencies:
+ balanced-match: 3.0.1
+
braces@3.0.3:
dependencies:
fill-range: 7.1.1
@@ -14719,8 +14206,6 @@ snapshots:
dependencies:
readdirp: 4.0.1
- chownr@1.1.4: {}
-
chroma-js@3.1.2: {}
chrome-trace-event@1.0.4: {}
@@ -14855,8 +14340,6 @@ snapshots:
normalize-path: 3.0.0
readable-stream: 4.5.2
- concat-map@0.0.1: {}
-
concurrently@9.2.0:
dependencies:
chalk: 4.1.2
@@ -15221,9 +14704,10 @@ snapshots:
'@grpc/proto-loader': 0.7.13
docker-modem: 5.0.6
protobufjs: 7.4.0
- tar-fs: 2.1.2
+ tar-fs: 3.1.0
uuid: 10.0.0
transitivePeerDependencies:
+ - bare-buffer
- supports-color
doctrine@2.1.0:
@@ -15232,7 +14716,7 @@ snapshots:
dom-helpers@5.2.1:
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
csstype: 3.1.3
dom-walk@0.1.2: {}
@@ -15277,17 +14761,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
- drizzle-orm@0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3):
+ drizzle-orm@0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.15.4)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3)(pg@8.16.3):
optionalDependencies:
'@libsql/client-wasm': 0.14.0
'@types/better-sqlite3': 7.6.13
+ '@types/pg': 8.15.4
better-sqlite3: 12.2.0
gel: 2.0.0
mysql2: 3.14.3
+ pg: 8.16.3
- drizzle-zod@0.8.3(drizzle-orm@0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3))(zod@4.0.17):
+ drizzle-zod@0.8.3(drizzle-orm@0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.15.4)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3)(pg@8.16.3))(zod@4.0.17):
dependencies:
- drizzle-orm: 0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3)
+ drizzle-orm: 0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.15.4)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3)(pg@8.16.3)
zod: 4.0.17
dunder-proto@1.0.1:
@@ -15391,7 +14877,7 @@ snapshots:
es-define-property: 1.0.0
es-errors: 1.3.0
es-object-atoms: 1.0.0
- es-set-tostringtag: 2.0.3
+ es-set-tostringtag: 2.1.0
es-to-primitive: 1.2.1
function.prototype.name: 1.1.6
get-intrinsic: 1.2.4
@@ -15441,7 +14927,7 @@ snapshots:
es-define-property: 1.0.1
es-errors: 1.3.0
es-object-atoms: 1.0.0
- es-set-tostringtag: 2.0.3
+ es-set-tostringtag: 2.1.0
es-to-primitive: 1.3.0
function.prototype.name: 1.1.8
get-intrinsic: 1.2.6
@@ -15612,83 +15098,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- esbuild@0.18.20:
- optionalDependencies:
- '@esbuild/android-arm': 0.18.20
- '@esbuild/android-arm64': 0.18.20
- '@esbuild/android-x64': 0.18.20
- '@esbuild/darwin-arm64': 0.18.20
- '@esbuild/darwin-x64': 0.18.20
- '@esbuild/freebsd-arm64': 0.18.20
- '@esbuild/freebsd-x64': 0.18.20
- '@esbuild/linux-arm': 0.18.20
- '@esbuild/linux-arm64': 0.18.20
- '@esbuild/linux-ia32': 0.18.20
- '@esbuild/linux-loong64': 0.18.20
- '@esbuild/linux-mips64el': 0.18.20
- '@esbuild/linux-ppc64': 0.18.20
- '@esbuild/linux-riscv64': 0.18.20
- '@esbuild/linux-s390x': 0.18.20
- '@esbuild/linux-x64': 0.18.20
- '@esbuild/netbsd-x64': 0.18.20
- '@esbuild/openbsd-x64': 0.18.20
- '@esbuild/sunos-x64': 0.18.20
- '@esbuild/win32-arm64': 0.18.20
- '@esbuild/win32-ia32': 0.18.20
- '@esbuild/win32-x64': 0.18.20
-
- esbuild@0.20.2:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.20.2
- '@esbuild/android-arm': 0.20.2
- '@esbuild/android-arm64': 0.20.2
- '@esbuild/android-x64': 0.20.2
- '@esbuild/darwin-arm64': 0.20.2
- '@esbuild/darwin-x64': 0.20.2
- '@esbuild/freebsd-arm64': 0.20.2
- '@esbuild/freebsd-x64': 0.20.2
- '@esbuild/linux-arm': 0.20.2
- '@esbuild/linux-arm64': 0.20.2
- '@esbuild/linux-ia32': 0.20.2
- '@esbuild/linux-loong64': 0.20.2
- '@esbuild/linux-mips64el': 0.20.2
- '@esbuild/linux-ppc64': 0.20.2
- '@esbuild/linux-riscv64': 0.20.2
- '@esbuild/linux-s390x': 0.20.2
- '@esbuild/linux-x64': 0.20.2
- '@esbuild/netbsd-x64': 0.20.2
- '@esbuild/openbsd-x64': 0.20.2
- '@esbuild/sunos-x64': 0.20.2
- '@esbuild/win32-arm64': 0.20.2
- '@esbuild/win32-ia32': 0.20.2
- '@esbuild/win32-x64': 0.20.2
-
- esbuild@0.21.5:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.21.5
- '@esbuild/android-arm': 0.21.5
- '@esbuild/android-arm64': 0.21.5
- '@esbuild/android-x64': 0.21.5
- '@esbuild/darwin-arm64': 0.21.5
- '@esbuild/darwin-x64': 0.21.5
- '@esbuild/freebsd-arm64': 0.21.5
- '@esbuild/freebsd-x64': 0.21.5
- '@esbuild/linux-arm': 0.21.5
- '@esbuild/linux-arm64': 0.21.5
- '@esbuild/linux-ia32': 0.21.5
- '@esbuild/linux-loong64': 0.21.5
- '@esbuild/linux-mips64el': 0.21.5
- '@esbuild/linux-ppc64': 0.21.5
- '@esbuild/linux-riscv64': 0.21.5
- '@esbuild/linux-s390x': 0.21.5
- '@esbuild/linux-x64': 0.21.5
- '@esbuild/netbsd-x64': 0.21.5
- '@esbuild/openbsd-x64': 0.21.5
- '@esbuild/sunos-x64': 0.21.5
- '@esbuild/win32-arm64': 0.21.5
- '@esbuild/win32-ia32': 0.21.5
- '@esbuild/win32-x64': 0.21.5
-
esbuild@0.25.9:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.9
@@ -15987,7 +15396,7 @@ snapshots:
dependencies:
chardet: 0.7.0
iconv-lite: 0.4.24
- tmp: 0.0.33
+ tmp: 0.2.4
fast-check@3.23.2:
dependencies:
@@ -16080,6 +15489,10 @@ snapshots:
optionalDependencies:
picomatch: 4.0.2
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
fecha@4.2.3: {}
fetch-retry@6.0.0: {}
@@ -16162,10 +15575,12 @@ snapshots:
cross-spawn: 7.0.6
signal-exit: 4.1.0
- form-data@4.0.1:
+ form-data@4.0.4:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
mime-types: 2.1.35
format@0.2.2: {}
@@ -16175,8 +15590,6 @@ snapshots:
inherits: 2.0.4
readable-stream: 2.3.8
- fs-constants@1.0.0: {}
-
fs-extra@10.1.0:
dependencies:
graceful-fs: 4.2.11
@@ -16525,7 +15938,7 @@ snapshots:
highlightjs-vue@1.0.0: {}
- hono@4.6.1: {}
+ hono@4.9.4: {}
hook-std@3.0.0: {}
@@ -17205,7 +16618,7 @@ snapshots:
dependencies:
uc.micro: 2.1.0
- linkifyjs@4.2.0: {}
+ linkifyjs@4.3.2: {}
load-json-file@4.0.0:
dependencies:
@@ -17314,7 +16727,7 @@ snapshots:
m3u8-parser@7.2.0:
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
'@videojs/vhs-utils': 4.1.1
global: 4.4.0
@@ -17648,19 +17061,19 @@ snapshots:
minimatch@3.1.2:
dependencies:
- brace-expansion: 1.1.11
+ brace-expansion: 2.0.1
minimatch@5.1.6:
dependencies:
- brace-expansion: 2.0.1
+ brace-expansion: 4.0.1
minimatch@7.4.6:
dependencies:
- brace-expansion: 2.0.1
+ brace-expansion: 4.0.1
minimatch@9.0.5:
dependencies:
- brace-expansion: 2.0.1
+ brace-expansion: 4.0.1
minimist@1.2.8: {}
@@ -17684,7 +17097,7 @@ snapshots:
mpd-parser@1.3.1:
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
'@videojs/vhs-utils': 4.0.0
'@xmldom/xmldom': 0.8.10
global: 4.4.0
@@ -17699,7 +17112,7 @@ snapshots:
mux.js@7.1.0:
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
global: 4.4.0
mysql2@3.14.3:
@@ -17727,9 +17140,11 @@ snapshots:
nan@2.20.0:
optional: true
+ nanoid@3.3.11: {}
+
nanoid@3.3.9: {}
- nanoid@5.0.7: {}
+ nanoid@5.1.5: {}
napi-build-utils@1.0.2: {}
@@ -17864,7 +17279,7 @@ snapshots:
node-ical@0.20.1:
dependencies:
- axios: 1.7.7
+ axios: 1.9.0
moment-timezone: 0.5.47
rrule: 2.8.1
uuid: 10.0.0
@@ -18075,8 +17490,6 @@ snapshots:
orderedmap@2.1.1: {}
- os-tmpdir@1.0.2: {}
-
own-keys@1.0.1:
dependencies:
get-intrinsic: 1.3.0
@@ -18243,6 +17656,41 @@ snapshots:
pathval@2.0.0: {}
+ pg-cloudflare@1.2.7:
+ optional: true
+
+ pg-connection-string@2.9.1: {}
+
+ pg-int8@1.0.1: {}
+
+ pg-pool@3.10.1(pg@8.16.3):
+ dependencies:
+ pg: 8.16.3
+
+ pg-protocol@1.10.3: {}
+
+ pg-types@2.2.0:
+ dependencies:
+ pg-int8: 1.0.1
+ postgres-array: 2.0.0
+ postgres-bytea: 1.0.0
+ postgres-date: 1.0.7
+ postgres-interval: 1.2.0
+
+ pg@8.16.3:
+ dependencies:
+ pg-connection-string: 2.9.1
+ pg-pool: 3.10.1(pg@8.16.3)
+ pg-protocol: 1.10.3
+ pg-types: 2.2.0
+ pgpass: 1.0.5
+ optionalDependencies:
+ pg-cloudflare: 1.2.7
+
+ pgpass@1.0.5:
+ dependencies:
+ split2: 4.2.0
+
picocolors@1.0.1: {}
picocolors@1.1.1: {}
@@ -18253,6 +17701,8 @@ snapshots:
picomatch@4.0.2: {}
+ picomatch@4.0.3: {}
+
pify@3.0.0: {}
pino-abstract-transport@2.0.0:
@@ -18281,7 +17731,7 @@ snapshots:
pkcs7@1.0.4:
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
pkg-conf@2.1.0:
dependencies:
@@ -18298,38 +17748,38 @@ snapshots:
possible-typed-array-names@1.0.0: {}
- postcss-js@4.0.1(postcss@8.4.47):
+ postcss-js@4.0.1(postcss@8.5.6):
dependencies:
camelcase-css: 2.0.1
- postcss: 8.4.47
+ postcss: 8.5.6
- postcss-mixins@12.0.0(postcss@8.4.47):
+ postcss-mixins@12.0.0(postcss@8.5.6):
dependencies:
- postcss: 8.4.47
- postcss-js: 4.0.1(postcss@8.4.47)
- postcss-simple-vars: 7.0.1(postcss@8.4.47)
- sugarss: 5.0.0(postcss@8.4.47)
+ postcss: 8.5.6
+ postcss-js: 4.0.1(postcss@8.5.6)
+ postcss-simple-vars: 7.0.1(postcss@8.5.6)
+ sugarss: 5.0.0(postcss@8.5.6)
tinyglobby: 0.2.14
- postcss-nested@7.0.2(postcss@8.4.47):
+ postcss-nested@7.0.2(postcss@8.5.6):
dependencies:
- postcss: 8.4.47
+ postcss: 8.5.6
postcss-selector-parser: 7.1.0
- postcss-preset-mantine@1.18.0(postcss@8.4.47):
+ postcss-preset-mantine@1.18.0(postcss@8.5.6):
dependencies:
- postcss: 8.4.47
- postcss-mixins: 12.0.0(postcss@8.4.47)
- postcss-nested: 7.0.2(postcss@8.4.47)
+ postcss: 8.5.6
+ postcss-mixins: 12.0.0(postcss@8.5.6)
+ postcss-nested: 7.0.2(postcss@8.5.6)
postcss-selector-parser@7.1.0:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
- postcss-simple-vars@7.0.1(postcss@8.4.47):
+ postcss-simple-vars@7.0.1(postcss@8.5.6):
dependencies:
- postcss: 8.4.47
+ postcss: 8.5.6
postcss@8.4.31:
dependencies:
@@ -18339,10 +17789,26 @@ snapshots:
postcss@8.4.47:
dependencies:
- nanoid: 3.3.9
+ nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
+ postcss@8.5.6:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postgres-array@2.0.0: {}
+
+ postgres-bytea@1.0.0: {}
+
+ postgres-date@1.0.7: {}
+
+ postgres-interval@1.2.0:
+ dependencies:
+ xtend: 4.0.2
+
preact-render-to-string@6.5.11(preact@10.24.3):
dependencies:
preact: 10.24.3
@@ -18361,8 +17827,10 @@ snapshots:
pump: 3.0.2
rc: 1.2.8
simple-get: 4.0.1
- tar-fs: 2.1.2
+ tar-fs: 3.1.0
tunnel-agent: 0.6.0
+ transitivePeerDependencies:
+ - bare-buffer
prelude-ls@1.2.1: {}
@@ -18383,8 +17851,6 @@ snapshots:
dependencies:
parse-ms: 4.0.0
- prismjs@1.27.0: {}
-
prismjs@1.30.0: {}
process-nextick-args@2.0.1: {}
@@ -18640,7 +18106,7 @@ snapshots:
react-error-boundary@6.0.0(react@19.1.1):
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
react: 19.1.1
react-immutable-proptypes@2.2.0(immutable@3.8.2):
@@ -18746,7 +18212,7 @@ snapshots:
react-syntax-highlighter@15.6.1(react@19.1.1):
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
highlight.js: 10.7.3
highlightjs-vue: 1.0.0
lowlight: 1.20.0
@@ -18756,7 +18222,7 @@ snapshots:
react-textarea-autosize@8.5.9(@types/react@19.1.10)(react@19.1.1):
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
react: 19.1.1
use-composed-ref: 1.3.0(react@19.1.1)
use-latest: 1.2.1(@types/react@19.1.10)(react@19.1.1)
@@ -18765,7 +18231,7 @@ snapshots:
react-transition-group@4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
@@ -18872,9 +18338,7 @@ snapshots:
dependencies:
hastscript: 6.0.0
parse-entities: 2.0.0
- prismjs: 1.27.0
-
- regenerator-runtime@0.14.1: {}
+ prismjs: 1.30.0
regexp.prototype.flags@1.5.2:
dependencies:
@@ -18991,26 +18455,30 @@ snapshots:
dependencies:
glob: 7.2.3
- rollup@4.21.3:
+ rollup@4.48.1:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.8
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.21.3
- '@rollup/rollup-android-arm64': 4.21.3
- '@rollup/rollup-darwin-arm64': 4.21.3
- '@rollup/rollup-darwin-x64': 4.21.3
- '@rollup/rollup-linux-arm-gnueabihf': 4.21.3
- '@rollup/rollup-linux-arm-musleabihf': 4.21.3
- '@rollup/rollup-linux-arm64-gnu': 4.21.3
- '@rollup/rollup-linux-arm64-musl': 4.21.3
- '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3
- '@rollup/rollup-linux-riscv64-gnu': 4.21.3
- '@rollup/rollup-linux-s390x-gnu': 4.21.3
- '@rollup/rollup-linux-x64-gnu': 4.21.3
- '@rollup/rollup-linux-x64-musl': 4.21.3
- '@rollup/rollup-win32-arm64-msvc': 4.21.3
- '@rollup/rollup-win32-ia32-msvc': 4.21.3
- '@rollup/rollup-win32-x64-msvc': 4.21.3
+ '@rollup/rollup-android-arm-eabi': 4.48.1
+ '@rollup/rollup-android-arm64': 4.48.1
+ '@rollup/rollup-darwin-arm64': 4.48.1
+ '@rollup/rollup-darwin-x64': 4.48.1
+ '@rollup/rollup-freebsd-arm64': 4.48.1
+ '@rollup/rollup-freebsd-x64': 4.48.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.48.1
+ '@rollup/rollup-linux-arm-musleabihf': 4.48.1
+ '@rollup/rollup-linux-arm64-gnu': 4.48.1
+ '@rollup/rollup-linux-arm64-musl': 4.48.1
+ '@rollup/rollup-linux-loongarch64-gnu': 4.48.1
+ '@rollup/rollup-linux-ppc64-gnu': 4.48.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.48.1
+ '@rollup/rollup-linux-riscv64-musl': 4.48.1
+ '@rollup/rollup-linux-s390x-gnu': 4.48.1
+ '@rollup/rollup-linux-x64-gnu': 4.48.1
+ '@rollup/rollup-linux-x64-musl': 4.48.1
+ '@rollup/rollup-win32-arm64-msvc': 4.48.1
+ '@rollup/rollup-win32-ia32-msvc': 4.48.1
+ '@rollup/rollup-win32-x64-msvc': 4.48.1
fsevents: 2.3.3
rope-sequence@1.3.4: {}
@@ -19234,10 +18702,11 @@ snapshots:
setprototypeof@1.2.0: {}
- sha.js@2.4.11:
+ sha.js@2.4.12:
dependencies:
inherits: 2.0.4
safe-buffer: 5.2.1
+ to-buffer: 1.2.1
sharp@0.34.3:
dependencies:
@@ -19642,9 +19111,9 @@ snapshots:
sugar-high@0.7.5: {}
- sugarss@5.0.0(postcss@8.4.47):
+ sugarss@5.0.0(postcss@8.5.6):
dependencies:
- postcss: 8.4.47
+ postcss: 8.5.6
super-regex@1.0.0:
dependencies:
@@ -19733,7 +19202,7 @@ snapshots:
remarkable: 2.0.1
reselect: 5.1.1
serialize-error: 8.1.0
- sha.js: 2.4.11
+ sha.js: 2.4.12
swagger-client: 3.35.5
url-parse: 1.5.10
xml: 1.0.1
@@ -19758,23 +19227,6 @@ snapshots:
tapable@2.2.1: {}
- tar-fs@2.1.2:
- dependencies:
- chownr: 1.1.4
- mkdirp-classic: 0.5.3
- pump: 3.0.2
- tar-stream: 2.2.0
-
- tar-fs@3.0.8:
- dependencies:
- pump: 3.0.2
- tar-stream: 3.1.7
- optionalDependencies:
- bare-fs: 4.1.2
- bare-path: 3.0.0
- transitivePeerDependencies:
- - bare-buffer
-
tar-fs@3.1.0:
dependencies:
pump: 3.0.2
@@ -19785,14 +19237,6 @@ snapshots:
transitivePeerDependencies:
- bare-buffer
- tar-stream@2.2.0:
- dependencies:
- bl: 4.1.0
- end-of-stream: 1.4.4
- fs-constants: 1.0.0
- inherits: 2.0.4
- readable-stream: 3.6.2
-
tar-stream@3.1.7:
dependencies:
b4a: 1.6.6
@@ -19919,14 +19363,14 @@ snapshots:
dependencies:
tldts-core: 6.1.69
- tmp@0.0.33:
- dependencies:
- os-tmpdir: 1.0.2
-
- tmp@0.2.3: {}
-
tmp@0.2.4: {}
+ to-buffer@1.2.1:
+ dependencies:
+ isarray: 2.0.5
+ safe-buffer: 5.2.1
+ typed-array-buffer: 1.0.3
+
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
@@ -19979,7 +19423,7 @@ snapshots:
trough@2.2.0: {}
- trpc-to-openapi@3.0.1(@trpc/server@11.4.4(typescript@5.9.2))(zod-openapi@5.3.0(zod@4.0.17))(zod@4.0.17):
+ trpc-to-openapi@3.0.1(patch_hash=2ca3c16af0fcca0c736697ad4fe553a14f794524fa9ce0d5c3e8ee4aea76090c)(@trpc/server@11.4.4(typescript@5.9.2))(zod-openapi@5.3.0(zod@4.0.17))(zod@4.0.17):
dependencies:
'@trpc/server': 11.4.4(typescript@5.9.2)
co-body: 6.2.0
@@ -20359,7 +19803,7 @@ snapshots:
use-deep-compare-effect@1.8.1(react@19.1.1):
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
dequal: 2.0.3
react: 19.1.1
@@ -20443,7 +19887,7 @@ snapshots:
video.js@8.23.4:
dependencies:
- '@babel/runtime': 7.25.6
+ '@babel/runtime': 7.28.3
'@videojs/http-streaming': 3.17.2(video.js@8.23.4)
'@videojs/vhs-utils': 4.1.1
'@videojs/xhr': 2.7.0
@@ -20467,15 +19911,16 @@ snapshots:
dependencies:
global: 4.4.0
- vite-node@3.2.4(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0):
+ vite-node@3.2.4(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1):
dependencies:
cac: 6.7.14
debug: 4.4.1
es-module-lexer: 1.7.0
pathe: 2.0.3
- vite: 5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)
+ vite: 7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1)
transitivePeerDependencies:
- '@types/node'
+ - jiti
- less
- lightningcss
- sass
@@ -20484,35 +19929,42 @@ snapshots:
- sugarss
- supports-color
- terser
+ - tsx
+ - yaml
- vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)):
+ vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1)):
dependencies:
debug: 4.3.7
globrex: 0.1.2
tsconfck: 3.1.3(typescript@5.9.2)
optionalDependencies:
- vite: 5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)
+ vite: 7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1)
transitivePeerDependencies:
- supports-color
- typescript
- vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0):
+ vite@7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1):
dependencies:
- esbuild: 0.21.5
- postcss: 8.4.47
- rollup: 4.21.3
+ esbuild: 0.25.9
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.6
+ rollup: 4.48.1
+ tinyglobby: 0.2.14
optionalDependencies:
'@types/node': 22.17.2
fsevents: 2.3.3
sass: 1.90.0
- sugarss: 5.0.0(postcss@8.4.47)
+ sugarss: 5.0.0(postcss@8.5.6)
terser: 5.39.0
+ tsx: 4.20.4
+ yaml: 2.5.1
- vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0):
+ vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1):
dependencies:
'@types/chai': 5.2.2
'@vitest/expect': 3.2.4
- '@vitest/mocker': 3.2.4(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0))
+ '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
@@ -20530,8 +19982,8 @@ snapshots:
tinyglobby: 0.2.14
tinypool: 1.1.1
tinyrainbow: 2.0.0
- vite: 5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)
- vite-node: 3.2.4(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)
+ vite: 7.1.3(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1)
+ vite-node: 3.2.4(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.5.6))(terser@5.39.0)(tsx@4.20.4)(yaml@2.5.1)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/debug': 4.1.12
@@ -20539,6 +19991,7 @@ snapshots:
'@vitest/ui': 3.2.4(vitest@3.2.4)
jsdom: 26.1.0
transitivePeerDependencies:
+ - jiti
- less
- lightningcss
- msw
@@ -20548,6 +20001,8 @@ snapshots:
- sugarss
- supports-color
- terser
+ - tsx
+ - yaml
w3c-keyname@2.2.8: {}
@@ -20579,7 +20034,7 @@ snapshots:
webpack@5.94.0:
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.8
'@webassemblyjs/ast': 1.14.1
'@webassemblyjs/wasm-edit': 1.14.1
'@webassemblyjs/wasm-parser': 1.14.1
diff --git a/static-data/translators.json b/static-data/translators.json
index b6e88d9c5..5863e6752 100644
--- a/static-data/translators.json
+++ b/static-data/translators.json
@@ -1 +1 @@
-[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"Skick","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12619811/medium/0331f1de413a645b4516bc4e037f31bb.jpg"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg"},{"username":"f1refa11","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png"},{"username":"jeffersonraimon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png"},{"username":"giop98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg"},{"username":"tomislav.kraljevic","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png"},{"username":"Walkx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png"},{"username":"andrea.rosso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png"},{"username":"ajnart","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg"},{"username":"Witchling","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg"},{"username":"guineuu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg"},{"username":"Bulgus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg"},{"username":"Narno","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png"},{"username":"BySempron","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png"},{"username":"jonathan.berglin.work","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png"},{"username":"icdmkg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif"},{"username":"irithys","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png"},{"username":"JannesV","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png"},{"username":"benniblot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg"},{"username":"pacjo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png"},{"username":"Payou6994","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png"},{"username":"fzibi21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png"},{"username":"WowMurdock","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png"},{"username":"hbooo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg"},{"username":"Manicraft1001","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg"},{"username":"Void123","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png"},{"username":"R4cc","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg"},{"username":"fabricionaweb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png"},{"username":"JokeOfDead","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg"},{"username":"hkz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png"},{"username":"Steken","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png"},{"username":"flar.anton","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg"},{"username":"Bon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg"},{"username":"bfkadan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png"},{"username":"BunnySweety","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png"},{"username":"HRKings","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png"},{"username":"wiston81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg"},{"username":"qaz0911","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png"},{"username":"qqyule","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png"},{"username":"Bims0n","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg"},{"username":"TariqDaCoder","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png"},{"username":"Anarchon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg"},{"username":"Ashun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png"},{"username":"sebekmartin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg"},{"username":"RagnarGraves","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png"},{"username":"PrtmPhlp","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png"},{"username":"DooYoo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png"},{"username":"espentruls","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg"},{"username":"frisco82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg"},{"username":"lupineDK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png"},{"username":"hillaliy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg"},{"username":"MarcOrfilaCarreras","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png"},{"username":"robertbridda","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png"},{"username":"MKoniuszko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg"},{"username":"HeroSizy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png"},{"username":"dwt136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png"},{"username":"asifthewebguy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png"},{"username":"eiloogs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif"},{"username":"_vytdv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png"},{"username":"crendasien","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg"},{"username":"edxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png"},{"username":"somerlev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg"},{"username":"kid1412621","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png"},{"username":"suming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png"},{"username":"nick.gher","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png"},{"username":"DataCat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png"},{"username":"dizo89","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg"},{"username":"tee_noodle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png"},{"username":"Marty88","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg"},{"username":"Spillebulle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG"},{"username":"petitmewen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg"},{"username":"NoProsNoNoobs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png"},{"username":"y.gybson","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg"},{"username":"inside90","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png"},{"username":"RJSkudra","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png"},{"username":"binge203","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif"},{"username":"Mailootje","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg"},{"username":"tim-wiegers","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png"},{"username":"GkhnG","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png"},{"username":"Zoen-Millo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg"},{"username":"HooinKyoma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg"},{"username":"wathergeen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png"},{"username":"MoeToo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png"},{"username":"itodouble","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png"},{"username":"loslocitos","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg"},{"username":"Oversleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png"},{"username":"Beardy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png"},{"username":"raelyan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg"},{"username":"dolphin738","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png"},{"username":"brunotco","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png"},{"username":"LukeIsHereToDevelop","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png"},{"username":"kennit","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png"},{"username":"kuunpire","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg"},{"username":"Sandor-dev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png"},{"username":"Meierschlumpf","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg"},{"username":"harmlesscat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png"},{"username":"OrzWTF","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg"},{"username":"tagaishi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png"},{"username":"azurite928","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png"},{"username":"Ronner231","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg"},{"username":"ugyes","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png"},{"username":"rpieja","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png"},{"username":"flambyisyou","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png"},{"username":"Topbcy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg"},{"username":"ai5d02sb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png"},{"username":"explosiveparrot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png"},{"username":"DestroyCom","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png"},{"username":"neotraxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png"},{"username":"gzxpa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png"},{"username":"TORIK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png"},{"username":"sergio.pibot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg"},{"username":"karam-ajaj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg"},{"username":"SimonHenz97","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png"},{"username":"olsson82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png"},{"username":"bo3bdo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg"},{"username":"AngryPlayer04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg"},{"username":"ehatamm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg"},{"username":"Balionelis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png"},{"username":"kwargs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png"},{"username":"lucicu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png"},{"username":"Michael5564445","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png"},{"username":"Netscream","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png"},{"username":"belicstefan04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png"},{"username":"Hamad2066","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg"},{"username":"3ct0pl4sm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png"},{"username":"sanchez.marcell626","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png"},{"username":"Minoctis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg"},{"username":"vittoriosoccorso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16498805/medium/17086b2f1981f734edd1572f79c3158a.jpeg"},{"username":"Worgen325","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16533177/medium/4a62cc6b06095751aeb4b1b3e96db93f.png"},{"username":"homarr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png"},{"username":"mwgg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png"},{"username":"dymek37","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png"},{"username":"kiwinho","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg"},{"username":"tjvg4m34r13","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg"},{"username":"Diegoem","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png"},{"username":"bouks69","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg"},{"username":"futhgar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg"},{"username":"GrimSQL","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png"},{"username":"chnikel","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png"},{"username":"yuki19870616","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png"},{"username":"noamdal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png"},{"username":"MalithRukshan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png"},{"username":"minirope19","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg"},{"username":"toineenzo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png"},{"username":"ArcaneWater","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png"},{"username":"SergiSvK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png"},{"username":"jeongeon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13362856/medium/eb572f72cde5e5526c517ca3a6489850_default.png"},{"username":"MrTranCFCVN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13439475/medium/a1789d69c85d90c667194b5d6a518c08_default.png"},{"username":"Cruellest","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg"},{"username":"Thario","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png"},{"username":"Kachelkaiser","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png"},{"username":"regi4","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png"},{"username":"baton5129","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG"},{"username":"TheRedCyclops","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png"},{"username":"B3CKDOOR","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png"},{"username":"Larsluph","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png"},{"username":"FOEDI","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png"},{"username":"xmarkurion","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png"},{"username":"gregid","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png"},{"username":"Flameberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png"},{"username":"Playfust","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg"},{"username":"Cotignac","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg"},{"username":"LeaHun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png"},{"username":"jackwellerreal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png"},{"username":"andrius.cim","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png"},{"username":"xjxexrxrxyx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg"},{"username":"bilhal.fellah","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png"},{"username":"the_octo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png"},{"username":"BamesJond","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png"},{"username":"Kornikus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png"},{"username":"xoxyuxu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png"},{"username":"cryptodntsleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/2bd0f716f062632f78085b3828a72b6d_default.png"},{"username":"yaniorg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17261842/medium/7dbfc77f21c826845961243c44540d26.jpg"},{"username":"Vidariondr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17262438/medium/45fbc71be02ef27296b6f423e97b6a03_default.png"},{"username":"Fastery","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17263066/medium/701b0edc59676174863ad651528bbb37.jpeg"}]
\ No newline at end of file
+[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"Skick","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12619811/medium/0331f1de413a645b4516bc4e037f31bb.jpg"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg"},{"username":"f1refa11","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png"},{"username":"jeffersonraimon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png"},{"username":"giop98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg"},{"username":"tomislav.kraljevic","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png"},{"username":"Walkx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png"},{"username":"andrea.rosso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png"},{"username":"ajnart","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg"},{"username":"Witchling","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg"},{"username":"guineuu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg"},{"username":"Bulgus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg"},{"username":"Narno","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png"},{"username":"BySempron","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png"},{"username":"jonathan.berglin.work","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png"},{"username":"icdmkg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif"},{"username":"irithys","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png"},{"username":"JannesV","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png"},{"username":"benniblot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg"},{"username":"pacjo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png"},{"username":"Payou6994","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png"},{"username":"fzibi21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png"},{"username":"WowMurdock","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png"},{"username":"hbooo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg"},{"username":"Manicraft1001","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg"},{"username":"Void123","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png"},{"username":"R4cc","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg"},{"username":"fabricionaweb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png"},{"username":"JokeOfDead","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg"},{"username":"hkz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png"},{"username":"Steken","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png"},{"username":"flar.anton","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg"},{"username":"Bon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg"},{"username":"bfkadan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png"},{"username":"BunnySweety","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png"},{"username":"HRKings","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png"},{"username":"wiston81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg"},{"username":"qaz0911","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png"},{"username":"qqyule","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png"},{"username":"Bims0n","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg"},{"username":"TariqDaCoder","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png"},{"username":"Anarchon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg"},{"username":"Ashun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png"},{"username":"sebekmartin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg"},{"username":"RagnarGraves","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png"},{"username":"PrtmPhlp","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png"},{"username":"DooYoo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png"},{"username":"espentruls","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg"},{"username":"frisco82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg"},{"username":"lupineDK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png"},{"username":"hillaliy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg"},{"username":"MarcOrfilaCarreras","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png"},{"username":"robertbridda","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png"},{"username":"MKoniuszko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg"},{"username":"HeroSizy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png"},{"username":"dwt136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png"},{"username":"asifthewebguy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png"},{"username":"eiloogs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif"},{"username":"_vytdv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png"},{"username":"crendasien","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg"},{"username":"edxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png"},{"username":"somerlev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg"},{"username":"kid1412621","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png"},{"username":"suming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png"},{"username":"nick.gher","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png"},{"username":"DataCat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png"},{"username":"dizo89","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg"},{"username":"tee_noodle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png"},{"username":"Marty88","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg"},{"username":"Spillebulle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG"},{"username":"petitmewen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg"},{"username":"NoProsNoNoobs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png"},{"username":"y.gybson","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg"},{"username":"inside90","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png"},{"username":"RJSkudra","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png"},{"username":"binge203","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif"},{"username":"Mailootje","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg"},{"username":"tim-wiegers","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png"},{"username":"GkhnG","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png"},{"username":"Zoen-Millo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg"},{"username":"HooinKyoma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg"},{"username":"wathergeen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png"},{"username":"MoeToo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png"},{"username":"itodouble","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png"},{"username":"loslocitos","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg"},{"username":"Oversleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png"},{"username":"Beardy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png"},{"username":"raelyan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg"},{"username":"dolphin738","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png"},{"username":"brunotco","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png"},{"username":"LukeIsHereToDevelop","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png"},{"username":"kennit","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png"},{"username":"kuunpire","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg"},{"username":"Sandor-dev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png"},{"username":"Meierschlumpf","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg"},{"username":"harmlesscat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png"},{"username":"OrzWTF","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg"},{"username":"tagaishi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png"},{"username":"azurite928","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png"},{"username":"Ronner231","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg"},{"username":"ugyes","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png"},{"username":"rpieja","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png"},{"username":"flambyisyou","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png"},{"username":"Topbcy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg"},{"username":"ai5d02sb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png"},{"username":"explosiveparrot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png"},{"username":"DestroyCom","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png"},{"username":"neotraxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png"},{"username":"gzxpa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png"},{"username":"TORIK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png"},{"username":"sergio.pibot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg"},{"username":"karam-ajaj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg"},{"username":"SimonHenz97","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png"},{"username":"olsson82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png"},{"username":"bo3bdo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg"},{"username":"AngryPlayer04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg"},{"username":"ehatamm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg"},{"username":"Balionelis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png"},{"username":"kwargs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png"},{"username":"lucicu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png"},{"username":"Michael5564445","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png"},{"username":"Netscream","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png"},{"username":"belicstefan04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png"},{"username":"Hamad2066","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg"},{"username":"3ct0pl4sm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png"},{"username":"sanchez.marcell626","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png"},{"username":"Minoctis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg"},{"username":"vittoriosoccorso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16498805/medium/17086b2f1981f734edd1572f79c3158a.jpeg"},{"username":"Worgen325","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16533177/medium/4a62cc6b06095751aeb4b1b3e96db93f.png"},{"username":"homarr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png"},{"username":"mwgg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png"},{"username":"dymek37","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png"},{"username":"kiwinho","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg"},{"username":"tjvg4m34r13","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg"},{"username":"Diegoem","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png"},{"username":"bouks69","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg"},{"username":"futhgar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg"},{"username":"GrimSQL","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png"},{"username":"chnikel","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png"},{"username":"yuki19870616","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png"},{"username":"noamdal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png"},{"username":"MalithRukshan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png"},{"username":"minirope19","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg"},{"username":"toineenzo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png"},{"username":"ArcaneWater","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png"},{"username":"Ebedami","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12974801/medium/b596dea5c09454c4c828eac558389755.jpg"},{"username":"SergiSvK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png"},{"username":"jeongeon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13362856/medium/eb572f72cde5e5526c517ca3a6489850_default.png"},{"username":"MrTranCFCVN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13439475/medium/a1789d69c85d90c667194b5d6a518c08_default.png"},{"username":"Cruellest","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg"},{"username":"Thario","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png"},{"username":"Kachelkaiser","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png"},{"username":"regi4","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png"},{"username":"baton5129","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG"},{"username":"TheRedCyclops","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png"},{"username":"B3CKDOOR","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png"},{"username":"Larsluph","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png"},{"username":"FOEDI","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png"},{"username":"xmarkurion","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png"},{"username":"gregid","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png"},{"username":"Flameberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png"},{"username":"Playfust","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg"},{"username":"Cotignac","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg"},{"username":"LeaHun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png"},{"username":"jackwellerreal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png"},{"username":"andrius.cim","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png"},{"username":"xjxexrxrxyx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg"},{"username":"bilhal.fellah","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png"},{"username":"the_octo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png"},{"username":"BamesJond","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png"},{"username":"Kornikus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png"},{"username":"xoxyuxu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png"},{"username":"cryptodntsleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/2bd0f716f062632f78085b3828a72b6d_default.png"},{"username":"yaniorg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17261842/medium/7dbfc77f21c826845961243c44540d26.jpg"},{"username":"Vidariondr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17262438/medium/45fbc71be02ef27296b6f423e97b6a03_default.png"},{"username":"Fastery","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17263066/medium/701b0edc59676174863ad651528bbb37.jpeg"},{"username":"stratself","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17290388/medium/57d9d8161b3fd0abf4dc5558b4a1fa05_default.png"},{"username":"wuzeqin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17292606/medium/b9e0308410b31337e2d7aa6ed346d718_default.png"}]
\ No newline at end of file