@tscircuit/fake-snippets 0.0.4 → 0.0.6

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.
@@ -0,0 +1,131 @@
1
+ import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
2
+ import { expect, test } from "bun:test"
3
+
4
+ test("create package release", async () => {
5
+ const { axios } = await getTestServer()
6
+
7
+ // First create a package
8
+ const packageResponse = await axios.post(
9
+ "/api/packages/create",
10
+ {
11
+ name: "test-package",
12
+ description: "Test Description",
13
+ },
14
+ {
15
+ headers: {
16
+ Authorization: "Bearer 1234",
17
+ },
18
+ },
19
+ )
20
+ expect(packageResponse.status).toBe(200)
21
+ const createdPackage = packageResponse.data.package
22
+
23
+ // Create a package release
24
+ const releaseResponse = await axios.post("/api/package_releases/create", {
25
+ package_id: createdPackage.package_id,
26
+ version: "1.0.0",
27
+ is_latest: true,
28
+ })
29
+
30
+ expect(releaseResponse.status).toBe(200)
31
+ expect(releaseResponse.data.ok).toBe(true)
32
+ expect(releaseResponse.data.package_release).toBeDefined()
33
+ expect(releaseResponse.data.package_release.package_id).toBe(
34
+ createdPackage.package_id,
35
+ )
36
+ expect(releaseResponse.data.package_release.version).toBe("1.0.0")
37
+ expect(releaseResponse.data.package_release.is_latest).toBe(true)
38
+ expect(releaseResponse.data.package_release.is_locked).toBe(false)
39
+ })
40
+
41
+ test("create package release using package_name_with_version", async () => {
42
+ const { axios } = await getTestServer()
43
+
44
+ // First create a package
45
+ const packageResponse = await axios.post(
46
+ "/api/packages/create",
47
+ {
48
+ name: "test-package-2",
49
+ description: "Test Description",
50
+ },
51
+ {
52
+ headers: {
53
+ Authorization: "Bearer 1234",
54
+ },
55
+ },
56
+ )
57
+ expect(packageResponse.status).toBe(200)
58
+ const createdPackage = packageResponse.data.package
59
+
60
+ // Create a package release using package_name_with_version
61
+ const releaseResponse = await axios.post("/api/package_releases/create", {
62
+ package_name_with_version: `${createdPackage.name}@2.0.0`,
63
+ })
64
+
65
+ expect(releaseResponse.status).toBe(200)
66
+ expect(releaseResponse.data.ok).toBe(true)
67
+ expect(releaseResponse.data.package_release).toBeDefined()
68
+ expect(releaseResponse.data.package_release.package_id).toBe(
69
+ createdPackage.package_id,
70
+ )
71
+ expect(releaseResponse.data.package_release.version).toBe("2.0.0")
72
+ expect(releaseResponse.data.package_release.is_latest).toBe(true)
73
+ })
74
+
75
+ test("create package release - version already exists", async () => {
76
+ const { axios } = await getTestServer()
77
+
78
+ // First create a package
79
+ const packageResponse = await axios.post(
80
+ "/api/packages/create",
81
+ {
82
+ name: "test-package-3",
83
+ description: "Test Description",
84
+ },
85
+ {
86
+ headers: {
87
+ Authorization: "Bearer 1234",
88
+ },
89
+ },
90
+ )
91
+ expect(packageResponse.status).toBe(200)
92
+ const createdPackage = packageResponse.data.package
93
+
94
+ // Create first release
95
+ await axios.post("/api/package_releases/create", {
96
+ package_id: createdPackage.package_id,
97
+ version: "1.0.0",
98
+ })
99
+
100
+ // Try to create release with same version
101
+ try {
102
+ await axios.post("/api/package_releases/create", {
103
+ package_id: createdPackage.package_id,
104
+ version: "1.0.0",
105
+ })
106
+ throw new Error("Expected request to fail")
107
+ } catch (error: any) {
108
+ expect(error.status).toBe(400)
109
+ expect(error.data.error.error_code).toBe("version_already_exists")
110
+ expect(error.data.error.message).toBe(
111
+ "Version 1.0.0 already exists for this package",
112
+ )
113
+ }
114
+ })
115
+
116
+ test("create package release - package not found", async () => {
117
+ const { axios } = await getTestServer()
118
+
119
+ try {
120
+ await axios.post("/api/package_releases/create", {
121
+ package_name_with_version: "non-existent-package@1.0.0",
122
+ })
123
+ throw new Error("Expected request to fail")
124
+ } catch (error: any) {
125
+ expect(error.status).toBe(404)
126
+ expect(error.data.error.error_code).toBe("package_not_found")
127
+ expect(error.data.error.message).toBe(
128
+ "Package not found: non-existent-package",
129
+ )
130
+ }
131
+ })
@@ -0,0 +1,89 @@
1
+ import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
2
+ import { expect, test } from "bun:test"
3
+ import { packageReleaseSchema } from "fake-snippets-api/lib/db/schema"
4
+
5
+ test("POST /api/package_releases/get - should return package release by package_release_id", async () => {
6
+ const { axios } = await getTestServer()
7
+
8
+ // First create a package with valid name format
9
+ const packageResponse = await axios.post("/api/packages/create", {
10
+ name: "@test/package-1",
11
+ description: "A test package",
12
+ })
13
+ expect(packageResponse.status).toBe(200)
14
+ const createdPackage = packageResponse.data.package
15
+
16
+ // Create a package release
17
+ const releaseResponse = await axios.post("/api/package_releases/create", {
18
+ package_id: createdPackage.package_id,
19
+ version: "1.0.0",
20
+ is_latest: true,
21
+ })
22
+ expect(releaseResponse.status).toBe(200)
23
+ const createdRelease = releaseResponse.data.package_release
24
+
25
+ // Get the created package release
26
+ const getResponse = await axios.post("/api/package_releases/get", {
27
+ package_release_id: createdRelease.package_release_id,
28
+ })
29
+
30
+ expect(getResponse.status).toBe(200)
31
+ const responseBody = getResponse.data
32
+ expect(responseBody.ok).toBe(true)
33
+ expect(responseBody.package_release).toEqual(
34
+ packageReleaseSchema.parse(createdRelease),
35
+ )
36
+ })
37
+
38
+ test("POST /api/package_releases/get - should return 404 if package release not found", async () => {
39
+ const { axios } = await getTestServer()
40
+
41
+ try {
42
+ await axios.post("/api/package_releases/get", {
43
+ package_release_id: "123e4567-e89b-12d3-a456-426614174000", // valid UUID format
44
+ })
45
+ throw new Error("Expected request to fail")
46
+ } catch (error: any) {
47
+ expect(error.status).toBe(404)
48
+ expect(error.data.error.error_code).toBe("package_release_not_found")
49
+ expect(error.data.error.message).toBe("Package release not found")
50
+ }
51
+ })
52
+
53
+ test("POST /api/package_releases/get - should find release by package_name_with_version", async () => {
54
+ const { axios } = await getTestServer()
55
+
56
+ // First create a package with valid name format
57
+ const packageResponse = await axios.post("/api/packages/create", {
58
+ name: "@test/package-2",
59
+ description: "Another test package",
60
+ })
61
+ expect(packageResponse.status).toBe(200)
62
+ const createdPackage = packageResponse.data.package
63
+
64
+ // Create a package release
65
+ const version = "2.0.0"
66
+ const releaseResponse = await axios.post("/api/package_releases/create", {
67
+ package_name_with_version: `${createdPackage.name}@${version}`,
68
+ is_latest: true,
69
+ })
70
+ expect(releaseResponse.status).toBe(200)
71
+ const createdRelease = releaseResponse.data.package_release
72
+
73
+ const listResponse = await axios.post("/api/package_releases/list", {
74
+ package_name: createdPackage.name,
75
+ })
76
+ console.log(listResponse.data)
77
+
78
+ // Get the release using package_name_with_version
79
+ const getResponse = await axios.post("/api/package_releases/get", {
80
+ package_release_id: createdRelease.package_release_id,
81
+ })
82
+
83
+ expect(getResponse.status).toBe(200)
84
+ const responseBody = getResponse.data
85
+ expect(responseBody.ok).toBe(true)
86
+ expect(responseBody.package_release).toEqual(
87
+ packageReleaseSchema.parse(createdRelease),
88
+ )
89
+ })
@@ -0,0 +1,157 @@
1
+ import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
2
+ import { expect, test } from "bun:test"
3
+
4
+ test("list package releases", async () => {
5
+ const { axios, db } = await getTestServer()
6
+
7
+ // First create a test package
8
+ const packageResponse = await axios.post(
9
+ "/api/packages/create",
10
+ {
11
+ name: "test-package",
12
+ description: "Test Description",
13
+ },
14
+ {
15
+ headers: {
16
+ Authorization: "Bearer 1234",
17
+ },
18
+ },
19
+ )
20
+ const packageId = packageResponse.data.package.package_id
21
+
22
+ // Add some test package releases
23
+ const releases = [
24
+ {
25
+ package_id: packageId,
26
+ version: "1.0.0",
27
+ is_latest: false,
28
+ commit_sha: "abc123",
29
+ is_locked: false,
30
+ created_at: "2023-01-01T00:00:00Z",
31
+ },
32
+ {
33
+ package_id: packageId,
34
+ version: "1.1.0",
35
+ is_latest: false,
36
+ commit_sha: "def456",
37
+ is_locked: false,
38
+ created_at: "2023-01-02T00:00:00Z",
39
+ },
40
+ {
41
+ package_id: packageId,
42
+ version: "2.0.0",
43
+ is_latest: true,
44
+ commit_sha: "ghi789",
45
+ is_locked: false,
46
+ created_at: "2023-01-03T00:00:00Z",
47
+ },
48
+ ]
49
+
50
+ for (const release of releases) {
51
+ db.addPackageRelease(release as any)
52
+ }
53
+
54
+ // Test listing by package_id
55
+ const { data: packageIdData } = await axios.post(
56
+ "/api/package_releases/list",
57
+ {
58
+ package_id: packageId,
59
+ },
60
+ )
61
+ expect(packageIdData.ok).toBe(true)
62
+ expect(packageIdData.package_releases).toHaveLength(3)
63
+ expect(packageIdData.package_releases[0].package_id).toBe(packageId)
64
+
65
+ // Test listing by package_name
66
+ const { data: packageNameData } = await axios.post(
67
+ "/api/package_releases/list",
68
+ {
69
+ package_name: "test-package",
70
+ },
71
+ )
72
+ expect(packageNameData.ok).toBe(true)
73
+ expect(packageNameData.package_releases).toHaveLength(3)
74
+
75
+ // Test listing latest releases only
76
+ const { data: latestData } = await axios.post("/api/package_releases/list", {
77
+ package_id: packageId,
78
+ is_latest: true,
79
+ })
80
+ expect(latestData.ok).toBe(true)
81
+ expect(latestData.package_releases).toHaveLength(1)
82
+ expect(latestData.package_releases[0].version).toBe("2.0.0")
83
+ expect(latestData.package_releases[0].is_latest).toBe(true)
84
+
85
+ // Test listing by specific version
86
+ const { data: versionData } = await axios.post("/api/package_releases/list", {
87
+ package_id: packageId,
88
+ version: "1.0.0",
89
+ })
90
+ expect(versionData.ok).toBe(true)
91
+ expect(versionData.package_releases).toHaveLength(1)
92
+ expect(versionData.package_releases[0].version).toBe("1.0.0")
93
+
94
+ // Test listing by commit_sha
95
+ const { data: commitData } = await axios.post("/api/package_releases/list", {
96
+ package_id: packageId,
97
+ commit_sha: "abc123",
98
+ })
99
+ expect(commitData.ok).toBe(true)
100
+ expect(commitData.package_releases).toHaveLength(1)
101
+ expect(commitData.package_releases[0].commit_sha).toBe("abc123")
102
+ })
103
+
104
+ test("list package releases - validation errors", async () => {
105
+ const { axios } = await getTestServer()
106
+
107
+ // Test error when both package_id and package_name provided
108
+ try {
109
+ await axios.post("/api/package_releases/list", {
110
+ package_id: "some-id",
111
+ package_name: "some-name",
112
+ })
113
+ throw new Error("Expected request to fail")
114
+ } catch (error: any) {
115
+ expect(error.status).toBe(400)
116
+ expect(error.data.message).toContain(
117
+ "package_id and package_name are mutually exclusive",
118
+ )
119
+ }
120
+
121
+ // Test error when neither package_id nor package_name provided
122
+ try {
123
+ await axios.post("/api/package_releases/list", {
124
+ is_latest: true,
125
+ })
126
+ throw new Error("Expected request to fail")
127
+ } catch (error: any) {
128
+ expect(error.status).toBe(400)
129
+ expect(error.data.message).toContain(
130
+ "package_id or package_name is required",
131
+ )
132
+ }
133
+ })
134
+
135
+ test("list package releases - non-existent package", async () => {
136
+ const { axios } = await getTestServer()
137
+
138
+ // Test with non-existent package_name
139
+ const { data: nonExistentData } = await axios.post(
140
+ "/api/package_releases/list",
141
+ {
142
+ package_name: "non-existent-package",
143
+ },
144
+ )
145
+ expect(nonExistentData.ok).toBe(true)
146
+ expect(nonExistentData.package_releases).toHaveLength(0)
147
+
148
+ // Test with non-existent package_id
149
+ const { data: nonExistentIdData } = await axios.post(
150
+ "/api/package_releases/list",
151
+ {
152
+ package_id: "123e4567-e89b-12d3-a456-426614174000",
153
+ },
154
+ )
155
+ expect(nonExistentIdData.ok).toBe(true)
156
+ expect(nonExistentIdData.package_releases).toHaveLength(0)
157
+ })
@@ -0,0 +1,189 @@
1
+ import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
2
+ import { expect, test } from "bun:test"
3
+
4
+ test("update package release", async () => {
5
+ const { axios, db } = await getTestServer()
6
+
7
+ // First create a package
8
+ const packageResponse = await axios.post(
9
+ "/api/packages/create",
10
+ {
11
+ name: "test-package",
12
+ description: "Test Description",
13
+ },
14
+ {
15
+ headers: {
16
+ Authorization: "Bearer 1234",
17
+ },
18
+ },
19
+ )
20
+ const packageId = packageResponse.data.package.package_id
21
+
22
+ // Create a package release
23
+ const releaseResponse = await axios.post("/api/package_releases/create", {
24
+ package_id: packageId,
25
+ version: "1.0.0",
26
+ is_latest: true,
27
+ })
28
+ const release = releaseResponse.data.package_release
29
+
30
+ // Update the package release
31
+ const response = await axios.post("/api/package_releases/update", {
32
+ package_release_id: release.package_release_id,
33
+ is_locked: true,
34
+ license: "MIT",
35
+ })
36
+
37
+ expect(response.status).toBe(200)
38
+ expect(response.data.ok).toBe(true)
39
+
40
+ // Verify the release was updated
41
+ const updatedRelease = db.packageReleases.find(
42
+ (pr) => pr.package_release_id === release.package_release_id,
43
+ )
44
+ expect(updatedRelease?.is_locked).toBe(true)
45
+ expect(updatedRelease?.license).toBe("MIT")
46
+ })
47
+
48
+ test("update package release using package_name_with_version", async () => {
49
+ const { axios, db } = await getTestServer()
50
+
51
+ // First create a package
52
+ const packageResponse = await axios.post(
53
+ "/api/packages/create",
54
+ {
55
+ name: "test-package-2",
56
+ description: "Test Description",
57
+ },
58
+ {
59
+ headers: {
60
+ Authorization: "Bearer 1234",
61
+ },
62
+ },
63
+ )
64
+ const packageName = packageResponse.data.package.name
65
+ const version = "2.0.0"
66
+
67
+ // Create a package release
68
+ await axios.post("/api/package_releases/create", {
69
+ package_id: packageResponse.data.package.package_id,
70
+ version,
71
+ is_latest: true,
72
+ })
73
+
74
+ // Update using package_name_with_version
75
+ const response = await axios.post("/api/package_releases/update", {
76
+ package_name_with_version: `${packageName}@${version}`,
77
+ is_locked: true,
78
+ })
79
+
80
+ expect(response.status).toBe(200)
81
+ expect(response.data.ok).toBe(true)
82
+
83
+ // Verify the release was updated
84
+ const updatedRelease = db.packageReleases.find((pr) => pr.version === version)
85
+ expect(updatedRelease?.is_locked).toBe(true)
86
+ })
87
+
88
+ test("update package release - handle is_latest flag", async () => {
89
+ const { axios, db } = await getTestServer()
90
+
91
+ // Create a package
92
+ const packageResponse = await axios.post(
93
+ "/api/packages/create",
94
+ {
95
+ name: "test-package-3",
96
+ description: "Test Description",
97
+ },
98
+ {
99
+ headers: {
100
+ Authorization: "Bearer 1234",
101
+ },
102
+ },
103
+ )
104
+ const packageId = packageResponse.data.package.package_id
105
+
106
+ // Create two releases
107
+ const release1 = await axios.post("/api/package_releases/create", {
108
+ package_id: packageId,
109
+ version: "1.0.0",
110
+ is_latest: true,
111
+ })
112
+ const release2 = await axios.post("/api/package_releases/create", {
113
+ package_id: packageId,
114
+ version: "2.0.0",
115
+ is_latest: false,
116
+ })
117
+
118
+ // Update second release to be latest
119
+ await axios.post("/api/package_releases/update", {
120
+ package_release_id: release2.data.package_release.package_release_id,
121
+ is_latest: true,
122
+ })
123
+
124
+ // Verify first release is no longer latest
125
+ const firstRelease = db.packageReleases.find(
126
+ (pr) =>
127
+ pr.package_release_id ===
128
+ release1.data.package_release.package_release_id,
129
+ )
130
+ expect(firstRelease?.is_latest).toBe(false)
131
+
132
+ // Verify second release is now latest
133
+ const secondRelease = db.packageReleases.find(
134
+ (pr) =>
135
+ pr.package_release_id ===
136
+ release2.data.package_release.package_release_id,
137
+ )
138
+ expect(secondRelease?.is_latest).toBe(true)
139
+ })
140
+
141
+ test("update non-existent package release", async () => {
142
+ const { axios } = await getTestServer()
143
+
144
+ try {
145
+ await axios.post("/api/package_releases/update", {
146
+ package_release_id: "123e4567-e89b-12d3-a456-426614174000",
147
+ is_locked: true,
148
+ })
149
+ throw new Error("Expected request to fail")
150
+ } catch (error: any) {
151
+ expect(error.status).toBe(404)
152
+ expect(error.data.error.error_code).toBe("package_release_not_found")
153
+ expect(error.data.error.message).toBe("Package release not found")
154
+ }
155
+ })
156
+
157
+ test("update package release - no fields provided", async () => {
158
+ const { axios } = await getTestServer()
159
+
160
+ // Create a package and release first
161
+ const packageResponse = await axios.post(
162
+ "/api/packages/create",
163
+ {
164
+ name: "test-package-4",
165
+ description: "Test Description",
166
+ },
167
+ {
168
+ headers: {
169
+ Authorization: "Bearer 1234",
170
+ },
171
+ },
172
+ )
173
+ const releaseResponse = await axios.post("/api/package_releases/create", {
174
+ package_id: packageResponse.data.package.package_id,
175
+ version: "1.0.0",
176
+ })
177
+
178
+ try {
179
+ await axios.post("/api/package_releases/update", {
180
+ package_release_id:
181
+ releaseResponse.data.package_release.package_release_id,
182
+ })
183
+ throw new Error("Expected request to fail")
184
+ } catch (error: any) {
185
+ expect(error.status).toBe(400)
186
+ expect(error.data.error.error_code).toBe("no_fields_provided")
187
+ expect(error.data.error.message).toBe("No fields provided to update")
188
+ }
189
+ })
package/bun.lock CHANGED
@@ -61,6 +61,7 @@
61
61
  "circuit-json-to-gerber": "^0.0.16",
62
62
  "circuit-json-to-pnp-csv": "^0.0.6",
63
63
  "circuit-json-to-readable-netlist": "^0.0.7",
64
+ "circuit-json-to-tscircuit": "^0.0.4",
64
65
  "class-variance-authority": "^0.7.0",
65
66
  "clsx": "^2.1.1",
66
67
  "cmdk": "^1.0.4",
@@ -115,6 +116,7 @@
115
116
  "@types/babel__standalone": "^7.1.7",
116
117
  "@types/bun": "^1.1.10",
117
118
  "@types/country-list": "^2.1.4",
119
+ "@types/node": "^22.13.0",
118
120
  "@types/prismjs": "^1.26.4",
119
121
  "@types/react": "^18.3.9",
120
122
  "@types/react-dom": "^18.3.0",
@@ -805,7 +807,7 @@
805
807
 
806
808
  "@types/ms": ["@types/ms@0.7.34", "", {}, "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="],
807
809
 
808
- "@types/node": ["@types/node@18.19.54", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-+BRgt0G5gYjTvdLac9sIeE0iZcJxi4Jc4PV5EUzqi+88jmQLr+fRZdv2tCTV7IHKSGxM6SaLoOXQWWUiLUItMw=="],
810
+ "@types/node": ["@types/node@22.13.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA=="],
809
811
 
810
812
  "@types/node-fetch": ["@types/node-fetch@2.6.11", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g=="],
811
813
 
@@ -1041,6 +1043,8 @@
1041
1043
 
1042
1044
  "circuit-json-to-readable-netlist": ["circuit-json-to-readable-netlist@0.0.7", "", { "dependencies": { "@tscircuit/core": "^0.0.286", "@tscircuit/soup-util": "^0.0.41", "circuit-json-to-connectivity-map": "^0.0.17" }, "peerDependencies": { "typescript": "^5.7.2" } }, "sha512-GvlVMzEzLpB9WTsLkN4p5aHITjKhfEOQKFjZaUNQrd3FbyFbUXnx1e8vR1cB2M0fQXwaUQ0cxGTjK3W2AihKng=="],
1043
1045
 
1046
+ "circuit-json-to-tscircuit": ["circuit-json-to-tscircuit@0.0.4", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-LpHbOwdPE4+CooWPAPoKXWs4vxTrjJgu/avnxE3AqGwCD9r0ZnT73mEAB9oQi6T1i7T53zdkSR6y+zpsyCSE7g=="],
1047
+
1044
1048
  "circuit-to-svg": ["circuit-to-svg@0.0.101", "", { "dependencies": { "@tscircuit/footprinter": "^0.0.91", "@tscircuit/routing": "^1.3.5", "@tscircuit/soup-util": "^0.0.41", "@types/node": "^22.5.5", "bun-types": "^1.1.40", "svgson": "^5.3.1", "transformation-matrix": "^2.16.1" }, "peerDependencies": { "circuit-json": "*", "schematic-symbols": "*" } }, "sha512-AwTD5Ww5ujzK5pEkrVDFtFx5nfGqVbtbIHgXNEeji5RKfDpb0WzeXtaw75kkHl715JB1WBwUupewKO7mTaI06A=="],
1045
1049
 
1046
1050
  "class-variance-authority": ["class-variance-authority@0.7.0", "", { "dependencies": { "clsx": "2.0.0" } }, "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A=="],
@@ -2301,7 +2305,7 @@
2301
2305
 
2302
2306
  "uint8array-extras": ["uint8array-extras@1.4.0", "", {}, "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ=="],
2303
2307
 
2304
- "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
2308
+ "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="],
2305
2309
 
2306
2310
  "unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="],
2307
2311
 
@@ -2407,6 +2411,8 @@
2407
2411
 
2408
2412
  "zustand-hoist": ["zustand-hoist@2.0.1", "", { "peerDependencies": { "zustand": ">=4.0.0" } }, "sha512-Lhvv3RlLQx1NSUtuhk8jegXe1Wyav9RAOnLd4CRs1SbB5qcFoarAGQTE43vIxXizrm1UQJl1q5uRbOZuXGXGpQ=="],
2409
2413
 
2414
+ "@anthropic-ai/sdk/@types/node": ["@types/node@18.19.54", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-+BRgt0G5gYjTvdLac9sIeE0iZcJxi4Jc4PV5EUzqi+88jmQLr+fRZdv2tCTV7IHKSGxM6SaLoOXQWWUiLUItMw=="],
2415
+
2410
2416
  "@babel/core/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="],
2411
2417
 
2412
2418
  "@babel/core/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
@@ -2817,6 +2823,8 @@
2817
2823
 
2818
2824
  "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
2819
2825
 
2826
+ "@anthropic-ai/sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
2827
+
2820
2828
  "@babel/helper-annotate-as-pure/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="],
2821
2829
 
2822
2830
  "@babel/helper-annotate-as-pure/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="],
@@ -3097,12 +3105,16 @@
3097
3105
 
3098
3106
  "@types/serve-static/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="],
3099
3107
 
3108
+ "@types/ws/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
3109
+
3100
3110
  "@vercel/nft/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
3101
3111
 
3102
3112
  "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
3103
3113
 
3104
3114
  "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
3105
3115
 
3116
+ "bun-types/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
3117
+
3106
3118
  "circuit-json-to-readable-netlist/@tscircuit/core/@tscircuit/footprinter": ["@tscircuit/footprinter@0.0.97", "", { "dependencies": { "@tscircuit/mm": "^0.0.8", "zod": "^3.23.8" }, "peerDependencies": { "circuit-json": "*" } }, "sha512-LeqjpXqPwR++kcshlfe0E3IOsv0Y9BVRjIllDaHFA2OM+gJ91z/SS3CdweXB+qtF4t9G+8MLKf4nU5L1HDGjmg=="],
3107
3119
 
3108
3120
  "circuit-json-to-readable-netlist/@tscircuit/core/@tscircuit/math-utils": ["@tscircuit/math-utils@0.0.9", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-sPzfXndijet8z29X6f5vnSZddiso2tRg7m6rB+268bVj60mxnxUMD14rKuMlLn6n84fMOpD/X7pRTZUfi6M+Tg=="],
@@ -3463,6 +3475,8 @@
3463
3475
 
3464
3476
  "@vercel/nft/glob/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
3465
3477
 
3478
+ "circuit-to-svg/bun-types/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
3479
+
3466
3480
  "glob-promise/glob/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
3467
3481
 
3468
3482
  "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],