@tscircuit/fake-snippets 0.0.5 → 0.0.7

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 (40) hide show
  1. package/bun-tests/fake-snippets-api/routes/package_files/create.test.ts +375 -0
  2. package/bun-tests/fake-snippets-api/routes/package_files/download.test.ts +248 -0
  3. package/bun-tests/fake-snippets-api/routes/package_files/get.test.ts +220 -0
  4. package/bun-tests/fake-snippets-api/routes/package_files/list.test.ts +204 -0
  5. package/bun-tests/fake-snippets-api/routes/package_releases/get.test.ts +0 -1
  6. package/bun.lock +97 -73
  7. package/dist/bundle.js +602 -213
  8. package/fake-snippets-api/lib/db/db-client.ts +13 -0
  9. package/fake-snippets-api/lib/package_file/get-package-file-id-from-file-descriptor.ts +168 -0
  10. package/fake-snippets-api/lib/package_release/find-package-release-id.ts +122 -0
  11. package/fake-snippets-api/routes/api/package_files/create.ts +132 -0
  12. package/fake-snippets-api/routes/api/package_files/download.ts +70 -153
  13. package/fake-snippets-api/routes/api/package_files/get.ts +24 -5
  14. package/fake-snippets-api/routes/api/package_files/list.ts +16 -28
  15. package/fake-snippets-api/routes/api/package_releases/get.ts +21 -1
  16. package/index.html +113 -20
  17. package/package.json +9 -9
  18. package/playwright-tests/profile-page.spec.ts +59 -0
  19. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-before-delete.png +0 -0
  20. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-delete-dialog.png +0 -0
  21. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-dropdown-open.png +0 -0
  22. package/scripts/generate-image-sizes.ts +0 -1
  23. package/scripts/generate_bundle_stats.js +22 -6
  24. package/src/App.tsx +12 -1
  25. package/src/components/AiChatInterface.tsx +8 -0
  26. package/src/components/Analytics.tsx +1 -1
  27. package/src/components/CodeAndPreview.tsx +9 -3
  28. package/src/components/CreateNewSnippetWithAiHero.tsx +6 -2
  29. package/src/components/EditorNav.tsx +4 -0
  30. package/src/components/Footer.tsx +1 -1
  31. package/src/components/Header.tsx +7 -10
  32. package/src/components/HeaderLogin.tsx +1 -1
  33. package/src/components/PreviewContent.tsx +4 -1
  34. package/src/components/SnippetList.tsx +71 -0
  35. package/src/lib/templates/blinking-led-board-template.ts +2 -1
  36. package/src/pages/dashboard.tsx +19 -44
  37. package/src/pages/editor.tsx +1 -1
  38. package/src/pages/landing.tsx +8 -16
  39. package/src/pages/quickstart.tsx +9 -9
  40. package/src/pages/user-profile.tsx +50 -3
@@ -0,0 +1,220 @@
1
+ import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
2
+ import { expect, test } from "bun:test"
3
+ import { packageFileSchema } from "fake-snippets-api/lib/db/schema"
4
+
5
+ test("POST /api/package_files/get - should return package file by package_file_id", async () => {
6
+ const { axios, db } = await getTestServer()
7
+
8
+ // First create a package
9
+ const packageResponse = await axios.post("/api/packages/create", {
10
+ name: "@test/package-files",
11
+ description: "A test package for files",
12
+ })
13
+ expect(packageResponse.status).toBe(200)
14
+ const createdPackage = packageResponse.data.package
15
+
16
+ // Create a package release
17
+ const releaseResponse = await axios.post("/api/package_releases/create", {
18
+ package_id: createdPackage.package_id,
19
+ version: "1.0.0",
20
+ is_latest: true,
21
+ })
22
+ expect(releaseResponse.status).toBe(200)
23
+ const createdRelease = releaseResponse.data.package_release
24
+
25
+ // Add a package file to the test database
26
+ const packageFile = {
27
+ package_release_id: createdRelease.package_release_id,
28
+ file_path: "/index.js",
29
+ content: "console.log('Hello, world!');",
30
+ is_directory: false,
31
+ created_at: new Date().toISOString(),
32
+ }
33
+
34
+ const addedFile = db.addPackageFile(packageFile)
35
+
36
+ // Get the file by package_file_id
37
+ const getResponse = await axios.post("/api/package_files/get", {
38
+ package_file_id: addedFile.package_file_id,
39
+ })
40
+
41
+ expect(getResponse.status).toBe(200)
42
+ const responseBody = getResponse.data
43
+ expect(responseBody.ok).toBe(true)
44
+ expect(responseBody.package_file).toEqual(packageFileSchema.parse(addedFile))
45
+ })
46
+
47
+ test("POST /api/package_files/get - should return package file by package_release_id and file_path", async () => {
48
+ const { axios, db } = await getTestServer()
49
+
50
+ // First create a package
51
+ const packageResponse = await axios.post("/api/packages/create", {
52
+ name: "@test/package-files-2",
53
+ description: "Another test package for files",
54
+ })
55
+ expect(packageResponse.status).toBe(200)
56
+ const createdPackage = packageResponse.data.package
57
+
58
+ // Create a package release
59
+ const releaseResponse = await axios.post("/api/package_releases/create", {
60
+ package_id: createdPackage.package_id,
61
+ version: "1.0.0",
62
+ is_latest: true,
63
+ })
64
+ expect(releaseResponse.status).toBe(200)
65
+ const createdRelease = releaseResponse.data.package_release
66
+
67
+ // Add a package file to the test database
68
+ const filePath = "/src/utils.js"
69
+ const packageFile = {
70
+ package_release_id: createdRelease.package_release_id,
71
+ file_path: filePath,
72
+ content: "export const sum = (a, b) => a + b;",
73
+ is_directory: false,
74
+ created_at: new Date().toISOString(),
75
+ }
76
+
77
+ db.addPackageFile(packageFile)
78
+
79
+ // Get the file by package_release_id and file_path
80
+ const getResponse = await axios.post("/api/package_files/get", {
81
+ package_release_id: createdRelease.package_release_id,
82
+ file_path: filePath,
83
+ })
84
+
85
+ expect(getResponse.status).toBe(200)
86
+ const responseBody = getResponse.data
87
+ expect(responseBody.ok).toBe(true)
88
+ expect(responseBody.package_file.file_path).toBe(filePath)
89
+ expect(responseBody.package_file.package_release_id).toBe(
90
+ createdRelease.package_release_id,
91
+ )
92
+ })
93
+
94
+ test("POST /api/package_files/get - should return package file by package_name_with_version and file_path", async () => {
95
+ const { axios, db } = await getTestServer()
96
+
97
+ // First create a package
98
+ const packageName = "@test/package-files-3"
99
+ const packageResponse = await axios.post("/api/packages/create", {
100
+ name: packageName,
101
+ description: "Package for name_with_version test",
102
+ })
103
+ expect(packageResponse.status).toBe(200)
104
+ const createdPackage = packageResponse.data.package
105
+
106
+ // Create a package release
107
+ const version = "2.0.0"
108
+ const releaseResponse = await axios.post("/api/package_releases/create", {
109
+ package_id: createdPackage.package_id,
110
+ version,
111
+ is_latest: true,
112
+ })
113
+ expect(releaseResponse.status).toBe(200)
114
+ const createdRelease = releaseResponse.data.package_release
115
+
116
+ // Add a package file to the test database
117
+ const filePath = "/README.md"
118
+ const packageFile = {
119
+ package_release_id: createdRelease.package_release_id,
120
+ file_path: filePath,
121
+ content: "# Test Package\nThis is a test package.",
122
+ is_directory: false,
123
+ created_at: new Date().toISOString(),
124
+ }
125
+
126
+ db.addPackageFile(packageFile)
127
+
128
+ // Get the file by package_name_with_version and file_path
129
+ const getResponse = await axios.post("/api/package_files/get", {
130
+ package_name_with_version: `${packageName}@${version}`,
131
+ file_path: filePath,
132
+ })
133
+
134
+ expect(getResponse.status).toBe(200)
135
+ const responseBody = getResponse.data
136
+ expect(responseBody.ok).toBe(true)
137
+ expect(responseBody.package_file.file_path).toBe(filePath)
138
+ expect(responseBody.package_file.package_release_id).toBe(
139
+ createdRelease.package_release_id,
140
+ )
141
+ })
142
+
143
+ test("POST /api/package_files/get - should return 404 if package file not found", async () => {
144
+ const { axios } = await getTestServer()
145
+
146
+ try {
147
+ await axios.post("/api/package_files/get", {
148
+ package_file_id: "123e4567-e89b-12d3-a456-426614174000", // valid UUID format
149
+ })
150
+ throw new Error("Expected request to fail")
151
+ } catch (error: any) {
152
+ expect(error.status).toBe(404)
153
+ expect(error.data.message).toBe("Package file not found")
154
+ }
155
+ })
156
+
157
+ test("POST /api/package_files/get - should return 404 if package not found with package_name", async () => {
158
+ const { axios } = await getTestServer()
159
+
160
+ try {
161
+ await axios.post("/api/package_files/get", {
162
+ package_name: "non-existent-package",
163
+ version: "1.0.0",
164
+ file_path: "/index.js",
165
+ })
166
+ throw new Error("Expected request to fail")
167
+ } catch (error: any) {
168
+ expect(error.status).toBe(404)
169
+ expect(error.data.message).toContain("Package not found")
170
+ }
171
+ })
172
+
173
+ test("POST /api/package_files/get - should return file using package_id and version", async () => {
174
+ const { axios, db } = await getTestServer()
175
+
176
+ // First create a package
177
+ const packageResponse = await axios.post("/api/packages/create", {
178
+ name: "@test/package-files-4",
179
+ description: "Package for package_id and version test",
180
+ })
181
+ expect(packageResponse.status).toBe(200)
182
+ const createdPackage = packageResponse.data.package
183
+
184
+ // Create a package release
185
+ const version = "3.0.0"
186
+ const releaseResponse = await axios.post("/api/package_releases/create", {
187
+ package_id: createdPackage.package_id,
188
+ version,
189
+ is_latest: true,
190
+ })
191
+ expect(releaseResponse.status).toBe(200)
192
+ const createdRelease = releaseResponse.data.package_release
193
+
194
+ // Add a package file to the test database
195
+ const filePath = "/package.json"
196
+ const packageFile = {
197
+ package_release_id: createdRelease.package_release_id,
198
+ file_path: filePath,
199
+ content: '{"name":"test","version":"3.0.0"}',
200
+ is_directory: false,
201
+ created_at: new Date().toISOString(),
202
+ }
203
+
204
+ db.addPackageFile(packageFile)
205
+
206
+ // Get the file by package_id and version
207
+ const getResponse = await axios.post("/api/package_files/get", {
208
+ package_id: createdPackage.package_id,
209
+ version,
210
+ file_path: filePath,
211
+ })
212
+
213
+ expect(getResponse.status).toBe(200)
214
+ const responseBody = getResponse.data
215
+ expect(responseBody.ok).toBe(true)
216
+ expect(responseBody.package_file.file_path).toBe(filePath)
217
+ expect(responseBody.package_file.package_release_id).toBe(
218
+ createdRelease.package_release_id,
219
+ )
220
+ })
@@ -0,0 +1,204 @@
1
+ import { expect, test } from "bun:test"
2
+ import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
3
+ import * as ZT from "fake-snippets-api/lib/db/schema"
4
+ test("list package files by package_release_id", async () => {
5
+ const { axios, db } = await getTestServer()
6
+
7
+ // First create a package
8
+ const packageResponse = await axios.post("/api/packages/create", {
9
+ name: "@test/package-files-list",
10
+ description: "A test package for listing files",
11
+ })
12
+ expect(packageResponse.status).toBe(200)
13
+ const createdPackage = packageResponse.data.package
14
+
15
+ // Create a package release
16
+ const releaseResponse = await axios.post("/api/package_releases/create", {
17
+ package_id: createdPackage.package_id,
18
+ version: "1.0.0",
19
+ is_latest: true,
20
+ })
21
+ expect(releaseResponse.status).toBe(200)
22
+ const createdRelease = releaseResponse.data.package_release
23
+ console.log("createdRelease", createdRelease)
24
+ // Add multiple package files to the test database
25
+ const files = [
26
+ {
27
+ package_release_id: createdRelease.package_release_id,
28
+ file_path: "/index.js",
29
+ content: "console.log('Hello, world!');",
30
+ is_directory: false,
31
+ created_at: new Date().toISOString(),
32
+ },
33
+ {
34
+ package_release_id: createdRelease.package_release_id,
35
+ file_path: "/src/utils.js",
36
+ content: "export const sum = (a, b) => a + b;",
37
+ is_directory: false,
38
+ created_at: new Date().toISOString(),
39
+ },
40
+ {
41
+ package_release_id: createdRelease.package_release_id,
42
+ file_path: "/README.md",
43
+ content: "# Test Package\nThis is a test package.",
44
+ is_directory: false,
45
+ created_at: new Date().toISOString(),
46
+ },
47
+ ]
48
+
49
+ for (const file of files) {
50
+ db.addPackageFile(file)
51
+ }
52
+
53
+ // List files by package_release_id
54
+ const listResponse = await axios.post("/api/package_files/list", {
55
+ package_release_id: createdRelease.package_release_id,
56
+ })
57
+
58
+ expect(listResponse.status).toBe(200)
59
+ const responseBody = listResponse.data
60
+ expect(responseBody.ok).toBe(true)
61
+
62
+ expect(responseBody.package_files).toHaveLength(3)
63
+
64
+ // Verify all files belong to the correct release
65
+ expect(
66
+ responseBody.package_files.every(
67
+ (file: ZT.PackageFile) =>
68
+ file.package_release_id === createdRelease.package_release_id,
69
+ ),
70
+ ).toBe(true)
71
+ })
72
+
73
+ test("list package files by package_name with latest version", async () => {
74
+ const { axios, db } = await getTestServer()
75
+
76
+ // First create a package
77
+ const packageName = "@test/package-files-list-2"
78
+ const packageResponse = await axios.post("/api/packages/create", {
79
+ name: packageName,
80
+ description: "Another test package for listing files",
81
+ })
82
+ expect(packageResponse.status).toBe(200)
83
+ const createdPackage = packageResponse.data.package
84
+
85
+ // Create a package release
86
+ const releaseResponse = await axios.post("/api/package_releases/create", {
87
+ package_id: createdPackage.package_id,
88
+ version: "1.0.0",
89
+ is_latest: true,
90
+ })
91
+ expect(releaseResponse.status).toBe(200)
92
+ const createdRelease = releaseResponse.data.package_release
93
+
94
+ // Add some package files
95
+ const files = [
96
+ {
97
+ package_release_id: createdRelease.package_release_id,
98
+ file_path: "/package.json",
99
+ content: '{"name":"test","version":"1.0.0"}',
100
+ is_directory: false,
101
+ created_at: new Date().toISOString(),
102
+ },
103
+ {
104
+ package_release_id: createdRelease.package_release_id,
105
+ file_path: "/src/index.js",
106
+ content: "export default () => 'Hello';",
107
+ is_directory: false,
108
+ created_at: new Date().toISOString(),
109
+ },
110
+ ]
111
+
112
+ for (const file of files) {
113
+ db.addPackageFile(file)
114
+ }
115
+
116
+ // List files by package_name with use_latest_version
117
+ const listResponse = await axios.post("/api/package_files/list", {
118
+ package_name: packageName.replace(/^@/, ""),
119
+ use_latest_version: true,
120
+ })
121
+
122
+ expect(listResponse.status).toBe(200)
123
+ const responseBody = listResponse.data
124
+ expect(responseBody.ok).toBe(true)
125
+ expect(responseBody.package_files).toHaveLength(2)
126
+ })
127
+
128
+ test("list package files by package_name_with_version", async () => {
129
+ const { axios, db } = await getTestServer()
130
+
131
+ // First create a package
132
+ const packageName = "@test/package-files-list-3"
133
+ const version = "2.0.0"
134
+ const packageResponse = await axios.post("/api/packages/create", {
135
+ name: packageName,
136
+ description: "Package for name_with_version test",
137
+ })
138
+ expect(packageResponse.status).toBe(200)
139
+ const createdPackage = packageResponse.data.package
140
+
141
+ // Create a package release
142
+ const releaseResponse = await axios.post("/api/package_releases/create", {
143
+ package_id: createdPackage.package_id,
144
+ version,
145
+ is_latest: true,
146
+ })
147
+ expect(releaseResponse.status).toBe(200)
148
+ const createdRelease = releaseResponse.data.package_release
149
+
150
+ // Add some package files
151
+ const files = [
152
+ {
153
+ package_release_id: createdRelease.package_release_id,
154
+ file_path: "/tsconfig.json",
155
+ content: '{"compilerOptions":{}}',
156
+ is_directory: false,
157
+ created_at: new Date().toISOString(),
158
+ },
159
+ ]
160
+
161
+ for (const file of files) {
162
+ db.addPackageFile(file)
163
+ }
164
+
165
+ // List files by package_name_with_version
166
+ const listResponse = await axios.post("/api/package_files/list", {
167
+ package_name_with_version: `${packageName}@${version}`,
168
+ })
169
+
170
+ expect(listResponse.status).toBe(200)
171
+ const responseBody = listResponse.data
172
+ expect(responseBody.ok).toBe(true)
173
+ expect(responseBody.package_files).toHaveLength(1)
174
+ expect(responseBody.package_files[0].file_path).toBe("/tsconfig.json")
175
+ })
176
+
177
+ test("list package files - 404 for non-existent package release", async () => {
178
+ const { axios } = await getTestServer()
179
+
180
+ try {
181
+ await axios.post("/api/package_files/list", {
182
+ package_release_id: "00000000-0000-0000-0000-000000000000",
183
+ })
184
+ throw new Error("Expected request to fail")
185
+ } catch (error: any) {
186
+ expect(error.status).toBe(404)
187
+ expect(error.data.error.message).toBe("Package release not found")
188
+ }
189
+ })
190
+
191
+ test("list package files - 404 for non-existent package", async () => {
192
+ const { axios } = await getTestServer()
193
+
194
+ try {
195
+ await axios.post("/api/package_files/list", {
196
+ package_name: "non-existent-package",
197
+ use_latest_version: true,
198
+ })
199
+ throw new Error("Expected request to fail")
200
+ } catch (error: any) {
201
+ expect(error.status).toBe(404)
202
+ expect(error.data.error.message).toBe("Package release not found")
203
+ }
204
+ })
@@ -73,7 +73,6 @@ test("POST /api/package_releases/get - should find release by package_name_with_
73
73
  const listResponse = await axios.post("/api/package_releases/list", {
74
74
  package_name: createdPackage.name,
75
75
  })
76
- console.log(listResponse.data)
77
76
 
78
77
  // Get the release using package_name_with_version
79
78
  const getResponse = await axios.post("/api/package_releases/get", {