Fix scaffold copy and better error handling for create app (#202)
I was over-eager in https://github.com/dyad-sh/dyad/pull/200 and removed copyDirectoryRecursive which is actually needed to copy the scaffold out.
This commit is contained in:
@@ -12,7 +12,10 @@ import { promises as fsPromises } from "node:fs";
|
|||||||
|
|
||||||
// Import our utility modules
|
// Import our utility modules
|
||||||
import { withLock } from "../utils/lock_utils";
|
import { withLock } from "../utils/lock_utils";
|
||||||
import { getFilesRecursively } from "../utils/file_utils";
|
import {
|
||||||
|
copyDirectoryRecursive,
|
||||||
|
getFilesRecursively,
|
||||||
|
} from "../utils/file_utils";
|
||||||
import {
|
import {
|
||||||
runningApps,
|
runningApps,
|
||||||
processCounter,
|
processCounter,
|
||||||
@@ -187,17 +190,13 @@ export function registerAppHandlers() {
|
|||||||
})
|
})
|
||||||
.returning();
|
.returning();
|
||||||
|
|
||||||
// Start async operations in background
|
// Why do we not use fs.cp here?
|
||||||
try {
|
// Because scaffold is inside ASAR and it does NOT
|
||||||
await fsPromises.cp(
|
// behave like a regular directory if you use fs.cp
|
||||||
|
// https://www.electronjs.org/docs/latest/tutorial/asar-archives#limitations-of-the-node-api
|
||||||
|
await copyDirectoryRecursive(
|
||||||
path.join(__dirname, "..", "..", "scaffold"),
|
path.join(__dirname, "..", "..", "scaffold"),
|
||||||
fullAppPath,
|
fullAppPath,
|
||||||
{
|
|
||||||
recursive: true,
|
|
||||||
// Scaffold should *not* have node_modules anyways, but
|
|
||||||
// just in case, we filter it out.
|
|
||||||
filter: (source) => !source.includes("node_modules"),
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
// Initialize git repo and create first commit
|
// Initialize git repo and create first commit
|
||||||
await git.init({
|
await git.init({
|
||||||
@@ -228,9 +227,6 @@ export function registerAppHandlers() {
|
|||||||
initialCommitHash: commitHash,
|
initialCommitHash: commitHash,
|
||||||
})
|
})
|
||||||
.where(eq(chats.id, chat.id));
|
.where(eq(chats.id, chat.id));
|
||||||
} catch (error) {
|
|
||||||
logger.error("Error in background app initialization:", error);
|
|
||||||
}
|
|
||||||
|
|
||||||
return { app, chatId: chat.id };
|
return { app, chatId: chat.id };
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import fs from "node:fs";
|
import fs from "node:fs";
|
||||||
|
import { promises as fsPromises } from "node:fs";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -31,3 +32,22 @@ export function getFilesRecursively(dir: string, baseDir: string): string[] {
|
|||||||
|
|
||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function copyDirectoryRecursive(
|
||||||
|
source: string,
|
||||||
|
destination: string,
|
||||||
|
) {
|
||||||
|
await fsPromises.mkdir(destination, { recursive: true });
|
||||||
|
const entries = await fsPromises.readdir(source, { withFileTypes: true });
|
||||||
|
|
||||||
|
for (const entry of entries) {
|
||||||
|
const srcPath = path.join(source, entry.name);
|
||||||
|
const destPath = path.join(destination, entry.name);
|
||||||
|
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
await copyDirectoryRecursive(srcPath, destPath);
|
||||||
|
} else {
|
||||||
|
await fsPromises.copyFile(srcPath, destPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import { useTheme } from "@/contexts/ThemeContext";
|
|||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { ExternalLink } from "lucide-react";
|
import { ExternalLink } from "lucide-react";
|
||||||
import { ImportAppButton } from "@/components/ImportAppButton";
|
import { ImportAppButton } from "@/components/ImportAppButton";
|
||||||
|
import { showError } from "@/lib/toast";
|
||||||
|
|
||||||
// Adding an export for attachments
|
// Adding an export for attachments
|
||||||
export interface HomeSubmitOptions {
|
export interface HomeSubmitOptions {
|
||||||
@@ -133,6 +134,7 @@ export default function HomePage() {
|
|||||||
navigate({ to: "/chat", search: { id: result.chatId } });
|
navigate({ to: "/chat", search: { id: result.chatId } });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to create chat:", error);
|
console.error("Failed to create chat:", error);
|
||||||
|
showError("Failed to create app. " + (error as any).toString());
|
||||||
setIsLoading(false); // Ensure loading state is reset on error
|
setIsLoading(false); // Ensure loading state is reset on error
|
||||||
}
|
}
|
||||||
// No finally block needed for setIsLoading(false) here if navigation happens on success
|
// No finally block needed for setIsLoading(false) here if navigation happens on success
|
||||||
|
|||||||
Reference in New Issue
Block a user