42 changed files with 1354 additions and 679 deletions
+3
View File
@@ -0,0 +1,3 @@
{
"enableAllProjectMcpServers": false
}
+2
View File
@@ -6,6 +6,8 @@
"scripts": { "scripts": {
"dev": "NODE_OPTIONS='--inspect' next dev --turbopack", "dev": "NODE_OPTIONS='--inspect' next dev --turbopack",
"build": "next build", "build": "next build",
"build:compile": "next build --experimental-build-mode compile",
"build:generate": "next build --experimental-build-mode generate",
"start": "next start", "start": "next start",
"lint": "biome check .", "lint": "biome check .",
"lint:fix": "biome check --write .", "lint:fix": "biome check --write .",
@@ -63,14 +63,11 @@ export default async function Page() {
) )
} }
// NOTE: We're keeping the token approach for now, but aware it's not working
const authToken = githubAccount.accessToken;
// Try using GitHub token // Try using GitHub token
let octokit; let octokit;
try { try {
octokit = new Octokit({ octokit = new Octokit({
auth: authToken || process.env.GITHUB_TOKEN auth: process.env.GITHUB_TOKEN
}); });
// Test with a simple request // Test with a simple request
@@ -145,7 +142,7 @@ export default async function Page() {
Failed to access GitHub API Failed to access GitHub API
</div> </div>
<div className="text-red-500 mb-4"> <div className="text-red-500 mb-4">
{authError.message} {authError instanceof Error ? authError.message : 'An error occurred'}
</div> </div>
<div className="text-muted-foreground text-center max-w-md mb-6"> <div className="text-muted-foreground text-center max-w-md mb-6">
<p>This issue may be related to how Clerk is managing the GitHub token.</p> <p>This issue may be related to how Clerk is managing the GitHub token.</p>
@@ -182,7 +179,7 @@ export default async function Page() {
Failed to authenticate with GitHub Failed to authenticate with GitHub
</div> </div>
<div className="text-red-500"> <div className="text-red-500">
{error.message} {error instanceof Error ? error.message : 'Unknown error occurred'}
</div> </div>
</div> </div>
</PageWrapper> </PageWrapper>
@@ -4,7 +4,7 @@ import { useEffect, useState } from 'react'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
import { X } from 'lucide-react' import { X } from 'lucide-react'
import { useTheme } from 'next-themes' import { useTheme } from 'next-themes'
import { useOnboarding } from '@/components/onboarding/useOnboarding' import { useOnboarding } from '@/components/onboarding/store'
import { ConnectStep } from '@/components/onboarding/connect-step/connect-step' import { ConnectStep } from '@/components/onboarding/connect-step/connect-step'
import { ConfigureStep } from '@/components/onboarding/configure-step/configure-step' import { ConfigureStep } from '@/components/onboarding/configure-step/configure-step'
import { DeployStep } from '@/components/onboarding/deploy-step/deploy-step' import { DeployStep } from '@/components/onboarding/deploy-step/deploy-step'
@@ -30,7 +30,7 @@ export default function DeploymentsPage() {
// State for deployment logs modal // State for deployment logs modal
const [isLogsOpen, setIsLogsOpen] = useState(false); const [isLogsOpen, setIsLogsOpen] = useState(false);
const [selectedDeploymentId, setSelectedDeploymentId] = useState<string | null>(null); const [, setSelectedDeploymentId] = useState<string | null>(null);
const [deploymentLogs, setDeploymentLogs] = useState<string>(''); const [deploymentLogs, setDeploymentLogs] = useState<string>('');
// Create a default deployment // Create a default deployment
@@ -48,19 +48,6 @@ export default function DeploymentsPage() {
} }
}; };
const secondDeployment: Deployment = {
id: 'previous',
branch: 'feature/new-ui',
status: 'COMPLETED',
isCurrent: false,
createdAt: Date.now() - 3 * 24 * 60 * 60 * 1000, // 3 days ago
applicationDeploymentRecordData: {
url: repoData ? `https://dev.${repoData.name.toLowerCase()}.example.com` : 'https://dev.example.com'
},
createdBy: {
name: repoData?.owner?.login || 'username'
}
};
// Initialize with empty data for testing the empty state // Initialize with empty data for testing the empty state
// Comment this out to see the mock deployments // Comment this out to see the mock deployments
@@ -79,7 +66,9 @@ export default function DeploymentsPage() {
{ {
id: '1', id: '1',
name: repoData ? `${repoData.name.toLowerCase()}.example.com` : 'example.com', name: repoData ? `${repoData.name.toLowerCase()}.example.com` : 'example.com',
branch: 'main', // Add missing branch
status: 'ACTIVE', status: 'ACTIVE',
createdAt: Date.now(), // Add missing createdAt
isCustom: false isCustom: false
} }
]; ];
@@ -3,12 +3,7 @@
import { useState } from "react"; import { useState } from "react";
import { LoadingOverlay } from "@/components/foundation/loading/loading-overlay"; import { LoadingOverlay } from "@/components/foundation/loading/loading-overlay";
import { PlusIcon, ChevronDownIcon, ChevronUpIcon, PencilIcon, TrashIcon } from "lucide-react"; import { PlusIcon, ChevronDownIcon, ChevronUpIcon, PencilIcon, TrashIcon } from "lucide-react";
import type { EnvVarItem } from '@/types'
interface EnvVarItem {
key: string;
value: string;
isEditing?: boolean;
}
interface EnvGroupProps { interface EnvGroupProps {
title: string; title: string;
@@ -204,7 +199,7 @@ export default function EnvVarsPage() {
/> />
<button <button
className="p-2 hover:bg-accent hover:text-accent-foreground rounded-md text-foreground transition-colors" className="p-2 hover:bg-accent hover:text-accent-foreground rounded-md text-foreground transition-colors"
onClick={() => updateVariable(env, index, variable.key, variable.value)} onClick={() => updateVariable(env, index, variable.key || '', variable.value || '')}
> >
Save Save
</button> </button>
@@ -278,11 +278,9 @@ export default function ProjectSettingsPage({ project, onProjectUpdated }: Proje
Select account Select account
</Label> </Label>
<Dropdown <Dropdown
label="Select" placeholder="Select"
options={accountOptions} options={accountOptions}
selectedValue={selectedAccount} onChange={(option) => setSelectedAccount(option.value)}
onSelect={(value) => setSelectedAccount(value)}
className="w-full mt-1"
/> />
</div> </div>
@@ -1,159 +0,0 @@
'use client'
import { useEffect, useState } from 'react'
import { PageWrapper } from '@/components/foundation'
import { FixedProjectCard } from '@/components/projects/project/ProjectCard/FixedProjectCard'
import { Button } from '@workspace/ui/components/button'
import { Shapes } from 'lucide-react'
import { useAuth } from '@clerk/nextjs'
interface Deployment {
id: string
name: string
repositoryId: string
status: 'running' | 'complete' | 'failed'
url?: string
branch: string
createdAt: string
createdBy: {
name: string
}
}
export default function ProjectsPage() {
const [deployments, setDeployments] = useState<Deployment[]>([])
const [isLoading, setIsLoading] = useState<boolean>(true)
const [error, setError] = useState<string | null>(null)
const { isLoaded: isAuthLoaded, userId } = useAuth()
useEffect(() => {
async function fetchDeployments() {
if (!isAuthLoaded) {
return;
}
setIsLoading(true);
try {
if (!userId) {
setError('Not authenticated');
return;
}
// In a real implementation, you would query your GraphQL backend
// For now, we'll mock some deployments
const mockDeployments: Deployment[] = [
{
id: 'dep_abc123',
name: 'My Project',
repositoryId: '123456',
status: 'complete',
url: 'https://my-project.example.com',
branch: 'main',
createdAt: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),
createdBy: {
name: 'John Doe'
}
},
{
id: 'dep_def456',
name: 'Another Project',
repositoryId: '789012',
status: 'running',
branch: 'develop',
createdAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(),
createdBy: {
name: 'Jane Smith'
}
}
];
setDeployments(mockDeployments);
} catch (err) {
console.error('Error fetching deployments:', err)
setError('Failed to fetch deployments')
} finally {
setIsLoading(false)
}
}
fetchDeployments()
}, [isAuthLoaded, userId]);
return (
<PageWrapper
header={{
title: 'Projects',
actions: [{ label: 'Create Project', href: '/projects/create' }]
}}
layout="bento"
className="pb-0"
>
{isLoading ? (
<div className="md:col-span-3 flex justify-center items-center min-h-[600px]">
<div className="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-primary"></div>
</div>
) : error ? (
<div className="md:col-span-3 border border-gray-800 rounded-lg min-h-[600px] flex flex-col items-center justify-center p-6">
<div className="mb-6">
<div className="flex flex-col items-center">
<Shapes size={64} className="stroke-current" />
</div>
</div>
<h2 className="text-xl font-semibold mb-2">Error: {error}</h2>
<p className="text-gray-400 text-center max-w-md mb-6">
There was an error loading your deployments.
</p>
<Button
className="bg-white text-black hover:bg-gray-200"
onClick={() => window.location.reload()}
>
Try Again
</Button>
</div>
) : deployments.length === 0 ? (
<div className="md:col-span-3 border border-gray-800 rounded-lg min-h-[600px] flex flex-col items-center justify-center p-6">
<div className="mb-6">
<div className="flex flex-col items-center">
<Shapes size={64} className="stroke-current" />
</div>
</div>
<h2 className="text-xl font-semibold mb-2">Deploy your first app</h2>
<p className="text-gray-400 text-center max-w-md mb-6">
You haven't deployed any projects yet. Start by importing a repository from your GitHub account.
</p>
<Button
className="bg-white text-black hover:bg-gray-200"
onClick={() => window.location.href = '/projects/create'}
>
Create Project
</Button>
</div>
) : (
<div className="md:col-span-3">
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{deployments.map((deployment) => (
<FixedProjectCard
project={{
id: deployment.id,
name: deployment.name,
deployments: [{
applicationDeploymentRecordData: {
url: deployment.url
},
branch: deployment.branch,
createdAt: deployment.createdAt,
createdBy: deployment.createdBy
}]
}}
key={deployment.id}
status={deployment.status === 'complete' ? 'success' :
deployment.status === 'running' ? 'pending' : 'error'}
/>
))}
</div>
</div>
)}
</PageWrapper>
)
}
@@ -42,6 +42,7 @@ export default function ProjectOverviewPage() {
const [deployments, setDeployments] = useState<any[]>([]); const [deployments, setDeployments] = useState<any[]>([]);
const [filteredDeployments, setFilteredDeployments] = useState<any[]>([]); const [filteredDeployments, setFilteredDeployments] = useState<any[]>([]);
const [isLogsOpen, setIsLogsOpen] = useState(false); const [isLogsOpen, setIsLogsOpen] = useState(false);
const [, setSelectedDeploymentId] = useState<string | null>(null);
const [deploymentLogs, setDeploymentLogs] = useState<string>(''); const [deploymentLogs, setDeploymentLogs] = useState<string>('');
// Load project data // Load project data
@@ -138,18 +139,25 @@ export default function ProjectOverviewPage() {
}; };
// Handle deployment logs // Handle deployment logs
const handleViewLogs = () => { const handleViewLogs = (deploymentId: string) => {
const mockLogs = `[2025-02-12 10:03:12] INFO Starting deployment process for service: ${project?.name} setSelectedDeploymentId(deploymentId);
// Mock logs data
const mockLogs = `[2025-02-12 10:03:12] INFO Starting deployment process for service: api-gateway
[2025-02-12 10:03:14] INFO Fetching latest commit from main branch (commit: a1b2c3d) [2025-02-12 10:03:14] INFO Fetching latest commit from main branch (commit: a1b2c3d)
[2025-02-12 10:03:15] INFO Building Docker image: registry.company.com/${project?.name}:latest [2025-02-12 10:03:15] INFO Building Docker image: registry.company.com/api-gateway:latest
[2025-02-12 10:03:26] INFO Running security scan on built image [2025-02-12 10:03:26] INFO Running security scan on built image
[2025-02-12 10:03:27] WARNING Medium severity vulnerability detected in package 'openssl'
[2025-02-12 10:03:30] INFO Pushing image to container registry [2025-02-12 10:03:30] INFO Pushing image to container registry
[2025-02-12 10:03:35] INFO Updating deployment configuration [2025-02-12 10:03:35] INFO Updating Kubernetes deployment
[2025-02-12 10:03:40] INFO Scaling down old pods [2025-02-12 10:03:40] INFO Scaling down old pods
[2025-02-12 10:03:42] INFO Scaling up new pods [2025-02-12 10:03:42] INFO Scaling up new pods
[2025-02-12 10:03:50] INFO Running health checks on new pods [2025-02-12 10:03:50] INFO Running health checks on new pods
[2025-02-12 10:03:55] INFO Deployment completed successfully [2025-02-12 10:03:52] ERROR Pod 'api-gateway-7df9bbb500-tx2k4' failed readiness probe (502 Bad Gateway)
[2025-02-12 10:03:56] INFO Service is now live at ${currentDeployment?.applicationDeploymentRecordData?.url}`; [2025-02-12 10:03:55] INFO Retrying deployment with previous stable image
[2025-02-12 10:04:03] INFO Rolling back to registry.company.com/api-gateway:previous
[2025-02-12 10:04:10] INFO Deployment rolled back successfully
[2025-02-12 10:04:11] ERROR Deployment failed, please review logs and fix errors`;
setDeploymentLogs(mockLogs); setDeploymentLogs(mockLogs);
setIsLogsOpen(true); setIsLogsOpen(true);
@@ -156,7 +156,7 @@ export default function TestConnectionPage() {
// Set default org if available // Set default org if available
if (orgsData.organizations && orgsData.organizations.length > 0) { if (orgsData.organizations && orgsData.organizations.length > 0) {
setSelectedOrg(orgsData.organizations[0].slug) setSelectedOrg(orgsData.organizations[0]!.slug)
} }
} catch (error) { } catch (error) {
console.error('Error fetching organizations:', error) console.error('Error fetching organizations:', error)
@@ -230,7 +230,7 @@ const fetchDeployers = async () => {
// Auto-select first deployer if available // Auto-select first deployer if available
if (deployersData.deployers && deployersData.deployers.length > 0) { if (deployersData.deployers && deployersData.deployers.length > 0) {
setSelectedDeployer(deployersData.deployers[0].deployerLrn) setSelectedDeployer(deployersData.deployers[0]!.deployerLrn)
} }
} catch (error) { } catch (error) {
console.error('Error fetching deployers:', error) console.error('Error fetching deployers:', error)
+1 -1
View File
@@ -194,7 +194,7 @@ Issued At: ${issuedAt}`
setDebugInfo(prev => `${prev}\nValidation response: ${JSON.stringify(responseData)}`) setDebugInfo(prev => `${prev}\nValidation response: ${JSON.stringify(responseData)}`)
// If successful, we're done // If successful, we're done
if (response.ok && responseData.success) { if (response.ok && (responseData as any).success) {
console.log('Authentication successful!') console.log('Authentication successful!')
setDebugInfo(prev => `${prev}\nAuthentication successful!`) setDebugInfo(prev => `${prev}\nAuthentication successful!`)
@@ -8,9 +8,10 @@ import {
DropdownMenuTrigger DropdownMenuTrigger
} from '@workspace/ui/components/dropdown-menu' } from '@workspace/ui/components/dropdown-menu'
import { cn } from '@workspace/ui/lib/utils' import { cn } from '@workspace/ui/lib/utils'
import { MoreVertical } from 'lucide-react' import { MoreVertical, ExternalLink } from 'lucide-react'
import Link from 'next/link' import Link from 'next/link'
import type { ReactNode } from 'react' import type { ReactNode } from 'react'
import type { LucideIcon } from 'lucide-react'
/** /**
* Configuration for header action buttons/links * Configuration for header action buttons/links
@@ -19,6 +20,7 @@ import type { ReactNode } from 'react'
* - Use onClick for JS actions OR href for navigation (not both) * - Use onClick for JS actions OR href for navigation (not both)
* - Multiple visual styles via variant prop * - Multiple visual styles via variant prop
* - Optional primary emphasis for main call-to-action * - Optional primary emphasis for main call-to-action
* - Optional icon support
*/ */
export interface PageAction { export interface PageAction {
/** /**
@@ -27,6 +29,23 @@ export interface PageAction {
*/ */
label: string label: string
/**
* Optional icon for the action
* @remarks
* - Can be string identifier or Lucide icon component
* - Common values: 'external-link', 'plus', 'edit', etc.
* - Displayed alongside the label
*/
icon?: string | LucideIcon
/**
* Whether this is an external link
* @remarks
* - When true, opens in new tab/window
* - Automatically adds external link icon if no icon specified
*/
external?: boolean
/** /**
* Visual style variant for the button * Visual style variant for the button
* @remarks * @remarks
@@ -112,6 +131,14 @@ export interface PageHeaderProps {
*/ */
subtitle?: string | ReactNode subtitle?: string | ReactNode
/**
* Additional description text
* @remarks
* - Displayed below subtitle
* - Useful for longer explanatory text
*/
description?: string
/** /**
* Array of action buttons/links * Array of action buttons/links
* @remarks * @remarks
@@ -119,6 +146,7 @@ export interface PageHeaderProps {
* - Mobile: Primary actions shown, secondary in dropdown * - Mobile: Primary actions shown, secondary in dropdown
* - Actions can be buttons (onClick) or links (href) * - Actions can be buttons (onClick) or links (href)
* - Support multiple visual styles via variant prop * - Support multiple visual styles via variant prop
* - Support icons and external links
* *
* @see {@link PageAction} for detailed action configuration * @see {@link PageAction} for detailed action configuration
* *
@@ -128,12 +156,15 @@ export interface PageHeaderProps {
* { * {
* label: "Create New", * label: "Create New",
* isPrimary: true, * isPrimary: true,
* icon: "plus",
* onClick: () => setOpen(true) * onClick: () => setOpen(true)
* }, * },
* { * {
* label: "View All", * label: "View All",
* href: "/items", * href: "/items",
* variant: "outline" * variant: "outline",
* icon: "external-link",
* external: true
* } * }
* ]} * ]}
* ``` * ```
@@ -152,102 +183,11 @@ export interface PageHeaderProps {
/** /**
* A responsive page header component with title, subtitle, and actions. * A responsive page header component with title, subtitle, and actions.
*
* @description
* PageHeader provides a consistent header structure with:
* - Prominent title as h1
* - Optional subtitle or custom component
* - Configurable action buttons/links
* - Responsive layout with mobile optimization
* - Customizable styling
*
* @keywords header, page-title, action-buttons, responsive-header, foundation-component
* @category Layout
* @scope Foundation
*
* @usage
* Common patterns:
*
* Basic title only:
* ```tsx
* <PageHeader title="Dashboard" />
* ```
*
* With subtitle and primary action:
* ```tsx
* <PageHeader
* title="Projects"
* subtitle="Your active projects"
* actions={[
* { label: "New Project", isPrimary: true, onClick: handleCreate }
* ]}
* />
* ```
*
* With search component and multiple actions:
* ```tsx
* <PageHeader
* title="Team Members"
* subtitle={<SearchInput placeholder="Search members..." />}
* actions={[
* { label: "Invite", isPrimary: true, onClick: handleInvite },
* { label: "Export", variant: "outline", onClick: handleExport },
* { label: "Settings", href: "/team/settings", variant: "ghost" }
* ]}
* />
* ```
*
* With navigation actions:
* ```tsx
* <PageHeader
* title="Edit Profile"
* actions={[
* { label: "Save", isPrimary: true, onClick: handleSave },
* { label: "Cancel", href: "/profile", variant: "ghost" }
* ]}
* />
* ```
*
* @example
* ```tsx
* <PageHeader
* title="Dashboard"
* subtitle="Welcome back!"
* actions={[
* {
* label: "New Item",
* isPrimary: true,
* onClick: () => console.log("clicked")
* }
* ]}
* className="mb-8"
* />
* ```
*
* @related {@link PageWrapper} - Often used together for page layout
* @related {@link Button} - Used for rendering actions
* @composition Uses {@link DropdownMenu} for mobile action menu
*
* @cssUtilities
* - flex-col/flex-row: Responsive layout
* - gap-6/gap-2: Consistent spacing
* - text-2xl/text-[30px]: Responsive typography
* - text-foreground/text-muted-foreground: Text hierarchy
*
* @accessibility
* - Uses semantic h1 for title
* - Maintains text contrast ratios
* - Dropdown menu is keyboard navigable
* - Preserves action button/link semantics
*
* @performance
* - Conditional rendering of subtitle and actions
* - Mobile-first CSS with responsive modifiers
* - Efficient action rendering with key prop
*/ */
export default function PageHeader({ export default function PageHeader({
title, title,
subtitle, subtitle,
description,
actions = [], actions = [],
className className
}: PageHeaderProps) { }: PageHeaderProps) {
@@ -255,21 +195,51 @@ export default function PageHeader({
const primaryActions = actions.filter((action) => action.isPrimary) const primaryActions = actions.filter((action) => action.isPrimary)
const secondaryActions = actions.filter((action) => !action.isPrimary) const secondaryActions = actions.filter((action) => !action.isPrimary)
// Get icon component from string or return the component directly
const getIconComponent = (icon: string | LucideIcon | undefined) => {
if (!icon) return null
if (typeof icon === 'string') {
switch (icon) {
case 'external-link':
return ExternalLink
default:
return ExternalLink // fallback
}
}
return icon
}
// Render an action (either as button or link) // Render an action (either as button or link)
const renderAction = (action: PageAction, key: string) => { const renderAction = (action: PageAction, key: string) => {
const variant = action.variant || (action.isPrimary ? 'default' : 'outline') const variant = action.variant || (action.isPrimary ? 'default' : 'outline')
const IconComponent = getIconComponent(action.icon || (action.external ? 'external-link' : undefined))
const content = (
<>
{action.label}
{IconComponent && <IconComponent className="h-4 w-4 ml-2" />}
</>
)
if (action.href) { if (action.href) {
return ( return (
<Button key={key} variant={variant} asChild> <Button key={key} variant={variant} asChild>
<Link href={action.href}>{action.label}</Link> <Link
href={action.href}
target={action.external ? '_blank' : undefined}
rel={action.external ? 'noopener noreferrer' : undefined}
>
{content}
</Link>
</Button> </Button>
) )
} }
return ( return (
<Button key={key} variant={variant} onClick={action.onClick}> <Button key={key} variant={variant} onClick={action.onClick}>
{action.label} {content}
</Button> </Button>
) )
} }
@@ -292,6 +262,11 @@ export default function PageHeader({
)} )}
</div> </div>
)} )}
{description && (
<p className="text-sm text-muted-foreground mt-1">
{description}
</p>
)}
</div> </div>
{actions.length > 0 && ( {actions.length > 0 && (
@@ -320,7 +295,16 @@ export default function PageHeader({
{secondaryActions.map((action) => {secondaryActions.map((action) =>
action.href ? ( action.href ? (
<DropdownMenuItem asChild key={action.label}> <DropdownMenuItem asChild key={action.label}>
<Link href={action.href}>{action.label}</Link> <Link
href={action.href}
target={action.external ? '_blank' : undefined}
rel={action.external ? 'noopener noreferrer' : undefined}
>
{action.label}
{getIconComponent(action.icon || (action.external ? 'external-link' : undefined)) && (
<ExternalLink className="h-4 w-4 ml-2" />
)}
</Link>
</DropdownMenuItem> </DropdownMenuItem>
) : ( ) : (
<DropdownMenuItem <DropdownMenuItem
@@ -30,7 +30,7 @@
'use client' 'use client'
import { useState } from 'react' import { useState } from 'react'
import { useWallet } from '@/context/WalletContextProvider' import { useWallet } from '@/context/WalletContext'
import { Button } from '@workspace/ui/components/button' import { Button } from '@workspace/ui/components/button'
import { import {
DropdownMenu, DropdownMenu,
@@ -269,7 +269,7 @@ const OnboardingDialog: React.FC<OnboardingDialogProps> = ({
defaultOpen = false, defaultOpen = false,
onClose onClose
}) => { }) => {
const { nextStep, setFormData, formData, currentStep } = useOnboarding() const { nextStep, setFormData, formData, currentStep, previousStep } = useOnboarding()
const [selectedRepo, setSelectedRepo] = useState<string>(formData.githubRepo || '') const [selectedRepo, setSelectedRepo] = useState<string>(formData.githubRepo || '')
const [isImportMode, setIsImportMode] = useState(true) const [isImportMode, setIsImportMode] = useState(true)
const [isOpen, setIsOpen] = useState(defaultOpen) const [isOpen, setIsOpen] = useState(defaultOpen)
@@ -489,7 +489,7 @@ const OnboardingDialog: React.FC<OnboardingDialogProps> = ({
<Button <Button
variant="outline" variant="outline"
className="text-zinc-400 bg-zinc-900 border-zinc-800 hover:bg-zinc-800" className="text-zinc-400 bg-zinc-900 border-zinc-800 hover:bg-zinc-800"
onClick={() => useOnboarding.getState().previousStep()} onClick={() => previousStep()}
> >
Previous Previous
</Button> </Button>
@@ -527,7 +527,7 @@ const OnboardingDialog: React.FC<OnboardingDialogProps> = ({
<Button <Button
variant="outline" variant="outline"
className="text-zinc-400 bg-zinc-900 border-zinc-800 hover:bg-zinc-800" className="text-zinc-400 bg-zinc-900 border-zinc-800 hover:bg-zinc-800"
onClick={() => useOnboarding.getState().previousStep()} onClick={() => previousStep()}
> >
Previous Previous
</Button> </Button>
@@ -4,7 +4,7 @@
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import { PlusCircle, Loader2, AlertTriangle, Info } from 'lucide-react' import { PlusCircle, Loader2, AlertTriangle, Info } from 'lucide-react'
import { useTheme } from 'next-themes' import { useTheme } from 'next-themes'
import { useOnboarding } from '@/components/onboarding/useOnboarding' import { useOnboarding } from '@/components/onboarding/store'
import { useGQLClient } from '@/context' import { useGQLClient } from '@/context'
import { useWallet } from '@/context/WalletContext' import { useWallet } from '@/context/WalletContext'
import { Button } from '@workspace/ui/components/button' import { Button } from '@workspace/ui/components/button'
@@ -16,6 +16,7 @@ import { Alert, AlertDescription } from '@workspace/ui/components/alert'
import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card' import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card'
import { Badge } from '@workspace/ui/components/badge' import { Badge } from '@workspace/ui/components/badge'
import { toast } from 'sonner' import { toast } from 'sonner'
import { adaptDeployers } from '../../../utils/typeAdapters';
interface Deployer { interface Deployer {
deployerLrn: string deployerLrn: string
@@ -93,11 +94,11 @@ export function ConfigureStep() {
setIsLoadingDeployers(true) setIsLoadingDeployers(true)
const deployersData = await gqlClient.getDeployers() const deployersData = await gqlClient.getDeployers()
console.log('Available deployers:', deployersData) console.log('Available deployers:', deployersData)
setDeployers(deployersData.deployers || []) setDeployers(adaptDeployers(deployersData.deployers || []));
// Auto-select first deployer if available and none selected // Auto-select first deployer if available and none selected
if (deployersData.deployers && deployersData.deployers.length > 0 && !selectedLrn) { if (deployersData.deployers && deployersData.deployers.length > 0 && !selectedLrn) {
setSelectedLrn(deployersData.deployers[0].deployerLrn) setSelectedLrn(deployersData.deployers[0]!.deployerLrn)
} }
} catch (error) { } catch (error) {
console.error('Error fetching deployers:', error) console.error('Error fetching deployers:', error)
@@ -117,7 +118,7 @@ export function ConfigureStep() {
// Auto-select first organization if available and none selected // Auto-select first organization if available and none selected
if (orgsData.organizations && orgsData.organizations.length > 0 && !selectedOrg) { if (orgsData.organizations && orgsData.organizations.length > 0 && !selectedOrg) {
setSelectedOrg(orgsData.organizations[0].slug) setSelectedOrg(orgsData.organizations[0]!.slug)
} }
} catch (error) { } catch (error) {
console.error('Error fetching organizations:', error) console.error('Error fetching organizations:', error)
@@ -142,15 +143,19 @@ export function ConfigureStep() {
// Update environment variable // Update environment variable
const updateEnvVar = (index: number, field: 'key' | 'value', value: string) => { const updateEnvVar = (index: number, field: 'key' | 'value', value: string) => {
const newEnvVars = [...envVars] const newEnvVars = [...envVars]
if (newEnvVars[index]) {
newEnvVars[index][field] = value newEnvVars[index][field] = value
}
setEnvVars(newEnvVars) setEnvVars(newEnvVars)
} }
// Toggle environment for variable // Toggle environment for variable
const toggleEnvironment = (index: number, environment: string) => { const toggleEnvironment = (index: number, environment: string) => {
const newEnvVars = [...envVars] const newEnvVars = [...envVars]
if (newEnvVars[index]?.environments) {
const currentEnvs = newEnvVars[index].environments const currentEnvs = newEnvVars[index].environments
if (currentEnvs.includes(environment)) { if (currentEnvs.includes(environment)) {
newEnvVars[index].environments = currentEnvs.filter(env => env !== environment) newEnvVars[index].environments = currentEnvs.filter(env => env !== environment)
} else { } else {
@@ -164,6 +169,7 @@ export function ConfigureStep() {
setEnvVars(newEnvVars) setEnvVars(newEnvVars)
} }
}
// Toggle deployment option // Toggle deployment option
const toggleDeployOption = (option: 'auction' | 'lrn') => { const toggleDeployOption = (option: 'auction' | 'lrn') => {
@@ -5,7 +5,7 @@ import { useState, useEffect } from 'react'
import { Github, Wallet, CheckCircle2, AlertTriangle, Loader2, ExternalLink, ChevronDown } from 'lucide-react' import { Github, Wallet, CheckCircle2, AlertTriangle, Loader2, ExternalLink, ChevronDown } from 'lucide-react'
import { useTheme } from 'next-themes' import { useTheme } from 'next-themes'
import { SignIn } from '@clerk/nextjs' import { SignIn } from '@clerk/nextjs'
import { useOnboarding } from '@/components/onboarding/useOnboarding' import { useOnboarding } from '@/components/onboarding/store'
import { useAuthStatus } from '@/hooks/useAuthStatus' import { useAuthStatus } from '@/hooks/useAuthStatus'
import { useRepoData } from '@/hooks/useRepoData' import { useRepoData } from '@/hooks/useRepoData'
import { Button } from '@workspace/ui/components/button' import { Button } from '@workspace/ui/components/button'
@@ -17,6 +17,8 @@ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@workspace/
import { toast } from 'sonner' import { toast } from 'sonner'
import { GitHubBackendAuth } from '@/components/GitHubBackendAuth' import { GitHubBackendAuth } from '@/components/GitHubBackendAuth'
import { AVAILABLE_TEMPLATES, type TemplateDetail } from '@/constants/templates' import { AVAILABLE_TEMPLATES, type TemplateDetail } from '@/constants/templates'
import { Template } from '@/types/onboarding'
import { adaptOptionalTemplate } from '@/utils/typeAdapters'
interface Repository { interface Repository {
id: string | number id: string | number
@@ -32,8 +34,8 @@ export function ConnectStep() {
// Repository vs Template selection // Repository vs Template selection
const [selectedRepo, setSelectedRepo] = useState<string>(formData.githubRepo || '') const [selectedRepo, setSelectedRepo] = useState<string>(formData.githubRepo || '')
const [selectedTemplate, setSelectedTemplate] = useState<TemplateDetail | undefined>( const [selectedTemplate, setSelectedTemplate] = useState(
formData.template || undefined adaptOptionalTemplate(formData.template)
) )
const [projectName, setProjectName] = useState<string>(formData.projectName || '') const [projectName, setProjectName] = useState<string>(formData.projectName || '')
const [isImportMode, setIsImportMode] = useState(true) const [isImportMode, setIsImportMode] = useState(true)
@@ -44,8 +46,6 @@ export function ConnectStep() {
// Auth status hook // Auth status hook
const { const {
clerk, clerk,
wallet,
backend,
isFullyAuthenticated, isFullyAuthenticated,
isReady, isReady,
missing, missing,
@@ -169,7 +169,7 @@ export function ConnectStep() {
setFormData({ setFormData({
deploymentMode: isImportMode ? 'repository' : 'template', deploymentMode: isImportMode ? 'repository' : 'template',
githubRepo: isImportMode ? selectedRepo : '', githubRepo: isImportMode ? selectedRepo : '',
template: !isImportMode ? selectedTemplate : undefined, template: !isImportMode ? (selectedTemplate as Template) : undefined,
projectName: finalProjectName projectName: finalProjectName
}) })
@@ -209,7 +209,7 @@ export function ConnectStep() {
<div className="flex items-center gap-2 px-4 py-2 bg-zinc-100 dark:bg-zinc-800 rounded-md cursor-pointer hover:bg-zinc-200 dark:hover:bg-zinc-700"> <div className="flex items-center gap-2 px-4 py-2 bg-zinc-100 dark:bg-zinc-800 rounded-md cursor-pointer hover:bg-zinc-200 dark:hover:bg-zinc-700">
<Github className="h-4 w-4" /> <Github className="h-4 w-4" />
<span className="text-sm font-medium"> <span className="text-sm font-medium">
{clerk.user?.externalAccounts?.find(acc => acc.provider === 'github')?.username || 'git-account'} {clerk.user?.externalAccounts?.find((acc: any) => acc.provider === 'github')?.username || 'git-account'}
</span> </span>
<ChevronDown className="h-4 w-4" /> <ChevronDown className="h-4 w-4" />
</div> </div>
@@ -90,6 +90,7 @@ export const ConnectStep = () => {
<StepHeader <StepHeader
title="Connect" title="Connect"
description="Connect and import a GitHub repo or start from a template" description="Connect and import a GitHub repo or start from a template"
icon={<GitBranch />}
/> />
{/* Git account selector */} {/* Git account selector */}
@@ -4,8 +4,7 @@
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import { useTheme } from 'next-themes' import { useTheme } from 'next-themes'
import { Github, Loader2, AlertTriangle, CheckCircle2 } from 'lucide-react' import { Github, Loader2, AlertTriangle, CheckCircle2 } from 'lucide-react'
import { useOnboarding } from '@/components/onboarding/useOnboarding' import { useOnboarding } from '@/components/onboarding/store'
import { useGQLClient } from '@/context'
import { useWallet } from '@/context/WalletContext' import { useWallet } from '@/context/WalletContext'
import { useDeployment } from '@/hooks/useDeployment' import { useDeployment } from '@/hooks/useDeployment'
import { useTemplateDeployment } from '@/hooks/useTemplate' import { useTemplateDeployment } from '@/hooks/useTemplate'
@@ -117,16 +116,17 @@ export function DeployStep() {
} }
const config = { const config = {
template: formData.template, template: {
...formData.template,
id: formData.template?.id || '',
icon: formData.template?.icon || ''
},
projectName: formData.projectName, projectName: formData.projectName,
organizationSlug: formData.selectedOrg, organizationSlug: formData.selectedOrg,
environmentVariables: formData.environmentVariables || [], environmentVariables: formData.environmentVariables || [],
deployerLrn: formData.selectedLrn deployerLrn: formData.selectedLrn
} };
const result = await deployTemplate(config);
console.log('Deploying template with config:', config)
const result = await deployTemplate(config)
// Save deployment results // Save deployment results
setFormData({ setFormData({
@@ -12,7 +12,6 @@
export { default as Onboarding } from './Onboarding' export { default as Onboarding } from './Onboarding'
export { export {
default as OnboardingDialog, default as OnboardingDialog,
hasCompletedOnboarding
} from './OnboardingDialog' } from './OnboardingDialog'
// Step components // Step components
@@ -1,86 +1,120 @@
'use client' // src/components/onboarding/useOnboarding.ts
import { useState } from 'react'
import { create } from 'zustand' import type {
import { persist } from 'zustand/middleware' OnboardingFormData} from '@/types'
// Step type for navigation
export type Step = 'connect' | 'configure' | 'deploy' | 'success' export type Step = 'connect' | 'configure' | 'deploy' | 'success'
export interface EnvironmentVariables { // Initial form data
key: string const initialFormData: OnboardingFormData = {
value: string // Step 1: Connect
githubRepo: undefined,
template: undefined,
projectName: undefined,
deploymentMode: undefined,
// Step 2: Configure
selectedLrn: undefined,
selectedOrg: undefined, // Add this property
environmentVariables: [], // Use array type
deploymentType: undefined, // Add missing properties
deployerCount: undefined,
maxPrice: undefined,
// Step 3: Deploy
deploymentId: undefined,
repositoryUrl: undefined,
deploymentUrl: undefined, // Add missing property
projectId: undefined // Add missing property
} }
export interface OnboardingFormData { export function useOnboarding() {
// Connect step const [formData, setFormData] = useState<OnboardingFormData>(initialFormData)
githubRepo?: string const [currentStep, setCurrentStep] = useState<Step>('connect')
// Configure step // Update form data (partial update)
deploymentType?: 'auction' | 'lrn' const updateFormData = (updates: Partial<OnboardingFormData>) => {
deployerCount?: string setFormData(prev => ({ ...prev, ...updates }))
maxPrice?: string
selectedLrn?: string
environments?: {
production: boolean
preview: boolean
development: boolean
}
environmentVariables?: Record<string, string>
// Deploy step
deploymentId?: string
deploymentUrl?: string
// Success step
projectId?: string
} }
interface OnboardingState { // Reset form data
currentStep: Step const resetFormData = () => {
formData: OnboardingFormData setFormData(initialFormData)
setCurrentStep: (step: Step) => void setCurrentStep('connect')
setFormData: (data: Partial<OnboardingFormData>) => void
nextStep: () => void
previousStep: () => void
resetOnboarding: () => void
} }
const STEP_ORDER: Step[] = ['connect', 'configure', 'deploy', 'success'] // Step navigation
const nextStep = () => {
switch (currentStep) {
case 'connect':
setCurrentStep('configure')
break
case 'configure':
setCurrentStep('deploy')
break
case 'deploy':
setCurrentStep('success')
break
}
}
export const useOnboarding = create<OnboardingState>()( const previousStep = () => {
persist( switch (currentStep) {
(set) => ({ case 'configure':
currentStep: 'connect', setCurrentStep('connect')
formData: {}, break
case 'deploy':
setCurrentStep('configure')
break
case 'success':
setCurrentStep('deploy')
break
}
}
setCurrentStep: (step) => set({ currentStep: step }), // Validation helpers
const validateStep1 = () => {
if (formData.deploymentMode === 'template') {
return !!(formData.template && formData.projectName)
}
return !!formData.githubRepo
}
setFormData: (data) => const validateStep2 = () => {
set((state) => ({ return !!(formData.selectedLrn && formData.selectedOrg)
formData: { ...state.formData, ...data } }
})),
nextStep: () => const validateStep3 = () => {
set((state) => { return !!formData.deploymentId
const currentIndex = STEP_ORDER.indexOf(state.currentStep) }
const nextStep = STEP_ORDER[currentIndex + 1]
return nextStep ? { currentStep: nextStep } : state
}),
previousStep: () => return {
set((state) => { // Data
const currentIndex = STEP_ORDER.indexOf(state.currentStep) formData,
const previousStep = STEP_ORDER[currentIndex - 1] currentStep,
return previousStep ? { currentStep: previousStep } : state
}),
resetOnboarding: () => // Actions
set({ setFormData: updateFormData,
currentStep: 'connect', setCurrentStep,
formData: {} resetFormData,
resetOnboarding: resetFormData, // Alias for compatibility
nextStep,
previousStep,
// Validation
validateStep1,
validateStep2,
validateStep3,
// Store-like interface for compatibility
getState: () => ({
formData,
currentStep,
nextStep,
previousStep,
setFormData: updateFormData,
resetFormData
}) })
}),
{
name: 'laconic-onboarding-storage'
} }
) }
)
+2 -2
View File
@@ -8,9 +8,9 @@
export interface TemplateDetail { export interface TemplateDetail {
id: string id: string
name: string name: string
icon: string icon: string // Required string
repoFullName: string repoFullName: string
description: string description: string // Required string
isComingSoon?: boolean isComingSoon?: boolean
tags?: string[] tags?: string[]
} }
@@ -43,7 +43,7 @@ export const BackendProvider: React.FC<{ children: ReactNode }> = ({
const [isLoading, setIsLoading] = useState(true) const [isLoading, setIsLoading] = useState(true)
// Check backend connection // Check backend connection
const checkBackendConnection = useCallback(async () => { const checkBackendConnection = useCallback(async (): Promise<void> => {
try { try {
const response = await fetch('http://localhost:8000/auth/session', { const response = await fetch('http://localhost:8000/auth/session', {
method: 'GET', method: 'GET',
@@ -59,11 +59,11 @@ export const BackendProvider: React.FC<{ children: ReactNode }> = ({
console.log('❌ Backend not connected') console.log('❌ Backend not connected')
} }
return connected // Don't return anything - function returns Promise<void>
} catch (error) { } catch (error) {
console.error('Error checking backend connection:', error) console.error('Error checking backend connection:', error)
setIsBackendConnected(false) setIsBackendConnected(false)
return false // Don't return anything - function returns Promise<void>
} }
}, []) }, [])
+2 -2
View File
@@ -143,7 +143,7 @@ export function useAuthStatus(): AuthStatus & AuthActions {
// Calculate what's missing // Calculate what's missing
const missing = { const missing = {
clerkSignIn: !isSignedIn, clerkSignIn: !isSignedIn,
clerkGithub: isSignedIn && !hasGithubInClerk, clerkGithub: (isSignedIn ?? false) && !hasGithubInClerk,
walletConnection: !hasWalletAddress, // Just need wallet address for this step walletConnection: !hasWalletAddress, // Just need wallet address for this step
backendConnection: hasWalletAddress && !isWalletSessionActive, // Need SIWE auth for backend backendConnection: hasWalletAddress && !isWalletSessionActive, // Need SIWE auth for backend
githubBackendSync: isBackendConnected && !isGithubBackendAuth githubBackendSync: isBackendConnected && !isGithubBackendAuth
@@ -177,7 +177,7 @@ export function useAuthStatus(): AuthStatus & AuthActions {
return { return {
// Individual systems // Individual systems
clerk: { clerk: {
isSignedIn, isSignedIn: isSignedIn ?? false,
isLoaded: isClerkLoaded && isUserLoaded, isLoaded: isClerkLoaded && isUserLoaded,
hasGithubConnected: hasGithubInClerk, hasGithubConnected: hasGithubInClerk,
user user
+2 -2
View File
@@ -37,13 +37,13 @@ export function useRepoData(repoId: string): UseRepoDataReturn {
try { try {
// Check if user has connected GitHub account // Check if user has connected GitHub account
const githubAccount = user.externalAccounts.find( const githubAccount = user.externalAccounts.find(
account => account.provider === 'oauth_github' account => account.provider === 'github'
); );
if (githubAccount) { if (githubAccount) {
// Try to get GitHub OAuth token from Clerk // Try to get GitHub OAuth token from Clerk
try { try {
token = await user.getToken({ template: 'github' }); // token = await user.getToken({ template: 'github' });
console.log('Using GitHub token from Clerk'); console.log('Using GitHub token from Clerk');
} catch (err) { } catch (err) {
console.error('Error getting GitHub token from Clerk:', err); console.error('Error getting GitHub token from Clerk:', err);
@@ -2,6 +2,7 @@
// src/hooks/useRepoSelection.ts // src/hooks/useRepoSelection.ts
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import { useOctokit } from '@/context/OctokitContext' import { useOctokit } from '@/context/OctokitContext'
import { adaptRepositories, type GitHubRepo } from '../utils/typeAdapters';
interface Repository { interface Repository {
id: string; id: string;
@@ -58,7 +59,7 @@ export function useRepoSelection(): UseRepoSelectionResult {
} }
})); }));
setRepositories(repoData); setRepositories(adaptRepositories(repoData as GitHubRepo[]));
} }
} catch (err) { } catch (err) {
console.error('Failed to fetch repositories:', err); console.error('Failed to fetch repositories:', err);
@@ -89,6 +90,9 @@ export function useRepoSelection(): UseRepoSelectionResult {
try { try {
if (isAuth && octokit) { if (isAuth && octokit) {
const [owner, repo] = repoFullName.split('/'); const [owner, repo] = repoFullName.split('/');
if (!owner || !repo) {
throw new Error('Invalid repository format');
}
const response = await octokit.request('GET /repos/{owner}/{repo}/branches', { const response = await octokit.request('GET /repos/{owner}/{repo}/branches', {
owner, owner,
+14
View File
@@ -4,6 +4,7 @@ export interface Deployment {
status: string status: string
isCurrent: boolean isCurrent: boolean
createdAt: string | number createdAt: string | number
commit?: string
createdBy?: { createdBy?: {
name: string name: string
} }
@@ -18,4 +19,17 @@ export interface Domain {
branch: string branch: string
status: string status: string
createdAt: string | number createdAt: string | number
isCustom: boolean
}
// Add missing types that are referenced in components
export interface EnvVarItem {
key?: string
value?: string
environments?: string[]
isEditing?: boolean
}
export type EditableEnvVarItem = Partial<EnvVarItem> & {
isEditing?: boolean
} }
+54
View File
@@ -0,0 +1,54 @@
import type { LucideIcon } from 'lucide-react'
import type { ReactNode } from 'react'
// Page action type (for header actions)
export interface PageAction {
label: string
href: string
icon?: string | LucideIcon // Add missing icon property
external?: boolean
onClick?: () => void
}
// Page header configuration
export interface PageHeaderProps {
title: string
description?: string // Add missing description property
actions?: PageAction[]
breadcrumbs?: Array<{
label: string
href?: string
}>
}
// Page wrapper layout types
export type PageLayout = 'default' | 'bento' | 'centered'
export interface PageWrapperProps {
children: ReactNode
header?: PageHeaderProps
layout?: PageLayout
className?: string
}
// Dropdown component types
export interface DropdownOption {
label: string
value: string
}
export interface DropdownProps {
label?: string
options: DropdownOption[]
selectedValue?: string | undefined
onSelect: (value: string) => void
placeholder?: string
className?: string
}
// Step header types (for onboarding)
export interface StepHeaderProps {
title: string
description: string
icon?: ReactNode // Required icon property
}
+4
View File
@@ -1,2 +1,6 @@
export * from './deployment' export * from './deployment'
export * from './project' export * from './project'
export * from './dashboard'
export * from './common'
export * from './foundation'
export * from './onboarding'
+88
View File
@@ -0,0 +1,88 @@
// Template type for onboarding
export interface Template {
id: string
name: string
description: string // Required string
repoFullName: string // Required string
framework?: string
icon?: string // Optional string
}
// Deployer type (compatible with GraphQL client)
export interface Deployer {
deployerLrn: string
deploymentLrn: string
name: string
baseDomain: string
minimumPayment?: string | null
}
// Organization type
export interface Organization {
id: string
slug: string
name: string
}
// Environment variable type for onboarding
export interface OnboardingEnvVar {
key: string
value: string
environments: string[]
}
// Complete onboarding form data interface
export interface OnboardingFormData {
// Step 1: Connect (Repository or Template selection)
githubRepo?: string
template?: Template
projectName?: string
deploymentMode?: 'repository' | 'template'
// Step 2: Configure
selectedLrn?: string
selectedOrg?: string // Add the missing selectedOrg property
environmentVariables?: OnboardingEnvVar[] // Use proper array type
deploymentType?: 'auction' | 'lrn' // Add missing properties
deployerCount?: string
maxPrice?: string
paymentAddress?: string // Add missing paymentAddress property
// Step 3: Deploy
deploymentId?: string
repositoryUrl?: string // Add missing repositoryUrl property
deploymentUrl?: string // Add missing deploymentUrl property
projectId?: string // Add missing projectId property
}
// Deployment configuration types
export interface TemplateDeploymentConfig {
template: Template
projectName: string
organizationSlug: string
environmentVariables?: OnboardingEnvVar[]
deployerLrn: string
}
export interface DeploymentConfig {
projectId: string
organizationSlug: string
repository: string
branch: string
name: string
environmentVariables?: OnboardingEnvVar[]
}
// Repository type for GitHub integration
export interface Repository {
id: string
name: string
full_name: string
default_branch: string
html_url: string
description?: string | null
owner: {
login: string
avatar_url: string
}
}
+7
View File
@@ -18,3 +18,10 @@ export interface Project {
} }
}> }>
} }
export enum ProjectStatus {
Building = 'Building',
Ready = 'Ready',
Error = 'Error',
Deleting = 'Deleting'
}
+174
View File
@@ -0,0 +1,174 @@
// src/utils/typeAdapters.ts
import {
Deployer as GQLDeployer,
DeploymentStatus } from '../../../../services/gql-client/src/types';
// Define your frontend types that may be missing
export type ProjectStatus = 'success' | 'pending' | 'error' | 'building' | 'deleting';
export interface TemplateDetail {
id?: string;
name: string;
icon: string;
description?: string;
repoFullName?: string;
[key: string]: any; // Allow other properties
}
export interface Template {
id?: string;
name: string;
icon?: string;
description?: string;
repoFullName?: string;
[key: string]: any;
}
export interface Repository {
id: string;
name: string;
full_name: string;
default_branch: string;
html_url: string;
description?: string; // Note: undefined, not null
owner: {
login: string;
avatar_url: string;
};
}
export interface Deployer {
deployerLrn: string;
deployerId: string;
deployerApiUrl: string;
baseDomain: string;
minimumPayment?: string; // Note: undefined, not null
}
export interface GitHubRepo {
id: string;
name: string;
full_name: string;
default_branch: string;
html_url: string;
description: string | null;
owner: {
login: string;
avatar_url: string;
};
}
/**
* Convert GraphQL Deployer to Frontend Deployer
*/
export const adaptDeployer = (gqlDeployer: GQLDeployer): Deployer => ({
...gqlDeployer,
minimumPayment: gqlDeployer.minimumPayment ?? undefined
});
/**
* Convert array of GraphQL Deployers to Frontend Deployers
*/
export const adaptDeployers = (gqlDeployers: GQLDeployer[]): Deployer[] => {
return gqlDeployers.map(adaptDeployer);
};
/**
* Convert Template to TemplateDetail (ensuring icon is always string)
*/
export const adaptTemplate = (template: Template): TemplateDetail => ({
...template,
icon: template.icon || '/default-template-icon.svg' // Provide a default icon path
});
/**
* Convert DeploymentStatus to ProjectStatus
*/
export const adaptDeploymentStatus = (status: string | DeploymentStatus): ProjectStatus => {
// Convert to string safely
const statusStr = String(status);
switch (statusStr) {
case 'Building':
case 'building':
return 'building';
case 'Ready':
case 'ready':
case 'complete':
return 'success';
case 'Error':
case 'error':
case 'failed':
return 'error';
case 'Deleting':
case 'deleting':
return 'deleting';
case 'pending':
return 'pending';
default:
console.warn(`Unknown deployment status: ${statusStr}`);
return 'pending';
}
};
/**
* Convert GitHub API Repository to Frontend Repository
*/
export const adaptRepository = (githubRepo: GitHubRepo): Repository => ({
...githubRepo,
description: githubRepo.description ?? undefined
});
/**
* Convert array of GitHub repositories
*/
export const adaptRepositories = (githubRepos: GitHubRepo[]): Repository[] => {
return githubRepos.map(adaptRepository);
};
/**
* Safely extract owner and repo name from selected repository
*/
export const extractRepoInfo = (selectedRepo: Repository | null | undefined): { owner: string; repo: string } => {
if (!selectedRepo) {
throw new Error('No repository selected');
}
const owner = selectedRepo.owner?.login;
const repo = selectedRepo.name;
if (!owner || !repo) {
throw new Error('Repository owner and name are required');
}
return { owner, repo };
};
/**
* Template deployment configuration adapter
*/
export interface TemplateDeploymentConfig {
template: TemplateDetail;
projectName: string;
organizationSlug: string;
environmentVariables: any[];
deployerLrn?: string;
}
export const adaptTemplateDeploymentConfig = (config: {
template: Template;
projectName: string;
organizationSlug: string;
environmentVariables: any[];
deployerLrn?: string;
}): TemplateDeploymentConfig => ({
...config,
template: adaptTemplate(config.template)
});
/**
* Utility to handle optional template conversion
*/
export const adaptOptionalTemplate = (template: Template | undefined): TemplateDetail | undefined => {
return template ? adaptTemplate(template) : undefined;
};
+3
View File
@@ -0,0 +1,3 @@
REGISTRY_BOND_ID=
DEPLOYER_LRN=
AUTHORITY=
+42 -24
View File
@@ -1,5 +1,9 @@
# deployer # deployer
The following steps are for deploying the frontend app to vaasl webapp deployer.
Run these steps in the `apps/deployer/` directory:
- Install dependencies - Install dependencies
```bash ```bash
@@ -7,18 +11,45 @@
``` ```
```bash ```bash
brew install jq # if you do not have jq installed already # if you do not have jq installed already
brew install jq
# OR
sudo apt-get install jq
``` ```
- Run script to deploy app - Copy and update `.env`
- To deploy frontend app to `dashboard.staging.apps.snowballtools.com` ```
cp .env.example .env
```bash
./deploy-frontend.staging.sh
``` ```
- To deploy frontend app to `dashboard.apps.snowballtools.com` Set the required variables:
```
REGISTRY_BOND_ID=230cfedda15e78edc8986dfcb870e1b618f65c56e38d2735476d2a8cb3f25e38
DEPLOYER_LRN=lrn://vaasl-provider/deployers/webapp-deployer-api.apps.vaasl.io
AUTHORITY=laconic
```
- Set the `userKey` in [config.yml](./config.yml)
Note: The `userKey` should be the private key of the account owning the bond set in `config.yml` (account address: `laconic13maulvmjxnyx3g855vk0lsv5aptf3rpxskynef`)
- Set the app env values in [deploy-frontend.sh](./deploy-frontend.sh) (Refer to main [readme](/readme.md#3-configure-environment-variables)):
<!-- TODO: Set env values from a file -->
```sh
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: your_clerk_key
CLERK_SECRET_KEY: your_clerk_secret
NEXT_PUBLIC_WALLET_IFRAME_URL: https://wallet.laconic.com
NEXT_PUBLIC_LACONICD_CHAIN_ID: laconic-mainnet
NEXT_PUBLIC_API_URL: https://deploy-backend.apps.vaasl.io
NEXT_PUBLIC_GITHUB_FALLBACK_TOKEN: your_github_token
```
NOTE: Replace `your_clerk_key`, `your_clerk_secret` and `your_github_token` with actual values
- Run script to deploy app to `deploy-staging.laconic.co`
```bash ```bash
./deploy-frontend.sh ./deploy-frontend.sh
@@ -26,27 +57,14 @@
- Commit the updated [ApplicationRecord](records/application-record.yml) and [ApplicationDeploymentRequest](records/application-deployment-request.yml) files to the repository - Commit the updated [ApplicationRecord](records/application-record.yml) and [ApplicationDeploymentRequest](records/application-deployment-request.yml) files to the repository
## Notes
- Any config env can be updated in [records/application-deployment-request.yml](records/application-deployment-request.yml)
```yml
record:
...
config:
env:
LACONIC_HOSTED_CONFIG_app_server_url: https://snowballtools-base-api-001.apps.snowballtools.com
...
```
- On changing `LACONIC_HOSTED_CONFIG_app_github_clientid`, the GitHub client ID and secret need to be changed in backend config too
## Troubleshoot ## Troubleshoot
- Check deployment status in [web-app deployer](https://console.laconic.com/deployer). - Check deployment status in [web-app deployer](https://console.laconic.com/deployer).
- Check records in [registry console app](https://console.laconic.com/#/registry). - Check records in [registry console app](https://console.laconic.com/#/registry).
- If deployment fails due to low bond balance - If deployment fails due to low bond balance
- Check balances - Check balances
```bash ```bash
@@ -54,11 +72,11 @@
pnpm laconic registry account get pnpm laconic registry account get
# Bond balance # Bond balance
pnpm laconic registry bond get --id 99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be32 pnpm laconic registry bond get --id 230cfedda15e78edc8986dfcb870e1b618f65c56e38d2735476d2a8cb3f25e38
``` ```
- Command to refill bond - Command to refill bond
```bash ```bash
pnpm laconic registry bond refill --id 99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be32 --type alnt --quantity 10000000 pnpm laconic registry bond refill --id 230cfedda15e78edc8986dfcb870e1b618f65c56e38d2735476d2a8cb3f25e38 --type alnt --quantity 10000000
``` ```
+4 -4
View File
@@ -1,8 +1,8 @@
services: services:
registry: registry:
rpcEndpoint: https://laconicd-sapo.laconic.com rpcEndpoint: https://laconicd-mainnet-1.laconic.com/
gqlEndpoint: https://laconicd-sapo.laconic.com/api gqlEndpoint: https://laconicd-mainnet-1.laconic.com/api
userKey: userKey:
bondId: bondId: 230cfedda15e78edc8986dfcb870e1b618f65c56e38d2735476d2a8cb3f25e38
chainId: laconic-testnet-2 chainId: laconic-mainnet
gasPrice: 0.001alnt gasPrice: 0.001alnt
+20 -15
View File
@@ -6,7 +6,7 @@ echo "Using DEPLOYER_LRN: $DEPLOYER_LRN"
echo "Using AUTHORITY: $AUTHORITY" echo "Using AUTHORITY: $AUTHORITY"
# Repository URL # Repository URL
REPO_URL="https://git.vdb.to/cerc-io/snowballtools-base" REPO_URL="https://git.vdb.to/NasSharaf/laconic-deployer-frontend"
# Get the latest commit hash for a branch # Get the latest commit hash for a branch
BRANCH_NAME="main" BRANCH_NAME="main"
@@ -25,7 +25,7 @@ CONFIG_FILE=config.yml
# Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts # Reference: https://git.vdb.to/cerc-io/test-progressive-web-app/src/branch/main/scripts
# Get latest version from registry and increment application-record version # Get latest version from registry and increment application-record version
NEW_APPLICATION_VERSION=$(pnpm --silent laconic -c $CONFIG_FILE registry record list --type ApplicationRecord --all --name "deploy-frontend" 2>/dev/null | jq -r -s ".[] | sort_by(.createTime) | reverse | [ .[] | select(.bondId == \"$REGISTRY_BOND_ID\") ] | .[0].attributes.version" | awk -F. -v OFS=. '{$NF += 1 ; print}') NEW_APPLICATION_VERSION=$(pnpm --silent laconic -c $CONFIG_FILE registry record list --type ApplicationRecord --all --name "laconic-deployer-frontend" 2>/dev/null | jq -r -s ".[] | sort_by(.createTime) | reverse | [ .[] | select(.bondId == \"$REGISTRY_BOND_ID\") ] | .[0].attributes.version" | awk -F. -v OFS=. '{$NF += 1 ; print}')
if [ -z "$NEW_APPLICATION_VERSION" ] || [ "1" == "$NEW_APPLICATION_VERSION" ]; then if [ -z "$NEW_APPLICATION_VERSION" ] || [ "1" == "$NEW_APPLICATION_VERSION" ]; then
# Set application-record version if no previous records were found # Set application-record version if no previous records were found
@@ -39,8 +39,8 @@ record:
version: $NEW_APPLICATION_VERSION version: $NEW_APPLICATION_VERSION
repository_ref: $LATEST_HASH repository_ref: $LATEST_HASH
repository: ["$REPO_URL"] repository: ["$REPO_URL"]
app_type: webapp app_type: webapp/next
name: deploy-frontend name: laconic-deployer-frontend
app_version: $PACKAGE_VERSION app_version: $PACKAGE_VERSION
EOF EOF
@@ -60,7 +60,7 @@ echo "ApplicationRecord published"
echo $RECORD_ID echo $RECORD_ID
# Set name to record # Set name to record
REGISTRY_APP_LRN="lrn://$AUTHORITY/applications/deploy-frontend" REGISTRY_APP_LRN="lrn://$AUTHORITY/applications/laconic-deployer-frontend"
sleep 2 sleep 2
pnpm --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN@${PACKAGE_VERSION}" "$RECORD_ID" pnpm --silent laconic -c $CONFIG_FILE registry name set "$REGISTRY_APP_LRN@${PACKAGE_VERSION}" "$RECORD_ID"
@@ -122,19 +122,18 @@ cat >./records/application-deployment-request.yml <<EOF
record: record:
type: ApplicationDeploymentRequest type: ApplicationDeploymentRequest
version: '1.0.0' version: '1.0.0'
name: deploy-frontend@$PACKAGE_VERSION name: laconic-deployer-frontend@$PACKAGE_VERSION
application: lrn://$AUTHORITY/applications/deploy-frontend@$PACKAGE_VERSION application: lrn://$AUTHORITY/applications/laconic-deployer-frontend@$PACKAGE_VERSION
deployer: $DEPLOYER_LRN deployer: $DEPLOYER_LRN
dns: deploy.laconic.com dns: deploy-staging.laconic.com
config: config:
env: env:
LACONIC_HOSTED_CONFIG_server_url: https://deploy-backend.laconic.com NEXT_PUBLIC_WALLET_IFRAME_URL: https://wallet.laconic.com
LACONIC_HOSTED_CONFIG_github_clientid: Ov23li4NtYybQlF6u5Dk NEXT_PUBLIC_LACONICD_CHAIN_ID: laconic-mainnet
LACONIC_HOSTED_CONFIG_github_pwa_templaterepo: laconic-templates/test-progressive-web-app NEXT_PUBLIC_API_URL: https://deploy-backend.apps.vaasl.io
LACONIC_HOSTED_CONFIG_github_image_upload_templaterepo: laconic-templates/image-upload-pwa-example NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY:
LACONIC_HOSTED_CONFIG_github_next_app_templaterepo: laconic-templates/starter.nextjs-react-tailwind CLERK_SECRET_KEY:
LACONIC_HOSTED_CONFIG_laconicd_chain_id: laconic-testnet-2 NEXT_PUBLIC_GITHUB_FALLBACK_TOKEN: your_github_token
LACONIC_HOSTED_CONFIG_wallet_iframe_url: https://wallet.laconic.com
meta: meta:
note: Added @ $CURRENT_DATE_TIME note: Added @ $CURRENT_DATE_TIME
repository: "$REPO_URL" repository: "$REPO_URL"
@@ -142,6 +141,12 @@ record:
payment: $txHash payment: $txHash
EOF EOF
# Old env values for frontend app
# LACONIC_HOSTED_CONFIG_github_clientid: Ov23li4NtYybQlF6u5Dk
# LACONIC_HOSTED_CONFIG_github_pwa_templaterepo: laconic-templates/test-progressive-web-app
# LACONIC_HOSTED_CONFIG_github_image_upload_templaterepo: laconic-templates/image-upload-pwa-example
# LACONIC_HOSTED_CONFIG_github_next_app_templaterepo: laconic-templates/starter.nextjs-react-tailwind
RECORD_FILE=records/application-deployment-request.yml RECORD_FILE=records/application-deployment-request.yml
sleep 2 sleep 2
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
PKG_DIR="./apps/deploy-fe"
cat > $PKG_DIR/.env <<EOF
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=CERC_RUNTIME_ENV_NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY
CLERK_SECRET_KEY=CERC_RUNTIME_ENV_CLERK_SECRET_KEY
NEXT_PUBLIC_WALLET_IFRAME_URL=CERC_RUNTIME_ENV_NEXT_PUBLIC_WALLET_IFRAME_URL
NEXT_PUBLIC_LACONICD_CHAIN_ID=CERC_RUNTIME_ENV_NEXT_PUBLIC_LACONICD_CHAIN_ID
NEXT_PUBLIC_API_URL=CERC_RUNTIME_ENV_NEXT_PUBLIC_API_URL
NEXT_PUBLIC_GITHUB_FALLBACK_TOKEN=CERC_RUNTIME_ENV_NEXT_PUBLIC_GITHUB_FALLBACK_TOKEN
EOF
pnpm install || exit 1
pnpm build:fe-compile || exit 1
+1
View File
@@ -5,6 +5,7 @@
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"build": "turbo build", "build": "turbo build",
"build:fe-compile": "turbo build:compile --filter=deploy-fe",
"dev": "turbo dev", "dev": "turbo dev",
"lint": "turbo lint", "lint": "turbo lint",
"start": "turbo start", "start": "turbo start",
+194 -204
View File
@@ -44,13 +44,13 @@ importers:
version: 0.2.11(debug@4.4.0) version: 0.2.11(debug@4.4.0)
'@cosmjs/stargate': '@cosmjs/stargate':
specifier: ^0.33.0 specifier: ^0.33.0
version: 0.33.0(debug@4.4.0) version: 0.33.1(debug@4.4.0)
'@graphql-tools/schema': '@graphql-tools/schema':
specifier: ^10.0.2 specifier: ^10.0.2
version: 10.0.21(graphql@16.10.0) version: 10.0.25(graphql@16.10.0)
'@graphql-tools/utils': '@graphql-tools/utils':
specifier: ^10.0.12 specifier: ^10.0.12
version: 10.8.4(graphql@16.10.0) version: 10.9.1(graphql@16.10.0)
'@octokit/oauth-app': '@octokit/oauth-app':
specifier: ^6.1.0 specifier: ^6.1.0
version: 6.1.0 version: 6.1.0
@@ -65,7 +65,7 @@ importers:
version: 20.17.23 version: 20.17.23
'@types/semver': '@types/semver':
specifier: ^7.5.8 specifier: ^7.5.8
version: 7.5.8 version: 7.7.0
apollo-server-core: apollo-server-core:
specifier: ^3.13.0 specifier: ^3.13.0
version: 3.13.0(graphql@16.10.0) version: 3.13.0(graphql@16.10.0)
@@ -74,7 +74,7 @@ importers:
version: 3.13.0(express@4.21.2)(graphql@16.10.0) version: 3.13.0(express@4.21.2)(graphql@16.10.0)
cookie-session: cookie-session:
specifier: ^2.1.0 specifier: ^2.1.0
version: 2.1.0 version: 2.1.1
cors: cors:
specifier: ^2.8.5 specifier: ^2.8.5
version: 2.8.5 version: 2.8.5
@@ -89,28 +89,28 @@ importers:
version: 3.1.1(express@4.21.2) version: 3.1.1(express@4.21.2)
express-session: express-session:
specifier: ^1.18.0 specifier: ^1.18.0
version: 1.18.1 version: 1.18.2
fs-extra: fs-extra:
specifier: ^11.2.0 specifier: ^11.2.0
version: 11.3.0 version: 11.3.1
graphql: graphql:
specifier: ^16.8.1 specifier: ^16.8.1
version: 16.10.0 version: 16.10.0
luxon: luxon:
specifier: ^3.5.0 specifier: ^3.5.0
version: 3.5.0 version: 3.7.1
nanoid: nanoid:
specifier: '3' specifier: '3'
version: 3.3.8 version: 3.3.8
nanoid-dictionary: nanoid-dictionary:
specifier: ^5.0.0-beta.1 specifier: ^5.0.0-beta.1
version: 5.0.0-beta.1 version: 5.0.0
octokit: octokit:
specifier: ^3.1.2 specifier: ^3.1.2
version: 3.2.1 version: 3.2.1
openpgp: openpgp:
specifier: ^6.0.1 specifier: ^6.0.1
version: 6.1.0 version: 6.2.0
reflect-metadata: reflect-metadata:
specifier: ^0.2.1 specifier: ^0.2.1
version: 0.2.2 version: 0.2.2
@@ -141,13 +141,13 @@ importers:
version: 2.0.49 version: 2.0.49
'@types/cors': '@types/cors':
specifier: ^2.8.17 specifier: ^2.8.17
version: 2.8.17 version: 2.8.19
'@types/express': '@types/express':
specifier: ^4.17.21 specifier: ^4.17.21
version: 4.17.21 version: 4.17.23
'@types/express-session': '@types/express-session':
specifier: ^1.17.10 specifier: ^1.17.10
version: 1.18.1 version: 1.18.2
'@types/fs-extra': '@types/fs-extra':
specifier: ^11.0.4 specifier: ^11.0.4
version: 11.0.4 version: 11.0.4
@@ -159,7 +159,7 @@ importers:
version: 2.4.1 version: 2.4.1
prettier: prettier:
specifier: ^3.1.1 specifier: ^3.1.1
version: 3.5.3 version: 3.6.2
workspace: workspace:
specifier: ^0.0.1-preview.1 specifier: ^0.0.1-preview.1
version: 0.0.1-preview.2 version: 0.0.1-preview.2
@@ -273,7 +273,7 @@ importers:
version: link:../../services/ui version: link:../../services/ui
axios: axios:
specifier: ^1.8.4 specifier: ^1.8.4
version: 1.8.4 version: 1.8.4(debug@4.4.0)
class-variance-authority: class-variance-authority:
specifier: ^0.7.0 specifier: ^0.7.0
version: 0.7.1 version: 0.7.1
@@ -794,8 +794,8 @@ packages:
'@cosmjs/amino@0.32.4': '@cosmjs/amino@0.32.4':
resolution: {integrity: sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==} resolution: {integrity: sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==}
'@cosmjs/amino@0.33.0': '@cosmjs/amino@0.33.1':
resolution: {integrity: sha512-a4qnWGzuM2IrlkDTFQmU7bDd+wNIzyvfcRIZ43i00ZHvTEtrCcWopT94rIv/Zy6fdgkhQ3HWrsGVlIPDT/ibRw==} resolution: {integrity: sha512-WfWiBf2EbIWpwKG9AOcsIIkR717SY+JdlXM/SL/bI66BdrhniAF+/ZNis9Vo9HF6lP2UU5XrSmFA4snAvEgdrg==}
'@cosmjs/crypto@0.27.1': '@cosmjs/crypto@0.27.1':
resolution: {integrity: sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg==} resolution: {integrity: sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg==}
@@ -806,8 +806,8 @@ packages:
'@cosmjs/crypto@0.32.4': '@cosmjs/crypto@0.32.4':
resolution: {integrity: sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==} resolution: {integrity: sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==}
'@cosmjs/crypto@0.33.0': '@cosmjs/crypto@0.33.1':
resolution: {integrity: sha512-kkt06t+cFW2XRGDGUZ0cVf5yoQ2OhZnubwbYbz3QXdyhf1qOXYVPRThfFPsko7dssr+e8Yy4OJKlh5SLA8DXTQ==} resolution: {integrity: sha512-U4kGIj/SNBzlb2FGgA0sMR0MapVgJUg8N+oIAiN5+vl4GZ3aefmoL1RDyTrFS/7HrB+M+MtHsxC0tvEu4ic/zA==}
'@cosmjs/encoding@0.27.1': '@cosmjs/encoding@0.27.1':
resolution: {integrity: sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw==} resolution: {integrity: sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw==}
@@ -818,14 +818,14 @@ packages:
'@cosmjs/encoding@0.32.4': '@cosmjs/encoding@0.32.4':
resolution: {integrity: sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==} resolution: {integrity: sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==}
'@cosmjs/encoding@0.33.0': '@cosmjs/encoding@0.33.1':
resolution: {integrity: sha512-9z0g9mM7w5BISVVs8BK1Yp7KSQgNLGz2SBoWYOm4wODB/YcoitODgyRqECcuMZBXtd2sCyy2M1VLs9Z69BPZRQ==} resolution: {integrity: sha512-nuNxf29fUcQE14+1p//VVQDwd1iau5lhaW/7uMz7V2AH3GJbFJoJVaKvVyZvdFk+Cnu+s3wCqgq4gJkhRCJfKw==}
'@cosmjs/json-rpc@0.32.4': '@cosmjs/json-rpc@0.32.4':
resolution: {integrity: sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ==} resolution: {integrity: sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ==}
'@cosmjs/json-rpc@0.33.0': '@cosmjs/json-rpc@0.33.1':
resolution: {integrity: sha512-okXjxnT3zhhuYrA1aIDVD8VHt3syWyrJw3cAY6tMNM53bQcAtLGImueMrEoyv7DtLg5R5Tx5PMrQ7UYnpD8OwQ==} resolution: {integrity: sha512-T6VtWzecpmuTuMRGZWuBYHsMF/aznWCYUt/cGMWNSz7DBPipVd0w774PKpxXzpEbyt5sr61NiuLXc+Az15S/Cw==}
'@cosmjs/launchpad@0.27.1': '@cosmjs/launchpad@0.27.1':
resolution: {integrity: sha512-DcFwGD/z5PK8CzO2sojDxa+Be9EIEtRZb2YawgVnw2Ht/p5FlNv+OVo8qlishpBdalXEN7FvQ1dVeDFEe9TuJw==} resolution: {integrity: sha512-DcFwGD/z5PK8CzO2sojDxa+Be9EIEtRZb2YawgVnw2Ht/p5FlNv+OVo8qlishpBdalXEN7FvQ1dVeDFEe9TuJw==}
@@ -839,38 +839,38 @@ packages:
'@cosmjs/math@0.32.4': '@cosmjs/math@0.32.4':
resolution: {integrity: sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw==} resolution: {integrity: sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw==}
'@cosmjs/math@0.33.0': '@cosmjs/math@0.33.1':
resolution: {integrity: sha512-B2uOgM12iuIhJWzGuAxGwO6zO+cI8Q4z7mVu7HgFrGJJTM1HtPTYgb55oMOuUN0OZ352MEEm5uAt8sA9jZQqbA==} resolution: {integrity: sha512-ytGkWdKFCPiiBU5eqjHNd59djPpIsOjbr2CkNjlnI1Zmdj+HDkSoD9MUGpz9/RJvRir5IvsXqdE05x8EtoQkJA==}
'@cosmjs/proto-signing@0.32.4': '@cosmjs/proto-signing@0.32.4':
resolution: {integrity: sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==} resolution: {integrity: sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==}
'@cosmjs/proto-signing@0.33.0': '@cosmjs/proto-signing@0.33.1':
resolution: {integrity: sha512-UHA92d/Siy3wnce/xhU4iagKrs6r8Ruacc0qeHj3mNrtuUH8f70cD7lzzClzI7wvRLcPprOY0YTeEzqGbPeBFw==} resolution: {integrity: sha512-Sv4W+MxX+0LVnd+2rU4Fw1HRsmMwSVSYULj7pRkij3wnPwUlTVoJjmKFgKz13ooIlfzPrz/dnNjGp/xnmXChFQ==}
'@cosmjs/socket@0.32.4': '@cosmjs/socket@0.32.4':
resolution: {integrity: sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw==} resolution: {integrity: sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw==}
'@cosmjs/socket@0.33.0': '@cosmjs/socket@0.33.1':
resolution: {integrity: sha512-a1eHsqVFmG6N5LR53tAB1Xo4XfsZaFlrYA34yC0GnX5m/cJVEe1wkZxMsWJIW2nfCgj7nAvFK6Gx4qj+ZLeqdw==} resolution: {integrity: sha512-KzAeorten6Vn20sMiM6NNWfgc7jbyVo4Zmxev1FXa5EaoLCZy48cmT3hJxUJQvJP/lAy8wPGEjZ/u4rmF11x9A==}
'@cosmjs/stargate@0.32.4': '@cosmjs/stargate@0.32.4':
resolution: {integrity: sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ==} resolution: {integrity: sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ==}
'@cosmjs/stargate@0.33.0': '@cosmjs/stargate@0.33.1':
resolution: {integrity: sha512-Ti/2RRl+LKTNUrOqj6TpGnTRcbmQ5zD4Ujx/PDNPHEexyuwbz+tMcF8Y1kKPWQ1g4wWxLYO4tKY4Gm0J3c5hWA==} resolution: {integrity: sha512-CnJ1zpSiaZgkvhk+9aTp5IPmgWn2uo+cNEBN8VuD9sD6BA0V4DMjqe251cNFLiMhkGtiE5I/WXFERbLPww3k8g==}
'@cosmjs/stream@0.32.4': '@cosmjs/stream@0.32.4':
resolution: {integrity: sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A==} resolution: {integrity: sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A==}
'@cosmjs/stream@0.33.0': '@cosmjs/stream@0.33.1':
resolution: {integrity: sha512-SmsZW9Xzfk2T2MtWzVkit2WUclL7ZQHhiEhJz39EzKQRAdi4xY8nwefZF4VLQVJ0M33QfRCUzFzb+O/gddMQKA==} resolution: {integrity: sha512-bMUvEENjeQPSTx+YRzVsWT1uFIdHRcf4brsc14SOoRQ/j5rOJM/aHfsf/BmdSAnYbdOQ3CMKj/8nGAQ7xUdn7w==}
'@cosmjs/tendermint-rpc@0.32.4': '@cosmjs/tendermint-rpc@0.32.4':
resolution: {integrity: sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw==} resolution: {integrity: sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw==}
'@cosmjs/tendermint-rpc@0.33.0': '@cosmjs/tendermint-rpc@0.33.1':
resolution: {integrity: sha512-A5h72fYesFKSjMjB+AMD5thcVVcdfbmWj4atJ1CYmKGyCTCPW8iEIz1ZKR0mUX+gkW6dM1h8flaRj/R14Oc0/A==} resolution: {integrity: sha512-22klDFq2MWnf//C8+rZ5/dYatr6jeGT+BmVbutXYfAK9fmODbtFcumyvB6uWaEORWfNukl8YK1OLuaWezoQvxA==}
'@cosmjs/utils@0.27.1': '@cosmjs/utils@0.27.1':
resolution: {integrity: sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg==} resolution: {integrity: sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg==}
@@ -881,8 +881,8 @@ packages:
'@cosmjs/utils@0.32.4': '@cosmjs/utils@0.32.4':
resolution: {integrity: sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==} resolution: {integrity: sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==}
'@cosmjs/utils@0.33.0': '@cosmjs/utils@0.33.1':
resolution: {integrity: sha512-Y6glwHNlNjcOgwPg8YmNr1PSrNm307EhJVytFt8HmA/G7MRcIA+jIzCL0VlOrWGU4TrAOXvshM+oJZbTIldFRA==} resolution: {integrity: sha512-UnLHDY6KMmC+UXf3Ufyh+onE19xzEXjT4VZ504Acmk4PXxqyvG4cCPprlKUFnGUX7f0z8Or9MAOHXBx41uHBcg==}
'@cspotcode/source-map-support@0.8.1': '@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
@@ -1156,8 +1156,8 @@ packages:
peerDependencies: peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
'@graphql-tools/merge@9.0.22': '@graphql-tools/merge@9.1.1':
resolution: {integrity: sha512-bjOs9DlTbo1Yz2UzQcJ78Dn9/pKyY2zNaoqNLfRTTSkO56QFkvqhfjQuqJcqu+V3rtaB2o0VMpWaY6JT8ZTvQA==} resolution: {integrity: sha512-BJ5/7Y7GOhTuvzzO5tSBFL4NGr7PVqTJY3KeIDlVTT8YLcTXtBR+hlrC3uyEym7Ragn+zyWdHeJ9ev+nRX1X2w==}
engines: {node: '>=16.0.0'} engines: {node: '>=16.0.0'}
peerDependencies: peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -1167,8 +1167,8 @@ packages:
peerDependencies: peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
'@graphql-tools/schema@10.0.21': '@graphql-tools/schema@10.0.25':
resolution: {integrity: sha512-AECSlNnD0WNxICwfJs93gYn2oHxPmztn1MYBETIQXrJJcymfD6BoUrDlYPa6F27RzRc+gbPZPHMWL26uujfKBg==} resolution: {integrity: sha512-/PqE8US8kdQ7lB9M5+jlW8AyVjRGCKU7TSktuW3WNKSKmDO0MK1wakvb5gGdyT49MjAIb4a3LWxIpwo5VygZuw==}
engines: {node: '>=16.0.0'} engines: {node: '>=16.0.0'}
peerDependencies: peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -1183,8 +1183,8 @@ packages:
peerDependencies: peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
'@graphql-tools/utils@10.8.4': '@graphql-tools/utils@10.9.1':
resolution: {integrity: sha512-HpHBgcmLIE79jWk1v5Bm0Eb8MaPiwSJT/Iy5xIJ+GMe7yAKpCYrbjf7wb+UMDMkLkfEryvo3syCx8k+TMAZ9bA==} resolution: {integrity: sha512-B1wwkXk9UvU7LCBkPs8513WxOQ2H8Fo5p8HR1+Id9WmYE5+bd51vqN+MbrqvWczHCH2gwkREgHJN88tE0n1FCw==}
engines: {node: '>=16.0.0'} engines: {node: '>=16.0.0'}
peerDependencies: peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -1406,8 +1406,8 @@ packages:
'@noble/curves@1.2.0': '@noble/curves@1.2.0':
resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==}
'@noble/curves@1.8.1': '@noble/curves@1.9.7':
resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==}
engines: {node: ^14.21.3 || >=16} engines: {node: ^14.21.3 || >=16}
'@noble/hashes@1.3.2': '@noble/hashes@1.3.2':
@@ -1418,6 +1418,10 @@ packages:
resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==}
engines: {node: ^14.21.3 || >=16} engines: {node: ^14.21.3 || >=16}
'@noble/hashes@1.8.0':
resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
engines: {node: ^14.21.3 || >=16}
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@@ -2513,8 +2517,8 @@ packages:
'@types/body-parser@1.19.2': '@types/body-parser@1.19.2':
resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
'@types/body-parser@1.19.5': '@types/body-parser@1.19.6':
resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
'@types/btoa-lite@1.0.2': '@types/btoa-lite@1.0.2':
resolution: {integrity: sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==} resolution: {integrity: sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==}
@@ -2528,8 +2532,8 @@ packages:
'@types/cors@2.8.12': '@types/cors@2.8.12':
resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==} resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==}
'@types/cors@2.8.17': '@types/cors@2.8.19':
resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==}
'@types/d3-array@3.2.1': '@types/d3-array@3.2.1':
resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
@@ -2570,14 +2574,14 @@ packages:
'@types/express-serve-static-core@4.19.6': '@types/express-serve-static-core@4.19.6':
resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==}
'@types/express-session@1.18.1': '@types/express-session@1.18.2':
resolution: {integrity: sha512-S6TkD/lljxDlQ2u/4A70luD8/ZxZcrU5pQwI1rVXCiaVIywoFgbA+PIUNDjPhQpPdK0dGleLtYc/y7XWBfclBg==} resolution: {integrity: sha512-k+I0BxwVXsnEU2hV77cCobC08kIsn4y44C3gC0b46uxZVMaXA04lSPgRLR/bSL2w0t0ShJiG8o4jPzRG/nscFg==}
'@types/express@4.17.14': '@types/express@4.17.14':
resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==} resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==}
'@types/express@4.17.21': '@types/express@4.17.23':
resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==}
'@types/fs-extra@11.0.4': '@types/fs-extra@11.0.4':
resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
@@ -2588,8 +2592,8 @@ packages:
'@types/google-protobuf@3.15.12': '@types/google-protobuf@3.15.12':
resolution: {integrity: sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==} resolution: {integrity: sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==}
'@types/http-errors@2.0.4': '@types/http-errors@2.0.5':
resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
'@types/inquirer@6.5.0': '@types/inquirer@6.5.0':
resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==} resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==}
@@ -2621,9 +2625,6 @@ packages:
'@types/node@10.12.18': '@types/node@10.12.18':
resolution: {integrity: sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==} resolution: {integrity: sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==}
'@types/node@10.17.60':
resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==}
'@types/node@17.0.45': '@types/node@17.0.45':
resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
@@ -2642,8 +2643,8 @@ packages:
'@types/prop-types@15.7.14': '@types/prop-types@15.7.14':
resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
'@types/qs@6.9.18': '@types/qs@6.14.0':
resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
'@types/range-parser@1.2.7': '@types/range-parser@1.2.7':
resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
@@ -2657,14 +2658,14 @@ packages:
'@types/secp256k1@4.0.6': '@types/secp256k1@4.0.6':
resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==}
'@types/semver@7.5.8': '@types/semver@7.7.0':
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==}
'@types/send@0.17.4': '@types/send@0.17.5':
resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==}
'@types/serve-static@1.15.7': '@types/serve-static@1.15.8':
resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==}
'@types/through@0.0.33': '@types/through@0.0.33':
resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==}
@@ -2672,8 +2673,8 @@ packages:
'@types/tinycolor2@1.4.6': '@types/tinycolor2@1.4.6':
resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==}
'@whatwg-node/promise-helpers@1.2.4': '@whatwg-node/promise-helpers@1.3.2':
resolution: {integrity: sha512-daEUfaHbaMuAcor+FPAVK+pOCSzsAYhK6LN1y81EcakdqQEPQvjm74PTmfwfv8POg8pw4RyCv9LXB1e+mQDwqg==} resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==}
engines: {node: '>=16.0.0'} engines: {node: '>=16.0.0'}
'@wolfy1339/lru-cache@11.0.2-patch.1': '@wolfy1339/lru-cache@11.0.2-patch.1':
@@ -2861,9 +2862,6 @@ packages:
axios@0.26.1: axios@0.26.1:
resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
axios@1.8.2:
resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==}
axios@1.8.4: axios@1.8.4:
resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==}
@@ -3157,8 +3155,8 @@ packages:
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
cookie-session@2.1.0: cookie-session@2.1.1:
resolution: {integrity: sha512-u73BDmR8QLGcs+Lprs0cfbcAPKl2HnPcjpwRXT41sEV4DRJ2+W0vJEEZkG31ofkx+HZflA70siRIjiTdIodmOQ==} resolution: {integrity: sha512-ji3kym/XZaFVew1+tIZk5ZLp9Z/fLv9rK1aZmpug0FsgE7Cu3ZDrUdRo7FT9vFjMYfNimrrUHJzywDwT7XEFlg==}
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
cookie-signature@1.0.6: cookie-signature@1.0.6:
@@ -3454,8 +3452,8 @@ packages:
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
end-of-stream@1.4.4: end-of-stream@1.4.5:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
enhanced-resolve@5.18.1: enhanced-resolve@5.18.1:
resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
@@ -3555,8 +3553,8 @@ packages:
peerDependencies: peerDependencies:
express: ^4.16.2 express: ^4.16.2
express-session@1.18.1: express-session@1.18.2:
resolution: {integrity: sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==} resolution: {integrity: sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
express@4.21.2: express@4.21.2:
@@ -3645,8 +3643,8 @@ packages:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
fs-extra@11.3.0: fs-extra@11.3.1:
resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==}
engines: {node: '>=14.14'} engines: {node: '>=14.14'}
fs.realpath@1.0.0: fs.realpath@1.0.0:
@@ -4226,8 +4224,8 @@ packages:
peerDependencies: peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
luxon@3.5.0: luxon@3.7.1:
resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} resolution: {integrity: sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==}
engines: {node: '>=12'} engines: {node: '>=12'}
make-error@1.3.6: make-error@1.3.6:
@@ -4337,8 +4335,8 @@ packages:
nan@2.22.2: nan@2.22.2:
resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==}
nanoid-dictionary@5.0.0-beta.1: nanoid-dictionary@5.0.0:
resolution: {integrity: sha512-xBkL9zzkNjzJ/UnmWyiOUDVX/COoi05eS0oU28RYKFFQhdnzO5dTOPbVZ/fCFgIOGr1zNinDHJ68mm/KQfcgcw==} resolution: {integrity: sha512-/iCyQHwt36XkaIvSE9fcC8p6DiMPCZMTSMj9UT56Cv6T7f5CuxvOMhpNncaNieQ4z4d32p7ruEtAfRsb7Ya8Gw==}
nanoid@3.3.8: nanoid@3.3.8:
resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
@@ -4392,8 +4390,8 @@ packages:
no-case@3.0.4: no-case@3.0.4:
resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
node-abi@3.74.0: node-abi@3.75.0:
resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==}
engines: {node: '>=10'} engines: {node: '>=10'}
node-abort-controller@3.1.1: node-abort-controller@3.1.1:
@@ -4469,8 +4467,8 @@ packages:
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
on-headers@1.0.2: on-headers@1.1.0:
resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
once@1.4.0: once@1.4.0:
@@ -4480,8 +4478,8 @@ packages:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'} engines: {node: '>=6'}
openpgp@6.1.0: openpgp@6.2.0:
resolution: {integrity: sha512-fRTeitP+hoGJD3kbdUlAI++wE6MvfvXw1rBqHwmBMxIpLjowatJ2zb5ThkORpIkSz5F12wO+xCYRSTbT7M4qKA==} resolution: {integrity: sha512-zKbgazxMeGrTqUEWicKufbdcjv2E0om3YVxw+I3hRykp8ODp+yQOJIDqIr1UXJjP8vR2fky3bNQwYoQXyFkYMA==}
engines: {node: '>= 18.0.0'} engines: {node: '>= 18.0.0'}
optimism@0.18.1: optimism@0.18.1:
@@ -4643,8 +4641,8 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
prettier@3.5.3: prettier@3.6.2:
resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
@@ -4673,8 +4671,8 @@ packages:
proxy-from-env@1.1.0: proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
pump@3.0.2: pump@3.0.3:
resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
punycode@2.3.1: punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
@@ -5074,8 +5072,8 @@ packages:
sprintf-js@1.1.3: sprintf-js@1.1.3:
resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
sql-highlight@6.0.0: sql-highlight@6.1.0:
resolution: {integrity: sha512-+fLpbAbWkQ+d0JEchJT/NrRRXbYRNbG15gFpANx73EwxQB1PRjj+k/OI0GTU0J63g8ikGkJECQp9z8XEJZvPRw==} resolution: {integrity: sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==}
engines: {node: '>=14'} engines: {node: '>=14'}
statuses@2.0.1: statuses@2.0.1:
@@ -5192,8 +5190,8 @@ packages:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
tar-fs@2.1.2: tar-fs@2.1.3:
resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==}
tar-stream@2.2.0: tar-stream@2.2.0:
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
@@ -5759,7 +5757,7 @@ snapshots:
'@protobufjs/pool': 1.1.0 '@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0 '@protobufjs/utf8': 1.1.0
'@types/long': 4.0.2 '@types/long': 4.0.2
'@types/node': 10.17.60 '@types/node': 10.12.18
long: 4.0.0 long: 4.0.0
'@apollo/protobufjs@1.2.7': '@apollo/protobufjs@1.2.7':
@@ -6002,12 +6000,12 @@ snapshots:
'@cosmjs/math': 0.32.4 '@cosmjs/math': 0.32.4
'@cosmjs/utils': 0.32.4 '@cosmjs/utils': 0.32.4
'@cosmjs/amino@0.33.0': '@cosmjs/amino@0.33.1':
dependencies: dependencies:
'@cosmjs/crypto': 0.33.0 '@cosmjs/crypto': 0.33.1
'@cosmjs/encoding': 0.33.0 '@cosmjs/encoding': 0.33.1
'@cosmjs/math': 0.33.0 '@cosmjs/math': 0.33.1
'@cosmjs/utils': 0.33.0 '@cosmjs/utils': 0.33.1
'@cosmjs/crypto@0.27.1': '@cosmjs/crypto@0.27.1':
dependencies: dependencies:
@@ -6042,11 +6040,11 @@ snapshots:
elliptic: 6.6.1 elliptic: 6.6.1
libsodium-wrappers-sumo: 0.7.15 libsodium-wrappers-sumo: 0.7.15
'@cosmjs/crypto@0.33.0': '@cosmjs/crypto@0.33.1':
dependencies: dependencies:
'@cosmjs/encoding': 0.33.0 '@cosmjs/encoding': 0.33.1
'@cosmjs/math': 0.33.0 '@cosmjs/math': 0.33.1
'@cosmjs/utils': 0.33.0 '@cosmjs/utils': 0.33.1
'@noble/hashes': 1.7.1 '@noble/hashes': 1.7.1
bn.js: 5.2.1 bn.js: 5.2.1
elliptic: 6.6.1 elliptic: 6.6.1
@@ -6070,7 +6068,7 @@ snapshots:
bech32: 1.1.4 bech32: 1.1.4
readonly-date: 1.0.0 readonly-date: 1.0.0
'@cosmjs/encoding@0.33.0': '@cosmjs/encoding@0.33.1':
dependencies: dependencies:
base64-js: 1.5.1 base64-js: 1.5.1
bech32: 1.1.4 bech32: 1.1.4
@@ -6081,9 +6079,9 @@ snapshots:
'@cosmjs/stream': 0.32.4 '@cosmjs/stream': 0.32.4
xstream: 11.14.0 xstream: 11.14.0
'@cosmjs/json-rpc@0.33.0': '@cosmjs/json-rpc@0.33.1':
dependencies: dependencies:
'@cosmjs/stream': 0.33.0 '@cosmjs/stream': 0.33.1
xstream: 11.14.0 xstream: 11.14.0
'@cosmjs/launchpad@0.27.1(debug@4.4.0)': '@cosmjs/launchpad@0.27.1(debug@4.4.0)':
@@ -6110,7 +6108,7 @@ snapshots:
dependencies: dependencies:
bn.js: 5.2.1 bn.js: 5.2.1
'@cosmjs/math@0.33.0': '@cosmjs/math@0.33.1':
dependencies: dependencies:
bn.js: 5.2.1 bn.js: 5.2.1
@@ -6123,13 +6121,13 @@ snapshots:
'@cosmjs/utils': 0.32.4 '@cosmjs/utils': 0.32.4
cosmjs-types: 0.9.0 cosmjs-types: 0.9.0
'@cosmjs/proto-signing@0.33.0': '@cosmjs/proto-signing@0.33.1':
dependencies: dependencies:
'@cosmjs/amino': 0.33.0 '@cosmjs/amino': 0.33.1
'@cosmjs/crypto': 0.33.0 '@cosmjs/crypto': 0.33.1
'@cosmjs/encoding': 0.33.0 '@cosmjs/encoding': 0.33.1
'@cosmjs/math': 0.33.0 '@cosmjs/math': 0.33.1
'@cosmjs/utils': 0.33.0 '@cosmjs/utils': 0.33.1
cosmjs-types: 0.9.0 cosmjs-types: 0.9.0
'@cosmjs/socket@0.32.4': '@cosmjs/socket@0.32.4':
@@ -6142,9 +6140,9 @@ snapshots:
- bufferutil - bufferutil
- utf-8-validate - utf-8-validate
'@cosmjs/socket@0.33.0': '@cosmjs/socket@0.33.1':
dependencies: dependencies:
'@cosmjs/stream': 0.33.0 '@cosmjs/stream': 0.33.1
isomorphic-ws: 4.0.1(ws@7.5.10) isomorphic-ws: 4.0.1(ws@7.5.10)
ws: 7.5.10 ws: 7.5.10
xstream: 11.14.0 xstream: 11.14.0
@@ -6169,15 +6167,15 @@ snapshots:
- debug - debug
- utf-8-validate - utf-8-validate
'@cosmjs/stargate@0.33.0(debug@4.4.0)': '@cosmjs/stargate@0.33.1(debug@4.4.0)':
dependencies: dependencies:
'@cosmjs/amino': 0.33.0 '@cosmjs/amino': 0.33.1
'@cosmjs/encoding': 0.33.0 '@cosmjs/encoding': 0.33.1
'@cosmjs/math': 0.33.0 '@cosmjs/math': 0.33.1
'@cosmjs/proto-signing': 0.33.0 '@cosmjs/proto-signing': 0.33.1
'@cosmjs/stream': 0.33.0 '@cosmjs/stream': 0.33.1
'@cosmjs/tendermint-rpc': 0.33.0(debug@4.4.0) '@cosmjs/tendermint-rpc': 0.33.1(debug@4.4.0)
'@cosmjs/utils': 0.33.0 '@cosmjs/utils': 0.33.1
cosmjs-types: 0.9.0 cosmjs-types: 0.9.0
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
@@ -6188,7 +6186,7 @@ snapshots:
dependencies: dependencies:
xstream: 11.14.0 xstream: 11.14.0
'@cosmjs/stream@0.33.0': '@cosmjs/stream@0.33.1':
dependencies: dependencies:
xstream: 11.14.0 xstream: 11.14.0
@@ -6201,7 +6199,7 @@ snapshots:
'@cosmjs/socket': 0.32.4 '@cosmjs/socket': 0.32.4
'@cosmjs/stream': 0.32.4 '@cosmjs/stream': 0.32.4
'@cosmjs/utils': 0.32.4 '@cosmjs/utils': 0.32.4
axios: 1.8.2(debug@4.4.0) axios: 1.8.4(debug@4.4.0)
readonly-date: 1.0.0 readonly-date: 1.0.0
xstream: 11.14.0 xstream: 11.14.0
transitivePeerDependencies: transitivePeerDependencies:
@@ -6209,16 +6207,16 @@ snapshots:
- debug - debug
- utf-8-validate - utf-8-validate
'@cosmjs/tendermint-rpc@0.33.0(debug@4.4.0)': '@cosmjs/tendermint-rpc@0.33.1(debug@4.4.0)':
dependencies: dependencies:
'@cosmjs/crypto': 0.33.0 '@cosmjs/crypto': 0.33.1
'@cosmjs/encoding': 0.33.0 '@cosmjs/encoding': 0.33.1
'@cosmjs/json-rpc': 0.33.0 '@cosmjs/json-rpc': 0.33.1
'@cosmjs/math': 0.33.0 '@cosmjs/math': 0.33.1
'@cosmjs/socket': 0.33.0 '@cosmjs/socket': 0.33.1
'@cosmjs/stream': 0.33.0 '@cosmjs/stream': 0.33.1
'@cosmjs/utils': 0.33.0 '@cosmjs/utils': 0.33.1
axios: 1.8.2(debug@4.4.0) axios: 1.8.4(debug@4.4.0)
readonly-date: 1.0.0 readonly-date: 1.0.0
xstream: 11.14.0 xstream: 11.14.0
transitivePeerDependencies: transitivePeerDependencies:
@@ -6232,7 +6230,7 @@ snapshots:
'@cosmjs/utils@0.32.4': {} '@cosmjs/utils@0.32.4': {}
'@cosmjs/utils@0.33.0': {} '@cosmjs/utils@0.33.1': {}
'@cspotcode/source-map-support@0.8.1': '@cspotcode/source-map-support@0.8.1':
dependencies: dependencies:
@@ -6602,9 +6600,9 @@ snapshots:
graphql: 16.10.0 graphql: 16.10.0
tslib: 2.8.1 tslib: 2.8.1
'@graphql-tools/merge@9.0.22(graphql@16.10.0)': '@graphql-tools/merge@9.1.1(graphql@16.10.0)':
dependencies: dependencies:
'@graphql-tools/utils': 10.8.4(graphql@16.10.0) '@graphql-tools/utils': 10.9.1(graphql@16.10.0)
graphql: 16.10.0 graphql: 16.10.0
tslib: 2.8.1 tslib: 2.8.1
@@ -6616,10 +6614,10 @@ snapshots:
graphql: 16.10.0 graphql: 16.10.0
tslib: 2.8.1 tslib: 2.8.1
'@graphql-tools/schema@10.0.21(graphql@16.10.0)': '@graphql-tools/schema@10.0.25(graphql@16.10.0)':
dependencies: dependencies:
'@graphql-tools/merge': 9.0.22(graphql@16.10.0) '@graphql-tools/merge': 9.1.1(graphql@16.10.0)
'@graphql-tools/utils': 10.8.4(graphql@16.10.0) '@graphql-tools/utils': 10.9.1(graphql@16.10.0)
graphql: 16.10.0 graphql: 16.10.0
tslib: 2.8.1 tslib: 2.8.1
@@ -6639,10 +6637,10 @@ snapshots:
tslib: 2.8.1 tslib: 2.8.1
value-or-promise: 1.0.12 value-or-promise: 1.0.12
'@graphql-tools/utils@10.8.4(graphql@16.10.0)': '@graphql-tools/utils@10.9.1(graphql@16.10.0)':
dependencies: dependencies:
'@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0)
'@whatwg-node/promise-helpers': 1.2.4 '@whatwg-node/promise-helpers': 1.3.2
cross-inspect: 1.0.1 cross-inspect: 1.0.1
dset: 3.1.4 dset: 3.1.4
graphql: 16.10.0 graphql: 16.10.0
@@ -6824,14 +6822,16 @@ snapshots:
dependencies: dependencies:
'@noble/hashes': 1.3.2 '@noble/hashes': 1.3.2
'@noble/curves@1.8.1': '@noble/curves@1.9.7':
dependencies: dependencies:
'@noble/hashes': 1.7.1 '@noble/hashes': 1.8.0
'@noble/hashes@1.3.2': {} '@noble/hashes@1.3.2': {}
'@noble/hashes@1.7.1': {} '@noble/hashes@1.7.1': {}
'@noble/hashes@1.8.0': {}
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
dependencies: dependencies:
'@nodelib/fs.stat': 2.0.5 '@nodelib/fs.stat': 2.0.5
@@ -7982,7 +7982,7 @@ snapshots:
'@turnkey/api-key-stamper@0.4.0': '@turnkey/api-key-stamper@0.4.0':
dependencies: dependencies:
'@noble/curves': 1.8.1 '@noble/curves': 1.9.7
'@turnkey/encoding': 0.1.0 '@turnkey/encoding': 0.1.0
sha256-uint8array: 0.10.7 sha256-uint8array: 0.10.7
@@ -8026,7 +8026,7 @@ snapshots:
'@types/connect': 3.4.38 '@types/connect': 3.4.38
'@types/node': 20.17.23 '@types/node': 20.17.23
'@types/body-parser@1.19.5': '@types/body-parser@1.19.6':
dependencies: dependencies:
'@types/connect': 3.4.38 '@types/connect': 3.4.38
'@types/node': 20.17.23 '@types/node': 20.17.23
@@ -8039,12 +8039,12 @@ snapshots:
'@types/cookie-session@2.0.49': '@types/cookie-session@2.0.49':
dependencies: dependencies:
'@types/express': 4.17.21 '@types/express': 4.17.23
'@types/keygrip': 1.0.6 '@types/keygrip': 1.0.6
'@types/cors@2.8.12': {} '@types/cors@2.8.12': {}
'@types/cors@2.8.17': '@types/cors@2.8.19':
dependencies: dependencies:
'@types/node': 20.17.23 '@types/node': 20.17.23
@@ -8081,33 +8081,33 @@ snapshots:
'@types/express-serve-static-core@4.17.31': '@types/express-serve-static-core@4.17.31':
dependencies: dependencies:
'@types/node': 20.17.23 '@types/node': 20.17.23
'@types/qs': 6.9.18 '@types/qs': 6.14.0
'@types/range-parser': 1.2.7 '@types/range-parser': 1.2.7
'@types/express-serve-static-core@4.19.6': '@types/express-serve-static-core@4.19.6':
dependencies: dependencies:
'@types/node': 20.17.23 '@types/node': 20.17.23
'@types/qs': 6.9.18 '@types/qs': 6.14.0
'@types/range-parser': 1.2.7 '@types/range-parser': 1.2.7
'@types/send': 0.17.4 '@types/send': 0.17.5
'@types/express-session@1.18.1': '@types/express-session@1.18.2':
dependencies: dependencies:
'@types/express': 4.17.21 '@types/express': 4.17.23
'@types/express@4.17.14': '@types/express@4.17.14':
dependencies: dependencies:
'@types/body-parser': 1.19.2 '@types/body-parser': 1.19.2
'@types/express-serve-static-core': 4.17.31 '@types/express-serve-static-core': 4.17.31
'@types/qs': 6.9.18 '@types/qs': 6.14.0
'@types/serve-static': 1.15.7 '@types/serve-static': 1.15.8
'@types/express@4.17.21': '@types/express@4.17.23':
dependencies: dependencies:
'@types/body-parser': 1.19.5 '@types/body-parser': 1.19.6
'@types/express-serve-static-core': 4.19.6 '@types/express-serve-static-core': 4.19.6
'@types/qs': 6.9.18 '@types/qs': 6.14.0
'@types/serve-static': 1.15.7 '@types/serve-static': 1.15.8
'@types/fs-extra@11.0.4': '@types/fs-extra@11.0.4':
dependencies: dependencies:
@@ -8121,7 +8121,7 @@ snapshots:
'@types/google-protobuf@3.15.12': {} '@types/google-protobuf@3.15.12': {}
'@types/http-errors@2.0.4': {} '@types/http-errors@2.0.5': {}
'@types/inquirer@6.5.0': '@types/inquirer@6.5.0':
dependencies: dependencies:
@@ -8151,8 +8151,6 @@ snapshots:
'@types/node@10.12.18': {} '@types/node@10.12.18': {}
'@types/node@10.17.60': {}
'@types/node@17.0.45': {} '@types/node@17.0.45': {}
'@types/node@20.17.23': '@types/node@20.17.23':
@@ -8173,7 +8171,7 @@ snapshots:
'@types/prop-types@15.7.14': {} '@types/prop-types@15.7.14': {}
'@types/qs@6.9.18': {} '@types/qs@6.14.0': {}
'@types/range-parser@1.2.7': {} '@types/range-parser@1.2.7': {}
@@ -8190,18 +8188,18 @@ snapshots:
dependencies: dependencies:
'@types/node': 20.17.23 '@types/node': 20.17.23
'@types/semver@7.5.8': {} '@types/semver@7.7.0': {}
'@types/send@0.17.4': '@types/send@0.17.5':
dependencies: dependencies:
'@types/mime': 1.3.5 '@types/mime': 1.3.5
'@types/node': 20.17.23 '@types/node': 20.17.23
'@types/serve-static@1.15.7': '@types/serve-static@1.15.8':
dependencies: dependencies:
'@types/http-errors': 2.0.4 '@types/http-errors': 2.0.5
'@types/node': 20.17.23 '@types/node': 20.17.23
'@types/send': 0.17.4 '@types/send': 0.17.5
'@types/through@0.0.33': '@types/through@0.0.33':
dependencies: dependencies:
@@ -8209,7 +8207,7 @@ snapshots:
'@types/tinycolor2@1.4.6': {} '@types/tinycolor2@1.4.6': {}
'@whatwg-node/promise-helpers@1.2.4': '@whatwg-node/promise-helpers@1.3.2':
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
@@ -8420,15 +8418,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- debug - debug
axios@1.8.2(debug@4.4.0): axios@1.8.4(debug@4.4.0):
dependencies:
follow-redirects: 1.15.9(debug@4.4.0)
form-data: 4.0.2
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
axios@1.8.4:
dependencies: dependencies:
follow-redirects: 1.15.9(debug@4.4.0) follow-redirects: 1.15.9(debug@4.4.0)
form-data: 4.0.2 form-data: 4.0.2
@@ -8765,11 +8755,11 @@ snapshots:
content-type@1.0.5: {} content-type@1.0.5: {}
cookie-session@2.1.0: cookie-session@2.1.1:
dependencies: dependencies:
cookies: 0.9.1 cookies: 0.9.1
debug: 3.2.7 debug: 3.2.7
on-headers: 1.0.2 on-headers: 1.1.0
safe-buffer: 5.2.1 safe-buffer: 5.2.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -9057,7 +9047,7 @@ snapshots:
encodeurl@2.0.0: {} encodeurl@2.0.0: {}
end-of-stream@1.4.4: end-of-stream@1.4.5:
dependencies: dependencies:
once: 1.4.0 once: 1.4.0
@@ -9243,13 +9233,13 @@ snapshots:
dependencies: dependencies:
express: 4.21.2 express: 4.21.2
express-session@1.18.1: express-session@1.18.2:
dependencies: dependencies:
cookie: 0.7.2 cookie: 0.7.2
cookie-signature: 1.0.7 cookie-signature: 1.0.7
debug: 2.6.9 debug: 2.6.9
depd: 2.0.0 depd: 2.0.0
on-headers: 1.0.2 on-headers: 1.1.0
parseurl: 1.3.3 parseurl: 1.3.3
safe-buffer: 5.2.1 safe-buffer: 5.2.1
uid-safe: 2.1.5 uid-safe: 2.1.5
@@ -9374,7 +9364,7 @@ snapshots:
jsonfile: 6.1.0 jsonfile: 6.1.0
universalify: 2.0.1 universalify: 2.0.1
fs-extra@11.3.0: fs-extra@11.3.1:
dependencies: dependencies:
graceful-fs: 4.2.11 graceful-fs: 4.2.11
jsonfile: 6.1.0 jsonfile: 6.1.0
@@ -9934,7 +9924,7 @@ snapshots:
dependencies: dependencies:
react: 19.0.0 react: 19.0.0
luxon@3.5.0: {} luxon@3.7.1: {}
make-error@1.3.6: {} make-error@1.3.6: {}
@@ -10015,7 +10005,7 @@ snapshots:
nan@2.22.2: {} nan@2.22.2: {}
nanoid-dictionary@5.0.0-beta.1: {} nanoid-dictionary@5.0.0: {}
nanoid@3.3.8: {} nanoid@3.3.8: {}
@@ -10066,7 +10056,7 @@ snapshots:
lower-case: 2.0.2 lower-case: 2.0.2
tslib: 2.8.1 tslib: 2.8.1
node-abi@3.74.0: node-abi@3.75.0:
dependencies: dependencies:
semver: 7.7.1 semver: 7.7.1
@@ -10143,7 +10133,7 @@ snapshots:
dependencies: dependencies:
ee-first: 1.1.1 ee-first: 1.1.1
on-headers@1.0.2: {} on-headers@1.1.0: {}
once@1.4.0: once@1.4.0:
dependencies: dependencies:
@@ -10153,7 +10143,7 @@ snapshots:
dependencies: dependencies:
mimic-fn: 2.1.0 mimic-fn: 2.1.0
openpgp@6.1.0: {} openpgp@6.2.0: {}
optimism@0.18.1: optimism@0.18.1:
dependencies: dependencies:
@@ -10329,14 +10319,14 @@ snapshots:
minimist: 1.2.8 minimist: 1.2.8
mkdirp-classic: 0.5.3 mkdirp-classic: 0.5.3
napi-build-utils: 2.0.0 napi-build-utils: 2.0.0
node-abi: 3.74.0 node-abi: 3.75.0
pump: 3.0.2 pump: 3.0.3
rc: 1.2.8 rc: 1.2.8
simple-get: 4.0.1 simple-get: 4.0.1
tar-fs: 2.1.2 tar-fs: 2.1.3
tunnel-agent: 0.6.0 tunnel-agent: 0.6.0
prettier@3.5.3: {} prettier@3.6.2: {}
process-nextick-args@2.0.1: {} process-nextick-args@2.0.1: {}
@@ -10386,9 +10376,9 @@ snapshots:
proxy-from-env@1.1.0: {} proxy-from-env@1.1.0: {}
pump@3.0.2: pump@3.0.3:
dependencies: dependencies:
end-of-stream: 1.4.4 end-of-stream: 1.4.5
once: 1.4.0 once: 1.4.0
punycode@2.3.1: {} punycode@2.3.1: {}
@@ -10852,7 +10842,7 @@ snapshots:
sprintf-js@1.1.3: {} sprintf-js@1.1.3: {}
sql-highlight@6.0.0: {} sql-highlight@6.1.0: {}
statuses@2.0.1: {} statuses@2.0.1: {}
@@ -11002,17 +10992,17 @@ snapshots:
tapable@2.2.1: {} tapable@2.2.1: {}
tar-fs@2.1.2: tar-fs@2.1.3:
dependencies: dependencies:
chownr: 1.1.4 chownr: 1.1.4
mkdirp-classic: 0.5.3 mkdirp-classic: 0.5.3
pump: 3.0.2 pump: 3.0.3
tar-stream: 2.2.0 tar-stream: 2.2.0
tar-stream@2.2.0: tar-stream@2.2.0:
dependencies: dependencies:
bl: 4.1.0 bl: 4.1.0
end-of-stream: 1.4.4 end-of-stream: 1.4.5
fs-constants: 1.0.0 fs-constants: 1.0.0
inherits: 2.0.4 inherits: 2.0.4
readable-stream: 3.6.2 readable-stream: 3.6.2
@@ -11218,7 +11208,7 @@ snapshots:
glob: 10.4.5 glob: 10.4.5
reflect-metadata: 0.2.2 reflect-metadata: 0.2.2
sha.js: 2.4.11 sha.js: 2.4.11
sql-highlight: 6.0.0 sql-highlight: 6.1.0
tslib: 2.8.1 tslib: 2.8.1
uuid: 11.1.0 uuid: 11.1.0
yargs: 17.7.2 yargs: 17.7.2
+23 -1
View File
@@ -41,7 +41,7 @@ Create a `.env.local` file in the `apps/deploy-fe` directory:
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=your_clerk_key NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=your_clerk_key
CLERK_SECRET_KEY=your_clerk_secret CLERK_SECRET_KEY=your_clerk_secret
NEXT_PUBLIC_WALLET_IFRAME_URL=http://localhost:4000 NEXT_PUBLIC_WALLET_IFRAME_URL=http://localhost:4000
NEXT_PUBLIC_LACONICD_CHAIN_ID=laconic-testnet-2 NEXT_PUBLIC_LACONICD_CHAIN_ID=laconic-mainnet
NEXT_PUBLIC_API_URL=http://localhost:8000 NEXT_PUBLIC_API_URL=http://localhost:8000
NEXT_PUBLIC_GITHUB_FALLBACK_TOKEN=your_github_token NEXT_PUBLIC_GITHUB_FALLBACK_TOKEN=your_github_token
``` ```
@@ -93,3 +93,25 @@ Make sure you have:
1. Connected your GitHub account in Clerk 1. Connected your GitHub account in Clerk
2. Provided the necessary permissions for repository access 2. Provided the necessary permissions for repository access
3. Set a fallback GitHub token in `.env.local` if needed for development 3. Set a fallback GitHub token in `.env.local` if needed for development
## Test deployment
- Install stack-orchestrator from <https://git.vdb.to/cerc-io/stack-orchestrator#install>
- Build the container for app
```bash
laconic-so build-webapp --source-repo <path-to-app-repo>/laconic-deployer-frontend --base-container cerc/nextjs-base
```
- Create an env file as described in [previous steps](#3-configure-environment-variables)
- Run the webapp container locally
```bash
docker run -p 3000:80 --env-file <path-to-env-file> cerc/laconic-deployer-frontend:local
```
- Scripts used for deployment
- App container build : [build-webapp.sh](./build-webapp.sh)
- Run app container : [run-webapp.sh](./run-webapp.sh)
+396
View File
@@ -0,0 +1,396 @@
./.github/CONTRIBUTING.md
./.turbo/cache/88602030b8f39256-meta.json
./.turbo/cache/981738a1c69b2e12-meta.json
./.turbo/cache/cff97096ef4824bd-meta.json
./.turbo/preferences/tui.json
./.vscode/extensions.json
./.vscode/settings.json
./BACKEND_CONNECTION.md
./apps/backend/README.md
./apps/backend/biome.json
./apps/backend/dist/config.d.ts
./apps/backend/dist/constants.d.ts
./apps/backend/dist/database.d.ts
./apps/backend/dist/entity/Deployer.d.ts
./apps/backend/dist/entity/Deployment.d.ts
./apps/backend/dist/entity/Domain.d.ts
./apps/backend/dist/entity/EnvironmentVariable.d.ts
./apps/backend/dist/entity/Organization.d.ts
./apps/backend/dist/entity/Project.d.ts
./apps/backend/dist/entity/ProjectMember.d.ts
./apps/backend/dist/entity/User.d.ts
./apps/backend/dist/entity/UserOrganization.d.ts
./apps/backend/dist/index.d.ts
./apps/backend/dist/registry.d.ts
./apps/backend/dist/resolvers.d.ts
./apps/backend/dist/routes/auth.d.ts
./apps/backend/dist/routes/github.d.ts
./apps/backend/dist/routes/staging.d.ts
./apps/backend/dist/server.d.ts
./apps/backend/dist/service.d.ts
./apps/backend/dist/turnkey-backend.d.ts
./apps/backend/dist/types.d.ts
./apps/backend/dist/utils.d.ts
./apps/backend/environments/local.toml
./apps/backend/package.json
./apps/backend/src/config.ts
./apps/backend/src/constants.ts
./apps/backend/src/database.ts
./apps/backend/src/entity/Deployer.ts
./apps/backend/src/entity/Deployment.ts
./apps/backend/src/entity/Domain.ts
./apps/backend/src/entity/EnvironmentVariable.ts
./apps/backend/src/entity/Organization.ts
./apps/backend/src/entity/Project.ts
./apps/backend/src/entity/ProjectMember.ts
./apps/backend/src/entity/User.ts
./apps/backend/src/entity/UserOrganization.ts
./apps/backend/src/index.ts
./apps/backend/src/registry.ts
./apps/backend/src/resolvers.ts
./apps/backend/src/routes/auth.ts
./apps/backend/src/routes/github.ts
./apps/backend/src/routes/staging.ts
./apps/backend/src/server.ts
./apps/backend/src/service.ts
./apps/backend/src/turnkey-backend.ts
./apps/backend/src/types.ts
./apps/backend/src/utils.ts
./apps/backend/test/delete-db.ts
./apps/backend/test/fixtures/deployments.json
./apps/backend/test/fixtures/environment-variables.json
./apps/backend/test/fixtures/organizations.json
./apps/backend/test/fixtures/primary-domains.json
./apps/backend/test/fixtures/project-members.json
./apps/backend/test/fixtures/projects.json
./apps/backend/test/fixtures/redirected-domains.json
./apps/backend/test/fixtures/user-organizations.json
./apps/backend/test/fixtures/users.json
./apps/backend/test/initialize-db.ts
./apps/backend/test/initialize-registry.ts
./apps/backend/test/publish-deploy-records.ts
./apps/backend/test/publish-deployment-removal-records.ts
./apps/backend/tsconfig.json
./apps/deploy-fe/.vscode/settings.json
./apps/deploy-fe/components.json
./apps/deploy-fe/next-env.d.ts
./apps/deploy-fe/package.json
./apps/deploy-fe/src/actions/github.ts
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/documentation/DocumentationPlaceholder.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/documentation/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/home/loading.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/home/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/layout.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/(create)/cr/(template)/tm/(configure)/cf/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/(create)/cr/(template)/tm/(deploy)/dp/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/(create)/cr/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(deployments)/dep/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(integrations)/int/GitPage.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(integrations)/int/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(settings)/set/(collaborators)/col/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(settings)/set/(domains)/dom/(add)/cf/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(settings)/set/(domains)/dom/(add)/config/cf/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(settings)/set/(environment-variables)/env/EnvVarsPage.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(settings)/set/(environment-variables)/env/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(settings)/set/(git)/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(settings)/set/ProjectSettingsPage.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/(settings)/set/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/deployments/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/layout.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/loading.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/[provider]/ps/[id]/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/error.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/loading.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/projects/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/purchase/BuyServices.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/purchase/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/store/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/support/SupportPlaceholder.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/support/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/(dashboard)/wallet/page.tsx
./apps/deploy-fe/src/app/(web3-authenticated)/layout.tsx
./apps/deploy-fe/src/app/actions/github.ts
./apps/deploy-fe/src/app/api/auth/route.ts
./apps/deploy-fe/src/app/api/github/webhook/route.ts
./apps/deploy-fe/src/app/auth/github/backend-callback/page.tsx
./apps/deploy-fe/src/app/layout.tsx
./apps/deploy-fe/src/app/loading.tsx
./apps/deploy-fe/src/app/page.tsx
./apps/deploy-fe/src/app/sign-in/[[...sign-in]]/page.tsx
./apps/deploy-fe/src/app/test-connection/page.tsx
./apps/deploy-fe/src/components/AuthTest.tsx
./apps/deploy-fe/src/components/DeploymentTest.tsx
./apps/deploy-fe/src/components/DevAuth.tsx
./apps/deploy-fe/src/components/DirectKeyAuth.tsx
./apps/deploy-fe/src/components/GItHubBackendAuth.tsx
./apps/deploy-fe/src/components/GQLTest.tsx
./apps/deploy-fe/src/components/TurnkeyAuth.tsx
./apps/deploy-fe/src/components/WalletConnectAuth.tsx
./apps/deploy-fe/src/components/assets/laconic-mark.tsx
./apps/deploy-fe/src/components/core/dropdown/Dropdown.tsx
./apps/deploy-fe/src/components/core/dropdown/README.md
./apps/deploy-fe/src/components/core/dropdown/index.ts
./apps/deploy-fe/src/components/core/dropdown/types.ts
./apps/deploy-fe/src/components/core/format-milli-second/FormatMilliSecond.tsx
./apps/deploy-fe/src/components/core/format-milli-second/README.md
./apps/deploy-fe/src/components/core/format-milli-second/index.ts
./apps/deploy-fe/src/components/core/format-milli-second/types.ts
./apps/deploy-fe/src/components/core/logo/Logo.tsx
./apps/deploy-fe/src/components/core/logo/README.md
./apps/deploy-fe/src/components/core/logo/index.ts
./apps/deploy-fe/src/components/core/logo/types.ts
./apps/deploy-fe/src/components/core/search-bar/README.md
./apps/deploy-fe/src/components/core/search-bar/SearchBar.tsx
./apps/deploy-fe/src/components/core/search-bar/index.ts
./apps/deploy-fe/src/components/core/search-bar/types.ts
./apps/deploy-fe/src/components/core/stepper/README.md
./apps/deploy-fe/src/components/core/stepper/Stepper.tsx
./apps/deploy-fe/src/components/core/stepper/index.ts
./apps/deploy-fe/src/components/core/stepper/types.ts
./apps/deploy-fe/src/components/core/stop-watch/README.md
./apps/deploy-fe/src/components/core/stop-watch/StopWatch.tsx
./apps/deploy-fe/src/components/core/stop-watch/index.ts
./apps/deploy-fe/src/components/core/stop-watch/types.ts
./apps/deploy-fe/src/components/core/vertical-stepper/README.md
./apps/deploy-fe/src/components/core/vertical-stepper/VerticalStepper.tsx
./apps/deploy-fe/src/components/core/vertical-stepper/index.ts
./apps/deploy-fe/src/components/core/vertical-stepper/types.ts
./apps/deploy-fe/src/components/foundation/coming-soon-overlay/ComingSoonOverlay.tsx
./apps/deploy-fe/src/components/foundation/coming-soon-overlay/index.ts
./apps/deploy-fe/src/components/foundation/github-session-button/GitHubSessionButton.tsx
./apps/deploy-fe/src/components/foundation/github-session-button/README.md
./apps/deploy-fe/src/components/foundation/github-session-button/index.ts
./apps/deploy-fe/src/components/foundation/github-session-button/types.ts
./apps/deploy-fe/src/components/foundation/index.ts
./apps/deploy-fe/src/components/foundation/laconic-icon/LaconicIcon.tsx
./apps/deploy-fe/src/components/foundation/laconic-icon/README.md
./apps/deploy-fe/src/components/foundation/laconic-icon/index.ts
./apps/deploy-fe/src/components/foundation/laconic-icon/types.ts
./apps/deploy-fe/src/components/foundation/loading/loading-overlay/LoadingOverlay.tsx
./apps/deploy-fe/src/components/foundation/loading/loading-overlay/README.md
./apps/deploy-fe/src/components/foundation/loading/loading-overlay/index.ts
./apps/deploy-fe/src/components/foundation/navigation-wrapper/NavigationWrapper.tsx
./apps/deploy-fe/src/components/foundation/navigation-wrapper/README.md
./apps/deploy-fe/src/components/foundation/navigation-wrapper/index.ts
./apps/deploy-fe/src/components/foundation/page-header/PageHeader.tsx
./apps/deploy-fe/src/components/foundation/page-header/README.md
./apps/deploy-fe/src/components/foundation/page-header/index.ts
./apps/deploy-fe/src/components/foundation/page-wrapper/PageWrapper.tsx
./apps/deploy-fe/src/components/foundation/page-wrapper/README.md
./apps/deploy-fe/src/components/foundation/page-wrapper/index.ts
./apps/deploy-fe/src/components/foundation/project-search-bar/ProjectSearchBar.tsx
./apps/deploy-fe/src/components/foundation/project-search-bar/README.md
./apps/deploy-fe/src/components/foundation/project-search-bar/index.ts
./apps/deploy-fe/src/components/foundation/project-search-bar/types.ts
./apps/deploy-fe/src/components/foundation/top-navigation/README.md
./apps/deploy-fe/src/components/foundation/top-navigation/dark-mode-toggle/DarkModeToggle.tsx
./apps/deploy-fe/src/components/foundation/top-navigation/dark-mode-toggle/README.md
./apps/deploy-fe/src/components/foundation/top-navigation/dark-mode-toggle/index.ts
./apps/deploy-fe/src/components/foundation/top-navigation/index.ts
./apps/deploy-fe/src/components/foundation/top-navigation/main-navigation/MainNavigation.tsx
./apps/deploy-fe/src/components/foundation/top-navigation/main-navigation/README.md
./apps/deploy-fe/src/components/foundation/top-navigation/main-navigation/index.ts
./apps/deploy-fe/src/components/foundation/top-navigation/navigation-item/NavigationItem.tsx
./apps/deploy-fe/src/components/foundation/top-navigation/navigation-item/README.md
./apps/deploy-fe/src/components/foundation/top-navigation/navigation-item/index.ts
./apps/deploy-fe/src/components/foundation/top-navigation/types.ts
./apps/deploy-fe/src/components/foundation/top-navigation/wallet-session-badge/README.md
./apps/deploy-fe/src/components/foundation/top-navigation/wallet-session-badge/WalletSessionBadge.tsx
./apps/deploy-fe/src/components/foundation/top-navigation/wallet-session-badge/index.ts
./apps/deploy-fe/src/components/foundation/types.ts
./apps/deploy-fe/src/components/foundation/wallet-session-id/README.md
./apps/deploy-fe/src/components/foundation/wallet-session-id/WalletSessionId.tsx
./apps/deploy-fe/src/components/foundation/wallet-session-id/index.ts
./apps/deploy-fe/src/components/foundation/wallet-session-id/types.ts
./apps/deploy-fe/src/components/iframe/auto-sign-in/AutoSignInIFrameModal.tsx
./apps/deploy-fe/src/components/iframe/auto-sign-in/README.md
./apps/deploy-fe/src/components/iframe/auto-sign-in/index.ts
./apps/deploy-fe/src/components/iframe/auto-sign-in/types.ts
./apps/deploy-fe/src/components/iframe/check-balance-iframe/CheckBalanceIframe.tsx
./apps/deploy-fe/src/components/iframe/check-balance-iframe/CheckBalanceWrapper.tsx
./apps/deploy-fe/src/components/iframe/check-balance-iframe/useCheckBalance.tsx
./apps/deploy-fe/src/components/layout/index.ts
./apps/deploy-fe/src/components/layout/navigation/github-session-button/GitHubSessionButton.tsx
./apps/deploy-fe/src/components/layout/navigation/github-session-button/README.md
./apps/deploy-fe/src/components/layout/navigation/github-session-button/index.ts
./apps/deploy-fe/src/components/layout/navigation/github-session-button/types.ts
./apps/deploy-fe/src/components/layout/navigation/laconic-icon/LaconicIcon.tsx
./apps/deploy-fe/src/components/layout/navigation/laconic-icon/README.md
./apps/deploy-fe/src/components/layout/navigation/laconic-icon/index.ts
./apps/deploy-fe/src/components/layout/navigation/laconic-icon/types.ts
./apps/deploy-fe/src/components/layout/navigation/navigation-actions/NavigationActions.tsx
./apps/deploy-fe/src/components/layout/navigation/navigation-actions/README.md
./apps/deploy-fe/src/components/layout/navigation/navigation-actions/index.ts
./apps/deploy-fe/src/components/layout/navigation/navigation-actions/types.ts
./apps/deploy-fe/src/components/layout/navigation/wallet-session-id/README.md
./apps/deploy-fe/src/components/layout/navigation/wallet-session-id/WalletSessionId.tsx
./apps/deploy-fe/src/components/layout/navigation/wallet-session-id/index.ts
./apps/deploy-fe/src/components/layout/navigation/wallet-session-id/types.ts
./apps/deploy-fe/src/components/loading/loading-overlay.tsx
./apps/deploy-fe/src/components/onboarding/OPTIMIZATION.md
./apps/deploy-fe/src/components/onboarding/Onboarding.tsx
./apps/deploy-fe/src/components/onboarding/OnboardingButton.tsx
./apps/deploy-fe/src/components/onboarding/OnboardingDialog.tsx
./apps/deploy-fe/src/components/onboarding/OnboardingSidebar.tsx
./apps/deploy-fe/src/components/onboarding/README.md
./apps/deploy-fe/src/components/onboarding/common/background-svg.tsx
./apps/deploy-fe/src/components/onboarding/common/index.ts
./apps/deploy-fe/src/components/onboarding/common/laconic-icon-lettering.tsx
./apps/deploy-fe/src/components/onboarding/common/onboarding-container.tsx
./apps/deploy-fe/src/components/onboarding/common/step-header.tsx
./apps/deploy-fe/src/components/onboarding/common/step-navigation.tsx
./apps/deploy-fe/src/components/onboarding/configure-step/configure-step.tsx
./apps/deploy-fe/src/components/onboarding/configure-step/disable_configure-step.tsx
./apps/deploy-fe/src/components/onboarding/configure-step/index.ts
./apps/deploy-fe/src/components/onboarding/connect-step/connect-button.tsx
./apps/deploy-fe/src/components/onboarding/connect-step/connect-deploy-first-app.tsx
./apps/deploy-fe/src/components/onboarding/connect-step/connect-initial.tsx
./apps/deploy-fe/src/components/onboarding/connect-step/connect-step.tsx
./apps/deploy-fe/src/components/onboarding/connect-step/disabled_connect-step.tsx
./apps/deploy-fe/src/components/onboarding/connect-step/index.ts
./apps/deploy-fe/src/components/onboarding/connect-step/repository-list.tsx
./apps/deploy-fe/src/components/onboarding/connect-step/template-list.tsx
./apps/deploy-fe/src/components/onboarding/deploy-step/deploy-step.tsx
./apps/deploy-fe/src/components/onboarding/deploy-step/disabled_deploy-step.tsx
./apps/deploy-fe/src/components/onboarding/deploy-step/index.ts
./apps/deploy-fe/src/components/onboarding/index.ts
./apps/deploy-fe/src/components/onboarding/sidebar/index.ts
./apps/deploy-fe/src/components/onboarding/sidebar/sidebar-nav.tsx
./apps/deploy-fe/src/components/onboarding/store.ts
./apps/deploy-fe/src/components/onboarding/success-step/success-step.tsx
./apps/deploy-fe/src/components/onboarding/types.ts
./apps/deploy-fe/src/components/onboarding/useOnboarding.ts
./apps/deploy-fe/src/components/projects/project/ProjectCard/FixedProjectCard.tsx
./apps/deploy-fe/src/components/projects/project/ProjectCard/ProjectCard.tsx
./apps/deploy-fe/src/components/projects/project/ProjectCard/ProjectCardActions.tsx
./apps/deploy-fe/src/components/projects/project/ProjectCard/ProjectDeploymentInfo.tsx
./apps/deploy-fe/src/components/projects/project/ProjectCard/ProjectStatusDot.tsx
./apps/deploy-fe/src/components/projects/project/ProjectCard/index.ts
./apps/deploy-fe/src/components/projects/project/ProjectSearchBar/ProjectSearchBar.tsx
./apps/deploy-fe/src/components/projects/project/ProjectSearchBar/ProjectSearchBarDialog.tsx
./apps/deploy-fe/src/components/projects/project/ProjectSearchBar/ProjectSearchBarEmpty.tsx
./apps/deploy-fe/src/components/projects/project/ProjectSearchBar/ProjectSearchBarItem.tsx
./apps/deploy-fe/src/components/projects/project/ProjectSearchBar/index.ts
./apps/deploy-fe/src/components/projects/project/deployments/DeploymentDetailsCard.tsx
./apps/deploy-fe/src/components/projects/project/deployments/FilterForm.tsx
./apps/deploy-fe/src/components/projects/project/overview/Activity/AuctionCard.tsx
./apps/deploy-fe/src/components/projects/project/overview/OverviewInfo.tsx
./apps/deploy-fe/src/components/providers.tsx
./apps/deploy-fe/src/context/GQLClientContext.tsx
./apps/deploy-fe/src/context/OctokitContext.tsx
./apps/deploy-fe/src/context/OctokitProviderWithRouter.tsx
./apps/deploy-fe/src/context/WalletContext.tsx
./apps/deploy-fe/src/context/WalletContextProvider.tsx
./apps/deploy-fe/src/context/index.ts
./apps/deploy-fe/src/hooks/disabled_useDeployment.tsx
./apps/deploy-fe/src/hooks/disabled_useRepoData.tsx
./apps/deploy-fe/src/hooks/useDeployment.tsx
./apps/deploy-fe/src/hooks/useRepoData.tsx
./apps/deploy-fe/src/hooks/useRepoSelection.tsx
./apps/deploy-fe/src/lib/utils.ts
./apps/deploy-fe/src/middleware.ts
./apps/deploy-fe/src/types/common.ts
./apps/deploy-fe/src/types/dashboard.ts
./apps/deploy-fe/src/types/deployment.ts
./apps/deploy-fe/src/types/hooks/use-mobile.tsx
./apps/deploy-fe/src/types/index.ts
./apps/deploy-fe/src/types/project.ts
./apps/deploy-fe/src/utils/getInitials.ts
./apps/deploy-fe/src/utils/time.ts
./apps/deploy-fe/standards/architecture/routes.md
./apps/deploy-fe/tailwind.config.ts
./apps/deploy-fe/tsconfig.json
./apps/deployer/README.md
./apps/deployer/biome.json
./apps/deployer/package.json
./apps/deployer/test/README.md
./biome.json
./docs/architecture/wallet_migration/0-wallet-integration-overview.md
./docs/architecture/wallet_migration/1-phase-1-wallet-core.md
./docs/architecture/wallet_migration/2-phase-2-wallet-ui.md
./docs/architecture/wallet_migration/3-phase-3-clerk-integration.md
./next-agent-01.md
./package.json
./readme.md
./scripts/README.md
./services/gql-client/biome.json
./services/gql-client/dist/index.d.ts
./services/gql-client/package.json
./services/gql-client/src/client.ts
./services/gql-client/src/index.ts
./services/gql-client/src/mutations.ts
./services/gql-client/src/queries.ts
./services/gql-client/src/types.ts
./services/gql-client/tsconfig.json
./services/gql-client/tsup.config.ts
./services/typescript-config/README.md
./services/typescript-config/base.json
./services/typescript-config/nextjs.json
./services/typescript-config/package.json
./services/typescript-config/react-library.json
./services/ui/components.json
./services/ui/package.json
./services/ui/src/components/accordion.tsx
./services/ui/src/components/alert-dialog.tsx
./services/ui/src/components/alert.tsx
./services/ui/src/components/aspect-ratio.tsx
./services/ui/src/components/avatar.tsx
./services/ui/src/components/badge.tsx
./services/ui/src/components/breadcrumb.tsx
./services/ui/src/components/button.tsx
./services/ui/src/components/calendar.tsx
./services/ui/src/components/card.tsx
./services/ui/src/components/carousel.tsx
./services/ui/src/components/chart.tsx
./services/ui/src/components/checkbox.tsx
./services/ui/src/components/collapsible.tsx
./services/ui/src/components/command.tsx
./services/ui/src/components/context-menu.tsx
./services/ui/src/components/dialog.tsx
./services/ui/src/components/drawer.tsx
./services/ui/src/components/dropdown-menu.tsx
./services/ui/src/components/form.tsx
./services/ui/src/components/hover-card.tsx
./services/ui/src/components/input-otp.tsx
./services/ui/src/components/input.tsx
./services/ui/src/components/label.tsx
./services/ui/src/components/menubar.tsx
./services/ui/src/components/navigation-menu.tsx
./services/ui/src/components/pagination.tsx
./services/ui/src/components/popover.tsx
./services/ui/src/components/progress.tsx
./services/ui/src/components/radio-group.tsx
./services/ui/src/components/resizable.tsx
./services/ui/src/components/scroll-area.tsx
./services/ui/src/components/select.tsx
./services/ui/src/components/separator.tsx
./services/ui/src/components/sheet.tsx
./services/ui/src/components/sidebar.tsx
./services/ui/src/components/skeleton.tsx
./services/ui/src/components/slider.tsx
./services/ui/src/components/sonner.tsx
./services/ui/src/components/switch.tsx
./services/ui/src/components/table.tsx
./services/ui/src/components/tabs.tsx
./services/ui/src/components/textarea.tsx
./services/ui/src/components/toggle-group.tsx
./services/ui/src/components/toggle.tsx
./services/ui/src/components/tooltip.tsx
./services/ui/src/hooks/use-mobile.ts
./services/ui/src/lib/utils.ts
./services/ui/tailwind.config.ts
./services/ui/tsconfig.json
./services/ui/tsconfig.lint.json
./standards/blueprints/file-migration-list.md
./standards/blueprints/next-app-router-structure.md
./standards/blueprints/nextjs-templates.md
./standards/blueprints/qwrk-laconic-migration-guide.md
./standards/current-tech-reference.md
./standards/documentation/COMPONENT_DOCUMENTATION.md
./standards/documentation/FEATURE_BUILDING.md
./standards/documentation/FEATURE_BUILDING_TEMPLATE.md
./standards/documentation/README.md
./standards/documentation/react-component-conventions.md
./tsconfig.base.json
./tsconfig.json
./turbo.json
Executable
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/env bash
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
set -x
fi
SCRIPT_DIR=/scripts/
PKG_DIR="./apps/deploy-fe"
cd $PKG_DIR
"$SCRIPT_DIR/apply-runtime-env.sh" "`pwd`" .next .next-r
mv .next .next.old
mv .next-r/.next .
pnpm build:generate || exit 1
pnpm start -p ${CERC_LISTEN_PORT:-80}
+5
View File
@@ -8,6 +8,11 @@
"outputs": [".next/**", "!.next/cache/**"], "outputs": [".next/**", "!.next/cache/**"],
"env": ["NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY", "CLERK_SECRET_KEY"] "env": ["NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY", "CLERK_SECRET_KEY"]
}, },
"build:compile": {
"dependsOn": ["^build"],
"inputs": ["$TURBO_DEFAULT$"],
"outputs": ["dist/**"]
},
"start": { "start": {
"dependsOn": ["^build"], "dependsOn": ["^build"],
"cache": false, "cache": false,