chore: update dependencies in pnpm-lock.yaml and package.json, including zod to version 4.3.6, @dokploy/trpc-openapi to version 0.0.13, and @trpc packages to version 11.10.0; refactor loading state handling in application components

This commit is contained in:
Mauricio Siu
2026-02-23 23:50:55 -06:00
parent df648eccf6
commit 7c534d62b6
180 changed files with 717 additions and 828 deletions

View File

@@ -34,11 +34,7 @@ import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm";
import { nanoid } from "nanoid";
import { z } from "zod";
import {
createTRPCRouter,
protectedProcedure,
uploadProcedure,
} from "@/server/api/trpc";
import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc";
import { db } from "@/server/db";
import {
apiCreateApplication,
@@ -67,7 +63,6 @@ import {
myQueue,
} from "@/server/queues/queueSetup";
import { cancelDeployment, deploy } from "@/server/utils/deploy";
import { uploadFileSchema } from "@/utils/schema";
export const applicationRouter = createTRPCRouter({
create: protectedProcedure
@@ -814,12 +809,15 @@ export const applicationRouter = createTRPCRouter({
enabled: false,
},
})
.use(uploadProcedure)
.input(uploadFileSchema)
.input(z.instanceof(FormData))
.mutation(async ({ input, ctx }) => {
const zipFile = input.zip;
const formData = input;
const app = await findApplicationById(input.applicationId as string);
const zipFile = formData.get("zip") as File;
const applicationId = formData.get("applicationId") as string;
const dropBuildPath = formData.get("dropBuildPath") as string | null;
const app = await findApplicationById(applicationId);
if (
app.environment.project.organizationId !==
@@ -831,9 +829,9 @@ export const applicationRouter = createTRPCRouter({
});
}
await updateApplication(input.applicationId as string, {
await updateApplication(applicationId, {
sourceType: "drop",
dropBuildPath: input.dropBuildPath || "",
dropBuildPath: dropBuildPath || "",
});
await unzipDrop(zipFile, app);

View File

@@ -67,9 +67,7 @@ export const dockerRouter = createTRPCRouter({
getContainersByAppNameMatch: protectedProcedure
.input(
z.object({
appType: z
.union([z.literal("stack"), z.literal("docker-compose")])
.optional(),
appType: z.enum(["stack", "docker-compose"]).optional(),
appName: z.string().min(1).regex(containerIdRegex, "Invalid app name."),
serverId: z.string().optional(),
}),

View File

@@ -20,7 +20,6 @@ import {
updateMongoById,
} from "@dokploy/server";
import { TRPCError } from "@trpc/server";
import { observable } from "@trpc/server/observable";
import { eq } from "drizzle-orm";
import { z } from "zod";
import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc";
@@ -235,7 +234,7 @@ export const mongoRouter = createTRPCRouter({
},
})
.input(apiDeployMongo)
.subscription(async ({ input, ctx }) => {
.subscription(async function* ({ input, ctx, signal }) {
const mongo = await findMongoById(input.mongoId);
if (
mongo.environment.project.organizationId !==
@@ -246,11 +245,24 @@ export const mongoRouter = createTRPCRouter({
message: "You are not authorized to deploy this mongo",
});
}
return observable<string>((emit) => {
deployMongo(input.mongoId, (log) => {
emit.next(log);
});
const queue: string[] = [];
const done = false;
deployMongo(input.mongoId, (log) => {
queue.push(log);
});
while (!done || queue.length > 0) {
if (queue.length > 0) {
yield queue.shift()!;
} else {
await new Promise((r) => setTimeout(r, 50));
}
if (signal?.aborted) {
return;
}
}
}),
changeStatus: protectedProcedure

View File

@@ -20,7 +20,6 @@ import {
updateMySqlById,
} from "@dokploy/server";
import { TRPCError } from "@trpc/server";
import { observable } from "@trpc/server/observable";
import { eq } from "drizzle-orm";
import { z } from "zod";
import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc";
@@ -233,7 +232,7 @@ export const mysqlRouter = createTRPCRouter({
},
})
.input(apiDeployMySql)
.subscription(async ({ input, ctx }) => {
.subscription(async function* ({ input, ctx, signal }) {
const mysql = await findMySqlById(input.mysqlId);
if (
mysql.environment.project.organizationId !==
@@ -245,11 +244,24 @@ export const mysqlRouter = createTRPCRouter({
});
}
return observable<string>((emit) => {
deployMySql(input.mysqlId, (log) => {
emit.next(log);
});
const queue: string[] = [];
const done = false;
deployMySql(input.mysqlId, (log) => {
queue.push(log);
});
while (!done || queue.length > 0) {
if (queue.length > 0) {
yield queue.shift()!;
} else {
await new Promise((r) => setTimeout(r, 50));
}
if (signal?.aborted) {
return;
}
}
}),
changeStatus: protectedProcedure
.input(apiChangeMySqlStatus)

View File

@@ -21,7 +21,6 @@ import {
updatePostgresById,
} from "@dokploy/server";
import { TRPCError } from "@trpc/server";
import { observable } from "@trpc/server/observable";
import { eq } from "drizzle-orm";
import { z } from "zod";
import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc";
@@ -239,8 +238,9 @@ export const postgresRouter = createTRPCRouter({
},
})
.input(apiDeployPostgres)
.subscription(async ({ input, ctx }) => {
.subscription(async function* ({ input, ctx, signal }) {
const postgres = await findPostgresById(input.postgresId);
if (
postgres.environment.project.organizationId !==
ctx.session.activeOrganizationId
@@ -250,11 +250,25 @@ export const postgresRouter = createTRPCRouter({
message: "You are not authorized to deploy this Postgres",
});
}
return observable<string>((emit) => {
deployPostgres(input.postgresId, (log) => {
emit.next(log);
});
const queue: string[] = [];
const done = false;
deployPostgres(input.postgresId, (log) => {
queue.push(log);
});
while (!done || queue.length > 0) {
if (queue.length > 0) {
yield queue.shift()!;
} else {
await new Promise((r) => setTimeout(r, 50));
}
if (signal?.aborted) {
return;
}
}
}),
changeStatus: protectedProcedure

View File

@@ -20,7 +20,6 @@ import {
} from "@dokploy/server";
import { TRPCError } from "@trpc/server";
import { observable } from "@trpc/server/observable";
import { eq } from "drizzle-orm";
import { z } from "zod";
import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc";
@@ -257,7 +256,7 @@ export const redisRouter = createTRPCRouter({
},
})
.input(apiDeployRedis)
.subscription(async ({ input, ctx }) => {
.subscription(async function* ({ input, ctx, signal }) {
const redis = await findRedisById(input.redisId);
if (
redis.environment.project.organizationId !==
@@ -268,11 +267,24 @@ export const redisRouter = createTRPCRouter({
message: "You are not authorized to deploy this Redis",
});
}
return observable<string>((emit) => {
deployRedis(input.redisId, (log) => {
emit.next(log);
});
const queue: string[] = [];
const done = false;
deployRedis(input.redisId, (log) => {
queue.push(log);
});
while (!done || queue.length > 0) {
if (queue.length > 0) {
yield queue.shift()!;
} else {
await new Promise((r) => setTimeout(r, 50));
}
if (signal?.aborted) {
return;
}
}
}),
changeStatus: protectedProcedure
.input(apiChangeRedisStatus)

View File

@@ -12,11 +12,6 @@ import { validateRequest } from "@dokploy/server/lib/auth";
import type { OpenApiMeta } from "@dokploy/trpc-openapi";
import { initTRPC, TRPCError } from "@trpc/server";
import type { CreateNextContextOptions } from "@trpc/server/adapters/next";
import {
experimental_createMemoryUploadHandler,
experimental_isMultipartFormDataRequest,
experimental_parseMultipartFormData,
} from "@trpc/server/adapters/node-http/content-type/form-data";
import type { Session, User } from "better-auth";
import superjson from "superjson";
import { ZodError } from "zod";
@@ -172,24 +167,6 @@ export const protectedProcedure = t.procedure.use(({ ctx, next }) => {
});
});
export const uploadProcedure = async (opts: any) => {
if (!experimental_isMultipartFormDataRequest(opts.ctx.req)) {
return opts.next();
}
const formData = await experimental_parseMultipartFormData(
opts.ctx.req,
experimental_createMemoryUploadHandler({
// 2GB
maxPartSize: 1024 * 1024 * 1024 * 2,
}),
);
return opts.next({
rawInput: formData,
});
};
export const cliProcedure = t.procedure.use(({ ctx, next }) => {
if (
!ctx.session ||