@fragno-dev/upload 0.1.1 → 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 (301) hide show
  1. package/README.md +148 -12
  2. package/dist/browser/client/clients.js +17 -9
  3. package/dist/browser/client/clients.js.map +1 -1
  4. package/dist/browser/client/helpers.d.ts +15 -6
  5. package/dist/browser/client/helpers.d.ts.map +1 -1
  6. package/dist/browser/client/helpers.js +176 -30
  7. package/dist/browser/client/helpers.js.map +1 -1
  8. package/dist/browser/client/node_modules/.pnpm/{@nanostores_query@0.3.4_nanostores@1.1.0 → @nanostores_query@0.3.4_nanostores@1.2.0}/node_modules/@nanostores/query/dist/nanoquery.js +6 -6
  9. package/dist/browser/client/node_modules/.pnpm/{@nanostores_query@0.3.4_nanostores@1.1.0 → @nanostores_query@0.3.4_nanostores@1.2.0}/node_modules/@nanostores/query/dist/nanoquery.js.map +1 -1
  10. package/dist/browser/client/node_modules/.pnpm/{@nanostores_solid@1.1.1_nanostores@1.1.0_solid-js@1.9.10 → @nanostores_solid@1.1.1_nanostores@1.2.0_solid-js@1.9.10}/node_modules/@nanostores/solid/dist/index.js +2 -2
  11. package/dist/browser/client/node_modules/.pnpm/{@nanostores_solid@1.1.1_nanostores@1.1.0_solid-js@1.9.10 → @nanostores_solid@1.1.1_nanostores@1.2.0_solid-js@1.9.10}/node_modules/@nanostores/solid/dist/index.js.map +1 -1
  12. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/atom/index.js +2 -1
  13. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/atom/index.js.map +1 -0
  14. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/clean-stores/index.js +6 -0
  15. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/clean-stores/index.js.map +1 -1
  16. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/computed/index.js +8 -5
  17. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/computed/index.js.map +1 -0
  18. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/lifecycle/index.js +1 -1
  19. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/lifecycle/index.js.map +1 -1
  20. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/listen-keys/index.js +1 -1
  21. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/listen-keys/index.js.map +1 -1
  22. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/map/index.js +1 -1
  23. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/map/index.js.map +1 -1
  24. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/task/index.js +1 -1
  25. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/task/index.js.map +1 -1
  26. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/warn/index.js +16 -0
  27. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/warn/index.js.map +1 -0
  28. package/dist/browser/client/packages/fragment-upload/src/definition.js +1 -42
  29. package/dist/browser/client/packages/fragment-upload/src/definition.js.map +1 -1
  30. package/dist/browser/client/packages/fragment-upload/src/routes/files.js +12 -5
  31. package/dist/browser/client/packages/fragment-upload/src/routes/files.js.map +1 -1
  32. package/dist/browser/client/packages/fragment-upload/src/routes/shared.js +3 -4
  33. package/dist/browser/client/packages/fragment-upload/src/routes/shared.js.map +1 -1
  34. package/dist/browser/client/packages/fragment-upload/src/routes/uploads.js +32 -21
  35. package/dist/browser/client/packages/fragment-upload/src/routes/uploads.js.map +1 -1
  36. package/dist/browser/client/packages/fragment-upload/src/schema.js +33 -3
  37. package/dist/browser/client/packages/fragment-upload/src/schema.js.map +1 -1
  38. package/dist/browser/client/packages/fragment-upload/src/types.d.ts +1 -2
  39. package/dist/browser/client/packages/fragment-upload/src/types.d.ts.map +1 -1
  40. package/dist/browser/client/packages/fragno/dist/client/client.js +28 -12
  41. package/dist/browser/client/packages/fragno/dist/client/client.js.map +1 -1
  42. package/dist/browser/client/packages/fragno/dist/client/client.svelte.js +11 -3
  43. package/dist/browser/client/packages/fragno/dist/client/client.svelte.js.map +1 -1
  44. package/dist/browser/client/packages/fragno/dist/client/react.js +104 -12
  45. package/dist/browser/client/packages/fragno/dist/client/react.js.map +1 -1
  46. package/dist/browser/client/packages/fragno/dist/client/solid.js +25 -11
  47. package/dist/browser/client/packages/fragno/dist/client/solid.js.map +1 -1
  48. package/dist/browser/client/packages/fragno/dist/client/vanilla.js +21 -1
  49. package/dist/browser/client/packages/fragno/dist/client/vanilla.js.map +1 -1
  50. package/dist/browser/client/packages/fragno/dist/client/vue.js +19 -11
  51. package/dist/browser/client/packages/fragno/dist/client/vue.js.map +1 -1
  52. package/dist/browser/client/react.d.ts +215 -192
  53. package/dist/browser/client/react.d.ts.map +1 -1
  54. package/dist/browser/client/react.js.map +1 -1
  55. package/dist/browser/client/solid.d.ts +218 -196
  56. package/dist/browser/client/solid.d.ts.map +1 -1
  57. package/dist/browser/client/solid.js.map +1 -1
  58. package/dist/browser/client/svelte.d.ts +216 -193
  59. package/dist/browser/client/svelte.d.ts.map +1 -1
  60. package/dist/browser/client/svelte.js.map +1 -1
  61. package/dist/browser/client/vanilla.d.ts +217 -195
  62. package/dist/browser/client/vanilla.d.ts.map +1 -1
  63. package/dist/browser/client/vanilla.js.map +1 -1
  64. package/dist/browser/client/vue.d.ts +217 -194
  65. package/dist/browser/client/vue.d.ts.map +1 -1
  66. package/dist/browser/client/vue.js.map +1 -1
  67. package/dist/cli/commands/files/delete.d.ts +4 -4
  68. package/dist/cli/commands/files/delete.d.ts.map +1 -1
  69. package/dist/cli/commands/files/delete.js +8 -10
  70. package/dist/cli/commands/files/delete.js.map +1 -1
  71. package/dist/cli/commands/files/download-url.d.ts +4 -4
  72. package/dist/cli/commands/files/download-url.d.ts.map +1 -1
  73. package/dist/cli/commands/files/download-url.js +8 -10
  74. package/dist/cli/commands/files/download-url.js.map +1 -1
  75. package/dist/cli/commands/files/download.d.ts +4 -4
  76. package/dist/cli/commands/files/download.d.ts.map +1 -1
  77. package/dist/cli/commands/files/download.js +10 -12
  78. package/dist/cli/commands/files/download.js.map +1 -1
  79. package/dist/cli/commands/files/get.d.ts +4 -4
  80. package/dist/cli/commands/files/get.d.ts.map +1 -1
  81. package/dist/cli/commands/files/get.js +8 -10
  82. package/dist/cli/commands/files/get.js.map +1 -1
  83. package/dist/cli/commands/files/list.d.ts +4 -4
  84. package/dist/cli/commands/files/list.d.ts.map +1 -1
  85. package/dist/cli/commands/files/list.js +6 -8
  86. package/dist/cli/commands/files/list.js.map +1 -1
  87. package/dist/cli/commands/files/update.d.ts +4 -4
  88. package/dist/cli/commands/files/update.d.ts.map +1 -1
  89. package/dist/cli/commands/files/update.js +8 -10
  90. package/dist/cli/commands/files/update.js.map +1 -1
  91. package/dist/cli/commands/files/upload.d.ts +4 -4
  92. package/dist/cli/commands/files/upload.d.ts.map +1 -1
  93. package/dist/cli/commands/files/upload.js +10 -12
  94. package/dist/cli/commands/files/upload.js.map +1 -1
  95. package/dist/cli/commands/uploads/abort.d.ts +2 -2
  96. package/dist/cli/commands/uploads/abort.d.ts.map +1 -1
  97. package/dist/cli/commands/uploads/abort.js.map +1 -1
  98. package/dist/cli/commands/uploads/complete.d.ts +2 -2
  99. package/dist/cli/commands/uploads/complete.d.ts.map +1 -1
  100. package/dist/cli/commands/uploads/complete.js.map +1 -1
  101. package/dist/cli/commands/uploads/content.d.ts +2 -2
  102. package/dist/cli/commands/uploads/content.d.ts.map +1 -1
  103. package/dist/cli/commands/uploads/content.js +1 -1
  104. package/dist/cli/commands/uploads/content.js.map +1 -1
  105. package/dist/cli/commands/uploads/create.d.ts +4 -4
  106. package/dist/cli/commands/uploads/create.d.ts.map +1 -1
  107. package/dist/cli/commands/uploads/create.js +8 -11
  108. package/dist/cli/commands/uploads/create.js.map +1 -1
  109. package/dist/cli/commands/uploads/get.d.ts +2 -2
  110. package/dist/cli/commands/uploads/get.d.ts.map +1 -1
  111. package/dist/cli/commands/uploads/get.js.map +1 -1
  112. package/dist/cli/commands/uploads/parts-complete.d.ts +2 -2
  113. package/dist/cli/commands/uploads/parts-complete.d.ts.map +1 -1
  114. package/dist/cli/commands/uploads/parts-complete.js.map +1 -1
  115. package/dist/cli/commands/uploads/parts-list.d.ts +2 -2
  116. package/dist/cli/commands/uploads/parts-list.d.ts.map +1 -1
  117. package/dist/cli/commands/uploads/parts-list.js.map +1 -1
  118. package/dist/cli/commands/uploads/parts-urls.d.ts +2 -2
  119. package/dist/cli/commands/uploads/parts-urls.d.ts.map +1 -1
  120. package/dist/cli/commands/uploads/parts-urls.js.map +1 -1
  121. package/dist/cli/commands/uploads/progress.d.ts +2 -2
  122. package/dist/cli/commands/uploads/progress.d.ts.map +1 -1
  123. package/dist/cli/commands/uploads/progress.js.map +1 -1
  124. package/dist/cli/commands/uploads/transfer.d.ts +4 -4
  125. package/dist/cli/commands/uploads/transfer.d.ts.map +1 -1
  126. package/dist/cli/commands/uploads/transfer.js +9 -12
  127. package/dist/cli/commands/uploads/transfer.js.map +1 -1
  128. package/dist/cli/index.d.ts +13 -13
  129. package/dist/cli/index.d.ts.map +1 -1
  130. package/dist/cli/index.js +14 -14
  131. package/dist/cli/index.js.map +1 -1
  132. package/dist/cli/utils/client.js +22 -5
  133. package/dist/cli/utils/client.js.map +1 -1
  134. package/dist/cli/utils/options.js +7 -43
  135. package/dist/cli/utils/options.js.map +1 -1
  136. package/dist/node/cli/commands/files/delete.d.ts +4 -4
  137. package/dist/node/cli/commands/files/delete.d.ts.map +1 -1
  138. package/dist/node/cli/commands/files/delete.js +8 -10
  139. package/dist/node/cli/commands/files/delete.js.map +1 -1
  140. package/dist/node/cli/commands/files/download-url.d.ts +4 -4
  141. package/dist/node/cli/commands/files/download-url.d.ts.map +1 -1
  142. package/dist/node/cli/commands/files/download-url.js +8 -10
  143. package/dist/node/cli/commands/files/download-url.js.map +1 -1
  144. package/dist/node/cli/commands/files/download.d.ts +4 -4
  145. package/dist/node/cli/commands/files/download.d.ts.map +1 -1
  146. package/dist/node/cli/commands/files/download.js +9 -11
  147. package/dist/node/cli/commands/files/download.js.map +1 -1
  148. package/dist/node/cli/commands/files/get.d.ts +4 -4
  149. package/dist/node/cli/commands/files/get.d.ts.map +1 -1
  150. package/dist/node/cli/commands/files/get.js +8 -10
  151. package/dist/node/cli/commands/files/get.js.map +1 -1
  152. package/dist/node/cli/commands/files/list.d.ts +4 -4
  153. package/dist/node/cli/commands/files/list.d.ts.map +1 -1
  154. package/dist/node/cli/commands/files/list.js +6 -8
  155. package/dist/node/cli/commands/files/list.js.map +1 -1
  156. package/dist/node/cli/commands/files/update.d.ts +4 -4
  157. package/dist/node/cli/commands/files/update.d.ts.map +1 -1
  158. package/dist/node/cli/commands/files/update.js +8 -10
  159. package/dist/node/cli/commands/files/update.js.map +1 -1
  160. package/dist/node/cli/commands/files/upload.d.ts +4 -4
  161. package/dist/node/cli/commands/files/upload.d.ts.map +1 -1
  162. package/dist/node/cli/commands/files/upload.js +9 -11
  163. package/dist/node/cli/commands/files/upload.js.map +1 -1
  164. package/dist/node/cli/commands/uploads/abort.d.ts +2 -2
  165. package/dist/node/cli/commands/uploads/abort.d.ts.map +1 -1
  166. package/dist/node/cli/commands/uploads/abort.js.map +1 -1
  167. package/dist/node/cli/commands/uploads/complete.d.ts +2 -2
  168. package/dist/node/cli/commands/uploads/complete.d.ts.map +1 -1
  169. package/dist/node/cli/commands/uploads/complete.js.map +1 -1
  170. package/dist/node/cli/commands/uploads/content.d.ts +2 -2
  171. package/dist/node/cli/commands/uploads/content.d.ts.map +1 -1
  172. package/dist/node/cli/commands/uploads/content.js.map +1 -1
  173. package/dist/node/cli/commands/uploads/create.d.ts +4 -4
  174. package/dist/node/cli/commands/uploads/create.d.ts.map +1 -1
  175. package/dist/node/cli/commands/uploads/create.js +8 -11
  176. package/dist/node/cli/commands/uploads/create.js.map +1 -1
  177. package/dist/node/cli/commands/uploads/get.d.ts +2 -2
  178. package/dist/node/cli/commands/uploads/get.d.ts.map +1 -1
  179. package/dist/node/cli/commands/uploads/get.js.map +1 -1
  180. package/dist/node/cli/commands/uploads/parts-complete.d.ts +2 -2
  181. package/dist/node/cli/commands/uploads/parts-complete.d.ts.map +1 -1
  182. package/dist/node/cli/commands/uploads/parts-complete.js.map +1 -1
  183. package/dist/node/cli/commands/uploads/parts-list.d.ts +2 -2
  184. package/dist/node/cli/commands/uploads/parts-list.d.ts.map +1 -1
  185. package/dist/node/cli/commands/uploads/parts-list.js.map +1 -1
  186. package/dist/node/cli/commands/uploads/parts-urls.d.ts +2 -2
  187. package/dist/node/cli/commands/uploads/parts-urls.d.ts.map +1 -1
  188. package/dist/node/cli/commands/uploads/parts-urls.js.map +1 -1
  189. package/dist/node/cli/commands/uploads/progress.d.ts +2 -2
  190. package/dist/node/cli/commands/uploads/progress.d.ts.map +1 -1
  191. package/dist/node/cli/commands/uploads/progress.js.map +1 -1
  192. package/dist/node/cli/commands/uploads/transfer.d.ts +4 -4
  193. package/dist/node/cli/commands/uploads/transfer.d.ts.map +1 -1
  194. package/dist/node/cli/commands/uploads/transfer.js +8 -11
  195. package/dist/node/cli/commands/uploads/transfer.js.map +1 -1
  196. package/dist/node/cli/index.d.ts +13 -13
  197. package/dist/node/cli/index.d.ts.map +1 -1
  198. package/dist/node/cli/index.js +14 -14
  199. package/dist/node/cli/index.js.map +1 -1
  200. package/dist/node/cli/utils/client.js +22 -5
  201. package/dist/node/cli/utils/client.js.map +1 -1
  202. package/dist/node/cli/utils/options.js +7 -43
  203. package/dist/node/cli/utils/options.js.map +1 -1
  204. package/dist/node/client/clients.d.ts +217 -194
  205. package/dist/node/client/clients.d.ts.map +1 -1
  206. package/dist/node/client/clients.js +17 -9
  207. package/dist/node/client/clients.js.map +1 -1
  208. package/dist/node/client/helpers.d.ts +15 -6
  209. package/dist/node/client/helpers.d.ts.map +1 -1
  210. package/dist/node/client/helpers.js +176 -30
  211. package/dist/node/client/helpers.js.map +1 -1
  212. package/dist/node/client/react.d.ts +217 -194
  213. package/dist/node/client/react.d.ts.map +1 -1
  214. package/dist/node/client/react.js.map +1 -1
  215. package/dist/node/client/solid.d.ts +218 -196
  216. package/dist/node/client/solid.d.ts.map +1 -1
  217. package/dist/node/client/solid.js.map +1 -1
  218. package/dist/node/client/svelte.d.ts +216 -193
  219. package/dist/node/client/svelte.d.ts.map +1 -1
  220. package/dist/node/client/svelte.js.map +1 -1
  221. package/dist/node/client/vanilla.d.ts +217 -195
  222. package/dist/node/client/vanilla.d.ts.map +1 -1
  223. package/dist/node/client/vanilla.js.map +1 -1
  224. package/dist/node/client/vue.d.ts +217 -194
  225. package/dist/node/client/vue.d.ts.map +1 -1
  226. package/dist/node/client/vue.js.map +1 -1
  227. package/dist/node/config.d.ts +6 -6
  228. package/dist/node/config.d.ts.map +1 -1
  229. package/dist/node/config.js.map +1 -1
  230. package/dist/node/definition.d.ts +588 -219
  231. package/dist/node/definition.d.ts.map +1 -1
  232. package/dist/node/definition.js +27 -3
  233. package/dist/node/definition.js.map +1 -1
  234. package/dist/node/file-key.d.ts +19 -0
  235. package/dist/node/file-key.d.ts.map +1 -0
  236. package/dist/node/file-key.js +47 -0
  237. package/dist/node/file-key.js.map +1 -0
  238. package/dist/node/index.d.ts +582 -175
  239. package/dist/node/index.d.ts.map +1 -1
  240. package/dist/node/index.js +3 -2
  241. package/dist/node/index.js.map +1 -1
  242. package/dist/node/routes/files.js +99 -64
  243. package/dist/node/routes/files.js.map +1 -1
  244. package/dist/node/routes/index.d.ts +1497 -721
  245. package/dist/node/routes/index.d.ts.map +1 -1
  246. package/dist/node/routes/shared.js +5 -9
  247. package/dist/node/routes/shared.js.map +1 -1
  248. package/dist/node/routes/uploads.js +105 -47
  249. package/dist/node/routes/uploads.js.map +1 -1
  250. package/dist/node/schema.d.ts +6 -6
  251. package/dist/node/schema.d.ts.map +1 -1
  252. package/dist/node/schema.js +12 -3
  253. package/dist/node/schema.js.map +1 -1
  254. package/dist/node/services/files.d.ts +6 -2
  255. package/dist/node/services/files.d.ts.map +1 -1
  256. package/dist/node/services/files.js +22 -20
  257. package/dist/node/services/files.js.map +1 -1
  258. package/dist/node/services/helpers.js +37 -15
  259. package/dist/node/services/helpers.js.map +1 -1
  260. package/dist/node/services/uploads.d.ts +10 -5
  261. package/dist/node/services/uploads.d.ts.map +1 -1
  262. package/dist/node/services/uploads.js +340 -63
  263. package/dist/node/services/uploads.js.map +1 -1
  264. package/dist/node/storage/fs.d.ts.map +1 -1
  265. package/dist/node/storage/fs.js +16 -10
  266. package/dist/node/storage/fs.js.map +1 -1
  267. package/dist/node/storage/object-key.js +36 -0
  268. package/dist/node/storage/object-key.js.map +1 -0
  269. package/dist/node/storage/r2-binding.d.ts +59 -0
  270. package/dist/node/storage/r2-binding.d.ts.map +1 -0
  271. package/dist/node/storage/r2-binding.js +245 -0
  272. package/dist/node/storage/r2-binding.js.map +1 -0
  273. package/dist/node/storage/r2.d.ts +6 -5
  274. package/dist/node/storage/r2.d.ts.map +1 -1
  275. package/dist/node/storage/s3.d.ts.map +1 -1
  276. package/dist/node/storage/s3.js +16 -10
  277. package/dist/node/storage/s3.js.map +1 -1
  278. package/dist/node/storage/types.d.ts +6 -5
  279. package/dist/node/storage/types.d.ts.map +1 -1
  280. package/dist/node/types.d.ts +1 -2
  281. package/dist/node/types.d.ts.map +1 -1
  282. package/package.json +26 -46
  283. package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js.map +0 -1
  284. package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js +0 -6
  285. package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/computed/index.js.map +0 -1
  286. package/dist/browser/client/packages/fragment-upload/src/keys.d.ts +0 -7
  287. package/dist/browser/client/packages/fragment-upload/src/keys.d.ts.map +0 -1
  288. package/dist/browser/client/packages/fragment-upload/src/keys.js +0 -28
  289. package/dist/browser/client/packages/fragment-upload/src/keys.js.map +0 -1
  290. package/dist/browser/index-BdjKPO4J.d.ts +0 -177
  291. package/dist/browser/index-BdjKPO4J.d.ts.map +0 -1
  292. package/dist/browser/index.js +0 -3
  293. package/dist/browser/src-vdNJUbjT.js +0 -1982
  294. package/dist/browser/src-vdNJUbjT.js.map +0 -1
  295. package/dist/cli/keys.js +0 -32
  296. package/dist/cli/keys.js.map +0 -1
  297. package/dist/node/keys.d.ts +0 -12
  298. package/dist/node/keys.d.ts.map +0 -1
  299. package/dist/node/keys.js +0 -63
  300. package/dist/node/keys.js.map +0 -1
  301. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.js","names":["fs","init: RequestInit & { duplex?: \"half\" }","response","completedParts: { partNumber: number; etag: string; sizeBytes: number }[]","completionParts: { partNumber: number; etag: string }[]"],"sources":["../../../../../src/cli/commands/uploads/transfer.ts"],"sourcesContent":["import { define } from \"gunshi\";\nimport { createReadStream, promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport {\n baseArgs,\n createClientFromContext,\n parseJsonValue,\n resolveOptionalFileKeyValue,\n} from \"../../utils/options.js\";\n\nconst DEFAULT_CONTENT_TYPE = \"application/octet-stream\";\n\nexport const uploadsTransferCommand = define({\n name: \"transfer\",\n description: \"Create an upload and transfer a file\",\n args: {\n ...baseArgs,\n file: {\n type: \"string\",\n short: \"f\",\n description: \"Path to file\",\n },\n \"file-key\": {\n type: \"string\",\n description: \"File key (encoded)\",\n },\n \"key-parts\": {\n type: \"string\",\n description: \"File key parts as JSON array\",\n },\n filename: {\n type: \"string\",\n description: \"Override filename\",\n },\n \"content-type\": {\n type: \"string\",\n description: \"Content type (default: application/octet-stream)\",\n },\n checksum: {\n type: \"string\",\n description: 'Checksum JSON, e.g. \\'{\"algo\":\"sha256\",\"value\":\"...\"}\\'',\n },\n tags: {\n type: \"string\",\n description: \"Tags as JSON array\",\n },\n visibility: {\n type: \"string\",\n description: \"Visibility (private, public, unlisted)\",\n },\n \"uploader-id\": {\n type: \"string\",\n description: \"Uploader id\",\n },\n metadata: {\n type: \"string\",\n description: \"Metadata JSON object\",\n },\n },\n run: async (ctx) => {\n const filePath = ctx.values[\"file\"] as string | undefined;\n if (!filePath) {\n throw new Error(\"Missing --file\");\n }\n\n const resolvedKey = resolveOptionalFileKeyValue({\n fileKey: ctx.values[\"file-key\"] as string | undefined,\n keyParts: ctx.values[\"key-parts\"] as string | undefined,\n });\n\n if (!resolvedKey.fileKey && !resolvedKey.keyParts) {\n throw new Error(\"Missing file key. Provide --file-key or --key-parts.\");\n }\n\n const stats = await fs.stat(filePath);\n const sizeBytes = stats.size;\n const filename = (ctx.values[\"filename\"] as string | undefined) ?? path.basename(filePath);\n const contentType = (ctx.values[\"content-type\"] as string | undefined) ?? DEFAULT_CONTENT_TYPE;\n\n const checksum = parseJsonValue(\"checksum\", ctx.values[\"checksum\"] as string | undefined);\n const tags = parseJsonValue(\"tags\", ctx.values[\"tags\"] as string | undefined);\n const metadata = parseJsonValue(\"metadata\", ctx.values[\"metadata\"] as string | undefined);\n\n const client = createClientFromContext(ctx);\n const upload = (await client.createUpload({\n fileKey: resolvedKey.fileKey,\n keyParts: resolvedKey.keyParts,\n filename,\n sizeBytes,\n contentType,\n checksum,\n tags,\n visibility: ctx.values[\"visibility\"] as string | undefined,\n uploaderId: ctx.values[\"uploader-id\"] as string | undefined,\n metadata,\n })) as {\n uploadId: string;\n strategy: \"direct-single\" | \"direct-multipart\" | \"proxy\";\n upload: {\n partSizeBytes?: number;\n maxParts?: number;\n uploadUrl?: string;\n uploadHeaders?: Record<string, string>;\n };\n };\n\n if (upload.strategy === \"direct-single\") {\n if (!upload.upload.uploadUrl) {\n throw new Error(\"Missing upload URL for direct upload\");\n }\n\n const headers = new Headers(upload.upload.uploadHeaders ?? {});\n headers.set(\"Content-Length\", String(sizeBytes));\n const init: RequestInit & { duplex?: \"half\" } = {\n method: \"PUT\",\n headers,\n body: Readable.toWeb(createReadStream(filePath)) as BodyInit,\n duplex: \"half\",\n };\n const response = await fetch(upload.upload.uploadUrl, init);\n\n if (!response.ok) {\n throw new Error(`Direct upload failed (${response.status})`);\n }\n\n await client.reportProgress(upload.uploadId, {\n bytesUploaded: sizeBytes,\n partsUploaded: 1,\n });\n\n const file = await client.completeUpload(upload.uploadId, []);\n console.log(JSON.stringify({ upload, file }, null, 2));\n return;\n }\n\n if (upload.strategy === \"direct-multipart\") {\n const partSizeBytes = upload.upload.partSizeBytes;\n if (!partSizeBytes) {\n throw new Error(\"Missing multipart part size from server\");\n }\n\n const totalParts = Math.ceil(sizeBytes / partSizeBytes);\n if (upload.upload.maxParts && totalParts > upload.upload.maxParts) {\n throw new Error(\"Multipart upload exceeds maximum parts\");\n }\n\n const partNumbers = Array.from({ length: totalParts }, (_, index) => index + 1);\n const partUrls = (await client.getPartUrls(upload.uploadId, partNumbers)) as {\n parts: { partNumber: number; url: string; headers?: Record<string, string> }[];\n };\n const orderedParts = partUrls.parts.sort((a, b) => a.partNumber - b.partNumber);\n\n const completedParts: { partNumber: number; etag: string; sizeBytes: number }[] = [];\n const completionParts: { partNumber: number; etag: string }[] = [];\n\n let bytesUploaded = 0;\n let partsUploaded = 0;\n\n for (const part of orderedParts) {\n const start = (part.partNumber - 1) * partSizeBytes;\n const length = Math.min(partSizeBytes, sizeBytes - start);\n const end = start + length - 1;\n\n const headers = new Headers(part.headers ?? {});\n headers.set(\"Content-Length\", String(length));\n const init: RequestInit & { duplex?: \"half\" } = {\n method: \"PUT\",\n headers,\n body: Readable.toWeb(createReadStream(filePath, { start, end })) as BodyInit,\n duplex: \"half\",\n };\n\n const response = await fetch(part.url, init);\n\n if (!response.ok) {\n throw new Error(`Multipart upload failed (${response.status})`);\n }\n\n const etag = response.headers.get(\"etag\") ?? response.headers.get(\"ETag\");\n if (!etag) {\n throw new Error(\"Missing ETag for uploaded part\");\n }\n\n completedParts.push({ partNumber: part.partNumber, etag, sizeBytes: length });\n completionParts.push({ partNumber: part.partNumber, etag });\n\n bytesUploaded += length;\n partsUploaded += 1;\n await client.reportProgress(upload.uploadId, {\n bytesUploaded,\n partsUploaded,\n });\n }\n\n await client.completeParts(upload.uploadId, completedParts);\n const file = await client.completeUpload(upload.uploadId, completionParts);\n console.log(JSON.stringify({ upload, file }, null, 2));\n return;\n }\n\n const response = await client.uploadContent(\n upload.uploadId,\n Readable.toWeb(createReadStream(filePath)) as BodyInit,\n contentType,\n );\n console.log(JSON.stringify({ upload, file: response }, null, 2));\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"transfer.js","names":["fs","init: RequestInit & { duplex?: \"half\" }","response","completedParts: { partNumber: number; etag: string; sizeBytes: number }[]","completionParts: { partNumber: number; etag: string }[]"],"sources":["../../../../../src/cli/commands/uploads/transfer.ts"],"sourcesContent":["import { createReadStream, promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\n\nimport { define } from \"gunshi\";\n\nimport {\n baseArgs,\n createClientFromContext,\n parseJsonValue,\n resolveFileKeyValue,\n resolveProviderValue,\n} from \"../../utils/options.js\";\n\nconst DEFAULT_CONTENT_TYPE = \"application/octet-stream\";\n\nexport const uploadsTransferCommand = define({\n name: \"transfer\",\n description: \"Create an upload and transfer a file\",\n args: {\n ...baseArgs,\n file: {\n type: \"string\",\n short: \"f\",\n description: \"Path to file\",\n },\n provider: {\n type: \"string\",\n description: \"Storage provider\",\n },\n \"file-key\": {\n type: \"string\",\n description: \"File key\",\n },\n filename: {\n type: \"string\",\n description: \"Override filename\",\n },\n \"content-type\": {\n type: \"string\",\n description: \"Content type (default: application/octet-stream)\",\n },\n checksum: {\n type: \"string\",\n description: 'Checksum JSON, e.g. \\'{\"algo\":\"sha256\",\"value\":\"...\"}\\'',\n },\n tags: {\n type: \"string\",\n description: \"Tags as JSON array\",\n },\n visibility: {\n type: \"string\",\n description: \"Visibility (private, public, unlisted)\",\n },\n \"uploader-id\": {\n type: \"string\",\n description: \"Uploader id\",\n },\n metadata: {\n type: \"string\",\n description: \"Metadata JSON object\",\n },\n },\n run: async (ctx) => {\n const filePath = ctx.values[\"file\"] as string | undefined;\n if (!filePath) {\n throw new Error(\"Missing --file\");\n }\n\n const provider = resolveProviderValue(ctx.values[\"provider\"] as string | undefined);\n const resolvedKey = resolveFileKeyValue({\n fileKey: ctx.values[\"file-key\"] as string | undefined,\n });\n\n const stats = await fs.stat(filePath);\n const sizeBytes = stats.size;\n const filename = (ctx.values[\"filename\"] as string | undefined) ?? path.basename(filePath);\n const contentType = (ctx.values[\"content-type\"] as string | undefined) ?? DEFAULT_CONTENT_TYPE;\n\n const checksum = parseJsonValue(\"checksum\", ctx.values[\"checksum\"] as string | undefined);\n const tags = parseJsonValue(\"tags\", ctx.values[\"tags\"] as string | undefined);\n const metadata = parseJsonValue(\"metadata\", ctx.values[\"metadata\"] as string | undefined);\n\n const client = createClientFromContext(ctx);\n const upload = (await client.createUpload({\n provider,\n fileKey: resolvedKey.fileKey,\n filename,\n sizeBytes,\n contentType,\n checksum,\n tags,\n visibility: ctx.values[\"visibility\"] as string | undefined,\n uploaderId: ctx.values[\"uploader-id\"] as string | undefined,\n metadata,\n })) as {\n uploadId: string;\n strategy: \"direct-single\" | \"direct-multipart\" | \"proxy\";\n upload: {\n partSizeBytes?: number;\n maxParts?: number;\n uploadUrl?: string;\n uploadHeaders?: Record<string, string>;\n };\n };\n\n if (upload.strategy === \"direct-single\") {\n if (!upload.upload.uploadUrl) {\n throw new Error(\"Missing upload URL for direct upload\");\n }\n\n const headers = new Headers(upload.upload.uploadHeaders ?? {});\n headers.set(\"Content-Length\", String(sizeBytes));\n const init: RequestInit & { duplex?: \"half\" } = {\n method: \"PUT\",\n headers,\n body: Readable.toWeb(createReadStream(filePath)) as BodyInit,\n duplex: \"half\",\n };\n const response = await fetch(upload.upload.uploadUrl, init);\n\n if (!response.ok) {\n throw new Error(`Direct upload failed (${response.status})`);\n }\n\n await client.reportProgress(upload.uploadId, {\n bytesUploaded: sizeBytes,\n partsUploaded: 1,\n });\n\n const file = await client.completeUpload(upload.uploadId, []);\n console.log(JSON.stringify({ upload, file }, null, 2));\n return;\n }\n\n if (upload.strategy === \"direct-multipart\") {\n const partSizeBytes = upload.upload.partSizeBytes;\n if (!partSizeBytes) {\n throw new Error(\"Missing multipart part size from server\");\n }\n\n const totalParts = Math.ceil(sizeBytes / partSizeBytes);\n if (upload.upload.maxParts && totalParts > upload.upload.maxParts) {\n throw new Error(\"Multipart upload exceeds maximum parts\");\n }\n\n const partNumbers = Array.from({ length: totalParts }, (_, index) => index + 1);\n const partUrls = (await client.getPartUrls(upload.uploadId, partNumbers)) as {\n parts: { partNumber: number; url: string; headers?: Record<string, string> }[];\n };\n const orderedParts = partUrls.parts.sort((a, b) => a.partNumber - b.partNumber);\n\n const completedParts: { partNumber: number; etag: string; sizeBytes: number }[] = [];\n const completionParts: { partNumber: number; etag: string }[] = [];\n\n let bytesUploaded = 0;\n let partsUploaded = 0;\n\n for (const part of orderedParts) {\n const start = (part.partNumber - 1) * partSizeBytes;\n const length = Math.min(partSizeBytes, sizeBytes - start);\n const end = start + length - 1;\n\n const headers = new Headers(part.headers ?? {});\n headers.set(\"Content-Length\", String(length));\n const init: RequestInit & { duplex?: \"half\" } = {\n method: \"PUT\",\n headers,\n body: Readable.toWeb(createReadStream(filePath, { start, end })) as BodyInit,\n duplex: \"half\",\n };\n\n const response = await fetch(part.url, init);\n\n if (!response.ok) {\n throw new Error(`Multipart upload failed (${response.status})`);\n }\n\n const etag = response.headers.get(\"etag\") ?? response.headers.get(\"ETag\");\n if (!etag) {\n throw new Error(\"Missing ETag for uploaded part\");\n }\n\n completedParts.push({ partNumber: part.partNumber, etag, sizeBytes: length });\n completionParts.push({ partNumber: part.partNumber, etag });\n\n bytesUploaded += length;\n partsUploaded += 1;\n await client.reportProgress(upload.uploadId, {\n bytesUploaded,\n partsUploaded,\n });\n }\n\n await client.completeParts(upload.uploadId, completedParts);\n const file = await client.completeUpload(upload.uploadId, completionParts);\n console.log(JSON.stringify({ upload, file }, null, 2));\n return;\n }\n\n const response = await client.uploadContent(\n upload.uploadId,\n Readable.toWeb(createReadStream(filePath)) as BodyInit,\n contentType,\n );\n console.log(JSON.stringify({ upload, file: response }, null, 2));\n },\n});\n"],"mappings":";;;;;;;AAcA,MAAM,uBAAuB;AAE7B,MAAa,yBAAyB,OAAO;CAC3C,MAAM;CACN,aAAa;CACb,MAAM;EACJ,GAAG;EACH,MAAM;GACJ,MAAM;GACN,OAAO;GACP,aAAa;GACd;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACd;EACD,YAAY;GACV,MAAM;GACN,aAAa;GACd;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACd;EACD,gBAAgB;GACd,MAAM;GACN,aAAa;GACd;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACd;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACd;EACD,YAAY;GACV,MAAM;GACN,aAAa;GACd;EACD,eAAe;GACb,MAAM;GACN,aAAa;GACd;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACd;EACF;CACD,KAAK,OAAO,QAAQ;EAClB,MAAM,WAAW,IAAI,OAAO;AAC5B,MAAI,CAAC,SACH,OAAM,IAAI,MAAM,iBAAiB;EAGnC,MAAM,WAAW,qBAAqB,IAAI,OAAO,YAAkC;EACnF,MAAM,cAAc,oBAAoB,EACtC,SAAS,IAAI,OAAO,aACrB,CAAC;EAGF,MAAM,aADQ,MAAMA,SAAG,KAAK,SAAS,EACb;EACxB,MAAM,WAAY,IAAI,OAAO,eAAsC,KAAK,SAAS,SAAS;EAC1F,MAAM,cAAe,IAAI,OAAO,mBAA0C;EAE1E,MAAM,WAAW,eAAe,YAAY,IAAI,OAAO,YAAkC;EACzF,MAAM,OAAO,eAAe,QAAQ,IAAI,OAAO,QAA8B;EAC7E,MAAM,WAAW,eAAe,YAAY,IAAI,OAAO,YAAkC;EAEzF,MAAM,SAAS,wBAAwB,IAAI;EAC3C,MAAM,SAAU,MAAM,OAAO,aAAa;GACxC;GACA,SAAS,YAAY;GACrB;GACA;GACA;GACA;GACA;GACA,YAAY,IAAI,OAAO;GACvB,YAAY,IAAI,OAAO;GACvB;GACD,CAAC;AAWF,MAAI,OAAO,aAAa,iBAAiB;AACvC,OAAI,CAAC,OAAO,OAAO,UACjB,OAAM,IAAI,MAAM,uCAAuC;GAGzD,MAAM,UAAU,IAAI,QAAQ,OAAO,OAAO,iBAAiB,EAAE,CAAC;AAC9D,WAAQ,IAAI,kBAAkB,OAAO,UAAU,CAAC;GAChD,MAAMC,OAA0C;IAC9C,QAAQ;IACR;IACA,MAAM,SAAS,MAAM,iBAAiB,SAAS,CAAC;IAChD,QAAQ;IACT;GACD,MAAMC,aAAW,MAAM,MAAM,OAAO,OAAO,WAAW,KAAK;AAE3D,OAAI,CAACA,WAAS,GACZ,OAAM,IAAI,MAAM,yBAAyBA,WAAS,OAAO,GAAG;AAG9D,SAAM,OAAO,eAAe,OAAO,UAAU;IAC3C,eAAe;IACf,eAAe;IAChB,CAAC;GAEF,MAAM,OAAO,MAAM,OAAO,eAAe,OAAO,UAAU,EAAE,CAAC;AAC7D,WAAQ,IAAI,KAAK,UAAU;IAAE;IAAQ;IAAM,EAAE,MAAM,EAAE,CAAC;AACtD;;AAGF,MAAI,OAAO,aAAa,oBAAoB;GAC1C,MAAM,gBAAgB,OAAO,OAAO;AACpC,OAAI,CAAC,cACH,OAAM,IAAI,MAAM,0CAA0C;GAG5D,MAAM,aAAa,KAAK,KAAK,YAAY,cAAc;AACvD,OAAI,OAAO,OAAO,YAAY,aAAa,OAAO,OAAO,SACvD,OAAM,IAAI,MAAM,yCAAyC;GAG3D,MAAM,cAAc,MAAM,KAAK,EAAE,QAAQ,YAAY,GAAG,GAAG,UAAU,QAAQ,EAAE;GAI/E,MAAM,gBAHY,MAAM,OAAO,YAAY,OAAO,UAAU,YAAY,EAG1C,MAAM,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,WAAW;GAE/E,MAAMC,iBAA4E,EAAE;GACpF,MAAMC,kBAA0D,EAAE;GAElE,IAAI,gBAAgB;GACpB,IAAI,gBAAgB;AAEpB,QAAK,MAAM,QAAQ,cAAc;IAC/B,MAAM,SAAS,KAAK,aAAa,KAAK;IACtC,MAAM,SAAS,KAAK,IAAI,eAAe,YAAY,MAAM;IACzD,MAAM,MAAM,QAAQ,SAAS;IAE7B,MAAM,UAAU,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;AAC/C,YAAQ,IAAI,kBAAkB,OAAO,OAAO,CAAC;IAC7C,MAAMH,OAA0C;KAC9C,QAAQ;KACR;KACA,MAAM,SAAS,MAAM,iBAAiB,UAAU;MAAE;MAAO;MAAK,CAAC,CAAC;KAChE,QAAQ;KACT;IAED,MAAMC,aAAW,MAAM,MAAM,KAAK,KAAK,KAAK;AAE5C,QAAI,CAACA,WAAS,GACZ,OAAM,IAAI,MAAM,4BAA4BA,WAAS,OAAO,GAAG;IAGjE,MAAM,OAAOA,WAAS,QAAQ,IAAI,OAAO,IAAIA,WAAS,QAAQ,IAAI,OAAO;AACzE,QAAI,CAAC,KACH,OAAM,IAAI,MAAM,iCAAiC;AAGnD,mBAAe,KAAK;KAAE,YAAY,KAAK;KAAY;KAAM,WAAW;KAAQ,CAAC;AAC7E,oBAAgB,KAAK;KAAE,YAAY,KAAK;KAAY;KAAM,CAAC;AAE3D,qBAAiB;AACjB,qBAAiB;AACjB,UAAM,OAAO,eAAe,OAAO,UAAU;KAC3C;KACA;KACD,CAAC;;AAGJ,SAAM,OAAO,cAAc,OAAO,UAAU,eAAe;GAC3D,MAAM,OAAO,MAAM,OAAO,eAAe,OAAO,UAAU,gBAAgB;AAC1E,WAAQ,IAAI,KAAK,UAAU;IAAE;IAAQ;IAAM,EAAE,MAAM,EAAE,CAAC;AACtD;;EAGF,MAAM,WAAW,MAAM,OAAO,cAC5B,OAAO,UACP,SAAS,MAAM,iBAAiB,SAAS,CAAC,EAC1C,YACD;AACD,UAAQ,IAAI,KAAK,UAAU;GAAE;GAAQ,MAAM;GAAU,EAAE,MAAM,EAAE,CAAC;;CAEnE,CAAC"}
@@ -1,21 +1,21 @@
1
1
  #!/usr/bin/env node
2
+ import { filesDeleteCommand } from "./commands/files/delete.js";
3
+ import { filesDownloadUrlCommand } from "./commands/files/download-url.js";
4
+ import { filesDownloadCommand } from "./commands/files/download.js";
5
+ import { filesGetCommand } from "./commands/files/get.js";
6
+ import { filesListCommand } from "./commands/files/list.js";
7
+ import { filesUpdateCommand } from "./commands/files/update.js";
8
+ import { filesUploadCommand } from "./commands/files/upload.js";
9
+ import { uploadsAbortCommand } from "./commands/uploads/abort.js";
10
+ import { uploadsCompleteCommand } from "./commands/uploads/complete.js";
11
+ import { uploadsContentCommand } from "./commands/uploads/content.js";
2
12
  import { uploadsCreateCommand } from "./commands/uploads/create.js";
3
13
  import { uploadsGetCommand } from "./commands/uploads/get.js";
4
- import { uploadsProgressCommand } from "./commands/uploads/progress.js";
5
- import { uploadsPartsUrlsCommand } from "./commands/uploads/parts-urls.js";
6
- import { uploadsPartsListCommand } from "./commands/uploads/parts-list.js";
7
14
  import { uploadsPartsCompleteCommand } from "./commands/uploads/parts-complete.js";
8
- import { uploadsCompleteCommand } from "./commands/uploads/complete.js";
9
- import { uploadsAbortCommand } from "./commands/uploads/abort.js";
10
- import { uploadsContentCommand } from "./commands/uploads/content.js";
15
+ import { uploadsPartsListCommand } from "./commands/uploads/parts-list.js";
16
+ import { uploadsPartsUrlsCommand } from "./commands/uploads/parts-urls.js";
17
+ import { uploadsProgressCommand } from "./commands/uploads/progress.js";
11
18
  import { uploadsTransferCommand } from "./commands/uploads/transfer.js";
12
- import { filesUploadCommand } from "./commands/files/upload.js";
13
- import { filesListCommand } from "./commands/files/list.js";
14
- import { filesGetCommand } from "./commands/files/get.js";
15
- import { filesUpdateCommand } from "./commands/files/update.js";
16
- import { filesDeleteCommand } from "./commands/files/delete.js";
17
- import { filesDownloadUrlCommand } from "./commands/files/download-url.js";
18
- import { filesDownloadCommand } from "./commands/files/download.js";
19
19
  import { Args, Command } from "gunshi";
20
20
 
21
21
  //#region src/cli/index.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;cA6Ba,gBAAc,QAAA;cAKd,cAAY,QAAA;AALZ,iBA0HS,GAAA,CAAA,CAvHpB,EAuHuB,OAvHvB,CAAA,IAAA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;cA+Ba,gBAAc,QAAA;cAKd,cAAY,QAAA;AALZ,iBA0HS,GAAA,CAAA,CAvHpB,EAuHuB,OAvHvB,CAAA,IAAA,CAAA"}
@@ -1,25 +1,25 @@
1
1
  #!/usr/bin/env node
2
+ import { filesDeleteCommand } from "./commands/files/delete.js";
3
+ import { filesDownloadUrlCommand } from "./commands/files/download-url.js";
4
+ import { filesDownloadCommand } from "./commands/files/download.js";
5
+ import { filesGetCommand } from "./commands/files/get.js";
6
+ import { filesListCommand } from "./commands/files/list.js";
7
+ import { filesUpdateCommand } from "./commands/files/update.js";
8
+ import { filesUploadCommand } from "./commands/files/upload.js";
9
+ import { uploadsAbortCommand } from "./commands/uploads/abort.js";
10
+ import { uploadsCompleteCommand } from "./commands/uploads/complete.js";
11
+ import { uploadsContentCommand } from "./commands/uploads/content.js";
2
12
  import { uploadsCreateCommand } from "./commands/uploads/create.js";
3
13
  import { uploadsGetCommand } from "./commands/uploads/get.js";
4
- import { uploadsProgressCommand } from "./commands/uploads/progress.js";
5
- import { uploadsPartsUrlsCommand } from "./commands/uploads/parts-urls.js";
6
- import { uploadsPartsListCommand } from "./commands/uploads/parts-list.js";
7
14
  import { uploadsPartsCompleteCommand } from "./commands/uploads/parts-complete.js";
8
- import { uploadsCompleteCommand } from "./commands/uploads/complete.js";
9
- import { uploadsAbortCommand } from "./commands/uploads/abort.js";
10
- import { uploadsContentCommand } from "./commands/uploads/content.js";
15
+ import { uploadsPartsListCommand } from "./commands/uploads/parts-list.js";
16
+ import { uploadsPartsUrlsCommand } from "./commands/uploads/parts-urls.js";
17
+ import { uploadsProgressCommand } from "./commands/uploads/progress.js";
11
18
  import { uploadsTransferCommand } from "./commands/uploads/transfer.js";
12
- import { filesUploadCommand } from "./commands/files/upload.js";
13
- import { filesListCommand } from "./commands/files/list.js";
14
- import { filesGetCommand } from "./commands/files/get.js";
15
- import { filesUpdateCommand } from "./commands/files/update.js";
16
- import { filesDeleteCommand } from "./commands/files/delete.js";
17
- import { filesDownloadUrlCommand } from "./commands/files/download-url.js";
18
- import { filesDownloadCommand } from "./commands/files/download.js";
19
19
  import { readFileSync } from "node:fs";
20
20
  import { dirname, join } from "node:path";
21
- import { cli, define } from "gunshi";
22
21
  import { fileURLToPath } from "node:url";
22
+ import { cli, define } from "gunshi";
23
23
 
24
24
  //#region src/cli/index.ts
25
25
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["uploadsSubCommands: Map<string, Command<Args>>","filesSubCommands: Map<string, Command<Args>>"],"sources":["../../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { cli, define } from \"gunshi\";\nimport type { Args, Command } from \"gunshi\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { uploadsCreateCommand } from \"./commands/uploads/create.js\";\nimport { uploadsGetCommand } from \"./commands/uploads/get.js\";\nimport { uploadsProgressCommand } from \"./commands/uploads/progress.js\";\nimport { uploadsPartsUrlsCommand } from \"./commands/uploads/parts-urls.js\";\nimport { uploadsPartsListCommand } from \"./commands/uploads/parts-list.js\";\nimport { uploadsPartsCompleteCommand } from \"./commands/uploads/parts-complete.js\";\nimport { uploadsCompleteCommand } from \"./commands/uploads/complete.js\";\nimport { uploadsAbortCommand } from \"./commands/uploads/abort.js\";\nimport { uploadsContentCommand } from \"./commands/uploads/content.js\";\nimport { uploadsTransferCommand } from \"./commands/uploads/transfer.js\";\nimport { filesUploadCommand } from \"./commands/files/upload.js\";\nimport { filesListCommand } from \"./commands/files/list.js\";\nimport { filesGetCommand } from \"./commands/files/get.js\";\nimport { filesUpdateCommand } from \"./commands/files/update.js\";\nimport { filesDeleteCommand } from \"./commands/files/delete.js\";\nimport { filesDownloadUrlCommand } from \"./commands/files/download-url.js\";\nimport { filesDownloadCommand } from \"./commands/files/download.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(readFileSync(join(__dirname, \"../../package.json\"), \"utf-8\"));\nconst version = packageJson.version as string;\n\nexport const uploadsCommand = define({\n name: \"uploads\",\n description: \"Upload session commands\",\n});\n\nexport const filesCommand = define({\n name: \"files\",\n description: \"File commands\",\n});\n\nconst uploadsSubCommands: Map<string, Command<Args>> = new Map();\nuploadsSubCommands.set(\"create\", uploadsCreateCommand as Command<Args>);\nuploadsSubCommands.set(\"get\", uploadsGetCommand as Command<Args>);\nuploadsSubCommands.set(\"progress\", uploadsProgressCommand as Command<Args>);\nuploadsSubCommands.set(\"parts-urls\", uploadsPartsUrlsCommand as Command<Args>);\nuploadsSubCommands.set(\"parts-list\", uploadsPartsListCommand as Command<Args>);\nuploadsSubCommands.set(\"parts-complete\", uploadsPartsCompleteCommand as Command<Args>);\nuploadsSubCommands.set(\"complete\", uploadsCompleteCommand as Command<Args>);\nuploadsSubCommands.set(\"abort\", uploadsAbortCommand as Command<Args>);\nuploadsSubCommands.set(\"content\", uploadsContentCommand as Command<Args>);\nuploadsSubCommands.set(\"transfer\", uploadsTransferCommand as Command<Args>);\n\nconst filesSubCommands: Map<string, Command<Args>> = new Map();\nfilesSubCommands.set(\"upload\", filesUploadCommand as Command<Args>);\nfilesSubCommands.set(\"list\", filesListCommand as Command<Args>);\nfilesSubCommands.set(\"get\", filesGetCommand as Command<Args>);\nfilesSubCommands.set(\"update\", filesUpdateCommand as Command<Args>);\nfilesSubCommands.set(\"delete\", filesDeleteCommand as Command<Args>);\nfilesSubCommands.set(\"download-url\", filesDownloadUrlCommand as Command<Args>);\nfilesSubCommands.set(\"download\", filesDownloadCommand as Command<Args>);\n\nconst printMainHelp = () => {\n console.log(\"Upload management CLI for Fragno\");\n console.log(\"\");\n console.log(\"USAGE:\");\n console.log(\" fragno-upload <COMMAND>\");\n console.log(\"\");\n console.log(\"COMMANDS:\");\n console.log(\" uploads Manage upload sessions\");\n console.log(\" files Manage files\");\n console.log(\"\");\n console.log(\"GLOBAL OPTIONS:\");\n console.log(\" -b, --base-url Upload fragment base URL\");\n console.log(\" -H, --header Extra HTTP header (repeatable)\");\n console.log(\" --timeout Request timeout in ms (default: 15000)\");\n console.log(\" --retries Retry count for network/5xx/429 (default: 2)\");\n console.log(\" --retry-delay Retry delay in ms (default: 500)\");\n console.log(\"\");\n console.log(\"ENVIRONMENT:\");\n console.log(\" FRAGNO_UPLOAD_BASE_URL Default base URL\");\n console.log(\" FRAGNO_UPLOAD_HEADERS Extra headers separated by ';' or newlines\");\n console.log(\" FRAGNO_UPLOAD_TIMEOUT_MS Default timeout in ms\");\n console.log(\" FRAGNO_UPLOAD_RETRIES Default retry count\");\n console.log(\" FRAGNO_UPLOAD_RETRY_DELAY_MS Default retry delay in ms\");\n console.log(\"\");\n console.log(\"EXAMPLES:\");\n console.log(\n \" fragno-upload uploads create -b https://host/api/uploads --file-key s~Zm9v --filename demo.txt --size-bytes 10 --content-type text/plain\",\n );\n console.log(\" fragno-upload uploads get -b https://host/api/uploads -i upl_123\");\n console.log(\n \" fragno-upload uploads transfer -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v\",\n );\n console.log(\" fragno-upload files list -b https://host/api/uploads --prefix s~Zm9v.\");\n console.log(\n \" fragno-upload files download -b https://host/api/uploads --file-key s~Zm9v -o ./download.txt\",\n );\n};\n\nconst printUploadsHelp = () => {\n console.log(\"Upload session commands\");\n console.log(\"\");\n console.log(\"USAGE:\");\n console.log(\" fragno-upload uploads <COMMAND>\");\n console.log(\"\");\n console.log(\"COMMANDS:\");\n console.log(\" create Create an upload session\");\n console.log(\" get Get upload status\");\n console.log(\" progress Record upload progress\");\n console.log(\" parts-urls Get signed URLs for multipart upload\");\n console.log(\" parts-list List uploaded parts\");\n console.log(\" parts-complete Record completed parts\");\n console.log(\" complete Complete an upload\");\n console.log(\" abort Abort an upload\");\n console.log(\" content Upload file bytes via proxy upload\");\n console.log(\" transfer Create an upload and transfer a file\");\n console.log(\"\");\n console.log(\"EXAMPLES:\");\n console.log(\n \" fragno-upload uploads create -b https://host/api/uploads --file-key s~Zm9v --filename demo.txt --size-bytes 10 --content-type text/plain\",\n );\n console.log(\" fragno-upload uploads get -b https://host/api/uploads -i upl_123\");\n console.log(\n \" fragno-upload uploads transfer -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v\",\n );\n};\n\nconst printFilesHelp = () => {\n console.log(\"File commands\");\n console.log(\"\");\n console.log(\"USAGE:\");\n console.log(\" fragno-upload files <COMMAND>\");\n console.log(\"\");\n console.log(\"COMMANDS:\");\n console.log(\" upload Upload a file via /files\");\n console.log(\" list List files\");\n console.log(\" get Get file metadata\");\n console.log(\" update Update file metadata\");\n console.log(\" delete Delete a file\");\n console.log(\" download-url Get a signed download URL\");\n console.log(\" download Download file contents\");\n console.log(\"\");\n console.log(\"EXAMPLES:\");\n console.log(\n \" fragno-upload files upload -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v\",\n );\n console.log(\" fragno-upload files list -b https://host/api/uploads --prefix s~Zm9v.\");\n console.log(\n \" fragno-upload files download -b https://host/api/uploads --file-key s~Zm9v -o ./download.txt\",\n );\n};\n\nexport async function run() {\n try {\n const args = process.argv.slice(2);\n\n if (!args.length || args[0] === \"--help\" || args[0] === \"-h\") {\n printMainHelp();\n return;\n }\n\n if (args[0] === \"--version\" || args[0] === \"-v\") {\n console.log(version);\n return;\n }\n\n if (args[0] === \"uploads\") {\n const subCommandName = args[1];\n if (!subCommandName || subCommandName === \"--help\" || subCommandName === \"-h\") {\n printUploadsHelp();\n return;\n }\n if (subCommandName === \"--version\" || subCommandName === \"-v\") {\n console.log(version);\n return;\n }\n\n const subCommand = uploadsSubCommands.get(subCommandName);\n if (!subCommand) {\n console.error(`Unknown command: ${subCommandName}`);\n console.log(\"\");\n console.log(\"Run 'fragno-upload uploads --help' for available commands.\");\n process.exit(1);\n }\n\n await cli(args.slice(2), subCommand, {\n name: `fragno-upload uploads ${subCommandName}`,\n version,\n });\n return;\n }\n\n if (args[0] === \"files\") {\n const subCommandName = args[1];\n if (!subCommandName || subCommandName === \"--help\" || subCommandName === \"-h\") {\n printFilesHelp();\n return;\n }\n if (subCommandName === \"--version\" || subCommandName === \"-v\") {\n console.log(version);\n return;\n }\n\n const subCommand = filesSubCommands.get(subCommandName);\n if (!subCommand) {\n console.error(`Unknown command: ${subCommandName}`);\n console.log(\"\");\n console.log(\"Run 'fragno-upload files --help' for available commands.\");\n process.exit(1);\n }\n\n await cli(args.slice(2), subCommand, {\n name: `fragno-upload files ${subCommandName}`,\n version,\n });\n return;\n }\n\n console.error(`Unknown command: ${args[0]}`);\n console.log(\"\");\n console.log(\"Run 'fragno-upload --help' for available commands.\");\n process.exit(1);\n } catch (error) {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n}\n\nif (import.meta.main) {\n await run();\n}\n\nexport {\n uploadsCreateCommand,\n uploadsGetCommand,\n uploadsProgressCommand,\n uploadsPartsUrlsCommand,\n uploadsPartsListCommand,\n uploadsPartsCompleteCommand,\n uploadsCompleteCommand,\n uploadsAbortCommand,\n uploadsContentCommand,\n uploadsTransferCommand,\n filesUploadCommand,\n filesListCommand,\n filesGetCommand,\n filesUpdateCommand,\n filesDeleteCommand,\n filesDownloadUrlCommand,\n filesDownloadCommand,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["uploadsSubCommands: Map<string, Command<Args>>","filesSubCommands: Map<string, Command<Args>>"],"sources":["../../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { cli, define } from \"gunshi\";\nimport type { Args, Command } from \"gunshi\";\n\nimport { filesDeleteCommand } from \"./commands/files/delete.js\";\nimport { filesDownloadUrlCommand } from \"./commands/files/download-url.js\";\nimport { filesDownloadCommand } from \"./commands/files/download.js\";\nimport { filesGetCommand } from \"./commands/files/get.js\";\nimport { filesListCommand } from \"./commands/files/list.js\";\nimport { filesUpdateCommand } from \"./commands/files/update.js\";\nimport { filesUploadCommand } from \"./commands/files/upload.js\";\nimport { uploadsAbortCommand } from \"./commands/uploads/abort.js\";\nimport { uploadsCompleteCommand } from \"./commands/uploads/complete.js\";\nimport { uploadsContentCommand } from \"./commands/uploads/content.js\";\nimport { uploadsCreateCommand } from \"./commands/uploads/create.js\";\nimport { uploadsGetCommand } from \"./commands/uploads/get.js\";\nimport { uploadsPartsCompleteCommand } from \"./commands/uploads/parts-complete.js\";\nimport { uploadsPartsListCommand } from \"./commands/uploads/parts-list.js\";\nimport { uploadsPartsUrlsCommand } from \"./commands/uploads/parts-urls.js\";\nimport { uploadsProgressCommand } from \"./commands/uploads/progress.js\";\nimport { uploadsTransferCommand } from \"./commands/uploads/transfer.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(readFileSync(join(__dirname, \"../../package.json\"), \"utf-8\"));\nconst version = packageJson.version as string;\n\nexport const uploadsCommand = define({\n name: \"uploads\",\n description: \"Upload session commands\",\n});\n\nexport const filesCommand = define({\n name: \"files\",\n description: \"File commands\",\n});\n\nconst uploadsSubCommands: Map<string, Command<Args>> = new Map();\nuploadsSubCommands.set(\"create\", uploadsCreateCommand as Command<Args>);\nuploadsSubCommands.set(\"get\", uploadsGetCommand as Command<Args>);\nuploadsSubCommands.set(\"progress\", uploadsProgressCommand as Command<Args>);\nuploadsSubCommands.set(\"parts-urls\", uploadsPartsUrlsCommand as Command<Args>);\nuploadsSubCommands.set(\"parts-list\", uploadsPartsListCommand as Command<Args>);\nuploadsSubCommands.set(\"parts-complete\", uploadsPartsCompleteCommand as Command<Args>);\nuploadsSubCommands.set(\"complete\", uploadsCompleteCommand as Command<Args>);\nuploadsSubCommands.set(\"abort\", uploadsAbortCommand as Command<Args>);\nuploadsSubCommands.set(\"content\", uploadsContentCommand as Command<Args>);\nuploadsSubCommands.set(\"transfer\", uploadsTransferCommand as Command<Args>);\n\nconst filesSubCommands: Map<string, Command<Args>> = new Map();\nfilesSubCommands.set(\"upload\", filesUploadCommand as Command<Args>);\nfilesSubCommands.set(\"list\", filesListCommand as Command<Args>);\nfilesSubCommands.set(\"get\", filesGetCommand as Command<Args>);\nfilesSubCommands.set(\"update\", filesUpdateCommand as Command<Args>);\nfilesSubCommands.set(\"delete\", filesDeleteCommand as Command<Args>);\nfilesSubCommands.set(\"download-url\", filesDownloadUrlCommand as Command<Args>);\nfilesSubCommands.set(\"download\", filesDownloadCommand as Command<Args>);\n\nconst printMainHelp = () => {\n console.log(\"Upload management CLI for Fragno\");\n console.log(\"\");\n console.log(\"USAGE:\");\n console.log(\" fragno-upload <COMMAND>\");\n console.log(\"\");\n console.log(\"COMMANDS:\");\n console.log(\" uploads Manage upload sessions\");\n console.log(\" files Manage files\");\n console.log(\"\");\n console.log(\"GLOBAL OPTIONS:\");\n console.log(\" -b, --base-url Upload fragment base URL\");\n console.log(\" -H, --header Extra HTTP header (repeatable)\");\n console.log(\" --timeout Request timeout in ms (default: 15000)\");\n console.log(\" --retries Retry count for network/5xx/429 (default: 2)\");\n console.log(\" --retry-delay Retry delay in ms (default: 500)\");\n console.log(\"\");\n console.log(\"ENVIRONMENT:\");\n console.log(\" FRAGNO_UPLOAD_BASE_URL Default base URL\");\n console.log(\" FRAGNO_UPLOAD_HEADERS Extra headers separated by ';' or newlines\");\n console.log(\" FRAGNO_UPLOAD_TIMEOUT_MS Default timeout in ms\");\n console.log(\" FRAGNO_UPLOAD_RETRIES Default retry count\");\n console.log(\" FRAGNO_UPLOAD_RETRY_DELAY_MS Default retry delay in ms\");\n console.log(\"\");\n console.log(\"EXAMPLES:\");\n console.log(\n \" fragno-upload uploads create -b https://host/api/uploads --file-key s~Zm9v --filename demo.txt --size-bytes 10 --content-type text/plain\",\n );\n console.log(\" fragno-upload uploads get -b https://host/api/uploads -i upl_123\");\n console.log(\n \" fragno-upload uploads transfer -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v\",\n );\n console.log(\" fragno-upload files list -b https://host/api/uploads --prefix s~Zm9v.\");\n console.log(\n \" fragno-upload files download -b https://host/api/uploads --file-key s~Zm9v -o ./download.txt\",\n );\n};\n\nconst printUploadsHelp = () => {\n console.log(\"Upload session commands\");\n console.log(\"\");\n console.log(\"USAGE:\");\n console.log(\" fragno-upload uploads <COMMAND>\");\n console.log(\"\");\n console.log(\"COMMANDS:\");\n console.log(\" create Create an upload session\");\n console.log(\" get Get upload status\");\n console.log(\" progress Record upload progress\");\n console.log(\" parts-urls Get signed URLs for multipart upload\");\n console.log(\" parts-list List uploaded parts\");\n console.log(\" parts-complete Record completed parts\");\n console.log(\" complete Complete an upload\");\n console.log(\" abort Abort an upload\");\n console.log(\" content Upload file bytes via proxy upload\");\n console.log(\" transfer Create an upload and transfer a file\");\n console.log(\"\");\n console.log(\"EXAMPLES:\");\n console.log(\n \" fragno-upload uploads create -b https://host/api/uploads --file-key s~Zm9v --filename demo.txt --size-bytes 10 --content-type text/plain\",\n );\n console.log(\" fragno-upload uploads get -b https://host/api/uploads -i upl_123\");\n console.log(\n \" fragno-upload uploads transfer -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v\",\n );\n};\n\nconst printFilesHelp = () => {\n console.log(\"File commands\");\n console.log(\"\");\n console.log(\"USAGE:\");\n console.log(\" fragno-upload files <COMMAND>\");\n console.log(\"\");\n console.log(\"COMMANDS:\");\n console.log(\" upload Upload a file via /files\");\n console.log(\" list List files\");\n console.log(\" get Get file metadata\");\n console.log(\" update Update file metadata\");\n console.log(\" delete Delete a file\");\n console.log(\" download-url Get a signed download URL\");\n console.log(\" download Download file contents\");\n console.log(\"\");\n console.log(\"EXAMPLES:\");\n console.log(\n \" fragno-upload files upload -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v\",\n );\n console.log(\" fragno-upload files list -b https://host/api/uploads --prefix s~Zm9v.\");\n console.log(\n \" fragno-upload files download -b https://host/api/uploads --file-key s~Zm9v -o ./download.txt\",\n );\n};\n\nexport async function run() {\n try {\n const args = process.argv.slice(2);\n\n if (!args.length || args[0] === \"--help\" || args[0] === \"-h\") {\n printMainHelp();\n return;\n }\n\n if (args[0] === \"--version\" || args[0] === \"-v\") {\n console.log(version);\n return;\n }\n\n if (args[0] === \"uploads\") {\n const subCommandName = args[1];\n if (!subCommandName || subCommandName === \"--help\" || subCommandName === \"-h\") {\n printUploadsHelp();\n return;\n }\n if (subCommandName === \"--version\" || subCommandName === \"-v\") {\n console.log(version);\n return;\n }\n\n const subCommand = uploadsSubCommands.get(subCommandName);\n if (!subCommand) {\n console.error(`Unknown command: ${subCommandName}`);\n console.log(\"\");\n console.log(\"Run 'fragno-upload uploads --help' for available commands.\");\n process.exit(1);\n }\n\n await cli(args.slice(2), subCommand, {\n name: `fragno-upload uploads ${subCommandName}`,\n version,\n });\n return;\n }\n\n if (args[0] === \"files\") {\n const subCommandName = args[1];\n if (!subCommandName || subCommandName === \"--help\" || subCommandName === \"-h\") {\n printFilesHelp();\n return;\n }\n if (subCommandName === \"--version\" || subCommandName === \"-v\") {\n console.log(version);\n return;\n }\n\n const subCommand = filesSubCommands.get(subCommandName);\n if (!subCommand) {\n console.error(`Unknown command: ${subCommandName}`);\n console.log(\"\");\n console.log(\"Run 'fragno-upload files --help' for available commands.\");\n process.exit(1);\n }\n\n await cli(args.slice(2), subCommand, {\n name: `fragno-upload files ${subCommandName}`,\n version,\n });\n return;\n }\n\n console.error(`Unknown command: ${args[0]}`);\n console.log(\"\");\n console.log(\"Run 'fragno-upload --help' for available commands.\");\n process.exit(1);\n } catch (error) {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n}\n\nif (import.meta.main) {\n await run();\n}\n\nexport {\n uploadsCreateCommand,\n uploadsGetCommand,\n uploadsProgressCommand,\n uploadsPartsUrlsCommand,\n uploadsPartsListCommand,\n uploadsPartsCompleteCommand,\n uploadsCompleteCommand,\n uploadsAbortCommand,\n uploadsContentCommand,\n uploadsTransferCommand,\n filesUploadCommand,\n filesListCommand,\n filesGetCommand,\n filesUpdateCommand,\n filesDeleteCommand,\n filesDownloadUrlCommand,\n filesDownloadCommand,\n};\n"],"mappings":"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"}
@@ -113,6 +113,10 @@ async function requestJson(config, path, { method = "GET", query, body } = {}) {
113
113
  return parsed;
114
114
  }
115
115
  function createClient(config) {
116
+ const buildByKeyQuery = (provider, fileKey) => ({
117
+ provider,
118
+ key: fileKey
119
+ });
116
120
  return {
117
121
  buildUrl: (path, query) => buildUrl(config.baseUrl, path, query),
118
122
  requestResponse: (path, options) => requestResponse(config, path, options),
@@ -158,14 +162,27 @@ function createClient(config) {
158
162
  method: "GET",
159
163
  query
160
164
  }),
161
- getFile: (fileKey) => requestJson(config, `/files/${fileKey}`),
162
- updateFile: (fileKey, payload) => requestJson(config, `/files/${fileKey}`, {
165
+ getFile: (provider, fileKey) => requestJson(config, "/files/by-key", {
166
+ method: "GET",
167
+ query: buildByKeyQuery(provider, fileKey)
168
+ }),
169
+ updateFile: (provider, fileKey, payload) => requestJson(config, "/files/by-key", {
163
170
  method: "PATCH",
171
+ query: buildByKeyQuery(provider, fileKey),
164
172
  body: payload
165
173
  }),
166
- deleteFile: (fileKey) => requestJson(config, `/files/${fileKey}`, { method: "DELETE" }),
167
- getDownloadUrl: (fileKey) => requestJson(config, `/files/${fileKey}/download-url`),
168
- downloadContent: (fileKey) => requestResponse(config, `/files/${fileKey}/content`, { method: "GET" })
174
+ deleteFile: (provider, fileKey) => requestJson(config, "/files/by-key", {
175
+ method: "DELETE",
176
+ query: buildByKeyQuery(provider, fileKey)
177
+ }),
178
+ getDownloadUrl: (provider, fileKey) => requestJson(config, "/files/by-key/download-url", {
179
+ method: "GET",
180
+ query: buildByKeyQuery(provider, fileKey)
181
+ }),
182
+ downloadContent: (provider, fileKey) => requestResponse(config, "/files/by-key/content", {
183
+ method: "GET",
184
+ query: buildByKeyQuery(provider, fileKey)
185
+ })
169
186
  };
170
187
  }
171
188
 
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["lastError: unknown","payload: BodyInit | undefined","init: RequestInit & { duplex?: \"half\" }"],"sources":["../../../../src/cli/utils/client.ts"],"sourcesContent":["import { Readable } from \"node:stream\";\n\nexport type ClientConfig = {\n baseUrl: string;\n headers?: HeadersInit;\n timeoutMs: number;\n retries: number;\n retryDelayMs: number;\n};\n\ntype RequestOptions = {\n method?: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: BodyInit | null | unknown;\n json?: boolean;\n headers?: HeadersInit;\n retry?: boolean;\n};\n\ntype JsonRequestOptions = Omit<RequestOptions, \"body\" | \"json\"> & { body?: unknown };\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst buildUrl = (\n baseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n) => {\n const base = new URL(baseUrl);\n const basePath = base.pathname.endsWith(\"/\") ? base.pathname.slice(0, -1) : base.pathname;\n const pathPart = path.startsWith(\"/\") ? path : `/${path}`;\n base.pathname = `${basePath}${pathPart}`;\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) {\n continue;\n }\n base.searchParams.set(key, String(value));\n }\n }\n\n return base.toString();\n};\n\nconst shouldRetry = (response: Response) => {\n if (response.status >= 500) {\n return true;\n }\n return response.status === 429;\n};\n\nasync function fetchWithRetry(\n url: string,\n init: RequestInit,\n config: Pick<ClientConfig, \"timeoutMs\" | \"retries\" | \"retryDelayMs\">,\n) {\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= config.retries) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeoutMs);\n\n try {\n const response = await fetch(url, { ...init, signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok && shouldRetry(response) && attempt < config.retries) {\n attempt += 1;\n await delay(config.retryDelayMs);\n continue;\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n lastError = error;\n if (attempt >= config.retries) {\n throw error;\n }\n attempt += 1;\n await delay(config.retryDelayMs);\n }\n }\n\n throw lastError ?? new Error(\"Request failed\");\n}\n\nasync function fetchWithTimeout(\n url: string,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\nconst safeJsonParse = (text: string) => {\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return null;\n }\n};\n\nconst readErrorPayload = async (response: Response) => {\n const text = await response.text();\n const parsed = text ? safeJsonParse(text) : undefined;\n const errorPayload = parsed as { message?: string; code?: string } | undefined;\n return {\n text,\n parsed,\n message: errorPayload?.message ?? text ?? response.statusText,\n code: errorPayload?.code,\n };\n};\n\nasync function requestResponse(\n config: ClientConfig,\n path: string,\n { method = \"GET\", query, body, json, headers, retry = true }: RequestOptions = {},\n): Promise<Response> {\n const url = buildUrl(config.baseUrl, path, query);\n const mergedHeaders = new Headers(config.headers ?? {});\n\n if (headers) {\n const extra = new Headers(headers);\n for (const [key, value] of extra.entries()) {\n mergedHeaders.set(key, value);\n }\n }\n\n let payload: BodyInit | undefined;\n\n if (json && body !== undefined) {\n mergedHeaders.set(\"content-type\", \"application/json\");\n payload = JSON.stringify(body);\n } else {\n payload = body as BodyInit | undefined;\n }\n\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers: mergedHeaders,\n body: payload,\n };\n\n if (\n payload &&\n typeof payload === \"object\" &&\n (payload instanceof Readable || \"getReader\" in (payload as object))\n ) {\n init.duplex = \"half\";\n }\n\n const response = retry\n ? await fetchWithRetry(url, init, config)\n : await fetchWithTimeout(url, init, config.timeoutMs);\n\n if (!response.ok) {\n const { message, code } = await readErrorPayload(response);\n const error = new Error(\n `Request failed: ${response.status} ${message}${code ? ` (${code})` : \"\"}`,\n ) as Error & {\n code?: string;\n };\n if (code) {\n error.code = code;\n }\n throw error;\n }\n\n return response;\n}\n\nasync function requestJson<T>(\n config: ClientConfig,\n path: string,\n { method = \"GET\", query, body }: JsonRequestOptions = {},\n): Promise<T> {\n const response = await requestResponse(config, path, { method, query, body, json: true });\n const text = await response.text();\n const parsed = text ? safeJsonParse(text) : undefined;\n\n if (parsed === undefined) {\n return undefined as T;\n }\n\n if (parsed === null && text.trim() !== \"null\") {\n throw new Error(`Expected JSON response from ${path}`);\n }\n\n return parsed as T;\n}\n\nexport function createClient(config: ClientConfig) {\n return {\n buildUrl: (path: string, query?: Record<string, string | number | boolean | undefined>) =>\n buildUrl(config.baseUrl, path, query),\n requestResponse: (path: string, options?: RequestOptions) =>\n requestResponse(config, path, options),\n createUpload: (payload: Record<string, unknown>) =>\n requestJson(config, \"/uploads\", { method: \"POST\", body: payload }),\n getUpload: (uploadId: string) => requestJson(config, `/uploads/${uploadId}`),\n reportProgress: (\n uploadId: string,\n payload: { bytesUploaded?: number; partsUploaded?: number },\n ) => requestJson(config, `/uploads/${uploadId}/progress`, { method: \"POST\", body: payload }),\n getPartUrls: (uploadId: string, partNumbers: number[]) =>\n requestJson(config, `/uploads/${uploadId}/parts`, {\n method: \"POST\",\n body: { partNumbers },\n }),\n listParts: (uploadId: string) => requestJson(config, `/uploads/${uploadId}/parts`),\n completeParts: (\n uploadId: string,\n parts: { partNumber: number; etag: string; sizeBytes: number }[],\n ) =>\n requestJson(config, `/uploads/${uploadId}/parts/complete`, {\n method: \"POST\",\n body: { parts },\n }),\n completeUpload: (uploadId: string, parts?: { partNumber: number; etag: string }[]) =>\n requestJson(config, `/uploads/${uploadId}/complete`, {\n method: \"POST\",\n body: parts && parts.length > 0 ? { parts } : {},\n }),\n abortUpload: (uploadId: string) =>\n requestJson(config, `/uploads/${uploadId}/abort`, { method: \"POST\" }),\n uploadContent: async (uploadId: string, body: BodyInit, contentType: string) => {\n const response = await requestResponse(config, `/uploads/${uploadId}/content`, {\n method: \"PUT\",\n body,\n headers: { \"Content-Type\": contentType },\n retry: false,\n });\n return (await response.json()) as unknown;\n },\n createFile: async (form: FormData) => {\n const response = await requestResponse(config, \"/files\", {\n method: \"POST\",\n body: form,\n retry: false,\n });\n return (await response.json()) as unknown;\n },\n listFiles: (query: Record<string, string | number | boolean | undefined>) =>\n requestJson(config, \"/files\", { method: \"GET\", query }),\n getFile: (fileKey: string) => requestJson(config, `/files/${fileKey}`),\n updateFile: (fileKey: string, payload: Record<string, unknown>) =>\n requestJson(config, `/files/${fileKey}`, { method: \"PATCH\", body: payload }),\n deleteFile: (fileKey: string) => requestJson(config, `/files/${fileKey}`, { method: \"DELETE\" }),\n getDownloadUrl: (fileKey: string) => requestJson(config, `/files/${fileKey}/download-url`),\n downloadContent: (fileKey: string) =>\n requestResponse(config, `/files/${fileKey}/content`, { method: \"GET\" }),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["lastError: unknown","payload: BodyInit | undefined","init: RequestInit & { duplex?: \"half\" }"],"sources":["../../../../src/cli/utils/client.ts"],"sourcesContent":["import { Readable } from \"node:stream\";\n\nexport type ClientConfig = {\n baseUrl: string;\n headers?: HeadersInit;\n timeoutMs: number;\n retries: number;\n retryDelayMs: number;\n};\n\ntype RequestOptions = {\n method?: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: BodyInit | null | unknown;\n json?: boolean;\n headers?: HeadersInit;\n retry?: boolean;\n};\n\ntype JsonRequestOptions = Omit<RequestOptions, \"body\" | \"json\"> & { body?: unknown };\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst buildUrl = (\n baseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n) => {\n const base = new URL(baseUrl);\n const basePath = base.pathname.endsWith(\"/\") ? base.pathname.slice(0, -1) : base.pathname;\n const pathPart = path.startsWith(\"/\") ? path : `/${path}`;\n base.pathname = `${basePath}${pathPart}`;\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) {\n continue;\n }\n base.searchParams.set(key, String(value));\n }\n }\n\n return base.toString();\n};\n\nconst shouldRetry = (response: Response) => {\n if (response.status >= 500) {\n return true;\n }\n return response.status === 429;\n};\n\nasync function fetchWithRetry(\n url: string,\n init: RequestInit,\n config: Pick<ClientConfig, \"timeoutMs\" | \"retries\" | \"retryDelayMs\">,\n) {\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= config.retries) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeoutMs);\n\n try {\n const response = await fetch(url, { ...init, signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok && shouldRetry(response) && attempt < config.retries) {\n attempt += 1;\n await delay(config.retryDelayMs);\n continue;\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n lastError = error;\n if (attempt >= config.retries) {\n throw error;\n }\n attempt += 1;\n await delay(config.retryDelayMs);\n }\n }\n\n throw lastError ?? new Error(\"Request failed\");\n}\n\nasync function fetchWithTimeout(\n url: string,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\nconst safeJsonParse = (text: string) => {\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return null;\n }\n};\n\nconst readErrorPayload = async (response: Response) => {\n const text = await response.text();\n const parsed = text ? safeJsonParse(text) : undefined;\n const errorPayload = parsed as { message?: string; code?: string } | undefined;\n return {\n text,\n parsed,\n message: errorPayload?.message ?? text ?? response.statusText,\n code: errorPayload?.code,\n };\n};\n\nasync function requestResponse(\n config: ClientConfig,\n path: string,\n { method = \"GET\", query, body, json, headers, retry = true }: RequestOptions = {},\n): Promise<Response> {\n const url = buildUrl(config.baseUrl, path, query);\n const mergedHeaders = new Headers(config.headers ?? {});\n\n if (headers) {\n const extra = new Headers(headers);\n for (const [key, value] of extra.entries()) {\n mergedHeaders.set(key, value);\n }\n }\n\n let payload: BodyInit | undefined;\n\n if (json && body !== undefined) {\n mergedHeaders.set(\"content-type\", \"application/json\");\n payload = JSON.stringify(body);\n } else {\n payload = body as BodyInit | undefined;\n }\n\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers: mergedHeaders,\n body: payload,\n };\n\n if (\n payload &&\n typeof payload === \"object\" &&\n (payload instanceof Readable || \"getReader\" in (payload as object))\n ) {\n init.duplex = \"half\";\n }\n\n const response = retry\n ? await fetchWithRetry(url, init, config)\n : await fetchWithTimeout(url, init, config.timeoutMs);\n\n if (!response.ok) {\n const { message, code } = await readErrorPayload(response);\n const error = new Error(\n `Request failed: ${response.status} ${message}${code ? ` (${code})` : \"\"}`,\n ) as Error & {\n code?: string;\n };\n if (code) {\n error.code = code;\n }\n throw error;\n }\n\n return response;\n}\n\nasync function requestJson<T>(\n config: ClientConfig,\n path: string,\n { method = \"GET\", query, body }: JsonRequestOptions = {},\n): Promise<T> {\n const response = await requestResponse(config, path, { method, query, body, json: true });\n const text = await response.text();\n const parsed = text ? safeJsonParse(text) : undefined;\n\n if (parsed === undefined) {\n return undefined as T;\n }\n\n if (parsed === null && text.trim() !== \"null\") {\n throw new Error(`Expected JSON response from ${path}`);\n }\n\n return parsed as T;\n}\n\nexport function createClient(config: ClientConfig) {\n const buildByKeyQuery = (provider: string, fileKey: string) => ({\n provider,\n key: fileKey,\n });\n\n return {\n buildUrl: (path: string, query?: Record<string, string | number | boolean | undefined>) =>\n buildUrl(config.baseUrl, path, query),\n requestResponse: (path: string, options?: RequestOptions) =>\n requestResponse(config, path, options),\n createUpload: (payload: Record<string, unknown>) =>\n requestJson(config, \"/uploads\", { method: \"POST\", body: payload }),\n getUpload: (uploadId: string) => requestJson(config, `/uploads/${uploadId}`),\n reportProgress: (\n uploadId: string,\n payload: { bytesUploaded?: number; partsUploaded?: number },\n ) => requestJson(config, `/uploads/${uploadId}/progress`, { method: \"POST\", body: payload }),\n getPartUrls: (uploadId: string, partNumbers: number[]) =>\n requestJson(config, `/uploads/${uploadId}/parts`, {\n method: \"POST\",\n body: { partNumbers },\n }),\n listParts: (uploadId: string) => requestJson(config, `/uploads/${uploadId}/parts`),\n completeParts: (\n uploadId: string,\n parts: { partNumber: number; etag: string; sizeBytes: number }[],\n ) =>\n requestJson(config, `/uploads/${uploadId}/parts/complete`, {\n method: \"POST\",\n body: { parts },\n }),\n completeUpload: (uploadId: string, parts?: { partNumber: number; etag: string }[]) =>\n requestJson(config, `/uploads/${uploadId}/complete`, {\n method: \"POST\",\n body: parts && parts.length > 0 ? { parts } : {},\n }),\n abortUpload: (uploadId: string) =>\n requestJson(config, `/uploads/${uploadId}/abort`, { method: \"POST\" }),\n uploadContent: async (uploadId: string, body: BodyInit, contentType: string) => {\n const response = await requestResponse(config, `/uploads/${uploadId}/content`, {\n method: \"PUT\",\n body,\n headers: { \"Content-Type\": contentType },\n retry: false,\n });\n return (await response.json()) as unknown;\n },\n createFile: async (form: FormData) => {\n const response = await requestResponse(config, \"/files\", {\n method: \"POST\",\n body: form,\n retry: false,\n });\n return (await response.json()) as unknown;\n },\n listFiles: (query: Record<string, string | number | boolean | undefined>) =>\n requestJson(config, \"/files\", { method: \"GET\", query }),\n getFile: (provider: string, fileKey: string) =>\n requestJson(config, \"/files/by-key\", {\n method: \"GET\",\n query: buildByKeyQuery(provider, fileKey),\n }),\n updateFile: (provider: string, fileKey: string, payload: Record<string, unknown>) =>\n requestJson(config, \"/files/by-key\", {\n method: \"PATCH\",\n query: buildByKeyQuery(provider, fileKey),\n body: payload,\n }),\n deleteFile: (provider: string, fileKey: string) =>\n requestJson(config, \"/files/by-key\", {\n method: \"DELETE\",\n query: buildByKeyQuery(provider, fileKey),\n }),\n getDownloadUrl: (provider: string, fileKey: string) =>\n requestJson(config, \"/files/by-key/download-url\", {\n method: \"GET\",\n query: buildByKeyQuery(provider, fileKey),\n }),\n downloadContent: (provider: string, fileKey: string) =>\n requestResponse(config, \"/files/by-key/content\", {\n method: \"GET\",\n query: buildByKeyQuery(provider, fileKey),\n }),\n };\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { encodeFileKey, encodeFileKeyPrefix } from "../../keys.js";
2
1
  import { createClient } from "./client.js";
3
2
 
4
3
  //#region src/cli/utils/options.ts
@@ -85,51 +84,16 @@ const parseJsonValue = (label, value) => {
85
84
  throw new Error(`Invalid ${label} JSON: ${message}`);
86
85
  }
87
86
  };
88
- const parseFileKeyParts = (label, value) => {
89
- const parsed = parseJsonValue(label, value);
90
- if (!Array.isArray(parsed)) throw new Error(`${label} must be a JSON array`);
91
- for (const part of parsed) if (typeof part !== "string" && typeof part !== "number") throw new Error(`${label} must contain only strings or numbers`);
92
- return parsed;
93
- };
94
87
  const resolveFileKeyValue = (input) => {
95
- if (input.fileKey && input.keyParts) throw new Error("Provide either --file-key or --key-parts, not both.");
96
- if (input.fileKey) return {
97
- fileKey: input.fileKey,
98
- keyParts: void 0
99
- };
100
- if (input.keyParts) {
101
- const parts = parseFileKeyParts("key-parts", input.keyParts);
102
- return {
103
- fileKey: encodeFileKey(parts),
104
- keyParts: parts
105
- };
106
- }
107
- throw new Error("Missing file key. Provide --file-key or --key-parts.");
108
- };
109
- const resolveOptionalFileKeyValue = (input) => {
110
- if (input.fileKey && input.keyParts) throw new Error("Provide either --file-key or --key-parts, not both.");
111
- if (input.fileKey) return {
112
- fileKey: input.fileKey,
113
- keyParts: void 0
114
- };
115
- if (input.keyParts) {
116
- const parts = parseFileKeyParts("key-parts", input.keyParts);
117
- return {
118
- fileKey: encodeFileKey(parts),
119
- keyParts: parts
120
- };
121
- }
122
- return {
123
- fileKey: void 0,
124
- keyParts: void 0
125
- };
88
+ if (input.fileKey) return { fileKey: input.fileKey };
89
+ throw new Error("Missing file key. Provide --file-key.");
126
90
  };
127
- const resolvePrefixValue = (input) => {
128
- if (input.prefix && input.prefixParts) throw new Error("Provide either --prefix or --prefix-parts, not both.");
129
- if (input.prefix) return input.prefix;
130
- if (input.prefixParts) return encodeFileKeyPrefix(parseFileKeyParts("prefix-parts", input.prefixParts));
91
+ const resolvePrefixValue = (input) => input.prefix;
92
+ const resolveProviderValue = (provider) => {
93
+ if (!provider) throw new Error("Missing provider. Provide --provider.");
94
+ return provider;
131
95
  };
132
96
 
133
97
  //#endregion
134
- export { baseArgs, createClientFromContext, parseJsonValue, resolveFileKeyValue, resolveOptionalFileKeyValue, resolvePrefixValue };
98
+ export { baseArgs, createClientFromContext, parseJsonValue, resolveFileKeyValue, resolvePrefixValue, resolveProviderValue };
135
99
  //# sourceMappingURL=options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","names":[],"sources":["../../../../src/cli/utils/options.ts"],"sourcesContent":["import { encodeFileKey, encodeFileKeyPrefix, type FileKeyParts } from \"../../keys.js\";\nimport { createClient, type ClientConfig } from \"./client.js\";\n\ntype CommandContext = { values: Record<string, unknown> };\n\nexport const baseArgs = {\n \"base-url\": {\n type: \"string\",\n short: \"b\",\n description: \"Upload fragment base URL (env: FRAGNO_UPLOAD_BASE_URL)\",\n },\n header: {\n type: \"string\",\n short: \"H\",\n description:\n \"Extra HTTP header (repeatable), format: 'Name: value' (env: FRAGNO_UPLOAD_HEADERS)\",\n multiple: true,\n },\n timeout: {\n type: \"number\",\n description: \"Request timeout in ms (env: FRAGNO_UPLOAD_TIMEOUT_MS, default: 15000)\",\n },\n retries: {\n type: \"number\",\n description: \"Retry count for network/5xx/429 (env: FRAGNO_UPLOAD_RETRIES, default: 2)\",\n },\n \"retry-delay\": {\n type: \"number\",\n description: \"Delay between retries in ms (env: FRAGNO_UPLOAD_RETRY_DELAY_MS, default: 500)\",\n },\n} as const;\n\nconst DEFAULT_TIMEOUT_MS = 15000;\nconst DEFAULT_RETRIES = 2;\nconst DEFAULT_RETRY_DELAY_MS = 500;\n\nconst parseNumberEnv = (value: string | undefined) => {\n if (!value) {\n return undefined;\n }\n const parsed = Number(value);\n if (Number.isNaN(parsed)) {\n return undefined;\n }\n return parsed;\n};\n\nconst normalizeHeaderValues = (value: unknown): string[] => {\n if (!value) {\n return [];\n }\n if (Array.isArray(value)) {\n return value.map(String);\n }\n return [String(value)];\n};\n\nconst parseEnvHeaders = () => {\n const envHeaders = process.env[\"FRAGNO_UPLOAD_HEADERS\"];\n if (!envHeaders) {\n return [];\n }\n return envHeaders\n .split(/\\n|;/)\n .map((entry) => entry.trim())\n .filter(Boolean);\n};\n\nconst buildHeaders = (values: string[]) => {\n const headers = new Headers();\n for (const value of values) {\n const index = value.indexOf(\":\");\n if (index === -1) {\n throw new Error(`Invalid header: ${value}`);\n }\n const name = value.slice(0, index).trim();\n const headerValue = value.slice(index + 1).trim();\n if (!name || !headerValue) {\n throw new Error(`Invalid header: ${value}`);\n }\n headers.append(name, headerValue);\n }\n return headers;\n};\n\nconst resolveTimeout = (ctx: CommandContext) =>\n (ctx.values[\"timeout\"] as number | undefined) ??\n parseNumberEnv(process.env[\"FRAGNO_UPLOAD_TIMEOUT_MS\"]) ??\n DEFAULT_TIMEOUT_MS;\n\nconst resolveRetries = (ctx: CommandContext) =>\n (ctx.values[\"retries\"] as number | undefined) ??\n parseNumberEnv(process.env[\"FRAGNO_UPLOAD_RETRIES\"]) ??\n DEFAULT_RETRIES;\n\nconst resolveRetryDelay = (ctx: CommandContext) =>\n (ctx.values[\"retry-delay\"] as number | undefined) ??\n parseNumberEnv(process.env[\"FRAGNO_UPLOAD_RETRY_DELAY_MS\"]) ??\n DEFAULT_RETRY_DELAY_MS;\n\nexport const resolveBaseUrl = (ctx: CommandContext) => {\n const baseUrl =\n (ctx.values[\"base-url\"] as string | undefined) ?? process.env[\"FRAGNO_UPLOAD_BASE_URL\"];\n if (!baseUrl) {\n throw new Error(\"Missing base URL. Provide --base-url or set FRAGNO_UPLOAD_BASE_URL.\");\n }\n return baseUrl.replace(/\\/$/, \"\");\n};\n\nexport const createClientFromContext = (ctx: CommandContext) => {\n const headerValues = normalizeHeaderValues(ctx.values[\"header\"]).concat(parseEnvHeaders());\n\n const clientConfig: ClientConfig = {\n baseUrl: resolveBaseUrl(ctx),\n headers: buildHeaders(headerValues),\n timeoutMs: resolveTimeout(ctx),\n retries: resolveRetries(ctx),\n retryDelayMs: resolveRetryDelay(ctx),\n };\n\n return createClient(clientConfig);\n};\n\nexport const parseJsonValue = (label: string, value: string | undefined) => {\n if (value === undefined) {\n return undefined;\n }\n try {\n return JSON.parse(value) as unknown;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid ${label} JSON: ${message}`);\n }\n};\n\nexport const parseFileKeyParts = (label: string, value: string | undefined): FileKeyParts => {\n const parsed = parseJsonValue(label, value);\n if (!Array.isArray(parsed)) {\n throw new Error(`${label} must be a JSON array`);\n }\n for (const part of parsed) {\n if (typeof part !== \"string\" && typeof part !== \"number\") {\n throw new Error(`${label} must contain only strings or numbers`);\n }\n }\n return parsed as FileKeyParts;\n};\n\nexport const resolveFileKeyValue = (input: {\n fileKey: string | undefined;\n keyParts: string | undefined;\n}) => {\n if (input.fileKey && input.keyParts) {\n throw new Error(\"Provide either --file-key or --key-parts, not both.\");\n }\n\n if (input.fileKey) {\n return { fileKey: input.fileKey, keyParts: undefined };\n }\n\n if (input.keyParts) {\n const parts = parseFileKeyParts(\"key-parts\", input.keyParts);\n return { fileKey: encodeFileKey(parts), keyParts: parts };\n }\n\n throw new Error(\"Missing file key. Provide --file-key or --key-parts.\");\n};\n\nexport const resolveOptionalFileKeyValue = (input: {\n fileKey: string | undefined;\n keyParts: string | undefined;\n}) => {\n if (input.fileKey && input.keyParts) {\n throw new Error(\"Provide either --file-key or --key-parts, not both.\");\n }\n\n if (input.fileKey) {\n return { fileKey: input.fileKey, keyParts: undefined };\n }\n\n if (input.keyParts) {\n const parts = parseFileKeyParts(\"key-parts\", input.keyParts);\n return { fileKey: encodeFileKey(parts), keyParts: parts };\n }\n\n return { fileKey: undefined, keyParts: undefined };\n};\n\nexport const resolvePrefixValue = (input: {\n prefix: string | undefined;\n prefixParts: string | undefined;\n}) => {\n if (input.prefix && input.prefixParts) {\n throw new Error(\"Provide either --prefix or --prefix-parts, not both.\");\n }\n\n if (input.prefix) {\n return input.prefix;\n }\n\n if (input.prefixParts) {\n const parts = parseFileKeyParts(\"prefix-parts\", input.prefixParts);\n return encodeFileKeyPrefix(parts);\n }\n\n return undefined;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"options.js","names":[],"sources":["../../../../src/cli/utils/options.ts"],"sourcesContent":["import { createClient, type ClientConfig } from \"./client.js\";\n\ntype CommandContext = { values: Record<string, unknown> };\n\nexport const baseArgs = {\n \"base-url\": {\n type: \"string\",\n short: \"b\",\n description: \"Upload fragment base URL (env: FRAGNO_UPLOAD_BASE_URL)\",\n },\n header: {\n type: \"string\",\n short: \"H\",\n description:\n \"Extra HTTP header (repeatable), format: 'Name: value' (env: FRAGNO_UPLOAD_HEADERS)\",\n multiple: true,\n },\n timeout: {\n type: \"number\",\n description: \"Request timeout in ms (env: FRAGNO_UPLOAD_TIMEOUT_MS, default: 15000)\",\n },\n retries: {\n type: \"number\",\n description: \"Retry count for network/5xx/429 (env: FRAGNO_UPLOAD_RETRIES, default: 2)\",\n },\n \"retry-delay\": {\n type: \"number\",\n description: \"Delay between retries in ms (env: FRAGNO_UPLOAD_RETRY_DELAY_MS, default: 500)\",\n },\n} as const;\n\nconst DEFAULT_TIMEOUT_MS = 15000;\nconst DEFAULT_RETRIES = 2;\nconst DEFAULT_RETRY_DELAY_MS = 500;\n\nconst parseNumberEnv = (value: string | undefined) => {\n if (!value) {\n return undefined;\n }\n const parsed = Number(value);\n if (Number.isNaN(parsed)) {\n return undefined;\n }\n return parsed;\n};\n\nconst normalizeHeaderValues = (value: unknown): string[] => {\n if (!value) {\n return [];\n }\n if (Array.isArray(value)) {\n return value.map(String);\n }\n return [String(value)];\n};\n\nconst parseEnvHeaders = () => {\n const envHeaders = process.env[\"FRAGNO_UPLOAD_HEADERS\"];\n if (!envHeaders) {\n return [];\n }\n return envHeaders\n .split(/\\n|;/)\n .map((entry) => entry.trim())\n .filter(Boolean);\n};\n\nconst buildHeaders = (values: string[]) => {\n const headers = new Headers();\n for (const value of values) {\n const index = value.indexOf(\":\");\n if (index === -1) {\n throw new Error(`Invalid header: ${value}`);\n }\n const name = value.slice(0, index).trim();\n const headerValue = value.slice(index + 1).trim();\n if (!name || !headerValue) {\n throw new Error(`Invalid header: ${value}`);\n }\n headers.append(name, headerValue);\n }\n return headers;\n};\n\nconst resolveTimeout = (ctx: CommandContext) =>\n (ctx.values[\"timeout\"] as number | undefined) ??\n parseNumberEnv(process.env[\"FRAGNO_UPLOAD_TIMEOUT_MS\"]) ??\n DEFAULT_TIMEOUT_MS;\n\nconst resolveRetries = (ctx: CommandContext) =>\n (ctx.values[\"retries\"] as number | undefined) ??\n parseNumberEnv(process.env[\"FRAGNO_UPLOAD_RETRIES\"]) ??\n DEFAULT_RETRIES;\n\nconst resolveRetryDelay = (ctx: CommandContext) =>\n (ctx.values[\"retry-delay\"] as number | undefined) ??\n parseNumberEnv(process.env[\"FRAGNO_UPLOAD_RETRY_DELAY_MS\"]) ??\n DEFAULT_RETRY_DELAY_MS;\n\nexport const resolveBaseUrl = (ctx: CommandContext) => {\n const baseUrl =\n (ctx.values[\"base-url\"] as string | undefined) ?? process.env[\"FRAGNO_UPLOAD_BASE_URL\"];\n if (!baseUrl) {\n throw new Error(\"Missing base URL. Provide --base-url or set FRAGNO_UPLOAD_BASE_URL.\");\n }\n return baseUrl.replace(/\\/$/, \"\");\n};\n\nexport const createClientFromContext = (ctx: CommandContext) => {\n const headerValues = normalizeHeaderValues(ctx.values[\"header\"]).concat(parseEnvHeaders());\n\n const clientConfig: ClientConfig = {\n baseUrl: resolveBaseUrl(ctx),\n headers: buildHeaders(headerValues),\n timeoutMs: resolveTimeout(ctx),\n retries: resolveRetries(ctx),\n retryDelayMs: resolveRetryDelay(ctx),\n };\n\n return createClient(clientConfig);\n};\n\nexport const parseJsonValue = (label: string, value: string | undefined) => {\n if (value === undefined) {\n return undefined;\n }\n try {\n return JSON.parse(value) as unknown;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid ${label} JSON: ${message}`);\n }\n};\n\nexport const resolveFileKeyValue = (input: { fileKey: string | undefined }) => {\n if (input.fileKey) {\n return { fileKey: input.fileKey };\n }\n\n throw new Error(\"Missing file key. Provide --file-key.\");\n};\n\nexport const resolveOptionalFileKeyValue = (input: { fileKey: string | undefined }) => {\n return { fileKey: input.fileKey };\n};\n\nexport const resolvePrefixValue = (input: { prefix: string | undefined }) => input.prefix;\n\nexport const resolveProviderValue = (provider: string | undefined) => {\n if (!provider) {\n throw new Error(\"Missing provider. Provide --provider.\");\n }\n\n return provider;\n};\n"],"mappings":";;;AAIA,MAAa,WAAW;CACtB,YAAY;EACV,MAAM;EACN,OAAO;EACP,aAAa;EACd;CACD,QAAQ;EACN,MAAM;EACN,OAAO;EACP,aACE;EACF,UAAU;EACX;CACD,SAAS;EACP,MAAM;EACN,aAAa;EACd;CACD,SAAS;EACP,MAAM;EACN,aAAa;EACd;CACD,eAAe;EACb,MAAM;EACN,aAAa;EACd;CACF;AAED,MAAM,qBAAqB;AAC3B,MAAM,kBAAkB;AACxB,MAAM,yBAAyB;AAE/B,MAAM,kBAAkB,UAA8B;AACpD,KAAI,CAAC,MACH;CAEF,MAAM,SAAS,OAAO,MAAM;AAC5B,KAAI,OAAO,MAAM,OAAO,CACtB;AAEF,QAAO;;AAGT,MAAM,yBAAyB,UAA6B;AAC1D,KAAI,CAAC,MACH,QAAO,EAAE;AAEX,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,IAAI,OAAO;AAE1B,QAAO,CAAC,OAAO,MAAM,CAAC;;AAGxB,MAAM,wBAAwB;CAC5B,MAAM,aAAa,QAAQ,IAAI;AAC/B,KAAI,CAAC,WACH,QAAO,EAAE;AAEX,QAAO,WACJ,MAAM,OAAO,CACb,KAAK,UAAU,MAAM,MAAM,CAAC,CAC5B,OAAO,QAAQ;;AAGpB,MAAM,gBAAgB,WAAqB;CACzC,MAAM,UAAU,IAAI,SAAS;AAC7B,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,QAAQ,MAAM,QAAQ,IAAI;AAChC,MAAI,UAAU,GACZ,OAAM,IAAI,MAAM,mBAAmB,QAAQ;EAE7C,MAAM,OAAO,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM;EACzC,MAAM,cAAc,MAAM,MAAM,QAAQ,EAAE,CAAC,MAAM;AACjD,MAAI,CAAC,QAAQ,CAAC,YACZ,OAAM,IAAI,MAAM,mBAAmB,QAAQ;AAE7C,UAAQ,OAAO,MAAM,YAAY;;AAEnC,QAAO;;AAGT,MAAM,kBAAkB,QACrB,IAAI,OAAO,cACZ,eAAe,QAAQ,IAAI,4BAA4B,IACvD;AAEF,MAAM,kBAAkB,QACrB,IAAI,OAAO,cACZ,eAAe,QAAQ,IAAI,yBAAyB,IACpD;AAEF,MAAM,qBAAqB,QACxB,IAAI,OAAO,kBACZ,eAAe,QAAQ,IAAI,gCAAgC,IAC3D;AAEF,MAAa,kBAAkB,QAAwB;CACrD,MAAM,UACH,IAAI,OAAO,eAAsC,QAAQ,IAAI;AAChE,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,sEAAsE;AAExF,QAAO,QAAQ,QAAQ,OAAO,GAAG;;AAGnC,MAAa,2BAA2B,QAAwB;CAC9D,MAAM,eAAe,sBAAsB,IAAI,OAAO,UAAU,CAAC,OAAO,iBAAiB,CAAC;AAU1F,QAAO,aAR4B;EACjC,SAAS,eAAe,IAAI;EAC5B,SAAS,aAAa,aAAa;EACnC,WAAW,eAAe,IAAI;EAC9B,SAAS,eAAe,IAAI;EAC5B,cAAc,kBAAkB,IAAI;EACrC,CAEgC;;AAGnC,MAAa,kBAAkB,OAAe,UAA8B;AAC1E,KAAI,UAAU,OACZ;AAEF,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;UACjB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,QAAM,IAAI,MAAM,WAAW,MAAM,SAAS,UAAU;;;AAIxD,MAAa,uBAAuB,UAA2C;AAC7E,KAAI,MAAM,QACR,QAAO,EAAE,SAAS,MAAM,SAAS;AAGnC,OAAM,IAAI,MAAM,wCAAwC;;AAO1D,MAAa,sBAAsB,UAA0C,MAAM;AAEnF,MAAa,wBAAwB,aAAiC;AACpE,KAAI,CAAC,SACH,OAAM,IAAI,MAAM,wCAAwC;AAG1D,QAAO"}