@pinata/sdk 1.2.0 → 2.0.0-beta.0
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/.babelrc +1 -1
- package/.eslintrc +7 -7
- package/.husky/pre-commit +6 -0
- package/.nvmrc +1 -1
- package/README.md +22 -6
- package/lib/pinata-sdk.js +780 -604
- package/lib/pinata-sdk.min.js +5 -5
- package/package.json +83 -71
- package/src/commands/data/getFilesByCount/{getFilesByCount.js → getFilesByCount.ts} +9 -13
- package/src/commands/data/index.ts +4 -0
- package/src/commands/data/pinList/pinList.ts +77 -0
- package/src/commands/data/pinList/{queryBuilder.js → queryBuilder.ts} +6 -16
- package/src/commands/data/{testAuthentication.js → testAuthentication.ts} +10 -18
- package/src/commands/data/userPinnedDataTotal.ts +24 -0
- package/src/commands/pinning/{hashMetadata.js → hashMetadata.ts} +12 -21
- package/src/commands/pinning/index.ts +8 -0
- package/src/commands/pinning/{pinByHash.js → pinByHash.ts} +24 -20
- package/src/commands/pinning/{pinFileToIPFS.js → pinFileToIPFS.ts} +29 -24
- package/src/commands/pinning/{pinFromFS.js → pinFromFS.ts} +17 -39
- package/src/commands/pinning/{pinJSONToIPFS.js → pinJSONToIPFS.ts} +8 -20
- package/src/commands/pinning/pinJobs/pinJobs.ts +50 -0
- package/src/commands/pinning/pinJobs/{queryBuilder.js → queryBuilder.ts} +2 -8
- package/src/commands/pinning/{unpin.js → unpin.ts} +6 -19
- package/src/constants.ts +4 -0
- package/src/index.ts +120 -0
- package/src/third-party/base-path-converter.d.ts +3 -0
- package/src/third-party/is-ipfs.d.ts +5 -0
- package/src/third-party/recursive-fs.d.ts +5 -0
- package/src/util/{errorResponse.js → errorResponse.ts} +1 -1
- package/src/util/validators.ts +175 -0
- package/test/commands/data/getFilesByCount/{getFilesByCount.test.js → getFilesByCount.test.ts} +36 -39
- package/test/commands/data/pinList/pinList.test.ts +102 -0
- package/test/commands/data/pinList/{queryBuilder.test.js → queryBuilder.test.ts} +9 -10
- package/test/commands/data/pinlist-sample-api.ts +540 -0
- package/test/commands/data/testAuthentication.test.ts +34 -0
- package/test/commands/data/userPinnedDataTotal.test.ts +29 -0
- package/test/commands/pinning/hashMetadata.test.ts +76 -0
- package/test/commands/pinning/pinByHash.test.ts +46 -0
- package/test/commands/pinning/pinFileToIPFS.test.ts +53 -0
- package/test/commands/pinning/pinFromFS.ts +32 -0
- package/test/commands/pinning/pinJSONToIPFS.test.ts +42 -0
- package/test/commands/pinning/pinJobs/pinJobs.test.ts +29 -0
- package/test/commands/pinning/pinJobs/{queryBuilder.test.js → queryBuilder.test.ts} +5 -5
- package/test/commands/pinning/{unpin.test.js → unpin.test.ts} +9 -10
- package/test/util/{validators.test.js → validators.test.ts} +60 -18
- package/tsconfig.json +2 -2
- package/types/commands/data/getFilesByCount/getFilesByCount.d.ts +4 -2
- package/types/commands/data/index.d.ts +4 -0
- package/types/commands/data/pinList/pinList.d.ts +45 -8
- package/types/commands/data/pinList/queryBuilder.d.ts +1 -7
- package/types/commands/data/testAuthentication.d.ts +5 -7
- package/types/commands/data/userPinnedDataTotal.d.ts +2 -7
- package/types/commands/pinning/hashMetadata.d.ts +3 -9
- package/types/commands/pinning/hashPinPolicy.d.ts +1 -1
- package/types/commands/pinning/index.d.ts +8 -0
- package/types/commands/pinning/pinByHash.d.ts +14 -9
- package/types/commands/pinning/pinFileToIPFS.d.ts +25 -1
- package/types/commands/pinning/pinFromFS.d.ts +3 -9
- package/types/commands/pinning/pinJSONToIPFS.d.ts +3 -9
- package/types/commands/pinning/pinJobs/pinJobs.d.ts +20 -8
- package/types/commands/pinning/pinJobs/queryBuilder.d.ts +1 -7
- package/types/commands/pinning/unpin.d.ts +2 -8
- package/types/commands/pinning/userPinPolicy.d.ts +1 -1
- package/types/constants.d.ts +2 -1
- package/types/index.d.ts +38 -331
- package/types/util/errorResponse.d.ts +1 -1
- package/types/util/validators.d.ts +43 -26
- package/webpack.config.js +50 -53
- package/src/commands/data/pinList/pinList.js +0 -41
- package/src/commands/data/userPinnedDataTotal.js +0 -36
- package/src/commands/pinning/hashPinPolicy.js +0 -57
- package/src/commands/pinning/pinJobs/pinJobs.js +0 -42
- package/src/commands/pinning/userPinPolicy.js +0 -46
- package/src/constants.js +0 -1
- package/src/index.js +0 -262
- package/src/util/validators.js +0 -118
- package/test/commands/data/pinList/pinList.test.js +0 -98
- package/test/commands/data/pinlist-sample-api.js +0 -540
- package/test/commands/data/testAuthentication.test.js +0 -30
- package/test/commands/data/userPinnedDataTotal.test.js +0 -29
- package/test/commands/pinning/hashMetadata.test.js +0 -77
- package/test/commands/pinning/hashPinPolicy.test.js +0 -65
- package/test/commands/pinning/pinByHash.test.js +0 -47
- package/test/commands/pinning/pinFileToIPFS.test.js +0 -55
- package/test/commands/pinning/pinFromFS.js +0 -33
- package/test/commands/pinning/pinJSONToIPFS.test.js +0 -43
- package/test/commands/pinning/pinJobs/pinJobs.test.js +0 -29
- package/test/commands/pinning/userPinPolicy.test.js +0 -51
package/test/commands/data/getFilesByCount/{getFilesByCount.test.js → getFilesByCount.test.ts}
RENAMED
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
import getFilesByCount from
|
|
2
|
-
import axios from
|
|
3
|
-
import {
|
|
1
|
+
import getFilesByCount from '../../../../src/commands/data/getFilesByCount/getFilesByCount';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
import {
|
|
4
|
+
APIData,
|
|
5
|
+
pinListAxiosMockPages,
|
|
6
|
+
fakeHeaders
|
|
7
|
+
} from '../pinlist-sample-api';
|
|
8
|
+
import { PinataConfig, PinataPin, PinataPinListFilterOptions } from '../../../../src';
|
|
4
9
|
|
|
5
|
-
jest.mock(
|
|
10
|
+
jest.mock('axios');
|
|
6
11
|
|
|
7
12
|
const metadataName = (item) => {
|
|
8
13
|
return item.metadata.name;
|
|
9
14
|
};
|
|
10
|
-
const callIterableObject = async (
|
|
11
|
-
|
|
12
|
-
pinataSecret,
|
|
13
|
-
filterToApply,
|
|
14
|
-
pinsCount
|
|
15
|
-
) => {
|
|
16
|
-
const pins = [];
|
|
15
|
+
const callIterableObject = async (config: PinataConfig, filterToApply: PinataPinListFilterOptions, pinsCount?: number) => {
|
|
16
|
+
const pins: PinataPin[] = [];
|
|
17
17
|
for await (const item of getFilesByCount(
|
|
18
|
-
|
|
19
|
-
pinataSecret,
|
|
18
|
+
config,
|
|
20
19
|
filterToApply,
|
|
21
20
|
pinsCount
|
|
22
21
|
)) {
|
|
@@ -26,25 +25,28 @@ const callIterableObject = async (
|
|
|
26
25
|
return pins;
|
|
27
26
|
};
|
|
28
27
|
|
|
29
|
-
describe(
|
|
28
|
+
describe('Get Files By Count', () => {
|
|
29
|
+
const pinataConfig = {
|
|
30
|
+
pinataApiKey: fakeHeaders.headers.pinata_api_key,
|
|
31
|
+
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
32
|
+
};
|
|
30
33
|
const filterToApply = {
|
|
31
|
-
status:
|
|
34
|
+
status: 'pinned'
|
|
32
35
|
};
|
|
33
36
|
|
|
34
37
|
afterEach(() => {
|
|
35
38
|
jest.resetAllMocks();
|
|
36
39
|
});
|
|
37
40
|
|
|
38
|
-
test(
|
|
41
|
+
test('Request 17 pins, pins available', async () => {
|
|
39
42
|
const pinsToRequest = 17;
|
|
40
43
|
|
|
41
|
-
axios.get
|
|
44
|
+
(axios.get as jest.Mock)
|
|
42
45
|
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
43
46
|
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response);
|
|
44
47
|
|
|
45
48
|
const pins = await callIterableObject(
|
|
46
|
-
|
|
47
|
-
fakeHeaders.headers.pinata_secret_api_key,
|
|
49
|
+
pinataConfig,
|
|
48
50
|
filterToApply,
|
|
49
51
|
pinsToRequest
|
|
50
52
|
);
|
|
@@ -67,15 +69,14 @@ describe("Get Files By Count", () => {
|
|
|
67
69
|
expect(axios.get).toHaveBeenCalledTimes(2);
|
|
68
70
|
});
|
|
69
71
|
|
|
70
|
-
test(
|
|
72
|
+
test('Request 6 pins, pins available', async () => {
|
|
71
73
|
const pinsToRequest = 6;
|
|
72
74
|
|
|
73
|
-
axios.get.mockResolvedValueOnce(
|
|
75
|
+
(axios.get as jest.Mock).mockResolvedValueOnce(
|
|
74
76
|
pinListAxiosMockPages.firstPage.response
|
|
75
77
|
);
|
|
76
78
|
const pins = await callIterableObject(
|
|
77
|
-
|
|
78
|
-
fakeHeaders.headers.pinata_secret_api_key,
|
|
79
|
+
pinataConfig,
|
|
79
80
|
filterToApply,
|
|
80
81
|
pinsToRequest
|
|
81
82
|
);
|
|
@@ -92,18 +93,17 @@ describe("Get Files By Count", () => {
|
|
|
92
93
|
expect(axios.get).toHaveBeenCalledTimes(1);
|
|
93
94
|
});
|
|
94
95
|
|
|
95
|
-
test(
|
|
96
|
+
test('Request 25 pins, pins not available', async () => {
|
|
96
97
|
const pinsToRequest = 25;
|
|
97
98
|
|
|
98
|
-
axios.get
|
|
99
|
+
(axios.get as jest.Mock)
|
|
99
100
|
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
100
101
|
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response)
|
|
101
102
|
.mockResolvedValueOnce(
|
|
102
103
|
pinListAxiosMockPages.thirdPageEmpty.response
|
|
103
104
|
);
|
|
104
105
|
const pins = await callIterableObject(
|
|
105
|
-
|
|
106
|
-
fakeHeaders.headers.pinata_secret_api_key,
|
|
106
|
+
pinataConfig,
|
|
107
107
|
filterToApply,
|
|
108
108
|
pinsToRequest
|
|
109
109
|
);
|
|
@@ -132,15 +132,14 @@ describe("Get Files By Count", () => {
|
|
|
132
132
|
expect(axios.get).toHaveBeenCalledTimes(3);
|
|
133
133
|
});
|
|
134
134
|
|
|
135
|
-
test(
|
|
135
|
+
test('Request 3 pins, pins not available', async () => {
|
|
136
136
|
const pinsToRequest = 3;
|
|
137
137
|
|
|
138
|
-
axios.get.mockResolvedValueOnce(
|
|
138
|
+
(axios.get as jest.Mock).mockResolvedValueOnce(
|
|
139
139
|
pinListAxiosMockPages.firstPageEmpty.response
|
|
140
140
|
);
|
|
141
141
|
const pins = await callIterableObject(
|
|
142
|
-
|
|
143
|
-
fakeHeaders.headers.pinata_secret_api_key,
|
|
142
|
+
pinataConfig,
|
|
144
143
|
filterToApply,
|
|
145
144
|
pinsToRequest
|
|
146
145
|
);
|
|
@@ -157,16 +156,15 @@ describe("Get Files By Count", () => {
|
|
|
157
156
|
expect(axios.get).toHaveBeenCalledTimes(1);
|
|
158
157
|
});
|
|
159
158
|
|
|
160
|
-
test(
|
|
161
|
-
axios.get
|
|
159
|
+
test('Request all pins, pins available', async () => {
|
|
160
|
+
(axios.get as jest.Mock)
|
|
162
161
|
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
163
162
|
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response)
|
|
164
163
|
.mockResolvedValueOnce(
|
|
165
164
|
pinListAxiosMockPages.thirdPageEmpty.response
|
|
166
165
|
);
|
|
167
166
|
const pins = await callIterableObject(
|
|
168
|
-
|
|
169
|
-
fakeHeaders.headers.pinata_secret_api_key,
|
|
167
|
+
pinataConfig,
|
|
170
168
|
filterToApply
|
|
171
169
|
);
|
|
172
170
|
expect(pins).toEqual(APIData.rows.map(metadataName));
|
|
@@ -191,13 +189,12 @@ describe("Get Files By Count", () => {
|
|
|
191
189
|
expect(axios.get).toHaveBeenCalledTimes(3);
|
|
192
190
|
});
|
|
193
191
|
|
|
194
|
-
test(
|
|
195
|
-
axios.get.mockResolvedValueOnce(
|
|
192
|
+
test('Request all pins, pins not available', async () => {
|
|
193
|
+
(axios.get as jest.Mock).mockResolvedValueOnce(
|
|
196
194
|
pinListAxiosMockPages.firstPageEmpty.response
|
|
197
195
|
);
|
|
198
196
|
const pins = await callIterableObject(
|
|
199
|
-
|
|
200
|
-
fakeHeaders.headers.pinata_secret_api_key,
|
|
197
|
+
pinataConfig,
|
|
201
198
|
filterToApply
|
|
202
199
|
);
|
|
203
200
|
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import pinList from '../../../../src/commands/data/pinList/pinList';
|
|
3
|
+
import {
|
|
4
|
+
pinListAxiosMockPages,
|
|
5
|
+
fakeHeaders
|
|
6
|
+
} from '../pinlist-sample-api';
|
|
7
|
+
|
|
8
|
+
jest.mock('axios');
|
|
9
|
+
|
|
10
|
+
describe('Pin List by page', () => {
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
jest.resetAllMocks();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test('Call two pages in a row', async () => {
|
|
16
|
+
(axios.get as jest.Mock)
|
|
17
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.firstPage.response)
|
|
18
|
+
.mockResolvedValueOnce(pinListAxiosMockPages.secondPage.response);
|
|
19
|
+
|
|
20
|
+
const resp = await pinList(
|
|
21
|
+
{
|
|
22
|
+
pinataApiKey: fakeHeaders.headers.pinata_api_key,
|
|
23
|
+
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
24
|
+
},
|
|
25
|
+
{ pageLimit: 10, pageOffset: 0, status: 'pinned' }
|
|
26
|
+
);
|
|
27
|
+
const resp2 = await pinList(
|
|
28
|
+
{
|
|
29
|
+
pinataApiKey: fakeHeaders.headers.pinata_api_key,
|
|
30
|
+
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
31
|
+
},
|
|
32
|
+
{ pageLimit: 10, pageOffset: 10, status: 'pinned' }
|
|
33
|
+
);
|
|
34
|
+
expect(resp).toEqual(pinListAxiosMockPages.firstPage.response.data);
|
|
35
|
+
expect(resp2).toEqual(pinListAxiosMockPages.secondPage.response.data);
|
|
36
|
+
|
|
37
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
38
|
+
1,
|
|
39
|
+
pinListAxiosMockPages.firstPage.url,
|
|
40
|
+
pinListAxiosMockPages.firstPage.headers
|
|
41
|
+
);
|
|
42
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
43
|
+
2,
|
|
44
|
+
pinListAxiosMockPages.secondPage.url,
|
|
45
|
+
pinListAxiosMockPages.secondPage.headers
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
expect(axios.get).toHaveBeenCalledTimes(2);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('Call empty page', async () => {
|
|
52
|
+
(axios.get as jest.Mock).mockResolvedValueOnce(
|
|
53
|
+
pinListAxiosMockPages.firstPageEmpty.response
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const resp = await pinList(
|
|
57
|
+
{
|
|
58
|
+
pinataApiKey: fakeHeaders.headers.pinata_api_key,
|
|
59
|
+
pinataSecretApiKey: fakeHeaders.headers.pinata_secret_api_key
|
|
60
|
+
},
|
|
61
|
+
{ pageLimit: 10, pageOffset: 0, status: 'pinned' }
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
expect(resp).toEqual({ rows: [] });
|
|
65
|
+
|
|
66
|
+
expect(axios.get).toHaveBeenNthCalledWith(
|
|
67
|
+
1,
|
|
68
|
+
pinListAxiosMockPages.firstPageEmpty.url,
|
|
69
|
+
pinListAxiosMockPages.firstPageEmpty.headers
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
expect(axios.get).toHaveBeenCalledTimes(1);
|
|
73
|
+
});
|
|
74
|
+
test('Result other than 200 status is returned', () => {
|
|
75
|
+
const badStatus = {
|
|
76
|
+
status: 700
|
|
77
|
+
};
|
|
78
|
+
(axios.get as jest.Mock).mockResolvedValue(badStatus);
|
|
79
|
+
expect.assertions(1);
|
|
80
|
+
expect(pinList({ pinataApiKey: 'test', pinataSecretApiKey: 'test' })).rejects.toEqual(
|
|
81
|
+
Error(
|
|
82
|
+
`unknown server response while attempting to retrieve user pin list: ${badStatus}`
|
|
83
|
+
)
|
|
84
|
+
);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test('200 status is returned', () => {
|
|
88
|
+
const goodStatus = {
|
|
89
|
+
status: 200,
|
|
90
|
+
data: 'testData'
|
|
91
|
+
};
|
|
92
|
+
(axios.get as jest.Mock).mockResolvedValue(goodStatus);
|
|
93
|
+
expect.assertions(1);
|
|
94
|
+
expect(pinList({ pinataApiKey: 'test', pinataSecretApiKey: 'test' })).resolves.toEqual(goodStatus.data);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test('Rejection handled', () => {
|
|
98
|
+
(axios.get as jest.Mock).mockRejectedValue('test error');
|
|
99
|
+
expect.assertions(1);
|
|
100
|
+
expect(pinList({ pinataApiKey: 'test', pinataSecretApiKey: 'test' })).rejects.toEqual('test error');
|
|
101
|
+
});
|
|
102
|
+
});
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import queryBuilder from '
|
|
1
|
+
import queryBuilder from '../../../../src/commands/data/pinList/queryBuilder';
|
|
2
2
|
|
|
3
3
|
const baseUrl = 'testing.com/test';
|
|
4
|
-
const badFilterValue = 'badFilterValue';
|
|
5
4
|
const noFiltersUrl = `${baseUrl}?`;
|
|
6
5
|
const validISODate = '2019-03-12T20:42:26.743Z';
|
|
7
6
|
const validInteger = 5;
|
|
8
7
|
|
|
9
8
|
describe('queryBuilder no params provided', () => {
|
|
10
9
|
test('if no baseUrl is provided', () => {
|
|
11
|
-
expect(() => {
|
|
12
|
-
|
|
13
|
-
}).toThrow('no baseUrl provided');
|
|
10
|
+
// expect(() => {
|
|
11
|
+
// queryBuilder();
|
|
12
|
+
// }).toThrow('no baseUrl provided');
|
|
14
13
|
});
|
|
15
14
|
test('if no filters are provided, return a non filtered url', () => {
|
|
16
15
|
expect(queryBuilder(baseUrl)).toEqual(noFiltersUrl);
|
|
@@ -163,7 +162,7 @@ describe('queryBuilder filter: pageLimit', () => {
|
|
|
163
162
|
};
|
|
164
163
|
expect(() => {
|
|
165
164
|
queryBuilder(baseUrl, filters);
|
|
166
|
-
}).toThrow(
|
|
165
|
+
}).toThrow('Please make sure the pageLimit is a valid integer between 1-1000');
|
|
167
166
|
});
|
|
168
167
|
test('non valid pageLimit is passed in', () => {
|
|
169
168
|
const filters = {
|
|
@@ -171,7 +170,7 @@ describe('queryBuilder filter: pageLimit', () => {
|
|
|
171
170
|
};
|
|
172
171
|
expect(() => {
|
|
173
172
|
queryBuilder(baseUrl, filters);
|
|
174
|
-
}).toThrow(
|
|
173
|
+
}).toThrow('Please make sure the pageLimit is a valid integer between 1-1000');
|
|
175
174
|
});
|
|
176
175
|
test('Decimal is passed in - expect to round down', () => {
|
|
177
176
|
const filters = {
|
|
@@ -320,7 +319,7 @@ describe('metadata provided', () => {
|
|
|
320
319
|
};
|
|
321
320
|
expect(() => {
|
|
322
321
|
queryBuilder(baseUrl, filters);
|
|
323
|
-
}).toThrow(
|
|
322
|
+
}).toThrow('Because between op code was passed in, keyValue: testKeyValue must have both also include a secondValue');
|
|
324
323
|
});
|
|
325
324
|
test('between op code passed in, but object passed in as secondValue', () => {
|
|
326
325
|
const filters = {
|
|
@@ -353,7 +352,7 @@ describe('metadata provided', () => {
|
|
|
353
352
|
};
|
|
354
353
|
expect(() => {
|
|
355
354
|
queryBuilder(baseUrl, filters);
|
|
356
|
-
}).toThrow(
|
|
355
|
+
}).toThrow('Because notBetween op code was passed in, keyValue: testKeyValue must have both also include a secondValue');
|
|
357
356
|
});
|
|
358
357
|
test('notBetween op code passed in, but object passed in as secondValue', () => {
|
|
359
358
|
const filters = {
|
|
@@ -394,7 +393,7 @@ describe('metadata provided', () => {
|
|
|
394
393
|
testKeyValue: {
|
|
395
394
|
value: 'test',
|
|
396
395
|
op: 'eq'
|
|
397
|
-
},
|
|
396
|
+
},
|
|
398
397
|
testKeyValue2: {
|
|
399
398
|
value: 'test2',
|
|
400
399
|
op: 'eq'
|