From 45eb46de5412506b2ac1df394e299b5861341a14 Mon Sep 17 00:00:00 2001 From: Severin Ibarluzea Date: Thu, 29 Aug 2024 20:12:10 -0700 Subject: [PATCH] Support for @tscircuit/core (#131) * soupify tmp outputs, support for running with core * more core integration * fix test * add minor comment * support using core * fix builder not recognizing * fix types * fix path not resolved issue with builds * fix type issues with dependency update * update core with fixed schematic symbols types --- bun.lockb | Bin 514415 -> 517610 bytes cli/lib/cmd-fns/dev/index.ts | 1 + .../dev/soupify-and-upload-example-file.ts | 1 + cli/lib/cmd-fns/publish/index.ts | 2 +- cli/lib/cmd-fns/soupify.ts | 2 + cli/lib/cmd-fns/version.ts | 2 +- cli/lib/get-program.ts | 2 + cli/lib/soupify.ts | 115 ------------------ cli/lib/soupify/get-export-name-from-file.ts | 29 +++++ cli/lib/soupify/get-tmp-entrpoint-filepath.ts | 13 ++ cli/lib/soupify/index.ts | 1 + cli/lib/soupify/run-entrypoint-file.ts | 60 +++++++++ cli/lib/soupify/soupify-with-core.ts | 52 ++++++++ cli/lib/soupify/soupify.ts | 77 ++++++++++++ ...oupify.test.ts => soupify-builder.test.ts} | 2 +- cli/tests/soupify-core.test.ts | 9 ++ example-project/examples/basic-chip.tsx | 7 +- frontend/views/HeaderMenu.tsx | 2 +- package.json | 7 +- tsconfig.json | 11 +- 20 files changed, 269 insertions(+), 126 deletions(-) delete mode 100644 cli/lib/soupify.ts create mode 100644 cli/lib/soupify/get-export-name-from-file.ts create mode 100644 cli/lib/soupify/get-tmp-entrpoint-filepath.ts create mode 100644 cli/lib/soupify/index.ts create mode 100644 cli/lib/soupify/run-entrypoint-file.ts create mode 100644 cli/lib/soupify/soupify-with-core.ts create mode 100644 cli/lib/soupify/soupify.ts rename cli/tests/{soupify.test.ts => soupify-builder.test.ts} (85%) create mode 100644 cli/tests/soupify-core.test.ts diff --git a/bun.lockb b/bun.lockb index 559cfccd4218f91275b189e3e3696673b4b3b981..a20747c4ac1ea652a7a92ed8db689ecb758a36b3 100755 GIT binary patch delta 95435 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 PGWTgcYby3=n?nB$a98re delta 93681 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 diff --git a/cli/lib/cmd-fns/dev/index.ts b/cli/lib/cmd-fns/dev/index.ts index 2889aa2e..3feb2e70 100644 --- a/cli/lib/cmd-fns/dev/index.ts +++ b/cli/lib/cmd-fns/dev/index.ts @@ -23,6 +23,7 @@ export const devCmd = async (ctx: AppContext, args: any) => { const params = z .object({ port: z.coerce.number().optional().default(3020), + core: z.boolean().optional(), }) .parse(args) diff --git a/cli/lib/cmd-fns/dev/soupify-and-upload-example-file.ts b/cli/lib/cmd-fns/dev/soupify-and-upload-example-file.ts index 9dc555b7..09ecaac6 100644 --- a/cli/lib/cmd-fns/dev/soupify-and-upload-example-file.ts +++ b/cli/lib/cmd-fns/dev/soupify-and-upload-example-file.ts @@ -30,6 +30,7 @@ export const soupifyAndUploadExampleFile = async ( { filePath: examplePath, exportName, + useCore: ctx.params.core, }, ctx, ) diff --git a/cli/lib/cmd-fns/publish/index.ts b/cli/lib/cmd-fns/publish/index.ts index 7dc5491e..b4d2e8ed 100644 --- a/cli/lib/cmd-fns/publish/index.ts +++ b/cli/lib/cmd-fns/publish/index.ts @@ -7,7 +7,7 @@ import { existsSync, readFileSync } from "fs" import { getAllPackageFiles } from "cli/lib/util/get-all-package-files" import prompts from "prompts" import { getGeneratedReadme } from "../init/get-generated-readme" -import { soupify } from "../../soupify" +import { soupify } from "../../soupify/soupify" import { inferExportNameFromSource } from "../dev/infer-export-name-from-source" import $ from "dax-sh" import semver from "semver" diff --git a/cli/lib/cmd-fns/soupify.ts b/cli/lib/cmd-fns/soupify.ts index 29b4c730..828d4622 100644 --- a/cli/lib/cmd-fns/soupify.ts +++ b/cli/lib/cmd-fns/soupify.ts @@ -11,6 +11,7 @@ export const soupifyCmd = async (ctx: AppContext, args: any) => { file: z.string(), export: z.string().optional(), output: z.string().optional(), + core: z.boolean().optional(), }) .parse(args) @@ -18,6 +19,7 @@ export const soupifyCmd = async (ctx: AppContext, args: any) => { { filePath: params.file, exportName: params.export, + useCore: params.core, }, ctx, ) diff --git a/cli/lib/cmd-fns/version.ts b/cli/lib/cmd-fns/version.ts index d58f2df2..16f96624 100644 --- a/cli/lib/cmd-fns/version.ts +++ b/cli/lib/cmd-fns/version.ts @@ -12,7 +12,7 @@ export const versionCmd = async (ctx: AppContext, args: any) => { table.push({ name: "@tscircuit/cli", current: cliPackageJson.version }) table.push({ name: "@tscircuit/react-fiber", - current: cliPackageJson.devDependencies["@tscircuit/react-fiber"], + current: cliPackageJson.dependencies["@tscircuit/react-fiber"], }) table.push({ name: "@tscircuit/schematic-viewer", diff --git a/cli/lib/get-program.ts b/cli/lib/get-program.ts index c6658564..e02a2946 100644 --- a/cli/lib/get-program.ts +++ b/cli/lib/get-program.ts @@ -12,6 +12,7 @@ export const getProgram = (ctx: AppContext) => { .description("Run development server in current directory") .option("--cwd ", "Current working directory") .option("--port ", "Port to run dev server on") + .option("--core", "Use @tscircuit/core beta") .option("--no-cleanup", "Don't cleanup temporary files (for debugging)") .action((args) => CMDFN.dev(ctx, args)) @@ -293,6 +294,7 @@ export const getProgram = (ctx: AppContext) => { .description("Convert an example file to tscircuit soup") .requiredOption("--file ", "Input example files") .option("--output ", "Output file") + .option("--core", "Use @tscircuit/core to build (future version)") .option( "--export ", "Name of export to soupify, if not specified, soupify the default/only export", diff --git a/cli/lib/soupify.ts b/cli/lib/soupify.ts deleted file mode 100644 index 200c46be..00000000 --- a/cli/lib/soupify.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { AppContext } from "./util/app-context" -import { z } from "zod" -import $ from "dax-sh" -import * as Path from "path" -import { unlink } from "node:fs/promises" -import kleur from "kleur" -import { writeFileSync } from "fs" -import { readFile } from "fs/promises" -import Debug from "debug" - -const debug = Debug("tscircuit:soupify") - -export const soupify = async ( - { - filePath, - exportName, - }: { - filePath: string - exportName?: string - }, - ctx: Pick, -) => { - debug(`reading ${filePath}`) - const targetFileContent = await readFile(filePath, "utf-8") - - if (!exportName) { - if (targetFileContent.includes("export default")) { - exportName = "default" - } else { - // Look for "export const " or "export function " - const exportRegex = /export\s+(?:const|function)\s+(\w+)/g - const match = exportRegex.exec(targetFileContent) - if (match) { - exportName = match[1] - } - } - } - - if (!exportName) { - throw new Error( - `Couldn't derive an export name and didn't find default export in "${filePath}"`, - ) - } - - const tmpFilePath = Path.join( - Path.dirname(filePath), - Path.basename(filePath).replace(/\.[^\.]+$/, "") + ".__tmp_entrypoint.tsx", - ) - - debug(`writing to ${tmpFilePath}`) - writeFileSync( - tmpFilePath, - ` -import React from "react" -import { createRoot } from "@tscircuit/react-fiber" -import { createProjectBuilder } from "@tscircuit/builder" - -import * as EXPORTS from "./${Path.basename(filePath)}" - -const Component = EXPORTS["${exportName}"] - -if (!Component) { - console.log(JSON.stringify({ - COMPILE_ERROR: 'Failed to find "${exportName}" export in "${filePath}"' - })) - process.exit(0) -} - -const projectBuilder = createProjectBuilder() -const elements = await createRoot().render(, projectBuilder) - -console.log(JSON.stringify(elements)) - -`.trim(), - ) - - debug(`using runtime ${ctx.runtime}`) - const processCmdPart1 = - ctx.runtime === "node" ? $`npx tsx ${tmpFilePath}` : $`bun ${tmpFilePath}` - - debug(`starting process....`) - const processResult = await processCmdPart1 - .stdout(debug.enabled ? "inheritPiped" : "piped") - .stderr(debug.enabled ? "inheritPiped" : "piped") - .noThrow() - - // TODO we should send it to a temporarty file rather than rely on stdout - // which can easily be polluted - const rawSoup = processResult.stdout.replace(/^[^\[]*/, "") - const errText = processResult.stderr - - if (ctx.params.cleanup !== false) { - debug(`deleting ${tmpFilePath}`) - await unlink(tmpFilePath) - } - - try { - debug(`parsing result of soupify...`) - const soup = JSON.parse(rawSoup) - - if (soup.COMPILE_ERROR) { - // console.log(kleur.red(`Failed to compile ${filePath}`)) - console.log(kleur.red(soup.COMPILE_ERROR)) - throw new Error(soup.COMPILE_ERROR) - } - - return soup - } catch (e: any) { - // console.log(kleur.red(`Failed to parse result of soupify: ${e.toString()}`)) - const t = Date.now() - console.log(`Dumping raw output to .tscircuit/err-${t}.log`) - writeFileSync(`.tscircuit/err-${t}.log`, rawSoup + "\n\n" + errText) - throw new Error(errText) - } -} diff --git a/cli/lib/soupify/get-export-name-from-file.ts b/cli/lib/soupify/get-export-name-from-file.ts new file mode 100644 index 00000000..20e0eaf3 --- /dev/null +++ b/cli/lib/soupify/get-export-name-from-file.ts @@ -0,0 +1,29 @@ +import { readFile } from "node:fs/promises" +import Debug from "debug" + +const debug = Debug("tscircuit:soupify") + +export const getExportNameFromFile = async (filePath: string) => { + debug(`reading ${filePath}`) + const targetFileContent = await readFile(filePath, "utf-8") + + let exportName: string | undefined + if (targetFileContent.includes("export default")) { + exportName = "default" + } else { + // Look for "export const " or "export function " + const exportRegex = /export\s+(?:const|function)\s+(\w+)/g + const match = exportRegex.exec(targetFileContent) + if (match) { + exportName = match[1] + } + } + + if (!exportName) { + throw new Error( + `Couldn't derive an export name and didn't find default export in "${filePath}"`, + ) + } + + return exportName +} diff --git a/cli/lib/soupify/get-tmp-entrpoint-filepath.ts b/cli/lib/soupify/get-tmp-entrpoint-filepath.ts new file mode 100644 index 00000000..8906560c --- /dev/null +++ b/cli/lib/soupify/get-tmp-entrpoint-filepath.ts @@ -0,0 +1,13 @@ +import Path from "node:path" + +export const getTmpEntrypointFilePath = (filePath: string) => { + const tmpEntrypointPath = Path.join( + Path.dirname(filePath), + Path.basename(filePath).replace(/\.[^\.]+$/, "") + ".__tmp_entrypoint.tsx", + ) + const tmpOutputPath = Path.join( + Path.dirname(filePath), + Path.basename(filePath).replace(/\.[^\.]+$/, "") + ".__tmp_output.json", + ) + return { tmpEntrypointPath, tmpOutputPath } +} diff --git a/cli/lib/soupify/index.ts b/cli/lib/soupify/index.ts new file mode 100644 index 00000000..d26850cb --- /dev/null +++ b/cli/lib/soupify/index.ts @@ -0,0 +1 @@ +export * from "./soupify" diff --git a/cli/lib/soupify/run-entrypoint-file.ts b/cli/lib/soupify/run-entrypoint-file.ts new file mode 100644 index 00000000..4032e33b --- /dev/null +++ b/cli/lib/soupify/run-entrypoint-file.ts @@ -0,0 +1,60 @@ +import Debug from "debug" +import { writeFileSync } from "fs" +import { readFile, unlink } from "node:fs/promises" +import $ from "dax-sh" +import kleur from "kleur" +import { AppContext } from "../util/app-context" + +const debug = Debug("tscircuit:soupify") + +/** + * Runs the entrypoint file to generate circuit json (soup) for a given file + */ +export const runEntrypointFile = async ( + { + tmpEntrypointPath, + tmpOutputPath, + }: { tmpEntrypointPath: string; tmpOutputPath: string }, + ctx: Pick, +) => { + debug(`using runtime ${ctx.runtime}`) + const processCmdPart1 = + ctx.runtime === "node" + ? $`npx tsx ${tmpEntrypointPath}` + : $`bun ${tmpEntrypointPath}` + + debug(`starting process....`) + const processResult = await processCmdPart1 + .stdout(debug.enabled ? "inheritPiped" : "piped") + .stderr(debug.enabled ? "inheritPiped" : "piped") + .noThrow() + + const rawSoup = await readFile(tmpOutputPath, "utf-8") + const errText = processResult.stderr + + if (ctx.params.cleanup !== false) { + debug(`deleting ${tmpEntrypointPath}`) + await unlink(tmpEntrypointPath) + debug(`deleting ${tmpOutputPath}`) + await unlink(tmpOutputPath) + } + + try { + debug(`parsing result of soupify...`) + const soup = JSON.parse(rawSoup) + + if (soup.COMPILE_ERROR) { + // console.log(kleur.red(`Failed to compile ${filePath}`)) + console.log(kleur.red(soup.COMPILE_ERROR)) + throw new Error(soup.COMPILE_ERROR) + } + + return soup + } catch (e: any) { + // console.log(kleur.red(`Failed to parse result of soupify: ${e.toString()}`)) + const t = Date.now() + console.log(`Dumping raw output to .tscircuit/err-${t}.log`) + writeFileSync(`.tscircuit/err-${t}.log`, rawSoup + "\n\n" + errText) + throw new Error(errText) + } +} diff --git a/cli/lib/soupify/soupify-with-core.ts b/cli/lib/soupify/soupify-with-core.ts new file mode 100644 index 00000000..85296dd3 --- /dev/null +++ b/cli/lib/soupify/soupify-with-core.ts @@ -0,0 +1,52 @@ +import { AppContext } from "../util/app-context" +import { z } from "zod" +import $ from "dax-sh" +import * as Path from "path" +import { unlink } from "node:fs/promises" +import kleur from "kleur" +import { writeFileSync } from "fs" +import { readFile } from "fs/promises" +import Debug from "debug" +import { getExportNameFromFile } from "./get-export-name-from-file" +import { getTmpEntrypointFilePath } from "./get-tmp-entrpoint-filepath" +import { runEntrypointFile } from "./run-entrypoint-file" + +const debug = Debug("tscircuit:soupify") + +export const soupifyWithCore = async ( + params: { + filePath: string + exportName?: string + }, + ctx: Pick, +) => { + let { filePath, exportName } = params + + exportName ??= await getExportNameFromFile(filePath) + + const { tmpEntrypointPath, tmpOutputPath } = + getTmpEntrypointFilePath(filePath) + + debug(`writing to ${tmpEntrypointPath}`) + writeFileSync( + tmpEntrypointPath, + ` +import React from "react" +import { Project } from "@tscircuit/core" +import * as EXPORTS from "./${Path.basename(filePath)}" +import { writeFileSync } from "node:fs" + +const Component = EXPORTS["${exportName}"] + +const project = new Project() + +project.add() + +project.render() + +writeFileSync("${tmpOutputPath}", JSON.stringify(project.getCircuitJson())) +`.trim(), + ) + + return await runEntrypointFile({ tmpEntrypointPath, tmpOutputPath }, ctx) +} diff --git a/cli/lib/soupify/soupify.ts b/cli/lib/soupify/soupify.ts new file mode 100644 index 00000000..8510044d --- /dev/null +++ b/cli/lib/soupify/soupify.ts @@ -0,0 +1,77 @@ +import { AppContext } from "../util/app-context" +import { z } from "zod" +import $ from "dax-sh" +import * as Path from "path" +import { unlink } from "node:fs/promises" +import kleur from "kleur" +import { writeFileSync } from "fs" +import { readFile } from "fs/promises" +import Debug from "debug" +import { soupifyWithCore } from "./soupify-with-core" +import { getExportNameFromFile } from "./get-export-name-from-file" +import { getTmpEntrypointFilePath } from "./get-tmp-entrpoint-filepath" +import { runEntrypointFile } from "./run-entrypoint-file" + +const debug = Debug("tscircuit:soupify") + +export const soupifyWithBuilder = async ( + params: { + filePath: string + exportName?: string + /** + * Use @tscircuit/core instead of @tscircuit/builder, this will be the + * default eventually + */ + useCore?: boolean + }, + ctx: Pick, +) => { + let { filePath, exportName, useCore } = params + if (useCore) return soupifyWithCore(params, ctx) + + exportName ??= await getExportNameFromFile(filePath) + + const { tmpEntrypointPath, tmpOutputPath } = + getTmpEntrypointFilePath(filePath) + + debug(`writing to ${tmpEntrypointPath}`) + writeFileSync( + tmpEntrypointPath, + ` +import React from "react" +import { createRoot } from "@tscircuit/react-fiber" +import { createProjectBuilder } from "@tscircuit/builder" +import { writeFileSync } from "node:fs" + +let Component +try { + const EXPORTS = await import("./${Path.basename(filePath)}") + Component = EXPORTS["${exportName}"] +} catch (e) { + writeFileSync("${tmpOutputPath}", JSON.stringify({ + COMPILE_ERROR: e.message + "\\n\\n" + e.stack, + })) +} + +if (!Component) { + console.log(JSON.stringify({ + COMPILE_ERROR: 'Failed to find "${exportName}" export in "${filePath}"' + })) + writeFileSync("${tmpOutputPath}", JSON.stringify({ + COMPILE_ERROR: e.message + "\\n\\n" + e.stack, + })) + process.exit(0) +} + +const projectBuilder = createProjectBuilder() +const elements = await createRoot().render(, projectBuilder) + +writeFileSync("${tmpOutputPath}", JSON.stringify(elements)) + +`.trim(), + ) + + return await runEntrypointFile({ tmpEntrypointPath, tmpOutputPath }, ctx) +} + +export const soupify = soupifyWithBuilder diff --git a/cli/tests/soupify.test.ts b/cli/tests/soupify-builder.test.ts similarity index 85% rename from cli/tests/soupify.test.ts rename to cli/tests/soupify-builder.test.ts index feee4410..1189f0b3 100644 --- a/cli/tests/soupify.test.ts +++ b/cli/tests/soupify-builder.test.ts @@ -1,7 +1,7 @@ import { test, expect, describe } from "bun:test" import { $ } from "bun" -test("soupify", async () => { +test("soupify (builder)", async () => { const result = await $`bun cli/cli.ts soupify -y --file ./example-project/examples/basic-chip.tsx`.text() diff --git a/cli/tests/soupify-core.test.ts b/cli/tests/soupify-core.test.ts new file mode 100644 index 00000000..44e85230 --- /dev/null +++ b/cli/tests/soupify-core.test.ts @@ -0,0 +1,9 @@ +import { test, expect, describe } from "bun:test" +import { $ } from "bun" + +test("soupify (core)", async () => { + const result = + await $`bun cli/cli.ts soupify --core -y --file ./example-project/examples/basic-chip.tsx`.text() + + expect(result).toContain("10000") // R1 resistor value +}) diff --git a/example-project/examples/basic-chip.tsx b/example-project/examples/basic-chip.tsx index 07eab06e..6b58f1f8 100644 --- a/example-project/examples/basic-chip.tsx +++ b/example-project/examples/basic-chip.tsx @@ -1,14 +1,15 @@ +import "@tscircuit/core" import { layout } from "@tscircuit/layout" import manual_edits from "../src/manual-edits" -export const BasicBug = () => ( +export const BasicChip = () => ( - ( }} /> - + ) diff --git a/frontend/views/HeaderMenu.tsx b/frontend/views/HeaderMenu.tsx index 024061f5..47a564de 100644 --- a/frontend/views/HeaderMenu.tsx +++ b/frontend/views/HeaderMenu.tsx @@ -288,7 +288,7 @@ export const HeaderMenu = () => { @tscircuit/react-fiber v - {cliPackageJson.devDependencies["@tscircuit/react-fiber"].replace( + {cliPackageJson.dependencies["@tscircuit/react-fiber"].replace( /\^/g, "", )} diff --git a/package.json b/package.json index c26d919a..c5975d26 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,9 @@ "dependencies": { "@edge-runtime/primitives": "^4.1.0", "@hono/node-server": "^1.8.2", + "@tscircuit/builder": "*", + "@tscircuit/core": "0.0.14", + "@tscircuit/react-fiber": "1.2.0", "archiver": "^7.0.1", "axios": "^1.6.7", "chokidar": "^3.6.0", @@ -66,8 +69,7 @@ "ts-morph": "^22.0.0", "tsup": "^8.0.2", "winterspec": "0.0.86", - "zod": "^3.22.4", - "@tscircuit/builder": "*" + "zod": "^3.22.4" }, "peerDependencies": { "@tscircuit/builder": "*", @@ -96,7 +98,6 @@ "@tscircuit/layout": "^0.0.25", "@tscircuit/manual-edit-events": "^0.0.4", "@tscircuit/pcb-viewer": "^1.4.4", - "@tscircuit/react-fiber": "*", "@tscircuit/schematic-viewer": "^1.2.14", "@tscircuit/soup-util": "^0.0.20", "@tscircuit/table-viewer": "0.0.8", diff --git a/tsconfig.json b/tsconfig.json index 4885fbcd..0f5a3614 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,8 +13,17 @@ "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + "paths": { + "cli/*": ["cli/*"], + "frontend/*": ["frontend/*"], + "api/*": ["api/*"], + "scripts/*": ["scripts/*"], + }, + "strict": true /* Enable all strict type-checking options. */, "skipLibCheck": true, - "verbatimModuleSyntax": false + "verbatimModuleSyntax": false, }, + "include": ["src/**/*", "cli/**/*", "frontend/**/*", "api/**/*", "scripts/**/*", "example-project/**/*"], + "exclude": ["node_modules"] }