From a3c36bf1479c4d3afb15be9c1bf884432dbd073f Mon Sep 17 00:00:00 2001 From: seveibar Date: Mon, 15 Apr 2024 20:33:24 -0700 Subject: [PATCH] add errors to export_request in db, allow exporting tscircuit soup, add open in vs code option --- .../routes/api/export_requests/update.ts | 18 ++++++++--- dev-server-api/src/db/create-schema.ts | 2 ++ dev-server-api/src/db/get-db.ts | 2 ++ .../src/lib/zod/export_parameters.ts | 2 ++ dev-server-frontend/bun.lockb | Bin 204395 -> 204395 bytes dev-server-frontend/src/HeaderMenu.tsx | 13 ++++++++ .../dialogs/generic-export-dialog.tsx | 3 ++ lib/cmd-fns/dev/fulfill-export-requests.ts | 30 ++++++++++++++++++ lib/cmd-fns/dev/index.ts | 7 ++++ .../dev/start-export-request-watcher.ts | 11 ------- 10 files changed, 73 insertions(+), 15 deletions(-) diff --git a/dev-server-api/routes/api/export_requests/update.ts b/dev-server-api/routes/api/export_requests/update.ts index 70ed870b..c55c248a 100644 --- a/dev-server-api/routes/api/export_requests/update.ts +++ b/dev-server-api/routes/api/export_requests/update.ts @@ -9,16 +9,26 @@ export default withEdgeSpec({ methods: ["POST"], jsonBody: z.object({ export_request_id: z.coerce.number(), - is_complete: z.boolean(), + is_complete: z.boolean().optional(), + has_error: z.boolean().optional(), + error: z.string().optional(), }), jsonResponse: z.object({}), auth: "none", })(async (req, ctx) => { await ctx.db .updateTable("export_request") - .set({ - is_complete: req.jsonBody.is_complete ? 1 : 0, - }) + .$if(req.jsonBody.is_complete !== undefined, (qb) => + qb.set({ + is_complete: req.jsonBody.is_complete ? 1 : 0, + }) + ) + .$if(req.jsonBody.has_error !== undefined, (qb) => + qb.set({ + has_error: req.jsonBody.has_error ? 1 : 0, + error: req.jsonBody.error, + }) + ) .where("export_request_id", "=", req.jsonBody.export_request_id) .execute() diff --git a/dev-server-api/src/db/create-schema.ts b/dev-server-api/src/db/create-schema.ts index b46c75f8..61bb1dd0 100644 --- a/dev-server-api/src/db/create-schema.ts +++ b/dev-server-api/src/db/create-schema.ts @@ -23,6 +23,8 @@ export const createSchema = async (db: DbClient) => { .addColumn("export_parameters", "json") .addColumn("export_name", "text") .addColumn("is_complete", "boolean", (col) => col.defaultTo(0).notNull()) + .addColumn("has_error", "boolean", (col) => col.defaultTo(0).notNull()) + .addColumn("error", "text") .addColumn("created_at", "text") .execute() diff --git a/dev-server-api/src/db/get-db.ts b/dev-server-api/src/db/get-db.ts index ffa09a6c..1eb1ae4f 100644 --- a/dev-server-api/src/db/get-db.ts +++ b/dev-server-api/src/db/get-db.ts @@ -19,6 +19,8 @@ export interface ExportRequest { export_parameters: string export_name: string is_complete: 1 | 0 + has_error: 1 | 0 + error?: string created_at: string } diff --git a/dev-server-api/src/lib/zod/export_parameters.ts b/dev-server-api/src/lib/zod/export_parameters.ts index bf5bbc0c..e6698ade 100644 --- a/dev-server-api/src/lib/zod/export_parameters.ts +++ b/dev-server-api/src/lib/zod/export_parameters.ts @@ -4,6 +4,7 @@ export const export_parameters = z.object({ should_export_gerber_zip: z.boolean().default(false), should_export_pnp_csv: z.boolean().default(false), should_export_bom_csv: z.boolean().default(false), + should_export_soup_json: z.boolean().default(false), gerbers_zip_file_name: z .string() .nullable() @@ -11,6 +12,7 @@ export const export_parameters = z.object({ .default("gerbers.zip"), pnp_csv_file_name: z.string().nullable().optional().default("pnp.csv"), bom_csv_file_name: z.string().nullable().optional().default("bom.csv"), + soup_json_file_name: z.string().nullable().optional().default("soup.json"), }) export type ExportParametersInput = z.input diff --git a/dev-server-frontend/bun.lockb b/dev-server-frontend/bun.lockb index 7cb3d5791888f03ee026154b9a359786d5949b4f..784bccac998019980d77430fe53057a4bf583d12 100755 GIT binary patch delta 32 ocmaF8hv)Sko`x32Elf}OIhb-1OHzwV7~0?RGi`s%&s@g`0OC{(bN~PV delta 32 ocmaF8hv)Sko`x32Elf}OIT+&%^$hiljN0GwGi`s%&s@g`0MhRZW&i*H diff --git a/dev-server-frontend/src/HeaderMenu.tsx b/dev-server-frontend/src/HeaderMenu.tsx index 53e1571b..fbaafbc9 100644 --- a/dev-server-frontend/src/HeaderMenu.tsx +++ b/dev-server-frontend/src/HeaderMenu.tsx @@ -49,6 +49,15 @@ export const HeaderMenu = () => { should_export_bom_csv: true, }, }) + const soupExportDialog = useGenericExportDialog({ + dialogTitle: "Export tscircuit Soup", + dialogDescription: + "Export the tscircuit soup for this example export. This is an internal compiled JSON representation of your circuit.", + exportFileName: "soup.json", + exportParameters: { + should_export_soup_json: true, + }, + }) return ( <> @@ -92,6 +101,9 @@ export const HeaderMenu = () => { > Schematic (PDF) + soupExportDialog.openDialog()}> + tscircuit Soup JSON + @@ -255,6 +267,7 @@ export const HeaderMenu = () => { + ) } diff --git a/dev-server-frontend/src/components/dialogs/generic-export-dialog.tsx b/dev-server-frontend/src/components/dialogs/generic-export-dialog.tsx index 939a0db1..65f5ab68 100644 --- a/dev-server-frontend/src/components/dialogs/generic-export-dialog.tsx +++ b/dev-server-frontend/src/components/dialogs/generic-export-dialog.tsx @@ -69,6 +69,9 @@ export const useGenericExportDialog = ({ if (exportParameters.should_export_bom_csv) { exportParameters.bom_csv_file_name ??= exportFileName } + if (exportParameters.should_export_soup_json) { + exportParameters.soup_json_file_name ??= exportFileName + } let export_request = await axios .post("/api/export_requests/create", { diff --git a/lib/cmd-fns/dev/fulfill-export-requests.ts b/lib/cmd-fns/dev/fulfill-export-requests.ts index 648abc61..5a4aeff8 100644 --- a/lib/cmd-fns/dev/fulfill-export-requests.ts +++ b/lib/cmd-fns/dev/fulfill-export-requests.ts @@ -5,6 +5,7 @@ import { AxiosInstance } from "axios" import { ExportRequest } from "@server/lib/zod/export_request" import { exportPnpCsvToBuffer } from "lib/export-fns/export-pnp-csv" import { exportBomCsvToBuffer } from "lib/export-fns/export-bom-csv" +import { soupify } from "lib/soupify" export const uploadBufferToExportFile = async ({ dev_server_axios, @@ -59,6 +60,17 @@ export const fulfillExportRequests = async ( if (export_request.export_parameters.should_export_gerber_zip) { console.log(kleur.gray(`\n exporting gerbers...`)) + if (typeof Bun !== "undefined") { + const err_str = + "Bun currently isn't capable of exporting due to an archiver bug, exports will not work." + console.log(kleur.red(err_str)) + await dev_server_axios.post("/api/export_requests/update", { + export_request_id: export_request.export_request_id, + has_error: true, + error: err_str, + }) + return + } const zip_buffer = await exportGerbersToZipBuffer( { example_file_path: export_request.example_file_path, @@ -116,5 +128,23 @@ export const fulfillExportRequests = async ( export_request_id: export_request.export_request_id, }) } + + if (export_request.export_parameters.should_export_soup_json) { + console.log(kleur.gray(`\n exporting soup...`)) + const soup = await soupify( + { + filePath: export_request.example_file_path, + exportName: export_request.export_name, + }, + ctx + ) + + await uploadBufferToExportFile({ + dev_server_axios, + file_buffer: Buffer.from(JSON.stringify(soup, null, 2), "utf-8"), + file_name: export_request.export_parameters.soup_json_file_name!, + export_request_id: export_request.export_request_id, + }) + } } } diff --git a/lib/cmd-fns/dev/index.ts b/lib/cmd-fns/dev/index.ts index 20fe9de9..471bcc8e 100644 --- a/lib/cmd-fns/dev/index.ts +++ b/lib/cmd-fns/dev/index.ts @@ -13,6 +13,7 @@ import { createOrModifyNpmrc } from "../init/create-or-modify-npmrc" import { checkIfInitialized } from "./check-if-initialized" import { initCmd } from "../init" import { startExportRequestWatcher } from "./start-export-request-watcher" +import $ from "dax-sh" export const devCmd = async (ctx: AppContext, args: any) => { const params = z @@ -88,6 +89,10 @@ export const devCmd = async (ctx: AppContext, args: any) => { title: "Open in Browser", value: "open-in-browser", }, + { + title: "Open Directory in VS Code", + value: "open-in-vs-code", + }, { title: "Stop Server", value: "stop", @@ -96,6 +101,8 @@ export const devCmd = async (ctx: AppContext, args: any) => { }) if (action === "open-in-browser") { open(serverUrl) + } else if (action === "open-in-vs-code") { + await $`code ${cwd}` } else if (!action || action === "stop") { if (server.stop) server.stop() if (server.close) server.close() diff --git a/lib/cmd-fns/dev/start-export-request-watcher.ts b/lib/cmd-fns/dev/start-export-request-watcher.ts index 291e4876..b39f869d 100644 --- a/lib/cmd-fns/dev/start-export-request-watcher.ts +++ b/lib/cmd-fns/dev/start-export-request-watcher.ts @@ -11,17 +11,6 @@ export const startExportRequestWatcher = async ( }, ctx: AppContext ) => { - if (typeof Bun !== "undefined") { - console.log( - kleur.yellow( - "Bun currently isn't capable of exporting due to an archiver bug, exports will not work." - ) - ) - return { - stop: () => {}, - } - } - let running = true ;(async () => {