@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/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,
@@ -104,6 +104,6 @@ export default withRouteSpec({
104
104
 
105
105
  return ctx.json({
106
106
  ok: true,
107
- package_release: publicMapPackageRelease(newPackageRelease),
107
+ package_release: publicMapPackageRelease(newPackageRelease, { db: ctx.db }),
108
108
  })
109
109
  })
@@ -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
  })
@@ -78,6 +78,7 @@ export default withRouteSpec({
78
78
  package_releases: releases.map((pr) =>
79
79
  publicMapPackageRelease(pr, {
80
80
  include_ai_review: req.commonParams?.include_ai_review,
81
+ db: ctx.db,
81
82
  }),
82
83
  ),
83
84
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tscircuit/fake-snippets",
3
- "version": "0.0.85",
3
+ "version": "0.0.86",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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 key={pkg.package_id} className="p-2 hover:bg-gray-50">
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("/package_releases/update", {
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
  {