@lumeweb/pinner 0.1.0 → 0.1.3

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 (180) hide show
  1. package/README.md +197 -18
  2. package/dist/esm/_virtual/{rolldown_runtime.js → _rolldown/runtime.js} +2 -2
  3. package/dist/esm/adapters/pinata/index.d.ts +4 -4
  4. package/dist/esm/adapters/pinata/index.js +6 -3
  5. package/dist/esm/adapters/pinata/legacy/adapter.d.ts +73 -0
  6. package/dist/esm/adapters/pinata/legacy/adapter.js +124 -0
  7. package/dist/esm/adapters/pinata/legacy/adapter.js.map +1 -0
  8. package/dist/esm/adapters/pinata/legacy/index.d.ts +1 -0
  9. package/dist/esm/adapters/pinata/legacy/index.js +1 -0
  10. package/dist/esm/adapters/pinata/shared/index.d.ts +1 -0
  11. package/dist/esm/adapters/pinata/shared/index.js +1 -0
  12. package/dist/esm/adapters/pinata/shared/types.d.ts +218 -0
  13. package/dist/esm/adapters/pinata/shared/utils.d.ts +1 -0
  14. package/dist/esm/adapters/pinata/shared/utils.js +78 -0
  15. package/dist/esm/adapters/pinata/shared/utils.js.map +1 -0
  16. package/dist/esm/adapters/pinata/v2/adapter-interface.d.ts +197 -0
  17. package/dist/esm/adapters/pinata/v2/adapter.d.ts +16 -0
  18. package/dist/esm/adapters/pinata/v2/adapter.js +636 -0
  19. package/dist/esm/adapters/pinata/v2/adapter.js.map +1 -0
  20. package/dist/esm/adapters/pinata/v2/index.d.ts +3 -0
  21. package/dist/esm/adapters/pinata/v2/index.js +1 -0
  22. package/dist/esm/adapters/pinata/v2/types.d.ts +308 -0
  23. package/dist/esm/api/generated/schemas/iPNSKeyListResponse.d.ts +46 -0
  24. package/dist/esm/api/generated/schemas/iPNSKeyListResponseResponse.d.ts +10 -0
  25. package/dist/esm/api/generated/schemas/iPNSKeyRequest.d.ts +43 -0
  26. package/dist/esm/api/generated/schemas/iPNSKeyResponse.d.ts +46 -0
  27. package/dist/esm/api/generated/schemas/iPNSPublishRequest.d.ts +44 -0
  28. package/dist/esm/api/generated/schemas/iPNSPublishResponse.d.ts +46 -0
  29. package/dist/esm/api/generated/schemas/iPNSResolveResponse.d.ts +47 -0
  30. package/dist/esm/api/generated/schemas/sSLStatusInfo.d.ts +45 -0
  31. package/dist/esm/api/generated/schemas/websiteConfigResponse.d.ts +43 -0
  32. package/dist/esm/api/generated/schemas/websiteItem.d.ts +23 -0
  33. package/dist/esm/api/generated/schemas/websiteItemResponse.d.ts +10 -0
  34. package/dist/esm/api/generated/schemas/websiteRequest.d.ts +45 -0
  35. package/dist/esm/api/generated/schemas/websiteResponse.d.ts +23 -0
  36. package/dist/esm/api/generated/schemas/websiteUpdateRequest.d.ts +45 -0
  37. package/dist/esm/api/generated/schemas/websiteValidateResponse.d.ts +45 -0
  38. package/dist/esm/api/ipns.d.ts +28 -0
  39. package/dist/esm/api/ipns.js +83 -0
  40. package/dist/esm/api/ipns.js.map +1 -0
  41. package/dist/esm/api/websites.d.ts +48 -0
  42. package/dist/esm/api/websites.js +168 -0
  43. package/dist/esm/api/websites.js.map +1 -0
  44. package/dist/esm/blockstore/unstorage-base.d.ts +4 -1
  45. package/dist/esm/blockstore/unstorage-base.js +3 -3
  46. package/dist/esm/blockstore/unstorage-base.js.map +1 -1
  47. package/dist/esm/blockstore/unstorage.d.ts +3 -31
  48. package/dist/esm/blockstore/unstorage.js +2 -2
  49. package/dist/esm/blockstore/unstorage.js.map +1 -1
  50. package/dist/esm/encoder/base64.js.map +1 -1
  51. package/dist/esm/encoder/csv/row-formatter.js.map +1 -1
  52. package/dist/esm/encoder/csv.js.map +1 -1
  53. package/dist/esm/encoder/json.js.map +1 -1
  54. package/dist/esm/encoder/text.js.map +1 -1
  55. package/dist/esm/encoder/url.js.map +1 -1
  56. package/dist/esm/index.d.ts +7 -5
  57. package/dist/esm/index.js +5 -2
  58. package/dist/esm/pin/client.js +8 -5
  59. package/dist/esm/pin/client.js.map +1 -1
  60. package/dist/esm/pinner.d.ts +16 -0
  61. package/dist/esm/pinner.js +24 -0
  62. package/dist/esm/pinner.js.map +1 -1
  63. package/dist/esm/types/constants.js +6 -2
  64. package/dist/esm/types/constants.js.map +1 -1
  65. package/dist/esm/types/pin.d.ts +4 -1
  66. package/dist/esm/types/type-guards.d.ts +0 -1
  67. package/dist/esm/types/upload.d.ts +0 -1
  68. package/dist/esm/upload/base-upload.js +3 -3
  69. package/dist/esm/upload/base-upload.js.map +1 -1
  70. package/dist/esm/upload/builder.d.ts +0 -1
  71. package/dist/esm/upload/car.js +3 -3
  72. package/dist/esm/upload/car.js.map +1 -1
  73. package/dist/esm/upload/manager.js +5 -5
  74. package/dist/esm/upload/manager.js.map +1 -1
  75. package/dist/esm/upload/normalize.js +1 -1
  76. package/dist/esm/upload/normalize.js.map +1 -1
  77. package/dist/esm/utils/stream.d.ts +0 -3
  78. package/dist/esm/utils/tus-patch.js +2 -2
  79. package/dist/esm/utils/tus-patch.js.map +1 -1
  80. package/dist/esm/utils/validation.js.map +1 -1
  81. package/package.json +33 -32
  82. package/dist/cjs/_virtual/rolldown_runtime.cjs +0 -29
  83. package/dist/cjs/adapters/pinata/adapter.cjs +0 -88
  84. package/dist/cjs/adapters/pinata/adapter.cjs.map +0 -1
  85. package/dist/cjs/adapters/pinata/adapter.d.cts +0 -35
  86. package/dist/cjs/adapters/pinata/builder.cjs +0 -194
  87. package/dist/cjs/adapters/pinata/builder.cjs.map +0 -1
  88. package/dist/cjs/adapters/pinata/index.cjs +0 -3
  89. package/dist/cjs/adapters/pinata/list-builder.cjs +0 -52
  90. package/dist/cjs/adapters/pinata/list-builder.cjs.map +0 -1
  91. package/dist/cjs/blockstore/index.cjs +0 -2
  92. package/dist/cjs/blockstore/unstorage-base.cjs +0 -240
  93. package/dist/cjs/blockstore/unstorage-base.cjs.map +0 -1
  94. package/dist/cjs/blockstore/unstorage-base.d.cts +0 -23
  95. package/dist/cjs/blockstore/unstorage.cjs +0 -39
  96. package/dist/cjs/blockstore/unstorage.cjs.map +0 -1
  97. package/dist/cjs/blockstore/unstorage.d.cts +0 -36
  98. package/dist/cjs/config.d.cts +0 -51
  99. package/dist/cjs/encoder/base64.cjs +0 -38
  100. package/dist/cjs/encoder/base64.cjs.map +0 -1
  101. package/dist/cjs/encoder/csv/csv-formatter.cjs +0 -81
  102. package/dist/cjs/encoder/csv/csv-formatter.cjs.map +0 -1
  103. package/dist/cjs/encoder/csv/field-formatter.cjs +0 -76
  104. package/dist/cjs/encoder/csv/field-formatter.cjs.map +0 -1
  105. package/dist/cjs/encoder/csv/row-formatter.cjs +0 -159
  106. package/dist/cjs/encoder/csv/row-formatter.cjs.map +0 -1
  107. package/dist/cjs/encoder/csv.cjs +0 -44
  108. package/dist/cjs/encoder/csv.cjs.map +0 -1
  109. package/dist/cjs/encoder/error.cjs +0 -19
  110. package/dist/cjs/encoder/error.cjs.map +0 -1
  111. package/dist/cjs/encoder/index.cjs +0 -6
  112. package/dist/cjs/encoder/json.cjs +0 -36
  113. package/dist/cjs/encoder/json.cjs.map +0 -1
  114. package/dist/cjs/encoder/text.cjs +0 -35
  115. package/dist/cjs/encoder/text.cjs.map +0 -1
  116. package/dist/cjs/encoder/url.cjs +0 -39
  117. package/dist/cjs/encoder/url.cjs.map +0 -1
  118. package/dist/cjs/errors/index.cjs +0 -104
  119. package/dist/cjs/errors/index.cjs.map +0 -1
  120. package/dist/cjs/errors/index.d.cts +0 -47
  121. package/dist/cjs/index.cjs +0 -42
  122. package/dist/cjs/index.d.cts +0 -14
  123. package/dist/cjs/pin/client.cjs +0 -96
  124. package/dist/cjs/pin/client.cjs.map +0 -1
  125. package/dist/cjs/pin/index.cjs +0 -1
  126. package/dist/cjs/pinner.cjs +0 -126
  127. package/dist/cjs/pinner.cjs.map +0 -1
  128. package/dist/cjs/pinner.d.cts +0 -77
  129. package/dist/cjs/types/constants.cjs +0 -34
  130. package/dist/cjs/types/constants.cjs.map +0 -1
  131. package/dist/cjs/types/mime-types.cjs +0 -11
  132. package/dist/cjs/types/mime-types.cjs.map +0 -1
  133. package/dist/cjs/types/mime-types.d.cts +0 -7
  134. package/dist/cjs/types/pin.d.cts +0 -74
  135. package/dist/cjs/types/pinata.d.cts +0 -99
  136. package/dist/cjs/types/type-guards.cjs +0 -20
  137. package/dist/cjs/types/type-guards.cjs.map +0 -1
  138. package/dist/cjs/types/type-guards.d.cts +0 -15
  139. package/dist/cjs/types/upload.cjs +0 -18
  140. package/dist/cjs/types/upload.cjs.map +0 -1
  141. package/dist/cjs/types/upload.d.cts +0 -189
  142. package/dist/cjs/upload/base-upload.cjs +0 -135
  143. package/dist/cjs/upload/base-upload.cjs.map +0 -1
  144. package/dist/cjs/upload/builder.cjs +0 -174
  145. package/dist/cjs/upload/builder.cjs.map +0 -1
  146. package/dist/cjs/upload/builder.d.cts +0 -60
  147. package/dist/cjs/upload/car.cjs +0 -129
  148. package/dist/cjs/upload/car.cjs.map +0 -1
  149. package/dist/cjs/upload/car.d.cts +0 -19
  150. package/dist/cjs/upload/constants.cjs +0 -9
  151. package/dist/cjs/upload/constants.cjs.map +0 -1
  152. package/dist/cjs/upload/index.cjs +0 -8
  153. package/dist/cjs/upload/manager.cjs +0 -249
  154. package/dist/cjs/upload/manager.cjs.map +0 -1
  155. package/dist/cjs/upload/manager.d.cts +0 -35
  156. package/dist/cjs/upload/normalize.cjs +0 -28
  157. package/dist/cjs/upload/normalize.cjs.map +0 -1
  158. package/dist/cjs/upload/tus-upload.cjs +0 -74
  159. package/dist/cjs/upload/tus-upload.cjs.map +0 -1
  160. package/dist/cjs/upload/xhr-upload.cjs +0 -41
  161. package/dist/cjs/upload/xhr-upload.cjs.map +0 -1
  162. package/dist/cjs/utils/env.cjs +0 -12
  163. package/dist/cjs/utils/env.cjs.map +0 -1
  164. package/dist/cjs/utils/stream.cjs +0 -141
  165. package/dist/cjs/utils/stream.cjs.map +0 -1
  166. package/dist/cjs/utils/stream.d.cts +0 -23
  167. package/dist/cjs/utils/tus-patch.cjs +0 -50
  168. package/dist/cjs/utils/tus-patch.cjs.map +0 -1
  169. package/dist/cjs/utils/validation.cjs +0 -62
  170. package/dist/cjs/utils/validation.cjs.map +0 -1
  171. package/dist/esm/adapters/pinata/adapter.d.ts +0 -35
  172. package/dist/esm/adapters/pinata/adapter.js +0 -87
  173. package/dist/esm/adapters/pinata/adapter.js.map +0 -1
  174. package/dist/esm/adapters/pinata/builder.d.ts +0 -1
  175. package/dist/esm/adapters/pinata/builder.js +0 -187
  176. package/dist/esm/adapters/pinata/builder.js.map +0 -1
  177. package/dist/esm/adapters/pinata/list-builder.d.ts +0 -1
  178. package/dist/esm/adapters/pinata/list-builder.js +0 -51
  179. package/dist/esm/adapters/pinata/list-builder.js.map +0 -1
  180. package/dist/esm/types/pinata.d.ts +0 -99
@@ -1 +1 @@
1
- {"version":3,"file":"unstorage-base.js","names":[],"sources":["../../../src/blockstore/unstorage-base.ts"],"sourcesContent":["import { BaseBlockstore } from \"blockstore-core\";\nimport type { InputPair, Pair as BlockstorePair } from \"interface-blockstore\";\nimport type {\n AbortOptions,\n Await,\n AwaitGenerator,\n AwaitIterable,\n} from \"interface-store\";\nimport { CID } from \"multiformats/cid\";\nimport { createStorage, type Driver, type Storage } from \"unstorage\";\nimport { DEFAULT_BLOCKSTORE_PREFIX } from \"@/types/constants\";\nimport type { Batch, Datastore, KeyQuery, Query } from \"interface-datastore\";\nimport { Key, Pair } from \"interface-datastore\";\nimport { collectAsyncIterable } from \"@/utils/stream\";\n\n\n\nexport interface UnstorageBlockstoreOptions {\n storage?: Storage;\n prefix?: string;\n driver?: Driver;\n base?: string;\n datastorePrefix?: string;\n}\n\n/**\n * prefix: Key prefix for blockstore keys (e.g., \"blockstore\" or \"pinner-helia-blocks\").\n * This is prepended to CID strings in storage keys.\n *\n * base: Base path for the storage driver (e.g., \"pinner:\" for IndexedDB, \"./.pinner-blocks\" for filesystem).\n * This determines where the storage driver stores data.\n */\n\ntype DriverFactory = () => Driver | Promise<Driver>;\n\nexport let driverFactory: DriverFactory | null = null;\n\nexport function setDriverFactory(factory: DriverFactory | null): void {\n driverFactory = factory;\n}\n\nfunction createStorageWithOptions(\n options: UnstorageBlockstoreOptions,\n): Storage {\n return options.storage\n ? options.storage\n : createStorage({ driver: options.driver });\n}\n\nasync function initializeStorage(\n storage: Storage,\n options: UnstorageBlockstoreOptions,\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n): Promise<void> {\n if (options.storage || options.driver) {\n return;\n }\n\n const driver = await getDefaultDriver(options.base);\n Object.assign(storage, createStorage({ driver }));\n}\n\nfunction createUnstorageBase(\n options: UnstorageBlockstoreOptions,\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n) {\n const storage = createStorageWithOptions(options);\n const initialized = initializeStorage(storage, options, getDefaultDriver);\n\n async function ensureInitialized(): Promise<void> {\n await initialized;\n }\n\n async function hasItem(key: string): Promise<boolean> {\n await ensureInitialized();\n return await storage.hasItem(key);\n }\n\n async function getItem(key: string): Promise<Uint8Array> {\n await ensureInitialized();\n const value = await storage.getItemRaw<Uint8Array>(key);\n\n if (value === null) {\n throw new Error(`Item not found: ${key}`);\n }\n\n return value;\n }\n\n async function putItem(key: string, value: Uint8Array): Promise<void> {\n await ensureInitialized();\n await storage.setItemRaw(key, value);\n }\n\n async function deleteItem(key: string): Promise<void> {\n await ensureInitialized();\n await storage.removeItem(key);\n }\n\n async function getAllKeys(): Promise<string[]> {\n await ensureInitialized();\n return await storage.getKeys();\n }\n\n return {\n storage,\n hasItem,\n getItem,\n putItem,\n deleteItem,\n getAllKeys,\n };\n}\n\nexport function createUnstorageBlockstore(\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n): new (\n options?: UnstorageBlockstoreOptions,\n) => InstanceType<typeof BaseBlockstore> {\n return class UnstorageBlockstore extends BaseBlockstore {\n private prefix: string;\n private base: ReturnType<typeof createUnstorageBase>;\n\n constructor(options: UnstorageBlockstoreOptions = {}) {\n super();\n this.prefix = options.prefix ?? DEFAULT_BLOCKSTORE_PREFIX;\n this.base = createUnstorageBase(options, getDefaultDriver);\n }\n\n private keyToStorageKey(key: CID): string {\n return `${this.prefix}:${key.toString()}`;\n }\n\n async has(key: CID, _?: AbortOptions): Promise<boolean> {\n return await this.base.hasItem(this.keyToStorageKey(key));\n }\n\n async put(\n key: CID,\n val: Uint8Array | AwaitIterable<Uint8Array>,\n _?: AbortOptions,\n ): Promise<CID> {\n const storageKey = this.keyToStorageKey(key);\n const bytes =\n val instanceof Uint8Array ? val : await collectAsyncIterable(val);\n await this.base.putItem(storageKey, bytes);\n return key;\n }\n\n async *putMany(\n source: AwaitIterable<InputPair>,\n options?: AbortOptions,\n ): AwaitGenerator<CID> {\n for await (const { cid, bytes } of source) {\n yield await this.put(cid, bytes, options);\n }\n }\n\n async *get(key: CID, _?: AbortOptions): AsyncGenerator<Uint8Array> {\n const storageKey = this.keyToStorageKey(key);\n const value = await this.base.getItem(storageKey);\n yield value;\n }\n\n async *getMany(\n source: AwaitIterable<CID>,\n options?: AbortOptions,\n ): AwaitGenerator<BlockstorePair> {\n for await (const cid of source) {\n yield {\n cid,\n bytes: (async function* () {\n yield* await this.get(cid, options);\n }.call(this)),\n };\n }\n }\n\n async delete(key: CID, _?: AbortOptions): Promise<void> {\n await this.base.deleteItem(this.keyToStorageKey(key));\n }\n\n async *deleteMany(\n source: AwaitIterable<CID>,\n options?: AbortOptions,\n ): AwaitGenerator<CID> {\n for await (const cid of source) {\n await this.delete(cid, options);\n yield cid;\n }\n }\n\n async *getAll(_?: AbortOptions): AwaitGenerator<BlockstorePair> {\n const keys = await this.base.getAllKeys();\n\n for (const key of keys) {\n if (key.startsWith(this.prefix + \":\")) {\n const cidString = key.slice(this.prefix.length + 1);\n try {\n const cid = CID.parse(cidString);\n const value = await this.base.getItem(key);\n\n yield {\n cid,\n bytes: (async function* () {\n yield value;\n })(),\n };\n } catch {\n // Skip invalid keys\n }\n }\n }\n }\n };\n}\n\nexport function createUnstorageDatastore(\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n): new (options?: UnstorageBlockstoreOptions) => Datastore {\n return class UnstorageDatastore implements Datastore {\n private prefix: string;\n private base: ReturnType<typeof createUnstorageBase>;\n\n constructor(options: UnstorageBlockstoreOptions = {}) {\n this.prefix =\n options.datastorePrefix ?? options.prefix ?? DEFAULT_BLOCKSTORE_PREFIX;\n this.base = createUnstorageBase(options, getDefaultDriver);\n }\n\n private keyToStorageKey(key: Key): string {\n return `${this.prefix}:${key.toString()}`;\n }\n\n private storageKeyToKey(storageKey: string): Key {\n return new Key(storageKey.slice(this.prefix.length + 1));\n }\n\n async has(key: Key, _?: AbortOptions): Promise<boolean> {\n return await this.base.hasItem(this.keyToStorageKey(key));\n }\n\n async put(key: Key, val: Uint8Array, _?: AbortOptions): Promise<Key> {\n await this.base.putItem(this.keyToStorageKey(key), val);\n return key;\n }\n\n async *putMany(\n source: AwaitIterable<Pair>,\n options?: AbortOptions,\n ): AsyncGenerator<Key> {\n for await (const { key, value } of source) {\n yield await this.put(key, value, options);\n }\n }\n\n async get(key: Key, _?: AbortOptions): Promise<Uint8Array> {\n const storageKey = this.keyToStorageKey(key);\n try {\n return await this.base.getItem(storageKey);\n } catch (error) {\n throw new Error(`Datastore item not found: ${key.toString()}`);\n }\n }\n\n async *getMany(\n source: AwaitIterable<Key>,\n options?: AbortOptions,\n ): AsyncGenerator<Pair> {\n for await (const key of source) {\n yield {\n key,\n value: await this.get(key, options),\n };\n }\n }\n\n async delete(key: Key, _?: AbortOptions): Promise<void> {\n await this.base.deleteItem(this.keyToStorageKey(key));\n }\n\n async *deleteMany(\n source: AwaitIterable<Key>,\n options?: AbortOptions,\n ): AsyncGenerator<Key> {\n for await (const key of source) {\n await this.delete(key, options);\n yield key;\n }\n }\n\n batch(): Batch {\n const operations: Array<{\n type: \"put\" | \"delete\";\n key: Key;\n value?: Uint8Array;\n }> = [];\n const base = this.base;\n const keyToStorageKey = this.keyToStorageKey.bind(this);\n\n return {\n put(key: Key, value: Uint8Array): void {\n operations.push({ type: \"put\", key, value });\n },\n delete(key: Key): void {\n operations.push({ type: \"delete\", key });\n },\n async commit(): Promise<void> {\n for (const op of operations) {\n if (op.type === \"put\" && op.value !== undefined) {\n await base.putItem(keyToStorageKey(op.key), op.value);\n } else if (op.type === \"delete\") {\n await base.deleteItem(keyToStorageKey(op.key));\n }\n }\n operations.length = 0;\n },\n };\n }\n\n async *query(query: Query, _?: AbortOptions): AsyncGenerator<Pair> {\n const keys = await this.base.getAllKeys();\n\n for (const key of keys) {\n if (!key.startsWith(this.prefix + \":\")) {\n continue;\n }\n\n const datastoreKey = this.storageKeyToKey(key);\n\n if (\n query.prefix &&\n !datastoreKey.toString().startsWith(query.prefix.toString())\n ) {\n continue;\n }\n\n const value = await this.base.getItem(key);\n\n if (query.filters) {\n let match = true;\n for (const filter of query.filters) {\n if (!filter({ key: datastoreKey, value })) {\n match = false;\n break;\n }\n }\n if (!match) continue;\n }\n\n yield {\n key: datastoreKey,\n value,\n };\n }\n }\n\n async *queryKeys(query: KeyQuery, _?: AbortOptions): AsyncGenerator<Key> {\n const keys = await this.base.getAllKeys();\n\n for (const key of keys) {\n if (!key.startsWith(this.prefix + \":\")) {\n continue;\n }\n\n const datastoreKey = this.storageKeyToKey(key);\n\n if (\n query.prefix &&\n !datastoreKey.toString().startsWith(query.prefix.toString())\n ) {\n continue;\n }\n\n yield datastoreKey;\n }\n }\n };\n}\n"],"mappings":";;;;;;;;AAmCA,IAAW,gBAAsC;AAEjD,SAAgB,iBAAiB,SAAqC;AACpE,iBAAgB;;AAGlB,SAAS,yBACP,SACS;AACT,QAAO,QAAQ,UACX,QAAQ,UACR,cAAc,EAAE,QAAQ,QAAQ,QAAQ,CAAC;;AAG/C,eAAe,kBACb,SACA,SACA,kBACe;AACf,KAAI,QAAQ,WAAW,QAAQ,OAC7B;CAGF,MAAM,SAAS,MAAM,iBAAiB,QAAQ,KAAK;AACnD,QAAO,OAAO,SAAS,cAAc,EAAE,QAAQ,CAAC,CAAC;;AAGnD,SAAS,oBACP,SACA,kBACA;CACA,MAAM,UAAU,yBAAyB,QAAQ;CACjD,MAAM,cAAc,kBAAkB,SAAS,SAAS,iBAAiB;CAEzE,eAAe,oBAAmC;AAChD,QAAM;;CAGR,eAAe,QAAQ,KAA+B;AACpD,QAAM,mBAAmB;AACzB,SAAO,MAAM,QAAQ,QAAQ,IAAI;;CAGnC,eAAe,QAAQ,KAAkC;AACvD,QAAM,mBAAmB;EACzB,MAAM,QAAQ,MAAM,QAAQ,WAAuB,IAAI;AAEvD,MAAI,UAAU,KACZ,OAAM,IAAI,MAAM,mBAAmB,MAAM;AAG3C,SAAO;;CAGT,eAAe,QAAQ,KAAa,OAAkC;AACpE,QAAM,mBAAmB;AACzB,QAAM,QAAQ,WAAW,KAAK,MAAM;;CAGtC,eAAe,WAAW,KAA4B;AACpD,QAAM,mBAAmB;AACzB,QAAM,QAAQ,WAAW,IAAI;;CAG/B,eAAe,aAAgC;AAC7C,QAAM,mBAAmB;AACzB,SAAO,MAAM,QAAQ,SAAS;;AAGhC,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAgB,0BACd,kBAGuC;AACvC,QAAO,MAAM,4BAA4B,eAAe;EACtD,AAAQ;EACR,AAAQ;EAER,YAAY,UAAsC,EAAE,EAAE;AACpD,UAAO;AACP,QAAK,SAAS,QAAQ,UAAU;AAChC,QAAK,OAAO,oBAAoB,SAAS,iBAAiB;;EAG5D,AAAQ,gBAAgB,KAAkB;AACxC,UAAO,GAAG,KAAK,OAAO,GAAG,IAAI,UAAU;;EAGzC,MAAM,IAAI,KAAU,GAAoC;AACtD,UAAO,MAAM,KAAK,KAAK,QAAQ,KAAK,gBAAgB,IAAI,CAAC;;EAG3D,MAAM,IACJ,KACA,KACA,GACc;GACd,MAAM,aAAa,KAAK,gBAAgB,IAAI;GAC5C,MAAM,QACJ,eAAe,aAAa,MAAM,MAAM,qBAAqB,IAAI;AACnE,SAAM,KAAK,KAAK,QAAQ,YAAY,MAAM;AAC1C,UAAO;;EAGT,OAAO,QACL,QACA,SACqB;AACrB,cAAW,MAAM,EAAE,KAAK,WAAW,OACjC,OAAM,MAAM,KAAK,IAAI,KAAK,OAAO,QAAQ;;EAI7C,OAAO,IAAI,KAAU,GAA8C;GACjE,MAAM,aAAa,KAAK,gBAAgB,IAAI;AAE5C,SADc,MAAM,KAAK,KAAK,QAAQ,WAAW;;EAInD,OAAO,QACL,QACA,SACgC;AAChC,cAAW,MAAM,OAAO,OACtB,OAAM;IACJ;IACA,OAAQ,mBAAmB;AACzB,YAAO,MAAM,KAAK,IAAI,KAAK,QAAQ;MACnC,KAAK,KAAK;IACb;;EAIL,MAAM,OAAO,KAAU,GAAiC;AACtD,SAAM,KAAK,KAAK,WAAW,KAAK,gBAAgB,IAAI,CAAC;;EAGvD,OAAO,WACL,QACA,SACqB;AACrB,cAAW,MAAM,OAAO,QAAQ;AAC9B,UAAM,KAAK,OAAO,KAAK,QAAQ;AAC/B,UAAM;;;EAIV,OAAO,OAAO,GAAkD;GAC9D,MAAM,OAAO,MAAM,KAAK,KAAK,YAAY;AAEzC,QAAK,MAAM,OAAO,KAChB,KAAI,IAAI,WAAW,KAAK,SAAS,IAAI,EAAE;IACrC,MAAM,YAAY,IAAI,MAAM,KAAK,OAAO,SAAS,EAAE;AACnD,QAAI;KACF,MAAM,MAAM,IAAI,MAAM,UAAU;KAChC,MAAM,QAAQ,MAAM,KAAK,KAAK,QAAQ,IAAI;AAE1C,WAAM;MACJ;MACA,QAAQ,mBAAmB;AACzB,aAAM;UACJ;MACL;YACK;;;;;AASlB,SAAgB,yBACd,kBACyD;AACzD,QAAO,MAAM,mBAAwC;EACnD,AAAQ;EACR,AAAQ;EAER,YAAY,UAAsC,EAAE,EAAE;AACpD,QAAK,SACH,QAAQ,mBAAmB,QAAQ,UAAU;AAC/C,QAAK,OAAO,oBAAoB,SAAS,iBAAiB;;EAG5D,AAAQ,gBAAgB,KAAkB;AACxC,UAAO,GAAG,KAAK,OAAO,GAAG,IAAI,UAAU;;EAGzC,AAAQ,gBAAgB,YAAyB;AAC/C,UAAO,IAAI,IAAI,WAAW,MAAM,KAAK,OAAO,SAAS,EAAE,CAAC;;EAG1D,MAAM,IAAI,KAAU,GAAoC;AACtD,UAAO,MAAM,KAAK,KAAK,QAAQ,KAAK,gBAAgB,IAAI,CAAC;;EAG3D,MAAM,IAAI,KAAU,KAAiB,GAAgC;AACnE,SAAM,KAAK,KAAK,QAAQ,KAAK,gBAAgB,IAAI,EAAE,IAAI;AACvD,UAAO;;EAGT,OAAO,QACL,QACA,SACqB;AACrB,cAAW,MAAM,EAAE,KAAK,WAAW,OACjC,OAAM,MAAM,KAAK,IAAI,KAAK,OAAO,QAAQ;;EAI7C,MAAM,IAAI,KAAU,GAAuC;GACzD,MAAM,aAAa,KAAK,gBAAgB,IAAI;AAC5C,OAAI;AACF,WAAO,MAAM,KAAK,KAAK,QAAQ,WAAW;YACnC,OAAO;AACd,UAAM,IAAI,MAAM,6BAA6B,IAAI,UAAU,GAAG;;;EAIlE,OAAO,QACL,QACA,SACsB;AACtB,cAAW,MAAM,OAAO,OACtB,OAAM;IACJ;IACA,OAAO,MAAM,KAAK,IAAI,KAAK,QAAQ;IACpC;;EAIL,MAAM,OAAO,KAAU,GAAiC;AACtD,SAAM,KAAK,KAAK,WAAW,KAAK,gBAAgB,IAAI,CAAC;;EAGvD,OAAO,WACL,QACA,SACqB;AACrB,cAAW,MAAM,OAAO,QAAQ;AAC9B,UAAM,KAAK,OAAO,KAAK,QAAQ;AAC/B,UAAM;;;EAIV,QAAe;GACb,MAAM,aAID,EAAE;GACP,MAAM,OAAO,KAAK;GAClB,MAAM,kBAAkB,KAAK,gBAAgB,KAAK,KAAK;AAEvD,UAAO;IACL,IAAI,KAAU,OAAyB;AACrC,gBAAW,KAAK;MAAE,MAAM;MAAO;MAAK;MAAO,CAAC;;IAE9C,OAAO,KAAgB;AACrB,gBAAW,KAAK;MAAE,MAAM;MAAU;MAAK,CAAC;;IAE1C,MAAM,SAAwB;AAC5B,UAAK,MAAM,MAAM,WACf,KAAI,GAAG,SAAS,SAAS,GAAG,UAAU,OACpC,OAAM,KAAK,QAAQ,gBAAgB,GAAG,IAAI,EAAE,GAAG,MAAM;cAC5C,GAAG,SAAS,SACrB,OAAM,KAAK,WAAW,gBAAgB,GAAG,IAAI,CAAC;AAGlD,gBAAW,SAAS;;IAEvB;;EAGH,OAAO,MAAM,OAAc,GAAwC;GACjE,MAAM,OAAO,MAAM,KAAK,KAAK,YAAY;AAEzC,QAAK,MAAM,OAAO,MAAM;AACtB,QAAI,CAAC,IAAI,WAAW,KAAK,SAAS,IAAI,CACpC;IAGF,MAAM,eAAe,KAAK,gBAAgB,IAAI;AAE9C,QACE,MAAM,UACN,CAAC,aAAa,UAAU,CAAC,WAAW,MAAM,OAAO,UAAU,CAAC,CAE5D;IAGF,MAAM,QAAQ,MAAM,KAAK,KAAK,QAAQ,IAAI;AAE1C,QAAI,MAAM,SAAS;KACjB,IAAI,QAAQ;AACZ,UAAK,MAAM,UAAU,MAAM,QACzB,KAAI,CAAC,OAAO;MAAE,KAAK;MAAc;MAAO,CAAC,EAAE;AACzC,cAAQ;AACR;;AAGJ,SAAI,CAAC,MAAO;;AAGd,UAAM;KACJ,KAAK;KACL;KACD;;;EAIL,OAAO,UAAU,OAAiB,GAAuC;GACvE,MAAM,OAAO,MAAM,KAAK,KAAK,YAAY;AAEzC,QAAK,MAAM,OAAO,MAAM;AACtB,QAAI,CAAC,IAAI,WAAW,KAAK,SAAS,IAAI,CACpC;IAGF,MAAM,eAAe,KAAK,gBAAgB,IAAI;AAE9C,QACE,MAAM,UACN,CAAC,aAAa,UAAU,CAAC,WAAW,MAAM,OAAO,UAAU,CAAC,CAE5D;AAGF,UAAM"}
1
+ {"version":3,"file":"unstorage-base.js","names":[],"sources":["../../../src/blockstore/unstorage-base.ts"],"sourcesContent":["import { BaseBlockstore } from \"blockstore-core\";\nimport type { InputPair, Pair as BlockstorePair } from \"interface-blockstore\";\nimport type {\n AbortOptions,\n Await,\n AwaitGenerator,\n AwaitIterable,\n} from \"interface-store\";\nimport { CID } from \"multiformats/cid\";\nimport { createStorage, type Driver, type Storage } from \"unstorage\";\nimport { DEFAULT_BLOCKSTORE_PREFIX } from \"@/types/constants\";\nimport type { Batch, Datastore, KeyQuery, Query } from \"interface-datastore\";\nimport { Key, Pair } from \"interface-datastore\";\nimport { collectAsyncIterable } from \"@/utils/stream\";\n\n\n\nexport interface UnstorageBlockstoreOptions {\n storage?: Storage;\n prefix?: string;\n driver?: Driver;\n base?: string;\n datastorePrefix?: string;\n}\n\n/**\n * prefix: Key prefix for blockstore keys (e.g., \"blockstore\" or \"pinner-helia-blocks\").\n * This is prepended to CID strings in storage keys.\n *\n * base: Base path for the storage driver (e.g., \"pinner:\" for IndexedDB, \"./.pinner-blocks\" for filesystem).\n * This determines where the storage driver stores data.\n */\n\ntype DriverFactory = () => Driver | Promise<Driver>;\n\nexport let driverFactory: DriverFactory | null = null;\n\nexport function setDriverFactory(factory: DriverFactory | null): void {\n driverFactory = factory;\n}\n\nfunction createStorageWithOptions(\n options: UnstorageBlockstoreOptions,\n): Storage {\n return options.storage\n ? options.storage\n : createStorage({ driver: options.driver });\n}\n\nasync function initializeStorage(\n storage: Storage,\n options: UnstorageBlockstoreOptions,\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n): Promise<void> {\n if (options.storage || options.driver) {\n return;\n }\n\n const driver = await getDefaultDriver(options.base);\n Object.assign(storage, createStorage({ driver }));\n}\n\nfunction createUnstorageBase(\n options: UnstorageBlockstoreOptions,\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n) {\n const storage = createStorageWithOptions(options);\n const initialized = initializeStorage(storage, options, getDefaultDriver);\n\n async function ensureInitialized(): Promise<void> {\n await initialized;\n }\n\n async function hasItem(key: string): Promise<boolean> {\n await ensureInitialized();\n return await storage.hasItem(key);\n }\n\n async function getItem(key: string): Promise<Uint8Array> {\n await ensureInitialized();\n const value = await storage.getItemRaw<Uint8Array>(key);\n\n if (value === null) {\n throw new Error(`Item not found: ${key}`);\n }\n\n return value;\n }\n\n async function putItem(key: string, value: Uint8Array): Promise<void> {\n await ensureInitialized();\n await storage.setItemRaw(key, value);\n }\n\n async function deleteItem(key: string): Promise<void> {\n await ensureInitialized();\n await storage.removeItem(key);\n }\n\n async function getAllKeys(): Promise<string[]> {\n await ensureInitialized();\n return await storage.getKeys();\n }\n\n return {\n storage,\n hasItem,\n getItem,\n putItem,\n deleteItem,\n getAllKeys,\n };\n}\n\nexport function createUnstorageBlockstore(\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n): new (\n options?: UnstorageBlockstoreOptions,\n) => InstanceType<typeof BaseBlockstore> {\n return class UnstorageBlockstore extends BaseBlockstore {\n private prefix: string;\n private base: ReturnType<typeof createUnstorageBase>;\n\n constructor(options: UnstorageBlockstoreOptions = {}) {\n super();\n this.prefix = options.prefix ?? DEFAULT_BLOCKSTORE_PREFIX;\n this.base = createUnstorageBase(options, getDefaultDriver);\n }\n\n private keyToStorageKey(key: CID): string {\n return `${this.prefix}:${key.toString()}`;\n }\n\n async has(key: CID, _?: AbortOptions): Promise<boolean> {\n return await this.base.hasItem(this.keyToStorageKey(key));\n }\n\n async put(\n key: CID,\n val: Uint8Array | AwaitIterable<Uint8Array>,\n _?: AbortOptions,\n ): Promise<CID> {\n const storageKey = this.keyToStorageKey(key);\n const bytes =\n val instanceof Uint8Array ? val : await collectAsyncIterable(val);\n await this.base.putItem(storageKey, bytes);\n return key;\n }\n\n async *putMany(\n source: AwaitIterable<InputPair>,\n options?: AbortOptions,\n ): AwaitGenerator<CID> {\n for await (const { cid, bytes } of source) {\n yield await this.put(cid, bytes, options);\n }\n }\n\n async *get(key: CID, _?: AbortOptions): AsyncGenerator<Uint8Array> {\n const storageKey = this.keyToStorageKey(key);\n const value = await this.base.getItem(storageKey);\n yield value;\n }\n\n async *getMany(\n source: AwaitIterable<CID>,\n options?: AbortOptions,\n ): AwaitGenerator<BlockstorePair> {\n for await (const cid of source) {\n yield {\n cid,\n bytes: (async function* () {\n yield* await this.get(cid, options);\n }.call(this)),\n };\n }\n }\n\n async delete(key: CID, _?: AbortOptions): Promise<void> {\n await this.base.deleteItem(this.keyToStorageKey(key));\n }\n\n async *deleteMany(\n source: AwaitIterable<CID>,\n options?: AbortOptions,\n ): AwaitGenerator<CID> {\n for await (const cid of source) {\n await this.delete(cid, options);\n yield cid;\n }\n }\n\n async *getAll(_?: AbortOptions): AwaitGenerator<BlockstorePair> {\n const keys = await this.base.getAllKeys();\n\n for (const key of keys) {\n if (key.startsWith(this.prefix + \":\")) {\n const cidString = key.slice(this.prefix.length + 1);\n try {\n const cid = CID.parse(cidString);\n const value = await this.base.getItem(key);\n\n yield {\n cid,\n bytes: (async function* () {\n yield value;\n })(),\n };\n } catch {\n // Skip invalid keys\n }\n }\n }\n }\n };\n}\n\nexport function createUnstorageDatastore(\n getDefaultDriver: (base?: string) => Driver | Promise<Driver>,\n): new (options?: UnstorageBlockstoreOptions) => Datastore {\n return class UnstorageDatastore implements Datastore {\n private prefix: string;\n private base: ReturnType<typeof createUnstorageBase>;\n\n constructor(options: UnstorageBlockstoreOptions = {}) {\n this.prefix =\n options.datastorePrefix ?? options.prefix ?? DEFAULT_BLOCKSTORE_PREFIX;\n this.base = createUnstorageBase(options, getDefaultDriver);\n }\n\n private keyToStorageKey(key: Key): string {\n return `${this.prefix}:${key.toString()}`;\n }\n\n private storageKeyToKey(storageKey: string): Key {\n return new Key(storageKey.slice(this.prefix.length + 1));\n }\n\n async has(key: Key, _?: AbortOptions): Promise<boolean> {\n return await this.base.hasItem(this.keyToStorageKey(key));\n }\n\n async put(key: Key, val: Uint8Array, _?: AbortOptions): Promise<Key> {\n await this.base.putItem(this.keyToStorageKey(key), val);\n return key;\n }\n\n async *putMany(\n source: AwaitIterable<Pair>,\n options?: AbortOptions,\n ): AsyncGenerator<Key> {\n for await (const { key, value } of source) {\n yield await this.put(key, value, options);\n }\n }\n\n async get(key: Key, _?: AbortOptions): Promise<Uint8Array> {\n const storageKey = this.keyToStorageKey(key);\n try {\n return await this.base.getItem(storageKey);\n } catch (error) {\n throw new Error(`Datastore item not found: ${key.toString()}`);\n }\n }\n\n async *getMany(\n source: AwaitIterable<Key>,\n options?: AbortOptions,\n ): AsyncGenerator<Pair> {\n for await (const key of source) {\n yield {\n key,\n value: await this.get(key, options),\n };\n }\n }\n\n async delete(key: Key, _?: AbortOptions): Promise<void> {\n await this.base.deleteItem(this.keyToStorageKey(key));\n }\n\n async *deleteMany(\n source: AwaitIterable<Key>,\n options?: AbortOptions,\n ): AsyncGenerator<Key> {\n for await (const key of source) {\n await this.delete(key, options);\n yield key;\n }\n }\n\n batch(): Batch {\n const operations: Array<{\n type: \"put\" | \"delete\";\n key: Key;\n value?: Uint8Array;\n }> = [];\n const base = this.base;\n const keyToStorageKey = this.keyToStorageKey.bind(this);\n\n return {\n put(key: Key, value: Uint8Array): void {\n operations.push({ type: \"put\", key, value });\n },\n delete(key: Key): void {\n operations.push({ type: \"delete\", key });\n },\n async commit(): Promise<void> {\n for (const op of operations) {\n if (op.type === \"put\" && op.value !== undefined) {\n await base.putItem(keyToStorageKey(op.key), op.value);\n } else if (op.type === \"delete\") {\n await base.deleteItem(keyToStorageKey(op.key));\n }\n }\n operations.length = 0;\n },\n };\n }\n\n async *query(query: Query, _?: AbortOptions): AsyncGenerator<Pair> {\n const keys = await this.base.getAllKeys();\n\n for (const key of keys) {\n if (!key.startsWith(this.prefix + \":\")) {\n continue;\n }\n\n const datastoreKey = this.storageKeyToKey(key);\n\n if (\n query.prefix &&\n !datastoreKey.toString().startsWith(query.prefix.toString())\n ) {\n continue;\n }\n\n const value = await this.base.getItem(key);\n\n if (query.filters) {\n let match = true;\n for (const filter of query.filters) {\n if (!filter({ key: datastoreKey, value })) {\n match = false;\n break;\n }\n }\n if (!match) continue;\n }\n\n yield {\n key: datastoreKey,\n value,\n };\n }\n }\n\n async *queryKeys(query: KeyQuery, _?: AbortOptions): AsyncGenerator<Key> {\n const keys = await this.base.getAllKeys();\n\n for (const key of keys) {\n if (!key.startsWith(this.prefix + \":\")) {\n continue;\n }\n\n const datastoreKey = this.storageKeyToKey(key);\n\n if (\n query.prefix &&\n !datastoreKey.toString().startsWith(query.prefix.toString())\n ) {\n continue;\n }\n\n yield datastoreKey;\n }\n }\n };\n}\n"],"mappings":"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"}
@@ -1,36 +1,8 @@
1
- import { UnstorageBlockstoreOptions, setDriverFactory } from "./unstorage-base.js";
2
- import * as interface_datastore0 from "interface-datastore";
3
- import * as multiformats0 from "multiformats";
4
- import * as interface_store0 from "interface-store";
5
- import * as interface_blockstore0 from "interface-blockstore";
1
+ import { UnstorageBlockstoreOptions, createUnstorageBlockstore, createUnstorageDatastore, setDriverFactory } from "./unstorage-base.js";
6
2
 
7
3
  //#region src/blockstore/unstorage.d.ts
8
- declare function createBlockstore(options?: UnstorageBlockstoreOptions): {
9
- new (instanceOptions?: UnstorageBlockstoreOptions): {
10
- has(key: multiformats0.CID, options?: interface_store0.AbortOptions): interface_store0.Await<boolean>;
11
- put(key: multiformats0.CID, val: Uint8Array | interface_store0.AwaitIterable<Uint8Array>, options?: interface_store0.AbortOptions): interface_store0.Await<multiformats0.CID>;
12
- putMany(source: interface_store0.AwaitIterable<interface_blockstore0.InputPair>, options?: interface_store0.AbortOptions): interface_store0.AwaitGenerator<multiformats0.CID>;
13
- get(key: multiformats0.CID, options?: interface_store0.AbortOptions): interface_store0.AwaitGenerator<Uint8Array>;
14
- getMany(source: interface_store0.AwaitIterable<multiformats0.CID>, options?: interface_store0.AbortOptions): interface_store0.AwaitGenerator<interface_blockstore0.Pair>;
15
- delete(key: multiformats0.CID, options?: interface_store0.AbortOptions): interface_store0.Await<void>;
16
- deleteMany(source: interface_store0.AwaitIterable<multiformats0.CID>, options?: interface_store0.AbortOptions): interface_store0.AwaitGenerator<multiformats0.CID>;
17
- getAll(options?: interface_store0.AbortOptions): interface_store0.AwaitGenerator<interface_blockstore0.Pair>;
18
- };
19
- };
20
- declare function createDatastore(options?: UnstorageBlockstoreOptions): {
21
- new (instanceOptions?: UnstorageBlockstoreOptions): {
22
- batch(): interface_datastore0.Batch<{}>;
23
- query(query: interface_datastore0.Query, options?: interface_store0.AbortOptions | undefined): interface_store0.AwaitGenerator<interface_datastore0.Pair>;
24
- queryKeys(query: interface_datastore0.KeyQuery, options?: interface_store0.AbortOptions | undefined): interface_store0.AwaitGenerator<interface_datastore0.Key>;
25
- has(key: interface_datastore0.Key, options?: interface_store0.AbortOptions | undefined): interface_store0.Await<boolean>;
26
- put(key: interface_datastore0.Key, val: Uint8Array<ArrayBufferLike>, options?: interface_store0.AbortOptions | undefined): interface_store0.Await<interface_datastore0.Key>;
27
- putMany(source: interface_store0.AwaitIterable<interface_datastore0.Pair>, options?: interface_store0.AbortOptions | undefined): interface_store0.AwaitGenerator<interface_datastore0.Key, any, any>;
28
- get(key: interface_datastore0.Key, options?: interface_store0.AbortOptions | undefined): interface_store0.Await<Uint8Array<ArrayBufferLike>>;
29
- getMany(source: interface_store0.AwaitIterable<interface_datastore0.Key>, options?: interface_store0.AbortOptions | undefined): interface_store0.AwaitGenerator<interface_datastore0.Pair, any, any>;
30
- delete(key: interface_datastore0.Key, options?: interface_store0.AbortOptions | undefined): interface_store0.Await<void>;
31
- deleteMany(source: interface_store0.AwaitIterable<interface_datastore0.Key>, options?: interface_store0.AbortOptions | undefined): interface_store0.AwaitGenerator<interface_datastore0.Key, any, any>;
32
- };
33
- };
4
+ declare function createBlockstore(options?: UnstorageBlockstoreOptions): new (options?: UnstorageBlockstoreOptions) => InstanceType<ReturnType<typeof createUnstorageBlockstore>>;
5
+ declare function createDatastore(options?: UnstorageBlockstoreOptions): new (options?: UnstorageBlockstoreOptions) => InstanceType<ReturnType<typeof createUnstorageDatastore>>;
34
6
  //#endregion
35
7
  export { createBlockstore, createDatastore };
36
8
  //# sourceMappingURL=unstorage.d.ts.map
@@ -7,8 +7,8 @@ function isBrowser() {
7
7
  }
8
8
  async function getDefaultDriver(base) {
9
9
  if (driverFactory) return await driverFactory();
10
- if (isBrowser()) return (await import("unstorage/drivers/indexedb")).default({ base: base ?? DEFAULT_BLOCKSTORE_BASE });
11
- else return (await import("unstorage/drivers/fs-lite")).default({ base: base ?? DEFAULT_BLOCKSTORE_FS_BASE });
10
+ if (isBrowser()) return (await import("unstorage/drivers/indexedb")).default({ base: base ?? "pinner:" });
11
+ else return (await import("unstorage/drivers/fs-lite")).default({ base: base ?? "./.pinner-blocks" });
12
12
  }
13
13
  function createBlockstore(options) {
14
14
  const BlockstoreClass = createUnstorageBlockstore(getDefaultDriver);
@@ -1 +1 @@
1
- {"version":3,"file":"unstorage.js","names":[],"sources":["../../../src/blockstore/unstorage.ts"],"sourcesContent":["import {\n createUnstorageBlockstore,\n createUnstorageDatastore,\n driverFactory,\n setDriverFactory,\n type UnstorageBlockstoreOptions,\n} from \"./unstorage-base\";\nimport {\n DEFAULT_BLOCKSTORE_BASE,\n DEFAULT_BLOCKSTORE_FS_BASE,\n} from \"@/types/constants\";\n\nfunction isBrowser(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n );\n}\n\nasync function getDefaultDriver(base?: string) {\n // Use driverFactory override if set (typically by tests to inject in-memory driver)\n if (driverFactory) {\n return await driverFactory();\n }\n\n if (isBrowser()) {\n return (await import(\"unstorage/drivers/indexedb\")).default({\n base: base ?? DEFAULT_BLOCKSTORE_BASE,\n });\n } else {\n return (await import(\"unstorage/drivers/fs-lite\")).default({\n base: base ?? DEFAULT_BLOCKSTORE_FS_BASE,\n });\n }\n}\n\nexport function createBlockstore(options?: UnstorageBlockstoreOptions) {\n const BlockstoreClass = createUnstorageBlockstore(getDefaultDriver);\n return class extends BlockstoreClass {\n constructor(instanceOptions?: UnstorageBlockstoreOptions) {\n super({ ...options, ...instanceOptions });\n }\n };\n}\n\nexport function createDatastore(options?: UnstorageBlockstoreOptions) {\n const DatastoreClass = createUnstorageDatastore(getDefaultDriver);\n return class extends DatastoreClass {\n constructor(instanceOptions?: UnstorageBlockstoreOptions) {\n super({ ...options, ...instanceOptions });\n }\n };\n}\n\nexport { setDriverFactory };\nexport type { UnstorageBlockstoreOptions } from \"./unstorage-base\";\n"],"mappings":";;;;AAYA,SAAS,YAAqB;AAC5B,QACE,OAAO,WAAW,eAAe,OAAO,OAAO,iBAAiB;;AAIpE,eAAe,iBAAiB,MAAe;AAE7C,KAAI,cACF,QAAO,MAAM,eAAe;AAG9B,KAAI,WAAW,CACb,SAAQ,MAAM,OAAO,+BAA+B,QAAQ,EAC1D,MAAM,QAAQ,yBACf,CAAC;KAEF,SAAQ,MAAM,OAAO,8BAA8B,QAAQ,EACzD,MAAM,QAAQ,4BACf,CAAC;;AAIN,SAAgB,iBAAiB,SAAsC;CACrE,MAAM,kBAAkB,0BAA0B,iBAAiB;AACnE,QAAO,cAAc,gBAAgB;EACnC,YAAY,iBAA8C;AACxD,SAAM;IAAE,GAAG;IAAS,GAAG;IAAiB,CAAC;;;;AAK/C,SAAgB,gBAAgB,SAAsC;CACpE,MAAM,iBAAiB,yBAAyB,iBAAiB;AACjE,QAAO,cAAc,eAAe;EAClC,YAAY,iBAA8C;AACxD,SAAM;IAAE,GAAG;IAAS,GAAG;IAAiB,CAAC"}
1
+ {"version":3,"file":"unstorage.js","names":[],"sources":["../../../src/blockstore/unstorage.ts"],"sourcesContent":["import {\n createUnstorageBlockstore,\n createUnstorageDatastore,\n driverFactory,\n setDriverFactory,\n type UnstorageBlockstoreOptions,\n} from \"./unstorage-base\";\nimport {\n DEFAULT_BLOCKSTORE_BASE,\n DEFAULT_BLOCKSTORE_FS_BASE,\n} from \"@/types/constants\";\nimport type { AbortOptions, AwaitGenerator } from \"interface-store\";\n\nfunction isBrowser(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n );\n}\n\nasync function getDefaultDriver(base?: string) {\n // Use driverFactory override if set (typically by tests to inject in-memory driver)\n if (driverFactory) {\n return await driverFactory();\n }\n\n if (isBrowser()) {\n return (await import(\"unstorage/drivers/indexedb\")).default({\n base: base ?? DEFAULT_BLOCKSTORE_BASE,\n });\n } else {\n return (await import(\"unstorage/drivers/fs-lite\")).default({\n base: base ?? DEFAULT_BLOCKSTORE_FS_BASE,\n });\n }\n}\n\nexport function createBlockstore(\n options?: UnstorageBlockstoreOptions,\n): new (options?: UnstorageBlockstoreOptions) => InstanceType<\n ReturnType<typeof createUnstorageBlockstore>\n> {\n const BlockstoreClass = createUnstorageBlockstore(getDefaultDriver);\n return class extends BlockstoreClass {\n constructor(instanceOptions?: UnstorageBlockstoreOptions) {\n super({ ...options, ...instanceOptions });\n }\n };\n}\n\nexport function createDatastore(\n options?: UnstorageBlockstoreOptions,\n): new (options?: UnstorageBlockstoreOptions) => InstanceType<\n ReturnType<typeof createUnstorageDatastore>\n> {\n const DatastoreClass = createUnstorageDatastore(getDefaultDriver);\n return class extends DatastoreClass {\n constructor(instanceOptions?: UnstorageBlockstoreOptions) {\n super({ ...options, ...instanceOptions });\n }\n };\n}\n\nexport { setDriverFactory };\nexport type { UnstorageBlockstoreOptions } from \"./unstorage-base\";\n"],"mappings":";;;;AAaA,SAAS,YAAqB;AAC5B,QACE,OAAO,WAAW,eAAe,OAAO,OAAO,iBAAiB;;AAIpE,eAAe,iBAAiB,MAAe;AAE7C,KAAI,cACF,QAAO,MAAM,eAAe;AAG9B,KAAI,WAAW,CACb,SAAQ,MAAM,OAAO,+BAA+B,QAAQ,EAC1D,MAAM,mBACP,CAAC;KAEF,SAAQ,MAAM,OAAO,8BAA8B,QAAQ,EACzD,MAAM,4BACP,CAAC;;AAIN,SAAgB,iBACd,SAGA;CACA,MAAM,kBAAkB,0BAA0B,iBAAiB;AACnE,QAAO,cAAc,gBAAgB;EACnC,YAAY,iBAA8C;AACxD,SAAM;IAAE,GAAG;IAAS,GAAG;IAAiB,CAAC;;;;AAK/C,SAAgB,gBACd,SAGA;CACA,MAAM,iBAAiB,yBAAyB,iBAAiB;AACjE,QAAO,cAAc,eAAe;EAClC,YAAY,iBAA8C;AACxD,SAAM;IAAE,GAAG;IAAS,GAAG;IAAiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"base64.js","names":[],"sources":["../../../src/encoder/base64.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * Base64 encoder - converts base64 strings to File objects.\n */\nexport class Base64Encoder implements Encoder<string> {\n async encode(\n base64String: string,\n options?: UploadOptions,\n ): Promise<EncoderResult> {\n try {\n const binaryString = atob(base64String);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const blob = new Blob([bytes], { type: \"application/octet-stream\" });\n const filename = options?.name || \"file.bin\";\n const file = new File([blob], filename, {\n type: \"application/octet-stream\",\n });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new EncoderError(\n `Base64 encoding failed: ${error.message}`,\n \"INVALID_BASE64\",\n error,\n );\n }\n throw new EncoderError(\n \"Base64 encoding failed: unknown error\",\n \"INVALID_BASE64\",\n );\n }\n }\n}\n\n/**\n * Encode a base64 string to a File object.\n */\nexport async function base64ToFile(\n base64String: string,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new Base64Encoder();\n return encoder.encode(base64String, options);\n}\n"],"mappings":";;;;;;AAMA,IAAa,gBAAb,MAAsD;CACpD,MAAM,OACJ,cACA,SACwB;AACxB,MAAI;GACF,MAAM,eAAe,KAAK,aAAa;GACvC,MAAM,QAAQ,IAAI,WAAW,aAAa,OAAO;AACjD,QAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,IACvC,OAAM,KAAK,aAAa,WAAW,EAAE;GAEvC,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,4BAA4B,CAAC;GACpE,MAAM,WAAW,SAAS,QAAQ;AAKlC,UAAO;IACL,MALW,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,EACtC,MAAM,4BACP,CAAC;IAIA,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAI,aACR,2BAA2B,MAAM,WACjC,kBACA,MACD;AAEH,SAAM,IAAI,aACR,yCACA,iBACD;;;;;;;AAQP,eAAsB,aACpB,cACA,SACwB;AAExB,QADgB,IAAI,eAAe,CACpB,OAAO,cAAc,QAAQ"}
1
+ {"version":3,"file":"base64.js","names":[],"sources":["../../../src/encoder/base64.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * Base64 encoder - converts base64 strings to File objects.\n */\nexport class Base64Encoder implements Encoder<string> {\n async encode(\n base64String: string,\n options?: UploadOptions,\n ): Promise<EncoderResult> {\n try {\n const binaryString = atob(base64String);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const blob = new Blob([bytes], { type: \"application/octet-stream\" });\n const filename = options?.name || \"file.bin\";\n const file = new File([blob], filename, {\n type: \"application/octet-stream\",\n });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new EncoderError(\n `Base64 encoding failed: ${error.message}`,\n \"INVALID_BASE64\",\n error,\n );\n }\n throw new EncoderError(\n \"Base64 encoding failed: unknown error\",\n \"INVALID_BASE64\",\n );\n }\n }\n}\n\n/**\n * Encode a base64 string to a File object.\n */\nexport async function base64ToFile(\n base64String: string,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new Base64Encoder();\n return encoder.encode(base64String, options);\n}\n"],"mappings":";;;;;;AAMA,IAAa,gBAAb,MAAsD;CACpD,MAAM,OACJ,cACA,SACwB;AACxB,MAAI;GACF,MAAM,eAAe,KAAK,aAAa;GACvC,MAAM,QAAQ,IAAI,WAAW,aAAa,OAAO;AACjD,QAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,IACvC,OAAM,KAAK,aAAa,WAAW,EAAE;GAEvC,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,4BAA4B,CAAC;GACpE,MAAM,WAAW,SAAS,QAAQ;AAKlC,UAAO;IACL,UALe,KAAK,CAAC,KAAK,EAAE,UAAU,EACtC,MAAM,4BACP,CAGK;IACJ,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAI,aACR,2BAA2B,MAAM,WACjC,kBACA,MACD;AAEH,SAAM,IAAI,aACR,yCACA,iBACD;;;;;;;AAQP,eAAsB,aACpB,cACA,SACwB;AAExB,QAAO,IADa,eACN,CAAC,OAAO,cAAc,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"row-formatter.js","names":[],"sources":["../../../../src/encoder/csv/row-formatter.ts"],"sourcesContent":["import type {\n CsvFormatterOptions,\n RowTransform,\n RowTransformCallback,\n} from \"./csv-options\";\nimport { FieldFormatter } from \"./field-formatter\";\n\n/**\n * Handles formatting of CSV rows including headers and column extraction.\n *\n * This implementation is derived from @fast-csv/format (https://github.com/C2FO/fast-csv)\n * Copyright (c) 2011 C2FO Labs, LLC\n * Licensed under the MIT License\n */\nexport class RowFormatter {\n private options: CsvFormatterOptions;\n private fieldFormatter: FieldFormatter;\n private shouldWriteHeaders: boolean;\n private rowTransform: RowTransformCallback | null = null;\n private headers: string[] | null = null;\n private hasWrittenHeaders = false;\n private rowCount = 0;\n\n constructor(options: CsvFormatterOptions) {\n this.options = options;\n this.fieldFormatter = new FieldFormatter(options);\n this.headers = Array.isArray(options.headers) ? options.headers : null;\n this.shouldWriteHeaders =\n options.writeHeaders ??\n (Array.isArray(options.headers) || options.headers === true);\n\n if (this.headers !== null) {\n this.fieldFormatter.headers = this.headers;\n }\n\n if (options.transform) {\n this.rowTransform = this.createTransform(options.transform);\n }\n }\n\n /**\n * Create a transform function that handles both sync and async transforms.\n */\n private createTransform(transformFn: RowTransform): RowTransformCallback {\n // Check if it's a sync transform (arity 1)\n if (transformFn.length === 1) {\n return (row: unknown, cb: RowTransformCallback) => {\n try {\n const transformedRow = (transformFn as (row: unknown) => unknown)(\n row,\n );\n cb(null, transformedRow);\n } catch (e) {\n cb(e instanceof Error ? e : new Error(String(e)));\n }\n };\n }\n\n return transformFn as RowTransformCallback;\n }\n\n /**\n * Check if the transform is synchronous (arity 1).\n */\n private isSyncTransform(): boolean {\n if (!this.options.transform) {\n return true;\n }\n return this.options.transform.length === 1;\n }\n\n /**\n * Format a single row.\n */\n format(row: unknown): string[] {\n let transformedRow: unknown;\n\n // Apply transform if present\n if (this.rowTransform) {\n transformedRow = this.applyTransformSync(row);\n } else {\n transformedRow = row;\n }\n\n if (!transformedRow) {\n return [];\n }\n\n const rows: string[] = [];\n\n // Check headers\n const { shouldFormatColumns, headers } = this.checkHeaders(transformedRow);\n\n // Write headers if needed\n if (this.shouldWriteHeaders && headers && !this.hasWrittenHeaders) {\n rows.push(this.formatColumns(headers, true));\n this.hasWrittenHeaders = true;\n }\n\n // Format data row\n if (shouldFormatColumns) {\n const columns = this.gatherColumns(transformedRow);\n rows.push(this.formatColumns(columns, false));\n }\n\n return rows;\n }\n\n /**\n * Apply transform synchronously.\n * Note: This only supports sync transforms. Async transforms are not supported\n * in the synchronous format() method.\n */\n private applyTransformSync(row: unknown): unknown {\n if (!this.options.transform) {\n return row;\n }\n\n // Only sync transforms (arity 1) are supported\n if (this.isSyncTransform()) {\n try {\n return (this.options.transform as (row: unknown) => unknown)(row);\n } catch (e) {\n throw e instanceof Error ? e : new Error(String(e));\n }\n }\n\n throw new Error(\n \"Async transforms are not supported in synchronous CSV formatting\",\n );\n }\n\n /**\n * Finish formatting and return any trailing content.\n */\n finish(): string[] {\n const rows: string[] = [];\n\n // Write headers if alwaysWriteHeaders is true and no rows were written\n if (this.options.alwaysWriteHeaders && this.rowCount === 0) {\n if (!this.headers) {\n throw new Error(\n \"`alwaysWriteHeaders` option is set to true but `headers` option not provided.\",\n );\n }\n rows.push(this.formatColumns(this.headers, true));\n }\n\n // Add end row delimiter if configured\n if (this.options.includeEndRowDelimiter) {\n rows.push(this.options.rowDelimiter || \"\\n\");\n }\n\n return rows;\n }\n\n /**\n * Check if headers need to be written.\n */\n private checkHeaders(row: unknown): {\n shouldFormatColumns: boolean;\n headers: string[] | null;\n } {\n if (this.headers) {\n return { shouldFormatColumns: true, headers: this.headers };\n }\n\n const headers = this.gatherHeaders(row);\n this.headers = headers;\n this.fieldFormatter.headers = headers;\n\n if (!this.shouldWriteHeaders) {\n return { shouldFormatColumns: true, headers: null };\n }\n\n // If the row is equal to headers, don't format (it's the header row itself)\n if (Array.isArray(row) && headers.every((header, i) => header === row[i])) {\n return { shouldFormatColumns: false, headers };\n }\n\n return { shouldFormatColumns: true, headers };\n }\n\n /**\n * Extract headers from a row.\n */\n private gatherHeaders(row: unknown): string[] {\n if (this.isRowHashArray(row)) {\n // Multi-dimensional array with item 0 being the header\n return (row as unknown[][]).map((it) => String(it[0]));\n }\n\n if (Array.isArray(row)) {\n return row.map(String);\n }\n\n return Object.keys(row as object);\n }\n\n /**\n * Check if row is a hash array (multi-dimensional array with [key, value] pairs).\n */\n private isRowHashArray(row: unknown): boolean {\n if (!Array.isArray(row)) {\n return false;\n }\n return Array.isArray(row[0]) && row[0].length === 2;\n }\n\n /**\n * Extract column values from a row.\n */\n private gatherColumns(row: unknown): unknown[] {\n if (this.headers === null) {\n throw new Error(\"Headers is currently null\");\n }\n\n if (!Array.isArray(row)) {\n // Object: use headers to get values\n return this.headers.map(\n (header) => (row as Record<string, unknown>)[header],\n );\n }\n\n if (this.isRowHashArray(row)) {\n // Hash array: extract values\n return this.headers.map((header, i) => {\n const col = (row as unknown[][])[i];\n return col ? col[1] : \"\";\n });\n }\n\n // Regular array\n if (!this.shouldWriteHeaders) {\n // If headers weren't written, return the row as-is\n return row;\n }\n\n // Map by header index\n return this.headers.map((_, i) => row[i]);\n }\n\n /**\n * Format columns into a CSV row string.\n */\n private formatColumns(columns: unknown[], isHeadersRow: boolean): string {\n const formattedCols = columns\n .map((field, i) => this.fieldFormatter.format(field, i, isHeadersRow))\n .join(this.options.delimiter || \",\");\n\n const { rowCount } = this;\n this.rowCount += 1;\n\n // Add row delimiter before all rows except the first\n if (rowCount > 0) {\n return [this.options.rowDelimiter || \"\\n\", formattedCols].join(\"\");\n }\n\n return formattedCols;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"row-formatter.js","names":[],"sources":["../../../../src/encoder/csv/row-formatter.ts"],"sourcesContent":["import type {\n CsvFormatterOptions,\n RowTransform,\n RowTransformCallback,\n} from \"./csv-options\";\nimport { FieldFormatter } from \"./field-formatter\";\n\n/**\n * Handles formatting of CSV rows including headers and column extraction.\n *\n * This implementation is derived from @fast-csv/format (https://github.com/C2FO/fast-csv)\n * Copyright (c) 2011 C2FO Labs, LLC\n * Licensed under the MIT License\n */\nexport class RowFormatter {\n private options: CsvFormatterOptions;\n private fieldFormatter: FieldFormatter;\n private shouldWriteHeaders: boolean;\n private rowTransform: RowTransformCallback | null = null;\n private headers: string[] | null = null;\n private hasWrittenHeaders = false;\n private rowCount = 0;\n\n constructor(options: CsvFormatterOptions) {\n this.options = options;\n this.fieldFormatter = new FieldFormatter(options);\n this.headers = Array.isArray(options.headers) ? options.headers : null;\n this.shouldWriteHeaders =\n options.writeHeaders ??\n (Array.isArray(options.headers) || options.headers === true);\n\n if (this.headers !== null) {\n this.fieldFormatter.headers = this.headers;\n }\n\n if (options.transform) {\n this.rowTransform = this.createTransform(options.transform);\n }\n }\n\n /**\n * Create a transform function that handles both sync and async transforms.\n */\n private createTransform(transformFn: RowTransform): RowTransformCallback {\n // Check if it's a sync transform (arity 1)\n if (transformFn.length === 1) {\n return (row: unknown, cb: RowTransformCallback) => {\n try {\n const transformedRow = (transformFn as (row: unknown) => unknown)(\n row,\n );\n cb(null, transformedRow);\n } catch (e) {\n cb(e instanceof Error ? e : new Error(String(e)));\n }\n };\n }\n\n return transformFn as RowTransformCallback;\n }\n\n /**\n * Check if the transform is synchronous (arity 1).\n */\n private isSyncTransform(): boolean {\n if (!this.options.transform) {\n return true;\n }\n return this.options.transform.length === 1;\n }\n\n /**\n * Format a single row.\n */\n format(row: unknown): string[] {\n let transformedRow: unknown;\n\n // Apply transform if present\n if (this.rowTransform) {\n transformedRow = this.applyTransformSync(row);\n } else {\n transformedRow = row;\n }\n\n if (!transformedRow) {\n return [];\n }\n\n const rows: string[] = [];\n\n // Check headers\n const { shouldFormatColumns, headers } = this.checkHeaders(transformedRow);\n\n // Write headers if needed\n if (this.shouldWriteHeaders && headers && !this.hasWrittenHeaders) {\n rows.push(this.formatColumns(headers, true));\n this.hasWrittenHeaders = true;\n }\n\n // Format data row\n if (shouldFormatColumns) {\n const columns = this.gatherColumns(transformedRow);\n rows.push(this.formatColumns(columns, false));\n }\n\n return rows;\n }\n\n /**\n * Apply transform synchronously.\n * Note: This only supports sync transforms. Async transforms are not supported\n * in the synchronous format() method.\n */\n private applyTransformSync(row: unknown): unknown {\n if (!this.options.transform) {\n return row;\n }\n\n // Only sync transforms (arity 1) are supported\n if (this.isSyncTransform()) {\n try {\n return (this.options.transform as (row: unknown) => unknown)(row);\n } catch (e) {\n throw e instanceof Error ? e : new Error(String(e));\n }\n }\n\n throw new Error(\n \"Async transforms are not supported in synchronous CSV formatting\",\n );\n }\n\n /**\n * Finish formatting and return any trailing content.\n */\n finish(): string[] {\n const rows: string[] = [];\n\n // Write headers if alwaysWriteHeaders is true and no rows were written\n if (this.options.alwaysWriteHeaders && this.rowCount === 0) {\n if (!this.headers) {\n throw new Error(\n \"`alwaysWriteHeaders` option is set to true but `headers` option not provided.\",\n );\n }\n rows.push(this.formatColumns(this.headers, true));\n }\n\n // Add end row delimiter if configured\n if (this.options.includeEndRowDelimiter) {\n rows.push(this.options.rowDelimiter || \"\\n\");\n }\n\n return rows;\n }\n\n /**\n * Check if headers need to be written.\n */\n private checkHeaders(row: unknown): {\n shouldFormatColumns: boolean;\n headers: string[] | null;\n } {\n if (this.headers) {\n return { shouldFormatColumns: true, headers: this.headers };\n }\n\n const headers = this.gatherHeaders(row);\n this.headers = headers;\n this.fieldFormatter.headers = headers;\n\n if (!this.shouldWriteHeaders) {\n return { shouldFormatColumns: true, headers: null };\n }\n\n // If the row is equal to headers, don't format (it's the header row itself)\n if (Array.isArray(row) && headers.every((header, i) => header === row[i])) {\n return { shouldFormatColumns: false, headers };\n }\n\n return { shouldFormatColumns: true, headers };\n }\n\n /**\n * Extract headers from a row.\n */\n private gatherHeaders(row: unknown): string[] {\n if (this.isRowHashArray(row)) {\n // Multi-dimensional array with item 0 being the header\n return (row as unknown[][]).map((it) => String(it[0]));\n }\n\n if (Array.isArray(row)) {\n return row.map(String);\n }\n\n return Object.keys(row as object);\n }\n\n /**\n * Check if row is a hash array (multi-dimensional array with [key, value] pairs).\n */\n private isRowHashArray(row: unknown): boolean {\n if (!Array.isArray(row)) {\n return false;\n }\n return Array.isArray(row[0]) && row[0].length === 2;\n }\n\n /**\n * Extract column values from a row.\n */\n private gatherColumns(row: unknown): unknown[] {\n if (this.headers === null) {\n throw new Error(\"Headers is currently null\");\n }\n\n if (!Array.isArray(row)) {\n // Object: use headers to get values\n return this.headers.map(\n (header) => (row as Record<string, unknown>)[header],\n );\n }\n\n if (this.isRowHashArray(row)) {\n // Hash array: extract values\n return this.headers.map((header, i) => {\n const col = (row as unknown[][])[i];\n return col ? col[1] : \"\";\n });\n }\n\n // Regular array\n if (!this.shouldWriteHeaders) {\n // If headers weren't written, return the row as-is\n return row;\n }\n\n // Map by header index\n return this.headers.map((_, i) => row[i]);\n }\n\n /**\n * Format columns into a CSV row string.\n */\n private formatColumns(columns: unknown[], isHeadersRow: boolean): string {\n const formattedCols = columns\n .map((field, i) => this.fieldFormatter.format(field, i, isHeadersRow))\n .join(this.options.delimiter || \",\");\n\n const { rowCount } = this;\n this.rowCount += 1;\n\n // Add row delimiter before all rows except the first\n if (rowCount > 0) {\n return [this.options.rowDelimiter || \"\\n\", formattedCols].join(\"\");\n }\n\n return formattedCols;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"csv.js","names":["#arrayToCsv"],"sources":["../../../src/encoder/csv.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\nimport {\n createCsvFormatter,\n type CsvFormatterOptions,\n} from \"./csv/csv-formatter\";\n\n/**\n * CSV encoder - converts CSV strings, arrays of objects, or arrays of arrays to File objects.\n * Uses a simplified CSV formatter without streaming support.\n *\n * This implementation is derived from @fast-csv/format (https://github.com/C2FO/fast-csv)\n * Copyright (c) 2011 C2FO Labs, LLC\n * Licensed under the MIT License\n */\n\n/**\n * Extended upload options for CSV encoder.\n * Extends base UploadOptions with CSV formatting options.\n */\nexport interface CsvUploadOptions extends UploadOptions {\n /**\n * CSV formatting options.\n */\n csv?: CsvFormatterOptions;\n}\n\n/**\n * CSV encoder - converts CSV strings, arrays of objects, or arrays of arrays to File objects.\n * Uses a simplified CSV formatter without streaming support.\n */\nexport class CsvEncoder implements Encoder<string | object[] | any[][]> {\n async encode(\n input: string | object[] | any[][],\n options?: CsvUploadOptions,\n ): Promise<EncoderResult> {\n try {\n let csvContent: string;\n\n if (typeof input === \"string\") {\n // Raw CSV string - use as-is\n csvContent = input;\n } else if (Array.isArray(input)) {\n // Convert array to CSV using our formatter\n csvContent = this.#arrayToCsv(input, options?.csv);\n } else {\n throw new EncoderError(\n \"Invalid CSV input: must be string or array\",\n \"INVALID_CSV\",\n );\n }\n\n const blob = new Blob([csvContent], { type: \"text/csv\" });\n const file = new File([blob], options?.name || \"data.csv\", {\n type: \"text/csv\",\n });\n\n return {\n file,\n options: options || {},\n };\n } catch (error) {\n if (error instanceof EncoderError) {\n throw error;\n }\n if (error instanceof Error) {\n throw new EncoderError(\n `CSV encoding failed: ${error.message}`,\n \"INVALID_CSV\",\n error,\n );\n }\n throw new EncoderError(\n \"CSV encoding failed: unknown error\",\n \"INVALID_CSV\",\n );\n }\n }\n\n #arrayToCsv(\n data: any[] | object[][],\n csvOptions?: CsvFormatterOptions,\n ): string {\n const formatter = createCsvFormatter({\n headers: true,\n ...csvOptions,\n });\n\n return formatter.format(data);\n }\n}\n\n/**\n * Encode CSV data to a File object.\n */\nexport async function csvToFile(\n data: string | object[] | any[][],\n options?: CsvUploadOptions,\n): Promise<EncoderResult> {\n const encoder = new CsvEncoder();\n return encoder.encode(data, options);\n}\n"],"mappings":";;;;;;;;AA+BA,IAAa,aAAb,MAAwE;CACtE,MAAM,OACJ,OACA,SACwB;AACxB,MAAI;GACF,IAAI;AAEJ,OAAI,OAAO,UAAU,SAEnB,cAAa;YACJ,MAAM,QAAQ,MAAM,CAE7B,cAAa,MAAKA,WAAY,OAAO,SAAS,IAAI;OAElD,OAAM,IAAI,aACR,8CACA,cACD;GAGH,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM,YAAY,CAAC;AAKzD,UAAO;IACL,MALW,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,QAAQ,YAAY,EACzD,MAAM,YACP,CAAC;IAIA,SAAS,WAAW,EAAE;IACvB;WACM,OAAO;AACd,OAAI,iBAAiB,aACnB,OAAM;AAER,OAAI,iBAAiB,MACnB,OAAM,IAAI,aACR,wBAAwB,MAAM,WAC9B,eACA,MACD;AAEH,SAAM,IAAI,aACR,sCACA,cACD;;;CAIL,YACE,MACA,YACQ;AAMR,SALkB,mBAAmB;GACnC,SAAS;GACT,GAAG;GACJ,CAAC,CAEe,OAAO,KAAK;;;;;;AAOjC,eAAsB,UACpB,MACA,SACwB;AAExB,QADgB,IAAI,YAAY,CACjB,OAAO,MAAM,QAAQ"}
1
+ {"version":3,"file":"csv.js","names":["#arrayToCsv"],"sources":["../../../src/encoder/csv.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\nimport {\n createCsvFormatter,\n type CsvFormatterOptions,\n} from \"./csv/csv-formatter\";\n\n/**\n * CSV encoder - converts CSV strings, arrays of objects, or arrays of arrays to File objects.\n * Uses a simplified CSV formatter without streaming support.\n *\n * This implementation is derived from @fast-csv/format (https://github.com/C2FO/fast-csv)\n * Copyright (c) 2011 C2FO Labs, LLC\n * Licensed under the MIT License\n */\n\n/**\n * Extended upload options for CSV encoder.\n * Extends base UploadOptions with CSV formatting options.\n */\nexport interface CsvUploadOptions extends UploadOptions {\n /**\n * CSV formatting options.\n */\n csv?: CsvFormatterOptions;\n}\n\n/**\n * CSV encoder - converts CSV strings, arrays of objects, or arrays of arrays to File objects.\n * Uses a simplified CSV formatter without streaming support.\n */\nexport class CsvEncoder implements Encoder<string | object[] | any[][]> {\n async encode(\n input: string | object[] | any[][],\n options?: CsvUploadOptions,\n ): Promise<EncoderResult> {\n try {\n let csvContent: string;\n\n if (typeof input === \"string\") {\n // Raw CSV string - use as-is\n csvContent = input;\n } else if (Array.isArray(input)) {\n // Convert array to CSV using our formatter\n csvContent = this.#arrayToCsv(input, options?.csv);\n } else {\n throw new EncoderError(\n \"Invalid CSV input: must be string or array\",\n \"INVALID_CSV\",\n );\n }\n\n const blob = new Blob([csvContent], { type: \"text/csv\" });\n const file = new File([blob], options?.name || \"data.csv\", {\n type: \"text/csv\",\n });\n\n return {\n file,\n options: options || {},\n };\n } catch (error) {\n if (error instanceof EncoderError) {\n throw error;\n }\n if (error instanceof Error) {\n throw new EncoderError(\n `CSV encoding failed: ${error.message}`,\n \"INVALID_CSV\",\n error,\n );\n }\n throw new EncoderError(\n \"CSV encoding failed: unknown error\",\n \"INVALID_CSV\",\n );\n }\n }\n\n #arrayToCsv(\n data: any[] | object[][],\n csvOptions?: CsvFormatterOptions,\n ): string {\n const formatter = createCsvFormatter({\n headers: true,\n ...csvOptions,\n });\n\n return formatter.format(data);\n }\n}\n\n/**\n * Encode CSV data to a File object.\n */\nexport async function csvToFile(\n data: string | object[] | any[][],\n options?: CsvUploadOptions,\n): Promise<EncoderResult> {\n const encoder = new CsvEncoder();\n return encoder.encode(data, options);\n}\n"],"mappings":";;;;;;;;AA+BA,IAAa,aAAb,MAAwE;CACtE,MAAM,OACJ,OACA,SACwB;AACxB,MAAI;GACF,IAAI;AAEJ,OAAI,OAAO,UAAU,SAEnB,cAAa;YACJ,MAAM,QAAQ,MAAM,CAE7B,cAAa,MAAKA,WAAY,OAAO,SAAS,IAAI;OAElD,OAAM,IAAI,aACR,8CACA,cACD;GAGH,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM,YAAY,CAAC;AAKzD,UAAO;IACL,UALe,KAAK,CAAC,KAAK,EAAE,SAAS,QAAQ,YAAY,EACzD,MAAM,YACP,CAGK;IACJ,SAAS,WAAW,EAAE;IACvB;WACM,OAAO;AACd,OAAI,iBAAiB,aACnB,OAAM;AAER,OAAI,iBAAiB,MACnB,OAAM,IAAI,aACR,wBAAwB,MAAM,WAC9B,eACA,MACD;AAEH,SAAM,IAAI,aACR,sCACA,cACD;;;CAIL,YACE,MACA,YACQ;AAMR,SALkB,mBAAmB;GACnC,SAAS;GACT,GAAG;GACJ,CAEe,CAAC,OAAO,KAAK;;;;;;AAOjC,eAAsB,UACpB,MACA,SACwB;AAExB,QAAO,IADa,YACN,CAAC,OAAO,MAAM,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","names":[],"sources":["../../../src/encoder/json.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * JSON encoder - converts JSON objects to File objects.\n */\nexport class JsonEncoder implements Encoder<object> {\n async encode(data: object, options?: UploadOptions): Promise<EncoderResult> {\n try {\n const json = JSON.stringify(data, null, 2);\n const blob = new Blob([json], { type: \"application/json\" });\n const filename = options?.name || \"data.json\";\n const file = new File([blob], filename, { type: \"application/json\" });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new EncoderError(\n `JSON encoding failed: ${error.message}`,\n \"INVALID_JSON\",\n error,\n );\n }\n throw new EncoderError(\n \"JSON encoding failed: unknown error\",\n \"INVALID_JSON\",\n );\n }\n }\n}\n\n/**\n * Encode a JSON object to a File object.\n */\nexport async function jsonToFile(\n data: object,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new JsonEncoder();\n return encoder.encode(data, options);\n}\n"],"mappings":";;;;;;AAMA,IAAa,cAAb,MAAoD;CAClD,MAAM,OAAO,MAAc,SAAiD;AAC1E,MAAI;GACF,MAAM,OAAO,KAAK,UAAU,MAAM,MAAM,EAAE;GAC1C,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,oBAAoB,CAAC;GAC3D,MAAM,WAAW,SAAS,QAAQ;AAGlC,UAAO;IACL,MAHW,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;IAInE,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAI,aACR,yBAAyB,MAAM,WAC/B,gBACA,MACD;AAEH,SAAM,IAAI,aACR,uCACA,eACD;;;;;;;AAQP,eAAsB,WACpB,MACA,SACwB;AAExB,QADgB,IAAI,aAAa,CAClB,OAAO,MAAM,QAAQ"}
1
+ {"version":3,"file":"json.js","names":[],"sources":["../../../src/encoder/json.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * JSON encoder - converts JSON objects to File objects.\n */\nexport class JsonEncoder implements Encoder<object> {\n async encode(data: object, options?: UploadOptions): Promise<EncoderResult> {\n try {\n const json = JSON.stringify(data, null, 2);\n const blob = new Blob([json], { type: \"application/json\" });\n const filename = options?.name || \"data.json\";\n const file = new File([blob], filename, { type: \"application/json\" });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new EncoderError(\n `JSON encoding failed: ${error.message}`,\n \"INVALID_JSON\",\n error,\n );\n }\n throw new EncoderError(\n \"JSON encoding failed: unknown error\",\n \"INVALID_JSON\",\n );\n }\n }\n}\n\n/**\n * Encode a JSON object to a File object.\n */\nexport async function jsonToFile(\n data: object,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new JsonEncoder();\n return encoder.encode(data, options);\n}\n"],"mappings":";;;;;;AAMA,IAAa,cAAb,MAAoD;CAClD,MAAM,OAAO,MAAc,SAAiD;AAC1E,MAAI;GACF,MAAM,OAAO,KAAK,UAAU,MAAM,MAAM,EAAE;GAC1C,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,oBAAoB,CAAC;GAC3D,MAAM,WAAW,SAAS,QAAQ;AAGlC,UAAO;IACL,UAHe,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAG9D;IACJ,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAI,aACR,yBAAyB,MAAM,WAC/B,gBACA,MACD;AAEH,SAAM,IAAI,aACR,uCACA,eACD;;;;;;;AAQP,eAAsB,WACpB,MACA,SACwB;AAExB,QAAO,IADa,aACN,CAAC,OAAO,MAAM,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","names":[],"sources":["../../../src/encoder/text.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * Text encoder - converts text strings to File objects.\n */\nexport class TextEncoder implements Encoder<string> {\n async encode(data: string, options?: UploadOptions): Promise<EncoderResult> {\n try {\n const blob = new Blob([data], { type: \"text/plain\" });\n const filename = options?.name || \"data.txt\";\n const file = new File([blob], filename, { type: \"text/plain\" });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new EncoderError(\n `Text encoding failed: ${error.message}`,\n \"INVALID_TEXT\",\n error,\n );\n }\n throw new EncoderError(\n \"Text encoding failed: unknown error\",\n \"INVALID_TEXT\",\n );\n }\n }\n}\n\n/**\n * Encode a text string to a File object.\n */\nexport async function textToFile(\n data: string,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new TextEncoder();\n return encoder.encode(data, options);\n}\n"],"mappings":";;;;;;AAMA,IAAa,cAAb,MAAoD;CAClD,MAAM,OAAO,MAAc,SAAiD;AAC1E,MAAI;GACF,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;GACrD,MAAM,WAAW,SAAS,QAAQ;AAGlC,UAAO;IACL,MAHW,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;IAI7D,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAI,aACR,yBAAyB,MAAM,WAC/B,gBACA,MACD;AAEH,SAAM,IAAI,aACR,uCACA,eACD;;;;;;;AAQP,eAAsB,WACpB,MACA,SACwB;AAExB,QADgB,IAAI,aAAa,CAClB,OAAO,MAAM,QAAQ"}
1
+ {"version":3,"file":"text.js","names":[],"sources":["../../../src/encoder/text.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * Text encoder - converts text strings to File objects.\n */\nexport class TextEncoder implements Encoder<string> {\n async encode(data: string, options?: UploadOptions): Promise<EncoderResult> {\n try {\n const blob = new Blob([data], { type: \"text/plain\" });\n const filename = options?.name || \"data.txt\";\n const file = new File([blob], filename, { type: \"text/plain\" });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new EncoderError(\n `Text encoding failed: ${error.message}`,\n \"INVALID_TEXT\",\n error,\n );\n }\n throw new EncoderError(\n \"Text encoding failed: unknown error\",\n \"INVALID_TEXT\",\n );\n }\n }\n}\n\n/**\n * Encode a text string to a File object.\n */\nexport async function textToFile(\n data: string,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new TextEncoder();\n return encoder.encode(data, options);\n}\n"],"mappings":";;;;;;AAMA,IAAa,cAAb,MAAoD;CAClD,MAAM,OAAO,MAAc,SAAiD;AAC1E,MAAI;GACF,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;GACrD,MAAM,WAAW,SAAS,QAAQ;AAGlC,UAAO;IACL,UAHe,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAGxD;IACJ,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAI,aACR,yBAAyB,MAAM,WAC/B,gBACA,MACD;AAEH,SAAM,IAAI,aACR,uCACA,eACD;;;;;;;AAQP,eAAsB,WACpB,MACA,SACwB;AAExB,QAAO,IADa,aACN,CAAC,OAAO,MAAM,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","names":[],"sources":["../../../src/encoder/url.ts"],"sourcesContent":["import ky, { isHTTPError, isTimeoutError } from \"ky\";\nimport type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * URL encoder - fetches content from URLs and converts to File objects.\n */\nexport class UrlEncoder implements Encoder<string> {\n async encode(\n urlString: string,\n options?: UploadOptions,\n ): Promise<EncoderResult> {\n try {\n const blob = await ky(urlString, { fetch: options?.fetch }).blob();\n const filename =\n options?.name || new URL(urlString).pathname.split(\"/\").pop() || \"file\";\n const file = new File([blob], filename, { type: blob.type });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (isHTTPError(error) || isTimeoutError(error)) {\n throw new EncoderError(\n `URL encoding failed: ${error.message}`,\n \"NETWORK_ERROR\",\n error,\n );\n }\n\n if (error instanceof Error) {\n throw new EncoderError(\n `URL encoding failed: ${error.message}`,\n \"NETWORK_ERROR\",\n error,\n );\n }\n\n throw new EncoderError(\"URL encoding failed: unknown error\", \"UNKNOWN\");\n }\n }\n}\n\n/**\n * Encode a URL to a File object by fetching the content.\n */\nexport async function urlToFile(\n urlString: string,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new UrlEncoder();\n return encoder.encode(urlString, options);\n}\n"],"mappings":";;;;;;;AAOA,IAAa,aAAb,MAAmD;CACjD,MAAM,OACJ,WACA,SACwB;AACxB,MAAI;GACF,MAAM,OAAO,MAAM,GAAG,WAAW,EAAE,OAAO,SAAS,OAAO,CAAC,CAAC,MAAM;GAClE,MAAM,WACJ,SAAS,QAAQ,IAAI,IAAI,UAAU,CAAC,SAAS,MAAM,IAAI,CAAC,KAAK,IAAI;AAGnE,UAAO;IACL,MAHW,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAI1D,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,OAAI,YAAY,MAAM,IAAI,eAAe,MAAM,CAC7C,OAAM,IAAI,aACR,wBAAwB,MAAM,WAC9B,iBACA,MACD;AAGH,OAAI,iBAAiB,MACnB,OAAM,IAAI,aACR,wBAAwB,MAAM,WAC9B,iBACA,MACD;AAGH,SAAM,IAAI,aAAa,sCAAsC,UAAU;;;;;;;AAQ7E,eAAsB,UACpB,WACA,SACwB;AAExB,QADgB,IAAI,YAAY,CACjB,OAAO,WAAW,QAAQ"}
1
+ {"version":3,"file":"url.js","names":[],"sources":["../../../src/encoder/url.ts"],"sourcesContent":["import ky, { isHTTPError, isTimeoutError } from \"ky\";\nimport type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * URL encoder - fetches content from URLs and converts to File objects.\n */\nexport class UrlEncoder implements Encoder<string> {\n async encode(\n urlString: string,\n options?: UploadOptions,\n ): Promise<EncoderResult> {\n try {\n const blob = await ky(urlString, { fetch: options?.fetch }).blob();\n const filename =\n options?.name || new URL(urlString).pathname.split(\"/\").pop() || \"file\";\n const file = new File([blob], filename, { type: blob.type });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (isHTTPError(error) || isTimeoutError(error)) {\n throw new EncoderError(\n `URL encoding failed: ${error.message}`,\n \"NETWORK_ERROR\",\n error,\n );\n }\n\n if (error instanceof Error) {\n throw new EncoderError(\n `URL encoding failed: ${error.message}`,\n \"NETWORK_ERROR\",\n error,\n );\n }\n\n throw new EncoderError(\"URL encoding failed: unknown error\", \"UNKNOWN\");\n }\n }\n}\n\n/**\n * Encode a URL to a File object by fetching the content.\n */\nexport async function urlToFile(\n urlString: string,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new UrlEncoder();\n return encoder.encode(urlString, options);\n}\n"],"mappings":";;;;;;;AAOA,IAAa,aAAb,MAAmD;CACjD,MAAM,OACJ,WACA,SACwB;AACxB,MAAI;GACF,MAAM,OAAO,MAAM,GAAG,WAAW,EAAE,OAAO,SAAS,OAAO,CAAC,CAAC,MAAM;GAClE,MAAM,WACJ,SAAS,QAAQ,IAAI,IAAI,UAAU,CAAC,SAAS,MAAM,IAAI,CAAC,KAAK,IAAI;AAGnE,UAAO;IACL,UAHe,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAGrD;IACJ,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,OAAI,YAAY,MAAM,IAAI,eAAe,MAAM,CAC7C,OAAM,IAAI,aACR,wBAAwB,MAAM,WAC9B,iBACA,MACD;AAGH,OAAI,iBAAiB,MACnB,OAAM,IAAI,aACR,wBAAwB,MAAM,WAC9B,iBACA,MACD;AAGH,SAAM,IAAI,aAAa,sCAAsC,UAAU;;;;;;;AAQ7E,eAAsB,UACpB,WACA,SACwB;AAExB,QAAO,IADa,YACN,CAAC,OAAO,WAAW,QAAQ"}
@@ -1,6 +1,8 @@
1
1
  import { PinnerConfig } from "./config.js";
2
+ import { IpnsClient } from "./api/ipns.js";
3
+ import { WebsitesClient } from "./api/websites.js";
2
4
  import { UploadInput, UploadOperation, UploadOptions, UploadProgress, UploadResult } from "./types/upload.js";
3
- import { RemoteAddOptions, RemoteLsOptions, RemotePin, RemotePins } from "./types/pin.js";
5
+ import { AbortOptions, RemoteAddOptions, RemoteLsOptions, RemotePin, RemotePins } from "./types/pin.js";
4
6
  import { Pinner } from "./pinner.js";
5
7
  import { UploadManager } from "./upload/manager.js";
6
8
  import { CarPreprocessOptions, CarPreprocessResult, destroyCarPreprocessor, isCarFile, preprocessToCar } from "./upload/car.js";
@@ -9,8 +11,8 @@ import { isAuthenticationError, isRetryable } from "./types/type-guards.js";
9
11
  import { FILE_EXTENSION_CAR, MIME_TYPE_CAR, MIME_TYPE_OCTET_STREAM } from "./types/mime-types.js";
10
12
  import { UnstorageBlockstoreOptions, setDriverFactory } from "./blockstore/unstorage-base.js";
11
13
  import { createBlockstore, createDatastore } from "./blockstore/unstorage.js";
12
- import "./blockstore/index.js";
13
14
  import { asyncGeneratorToReadableStream, calculateStreamSize, readableStreamToAsyncIterable, streamToBlob } from "./utils/stream.js";
14
- import { pinataAdapter } from "./adapters/pinata/adapter.js";
15
- import "./adapters/pinata/index.js";
16
- export { AuthenticationError, type CarPreprocessOptions, type CarPreprocessResult, ConfigurationError, EmptyFileError, FILE_EXTENSION_CAR, MIME_TYPE_CAR, MIME_TYPE_OCTET_STREAM, NetworkError, NotFoundError, PinError, Pinner, type PinnerConfig, PinnerError, RateLimitError, type RemoteAddOptions, type RemoteLsOptions, type RemotePin, type RemotePins, TimeoutError, type UnstorageBlockstoreOptions, UploadError, type UploadInput, UploadManager, type UploadOperation, type UploadOptions, type UploadProgress, type UploadResult, ValidationError, asyncGeneratorToReadableStream, calculateStreamSize, createBlockstore, createDatastore, destroyCarPreprocessor, isAuthenticationError, isCarFile, isRetryable, pinataAdapter, preprocessToCar, readableStreamToAsyncIterable, setDriverFactory, streamToBlob };
15
+ import { PinataAdapter } from "./adapters/pinata/v2/adapter-interface.js";
16
+ import { pinataAdapter } from "./adapters/pinata/v2/adapter.js";
17
+ import { PinataLegacyAdapter, pinataLegacyAdapter } from "./adapters/pinata/legacy/adapter.js";
18
+ export { type AbortOptions, AuthenticationError, type CarPreprocessOptions, type CarPreprocessResult, ConfigurationError, EmptyFileError, FILE_EXTENSION_CAR, IpnsClient, MIME_TYPE_CAR, MIME_TYPE_OCTET_STREAM, NetworkError, NotFoundError, PinError, type PinataAdapter, type PinataLegacyAdapter, Pinner, type PinnerConfig, PinnerError, RateLimitError, type RemoteAddOptions, type RemoteLsOptions, type RemotePin, type RemotePins, TimeoutError, type UnstorageBlockstoreOptions, UploadError, type UploadInput, UploadManager, type UploadOperation, type UploadOptions, type UploadProgress, type UploadResult, ValidationError, WebsitesClient, asyncGeneratorToReadableStream, calculateStreamSize, createBlockstore, createDatastore, destroyCarPreprocessor, isAuthenticationError, isCarFile, isRetryable, pinataAdapter, pinataLegacyAdapter, preprocessToCar, readableStreamToAsyncIterable, setDriverFactory, streamToBlob };
package/dist/esm/index.js CHANGED
@@ -6,9 +6,12 @@ import "./blockstore/index.js";
6
6
  import { destroyCarPreprocessor, isCarFile, preprocessToCar } from "./upload/car.js";
7
7
  import { AuthenticationError, ConfigurationError, EmptyFileError, NetworkError, NotFoundError, PinError, PinnerError, RateLimitError, TimeoutError, UploadError, ValidationError } from "./errors/index.js";
8
8
  import { UploadManager } from "./upload/manager.js";
9
+ import { IpnsClient } from "./api/ipns.js";
10
+ import { WebsitesClient } from "./api/websites.js";
9
11
  import { Pinner } from "./pinner.js";
10
12
  import { isAuthenticationError, isRetryable } from "./types/type-guards.js";
11
- import { pinataAdapter } from "./adapters/pinata/adapter.js";
13
+ import { pinataAdapter } from "./adapters/pinata/v2/adapter.js";
14
+ import { pinataLegacyAdapter } from "./adapters/pinata/legacy/adapter.js";
12
15
  import "./adapters/pinata/index.js";
13
16
 
14
- export { AuthenticationError, ConfigurationError, EmptyFileError, FILE_EXTENSION_CAR, MIME_TYPE_CAR, MIME_TYPE_OCTET_STREAM, NetworkError, NotFoundError, PinError, Pinner, PinnerError, RateLimitError, TimeoutError, UploadError, UploadManager, ValidationError, asyncGeneratorToReadableStream, calculateStreamSize, createBlockstore, createDatastore, destroyCarPreprocessor, isAuthenticationError, isCarFile, isRetryable, pinataAdapter, preprocessToCar, readableStreamToAsyncIterable, setDriverFactory, streamToBlob };
17
+ export { AuthenticationError, ConfigurationError, EmptyFileError, FILE_EXTENSION_CAR, IpnsClient, MIME_TYPE_CAR, MIME_TYPE_OCTET_STREAM, NetworkError, NotFoundError, PinError, Pinner, PinnerError, RateLimitError, TimeoutError, UploadError, UploadManager, ValidationError, WebsitesClient, asyncGeneratorToReadableStream, calculateStreamSize, createBlockstore, createDatastore, destroyCarPreprocessor, isAuthenticationError, isCarFile, isRetryable, pinataAdapter, pinataLegacyAdapter, preprocessToCar, readableStreamToAsyncIterable, setDriverFactory, streamToBlob };
@@ -12,11 +12,12 @@ var PinClient = class {
12
12
  getClient() {
13
13
  if (this.client) return this.client;
14
14
  if (!this.config.jwt) throw new ConfigurationError("JWT token is required");
15
- this.client = new RemotePinningServiceClient(new Configuration({
15
+ const configuration = new Configuration({
16
16
  endpointUrl: this.config.endpoint,
17
17
  accessToken: this.config.jwt,
18
18
  fetchApi: this.config.fetch ?? fetch
19
- }));
19
+ });
20
+ this.client = new RemotePinningServiceClient(configuration);
20
21
  return this.client;
21
22
  }
22
23
  async *add(cid, options) {
@@ -63,13 +64,15 @@ var PinClient = class {
63
64
  }, { signal: options?.signal });
64
65
  }
65
66
  async *rm(cid, options) {
66
- const client = this.getClient();
67
- const response = await client.pinsGet({ cid: [cid.toString()] }, { signal: options?.signal });
67
+ const response = await this.getClient().pinsGet({ cid: [cid.toString()] }, { signal: options?.signal });
68
68
  await Promise.all([...response.results].map(async (result) => {
69
- return client.pinsRequestidDelete({ requestid: result.requestid }, { signal: options?.signal });
69
+ return this.rmByRequestId(result.requestid, options);
70
70
  }));
71
71
  yield cid;
72
72
  }
73
+ async rmByRequestId(requestId, options) {
74
+ await this.getClient().pinsRequestidDelete({ requestid: requestId }, { signal: options?.signal });
75
+ }
73
76
  mapResponse(response) {
74
77
  return {
75
78
  cid: CID.parse(response.pin.cid),
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../../../src/pin/client.ts"],"sourcesContent":["import {\n Configuration,\n type Pin,\n type PinStatus,\n RemotePinningServiceClient,\n} from \"@ipfs-shipyard/pinning-service-client\";\nimport type { PinnerConfig } from \"../config\";\nimport type {\n AbortOptions,\n RemoteAddOptions,\n RemoteLsOptions,\n RemotePin,\n RemotePins,\n} from \"@/types/pin\";\nimport { CID } from \"multiformats/cid\";\nimport { ConfigurationError, NotFoundError } from \"@/errors\";\n\nexport class PinClient implements RemotePins {\n private client: RemotePinningServiceClient | null = null;\n private config: PinnerConfig;\n\n constructor(config: PinnerConfig) {\n this.config = config;\n }\n\n protected getClient(): RemotePinningServiceClient {\n if (this.client) {\n return this.client;\n }\n\n if (!this.config.jwt) {\n throw new ConfigurationError(\"JWT token is required\");\n }\n\n const configuration = new Configuration({\n endpointUrl: this.config.endpoint,\n accessToken: this.config.jwt,\n fetchApi: this.config.fetch ?? fetch,\n });\n\n this.client = new RemotePinningServiceClient(configuration);\n return this.client;\n }\n\n async *add(\n cid: CID,\n options?: RemoteAddOptions,\n ): AsyncGenerator<CID, void, undefined> {\n const client = this.getClient();\n\n const pin: Pin = {\n cid: cid.toString(),\n name: options?.name,\n meta: options?.metadata,\n origins: options?.origins,\n };\n\n await client.pinsPost({ pin }, { signal: options?.signal });\n\n yield cid;\n }\n\n async *ls(\n options?: RemoteLsOptions,\n ): AsyncGenerator<RemotePin, void, undefined> {\n const client = this.getClient();\n const response = await client.pinsGet(this.normalizeListOptions(options), {\n signal: options?.signal,\n });\n\n for (const result of response.results) {\n yield this.mapResponse(result);\n }\n }\n\n async isPinned(cid: CID, options?: AbortOptions): Promise<boolean> {\n try {\n await this.get(cid, options);\n return true;\n } catch {\n return false;\n }\n }\n\n async get(cid: CID, options?: AbortOptions): Promise<RemotePin> {\n const client = this.getClient();\n const response = await client.pinsGet(\n { cid: [cid.toString()] },\n {\n signal: options?.signal,\n },\n );\n\n if (response.results.length === 0) {\n throw new NotFoundError(`Pin not found for CID: ${cid.toString()}`);\n }\n\n return this.mapResponse(response.results[0]);\n }\n\n async setMetadata(\n cid: CID,\n metadata: Record<string, string> | undefined,\n options?: AbortOptions,\n ): Promise<void> {\n const client = this.getClient();\n const response = await client.pinsGet(\n { cid: [cid.toString()] },\n {\n signal: options?.signal,\n },\n );\n\n if (response.results.length === 0) {\n throw new NotFoundError(`Pin not found for CID: ${cid.toString()}`);\n }\n\n const pin = response.results[0];\n await client.pinsRequestidPost(\n {\n requestid: pin.requestid,\n pin: {\n cid: pin.pin.cid,\n name: pin.pin.name,\n meta: metadata,\n origins: pin.pin.origins,\n },\n },\n { signal: options?.signal },\n );\n }\n\n async *rm(\n cid: CID,\n options?: AbortOptions,\n ): AsyncGenerator<CID, void, undefined> {\n const client = this.getClient();\n const response = await client.pinsGet(\n { cid: [cid.toString()] },\n { signal: options?.signal },\n );\n\n await Promise.all(\n [...response.results].map(async (result) => {\n return client.pinsRequestidDelete(\n { requestid: result.requestid },\n { signal: options?.signal },\n );\n }),\n );\n\n yield cid;\n }\n\n private mapResponse(response: PinStatus): RemotePin {\n return {\n cid: CID.parse(response.pin.cid),\n name: response.pin.name,\n status: response.status,\n created: response.created,\n size: response.pin.meta?.size\n ? parseInt(response.pin.meta.size, 10)\n : undefined,\n metadata: response.pin.meta,\n };\n }\n\n private normalizeListOptions(\n options?: RemoteLsOptions,\n ): Record<string, unknown> {\n const request: Record<string, unknown> = {};\n\n if (options?.limit !== undefined) {\n request.limit = options.limit;\n }\n if (options?.cursor !== undefined) {\n request.after = options.cursor;\n }\n if (options?.status !== undefined) {\n request.status = options.status;\n }\n if (options?.name !== undefined) {\n request.name = options.name;\n }\n\n return request;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../../src/pin/client.ts"],"sourcesContent":["import {\n Configuration,\n type Pin,\n type PinStatus,\n RemotePinningServiceClient,\n} from \"@ipfs-shipyard/pinning-service-client\";\nimport type { PinnerConfig } from \"../config\";\nimport type {\n AbortOptions,\n RemoteAddOptions,\n RemoteLsOptions,\n RemotePin,\n RemotePins,\n} from \"@/types/pin\";\nimport { CID } from \"multiformats/cid\";\nimport { ConfigurationError, NotFoundError } from \"@/errors\";\n\nexport class PinClient implements RemotePins {\n private client: RemotePinningServiceClient | null = null;\n private config: PinnerConfig;\n\n constructor(config: PinnerConfig) {\n this.config = config;\n }\n\n protected getClient(): RemotePinningServiceClient {\n if (this.client) {\n return this.client;\n }\n\n if (!this.config.jwt) {\n throw new ConfigurationError(\"JWT token is required\");\n }\n\n const configuration = new Configuration({\n endpointUrl: this.config.endpoint,\n accessToken: this.config.jwt,\n fetchApi: this.config.fetch ?? fetch,\n });\n\n this.client = new RemotePinningServiceClient(configuration);\n return this.client;\n }\n\n async *add(\n cid: CID,\n options?: RemoteAddOptions,\n ): AsyncGenerator<CID, void, undefined> {\n const client = this.getClient();\n\n const pin: Pin = {\n cid: cid.toString(),\n name: options?.name,\n meta: options?.metadata,\n origins: options?.origins,\n };\n\n await client.pinsPost({ pin }, { signal: options?.signal });\n\n yield cid;\n }\n\n async *ls(\n options?: RemoteLsOptions,\n ): AsyncGenerator<RemotePin, void, undefined> {\n const client = this.getClient();\n const response = await client.pinsGet(this.normalizeListOptions(options), {\n signal: options?.signal,\n });\n\n for (const result of response.results) {\n yield this.mapResponse(result);\n }\n }\n\n async isPinned(cid: CID, options?: AbortOptions): Promise<boolean> {\n try {\n await this.get(cid, options);\n return true;\n } catch {\n return false;\n }\n }\n\n async get(cid: CID, options?: AbortOptions): Promise<RemotePin> {\n const client = this.getClient();\n const response = await client.pinsGet(\n { cid: [cid.toString()] },\n {\n signal: options?.signal,\n },\n );\n\n if (response.results.length === 0) {\n throw new NotFoundError(`Pin not found for CID: ${cid.toString()}`);\n }\n\n return this.mapResponse(response.results[0]);\n }\n\n async setMetadata(\n cid: CID,\n metadata: Record<string, string> | undefined,\n options?: AbortOptions,\n ): Promise<void> {\n const client = this.getClient();\n const response = await client.pinsGet(\n { cid: [cid.toString()] },\n {\n signal: options?.signal,\n },\n );\n\n if (response.results.length === 0) {\n throw new NotFoundError(`Pin not found for CID: ${cid.toString()}`);\n }\n\n const pin = response.results[0];\n await client.pinsRequestidPost(\n {\n requestid: pin.requestid,\n pin: {\n cid: pin.pin.cid,\n name: pin.pin.name,\n meta: metadata,\n origins: pin.pin.origins,\n },\n },\n { signal: options?.signal },\n );\n }\n\n async *rm(\n cid: CID,\n options?: AbortOptions,\n ): AsyncGenerator<CID, void, undefined> {\n const client = this.getClient();\n const response = await client.pinsGet(\n { cid: [cid.toString()] },\n { signal: options?.signal },\n );\n\n // Delete all pins for this CID by their request IDs\n await Promise.all(\n [...response.results].map(async (result) => {\n return this.rmByRequestId(result.requestid, options);\n }),\n );\n\n yield cid;\n }\n\n async rmByRequestId(requestId: string, options?: AbortOptions): Promise<void> {\n const client = this.getClient();\n await client.pinsRequestidDelete(\n { requestid: requestId },\n { signal: options?.signal },\n );\n }\n\n private mapResponse(response: PinStatus): RemotePin {\n return {\n cid: CID.parse(response.pin.cid),\n name: response.pin.name,\n status: response.status,\n created: response.created,\n size: response.pin.meta?.size\n ? parseInt(response.pin.meta.size, 10)\n : undefined,\n metadata: response.pin.meta,\n };\n }\n\n private normalizeListOptions(\n options?: RemoteLsOptions,\n ): Record<string, unknown> {\n const request: Record<string, unknown> = {};\n\n if (options?.limit !== undefined) {\n request.limit = options.limit;\n }\n if (options?.cursor !== undefined) {\n request.after = options.cursor;\n }\n if (options?.status !== undefined) {\n request.status = options.status;\n }\n if (options?.name !== undefined) {\n request.name = options.name;\n }\n\n return request;\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import { PinnerConfig } from "./config.js";
2
+ import { IpnsClient } from "./api/ipns.js";
3
+ import { WebsitesClient } from "./api/websites.js";
2
4
  import { UploadOperation, UploadOptions, UploadResult } from "./types/upload.js";
3
5
  import { UploadMethodAndBuilder } from "./upload/builder.js";
4
6
  import { AbortOptions, RemoteAddOptions, RemoteLsOptions, RemotePin, RemotePins } from "./types/pin.js";
@@ -9,12 +11,22 @@ import { CID } from "multiformats/cid";
9
11
  declare class Pinner {
10
12
  private uploadManager;
11
13
  private _pins;
14
+ private _ipns;
15
+ private _websites;
12
16
  private _upload?;
13
17
  constructor(config: PinnerConfig);
14
18
  /**
15
19
  * Access the remote pins interface.
16
20
  */
17
21
  get pins(): RemotePins;
22
+ /**
23
+ * Access the IPNS interface for key management and publishing.
24
+ */
25
+ get ipns(): IpnsClient;
26
+ /**
27
+ * Access the websites interface for website configuration and management.
28
+ */
29
+ get websites(): WebsitesClient;
18
30
  /**
19
31
  * Upload interface that works as both a method and a builder namespace.
20
32
  *
@@ -67,6 +79,10 @@ declare class Pinner {
67
79
  * Remove a pin. The block may be deleted when garbage collection is run.
68
80
  */
69
81
  unpin(cid: string | CID, options?: AbortOptions): Promise<void>;
82
+ /**
83
+ * Remove a pin by request ID. The block may be deleted when garbage collection is run.
84
+ */
85
+ unpinByRequestId(requestId: string, options?: AbortOptions): Promise<void>;
70
86
  /**
71
87
  * Destroy the client and cleanup resources.
72
88
  */
@@ -3,16 +3,22 @@ import { createUploadBuilderNamespace } from "./upload/builder.js";
3
3
  import "./upload/index.js";
4
4
  import { PinClient } from "./pin/client.js";
5
5
  import "./pin/index.js";
6
+ import { IpnsClient } from "./api/ipns.js";
7
+ import { WebsitesClient } from "./api/websites.js";
6
8
  import { CID } from "multiformats/cid";
7
9
 
8
10
  //#region src/pinner.ts
9
11
  var Pinner = class {
10
12
  uploadManager;
11
13
  _pins;
14
+ _ipns;
15
+ _websites;
12
16
  _upload;
13
17
  constructor(config) {
14
18
  this.uploadManager = new UploadManager(config);
15
19
  this._pins = new PinClient(config);
20
+ this._ipns = new IpnsClient(config);
21
+ this._websites = new WebsitesClient(config);
16
22
  }
17
23
  /**
18
24
  * Access the remote pins interface.
@@ -21,6 +27,18 @@ var Pinner = class {
21
27
  return this._pins;
22
28
  }
23
29
  /**
30
+ * Access the IPNS interface for key management and publishing.
31
+ */
32
+ get ipns() {
33
+ return this._ipns;
34
+ }
35
+ /**
36
+ * Access the websites interface for website configuration and management.
37
+ */
38
+ get websites() {
39
+ return this._websites;
40
+ }
41
+ /**
24
42
  * Upload interface that works as both a method and a builder namespace.
25
43
  *
26
44
  * As a method: upload(file, options) -> UploadOperation
@@ -113,6 +131,12 @@ var Pinner = class {
113
131
  for await (const _ of generator);
114
132
  }
115
133
  /**
134
+ * Remove a pin by request ID. The block may be deleted when garbage collection is run.
135
+ */
136
+ async unpinByRequestId(requestId, options) {
137
+ return this.pins.rmByRequestId(requestId, options);
138
+ }
139
+ /**
116
140
  * Destroy the client and cleanup resources.
117
141
  */
118
142
  destroy() {
@@ -1 +1 @@
1
- {"version":3,"file":"pinner.js","names":[],"sources":["../../src/pinner.ts"],"sourcesContent":["import type { PinnerConfig } from \"./config\";\nimport { UploadManager } from \"./upload\";\nimport { PinClient } from \"./pin\";\nimport type { UploadMethodAndBuilder } from \"@/upload/builder\";\nimport { createUploadBuilderNamespace } from \"@/upload/builder\";\nimport type {\n UploadOperation,\n UploadOptions,\n UploadResult,\n} from \"@/types/upload\";\nimport type { OperationPollingOptions } from \"@lumeweb/portal-sdk\";\nimport type {\n AbortOptions,\n RemoteAddOptions,\n RemoteLsOptions,\n RemotePin,\n RemotePins,\n} from \"@/types/pin\";\nimport { CID } from \"multiformats/cid\";\n\nexport class Pinner {\n private uploadManager: UploadManager;\n private _pins: RemotePins;\n private _upload?: UploadMethodAndBuilder;\n\n constructor(config: PinnerConfig) {\n this.uploadManager = new UploadManager(config);\n this._pins = new PinClient(config);\n }\n\n /**\n * Access the remote pins interface.\n */\n get pins(): RemotePins {\n return this._pins;\n }\n\n /**\n * Upload interface that works as both a method and a builder namespace.\n *\n * As a method: upload(file, options) -> UploadOperation\n * As a property: upload.file(), upload.json(), etc. -> Builder\n */\n get upload(): UploadMethodAndBuilder {\n if (!this._upload) {\n const builderNamespace = createUploadBuilderNamespace(this);\n const uploadMethod = async (\n file: File,\n options?: UploadOptions,\n ): Promise<UploadOperation> => {\n return this.uploadManager.upload(file, options);\n };\n\n this._upload = new Proxy(uploadMethod, {\n get(target, prop) {\n if (prop in builderNamespace) {\n return Reflect.get(builderNamespace, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as UploadMethodAndBuilder;\n }\n return this._upload;\n }\n\n /**\n * Upload a file and wait for completion.\n * Convenience method for simple use cases where controls aren't needed.\n */\n async uploadAndWait(\n file: File,\n options?: UploadOptions,\n ): Promise<UploadResult> {\n const operation = await this.upload(file, options);\n return operation.result;\n }\n\n /**\n * Wait for an operation to complete or reach a settled state.\n * @param input Either an operation ID (number) or an UploadResult\n * @param options Polling options (interval, timeout, settledStates)\n * @returns UploadResult with operation status merged in\n */\n async waitForOperation(\n input: number | UploadResult,\n options?: OperationPollingOptions,\n ): Promise<UploadResult> {\n return this.uploadManager.waitForOperation(input, options);\n }\n\n /**\n * Upload a directory to IPFS.\n */\n async uploadDirectory(\n files: File[],\n options?: UploadOptions,\n ): Promise<UploadOperation> {\n return this.uploadManager.uploadDirectory(files, options);\n }\n\n /**\n * Upload a CAR file without preprocessing.\n * This is useful for passthrough of pre-generated CAR files.\n */\n async uploadCar(\n file: File | ReadableStream<Uint8Array>,\n options?: UploadOptions,\n ): Promise<UploadOperation> {\n return this.uploadManager.uploadCar(file, options);\n }\n\n /**\n * Pin existing content by CID.\n */\n async pinByHash(\n cid: string | CID,\n options?: RemoteAddOptions,\n ): Promise<AsyncGenerator<CID, void, undefined>> {\n const cidObj = typeof cid === \"string\" ? CID.parse(cid) : cid;\n return this.pins.add(cidObj, options);\n }\n\n /**\n * List pinned content.\n */\n async listPins(options?: RemoteLsOptions): Promise<RemotePin[]> {\n const pins: RemotePin[] = [];\n for await (const pin of this.pins.ls(options)) {\n pins.push(pin);\n }\n return pins;\n }\n\n /**\n * Get pin status.\n */\n async getPinStatus(cid: string | CID): Promise<RemotePin> {\n const cidObj = typeof cid === \"string\" ? CID.parse(cid) : cid;\n return this.pins.get(cidObj);\n }\n\n /**\n * Check if content is pinned.\n */\n async isPinned(cid: string | CID): Promise<boolean> {\n const cidObj = typeof cid === \"string\" ? CID.parse(cid) : cid;\n return this.pins.isPinned(cidObj);\n }\n\n /**\n * Update pin metadata.\n */\n async setPinMetadata(\n cid: string | CID,\n metadata: Record<string, string> | undefined,\n ): Promise<void> {\n const cidObj = typeof cid === \"string\" ? CID.parse(cid) : cid;\n return this.pins.setMetadata(cidObj, metadata);\n }\n\n /**\n * Remove a pin. The block may be deleted when garbage collection is run.\n */\n async unpin(cid: string | CID, options?: AbortOptions): Promise<void> {\n const cidObj = typeof cid === \"string\" ? CID.parse(cid) : cid;\n const generator = this.pins.rm(cidObj, options);\n for await (const _ of generator) {\n // Consume the generator to complete the unpin operation\n }\n }\n\n /**\n * Destroy the client and cleanup resources.\n */\n destroy(): void {\n this.uploadManager.destroy();\n }\n}\n"],"mappings":";;;;;;;;AAoBA,IAAa,SAAb,MAAoB;CAClB,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAY,QAAsB;AAChC,OAAK,gBAAgB,IAAI,cAAc,OAAO;AAC9C,OAAK,QAAQ,IAAI,UAAU,OAAO;;;;;CAMpC,IAAI,OAAmB;AACrB,SAAO,KAAK;;;;;;;;CASd,IAAI,SAAiC;AACnC,MAAI,CAAC,KAAK,SAAS;GACjB,MAAM,mBAAmB,6BAA6B,KAAK;GAC3D,MAAM,eAAe,OACnB,MACA,YAC6B;AAC7B,WAAO,KAAK,cAAc,OAAO,MAAM,QAAQ;;AAGjD,QAAK,UAAU,IAAI,MAAM,cAAc,EACrC,IAAI,QAAQ,MAAM;AAChB,QAAI,QAAQ,iBACV,QAAO,QAAQ,IAAI,kBAAkB,KAAK;AAE5C,WAAO,QAAQ,IAAI,QAAQ,KAAK;MAEnC,CAAC;;AAEJ,SAAO,KAAK;;;;;;CAOd,MAAM,cACJ,MACA,SACuB;AAEvB,UADkB,MAAM,KAAK,OAAO,MAAM,QAAQ,EACjC;;;;;;;;CASnB,MAAM,iBACJ,OACA,SACuB;AACvB,SAAO,KAAK,cAAc,iBAAiB,OAAO,QAAQ;;;;;CAM5D,MAAM,gBACJ,OACA,SAC0B;AAC1B,SAAO,KAAK,cAAc,gBAAgB,OAAO,QAAQ;;;;;;CAO3D,MAAM,UACJ,MACA,SAC0B;AAC1B,SAAO,KAAK,cAAc,UAAU,MAAM,QAAQ;;;;;CAMpD,MAAM,UACJ,KACA,SAC+C;EAC/C,MAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,GAAG;AAC1D,SAAO,KAAK,KAAK,IAAI,QAAQ,QAAQ;;;;;CAMvC,MAAM,SAAS,SAAiD;EAC9D,MAAM,OAAoB,EAAE;AAC5B,aAAW,MAAM,OAAO,KAAK,KAAK,GAAG,QAAQ,CAC3C,MAAK,KAAK,IAAI;AAEhB,SAAO;;;;;CAMT,MAAM,aAAa,KAAuC;EACxD,MAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,GAAG;AAC1D,SAAO,KAAK,KAAK,IAAI,OAAO;;;;;CAM9B,MAAM,SAAS,KAAqC;EAClD,MAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,GAAG;AAC1D,SAAO,KAAK,KAAK,SAAS,OAAO;;;;;CAMnC,MAAM,eACJ,KACA,UACe;EACf,MAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,GAAG;AAC1D,SAAO,KAAK,KAAK,YAAY,QAAQ,SAAS;;;;;CAMhD,MAAM,MAAM,KAAmB,SAAuC;EACpE,MAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,GAAG;EAC1D,MAAM,YAAY,KAAK,KAAK,GAAG,QAAQ,QAAQ;AAC/C,aAAW,MAAM,KAAK;;;;;CAQxB,UAAgB;AACd,OAAK,cAAc,SAAS"}
1
+ {"version":3,"file":"pinner.js","names":[],"sources":["../../src/pinner.ts"],"sourcesContent":["import type { PinnerConfig } from \"./config\";\nimport { UploadManager } from \"./upload\";\nimport { PinClient } from \"./pin\";\nimport { IpnsClient } from \"./api/ipns\";\nimport { WebsitesClient } from \"./api/websites\";\nimport type { UploadMethodAndBuilder } from \"@/upload/builder\";\nimport { createUploadBuilderNamespace } from \"@/upload/builder\";\nimport type {\n UploadOperation,\n UploadOptions,\n UploadResult,\n} from \"@/types/upload\";\nimport type { OperationPollingOptions } from \"@lumeweb/portal-sdk\";\nimport type {\n AbortOptions,\n RemoteAddOptions,\n RemoteLsOptions,\n RemotePin,\n RemotePins,\n} from \"@/types/pin\";\nimport { CID } from \"multiformats/cid\";\n\nexport class Pinner {\n private uploadManager: UploadManager;\n private _pins: RemotePins;\n private _ipns: IpnsClient;\n private _websites: WebsitesClient;\n private _upload?: UploadMethodAndBuilder;\n\n constructor(config: PinnerConfig) {\n this.uploadManager = new UploadManager(config);\n this._pins = new PinClient(config);\n this._ipns = new IpnsClient(config);\n this._websites = new WebsitesClient(config);\n }\n\n /**\n * Access the remote pins interface.\n */\n get pins(): RemotePins {\n return this._pins;\n }\n\n /**\n * Access the IPNS interface for key management and publishing.\n */\n get ipns(): IpnsClient {\n return this._ipns;\n }\n\n /**\n * Access the websites interface for website configuration and management.\n */\n get websites(): WebsitesClient {\n return this._websites;\n }\n\n /**\n * Upload interface that works as both a method and a builder namespace.\n *\n * As a method: upload(file, options) -> UploadOperation\n * As a property: upload.file(), upload.json(), etc. -> Builder\n */\n get upload(): UploadMethodAndBuilder {\n if (!this._upload) {\n const builderNamespace = createUploadBuilderNamespace(this);\n const uploadMethod = async (\n file: File,\n options?: UploadOptions,\n ): Promise<UploadOperation> => {\n return this.uploadManager.upload(file, options);\n };\n\n this._upload = new Proxy(uploadMethod, {\n get(target, prop) {\n if (prop in builderNamespace) {\n return Reflect.get(builderNamespace, prop);\n }\n return Reflect.get(target, prop);\n },\n }) as UploadMethodAndBuilder;\n }\n return this._upload;\n }\n\n /**\n * Upload a file and wait for completion.\n * Convenience method for simple use cases where controls aren't needed.\n */\n async uploadAndWait(\n file: File,\n options?: UploadOptions,\n ): Promise<UploadResult> {\n const operation = await this.upload(file, options);\n return operation.result;\n }\n\n /**\n * Wait for an operation to complete or reach a settled state.\n * @param input Either an operation ID (number) or an UploadResult\n * @param options Polling options (interval, timeout, settledStates)\n * @returns UploadResult with operation status merged in\n */\n async waitForOperation(\n input: number | UploadResult,\n options?: OperationPollingOptions,\n ): Promise<UploadResult> {\n return this.uploadManager.waitForOperation(input, options);\n }\n\n /**\n * Upload a directory to IPFS.\n */\n async uploadDirectory(\n files: File[],\n options?: UploadOptions,\n ): Promise<UploadOperation> {\n return this.uploadManager.uploadDirectory(files, options);\n }\n\n /**\n * Upload a CAR file without preprocessing.\n * This is useful for passthrough of pre-generated CAR files.\n */\n async uploadCar(\n file: File | ReadableStream<Uint8Array>,\n options?: UploadOptions,\n ): Promise<UploadOperation> {\n return this.uploadManager.uploadCar(file, options);\n }\n\n /**\n * Pin existing content by CID.\n */\n async pinByHash(\n cid: string | CID,\n options?: RemoteAddOptions,\n ): Promise<AsyncGenerator<CID, void, undefined>> {\n const cidObj = typeof cid === \"string\" ? CID.parse(cid) : cid;\n return this.pins.add(cidObj, options);\n }\n\n /**\n * List pinned content.\n */\n async listPins(options?: RemoteLsOptions): Promise<RemotePin[]> {\n const pins: RemotePin[] = [];\n for await (const pin of this.pins.ls(options)) {\n pins.push(pin);\n }\n return pins;\n }\n\n /**\n * Get pin status.\n */\n async getPinStatus(cid: string | CID): Promise<RemotePin> {\n const cidObj = typeof cid === \"string\" ? CID.parse(cid) : cid;\n return this.pins.get(cidObj);\n }\n\n /**\n * Check if content is pinned.\n */\n async isPinned(cid: string | CID): Promise<boolean> {\n const cidObj = typeof cid === \"string\" ? CID.parse(cid) : cid;\n return this.pins.isPinned(cidObj);\n }\n\n /**\n * Update pin metadata.\n */\n async setPinMetadata(\n cid: string | CID,\n metadata: Record<string, string> | undefined,\n ): Promise<void> {\n const cidObj = typeof cid === \"string\" ? CID.parse(cid) : cid;\n return this.pins.setMetadata(cidObj, metadata);\n }\n\n /**\n * Remove a pin. The block may be deleted when garbage collection is run.\n */\n async unpin(cid: string | CID, options?: AbortOptions): Promise<void> {\n const cidObj = typeof cid === \"string\" ? CID.parse(cid) : cid;\n const generator = this.pins.rm(cidObj, options);\n for await (const _ of generator) {\n // Consume the generator to complete the unpin operation\n }\n }\n\n /**\n * Remove a pin by request ID. The block may be deleted when garbage collection is run.\n */\n async unpinByRequestId(requestId: string, options?: AbortOptions): Promise<void> {\n return this.pins.rmByRequestId(requestId, options);\n }\n\n /**\n * Destroy the client and cleanup resources.\n */\n destroy(): void {\n this.uploadManager.destroy();\n }\n}\n"],"mappings":";;;;;;;;;;AAsBA,IAAa,SAAb,MAAoB;CAClB,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAY,QAAsB;AAChC,OAAK,gBAAgB,IAAI,cAAc,OAAO;AAC9C,OAAK,QAAQ,IAAI,UAAU,OAAO;AAClC,OAAK,QAAQ,IAAI,WAAW,OAAO;AACnC,OAAK,YAAY,IAAI,eAAe,OAAO;;;;;CAM7C,IAAI,OAAmB;AACrB,SAAO,KAAK;;;;;CAMd,IAAI,OAAmB;AACrB,SAAO,KAAK;;;;;CAMd,IAAI,WAA2B;AAC7B,SAAO,KAAK;;;;;;;;CASd,IAAI,SAAiC;AACnC,MAAI,CAAC,KAAK,SAAS;GACjB,MAAM,mBAAmB,6BAA6B,KAAK;GAC3D,MAAM,eAAe,OACnB,MACA,YAC6B;AAC7B,WAAO,KAAK,cAAc,OAAO,MAAM,QAAQ;;AAGjD,QAAK,UAAU,IAAI,MAAM,cAAc,EACrC,IAAI,QAAQ,MAAM;AAChB,QAAI,QAAQ,iBACV,QAAO,QAAQ,IAAI,kBAAkB,KAAK;AAE5C,WAAO,QAAQ,IAAI,QAAQ,KAAK;MAEnC,CAAC;;AAEJ,SAAO,KAAK;;;;;;CAOd,MAAM,cACJ,MACA,SACuB;AAEvB,UAAO,MADiB,KAAK,OAAO,MAAM,QAAQ,EACjC;;;;;;;;CASnB,MAAM,iBACJ,OACA,SACuB;AACvB,SAAO,KAAK,cAAc,iBAAiB,OAAO,QAAQ;;;;;CAM5D,MAAM,gBACJ,OACA,SAC0B;AAC1B,SAAO,KAAK,cAAc,gBAAgB,OAAO,QAAQ;;;;;;CAO3D,MAAM,UACJ,MACA,SAC0B;AAC1B,SAAO,KAAK,cAAc,UAAU,MAAM,QAAQ;;;;;CAMpD,MAAM,UACJ,KACA,SAC+C;EAC/C,MAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,GAAG;AAC1D,SAAO,KAAK,KAAK,IAAI,QAAQ,QAAQ;;;;;CAMvC,MAAM,SAAS,SAAiD;EAC9D,MAAM,OAAoB,EAAE;AAC5B,aAAW,MAAM,OAAO,KAAK,KAAK,GAAG,QAAQ,CAC3C,MAAK,KAAK,IAAI;AAEhB,SAAO;;;;;CAMT,MAAM,aAAa,KAAuC;EACxD,MAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,GAAG;AAC1D,SAAO,KAAK,KAAK,IAAI,OAAO;;;;;CAM9B,MAAM,SAAS,KAAqC;EAClD,MAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,GAAG;AAC1D,SAAO,KAAK,KAAK,SAAS,OAAO;;;;;CAMnC,MAAM,eACJ,KACA,UACe;EACf,MAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,GAAG;AAC1D,SAAO,KAAK,KAAK,YAAY,QAAQ,SAAS;;;;;CAMhD,MAAM,MAAM,KAAmB,SAAuC;EACpE,MAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI,GAAG;EAC1D,MAAM,YAAY,KAAK,KAAK,GAAG,QAAQ,QAAQ;AAC/C,aAAW,MAAM,KAAK;;;;;CAQxB,MAAM,iBAAiB,WAAmB,SAAuC;AAC/E,SAAO,KAAK,KAAK,cAAc,WAAW,QAAQ;;;;;CAMpD,UAAgB;AACd,OAAK,cAAc,SAAS"}
@@ -2,7 +2,11 @@
2
2
  /**
3
3
  * Default API endpoint URL for the pinning service.
4
4
  */
5
- const DEFAULT_ENDPOINT = "https://api.lumeweb.com";
5
+ const DEFAULT_ENDPOINT = "https://ipfs.pinner.xyz";
6
+ /**
7
+ * Default IPFS gateway URL for content retrieval.
8
+ */
9
+ const DEFAULT_GATEWAY = "https://dweb.link";
6
10
  /**
7
11
  * Default TUS upload size threshold (100MB).
8
12
  * Files larger than this will use TUS protocol for resumable uploads.
@@ -25,5 +29,5 @@ const DEFAULT_BLOCKSTORE_BASE = "pinner:";
25
29
  const DEFAULT_BLOCKSTORE_FS_BASE = "./.pinner-blocks";
26
30
 
27
31
  //#endregion
28
- export { DEFAULT_BLOCKSTORE_BASE, DEFAULT_BLOCKSTORE_FS_BASE, DEFAULT_BLOCKSTORE_PREFIX, DEFAULT_ENDPOINT, TUS_SIZE_THRESHOLD };
32
+ export { DEFAULT_BLOCKSTORE_BASE, DEFAULT_BLOCKSTORE_FS_BASE, DEFAULT_BLOCKSTORE_PREFIX, DEFAULT_ENDPOINT, DEFAULT_GATEWAY, TUS_SIZE_THRESHOLD };
29
33
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":[],"sources":["../../../src/types/constants.ts"],"sourcesContent":["/**\n * Default API endpoint URL for the pinning service.\n */\nexport const DEFAULT_ENDPOINT = \"https://api.lumeweb.com\";\n\n/**\n * Default IPFS gateway URL for content retrieval.\n */\nexport const DEFAULT_GATEWAY = \"https://gateway.lumeweb.com\";\n\n/**\n * Default TUS upload size threshold (100MB).\n * Files larger than this will use TUS protocol for resumable uploads.\n */\nexport const TUS_SIZE_THRESHOLD = 100 * 1024 * 1024;\n\n/**\n * Default base path for Helia datastore storage.\n */\nexport const DEFAULT_DATASTORE_BASE = \"pinner-helia-data\";\n\n/**\n * Default key prefix for blockstore keys.\n * This is prepended to CID strings in storage keys.\n */\nexport const DEFAULT_BLOCKSTORE_PREFIX = \"pinner-helia-blocks\";\n\n/**\n * Default base path for blockstore storage driver.\n * For IndexedDB: \"pinner:\" - the database name prefix\n * For filesystem: \"./.pinner-blocks\" - the directory path\n */\nexport const DEFAULT_BLOCKSTORE_BASE = \"pinner:\";\n\n/**\n * Default base path for blockstore filesystem storage driver (Node.js).\n */\nexport const DEFAULT_BLOCKSTORE_FS_BASE = \"./.pinner-blocks\";\n\n/**\n * Default base path for datastore filesystem storage driver (Node.js).\n */\nexport const DEFAULT_DATASTORE_FS_BASE = \"./.pinner-data\";\n"],"mappings":";;;;AAGA,MAAa,mBAAmB;;;;;AAWhC,MAAa,qBAAqB,MAAM,OAAO;;;;;AAW/C,MAAa,4BAA4B;;;;;;AAOzC,MAAa,0BAA0B;;;;AAKvC,MAAa,6BAA6B"}
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../../../src/types/constants.ts"],"sourcesContent":["/**\n * Default API endpoint URL for the pinning service.\n */\nexport const DEFAULT_ENDPOINT = \"https://ipfs.pinner.xyz\";\n\n/**\n * Default IPFS gateway URL for content retrieval.\n */\nexport const DEFAULT_GATEWAY = \"https://dweb.link\";\n\n/**\n * Default TUS upload size threshold (100MB).\n * Files larger than this will use TUS protocol for resumable uploads.\n */\nexport const TUS_SIZE_THRESHOLD = 100 * 1024 * 1024;\n\n/**\n * Default base path for Helia datastore storage.\n */\nexport const DEFAULT_DATASTORE_BASE = \"pinner-helia-data\";\n\n/**\n * Default key prefix for blockstore keys.\n * This is prepended to CID strings in storage keys.\n */\nexport const DEFAULT_BLOCKSTORE_PREFIX = \"pinner-helia-blocks\";\n\n/**\n * Default base path for blockstore storage driver.\n * For IndexedDB: \"pinner:\" - the database name prefix\n * For filesystem: \"./.pinner-blocks\" - the directory path\n */\nexport const DEFAULT_BLOCKSTORE_BASE = \"pinner:\";\n\n/**\n * Default base path for blockstore filesystem storage driver (Node.js).\n */\nexport const DEFAULT_BLOCKSTORE_FS_BASE = \"./.pinner-blocks\";\n\n/**\n * Default base path for datastore filesystem storage driver (Node.js).\n */\nexport const DEFAULT_DATASTORE_FS_BASE = \"./.pinner-data\";\n"],"mappings":";;;;AAGA,MAAa,mBAAmB;;;;AAKhC,MAAa,kBAAkB;;;;;AAM/B,MAAa,qBAAqB,MAAM,OAAO;;;;;AAW/C,MAAa,4BAA4B;;;;;;AAOzC,MAAa,0BAA0B;;;;AAKvC,MAAa,6BAA6B"}
@@ -2,7 +2,6 @@ import { CID } from "multiformats/cid";
2
2
  import { Status } from "@ipfs-shipyard/pinning-service-client";
3
3
 
4
4
  //#region src/types/pin.d.ts
5
-
6
5
  /**
7
6
  * Options that can be passed to abort async operations
8
7
  */
@@ -68,6 +67,10 @@ interface RemotePins {
68
67
  * Remove a pin. The block may be deleted when garbage collection is run.
69
68
  */
70
69
  rm(cid: CID, options?: AbortOptions): AsyncGenerator<CID, void, undefined>;
70
+ /**
71
+ * Remove a pin by request ID. The block may be deleted when garbage collection is run.
72
+ */
73
+ rmByRequestId(requestId: string, options?: AbortOptions): Promise<void>;
71
74
  }
72
75
  //#endregion
73
76
  export { AbortOptions, RemoteAddOptions, RemoteLsOptions, RemotePin, RemotePins };
@@ -1,7 +1,6 @@
1
1
  import { PinnerError } from "../errors/index.js";
2
2
 
3
3
  //#region src/types/type-guards.d.ts
4
-
5
4
  /**
6
5
  * Check if error is retryable.
7
6
  */
@@ -1,7 +1,6 @@
1
1
  import { OperationPollingOptions } from "@lumeweb/portal-sdk";
2
2
 
3
3
  //#region src/types/upload.d.ts
4
-
5
4
  /**
6
5
  * Symbol used to brand UploadResult for type checking
7
6
  */