@zoralabs/coins-sdk 0.2.4 → 0.2.5
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/CHANGELOG.md +6 -0
- package/dist/actions/createCoin.d.ts +1 -1
- package/dist/actions/createCoin.d.ts.map +1 -1
- package/dist/api/api-key.d.ts +2 -1
- package/dist/api/api-key.d.ts.map +1 -1
- package/dist/api/internal.d.ts +2 -2
- package/dist/api/internal.d.ts.map +1 -1
- package/dist/index.cjs +242 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +241 -0
- package/dist/index.js.map +1 -1
- package/dist/metadata/cleanAndValidateMetadataURI.d.ts +1 -1
- package/dist/metadata/cleanAndValidateMetadataURI.d.ts.map +1 -1
- package/dist/metadata/index.d.ts +1 -1
- package/dist/metadata/index.d.ts.map +1 -1
- package/dist/metadata/validateMetadataURIContent.d.ts +1 -1
- package/dist/metadata/validateMetadataURIContent.d.ts.map +1 -1
- package/dist/uploader/index.d.ts +10 -0
- package/dist/uploader/index.d.ts.map +1 -0
- package/dist/uploader/metadata.d.ts +44 -0
- package/dist/uploader/metadata.d.ts.map +1 -0
- package/dist/uploader/providers/zora.d.ts +18 -0
- package/dist/uploader/providers/zora.d.ts.map +1 -0
- package/dist/uploader/types.d.ts +21 -0
- package/dist/uploader/types.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/actions/createCoin.ts +2 -1
- package/src/api/api-key.ts +5 -1
- package/src/api/internal.ts +3 -3
- package/src/index.ts +3 -0
- package/src/metadata/cleanAndValidateMetadataURI.ts +1 -5
- package/src/metadata/index.ts +1 -4
- package/src/metadata/validateMetadataURIContent.ts +2 -4
- package/src/uploader/index.ts +16 -0
- package/src/uploader/metadata.ts +214 -0
- package/src/uploader/providers/zora.ts +86 -0
- package/src/uploader/tests/metadata.test.ts +331 -0
- package/src/uploader/tests/providers.test.ts +131 -0
- package/src/uploader/types.ts +27 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { describe, expect, it, vi, beforeEach } from "vitest";
|
|
2
|
+
import { ZoraUploader, createZoraUploaderForCreator } from "../providers/zora";
|
|
3
|
+
import { setApiKey } from "../../api/api-key";
|
|
4
|
+
|
|
5
|
+
// Mock the fetch function
|
|
6
|
+
const mockFetch = vi.fn();
|
|
7
|
+
global.fetch = mockFetch;
|
|
8
|
+
|
|
9
|
+
// Mock console methods
|
|
10
|
+
console.log = vi.fn();
|
|
11
|
+
console.error = vi.fn();
|
|
12
|
+
|
|
13
|
+
describe("ZoraUploader", () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
vi.clearAllMocks();
|
|
16
|
+
mockFetch.mockReset();
|
|
17
|
+
setApiKey(undefined);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe("constructor", () => {
|
|
21
|
+
it("should initialize with provided API key", () => {
|
|
22
|
+
setApiKey("test-api-key");
|
|
23
|
+
const uploader = new ZoraUploader("0x123");
|
|
24
|
+
expect(uploader).toBeDefined();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it("should throw if no API key is available", () => {
|
|
28
|
+
expect(() => new ZoraUploader("0x123")).toThrow("API key is required");
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe("upload", () => {
|
|
33
|
+
it("should successfully upload a file with the zora uploader", async () => {
|
|
34
|
+
// Mock JWT token creation response
|
|
35
|
+
mockFetch
|
|
36
|
+
.mockResolvedValueOnce({
|
|
37
|
+
ok: true,
|
|
38
|
+
headers: new Headers({
|
|
39
|
+
"Content-Type": "application/json",
|
|
40
|
+
"Content-Length": "1000",
|
|
41
|
+
}),
|
|
42
|
+
json: async () => ({
|
|
43
|
+
createUploadJwtFromApiKey: "test-jwt-token",
|
|
44
|
+
}),
|
|
45
|
+
})
|
|
46
|
+
.mockResolvedValueOnce({
|
|
47
|
+
ok: true,
|
|
48
|
+
headers: new Headers({
|
|
49
|
+
"Content-Type": "application/json",
|
|
50
|
+
}),
|
|
51
|
+
json: async () => ({
|
|
52
|
+
cid: "bafybeiguslukdujd22p7ix53rcszgbg4ine464g33zk2st3lnjpx4uvmri",
|
|
53
|
+
size: 100,
|
|
54
|
+
mimeType: "image/png",
|
|
55
|
+
}),
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
setApiKey("test-api-key");
|
|
59
|
+
const uploader = new ZoraUploader("0x123");
|
|
60
|
+
const file = new File(["test"], "test.png", { type: "image/png" });
|
|
61
|
+
const result = await uploader.upload(file);
|
|
62
|
+
|
|
63
|
+
// Verify fetch was called with correct parameters
|
|
64
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
65
|
+
expect(mockFetch).toHaveBeenCalledWith(
|
|
66
|
+
"https://ipfs-uploader.zora.co/api/v0/add?cid-version=1",
|
|
67
|
+
expect.objectContaining({
|
|
68
|
+
method: "POST",
|
|
69
|
+
headers: expect.objectContaining({
|
|
70
|
+
Authorization: "Bearer test-jwt-token",
|
|
71
|
+
}),
|
|
72
|
+
}),
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
// Verify result
|
|
76
|
+
expect(result).toEqual({
|
|
77
|
+
url: "ipfs://bafybeiguslukdujd22p7ix53rcszgbg4ine464g33zk2st3lnjpx4uvmri",
|
|
78
|
+
size: 100,
|
|
79
|
+
mimeType: "image/png",
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("should throw an error if upload fails", async () => {
|
|
84
|
+
// Mock failed response
|
|
85
|
+
mockFetch
|
|
86
|
+
.mockResolvedValueOnce({
|
|
87
|
+
ok: true,
|
|
88
|
+
headers: new Headers({
|
|
89
|
+
"Content-Type": "application/json",
|
|
90
|
+
"Content-Length": "1000",
|
|
91
|
+
}),
|
|
92
|
+
json: async () => ({
|
|
93
|
+
createUploadJwtFromApiKey: "test-jwt-token",
|
|
94
|
+
}),
|
|
95
|
+
})
|
|
96
|
+
.mockResolvedValueOnce({
|
|
97
|
+
ok: false,
|
|
98
|
+
statusText: "Bad Request",
|
|
99
|
+
text: async () => "Invalid file",
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
setApiKey("test-api-key");
|
|
103
|
+
const uploader = new ZoraUploader("0x123");
|
|
104
|
+
const file = new File(["test"], "test.png", { type: "image/png" });
|
|
105
|
+
|
|
106
|
+
await expect(uploader.upload(file)).rejects.toThrow(
|
|
107
|
+
"Failed to upload file",
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
// Verify fetch was called with correct parameters
|
|
111
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
112
|
+
expect(mockFetch).toHaveBeenCalledWith(
|
|
113
|
+
"https://ipfs-uploader.zora.co/api/v0/add?cid-version=1",
|
|
114
|
+
expect.objectContaining({
|
|
115
|
+
method: "POST",
|
|
116
|
+
headers: expect.objectContaining({
|
|
117
|
+
Authorization: "Bearer test-jwt-token",
|
|
118
|
+
}),
|
|
119
|
+
}),
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe("factory function", () => {
|
|
125
|
+
it("should create a ZoraUploader instance", () => {
|
|
126
|
+
setApiKey("test-api-key");
|
|
127
|
+
const uploader = createZoraUploaderForCreator("0x123");
|
|
128
|
+
expect(uploader).toBeInstanceOf(ZoraUploader);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type ValidMetadataURI =
|
|
2
|
+
| `ipfs://${string}`
|
|
3
|
+
| `ar://${string}`
|
|
4
|
+
| `data:${string}`
|
|
5
|
+
| `https://${string}`;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Result from uploading a file to a storage provider
|
|
9
|
+
*/
|
|
10
|
+
export type UploadResult = {
|
|
11
|
+
url: ValidMetadataURI;
|
|
12
|
+
size: number | undefined;
|
|
13
|
+
mimeType: string | undefined;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Interface for file uploaders (IPFS, Arweave, etc.)
|
|
18
|
+
*/
|
|
19
|
+
export interface Uploader {
|
|
20
|
+
upload(file: File): Promise<UploadResult>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type CreateMetadataParameters = {
|
|
24
|
+
name: string;
|
|
25
|
+
symbol: string;
|
|
26
|
+
uri: `ipfs://${string}`;
|
|
27
|
+
};
|