fix: build issues
This commit is contained in:
parent
3d48bdc9ef
commit
e1cf8d9bfd
|
@ -11,6 +11,6 @@
|
|||
},
|
||||
"aliases": {
|
||||
"components": "src/components",
|
||||
"utils": "~/utils/utils.ts"
|
||||
"utils": "~/utils/utils"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,20 +24,20 @@ CREATE TABLE `service` (
|
|||
`deployed_generation_id` text,
|
||||
`created_at` integer DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade,
|
||||
FOREIGN KEY (`latest_generation_id`) REFERENCES `service_generation`(`id`) ON UPDATE no action ON DELETE no action DEFERRABLE INITIALLY DEFERRED, -- MODIFIED TO ADD DEFERRED CONSTRAINTS
|
||||
FOREIGN KEY (`latest_generation_id`) REFERENCES `service_generation`(`id`) ON UPDATE no action ON DELETE no action,
|
||||
FOREIGN KEY (`deployed_generation_id`) REFERENCES `service_generation`(`id`) ON UPDATE no action ON DELETE no action
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE `service_deployment` (
|
||||
`id` text PRIMARY KEY DEFAULT (uuid_generate_v7()) NOT NULL,
|
||||
`project_deployment_id` text NOT NULL,
|
||||
`project_deployment_id` text,
|
||||
`service_id` text NOT NULL,
|
||||
`created_at` integer DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
`deployed_by` text,
|
||||
`build_logs` blob,
|
||||
`status` integer NOT NULL,
|
||||
FOREIGN KEY (`project_deployment_id`) REFERENCES `project_deployment`(`id`) ON UPDATE no action ON DELETE cascade,
|
||||
FOREIGN KEY (`service_id`) REFERENCES `service_generation`(`id`) ON UPDATE no action ON DELETE cascade,
|
||||
FOREIGN KEY (`service_id`) REFERENCES `service`(`id`) ON UPDATE no action ON DELETE cascade,
|
||||
FOREIGN KEY (`deployed_by`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action
|
||||
);
|
||||
--> statement-breakpoint
|
||||
|
@ -53,7 +53,7 @@ CREATE TABLE `service_domain` (
|
|||
--> statement-breakpoint
|
||||
CREATE TABLE `service_generation` (
|
||||
`id` text PRIMARY KEY DEFAULT (uuid_generate_v7()) NOT NULL,
|
||||
`service_id` text NOT NULL DEFERRABLE INITIALLY DEFERRED,
|
||||
`service_id` text NOT NULL,
|
||||
`deployment_id` text,
|
||||
`source` integer NOT NULL,
|
||||
`environment` text,
|
||||
|
@ -88,9 +88,7 @@ CREATE TABLE `service_generation` (
|
|||
`logging_max_size` text DEFAULT '-1' NOT NULL,
|
||||
`logging_max_files` integer DEFAULT 1 NOT NULL,
|
||||
`created_at` integer DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
|
||||
-- MODIFIED TO ADD DEFERRED CONSTRAINTS
|
||||
FOREIGN KEY (`service_id`) REFERENCES `service`(`id`) ON UPDATE no action ON DELETE cascade DEFERRABLE INITIALLY DEFERRED,
|
||||
FOREIGN KEY (`service_id`) REFERENCES `service`(`id`) ON UPDATE no action ON DELETE cascade,
|
||||
FOREIGN KEY (`deployment_id`) REFERENCES `service_deployment`(`id`) ON UPDATE no action ON DELETE no action
|
||||
);
|
||||
--> statement-breakpoint
|
||||
|
@ -162,4 +160,4 @@ CREATE INDEX `name_project_idx` ON `service` (`name`,`project_id`);--> statement
|
|||
CREATE UNIQUE INDEX `name_project_unq` ON `service` (`name`,`project_id`);--> statement-breakpoint
|
||||
CREATE INDEX `proj_generation_idx` ON `service_generation` (`id`,`service_id`);--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX `users_username_unique` ON `users` (`username`);--> statement-breakpoint
|
||||
CREATE INDEX `username_idx` ON `users` (`username`);
|
||||
CREATE INDEX `username_idx` ON `users` (`username`);
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"version": "5",
|
||||
"version": "6",
|
||||
"dialect": "sqlite",
|
||||
"id": "f5624a74-60b3-4d72-90e0-67670f26b0cd",
|
||||
"id": "4d1c3e48-c40b-401f-bb7b-742335b9ec44",
|
||||
"prevId": "00000000-0000-0000-0000-000000000000",
|
||||
"tables": {
|
||||
"project_deployment": {
|
||||
|
@ -266,7 +266,7 @@
|
|||
"name": "project_deployment_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"service_id": {
|
||||
|
@ -321,10 +321,10 @@
|
|||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
},
|
||||
"service_deployment_service_id_service_generation_id_fk": {
|
||||
"name": "service_deployment_service_id_service_generation_id_fk",
|
||||
"service_deployment_service_id_service_id_fk": {
|
||||
"name": "service_deployment_service_id_service_id_fk",
|
||||
"tableFrom": "service_deployment",
|
||||
"tableTo": "service_generation",
|
||||
"tableTo": "service",
|
||||
"columnsFrom": [
|
||||
"service_id"
|
||||
],
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"version": "5",
|
||||
"version": "6",
|
||||
"dialect": "sqlite",
|
||||
"entries": [
|
||||
{
|
||||
"idx": 0,
|
||||
"version": "5",
|
||||
"when": 1715730366620,
|
||||
"tag": "0000_tidy_vermin",
|
||||
"version": "6",
|
||||
"when": 1716431990235,
|
||||
"tag": "0000_yielding_mongoose",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
/** @type {import("next").NextConfig} */
|
||||
const config = {};
|
||||
const config = {
|
||||
eslint: {
|
||||
// will fix linting closer to a stable release
|
||||
ignoreDuringBuilds: true,
|
||||
},
|
||||
};
|
||||
|
||||
export default config;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"@radix-ui/react-dropdown-menu": "^2.0.6",
|
||||
"@radix-ui/react-icons": "^1.3.0",
|
||||
"@radix-ui/react-label": "^2.0.2",
|
||||
"@radix-ui/react-navigation-menu": "^1.1.4",
|
||||
"@radix-ui/react-radio-group": "^1.1.3",
|
||||
"@radix-ui/react-select": "^2.0.0",
|
||||
"@radix-ui/react-separator": "^1.0.3",
|
||||
|
|
|
@ -29,6 +29,9 @@ dependencies:
|
|||
'@radix-ui/react-label':
|
||||
specifier: ^2.0.2
|
||||
version: 2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0)
|
||||
'@radix-ui/react-navigation-menu':
|
||||
specifier: ^1.1.4
|
||||
version: 1.1.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0)
|
||||
'@radix-ui/react-radio-group':
|
||||
specifier: ^1.1.3
|
||||
version: 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0)
|
||||
|
@ -2119,6 +2122,40 @@ packages:
|
|||
react-remove-scroll: 2.5.5(@types/react@18.2.46)(react@18.2.0)
|
||||
dev: false
|
||||
|
||||
/@radix-ui/react-navigation-menu@1.1.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-Cc+seCS3PmWmjI51ufGG7zp1cAAIRqHVw7C9LOA2TZ+R4hG6rDvHcTqIsEEFLmZO3zNVH72jOOE7kKNy8W+RtA==}
|
||||
peerDependencies:
|
||||
'@types/react': '*'
|
||||
'@types/react-dom': '*'
|
||||
react: ^16.8 || ^17.0 || ^18.0
|
||||
react-dom: ^16.8 || ^17.0 || ^18.0
|
||||
peerDependenciesMeta:
|
||||
'@types/react':
|
||||
optional: true
|
||||
'@types/react-dom':
|
||||
optional: true
|
||||
dependencies:
|
||||
'@babel/runtime': 7.23.9
|
||||
'@radix-ui/primitive': 1.0.1
|
||||
'@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0)
|
||||
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0)
|
||||
'@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0)
|
||||
'@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0)
|
||||
'@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0)
|
||||
'@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0)
|
||||
'@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0)
|
||||
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0)
|
||||
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0)
|
||||
'@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0)
|
||||
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0)
|
||||
'@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.46)(react@18.2.0)
|
||||
'@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0)
|
||||
'@types/react': 18.2.46
|
||||
'@types/react-dom': 18.2.18
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
dev: false
|
||||
|
||||
/@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0):
|
||||
resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==}
|
||||
peerDependencies:
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
export default function ProjectHome() {
|
||||
return <p>hello world</p>;
|
||||
return <p>todo: overall project stats here</p>;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
"use client";
|
||||
|
||||
import Dockerode from "dockerode";
|
||||
import { z } from "zod";
|
||||
import {
|
||||
Form,
|
||||
|
@ -26,7 +27,7 @@ import { type RouterOutputs } from "~/trpc/shared";
|
|||
const formValidator = z.object({
|
||||
replicas: z.coerce.number().int().min(0),
|
||||
maxReplicasPerNode: z.number().int().positive().nullable(),
|
||||
deployMode: z.enum(["replicated", "global"]),
|
||||
deployMode: z.nativeEnum(DockerDeployMode),
|
||||
zeroDowntime: z.boolean(),
|
||||
entrypoint: z.string().optional().nullable(),
|
||||
command: z.string().optional().nullable(),
|
||||
|
@ -41,16 +42,18 @@ export default function DeploymentSettings({
|
|||
service: RouterOutputs["projects"]["services"]["get"];
|
||||
}) {
|
||||
const update = api.projects.services.update.useMutation();
|
||||
const latestGen = service.latestGeneration!;
|
||||
|
||||
const form = useForm(formValidator, {
|
||||
defaultValues: {
|
||||
replicas: service.replicas,
|
||||
maxReplicasPerNode: service.maxReplicasPerNode,
|
||||
deployMode: service.deployMode,
|
||||
zeroDowntime: service.zeroDowntime,
|
||||
entrypoint: service.entrypoint,
|
||||
command: service.command,
|
||||
max_memory: service.max_memory,
|
||||
max_cpu: service.max_cpu,
|
||||
replicas: latestGen.replicas,
|
||||
maxReplicasPerNode: latestGen.maxReplicasPerNode,
|
||||
deployMode: latestGen.deployMode,
|
||||
zeroDowntime: latestGen.zeroDowntime,
|
||||
entrypoint: latestGen.entrypoint,
|
||||
command: latestGen.command,
|
||||
max_memory: latestGen.max_memory,
|
||||
max_cpu: latestGen.max_cpu,
|
||||
},
|
||||
});
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ export default function DomainsList({
|
|||
|
||||
const form = useForm<z.infer<typeof formValidator>>({
|
||||
defaultValues: {
|
||||
domains: service.data?.domains.map((newDomain) => ({
|
||||
domains: service.data?.latestGeneration?.domains.map((newDomain) => ({
|
||||
...newDomain,
|
||||
domainId: newDomain.id,
|
||||
id: undefined,
|
||||
|
@ -68,7 +68,7 @@ export default function DomainsList({
|
|||
// reset the dirty state
|
||||
form.resetField("domains", {
|
||||
defaultValue:
|
||||
service.data?.domains.map((newDomain) => ({
|
||||
service.data?.latestGeneration?.domains.map((newDomain) => ({
|
||||
...newDomain,
|
||||
domainId: newDomain.id,
|
||||
})) ?? [],
|
||||
|
@ -97,7 +97,7 @@ export default function DomainsList({
|
|||
}),
|
||||
|
||||
// domains that don't exist anymore
|
||||
...(service.data?.domains
|
||||
...(service.data?.latestGeneration?.domains
|
||||
.filter(
|
||||
(d) =>
|
||||
!data.domains.some(
|
||||
|
|
|
@ -5,7 +5,7 @@ import { type z } from "zod";
|
|||
import { Label } from "~/components/ui/label";
|
||||
import { SimpleFormField } from "~/hooks/forms";
|
||||
import { ServiceBuildMethod } from "~/server/db/types";
|
||||
import { type formValidator } from "../page";
|
||||
import { type formValidator } from "./_form";
|
||||
|
||||
export default function SourceBuildMethod() {
|
||||
const form = useFormContext<z.infer<typeof formValidator>>();
|
||||
|
|
|
@ -4,7 +4,7 @@ import { useFormContext } from "react-hook-form";
|
|||
import { useDebounce } from "use-debounce";
|
||||
import { type z } from "zod";
|
||||
import { SimpleFormField } from "~/hooks/forms";
|
||||
import { type formValidator } from "../page";
|
||||
import { type formValidator } from "./_form";
|
||||
import GithubRepoPreview from "./GitHubRepoPreview";
|
||||
|
||||
export default function SourceGitHub() {
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
import { z } from "zod";
|
||||
import { ServiceSource, ServiceBuildMethod } from "~/server/db/types";
|
||||
import { zDockerImage } from "~/server/utils/zod";
|
||||
|
||||
export const formValidator = z.object({
|
||||
source: z.nativeEnum(ServiceSource),
|
||||
|
||||
dockerImage: zDockerImage.nullable(),
|
||||
dockerRegistryUsername: z.string().optional(),
|
||||
dockerRegistryPassword: z.string().optional(),
|
||||
|
||||
githubUsername: z.string().optional(),
|
||||
githubRepository: z.string().optional(),
|
||||
githubBranch: z.string().optional(),
|
||||
|
||||
buildMethod: z.nativeEnum(ServiceBuildMethod),
|
||||
buildPath: z.string().default("/"),
|
||||
});
|
|
@ -1,33 +1,17 @@
|
|||
"use client";
|
||||
import { useEffect } from "react";
|
||||
import { toast } from "sonner";
|
||||
import { z } from "zod";
|
||||
import LoadingScreen from "~/components/LoadingScreen";
|
||||
import { Button } from "~/components/ui/button";
|
||||
import { Form } from "~/components/ui/form";
|
||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs";
|
||||
import { FormSubmit, SimpleFormField, useForm } from "~/hooks/forms";
|
||||
import { ServiceBuildMethod, ServiceSource } from "~/server/db/types";
|
||||
import { zDockerImage } from "~/server/utils/zod";
|
||||
import { api } from "~/trpc/react";
|
||||
import { useService } from "../_hooks/service";
|
||||
import SourceBuildMethod from "./_components/BuildMethod";
|
||||
import SourceGitHub from "./_components/SourceGitHub";
|
||||
|
||||
export const formValidator = z.object({
|
||||
source: z.nativeEnum(ServiceSource),
|
||||
|
||||
dockerImage: zDockerImage.nullable(),
|
||||
dockerRegistryUsername: z.string().optional(),
|
||||
dockerRegistryPassword: z.string().optional(),
|
||||
|
||||
githubUsername: z.string().optional(),
|
||||
githubRepository: z.string().optional(),
|
||||
githubBranch: z.string().optional(),
|
||||
|
||||
buildMethod: z.nativeEnum(ServiceBuildMethod),
|
||||
buildPath: z.string().default("/"),
|
||||
});
|
||||
import { formValidator } from "./_components/_form";
|
||||
|
||||
export default function SourcePage() {
|
||||
const { data, refetch } = useService();
|
||||
|
@ -155,7 +139,7 @@ export default function SourcePage() {
|
|||
[ServiceSource.Docker]: "docker",
|
||||
[ServiceSource.GitHub]: "GitHub",
|
||||
[ServiceSource.Git]: "Git",
|
||||
}[data.source] || "docker"
|
||||
}[data.latestGeneration?.source ?? ServiceSource.Docker] || "docker"
|
||||
}
|
||||
className="col-span-2 w-full"
|
||||
>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { Card } from "~/components/ui/card";
|
||||
import UAParser from "ua-parser-js";
|
||||
import { RelativeDate } from "~/components/RelativeDate";
|
||||
import { RelativeDate } from "~/components/Date";
|
||||
|
||||
type SessionData = {
|
||||
lastUA: string | null;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import * as React from "react"
|
||||
import { cva, type VariantProps } from "class-variance-authority"
|
||||
import * as React from "react";
|
||||
import { cva, type VariantProps } from "class-variance-authority";
|
||||
|
||||
import { cn } from "~/utils/utils.ts"
|
||||
import { cn } from "~/utils/utils";
|
||||
|
||||
const badgeVariants = cva(
|
||||
"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
||||
|
@ -20,8 +20,8 @@ const badgeVariants = cva(
|
|||
defaultVariants: {
|
||||
variant: "default",
|
||||
},
|
||||
}
|
||||
)
|
||||
},
|
||||
);
|
||||
|
||||
export interface BadgeProps
|
||||
extends React.HTMLAttributes<HTMLDivElement>,
|
||||
|
@ -30,7 +30,7 @@ export interface BadgeProps
|
|||
function Badge({ className, variant, ...props }: BadgeProps) {
|
||||
return (
|
||||
<div className={cn(badgeVariants({ variant }), className)} {...props} />
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export { Badge, badgeVariants }
|
||||
export { Badge, badgeVariants };
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
"use client"
|
||||
"use client";
|
||||
|
||||
import * as React from "react"
|
||||
import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
|
||||
import { CheckIcon } from "@radix-ui/react-icons"
|
||||
import * as React from "react";
|
||||
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
|
||||
import { CheckIcon } from "@radix-ui/react-icons";
|
||||
|
||||
import { cn } from "~/utils/utils.ts"
|
||||
import { cn } from "~/utils/utils";
|
||||
|
||||
const Checkbox = React.forwardRef<
|
||||
React.ElementRef<typeof CheckboxPrimitive.Root>,
|
||||
|
@ -14,7 +14,7 @@ const Checkbox = React.forwardRef<
|
|||
ref={ref}
|
||||
className={cn(
|
||||
"peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
|
||||
className
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
>
|
||||
|
@ -24,7 +24,7 @@ const Checkbox = React.forwardRef<
|
|||
<CheckIcon className="h-4 w-4" />
|
||||
</CheckboxPrimitive.Indicator>
|
||||
</CheckboxPrimitive.Root>
|
||||
))
|
||||
Checkbox.displayName = CheckboxPrimitive.Root.displayName
|
||||
));
|
||||
Checkbox.displayName = CheckboxPrimitive.Root.displayName;
|
||||
|
||||
export { Checkbox }
|
||||
export { Checkbox };
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
"use client"
|
||||
"use client";
|
||||
|
||||
import * as React from "react"
|
||||
import { Drawer as DrawerPrimitive } from "vaul"
|
||||
import * as React from "react";
|
||||
import { Drawer as DrawerPrimitive } from "vaul";
|
||||
|
||||
import { cn } from "~/utils/utils.ts"
|
||||
import { cn } from "~/utils/utils";
|
||||
|
||||
const Drawer = ({
|
||||
shouldScaleBackground = true,
|
||||
|
@ -13,14 +13,14 @@ const Drawer = ({
|
|||
shouldScaleBackground={shouldScaleBackground}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
Drawer.displayName = "Drawer"
|
||||
);
|
||||
Drawer.displayName = "Drawer";
|
||||
|
||||
const DrawerTrigger = DrawerPrimitive.Trigger
|
||||
const DrawerTrigger = DrawerPrimitive.Trigger;
|
||||
|
||||
const DrawerPortal = DrawerPrimitive.Portal
|
||||
const DrawerPortal = DrawerPrimitive.Portal;
|
||||
|
||||
const DrawerClose = DrawerPrimitive.Close
|
||||
const DrawerClose = DrawerPrimitive.Close;
|
||||
|
||||
const DrawerOverlay = React.forwardRef<
|
||||
React.ElementRef<typeof DrawerPrimitive.Overlay>,
|
||||
|
@ -31,8 +31,8 @@ const DrawerOverlay = React.forwardRef<
|
|||
className={cn("fixed inset-0 z-50 bg-black/80", className)}
|
||||
{...props}
|
||||
/>
|
||||
))
|
||||
DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName
|
||||
));
|
||||
DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
|
||||
|
||||
const DrawerContent = React.forwardRef<
|
||||
React.ElementRef<typeof DrawerPrimitive.Content>,
|
||||
|
@ -44,7 +44,7 @@ const DrawerContent = React.forwardRef<
|
|||
ref={ref}
|
||||
className={cn(
|
||||
"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background",
|
||||
className
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
>
|
||||
|
@ -52,8 +52,8 @@ const DrawerContent = React.forwardRef<
|
|||
{children}
|
||||
</DrawerPrimitive.Content>
|
||||
</DrawerPortal>
|
||||
))
|
||||
DrawerContent.displayName = "DrawerContent"
|
||||
));
|
||||
DrawerContent.displayName = "DrawerContent";
|
||||
|
||||
const DrawerHeader = ({
|
||||
className,
|
||||
|
@ -63,8 +63,8 @@ const DrawerHeader = ({
|
|||
className={cn("grid gap-1.5 p-4 text-center sm:text-left", className)}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
DrawerHeader.displayName = "DrawerHeader"
|
||||
);
|
||||
DrawerHeader.displayName = "DrawerHeader";
|
||||
|
||||
const DrawerFooter = ({
|
||||
className,
|
||||
|
@ -74,8 +74,8 @@ const DrawerFooter = ({
|
|||
className={cn("mt-auto flex flex-col gap-2 p-4", className)}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
DrawerFooter.displayName = "DrawerFooter"
|
||||
);
|
||||
DrawerFooter.displayName = "DrawerFooter";
|
||||
|
||||
const DrawerTitle = React.forwardRef<
|
||||
React.ElementRef<typeof DrawerPrimitive.Title>,
|
||||
|
@ -85,12 +85,12 @@ const DrawerTitle = React.forwardRef<
|
|||
ref={ref}
|
||||
className={cn(
|
||||
"text-lg font-semibold leading-none tracking-tight",
|
||||
className
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
))
|
||||
DrawerTitle.displayName = DrawerPrimitive.Title.displayName
|
||||
));
|
||||
DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
|
||||
|
||||
const DrawerDescription = React.forwardRef<
|
||||
React.ElementRef<typeof DrawerPrimitive.Description>,
|
||||
|
@ -101,8 +101,8 @@ const DrawerDescription = React.forwardRef<
|
|||
className={cn("text-sm text-muted-foreground", className)}
|
||||
{...props}
|
||||
/>
|
||||
))
|
||||
DrawerDescription.displayName = DrawerPrimitive.Description.displayName
|
||||
));
|
||||
DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
|
||||
|
||||
export {
|
||||
Drawer,
|
||||
|
@ -115,4 +115,4 @@ export {
|
|||
DrawerFooter,
|
||||
DrawerTitle,
|
||||
DrawerDescription,
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
"use client"
|
||||
"use client";
|
||||
|
||||
import * as React from "react"
|
||||
import { CheckIcon } from "@radix-ui/react-icons"
|
||||
import * as RadioGroupPrimitive from "@radix-ui/react-radio-group"
|
||||
import * as React from "react";
|
||||
import { CheckIcon } from "@radix-ui/react-icons";
|
||||
import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
|
||||
|
||||
import { cn } from "~/utils/utils.ts"
|
||||
import { cn } from "~/utils/utils";
|
||||
|
||||
const RadioGroup = React.forwardRef<
|
||||
React.ElementRef<typeof RadioGroupPrimitive.Root>,
|
||||
|
@ -16,9 +16,9 @@ const RadioGroup = React.forwardRef<
|
|||
{...props}
|
||||
ref={ref}
|
||||
/>
|
||||
)
|
||||
})
|
||||
RadioGroup.displayName = RadioGroupPrimitive.Root.displayName
|
||||
);
|
||||
});
|
||||
RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
|
||||
|
||||
const RadioGroupItem = React.forwardRef<
|
||||
React.ElementRef<typeof RadioGroupPrimitive.Item>,
|
||||
|
@ -29,7 +29,7 @@ const RadioGroupItem = React.forwardRef<
|
|||
ref={ref}
|
||||
className={cn(
|
||||
"aspect-square h-4 w-4 rounded-full border border-primary text-primary shadow focus:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
||||
className
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
>
|
||||
|
@ -37,8 +37,8 @@ const RadioGroupItem = React.forwardRef<
|
|||
<CheckIcon className="h-3.5 w-3.5 fill-primary" />
|
||||
</RadioGroupPrimitive.Indicator>
|
||||
</RadioGroupPrimitive.Item>
|
||||
)
|
||||
})
|
||||
RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName
|
||||
);
|
||||
});
|
||||
RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
|
||||
|
||||
export { RadioGroup, RadioGroupItem }
|
||||
export { RadioGroup, RadioGroupItem };
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import * as React from "react"
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "~/utils/utils.ts"
|
||||
import { cn } from "~/utils/utils";
|
||||
|
||||
export interface TextareaProps
|
||||
extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}
|
||||
|
@ -11,14 +11,14 @@ const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|||
<textarea
|
||||
className={cn(
|
||||
"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
||||
className
|
||||
className,
|
||||
)}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
}
|
||||
)
|
||||
Textarea.displayName = "Textarea"
|
||||
);
|
||||
},
|
||||
);
|
||||
Textarea.displayName = "Textarea";
|
||||
|
||||
export { Textarea }
|
||||
export { Textarea };
|
||||
|
|
|
@ -20,7 +20,7 @@ export class Docker extends Dockerode {
|
|||
*/
|
||||
static demuxStream() {
|
||||
return new Transform({
|
||||
transform(chunk: Buffer, encoding?: unknown, callback: () => void) {
|
||||
transform(chunk: Buffer, encoding: unknown, callback: () => void) {
|
||||
if (chunk.length < 8) {
|
||||
this.push(chunk);
|
||||
callback();
|
||||
|
|
|
@ -63,7 +63,7 @@ export default class ProjectManager {
|
|||
where: eq(service.projectId, this.projectData.id),
|
||||
});
|
||||
|
||||
return serviceData.map((data) => new ServiceManager(data));
|
||||
return serviceData.map((data) => new ServiceManager(data, this));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -70,7 +70,18 @@ export default class ServiceManager {
|
|||
]);
|
||||
|
||||
// compare the two
|
||||
return diff(deployed, latest);
|
||||
return diff(
|
||||
{
|
||||
...deployed,
|
||||
id: undefined,
|
||||
deploymentId: undefined,
|
||||
},
|
||||
{
|
||||
...latest,
|
||||
id: undefined,
|
||||
deploymentId: undefined,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue