@tscircuit/fake-snippets 0.0.85 → 0.0.86
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/bun-tests/fake-snippets-api/routes/ai_reviews/create.test.ts +11 -2
- package/bun-tests/fake-snippets-api/routes/package_releases/get.test.ts +25 -0
- package/dist/bundle.js +45 -7
- package/dist/index.d.ts +5 -0
- package/dist/index.js +1 -0
- package/dist/schema.d.ts +8 -0
- package/dist/schema.js +1 -0
- package/fake-snippets-api/lib/db/schema.ts +1 -0
- package/fake-snippets-api/lib/public-mapping/public-map-package-release.ts +23 -0
- package/fake-snippets-api/routes/api/ai_reviews/create.ts +20 -0
- package/fake-snippets-api/routes/api/package_releases/create.ts +1 -1
- package/fake-snippets-api/routes/api/package_releases/get.ts +4 -0
- package/fake-snippets-api/routes/api/package_releases/list.ts +1 -0
- package/package.json +1 -1
- package/src/components/SearchComponent.tsx +47 -2
- package/src/hooks/use-request-ai-review-mutation.ts +7 -6
package/dist/index.d.ts
CHANGED
|
@@ -386,6 +386,7 @@ declare const orderQuoteSchema: z.ZodObject<{
|
|
|
386
386
|
type OrderQuote = z.infer<typeof orderQuoteSchema>;
|
|
387
387
|
declare const aiReviewSchema: z.ZodObject<{
|
|
388
388
|
ai_review_id: z.ZodString;
|
|
389
|
+
package_release_id: z.ZodOptional<z.ZodString>;
|
|
389
390
|
ai_review_text: z.ZodNullable<z.ZodString>;
|
|
390
391
|
start_processing_at: z.ZodNullable<z.ZodString>;
|
|
391
392
|
finished_processing_at: z.ZodNullable<z.ZodString>;
|
|
@@ -399,6 +400,7 @@ declare const aiReviewSchema: z.ZodObject<{
|
|
|
399
400
|
start_processing_at: string | null;
|
|
400
401
|
finished_processing_at: string | null;
|
|
401
402
|
display_status: "pending" | "completed" | "failed";
|
|
403
|
+
package_release_id?: string | undefined;
|
|
402
404
|
processing_error?: any;
|
|
403
405
|
}, {
|
|
404
406
|
created_at: string;
|
|
@@ -407,6 +409,7 @@ declare const aiReviewSchema: z.ZodObject<{
|
|
|
407
409
|
start_processing_at: string | null;
|
|
408
410
|
finished_processing_at: string | null;
|
|
409
411
|
display_status: "pending" | "completed" | "failed";
|
|
412
|
+
package_release_id?: string | undefined;
|
|
410
413
|
processing_error?: any;
|
|
411
414
|
}>;
|
|
412
415
|
type AiReview = z.infer<typeof aiReviewSchema>;
|
|
@@ -1051,6 +1054,7 @@ declare const createDatabase: ({ seed }?: {
|
|
|
1051
1054
|
start_processing_at: string | null;
|
|
1052
1055
|
finished_processing_at: string | null;
|
|
1053
1056
|
display_status: "pending" | "completed" | "failed";
|
|
1057
|
+
package_release_id?: string | undefined;
|
|
1054
1058
|
processing_error?: any;
|
|
1055
1059
|
}[];
|
|
1056
1060
|
datasheets: {
|
|
@@ -1397,6 +1401,7 @@ declare const createDatabase: ({ seed }?: {
|
|
|
1397
1401
|
start_processing_at: string | null;
|
|
1398
1402
|
finished_processing_at: string | null;
|
|
1399
1403
|
display_status: "pending" | "completed" | "failed";
|
|
1404
|
+
package_release_id?: string | undefined;
|
|
1400
1405
|
processing_error?: any;
|
|
1401
1406
|
}[];
|
|
1402
1407
|
datasheets: {
|
package/dist/index.js
CHANGED
|
@@ -122,6 +122,7 @@ var orderQuoteSchema = z.object({
|
|
|
122
122
|
});
|
|
123
123
|
var aiReviewSchema = z.object({
|
|
124
124
|
ai_review_id: z.string().uuid(),
|
|
125
|
+
package_release_id: z.string().optional(),
|
|
125
126
|
ai_review_text: z.string().nullable(),
|
|
126
127
|
start_processing_at: z.string().datetime().nullable(),
|
|
127
128
|
finished_processing_at: z.string().datetime().nullable(),
|
package/dist/schema.d.ts
CHANGED
|
@@ -491,6 +491,7 @@ declare const orderQuoteSchema: z.ZodObject<{
|
|
|
491
491
|
type OrderQuote = z.infer<typeof orderQuoteSchema>;
|
|
492
492
|
declare const aiReviewSchema: z.ZodObject<{
|
|
493
493
|
ai_review_id: z.ZodString;
|
|
494
|
+
package_release_id: z.ZodOptional<z.ZodString>;
|
|
494
495
|
ai_review_text: z.ZodNullable<z.ZodString>;
|
|
495
496
|
start_processing_at: z.ZodNullable<z.ZodString>;
|
|
496
497
|
finished_processing_at: z.ZodNullable<z.ZodString>;
|
|
@@ -504,6 +505,7 @@ declare const aiReviewSchema: z.ZodObject<{
|
|
|
504
505
|
start_processing_at: string | null;
|
|
505
506
|
finished_processing_at: string | null;
|
|
506
507
|
display_status: "pending" | "completed" | "failed";
|
|
508
|
+
package_release_id?: string | undefined;
|
|
507
509
|
processing_error?: any;
|
|
508
510
|
}, {
|
|
509
511
|
created_at: string;
|
|
@@ -512,6 +514,7 @@ declare const aiReviewSchema: z.ZodObject<{
|
|
|
512
514
|
start_processing_at: string | null;
|
|
513
515
|
finished_processing_at: string | null;
|
|
514
516
|
display_status: "pending" | "completed" | "failed";
|
|
517
|
+
package_release_id?: string | undefined;
|
|
515
518
|
processing_error?: any;
|
|
516
519
|
}>;
|
|
517
520
|
type AiReview = z.infer<typeof aiReviewSchema>;
|
|
@@ -1684,6 +1687,7 @@ declare const databaseSchema: z.ZodObject<{
|
|
|
1684
1687
|
}>, "many">>;
|
|
1685
1688
|
aiReviews: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
1686
1689
|
ai_review_id: z.ZodString;
|
|
1690
|
+
package_release_id: z.ZodOptional<z.ZodString>;
|
|
1687
1691
|
ai_review_text: z.ZodNullable<z.ZodString>;
|
|
1688
1692
|
start_processing_at: z.ZodNullable<z.ZodString>;
|
|
1689
1693
|
finished_processing_at: z.ZodNullable<z.ZodString>;
|
|
@@ -1697,6 +1701,7 @@ declare const databaseSchema: z.ZodObject<{
|
|
|
1697
1701
|
start_processing_at: string | null;
|
|
1698
1702
|
finished_processing_at: string | null;
|
|
1699
1703
|
display_status: "pending" | "completed" | "failed";
|
|
1704
|
+
package_release_id?: string | undefined;
|
|
1700
1705
|
processing_error?: any;
|
|
1701
1706
|
}, {
|
|
1702
1707
|
created_at: string;
|
|
@@ -1705,6 +1710,7 @@ declare const databaseSchema: z.ZodObject<{
|
|
|
1705
1710
|
start_processing_at: string | null;
|
|
1706
1711
|
finished_processing_at: string | null;
|
|
1707
1712
|
display_status: "pending" | "completed" | "failed";
|
|
1713
|
+
package_release_id?: string | undefined;
|
|
1708
1714
|
processing_error?: any;
|
|
1709
1715
|
}>, "many">>;
|
|
1710
1716
|
datasheets: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
@@ -1996,6 +2002,7 @@ declare const databaseSchema: z.ZodObject<{
|
|
|
1996
2002
|
start_processing_at: string | null;
|
|
1997
2003
|
finished_processing_at: string | null;
|
|
1998
2004
|
display_status: "pending" | "completed" | "failed";
|
|
2005
|
+
package_release_id?: string | undefined;
|
|
1999
2006
|
processing_error?: any;
|
|
2000
2007
|
}[];
|
|
2001
2008
|
datasheets: {
|
|
@@ -2255,6 +2262,7 @@ declare const databaseSchema: z.ZodObject<{
|
|
|
2255
2262
|
start_processing_at: string | null;
|
|
2256
2263
|
finished_processing_at: string | null;
|
|
2257
2264
|
display_status: "pending" | "completed" | "failed";
|
|
2265
|
+
package_release_id?: string | undefined;
|
|
2258
2266
|
processing_error?: any;
|
|
2259
2267
|
}[] | undefined;
|
|
2260
2268
|
datasheets?: {
|
package/dist/schema.js
CHANGED
|
@@ -117,6 +117,7 @@ var orderQuoteSchema = z.object({
|
|
|
117
117
|
});
|
|
118
118
|
var aiReviewSchema = z.object({
|
|
119
119
|
ai_review_id: z.string().uuid(),
|
|
120
|
+
package_release_id: z.string().optional(),
|
|
120
121
|
ai_review_text: z.string().nullable(),
|
|
121
122
|
start_processing_at: z.string().datetime().nullable(),
|
|
122
123
|
finished_processing_at: z.string().datetime().nullable(),
|
|
@@ -140,6 +140,7 @@ export type OrderQuote = z.infer<typeof orderQuoteSchema>
|
|
|
140
140
|
|
|
141
141
|
export const aiReviewSchema = z.object({
|
|
142
142
|
ai_review_id: z.string().uuid(),
|
|
143
|
+
package_release_id: z.string().optional(),
|
|
143
144
|
ai_review_text: z.string().nullable(),
|
|
144
145
|
start_processing_at: z.string().datetime().nullable(),
|
|
145
146
|
finished_processing_at: z.string().datetime().nullable(),
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import * as ZT from "fake-snippets-api/lib/db/schema"
|
|
2
|
+
import type { DbClient } from "fake-snippets-api/lib/db/db-client"
|
|
2
3
|
|
|
3
4
|
export const publicMapPackageRelease = (
|
|
4
5
|
internal_package_release: ZT.PackageRelease,
|
|
5
6
|
options: {
|
|
6
7
|
include_logs?: boolean
|
|
7
8
|
include_ai_review?: boolean
|
|
9
|
+
db?: DbClient
|
|
8
10
|
} = {
|
|
9
11
|
include_logs: false,
|
|
10
12
|
include_ai_review: false,
|
|
@@ -24,6 +26,27 @@ export const publicMapPackageRelease = (
|
|
|
24
26
|
: [],
|
|
25
27
|
}
|
|
26
28
|
|
|
29
|
+
if (options.include_ai_review && options.db) {
|
|
30
|
+
const reviews = options.db
|
|
31
|
+
.listAiReviews()
|
|
32
|
+
.filter(
|
|
33
|
+
(r) =>
|
|
34
|
+
r.package_release_id === internal_package_release.package_release_id,
|
|
35
|
+
)
|
|
36
|
+
.sort(
|
|
37
|
+
(a, b) =>
|
|
38
|
+
new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
if (reviews.length > 0) {
|
|
42
|
+
const latest = reviews[0]
|
|
43
|
+
result.ai_review_text = latest.ai_review_text ?? null
|
|
44
|
+
result.ai_review_started_at = latest.start_processing_at ?? null
|
|
45
|
+
result.ai_review_completed_at = latest.finished_processing_at ?? null
|
|
46
|
+
result.ai_review_error = latest.processing_error ?? null
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
27
50
|
// Only include AI review fields when include_ai_review is true
|
|
28
51
|
if (!options.include_ai_review) {
|
|
29
52
|
delete result.ai_review_text
|
|
@@ -5,11 +5,31 @@ import { aiReviewSchema } from "fake-snippets-api/lib/db/schema"
|
|
|
5
5
|
export default withRouteSpec({
|
|
6
6
|
methods: ["POST"],
|
|
7
7
|
auth: "session",
|
|
8
|
+
queryParams: z.object({
|
|
9
|
+
package_release_id: z.string().optional(),
|
|
10
|
+
}),
|
|
8
11
|
jsonResponse: z.object({
|
|
9
12
|
ai_review: aiReviewSchema,
|
|
10
13
|
}),
|
|
11
14
|
})(async (req, ctx) => {
|
|
15
|
+
const { package_release_id } = req.query
|
|
16
|
+
|
|
17
|
+
if (package_release_id) {
|
|
18
|
+
const release = ctx.db.getPackageReleaseById(package_release_id)
|
|
19
|
+
if (!release) {
|
|
20
|
+
return ctx.error(404, {
|
|
21
|
+
error_code: "package_release_not_found",
|
|
22
|
+
message: "Package release not found",
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
ctx.db.updatePackageRelease({
|
|
26
|
+
...release,
|
|
27
|
+
ai_review_requested: true,
|
|
28
|
+
})
|
|
29
|
+
}
|
|
30
|
+
|
|
12
31
|
const ai_review = ctx.db.addAiReview({
|
|
32
|
+
package_release_id: package_release_id,
|
|
13
33
|
ai_review_text: null,
|
|
14
34
|
start_processing_at: null,
|
|
15
35
|
finished_processing_at: null,
|
|
@@ -61,6 +61,7 @@ export default withRouteSpec({
|
|
|
61
61
|
ok: true,
|
|
62
62
|
package_release: publicMapPackageRelease(packageReleases[0], {
|
|
63
63
|
include_ai_review: req.commonParams?.include_ai_review,
|
|
64
|
+
db: ctx.db,
|
|
64
65
|
}),
|
|
65
66
|
})
|
|
66
67
|
}
|
|
@@ -87,6 +88,7 @@ export default withRouteSpec({
|
|
|
87
88
|
ok: true,
|
|
88
89
|
package_release: publicMapPackageRelease(packageReleases[0], {
|
|
89
90
|
include_ai_review: req.commonParams?.include_ai_review,
|
|
91
|
+
db: ctx.db,
|
|
90
92
|
}),
|
|
91
93
|
})
|
|
92
94
|
}
|
|
@@ -109,6 +111,7 @@ export default withRouteSpec({
|
|
|
109
111
|
ok: true,
|
|
110
112
|
package_release: publicMapPackageRelease(pkgRelease, {
|
|
111
113
|
include_ai_review: req.commonParams?.include_ai_review,
|
|
114
|
+
db: ctx.db,
|
|
112
115
|
}),
|
|
113
116
|
})
|
|
114
117
|
}
|
|
@@ -128,6 +131,7 @@ export default withRouteSpec({
|
|
|
128
131
|
package_release: publicMapPackageRelease(foundRelease, {
|
|
129
132
|
include_logs: req.commonParams?.include_logs,
|
|
130
133
|
include_ai_review: req.commonParams?.include_ai_review,
|
|
134
|
+
db: ctx.db,
|
|
131
135
|
}),
|
|
132
136
|
})
|
|
133
137
|
})
|
package/package.json
CHANGED
|
@@ -7,6 +7,7 @@ import { Alert } from "./ui/alert"
|
|
|
7
7
|
import { useSnippetsBaseApiUrl } from "@/hooks/use-snippets-base-api-url"
|
|
8
8
|
import { PrefetchPageLink } from "./PrefetchPageLink"
|
|
9
9
|
import { CircuitBoard } from "lucide-react"
|
|
10
|
+
import { cn } from "@/lib/utils"
|
|
10
11
|
|
|
11
12
|
interface SearchComponentProps {
|
|
12
13
|
onResultsFetched?: (results: any[]) => void
|
|
@@ -51,6 +52,7 @@ const SearchComponent: React.FC<SearchComponentProps> = ({
|
|
|
51
52
|
}) => {
|
|
52
53
|
const [searchQuery, setSearchQuery] = useState("")
|
|
53
54
|
const [showResults, setShowResults] = useState(false)
|
|
55
|
+
const [highlightedIndex, setHighlightedIndex] = useState(-1)
|
|
54
56
|
const axios = useAxios()
|
|
55
57
|
const resultsRef = useRef<HTMLDivElement>(null)
|
|
56
58
|
const inputRef = useRef<HTMLInputElement>(null)
|
|
@@ -72,6 +74,10 @@ const SearchComponent: React.FC<SearchComponentProps> = ({
|
|
|
72
74
|
{ enabled: Boolean(searchQuery) },
|
|
73
75
|
)
|
|
74
76
|
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
setHighlightedIndex(-1)
|
|
79
|
+
}, [searchResults])
|
|
80
|
+
|
|
75
81
|
const handleSearch = (e: React.FormEvent) => {
|
|
76
82
|
e.preventDefault()
|
|
77
83
|
if (searchQuery.trim()) {
|
|
@@ -86,6 +92,13 @@ const SearchComponent: React.FC<SearchComponentProps> = ({
|
|
|
86
92
|
}
|
|
87
93
|
}, [])
|
|
88
94
|
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
if (highlightedIndex < 0) return
|
|
97
|
+
const items = resultsRef.current?.querySelectorAll("li")
|
|
98
|
+
const item = items?.[highlightedIndex] as HTMLElement | undefined
|
|
99
|
+
item?.scrollIntoView({ block: "nearest" })
|
|
100
|
+
}, [highlightedIndex])
|
|
101
|
+
|
|
89
102
|
useEffect(() => {
|
|
90
103
|
const handleClickOutside = (event: MouseEvent) => {
|
|
91
104
|
if (
|
|
@@ -133,6 +146,32 @@ const SearchComponent: React.FC<SearchComponentProps> = ({
|
|
|
133
146
|
onKeyDown={(e) => {
|
|
134
147
|
if (e.key === "Backspace" && !searchQuery && closeOnClick) {
|
|
135
148
|
closeOnClick()
|
|
149
|
+
return
|
|
150
|
+
}
|
|
151
|
+
if (!searchResults) return
|
|
152
|
+
if (e.key === "ArrowDown") {
|
|
153
|
+
e.preventDefault()
|
|
154
|
+
setShowResults(true)
|
|
155
|
+
setHighlightedIndex((prev) =>
|
|
156
|
+
Math.min(prev + 1, searchResults.length - 1),
|
|
157
|
+
)
|
|
158
|
+
} else if (e.key === "ArrowUp") {
|
|
159
|
+
e.preventDefault()
|
|
160
|
+
setHighlightedIndex((prev) => Math.max(prev - 1, 0))
|
|
161
|
+
} else if (e.key === "Enter" && highlightedIndex >= 0) {
|
|
162
|
+
e.preventDefault()
|
|
163
|
+
const pkg = searchResults[highlightedIndex]
|
|
164
|
+
if (pkg) {
|
|
165
|
+
const href = shouldOpenInEditor
|
|
166
|
+
? `/editor?package_id=${pkg.package_id}`
|
|
167
|
+
: `/${pkg.name}`
|
|
168
|
+
if (shouldOpenInNewTab) {
|
|
169
|
+
window.open(href, "_blank")
|
|
170
|
+
} else {
|
|
171
|
+
setLocation(href)
|
|
172
|
+
}
|
|
173
|
+
setShowResults(false)
|
|
174
|
+
}
|
|
136
175
|
}
|
|
137
176
|
}}
|
|
138
177
|
aria-label="Search packages"
|
|
@@ -154,8 +193,14 @@ const SearchComponent: React.FC<SearchComponentProps> = ({
|
|
|
154
193
|
>
|
|
155
194
|
{searchResults.length > 0 ? (
|
|
156
195
|
<ul className="divide-y divide-gray-200">
|
|
157
|
-
{searchResults.map((pkg: any) => (
|
|
158
|
-
<li
|
|
196
|
+
{searchResults.map((pkg: any, index: number) => (
|
|
197
|
+
<li
|
|
198
|
+
key={pkg.package_id}
|
|
199
|
+
className={cn(
|
|
200
|
+
"p-2 hover:bg-gray-50",
|
|
201
|
+
index === highlightedIndex && "bg-gray-100",
|
|
202
|
+
)}
|
|
203
|
+
>
|
|
159
204
|
<LinkWithNewTabHandling
|
|
160
205
|
href={
|
|
161
206
|
shouldOpenInEditor
|
|
@@ -12,13 +12,14 @@ export const useRequestAiReviewMutation = ({
|
|
|
12
12
|
|
|
13
13
|
return useMutation(
|
|
14
14
|
async ({ package_release_id }: { package_release_id: string }) => {
|
|
15
|
-
await axios.post("/
|
|
16
|
-
package_release_id,
|
|
17
|
-
ai_review_requested: true,
|
|
18
|
-
})
|
|
19
|
-
const { data } = await axios.post("/package_releases/get", {
|
|
20
|
-
package_release_id,
|
|
15
|
+
await axios.post("/ai_reviews/create", null, {
|
|
16
|
+
params: { package_release_id },
|
|
21
17
|
})
|
|
18
|
+
const { data } = await axios.post(
|
|
19
|
+
"/package_releases/get",
|
|
20
|
+
{ package_release_id },
|
|
21
|
+
{ params: { include_ai_review: true } },
|
|
22
|
+
)
|
|
22
23
|
return data.package_release as PackageRelease
|
|
23
24
|
},
|
|
24
25
|
{
|