@tscircuit/fake-snippets 0.0.121 → 0.0.122

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.
Files changed (737) hide show
  1. package/dist/bundle.js +9287 -0
  2. package/dist/index.d.ts +2190 -0
  3. package/dist/index.js +3826 -0
  4. package/dist/schema.d.ts +3142 -0
  5. package/{fake-snippets-api/lib/db/schema.ts → dist/schema.js} +147 -195
  6. package/package.json +4 -1
  7. package/.github/CODEOWNERS +0 -1
  8. package/.github/workflows/bun-formatcheck.yml +0 -26
  9. package/.github/workflows/bun-pver-release.yml +0 -53
  10. package/.github/workflows/bun-test.yml +0 -28
  11. package/.github/workflows/bun-typecheck.yml +0 -26
  12. package/.github/workflows/bundle-size-analysis.yml +0 -79
  13. package/.github/workflows/stale.yml +0 -40
  14. package/.github/workflows/update-package.yml +0 -58
  15. package/.github/workflows/update-snapshots.yml +0 -49
  16. package/CLAUDE.md +0 -92
  17. package/CONTRIBUTING.md +0 -59
  18. package/api/generated-index.js +0 -456
  19. package/biome.json +0 -67
  20. package/bun-tests/fake-snippets-api/fixtures/get-test-server.ts +0 -141
  21. package/bun-tests/fake-snippets-api/fixtures/preload.ts +0 -18
  22. package/bun-tests/fake-snippets-api/fixtures/start-server.ts +0 -48
  23. package/bun-tests/fake-snippets-api/routes/accounts/get.test.ts +0 -64
  24. package/bun-tests/fake-snippets-api/routes/accounts/get_account_balance.test.ts +0 -14
  25. package/bun-tests/fake-snippets-api/routes/ai_reviews/create.test.ts +0 -21
  26. package/bun-tests/fake-snippets-api/routes/ai_reviews/get.test.ts +0 -16
  27. package/bun-tests/fake-snippets-api/routes/ai_reviews/list.test.ts +0 -14
  28. package/bun-tests/fake-snippets-api/routes/ai_reviews/process_review.test.ts +0 -16
  29. package/bun-tests/fake-snippets-api/routes/bug_reports/create.test.ts +0 -37
  30. package/bun-tests/fake-snippets-api/routes/bug_reports/upload_file.test.ts +0 -89
  31. package/bun-tests/fake-snippets-api/routes/datasheets/create.test.ts +0 -16
  32. package/bun-tests/fake-snippets-api/routes/datasheets/get.test.ts +0 -54
  33. package/bun-tests/fake-snippets-api/routes/datasheets/list.test.ts +0 -49
  34. package/bun-tests/fake-snippets-api/routes/datasheets/process_all_datasheets.test.ts +0 -22
  35. package/bun-tests/fake-snippets-api/routes/datasheets/run_async_tasks.test.ts +0 -19
  36. package/bun-tests/fake-snippets-api/routes/health.test.ts +0 -9
  37. package/bun-tests/fake-snippets-api/routes/order_files/get.test.ts +0 -48
  38. package/bun-tests/fake-snippets-api/routes/order_files/upload.test.ts +0 -77
  39. package/bun-tests/fake-snippets-api/routes/order_quotes/create.test.ts +0 -33
  40. package/bun-tests/fake-snippets-api/routes/orders/create.test.ts +0 -17
  41. package/bun-tests/fake-snippets-api/routes/orders/get.test.ts +0 -199
  42. package/bun-tests/fake-snippets-api/routes/orders/list.test.ts +0 -30
  43. package/bun-tests/fake-snippets-api/routes/orgs/add_member.test.ts +0 -26
  44. package/bun-tests/fake-snippets-api/routes/orgs/create.test.ts +0 -37
  45. package/bun-tests/fake-snippets-api/routes/orgs/get.test.ts +0 -53
  46. package/bun-tests/fake-snippets-api/routes/orgs/get_member.test.ts +0 -110
  47. package/bun-tests/fake-snippets-api/routes/orgs/list.test.ts +0 -17
  48. package/bun-tests/fake-snippets-api/routes/orgs/list_members.test.ts +0 -24
  49. package/bun-tests/fake-snippets-api/routes/orgs/remove_member.test.ts +0 -81
  50. package/bun-tests/fake-snippets-api/routes/orgs/update.test.ts +0 -151
  51. package/bun-tests/fake-snippets-api/routes/package_builds/get.test.ts +0 -279
  52. package/bun-tests/fake-snippets-api/routes/package_builds/list.test.ts +0 -292
  53. package/bun-tests/fake-snippets-api/routes/package_files/create.test.ts +0 -320
  54. package/bun-tests/fake-snippets-api/routes/package_files/create_or_update.test.ts +0 -603
  55. package/bun-tests/fake-snippets-api/routes/package_files/delete.test.ts +0 -233
  56. package/bun-tests/fake-snippets-api/routes/package_files/download.test.ts +0 -248
  57. package/bun-tests/fake-snippets-api/routes/package_files/get.test.ts +0 -230
  58. package/bun-tests/fake-snippets-api/routes/package_files/list.test.ts +0 -212
  59. package/bun-tests/fake-snippets-api/routes/package_releases/create.test.ts +0 -171
  60. package/bun-tests/fake-snippets-api/routes/package_releases/get.test.ts +0 -181
  61. package/bun-tests/fake-snippets-api/routes/package_releases/get_image_generation_fields.test.ts +0 -38
  62. package/bun-tests/fake-snippets-api/routes/package_releases/list.test.ts +0 -149
  63. package/bun-tests/fake-snippets-api/routes/package_releases/update.test.ts +0 -160
  64. package/bun-tests/fake-snippets-api/routes/packages/add_star.test.ts +0 -129
  65. package/bun-tests/fake-snippets-api/routes/packages/create.test.ts +0 -67
  66. package/bun-tests/fake-snippets-api/routes/packages/delete.test.ts +0 -74
  67. package/bun-tests/fake-snippets-api/routes/packages/fork.test.ts +0 -132
  68. package/bun-tests/fake-snippets-api/routes/packages/get.test.ts +0 -112
  69. package/bun-tests/fake-snippets-api/routes/packages/images.test.ts +0 -72
  70. package/bun-tests/fake-snippets-api/routes/packages/list-1.test.ts +0 -145
  71. package/bun-tests/fake-snippets-api/routes/packages/list-2.test.ts +0 -48
  72. package/bun-tests/fake-snippets-api/routes/packages/list_latest.test.ts +0 -110
  73. package/bun-tests/fake-snippets-api/routes/packages/list_trending.test.ts +0 -103
  74. package/bun-tests/fake-snippets-api/routes/packages/remove_star.test.ts +0 -131
  75. package/bun-tests/fake-snippets-api/routes/packages/update.test.ts +0 -217
  76. package/bun-tests/fake-snippets-api/routes/proxy.test.ts +0 -42
  77. package/bun.lock +0 -2724
  78. package/bunfig.toml +0 -3
  79. package/components.json +0 -20
  80. package/dist/assets/404-CnNkOMw-.js +0 -1
  81. package/dist/assets/Analytics-DIw7l2gi.js +0 -84
  82. package/dist/assets/BuildsList-CeqVVhbz.js +0 -1
  83. package/dist/assets/CodeAndPreview-Dycd0s15.js +0 -722
  84. package/dist/assets/DownloadButtonAndMenu-OIUhbKkj.js +0 -194
  85. package/dist/assets/FileSaver.min-BDsOlqKl.js +0 -1
  86. package/dist/assets/Footer-DU-HdqGk.js +0 -1
  87. package/dist/assets/GithubAvatarWithFallback-CQhrBiKP.js +0 -6
  88. package/dist/assets/Header-CI4GZVOv.js +0 -1
  89. package/dist/assets/Header2-CrMDmo3P.js +0 -5
  90. package/dist/assets/NotFound-DaXtEPsC.js +0 -1
  91. package/dist/assets/OrganizationCard-Bs2dw-AL.js +0 -1
  92. package/dist/assets/PackageBreadcrumb-DpOpPbGc.js +0 -6
  93. package/dist/assets/PackageCard-ejE2dLlA.js +0 -16
  94. package/dist/assets/PackageSearchResults-BI3Rtmr2.js +0 -1
  95. package/dist/assets/ProfileRouter-4xNgtXr5.js +0 -6
  96. package/dist/assets/alert-dialog-DrOB4Tui.js +0 -1
  97. package/dist/assets/authorize-D-5R3QHA.js +0 -16
  98. package/dist/assets/badge-Bk-k6kyg.js +0 -1
  99. package/dist/assets/card-CzXDit7x.js +0 -1
  100. package/dist/assets/circle-alert-Du9-4of0.js +0 -6
  101. package/dist/assets/circle-check-big-KaRyRsht.js +0 -6
  102. package/dist/assets/cpu-BnvjzmIA.js +0 -6
  103. package/dist/assets/create-organization-BHNFvE7B.js +0 -1
  104. package/dist/assets/dashboard-DDH4V91X.js +0 -11
  105. package/dist/assets/datasheet-DqKtWt-O.js +0 -1
  106. package/dist/assets/datasheets-4W6pEMf3.js +0 -1
  107. package/dist/assets/dev-login-CbHdDthp.js +0 -1
  108. package/dist/assets/editor-bqg9Yv91.js +0 -1
  109. package/dist/assets/editor_example_1-1000w.webp +0 -0
  110. package/dist/assets/editor_example_1-1200w.webp +0 -0
  111. package/dist/assets/editor_example_1-1600w.webp +0 -0
  112. package/dist/assets/editor_example_1-2000w.webp +0 -0
  113. package/dist/assets/editor_example_1-400w.webp +0 -0
  114. package/dist/assets/editor_example_1-600w.webp +0 -0
  115. package/dist/assets/editor_example_1-800w.webp +0 -0
  116. package/dist/assets/editor_example_1_more_square-1000w.webp +0 -0
  117. package/dist/assets/editor_example_1_more_square-1200w.webp +0 -0
  118. package/dist/assets/editor_example_1_more_square-1600w.webp +0 -0
  119. package/dist/assets/editor_example_1_more_square-2000w.webp +0 -0
  120. package/dist/assets/editor_example_1_more_square-400w.webp +0 -0
  121. package/dist/assets/editor_example_1_more_square-600w.webp +0 -0
  122. package/dist/assets/editor_example_1_more_square-800w.webp +0 -0
  123. package/dist/assets/editor_example_2-1000w.webp +0 -0
  124. package/dist/assets/editor_example_2-1200w.webp +0 -0
  125. package/dist/assets/editor_example_2-1600w.webp +0 -0
  126. package/dist/assets/editor_example_2-2000w.webp +0 -0
  127. package/dist/assets/editor_example_2-400w.webp +0 -0
  128. package/dist/assets/editor_example_2-600w.webp +0 -0
  129. package/dist/assets/editor_example_2-800w.webp +0 -0
  130. package/dist/assets/example_schematic-1000w.webp +0 -0
  131. package/dist/assets/example_schematic-1200w.webp +0 -0
  132. package/dist/assets/example_schematic-1600w.webp +0 -0
  133. package/dist/assets/example_schematic-2000w.webp +0 -0
  134. package/dist/assets/example_schematic-400w.webp +0 -0
  135. package/dist/assets/example_schematic-600w.webp +0 -0
  136. package/dist/assets/example_schematic-800w.webp +0 -0
  137. package/dist/assets/eye-B_NMTTT7.js +0 -6
  138. package/dist/assets/fallback-image.svg +0 -1
  139. package/dist/assets/favicon-BwEjZKGP.ico +0 -0
  140. package/dist/assets/formatTimeAgo-CawXna5h.js +0 -6
  141. package/dist/assets/github-DjKGjbX1.js +0 -6
  142. package/dist/assets/github-dark-DHJKELXO.js +0 -1
  143. package/dist/assets/github-light-DAi9KRSo.js +0 -1
  144. package/dist/assets/hash-DfKYpqTm.js +0 -6
  145. package/dist/assets/index-B17tE1vy.js +0 -1
  146. package/dist/assets/index-BQPj88OW.js +0 -6051
  147. package/dist/assets/index-DvNLZBaq.js +0 -6
  148. package/dist/assets/keyboard-4b_qLHIF.js +0 -11
  149. package/dist/assets/label-CTudXc4q.js +0 -1
  150. package/dist/assets/landing-Cjvvx-9q.js +0 -11
  151. package/dist/assets/latest-DMk4BmXW.js +0 -1
  152. package/dist/assets/layers-BJ1iwaVM.js +0 -6
  153. package/dist/assets/load-prettier-DgbV1Jgu.js +0 -1
  154. package/dist/assets/lock-BOZRJdUv.js +0 -6
  155. package/dist/assets/main-DPEM9abA.js +0 -26
  156. package/dist/assets/main-MTKdI4FA.css +0 -1
  157. package/dist/assets/my-orders-B7lEyNR9.js +0 -1
  158. package/dist/assets/organization-settings-rNvhYFgZ.js +0 -6
  159. package/dist/assets/package-editor-T4WIRP49.js +0 -1
  160. package/dist/assets/pen-D54fxNRf.js +0 -6
  161. package/dist/assets/plus-KkE_6Dq2.js +0 -6
  162. package/dist/assets/preview-release-DWhKHFWp.js +0 -1
  163. package/dist/assets/quickstart-WF3HR9Dc.js +0 -1
  164. package/dist/assets/refresh-cw-aWASTRku.js +0 -6
  165. package/dist/assets/release-builds-COa5ndHa.js +0 -1
  166. package/dist/assets/release-detail-iclJPUO-.js +0 -6
  167. package/dist/assets/releases-Clsyp-7n.js +0 -1
  168. package/dist/assets/role-badge-BGF_IMlO.js +0 -16
  169. package/dist/assets/search-CwH23pAU.js +0 -1
  170. package/dist/assets/select-BN8AF1J7.js +0 -1
  171. package/dist/assets/settings-B2bMEtS4.js +0 -6
  172. package/dist/assets/skeleton-DLAS40-y.js +0 -1
  173. package/dist/assets/svg-to-png-BX4YEHCP-JcDm8Hc5.js +0 -1
  174. package/dist/assets/svg-to-png-BX4YEHCP-pNo9Afg8.js +0 -1
  175. package/dist/assets/tabs-Ce0NFuwd.js +0 -1
  176. package/dist/assets/timeAgo-VY0F2EV9.js +0 -10
  177. package/dist/assets/tooltip-C1pwvC0K.js +0 -11
  178. package/dist/assets/trash-2-BW3eClHz.js +0 -6
  179. package/dist/assets/trending-C8246HGf.js +0 -1
  180. package/dist/assets/triangle-alert-BMIBEO1D.js +0 -6
  181. package/dist/assets/tsx-COt5Ahok.js +0 -1
  182. package/dist/assets/use-create-datasheet-B7TDsTUt.js +0 -1
  183. package/dist/assets/use-delete-package-DLKtoTOj.js +0 -1
  184. package/dist/assets/use-download-zip-CAOKjGXW.js +0 -1
  185. package/dist/assets/use-list-user-orgs-CgJIT7N4.js +0 -1
  186. package/dist/assets/use-organization-XwYYTFck.js +0 -1
  187. package/dist/assets/use-package-builds-Bx8rfxi1.js +0 -1
  188. package/dist/assets/use-package-by-package-name-1s1Pcarw.js +0 -1
  189. package/dist/assets/use-package-files-CmmWVuGn.js +0 -1
  190. package/dist/assets/use-package-release-by-id-or-version-BuuXcSZq.js +0 -1
  191. package/dist/assets/use-package-release-images-BMaZtvmk.js +0 -1
  192. package/dist/assets/use-packages-base-api-url-DA1hucM7.js +0 -1
  193. package/dist/assets/useQueries-BJ7Ue7HV.js +0 -1
  194. package/dist/assets/user-settings-BqO5FkMf.js +0 -1
  195. package/dist/assets/view-package-C-OvJr_Q.js +0 -165
  196. package/dist/assets/vitesse-light-CVO1_9PV.js +0 -1
  197. package/dist/assets/wasm-CG6Dc4jp.js +0 -1
  198. package/dist/index.html +0 -127
  199. package/dist/landing.html +0 -34
  200. package/dist/robots.txt +0 -9
  201. package/dist/sitemap.xml +0 -118
  202. package/dist/stats.html +0 -4949
  203. package/docs/CIRCUIT_JSON_SOURCE_COMPONENT_OVERVIEW.md +0 -151
  204. package/fake-snippets-api/README.md +0 -6
  205. package/fake-snippets-api/biome.json +0 -47
  206. package/fake-snippets-api/lib/db/autoload-dev-packages.ts +0 -222
  207. package/fake-snippets-api/lib/db/autoload-packages.json +0 -8
  208. package/fake-snippets-api/lib/db/db-client.ts +0 -1857
  209. package/fake-snippets-api/lib/db/seed.ts +0 -1843
  210. package/fake-snippets-api/lib/index.ts +0 -3
  211. package/fake-snippets-api/lib/middleware/with-ctx-error.ts +0 -26
  212. package/fake-snippets-api/lib/middleware/with-db.ts +0 -15
  213. package/fake-snippets-api/lib/middleware/with-error-handling.ts +0 -24
  214. package/fake-snippets-api/lib/middleware/with-optional-session-auth.ts +0 -53
  215. package/fake-snippets-api/lib/middleware/with-request-logging.ts +0 -54
  216. package/fake-snippets-api/lib/middleware/with-session-auth.ts +0 -102
  217. package/fake-snippets-api/lib/middleware/with-winter-spec.ts +0 -24
  218. package/fake-snippets-api/lib/package_file/generate-fs-sha.ts +0 -20
  219. package/fake-snippets-api/lib/package_file/get-package-file-id-from-file-descriptor.ts +0 -173
  220. package/fake-snippets-api/lib/package_release/find-package-release-id.ts +0 -120
  221. package/fake-snippets-api/lib/public-mapping/public-map-org.ts +0 -34
  222. package/fake-snippets-api/lib/public-mapping/public-map-package-build.ts +0 -48
  223. package/fake-snippets-api/lib/public-mapping/public-map-package-release.ts +0 -88
  224. package/fake-snippets-api/lib/public-mapping/public-map-package.ts +0 -60
  225. package/fake-snippets-api/lib/with-winter-spec.ts +0 -1
  226. package/fake-snippets-api/next-env.d.ts +0 -5
  227. package/fake-snippets-api/routes/api/_fake/ai_reviews/process_review.ts +0 -31
  228. package/fake-snippets-api/routes/api/_fake/datasheets/process_all_datasheets.ts +0 -38
  229. package/fake-snippets-api/routes/api/_fake/db.ts +0 -11
  230. package/fake-snippets-api/routes/api/_fake/move_orders_forward.ts +0 -65
  231. package/fake-snippets-api/routes/api/_fake/received_quotes.ts +0 -112
  232. package/fake-snippets-api/routes/api/_fake/run_async_tasks.ts +0 -12
  233. package/fake-snippets-api/routes/api/_fake/seed.ts +0 -13
  234. package/fake-snippets-api/routes/api/accounts/get.ts +0 -35
  235. package/fake-snippets-api/routes/api/accounts/get_account_balance.ts +0 -22
  236. package/fake-snippets-api/routes/api/accounts/search.ts +0 -20
  237. package/fake-snippets-api/routes/api/accounts/update.ts +0 -32
  238. package/fake-snippets-api/routes/api/ai/[...anyroute].ts +0 -31
  239. package/fake-snippets-api/routes/api/ai.ts +0 -2
  240. package/fake-snippets-api/routes/api/ai_reviews/create.ts +0 -44
  241. package/fake-snippets-api/routes/api/ai_reviews/get.ts +0 -24
  242. package/fake-snippets-api/routes/api/ai_reviews/list.ts +0 -14
  243. package/fake-snippets-api/routes/api/aistream/[...anyroute].ts +0 -65
  244. package/fake-snippets-api/routes/api/autocomplete/create_autocomplete.ts +0 -16
  245. package/fake-snippets-api/routes/api/bug_reports/create.ts +0 -43
  246. package/fake-snippets-api/routes/api/bug_reports/upload_file.ts +0 -113
  247. package/fake-snippets-api/routes/api/datasheets/create.ts +0 -18
  248. package/fake-snippets-api/routes/api/datasheets/get.ts +0 -35
  249. package/fake-snippets-api/routes/api/datasheets/list.ts +0 -29
  250. package/fake-snippets-api/routes/api/github/installations/create_new_installation_redirect.ts +0 -75
  251. package/fake-snippets-api/routes/api/github/repos/list_available.ts +0 -91
  252. package/fake-snippets-api/routes/api/github/repos/refresh.ts +0 -44
  253. package/fake-snippets-api/routes/api/health.ts +0 -9
  254. package/fake-snippets-api/routes/api/internal/sessions/create_without_auth.ts +0 -63
  255. package/fake-snippets-api/routes/api/order_files/get.ts +0 -28
  256. package/fake-snippets-api/routes/api/order_files/upload.ts +0 -46
  257. package/fake-snippets-api/routes/api/order_quotes/create.ts +0 -60
  258. package/fake-snippets-api/routes/api/order_quotes/create_all_vendor_quotes.ts +0 -30
  259. package/fake-snippets-api/routes/api/order_quotes/get.ts +0 -29
  260. package/fake-snippets-api/routes/api/orders/create.ts +0 -70
  261. package/fake-snippets-api/routes/api/orders/get.ts +0 -168
  262. package/fake-snippets-api/routes/api/orders/list.ts +0 -15
  263. package/fake-snippets-api/routes/api/orgs/add_member.ts +0 -52
  264. package/fake-snippets-api/routes/api/orgs/create.ts +0 -48
  265. package/fake-snippets-api/routes/api/orgs/get.ts +0 -39
  266. package/fake-snippets-api/routes/api/orgs/get_member.ts +0 -67
  267. package/fake-snippets-api/routes/api/orgs/list.ts +0 -31
  268. package/fake-snippets-api/routes/api/orgs/list_members.ts +0 -106
  269. package/fake-snippets-api/routes/api/orgs/remove_member.ts +0 -46
  270. package/fake-snippets-api/routes/api/orgs/update.ts +0 -118
  271. package/fake-snippets-api/routes/api/package_builds/get.ts +0 -70
  272. package/fake-snippets-api/routes/api/package_builds/list.ts +0 -97
  273. package/fake-snippets-api/routes/api/package_files/create.ts +0 -135
  274. package/fake-snippets-api/routes/api/package_files/create_or_update.ts +0 -194
  275. package/fake-snippets-api/routes/api/package_files/delete.ts +0 -109
  276. package/fake-snippets-api/routes/api/package_files/download.ts +0 -87
  277. package/fake-snippets-api/routes/api/package_files/get.ts +0 -68
  278. package/fake-snippets-api/routes/api/package_files/list.ts +0 -54
  279. package/fake-snippets-api/routes/api/package_releases/create.ts +0 -109
  280. package/fake-snippets-api/routes/api/package_releases/get.ts +0 -137
  281. package/fake-snippets-api/routes/api/package_releases/list.ts +0 -85
  282. package/fake-snippets-api/routes/api/package_releases/rebuild.ts +0 -66
  283. package/fake-snippets-api/routes/api/package_releases/update.ts +0 -122
  284. package/fake-snippets-api/routes/api/packages/add_star.ts +0 -84
  285. package/fake-snippets-api/routes/api/packages/create.ts +0 -136
  286. package/fake-snippets-api/routes/api/packages/delete.ts +0 -41
  287. package/fake-snippets-api/routes/api/packages/fork.ts +0 -165
  288. package/fake-snippets-api/routes/api/packages/generate_from_jlcpcb.ts +0 -111
  289. package/fake-snippets-api/routes/api/packages/get.ts +0 -81
  290. package/fake-snippets-api/routes/api/packages/images/[owner_github_username]/[unscoped_name]/[view_format].ts +0 -119
  291. package/fake-snippets-api/routes/api/packages/list.ts +0 -105
  292. package/fake-snippets-api/routes/api/packages/list_latest.ts +0 -29
  293. package/fake-snippets-api/routes/api/packages/list_trending.ts +0 -43
  294. package/fake-snippets-api/routes/api/packages/remove_star.ts +0 -70
  295. package/fake-snippets-api/routes/api/packages/search.ts +0 -19
  296. package/fake-snippets-api/routes/api/packages/update.ts +0 -112
  297. package/fake-snippets-api/routes/api/packages/update_ai_description.ts +0 -37
  298. package/fake-snippets-api/routes/api/proxy.ts +0 -128
  299. package/fake-snippets-api/routes/api/snippets/add_star.ts +0 -62
  300. package/fake-snippets-api/routes/api/snippets/create.ts +0 -184
  301. package/fake-snippets-api/routes/api/snippets/delete.ts +0 -41
  302. package/fake-snippets-api/routes/api/snippets/download.ts +0 -162
  303. package/fake-snippets-api/routes/api/snippets/generate_from_jlcpcb.ts +0 -48
  304. package/fake-snippets-api/routes/api/snippets/get.ts +0 -83
  305. package/fake-snippets-api/routes/api/snippets/get_image.ts +0 -65
  306. package/fake-snippets-api/routes/api/snippets/images/[author]/[snippet_name]/[typeFormat].ts +0 -80
  307. package/fake-snippets-api/routes/api/snippets/list.ts +0 -151
  308. package/fake-snippets-api/routes/api/snippets/list_latest.ts +0 -13
  309. package/fake-snippets-api/routes/api/snippets/list_trending.ts +0 -38
  310. package/fake-snippets-api/routes/api/snippets/remove_star.ts +0 -42
  311. package/fake-snippets-api/routes/api/snippets/search.ts +0 -18
  312. package/fake-snippets-api/routes/api/snippets/update.ts +0 -114
  313. package/fake-snippets-api/utils/normalizeProjectFilePath.ts +0 -60
  314. package/fake-snippets-api/utils/order-steps.ts +0 -20
  315. package/favicon.ico +0 -0
  316. package/index.html +0 -125
  317. package/landing.html +0 -23
  318. package/playwright-tests/ai-page.spec.ts +0 -19
  319. package/playwright-tests/circuit-json-import.spec.ts +0 -133
  320. package/playwright-tests/cmd-click.spec.ts +0 -43
  321. package/playwright-tests/dashboard-page.spec.ts +0 -10
  322. package/playwright-tests/editor-page.spec.ts +0 -15
  323. package/playwright-tests/exampleCircuitJson.ts +0 -498
  324. package/playwright-tests/files-dialog.spec.ts +0 -19
  325. package/playwright-tests/footprint-dialog/footprint-dialog.spec.ts +0 -27
  326. package/playwright-tests/footprint-dialog/footprint-insertion.spec.ts +0 -38
  327. package/playwright-tests/footprint-dialog/footprint-preview.spec.ts +0 -34
  328. package/playwright-tests/footprint-dialog/footprint-selection.spec.ts +0 -29
  329. package/playwright-tests/handle-manual-edits.spec.ts +0 -55
  330. package/playwright-tests/home-page.spec.ts +0 -10
  331. package/playwright-tests/images.spec.ts +0 -17
  332. package/playwright-tests/manual-edits.spec.ts +0 -89
  333. package/playwright-tests/preview-page.spec.ts +0 -7
  334. package/playwright-tests/profile-page.spec.ts +0 -108
  335. package/playwright-tests/quickstart-page.spec.ts +0 -10
  336. package/playwright-tests/search-links.spec.ts +0 -21
  337. package/playwright-tests/search.spec.ts +0 -27
  338. package/playwright-tests/snapshots/ai-page.spec.ts-AI-Page-lg.png +0 -0
  339. package/playwright-tests/snapshots/ai-page.spec.ts-AI-Page-md.png +0 -0
  340. package/playwright-tests/snapshots/ai-page.spec.ts-AI-Page-xs.png +0 -0
  341. package/playwright-tests/snapshots/cmd-click.spec.ts-underlined-imports.png +0 -0
  342. package/playwright-tests/snapshots/dashboard-page.spec.ts-Dashboard-page-lg.png +0 -0
  343. package/playwright-tests/snapshots/dashboard-page.spec.ts-Dashboard-page-md.png +0 -0
  344. package/playwright-tests/snapshots/dashboard-page.spec.ts-Dashboard-page-xs.png +0 -0
  345. package/playwright-tests/snapshots/editor-page.spec.ts-editor-with-snippet.png +0 -0
  346. package/playwright-tests/snapshots/error-fallback.spec.ts-error-fallback-lg.png +0 -0
  347. package/playwright-tests/snapshots/error-fallback.spec.ts-error-fallback-md.png +0 -0
  348. package/playwright-tests/snapshots/error-fallback.spec.ts-error-fallback-xs.png +0 -0
  349. package/playwright-tests/snapshots/files-dialog.spec.ts-view-snippet-files.png +0 -0
  350. package/playwright-tests/snapshots/footprint-dialog/footprint-dialog.spec.ts-footprint-preview-lg.png +0 -0
  351. package/playwright-tests/snapshots/footprint-dialog/footprint-dialog.spec.ts-footprint-preview-md.png +0 -0
  352. package/playwright-tests/snapshots/footprint-dialog/footprint-dialog.spec.ts-footprint-preview-xs.png +0 -0
  353. package/playwright-tests/snapshots/footprint-dialog/footprint-insertion.spec.ts-footprint-insertion-lg.png +0 -0
  354. package/playwright-tests/snapshots/footprint-dialog/footprint-insertion.spec.ts-footprint-insertion-md.png +0 -0
  355. package/playwright-tests/snapshots/footprint-dialog/footprint-insertion.spec.ts-footprint-insertion-xs.png +0 -0
  356. package/playwright-tests/snapshots/footprint-dialog/footprint-preview.spec.ts-footprint-preview-lg.png +0 -0
  357. package/playwright-tests/snapshots/footprint-dialog/footprint-preview.spec.ts-footprint-preview-md.png +0 -0
  358. package/playwright-tests/snapshots/footprint-dialog/footprint-preview.spec.ts-footprint-preview-xs.png +0 -0
  359. package/playwright-tests/snapshots/footprint-dialog/footprint-selection.spec.ts-footprint-preview-lg.png +0 -0
  360. package/playwright-tests/snapshots/footprint-dialog/footprint-selection.spec.ts-footprint-preview-md.png +0 -0
  361. package/playwright-tests/snapshots/footprint-dialog/footprint-selection.spec.ts-footprint-preview-xs.png +0 -0
  362. package/playwright-tests/snapshots/handle-manual-edits.spec.ts-handle-manual-edits.png +0 -0
  363. package/playwright-tests/snapshots/home-page.spec.ts-Home-page-lg.png +0 -0
  364. package/playwright-tests/snapshots/home-page.spec.ts-Home-page-md.png +0 -0
  365. package/playwright-tests/snapshots/home-page.spec.ts-Home-page-xs.png +0 -0
  366. package/playwright-tests/snapshots/images.spec.ts-pcb-image.png +0 -0
  367. package/playwright-tests/snapshots/images.spec.ts-schematic-image.png +0 -0
  368. package/playwright-tests/snapshots/manual-edits.spec.ts-editor-manual-edits.png +0 -0
  369. package/playwright-tests/snapshots/manual-edits.spec.ts-manual-edits-view.png +0 -0
  370. package/playwright-tests/snapshots/preview-page.spec.ts-preview-snippet-pcb.png +0 -0
  371. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-before-delete.png +0 -0
  372. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-delete-dialog.png +0 -0
  373. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-dropdown-open.png +0 -0
  374. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-snippets-tab.png +0 -0
  375. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-starred-tab.png +0 -0
  376. package/playwright-tests/snapshots/profile-page.spec.ts-snippet-page-open-after-star-click.png +0 -0
  377. package/playwright-tests/snapshots/quickstart-page.spec.ts-Quickstart-Pagelg.png +0 -0
  378. package/playwright-tests/snapshots/quickstart-page.spec.ts-Quickstart-Pagemd.png +0 -0
  379. package/playwright-tests/snapshots/quickstart-page.spec.ts-Quickstart-Pagexs.png +0 -0
  380. package/playwright-tests/snapshots/search-links.spec.ts-search-links.png +0 -0
  381. package/playwright-tests/snapshots/search.spec.ts-search-lg.png +0 -0
  382. package/playwright-tests/snapshots/search.spec.ts-search-md.png +0 -0
  383. package/playwright-tests/snapshots/search.spec.ts-search-xs.png +0 -0
  384. package/playwright-tests/snapshots/star.spec.ts-remove-star-button.png +0 -0
  385. package/playwright-tests/snapshots/star.spec.ts-star-button.png +0 -0
  386. package/playwright-tests/snapshots/update-description.spec.ts-update-description.png +0 -0
  387. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-after-lg.png +0 -0
  388. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-after-md.png +0 -0
  389. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-after-xs.png +0 -0
  390. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-before-lg.png +0 -0
  391. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-before-md.png +0 -0
  392. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-before-xs.png +0 -0
  393. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-files.png +0 -0
  394. package/playwright-tests/star.spec.ts +0 -40
  395. package/playwright-tests/update-description.spec.ts +0 -18
  396. package/playwright-tests/view-snippet.spec.ts +0 -35
  397. package/playwright-tests/viewports.ts +0 -5
  398. package/playwright.config.ts +0 -27
  399. package/postcss.config.js +0 -6
  400. package/public/robots.txt +0 -9
  401. package/renovate.json +0 -25
  402. package/scripts/generate-image-sizes.ts +0 -57
  403. package/scripts/generate-sitemap.ts +0 -103
  404. package/scripts/generate_bundle_stats.js +0 -208
  405. package/scripts/snapshot.ts +0 -35
  406. package/src/App.tsx +0 -314
  407. package/src/ContextProviders.tsx +0 -94
  408. package/src/assets/originals/editor_example_1.webp +0 -0
  409. package/src/assets/originals/editor_example_1_more_square.webp +0 -0
  410. package/src/assets/originals/editor_example_2.webp +0 -0
  411. package/src/assets/originals/example_schematic.webp +0 -0
  412. package/src/components/AiChatMessage.tsx +0 -86
  413. package/src/components/Analytics.tsx +0 -23
  414. package/src/components/BomTable.tsx +0 -69
  415. package/src/components/ChatInput.tsx +0 -53
  416. package/src/components/CircuitJsonImportDialog.tsx +0 -269
  417. package/src/components/CircuitToSvgWithMouseControl.tsx +0 -78
  418. package/src/components/CmdKMenu.tsx +0 -809
  419. package/src/components/CreateNewSnippetWithAiHero.tsx +0 -81
  420. package/src/components/CreateReleaseDialog.tsx +0 -124
  421. package/src/components/DownloadButtonAndMenu.tsx +0 -443
  422. package/src/components/ErrorFallback.tsx +0 -25
  423. package/src/components/ErrorOutline.tsx +0 -35
  424. package/src/components/ErrorTabContent.tsx +0 -122
  425. package/src/components/ExpandableText.tsx +0 -29
  426. package/src/components/FAQ.tsx +0 -189
  427. package/src/components/FileSidebar.tsx +0 -271
  428. package/src/components/Footer.tsx +0 -144
  429. package/src/components/GithubAvatarWithFallback.tsx +0 -35
  430. package/src/components/Header.tsx +0 -202
  431. package/src/components/Header2.tsx +0 -202
  432. package/src/components/HeaderDropdown.tsx +0 -88
  433. package/src/components/HeaderLogin.tsx +0 -105
  434. package/src/components/HiddenFilesDropdown.tsx +0 -42
  435. package/src/components/ImageWithFallback.tsx +0 -37
  436. package/src/components/LatestSnippets.tsx +0 -39
  437. package/src/components/NotFound.tsx +0 -37
  438. package/src/components/OptimizedImage.tsx +0 -100
  439. package/src/components/PackageBreadcrumb.tsx +0 -105
  440. package/src/components/PackageBuildsPage/ErrorObject.ts +0 -12
  441. package/src/components/PackageBuildsPage/capitalCase.ts +0 -4
  442. package/src/components/PackageBuildsPage/getColorForDisplayStatus.ts +0 -17
  443. package/src/components/PackageCard.tsx +0 -191
  444. package/src/components/PackageCardSkeleton.tsx +0 -17
  445. package/src/components/PackageLink.tsx +0 -29
  446. package/src/components/PackageSearchResults.tsx +0 -81
  447. package/src/components/PackagesList.tsx +0 -71
  448. package/src/components/PcbViewerWithContainerHeight.tsx +0 -47
  449. package/src/components/PrefetchPageLink.tsx +0 -114
  450. package/src/components/PreviewEmptyState.tsx +0 -16
  451. package/src/components/ProfileRouter.tsx +0 -30
  452. package/src/components/RunButton.tsx +0 -27
  453. package/src/components/SearchComponent.tsx +0 -282
  454. package/src/components/SentryNotFoundReporter.tsx +0 -44
  455. package/src/components/SnippetTypeIcon.tsx +0 -60
  456. package/src/components/StaticPreviewContent.tsx +0 -89
  457. package/src/components/StaticViewSnippetSidebar.tsx +0 -100
  458. package/src/components/SuspenseRunFrame.tsx +0 -28
  459. package/src/components/TableViewer/CircuitJsonTableViewer.tsx +0 -316
  460. package/src/components/TableViewer/ClickableText.tsx +0 -21
  461. package/src/components/TableViewer/HeaderCell.tsx +0 -27
  462. package/src/components/TableViewer/Modal.tsx +0 -39
  463. package/src/components/TrendingPackagesCarousel.tsx +0 -79
  464. package/src/components/TypeBadge.tsx +0 -31
  465. package/src/components/UserCard.tsx +0 -80
  466. package/src/components/ViewPackagePage/components/ShikiCodeViewer.tsx +0 -49
  467. package/src/components/ViewPackagePage/components/build-status.tsx +0 -38
  468. package/src/components/ViewPackagePage/components/important-files-view.tsx +0 -611
  469. package/src/components/ViewPackagePage/components/main-content-header.tsx +0 -181
  470. package/src/components/ViewPackagePage/components/main-content-view-selector.tsx +0 -167
  471. package/src/components/ViewPackagePage/components/markdown-viewer.tsx +0 -88
  472. package/src/components/ViewPackagePage/components/mobile-sidebar.tsx +0 -301
  473. package/src/components/ViewPackagePage/components/package-header.tsx +0 -264
  474. package/src/components/ViewPackagePage/components/preview-image-squares.tsx +0 -47
  475. package/src/components/ViewPackagePage/components/repo-page-content.tsx +0 -266
  476. package/src/components/ViewPackagePage/components/sidebar-about-section.tsx +0 -223
  477. package/src/components/ViewPackagePage/components/sidebar-packages-section.tsx +0 -16
  478. package/src/components/ViewPackagePage/components/sidebar-releases-section.tsx +0 -126
  479. package/src/components/ViewPackagePage/components/sidebar.tsx +0 -29
  480. package/src/components/ViewPackagePage/components/tab-views/3d-view.tsx +0 -43
  481. package/src/components/ViewPackagePage/components/tab-views/bom-view.tsx +0 -30
  482. package/src/components/ViewPackagePage/components/tab-views/files-view.tsx +0 -295
  483. package/src/components/ViewPackagePage/components/tab-views/pcb-view.tsx +0 -35
  484. package/src/components/ViewPackagePage/components/tab-views/schematic-view.tsx +0 -38
  485. package/src/components/ViewPackagePage/components/theme-toggle.tsx +0 -40
  486. package/src/components/ViewPackagePage/hooks/use-current-package-circuit-json.ts +0 -46
  487. package/src/components/ViewPackagePage/hooks/use-mobile.tsx +0 -19
  488. package/src/components/ViewPackagePage/hooks/use-toast.tsx +0 -69
  489. package/src/components/ViewPackagePage/utils/fuzz-search.ts +0 -121
  490. package/src/components/ViewPackagePage/utils/get-license-content.ts +0 -119
  491. package/src/components/ViewPackagePage/utils/is-hidden-file.ts +0 -55
  492. package/src/components/ViewPackagePage/utils/is-package-file-important.ts +0 -35
  493. package/src/components/ViewPackagePage/utils/is-within-directory.ts +0 -32
  494. package/src/components/dialogs/GitHubRepositorySelector.tsx +0 -300
  495. package/src/components/dialogs/confirm-delete-package-dialog.tsx +0 -74
  496. package/src/components/dialogs/confirm-discard-changes-dialog.tsx +0 -73
  497. package/src/components/dialogs/create-use-dialog.tsx +0 -40
  498. package/src/components/dialogs/edit-description-dialog.tsx +0 -96
  499. package/src/components/dialogs/edit-package-details-dialog.tsx +0 -474
  500. package/src/components/dialogs/files-dialog.tsx +0 -70
  501. package/src/components/dialogs/import-component-dialog.tsx +0 -32
  502. package/src/components/dialogs/import-package-dialog.tsx +0 -90
  503. package/src/components/dialogs/new-package-save-prompt-dialog.tsx +0 -199
  504. package/src/components/dialogs/package-visibility-settings-dialog.tsx +0 -93
  505. package/src/components/dialogs/pcb-download-dialog.tsx +0 -113
  506. package/src/components/dialogs/rename-package-dialog.tsx +0 -86
  507. package/src/components/dialogs/rename-snippet-dialog.tsx +0 -81
  508. package/src/components/dialogs/update-package-description-dialog.tsx +0 -96
  509. package/src/components/dialogs/view-ts-files-dialog.tsx +0 -664
  510. package/src/components/organization/OrganizationCard.tsx +0 -202
  511. package/src/components/organization/OrganizationCardSkeleton.tsx +0 -55
  512. package/src/components/organization/OrganizationHeader.tsx +0 -140
  513. package/src/components/organization/OrganizationMembers.tsx +0 -117
  514. package/src/components/package-port/CodeAndPreview.tsx +0 -253
  515. package/src/components/package-port/CodeEditor.tsx +0 -866
  516. package/src/components/package-port/CodeEditorHeader.tsx +0 -427
  517. package/src/components/package-port/EditorNav.tsx +0 -606
  518. package/src/components/package-port/GlobalFindReplace.tsx +0 -681
  519. package/src/components/package-port/QuickOpen.tsx +0 -241
  520. package/src/components/preview/BuildsList.tsx +0 -237
  521. package/src/components/preview/ConnectedPackagesList.tsx +0 -229
  522. package/src/components/preview/ConnectedRepoOverview.tsx +0 -588
  523. package/src/components/preview/PackageReleasesDashboard.tsx +0 -228
  524. package/src/components/preview/index.tsx +0 -54
  525. package/src/components/ui/accordion.tsx +0 -55
  526. package/src/components/ui/alert-dialog.tsx +0 -139
  527. package/src/components/ui/alert.tsx +0 -59
  528. package/src/components/ui/aspect-ratio.tsx +0 -5
  529. package/src/components/ui/avatar.tsx +0 -48
  530. package/src/components/ui/badge.tsx +0 -36
  531. package/src/components/ui/breadcrumb.tsx +0 -118
  532. package/src/components/ui/button.tsx +0 -58
  533. package/src/components/ui/calendar.tsx +0 -73
  534. package/src/components/ui/card.tsx +0 -76
  535. package/src/components/ui/carousel.tsx +0 -260
  536. package/src/components/ui/chart.tsx +0 -363
  537. package/src/components/ui/checkbox.tsx +0 -28
  538. package/src/components/ui/collapsible.tsx +0 -9
  539. package/src/components/ui/combobox.tsx +0 -178
  540. package/src/components/ui/command.tsx +0 -151
  541. package/src/components/ui/context-menu.tsx +0 -202
  542. package/src/components/ui/dialog.tsx +0 -120
  543. package/src/components/ui/drawer.tsx +0 -116
  544. package/src/components/ui/dropdown-menu.tsx +0 -203
  545. package/src/components/ui/form.tsx +0 -182
  546. package/src/components/ui/hover-card.tsx +0 -27
  547. package/src/components/ui/input.tsx +0 -25
  548. package/src/components/ui/label.tsx +0 -24
  549. package/src/components/ui/menubar.tsx +0 -238
  550. package/src/components/ui/navigation-menu.tsx +0 -129
  551. package/src/components/ui/pagination.tsx +0 -121
  552. package/src/components/ui/popover.tsx +0 -31
  553. package/src/components/ui/progress.tsx +0 -26
  554. package/src/components/ui/radio-group.tsx +0 -42
  555. package/src/components/ui/resizable.tsx +0 -43
  556. package/src/components/ui/role-badge.tsx +0 -27
  557. package/src/components/ui/scroll-area.tsx +0 -46
  558. package/src/components/ui/searchable-select.tsx +0 -94
  559. package/src/components/ui/select.tsx +0 -162
  560. package/src/components/ui/separator.tsx +0 -29
  561. package/src/components/ui/sheet.tsx +0 -141
  562. package/src/components/ui/skeleton.tsx +0 -18
  563. package/src/components/ui/slider.tsx +0 -26
  564. package/src/components/ui/sonner.tsx +0 -30
  565. package/src/components/ui/switch.tsx +0 -27
  566. package/src/components/ui/table.tsx +0 -120
  567. package/src/components/ui/tabs.tsx +0 -53
  568. package/src/components/ui/textarea.tsx +0 -24
  569. package/src/components/ui/toast.tsx +0 -128
  570. package/src/components/ui/toaster.tsx +0 -1
  571. package/src/components/ui/toggle-group.tsx +0 -59
  572. package/src/components/ui/toggle.tsx +0 -43
  573. package/src/components/ui/tooltip.tsx +0 -28
  574. package/src/components/ui/tree-view.tsx +0 -563
  575. package/src/entry-server.tsx +0 -12
  576. package/src/hooks/use-account-balance.ts +0 -25
  577. package/src/hooks/use-add-org-member-mutation.ts +0 -51
  578. package/src/hooks/use-ai-api.ts +0 -35
  579. package/src/hooks/use-ai-review.ts +0 -31
  580. package/src/hooks/use-axios.ts +0 -20
  581. package/src/hooks/use-code-completion-ai-api.ts +0 -11
  582. package/src/hooks/use-copy-to-clipboard.ts +0 -26
  583. package/src/hooks/use-create-datasheet.ts +0 -30
  584. package/src/hooks/use-create-org-mutation.ts +0 -38
  585. package/src/hooks/use-create-package-files-mutation.ts +0 -76
  586. package/src/hooks/use-create-package-mutation.ts +0 -54
  587. package/src/hooks/use-create-package-release-mutation.ts +0 -107
  588. package/src/hooks/use-create-release-dialog.ts +0 -160
  589. package/src/hooks/use-create-snippet-mutation.ts +0 -65
  590. package/src/hooks/use-current-package-id.ts +0 -16
  591. package/src/hooks/use-current-package-info.ts +0 -32
  592. package/src/hooks/use-current-package-release.ts +0 -48
  593. package/src/hooks/use-current-snippet-id.ts +0 -78
  594. package/src/hooks/use-current-snippet.ts +0 -24
  595. package/src/hooks/use-datasheet.ts +0 -18
  596. package/src/hooks/use-debounce.ts +0 -17
  597. package/src/hooks/use-delete-package.ts +0 -45
  598. package/src/hooks/use-download-zip.ts +0 -50
  599. package/src/hooks/use-fork-package-mutation.ts +0 -61
  600. package/src/hooks/use-global-store.ts +0 -36
  601. package/src/hooks/use-hotkey.ts +0 -116
  602. package/src/hooks/use-hydration.ts +0 -30
  603. package/src/hooks/use-is-using-fake-api.ts +0 -3
  604. package/src/hooks/use-jlcpcb-component-import.tsx +0 -164
  605. package/src/hooks/use-list-org-members.ts +0 -32
  606. package/src/hooks/use-list-user-orgs.ts +0 -25
  607. package/src/hooks/use-now.ts +0 -12
  608. package/src/hooks/use-org-by-github-handle.ts +0 -24
  609. package/src/hooks/use-org.ts +0 -24
  610. package/src/hooks/use-organization.ts +0 -42
  611. package/src/hooks/use-package-as-snippet.ts +0 -81
  612. package/src/hooks/use-package-builds.ts +0 -91
  613. package/src/hooks/use-package-by-package-id.ts +0 -24
  614. package/src/hooks/use-package-by-package-name.ts +0 -29
  615. package/src/hooks/use-package-details-form.ts +0 -146
  616. package/src/hooks/use-package-files.ts +0 -122
  617. package/src/hooks/use-package-release-by-id-or-version.ts +0 -45
  618. package/src/hooks/use-package-release-images.ts +0 -105
  619. package/src/hooks/use-package-release.ts +0 -124
  620. package/src/hooks/use-package-stars.ts +0 -163
  621. package/src/hooks/use-package.ts +0 -24
  622. package/src/hooks/use-packages-base-api-url.ts +0 -3
  623. package/src/hooks/use-preview-images.ts +0 -78
  624. package/src/hooks/use-rebuild-package-release-mutation.ts +0 -41
  625. package/src/hooks/use-remove-org-member-mutation.ts +0 -32
  626. package/src/hooks/use-request-ai-review-mutation.ts +0 -54
  627. package/src/hooks/use-run-tsx/eval-compiled-js.ts +0 -9
  628. package/src/hooks/use-shiki-highlighter.ts +0 -33
  629. package/src/hooks/use-sign-in.ts +0 -24
  630. package/src/hooks/use-snippet-by-name.ts +0 -25
  631. package/src/hooks/use-snippet.ts +0 -24
  632. package/src/hooks/use-toast.tsx +0 -90
  633. package/src/hooks/use-update-ai-description-mutation.ts +0 -42
  634. package/src/hooks/use-update-org-mutation.ts +0 -41
  635. package/src/hooks/use-url-params.ts +0 -31
  636. package/src/hooks/use-warn-user-on-page-change.ts +0 -90
  637. package/src/hooks/useFileManagement.ts +0 -602
  638. package/src/hooks/useForkPackageMutation.ts +0 -50
  639. package/src/hooks/useForkSnippetMutation.ts +0 -53
  640. package/src/hooks/useOptimizedPackageFilesLoader.ts +0 -136
  641. package/src/hooks/usePackageFilesLoader.ts +0 -58
  642. package/src/hooks/useUpdatePackageFilesMutation.ts +0 -131
  643. package/src/hooks/useUpdatePackageMutation.ts +0 -63
  644. package/src/index.css +0 -108
  645. package/src/lib/__tests__/constants.test.ts +0 -66
  646. package/src/lib/base64ToBytes.ts +0 -5
  647. package/src/lib/bytesToBase64.ts +0 -4
  648. package/src/lib/codemirror/basic-setup.ts +0 -67
  649. package/src/lib/constants.ts +0 -23
  650. package/src/lib/decodeUrlHashToFsMap.ts +0 -17
  651. package/src/lib/decodeUrlHashToText.ts +0 -15
  652. package/src/lib/defaultCodeForBlankCode.tsx +0 -7
  653. package/src/lib/download-fns/createBlobURL.ts +0 -4
  654. package/src/lib/download-fns/download-assembly-svg.ts +0 -12
  655. package/src/lib/download-fns/download-circuit-json-fn.ts +0 -12
  656. package/src/lib/download-fns/download-circuit-png.ts +0 -96
  657. package/src/lib/download-fns/download-dsn-file-fn.ts +0 -12
  658. package/src/lib/download-fns/download-fabrication-files.ts +0 -233
  659. package/src/lib/download-fns/download-gltf-from-circuit-json.ts +0 -44
  660. package/src/lib/download-fns/download-gltf.ts +0 -43
  661. package/src/lib/download-fns/download-kicad-files.ts +0 -38
  662. package/src/lib/download-fns/download-pcb-svg.ts +0 -35
  663. package/src/lib/download-fns/download-png-utils.ts +0 -31
  664. package/src/lib/download-fns/download-readable-netlist.ts +0 -12
  665. package/src/lib/download-fns/download-schematic-svg.ts +0 -12
  666. package/src/lib/download-fns/download-simple-route-json.ts +0 -17
  667. package/src/lib/download-fns/download-spice-file.ts +0 -13
  668. package/src/lib/download-fns/download-step.ts +0 -12
  669. package/src/lib/encodeFsMapToUrlHash.ts +0 -13
  670. package/src/lib/encodeTextToUrlHash.ts +0 -17
  671. package/src/lib/get-snippet-template.ts +0 -26
  672. package/src/lib/getLicenseFromLicenseContent.ts +0 -67
  673. package/src/lib/handleManualEditsImport.tsx +0 -65
  674. package/src/lib/handleManualEditsImportWithSupportForMultipleFiles.ts +0 -67
  675. package/src/lib/normalize-svg-for-tile.ts +0 -50
  676. package/src/lib/populate-query-cache-with-ssr-data.ts +0 -53
  677. package/src/lib/posthog.ts +0 -17
  678. package/src/lib/react-query-api-failure-tracking.ts +0 -148
  679. package/src/lib/sentry.ts +0 -14
  680. package/src/lib/templates/blank-3d-model-template.ts +0 -12
  681. package/src/lib/templates/blank-circuit-board-template.ts +0 -20
  682. package/src/lib/templates/blank-footprint-template.ts +0 -29
  683. package/src/lib/templates/blank-package-template.ts +0 -21
  684. package/src/lib/templates/blinking-led-board-template.ts +0 -64
  685. package/src/lib/templates/usb-c-led-flashlight-template.ts +0 -22
  686. package/src/lib/ts-lib-cache.ts +0 -162
  687. package/src/lib/types.ts +0 -31
  688. package/src/lib/utils/checkIfManualEditsImported.ts +0 -20
  689. package/src/lib/utils/findTargetFile.ts +0 -97
  690. package/src/lib/utils/formatTimeAgo.ts +0 -10
  691. package/src/lib/utils/getPackagePreviewImageUrl.ts +0 -15
  692. package/src/lib/utils/index.ts +0 -6
  693. package/src/lib/utils/isComponentExported.ts +0 -10
  694. package/src/lib/utils/isUuid.ts +0 -5
  695. package/src/lib/utils/isValidFileName.ts +0 -17
  696. package/src/lib/utils/load-prettier.ts +0 -23
  697. package/src/lib/utils/member-role.tsx +0 -61
  698. package/src/lib/utils/package-utils.ts +0 -7
  699. package/src/lib/utils/parseJsonOrNull.ts +0 -8
  700. package/src/lib/utils/pcbManualEditEventHandler.ts +0 -156
  701. package/src/lib/utils/resolveRelativePath.ts +0 -40
  702. package/src/lib/utils/timeAgo.ts +0 -20
  703. package/src/lib/utils/toastManualEditConflicts.tsx +0 -39
  704. package/src/lib/utils/transformFilesToTreeData.tsx +0 -195
  705. package/src/main.tsx +0 -15
  706. package/src/pages/404.tsx +0 -23
  707. package/src/pages/authorize.tsx +0 -208
  708. package/src/pages/create-organization.tsx +0 -169
  709. package/src/pages/dashboard.tsx +0 -254
  710. package/src/pages/datasheet.tsx +0 -198
  711. package/src/pages/datasheets.tsx +0 -148
  712. package/src/pages/dev-login.tsx +0 -68
  713. package/src/pages/editor.tsx +0 -54
  714. package/src/pages/landing.tsx +0 -237
  715. package/src/pages/latest.tsx +0 -145
  716. package/src/pages/my-orders.tsx +0 -54
  717. package/src/pages/organization-profile.tsx +0 -197
  718. package/src/pages/organization-settings.tsx +0 -571
  719. package/src/pages/package-editor.tsx +0 -60
  720. package/src/pages/preview-release.tsx +0 -209
  721. package/src/pages/quickstart.tsx +0 -258
  722. package/src/pages/release-builds.tsx +0 -99
  723. package/src/pages/release-detail.tsx +0 -211
  724. package/src/pages/releases.tsx +0 -55
  725. package/src/pages/search.tsx +0 -288
  726. package/src/pages/settings-redirect.tsx +0 -44
  727. package/src/pages/trending.tsx +0 -201
  728. package/src/pages/user-profile.tsx +0 -330
  729. package/src/pages/user-settings.tsx +0 -161
  730. package/src/pages/view-package.tsx +0 -90
  731. package/src/types/package.ts +0 -4
  732. package/src/vite-env.d.ts +0 -1
  733. package/tailwind.config.js +0 -47
  734. package/tsconfig.json +0 -30
  735. package/vercel.json +0 -50
  736. package/vite.config.ts +0 -236
  737. package/winterspec.config.ts +0 -6
@@ -1,1857 +0,0 @@
1
- import { randomUUID } from "node:crypto"
2
- import type { z } from "zod"
3
- import { hoist } from "zustand-hoist"
4
- import { createStore } from "zustand/vanilla"
5
-
6
- import { combine } from "zustand/middleware"
7
- import {
8
- type Account,
9
- type AccountPackage,
10
- type JlcpcbOrderState,
11
- type JlcpcbOrderStepRun,
12
- type LoginPage,
13
- type Order,
14
- type OrderFile,
15
- OrderQuote,
16
- type BugReport,
17
- bugReportSchema,
18
- type BugReportFile,
19
- bugReportFileSchema,
20
- type Package,
21
- type PackageFile,
22
- type PackageRelease,
23
- packageReleaseSchema,
24
- type PackageBuild,
25
- packageBuildSchema,
26
- type AiReview,
27
- aiReviewSchema,
28
- type Datasheet,
29
- datasheetSchema,
30
- type Session,
31
- type Snippet,
32
- databaseSchema,
33
- type packageSchema,
34
- type snippetSchema,
35
- Organization,
36
- OrgAccount,
37
- } from "./schema.ts"
38
- import { seed as seedFn } from "./seed"
39
- import { generateFsSha } from "../package_file/generate-fs-sha"
40
-
41
- export const createDatabase = ({ seed }: { seed?: boolean } = {}) => {
42
- const db = hoist(createStore(initializer))
43
- if (seed) {
44
- seedFn(db)
45
- }
46
- return db
47
- }
48
-
49
- export type DbClient = ReturnType<typeof createDatabase>
50
-
51
- const initializer = combine(databaseSchema.parse({}), (set, get) => ({
52
- addOrder: (order: Omit<Order, "order_id">): Order => {
53
- const newOrder = { order_id: `order_${get().idCounter + 1}`, ...order }
54
- set((state) => {
55
- return {
56
- orders: [...state.orders, newOrder],
57
- idCounter: state.idCounter + 1,
58
- }
59
- })
60
- return newOrder
61
- },
62
- getOrderById: (orderId: string): Order | undefined => {
63
- const state = get()
64
- return state.orders.find((order) => order.order_id === orderId)
65
- },
66
- getOrderFilesByOrderId: (orderId: string): OrderFile[] => {
67
- const state = get()
68
- return state.orderFiles.filter((file) => file.order_id === orderId)
69
- },
70
- addOrderQuote: ({
71
- account_id,
72
- package_release_id,
73
- vendor_name,
74
- }: {
75
- account_id: string
76
- package_release_id?: string
77
- vendor_name: string
78
- }): string => {
79
- // Details for the order quote will be updated by the job with the cost
80
- const newOrderQuote = {
81
- order_quote_id: `order_quote_${get().idCounter + 1}`,
82
- account_id,
83
- package_release_id: package_release_id ?? null,
84
- created_at: new Date().toISOString(),
85
- updated_at: new Date().toISOString(),
86
- completed_at: null,
87
- error: null,
88
- has_error: false,
89
- is_completed: false,
90
- is_processing: true,
91
- vendor_name,
92
- quoted_components: [],
93
- bare_pcb_cost: 0,
94
- shipping_options: [],
95
- total_cost_without_shipping: 0,
96
- }
97
- set((state) => {
98
- return {
99
- orderQuotes: [...state.orderQuotes, newOrderQuote],
100
- idCounter: state.idCounter + 1,
101
- }
102
- })
103
- return newOrderQuote.order_quote_id
104
- },
105
- getOrderQuoteById: (orderQuoteId: string): OrderQuote | undefined => {
106
- const state = get()
107
- return state.orderQuotes.find(
108
- (quote) => quote.order_quote_id === orderQuoteId,
109
- )
110
- },
111
- getJlcpcbOrderStatesByOrderId: (
112
- orderId: string,
113
- ): JlcpcbOrderState | undefined => {
114
- const state = get()
115
- return state.jlcpcbOrderState.find((state) => state.order_id === orderId)
116
- },
117
- getJlcpcbOrderStepRunsByJlcpcbOrderStateId: (
118
- jlcpcbOrderStateId: string,
119
- ): JlcpcbOrderStepRun[] => {
120
- const state = get()
121
- return state.jlcpcbOrderStepRuns
122
- .filter((stepRun) => {
123
- const orderState = state.jlcpcbOrderState.find(
124
- (state) =>
125
- state.jlcpcb_order_state_id === stepRun.jlcpcb_order_state_id,
126
- )
127
- return orderState?.order_id === jlcpcbOrderStateId
128
- })
129
- .sort(
130
- (a, b) =>
131
- new Date(a.created_at).getTime() - new Date(b.created_at).getTime(),
132
- )
133
- },
134
- updateOrder: (orderId: string, updates: Partial<Order>) => {
135
- set((state) => ({
136
- orders: state.orders.map((order) =>
137
- order.order_id === orderId ? { ...order, ...updates } : order,
138
- ),
139
- }))
140
- },
141
- addJlcpcbOrderState: (
142
- orderState: Omit<JlcpcbOrderState, "jlcpcb_order_state_id">,
143
- ): JlcpcbOrderState => {
144
- const newOrderState = {
145
- jlcpcb_order_state_id: `order_state_${get().idCounter + 1}`,
146
- ...orderState,
147
- }
148
- set((state) => {
149
- return {
150
- jlcpcbOrderState: [...state.jlcpcbOrderState, newOrderState],
151
- idCounter: state.idCounter + 1,
152
- }
153
- })
154
- return newOrderState
155
- },
156
- updateJlcpcbOrderState: (
157
- orderId: string,
158
- updates: Partial<JlcpcbOrderState>,
159
- ) => {
160
- set((state) => ({
161
- jlcpcbOrderState: state.jlcpcbOrderState.map((orderState) =>
162
- orderState.order_id === orderId
163
- ? { ...orderState, ...updates }
164
- : orderState,
165
- ),
166
- }))
167
- },
168
- addOrderFile: (orderFile: Omit<OrderFile, "order_file_id">): OrderFile => {
169
- const newOrderFile = {
170
- order_file_id: `order_file_${get().idCounter + 1}`,
171
- ...orderFile,
172
- }
173
- set((state) => {
174
- return {
175
- orderFiles: [...state.orderFiles, newOrderFile],
176
- idCounter: state.idCounter + 1,
177
- }
178
- })
179
- return newOrderFile
180
- },
181
- getOrderFileById: (orderFileId: string): OrderFile | undefined => {
182
- const state = get()
183
- return state.orderFiles.find((file) => file.order_file_id === orderFileId)
184
- },
185
- addBugReport: ({
186
- reporter_account_id,
187
- text,
188
- is_auto_deleted,
189
- delete_at,
190
- }: {
191
- reporter_account_id: string
192
- text?: string | null
193
- is_auto_deleted?: boolean
194
- delete_at?: string | null
195
- }): BugReport => {
196
- const normalizedIsAutoDeleted = Boolean(is_auto_deleted)
197
- if (normalizedIsAutoDeleted && !delete_at) {
198
- throw new Error("delete_at is required when is_auto_deleted is true")
199
- }
200
- const normalizedDeleteAt = normalizedIsAutoDeleted
201
- ? (delete_at ?? null)
202
- : null
203
-
204
- const bugReport = bugReportSchema.parse({
205
- bug_report_id: randomUUID(),
206
- reporter_account_id,
207
- text: text ?? null,
208
- is_auto_deleted: normalizedIsAutoDeleted,
209
- delete_at: normalizedDeleteAt,
210
- created_at: new Date().toISOString(),
211
- file_count: 0,
212
- })
213
-
214
- set((state) => ({
215
- bugReports: [...state.bugReports, bugReport],
216
- }))
217
-
218
- return bugReport
219
- },
220
- getBugReportById: (bugReportId: string): BugReport | undefined => {
221
- const state = get()
222
- return state.bugReports.find(
223
- (bugReport) => bugReport.bug_report_id === bugReportId,
224
- )
225
- },
226
- addBugReportFile: ({
227
- bug_report_id,
228
- file_path,
229
- content_mimetype,
230
- is_text,
231
- content_text,
232
- content_bytes,
233
- }: {
234
- bug_report_id: string
235
- file_path: string
236
- content_mimetype: string
237
- is_text: boolean
238
- content_text: string | null
239
- content_bytes: Uint8Array | null
240
- }): BugReportFile => {
241
- const bugReportFile = bugReportFileSchema.parse({
242
- bug_report_file_id: randomUUID(),
243
- bug_report_id,
244
- file_path,
245
- content_mimetype,
246
- is_text,
247
- created_at: new Date().toISOString(),
248
- content_text,
249
- content_bytes,
250
- })
251
-
252
- set((state) => ({
253
- bugReportFiles: [...state.bugReportFiles, bugReportFile],
254
- bugReports: state.bugReports.map((bugReport) =>
255
- bugReport.bug_report_id === bug_report_id
256
- ? { ...bugReport, file_count: bugReport.file_count + 1 }
257
- : bugReport,
258
- ),
259
- }))
260
-
261
- return bugReportFile
262
- },
263
- getBugReportFilesByBugReportId: (bugReportId: string): BugReportFile[] => {
264
- const state = get()
265
- return state.bugReportFiles.filter(
266
- (file) => file.bug_report_id === bugReportId,
267
- )
268
- },
269
- addAccount: (
270
- account: Omit<Account, "account_id" | "is_tscircuit_staff"> &
271
- Partial<Pick<Account, "account_id" | "is_tscircuit_staff">>,
272
- ) => {
273
- const newAccount = {
274
- account_id: account.account_id || `account_${get().idCounter + 1}`,
275
- ...account,
276
- is_tscircuit_staff: Boolean(account.is_tscircuit_staff),
277
- }
278
-
279
- set((state) => {
280
- return {
281
- accounts: [...state.accounts, newAccount],
282
- idCounter: state.idCounter + 1,
283
- }
284
- })
285
-
286
- return newAccount
287
- },
288
- addAccountPackage: (
289
- accountPackage: Omit<AccountPackage, "account_package_id">,
290
- ): AccountPackage => {
291
- const newAccountPackage = {
292
- account_package_id: `ap_${get().idCounter + 1}`,
293
- ...accountPackage,
294
- }
295
- set((state) => {
296
- return {
297
- accountPackages: [...state.accountPackages, newAccountPackage],
298
- idCounter: state.idCounter + 1,
299
- }
300
- })
301
- return newAccountPackage
302
- },
303
- getAccountPackageById: (
304
- accountPackageId: string,
305
- ): AccountPackage | undefined => {
306
- const state = get()
307
- return state.accountPackages.find(
308
- (ap) => ap.account_package_id === accountPackageId,
309
- )
310
- },
311
- updateAccountPackage: (
312
- accountPackageId: string,
313
- updates: Partial<AccountPackage>,
314
- ): void => {
315
- set((state) => ({
316
- accountPackages: state.accountPackages.map((ap) =>
317
- ap.account_package_id === accountPackageId ? { ...ap, ...updates } : ap,
318
- ),
319
- }))
320
- },
321
- deleteAccountPackage: (accountPackageId: string): boolean => {
322
- let deleted = false
323
- set((state) => {
324
- const index = state.accountPackages.findIndex(
325
- (ap) => ap.account_package_id === accountPackageId,
326
- )
327
- if (index !== -1) {
328
- state.accountPackages.splice(index, 1)
329
- deleted = true
330
- }
331
- return state
332
- })
333
- return deleted
334
- },
335
- addSnippet: (
336
- snippet: Omit<
337
- z.input<typeof snippetSchema>,
338
- "snippet_id" | "package_release_id"
339
- > & {
340
- creator_account_id?: string
341
- github_repo_full_name?: string
342
- branch_name?: string
343
- commit_message?: string
344
- commit_author?: string
345
- },
346
- ): Snippet => {
347
- const timestamp = Date.now()
348
- const currentTime = new Date(timestamp).toISOString()
349
-
350
- const newState = get()
351
- const nextId = newState.idCounter + 1
352
-
353
- // Create the package that will serve as our snippet
354
- const newPackage = {
355
- package_id: `pkg_${nextId}`,
356
- creator_account_id: snippet.creator_account_id ?? snippet.owner_name, // Using owner_name as account_id since we don't have context
357
- owner_org_id: "", // Empty string instead of null to match type
358
- owner_github_username: snippet.owner_name,
359
- is_source_from_github: false,
360
- description: snippet.description || "",
361
- name: `${snippet.owner_name}/${snippet.unscoped_name}`,
362
- unscoped_name: snippet.unscoped_name,
363
- latest_version: "0.0.1",
364
- license: null,
365
- website: null,
366
- star_count: 0,
367
- created_at: currentTime,
368
- updated_at: currentTime,
369
- github_repo_full_name: snippet.github_repo_full_name || null,
370
- ai_description: "placeholder ai description",
371
- ai_usage_instructions: "placeholder ai usage instructions",
372
- is_snippet: true,
373
- is_board: snippet.snippet_type === "board",
374
- is_package: snippet.snippet_type === "package",
375
- is_model: snippet.snippet_type === "model",
376
- is_footprint: snippet.snippet_type === "footprint",
377
- snippet_type: snippet.snippet_type,
378
- is_private: false,
379
- is_public: true,
380
- is_unlisted: false,
381
- latest_package_release_id: `package_release_${nextId}`,
382
- latest_package_release_fs_sha: null,
383
- }
384
-
385
- // Create package release
386
- const newPackageRelease = packageReleaseSchema.parse({
387
- package_release_id: `package_release_${nextId}`,
388
- package_id: newPackage.package_id,
389
- version: "0.0.1",
390
- is_latest: true,
391
- is_locked: false,
392
- created_at: currentTime,
393
- updated_at: currentTime,
394
- branch_name: snippet.branch_name,
395
- commit_message: snippet.commit_message,
396
- commit_author: snippet.commit_author,
397
- has_transpiled: true,
398
- transpilation_error: null,
399
- ...(snippet.name == "testuser/my-test-board"
400
- ? { is_pr_preview: true, github_pr_number: 69 }
401
- : {}),
402
- })
403
-
404
- // Add all the files
405
- const packageFiles: PackageFile[] = []
406
- let fileIdCounter = nextId
407
-
408
- // Add main code file
409
- packageFiles.push({
410
- package_file_id: `package_file_${fileIdCounter++}`,
411
- package_release_id: newPackageRelease.package_release_id,
412
- file_path: "index.tsx",
413
- content_text: snippet.code || "",
414
- created_at: currentTime,
415
- })
416
-
417
- // Add DTS file if provided
418
- if (snippet.dts) {
419
- packageFiles.push({
420
- package_file_id: `package_file_${fileIdCounter++}`,
421
- package_release_id: newPackageRelease.package_release_id,
422
- file_path: "/dist/index.d.ts",
423
- content_text: snippet.dts,
424
- created_at: currentTime,
425
- })
426
- }
427
-
428
- // Add compiled JS if provided
429
- if (snippet.compiled_js) {
430
- packageFiles.push({
431
- package_file_id: `package_file_${fileIdCounter++}`,
432
- package_release_id: newPackageRelease.package_release_id,
433
- file_path: "/dist/index.js",
434
- content_text: snippet.compiled_js,
435
- created_at: currentTime,
436
- })
437
- }
438
-
439
- // Add circuit JSON if provided
440
- if (snippet.circuit_json && snippet.circuit_json.length > 0) {
441
- packageFiles.push({
442
- package_file_id: `package_file_${fileIdCounter++}`,
443
- package_release_id: newPackageRelease.package_release_id,
444
- file_path: "/dist/circuit.json",
445
- content_text: JSON.stringify(snippet.circuit_json),
446
- created_at: currentTime,
447
- })
448
- }
449
-
450
- // Update the database state atomically
451
- set((state) => ({
452
- ...state,
453
- packages: [...state.packages, newPackage],
454
- packageReleases: [...state.packageReleases, newPackageRelease],
455
- packageFiles: [...state.packageFiles, ...packageFiles],
456
- idCounter: fileIdCounter,
457
- }))
458
-
459
- // Update fs_sha for the new package release
460
- const dbState = get()
461
- const releaseFiles = dbState.packageFiles.filter(
462
- (pf) => pf.package_release_id === newPackageRelease.package_release_id,
463
- )
464
- const fsSha = generateFsSha(releaseFiles)
465
-
466
- set((state) => ({
467
- ...state,
468
- packageReleases: state.packageReleases.map((pr) =>
469
- pr.package_release_id === newPackageRelease.package_release_id
470
- ? { ...pr, fs_sha: fsSha }
471
- : pr,
472
- ),
473
- packages: state.packages.map((pkg) =>
474
- pkg.latest_package_release_id === newPackageRelease.package_release_id
475
- ? { ...pkg, latest_package_release_fs_sha: fsSha }
476
- : pkg,
477
- ),
478
- }))
479
-
480
- // Return in the same format as create endpoint
481
- return {
482
- snippet_id: newPackage.package_id,
483
- package_release_id: newPackageRelease.package_release_id,
484
- name: newPackage.name,
485
- unscoped_name: newPackage.unscoped_name,
486
- owner_name: snippet.owner_name,
487
- code: snippet.code || "",
488
- dts: snippet.dts,
489
- compiled_js: snippet.compiled_js,
490
- star_count: 0,
491
- created_at: currentTime,
492
- updated_at: currentTime,
493
- snippet_type: snippet.snippet_type,
494
- circuit_json: snippet.circuit_json || [],
495
- description: snippet.description || "",
496
- is_starred: false,
497
- version: "0.0.1",
498
- is_private: false,
499
- is_public: true,
500
- is_unlisted: false,
501
- }
502
- },
503
- getLatestSnippets: (limit: number): Snippet[] => {
504
- const state = get()
505
-
506
- // Get all packages that are snippets
507
- const snippetPackages = state.packages
508
- .filter((pkg) => pkg.is_snippet === true)
509
- .map((pkg) => {
510
- // Get the package release
511
- const packageRelease = state.packageReleases.find(
512
- (pr) =>
513
- pr.package_release_id === pkg.latest_package_release_id &&
514
- pr.is_latest === true,
515
- )
516
- if (!packageRelease) return null
517
-
518
- // Get the package files
519
- const packageFiles = state.packageFiles.filter(
520
- (file) =>
521
- file.package_release_id === packageRelease.package_release_id,
522
- )
523
-
524
- // Get the code file
525
- const codeFile = packageFiles.find(
526
- (file) =>
527
- file.file_path === "index.ts" || file.file_path === "index.tsx",
528
- )
529
-
530
- // Check if starred
531
- const isStarred = state.accountPackages.some(
532
- (ap) => ap.package_id === pkg.package_id && ap.is_starred,
533
- )
534
-
535
- // Convert to snippet format
536
- return {
537
- snippet_id: pkg.package_id,
538
- package_release_id: pkg.latest_package_release_id || "",
539
- unscoped_name: pkg.unscoped_name,
540
- name: pkg.name,
541
- owner_name: pkg.owner_github_username || "",
542
- description: pkg.description || "",
543
- snippet_type: pkg.snippet_type || "board",
544
- code: codeFile?.content_text || "",
545
- dts:
546
- packageFiles.find((file) => file.file_path === "/dist/index.d.ts")
547
- ?.content_text || "",
548
- compiled_js:
549
- packageFiles.find((file) => file.file_path === "/dist/index.js")
550
- ?.content_text || "",
551
- created_at: pkg.created_at,
552
- updated_at: pkg.updated_at,
553
- star_count: pkg.star_count || 0,
554
- is_starred: isStarred,
555
- version: pkg.latest_version || "0.0.1",
556
- circuit_json:
557
- packageFiles
558
- .filter((file) => file.file_path === "/dist/circuit.json")
559
- .flatMap((file) => JSON.parse(file.content_text || "[]")) || [],
560
- is_private: pkg.is_private || false,
561
- is_public: pkg.is_public || true,
562
- is_unlisted: pkg.is_unlisted || false,
563
- }
564
- })
565
- .filter(
566
- (snippet): snippet is NonNullable<typeof snippet> => snippet !== null,
567
- )
568
- .map((snippet) => ({
569
- ...snippet,
570
- description: snippet.description || "",
571
- }))
572
- .sort(
573
- (a, b) =>
574
- new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),
575
- )
576
- .slice(0, limit)
577
-
578
- return snippetPackages
579
- },
580
- getTrendingSnippets: (limit: number, since: string): Snippet[] => {
581
- const state = get()
582
- const sinceDate = new Date(since).getTime()
583
-
584
- // Get star counts within time period
585
- const recentStars = new Map<string, number>()
586
- state.accountPackages.forEach((ap) => {
587
- if (ap.is_starred && new Date(ap.created_at).getTime() >= sinceDate) {
588
- recentStars.set(
589
- ap.package_id,
590
- (recentStars.get(ap.package_id) || 0) + 1,
591
- )
592
- }
593
- })
594
-
595
- const packagesWithStarCount = [...state.packages]
596
- .map((pkg) => ({
597
- ...pkg,
598
- star_count: recentStars.get(pkg.package_id) || 0,
599
- }))
600
- .sort((a, b) => b.star_count - a.star_count)
601
- .slice(0, limit)
602
-
603
- const trendingSnippets = packagesWithStarCount
604
- .map((pkg) => {
605
- const packageRelease = state.packageReleases.find(
606
- (pr) =>
607
- pr.package_release_id === pkg.latest_package_release_id &&
608
- pr.is_latest === true,
609
- )
610
- if (!packageRelease) return null
611
-
612
- const packageFiles = state.packageFiles.filter(
613
- (file) =>
614
- file.package_release_id === packageRelease.package_release_id,
615
- )
616
-
617
- const codeFile = packageFiles.find(
618
- (file) =>
619
- file.file_path === "index.ts" || file.file_path === "index.tsx",
620
- )
621
-
622
- return {
623
- snippet_id: pkg.package_id,
624
- package_release_id: pkg.latest_package_release_id || "",
625
- unscoped_name: pkg.unscoped_name,
626
- name: pkg.name,
627
- owner_name: pkg.owner_github_username || "",
628
- code: codeFile ? codeFile.content_text || "" : "",
629
- created_at: pkg.created_at,
630
- updated_at: pkg.updated_at,
631
- snippet_type: pkg.is_snippet ? "board" : "package",
632
- star_count: pkg.star_count,
633
- }
634
- })
635
- .filter((snippet) => snippet !== null)
636
-
637
- return trendingSnippets as Snippet[]
638
- },
639
- getPackagesByAuthor: (authorName?: string): Package[] => {
640
- const state = get()
641
- const packages = authorName
642
- ? state.packages.filter((pkg) => pkg.owner_github_username === authorName)
643
- : state.packages
644
- return packages.map((pkg) => ({
645
- ...pkg,
646
- star_count: state.accountPackages.filter(
647
- (ap) => ap.package_id === pkg.package_id && ap.is_starred,
648
- ).length,
649
- }))
650
- },
651
- getSnippetByAuthorAndName: (
652
- authorName: string,
653
- snippetName: string,
654
- ): Snippet | undefined => {
655
- const state = get()
656
- // Look for the package that represents this snippet with case-insensitive matching
657
- const _package = state.packages.find(
658
- (pkg) =>
659
- pkg.owner_github_username?.toLowerCase() === authorName.toLowerCase() &&
660
- pkg.name.toLowerCase() === snippetName.toLowerCase() &&
661
- pkg.is_snippet === true,
662
- )
663
- if (!_package) return undefined
664
-
665
- // Get the package release
666
- const packageRelease = state.packageReleases.find(
667
- (pr) =>
668
- pr.package_release_id === _package.latest_package_release_id &&
669
- pr.is_latest === true,
670
- )
671
- if (!packageRelease) return undefined
672
-
673
- // Get the package files
674
- const packageFiles = state.packageFiles.filter(
675
- (file) => file.package_release_id === packageRelease.package_release_id,
676
- )
677
-
678
- // Get the code file (index.ts or index.tsx)
679
- const codeFile = packageFiles.find(
680
- (file) => file.file_path === "index.ts" || file.file_path === "index.tsx",
681
- )
682
-
683
- // Map the package data to match the Snippet structure
684
- return {
685
- snippet_id: _package.package_id,
686
- package_release_id: _package.latest_package_release_id || "",
687
- unscoped_name: _package.unscoped_name,
688
- name: _package.name,
689
- owner_name: _package.owner_github_username || "",
690
- description: _package.description || "",
691
- snippet_type: _package.snippet_type || "board",
692
- code: codeFile?.content_text || "",
693
- dts:
694
- packageFiles.find((file) => file.file_path === "/dist/index.d.ts")
695
- ?.content_text || "",
696
- compiled_js:
697
- packageFiles.find((file) => file.file_path === "/dist/index.js")
698
- ?.content_text || "",
699
- created_at: _package.created_at,
700
- updated_at: _package.updated_at,
701
- star_count: _package.star_count || 0,
702
- is_starred: false,
703
- version: _package.latest_version || "0.0.1",
704
- circuit_json: packageFiles.find(
705
- (file) => file.file_path === "/dist/circuit.json",
706
- )?.content_text
707
- ? JSON.parse(
708
- packageFiles.find((file) => file.file_path === "/dist/circuit.json")
709
- ?.content_text || "[]",
710
- )
711
- : [],
712
- is_private: _package.is_private || false,
713
- is_public: _package.is_public || true,
714
- is_unlisted: _package.is_unlisted || false,
715
- }
716
- },
717
- updateSnippet: (
718
- snippetId: string,
719
- updates: Partial<Snippet>,
720
- ): Snippet | undefined => {
721
- set((state) => {
722
- const packageIndex = state.packages.findIndex(
723
- (pkg) => pkg.package_id === snippetId && pkg.is_snippet === true,
724
- )
725
- if (packageIndex === -1) {
726
- return state
727
- }
728
-
729
- const timestamp = Date.now()
730
- const currentTime = new Date(timestamp).toISOString()
731
-
732
- // Update the package
733
- const updatedPackages = [...state.packages]
734
- const currentPackage = updatedPackages[packageIndex]
735
- updatedPackages[packageIndex] = {
736
- ...currentPackage,
737
- description: updates.description ?? currentPackage.description,
738
- is_private: updates.is_private ?? currentPackage.is_private,
739
- is_public:
740
- updates.is_private !== undefined
741
- ? !updates.is_private
742
- : currentPackage.is_public,
743
- is_unlisted: updates.is_private
744
- ? true
745
- : (updates.is_unlisted ?? currentPackage.is_unlisted),
746
- updated_at: currentTime,
747
- }
748
-
749
- // Get the current package release
750
- const packageRelease = state.packageReleases.find(
751
- (pr) =>
752
- pr.package_release_id === currentPackage.latest_package_release_id,
753
- )
754
- if (!packageRelease) return state
755
-
756
- // Update package files if code/dts/js changed
757
- const updatedFiles = [...state.packageFiles]
758
- const packageFiles = updatedFiles.filter(
759
- (file) => file.package_release_id === packageRelease.package_release_id,
760
- )
761
-
762
- if (updates.code !== undefined) {
763
- const codeFileIndex = packageFiles.findIndex(
764
- (file) =>
765
- file.file_path === "index.tsx" || file.file_path === "index.ts",
766
- )
767
- if (codeFileIndex >= 0) {
768
- updatedFiles[codeFileIndex] = {
769
- ...packageFiles[codeFileIndex],
770
- content_text: updates.code,
771
- created_at: currentTime,
772
- }
773
- } else {
774
- updatedFiles.push({
775
- package_file_id: `package_file_${timestamp}`,
776
- package_release_id: packageRelease.package_release_id,
777
- file_path: "index.tsx",
778
- content_text: updates.code,
779
- created_at: currentTime,
780
- })
781
- }
782
- }
783
-
784
- if (updates.dts !== undefined) {
785
- const dtsFileIndex = packageFiles.findIndex(
786
- (file) => file.file_path === "/dist/index.d.ts",
787
- )
788
- if (dtsFileIndex >= 0) {
789
- updatedFiles[dtsFileIndex] = {
790
- ...packageFiles[dtsFileIndex],
791
- content_text: updates.dts,
792
- created_at: currentTime,
793
- }
794
- } else {
795
- updatedFiles.push({
796
- package_file_id: `package_file_${timestamp}`,
797
- package_release_id: packageRelease.package_release_id,
798
- file_path: "/dist/index.d.ts",
799
- content_text: updates.dts,
800
- created_at: currentTime,
801
- })
802
- }
803
- }
804
-
805
- if (updates.compiled_js !== undefined) {
806
- const jsFileIndex = packageFiles.findIndex(
807
- (file) => file.file_path === "/dist/index.js",
808
- )
809
- if (jsFileIndex >= 0) {
810
- updatedFiles[jsFileIndex] = {
811
- ...packageFiles[jsFileIndex],
812
- content_text: updates.compiled_js,
813
- created_at: currentTime,
814
- }
815
- } else {
816
- updatedFiles.push({
817
- package_file_id: `package_file_${timestamp}`,
818
- package_release_id: packageRelease.package_release_id,
819
- file_path: "/dist/index.js",
820
- content_text: updates.compiled_js,
821
- created_at: currentTime,
822
- })
823
- }
824
- }
825
-
826
- // Update circuit JSON if provided
827
- if (updates.circuit_json !== undefined) {
828
- const circuitFileIndex = packageFiles.findIndex(
829
- (file) => file.file_path === "/dist/circuit.json",
830
- )
831
- if (circuitFileIndex >= 0) {
832
- updatedFiles[circuitFileIndex] = {
833
- ...packageFiles[circuitFileIndex],
834
- content_text: JSON.stringify(updates.circuit_json),
835
- created_at: new Date().toISOString(),
836
- }
837
- }
838
- }
839
-
840
- // Return updated state
841
- return {
842
- ...state,
843
- packages: updatedPackages,
844
- packageFiles: updatedFiles,
845
- }
846
- })
847
-
848
- // Get the updated snippet to return
849
- const updatedPackage = get().packages.find(
850
- (pkg) => pkg.package_id === snippetId,
851
- )
852
- if (!updatedPackage) return undefined
853
-
854
- const packageRelease = get().packageReleases.find(
855
- (pr) =>
856
- pr.package_release_id === updatedPackage.latest_package_release_id,
857
- )
858
- if (!packageRelease) return undefined
859
-
860
- const packageFiles = get().packageFiles.filter(
861
- (file) => file.package_release_id === packageRelease.package_release_id,
862
- )
863
-
864
- const codeFile = packageFiles.find(
865
- (file) => file.file_path === "index.ts" || file.file_path === "index.tsx",
866
- )
867
- const dtsFile = packageFiles.find(
868
- (file) => file.file_path === "/dist/index.d.ts",
869
- )
870
- const jsFile = packageFiles.find(
871
- (file) => file.file_path === "/dist/index.js",
872
- )
873
- const circuitFile = packageFiles.find(
874
- (file) => file.file_path === "/dist/circuit.json",
875
- )
876
-
877
- // Return in snippet format
878
- return {
879
- snippet_id: updatedPackage.package_id,
880
- package_release_id: updatedPackage.latest_package_release_id || "",
881
- unscoped_name: updatedPackage.unscoped_name,
882
- name: updatedPackage.name,
883
- owner_name: updatedPackage.owner_github_username || "",
884
- description: updatedPackage.description || "",
885
- snippet_type: updatedPackage.snippet_type || "board",
886
- code: codeFile?.content_text || "",
887
- dts: dtsFile?.content_text || "",
888
- compiled_js: jsFile?.content_text || "",
889
- created_at: updatedPackage.created_at,
890
- updated_at: updatedPackage.updated_at,
891
- star_count: updatedPackage.star_count || 0,
892
- is_starred: false,
893
- version: updatedPackage.latest_version || "0.0.1",
894
- circuit_json: circuitFile
895
- ? JSON.parse(circuitFile.content_text || "[]")
896
- : [],
897
- is_private: updatedPackage.is_private ?? false,
898
- is_public: updatedPackage.is_public ?? true,
899
- is_unlisted: updatedPackage.is_unlisted ?? false,
900
- }
901
- },
902
- getSnippetById: (
903
- snippetId: string,
904
- auth?: { github_username: string },
905
- ): Snippet | undefined => {
906
- const state = get()
907
- // Look for the package that represents this snippet
908
- const _package = state.packages.find(
909
- (pkg) => pkg.package_id === snippetId && pkg.is_snippet === true,
910
- )
911
- if (!_package) return undefined
912
-
913
- // Handle visibility based on authentication
914
- if (!auth) {
915
- // Unauthenticated users can only see public and non-unlisted packages
916
- if (!_package.is_public || _package.is_unlisted) {
917
- return undefined
918
- }
919
- } else {
920
- // Authenticated users can see:
921
- // 1. Public and non-unlisted packages
922
- // 2. Their own unlisted packages
923
- // 3. Their own private packages
924
- const isOwnPackage =
925
- _package.owner_github_username === auth?.github_username
926
- const isPublicAndNotUnlisted = _package.is_public && !_package.is_unlisted
927
- const isOwnUnlisted = _package.is_unlisted && isOwnPackage
928
- const isOwnPrivate = _package.is_private && isOwnPackage
929
-
930
- if (!isPublicAndNotUnlisted && !isOwnUnlisted && !isOwnPrivate) {
931
- return undefined
932
- }
933
- }
934
-
935
- // Get the package release
936
- const packageRelease = state.packageReleases.find(
937
- (pr) =>
938
- pr.package_release_id === _package.latest_package_release_id &&
939
- pr.is_latest === true,
940
- )
941
- if (!packageRelease) return undefined
942
-
943
- // Get the package files
944
- const packageFiles = state.packageFiles.filter(
945
- (file) => file.package_release_id === packageRelease.package_release_id,
946
- )
947
-
948
- // Get the code file (index.ts or index.tsx)
949
- const codeFile = packageFiles.find(
950
- (file) => file.file_path === "index.ts" || file.file_path === "index.tsx",
951
- )
952
-
953
- // Check if the current user has starred this snippet
954
- const isStarred = state.accountPackages.some(
955
- (ap) => ap.package_id === snippetId && ap.is_starred,
956
- )
957
-
958
- // Map the package data to match the Snippet structure
959
- return {
960
- snippet_id: _package.package_id,
961
- package_release_id: _package.latest_package_release_id || "",
962
- unscoped_name: _package.unscoped_name,
963
- name: _package.name,
964
- owner_name: _package.owner_github_username || "",
965
- description: _package.description || "",
966
- snippet_type: _package.snippet_type || "board",
967
- code: codeFile?.content_text || "",
968
- dts:
969
- packageFiles.find((file) => file.file_path === "/dist/index.d.ts")
970
- ?.content_text || "",
971
- compiled_js:
972
- packageFiles.find((file) => file.file_path === "/dist/index.js")
973
- ?.content_text || "",
974
- created_at: _package.created_at,
975
- updated_at: _package.updated_at,
976
- star_count: _package.star_count || 0,
977
- is_starred: isStarred,
978
- version: _package.latest_version || "0.0.1",
979
- circuit_json: packageFiles.find(
980
- (file) => file.file_path === "/dist/circuit.json",
981
- )?.content_text
982
- ? JSON.parse(
983
- packageFiles.find((file) => file.file_path === "/dist/circuit.json")
984
- ?.content_text || "[]",
985
- )
986
- : [],
987
- is_private: _package.is_private || false,
988
- is_public: _package.is_public || true,
989
- is_unlisted: _package.is_unlisted || false,
990
- }
991
- },
992
- searchSnippets: (query: string): Snippet[] => {
993
- const state = get()
994
- const lowercaseQuery = query.toLowerCase()
995
-
996
- // Get all packages that are snippets
997
- const packages = state.packages.filter((pkg) => pkg.is_snippet === true)
998
-
999
- // Find packages that match by name or description
1000
- const matchingPackagesByMetadata = packages.filter(
1001
- (pkg) =>
1002
- pkg.name.toLowerCase().includes(lowercaseQuery) ||
1003
- pkg.description?.toLowerCase().includes(lowercaseQuery),
1004
- )
1005
-
1006
- // Find packages that match by code content in any file
1007
- const matchingFilesByContent = state.packageFiles.filter(
1008
- (file) =>
1009
- file.content_text?.toLowerCase().includes(lowercaseQuery) ?? false,
1010
- )
1011
-
1012
- // Get the packages for matching files
1013
- const matchingPackagesByContent = matchingFilesByContent
1014
- .map((file) => {
1015
- // Find the package release for this file
1016
- const packageRelease = state.packageReleases.find(
1017
- (pr) => pr.package_release_id === file.package_release_id,
1018
- )
1019
- if (!packageRelease) return null
1020
-
1021
- // Find the package for this release
1022
- return packages.find(
1023
- (pkg) =>
1024
- pkg.latest_package_release_id === packageRelease.package_release_id,
1025
- )
1026
- })
1027
- .filter((pkg): pkg is NonNullable<typeof pkg> => pkg !== null)
1028
-
1029
- // Combine both sets of matching packages and remove duplicates
1030
- const matchingPackages = [
1031
- ...new Set([...matchingPackagesByMetadata, ...matchingPackagesByContent]),
1032
- ]
1033
-
1034
- // Convert matching packages to snippet format
1035
- return matchingPackages
1036
- .map((pkg) => {
1037
- const packageRelease = state.packageReleases.find(
1038
- (pr) =>
1039
- pr.package_release_id === pkg.latest_package_release_id &&
1040
- pr.is_latest === true,
1041
- )
1042
- if (!packageRelease) return null
1043
-
1044
- const packageFiles = state.packageFiles.filter(
1045
- (file) =>
1046
- file.package_release_id === packageRelease.package_release_id,
1047
- )
1048
-
1049
- const codeFile = packageFiles.find(
1050
- (file) =>
1051
- file.file_path === "index.ts" || file.file_path === "index.tsx",
1052
- )
1053
-
1054
- const isStarred = state.accountPackages.some(
1055
- (ap) => ap.package_id === pkg.package_id && ap.is_starred,
1056
- )
1057
-
1058
- return {
1059
- snippet_id: pkg.package_id,
1060
- package_release_id: pkg.latest_package_release_id || "",
1061
- unscoped_name: pkg.unscoped_name,
1062
- name: pkg.name,
1063
- owner_name: pkg.owner_github_username || "",
1064
- description: pkg.description || "",
1065
- snippet_type: pkg.snippet_type || "board",
1066
- code: codeFile?.content_text || "",
1067
- dts:
1068
- packageFiles.find((file) => file.file_path === "/dist/index.d.ts")
1069
- ?.content_text || "",
1070
- compiled_js:
1071
- packageFiles.find((file) => file.file_path === "/dist/index.js")
1072
- ?.content_text || "",
1073
- created_at: pkg.created_at,
1074
- updated_at: pkg.updated_at,
1075
- star_count: pkg.star_count || 0,
1076
- is_starred: isStarred,
1077
- version: pkg.latest_version || "0.0.1",
1078
- circuit_json:
1079
- packageFiles
1080
- .filter((file) => file.file_path === "/dist/circuit.json")
1081
- .flatMap((file) => JSON.parse(file.content_text || "[]")) || [],
1082
- } as Snippet
1083
- })
1084
- .filter((snippet): snippet is Snippet => snippet !== null)
1085
- },
1086
- searchPackages: (query: string): Package[] => {
1087
- const state = get()
1088
- const lowercaseQuery = query.toLowerCase()
1089
-
1090
- // Get all packages that are public
1091
- const packages = state.packages.filter((pkg) => pkg.is_public === true)
1092
-
1093
- // Find packages that match by name or description
1094
- const matchingPackagesByMetadata = packages.filter(
1095
- (pkg) =>
1096
- pkg.name.toLowerCase().includes(lowercaseQuery) ||
1097
- pkg.description?.toLowerCase().includes(lowercaseQuery),
1098
- )
1099
-
1100
- // Find packages that match by code content in any file
1101
- const matchingFilesByContent = state.packageFiles.filter(
1102
- (file) =>
1103
- file.content_text?.toLowerCase().includes(lowercaseQuery) ?? false,
1104
- )
1105
-
1106
- // Get the packages for matching files
1107
- const matchingPackagesByContent = matchingFilesByContent
1108
- .map((file) => {
1109
- // Find the package release for this file
1110
- const packageRelease = state.packageReleases.find(
1111
- (pr) => pr.package_release_id === file.package_release_id,
1112
- )
1113
- if (!packageRelease) return null
1114
-
1115
- // Find the package for this release
1116
- return packages.find(
1117
- (pkg) =>
1118
- pkg.latest_package_release_id === packageRelease.package_release_id,
1119
- )
1120
- })
1121
- .filter((pkg): pkg is NonNullable<typeof pkg> => pkg !== null)
1122
-
1123
- // Combine both sets of matching packages and remove duplicates
1124
- const matchingPackages = [
1125
- ...new Set([...matchingPackagesByMetadata, ...matchingPackagesByContent]),
1126
- ]
1127
-
1128
- return matchingPackages
1129
- },
1130
- searchAccounts: (query: string, limit?: number): Account[] => {
1131
- const state = get()
1132
- const lowercaseQuery = query.toLowerCase()
1133
-
1134
- const accountsWithPublicPackages = new Set<string>()
1135
- state.packages
1136
- .filter((pkg) => pkg.is_public === true)
1137
- .forEach((pkg) => {
1138
- if (pkg.creator_account_id) {
1139
- accountsWithPublicPackages.add(pkg.creator_account_id)
1140
- }
1141
- if (pkg.owner_github_username) {
1142
- const account = state.accounts.find(
1143
- (acc) => acc.github_username === pkg.owner_github_username,
1144
- )
1145
- if (account) {
1146
- accountsWithPublicPackages.add(account.account_id)
1147
- }
1148
- }
1149
- })
1150
-
1151
- const matchingAccounts = state.accounts
1152
- .filter((account) => {
1153
- if (!accountsWithPublicPackages.has(account.account_id)) {
1154
- return false
1155
- }
1156
- return account.github_username.toLowerCase().includes(lowercaseQuery)
1157
- })
1158
- .slice(0, limit || 50)
1159
-
1160
- return matchingAccounts
1161
- },
1162
- deleteSnippet: (snippetId: string): boolean => {
1163
- let deleted = false
1164
- set((state) => {
1165
- const index = state.snippets.findIndex((s) => s.snippet_id === snippetId)
1166
- if (index !== -1) {
1167
- state.snippets.splice(index, 1)
1168
- deleted = true
1169
- }
1170
- return state
1171
- })
1172
- return deleted
1173
- },
1174
- addSession: (session: Omit<Session, "session_id">): Session => {
1175
- const newSession = { session_id: `session_${Date.now()}`, ...session }
1176
- set((state) => ({
1177
- sessions: [...state.sessions, newSession],
1178
- }))
1179
- return newSession
1180
- },
1181
- getSessions: ({
1182
- account_id,
1183
- is_cli_session,
1184
- }: { account_id: string; is_cli_session?: boolean }): Session[] => {
1185
- const state = get()
1186
- return state.sessions.filter(
1187
- (session) =>
1188
- session.account_id === account_id &&
1189
- (is_cli_session === undefined ||
1190
- session.is_cli_session === is_cli_session),
1191
- )
1192
- },
1193
- createLoginPage: (): LoginPage => {
1194
- const newLoginPage: LoginPage = {
1195
- login_page_id: `login_page_${Date.now()}`,
1196
- login_page_auth_token: `token_${Date.now()}`,
1197
- was_login_successful: false,
1198
- has_been_used_to_create_session: false,
1199
- created_at: new Date().toISOString(),
1200
- expires_at: new Date(Date.now() + 30 * 60 * 1000).toISOString(), // 30 minutes expiration
1201
- }
1202
- set((state) => ({
1203
- loginPages: [...state.loginPages, newLoginPage],
1204
- }))
1205
- return newLoginPage
1206
- },
1207
- getLoginPage: (loginPageId: string): LoginPage | undefined => {
1208
- const state = get()
1209
- return state.loginPages.find((lp) => lp.login_page_id === loginPageId)
1210
- },
1211
- updateLoginPage: (loginPageId: string, updates: Partial<LoginPage>): void => {
1212
- set((state) => ({
1213
- loginPages: state.loginPages.map((lp) =>
1214
- lp.login_page_id === loginPageId ? { ...lp, ...updates } : lp,
1215
- ),
1216
- }))
1217
- },
1218
- getAccount: (accountId: string): Account | undefined => {
1219
- const state = get()
1220
- return state.accounts.find((account) => account.account_id === accountId)
1221
- },
1222
- updateAccount: (
1223
- accountId: string,
1224
- updates: Partial<Account>,
1225
- ): Account | undefined => {
1226
- let updatedAccount: Account | undefined
1227
- set((state) => {
1228
- const accountIndex = state.accounts.findIndex(
1229
- (account) => account.account_id === accountId,
1230
- )
1231
- if (accountIndex !== -1) {
1232
- updatedAccount = { ...state.accounts[accountIndex] }
1233
- if (updates.shippingInfo) {
1234
- updatedAccount.shippingInfo = {
1235
- ...updatedAccount.shippingInfo,
1236
- ...updates.shippingInfo,
1237
- }
1238
- delete updates.shippingInfo
1239
- }
1240
- updatedAccount = { ...updatedAccount, ...updates }
1241
- const updatedAccounts = [...state.accounts]
1242
- updatedAccounts[accountIndex] = updatedAccount
1243
- return { ...state, accounts: updatedAccounts }
1244
- }
1245
- return state
1246
- })
1247
- return updatedAccount
1248
- },
1249
- createSession: (session: Omit<Session, "session_id">): Session => {
1250
- const newSession = { session_id: `session_${Date.now()}`, ...session }
1251
- set((state) => ({
1252
- sessions: [...state.sessions, newSession],
1253
- }))
1254
- return newSession
1255
- },
1256
- addStar: (accountId: string, packageId: string): AccountPackage => {
1257
- const now = new Date().toISOString()
1258
- const accountPackage = {
1259
- account_package_id: `ap_${Date.now()}`,
1260
- account_id: accountId,
1261
- package_id: packageId,
1262
- is_starred: true,
1263
- created_at: now,
1264
- updated_at: now,
1265
- }
1266
-
1267
- // Update the package's star count
1268
- set((state) => {
1269
- // Find the package and increment its star count
1270
- const packageIndex = state.packages.findIndex(
1271
- (pkg) => pkg.package_id === packageId,
1272
- )
1273
- if (packageIndex >= 0) {
1274
- const updatedPackages = [...state.packages]
1275
- updatedPackages[packageIndex] = {
1276
- ...updatedPackages[packageIndex],
1277
- star_count: (updatedPackages[packageIndex].star_count || 0) + 1,
1278
- }
1279
-
1280
- return {
1281
- packages: updatedPackages,
1282
- accountPackages: [...state.accountPackages, accountPackage],
1283
- }
1284
- }
1285
-
1286
- return {
1287
- accountPackages: [...state.accountPackages, accountPackage],
1288
- }
1289
- })
1290
-
1291
- return accountPackage
1292
- },
1293
- removeStar: (accountId: string, packageId: string): void => {
1294
- set((state) => {
1295
- // Find the package and decrement its star count
1296
- const packageIndex = state.packages.findIndex(
1297
- (pkg) => pkg.package_id === packageId,
1298
- )
1299
-
1300
- if (packageIndex >= 0) {
1301
- const updatedPackages = [...state.packages]
1302
- updatedPackages[packageIndex] = {
1303
- ...updatedPackages[packageIndex],
1304
- star_count: Math.max(
1305
- 0,
1306
- (updatedPackages[packageIndex].star_count || 0) - 1,
1307
- ),
1308
- }
1309
-
1310
- return {
1311
- packages: updatedPackages,
1312
- accountPackages: state.accountPackages.filter(
1313
- (ap) =>
1314
- !(ap.account_id === accountId && ap.package_id === packageId),
1315
- ),
1316
- }
1317
- }
1318
-
1319
- return {
1320
- accountPackages: state.accountPackages.filter(
1321
- (ap) => !(ap.account_id === accountId && ap.package_id === packageId),
1322
- ),
1323
- }
1324
- })
1325
- },
1326
- hasStarred: (accountId: string, packageId: string): boolean => {
1327
- const state = get()
1328
- return state.accountPackages.some(
1329
- (ap) =>
1330
- ap.account_id === accountId &&
1331
- ap.package_id === packageId &&
1332
- ap.is_starred,
1333
- )
1334
- },
1335
- addPackage: (
1336
- _package: Omit<
1337
- z.input<typeof packageSchema>,
1338
- "package_id" | "github_repo_full_name"
1339
- >,
1340
- ): Package => {
1341
- const timestamp = Date.now()
1342
- const newPackage = {
1343
- package_id: `package_${timestamp}`,
1344
- github_repo_full_name: null,
1345
- latest_pcb_preview_image_url:
1346
- _package.latest_pcb_preview_image_url ??
1347
- `/api/packages/images/${_package.name}`,
1348
- latest_cad_preview_image_url:
1349
- _package.latest_cad_preview_image_url ??
1350
- `/api/packages/images/${_package.name}`,
1351
- latest_sch_preview_image_url:
1352
- _package.latest_sch_preview_image_url ??
1353
- `/api/packages/images/${_package.name}`,
1354
- ..._package,
1355
- }
1356
- set((state) => ({
1357
- packages: [...state.packages, newPackage as Package],
1358
- }))
1359
- return newPackage as Package
1360
- },
1361
- updatePackage: (
1362
- packageId: string,
1363
- updates: Partial<Package>,
1364
- ): Package | undefined => {
1365
- let updatedPackage: Package | undefined
1366
- set((state) => {
1367
- const packageIndex = state.packages.findIndex(
1368
- (pkg) => pkg.package_id === packageId,
1369
- )
1370
- if (packageIndex === -1) return state
1371
-
1372
- const updatedPackages = [...state.packages]
1373
- updatedPackages[packageIndex] = {
1374
- ...updatedPackages[packageIndex],
1375
- ...updates,
1376
- }
1377
- updatedPackage = updatedPackages[packageIndex]
1378
- return { ...state, packages: updatedPackages }
1379
- })
1380
- return updatedPackage
1381
- },
1382
- getPackageById: (packageId: string): Package | undefined => {
1383
- const state = get()
1384
- const pkg = state.packages.find((pkg) => pkg.package_id === packageId)
1385
- if (!pkg) return undefined
1386
- return {
1387
- ...pkg,
1388
- }
1389
- },
1390
- getPackageReleaseById: (
1391
- packageReleaseId: string,
1392
- ): PackageRelease | undefined => {
1393
- const state = get()
1394
- return state.packageReleases.find(
1395
- (pr) => pr.package_release_id === packageReleaseId,
1396
- )
1397
- },
1398
- addPackageRelease: (
1399
- packageRelease: Omit<
1400
- z.input<typeof packageReleaseSchema>,
1401
- "package_release_id"
1402
- >,
1403
- ): PackageRelease => {
1404
- const parsed = packageReleaseSchema.parse({
1405
- package_release_id: `package_release_${Date.now()}`,
1406
- ...packageRelease,
1407
- })
1408
- set((state) => ({
1409
- packageReleases: [...state.packageReleases, parsed],
1410
- }))
1411
- return parsed
1412
- },
1413
- updatePackageRelease: (packageRelease: PackageRelease): void => {
1414
- set((state) => ({
1415
- packageReleases: state.packageReleases.map((pr) =>
1416
- pr.package_release_id === packageRelease.package_release_id
1417
- ? packageRelease
1418
- : pr,
1419
- ),
1420
- }))
1421
- },
1422
- deletePackageFile: (packageFileId: string): boolean => {
1423
- let deleted = false
1424
- set((state) => {
1425
- const index = state.packageFiles.findIndex(
1426
- (file) => file.package_file_id === packageFileId,
1427
- )
1428
- if (index !== -1) {
1429
- state.packageFiles.splice(index, 1)
1430
- deleted = true
1431
- }
1432
- return state
1433
- })
1434
- return deleted
1435
- },
1436
- addPackageFile: (
1437
- packageFile: Omit<PackageFile, "package_file_id">,
1438
- ): PackageFile => {
1439
- const newPackageFile = {
1440
- package_file_id: `package_file_${Date.now()}`,
1441
- ...packageFile,
1442
- }
1443
- set((state) => ({
1444
- packageFiles: [...state.packageFiles, newPackageFile],
1445
- }))
1446
- return newPackageFile
1447
- },
1448
- updatePackageFile: (
1449
- packageFileId: string,
1450
- updates: Partial<Omit<PackageFile, "package_file_id">>,
1451
- ): PackageFile => {
1452
- set((state) => ({
1453
- packageFiles: state.packageFiles.map((file) =>
1454
- file.package_file_id === packageFileId ? { ...file, ...updates } : file,
1455
- ),
1456
- }))
1457
- const state = get()
1458
- return state.packageFiles.find(
1459
- (file) => file.package_file_id === packageFileId,
1460
- )!
1461
- },
1462
- getStarCount: (packageId: string): number => {
1463
- const state = get()
1464
- return state.accountPackages.filter(
1465
- (ap) => ap.package_id === packageId && ap.is_starred,
1466
- ).length
1467
- },
1468
- getPackageFilesByReleaseId: (packageReleaseId: string): PackageFile[] => {
1469
- const state = get()
1470
- return state.packageFiles.filter(
1471
- (pf) => pf.package_release_id === packageReleaseId,
1472
- )
1473
- },
1474
- /**
1475
- * Update fs_sha for a package release based on its files
1476
- */
1477
- updatePackageReleaseFsSha: (packageReleaseId: string): void => {
1478
- const state = get()
1479
- const packageFiles = state.packageFiles.filter(
1480
- (pf) => pf.package_release_id === packageReleaseId,
1481
- )
1482
- const fsSha = generateFsSha(packageFiles)
1483
-
1484
- set((currentState) => ({
1485
- ...currentState,
1486
- packageReleases: currentState.packageReleases.map((pr) =>
1487
- pr.package_release_id === packageReleaseId
1488
- ? { ...pr, fs_sha: fsSha }
1489
- : pr,
1490
- ),
1491
- packages: currentState.packages.map((pkg) =>
1492
- pkg.latest_package_release_id === packageReleaseId
1493
- ? { ...pkg, latest_package_release_fs_sha: fsSha }
1494
- : pkg,
1495
- ),
1496
- }))
1497
- },
1498
-
1499
- addAiReview: (review: Omit<AiReview, "ai_review_id">): AiReview => {
1500
- const base = aiReviewSchema.omit({ ai_review_id: true }).parse(review)
1501
- const newReview = {
1502
- ai_review_id: crypto.randomUUID(),
1503
- ...base,
1504
- }
1505
- set((state) => ({
1506
- aiReviews: [...state.aiReviews, newReview],
1507
- idCounter: state.idCounter + 1,
1508
- }))
1509
- return newReview
1510
- },
1511
- updateAiReview: (
1512
- aiReviewId: string,
1513
- updates: Partial<AiReview>,
1514
- ): AiReview | undefined => {
1515
- let updated: AiReview | undefined
1516
- set((state) => {
1517
- const index = state.aiReviews.findIndex(
1518
- (ar) => ar.ai_review_id === aiReviewId,
1519
- )
1520
- if (index === -1) return state
1521
- const aiReviews = [...state.aiReviews]
1522
- aiReviews[index] = { ...aiReviews[index], ...updates }
1523
- updated = aiReviews[index]
1524
- return { ...state, aiReviews }
1525
- })
1526
- return updated
1527
- },
1528
- getAiReviewById: (aiReviewId: string): AiReview | undefined => {
1529
- const state = get()
1530
- return state.aiReviews.find((ar) => ar.ai_review_id === aiReviewId)
1531
- },
1532
- listAiReviews: (): AiReview[] => {
1533
- const state = get()
1534
- return state.aiReviews
1535
- },
1536
- addDatasheet: ({ chip_name }: { chip_name: string }): Datasheet => {
1537
- const newDatasheet = datasheetSchema.parse({
1538
- datasheet_id: crypto.randomUUID(),
1539
- chip_name,
1540
- created_at: new Date().toISOString(),
1541
- pin_information: null,
1542
- datasheet_pdf_urls: null,
1543
- ai_description: null,
1544
- })
1545
- set((state) => ({
1546
- datasheets: [...state.datasheets, newDatasheet],
1547
- }))
1548
- return newDatasheet
1549
- },
1550
- getDatasheetById: (datasheetId: string): Datasheet | undefined => {
1551
- const state = get()
1552
- return state.datasheets.find((d) => d.datasheet_id === datasheetId)
1553
- },
1554
- getDatasheetByChipName: (chipName: string): Datasheet | undefined => {
1555
- const state = get()
1556
- return state.datasheets.find(
1557
- (d) => d.chip_name.toLowerCase() === chipName.toLowerCase(),
1558
- )
1559
- },
1560
- listDatasheets: ({
1561
- chip_name,
1562
- is_popular,
1563
- }: { chip_name?: string; is_popular?: boolean } = {}): Datasheet[] => {
1564
- const state = get()
1565
- if (is_popular) {
1566
- return state.datasheets
1567
- }
1568
-
1569
- if (chip_name) {
1570
- return state.datasheets.filter(
1571
- (d) => d.chip_name.toLowerCase() === chip_name.toLowerCase(),
1572
- )
1573
- }
1574
-
1575
- return state.datasheets
1576
- },
1577
- updateDatasheet: (
1578
- datasheetId: string,
1579
- updates: Partial<Datasheet>,
1580
- ): Datasheet | undefined => {
1581
- let updated: Datasheet | undefined
1582
- set((state) => {
1583
- const index = state.datasheets.findIndex(
1584
- (d) => d.datasheet_id === datasheetId,
1585
- )
1586
- if (index === -1) return state
1587
- const datasheets = [...state.datasheets]
1588
- datasheets[index] = { ...datasheets[index], ...updates }
1589
- updated = datasheets[index]
1590
- return { ...state, datasheets }
1591
- })
1592
- return updated
1593
- },
1594
- addPackageBuild: (
1595
- packageBuild: Omit<z.input<typeof packageBuildSchema>, "package_build_id">,
1596
- ): PackageBuild => {
1597
- const newPackageBuild = packageBuildSchema.parse({
1598
- package_build_id: crypto.randomUUID(),
1599
- ...packageBuild,
1600
- })
1601
- set((state) => ({
1602
- packageBuilds: [...state.packageBuilds, newPackageBuild],
1603
- // Automatically update the package release to reference this as the latest build
1604
- packageReleases: state.packageReleases.map((release) =>
1605
- release.package_release_id === packageBuild.package_release_id
1606
- ? {
1607
- ...release,
1608
- latest_package_build_id: newPackageBuild.package_build_id,
1609
- }
1610
- : release,
1611
- ),
1612
- }))
1613
- return newPackageBuild
1614
- },
1615
- getPackageBuildById: (packageBuildId: string): PackageBuild | undefined => {
1616
- const state = get()
1617
- return state.packageBuilds.find(
1618
- (pb) => pb.package_build_id === packageBuildId,
1619
- )
1620
- },
1621
- getPackageBuildsByReleaseId: (packageReleaseId: string): PackageBuild[] => {
1622
- const state = get()
1623
- return state.packageBuilds
1624
- .filter((pb) => pb.package_release_id === packageReleaseId)
1625
- .sort(
1626
- (a, b) =>
1627
- new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),
1628
- )
1629
- },
1630
- updatePackageBuild: (
1631
- packageBuildId: string,
1632
- updates: Partial<PackageBuild>,
1633
- ): PackageBuild | undefined => {
1634
- let updated: PackageBuild | undefined
1635
- set((state) => {
1636
- const index = state.packageBuilds.findIndex(
1637
- (pb) => pb.package_build_id === packageBuildId,
1638
- )
1639
- if (index === -1) return state
1640
- const packageBuilds = [...state.packageBuilds]
1641
- packageBuilds[index] = { ...packageBuilds[index], ...updates }
1642
- updated = packageBuilds[index]
1643
- return { ...state, packageBuilds }
1644
- })
1645
- return updated
1646
- },
1647
- addOrganization: (organization: {
1648
- name: string
1649
- org_id?: string
1650
- is_personal_org?: boolean
1651
- owner_account_id: string
1652
- github_handle?: string
1653
- }) => {
1654
- const newOrganization: Organization = {
1655
- org_name: organization.name,
1656
- org_id: organization.org_id || `org_${get().idCounter + 1}`,
1657
- github_handle: organization.github_handle,
1658
- is_personal_org: organization.is_personal_org || false,
1659
- created_at: new Date().toISOString(),
1660
- ...organization,
1661
- }
1662
- set((state) => ({
1663
- idCounter: state.idCounter + 1,
1664
- organizations: [...state.organizations, newOrganization as Organization],
1665
- // Add the creator as a member of the new org by setting their personal_org_id
1666
- accounts: state.accounts.map((account) =>
1667
- account.account_id === organization.owner_account_id
1668
- ? { ...account, personal_org_id: newOrganization.org_id }
1669
- : account,
1670
- ),
1671
- }))
1672
- return newOrganization
1673
- },
1674
- getOrgs: (
1675
- filters?: {
1676
- owner_account_id?: string
1677
- github_handle?: string
1678
- name?: string
1679
- },
1680
- auth?: { account_id?: string },
1681
- ) => {
1682
- let orgs = get().organizations
1683
- if (filters?.owner_account_id) {
1684
- orgs = orgs.filter(
1685
- (org) => org.owner_account_id === filters.owner_account_id,
1686
- )
1687
- }
1688
- if (filters?.github_handle) {
1689
- orgs = orgs.filter((org) => {
1690
- const account = get().accounts.find(
1691
- (account) => account.account_id === org.owner_account_id,
1692
- )
1693
- return account?.github_username === filters.github_handle
1694
- })
1695
- }
1696
- if (filters?.name) {
1697
- orgs = orgs.filter((org) => org.github_handle === filters.name)
1698
- }
1699
-
1700
- return orgs.map((org) => {
1701
- const member_count = get().accounts.filter(
1702
- (account) => account.personal_org_id === org.org_id,
1703
- ).length
1704
-
1705
- const package_count = get().packages.filter(
1706
- (pkg) => pkg.owner_org_id === org.org_id,
1707
- ).length
1708
-
1709
- const can_manage_org = auth
1710
- ? org.owner_account_id === auth.account_id
1711
- : false
1712
-
1713
- return {
1714
- ...org,
1715
- member_count,
1716
- package_count,
1717
- can_manage_org,
1718
- }
1719
- })
1720
- },
1721
- getOrg: (
1722
- filters: {
1723
- org_id?: string
1724
- org_name?: string
1725
- github_handle?: string
1726
- },
1727
- auth?: { account_id: string },
1728
- ) => {
1729
- let orgs = get().organizations
1730
-
1731
- if (filters?.org_id) {
1732
- orgs = orgs.filter((org) => org.org_id === filters.org_id)
1733
- }
1734
- if (filters?.org_name) {
1735
- orgs = orgs.filter((org) => org.org_name === filters.org_name)
1736
- }
1737
- // if (filters?.org_name && auth?.account_id) {
1738
- // const account = get().accounts.find(x => x.account_id == auth?.account_id)
1739
- // orgs = orgs.filter((org) => org.github_handle === account?.github_username)
1740
- // }
1741
- if (filters?.github_handle) {
1742
- orgs = orgs.filter((org) => org.github_handle === filters.github_handle)
1743
- }
1744
-
1745
- if (orgs.length === 0) {
1746
- return null
1747
- }
1748
-
1749
- const org = orgs[0]
1750
-
1751
- const member_count = get().accounts.filter(
1752
- (account) => account.personal_org_id === org.org_id,
1753
- ).length
1754
-
1755
- const package_count = get().packages.filter(
1756
- (pkg) => pkg.owner_org_id === org.org_id,
1757
- ).length
1758
-
1759
- const can_manage_org = auth
1760
- ? org.owner_account_id === auth.account_id
1761
- : false
1762
-
1763
- return {
1764
- ...org,
1765
- member_count,
1766
- package_count,
1767
- can_manage_org,
1768
- }
1769
- },
1770
- addOrganizationAccount: (organizationAccount: {
1771
- org_id: string
1772
- account_id: string
1773
- is_owner?: boolean
1774
- }) => {
1775
- const newOrgAccount: OrgAccount = {
1776
- org_account_id: `org_account_${get().idCounter + 1}`,
1777
- org_id: organizationAccount.org_id,
1778
- account_id: organizationAccount.account_id,
1779
- is_owner: organizationAccount.is_owner || false,
1780
- created_at: new Date().toISOString(),
1781
- }
1782
- set((state) => ({
1783
- orgAccounts: [...state.orgAccounts, newOrgAccount],
1784
- idCounter: state.idCounter + 1,
1785
- }))
1786
- return newOrgAccount
1787
- },
1788
- getOrganizationAccount: (filters: {
1789
- org_id?: string
1790
- account_id?: string
1791
- }): OrgAccount | undefined => {
1792
- const state = get()
1793
- return state.orgAccounts.find((orgAccount) => {
1794
- if (filters.org_id && orgAccount.org_id !== filters.org_id) {
1795
- return false
1796
- }
1797
- if (filters.account_id && orgAccount.account_id !== filters.account_id) {
1798
- return false
1799
- }
1800
- return true
1801
- })
1802
- },
1803
- getOrganizationAccounts: (filters?: {
1804
- org_id?: string
1805
- account_id?: string
1806
- }): OrgAccount[] => {
1807
- const state = get()
1808
- return state.orgAccounts.filter((orgAccount) => {
1809
- if (filters?.org_id && orgAccount.org_id !== filters.org_id) {
1810
- return false
1811
- }
1812
- if (filters?.account_id && orgAccount.account_id !== filters.account_id) {
1813
- return false
1814
- }
1815
- return true
1816
- })
1817
- },
1818
- removeOrganizationAccount: (filters: {
1819
- org_id: string
1820
- account_id: string
1821
- }): boolean => {
1822
- let removed = false
1823
- set((state) => {
1824
- const index = state.orgAccounts.findIndex(
1825
- (orgAccount) =>
1826
- orgAccount.org_id === filters.org_id &&
1827
- orgAccount.account_id === filters.account_id,
1828
- )
1829
- if (index !== -1) {
1830
- state.orgAccounts.splice(index, 1)
1831
- removed = true
1832
- }
1833
- return state
1834
- })
1835
- return removed
1836
- },
1837
- updateOrganization: (
1838
- orgId: string,
1839
- updates: Partial<Organization>,
1840
- ): Organization | undefined => {
1841
- let updatedOrg: Organization | undefined
1842
- set((state) => {
1843
- const orgIndex = state.organizations.findIndex(
1844
- (org) => org.org_id === orgId,
1845
- )
1846
- if (orgIndex === -1) return state
1847
- const updatedOrganizations = [...state.organizations]
1848
- updatedOrganizations[orgIndex] = {
1849
- ...updatedOrganizations[orgIndex],
1850
- ...updates,
1851
- }
1852
- updatedOrg = updatedOrganizations[orgIndex]
1853
- return { ...state, organizations: updatedOrganizations }
1854
- })
1855
- return updatedOrg
1856
- },
1857
- }))