@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.
- package/dev-server-api/bun.lockb +0 -0
- package/dev-server-api/routes/api/package_info/create.ts +28 -0
- package/dev-server-api/routes/api/package_info/get.ts +18 -0
- package/dev-server-api/src/db/create-schema.ts +5 -0
- package/dev-server-api/src/db/get-db.ts +15 -7
- package/dev-server-api/src/lib/zod/export_package_info.ts +5 -0
- package/dev-server-frontend/bun.lockb +0 -0
- package/dev-server-frontend/package.json +2 -1
- package/dev-server-frontend/src/ExampleContentView.tsx +8 -8
- package/dev-server-frontend/src/HeaderMenu.tsx +26 -7
- package/dist/cli.js +493 -484
- package/lib/cmd-fns/dev/dev-server-request-handler.ts +9 -2
- package/lib/cmd-fns/dev/index.ts +26 -12
- package/package.json +1 -1
package/dev-server-api/bun.lockb
CHANGED
|
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
|
|
106
|
+
WHERE type='table' AND name IN ('dev_package_example', 'export_request', 'export_file', 'package_info')
|
|
102
107
|
`.execute(db)
|
|
103
108
|
|
|
104
|
-
if
|
|
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
|
+
}
|
|
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 &&
|
|
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
|
-
|
|
68
|
-
|
|
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="
|
|
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
|
|
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
|
|
158
|
-
<div className="
|
|
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
|
|
165
|
-
<div className="border-2 border-blue-400
|
|
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
|
|
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>
|
|
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>
|
|
172
|
+
<MenubarItem disabled>{name}</MenubarItem>
|
|
154
173
|
<MenubarSeparator />
|
|
155
174
|
<MenubarCheckboxItem
|
|
156
175
|
checked
|