@tscircuit/fake-snippets 0.0.66 → 0.0.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bun-tests/fake-snippets-api/fixtures/get-circuit-json.ts +5 -143
- package/bun-tests/fake-snippets-api/fixtures/get-test-server.ts +1 -4
- package/bun-tests/fake-snippets-api/fixtures/start-server.ts +7 -3
- package/bun-tests/fake-snippets-api/routes/order_quotes/create.test.ts +20 -56
- package/bun-tests/fake-snippets-api/routes/package_files/create_or_update.test.ts +2 -2
- package/bun-tests/fake-snippets-api/routes/package_releases/update.test.ts +1 -1
- package/bun-tests/fake-snippets-api/routes/packages/images.test.ts +0 -11
- package/bun.lock +15 -17
- package/dist/bundle.js +32 -39
- package/fake-snippets-api/routes/api/order_quotes/create.ts +30 -37
- package/fake-snippets-api/routes/api/order_quotes/get.ts +5 -8
- package/package.json +4 -3
- package/src/App.tsx +0 -7
- package/src/ContextProviders.tsx +2 -0
- package/src/components/DownloadButtonAndMenu.tsx +1 -4
- package/src/components/Footer.tsx +5 -2
- package/src/components/HeaderLogin.tsx +37 -54
- package/src/components/ImageWithFallback.tsx +37 -0
- package/src/components/JLCPCBImportDialog.tsx +43 -24
- package/src/components/PackageCard.tsx +2 -2
- package/src/components/{SnippetLink.tsx → PackageLink.tsx} +8 -16
- package/src/components/PackageSearchResults.tsx +87 -0
- package/src/components/PackagesList.tsx +3 -3
- package/src/components/PageSearchComponent.tsx +9 -9
- package/src/components/ViewPackagePage/components/ShikiCodeViewer.tsx +5 -28
- package/src/components/ViewPackagePage/components/main-content-header.tsx +8 -8
- package/src/components/ViewPackagePage/components/mobile-sidebar.tsx +24 -14
- package/src/components/ViewPackagePage/components/package-header.tsx +6 -1
- package/src/components/package-port/CodeEditor.tsx +13 -10
- package/src/components/package-port/CodeEditorHeader.tsx +1 -1
- package/src/components/package-port/EditorNav.tsx +2 -2
- package/src/hooks/use-global-store.ts +1 -0
- package/src/hooks/use-shiki-highlighter.ts +13 -6
- package/src/lib/download-fns/download-gltf.ts +3 -10
- package/src/lib/handleManualEditsImport.tsx +1 -1
- package/src/lib/types.ts +4 -2
- package/src/pages/dashboard.tsx +3 -4
- package/src/pages/editor.tsx +20 -14
- package/src/pages/latest.tsx +25 -26
- package/src/pages/search.tsx +120 -19
- package/src/pages/trending.tsx +14 -58
- package/src/pages/user-profile.tsx +13 -8
- package/bun-tests/fake-snippets-api/routes/snippets/add_star.test.ts +0 -84
- package/bun-tests/fake-snippets-api/routes/snippets/create.test.ts +0 -53
- package/bun-tests/fake-snippets-api/routes/snippets/delete.test.ts +0 -82
- package/bun-tests/fake-snippets-api/routes/snippets/download.test.ts +0 -90
- package/bun-tests/fake-snippets-api/routes/snippets/generate_from_jlcpcb.test.ts +0 -16
- package/bun-tests/fake-snippets-api/routes/snippets/get.test.ts +0 -163
- package/bun-tests/fake-snippets-api/routes/snippets/get_image.test.ts +0 -117
- package/bun-tests/fake-snippets-api/routes/snippets/images.test.ts +0 -114
- package/bun-tests/fake-snippets-api/routes/snippets/list.test.ts +0 -169
- package/bun-tests/fake-snippets-api/routes/snippets/list_newest.test.ts +0 -50
- package/bun-tests/fake-snippets-api/routes/snippets/list_trending.test.ts +0 -72
- package/bun-tests/fake-snippets-api/routes/snippets/remove_star.test.ts +0 -80
- package/bun-tests/fake-snippets-api/routes/snippets/search.test.ts +0 -75
- package/bun-tests/fake-snippets-api/routes/snippets/star-count.test.ts +0 -51
- package/bun-tests/fake-snippets-api/routes/snippets/update.test.ts +0 -175
- package/src/components/AiChatInterface.tsx +0 -229
- package/src/components/CodeAndPreview.tsx +0 -289
- package/src/components/CodeEditor.tsx +0 -539
- package/src/components/CodeEditorHeader.tsx +0 -135
- package/src/components/EditorNav.tsx +0 -502
- package/src/components/PreviewContent.tsx +0 -372
- package/src/components/SnippetCard.tsx +0 -159
- package/src/components/SnippetList.tsx +0 -71
- package/src/hooks/use-compiled-tsx.ts +0 -37
- package/src/hooks/use-run-tsx/construct-circuit.tsx +0 -62
- package/src/hooks/use-run-tsx/index.tsx +0 -256
- package/src/hooks/use-save-snippet.ts +0 -66
- package/src/hooks/use-typecheck.ts +0 -54
- package/src/lib/utils/getSyntaxError.ts +0 -13
- package/src/pages/ai.tsx +0 -92
- package/src/pages/view-snippet.tsx +0 -166
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
|
|
2
|
-
import { test, expect } from "bun:test"
|
|
3
|
-
|
|
4
|
-
test("download snippet files and directory listing", async () => {
|
|
5
|
-
const { axios, db } = await getTestServer()
|
|
6
|
-
|
|
7
|
-
// Add a test snippet
|
|
8
|
-
const snippet = {
|
|
9
|
-
unscoped_name: "test-package",
|
|
10
|
-
owner_name: "testuser",
|
|
11
|
-
code: "export const TestComponent = () => <div>Test</div>",
|
|
12
|
-
dts: "export declare const TestComponent: () => JSX.Element",
|
|
13
|
-
created_at: "2023-01-01T00:00:00Z",
|
|
14
|
-
updated_at: "2023-01-01T00:00:00Z",
|
|
15
|
-
name: "testuser/test-package",
|
|
16
|
-
snippet_type: "package",
|
|
17
|
-
description: "Test package",
|
|
18
|
-
}
|
|
19
|
-
db.addSnippet(snippet as any)
|
|
20
|
-
|
|
21
|
-
// Test downloading index.ts
|
|
22
|
-
const indexResponse = await axios.get("/api/snippets/download", {
|
|
23
|
-
params: { jsdelivr_path: "testuser/test-package@1.0.0/index.ts" },
|
|
24
|
-
})
|
|
25
|
-
expect(indexResponse.status).toBe(200)
|
|
26
|
-
expect(indexResponse.data).toBe(snippet.code)
|
|
27
|
-
|
|
28
|
-
// Test downloading index.d.ts
|
|
29
|
-
const dtsResponse = await axios.get("/api/snippets/download", {
|
|
30
|
-
params: { jsdelivr_path: "testuser/test-package@1.0.0/index.d.ts" },
|
|
31
|
-
})
|
|
32
|
-
expect(dtsResponse.status).toBe(200)
|
|
33
|
-
expect(dtsResponse.data).toBe(snippet.dts)
|
|
34
|
-
|
|
35
|
-
// Test downloading package.json
|
|
36
|
-
const packageJsonResponse = await axios.get("/api/snippets/download", {
|
|
37
|
-
params: { jsdelivr_path: "testuser/test-package@1.0.0/package.json" },
|
|
38
|
-
})
|
|
39
|
-
expect(packageJsonResponse.status).toBe(200)
|
|
40
|
-
const packageJson = packageJsonResponse.data
|
|
41
|
-
expect(packageJson).toEqual({
|
|
42
|
-
name: "@tsci/testuser.test-package",
|
|
43
|
-
version: "1.0.0",
|
|
44
|
-
main: "index.ts",
|
|
45
|
-
types: "index.d.ts",
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
// Test downloading root (directory listing)
|
|
49
|
-
const rootResponse = await axios.get("/api/snippets/download", {
|
|
50
|
-
params: { jsdelivr_path: "testuser/test-package@1.0.0" },
|
|
51
|
-
})
|
|
52
|
-
expect(rootResponse.status).toBe(200)
|
|
53
|
-
const rootData = rootResponse.data
|
|
54
|
-
expect(rootData.tags).toBeDefined()
|
|
55
|
-
expect(rootData.versions).toBeDefined()
|
|
56
|
-
|
|
57
|
-
// Test downloading flat directory listing
|
|
58
|
-
const flatResponse = await axios.get("/api/snippets/download", {
|
|
59
|
-
params: { jsdelivr_path: "testuser/test-package@1.0.0/flat" },
|
|
60
|
-
})
|
|
61
|
-
expect(flatResponse.status).toBe(200)
|
|
62
|
-
const flatData = flatResponse.data
|
|
63
|
-
expect(flatData.default).toBe("/index.ts")
|
|
64
|
-
expect(flatData.files).toHaveLength(3)
|
|
65
|
-
expect(flatData.files[0].name).toMatch(/^\//)
|
|
66
|
-
|
|
67
|
-
// Test downloading non-existent file
|
|
68
|
-
try {
|
|
69
|
-
await axios.get("/api/snippets/download", {
|
|
70
|
-
params: { jsdelivr_path: "testuser/test-package@1.0.0/non-existent.ts" },
|
|
71
|
-
})
|
|
72
|
-
// If the request doesn't throw an error, fail the test
|
|
73
|
-
expect(true).toBe(false)
|
|
74
|
-
} catch (error: any) {
|
|
75
|
-
expect(error.status).toBe(404)
|
|
76
|
-
expect(error.data.error.message).toBe("Requested file not found")
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Test downloading non-existent package
|
|
80
|
-
try {
|
|
81
|
-
await axios.get("/api/snippets/download", {
|
|
82
|
-
params: { jsdelivr_path: "testuser/non-existent-package@1.0.0/index.ts" },
|
|
83
|
-
})
|
|
84
|
-
// If the request doesn't throw an error, fail the test
|
|
85
|
-
expect(true).toBe(false)
|
|
86
|
-
} catch (error: any) {
|
|
87
|
-
expect(error.status).toBe(404)
|
|
88
|
-
expect(error.data.error.message).toBe("Snippet not found")
|
|
89
|
-
}
|
|
90
|
-
})
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
|
|
2
|
-
import { test, expect } from "bun:test"
|
|
3
|
-
|
|
4
|
-
test.skip("generate snippet from JLCPCB part number", async () => {
|
|
5
|
-
const { axios } = await getTestServer()
|
|
6
|
-
|
|
7
|
-
const response = await axios.post("/api/snippets/generate_from_jlcpcb", {
|
|
8
|
-
jlcpcb_part_number: "C46749",
|
|
9
|
-
})
|
|
10
|
-
expect(response.status).toBe(200)
|
|
11
|
-
expect(response.data.snippet).toBeDefined()
|
|
12
|
-
expect(response.data.snippet.unscoped_name).toBe("C46749")
|
|
13
|
-
expect(response.data.snippet.owner_name).toBe("testuser")
|
|
14
|
-
expect(response.data.snippet.snippet_type).toBe("package")
|
|
15
|
-
expect(response.data.snippet.code).toContain("export const NE555P")
|
|
16
|
-
})
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
|
|
2
|
-
import { expect, test } from "bun:test"
|
|
3
|
-
import { snippetSchema } from "fake-snippets-api/lib/db/schema"
|
|
4
|
-
|
|
5
|
-
test("GET /api/snippets/get - should return snippet by snippet_id", async () => {
|
|
6
|
-
const { axios } = await getTestServer()
|
|
7
|
-
|
|
8
|
-
// First create a snippet
|
|
9
|
-
const newSnippetData = {
|
|
10
|
-
code: "console.log('Hello World')",
|
|
11
|
-
snippet_type: "package",
|
|
12
|
-
description: "A test snippet",
|
|
13
|
-
compiled_js: "console.log('Hello World')",
|
|
14
|
-
dts: "export function hello(): void;",
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const createResponse = await axios.post(
|
|
18
|
-
"/api/snippets/create",
|
|
19
|
-
newSnippetData,
|
|
20
|
-
)
|
|
21
|
-
expect(createResponse.status).toBe(200)
|
|
22
|
-
const createdSnippet = createResponse.data.snippet
|
|
23
|
-
|
|
24
|
-
// Get the created snippet using the /get endpoint
|
|
25
|
-
const getResponse = await axios.get("/api/snippets/get", {
|
|
26
|
-
params: { snippet_id: createdSnippet.snippet_id },
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
expect(getResponse.status).toBe(200)
|
|
30
|
-
const responseBody = getResponse.data
|
|
31
|
-
expect(responseBody.ok).toBe(true)
|
|
32
|
-
expect(responseBody.snippet).toEqual(snippetSchema.parse(createdSnippet))
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
test("GET /api/snippets/get - should return 404 if snippet not found", async () => {
|
|
36
|
-
const { axios } = await getTestServer()
|
|
37
|
-
|
|
38
|
-
try {
|
|
39
|
-
await axios.get("/api/snippets/get", {
|
|
40
|
-
params: { snippet_id: "non_existent_snippet_id" },
|
|
41
|
-
})
|
|
42
|
-
throw new Error("Expected request to fail")
|
|
43
|
-
} catch (error: any) {
|
|
44
|
-
expect(error.status).toBe(404)
|
|
45
|
-
expect(error.data.error.error_code).toBe("snippet_not_found")
|
|
46
|
-
expect(error.data.error.message).toBe(
|
|
47
|
-
'Snippet not found (searched using {"snippet_id":"non_existent_snippet_id"})',
|
|
48
|
-
)
|
|
49
|
-
}
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
test("GET /api/snippets/get - should return snippet by name and owner", async () => {
|
|
53
|
-
const { axios } = await getTestServer()
|
|
54
|
-
|
|
55
|
-
// First create a snippet
|
|
56
|
-
const newSnippetData = {
|
|
57
|
-
code: "console.log('Hello World')",
|
|
58
|
-
snippet_type: "package",
|
|
59
|
-
description: "A test snippet",
|
|
60
|
-
compiled_js: "console.log('Hello World')",
|
|
61
|
-
dts: "export function hello(): void;",
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const createResponse = await axios.post(
|
|
65
|
-
"/api/snippets/create",
|
|
66
|
-
newSnippetData,
|
|
67
|
-
)
|
|
68
|
-
expect(createResponse.status).toBe(200)
|
|
69
|
-
const createdSnippet = createResponse.data.snippet
|
|
70
|
-
|
|
71
|
-
// Get the snippet using name and owner
|
|
72
|
-
const getResponse = await axios.get("/api/snippets/get", {
|
|
73
|
-
params: {
|
|
74
|
-
name: createdSnippet.name,
|
|
75
|
-
owner_name: createdSnippet.owner_name,
|
|
76
|
-
},
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
expect(getResponse.status).toBe(200)
|
|
80
|
-
const responseBody = getResponse.data
|
|
81
|
-
expect(responseBody.ok).toBe(true)
|
|
82
|
-
expect(responseBody.snippet).toEqual(snippetSchema.parse(createdSnippet))
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
test("GET /api/snippets/get - should return snippet by unscoped_name and owner", async () => {
|
|
86
|
-
const { axios, db } = await getTestServer()
|
|
87
|
-
|
|
88
|
-
// First create a snippet
|
|
89
|
-
const snippet = {
|
|
90
|
-
unscoped_name: "test-package",
|
|
91
|
-
owner_name: "testuser",
|
|
92
|
-
code: "export const TestComponent = () => <div>Test</div>",
|
|
93
|
-
dts: "export declare const TestComponent: () => JSX.Element",
|
|
94
|
-
created_at: "2023-01-01T00:00:00Z",
|
|
95
|
-
updated_at: "2023-01-01T00:00:00Z",
|
|
96
|
-
name: "testuser/test-package",
|
|
97
|
-
snippet_type: "package",
|
|
98
|
-
description: "Test package",
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
db.addSnippet(snippet as any)
|
|
102
|
-
|
|
103
|
-
// Get the snippet using name and owner
|
|
104
|
-
const getResponse = await axios.get("/api/snippets/get", {
|
|
105
|
-
params: {
|
|
106
|
-
unscoped_name: snippet.unscoped_name,
|
|
107
|
-
owner_name: snippet.owner_name,
|
|
108
|
-
},
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
expect(getResponse.status).toBe(200)
|
|
112
|
-
const responseBody = getResponse.data
|
|
113
|
-
expect(responseBody.ok).toBe(true)
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
test("GET /api/snippets/get - should not return snippet if snippet is private and user is unauthenticated", async () => {
|
|
117
|
-
const { axios, db, unauthenticatedAxios } = await getTestServer()
|
|
118
|
-
|
|
119
|
-
// First create a snippet
|
|
120
|
-
const snippet = {
|
|
121
|
-
unscoped_name: "test-package",
|
|
122
|
-
owner_name: "testuser",
|
|
123
|
-
code: "export const TestComponent = () => <div>Test</div>",
|
|
124
|
-
dts: "export declare const TestComponent: () => JSX.Element",
|
|
125
|
-
created_at: "2023-01-01T00:00:00Z",
|
|
126
|
-
updated_at: "2023-01-01T00:00:00Z",
|
|
127
|
-
name: "testuser/test-package",
|
|
128
|
-
snippet_type: "package",
|
|
129
|
-
description: "Test package",
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
db.addSnippet(snippet as any)
|
|
133
|
-
|
|
134
|
-
const createdSnippet = db.packages[0]
|
|
135
|
-
|
|
136
|
-
const updatedSnippet = await axios.post("/api/snippets/update", {
|
|
137
|
-
snippet_id: createdSnippet.package_id,
|
|
138
|
-
is_private: true,
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
expect(updatedSnippet.status).toBe(200)
|
|
142
|
-
expect(updatedSnippet.data.snippet.is_private).toBe(true)
|
|
143
|
-
expect(updatedSnippet.data.snippet.is_public).toBe(false)
|
|
144
|
-
|
|
145
|
-
// Get the snippet using name and owner
|
|
146
|
-
const getResponse = await axios.post("/api/snippets/get", {
|
|
147
|
-
snippet_id: createdSnippet.package_id,
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
expect(getResponse.status).toBe(200)
|
|
151
|
-
const responseBody = getResponse.data
|
|
152
|
-
expect(responseBody.ok).toBe(true)
|
|
153
|
-
|
|
154
|
-
try {
|
|
155
|
-
await unauthenticatedAxios.post("/api/snippets/get", {
|
|
156
|
-
snippet_id: createdSnippet.package_id,
|
|
157
|
-
})
|
|
158
|
-
throw new Error("Expected request to fail")
|
|
159
|
-
} catch (error: any) {
|
|
160
|
-
expect(error.status).toBe(404)
|
|
161
|
-
expect(error.data.error.error_code).toBe("snippet_not_found")
|
|
162
|
-
}
|
|
163
|
-
})
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "bun:test"
|
|
2
|
-
import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
|
|
3
|
-
import { generateCircuitJson } from "bun-tests/fake-snippets-api/fixtures/get-circuit-json"
|
|
4
|
-
|
|
5
|
-
test("get schematic svg of a snippet", async () => {
|
|
6
|
-
const { axios, db } = await getTestServer()
|
|
7
|
-
|
|
8
|
-
const addedSnippet = {
|
|
9
|
-
name: "testuser/my-test-board",
|
|
10
|
-
unscoped_name: "my-test-board",
|
|
11
|
-
owner_name: "testuser",
|
|
12
|
-
code: `
|
|
13
|
-
import { A555Timer } from "@tsci/seveibar.a555timer"
|
|
14
|
-
|
|
15
|
-
export default () => (
|
|
16
|
-
<board width="10mm" height="10mm">
|
|
17
|
-
<A555Timer name="U1" />
|
|
18
|
-
</board>
|
|
19
|
-
)`.trim(),
|
|
20
|
-
created_at: new Date().toISOString(),
|
|
21
|
-
updated_at: new Date().toISOString(),
|
|
22
|
-
snippet_type: "board",
|
|
23
|
-
description: "A simple board with an A555 Timer component",
|
|
24
|
-
circuit_json: await generateCircuitJson({
|
|
25
|
-
code: `
|
|
26
|
-
import { A555Timer } from "@tsci/seveibar.a555timer"
|
|
27
|
-
|
|
28
|
-
export default () => (
|
|
29
|
-
<board width="10mm" height="10mm">
|
|
30
|
-
<A555Timer name="U1" />
|
|
31
|
-
</board>
|
|
32
|
-
)`.trim(),
|
|
33
|
-
type: "board",
|
|
34
|
-
compiled_js: `
|
|
35
|
-
"use strict";
|
|
36
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
exports.A555Timer = void 0;
|
|
38
|
-
const A555Timer = ({ name }) => /*#__PURE__*/React.createElement("chip", {
|
|
39
|
-
name: name,
|
|
40
|
-
footprint: "dip8"
|
|
41
|
-
});
|
|
42
|
-
exports.A555Timer = A555Timer;
|
|
43
|
-
`.trim(),
|
|
44
|
-
}),
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const createdSnippet = await axios.post("/api/snippets/create", addedSnippet)
|
|
48
|
-
|
|
49
|
-
const response = await axios.get("/api/snippets/get_image", {
|
|
50
|
-
params: {
|
|
51
|
-
snippetId: createdSnippet.data.snippet.snippet_id,
|
|
52
|
-
image_of: "schematic",
|
|
53
|
-
format: "svg",
|
|
54
|
-
},
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
expect(response.status).toBe(200)
|
|
58
|
-
expect(response.data.ok).toBe(true)
|
|
59
|
-
expect(response.data.svg).toContain("<svg")
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
test("get pcb svg of a snippet", async () => {
|
|
63
|
-
const { axios, db } = await getTestServer()
|
|
64
|
-
|
|
65
|
-
const addedSnippet = {
|
|
66
|
-
name: "testuser/my-test-board",
|
|
67
|
-
unscoped_name: "my-test-board",
|
|
68
|
-
owner_name: "testuser",
|
|
69
|
-
code: `
|
|
70
|
-
import { A555Timer } from "@tsci/seveibar.a555timer"
|
|
71
|
-
|
|
72
|
-
export default () => (
|
|
73
|
-
<board width="10mm" height="10mm">
|
|
74
|
-
<A555Timer name="U1" />
|
|
75
|
-
</board>
|
|
76
|
-
)`.trim(),
|
|
77
|
-
created_at: new Date().toISOString(),
|
|
78
|
-
updated_at: new Date().toISOString(),
|
|
79
|
-
snippet_type: "board",
|
|
80
|
-
description: "A simple board with an A555 Timer component",
|
|
81
|
-
circuit_json: await generateCircuitJson({
|
|
82
|
-
code: `
|
|
83
|
-
import { A555Timer } from "@tsci/seveibar.a555timer"
|
|
84
|
-
|
|
85
|
-
export default () => (
|
|
86
|
-
<board width="10mm" height="10mm">
|
|
87
|
-
<A555Timer name="U1" />
|
|
88
|
-
</board>
|
|
89
|
-
)`.trim(),
|
|
90
|
-
type: "board",
|
|
91
|
-
compiled_js: `
|
|
92
|
-
"use strict";
|
|
93
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
94
|
-
exports.A555Timer = void 0;
|
|
95
|
-
const A555Timer = ({ name }) => /*#__PURE__*/React.createElement("chip", {
|
|
96
|
-
name: name,
|
|
97
|
-
footprint: "dip8"
|
|
98
|
-
});
|
|
99
|
-
exports.A555Timer = A555Timer;
|
|
100
|
-
`.trim(),
|
|
101
|
-
}),
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const createdSnippet = await axios.post("/api/snippets/create", addedSnippet)
|
|
105
|
-
|
|
106
|
-
const response = await axios.get("/api/snippets/get_image", {
|
|
107
|
-
params: {
|
|
108
|
-
snippetId: createdSnippet.data.snippet.snippet_id,
|
|
109
|
-
image_of: "pcb",
|
|
110
|
-
format: "svg",
|
|
111
|
-
},
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
expect(response.status).toBe(200)
|
|
115
|
-
expect(response.data.ok).toBe(true)
|
|
116
|
-
expect(response.data.svg).toContain("<svg")
|
|
117
|
-
})
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "bun:test"
|
|
2
|
-
import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
|
|
3
|
-
import { generateCircuitJson } from "bun-tests/fake-snippets-api/fixtures/get-circuit-json"
|
|
4
|
-
|
|
5
|
-
test("get schematic svg of a snippet", async () => {
|
|
6
|
-
const { axios, db } = await getTestServer()
|
|
7
|
-
|
|
8
|
-
const addedSnippet = {
|
|
9
|
-
name: "testuser/my-test-board",
|
|
10
|
-
unscoped_name: "my-test-board",
|
|
11
|
-
owner_name: "testuser",
|
|
12
|
-
code: `
|
|
13
|
-
import { A555Timer } from "@tsci/seveibar.a555timer"
|
|
14
|
-
|
|
15
|
-
export default () => (
|
|
16
|
-
<board width="10mm" height="10mm">
|
|
17
|
-
<A555Timer name="U1" />
|
|
18
|
-
</board>
|
|
19
|
-
)`.trim(),
|
|
20
|
-
created_at: new Date().toISOString(),
|
|
21
|
-
updated_at: new Date().toISOString(),
|
|
22
|
-
snippet_type: "board",
|
|
23
|
-
description: "A simple board with an A555 Timer component",
|
|
24
|
-
circuit_json: await generateCircuitJson({
|
|
25
|
-
code: `
|
|
26
|
-
import { A555Timer } from "@tsci/seveibar.a555timer"
|
|
27
|
-
|
|
28
|
-
export default () => (
|
|
29
|
-
<board width="10mm" height="10mm">
|
|
30
|
-
<A555Timer name="U1" />
|
|
31
|
-
</board>
|
|
32
|
-
)`.trim(),
|
|
33
|
-
type: "board",
|
|
34
|
-
compiled_js: `
|
|
35
|
-
"use strict";
|
|
36
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
exports.A555Timer = void 0;
|
|
38
|
-
const A555Timer = ({ name }) => /*#__PURE__*/React.createElement("chip", {
|
|
39
|
-
name: name,
|
|
40
|
-
footprint: "dip8"
|
|
41
|
-
});
|
|
42
|
-
exports.A555Timer = A555Timer;
|
|
43
|
-
`.trim(),
|
|
44
|
-
}),
|
|
45
|
-
}
|
|
46
|
-
const createdSnippet = await axios.post("/api/snippets/create", addedSnippet)
|
|
47
|
-
|
|
48
|
-
const snippetName = addedSnippet.name.replace(
|
|
49
|
-
addedSnippet.owner_name + "/",
|
|
50
|
-
"",
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
const response = await axios.get(
|
|
54
|
-
`/api/snippets/images/${createdSnippet.data.snippet.owner_name}/${createdSnippet.data.snippet.unscoped_name}/schematic.svg`,
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
expect(response.status).toBe(200)
|
|
58
|
-
expect(response.data).toContain("<svg")
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
test("get pcb svg of a snippet", async () => {
|
|
62
|
-
const { axios, db } = await getTestServer()
|
|
63
|
-
|
|
64
|
-
const addedSnippet = {
|
|
65
|
-
name: "testuser/my-test-board",
|
|
66
|
-
unscoped_name: "my-test-board",
|
|
67
|
-
owner_name: "testuser",
|
|
68
|
-
code: `
|
|
69
|
-
import { A555Timer } from "@tsci/seveibar.a555timer"
|
|
70
|
-
|
|
71
|
-
export default () => (
|
|
72
|
-
<board width="10mm" height="10mm">
|
|
73
|
-
<A555Timer name="U1" />
|
|
74
|
-
</board>
|
|
75
|
-
)`.trim(),
|
|
76
|
-
created_at: new Date().toISOString(),
|
|
77
|
-
updated_at: new Date().toISOString(),
|
|
78
|
-
snippet_type: "board",
|
|
79
|
-
description: "A simple board with an A555 Timer component",
|
|
80
|
-
circuit_json: await generateCircuitJson({
|
|
81
|
-
code: `
|
|
82
|
-
import { A555Timer } from "@tsci/seveibar.a555timer"
|
|
83
|
-
|
|
84
|
-
export default () => (
|
|
85
|
-
<board width="10mm" height="10mm">
|
|
86
|
-
<A555Timer name="U1" />
|
|
87
|
-
</board>
|
|
88
|
-
)`.trim(),
|
|
89
|
-
type: "board",
|
|
90
|
-
compiled_js: `
|
|
91
|
-
"use strict";
|
|
92
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
93
|
-
exports.A555Timer = void 0;
|
|
94
|
-
const A555Timer = ({ name }) => /*#__PURE__*/React.createElement("chip", {
|
|
95
|
-
name: name,
|
|
96
|
-
footprint: "dip8"
|
|
97
|
-
});
|
|
98
|
-
exports.A555Timer = A555Timer;
|
|
99
|
-
`.trim(),
|
|
100
|
-
}),
|
|
101
|
-
}
|
|
102
|
-
const createdSnippet = await axios.post("/api/snippets/create", addedSnippet)
|
|
103
|
-
|
|
104
|
-
const snippetName = addedSnippet.name.replace(
|
|
105
|
-
addedSnippet.owner_name + "/",
|
|
106
|
-
"",
|
|
107
|
-
)
|
|
108
|
-
const response = await axios.get(
|
|
109
|
-
`/api/snippets/images/${createdSnippet.data.snippet.owner_name}/${createdSnippet.data.snippet.unscoped_name}/pcb.svg`,
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
expect(response.status).toBe(200)
|
|
113
|
-
expect(response.data).toContain("<svg")
|
|
114
|
-
})
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import { getTestServer } from "bun-tests/fake-snippets-api/fixtures/get-test-server"
|
|
2
|
-
import { test, expect } from "bun:test"
|
|
3
|
-
|
|
4
|
-
test("list snippets", async () => {
|
|
5
|
-
const { axios, db } = await getTestServer()
|
|
6
|
-
|
|
7
|
-
// Add some test snippets
|
|
8
|
-
const snippets = [
|
|
9
|
-
{
|
|
10
|
-
unscoped_name: "Snippet1",
|
|
11
|
-
owner_name: "testuser",
|
|
12
|
-
code: "Content1",
|
|
13
|
-
created_at: "2023-01-01T00:00:00Z",
|
|
14
|
-
updated_at: "2023-01-01T00:00:00Z",
|
|
15
|
-
name: "testuser/Snippet1",
|
|
16
|
-
snippet_type: "board",
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
unscoped_name: "Snippet2",
|
|
20
|
-
owner_name: "User2",
|
|
21
|
-
code: "Content2",
|
|
22
|
-
created_at: "2023-01-02T00:00:00Z",
|
|
23
|
-
updated_at: "2023-01-02T00:00:00Z",
|
|
24
|
-
name: "User2/Snippet2",
|
|
25
|
-
snippet_type: "package",
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
unscoped_name: "Snippet3",
|
|
29
|
-
owner_name: "testuser",
|
|
30
|
-
code: "Content3",
|
|
31
|
-
created_at: "2023-01-03T00:00:00Z",
|
|
32
|
-
updated_at: "2023-01-03T00:00:00Z",
|
|
33
|
-
name: "testuser/Snippet3",
|
|
34
|
-
snippet_type: "model",
|
|
35
|
-
},
|
|
36
|
-
]
|
|
37
|
-
|
|
38
|
-
for (const snippet of snippets) {
|
|
39
|
-
db.addSnippet(snippet as any)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Test without owner_name parameter
|
|
43
|
-
const { data: allData } = await axios.get("/api/snippets/list")
|
|
44
|
-
expect(allData.snippets).toHaveLength(3)
|
|
45
|
-
|
|
46
|
-
// Test with owner_name parameter
|
|
47
|
-
const { data: user1Data } = await axios.get("/api/snippets/list", {
|
|
48
|
-
params: { owner_name: "testuser" },
|
|
49
|
-
})
|
|
50
|
-
expect(user1Data.snippets).toHaveLength(2)
|
|
51
|
-
expect(
|
|
52
|
-
user1Data.snippets.every(
|
|
53
|
-
(snippet: { owner_name: string }) => snippet.owner_name === "testuser",
|
|
54
|
-
),
|
|
55
|
-
).toBe(true)
|
|
56
|
-
|
|
57
|
-
// Test with non-existent owner
|
|
58
|
-
const { data: nonExistentData } = await axios.get("/api/snippets/list", {
|
|
59
|
-
params: { owner_name: "NonExistentUser" },
|
|
60
|
-
})
|
|
61
|
-
expect(nonExistentData.snippets).toHaveLength(0)
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
test("list snippets by owner", async () => {
|
|
65
|
-
const { axios, db } = await getTestServer()
|
|
66
|
-
|
|
67
|
-
// Create some test snippets
|
|
68
|
-
const snippets = [
|
|
69
|
-
{
|
|
70
|
-
unscoped_name: "Snippet1",
|
|
71
|
-
owner_name: "testuser",
|
|
72
|
-
code: "Content1",
|
|
73
|
-
created_at: "2023-01-01T00:00:00Z",
|
|
74
|
-
updated_at: "2023-01-01T00:00:00Z",
|
|
75
|
-
name: "testuser/Snippet1",
|
|
76
|
-
snippet_type: "board",
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
unscoped_name: "Snippet2",
|
|
80
|
-
owner_name: "otheruser",
|
|
81
|
-
code: "Content2",
|
|
82
|
-
created_at: "2023-01-02T00:00:00Z",
|
|
83
|
-
updated_at: "2023-01-02T00:00:00Z",
|
|
84
|
-
name: "otheruser/Snippet2",
|
|
85
|
-
snippet_type: "package",
|
|
86
|
-
},
|
|
87
|
-
]
|
|
88
|
-
|
|
89
|
-
for (const snippet of snippets) {
|
|
90
|
-
db.addSnippet(snippet as any)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// List snippets by owner
|
|
94
|
-
const response = await axios.get("/api/snippets/list?owner_name=testuser")
|
|
95
|
-
expect(response.status).toBe(200)
|
|
96
|
-
expect(response.data.snippets).toHaveLength(1)
|
|
97
|
-
expect(response.data.snippets[0].unscoped_name).toBe("Snippet1")
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
test("list starred snippets", async () => {
|
|
101
|
-
const { axios, db } = await getTestServer()
|
|
102
|
-
|
|
103
|
-
// Create some test snippets
|
|
104
|
-
const snippets = [
|
|
105
|
-
{
|
|
106
|
-
unscoped_name: "Snippet1",
|
|
107
|
-
code: "Content1",
|
|
108
|
-
created_at: "2023-01-01T00:00:00Z",
|
|
109
|
-
updated_at: "2023-01-01T00:00:00Z",
|
|
110
|
-
name: "testuser/Snippet1",
|
|
111
|
-
snippet_type: "board",
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
unscoped_name: "Snippet2",
|
|
115
|
-
code: "Content2",
|
|
116
|
-
created_at: "2023-01-02T00:00:00Z",
|
|
117
|
-
updated_at: "2023-01-02T00:00:00Z",
|
|
118
|
-
name: "otheruser/Snippet2",
|
|
119
|
-
snippet_type: "package",
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
unscoped_name: "Snippet3",
|
|
123
|
-
code: "Content3",
|
|
124
|
-
created_at: "2023-01-03T00:00:00Z",
|
|
125
|
-
updated_at: "2023-01-03T00:00:00Z",
|
|
126
|
-
name: "thirduser/Snippet3",
|
|
127
|
-
snippet_type: "board",
|
|
128
|
-
},
|
|
129
|
-
]
|
|
130
|
-
|
|
131
|
-
const createdSnippets = []
|
|
132
|
-
for (const snippet of snippets) {
|
|
133
|
-
const createdSnippet = await axios.post("/api/snippets/create", snippet)
|
|
134
|
-
createdSnippets.push(createdSnippet.data.snippet)
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Add stars for testuser
|
|
138
|
-
const testUserAccount = db.accounts.find(
|
|
139
|
-
(acc) => acc.github_username === "testuser",
|
|
140
|
-
)
|
|
141
|
-
if (!testUserAccount) throw new Error("testuser account not found")
|
|
142
|
-
|
|
143
|
-
// testuser stars Snippet2 and Snippet3
|
|
144
|
-
await axios.post("/api/snippets/add_star", {
|
|
145
|
-
snippet_id: createdSnippets[1].snippet_id,
|
|
146
|
-
})
|
|
147
|
-
await axios.post("/api/snippets/add_star", {
|
|
148
|
-
snippet_id: createdSnippets[2].snippet_id,
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
// List starred snippets for testuser
|
|
152
|
-
const response = await axios.get("/api/snippets/list?starred_by=testuser", {})
|
|
153
|
-
expect(response.status).toBe(200)
|
|
154
|
-
expect(response.data.snippets).toHaveLength(2)
|
|
155
|
-
expect(
|
|
156
|
-
response.data.snippets
|
|
157
|
-
.map((s: { unscoped_name: string }) => s.unscoped_name)
|
|
158
|
-
.sort(),
|
|
159
|
-
).toEqual(["Snippet2", "Snippet3"])
|
|
160
|
-
|
|
161
|
-
// Verify star counts and is_starred flags
|
|
162
|
-
for (const snippet of response.data.snippets as Array<{
|
|
163
|
-
star_count: number
|
|
164
|
-
is_starred: boolean
|
|
165
|
-
}>) {
|
|
166
|
-
expect(snippet.star_count).toBe(1)
|
|
167
|
-
expect(snippet.is_starred).toBe(true)
|
|
168
|
-
}
|
|
169
|
-
})
|