mirror of
https://github.com/Dokploy/dokploy.git
synced 2026-07-22 14:25:24 +02:00
Merge pull request #3623 from Dokploy/3506-deployment-queue-gets-stuck-when-application-is-deleted-while-deployment-task-is-processing
feat(dependencies): update bullmq and related packages to version 5.67.3
This commit is contained in:
@@ -99,7 +99,7 @@
|
|||||||
"better-auth": "1.4.18",
|
"better-auth": "1.4.18",
|
||||||
"bl": "6.0.11",
|
"bl": "6.0.11",
|
||||||
"boxen": "^7.1.1",
|
"boxen": "^7.1.1",
|
||||||
"bullmq": "5.4.2",
|
"bullmq": "5.67.3",
|
||||||
"shell-quote": "^1.8.1",
|
"shell-quote": "^1.8.1",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
|
|||||||
@@ -57,9 +57,11 @@ import {
|
|||||||
apiUpdateApplication,
|
apiUpdateApplication,
|
||||||
applications,
|
applications,
|
||||||
} from "@/server/db/schema";
|
} from "@/server/db/schema";
|
||||||
|
import { deploymentWorker } from "@/server/queues/deployments-queue";
|
||||||
import type { DeploymentJob } from "@/server/queues/queue-types";
|
import type { DeploymentJob } from "@/server/queues/queue-types";
|
||||||
import {
|
import {
|
||||||
cleanQueuesByApplication,
|
cleanQueuesByApplication,
|
||||||
|
getJobsByApplicationId,
|
||||||
killDockerBuild,
|
killDockerBuild,
|
||||||
myQueue,
|
myQueue,
|
||||||
} from "@/server/queues/queueSetup";
|
} from "@/server/queues/queueSetup";
|
||||||
@@ -240,6 +242,15 @@ export const applicationRouter = createTRPCRouter({
|
|||||||
.where(eq(applications.applicationId, input.applicationId))
|
.where(eq(applications.applicationId, input.applicationId))
|
||||||
.returning();
|
.returning();
|
||||||
|
|
||||||
|
if (!IS_CLOUD) {
|
||||||
|
const queueJobs = await getJobsByApplicationId(input.applicationId);
|
||||||
|
for (const job of queueJobs) {
|
||||||
|
if (job.id) {
|
||||||
|
deploymentWorker.cancelJob(job.id, "User requested cancellation");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const cleanupOperations = [
|
const cleanupOperations = [
|
||||||
async () => await deleteAllMiddlewares(application),
|
async () => await deleteAllMiddlewares(application),
|
||||||
async () => await removeDeployments(application),
|
async () => await removeDeployments(application),
|
||||||
|
|||||||
@@ -58,9 +58,11 @@ import {
|
|||||||
apiUpdateCompose,
|
apiUpdateCompose,
|
||||||
compose as composeTable,
|
compose as composeTable,
|
||||||
} from "@/server/db/schema";
|
} from "@/server/db/schema";
|
||||||
|
import { deploymentWorker } from "@/server/queues/deployments-queue";
|
||||||
import type { DeploymentJob } from "@/server/queues/queue-types";
|
import type { DeploymentJob } from "@/server/queues/queue-types";
|
||||||
import {
|
import {
|
||||||
cleanQueuesByCompose,
|
cleanQueuesByCompose,
|
||||||
|
getJobsByComposeId,
|
||||||
killDockerBuild,
|
killDockerBuild,
|
||||||
myQueue,
|
myQueue,
|
||||||
} from "@/server/queues/queueSetup";
|
} from "@/server/queues/queueSetup";
|
||||||
@@ -222,6 +224,15 @@ export const composeRouter = createTRPCRouter({
|
|||||||
.where(eq(composeTable.composeId, input.composeId))
|
.where(eq(composeTable.composeId, input.composeId))
|
||||||
.returning();
|
.returning();
|
||||||
|
|
||||||
|
if (!IS_CLOUD) {
|
||||||
|
const queueJobs = await getJobsByComposeId(input.composeId);
|
||||||
|
for (const job of queueJobs) {
|
||||||
|
if (job.id) {
|
||||||
|
deploymentWorker.cancelJob(job.id, "User requested cancellation");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const cleanupOperations = [
|
const cleanupOperations = [
|
||||||
async () => await removeCompose(composeResult, input.deleteVolumes),
|
async () => await removeCompose(composeResult, input.deleteVolumes),
|
||||||
async () => await removeDeploymentsByComposeId(composeResult),
|
async () => await removeDeploymentsByComposeId(composeResult),
|
||||||
|
|||||||
@@ -9,6 +9,16 @@ const myQueue = new Queue("deployments", {
|
|||||||
connection: redisConfig,
|
connection: redisConfig,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const getJobsByApplicationId = async (applicationId: string) => {
|
||||||
|
const jobs = await myQueue.getJobs();
|
||||||
|
return jobs.filter((job) => job?.data?.applicationId === applicationId);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getJobsByComposeId = async (composeId: string) => {
|
||||||
|
const jobs = await myQueue.getJobs();
|
||||||
|
return jobs.filter((job) => job?.data?.composeId === composeId);
|
||||||
|
};
|
||||||
|
|
||||||
process.on("SIGTERM", () => {
|
process.on("SIGTERM", () => {
|
||||||
myQueue.close();
|
myQueue.close();
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
"@dokploy/server": "workspace:*",
|
"@dokploy/server": "workspace:*",
|
||||||
"@hono/node-server": "^1.14.3",
|
"@hono/node-server": "^1.14.3",
|
||||||
"@hono/zod-validator": "0.3.0",
|
"@hono/zod-validator": "0.3.0",
|
||||||
"bullmq": "5.4.2",
|
"bullmq": "5.67.3",
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
"drizzle-orm": "^0.41.0",
|
"drizzle-orm": "^0.41.0",
|
||||||
"hono": "^4.11.7",
|
"hono": "^4.11.7",
|
||||||
|
|||||||
@@ -47,25 +47,25 @@ app.post("/update-backup", zValidator("json", jobQueueSchema), async (c) => {
|
|||||||
result = await removeJob({
|
result = await removeJob({
|
||||||
backupId: data.backupId,
|
backupId: data.backupId,
|
||||||
type: "backup",
|
type: "backup",
|
||||||
cronSchedule: job.pattern,
|
cronSchedule: job.pattern || "",
|
||||||
});
|
});
|
||||||
} else if (data.type === "server") {
|
} else if (data.type === "server") {
|
||||||
result = await removeJob({
|
result = await removeJob({
|
||||||
serverId: data.serverId,
|
serverId: data.serverId,
|
||||||
type: "server",
|
type: "server",
|
||||||
cronSchedule: job.pattern,
|
cronSchedule: job.pattern || "",
|
||||||
});
|
});
|
||||||
} else if (data.type === "schedule") {
|
} else if (data.type === "schedule") {
|
||||||
result = await removeJob({
|
result = await removeJob({
|
||||||
scheduleId: data.scheduleId,
|
scheduleId: data.scheduleId,
|
||||||
type: "schedule",
|
type: "schedule",
|
||||||
cronSchedule: job.pattern,
|
cronSchedule: job.pattern || "",
|
||||||
});
|
});
|
||||||
} else if (data.type === "volume-backup") {
|
} else if (data.type === "volume-backup") {
|
||||||
result = await removeJob({
|
result = await removeJob({
|
||||||
volumeBackupId: data.volumeBackupId,
|
volumeBackupId: data.volumeBackupId,
|
||||||
type: "volume-backup",
|
type: "volume-backup",
|
||||||
cronSchedule: job.pattern,
|
cronSchedule: job.pattern || "",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
logger.info({ result }, "Job removed");
|
logger.info({ result }, "Job removed");
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
import { Queue, type RepeatableJob } from "bullmq";
|
import { Queue, type RepeatableJob } from "bullmq";
|
||||||
import IORedis from "ioredis";
|
|
||||||
import { logger } from "./logger.js";
|
import { logger } from "./logger.js";
|
||||||
import type { QueueJob } from "./schema.js";
|
import type { QueueJob } from "./schema.js";
|
||||||
|
|
||||||
export const connection = new IORedis(process.env.REDIS_URL!, {
|
|
||||||
maxRetriesPerRequest: null,
|
|
||||||
});
|
|
||||||
export const jobQueue = new Queue("backupQueue", {
|
export const jobQueue = new Queue("backupQueue", {
|
||||||
connection,
|
connection: {
|
||||||
|
url: process.env.REDIS_URL!,
|
||||||
|
},
|
||||||
defaultJobOptions: {
|
defaultJobOptions: {
|
||||||
removeOnComplete: true,
|
removeOnComplete: true,
|
||||||
removeOnFail: true,
|
removeOnFail: true,
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { type Job, Worker } from "bullmq";
|
import { type Job, Worker } from "bullmq";
|
||||||
import { logger } from "./logger.js";
|
import { logger } from "./logger.js";
|
||||||
import { connection } from "./queue.js";
|
|
||||||
import type { QueueJob } from "./schema.js";
|
import type { QueueJob } from "./schema.js";
|
||||||
import { runJobs } from "./utils.js";
|
import { runJobs } from "./utils.js";
|
||||||
|
|
||||||
@@ -12,7 +11,9 @@ export const firstWorker = new Worker(
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
concurrency: 100,
|
concurrency: 100,
|
||||||
connection,
|
connection: {
|
||||||
|
url: process.env.REDIS_URL!,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
export const secondWorker = new Worker(
|
export const secondWorker = new Worker(
|
||||||
@@ -23,7 +24,9 @@ export const secondWorker = new Worker(
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
concurrency: 100,
|
concurrency: 100,
|
||||||
connection,
|
connection: {
|
||||||
|
url: process.env.REDIS_URL!,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -35,6 +38,8 @@ export const thirdWorker = new Worker(
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
concurrency: 100,
|
concurrency: 100,
|
||||||
connection,
|
connection: {
|
||||||
|
url: process.env.REDIS_URL!,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
56
pnpm-lock.yaml
generated
56
pnpm-lock.yaml
generated
@@ -272,8 +272,8 @@ importers:
|
|||||||
specifier: ^7.1.1
|
specifier: ^7.1.1
|
||||||
version: 7.1.1
|
version: 7.1.1
|
||||||
bullmq:
|
bullmq:
|
||||||
specifier: 5.4.2
|
specifier: 5.67.3
|
||||||
version: 5.4.2
|
version: 5.67.3
|
||||||
class-variance-authority:
|
class-variance-authority:
|
||||||
specifier: ^0.7.1
|
specifier: ^0.7.1
|
||||||
version: 0.7.1
|
version: 0.7.1
|
||||||
@@ -540,8 +540,8 @@ importers:
|
|||||||
specifier: 0.3.0
|
specifier: 0.3.0
|
||||||
version: 0.3.0(hono@4.11.7)(zod@3.25.32)
|
version: 0.3.0(hono@4.11.7)(zod@3.25.32)
|
||||||
bullmq:
|
bullmq:
|
||||||
specifier: 5.4.2
|
specifier: 5.67.3
|
||||||
version: 5.4.2
|
version: 5.67.3
|
||||||
dotenv:
|
dotenv:
|
||||||
specifier: ^16.4.5
|
specifier: ^16.4.5
|
||||||
version: 16.4.5
|
version: 16.4.5
|
||||||
@@ -2137,6 +2137,9 @@ packages:
|
|||||||
'@ioredis/commands@1.2.0':
|
'@ioredis/commands@1.2.0':
|
||||||
resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==}
|
resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==}
|
||||||
|
|
||||||
|
'@ioredis/commands@1.5.0':
|
||||||
|
resolution: {integrity: sha512-eUgLqrMf8nJkZxT24JvVRrQya1vZkQh8BBeYNwGDqa5I0VUi8ACx7uFvAaLxintokpTenkK6DASvo/bvNbBGow==}
|
||||||
|
|
||||||
'@isaacs/cliui@8.0.2':
|
'@isaacs/cliui@8.0.2':
|
||||||
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
@@ -4800,8 +4803,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==}
|
resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==}
|
||||||
engines: {node: '>=10.0.0'}
|
engines: {node: '>=10.0.0'}
|
||||||
|
|
||||||
bullmq@5.4.2:
|
bullmq@5.67.3:
|
||||||
resolution: {integrity: sha512-dkR/KGUw18miLe3QWtvSlmGvEe08aZF+w1jZyqEHMWFW3RP4162qp6OGud0/QCAOjusiRI8UOxUhbnortPY+rA==}
|
resolution: {integrity: sha512-eeQobOJn8M0Rj8tcZCVFLrimZgJQallJH1JpclOoyut2nDNkDwTEPMVcZzLeSR2fGeIVbfJTjU96F563Qkge5A==}
|
||||||
|
|
||||||
bundle-name@4.1.0:
|
bundle-name@4.1.0:
|
||||||
resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
|
resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
|
||||||
@@ -5966,6 +5969,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==}
|
resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==}
|
||||||
engines: {node: '>=12.22.0'}
|
engines: {node: '>=12.22.0'}
|
||||||
|
|
||||||
|
ioredis@5.9.2:
|
||||||
|
resolution: {integrity: sha512-tAAg/72/VxOUW7RQSX1pIxJVucYKcjFjfvj60L57jrZpYCHC3XN0WCQ3sNYL4Gmvv+7GPvTAjc+KSdeNuE8oWQ==}
|
||||||
|
engines: {node: '>=12.22.0'}
|
||||||
|
|
||||||
ip-regex@5.0.0:
|
ip-regex@5.0.0:
|
||||||
resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==}
|
resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==}
|
||||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||||
@@ -6531,8 +6538,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==}
|
resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
msgpackr@1.11.4:
|
msgpackr@1.11.5:
|
||||||
resolution: {integrity: sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==}
|
resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==}
|
||||||
|
|
||||||
mylas@2.1.13:
|
mylas@2.1.13:
|
||||||
resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==}
|
resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==}
|
||||||
@@ -8013,6 +8020,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
|
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
uuid@11.1.0:
|
||||||
|
resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
uuid@8.3.2:
|
uuid@8.3.2:
|
||||||
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
|
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
@@ -9409,6 +9420,8 @@ snapshots:
|
|||||||
|
|
||||||
'@ioredis/commands@1.2.0': {}
|
'@ioredis/commands@1.2.0': {}
|
||||||
|
|
||||||
|
'@ioredis/commands@1.5.0': {}
|
||||||
|
|
||||||
'@isaacs/cliui@8.0.2':
|
'@isaacs/cliui@8.0.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
string-width: 5.1.2
|
string-width: 5.1.2
|
||||||
@@ -12583,16 +12596,15 @@ snapshots:
|
|||||||
buildcheck@0.0.6:
|
buildcheck@0.0.6:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
bullmq@5.4.2:
|
bullmq@5.67.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
cron-parser: 4.9.0
|
cron-parser: 4.9.0
|
||||||
ioredis: 5.4.1
|
ioredis: 5.9.2
|
||||||
lodash: 4.17.21
|
msgpackr: 1.11.5
|
||||||
msgpackr: 1.11.4
|
|
||||||
node-abort-controller: 3.1.1
|
node-abort-controller: 3.1.1
|
||||||
semver: 7.7.3
|
semver: 7.7.3
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
uuid: 9.0.1
|
uuid: 11.1.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
@@ -13796,6 +13808,20 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
ioredis@5.9.2:
|
||||||
|
dependencies:
|
||||||
|
'@ioredis/commands': 1.5.0
|
||||||
|
cluster-key-slot: 1.1.2
|
||||||
|
debug: 4.4.1
|
||||||
|
denque: 2.1.0
|
||||||
|
lodash.defaults: 4.2.0
|
||||||
|
lodash.isarguments: 3.1.0
|
||||||
|
redis-errors: 1.2.0
|
||||||
|
redis-parser: 3.0.0
|
||||||
|
standard-as-callback: 2.1.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
ip-regex@5.0.0: {}
|
ip-regex@5.0.0: {}
|
||||||
|
|
||||||
iron-webcrypto@1.2.1: {}
|
iron-webcrypto@1.2.1: {}
|
||||||
@@ -14484,7 +14510,7 @@ snapshots:
|
|||||||
'@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3
|
'@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
msgpackr@1.11.4:
|
msgpackr@1.11.5:
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
msgpackr-extract: 3.0.3
|
msgpackr-extract: 3.0.3
|
||||||
|
|
||||||
@@ -16106,6 +16132,8 @@ snapshots:
|
|||||||
|
|
||||||
uuid@10.0.0: {}
|
uuid@10.0.0: {}
|
||||||
|
|
||||||
|
uuid@11.1.0: {}
|
||||||
|
|
||||||
uuid@8.3.2: {}
|
uuid@8.3.2: {}
|
||||||
|
|
||||||
uuid@9.0.1: {}
|
uuid@9.0.1: {}
|
||||||
|
|||||||
Reference in New Issue
Block a user