@tscircuit/fake-snippets 0.0.108 → 0.0.110

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 (203) hide show
  1. package/.github/workflows/bun-formatcheck.yml +2 -2
  2. package/.github/workflows/bun-pver-release.yml +3 -3
  3. package/.github/workflows/bun-test.yml +1 -1
  4. package/.github/workflows/bun-typecheck.yml +2 -2
  5. package/.github/workflows/update-snapshots.yml +1 -1
  6. package/README.md +4 -0
  7. package/api/generated-index.js +37 -3
  8. package/biome.json +2 -1
  9. package/bun-tests/fake-snippets-api/fixtures/get-test-server.ts +31 -3
  10. package/bun-tests/fake-snippets-api/fixtures/preload.ts +18 -0
  11. package/bun-tests/fake-snippets-api/routes/orgs/add_member.test.ts +26 -0
  12. package/bun-tests/fake-snippets-api/routes/orgs/create.test.ts +37 -0
  13. package/bun-tests/fake-snippets-api/routes/orgs/get.test.ts +52 -0
  14. package/bun-tests/fake-snippets-api/routes/orgs/list.test.ts +17 -0
  15. package/bun-tests/fake-snippets-api/routes/orgs/list_members.test.ts +23 -0
  16. package/bun-tests/fake-snippets-api/routes/orgs/remove_member.test.ts +81 -0
  17. package/bun-tests/fake-snippets-api/routes/orgs/update.test.ts +99 -0
  18. package/bun-tests/fake-snippets-api/routes/package_builds/get.test.ts +1 -1
  19. package/bun-tests/fake-snippets-api/routes/package_files/create.test.ts +15 -13
  20. package/bun-tests/fake-snippets-api/routes/package_files/create_or_update.test.ts +26 -24
  21. package/bun-tests/fake-snippets-api/routes/package_files/delete.test.ts +9 -9
  22. package/bun-tests/fake-snippets-api/routes/package_files/download.test.ts +4 -4
  23. package/bun-tests/fake-snippets-api/routes/package_files/get.test.ts +38 -28
  24. package/bun-tests/fake-snippets-api/routes/package_files/list.test.ts +23 -15
  25. package/bun-tests/fake-snippets-api/routes/package_releases/create.test.ts +33 -0
  26. package/bun-tests/fake-snippets-api/routes/package_releases/get.test.ts +4 -4
  27. package/bun-tests/fake-snippets-api/routes/package_releases/get_image_generation_fields.test.ts +38 -0
  28. package/bun-tests/fake-snippets-api/routes/packages/create.test.ts +19 -0
  29. package/bun-tests/fake-snippets-api/routes/packages/fork.test.ts +3 -4
  30. package/bun-tests/fake-snippets-api/routes/packages/get.test.ts +30 -0
  31. package/bun-tests/fake-snippets-api/routes/packages/images.test.ts +4 -2
  32. package/bun-tests/fake-snippets-api/routes/packages/list-1.test.ts +34 -0
  33. package/bun.lock +389 -450
  34. package/bunfig.toml +2 -1
  35. package/dist/bundle.js +1255 -625
  36. package/dist/index.d.ts +296 -4
  37. package/dist/index.js +325 -24
  38. package/dist/schema.d.ts +282 -1
  39. package/dist/schema.js +54 -2
  40. package/fake-snippets-api/lib/db/autoload-dev-packages.ts +31 -20
  41. package/fake-snippets-api/lib/db/db-client.ts +214 -3
  42. package/fake-snippets-api/lib/db/schema.ts +62 -0
  43. package/fake-snippets-api/lib/db/seed.ts +100 -0
  44. package/fake-snippets-api/lib/middleware/with-session-auth.ts +1 -1
  45. package/fake-snippets-api/lib/package_file/get-package-file-id-from-file-descriptor.ts +2 -2
  46. package/fake-snippets-api/lib/public-mapping/public-map-org.ts +32 -0
  47. package/fake-snippets-api/lib/public-mapping/public-map-package-build.ts +10 -0
  48. package/fake-snippets-api/lib/public-mapping/public-map-package-release.ts +17 -0
  49. package/fake-snippets-api/routes/api/orgs/add_member.ts +52 -0
  50. package/fake-snippets-api/routes/api/orgs/create.ts +46 -0
  51. package/fake-snippets-api/routes/api/orgs/get.ts +39 -0
  52. package/fake-snippets-api/routes/api/orgs/list.ts +31 -0
  53. package/fake-snippets-api/routes/api/orgs/list_members.ts +67 -0
  54. package/fake-snippets-api/routes/api/orgs/remove_member.ts +46 -0
  55. package/fake-snippets-api/routes/api/orgs/update.ts +93 -0
  56. package/fake-snippets-api/routes/api/package_files/get.ts +3 -6
  57. package/fake-snippets-api/routes/api/package_files/list.ts +7 -4
  58. package/fake-snippets-api/routes/api/packages/create.ts +54 -10
  59. package/fake-snippets-api/routes/api/packages/get.ts +23 -0
  60. package/fake-snippets-api/routes/api/packages/images/[owner_github_username]/[unscoped_name]/[view_format].ts +13 -11
  61. package/fake-snippets-api/routes/api/packages/list.ts +29 -2
  62. package/fake-snippets-api/routes/api/packages/update_ai_description.ts +37 -0
  63. package/package.json +27 -24
  64. package/renovate.json +1 -1
  65. package/scripts/generate-sitemap.ts +1 -1
  66. package/src/App.tsx +29 -10
  67. package/src/ContextProviders.tsx +25 -2
  68. package/src/components/CircuitJsonImportDialog.tsx +1 -1
  69. package/src/components/CmdKMenu.tsx +281 -247
  70. package/src/components/DownloadButtonAndMenu.tsx +133 -36
  71. package/src/components/FileSidebar.tsx +41 -50
  72. package/src/components/Footer.tsx +8 -10
  73. package/src/components/Header.tsx +19 -32
  74. package/src/components/Header2.tsx +16 -32
  75. package/src/components/HeaderDropdown.tsx +13 -8
  76. package/src/components/HeaderLogin.tsx +44 -16
  77. package/src/components/HiddenFilesDropdown.tsx +0 -2
  78. package/src/components/NotFound.tsx +5 -5
  79. package/src/components/PackageBreadcrumb.tsx +6 -12
  80. package/src/components/PackageCard.tsx +0 -1
  81. package/src/components/PackageSearchResults.tsx +1 -1
  82. package/src/components/PrefetchPageLink.tsx +7 -1
  83. package/src/components/ProfileRouter.tsx +32 -0
  84. package/src/components/SearchComponent.tsx +12 -8
  85. package/src/components/UserCard.tsx +80 -0
  86. package/src/components/ViewPackagePage/components/ShikiCodeViewer.tsx +20 -11
  87. package/src/components/ViewPackagePage/components/build-status.tsx +1 -1
  88. package/src/components/ViewPackagePage/components/important-files-view.tsx +174 -87
  89. package/src/components/ViewPackagePage/components/main-content-header.tsx +8 -4
  90. package/src/components/ViewPackagePage/components/main-content-view-selector.tsx +1 -2
  91. package/src/components/ViewPackagePage/components/mobile-sidebar.tsx +54 -20
  92. package/src/components/ViewPackagePage/components/package-header.tsx +26 -37
  93. package/src/components/ViewPackagePage/components/preview-image-squares.tsx +11 -19
  94. package/src/components/ViewPackagePage/components/repo-page-content.tsx +33 -25
  95. package/src/components/ViewPackagePage/components/sidebar-about-section.tsx +16 -10
  96. package/src/components/ViewPackagePage/components/sidebar-releases-section.tsx +11 -11
  97. package/src/components/ViewPackagePage/components/sidebar.tsx +0 -2
  98. package/src/components/ViewPackagePage/components/tab-views/files-view.tsx +18 -17
  99. package/src/components/ViewPackagePage/components/tab-views/pcb-view.tsx +1 -2
  100. package/src/components/ViewPackagePage/components/tab-views/schematic-view.tsx +2 -1
  101. package/src/components/ViewPackagePage/components/theme-toggle.tsx +0 -2
  102. package/src/components/ViewPackagePage/hooks/use-toast.tsx +0 -1
  103. package/src/components/dialogs/GitHubRepositorySelector.tsx +56 -49
  104. package/src/components/dialogs/edit-package-details-dialog.tsx +5 -6
  105. package/src/components/dialogs/import-component-dialog.tsx +16 -9
  106. package/src/components/dialogs/import-package-dialog.tsx +3 -2
  107. package/src/components/dialogs/new-package-save-prompt-dialog.tsx +190 -0
  108. package/src/components/organization/OrganizationCard.tsx +204 -0
  109. package/src/components/organization/OrganizationCardSkeleton.tsx +55 -0
  110. package/src/components/organization/OrganizationHeader.tsx +154 -0
  111. package/src/components/organization/OrganizationMembers.tsx +146 -0
  112. package/src/components/package-port/CodeAndPreview.tsx +32 -46
  113. package/src/components/package-port/CodeEditor.tsx +28 -31
  114. package/src/components/package-port/CodeEditorHeader.tsx +128 -63
  115. package/src/components/package-port/EditorNav.tsx +32 -49
  116. package/src/components/preview/ConnectedPackagesList.tsx +8 -8
  117. package/src/components/preview/ConnectedRepoOverview.tsx +102 -2
  118. package/src/components/preview/PackageReleasesDashboard.tsx +53 -36
  119. package/src/components/ui/tree-view.tsx +6 -3
  120. package/src/hooks/use-add-org-member-mutation.ts +51 -0
  121. package/src/hooks/use-create-org-mutation.ts +38 -0
  122. package/src/hooks/use-create-package-mutation.ts +3 -0
  123. package/src/hooks/use-current-package-id.ts +5 -30
  124. package/src/hooks/use-current-package-info.ts +29 -5
  125. package/src/hooks/use-current-package-release.ts +4 -3
  126. package/src/hooks/use-download-zip.ts +2 -2
  127. package/src/hooks/use-global-store.ts +6 -4
  128. package/src/hooks/use-jlcpcb-component-import.tsx +164 -0
  129. package/src/hooks/use-list-org-members.ts +27 -0
  130. package/src/hooks/use-list-user-orgs.ts +25 -0
  131. package/src/hooks/use-org-by-github-handle.ts +26 -0
  132. package/src/hooks/use-org.ts +24 -0
  133. package/src/hooks/use-organization.ts +42 -0
  134. package/src/hooks/use-package-as-snippet.ts +4 -2
  135. package/src/hooks/use-package-builds.ts +6 -2
  136. package/src/hooks/use-package-files.ts +5 -3
  137. package/src/hooks/use-package-release-by-id-or-version.ts +29 -20
  138. package/src/hooks/use-package-release-images.ts +105 -0
  139. package/src/hooks/use-package-release.ts +2 -2
  140. package/src/hooks/use-package-stars.ts +80 -4
  141. package/src/hooks/use-preview-images.ts +6 -3
  142. package/src/hooks/use-remove-org-member-mutation.ts +32 -0
  143. package/src/hooks/use-update-ai-description-mutation.ts +42 -0
  144. package/src/hooks/use-update-org-mutation.ts +41 -0
  145. package/src/hooks/use-warn-user-on-page-change.ts +71 -4
  146. package/src/hooks/useFileManagement.ts +183 -35
  147. package/src/hooks/useOptimizedPackageFilesLoader.ts +136 -0
  148. package/src/hooks/usePackageFilesLoader.ts +2 -2
  149. package/src/hooks/useUpdatePackageFilesMutation.ts +15 -1
  150. package/src/lib/download-fns/download-circuit-png.ts +11 -3
  151. package/src/lib/download-fns/download-gltf-from-circuit-json.ts +44 -0
  152. package/src/lib/download-fns/download-kicad-files.ts +12 -11
  153. package/src/lib/normalize-svg-for-tile.ts +50 -0
  154. package/src/lib/posthog.ts +11 -9
  155. package/src/lib/react-query-api-failure-tracking.ts +148 -0
  156. package/src/lib/sentry.ts +14 -0
  157. package/src/lib/templates/blank-circuit-board-template.ts +0 -4
  158. package/src/lib/ts-lib-cache.ts +122 -7
  159. package/src/lib/utils/checkIfManualEditsImported.ts +4 -4
  160. package/src/lib/utils/findTargetFile.ts +45 -10
  161. package/src/lib/utils/isComponentExported.ts +10 -0
  162. package/src/main.tsx +2 -1
  163. package/src/pages/authorize.tsx +0 -2
  164. package/src/pages/create-organization.tsx +168 -0
  165. package/src/pages/dashboard.tsx +38 -6
  166. package/src/pages/datasheet.tsx +1 -1
  167. package/src/pages/datasheets.tsx +3 -3
  168. package/src/pages/editor.tsx +4 -6
  169. package/src/pages/landing.tsx +6 -7
  170. package/src/pages/latest.tsx +3 -0
  171. package/src/pages/organization-profile.tsx +199 -0
  172. package/src/pages/organization-settings.tsx +566 -0
  173. package/src/pages/package-editor.tsx +21 -21
  174. package/src/pages/preview-release.tsx +76 -136
  175. package/src/pages/quickstart.tsx +159 -123
  176. package/src/pages/release-detail.tsx +119 -31
  177. package/src/pages/search.tsx +192 -57
  178. package/src/pages/settings-redirect.tsx +44 -0
  179. package/src/pages/trending.tsx +29 -20
  180. package/src/pages/user-profile.tsx +58 -7
  181. package/src/pages/view-package.tsx +21 -26
  182. package/vite.config.ts +9 -0
  183. package/fake-snippets-api/routes/api/autocomplete/create_autocomplete.ts +0 -133
  184. package/src/components/Footer2.tsx +0 -100
  185. package/src/components/JLCPCBImportDialog.tsx +0 -280
  186. package/src/components/PackageBuildsPage/LogContent.tsx +0 -72
  187. package/src/components/PackageBuildsPage/PackageBuildDetailsPage.tsx +0 -115
  188. package/src/components/PackageBuildsPage/build-preview-content.tsx +0 -27
  189. package/src/components/PackageBuildsPage/collapsible-section.tsx +0 -63
  190. package/src/components/PackageBuildsPage/package-build-details-panel.tsx +0 -166
  191. package/src/components/PackageBuildsPage/package-build-header.tsx +0 -79
  192. package/src/components/PageSearchComponent.tsx +0 -148
  193. package/src/components/ShippingInformationForm.tsx +0 -423
  194. package/src/components/StaticViewSnippetHeader.tsx +0 -70
  195. package/src/components/ViewPackagePage/components/file-explorer.tsx +0 -67
  196. package/src/components/ViewPackagePage/components/readme-view.tsx +0 -58
  197. package/src/components/ViewPackagePage/components/repo-header-button.tsx +0 -36
  198. package/src/components/ViewPackagePage/components/repo-header.tsx +0 -4
  199. package/src/components/ViewPackagePage/components/sidebar-contributors-section.tsx +0 -31
  200. package/src/components/ViewSnippetHeader.tsx +0 -181
  201. package/src/components/ui/input-otp.tsx +0 -69
  202. package/src/pages/package-builds.tsx +0 -33
  203. package/src/pages/settings.tsx +0 -25
@@ -7,7 +7,7 @@ test("POST /api/package_releases/get - should return package release by package_
7
7
 
8
8
  // First create a package with valid name format
9
9
  const packageResponse = await axios.post("/api/packages/create", {
10
- name: "@test/package-1",
10
+ name: "testuser/package-1",
11
11
  description: "A test package",
12
12
  })
13
13
  expect(packageResponse.status).toBe(200)
@@ -55,7 +55,7 @@ test("POST /api/package_releases/get - should find release by package_name_with_
55
55
 
56
56
  // First create a package with valid name format
57
57
  const packageResponse = await axios.post("/api/packages/create", {
58
- name: "@test/package-2",
58
+ name: "testuser/package-2",
59
59
  description: "Another test package",
60
60
  })
61
61
  expect(packageResponse.status).toBe(200)
@@ -92,7 +92,7 @@ test("POST /api/package_releases/get - should return circuit_json_build_error if
92
92
 
93
93
  // First create a package with valid name format
94
94
  const packageResponse = await axios.post("/api/packages/create", {
95
- name: "@test/package-3",
95
+ name: "testuser/package-3",
96
96
  description: "Another test package",
97
97
  })
98
98
  expect(packageResponse.status).toBe(200)
@@ -122,7 +122,7 @@ test("POST /api/package_releases/get?include_logs=true - should return include_l
122
122
 
123
123
  // First create a package with valid name format
124
124
  const packageResponse = await axios.post("/api/packages/create", {
125
- name: "@test/package-4",
125
+ name: "testuser/package-4",
126
126
  description: "Another test package",
127
127
  })
128
128
  expect(packageResponse.status).toBe(200)
@@ -0,0 +1,38 @@
1
+ import { expect, test } from "bun:test"
2
+ import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
3
+
4
+ // ensure image generation fields are returned by /api/package_releases/get
5
+
6
+ test("POST /api/package_releases/get includes image generation fields", async () => {
7
+ const { axios } = await getTestServer()
8
+
9
+ const packageRes = await axios.post("/api/packages/create", {
10
+ name: "testuser/image-fields",
11
+ description: "test package",
12
+ })
13
+
14
+ const { package_id } = packageRes.data.package
15
+
16
+ const releaseRes = await axios.post("/api/package_releases/create", {
17
+ package_id,
18
+ version: "0.0.1",
19
+ is_latest: true,
20
+ })
21
+
22
+ const { package_release } = releaseRes.data
23
+
24
+ const res = await axios.post("/api/package_releases/get", {
25
+ package_release_id: package_release.package_release_id,
26
+ })
27
+
28
+ const pr = res.data.package_release
29
+
30
+ expect(pr.image_generation_in_progress).toBe(false)
31
+ expect(pr.image_generation_started_at).toBeNull()
32
+ expect(pr.image_generation_completed_at).toBeNull()
33
+ expect(pr.image_generation_logs).toBeNull()
34
+ expect(pr.image_generation_is_stale).toBe(false)
35
+ expect(pr.image_generation_error).toBeNull()
36
+ expect(pr.image_generation_error_last_updated_at).toBeNull()
37
+ expect(pr.image_generation_display_status).toBe("pending")
38
+ })
@@ -33,3 +33,22 @@ test("create package with private flag", async () => {
33
33
  expect(response.status).toBe(200)
34
34
  expect(response.data.package.is_private).toBe(true)
35
35
  })
36
+
37
+ test("create package under org", async () => {
38
+ const { jane_axios } = await getTestServer()
39
+
40
+ const orgResponse = await jane_axios.post("/api/orgs/create", {
41
+ name: "testorg",
42
+ })
43
+ expect(orgResponse.status).toBe(200)
44
+ const orgId = orgResponse.data.org.org_id
45
+
46
+ const response = await jane_axios.post("/api/packages/create", {
47
+ name: "testorg/TestPackage",
48
+ description: "Test Description",
49
+ })
50
+
51
+ expect(response.status).toBe(200)
52
+ expect(response.data.package.owner_org_id).toBe(orgId)
53
+ expect(response.data.package.owner_github_username).toBe("testorg")
54
+ })
@@ -41,13 +41,12 @@ test("POST /packages/fork - successful fork using package_id", async () => {
41
41
  expect(forkedPackage.is_private).toBe(false)
42
42
 
43
43
  // List files from the forked package
44
- const packageFilesResponse = await jane_axios.post(
45
- "/api/package_files/list",
46
- {
44
+ const packageFilesResponse = await jane_axios.get("/api/package_files/list", {
45
+ params: {
47
46
  package_name: forkedPackage.name,
48
47
  use_latest_version: true,
49
48
  },
50
- )
49
+ })
51
50
 
52
51
  const package_files = packageFilesResponse.data.package_files
53
52
 
@@ -77,3 +77,33 @@ test("GET /api/packages/get - should return package by name", async () => {
77
77
  expect(responseBody.ok).toBe(true)
78
78
  expect(responseBody.package).toBeDefined()
79
79
  })
80
+
81
+ test("GET /api/packages/get - returns user_permissions when authenticated", async () => {
82
+ const { axios, jane_axios, unauthenticatedAxios } = await getTestServer()
83
+
84
+ const createResponse = await axios.post("/api/packages/create", {
85
+ name: "testuser/auth-package",
86
+ description: "desc",
87
+ })
88
+
89
+ const pkg = createResponse.data.package
90
+
91
+ const ownerResponse = await axios.get("/api/packages/get", {
92
+ params: { package_id: pkg.package_id },
93
+ })
94
+ expect(ownerResponse.data.package.user_permissions).toEqual({
95
+ can_manage_packages: true,
96
+ })
97
+
98
+ const otherResponse = await jane_axios.get("/api/packages/get", {
99
+ params: { package_id: pkg.package_id },
100
+ })
101
+ expect(otherResponse.data.package.user_permissions).toEqual({
102
+ can_manage_packages: false,
103
+ })
104
+
105
+ const unauthResponse = await unauthenticatedAxios.get("/api/packages/get", {
106
+ params: { package_id: pkg.package_id },
107
+ })
108
+ expect(unauthResponse.data.package.user_permissions).toBeUndefined()
109
+ })
@@ -41,8 +41,10 @@ test("get schematic svg of a package", async () => {
41
41
  // create fsMap by getting all the files in the package with the file_path and content_text
42
42
  const fsMap = new Map<string, string>()
43
43
  // list all the files in the package
44
- const files = await axios.post("/api/package_files/list", {
45
- package_release_id: pkg_release.data.package_release.package_release_id,
44
+ const files = await axios.get("/api/package_files/list", {
45
+ params: {
46
+ package_release_id: pkg_release.data.package_release.package_release_id,
47
+ },
46
48
  })
47
49
  for (const file of files.data.package_files) {
48
50
  fsMap.set(file.file_path, file.content_text)
@@ -109,3 +109,37 @@ test("list packages", async () => {
109
109
  const { data: authData } = await axios.get("/api/packages/list")
110
110
  expect(authData.packages).toHaveLength(3) // Should return all packages when authenticated
111
111
  })
112
+
113
+ test("list packages includes user_permissions when session provided", async () => {
114
+ const { axios, jane_axios, unauthenticatedAxios } = await getTestServer()
115
+
116
+ const pkg1 = (
117
+ await axios.post("/api/packages/create", {
118
+ name: "testuser/ownerpkg",
119
+ description: "", // minimal
120
+ })
121
+ ).data.package
122
+
123
+ const pkg2 = (
124
+ await jane_axios.post("/api/packages/create", {
125
+ name: "jane/otherpkg",
126
+ description: "",
127
+ })
128
+ ).data.package
129
+
130
+ const { data: listData } = await axios.get("/api/packages/list")
131
+ const ownerPkg = listData.packages.find(
132
+ (p: any) => p.package_id === pkg1.package_id,
133
+ )
134
+ const otherPkg = listData.packages.find(
135
+ (p: any) => p.package_id === pkg2.package_id,
136
+ )
137
+ expect(ownerPkg.user_permissions).toEqual({ can_manage_packages: true })
138
+ expect(otherPkg.user_permissions).toEqual({ can_manage_packages: false })
139
+
140
+ const { data: unauthData } = await unauthenticatedAxios.get(
141
+ "/api/packages/list",
142
+ { params: { owner_github_username: "testuser" } },
143
+ )
144
+ expect(unauthData.packages[0].user_permissions).toBeUndefined()
145
+ })