@tscircuit/fake-snippets 0.0.109 → 0.0.111

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 (185) 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 +32 -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 +151 -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 +361 -453
  34. package/bunfig.toml +2 -1
  35. package/dist/bundle.js +1313 -639
  36. package/dist/index.d.ts +313 -6
  37. package/dist/index.js +328 -24
  38. package/dist/schema.d.ts +290 -1
  39. package/dist/schema.js +54 -1
  40. package/fake-snippets-api/lib/db/autoload-dev-packages.ts +31 -20
  41. package/fake-snippets-api/lib/db/db-client.ts +219 -4
  42. package/fake-snippets-api/lib/db/schema.ts +63 -1
  43. package/fake-snippets-api/lib/db/seed.ts +100 -0
  44. package/fake-snippets-api/lib/middleware/with-session-auth.ts +60 -8
  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 +33 -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 +48 -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 +60 -0
  54. package/fake-snippets-api/routes/api/orgs/remove_member.ts +46 -0
  55. package/fake-snippets-api/routes/api/orgs/update.ts +118 -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 +57 -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 +25 -19
  64. package/renovate.json +1 -1
  65. package/scripts/generate-sitemap.ts +1 -1
  66. package/src/App.tsx +27 -8
  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 +17 -5
  71. package/src/components/FileSidebar.tsx +11 -17
  72. package/src/components/Footer.tsx +8 -9
  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 +43 -15
  77. package/src/components/NotFound.tsx +5 -5
  78. package/src/components/PackageBreadcrumb.tsx +6 -12
  79. package/src/components/PackageSearchResults.tsx +1 -1
  80. package/src/components/PrefetchPageLink.tsx +7 -1
  81. package/src/components/ProfileRouter.tsx +32 -0
  82. package/src/components/SearchComponent.tsx +12 -8
  83. package/src/components/SentryNotFoundReporter.tsx +44 -0
  84. package/src/components/UserCard.tsx +80 -0
  85. package/src/components/ViewPackagePage/components/build-status.tsx +1 -1
  86. package/src/components/ViewPackagePage/components/important-files-view.tsx +105 -34
  87. package/src/components/ViewPackagePage/components/main-content-header.tsx +10 -6
  88. package/src/components/ViewPackagePage/components/main-content-view-selector.tsx +1 -1
  89. package/src/components/ViewPackagePage/components/mobile-sidebar.tsx +54 -19
  90. package/src/components/ViewPackagePage/components/package-header.tsx +25 -33
  91. package/src/components/ViewPackagePage/components/preview-image-squares.tsx +11 -18
  92. package/src/components/ViewPackagePage/components/repo-page-content.tsx +12 -5
  93. package/src/components/ViewPackagePage/components/sidebar-about-section.tsx +16 -10
  94. package/src/components/ViewPackagePage/components/sidebar-releases-section.tsx +11 -11
  95. package/src/components/ViewPackagePage/components/tab-views/pcb-view.tsx +1 -2
  96. package/src/components/ViewPackagePage/components/tab-views/schematic-view.tsx +2 -1
  97. package/src/components/dialogs/GitHubRepositorySelector.tsx +56 -49
  98. package/src/components/dialogs/edit-package-details-dialog.tsx +5 -6
  99. package/src/components/dialogs/import-component-dialog.tsx +16 -9
  100. package/src/components/dialogs/import-package-dialog.tsx +3 -2
  101. package/src/components/dialogs/new-package-save-prompt-dialog.tsx +190 -0
  102. package/src/components/organization/OrganizationCard.tsx +206 -0
  103. package/src/components/organization/OrganizationCardSkeleton.tsx +55 -0
  104. package/src/components/organization/OrganizationHeader.tsx +154 -0
  105. package/src/components/organization/OrganizationMembers.tsx +146 -0
  106. package/src/components/package-port/CodeAndPreview.tsx +15 -12
  107. package/src/components/package-port/CodeEditor.tsx +4 -30
  108. package/src/components/package-port/CodeEditorHeader.tsx +123 -61
  109. package/src/components/package-port/EditorNav.tsx +32 -49
  110. package/src/components/preview/ConnectedPackagesList.tsx +8 -8
  111. package/src/components/preview/ConnectedRepoOverview.tsx +102 -2
  112. package/src/components/preview/PackageReleasesDashboard.tsx +23 -11
  113. package/src/components/ui/tree-view.tsx +6 -3
  114. package/src/hooks/use-add-org-member-mutation.ts +51 -0
  115. package/src/hooks/use-create-org-mutation.ts +38 -0
  116. package/src/hooks/use-create-package-mutation.ts +3 -0
  117. package/src/hooks/use-current-package-release.ts +4 -3
  118. package/src/hooks/use-download-zip.ts +2 -2
  119. package/src/hooks/use-global-store.ts +6 -4
  120. package/src/hooks/use-hydration.ts +30 -0
  121. package/src/hooks/use-jlcpcb-component-import.tsx +164 -0
  122. package/src/hooks/use-list-org-members.ts +27 -0
  123. package/src/hooks/use-list-user-orgs.ts +25 -0
  124. package/src/hooks/use-org-by-github-handle.ts +26 -0
  125. package/src/hooks/use-org.ts +24 -0
  126. package/src/hooks/use-organization.ts +42 -0
  127. package/src/hooks/use-package-as-snippet.ts +4 -2
  128. package/src/hooks/use-package-builds.ts +6 -2
  129. package/src/hooks/use-package-files.ts +5 -3
  130. package/src/hooks/use-package-release-by-id-or-version.ts +29 -20
  131. package/src/hooks/use-package-release-images.ts +105 -0
  132. package/src/hooks/use-package-release.ts +2 -2
  133. package/src/hooks/use-package-stars.ts +80 -4
  134. package/src/hooks/use-preview-images.ts +6 -3
  135. package/src/hooks/use-remove-org-member-mutation.ts +32 -0
  136. package/src/hooks/use-update-ai-description-mutation.ts +42 -0
  137. package/src/hooks/use-update-org-mutation.ts +41 -0
  138. package/src/hooks/use-warn-user-on-page-change.ts +71 -4
  139. package/src/hooks/useFileManagement.ts +51 -22
  140. package/src/hooks/useOptimizedPackageFilesLoader.ts +11 -24
  141. package/src/hooks/usePackageFilesLoader.ts +2 -2
  142. package/src/hooks/useUpdatePackageFilesMutation.ts +13 -1
  143. package/src/lib/download-fns/download-gltf-from-circuit-json.ts +1 -1
  144. package/src/lib/download-fns/download-kicad-files.ts +22 -11
  145. package/src/lib/download-fns/download-step.ts +12 -0
  146. package/src/lib/normalize-svg-for-tile.ts +50 -0
  147. package/src/lib/posthog.ts +11 -9
  148. package/src/lib/react-query-api-failure-tracking.ts +148 -0
  149. package/src/lib/sentry.ts +14 -0
  150. package/src/lib/templates/blank-circuit-board-template.ts +0 -4
  151. package/src/lib/ts-lib-cache.ts +122 -7
  152. package/src/lib/utils/checkIfManualEditsImported.ts +4 -4
  153. package/src/lib/utils/findTargetFile.ts +45 -10
  154. package/src/lib/utils/isComponentExported.ts +2 -1
  155. package/src/main.tsx +2 -1
  156. package/src/pages/create-organization.tsx +169 -0
  157. package/src/pages/dashboard.tsx +38 -6
  158. package/src/pages/datasheet.tsx +1 -1
  159. package/src/pages/datasheets.tsx +3 -3
  160. package/src/pages/editor.tsx +4 -6
  161. package/src/pages/landing.tsx +6 -6
  162. package/src/pages/latest.tsx +3 -0
  163. package/src/pages/organization-profile.tsx +199 -0
  164. package/src/pages/organization-settings.tsx +569 -0
  165. package/src/pages/package-editor.tsx +21 -21
  166. package/src/pages/preview-release.tsx +75 -145
  167. package/src/pages/quickstart.tsx +159 -123
  168. package/src/pages/release-detail.tsx +119 -31
  169. package/src/pages/search.tsx +197 -57
  170. package/src/pages/settings-redirect.tsx +44 -0
  171. package/src/pages/trending.tsx +29 -20
  172. package/src/pages/user-profile.tsx +58 -7
  173. package/src/pages/user-settings.tsx +161 -0
  174. package/src/pages/view-package.tsx +30 -16
  175. package/vite.config.ts +9 -0
  176. package/fake-snippets-api/routes/api/autocomplete/create_autocomplete.ts +0 -133
  177. package/src/components/JLCPCBImportDialog.tsx +0 -280
  178. package/src/components/PackageBuildsPage/LogContent.tsx +0 -72
  179. package/src/components/PackageBuildsPage/PackageBuildDetailsPage.tsx +0 -113
  180. package/src/components/PackageBuildsPage/build-preview-content.tsx +0 -56
  181. package/src/components/PackageBuildsPage/collapsible-section.tsx +0 -63
  182. package/src/components/PackageBuildsPage/package-build-details-panel.tsx +0 -166
  183. package/src/components/PackageBuildsPage/package-build-header.tsx +0 -79
  184. package/src/components/PageSearchComponent.tsx +0 -148
  185. package/src/pages/package-builds.tsx +0 -33
package/dist/index.js CHANGED
@@ -65,7 +65,9 @@ var shippingInfoSchema = z.object({
65
65
  var accountSchema = z.object({
66
66
  account_id: z.string(),
67
67
  github_username: z.string(),
68
- shippingInfo: shippingInfoSchema.optional()
68
+ shippingInfo: shippingInfoSchema.optional(),
69
+ personal_org_id: z.string().optional(),
70
+ is_tscircuit_staff: z.boolean().default(false)
69
71
  });
70
72
  var orderSchema = z.object({
71
73
  order_id: z.string(),
@@ -203,6 +205,15 @@ var packageReleaseSchema = z.object({
203
205
  circuit_json_build_completed_at: z.string().datetime().nullable().optional(),
204
206
  circuit_json_build_logs: z.array(z.any()).default([]),
205
207
  circuit_json_build_is_stale: z.boolean().default(false),
208
+ // Image Generation Process
209
+ image_generation_display_status: z.enum(["pending", "building", "complete", "error"]).default("pending"),
210
+ image_generation_in_progress: z.boolean().default(false),
211
+ image_generation_started_at: z.string().datetime().nullable().optional(),
212
+ image_generation_completed_at: z.string().datetime().nullable().optional(),
213
+ image_generation_logs: z.array(z.any()).nullable().default(null),
214
+ image_generation_is_stale: z.boolean().default(false),
215
+ image_generation_error: z.string().nullable().optional(),
216
+ image_generation_error_last_updated_at: z.string().datetime().nullable().optional(),
206
217
  // AI Review
207
218
  ai_review_text: z.string().nullable().default(null).optional(),
208
219
  ai_review_started_at: z.string().datetime().nullable().optional(),
@@ -311,6 +322,11 @@ var packageBuildSchema = z.object({
311
322
  circuit_json_build_completed_at: z.string().datetime().nullable().optional(),
312
323
  circuit_json_build_logs: z.array(z.any()).default([]),
313
324
  circuit_json_build_error: z.string().nullable().optional(),
325
+ image_generation_in_progress: z.boolean().default(false),
326
+ image_generation_started_at: z.string().datetime().nullable().optional(),
327
+ image_generation_completed_at: z.string().datetime().nullable().optional(),
328
+ image_generation_logs: z.array(z.any()).default([]),
329
+ image_generation_error: z.string().nullable().optional(),
314
330
  build_in_progress: z.boolean().default(false),
315
331
  build_started_at: z.string().datetime().nullable().optional(),
316
332
  build_completed_at: z.string().datetime().nullable().optional(),
@@ -319,6 +335,38 @@ var packageBuildSchema = z.object({
319
335
  preview_url: z.string().nullable().optional(),
320
336
  build_logs: z.string().nullable().optional()
321
337
  });
338
+ var orgSchema = z.object({
339
+ org_id: z.string(),
340
+ github_handle: z.string().optional(),
341
+ owner_account_id: z.string(),
342
+ is_personal_org: z.boolean().default(false),
343
+ created_at: z.string().datetime(),
344
+ org_display_name: z.string().optional(),
345
+ org_name: z.string()
346
+ });
347
+ var orgAccountSchema = z.object({
348
+ org_account_id: z.string(),
349
+ org_id: z.string(),
350
+ account_id: z.string(),
351
+ is_owner: z.boolean().default(false),
352
+ created_at: z.string().datetime()
353
+ });
354
+ var publicOrgSchema = z.object({
355
+ org_id: z.string(),
356
+ //.uuid(),
357
+ owner_account_id: z.string(),
358
+ //.uuid(),
359
+ name: z.string().nullable(),
360
+ member_count: z.number(),
361
+ is_personal_org: z.boolean(),
362
+ display_name: z.string().optional(),
363
+ package_count: z.number(),
364
+ created_at: z.string(),
365
+ user_permissions: z.object({
366
+ can_manage_org: z.boolean().optional(),
367
+ can_manage_package: z.boolean().optional()
368
+ }).optional()
369
+ });
322
370
  var databaseSchema = z.object({
323
371
  idCounter: z.number().default(0),
324
372
  snippets: z.array(snippetSchema).default([]),
@@ -329,6 +377,8 @@ var databaseSchema = z.object({
329
377
  accounts: z.array(accountSchema).default([]),
330
378
  packages: z.array(packageSchema).default([]),
331
379
  orders: z.array(orderSchema).default([]),
380
+ organizations: z.array(orgSchema).default([]),
381
+ orgAccounts: z.array(orgAccountSchema).default([]),
332
382
  orderFiles: z.array(orderFileSchema).default([]),
333
383
  accountSnippets: z.array(accountSnippetSchema).default([]),
334
384
  accountPackages: z.array(accountPackageSchema).default([]),
@@ -354,7 +404,7 @@ var extractTsciDependencies = (code) => {
354
404
  }));
355
405
  };
356
406
  var registryApi = axios.create({
357
- baseURL: "https://registry-api.tscircuit.com",
407
+ baseURL: "https://api.tscircuit.com",
358
408
  headers: {
359
409
  Accept: "application/json",
360
410
  "Content-Type": "application/json"
@@ -362,7 +412,7 @@ var registryApi = axios.create({
362
412
  });
363
413
  var fetchPackageFromRegistry = async (owner, name) => {
364
414
  const fullName = `${owner}/${name}`;
365
- console.log(`Fetching package ${fullName}...`);
415
+ console.log(`[autoload-dev-pkgs] \u{1F4E6} Fetching package ${fullName}...`);
366
416
  let packageData;
367
417
  try {
368
418
  const response = await registryApi.post("/packages/get", {
@@ -381,32 +431,39 @@ var fetchPackageFromRegistry = async (owner, name) => {
381
431
  });
382
432
  releaseData = response.data;
383
433
  } catch (e) {
384
- console.error(`Failed to fetch release data for ${fullName}:`, e);
434
+ console.error(
435
+ `[autoload-dev-pkgs] \u274C Failed to fetch release data for ${fullName}:`,
436
+ e
437
+ );
385
438
  throw e;
386
439
  }
387
440
  let filesData;
388
441
  try {
389
- const response = await registryApi.post("/package_files/list", {
390
- package_release_id: releaseData.package_release.package_release_id
391
- });
442
+ const response = await registryApi.post(
443
+ `package_files/list?package_release_id=${releaseData.package_release.package_release_id}`,
444
+ {}
445
+ );
392
446
  filesData = response.data;
393
447
  for (const file of filesData.package_files) {
394
448
  try {
395
- const fileResponse = await registryApi.post("/package_files/get", {
396
- package_release_id: releaseData.package_release.package_release_id,
397
- file_path: file.file_path
398
- });
449
+ const fileResponse = await registryApi.post(
450
+ `/package_files/get?package_file_id=${file.package_file_id}`,
451
+ {}
452
+ );
399
453
  file.content_text = fileResponse.data.package_file.content_text;
400
454
  } catch (e) {
401
455
  console.error(
402
- `Failed to fetch content for file ${file.file_path} in package ${fullName}:`,
456
+ `[autoload-dev-pkgs] \u274C Failed to fetch content for file ${file.file_path} in package ${fullName}:`,
403
457
  e
404
458
  );
405
459
  throw e;
406
460
  }
407
461
  }
408
462
  } catch (e) {
409
- console.error(`Failed to fetch files data for ${fullName}:`, e);
463
+ console.error(
464
+ `[autoload-dev-pkgs] \u274C Failed to fetch files data for ${fullName}:`,
465
+ e
466
+ );
410
467
  throw e;
411
468
  }
412
469
  return {
@@ -424,12 +481,12 @@ var loadPackageWithDependencies = async (db, owner, name, loadedPackages = /* @_
424
481
  try {
425
482
  result = await fetchPackageFromRegistry(owner, name);
426
483
  } catch (e) {
427
- console.error(`\u2717 Failed to load ${packageKey}`);
484
+ console.error(`[autoload-dev-pkgs] \u274C Failed to load ${packageKey}`);
428
485
  return false;
429
486
  }
430
487
  const { package: pkg, release, files } = result;
431
488
  if (db.getPackageById(pkg.package_id)) {
432
- console.log(`\u2713 Package ${packageKey} already exists`);
489
+ console.log(`[autoload-dev-pkgs] \u26A1 Package ${packageKey} already exists`);
433
490
  return true;
434
491
  }
435
492
  db.addPackage({
@@ -453,7 +510,7 @@ var loadPackageWithDependencies = async (db, owner, name, loadedPackages = /* @_
453
510
  });
454
511
  }
455
512
  loadedPackages.add(packageKey);
456
- console.log(`\u2713 Loaded ${packageKey}`);
513
+ console.log(`[autoload-dev-pkgs] \u{1F4E6} Loaded ${packageKey}`);
457
514
  const mainFile = files.find(
458
515
  (f) => f.file_path === "index.tsx" || f.file_path === "index.ts"
459
516
  );
@@ -472,7 +529,7 @@ var loadPackageWithDependencies = async (db, owner, name, loadedPackages = /* @_
472
529
  if (!depLoaded) {
473
530
  allDepsLoaded = false;
474
531
  console.warn(
475
- `\u26A0\uFE0F Failed to load dependency ${dep.owner}/${dep.name} for ${packageKey}`
532
+ `[autoload-dev-pkgs] \u26A0\uFE0F Failed to load dependency ${dep.owner}/${dep.name} for ${packageKey}`
476
533
  );
477
534
  }
478
535
  }
@@ -485,7 +542,7 @@ var loadAutoloadPackages = async (db) => {
485
542
  "autoload-packages.json"
486
543
  );
487
544
  if (!fs.existsSync(autoloadPath)) {
488
- console.error("No autoload-packages.json found");
545
+ console.error("[autoload-dev-pkgs] \u274C No autoload-packages.json found");
489
546
  return;
490
547
  }
491
548
  const autoloadContent = JSON.parse(fs.readFileSync(autoloadPath, "utf8"));
@@ -506,10 +563,14 @@ var loadAutoloadPackages = async (db) => {
506
563
  }
507
564
  }
508
565
  console.log(`
509
- Package loading complete:`);
510
- console.log(`\u2713 Successfully loaded: ${successCount} packages`);
566
+ [autoload-dev-pkgs] \u{1F4CB} Package loading complete:`);
567
+ console.log(
568
+ `[autoload-dev-pkgs] \u2705 Successfully loaded: ${successCount} packages`
569
+ );
511
570
  if (failureCount > 0) {
512
- console.log(`\u2717 Failed to load: ${failureCount} packages`);
571
+ console.log(
572
+ `[autoload-dev-pkgs] \u274C Failed to load: ${failureCount} packages`
573
+ );
513
574
  }
514
575
  };
515
576
 
@@ -2215,6 +2276,97 @@ export const SquareWaveModule = () => (
2215
2276
  started_at: null,
2216
2277
  completed_at: null
2217
2278
  });
2279
+ const testOrg = db.addOrganization({
2280
+ name: "test-organization",
2281
+ owner_account_id: account_id
2282
+ });
2283
+ db.addOrganizationAccount({
2284
+ org_id: testOrg.org_id,
2285
+ account_id,
2286
+ is_owner: true
2287
+ });
2288
+ const { package_release_id: orgPackageReleaseId } = db.addSnippet({
2289
+ name: "test-organization/test-package",
2290
+ unscoped_name: "test-package",
2291
+ owner_name: "test-organization",
2292
+ code: `
2293
+ export const TestComponent = ({ name }: { name: string }) => (
2294
+ <resistor name={name} resistance="10k" />
2295
+ )
2296
+ `.trim(),
2297
+ dts: `
2298
+ declare module "@tsci/test-organization.test-package" {
2299
+ export const TestComponent: ({ name }: {
2300
+ name: string;
2301
+ }) => any;
2302
+ }
2303
+ `.trim(),
2304
+ compiled_js: `
2305
+ "use strict";
2306
+
2307
+ Object.defineProperty(exports, "__esModule", {
2308
+ value: true
2309
+ });
2310
+ exports.TestComponent = void 0;
2311
+ const TestComponent = ({
2312
+ name
2313
+ }) => /*#__PURE__*/React.createElement("resistor", {
2314
+ name: name,
2315
+ resistance: "10k"
2316
+ });
2317
+ exports.TestComponent = TestComponent;
2318
+ `.trim(),
2319
+ created_at: (/* @__PURE__ */ new Date()).toISOString(),
2320
+ updated_at: (/* @__PURE__ */ new Date()).toISOString(),
2321
+ snippet_type: "package",
2322
+ description: "Test package for organization",
2323
+ circuit_json: [
2324
+ {
2325
+ type: "source_component",
2326
+ source_component_id: "source_component_0",
2327
+ ftype: "simple_resistor",
2328
+ name: "R1",
2329
+ resistance: "10k"
2330
+ }
2331
+ ]
2332
+ });
2333
+ const orgPackageBuild = db.addPackageBuild({
2334
+ package_release_id: orgPackageReleaseId,
2335
+ created_at: (/* @__PURE__ */ new Date()).toISOString(),
2336
+ transpilation_in_progress: false,
2337
+ transpilation_started_at: new Date(Date.now() - 5e3).toISOString(),
2338
+ transpilation_completed_at: new Date(Date.now() - 3e3).toISOString(),
2339
+ transpilation_logs: [
2340
+ "[INFO] Starting transpilation...",
2341
+ "[SUCCESS] Transpilation completed successfully"
2342
+ ],
2343
+ transpilation_error: null,
2344
+ circuit_json_build_in_progress: false,
2345
+ circuit_json_build_started_at: new Date(Date.now() - 3e3).toISOString(),
2346
+ circuit_json_build_completed_at: new Date(Date.now() - 1e3).toISOString(),
2347
+ circuit_json_build_logs: [
2348
+ "[INFO] Starting circuit JSON build...",
2349
+ "[SUCCESS] Circuit JSON build completed"
2350
+ ],
2351
+ circuit_json_build_error: null,
2352
+ build_in_progress: false,
2353
+ build_started_at: new Date(Date.now() - 1e4).toISOString(),
2354
+ build_completed_at: (/* @__PURE__ */ new Date()).toISOString(),
2355
+ build_error: null,
2356
+ build_error_last_updated_at: (/* @__PURE__ */ new Date()).toISOString(),
2357
+ preview_url: "http://localhost:3000/preview/org_package_build",
2358
+ build_logs: "Build completed successfully"
2359
+ });
2360
+ const orgRelease = db.getPackageReleaseById(orgPackageReleaseId);
2361
+ db.updatePackageRelease({
2362
+ ...orgRelease,
2363
+ latest_package_build_id: orgPackageBuild.package_build_id
2364
+ });
2365
+ db.addOrganization({
2366
+ name: "testuser",
2367
+ owner_account_id: account_id,
2368
+ is_personal_org: true
2369
+ });
2218
2370
  };
2219
2371
 
2220
2372
  // fake-snippets-api/lib/package_file/generate-fs-sha.ts
@@ -2353,7 +2505,8 @@ var initializer = combine(databaseSchema.parse({}), (set, get) => ({
2353
2505
  addAccount: (account) => {
2354
2506
  const newAccount = {
2355
2507
  account_id: account.account_id || `account_${get().idCounter + 1}`,
2356
- ...account
2508
+ ...account,
2509
+ is_tscircuit_staff: Boolean(account.is_tscircuit_staff)
2357
2510
  };
2358
2511
  set((state) => {
2359
2512
  return {
@@ -3357,10 +3510,10 @@ var initializer = combine(databaseSchema.parse({}), (set, get) => ({
3357
3510
  return updated;
3358
3511
  },
3359
3512
  addPackageBuild: (packageBuild) => {
3360
- const newPackageBuild = {
3513
+ const newPackageBuild = packageBuildSchema.parse({
3361
3514
  package_build_id: crypto.randomUUID(),
3362
3515
  ...packageBuild
3363
- };
3516
+ });
3364
3517
  set((state) => ({
3365
3518
  packageBuilds: [...state.packageBuilds, newPackageBuild],
3366
3519
  // Automatically update the package release to reference this as the latest build
@@ -3398,6 +3551,157 @@ var initializer = combine(databaseSchema.parse({}), (set, get) => ({
3398
3551
  return { ...state, packageBuilds };
3399
3552
  });
3400
3553
  return updated;
3554
+ },
3555
+ addOrganization: (organization) => {
3556
+ const newOrganization = {
3557
+ org_name: organization.name,
3558
+ org_id: organization.org_id || `org_${get().idCounter + 1}`,
3559
+ github_handle: organization.github_handle,
3560
+ is_personal_org: organization.is_personal_org || false,
3561
+ created_at: (/* @__PURE__ */ new Date()).toISOString(),
3562
+ ...organization
3563
+ };
3564
+ set((state) => ({
3565
+ idCounter: state.idCounter + 1,
3566
+ organizations: [...state.organizations, newOrganization],
3567
+ // Add the creator as a member of the new org by setting their personal_org_id
3568
+ accounts: state.accounts.map(
3569
+ (account) => account.account_id === organization.owner_account_id ? { ...account, personal_org_id: newOrganization.org_id } : account
3570
+ )
3571
+ }));
3572
+ return newOrganization;
3573
+ },
3574
+ getOrgs: (filters, auth) => {
3575
+ let orgs = get().organizations;
3576
+ if (filters?.owner_account_id) {
3577
+ orgs = orgs.filter(
3578
+ (org) => org.owner_account_id === filters.owner_account_id
3579
+ );
3580
+ }
3581
+ if (filters?.github_handle) {
3582
+ orgs = orgs.filter((org) => {
3583
+ const account = get().accounts.find(
3584
+ (account2) => account2.account_id === org.owner_account_id
3585
+ );
3586
+ return account?.github_username === filters.github_handle;
3587
+ });
3588
+ }
3589
+ if (filters?.name) {
3590
+ orgs = orgs.filter((org) => org.github_handle === filters.name);
3591
+ }
3592
+ return orgs.map((org) => {
3593
+ const member_count = get().accounts.filter(
3594
+ (account) => account.personal_org_id === org.org_id
3595
+ ).length;
3596
+ const package_count = get().packages.filter(
3597
+ (pkg) => pkg.owner_org_id === org.org_id
3598
+ ).length;
3599
+ const can_manage_org = auth ? org.owner_account_id === auth.account_id : false;
3600
+ return {
3601
+ ...org,
3602
+ member_count,
3603
+ package_count,
3604
+ can_manage_org
3605
+ };
3606
+ });
3607
+ },
3608
+ getOrg: (filters, auth) => {
3609
+ let orgs = get().organizations;
3610
+ if (filters?.org_id) {
3611
+ orgs = orgs.filter((org2) => org2.org_id === filters.org_id);
3612
+ }
3613
+ if (filters?.org_name) {
3614
+ orgs = orgs.filter((org2) => org2.org_name === filters.org_name);
3615
+ }
3616
+ if (filters?.github_handle) {
3617
+ orgs = orgs.filter((org2) => org2.github_handle === filters.github_handle);
3618
+ }
3619
+ if (orgs.length === 0) {
3620
+ return null;
3621
+ }
3622
+ const org = orgs[0];
3623
+ const member_count = get().accounts.filter(
3624
+ (account) => account.personal_org_id === org.org_id
3625
+ ).length;
3626
+ const package_count = get().packages.filter(
3627
+ (pkg) => pkg.owner_org_id === org.org_id
3628
+ ).length;
3629
+ const can_manage_org = auth ? org.owner_account_id === auth.account_id : false;
3630
+ return {
3631
+ ...org,
3632
+ member_count,
3633
+ package_count,
3634
+ can_manage_org
3635
+ };
3636
+ },
3637
+ addOrganizationAccount: (organizationAccount) => {
3638
+ const newOrgAccount = {
3639
+ org_account_id: `org_account_${get().idCounter + 1}`,
3640
+ org_id: organizationAccount.org_id,
3641
+ account_id: organizationAccount.account_id,
3642
+ is_owner: organizationAccount.is_owner || false,
3643
+ created_at: (/* @__PURE__ */ new Date()).toISOString()
3644
+ };
3645
+ set((state) => ({
3646
+ orgAccounts: [...state.orgAccounts, newOrgAccount],
3647
+ idCounter: state.idCounter + 1
3648
+ }));
3649
+ return newOrgAccount;
3650
+ },
3651
+ getOrganizationAccount: (filters) => {
3652
+ const state = get();
3653
+ return state.orgAccounts.find((orgAccount) => {
3654
+ if (filters.org_id && orgAccount.org_id !== filters.org_id) {
3655
+ return false;
3656
+ }
3657
+ if (filters.account_id && orgAccount.account_id !== filters.account_id) {
3658
+ return false;
3659
+ }
3660
+ return true;
3661
+ });
3662
+ },
3663
+ getOrganizationAccounts: (filters) => {
3664
+ const state = get();
3665
+ return state.orgAccounts.filter((orgAccount) => {
3666
+ if (filters?.org_id && orgAccount.org_id !== filters.org_id) {
3667
+ return false;
3668
+ }
3669
+ if (filters?.account_id && orgAccount.account_id !== filters.account_id) {
3670
+ return false;
3671
+ }
3672
+ return true;
3673
+ });
3674
+ },
3675
+ removeOrganizationAccount: (filters) => {
3676
+ let removed = false;
3677
+ set((state) => {
3678
+ const index = state.orgAccounts.findIndex(
3679
+ (orgAccount) => orgAccount.org_id === filters.org_id && orgAccount.account_id === filters.account_id
3680
+ );
3681
+ if (index !== -1) {
3682
+ state.orgAccounts.splice(index, 1);
3683
+ removed = true;
3684
+ }
3685
+ return state;
3686
+ });
3687
+ return removed;
3688
+ },
3689
+ updateOrganization: (orgId, updates) => {
3690
+ let updatedOrg;
3691
+ set((state) => {
3692
+ const orgIndex = state.organizations.findIndex(
3693
+ (org) => org.org_id === orgId
3694
+ );
3695
+ if (orgIndex === -1) return state;
3696
+ const updatedOrganizations = [...state.organizations];
3697
+ updatedOrganizations[orgIndex] = {
3698
+ ...updatedOrganizations[orgIndex],
3699
+ ...updates
3700
+ };
3701
+ updatedOrg = updatedOrganizations[orgIndex];
3702
+ return { ...state, organizations: updatedOrganizations };
3703
+ });
3704
+ return updatedOrg;
3401
3705
  }
3402
3706
  }));
3403
3707