+
));
diff --git a/apps/dokploy/pages/api/deploy/github.ts b/apps/dokploy/pages/api/deploy/github.ts
index bdbc0293d..1d8c094af 100644
--- a/apps/dokploy/pages/api/deploy/github.ts
+++ b/apps/dokploy/pages/api/deploy/github.ts
@@ -10,137 +10,138 @@ import type { NextApiRequest, NextApiResponse } from "next";
import { extractCommitMessage, extractHash } from "./[refreshToken]";
export default async function handler(
- req: NextApiRequest,
- res: NextApiResponse,
+ req: NextApiRequest,
+ res: NextApiResponse
) {
- const signature = req.headers["x-hub-signature-256"];
- const githubBody = req.body;
-
- if (!githubBody?.installation?.id) {
- res.status(400).json({ message: "Github Installation not found" });
- return;
- }
-
- const githubResult = await db.query.github.findFirst({
- where: eq(github.githubInstallationId, githubBody.installation.id),
- });
-
- if (!githubResult) {
- res.status(400).json({ message: "Github Installation not found" });
- return;
- }
-
- if (!githubResult.githubWebhookSecret) {
- res.status(400).json({ message: "Github Webhook Secret not set" });
- return;
- }
- const webhooks = new Webhooks({
- secret: githubResult.githubWebhookSecret,
- });
-
- const verified = await webhooks.verify(
- JSON.stringify(githubBody),
- signature as string,
- );
-
- if (!verified) {
- res.status(401).json({ message: "Unauthorized" });
- return;
- }
-
- if (req.headers["x-github-event"] === "ping") {
- res.status(200).json({ message: "Ping received, webhook is active" });
- return;
- }
-
- if (req.headers["x-github-event"] !== "push") {
- res.status(400).json({ message: "We only accept push events" });
- return;
- }
-
- try {
- const branchName = githubBody?.ref?.replace("refs/heads/", "");
- const repository = githubBody?.repository?.name;
- const deploymentTitle = extractCommitMessage(req.headers, req.body);
- const deploymentHash = extractHash(req.headers, req.body);
-
- const apps = await db.query.applications.findMany({
- where: and(
- eq(applications.sourceType, "github"),
- eq(applications.autoDeploy, true),
- eq(applications.branch, branchName),
- eq(applications.repository, repository),
- ),
- });
-
- for (const app of apps) {
- const jobData: DeploymentJob = {
- applicationId: app.applicationId as string,
- titleLog: deploymentTitle,
- descriptionLog: `Hash: ${deploymentHash}`,
- type: "deploy",
- applicationType: "application",
- server: !!app.serverId,
- };
-
- if (IS_CLOUD && app.serverId) {
- jobData.serverId = app.serverId;
- await deploy(jobData);
- return true;
- }
- await myQueue.add(
- "deployments",
- { ...jobData },
- {
- removeOnComplete: true,
- removeOnFail: true,
- },
- );
- }
-
- const composeApps = await db.query.compose.findMany({
- where: and(
- eq(compose.sourceType, "github"),
- eq(compose.autoDeploy, true),
- eq(compose.branch, branchName),
- eq(compose.repository, repository),
- ),
- });
-
- for (const composeApp of composeApps) {
- const jobData: DeploymentJob = {
- composeId: composeApp.composeId as string,
- titleLog: deploymentTitle,
- type: "deploy",
- applicationType: "compose",
- descriptionLog: `Hash: ${deploymentHash}`,
- };
-
- if (IS_CLOUD && composeApp.serverId) {
- jobData.serverId = composeApp.serverId;
- await deploy(jobData);
- return true;
- }
-
- await myQueue.add(
- "deployments",
- { ...jobData },
- {
- removeOnComplete: true,
- removeOnFail: true,
- },
- );
- }
-
- const totalApps = apps.length + composeApps.length;
- const emptyApps = totalApps === 0;
-
- if (emptyApps) {
- res.status(200).json({ message: "No apps to deploy" });
- return;
- }
- res.status(200).json({ message: `Deployed ${totalApps} apps` });
- } catch (error) {
- res.status(400).json({ message: "Error To Deploy Application", error });
- }
+ const signature = req.headers["x-hub-signature-256"];
+ const githubBody = req.body;
+
+ if (!githubBody?.installation?.id) {
+ res.status(400).json({ message: "Github Installation not found" });
+ return;
+ }
+
+ const githubResult = await db.query.github.findFirst({
+ where: eq(github.githubInstallationId, githubBody.installation.id),
+ });
+
+ if (!githubResult) {
+ res.status(400).json({ message: "Github Installation not found" });
+ return;
+ }
+
+ if (!githubResult.githubWebhookSecret) {
+ res.status(400).json({ message: "Github Webhook Secret not set" });
+ return;
+ }
+ const webhooks = new Webhooks({
+ secret: githubResult.githubWebhookSecret,
+ });
+
+ const verified = await webhooks.verify(
+ JSON.stringify(githubBody),
+ signature as string
+ );
+
+ if (!verified) {
+ res.status(401).json({ message: "Unauthorized" });
+ return;
+ }
+
+ if (req.headers["x-github-event"] === "ping") {
+ res.status(200).json({ message: "Ping received, webhook is active" });
+ return;
+ }
+
+ if (req.headers["x-github-event"] !== "push") {
+ res.status(400).json({ message: "We only accept push events" });
+ return;
+ }
+
+ try {
+ const branchName = githubBody?.ref?.replace("refs/heads/", "");
+ const repository = githubBody?.repository?.name;
+ const deploymentTitle = extractCommitMessage(req.headers, req.body);
+ const deploymentHash = extractHash(req.headers, req.body);
+
+ const apps = await db.query.applications.findMany({
+ where: and(
+ eq(applications.sourceType, "github"),
+ eq(applications.autoDeploy, true),
+ eq(applications.branch, branchName),
+ eq(applications.repository, repository)
+ ),
+ });
+
+ for (const app of apps) {
+ const jobData: DeploymentJob = {
+ applicationId: app.applicationId as string,
+ titleLog: deploymentTitle,
+ descriptionLog: `Hash: ${deploymentHash}`,
+ type: "deploy",
+ applicationType: "application",
+ server: !!app.serverId,
+ };
+
+ if (IS_CLOUD && app.serverId) {
+ jobData.serverId = app.serverId;
+ await deploy(jobData);
+ return true;
+ }
+ await myQueue.add(
+ "deployments",
+ { ...jobData },
+ {
+ removeOnComplete: true,
+ removeOnFail: true,
+ }
+ );
+ }
+
+ const composeApps = await db.query.compose.findMany({
+ where: and(
+ eq(compose.sourceType, "github"),
+ eq(compose.autoDeploy, true),
+ eq(compose.branch, branchName),
+ eq(compose.repository, repository)
+ ),
+ });
+
+ for (const composeApp of composeApps) {
+ const jobData: DeploymentJob = {
+ composeId: composeApp.composeId as string,
+ titleLog: deploymentTitle,
+ type: "deploy",
+ applicationType: "compose",
+ descriptionLog: `Hash: ${deploymentHash}`,
+ server: !!composeApp.serverId,
+ };
+
+ if (IS_CLOUD && composeApp.serverId) {
+ jobData.serverId = composeApp.serverId;
+ await deploy(jobData);
+ return true;
+ }
+
+ await myQueue.add(
+ "deployments",
+ { ...jobData },
+ {
+ removeOnComplete: true,
+ removeOnFail: true,
+ }
+ );
+ }
+
+ const totalApps = apps.length + composeApps.length;
+ const emptyApps = totalApps === 0;
+
+ if (emptyApps) {
+ res.status(200).json({ message: "No apps to deploy" });
+ return;
+ }
+ res.status(200).json({ message: `Deployed ${totalApps} apps` });
+ } catch (error) {
+ res.status(400).json({ message: "Error To Deploy Application", error });
+ }
}
diff --git a/apps/dokploy/styles/globals.css b/apps/dokploy/styles/globals.css
index bd24bee2f..f7e2a71f8 100644
--- a/apps/dokploy/styles/globals.css
+++ b/apps/dokploy/styles/globals.css
@@ -3,173 +3,173 @@
@tailwind utilities;
@layer base {
- :root {
- --background: 0 0% 100%;
- --foreground: 240 10% 3.9%;
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 240 10% 3.9%;
- --card: 0 0% 100%;
- --card-foreground: 240 10% 3.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 240 10% 3.9%;
- --popover: 0 0% 100%;
- --popover-foreground: 240 10% 3.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 240 10% 3.9%;
- --primary: 240 5.9% 10%;
- --primary-foreground: 0 0% 98%;
+ --primary: 240 5.9% 10%;
+ --primary-foreground: 0 0% 98%;
- --secondary: 240 4.8% 95.9%;
- --secondary-foreground: 240 5.9% 10%;
+ --secondary: 240 4.8% 95.9%;
+ --secondary-foreground: 240 5.9% 10%;
- --muted: 240 4.8% 95.9%;
- --muted-foreground: 240 3.8% 46.1%;
+ --muted: 240 4.8% 95.9%;
+ --muted-foreground: 240 3.8% 46.1%;
- --accent: 240 4.8% 95.9%;
- --accent-foreground: 240 5.9% 10%;
+ --accent: 240 4.8% 95.9%;
+ --accent-foreground: 240 5.9% 10%;
- --destructive: 0 84.2% 60.2%;
- --destructive-foreground: 0 0% 98%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 0 0% 98%;
- --border: 240 5.9% 90%;
- --input: 240 5.9% 90%;
- --ring: 240 10% 3.9%;
+ --border: 240 5.9% 90%;
+ --input: 240 5.9% 90%;
+ --ring: 240 10% 3.9%;
- --radius: 0.5rem;
- --overlay: rgba(0, 0, 0, 0.2);
+ --radius: 0.5rem;
+ --overlay: rgba(0, 0, 0, 0.2);
- --chart-1: 173 58% 39%;
- --chart-2: 12 76% 61%;
- --chart-3: 197 37% 24%;
- --chart-4: 43 74% 66%;
- --chart-5: 27 87% 67%;
- }
+ --chart-1: 173 58% 39%;
+ --chart-2: 12 76% 61%;
+ --chart-3: 197 37% 24%;
+ --chart-4: 43 74% 66%;
+ --chart-5: 27 87% 67%;
+ }
- .dark {
- --background: 0 0% 0%;
- --foreground: 0 0% 98%;
+ .dark {
+ --background: 0 0% 0%;
+ --foreground: 0 0% 98%;
- --card: 240 4% 10%;
- --card-foreground: 0 0% 98%;
+ --card: 240 4% 10%;
+ --card-foreground: 0 0% 98%;
- --popover: 240 10% 3.9%;
- --popover-foreground: 0 0% 98%;
+ --popover: 240 10% 3.9%;
+ --popover-foreground: 0 0% 98%;
- --primary: 0 0% 98%;
- --primary-foreground: 240 5.9% 10%;
+ --primary: 0 0% 98%;
+ --primary-foreground: 240 5.9% 10%;
- --secondary: 240 3.7% 15.9%;
- --secondary-foreground: 0 0% 98%;
+ --secondary: 240 3.7% 15.9%;
+ --secondary-foreground: 0 0% 98%;
- --muted: 240 4% 10%;
- --muted-foreground: 240 5% 64.9%;
+ --muted: 240 4% 10%;
+ --muted-foreground: 240 5% 64.9%;
- --accent: 240 3.7% 15.9%;
- --accent-foreground: 0 0% 98%;
+ --accent: 240 3.7% 15.9%;
+ --accent-foreground: 0 0% 98%;
- --destructive: 0 84.2% 60.2%;
- --destructive-foreground: 0 0% 98%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 0 0% 98%;
- --border: 240 3.7% 15.9%;
- --input: 240 4% 10%;
- --ring: 240 4.9% 83.9%;
+ --border: 240 3.7% 15.9%;
+ --input: 240 4% 10%;
+ --ring: 240 4.9% 83.9%;
- --overlay: rgba(0, 0, 0, 0.5);
+ --overlay: rgba(0, 0, 0, 0.5);
- --chart-1: 220 70% 50%;
- --chart-5: 160 60% 45%;
- --chart-3: 30 80% 55%;
- --chart-4: 280 65% 60%;
- --chart-2: 340 75% 55%;
- }
+ --chart-1: 220 70% 50%;
+ --chart-5: 160 60% 45%;
+ --chart-3: 30 80% 55%;
+ --chart-4: 280 65% 60%;
+ --chart-2: 340 75% 55%;
+ }
}
@layer base {
- * {
- @apply border-border;
- }
- body {
- @apply bg-background text-foreground;
- }
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
}
.xterm-viewport {
- border-radius: 0.75rem /* 12px */ !important;
+ border-radius: 0.75rem /* 12px */ !important;
}
.xterm .xterm-viewport {
- overflow-y: auto !important;
+ overflow-y: auto !important;
}
.xterm .xterm-screen {
- overflow: hidden;
+ overflow: hidden;
}
@layer utilities {
- /* Chrome, Safari and Opera */
- .no-scrollbar::-webkit-scrollbar {
- display: none;
- }
-
- .no-scrollbar {
- -ms-overflow-style: none; /* IE and Edge */
- scrollbar-width: none; /* Firefox */
- }
+ /* Chrome, Safari and Opera */
+ .no-scrollbar::-webkit-scrollbar {
+ display: none;
+ }
+
+ .no-scrollbar {
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+ }
}
/* Codemirror */
.cm-editor {
- @apply w-full h-full rounded-md overflow-hidden border border-solid border-border outline-none;
+ @apply w-full h-full rounded-md overflow-hidden border border-solid border-border outline-none;
}
.cm-editor .cm-scroller {
- font-family: inherit;
- line-height: inherit;
+ font-family: inherit;
+ line-height: inherit;
}
.cm-editor.cm-focused {
- @apply outline-none;
+ @apply outline-none;
}
/* fix: placeholder bg */
.cm-editor .cm-activeLine:has(.cm-placeholder) {
- background-color: transparent;
+ background-color: transparent;
}
.compose-file-editor .cm-editor {
- @apply min-h-[25rem];
+ @apply min-h-[25rem];
}
@keyframes heartbeat {
- 0% {
- transform: scale(1);
- opacity: 0.7;
- }
- 25% {
- transform: scale(1.1);
- opacity: 1;
- }
- 50% {
- transform: scale(1);
- opacity: 0.7;
- }
- 75% {
- transform: scale(1.1);
- opacity: 1;
- }
- 100% {
- transform: scale(1);
- opacity: 0.7;
- }
+ 0% {
+ transform: scale(1);
+ opacity: 0.7;
+ }
+ 25% {
+ transform: scale(1.1);
+ opacity: 1;
+ }
+ 50% {
+ transform: scale(1);
+ opacity: 0.7;
+ }
+ 75% {
+ transform: scale(1.1);
+ opacity: 1;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 0.7;
+ }
}
.animate-heartbeat {
- animation: heartbeat 2.5s infinite;
+ animation: heartbeat 2.5s infinite;
}
@media (prefers-color-scheme: dark) {
- .swagger-ui {
- background-color: white;
- }
-
- .swagger-ui .info {
- margin: 0px !important;
- padding-top: 1rem !important;
- }
+ .swagger-ui {
+ background-color: white;
+ }
+
+ .swagger-ui .info {
+ margin: 0px !important;
+ padding-top: 1rem !important;
+ }
}
diff --git a/lefthook.yml b/lefthook.yml
index bbc2d71a6..1a491cd8a 100644
--- a/lefthook.yml
+++ b/lefthook.yml
@@ -41,5 +41,5 @@ commit-msg:
pre-commit:
commands:
- lint-staged:
- run: "pnpm check && npx lint-staged"
+ check:
+ run: "pnpm check"
diff --git a/package.json b/package.json
index 53ef55d03..94d176a62 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,6 @@
"server:build": "pnpm --filter=server run build",
"docker:build:canary": "./apps/dokploy/docker/build.sh canary",
"typecheck": "pnpm -r run typecheck",
- "format": "prettier --write \"**/*.{ts,tsx,md}\"",
"build": "pnpm -r run build",
"format-and-lint": "biome check .",
"check": "biome check --write --no-errors-on-unmatched --files-ignore-unknown=true",
@@ -24,7 +23,7 @@
"esbuild": "0.20.2",
"tsx": "4.16.2",
"lint-staged": "^15.2.7",
- "@biomejs/biome": "1.8.3",
+ "@biomejs/biome": "1.9.4",
"lefthook": "1.8.4",
"@commitlint/cli": "^19.3.0",
"@commitlint/config-conventional": "^19.2.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index cea8c0535..09d71bbfd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -13,8 +13,8 @@ importers:
.:
devDependencies:
'@biomejs/biome':
- specifier: 1.8.3
- version: 1.8.3
+ specifier: 1.9.4
+ version: 1.9.4
'@commitlint/cli':
specifier: ^19.3.0
version: 19.3.0(@types/node@18.19.42)(typescript@5.5.3)
@@ -682,55 +682,55 @@ packages:
'@balena/dockerignore@1.0.2':
resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==}
- '@biomejs/biome@1.8.3':
- resolution: {integrity: sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==}
+ '@biomejs/biome@1.9.4':
+ resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==}
engines: {node: '>=14.21.3'}
hasBin: true
- '@biomejs/cli-darwin-arm64@1.8.3':
- resolution: {integrity: sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==}
+ '@biomejs/cli-darwin-arm64@1.9.4':
+ resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [darwin]
- '@biomejs/cli-darwin-x64@1.8.3':
- resolution: {integrity: sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==}
+ '@biomejs/cli-darwin-x64@1.9.4':
+ resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [darwin]
- '@biomejs/cli-linux-arm64-musl@1.8.3':
- resolution: {integrity: sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==}
+ '@biomejs/cli-linux-arm64-musl@1.9.4':
+ resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
- '@biomejs/cli-linux-arm64@1.8.3':
- resolution: {integrity: sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==}
+ '@biomejs/cli-linux-arm64@1.9.4':
+ resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
- '@biomejs/cli-linux-x64-musl@1.8.3':
- resolution: {integrity: sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==}
+ '@biomejs/cli-linux-x64-musl@1.9.4':
+ resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
- '@biomejs/cli-linux-x64@1.8.3':
- resolution: {integrity: sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==}
+ '@biomejs/cli-linux-x64@1.9.4':
+ resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
- '@biomejs/cli-win32-arm64@1.8.3':
- resolution: {integrity: sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==}
+ '@biomejs/cli-win32-arm64@1.9.4':
+ resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [win32]
- '@biomejs/cli-win32-x64@1.8.3':
- resolution: {integrity: sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==}
+ '@biomejs/cli-win32-x64@1.9.4':
+ resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [win32]
@@ -6869,39 +6869,39 @@ snapshots:
'@balena/dockerignore@1.0.2': {}
- '@biomejs/biome@1.8.3':
+ '@biomejs/biome@1.9.4':
optionalDependencies:
- '@biomejs/cli-darwin-arm64': 1.8.3
- '@biomejs/cli-darwin-x64': 1.8.3
- '@biomejs/cli-linux-arm64': 1.8.3
- '@biomejs/cli-linux-arm64-musl': 1.8.3
- '@biomejs/cli-linux-x64': 1.8.3
- '@biomejs/cli-linux-x64-musl': 1.8.3
- '@biomejs/cli-win32-arm64': 1.8.3
- '@biomejs/cli-win32-x64': 1.8.3
+ '@biomejs/cli-darwin-arm64': 1.9.4
+ '@biomejs/cli-darwin-x64': 1.9.4
+ '@biomejs/cli-linux-arm64': 1.9.4
+ '@biomejs/cli-linux-arm64-musl': 1.9.4
+ '@biomejs/cli-linux-x64': 1.9.4
+ '@biomejs/cli-linux-x64-musl': 1.9.4
+ '@biomejs/cli-win32-arm64': 1.9.4
+ '@biomejs/cli-win32-x64': 1.9.4
- '@biomejs/cli-darwin-arm64@1.8.3':
+ '@biomejs/cli-darwin-arm64@1.9.4':
optional: true
- '@biomejs/cli-darwin-x64@1.8.3':
+ '@biomejs/cli-darwin-x64@1.9.4':
optional: true
- '@biomejs/cli-linux-arm64-musl@1.8.3':
+ '@biomejs/cli-linux-arm64-musl@1.9.4':
optional: true
- '@biomejs/cli-linux-arm64@1.8.3':
+ '@biomejs/cli-linux-arm64@1.9.4':
optional: true
- '@biomejs/cli-linux-x64-musl@1.8.3':
+ '@biomejs/cli-linux-x64-musl@1.9.4':
optional: true
- '@biomejs/cli-linux-x64@1.8.3':
+ '@biomejs/cli-linux-x64@1.9.4':
optional: true
- '@biomejs/cli-win32-arm64@1.8.3':
+ '@biomejs/cli-win32-arm64@1.9.4':
optional: true
- '@biomejs/cli-win32-x64@1.8.3':
+ '@biomejs/cli-win32-x64@1.9.4':
optional: true
'@braintree/sanitize-url@7.0.2': {}