@lumeweb/pinner 0.1.0 → 0.1.1

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 (75) hide show
  1. package/README.md +35 -18
  2. package/dist/cjs/adapters/pinata/index.cjs +6 -3
  3. package/dist/cjs/adapters/pinata/legacy/adapter.cjs +83 -0
  4. package/dist/cjs/adapters/pinata/legacy/adapter.cjs.map +1 -0
  5. package/dist/cjs/adapters/pinata/legacy/adapter.d.cts +74 -0
  6. package/dist/cjs/adapters/pinata/legacy/index.cjs +1 -0
  7. package/dist/cjs/adapters/pinata/shared/index.cjs +1 -0
  8. package/dist/cjs/adapters/pinata/shared/types.d.cts +218 -0
  9. package/dist/cjs/adapters/pinata/shared/utils.cjs +83 -0
  10. package/dist/cjs/adapters/pinata/shared/utils.cjs.map +1 -0
  11. package/dist/cjs/adapters/pinata/v2/adapter-interface.d.cts +198 -0
  12. package/dist/cjs/adapters/pinata/v2/adapter.cjs +636 -0
  13. package/dist/cjs/adapters/pinata/v2/adapter.cjs.map +1 -0
  14. package/dist/cjs/adapters/pinata/v2/adapter.d.cts +17 -0
  15. package/dist/cjs/adapters/pinata/v2/index.cjs +1 -0
  16. package/dist/cjs/adapters/pinata/v2/types.d.cts +308 -0
  17. package/dist/cjs/index.cjs +3 -1
  18. package/dist/cjs/index.d.cts +5 -3
  19. package/dist/cjs/pin/client.cjs +5 -3
  20. package/dist/cjs/pin/client.cjs.map +1 -1
  21. package/dist/cjs/pinner.cjs +6 -0
  22. package/dist/cjs/pinner.cjs.map +1 -1
  23. package/dist/cjs/pinner.d.cts +4 -0
  24. package/dist/cjs/types/constants.cjs +6 -1
  25. package/dist/cjs/types/constants.cjs.map +1 -1
  26. package/dist/cjs/types/pin.d.cts +4 -0
  27. package/dist/esm/adapters/pinata/index.d.ts +7 -4
  28. package/dist/esm/adapters/pinata/index.js +6 -3
  29. package/dist/esm/adapters/pinata/legacy/adapter.d.ts +74 -0
  30. package/dist/esm/adapters/pinata/legacy/adapter.js +83 -0
  31. package/dist/esm/adapters/pinata/legacy/adapter.js.map +1 -0
  32. package/dist/esm/adapters/pinata/legacy/index.d.ts +1 -0
  33. package/dist/esm/adapters/pinata/legacy/index.js +1 -0
  34. package/dist/esm/adapters/pinata/shared/index.d.ts +2 -0
  35. package/dist/esm/adapters/pinata/shared/index.js +1 -0
  36. package/dist/esm/adapters/pinata/shared/types.d.ts +218 -0
  37. package/dist/esm/adapters/pinata/shared/utils.d.ts +1 -0
  38. package/dist/esm/adapters/pinata/shared/utils.js +78 -0
  39. package/dist/esm/adapters/pinata/shared/utils.js.map +1 -0
  40. package/dist/esm/adapters/pinata/v2/adapter-interface.d.ts +198 -0
  41. package/dist/esm/adapters/pinata/v2/adapter.d.ts +17 -0
  42. package/dist/esm/adapters/pinata/v2/adapter.js +636 -0
  43. package/dist/esm/adapters/pinata/v2/adapter.js.map +1 -0
  44. package/dist/esm/adapters/pinata/v2/index.d.ts +3 -0
  45. package/dist/esm/adapters/pinata/v2/index.js +1 -0
  46. package/dist/esm/adapters/pinata/v2/types.d.ts +308 -0
  47. package/dist/esm/index.d.ts +5 -3
  48. package/dist/esm/index.js +3 -2
  49. package/dist/esm/pin/client.js +5 -3
  50. package/dist/esm/pin/client.js.map +1 -1
  51. package/dist/esm/pinner.d.ts +4 -0
  52. package/dist/esm/pinner.js +6 -0
  53. package/dist/esm/pinner.js.map +1 -1
  54. package/dist/esm/types/constants.js +6 -2
  55. package/dist/esm/types/constants.js.map +1 -1
  56. package/dist/esm/types/pin.d.ts +4 -0
  57. package/package.json +3 -3
  58. package/dist/cjs/adapters/pinata/adapter.cjs +0 -88
  59. package/dist/cjs/adapters/pinata/adapter.cjs.map +0 -1
  60. package/dist/cjs/adapters/pinata/adapter.d.cts +0 -35
  61. package/dist/cjs/adapters/pinata/builder.cjs +0 -194
  62. package/dist/cjs/adapters/pinata/builder.cjs.map +0 -1
  63. package/dist/cjs/adapters/pinata/list-builder.cjs +0 -52
  64. package/dist/cjs/adapters/pinata/list-builder.cjs.map +0 -1
  65. package/dist/cjs/types/pinata.d.cts +0 -99
  66. package/dist/esm/adapters/pinata/adapter.d.ts +0 -35
  67. package/dist/esm/adapters/pinata/adapter.js +0 -87
  68. package/dist/esm/adapters/pinata/adapter.js.map +0 -1
  69. package/dist/esm/adapters/pinata/builder.d.ts +0 -1
  70. package/dist/esm/adapters/pinata/builder.js +0 -187
  71. package/dist/esm/adapters/pinata/builder.js.map +0 -1
  72. package/dist/esm/adapters/pinata/list-builder.d.ts +0 -1
  73. package/dist/esm/adapters/pinata/list-builder.js +0 -51
  74. package/dist/esm/adapters/pinata/list-builder.js.map +0 -1
  75. package/dist/esm/types/pinata.d.ts +0 -99
package/README.md CHANGED
@@ -293,22 +293,39 @@ See [blockstore/README.md](./src/blockstore/README.md) for detailed blockstore d
293
293
 
294
294
  ## Adapters
295
295
 
296
- ### Pinata Adapter
296
+ ### Pinata Adapters
297
297
 
298
- The Pinata adapter provides a Pinata SDK-compatible interface for the Pinner client, making it easy to migrate from Pinata SDK with minimal code changes.
298
+ The Pinata adapters provide Pinata SDK API compatibility for the Pinner client, allowing applications written for the Pinata SDK to work with Lume's IPFS pinning infrastructure with minimal code changes.
299
+
300
+ **Attribution**: These adapters include TypeScript type definitions and API interfaces adapted from the Pinata SDK for compatibility purposes. The original Pinata SDK is available at:
301
+ - **Pinata SDK 2.x**: https://github.com/PinataCloud/pinata/commit/cdc0c06116aaadaf7c4b287a2673cd23b6ba1125
302
+ - **Pinata SDK 1.x**: https://github.com/PinataCloud/pinata/commit/c141177ff3036e46fa7b95fcc68c159b58817836
303
+
304
+ The adapters provide Pinata SDK API compatibility but route all operations through Lume's IPFS pinning infrastructure. They do NOT use Pinata's servers or services.
305
+
306
+ #### Available Adapters
307
+
308
+ - **V2 Adapter** (`pinataAdapter`): Compatible with Pinata SDK 2.x API (recommended, latest)
309
+ - **Legacy Adapter** (`pinataLegacyAdapter`): Compatible with Pinata SDK 1.x API
310
+
311
+ See [adapters/README.md](./src/adapters/README.md) for comprehensive documentation including migration guides, feature support tables, and detailed examples.
299
312
 
300
313
  #### Setup
301
314
 
302
315
  ```typescript
303
- import { Pinner, pinataAdapter } from "@lumeweb/pinner";
316
+ import { Pinner, pinataAdapter, pinataLegacyAdapter } from "@lumeweb/pinner";
304
317
 
305
318
  // Initialize Pinner
306
319
  const pinner = new Pinner({
307
- jwt: "your-jwt-token"
320
+ jwt: "your-jwt-token",
321
+ endpoint: "https://your-pinning-service-endpoint.com"
308
322
  });
309
323
 
310
- // Create Pinata adapter
324
+ // Create Pinata V2 adapter (recommended)
311
325
  const pinata = pinataAdapter(pinner);
326
+
327
+ // Or use the legacy adapter
328
+ const pinataLegacy = pinataLegacyAdapter(pinner);
312
329
  ```
313
330
 
314
331
  #### Upload Methods
@@ -319,12 +336,12 @@ The Pinata adapter provides multiple upload methods with a fluent builder patter
319
336
 
320
337
  ```typescript
321
338
  // Simple file upload
322
- const result = await pinata.upload.file(file).execute();
339
+ const result = await pinata.upload.public.file(file).execute();
323
340
  console.log("CID:", result.IpfsHash);
324
341
  console.log("Size:", result.PinSize);
325
342
 
326
343
  // Upload with metadata
327
- const result = await pinata.upload.file(file)
344
+ const result = await pinata.upload.public.file(file)
328
345
  .name("My File")
329
346
  .keyvalues({ key: "value" })
330
347
  .execute();
@@ -338,7 +355,7 @@ const files = [
338
355
  new File(["content2"], "file2.txt")
339
356
  ];
340
357
 
341
- const result = await pinata.upload.fileArray(files)
358
+ const result = await pinata.upload.public.fileArray(files)
342
359
  .name("My Directory")
343
360
  .keyvalues({ type: "directory" })
344
361
  .execute();
@@ -349,7 +366,7 @@ const result = await pinata.upload.fileArray(files)
349
366
  ```typescript
350
367
  const data = { foo: "bar", number: 42 };
351
368
 
352
- const result = await pinata.upload.json(data)
369
+ const result = await pinata.upload.public.json(data)
353
370
  .name("data.json")
354
371
  .keyvalues({ format: "json" })
355
372
  .execute();
@@ -360,7 +377,7 @@ const result = await pinata.upload.json(data)
360
377
  ```typescript
361
378
  const base64String = "SGVsbG8sIHdvcmxkIQ==";
362
379
 
363
- const result = await pinata.upload.base64(base64String)
380
+ const result = await pinata.upload.public.base64(base64String)
364
381
  .name("base64-file.txt")
365
382
  .execute();
366
383
  ```
@@ -368,7 +385,7 @@ const result = await pinata.upload.base64(base64String)
368
385
  ##### Upload from URL
369
386
 
370
387
  ```typescript
371
- const result = await pinata.upload.url("https://example.com/data.json")
388
+ const result = await pinata.upload.public.url("https://example.com/data.json")
372
389
  .name("downloaded-file.json")
373
390
  .execute();
374
391
  ```
@@ -377,10 +394,10 @@ const result = await pinata.upload.url("https://example.com/data.json")
377
394
 
378
395
  ```typescript
379
396
  // Pin existing content
380
- await pinata.upload.cid("Qm...").execute();
397
+ await pinata.upload.public.cid("Qm...").execute();
381
398
 
382
399
  // Pin with metadata
383
- await pinata.upload.cid("Qm...")
400
+ await pinata.upload.public.cid("Qm...")
384
401
  .name("Existing Content")
385
402
  .keyvalues({ source: "external" })
386
403
  .execute();
@@ -438,10 +455,10 @@ await pinata.setPinMetadata("Qm...", {
438
455
 
439
456
  ```typescript
440
457
  // List all files
441
- const files = await pinata.files.list().execute();
458
+ const files = await pinata.files.public.list().execute();
442
459
 
443
460
  // List with pagination
444
- const files = await pinata.files.list()
461
+ const files = await pinata.files.public.list()
445
462
  .limit(10)
446
463
  .pageToken("next-page-token")
447
464
  .execute();
@@ -458,7 +475,7 @@ files.forEach(file => {
458
475
  ##### Get File by ID
459
476
 
460
477
  ```typescript
461
- const file = await pinata.files.get("Qm...");
478
+ const file = await pinata.files.public.get("Qm...");
462
479
  console.log("File details:", file);
463
480
  ```
464
481
 
@@ -484,7 +501,7 @@ import { Pinner, pinataAdapter } from '@lumeweb/pinner';
484
501
  const pinner = new Pinner({ jwt: 'your-jwt-token' });
485
502
  const pinata = pinataAdapter(pinner);
486
503
 
487
- const result = await pinata.upload.file(file)
504
+ const result = await pinata.upload.public.file(file)
488
505
  .name('My File')
489
506
  .execute();
490
507
  ```
@@ -690,7 +707,7 @@ import {
690
707
  } from "@lumeweb/pinner";
691
708
 
692
709
  // Adapters
693
- import { pinataAdapter } from "@lumeweb/pinner/adapters/pinata";
710
+ import { pinataAdapter, pinataLegacyAdapter } from "@lumeweb/pinner";
694
711
 
695
712
  // Blockstore module
696
713
  import { UnstorageBlockstore } from "@lumeweb/pinner/blockstore";
@@ -1,3 +1,6 @@
1
- const require_builder = require('./builder.cjs');
2
- const require_list_builder = require('./list-builder.cjs');
3
- const require_adapter = require('./adapter.cjs');
1
+ const require_utils = require('./shared/utils.cjs');
2
+ const require_adapter = require('./v2/adapter.cjs');
3
+ require('./v2/index.cjs');
4
+ const require_adapter$1 = require('./legacy/adapter.cjs');
5
+ require('./legacy/index.cjs');
6
+ require('./shared/index.cjs');
@@ -0,0 +1,83 @@
1
+ const require_constants = require('../../../types/constants.cjs');
2
+ const require_utils = require('../shared/utils.cjs');
3
+
4
+ //#region src/adapters/pinata/legacy/adapter.ts
5
+ /**
6
+ * Create Pinata 1.x Legacy Adapter
7
+ *
8
+ * @param pinner - Pinner client instance
9
+ * @param config - Pinata configuration
10
+ * @returns PinataLegacyAdapter
11
+ */
12
+ function pinataLegacyAdapter(pinner, config) {
13
+ return {
14
+ async pinFileToIPFS(file, options) {
15
+ return require_utils.createUploadResponse(await pinner.uploadAndWait(file, {
16
+ name: options?.metadata?.name,
17
+ keyvalues: options?.metadata?.keyvalues
18
+ }), file.name);
19
+ },
20
+ async pinJSONToIPFS(data, options) {
21
+ const jsonString = JSON.stringify(data);
22
+ const file = new File([jsonString], options?.metadata?.name || "data.json", { type: "application/json" });
23
+ return require_utils.createUploadResponse(await pinner.uploadAndWait(file, {
24
+ name: options?.metadata?.name,
25
+ keyvalues: options?.metadata?.keyvalues
26
+ }), file.name);
27
+ },
28
+ async pinByHash(cid, options) {
29
+ const cidObj = require_utils.parseCID(cid);
30
+ const generator = await pinner.pinByHash(cidObj, {
31
+ name: options?.metadata?.name,
32
+ metadata: options?.metadata?.keyvalues
33
+ });
34
+ for await (const _ of generator);
35
+ const pin = await pinner.getPinStatus(cidObj);
36
+ return require_utils.createUploadResponse({
37
+ cid: pin.cid.toString(),
38
+ size: pin.size || 0,
39
+ createdAt: pin.created
40
+ }, pin.name || "");
41
+ },
42
+ async pinList(query) {
43
+ return {
44
+ files: (await pinner.listPins({ limit: query?.limit })).map(require_utils.createFileListItem),
45
+ next_page_token: ""
46
+ };
47
+ },
48
+ async unpin(cid) {
49
+ await pinner.unpin(cid);
50
+ return { message: `Unpinned ${cid}` };
51
+ },
52
+ async hashMetadata(cid, metadata) {
53
+ await pinner.setPinMetadata(cid, metadata);
54
+ return { message: `Updated metadata for ${cid}` };
55
+ },
56
+ async createSignedURL(options) {
57
+ return `${config?.pinataGateway || require_constants.DEFAULT_GATEWAY}/ipfs/${options.cid}`;
58
+ },
59
+ async pinJobs(query) {
60
+ return { rows: (await pinner.listPins({ limit: query?.limit })).map(require_utils.createPinJobItem) };
61
+ },
62
+ async topUsageAnalytics(query) {
63
+ return { data: [] };
64
+ },
65
+ async dateIntervalAnalytics(query) {
66
+ return {
67
+ total_requests: 0,
68
+ total_bandwidth: 0,
69
+ time_periods: []
70
+ };
71
+ },
72
+ async swapCid(options) {
73
+ require_utils.notSupported("Swap CID");
74
+ },
75
+ async swapHistory(options) {
76
+ return [];
77
+ }
78
+ };
79
+ }
80
+
81
+ //#endregion
82
+ exports.pinataLegacyAdapter = pinataLegacyAdapter;
83
+ //# sourceMappingURL=adapter.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.cjs","names":["createUploadResponse","parseCID","createFileListItem","DEFAULT_GATEWAY","createPinJobItem"],"sources":["../../../../../src/adapters/pinata/legacy/adapter.ts"],"sourcesContent":["/**\n * Pinata SDK 1.x Legacy Adapter\n * Provides compatibility with Pinata SDK 1.x API\n *\n * Source: https://github.com/PinataCloud/pinata/commit/c141177ff3036e46fa7b95fcc68c159b58817836\n * - src/core/pinataSDK.ts\n * - src/core/types.ts\n *\n * Copyright © 2024 Pinata Cloud Technologies\n * Type definitions and API interfaces adapted from Pinata SDK for compatibility.\n * Original Pinata SDK: https://github.com/PinataCloud/pinata\n */\n\nimport type { Pinner } from \"@/pinner\";\nimport type {\n\tPinataConfig,\n\tUploadResponse,\n\tUploadOptions,\n\tFileListResponse,\n\tFileListQuery,\n\tPinJobResponse,\n\tPinJobQuery,\n\tDeleteResponse,\n\tPinataMetadata,\n\tSignedUrlOptions,\n\tTopAnalyticsQuery,\n\tTopAnalyticsResponse,\n\tTimeIntervalAnalyticsQuery,\n\tTimeIntervalAnalyticsResponse,\n\tSwapCidOptions,\n\tSwapCidResponse,\n\tSwapHistoryOptions,\n} from \"../shared/types\";\nimport { parseCID, createUploadResponse, createFileListItem, createPinJobItem, notSupported } from \"../shared/utils\";\nimport { DEFAULT_GATEWAY } from \"@/types/constants\";\n\n/**\n * Pinata 1.x Legacy Adapter Interface\n * Matches Pinata SDK 1.x API exactly\n */\nexport interface PinataLegacyAdapter {\n\t/**\n\t * Upload a file to IPFS\n\t */\n\tpinFileToIPFS(file: File, options?: UploadOptions): Promise<UploadResponse>;\n\n\t/**\n\t * Upload JSON data to IPFS\n\t */\n\tpinJSONToIPFS(data: any, options?: UploadOptions): Promise<UploadResponse>;\n\n\t/**\n\t * Pin content by CID\n\t */\n\tpinByHash(cid: string, options?: UploadOptions): Promise<UploadResponse>;\n\n\t/**\n\t * List pinned files\n\t */\n\tpinList(query?: FileListQuery): Promise<FileListResponse>;\n\n\t/**\n\t * Unpin content by CID\n\t */\n\tunpin(cid: string): Promise<{ message: string }>;\n\n\t/**\n\t * Update pin metadata\n\t */\n\thashMetadata(cid: string, metadata: Record<string, string>): Promise<{ message: string }>;\n\n\t/**\n\t * Create signed URL for private IPFS files\n\t */\n\tcreateSignedURL(options: SignedUrlOptions): Promise<string>;\n\n\t/**\n\t * Get pin jobs\n\t */\n\tpinJobs(query?: PinJobQuery): Promise<PinJobResponse>;\n\n\t/**\n\t * Get top usage analytics\n\t */\n\ttopUsageAnalytics(query: TopAnalyticsQuery): Promise<TopAnalyticsResponse>;\n\n\t/**\n\t * Get date interval analytics\n\t */\n\tdateIntervalAnalytics(\n\t\tquery: TimeIntervalAnalyticsQuery,\n\t): Promise<TimeIntervalAnalyticsResponse>;\n\n\t/**\n\t * Swap CID\n\t */\n\tswapCid(options: SwapCidOptions): Promise<SwapCidResponse>;\n\n\t/**\n\t * Get swap history\n\t */\n\tswapHistory(options: SwapHistoryOptions): Promise<SwapCidResponse[]>;\n}\n\n/**\n * Create Pinata 1.x Legacy Adapter\n *\n * @param pinner - Pinner client instance\n * @param config - Pinata configuration\n * @returns PinataLegacyAdapter\n */\nexport function pinataLegacyAdapter(\n\tpinner: Pinner,\n\tconfig?: PinataConfig,\n): PinataLegacyAdapter {\n\treturn {\n\t\t/**\n\t\t * Pin a file to IPFS\n\t\t */\n\t\tasync pinFileToIPFS(\n\t\t\tfile: File,\n\t\t\toptions?: UploadOptions,\n\t\t): Promise<UploadResponse> {\n\t\t\tconst result = await pinner.uploadAndWait(file, {\n\t\t\t\tname: options?.metadata?.name,\n\t\t\t\tkeyvalues: options?.metadata?.keyvalues,\n\t\t\t});\n\n\t\t\treturn createUploadResponse(result, file.name);\n\t\t},\n\n\t\t/**\n\t\t * Pin JSON data to IPFS\n\t\t */\n\t\tasync pinJSONToIPFS(\n\t\t\tdata: any,\n\t\t\toptions?: UploadOptions,\n\t\t): Promise<UploadResponse> {\n\t\t\t// Convert JSON to File\n\t\t\tconst jsonString = JSON.stringify(data);\n\t\t\tconst file = new File(\n\t\t\t\t[jsonString],\n\t\t\t\toptions?.metadata?.name || \"data.json\",\n\t\t\t\t{ type: \"application/json\" },\n\t\t\t);\n\n\t\t\tconst result = await pinner.uploadAndWait(file, {\n\t\t\t\tname: options?.metadata?.name,\n\t\t\t\tkeyvalues: options?.metadata?.keyvalues,\n\t\t\t});\n\n\t\t\treturn createUploadResponse(result, file.name);\n\t\t},\n\n\t\t/**\n\t\t * Pin content by CID\n\t\t */\n\t\tasync pinByHash(\n\t\t\tcid: string,\n\t\t\toptions?: UploadOptions,\n\t\t): Promise<UploadResponse> {\n\t\t\tconst cidObj = parseCID(cid);\n\t\t\tconst generator = await pinner.pinByHash(cidObj, {\n\t\t\t\tname: options?.metadata?.name,\n\t\t\t\tmetadata: options?.metadata?.keyvalues,\n\t\t\t});\n\n\t\t\tfor await (const _ of generator) {\n\t\t\t\t// Wait for pin to complete\n\t\t\t}\n\n\t\t\tconst pin = await pinner.getPinStatus(cidObj);\n\t\t\treturn createUploadResponse(\n\t\t\t\t{\n\t\t\t\t\tcid: pin.cid.toString(),\n\t\t\t\t\tsize: pin.size || 0,\n\t\t\t\t\tcreatedAt: pin.created,\n\t\t\t\t},\n\t\t\t\tpin.name || \"\",\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * List pinned files\n\t\t */\n\t\tasync pinList(query?: FileListQuery): Promise<FileListResponse> {\n\t\t\tconst pins = await pinner.listPins({\n\t\t\t\tlimit: query?.limit,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tfiles: pins.map(createFileListItem),\n\t\t\t\tnext_page_token: \"\",\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Unpin content\n\t\t */\n\t\tasync unpin(cid: string): Promise<{ message: string }> {\n\t\t\tawait pinner.unpin(cid);\n\t\t\treturn { message: `Unpinned ${cid}` };\n\t\t},\n\n\t\t/**\n\t\t * Update pin metadata\n\t\t */\n\t\tasync hashMetadata(\n\t\t\tcid: string,\n\t\t\tmetadata: Record<string, string>,\n\t\t): Promise<{ message: string }> {\n\t\t\tawait pinner.setPinMetadata(cid, metadata);\n\t\t\treturn { message: `Updated metadata for ${cid}` };\n\t\t},\n\n\t\t/**\n\t\t * Create signed URL (not fully supported in Pinner)\n\t\t * Returns a gateway URL instead\n\t\t */\n\t\tasync createSignedURL(options: SignedUrlOptions): Promise<string> {\n\t\t\t// Pinner doesn't support signed URLs for private files\n\t\t\t// Return a gateway URL as fallback\n\t\t\tconst gateway = config?.pinataGateway || DEFAULT_GATEWAY;\n\t\t\treturn `${gateway}/ipfs/${options.cid}`;\n\t\t},\n\n\t\t/**\n\t\t * Get pin jobs\n\t\t */\n\t\tasync pinJobs(query?: PinJobQuery): Promise<PinJobResponse> {\n\t\t\tconst pins = await pinner.listPins({\n\t\t\t\tlimit: query?.limit,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\trows: pins.map(createPinJobItem),\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Get top usage analytics (not supported in Pinner)\n\t\t * Returns empty data\n\t\t */\n\t\tasync topUsageAnalytics(\n\t\t\tquery: TopAnalyticsQuery,\n\t\t): Promise<TopAnalyticsResponse> {\n\t\t\t// Pinner doesn't support analytics\n\t\t\treturn {\n\t\t\t\tdata: [],\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Get date interval analytics (not supported in Pinner)\n\t\t * Returns empty data\n\t\t */\n\t\tasync dateIntervalAnalytics(\n\t\t\tquery: TimeIntervalAnalyticsQuery,\n\t\t): Promise<TimeIntervalAnalyticsResponse> {\n\t\t\t// Pinner doesn't support analytics\n\t\t\treturn {\n\t\t\t\ttotal_requests: 0,\n\t\t\t\ttotal_bandwidth: 0,\n\t\t\t\ttime_periods: [],\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Swap CID (not supported in Pinner)\n\t\t * Returns error\n\t\t */\n\t\tasync swapCid(options: SwapCidOptions): Promise<SwapCidResponse> {\n\t\t\tnotSupported(\"Swap CID\");\n\t\t},\n\n\t\t/**\n\t\t * Get swap history (not supported in Pinner)\n\t\t * Returns empty array\n\t\t */\n\t\tasync swapHistory(options: SwapHistoryOptions): Promise<SwapCidResponse[]> {\n\t\t\t// Pinner doesn't support swaps\n\t\t\treturn [];\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;;;;AA+GA,SAAgB,oBACf,QACA,QACsB;AACtB,QAAO;EAIN,MAAM,cACL,MACA,SAC0B;AAM1B,UAAOA,mCALQ,MAAM,OAAO,cAAc,MAAM;IAC/C,MAAM,SAAS,UAAU;IACzB,WAAW,SAAS,UAAU;IAC9B,CAAC,EAEkC,KAAK,KAAK;;EAM/C,MAAM,cACL,MACA,SAC0B;GAE1B,MAAM,aAAa,KAAK,UAAU,KAAK;GACvC,MAAM,OAAO,IAAI,KAChB,CAAC,WAAW,EACZ,SAAS,UAAU,QAAQ,aAC3B,EAAE,MAAM,oBAAoB,CAC5B;AAOD,UAAOA,mCALQ,MAAM,OAAO,cAAc,MAAM;IAC/C,MAAM,SAAS,UAAU;IACzB,WAAW,SAAS,UAAU;IAC9B,CAAC,EAEkC,KAAK,KAAK;;EAM/C,MAAM,UACL,KACA,SAC0B;GAC1B,MAAM,SAASC,uBAAS,IAAI;GAC5B,MAAM,YAAY,MAAM,OAAO,UAAU,QAAQ;IAChD,MAAM,SAAS,UAAU;IACzB,UAAU,SAAS,UAAU;IAC7B,CAAC;AAEF,cAAW,MAAM,KAAK;GAItB,MAAM,MAAM,MAAM,OAAO,aAAa,OAAO;AAC7C,UAAOD,mCACN;IACC,KAAK,IAAI,IAAI,UAAU;IACvB,MAAM,IAAI,QAAQ;IAClB,WAAW,IAAI;IACf,EACD,IAAI,QAAQ,GACZ;;EAMF,MAAM,QAAQ,OAAkD;AAK/D,UAAO;IACN,QALY,MAAM,OAAO,SAAS,EAClC,OAAO,OAAO,OACd,CAAC,EAGW,IAAIE,iCAAmB;IACnC,iBAAiB;IACjB;;EAMF,MAAM,MAAM,KAA2C;AACtD,SAAM,OAAO,MAAM,IAAI;AACvB,UAAO,EAAE,SAAS,YAAY,OAAO;;EAMtC,MAAM,aACL,KACA,UAC+B;AAC/B,SAAM,OAAO,eAAe,KAAK,SAAS;AAC1C,UAAO,EAAE,SAAS,wBAAwB,OAAO;;EAOlD,MAAM,gBAAgB,SAA4C;AAIjE,UAAO,GADS,QAAQ,iBAAiBC,kCACvB,QAAQ,QAAQ;;EAMnC,MAAM,QAAQ,OAA8C;AAK3D,UAAO,EACN,OALY,MAAM,OAAO,SAAS,EAClC,OAAO,OAAO,OACd,CAAC,EAGU,IAAIC,+BAAiB,EAChC;;EAOF,MAAM,kBACL,OACgC;AAEhC,UAAO,EACN,MAAM,EAAE,EACR;;EAOF,MAAM,sBACL,OACyC;AAEzC,UAAO;IACN,gBAAgB;IAChB,iBAAiB;IACjB,cAAc,EAAE;IAChB;;EAOF,MAAM,QAAQ,SAAmD;AAChE,8BAAa,WAAW;;EAOzB,MAAM,YAAY,SAAyD;AAE1E,UAAO,EAAE;;EAEV"}
@@ -0,0 +1,74 @@
1
+ import { Pinner } from "../../../pinner.cjs";
2
+ import { FileListQuery, FileListResponse, PinJobQuery, PinJobResponse, PinataConfig, SignedUrlOptions, SwapCidOptions, SwapCidResponse, SwapHistoryOptions, TimeIntervalAnalyticsQuery, TimeIntervalAnalyticsResponse, TopAnalyticsQuery, TopAnalyticsResponse, UploadOptions, UploadResponse } from "../shared/types.cjs";
3
+
4
+ //#region src/adapters/pinata/legacy/adapter.d.ts
5
+
6
+ /**
7
+ * Pinata 1.x Legacy Adapter Interface
8
+ * Matches Pinata SDK 1.x API exactly
9
+ */
10
+ interface PinataLegacyAdapter {
11
+ /**
12
+ * Upload a file to IPFS
13
+ */
14
+ pinFileToIPFS(file: File, options?: UploadOptions): Promise<UploadResponse>;
15
+ /**
16
+ * Upload JSON data to IPFS
17
+ */
18
+ pinJSONToIPFS(data: any, options?: UploadOptions): Promise<UploadResponse>;
19
+ /**
20
+ * Pin content by CID
21
+ */
22
+ pinByHash(cid: string, options?: UploadOptions): Promise<UploadResponse>;
23
+ /**
24
+ * List pinned files
25
+ */
26
+ pinList(query?: FileListQuery): Promise<FileListResponse>;
27
+ /**
28
+ * Unpin content by CID
29
+ */
30
+ unpin(cid: string): Promise<{
31
+ message: string;
32
+ }>;
33
+ /**
34
+ * Update pin metadata
35
+ */
36
+ hashMetadata(cid: string, metadata: Record<string, string>): Promise<{
37
+ message: string;
38
+ }>;
39
+ /**
40
+ * Create signed URL for private IPFS files
41
+ */
42
+ createSignedURL(options: SignedUrlOptions): Promise<string>;
43
+ /**
44
+ * Get pin jobs
45
+ */
46
+ pinJobs(query?: PinJobQuery): Promise<PinJobResponse>;
47
+ /**
48
+ * Get top usage analytics
49
+ */
50
+ topUsageAnalytics(query: TopAnalyticsQuery): Promise<TopAnalyticsResponse>;
51
+ /**
52
+ * Get date interval analytics
53
+ */
54
+ dateIntervalAnalytics(query: TimeIntervalAnalyticsQuery): Promise<TimeIntervalAnalyticsResponse>;
55
+ /**
56
+ * Swap CID
57
+ */
58
+ swapCid(options: SwapCidOptions): Promise<SwapCidResponse>;
59
+ /**
60
+ * Get swap history
61
+ */
62
+ swapHistory(options: SwapHistoryOptions): Promise<SwapCidResponse[]>;
63
+ }
64
+ /**
65
+ * Create Pinata 1.x Legacy Adapter
66
+ *
67
+ * @param pinner - Pinner client instance
68
+ * @param config - Pinata configuration
69
+ * @returns PinataLegacyAdapter
70
+ */
71
+ declare function pinataLegacyAdapter(pinner: Pinner, config?: PinataConfig): PinataLegacyAdapter;
72
+ //#endregion
73
+ export { PinataLegacyAdapter, pinataLegacyAdapter };
74
+ //# sourceMappingURL=adapter.d.cts.map
@@ -0,0 +1 @@
1
+ const require_adapter = require('./adapter.cjs');
@@ -0,0 +1 @@
1
+ const require_utils = require('./utils.cjs');
@@ -0,0 +1,218 @@
1
+ //#region src/adapters/pinata/shared/types.d.ts
2
+ /**
3
+ * Pinata SDK 1.x Types
4
+ * Source: https://github.com/PinataCloud/pinata/commit/c141177ff3036e46fa7b95fcc68c159b58817836
5
+ * - src/core/types.ts
6
+ *
7
+ * Copyright © 2024 Pinata Cloud Technologies
8
+ * Type definitions adapted from Pinata SDK for compatibility.
9
+ * Original Pinata SDK: https://github.com/PinataCloud/pinata
10
+ */
11
+ /**
12
+ * Pinata configuration options
13
+ */
14
+ type PinataConfig = {
15
+ pinataJwt?: string;
16
+ pinataGateway?: string;
17
+ pinataGatewayKey?: string;
18
+ customHeaders?: Record<string, string>;
19
+ endpointUrl?: string;
20
+ uploadUrl?: string;
21
+ };
22
+ /**
23
+ * Upload response from Pinata
24
+ */
25
+ type UploadResponse = {
26
+ id: string;
27
+ name: string;
28
+ cid: string;
29
+ size: number;
30
+ created_at: string;
31
+ number_of_files: number;
32
+ mime_type: string;
33
+ user_id: string;
34
+ group_id: string | null;
35
+ is_duplicate: true | null;
36
+ vectorized: true | null;
37
+ };
38
+ /**
39
+ * Pinata metadata options
40
+ */
41
+ type PinataMetadata = {
42
+ name?: string;
43
+ keyvalues?: Record<string, string>;
44
+ };
45
+ /**
46
+ * Upload options
47
+ */
48
+ type UploadOptions = {
49
+ metadata?: PinataMetadata;
50
+ keys?: string;
51
+ groupId?: string;
52
+ vectorize?: boolean;
53
+ url?: string;
54
+ };
55
+ /**
56
+ * File list item
57
+ */
58
+ type FileListItem = {
59
+ id: string;
60
+ name: string | null;
61
+ cid: "pending" | string;
62
+ size: number;
63
+ number_of_files: number;
64
+ mime_type: string;
65
+ keyvalues: Record<string, string>;
66
+ group_id: string | null;
67
+ created_at: string;
68
+ };
69
+ /**
70
+ * File list response
71
+ */
72
+ type FileListResponse = {
73
+ files: FileListItem[];
74
+ next_page_token: string;
75
+ };
76
+ /**
77
+ * File list query options
78
+ */
79
+ type FileListQuery = {
80
+ name?: string;
81
+ group?: string;
82
+ noGroup?: boolean;
83
+ mimeType?: string;
84
+ cid?: string;
85
+ cidPending?: boolean;
86
+ metadata?: Record<string, string>;
87
+ order?: "ASC" | "DESC";
88
+ limit?: number;
89
+ pageToken?: number;
90
+ };
91
+ /**
92
+ * Pin job query options
93
+ */
94
+ type PinJobQuery = {
95
+ sort?: "ASC" | "DSC";
96
+ status?: "prechecking" | "retrieving" | "expired" | "over_free_limit" | "over_max_size" | "invalid_object" | "bad_host_node";
97
+ ipfs_pin_hash?: string;
98
+ limit?: number;
99
+ offset?: number;
100
+ };
101
+ /**
102
+ * Pin job item
103
+ */
104
+ type PinJobItem = {
105
+ id: string;
106
+ ipfs_pin_hash: string;
107
+ date_queued: string;
108
+ name: string;
109
+ status: string;
110
+ keyvalues: any;
111
+ host_nodes: string[];
112
+ pin_policy: {
113
+ regions: {
114
+ id: string;
115
+ desiredReplicationCount: number;
116
+ }[];
117
+ version: number;
118
+ };
119
+ };
120
+ /**
121
+ * Pin job response
122
+ */
123
+ type PinJobResponse = {
124
+ rows: PinJobItem[];
125
+ };
126
+ /**
127
+ * Signed URL options
128
+ */
129
+ type SignedUrlOptions = {
130
+ cid: string;
131
+ date?: number;
132
+ expires: number;
133
+ gateway?: string;
134
+ };
135
+ /**
136
+ * Analytics query options
137
+ */
138
+ type AnalyticsQuery = {
139
+ gateway_domain: string;
140
+ start_date: string;
141
+ end_date: string;
142
+ cid?: string;
143
+ file_name?: string;
144
+ user_agent?: string;
145
+ country?: string;
146
+ region?: string;
147
+ referer?: string;
148
+ limit?: number;
149
+ sort_order?: "asc" | "desc";
150
+ };
151
+ /**
152
+ * Top analytics query options
153
+ */
154
+ type TopAnalyticsQuery = AnalyticsQuery & {
155
+ sort_by: "requests" | "bandwidth";
156
+ attribute: "cid" | "country" | "region" | "user_agent" | "referer" | "file_name";
157
+ };
158
+ /**
159
+ * Top analytics response
160
+ */
161
+ type TopAnalyticsResponse = {
162
+ data: TopAnalyticsItem[];
163
+ };
164
+ /**
165
+ * Top analytics item
166
+ */
167
+ type TopAnalyticsItem = {
168
+ value: string;
169
+ requests: number;
170
+ bandwidth: number;
171
+ };
172
+ /**
173
+ * Time interval analytics query options
174
+ */
175
+ type TimeIntervalAnalyticsQuery = AnalyticsQuery & {
176
+ sort_by?: "requests" | "bandwidth";
177
+ date_interval: "day" | "week";
178
+ };
179
+ /**
180
+ * Time period item
181
+ */
182
+ type TimePeriodItem = {
183
+ period_start_time: string;
184
+ requests: number;
185
+ bandwidth: number;
186
+ };
187
+ /**
188
+ * Time interval analytics response
189
+ */
190
+ type TimeIntervalAnalyticsResponse = {
191
+ total_requests: number;
192
+ total_bandwidth: number;
193
+ time_periods: TimePeriodItem[];
194
+ };
195
+ /**
196
+ * Swap CID options
197
+ */
198
+ type SwapCidOptions = {
199
+ cid: string;
200
+ swapCid: string;
201
+ };
202
+ /**
203
+ * Swap history options
204
+ */
205
+ type SwapHistoryOptions = {
206
+ cid: string;
207
+ domain: string;
208
+ };
209
+ /**
210
+ * Swap CID response
211
+ */
212
+ type SwapCidResponse = {
213
+ mapped_cid: string;
214
+ created_at: string;
215
+ };
216
+ //#endregion
217
+ export { FileListQuery, FileListResponse, PinJobQuery, PinJobResponse, PinataConfig, SignedUrlOptions, SwapCidOptions, SwapCidResponse, SwapHistoryOptions, TimeIntervalAnalyticsQuery, TimeIntervalAnalyticsResponse, TopAnalyticsQuery, TopAnalyticsResponse, UploadOptions, UploadResponse };
218
+ //# sourceMappingURL=types.d.cts.map
@@ -0,0 +1,83 @@
1
+ const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
2
+ let multiformats_cid = require("multiformats/cid");
3
+
4
+ //#region src/adapters/pinata/shared/utils.ts
5
+ /**
6
+ * Shared utilities for Pinata adapters
7
+ */
8
+ /**
9
+ * Parse CID string to CID object
10
+ */
11
+ function parseCID(cidString) {
12
+ try {
13
+ return multiformats_cid.CID.parse(cidString);
14
+ } catch (error) {
15
+ throw new Error(`Invalid CID: ${cidString}`);
16
+ }
17
+ }
18
+ /**
19
+ * Create upload response object
20
+ */
21
+ function createUploadResponse(result, name) {
22
+ return {
23
+ id: result.cid,
24
+ name: name || "",
25
+ cid: result.cid,
26
+ size: result.size,
27
+ created_at: result.createdAt.toISOString(),
28
+ number_of_files: 1,
29
+ mime_type: "application/octet-stream",
30
+ user_id: "",
31
+ group_id: null,
32
+ is_duplicate: null,
33
+ vectorized: null
34
+ };
35
+ }
36
+ /**
37
+ * Create file list item from remote pin
38
+ */
39
+ function createFileListItem(remotePin) {
40
+ return {
41
+ id: remotePin.cid.toString(),
42
+ name: remotePin.name || null,
43
+ cid: remotePin.cid.toString(),
44
+ size: remotePin.size || 0,
45
+ number_of_files: 1,
46
+ mime_type: "application/octet-stream",
47
+ keyvalues: remotePin.metadata || {},
48
+ group_id: null,
49
+ created_at: remotePin.created.toISOString()
50
+ };
51
+ }
52
+ /**
53
+ * Create pin job item from remote pin
54
+ */
55
+ function createPinJobItem(remotePin) {
56
+ return {
57
+ id: remotePin.cid.toString(),
58
+ ipfs_pin_hash: remotePin.cid.toString(),
59
+ date_queued: remotePin.created.toISOString(),
60
+ name: remotePin.name || "",
61
+ status: remotePin.status || "pinned",
62
+ keyvalues: remotePin.metadata || {},
63
+ host_nodes: [],
64
+ pin_policy: {
65
+ regions: [],
66
+ version: 1
67
+ }
68
+ };
69
+ }
70
+ /**
71
+ * Throw error for unsupported features
72
+ */
73
+ function notSupported(feature) {
74
+ throw new Error(`${feature} are not supported by Pinner`);
75
+ }
76
+
77
+ //#endregion
78
+ exports.createFileListItem = createFileListItem;
79
+ exports.createPinJobItem = createPinJobItem;
80
+ exports.createUploadResponse = createUploadResponse;
81
+ exports.notSupported = notSupported;
82
+ exports.parseCID = parseCID;
83
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.cjs","names":["CID"],"sources":["../../../../../src/adapters/pinata/shared/utils.ts"],"sourcesContent":["/**\n * Shared utilities for Pinata adapters\n */\n\nimport { CID } from \"multiformats/cid\";\n\n/**\n * Parse CID string to CID object\n */\nexport function parseCID(cidString: string): CID {\n\ttry {\n\t\treturn CID.parse(cidString);\n\t} catch (error) {\n\t\tthrow new Error(`Invalid CID: ${cidString}`);\n\t}\n}\n\n/**\n * Convert Date to ISO string\n */\nexport function toISOString(date: Date): string {\n\treturn date.toISOString();\n}\n\n/**\n * Create upload response object\n */\nexport function createUploadResponse(\n\tresult: {\n\t\tcid: string;\n\t\tsize: number;\n\t\tcreatedAt: Date;\n\t},\n\tname?: string,\n): any {\n\treturn {\n\t\tid: result.cid,\n\t\tname: name || \"\",\n\t\tcid: result.cid,\n\t\tsize: result.size,\n\t\tcreated_at: result.createdAt.toISOString(),\n\t\tnumber_of_files: 1,\n\t\tmime_type: \"application/octet-stream\",\n\t\tuser_id: \"\",\n\t\tgroup_id: null,\n\t\tis_duplicate: null,\n\t\tvectorized: null,\n\t};\n}\n\n/**\n * Create file list item from remote pin\n */\nexport function createFileListItem(\n\tremotePin: any,\n): any {\n\treturn {\n\t\tid: remotePin.cid.toString(),\n\t\tname: remotePin.name || null,\n\t\tcid: remotePin.cid.toString(),\n\t\tsize: remotePin.size || 0,\n\t\tnumber_of_files: 1,\n\t\tmime_type: \"application/octet-stream\",\n\t\tkeyvalues: remotePin.metadata || {},\n\t\tgroup_id: null,\n\t\tcreated_at: remotePin.created.toISOString(),\n\t};\n}\n\n/**\n * Create pin job item from remote pin\n */\nexport function createPinJobItem(\n\tremotePin: any,\n): any {\n\treturn {\n\t\tid: remotePin.cid.toString(),\n\t\tipfs_pin_hash: remotePin.cid.toString(),\n\t\tdate_queued: remotePin.created.toISOString(),\n\t\tname: remotePin.name || \"\",\n\t\tstatus: remotePin.status || \"pinned\",\n\t\tkeyvalues: remotePin.metadata || {},\n\t\thost_nodes: [],\n\t\tpin_policy: {\n\t\t\tregions: [],\n\t\t\tversion: 1,\n\t\t},\n\t};\n}\n\n/**\n * Throw error for unsupported features\n */\nexport function notSupported(feature: string): never {\n\tthrow new Error(`${feature} are not supported by Pinner`);\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,SAAS,WAAwB;AAChD,KAAI;AACH,SAAOA,qBAAI,MAAM,UAAU;UACnB,OAAO;AACf,QAAM,IAAI,MAAM,gBAAgB,YAAY;;;;;;AAc9C,SAAgB,qBACf,QAKA,MACM;AACN,QAAO;EACN,IAAI,OAAO;EACX,MAAM,QAAQ;EACd,KAAK,OAAO;EACZ,MAAM,OAAO;EACb,YAAY,OAAO,UAAU,aAAa;EAC1C,iBAAiB;EACjB,WAAW;EACX,SAAS;EACT,UAAU;EACV,cAAc;EACd,YAAY;EACZ;;;;;AAMF,SAAgB,mBACf,WACM;AACN,QAAO;EACN,IAAI,UAAU,IAAI,UAAU;EAC5B,MAAM,UAAU,QAAQ;EACxB,KAAK,UAAU,IAAI,UAAU;EAC7B,MAAM,UAAU,QAAQ;EACxB,iBAAiB;EACjB,WAAW;EACX,WAAW,UAAU,YAAY,EAAE;EACnC,UAAU;EACV,YAAY,UAAU,QAAQ,aAAa;EAC3C;;;;;AAMF,SAAgB,iBACf,WACM;AACN,QAAO;EACN,IAAI,UAAU,IAAI,UAAU;EAC5B,eAAe,UAAU,IAAI,UAAU;EACvC,aAAa,UAAU,QAAQ,aAAa;EAC5C,MAAM,UAAU,QAAQ;EACxB,QAAQ,UAAU,UAAU;EAC5B,WAAW,UAAU,YAAY,EAAE;EACnC,YAAY,EAAE;EACd,YAAY;GACX,SAAS,EAAE;GACX,SAAS;GACT;EACD;;;;;AAMF,SAAgB,aAAa,SAAwB;AACpD,OAAM,IAAI,MAAM,GAAG,QAAQ,8BAA8B"}