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": {
"dev": "NODE_OPTIONS='--inspect' next dev --turbopack",
"build": "next build",
"build:compile": "next build --experimental-build-mode compile",
"build:generate": "next build --experimental-build-mode generate",
"start": "next start",
"lint": "biome check .",
"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
let octokit;
try {
octokit = new Octokit({
auth: authToken || process.env.GITHUB_TOKEN
auth: process.env.GITHUB_TOKEN
});
// Test with a simple request
@@ -145,7 +142,7 @@ export default async function Page() {
Failed to access GitHub API
</div>
<div className="text-red-500 mb-4">
{authError.message}
{authError instanceof Error ? authError.message : 'An error occurred'}
</div>
<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>
@@ -182,7 +179,7 @@ export default async function Page() {
Failed to authenticate with GitHub
</div>
<div className="text-red-500">
{error.message}
{error instanceof Error ? error.message : 'Unknown error occurred'}
</div>
</div>
</PageWrapper>
@@ -4,7 +4,7 @@ import { useEffect, useState } from 'react'
import { useRouter } from 'next/navigation'
import { X } from 'lucide-react'
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 { ConfigureStep } from '@/components/onboarding/configure-step/configure-step'
import { DeployStep } from '@/components/onboarding/deploy-step/deploy-step'
@@ -30,7 +30,7 @@ export default function DeploymentsPage() {
// State for deployment logs modal
const [isLogsOpen, setIsLogsOpen] = useState(false);
const [selectedDeploymentId, setSelectedDeploymentId] = useState<string | null>(null);
const [, setSelectedDeploymentId] = useState<string | null>(null);
const [deploymentLogs, setDeploymentLogs] = useState<string>('');
// 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
// Comment this out to see the mock deployments
@@ -79,7 +66,9 @@ export default function DeploymentsPage() {
{
id: '1',
name: repoData ? `${repoData.name.toLowerCase()}.example.com` : 'example.com',
branch: 'main', // Add missing branch
status: 'ACTIVE',
createdAt: Date.now(), // Add missing createdAt
isCustom: false
}
];
@@ -3,12 +3,7 @@
import { useState } from "react";
import { LoadingOverlay } from "@/components/foundation/loading/loading-overlay";
import { PlusIcon, ChevronDownIcon, ChevronUpIcon, PencilIcon, TrashIcon } from "lucide-react";
interface EnvVarItem {
key: string;
value: string;
isEditing?: boolean;
}
import type { EnvVarItem } from '@/types'
interface EnvGroupProps {
title: string;
@@ -204,7 +199,7 @@ export default function EnvVarsPage() {
/>
<button
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
</button>
@@ -278,11 +278,9 @@ export default function ProjectSettingsPage({ project, onProjectUpdated }: Proje
Select account
</Label>
<Dropdown
label="Select"
placeholder="Select"
options={accountOptions}
selectedValue={selectedAccount}
onSelect={(value) => setSelectedAccount(value)}
className="w-full mt-1"
onChange={(option) => setSelectedAccount(option.value)}
/>
</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 [filteredDeployments, setFilteredDeployments] = useState<any[]>([]);
const [isLogsOpen, setIsLogsOpen] = useState(false);
const [, setSelectedDeploymentId] = useState<string | null>(null);
const [deploymentLogs, setDeploymentLogs] = useState<string>('');
// Load project data
@@ -138,18 +139,25 @@ export default function ProjectOverviewPage() {
};
// Handle deployment logs
const handleViewLogs = () => {
const mockLogs = `[2025-02-12 10:03:12] INFO Starting deployment process for service: ${project?.name}
[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:26] INFO Running security scan on built image
[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:40] INFO Scaling down old 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:55] INFO Deployment completed successfully
[2025-02-12 10:03:56] INFO Service is now live at ${currentDeployment?.applicationDeploymentRecordData?.url}`;
const handleViewLogs = (deploymentId: string) => {
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: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: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:35] INFO Updating Kubernetes deployment
[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:50] INFO Running health checks on new pods
[2025-02-12 10:03:52] ERROR Pod 'api-gateway-7df9bbb500-tx2k4' failed readiness probe (502 Bad Gateway)
[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);
setIsLogsOpen(true);
@@ -156,7 +156,7 @@ export default function TestConnectionPage() {
// Set default org if available
if (orgsData.organizations && orgsData.organizations.length > 0) {
setSelectedOrg(orgsData.organizations[0].slug)
setSelectedOrg(orgsData.organizations[0]!.slug)
}
} catch (error) {
console.error('Error fetching organizations:', error)
@@ -230,7 +230,7 @@ const fetchDeployers = async () => {
// Auto-select first deployer if available
if (deployersData.deployers && deployersData.deployers.length > 0) {
setSelectedDeployer(deployersData.deployers[0].deployerLrn)
setSelectedDeployer(deployersData.deployers[0]!.deployerLrn)
}
} catch (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)}`)
// If successful, we're done
if (response.ok && responseData.success) {
if (response.ok && (responseData as any).success) {
console.log('Authentication successful!')
setDebugInfo(prev => `${prev}\nAuthentication successful!`)
@@ -8,9 +8,10 @@ import {
DropdownMenuTrigger
} from '@workspace/ui/components/dropdown-menu'
import { cn } from '@workspace/ui/lib/utils'
import { MoreVertical } from 'lucide-react'
import { MoreVertical, ExternalLink } from 'lucide-react'
import Link from 'next/link'
import type { ReactNode } from 'react'
import type { LucideIcon } from 'lucide-react'
/**
* 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)
* - Multiple visual styles via variant prop
* - Optional primary emphasis for main call-to-action
* - Optional icon support
*/
export interface PageAction {
/**
@@ -27,6 +29,23 @@ export interface PageAction {
*/
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
* @remarks
@@ -112,6 +131,14 @@ export interface PageHeaderProps {
*/
subtitle?: string | ReactNode
/**
* Additional description text
* @remarks
* - Displayed below subtitle
* - Useful for longer explanatory text
*/
description?: string
/**
* Array of action buttons/links
* @remarks
@@ -119,6 +146,7 @@ export interface PageHeaderProps {
* - Mobile: Primary actions shown, secondary in dropdown
* - Actions can be buttons (onClick) or links (href)
* - Support multiple visual styles via variant prop
* - Support icons and external links
*
* @see {@link PageAction} for detailed action configuration
*
@@ -128,12 +156,15 @@ export interface PageHeaderProps {
* {
* label: "Create New",
* isPrimary: true,
* icon: "plus",
* onClick: () => setOpen(true)
* },
* {
* label: "View All",
* 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.
*
* @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({
title,
subtitle,
description,
actions = [],
className
}: PageHeaderProps) {
@@ -255,21 +195,51 @@ export default function PageHeader({
const primaryActions = 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)
const renderAction = (action: PageAction, key: string) => {
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) {
return (
<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>
)
}
return (
<Button key={key} variant={variant} onClick={action.onClick}>
{action.label}
{content}
</Button>
)
}
@@ -292,6 +262,11 @@ export default function PageHeader({
)}
</div>
)}
{description && (
<p className="text-sm text-muted-foreground mt-1">
{description}
</p>
)}
</div>
{actions.length > 0 && (
@@ -320,7 +295,16 @@ export default function PageHeader({
{secondaryActions.map((action) =>
action.href ? (
<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
@@ -340,4 +324,4 @@ export default function PageHeader({
</div>
</div>
)
}
}
@@ -30,7 +30,7 @@
'use client'
import { useState } from 'react'
import { useWallet } from '@/context/WalletContextProvider'
import { useWallet } from '@/context/WalletContext'
import { Button } from '@workspace/ui/components/button'
import {
DropdownMenu,
@@ -269,7 +269,7 @@ const OnboardingDialog: React.FC<OnboardingDialogProps> = ({
defaultOpen = false,
onClose
}) => {
const { nextStep, setFormData, formData, currentStep } = useOnboarding()
const { nextStep, setFormData, formData, currentStep, previousStep } = useOnboarding()
const [selectedRepo, setSelectedRepo] = useState<string>(formData.githubRepo || '')
const [isImportMode, setIsImportMode] = useState(true)
const [isOpen, setIsOpen] = useState(defaultOpen)
@@ -489,7 +489,7 @@ const OnboardingDialog: React.FC<OnboardingDialogProps> = ({
<Button
variant="outline"
className="text-zinc-400 bg-zinc-900 border-zinc-800 hover:bg-zinc-800"
onClick={() => useOnboarding.getState().previousStep()}
onClick={() => previousStep()}
>
Previous
</Button>
@@ -527,7 +527,7 @@ const OnboardingDialog: React.FC<OnboardingDialogProps> = ({
<Button
variant="outline"
className="text-zinc-400 bg-zinc-900 border-zinc-800 hover:bg-zinc-800"
onClick={() => useOnboarding.getState().previousStep()}
onClick={() => previousStep()}
>
Previous
</Button>
@@ -4,7 +4,7 @@
import { useState, useEffect } from 'react'
import { PlusCircle, Loader2, AlertTriangle, Info } from 'lucide-react'
import { useTheme } from 'next-themes'
import { useOnboarding } from '@/components/onboarding/useOnboarding'
import { useOnboarding } from '@/components/onboarding/store'
import { useGQLClient } from '@/context'
import { useWallet } from '@/context/WalletContext'
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 { Badge } from '@workspace/ui/components/badge'
import { toast } from 'sonner'
import { adaptDeployers } from '../../../utils/typeAdapters';
interface Deployer {
deployerLrn: string
@@ -93,11 +94,11 @@ export function ConfigureStep() {
setIsLoadingDeployers(true)
const deployersData = await gqlClient.getDeployers()
console.log('Available deployers:', deployersData)
setDeployers(deployersData.deployers || [])
setDeployers(adaptDeployers(deployersData.deployers || []));
// Auto-select first deployer if available and none selected
if (deployersData.deployers && deployersData.deployers.length > 0 && !selectedLrn) {
setSelectedLrn(deployersData.deployers[0].deployerLrn)
setSelectedLrn(deployersData.deployers[0]!.deployerLrn)
}
} catch (error) {
console.error('Error fetching deployers:', error)
@@ -117,7 +118,7 @@ export function ConfigureStep() {
// Auto-select first organization if available and none selected
if (orgsData.organizations && orgsData.organizations.length > 0 && !selectedOrg) {
setSelectedOrg(orgsData.organizations[0].slug)
setSelectedOrg(orgsData.organizations[0]!.slug)
}
} catch (error) {
console.error('Error fetching organizations:', error)
@@ -142,27 +143,32 @@ export function ConfigureStep() {
// Update environment variable
const updateEnvVar = (index: number, field: 'key' | 'value', value: string) => {
const newEnvVars = [...envVars]
newEnvVars[index][field] = value
if (newEnvVars[index]) {
newEnvVars[index][field] = value
}
setEnvVars(newEnvVars)
}
// Toggle environment for variable
const toggleEnvironment = (index: number, environment: string) => {
const newEnvVars = [...envVars]
const currentEnvs = newEnvVars[index].environments
if (newEnvVars[index]?.environments) {
const currentEnvs = newEnvVars[index].environments
if (currentEnvs.includes(environment)) {
newEnvVars[index].environments = currentEnvs.filter(env => env !== environment)
} else {
newEnvVars[index].environments = [...currentEnvs, environment]
if (currentEnvs.includes(environment)) {
newEnvVars[index].environments = currentEnvs.filter(env => env !== environment)
} else {
newEnvVars[index].environments = [...currentEnvs, environment]
}
// Ensure at least one environment is selected
if (newEnvVars[index].environments.length === 0) {
newEnvVars[index].environments = ['Production']
}
setEnvVars(newEnvVars)
}
// Ensure at least one environment is selected
if (newEnvVars[index].environments.length === 0) {
newEnvVars[index].environments = ['Production']
}
setEnvVars(newEnvVars)
}
// Toggle deployment option
@@ -5,7 +5,7 @@ import { useState, useEffect } from 'react'
import { Github, Wallet, CheckCircle2, AlertTriangle, Loader2, ExternalLink, ChevronDown } from 'lucide-react'
import { useTheme } from 'next-themes'
import { SignIn } from '@clerk/nextjs'
import { useOnboarding } from '@/components/onboarding/useOnboarding'
import { useOnboarding } from '@/components/onboarding/store'
import { useAuthStatus } from '@/hooks/useAuthStatus'
import { useRepoData } from '@/hooks/useRepoData'
import { Button } from '@workspace/ui/components/button'
@@ -17,6 +17,8 @@ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@workspace/
import { toast } from 'sonner'
import { GitHubBackendAuth } from '@/components/GitHubBackendAuth'
import { AVAILABLE_TEMPLATES, type TemplateDetail } from '@/constants/templates'
import { Template } from '@/types/onboarding'
import { adaptOptionalTemplate } from '@/utils/typeAdapters'
interface Repository {
id: string | number
@@ -32,8 +34,8 @@ export function ConnectStep() {
// Repository vs Template selection
const [selectedRepo, setSelectedRepo] = useState<string>(formData.githubRepo || '')
const [selectedTemplate, setSelectedTemplate] = useState<TemplateDetail | undefined>(
formData.template || undefined
const [selectedTemplate, setSelectedTemplate] = useState(
adaptOptionalTemplate(formData.template)
)
const [projectName, setProjectName] = useState<string>(formData.projectName || '')
const [isImportMode, setIsImportMode] = useState(true)
@@ -44,8 +46,6 @@ export function ConnectStep() {
// Auth status hook
const {
clerk,
wallet,
backend,
isFullyAuthenticated,
isReady,
missing,
@@ -169,7 +169,7 @@ export function ConnectStep() {
setFormData({
deploymentMode: isImportMode ? 'repository' : 'template',
githubRepo: isImportMode ? selectedRepo : '',
template: !isImportMode ? selectedTemplate : undefined,
template: !isImportMode ? (selectedTemplate as Template) : undefined,
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">
<Github className="h-4 w-4" />
<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>
<ChevronDown className="h-4 w-4" />
</div>
@@ -90,6 +90,7 @@ export const ConnectStep = () => {
<StepHeader
title="Connect"
description="Connect and import a GitHub repo or start from a template"
icon={<GitBranch />}
/>
{/* Git account selector */}
@@ -4,8 +4,7 @@
import { useState, useEffect } from 'react'
import { useTheme } from 'next-themes'
import { Github, Loader2, AlertTriangle, CheckCircle2 } from 'lucide-react'
import { useOnboarding } from '@/components/onboarding/useOnboarding'
import { useGQLClient } from '@/context'
import { useOnboarding } from '@/components/onboarding/store'
import { useWallet } from '@/context/WalletContext'
import { useDeployment } from '@/hooks/useDeployment'
import { useTemplateDeployment } from '@/hooks/useTemplate'
@@ -117,16 +116,17 @@ export function DeployStep() {
}
const config = {
template: formData.template,
template: {
...formData.template,
id: formData.template?.id || '',
icon: formData.template?.icon || ''
},
projectName: formData.projectName,
organizationSlug: formData.selectedOrg,
environmentVariables: formData.environmentVariables || [],
deployerLrn: formData.selectedLrn
}
console.log('Deploying template with config:', config)
const result = await deployTemplate(config)
};
const result = await deployTemplate(config);
// Save deployment results
setFormData({
@@ -12,7 +12,6 @@
export { default as Onboarding } from './Onboarding'
export {
default as OnboardingDialog,
hasCompletedOnboarding
} from './OnboardingDialog'
// Step components
@@ -1,86 +1,120 @@
'use client'
import { create } from 'zustand'
import { persist } from 'zustand/middleware'
// src/components/onboarding/useOnboarding.ts
import { useState } from 'react'
import type {
OnboardingFormData} from '@/types'
// Step type for navigation
export type Step = 'connect' | 'configure' | 'deploy' | 'success'
export interface EnvironmentVariables {
key: string
value: string
// Initial form data
const initialFormData: OnboardingFormData = {
// 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 {
// Connect step
githubRepo?: string
export function useOnboarding() {
const [formData, setFormData] = useState<OnboardingFormData>(initialFormData)
const [currentStep, setCurrentStep] = useState<Step>('connect')
// Configure step
deploymentType?: 'auction' | 'lrn'
deployerCount?: string
maxPrice?: string
selectedLrn?: string
environments?: {
production: boolean
preview: boolean
development: boolean
// Update form data (partial update)
const updateFormData = (updates: Partial<OnboardingFormData>) => {
setFormData(prev => ({ ...prev, ...updates }))
}
environmentVariables?: Record<string, string>
// Deploy step
deploymentId?: string
deploymentUrl?: string
// Reset form data
const resetFormData = () => {
setFormData(initialFormData)
setCurrentStep('connect')
}
// Success step
projectId?: string
}
interface OnboardingState {
currentStep: Step
formData: OnboardingFormData
setCurrentStep: (step: Step) => void
setFormData: (data: Partial<OnboardingFormData>) => void
nextStep: () => void
previousStep: () => void
resetOnboarding: () => void
}
const STEP_ORDER: Step[] = ['connect', 'configure', 'deploy', 'success']
export const useOnboarding = create<OnboardingState>()(
persist(
(set) => ({
currentStep: 'connect',
formData: {},
setCurrentStep: (step) => set({ currentStep: step }),
setFormData: (data) =>
set((state) => ({
formData: { ...state.formData, ...data }
})),
nextStep: () =>
set((state) => {
const currentIndex = STEP_ORDER.indexOf(state.currentStep)
const nextStep = STEP_ORDER[currentIndex + 1]
return nextStep ? { currentStep: nextStep } : state
}),
previousStep: () =>
set((state) => {
const currentIndex = STEP_ORDER.indexOf(state.currentStep)
const previousStep = STEP_ORDER[currentIndex - 1]
return previousStep ? { currentStep: previousStep } : state
}),
resetOnboarding: () =>
set({
currentStep: 'connect',
formData: {}
})
}),
{
name: 'laconic-onboarding-storage'
// Step navigation
const nextStep = () => {
switch (currentStep) {
case 'connect':
setCurrentStep('configure')
break
case 'configure':
setCurrentStep('deploy')
break
case 'deploy':
setCurrentStep('success')
break
}
)
)
}
const previousStep = () => {
switch (currentStep) {
case 'configure':
setCurrentStep('connect')
break
case 'deploy':
setCurrentStep('configure')
break
case 'success':
setCurrentStep('deploy')
break
}
}
// Validation helpers
const validateStep1 = () => {
if (formData.deploymentMode === 'template') {
return !!(formData.template && formData.projectName)
}
return !!formData.githubRepo
}
const validateStep2 = () => {
return !!(formData.selectedLrn && formData.selectedOrg)
}
const validateStep3 = () => {
return !!formData.deploymentId
}
return {
// Data
formData,
currentStep,
// Actions
setFormData: updateFormData,
setCurrentStep,
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
})
}
}
+2 -2
View File
@@ -8,9 +8,9 @@
export interface TemplateDetail {
id: string
name: string
icon: string
icon: string // Required string
repoFullName: string
description: string
description: string // Required string
isComingSoon?: boolean
tags?: string[]
}
@@ -43,7 +43,7 @@ export const BackendProvider: React.FC<{ children: ReactNode }> = ({
const [isLoading, setIsLoading] = useState(true)
// Check backend connection
const checkBackendConnection = useCallback(async () => {
const checkBackendConnection = useCallback(async (): Promise<void> => {
try {
const response = await fetch('http://localhost:8000/auth/session', {
method: 'GET',
@@ -59,11 +59,11 @@ export const BackendProvider: React.FC<{ children: ReactNode }> = ({
console.log('❌ Backend not connected')
}
return connected
// Don't return anything - function returns Promise<void>
} catch (error) {
console.error('Error checking backend connection:', error)
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
const missing = {
clerkSignIn: !isSignedIn,
clerkGithub: isSignedIn && !hasGithubInClerk,
clerkGithub: (isSignedIn ?? false) && !hasGithubInClerk,
walletConnection: !hasWalletAddress, // Just need wallet address for this step
backendConnection: hasWalletAddress && !isWalletSessionActive, // Need SIWE auth for backend
githubBackendSync: isBackendConnected && !isGithubBackendAuth
@@ -177,7 +177,7 @@ export function useAuthStatus(): AuthStatus & AuthActions {
return {
// Individual systems
clerk: {
isSignedIn,
isSignedIn: isSignedIn ?? false,
isLoaded: isClerkLoaded && isUserLoaded,
hasGithubConnected: hasGithubInClerk,
user
+2 -2
View File
@@ -37,13 +37,13 @@ export function useRepoData(repoId: string): UseRepoDataReturn {
try {
// Check if user has connected GitHub account
const githubAccount = user.externalAccounts.find(
account => account.provider === 'oauth_github'
account => account.provider === 'github'
);
if (githubAccount) {
// Try to get GitHub OAuth token from Clerk
try {
token = await user.getToken({ template: 'github' });
// token = await user.getToken({ template: 'github' });
console.log('Using GitHub token from Clerk');
} catch (err) {
console.error('Error getting GitHub token from Clerk:', err);
@@ -2,6 +2,7 @@
// src/hooks/useRepoSelection.ts
import { useState, useEffect } from 'react'
import { useOctokit } from '@/context/OctokitContext'
import { adaptRepositories, type GitHubRepo } from '../utils/typeAdapters';
interface Repository {
id: string;
@@ -58,7 +59,7 @@ export function useRepoSelection(): UseRepoSelectionResult {
}
}));
setRepositories(repoData);
setRepositories(adaptRepositories(repoData as GitHubRepo[]));
}
} catch (err) {
console.error('Failed to fetch repositories:', err);
@@ -89,6 +90,9 @@ export function useRepoSelection(): UseRepoSelectionResult {
try {
if (isAuth && octokit) {
const [owner, repo] = repoFullName.split('/');
if (!owner || !repo) {
throw new Error('Invalid repository format');
}
const response = await octokit.request('GET /repos/{owner}/{repo}/branches', {
owner,
+14
View File
@@ -4,6 +4,7 @@ export interface Deployment {
status: string
isCurrent: boolean
createdAt: string | number
commit?: string
createdBy?: {
name: string
}
@@ -18,4 +19,17 @@ export interface Domain {
branch: string
status: string
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 './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=
+45 -27
View File
@@ -1,5 +1,9 @@
# deployer
The following steps are for deploying the frontend app to vaasl webapp deployer.
Run these steps in the `apps/deployer/` directory:
- Install dependencies
```bash
@@ -7,46 +11,60 @@
```
```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
```
Set the required variables:
- To deploy frontend app to `dashboard.apps.snowballtools.com`
```
REGISTRY_BOND_ID=230cfedda15e78edc8986dfcb870e1b618f65c56e38d2735476d2a8cb3f25e38
DEPLOYER_LRN=lrn://vaasl-provider/deployers/webapp-deployer-api.apps.vaasl.io
AUTHORITY=laconic
```
```bash
./deploy-frontend.sh
```
- 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
./deploy-frontend.sh
```
- 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
- Check deployment status in [web-app deployer](https://console.laconic.com/deployer).
- Check records in [registry console app](https://console.laconic.com/#/registry).
- If deployment fails due to low bond balance
- Check balances
```bash
@@ -54,11 +72,11 @@
pnpm laconic registry account get
# Bond balance
pnpm laconic registry bond get --id 99c0e9aec0ac1b8187faa579be3b54f93fafb6060ac1fd29170b860df605be32
pnpm laconic registry bond get --id 230cfedda15e78edc8986dfcb870e1b618f65c56e38d2735476d2a8cb3f25e38
```
- Command to refill bond
```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:
registry:
rpcEndpoint: https://laconicd-sapo.laconic.com
gqlEndpoint: https://laconicd-sapo.laconic.com/api
rpcEndpoint: https://laconicd-mainnet-1.laconic.com/
gqlEndpoint: https://laconicd-mainnet-1.laconic.com/api
userKey:
bondId:
chainId: laconic-testnet-2
bondId: 230cfedda15e78edc8986dfcb870e1b618f65c56e38d2735476d2a8cb3f25e38
chainId: laconic-mainnet
gasPrice: 0.001alnt
+20 -15
View File
@@ -6,7 +6,7 @@ echo "Using DEPLOYER_LRN: $DEPLOYER_LRN"
echo "Using AUTHORITY: $AUTHORITY"
# 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
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
# 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
# Set application-record version if no previous records were found
@@ -39,8 +39,8 @@ record:
version: $NEW_APPLICATION_VERSION
repository_ref: $LATEST_HASH
repository: ["$REPO_URL"]
app_type: webapp
name: deploy-frontend
app_type: webapp/next
name: laconic-deployer-frontend
app_version: $PACKAGE_VERSION
EOF
@@ -60,7 +60,7 @@ echo "ApplicationRecord published"
echo $RECORD_ID
# Set name to record
REGISTRY_APP_LRN="lrn://$AUTHORITY/applications/deploy-frontend"
REGISTRY_APP_LRN="lrn://$AUTHORITY/applications/laconic-deployer-frontend"
sleep 2
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:
type: ApplicationDeploymentRequest
version: '1.0.0'
name: deploy-frontend@$PACKAGE_VERSION
application: lrn://$AUTHORITY/applications/deploy-frontend@$PACKAGE_VERSION
name: laconic-deployer-frontend@$PACKAGE_VERSION
application: lrn://$AUTHORITY/applications/laconic-deployer-frontend@$PACKAGE_VERSION
deployer: $DEPLOYER_LRN
dns: deploy.laconic.com
dns: deploy-staging.laconic.com
config:
env:
LACONIC_HOSTED_CONFIG_server_url: https://deploy-backend.laconic.com
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
LACONIC_HOSTED_CONFIG_laconicd_chain_id: laconic-testnet-2
LACONIC_HOSTED_CONFIG_wallet_iframe_url: https://wallet.laconic.com
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_CLERK_PUBLISHABLE_KEY:
CLERK_SECRET_KEY:
NEXT_PUBLIC_GITHUB_FALLBACK_TOKEN: your_github_token
meta:
note: Added @ $CURRENT_DATE_TIME
repository: "$REPO_URL"
@@ -142,6 +141,12 @@ record:
payment: $txHash
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
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",
"scripts": {
"build": "turbo build",
"build:fe-compile": "turbo build:compile --filter=deploy-fe",
"dev": "turbo dev",
"lint": "turbo lint",
"start": "turbo start",
+194 -204
View File
@@ -44,13 +44,13 @@ importers:
version: 0.2.11(debug@4.4.0)
'@cosmjs/stargate':
specifier: ^0.33.0
version: 0.33.0(debug@4.4.0)
version: 0.33.1(debug@4.4.0)
'@graphql-tools/schema':
specifier: ^10.0.2
version: 10.0.21(graphql@16.10.0)
version: 10.0.25(graphql@16.10.0)
'@graphql-tools/utils':
specifier: ^10.0.12
version: 10.8.4(graphql@16.10.0)
version: 10.9.1(graphql@16.10.0)
'@octokit/oauth-app':
specifier: ^6.1.0
version: 6.1.0
@@ -65,7 +65,7 @@ importers:
version: 20.17.23
'@types/semver':
specifier: ^7.5.8
version: 7.5.8
version: 7.7.0
apollo-server-core:
specifier: ^3.13.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)
cookie-session:
specifier: ^2.1.0
version: 2.1.0
version: 2.1.1
cors:
specifier: ^2.8.5
version: 2.8.5
@@ -89,28 +89,28 @@ importers:
version: 3.1.1(express@4.21.2)
express-session:
specifier: ^1.18.0
version: 1.18.1
version: 1.18.2
fs-extra:
specifier: ^11.2.0
version: 11.3.0
version: 11.3.1
graphql:
specifier: ^16.8.1
version: 16.10.0
luxon:
specifier: ^3.5.0
version: 3.5.0
version: 3.7.1
nanoid:
specifier: '3'
version: 3.3.8
nanoid-dictionary:
specifier: ^5.0.0-beta.1
version: 5.0.0-beta.1
version: 5.0.0
octokit:
specifier: ^3.1.2
version: 3.2.1
openpgp:
specifier: ^6.0.1
version: 6.1.0
version: 6.2.0
reflect-metadata:
specifier: ^0.2.1
version: 0.2.2
@@ -141,13 +141,13 @@ importers:
version: 2.0.49
'@types/cors':
specifier: ^2.8.17
version: 2.8.17
version: 2.8.19
'@types/express':
specifier: ^4.17.21
version: 4.17.21
version: 4.17.23
'@types/express-session':
specifier: ^1.17.10
version: 1.18.1
version: 1.18.2
'@types/fs-extra':
specifier: ^11.0.4
version: 11.0.4
@@ -159,7 +159,7 @@ importers:
version: 2.4.1
prettier:
specifier: ^3.1.1
version: 3.5.3
version: 3.6.2
workspace:
specifier: ^0.0.1-preview.1
version: 0.0.1-preview.2
@@ -273,7 +273,7 @@ importers:
version: link:../../services/ui
axios:
specifier: ^1.8.4
version: 1.8.4
version: 1.8.4(debug@4.4.0)
class-variance-authority:
specifier: ^0.7.0
version: 0.7.1
@@ -794,8 +794,8 @@ packages:
'@cosmjs/amino@0.32.4':
resolution: {integrity: sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==}
'@cosmjs/amino@0.33.0':
resolution: {integrity: sha512-a4qnWGzuM2IrlkDTFQmU7bDd+wNIzyvfcRIZ43i00ZHvTEtrCcWopT94rIv/Zy6fdgkhQ3HWrsGVlIPDT/ibRw==}
'@cosmjs/amino@0.33.1':
resolution: {integrity: sha512-WfWiBf2EbIWpwKG9AOcsIIkR717SY+JdlXM/SL/bI66BdrhniAF+/ZNis9Vo9HF6lP2UU5XrSmFA4snAvEgdrg==}
'@cosmjs/crypto@0.27.1':
resolution: {integrity: sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg==}
@@ -806,8 +806,8 @@ packages:
'@cosmjs/crypto@0.32.4':
resolution: {integrity: sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==}
'@cosmjs/crypto@0.33.0':
resolution: {integrity: sha512-kkt06t+cFW2XRGDGUZ0cVf5yoQ2OhZnubwbYbz3QXdyhf1qOXYVPRThfFPsko7dssr+e8Yy4OJKlh5SLA8DXTQ==}
'@cosmjs/crypto@0.33.1':
resolution: {integrity: sha512-U4kGIj/SNBzlb2FGgA0sMR0MapVgJUg8N+oIAiN5+vl4GZ3aefmoL1RDyTrFS/7HrB+M+MtHsxC0tvEu4ic/zA==}
'@cosmjs/encoding@0.27.1':
resolution: {integrity: sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw==}
@@ -818,14 +818,14 @@ packages:
'@cosmjs/encoding@0.32.4':
resolution: {integrity: sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==}
'@cosmjs/encoding@0.33.0':
resolution: {integrity: sha512-9z0g9mM7w5BISVVs8BK1Yp7KSQgNLGz2SBoWYOm4wODB/YcoitODgyRqECcuMZBXtd2sCyy2M1VLs9Z69BPZRQ==}
'@cosmjs/encoding@0.33.1':
resolution: {integrity: sha512-nuNxf29fUcQE14+1p//VVQDwd1iau5lhaW/7uMz7V2AH3GJbFJoJVaKvVyZvdFk+Cnu+s3wCqgq4gJkhRCJfKw==}
'@cosmjs/json-rpc@0.32.4':
resolution: {integrity: sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ==}
'@cosmjs/json-rpc@0.33.0':
resolution: {integrity: sha512-okXjxnT3zhhuYrA1aIDVD8VHt3syWyrJw3cAY6tMNM53bQcAtLGImueMrEoyv7DtLg5R5Tx5PMrQ7UYnpD8OwQ==}
'@cosmjs/json-rpc@0.33.1':
resolution: {integrity: sha512-T6VtWzecpmuTuMRGZWuBYHsMF/aznWCYUt/cGMWNSz7DBPipVd0w774PKpxXzpEbyt5sr61NiuLXc+Az15S/Cw==}
'@cosmjs/launchpad@0.27.1':
resolution: {integrity: sha512-DcFwGD/z5PK8CzO2sojDxa+Be9EIEtRZb2YawgVnw2Ht/p5FlNv+OVo8qlishpBdalXEN7FvQ1dVeDFEe9TuJw==}
@@ -839,38 +839,38 @@ packages:
'@cosmjs/math@0.32.4':
resolution: {integrity: sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw==}
'@cosmjs/math@0.33.0':
resolution: {integrity: sha512-B2uOgM12iuIhJWzGuAxGwO6zO+cI8Q4z7mVu7HgFrGJJTM1HtPTYgb55oMOuUN0OZ352MEEm5uAt8sA9jZQqbA==}
'@cosmjs/math@0.33.1':
resolution: {integrity: sha512-ytGkWdKFCPiiBU5eqjHNd59djPpIsOjbr2CkNjlnI1Zmdj+HDkSoD9MUGpz9/RJvRir5IvsXqdE05x8EtoQkJA==}
'@cosmjs/proto-signing@0.32.4':
resolution: {integrity: sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==}
'@cosmjs/proto-signing@0.33.0':
resolution: {integrity: sha512-UHA92d/Siy3wnce/xhU4iagKrs6r8Ruacc0qeHj3mNrtuUH8f70cD7lzzClzI7wvRLcPprOY0YTeEzqGbPeBFw==}
'@cosmjs/proto-signing@0.33.1':
resolution: {integrity: sha512-Sv4W+MxX+0LVnd+2rU4Fw1HRsmMwSVSYULj7pRkij3wnPwUlTVoJjmKFgKz13ooIlfzPrz/dnNjGp/xnmXChFQ==}
'@cosmjs/socket@0.32.4':
resolution: {integrity: sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw==}
'@cosmjs/socket@0.33.0':
resolution: {integrity: sha512-a1eHsqVFmG6N5LR53tAB1Xo4XfsZaFlrYA34yC0GnX5m/cJVEe1wkZxMsWJIW2nfCgj7nAvFK6Gx4qj+ZLeqdw==}
'@cosmjs/socket@0.33.1':
resolution: {integrity: sha512-KzAeorten6Vn20sMiM6NNWfgc7jbyVo4Zmxev1FXa5EaoLCZy48cmT3hJxUJQvJP/lAy8wPGEjZ/u4rmF11x9A==}
'@cosmjs/stargate@0.32.4':
resolution: {integrity: sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ==}
'@cosmjs/stargate@0.33.0':
resolution: {integrity: sha512-Ti/2RRl+LKTNUrOqj6TpGnTRcbmQ5zD4Ujx/PDNPHEexyuwbz+tMcF8Y1kKPWQ1g4wWxLYO4tKY4Gm0J3c5hWA==}
'@cosmjs/stargate@0.33.1':
resolution: {integrity: sha512-CnJ1zpSiaZgkvhk+9aTp5IPmgWn2uo+cNEBN8VuD9sD6BA0V4DMjqe251cNFLiMhkGtiE5I/WXFERbLPww3k8g==}
'@cosmjs/stream@0.32.4':
resolution: {integrity: sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A==}
'@cosmjs/stream@0.33.0':
resolution: {integrity: sha512-SmsZW9Xzfk2T2MtWzVkit2WUclL7ZQHhiEhJz39EzKQRAdi4xY8nwefZF4VLQVJ0M33QfRCUzFzb+O/gddMQKA==}
'@cosmjs/stream@0.33.1':
resolution: {integrity: sha512-bMUvEENjeQPSTx+YRzVsWT1uFIdHRcf4brsc14SOoRQ/j5rOJM/aHfsf/BmdSAnYbdOQ3CMKj/8nGAQ7xUdn7w==}
'@cosmjs/tendermint-rpc@0.32.4':
resolution: {integrity: sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw==}
'@cosmjs/tendermint-rpc@0.33.0':
resolution: {integrity: sha512-A5h72fYesFKSjMjB+AMD5thcVVcdfbmWj4atJ1CYmKGyCTCPW8iEIz1ZKR0mUX+gkW6dM1h8flaRj/R14Oc0/A==}
'@cosmjs/tendermint-rpc@0.33.1':
resolution: {integrity: sha512-22klDFq2MWnf//C8+rZ5/dYatr6jeGT+BmVbutXYfAK9fmODbtFcumyvB6uWaEORWfNukl8YK1OLuaWezoQvxA==}
'@cosmjs/utils@0.27.1':
resolution: {integrity: sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg==}
@@ -881,8 +881,8 @@ packages:
'@cosmjs/utils@0.32.4':
resolution: {integrity: sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==}
'@cosmjs/utils@0.33.0':
resolution: {integrity: sha512-Y6glwHNlNjcOgwPg8YmNr1PSrNm307EhJVytFt8HmA/G7MRcIA+jIzCL0VlOrWGU4TrAOXvshM+oJZbTIldFRA==}
'@cosmjs/utils@0.33.1':
resolution: {integrity: sha512-UnLHDY6KMmC+UXf3Ufyh+onE19xzEXjT4VZ504Acmk4PXxqyvG4cCPprlKUFnGUX7f0z8Or9MAOHXBx41uHBcg==}
'@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
@@ -1156,8 +1156,8 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
'@graphql-tools/merge@9.0.22':
resolution: {integrity: sha512-bjOs9DlTbo1Yz2UzQcJ78Dn9/pKyY2zNaoqNLfRTTSkO56QFkvqhfjQuqJcqu+V3rtaB2o0VMpWaY6JT8ZTvQA==}
'@graphql-tools/merge@9.1.1':
resolution: {integrity: sha512-BJ5/7Y7GOhTuvzzO5tSBFL4NGr7PVqTJY3KeIDlVTT8YLcTXtBR+hlrC3uyEym7Ragn+zyWdHeJ9ev+nRX1X2w==}
engines: {node: '>=16.0.0'}
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -1167,8 +1167,8 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
'@graphql-tools/schema@10.0.21':
resolution: {integrity: sha512-AECSlNnD0WNxICwfJs93gYn2oHxPmztn1MYBETIQXrJJcymfD6BoUrDlYPa6F27RzRc+gbPZPHMWL26uujfKBg==}
'@graphql-tools/schema@10.0.25':
resolution: {integrity: sha512-/PqE8US8kdQ7lB9M5+jlW8AyVjRGCKU7TSktuW3WNKSKmDO0MK1wakvb5gGdyT49MjAIb4a3LWxIpwo5VygZuw==}
engines: {node: '>=16.0.0'}
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -1183,8 +1183,8 @@ packages:
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
'@graphql-tools/utils@10.8.4':
resolution: {integrity: sha512-HpHBgcmLIE79jWk1v5Bm0Eb8MaPiwSJT/Iy5xIJ+GMe7yAKpCYrbjf7wb+UMDMkLkfEryvo3syCx8k+TMAZ9bA==}
'@graphql-tools/utils@10.9.1':
resolution: {integrity: sha512-B1wwkXk9UvU7LCBkPs8513WxOQ2H8Fo5p8HR1+Id9WmYE5+bd51vqN+MbrqvWczHCH2gwkREgHJN88tE0n1FCw==}
engines: {node: '>=16.0.0'}
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
@@ -1406,8 +1406,8 @@ packages:
'@noble/curves@1.2.0':
resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==}
'@noble/curves@1.8.1':
resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==}
'@noble/curves@1.9.7':
resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==}
engines: {node: ^14.21.3 || >=16}
'@noble/hashes@1.3.2':
@@ -1418,6 +1418,10 @@ packages:
resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==}
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':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -2513,8 +2517,8 @@ packages:
'@types/body-parser@1.19.2':
resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
'@types/body-parser@1.19.5':
resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
'@types/body-parser@1.19.6':
resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
'@types/btoa-lite@1.0.2':
resolution: {integrity: sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==}
@@ -2528,8 +2532,8 @@ packages:
'@types/cors@2.8.12':
resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==}
'@types/cors@2.8.17':
resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==}
'@types/cors@2.8.19':
resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==}
'@types/d3-array@3.2.1':
resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
@@ -2570,14 +2574,14 @@ packages:
'@types/express-serve-static-core@4.19.6':
resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==}
'@types/express-session@1.18.1':
resolution: {integrity: sha512-S6TkD/lljxDlQ2u/4A70luD8/ZxZcrU5pQwI1rVXCiaVIywoFgbA+PIUNDjPhQpPdK0dGleLtYc/y7XWBfclBg==}
'@types/express-session@1.18.2':
resolution: {integrity: sha512-k+I0BxwVXsnEU2hV77cCobC08kIsn4y44C3gC0b46uxZVMaXA04lSPgRLR/bSL2w0t0ShJiG8o4jPzRG/nscFg==}
'@types/express@4.17.14':
resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==}
'@types/express@4.17.21':
resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
'@types/express@4.17.23':
resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==}
'@types/fs-extra@11.0.4':
resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
@@ -2588,8 +2592,8 @@ packages:
'@types/google-protobuf@3.15.12':
resolution: {integrity: sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==}
'@types/http-errors@2.0.4':
resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
'@types/http-errors@2.0.5':
resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
'@types/inquirer@6.5.0':
resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==}
@@ -2621,9 +2625,6 @@ packages:
'@types/node@10.12.18':
resolution: {integrity: sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==}
'@types/node@10.17.60':
resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==}
'@types/node@17.0.45':
resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
@@ -2642,8 +2643,8 @@ packages:
'@types/prop-types@15.7.14':
resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
'@types/qs@6.9.18':
resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==}
'@types/qs@6.14.0':
resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
'@types/range-parser@1.2.7':
resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
@@ -2657,14 +2658,14 @@ packages:
'@types/secp256k1@4.0.6':
resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==}
'@types/semver@7.5.8':
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
'@types/semver@7.7.0':
resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==}
'@types/send@0.17.4':
resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
'@types/send@0.17.5':
resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==}
'@types/serve-static@1.15.7':
resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
'@types/serve-static@1.15.8':
resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==}
'@types/through@0.0.33':
resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==}
@@ -2672,8 +2673,8 @@ packages:
'@types/tinycolor2@1.4.6':
resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==}
'@whatwg-node/promise-helpers@1.2.4':
resolution: {integrity: sha512-daEUfaHbaMuAcor+FPAVK+pOCSzsAYhK6LN1y81EcakdqQEPQvjm74PTmfwfv8POg8pw4RyCv9LXB1e+mQDwqg==}
'@whatwg-node/promise-helpers@1.3.2':
resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==}
engines: {node: '>=16.0.0'}
'@wolfy1339/lru-cache@11.0.2-patch.1':
@@ -2861,9 +2862,6 @@ packages:
axios@0.26.1:
resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
axios@1.8.2:
resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==}
axios@1.8.4:
resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==}
@@ -3157,8 +3155,8 @@ packages:
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
engines: {node: '>= 0.6'}
cookie-session@2.1.0:
resolution: {integrity: sha512-u73BDmR8QLGcs+Lprs0cfbcAPKl2HnPcjpwRXT41sEV4DRJ2+W0vJEEZkG31ofkx+HZflA70siRIjiTdIodmOQ==}
cookie-session@2.1.1:
resolution: {integrity: sha512-ji3kym/XZaFVew1+tIZk5ZLp9Z/fLv9rK1aZmpug0FsgE7Cu3ZDrUdRo7FT9vFjMYfNimrrUHJzywDwT7XEFlg==}
engines: {node: '>= 0.10'}
cookie-signature@1.0.6:
@@ -3454,8 +3452,8 @@ packages:
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
engines: {node: '>= 0.8'}
end-of-stream@1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
end-of-stream@1.4.5:
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
enhanced-resolve@5.18.1:
resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
@@ -3555,8 +3553,8 @@ packages:
peerDependencies:
express: ^4.16.2
express-session@1.18.1:
resolution: {integrity: sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==}
express-session@1.18.2:
resolution: {integrity: sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==}
engines: {node: '>= 0.8.0'}
express@4.21.2:
@@ -3645,8 +3643,8 @@ packages:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
fs-extra@11.3.0:
resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==}
fs-extra@11.3.1:
resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==}
engines: {node: '>=14.14'}
fs.realpath@1.0.0:
@@ -4226,8 +4224,8 @@ packages:
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
luxon@3.5.0:
resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==}
luxon@3.7.1:
resolution: {integrity: sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==}
engines: {node: '>=12'}
make-error@1.3.6:
@@ -4337,8 +4335,8 @@ packages:
nan@2.22.2:
resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==}
nanoid-dictionary@5.0.0-beta.1:
resolution: {integrity: sha512-xBkL9zzkNjzJ/UnmWyiOUDVX/COoi05eS0oU28RYKFFQhdnzO5dTOPbVZ/fCFgIOGr1zNinDHJ68mm/KQfcgcw==}
nanoid-dictionary@5.0.0:
resolution: {integrity: sha512-/iCyQHwt36XkaIvSE9fcC8p6DiMPCZMTSMj9UT56Cv6T7f5CuxvOMhpNncaNieQ4z4d32p7ruEtAfRsb7Ya8Gw==}
nanoid@3.3.8:
resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
@@ -4392,8 +4390,8 @@ packages:
no-case@3.0.4:
resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
node-abi@3.74.0:
resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==}
node-abi@3.75.0:
resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==}
engines: {node: '>=10'}
node-abort-controller@3.1.1:
@@ -4469,8 +4467,8 @@ packages:
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
engines: {node: '>= 0.8'}
on-headers@1.0.2:
resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
on-headers@1.1.0:
resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==}
engines: {node: '>= 0.8'}
once@1.4.0:
@@ -4480,8 +4478,8 @@ packages:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
openpgp@6.1.0:
resolution: {integrity: sha512-fRTeitP+hoGJD3kbdUlAI++wE6MvfvXw1rBqHwmBMxIpLjowatJ2zb5ThkORpIkSz5F12wO+xCYRSTbT7M4qKA==}
openpgp@6.2.0:
resolution: {integrity: sha512-zKbgazxMeGrTqUEWicKufbdcjv2E0om3YVxw+I3hRykp8ODp+yQOJIDqIr1UXJjP8vR2fky3bNQwYoQXyFkYMA==}
engines: {node: '>= 18.0.0'}
optimism@0.18.1:
@@ -4643,8 +4641,8 @@ packages:
engines: {node: '>=10'}
hasBin: true
prettier@3.5.3:
resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==}
prettier@3.6.2:
resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
engines: {node: '>=14'}
hasBin: true
@@ -4673,8 +4671,8 @@ packages:
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
pump@3.0.2:
resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
pump@3.0.3:
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
@@ -5074,8 +5072,8 @@ packages:
sprintf-js@1.1.3:
resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
sql-highlight@6.0.0:
resolution: {integrity: sha512-+fLpbAbWkQ+d0JEchJT/NrRRXbYRNbG15gFpANx73EwxQB1PRjj+k/OI0GTU0J63g8ikGkJECQp9z8XEJZvPRw==}
sql-highlight@6.1.0:
resolution: {integrity: sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==}
engines: {node: '>=14'}
statuses@2.0.1:
@@ -5192,8 +5190,8 @@ packages:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
tar-fs@2.1.2:
resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==}
tar-fs@2.1.3:
resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==}
tar-stream@2.2.0:
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
@@ -5759,7 +5757,7 @@ snapshots:
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/long': 4.0.2
'@types/node': 10.17.60
'@types/node': 10.12.18
long: 4.0.0
'@apollo/protobufjs@1.2.7':
@@ -6002,12 +6000,12 @@ snapshots:
'@cosmjs/math': 0.32.4
'@cosmjs/utils': 0.32.4
'@cosmjs/amino@0.33.0':
'@cosmjs/amino@0.33.1':
dependencies:
'@cosmjs/crypto': 0.33.0
'@cosmjs/encoding': 0.33.0
'@cosmjs/math': 0.33.0
'@cosmjs/utils': 0.33.0
'@cosmjs/crypto': 0.33.1
'@cosmjs/encoding': 0.33.1
'@cosmjs/math': 0.33.1
'@cosmjs/utils': 0.33.1
'@cosmjs/crypto@0.27.1':
dependencies:
@@ -6042,11 +6040,11 @@ snapshots:
elliptic: 6.6.1
libsodium-wrappers-sumo: 0.7.15
'@cosmjs/crypto@0.33.0':
'@cosmjs/crypto@0.33.1':
dependencies:
'@cosmjs/encoding': 0.33.0
'@cosmjs/math': 0.33.0
'@cosmjs/utils': 0.33.0
'@cosmjs/encoding': 0.33.1
'@cosmjs/math': 0.33.1
'@cosmjs/utils': 0.33.1
'@noble/hashes': 1.7.1
bn.js: 5.2.1
elliptic: 6.6.1
@@ -6070,7 +6068,7 @@ snapshots:
bech32: 1.1.4
readonly-date: 1.0.0
'@cosmjs/encoding@0.33.0':
'@cosmjs/encoding@0.33.1':
dependencies:
base64-js: 1.5.1
bech32: 1.1.4
@@ -6081,9 +6079,9 @@ snapshots:
'@cosmjs/stream': 0.32.4
xstream: 11.14.0
'@cosmjs/json-rpc@0.33.0':
'@cosmjs/json-rpc@0.33.1':
dependencies:
'@cosmjs/stream': 0.33.0
'@cosmjs/stream': 0.33.1
xstream: 11.14.0
'@cosmjs/launchpad@0.27.1(debug@4.4.0)':
@@ -6110,7 +6108,7 @@ snapshots:
dependencies:
bn.js: 5.2.1
'@cosmjs/math@0.33.0':
'@cosmjs/math@0.33.1':
dependencies:
bn.js: 5.2.1
@@ -6123,13 +6121,13 @@ snapshots:
'@cosmjs/utils': 0.32.4
cosmjs-types: 0.9.0
'@cosmjs/proto-signing@0.33.0':
'@cosmjs/proto-signing@0.33.1':
dependencies:
'@cosmjs/amino': 0.33.0
'@cosmjs/crypto': 0.33.0
'@cosmjs/encoding': 0.33.0
'@cosmjs/math': 0.33.0
'@cosmjs/utils': 0.33.0
'@cosmjs/amino': 0.33.1
'@cosmjs/crypto': 0.33.1
'@cosmjs/encoding': 0.33.1
'@cosmjs/math': 0.33.1
'@cosmjs/utils': 0.33.1
cosmjs-types: 0.9.0
'@cosmjs/socket@0.32.4':
@@ -6142,9 +6140,9 @@ snapshots:
- bufferutil
- utf-8-validate
'@cosmjs/socket@0.33.0':
'@cosmjs/socket@0.33.1':
dependencies:
'@cosmjs/stream': 0.33.0
'@cosmjs/stream': 0.33.1
isomorphic-ws: 4.0.1(ws@7.5.10)
ws: 7.5.10
xstream: 11.14.0
@@ -6169,15 +6167,15 @@ snapshots:
- debug
- utf-8-validate
'@cosmjs/stargate@0.33.0(debug@4.4.0)':
'@cosmjs/stargate@0.33.1(debug@4.4.0)':
dependencies:
'@cosmjs/amino': 0.33.0
'@cosmjs/encoding': 0.33.0
'@cosmjs/math': 0.33.0
'@cosmjs/proto-signing': 0.33.0
'@cosmjs/stream': 0.33.0
'@cosmjs/tendermint-rpc': 0.33.0(debug@4.4.0)
'@cosmjs/utils': 0.33.0
'@cosmjs/amino': 0.33.1
'@cosmjs/encoding': 0.33.1
'@cosmjs/math': 0.33.1
'@cosmjs/proto-signing': 0.33.1
'@cosmjs/stream': 0.33.1
'@cosmjs/tendermint-rpc': 0.33.1(debug@4.4.0)
'@cosmjs/utils': 0.33.1
cosmjs-types: 0.9.0
transitivePeerDependencies:
- bufferutil
@@ -6188,7 +6186,7 @@ snapshots:
dependencies:
xstream: 11.14.0
'@cosmjs/stream@0.33.0':
'@cosmjs/stream@0.33.1':
dependencies:
xstream: 11.14.0
@@ -6201,7 +6199,7 @@ snapshots:
'@cosmjs/socket': 0.32.4
'@cosmjs/stream': 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
xstream: 11.14.0
transitivePeerDependencies:
@@ -6209,16 +6207,16 @@ snapshots:
- debug
- utf-8-validate
'@cosmjs/tendermint-rpc@0.33.0(debug@4.4.0)':
'@cosmjs/tendermint-rpc@0.33.1(debug@4.4.0)':
dependencies:
'@cosmjs/crypto': 0.33.0
'@cosmjs/encoding': 0.33.0
'@cosmjs/json-rpc': 0.33.0
'@cosmjs/math': 0.33.0
'@cosmjs/socket': 0.33.0
'@cosmjs/stream': 0.33.0
'@cosmjs/utils': 0.33.0
axios: 1.8.2(debug@4.4.0)
'@cosmjs/crypto': 0.33.1
'@cosmjs/encoding': 0.33.1
'@cosmjs/json-rpc': 0.33.1
'@cosmjs/math': 0.33.1
'@cosmjs/socket': 0.33.1
'@cosmjs/stream': 0.33.1
'@cosmjs/utils': 0.33.1
axios: 1.8.4(debug@4.4.0)
readonly-date: 1.0.0
xstream: 11.14.0
transitivePeerDependencies:
@@ -6232,7 +6230,7 @@ snapshots:
'@cosmjs/utils@0.32.4': {}
'@cosmjs/utils@0.33.0': {}
'@cosmjs/utils@0.33.1': {}
'@cspotcode/source-map-support@0.8.1':
dependencies:
@@ -6602,9 +6600,9 @@ snapshots:
graphql: 16.10.0
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:
'@graphql-tools/utils': 10.8.4(graphql@16.10.0)
'@graphql-tools/utils': 10.9.1(graphql@16.10.0)
graphql: 16.10.0
tslib: 2.8.1
@@ -6616,10 +6614,10 @@ snapshots:
graphql: 16.10.0
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:
'@graphql-tools/merge': 9.0.22(graphql@16.10.0)
'@graphql-tools/utils': 10.8.4(graphql@16.10.0)
'@graphql-tools/merge': 9.1.1(graphql@16.10.0)
'@graphql-tools/utils': 10.9.1(graphql@16.10.0)
graphql: 16.10.0
tslib: 2.8.1
@@ -6639,10 +6637,10 @@ snapshots:
tslib: 2.8.1
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:
'@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
dset: 3.1.4
graphql: 16.10.0
@@ -6824,14 +6822,16 @@ snapshots:
dependencies:
'@noble/hashes': 1.3.2
'@noble/curves@1.8.1':
'@noble/curves@1.9.7':
dependencies:
'@noble/hashes': 1.7.1
'@noble/hashes': 1.8.0
'@noble/hashes@1.3.2': {}
'@noble/hashes@1.7.1': {}
'@noble/hashes@1.8.0': {}
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -7982,7 +7982,7 @@ snapshots:
'@turnkey/api-key-stamper@0.4.0':
dependencies:
'@noble/curves': 1.8.1
'@noble/curves': 1.9.7
'@turnkey/encoding': 0.1.0
sha256-uint8array: 0.10.7
@@ -8026,7 +8026,7 @@ snapshots:
'@types/connect': 3.4.38
'@types/node': 20.17.23
'@types/body-parser@1.19.5':
'@types/body-parser@1.19.6':
dependencies:
'@types/connect': 3.4.38
'@types/node': 20.17.23
@@ -8039,12 +8039,12 @@ snapshots:
'@types/cookie-session@2.0.49':
dependencies:
'@types/express': 4.17.21
'@types/express': 4.17.23
'@types/keygrip': 1.0.6
'@types/cors@2.8.12': {}
'@types/cors@2.8.17':
'@types/cors@2.8.19':
dependencies:
'@types/node': 20.17.23
@@ -8081,33 +8081,33 @@ snapshots:
'@types/express-serve-static-core@4.17.31':
dependencies:
'@types/node': 20.17.23
'@types/qs': 6.9.18
'@types/qs': 6.14.0
'@types/range-parser': 1.2.7
'@types/express-serve-static-core@4.19.6':
dependencies:
'@types/node': 20.17.23
'@types/qs': 6.9.18
'@types/qs': 6.14.0
'@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:
'@types/express': 4.17.21
'@types/express': 4.17.23
'@types/express@4.17.14':
dependencies:
'@types/body-parser': 1.19.2
'@types/express-serve-static-core': 4.17.31
'@types/qs': 6.9.18
'@types/serve-static': 1.15.7
'@types/qs': 6.14.0
'@types/serve-static': 1.15.8
'@types/express@4.17.21':
'@types/express@4.17.23':
dependencies:
'@types/body-parser': 1.19.5
'@types/body-parser': 1.19.6
'@types/express-serve-static-core': 4.19.6
'@types/qs': 6.9.18
'@types/serve-static': 1.15.7
'@types/qs': 6.14.0
'@types/serve-static': 1.15.8
'@types/fs-extra@11.0.4':
dependencies:
@@ -8121,7 +8121,7 @@ snapshots:
'@types/google-protobuf@3.15.12': {}
'@types/http-errors@2.0.4': {}
'@types/http-errors@2.0.5': {}
'@types/inquirer@6.5.0':
dependencies:
@@ -8151,8 +8151,6 @@ snapshots:
'@types/node@10.12.18': {}
'@types/node@10.17.60': {}
'@types/node@17.0.45': {}
'@types/node@20.17.23':
@@ -8173,7 +8171,7 @@ snapshots:
'@types/prop-types@15.7.14': {}
'@types/qs@6.9.18': {}
'@types/qs@6.14.0': {}
'@types/range-parser@1.2.7': {}
@@ -8190,18 +8188,18 @@ snapshots:
dependencies:
'@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:
'@types/mime': 1.3.5
'@types/node': 20.17.23
'@types/serve-static@1.15.7':
'@types/serve-static@1.15.8':
dependencies:
'@types/http-errors': 2.0.4
'@types/http-errors': 2.0.5
'@types/node': 20.17.23
'@types/send': 0.17.4
'@types/send': 0.17.5
'@types/through@0.0.33':
dependencies:
@@ -8209,7 +8207,7 @@ snapshots:
'@types/tinycolor2@1.4.6': {}
'@whatwg-node/promise-helpers@1.2.4':
'@whatwg-node/promise-helpers@1.3.2':
dependencies:
tslib: 2.8.1
@@ -8420,15 +8418,7 @@ snapshots:
transitivePeerDependencies:
- debug
axios@1.8.2(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:
axios@1.8.4(debug@4.4.0):
dependencies:
follow-redirects: 1.15.9(debug@4.4.0)
form-data: 4.0.2
@@ -8765,11 +8755,11 @@ snapshots:
content-type@1.0.5: {}
cookie-session@2.1.0:
cookie-session@2.1.1:
dependencies:
cookies: 0.9.1
debug: 3.2.7
on-headers: 1.0.2
on-headers: 1.1.0
safe-buffer: 5.2.1
transitivePeerDependencies:
- supports-color
@@ -9057,7 +9047,7 @@ snapshots:
encodeurl@2.0.0: {}
end-of-stream@1.4.4:
end-of-stream@1.4.5:
dependencies:
once: 1.4.0
@@ -9243,13 +9233,13 @@ snapshots:
dependencies:
express: 4.21.2
express-session@1.18.1:
express-session@1.18.2:
dependencies:
cookie: 0.7.2
cookie-signature: 1.0.7
debug: 2.6.9
depd: 2.0.0
on-headers: 1.0.2
on-headers: 1.1.0
parseurl: 1.3.3
safe-buffer: 5.2.1
uid-safe: 2.1.5
@@ -9374,7 +9364,7 @@ snapshots:
jsonfile: 6.1.0
universalify: 2.0.1
fs-extra@11.3.0:
fs-extra@11.3.1:
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.1.0
@@ -9934,7 +9924,7 @@ snapshots:
dependencies:
react: 19.0.0
luxon@3.5.0: {}
luxon@3.7.1: {}
make-error@1.3.6: {}
@@ -10015,7 +10005,7 @@ snapshots:
nan@2.22.2: {}
nanoid-dictionary@5.0.0-beta.1: {}
nanoid-dictionary@5.0.0: {}
nanoid@3.3.8: {}
@@ -10066,7 +10056,7 @@ snapshots:
lower-case: 2.0.2
tslib: 2.8.1
node-abi@3.74.0:
node-abi@3.75.0:
dependencies:
semver: 7.7.1
@@ -10143,7 +10133,7 @@ snapshots:
dependencies:
ee-first: 1.1.1
on-headers@1.0.2: {}
on-headers@1.1.0: {}
once@1.4.0:
dependencies:
@@ -10153,7 +10143,7 @@ snapshots:
dependencies:
mimic-fn: 2.1.0
openpgp@6.1.0: {}
openpgp@6.2.0: {}
optimism@0.18.1:
dependencies:
@@ -10329,14 +10319,14 @@ snapshots:
minimist: 1.2.8
mkdirp-classic: 0.5.3
napi-build-utils: 2.0.0
node-abi: 3.74.0
pump: 3.0.2
node-abi: 3.75.0
pump: 3.0.3
rc: 1.2.8
simple-get: 4.0.1
tar-fs: 2.1.2
tar-fs: 2.1.3
tunnel-agent: 0.6.0
prettier@3.5.3: {}
prettier@3.6.2: {}
process-nextick-args@2.0.1: {}
@@ -10386,9 +10376,9 @@ snapshots:
proxy-from-env@1.1.0: {}
pump@3.0.2:
pump@3.0.3:
dependencies:
end-of-stream: 1.4.4
end-of-stream: 1.4.5
once: 1.4.0
punycode@2.3.1: {}
@@ -10852,7 +10842,7 @@ snapshots:
sprintf-js@1.1.3: {}
sql-highlight@6.0.0: {}
sql-highlight@6.1.0: {}
statuses@2.0.1: {}
@@ -11002,17 +10992,17 @@ snapshots:
tapable@2.2.1: {}
tar-fs@2.1.2:
tar-fs@2.1.3:
dependencies:
chownr: 1.1.4
mkdirp-classic: 0.5.3
pump: 3.0.2
pump: 3.0.3
tar-stream: 2.2.0
tar-stream@2.2.0:
dependencies:
bl: 4.1.0
end-of-stream: 1.4.4
end-of-stream: 1.4.5
fs-constants: 1.0.0
inherits: 2.0.4
readable-stream: 3.6.2
@@ -11218,7 +11208,7 @@ snapshots:
glob: 10.4.5
reflect-metadata: 0.2.2
sha.js: 2.4.11
sql-highlight: 6.0.0
sql-highlight: 6.1.0
tslib: 2.8.1
uuid: 11.1.0
yargs: 17.7.2
+24 -2
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
CLERK_SECRET_KEY=your_clerk_secret
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_GITHUB_FALLBACK_TOKEN=your_github_token
```
@@ -92,4 +92,26 @@ The frontend is built with:
Make sure you have:
1. Connected your GitHub account in Clerk
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/**"],
"env": ["NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY", "CLERK_SECRET_KEY"]
},
"build:compile": {
"dependsOn": ["^build"],
"inputs": ["$TURBO_DEFAULT$"],
"outputs": ["dist/**"]
},
"start": {
"dependsOn": ["^build"],
"cache": false,