@tscircuit/fake-snippets 0.0.76 → 0.0.78
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/dist/bundle.js +264 -166
- package/dist/index.d.ts +15 -15
- package/dist/index.js +7 -4
- package/dist/schema.d.ts +24 -24
- package/dist/schema.js +3 -3
- package/fake-snippets-api/lib/db/autoload-dev-packages.ts +8 -0
- package/fake-snippets-api/lib/db/schema.ts +3 -3
- package/fake-snippets-api/routes/api/packages/generate_from_jlcpcb.ts +111 -0
- package/package.json +1 -1
- package/src/App.tsx +0 -3
- package/src/components/CircuitJsonImportDialog.tsx +20 -3
- package/src/components/JLCPCBImportDialog.tsx +31 -27
- package/src/components/PackageBuildsPage/LogContent.tsx +25 -9
- package/src/components/PackageBuildsPage/PackageBuildDetailsPage.tsx +5 -5
- package/src/components/PackageBuildsPage/getColorForDisplayStatus.ts +2 -2
- package/src/components/PackageBuildsPage/package-build-details-panel.tsx +3 -4
- package/src/components/dialogs/rename-package-dialog.tsx +5 -0
- package/src/components/package-port/CodeEditor.tsx +28 -16
- package/src/hooks/use-current-package-release.ts +6 -2
- package/src/hooks/use-package-release.ts +16 -3
- package/src/pages/latest.tsx +29 -87
- package/src/pages/beta.tsx +0 -367
package/src/pages/beta.tsx
DELETED
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
import { useCreatePackageFilesMutation } from "@/hooks/use-create-package-files-mutation"
|
|
2
|
-
import { useCreatePackageMutation } from "@/hooks/use-create-package-mutation"
|
|
3
|
-
import { useCreatePackageReleaseMutation } from "@/hooks/use-create-package-release-mutation"
|
|
4
|
-
import { useForkPackageMutation } from "@/hooks/use-fork-package-mutation"
|
|
5
|
-
import { usePackageById } from "@/hooks/use-package-by-package-id"
|
|
6
|
-
import { usePackageByName } from "@/hooks/use-package-by-package-name"
|
|
7
|
-
import { usePackageFile, usePackageFiles } from "@/hooks/use-package-files"
|
|
8
|
-
import {
|
|
9
|
-
useLatestPackageRelease,
|
|
10
|
-
usePackageRelease,
|
|
11
|
-
usePackageReleaseByNameAndVersion,
|
|
12
|
-
} from "@/hooks/use-package-release"
|
|
13
|
-
import { useEffect, useState } from "react"
|
|
14
|
-
import { useLocation } from "wouter"
|
|
15
|
-
|
|
16
|
-
export const BetaPage = () => {
|
|
17
|
-
// Get the current path and extract author/packageName
|
|
18
|
-
const [location] = useLocation()
|
|
19
|
-
const pathParts = location.split("/")
|
|
20
|
-
const author = pathParts[2]
|
|
21
|
-
const urlPackageName = pathParts[3]
|
|
22
|
-
const packageNameWithVersion =
|
|
23
|
-
author && urlPackageName ? `${author}/${urlPackageName}` : null
|
|
24
|
-
|
|
25
|
-
// States for package creation flow
|
|
26
|
-
const [createdPackageId, setCreatedPackageId] = useState<string | null>(null)
|
|
27
|
-
const [createdReleaseId, setCreatedReleaseId] = useState<string | null>(null)
|
|
28
|
-
const [createdFileId, setCreatedFileId] = useState<string | null>(null)
|
|
29
|
-
const [forkedPackageId, setForkedPackageId] = useState<string | null>(null)
|
|
30
|
-
const [packageName, setPackageName] = useState("")
|
|
31
|
-
const [selectedFileId, setSelectedFileId] = useState<string | null>(null)
|
|
32
|
-
const [isLoading, setIsLoading] = useState(!!packageNameWithVersion)
|
|
33
|
-
|
|
34
|
-
// Load existing package if URL params are provided
|
|
35
|
-
const { data: existingPackage, isSuccess: packageLoaded } = usePackageByName(
|
|
36
|
-
packageNameWithVersion,
|
|
37
|
-
)
|
|
38
|
-
// Use the new hook instead of usePackageReleaseByNameAndVersion
|
|
39
|
-
const { data: existingRelease, isSuccess: releaseLoaded } =
|
|
40
|
-
useLatestPackageRelease(existingPackage?.package_id)
|
|
41
|
-
|
|
42
|
-
// Log for debugging
|
|
43
|
-
console.log("Location path:", location)
|
|
44
|
-
console.log("Author:", author, "Package:", urlPackageName)
|
|
45
|
-
console.log("Package name with version:", packageNameWithVersion)
|
|
46
|
-
console.log("Existing package:", existingPackage)
|
|
47
|
-
console.log("Existing release:", existingRelease)
|
|
48
|
-
|
|
49
|
-
// Set IDs from existing package when they're loaded
|
|
50
|
-
useEffect(() => {
|
|
51
|
-
if (existingPackage) {
|
|
52
|
-
console.log("Setting package ID:", existingPackage.package_id)
|
|
53
|
-
setCreatedPackageId(existingPackage.package_id)
|
|
54
|
-
setPackageName(existingPackage.name)
|
|
55
|
-
}
|
|
56
|
-
}, [existingPackage])
|
|
57
|
-
|
|
58
|
-
useEffect(() => {
|
|
59
|
-
if (existingRelease) {
|
|
60
|
-
console.log("Setting release ID:", existingRelease.package_release_id)
|
|
61
|
-
setCreatedReleaseId(existingRelease.package_release_id)
|
|
62
|
-
|
|
63
|
-
// Force refetch package files by setting a dummy state to trigger useEffect
|
|
64
|
-
setTimeout(() => {
|
|
65
|
-
console.log("Triggering files refetch...")
|
|
66
|
-
setIsLoading(false)
|
|
67
|
-
}, 500)
|
|
68
|
-
}
|
|
69
|
-
}, [existingRelease])
|
|
70
|
-
|
|
71
|
-
// Update loading state
|
|
72
|
-
useEffect(() => {
|
|
73
|
-
if (packageNameWithVersion) {
|
|
74
|
-
if (packageLoaded && releaseLoaded) {
|
|
75
|
-
setIsLoading(false)
|
|
76
|
-
}
|
|
77
|
-
} else {
|
|
78
|
-
setIsLoading(false)
|
|
79
|
-
}
|
|
80
|
-
}, [packageNameWithVersion, packageLoaded, releaseLoaded])
|
|
81
|
-
|
|
82
|
-
// Demo data
|
|
83
|
-
const demoData = {
|
|
84
|
-
package: {
|
|
85
|
-
name: packageName,
|
|
86
|
-
description: "Test package",
|
|
87
|
-
is_private: false,
|
|
88
|
-
},
|
|
89
|
-
release: {
|
|
90
|
-
version: "1.0.0",
|
|
91
|
-
is_latest: true,
|
|
92
|
-
},
|
|
93
|
-
files: [
|
|
94
|
-
{
|
|
95
|
-
file_path: "src/index.ts",
|
|
96
|
-
content_text: 'export const hello = () => console.log("Hello!");',
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
file_path: "src/utils.ts",
|
|
100
|
-
content_text: "export const add = (a: number, b: number) => a + b;",
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
file_path: "README.md",
|
|
104
|
-
content_text: "# Test Package\n\nA test package with multiple files.",
|
|
105
|
-
},
|
|
106
|
-
],
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Mutations and queries
|
|
110
|
-
const { mutate: createPackage, isLoading: isCreatingPackage } =
|
|
111
|
-
useCreatePackageMutation({
|
|
112
|
-
onSuccess: (pkg) => setCreatedPackageId(pkg.package_id),
|
|
113
|
-
})
|
|
114
|
-
const { mutate: createRelease, isLoading: isCreatingRelease } =
|
|
115
|
-
useCreatePackageReleaseMutation({
|
|
116
|
-
onSuccess: (release) => setCreatedReleaseId(release.package_release_id),
|
|
117
|
-
})
|
|
118
|
-
const { mutate: createFile, isLoading: isCreatingFile } =
|
|
119
|
-
useCreatePackageFilesMutation({
|
|
120
|
-
onSuccess: (file) => setCreatedFileId(file.package_file_id),
|
|
121
|
-
})
|
|
122
|
-
const { mutate: forkPackage, isLoading: isForking } = useForkPackageMutation({
|
|
123
|
-
onSuccess: (forkedPackage) => setForkedPackageId(forkedPackage.package_id),
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
// Package data
|
|
127
|
-
const { data: packageData } = usePackageById(createdPackageId)
|
|
128
|
-
|
|
129
|
-
// Package release data
|
|
130
|
-
const { data: releaseData } = useLatestPackageRelease(createdPackageId, null)
|
|
131
|
-
|
|
132
|
-
// All package files for the release
|
|
133
|
-
const { data: packageFiles, isLoading: filesLoading } =
|
|
134
|
-
usePackageFiles(createdReleaseId)
|
|
135
|
-
|
|
136
|
-
// Log the files data for debugging
|
|
137
|
-
console.log(
|
|
138
|
-
"Package files:",
|
|
139
|
-
packageFiles,
|
|
140
|
-
"createdReleaseId:",
|
|
141
|
-
createdReleaseId,
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
// Individual file data when selected
|
|
145
|
-
const { data: selectedFileData } = usePackageFile(
|
|
146
|
-
selectedFileId ? { package_file_id: selectedFileId } : null,
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
const { data: forkedPackageData } = usePackageById(forkedPackageId)
|
|
150
|
-
|
|
151
|
-
if (isLoading) {
|
|
152
|
-
return (
|
|
153
|
-
<div className="p-4">
|
|
154
|
-
<h2 className="text-lg font-semibold mb-4">Loading package data...</h2>
|
|
155
|
-
</div>
|
|
156
|
-
)
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
return (
|
|
160
|
-
<div className="p-4">
|
|
161
|
-
<h1 className="text-xl font-bold mb-4">
|
|
162
|
-
{packageNameWithVersion
|
|
163
|
-
? `Package: ${packageNameWithVersion}`
|
|
164
|
-
: "Package Management Demo"}
|
|
165
|
-
</h1>
|
|
166
|
-
{!packageNameWithVersion && (
|
|
167
|
-
<div className="mb-4">
|
|
168
|
-
<div className="flex items-center gap-2">
|
|
169
|
-
<input
|
|
170
|
-
type="text"
|
|
171
|
-
value={packageName}
|
|
172
|
-
onChange={(e) => setPackageName(e.target.value)}
|
|
173
|
-
placeholder="test-package"
|
|
174
|
-
className="flex-1 px-3 py-2 border rounded text-sm"
|
|
175
|
-
disabled={Boolean(createdPackageId)}
|
|
176
|
-
/>
|
|
177
|
-
</div>
|
|
178
|
-
</div>
|
|
179
|
-
)}
|
|
180
|
-
|
|
181
|
-
{/* Package creation UI only shown when not viewing an existing package */}
|
|
182
|
-
{!packageNameWithVersion && (
|
|
183
|
-
<div className="grid grid-cols-4 gap-4 mb-4">
|
|
184
|
-
{/* Package Creation */}
|
|
185
|
-
<div className="bg-white p-4 rounded-lg shadow">
|
|
186
|
-
<div className="flex items-center justify-between mb-2">
|
|
187
|
-
<h2 className="font-semibold">1. Create Package</h2>
|
|
188
|
-
<button
|
|
189
|
-
onClick={() => createPackage(demoData.package)}
|
|
190
|
-
disabled={
|
|
191
|
-
isCreatingPackage || Boolean(createdPackageId) || !packageName
|
|
192
|
-
}
|
|
193
|
-
className="bg-blue-500 text-white px-3 py-1 text-sm rounded hover:bg-blue-600 disabled:bg-blue-300"
|
|
194
|
-
>
|
|
195
|
-
{createdPackageId ? "✓" : "Create"}
|
|
196
|
-
</button>
|
|
197
|
-
</div>
|
|
198
|
-
{packageData && (
|
|
199
|
-
<pre className="text-xs bg-gray-50 p-2 rounded overflow-auto max-h-32">
|
|
200
|
-
{JSON.stringify(packageData, null, 2)}
|
|
201
|
-
</pre>
|
|
202
|
-
)}
|
|
203
|
-
</div>
|
|
204
|
-
|
|
205
|
-
{/* Release Creation */}
|
|
206
|
-
<div className="bg-white p-4 rounded-lg shadow">
|
|
207
|
-
<div className="flex items-center justify-between mb-2">
|
|
208
|
-
<h2 className="font-semibold">2. Create Release</h2>
|
|
209
|
-
<button
|
|
210
|
-
onClick={() =>
|
|
211
|
-
createdPackageId &&
|
|
212
|
-
createRelease({
|
|
213
|
-
package_id: createdPackageId,
|
|
214
|
-
...demoData.release,
|
|
215
|
-
})
|
|
216
|
-
}
|
|
217
|
-
disabled={!createdPackageId || Boolean(createdReleaseId)}
|
|
218
|
-
className="bg-blue-500 text-white px-3 py-1 text-sm rounded hover:bg-blue-600 disabled:bg-blue-300"
|
|
219
|
-
>
|
|
220
|
-
{createdReleaseId ? "✓" : "Create"}
|
|
221
|
-
</button>
|
|
222
|
-
</div>
|
|
223
|
-
{releaseData && (
|
|
224
|
-
<pre className="text-xs bg-gray-50 p-2 rounded overflow-auto max-h-32">
|
|
225
|
-
{JSON.stringify(releaseData, null, 2)}
|
|
226
|
-
</pre>
|
|
227
|
-
)}
|
|
228
|
-
</div>
|
|
229
|
-
|
|
230
|
-
{/* File Creation */}
|
|
231
|
-
<div className="bg-white p-4 rounded-lg shadow">
|
|
232
|
-
<div className="flex items-center justify-between mb-2">
|
|
233
|
-
<h2 className="font-semibold">3. Create Files</h2>
|
|
234
|
-
<button
|
|
235
|
-
onClick={() =>
|
|
236
|
-
createdReleaseId &&
|
|
237
|
-
Promise.all(
|
|
238
|
-
demoData.files.map((file) =>
|
|
239
|
-
createFile({
|
|
240
|
-
package_release_id: createdReleaseId,
|
|
241
|
-
...file,
|
|
242
|
-
}),
|
|
243
|
-
),
|
|
244
|
-
)
|
|
245
|
-
}
|
|
246
|
-
disabled={!createdReleaseId || Boolean(createdFileId)}
|
|
247
|
-
className="bg-blue-500 text-white px-3 py-1 text-sm rounded hover:bg-blue-600 disabled:bg-blue-300"
|
|
248
|
-
>
|
|
249
|
-
{createdFileId ? "✓" : "Create"}
|
|
250
|
-
</button>
|
|
251
|
-
</div>
|
|
252
|
-
</div>
|
|
253
|
-
|
|
254
|
-
{/* Fork Package */}
|
|
255
|
-
<div className="bg-white p-4 rounded-lg shadow">
|
|
256
|
-
<div className="flex items-center justify-between mb-2">
|
|
257
|
-
<h2 className="font-semibold">4. Fork Package</h2>
|
|
258
|
-
<button
|
|
259
|
-
onClick={() =>
|
|
260
|
-
createdPackageId && forkPackage(createdPackageId)
|
|
261
|
-
}
|
|
262
|
-
disabled={!createdPackageId || isForking}
|
|
263
|
-
className="bg-green-500 text-white px-3 py-1 text-sm rounded hover:bg-green-600 disabled:bg-green-300"
|
|
264
|
-
>
|
|
265
|
-
{forkedPackageId ? "✓" : "Fork"}
|
|
266
|
-
</button>
|
|
267
|
-
</div>
|
|
268
|
-
{forkedPackageData && (
|
|
269
|
-
<pre className="text-xs bg-gray-50 p-2 rounded overflow-auto max-h-32">
|
|
270
|
-
{JSON.stringify(forkedPackageData, null, 2)}
|
|
271
|
-
</pre>
|
|
272
|
-
)}
|
|
273
|
-
</div>
|
|
274
|
-
</div>
|
|
275
|
-
)}
|
|
276
|
-
|
|
277
|
-
{/* Package info section shown when viewing an existing package */}
|
|
278
|
-
{packageNameWithVersion && packageData && (
|
|
279
|
-
<div className="bg-white p-4 rounded-lg shadow mb-4">
|
|
280
|
-
<h2 className="font-semibold mb-3">Package Information</h2>
|
|
281
|
-
<div className="grid grid-cols-2 gap-4">
|
|
282
|
-
<div>
|
|
283
|
-
<div className="text-sm font-medium mb-1">ID:</div>
|
|
284
|
-
<div className="text-sm text-gray-700">
|
|
285
|
-
{packageData.package_id}
|
|
286
|
-
</div>
|
|
287
|
-
</div>
|
|
288
|
-
<div>
|
|
289
|
-
<div className="text-sm font-medium mb-1">Name:</div>
|
|
290
|
-
<div className="text-sm text-gray-700">{packageData.name}</div>
|
|
291
|
-
</div>
|
|
292
|
-
<div>
|
|
293
|
-
<div className="text-sm font-medium mb-1">Description:</div>
|
|
294
|
-
<div className="text-sm text-gray-700">
|
|
295
|
-
{packageData.description || "No description"}
|
|
296
|
-
</div>
|
|
297
|
-
</div>
|
|
298
|
-
<div>
|
|
299
|
-
<div className="text-sm font-medium mb-1">Visibility:</div>
|
|
300
|
-
<div className="text-sm text-gray-700">
|
|
301
|
-
{packageData.is_private ? "Private" : "Public"}
|
|
302
|
-
</div>
|
|
303
|
-
</div>
|
|
304
|
-
</div>
|
|
305
|
-
</div>
|
|
306
|
-
)}
|
|
307
|
-
|
|
308
|
-
{/* Second row: package data exploration */}
|
|
309
|
-
<div className="grid grid-cols-2 gap-6">
|
|
310
|
-
{/* Package Files List */}
|
|
311
|
-
<div className="bg-white p-4 rounded-lg shadow">
|
|
312
|
-
<h2 className="font-semibold mb-3">Package Files</h2>
|
|
313
|
-
<div className="text-xs text-gray-600 mb-2">
|
|
314
|
-
Release ID: {createdReleaseId || "None"}
|
|
315
|
-
</div>
|
|
316
|
-
{filesLoading ? (
|
|
317
|
-
<div className="text-sm text-gray-500">Loading files...</div>
|
|
318
|
-
) : packageFiles && packageFiles.length > 0 ? (
|
|
319
|
-
<div className="divide-y">
|
|
320
|
-
{packageFiles.map((file) => (
|
|
321
|
-
<button
|
|
322
|
-
key={file.package_file_id}
|
|
323
|
-
onClick={() => setSelectedFileId(file.package_file_id)}
|
|
324
|
-
className={`text-left w-full py-2 px-1 text-sm hover:bg-gray-50 ${
|
|
325
|
-
selectedFileId === file.package_file_id ? "bg-blue-50" : ""
|
|
326
|
-
}`}
|
|
327
|
-
>
|
|
328
|
-
{file.file_path}
|
|
329
|
-
</button>
|
|
330
|
-
))}
|
|
331
|
-
</div>
|
|
332
|
-
) : (
|
|
333
|
-
<div className="text-sm text-gray-500">
|
|
334
|
-
{createdReleaseId
|
|
335
|
-
? "No files found. Files array length: " +
|
|
336
|
-
(packageFiles ? packageFiles.length : "undefined")
|
|
337
|
-
: "Create a release and files first"}
|
|
338
|
-
</div>
|
|
339
|
-
)}
|
|
340
|
-
</div>
|
|
341
|
-
|
|
342
|
-
{/* Selected File Content */}
|
|
343
|
-
<div className="bg-white p-4 rounded-lg shadow">
|
|
344
|
-
<h2 className="font-semibold mb-3">File Content</h2>
|
|
345
|
-
{selectedFileData ? (
|
|
346
|
-
<div>
|
|
347
|
-
<div className="text-xs text-gray-500 mb-2">
|
|
348
|
-
{selectedFileData.file_path}
|
|
349
|
-
</div>
|
|
350
|
-
<pre className="text-xs bg-gray-50 p-3 rounded overflow-auto border max-h-80">
|
|
351
|
-
{selectedFileData.content_text}
|
|
352
|
-
</pre>
|
|
353
|
-
</div>
|
|
354
|
-
) : (
|
|
355
|
-
<div className="text-sm text-gray-500">
|
|
356
|
-
{packageFiles && packageFiles.length > 0
|
|
357
|
-
? "Select a file to view its content"
|
|
358
|
-
: "Create files first"}
|
|
359
|
-
</div>
|
|
360
|
-
)}
|
|
361
|
-
</div>
|
|
362
|
-
</div>
|
|
363
|
-
</div>
|
|
364
|
-
)
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
export default BetaPage
|