@tscircuit/cli 0.0.113 → 0.0.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
@@ -0,0 +1,28 @@
1
+ import { withWinterSpec } from "src/with-winter-spec"
2
+ import { z } from "zod"
3
+
4
+ export default withWinterSpec({
5
+ methods: ["POST"],
6
+ jsonBody: z.object({
7
+ package_name: z.string()
8
+ }),
9
+ jsonResponse: z.object({
10
+ package_info: z.object({
11
+ name: z.string()
12
+ })
13
+ }),
14
+ auth: "none",
15
+ })(async (req, ctx) => {
16
+ const package_name = req.jsonBody.package_name
17
+ const package_info = await ctx.db
18
+ .insertInto("package_info")
19
+ .values({
20
+ name: package_name
21
+ })
22
+ .returningAll()
23
+ .executeTakeFirstOrThrow()
24
+
25
+ return ctx.json({
26
+ package_info
27
+ })
28
+ })
@@ -0,0 +1,18 @@
1
+ import { export_package_info } from "src/lib/zod/export_package_info"
2
+ import { withWinterSpec } from "src/with-winter-spec"
3
+ import { z } from "zod"
4
+
5
+ export default withWinterSpec({
6
+ methods: ["GET"],
7
+ jsonResponse: z.object({
8
+ package_info: export_package_info
9
+ }),
10
+ auth: "none",
11
+ })(async (req, ctx) => {
12
+ const package_info = await ctx.db
13
+ .selectFrom("package_info")
14
+ .select("name")
15
+ .executeTakeFirstOrThrow()
16
+
17
+ return ctx.json({ package_info })
18
+ })
@@ -2,6 +2,11 @@ import type { DbClient } from "./get-db"
2
2
 
3
3
  export const createSchema = async (db: DbClient) => {
4
4
  console.log("Creating schema...")
5
+ await db.schema
6
+ .createTable("package_info")
7
+ .addColumn("name", "text", (col) => col.notNull())
8
+ .execute()
9
+
5
10
  await db.schema
6
11
  .createTable("dev_package_example")
7
12
  .addColumn("dev_package_example_id", "integer", (col) =>
@@ -1,7 +1,11 @@
1
- import { Kysely, sql, type Generated, SqliteDialect } from "kysely"
2
- import { createSchema } from "./create-schema"
3
1
  import { mkdirSync } from "fs"
2
+ import { Kysely, SqliteDialect, sql, type Generated } from "kysely"
4
3
  import * as Path from "path"
4
+ import { createSchema } from "./create-schema"
5
+
6
+ export interface PackageInfo {
7
+ name: string
8
+ }
5
9
 
6
10
  export interface DevPackageExample {
7
11
  dev_package_example_id: Generated<number>
@@ -40,6 +44,7 @@ interface KyselyDatabaseSchema {
40
44
  dev_package_example: DevPackageExample
41
45
  export_request: ExportRequest
42
46
  export_file: ExportFile
47
+ package_info: PackageInfo
43
48
  }
44
49
 
45
50
  export type DbClient = Kysely<KyselyDatabaseSchema>
@@ -72,7 +77,7 @@ export const getDb = async (): Promise<Kysely<KyselyDatabaseSchema>> => {
72
77
  create: true,
73
78
  }),
74
79
  })
75
- } catch (e) {}
80
+ } catch (e) { }
76
81
  }
77
82
 
78
83
  if (!dialect) {
@@ -82,7 +87,7 @@ export const getDb = async (): Promise<Kysely<KyselyDatabaseSchema>> => {
82
87
  dialect = new SqliteDialect({
83
88
  database: new BetterSqlite3.default(devServerDbPath),
84
89
  })
85
- } catch (e) {}
90
+ } catch (e) { }
86
91
  }
87
92
 
88
93
  if (!dialect) {
@@ -98,12 +103,15 @@ export const getDb = async (): Promise<Kysely<KyselyDatabaseSchema>> => {
98
103
  const schemaExistsResult = await sql`
99
104
  SELECT name
100
105
  FROM sqlite_master
101
- WHERE type='table' AND name='dev_package_example'
106
+ WHERE type='table' AND name IN ('dev_package_example', 'export_request', 'export_file', 'package_info')
102
107
  `.execute(db)
103
108
 
104
- if (schemaExistsResult.rows.length === 0) {
109
+ // Check if the number of existing tables matches the number of required tables
110
+ if (schemaExistsResult.rows.length < 4) {
105
111
  await createSchema(db)
106
112
  }
107
113
 
114
+ globalDb = db
115
+
108
116
  return db
109
- }
117
+ }
@@ -0,0 +1,5 @@
1
+ import { z } from "zod"
2
+
3
+ export const export_package_info = z.object({
4
+ name: z.string()
5
+ })
Binary file
@@ -10,7 +10,7 @@
10
10
  "scripts": {
11
11
  "dev": "vite",
12
12
  "start": "npm run dev",
13
- "build": "tsc && vite build --base /preview && rm -f dist/bundle* && make-vfs --dir dist --outfile ./dist/bundle.ts",
13
+ "build": "tsc && vite build --base /preview && rimraf dist/bundle.ts && make-vfs --dir dist --outfile ./dist/bundle.ts",
14
14
  "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 10",
15
15
  "preview": "vite preview",
16
16
  "update-deps": "bun add @tscircuit/pcb-viewer@latest @tscircuit/builder@latest @tscircuit/schematic-viewer@latest @tscircuit/3d-viewer@latest"
@@ -45,6 +45,7 @@
45
45
  "react-error-boundary": "^4.0.13",
46
46
  "react-hot-toast": "^2.4.1",
47
47
  "react-query": "^3.39.3",
48
+ "rimraf": "^5.0.7",
48
49
  "tailwind-merge": "^2.2.1",
49
50
  "tailwindcss-animate": "^1.0.7",
50
51
  "zod": "^3.22.4",
@@ -64,8 +64,8 @@ export const ExampleContentView = () => {
64
64
  "relative",
65
65
  `h-[${editorHeight}px]`,
66
66
  viewMode === "split" &&
67
- splitMode === "horizontal" &&
68
- "grid grid-cols-2",
67
+ splitMode === "horizontal" &&
68
+ "grid grid-cols-2",
69
69
  viewMode === "split" && splitMode === "vertical" && "grid grid-rows-2",
70
70
  )}
71
71
  >
@@ -141,28 +141,28 @@ export const ExampleContentView = () => {
141
141
  )}
142
142
  {pkg?.error && viewMode !== "soup" && (
143
143
  <div className="absolute top-0 w-full">
144
- <div className="bg-red-50 shadow-lg p-4 m-16 border-red-200 border rounded-lg whitespace-pre">
144
+ <div className="p-4 m-16 whitespace-pre border border-red-200 rounded-lg shadow-lg bg-red-50">
145
145
  {pkg?.error}
146
146
  </div>
147
147
  </div>
148
148
  )}
149
149
  {notFound && (
150
- <div className="absolute top-0 w-full flex justify-center">
150
+ <div className="absolute top-0 flex justify-center w-full">
151
151
  <div className="bg-yellow-50 shadow-lg p-4 m-16 border-yellow-200 border rounded-lg whitespace-pre max-w-[400px]">
152
152
  Select an example from the menu above
153
153
  </div>
154
154
  </div>
155
155
  )}
156
156
  {isLoading && !isError && (
157
- <div className="absolute top-0 w-full flex justify-center">
158
- <div className="bg-gray-50 shadow-lg p-4 m-16 border-gray-200 border rounded-lg whitespace-pre">
157
+ <div className="absolute top-0 flex justify-center w-full">
158
+ <div className="p-4 m-16 whitespace-pre border border-gray-200 rounded-lg shadow-lg bg-gray-50">
159
159
  Loading...
160
160
  </div>
161
161
  </div>
162
162
  )}
163
163
  {pkg && pkg.is_loading && (
164
- <div className="absolute top-0 right-0 bg-white p-4 py-2 m-4 rounded-md flex items-center z-10 shadow-lg border border-gray-200">
165
- <div className="border-2 border-blue-400 border-t-transparent rounded-full w-4 h-4 animate-spin mr-2"></div>
164
+ <div className="absolute top-0 right-0 z-10 flex items-center p-4 py-2 m-4 bg-white border border-gray-200 rounded-md shadow-lg">
165
+ <div className="w-4 h-4 mr-2 border-2 border-blue-400 rounded-full border-t-transparent animate-spin"></div>
166
166
  Rebuilding...
167
167
  </div>
168
168
  )}
@@ -1,24 +1,26 @@
1
+ import axios from "axios"
1
2
  import { useState } from "react"
3
+ import toast from "react-hot-toast"
4
+ import { useQuery } from "react-query"
2
5
  import {
3
6
  Menubar,
7
+ MenubarCheckboxItem,
4
8
  MenubarContent,
5
9
  MenubarItem,
6
10
  MenubarMenu,
7
11
  MenubarRadioGroup,
8
12
  MenubarRadioItem,
9
- MenubarCheckboxItem,
10
13
  MenubarSeparator,
11
14
  MenubarSub,
12
15
  MenubarSubContent,
13
16
  MenubarSubTrigger,
14
17
  MenubarTrigger,
15
18
  } from "src/components/ui/menubar"
16
- import toast from "react-hot-toast"
17
- import { useGlobalStore } from "./hooks/use-global-store"
18
- import frontendPackageJson from "../package.json"
19
19
  import cliPackageJson from "../../package.json"
20
- import { useGerberExportDialog } from "./components/dialogs/gerber-export-dialog"
20
+ import frontendPackageJson from "../package.json"
21
21
  import { useGenericExportDialog } from "./components/dialogs/generic-export-dialog"
22
+ import { useGerberExportDialog } from "./components/dialogs/gerber-export-dialog"
23
+ import { useGlobalStore } from "./hooks/use-global-store"
22
24
 
23
25
  export const HeaderMenu = () => {
24
26
  const [viewMode, setViewMode] = useGlobalStore((s) => [
@@ -29,6 +31,23 @@ export const HeaderMenu = () => {
29
31
  s.split_mode,
30
32
  s.setSplitMode,
31
33
  ])
34
+
35
+ const {
36
+ data,
37
+ isLoading,
38
+ } = useQuery(
39
+ ["package_info"],
40
+ async () =>
41
+ axios
42
+ .get(`/api/package_info/get`),
43
+ {
44
+ refetchOnWindowFocus: true,
45
+ retry: false,
46
+ },
47
+ )
48
+
49
+ const name = data?.data.package_info.name
50
+
32
51
  const [inDebugMode, setInDebugMode] = useState(false)
33
52
  const gerberExportDialog = useGerberExportDialog()
34
53
  const pnpExportDialog = useGenericExportDialog({
@@ -65,7 +84,7 @@ export const HeaderMenu = () => {
65
84
  <MenubarMenu>
66
85
  <MenubarTrigger>File</MenubarTrigger>
67
86
  <MenubarContent className="z-[200]">
68
- <MenubarItem disabled>seveibar/arduino@1.0.0</MenubarItem>
87
+ <MenubarItem disabled>{name}</MenubarItem>
69
88
  <MenubarSeparator />
70
89
  <MenubarItem
71
90
  onSelect={() => {
@@ -150,7 +169,7 @@ export const HeaderMenu = () => {
150
169
  <MenubarMenu>
151
170
  <MenubarTrigger>Package</MenubarTrigger>
152
171
  <MenubarContent className="z-[200]">
153
- <MenubarItem disabled>seveibar/arduino@1.0.0</MenubarItem>
172
+ <MenubarItem disabled>{name}</MenubarItem>
154
173
  <MenubarSeparator />
155
174
  <MenubarCheckboxItem
156
175
  checked