@transloadit/node 4.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 (593) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +701 -0
  3. package/dist/ApiError.d.ts +22 -0
  4. package/dist/ApiError.d.ts.map +1 -0
  5. package/dist/ApiError.js +33 -0
  6. package/dist/ApiError.js.map +1 -0
  7. package/dist/InconsistentResponseError.d.ts +4 -0
  8. package/dist/InconsistentResponseError.d.ts.map +1 -0
  9. package/dist/InconsistentResponseError.js +4 -0
  10. package/dist/InconsistentResponseError.js.map +1 -0
  11. package/dist/PaginationStream.d.ts +14 -0
  12. package/dist/PaginationStream.d.ts.map +1 -0
  13. package/dist/PaginationStream.js +36 -0
  14. package/dist/PaginationStream.js.map +1 -0
  15. package/dist/PollingTimeoutError.d.ts +5 -0
  16. package/dist/PollingTimeoutError.d.ts.map +1 -0
  17. package/dist/PollingTimeoutError.js +5 -0
  18. package/dist/PollingTimeoutError.js.map +1 -0
  19. package/dist/Transloadit.d.ts +250 -0
  20. package/dist/Transloadit.d.ts.map +1 -0
  21. package/dist/Transloadit.js +661 -0
  22. package/dist/Transloadit.js.map +1 -0
  23. package/dist/alphalib/lib/nativeGlobby.d.ts +14 -0
  24. package/dist/alphalib/lib/nativeGlobby.d.ts.map +1 -0
  25. package/dist/alphalib/lib/nativeGlobby.js +181 -0
  26. package/dist/alphalib/lib/nativeGlobby.js.map +1 -0
  27. package/dist/alphalib/mcache.d.ts +65 -0
  28. package/dist/alphalib/mcache.d.ts.map +1 -0
  29. package/dist/alphalib/mcache.js +135 -0
  30. package/dist/alphalib/mcache.js.map +1 -0
  31. package/dist/alphalib/tryCatch.d.ts +21 -0
  32. package/dist/alphalib/tryCatch.d.ts.map +1 -0
  33. package/dist/alphalib/tryCatch.js +17 -0
  34. package/dist/alphalib/tryCatch.js.map +1 -0
  35. package/dist/alphalib/types/assembliesGet.d.ts +62 -0
  36. package/dist/alphalib/types/assembliesGet.d.ts.map +1 -0
  37. package/dist/alphalib/types/assembliesGet.js +33 -0
  38. package/dist/alphalib/types/assembliesGet.js.map +1 -0
  39. package/dist/alphalib/types/assemblyReplay.d.ts +7858 -0
  40. package/dist/alphalib/types/assemblyReplay.d.ts.map +1 -0
  41. package/dist/alphalib/types/assemblyReplay.js +15 -0
  42. package/dist/alphalib/types/assemblyReplay.js.map +1 -0
  43. package/dist/alphalib/types/assemblyReplayNotification.d.ts +7849 -0
  44. package/dist/alphalib/types/assemblyReplayNotification.d.ts.map +1 -0
  45. package/dist/alphalib/types/assemblyReplayNotification.js +13 -0
  46. package/dist/alphalib/types/assemblyReplayNotification.js.map +1 -0
  47. package/dist/alphalib/types/assemblyStatus.d.ts +71084 -0
  48. package/dist/alphalib/types/assemblyStatus.d.ts.map +1 -0
  49. package/dist/alphalib/types/assemblyStatus.js +710 -0
  50. package/dist/alphalib/types/assemblyStatus.js.map +1 -0
  51. package/dist/alphalib/types/bill.d.ts +44 -0
  52. package/dist/alphalib/types/bill.d.ts.map +1 -0
  53. package/dist/alphalib/types/bill.js +8 -0
  54. package/dist/alphalib/types/bill.js.map +1 -0
  55. package/dist/alphalib/types/robots/_index.d.ts +76306 -0
  56. package/dist/alphalib/types/robots/_index.d.ts.map +1 -0
  57. package/dist/alphalib/types/robots/_index.js +354 -0
  58. package/dist/alphalib/types/robots/_index.js.map +1 -0
  59. package/dist/alphalib/types/robots/_instructions-primitives.d.ts +3533 -0
  60. package/dist/alphalib/types/robots/_instructions-primitives.d.ts.map +1 -0
  61. package/dist/alphalib/types/robots/_instructions-primitives.js +1491 -0
  62. package/dist/alphalib/types/robots/_instructions-primitives.js.map +1 -0
  63. package/dist/alphalib/types/robots/ai-chat.d.ts +2096 -0
  64. package/dist/alphalib/types/robots/ai-chat.d.ts.map +1 -0
  65. package/dist/alphalib/types/robots/ai-chat.js +223 -0
  66. package/dist/alphalib/types/robots/ai-chat.js.map +1 -0
  67. package/dist/alphalib/types/robots/assembly-savejson.d.ts +52 -0
  68. package/dist/alphalib/types/robots/assembly-savejson.d.ts.map +1 -0
  69. package/dist/alphalib/types/robots/assembly-savejson.js +22 -0
  70. package/dist/alphalib/types/robots/assembly-savejson.js.map +1 -0
  71. package/dist/alphalib/types/robots/audio-artwork.d.ts +2867 -0
  72. package/dist/alphalib/types/robots/audio-artwork.d.ts.map +1 -0
  73. package/dist/alphalib/types/robots/audio-artwork.js +73 -0
  74. package/dist/alphalib/types/robots/audio-artwork.js.map +1 -0
  75. package/dist/alphalib/types/robots/audio-concat.d.ts +2916 -0
  76. package/dist/alphalib/types/robots/audio-concat.d.ts.map +1 -0
  77. package/dist/alphalib/types/robots/audio-concat.js +106 -0
  78. package/dist/alphalib/types/robots/audio-concat.js.map +1 -0
  79. package/dist/alphalib/types/robots/audio-encode.d.ts +2864 -0
  80. package/dist/alphalib/types/robots/audio-encode.d.ts.map +1 -0
  81. package/dist/alphalib/types/robots/audio-encode.js +67 -0
  82. package/dist/alphalib/types/robots/audio-encode.js.map +1 -0
  83. package/dist/alphalib/types/robots/audio-loop.d.ts +2879 -0
  84. package/dist/alphalib/types/robots/audio-loop.d.ts.map +1 -0
  85. package/dist/alphalib/types/robots/audio-loop.js +67 -0
  86. package/dist/alphalib/types/robots/audio-loop.js.map +1 -0
  87. package/dist/alphalib/types/robots/audio-merge.d.ts +2931 -0
  88. package/dist/alphalib/types/robots/audio-merge.d.ts.map +1 -0
  89. package/dist/alphalib/types/robots/audio-merge.js +101 -0
  90. package/dist/alphalib/types/robots/audio-merge.js.map +1 -0
  91. package/dist/alphalib/types/robots/audio-waveform.d.ts +3131 -0
  92. package/dist/alphalib/types/robots/audio-waveform.d.ts.map +1 -0
  93. package/dist/alphalib/types/robots/audio-waveform.js +238 -0
  94. package/dist/alphalib/types/robots/audio-waveform.js.map +1 -0
  95. package/dist/alphalib/types/robots/azure-import.d.ts +210 -0
  96. package/dist/alphalib/types/robots/azure-import.d.ts.map +1 -0
  97. package/dist/alphalib/types/robots/azure-import.js +73 -0
  98. package/dist/alphalib/types/robots/azure-import.js.map +1 -0
  99. package/dist/alphalib/types/robots/azure-store.d.ts +562 -0
  100. package/dist/alphalib/types/robots/azure-store.d.ts.map +1 -0
  101. package/dist/alphalib/types/robots/azure-store.js +115 -0
  102. package/dist/alphalib/types/robots/azure-store.js.map +1 -0
  103. package/dist/alphalib/types/robots/backblaze-import.d.ts +210 -0
  104. package/dist/alphalib/types/robots/backblaze-import.d.ts.map +1 -0
  105. package/dist/alphalib/types/robots/backblaze-import.js +81 -0
  106. package/dist/alphalib/types/robots/backblaze-import.js.map +1 -0
  107. package/dist/alphalib/types/robots/backblaze-store.d.ts +478 -0
  108. package/dist/alphalib/types/robots/backblaze-store.d.ts.map +1 -0
  109. package/dist/alphalib/types/robots/backblaze-store.js +76 -0
  110. package/dist/alphalib/types/robots/backblaze-store.js.map +1 -0
  111. package/dist/alphalib/types/robots/cloudfiles-import.d.ts +234 -0
  112. package/dist/alphalib/types/robots/cloudfiles-import.d.ts.map +1 -0
  113. package/dist/alphalib/types/robots/cloudfiles-import.js +80 -0
  114. package/dist/alphalib/types/robots/cloudfiles-import.js.map +1 -0
  115. package/dist/alphalib/types/robots/cloudfiles-store.d.ts +490 -0
  116. package/dist/alphalib/types/robots/cloudfiles-store.d.ts.map +1 -0
  117. package/dist/alphalib/types/robots/cloudfiles-store.js +70 -0
  118. package/dist/alphalib/types/robots/cloudfiles-store.js.map +1 -0
  119. package/dist/alphalib/types/robots/cloudflare-import.d.ts +234 -0
  120. package/dist/alphalib/types/robots/cloudflare-import.d.ts.map +1 -0
  121. package/dist/alphalib/types/robots/cloudflare-import.js +81 -0
  122. package/dist/alphalib/types/robots/cloudflare-import.js.map +1 -0
  123. package/dist/alphalib/types/robots/cloudflare-store.d.ts +514 -0
  124. package/dist/alphalib/types/robots/cloudflare-store.d.ts.map +1 -0
  125. package/dist/alphalib/types/robots/cloudflare-store.js +86 -0
  126. package/dist/alphalib/types/robots/cloudflare-store.js.map +1 -0
  127. package/dist/alphalib/types/robots/digitalocean-import.d.ts +234 -0
  128. package/dist/alphalib/types/robots/digitalocean-import.d.ts.map +1 -0
  129. package/dist/alphalib/types/robots/digitalocean-import.js +78 -0
  130. package/dist/alphalib/types/robots/digitalocean-import.js.map +1 -0
  131. package/dist/alphalib/types/robots/digitalocean-store.d.ts +526 -0
  132. package/dist/alphalib/types/robots/digitalocean-store.d.ts.map +1 -0
  133. package/dist/alphalib/types/robots/digitalocean-store.js +91 -0
  134. package/dist/alphalib/types/robots/digitalocean-store.js.map +1 -0
  135. package/dist/alphalib/types/robots/document-autorotate.d.ts +405 -0
  136. package/dist/alphalib/types/robots/document-autorotate.d.ts.map +1 -0
  137. package/dist/alphalib/types/robots/document-autorotate.js +44 -0
  138. package/dist/alphalib/types/robots/document-autorotate.js.map +1 -0
  139. package/dist/alphalib/types/robots/document-convert.d.ts +513 -0
  140. package/dist/alphalib/types/robots/document-convert.d.ts.map +1 -0
  141. package/dist/alphalib/types/robots/document-convert.js +273 -0
  142. package/dist/alphalib/types/robots/document-convert.js.map +1 -0
  143. package/dist/alphalib/types/robots/document-merge.d.ts +429 -0
  144. package/dist/alphalib/types/robots/document-merge.d.ts.map +1 -0
  145. package/dist/alphalib/types/robots/document-merge.js +86 -0
  146. package/dist/alphalib/types/robots/document-merge.js.map +1 -0
  147. package/dist/alphalib/types/robots/document-ocr.d.ts +441 -0
  148. package/dist/alphalib/types/robots/document-ocr.d.ts.map +1 -0
  149. package/dist/alphalib/types/robots/document-ocr.js +86 -0
  150. package/dist/alphalib/types/robots/document-ocr.js.map +1 -0
  151. package/dist/alphalib/types/robots/document-split.d.ts +417 -0
  152. package/dist/alphalib/types/robots/document-split.d.ts.map +1 -0
  153. package/dist/alphalib/types/robots/document-split.js +48 -0
  154. package/dist/alphalib/types/robots/document-split.js.map +1 -0
  155. package/dist/alphalib/types/robots/document-thumbs.d.ts +592 -0
  156. package/dist/alphalib/types/robots/document-thumbs.d.ts.map +1 -0
  157. package/dist/alphalib/types/robots/document-thumbs.js +196 -0
  158. package/dist/alphalib/types/robots/document-thumbs.js.map +1 -0
  159. package/dist/alphalib/types/robots/dropbox-import.d.ts +144 -0
  160. package/dist/alphalib/types/robots/dropbox-import.d.ts.map +1 -0
  161. package/dist/alphalib/types/robots/dropbox-import.js +65 -0
  162. package/dist/alphalib/types/robots/dropbox-import.js.map +1 -0
  163. package/dist/alphalib/types/robots/dropbox-store.d.ts +449 -0
  164. package/dist/alphalib/types/robots/dropbox-store.d.ts.map +1 -0
  165. package/dist/alphalib/types/robots/dropbox-store.js +68 -0
  166. package/dist/alphalib/types/robots/dropbox-store.js.map +1 -0
  167. package/dist/alphalib/types/robots/edgly-deliver.d.ts +100 -0
  168. package/dist/alphalib/types/robots/edgly-deliver.d.ts.map +1 -0
  169. package/dist/alphalib/types/robots/edgly-deliver.js +46 -0
  170. package/dist/alphalib/types/robots/edgly-deliver.js.map +1 -0
  171. package/dist/alphalib/types/robots/file-compress.d.ts +477 -0
  172. package/dist/alphalib/types/robots/file-compress.d.ts.map +1 -0
  173. package/dist/alphalib/types/robots/file-compress.js +139 -0
  174. package/dist/alphalib/types/robots/file-compress.js.map +1 -0
  175. package/dist/alphalib/types/robots/file-decompress.d.ts +404 -0
  176. package/dist/alphalib/types/robots/file-decompress.d.ts.map +1 -0
  177. package/dist/alphalib/types/robots/file-decompress.js +94 -0
  178. package/dist/alphalib/types/robots/file-decompress.js.map +1 -0
  179. package/dist/alphalib/types/robots/file-filter.d.ts +465 -0
  180. package/dist/alphalib/types/robots/file-filter.d.ts.map +1 -0
  181. package/dist/alphalib/types/robots/file-filter.js +136 -0
  182. package/dist/alphalib/types/robots/file-filter.js.map +1 -0
  183. package/dist/alphalib/types/robots/file-hash.d.ts +417 -0
  184. package/dist/alphalib/types/robots/file-hash.d.ts.map +1 -0
  185. package/dist/alphalib/types/robots/file-hash.js +59 -0
  186. package/dist/alphalib/types/robots/file-hash.js.map +1 -0
  187. package/dist/alphalib/types/robots/file-preview.d.ts +854 -0
  188. package/dist/alphalib/types/robots/file-preview.d.ts.map +1 -0
  189. package/dist/alphalib/types/robots/file-preview.js +221 -0
  190. package/dist/alphalib/types/robots/file-preview.js.map +1 -0
  191. package/dist/alphalib/types/robots/file-read.d.ts +405 -0
  192. package/dist/alphalib/types/robots/file-read.d.ts.map +1 -0
  193. package/dist/alphalib/types/robots/file-read.js +44 -0
  194. package/dist/alphalib/types/robots/file-read.js.map +1 -0
  195. package/dist/alphalib/types/robots/file-serve.d.ts +418 -0
  196. package/dist/alphalib/types/robots/file-serve.d.ts.map +1 -0
  197. package/dist/alphalib/types/robots/file-serve.js +99 -0
  198. package/dist/alphalib/types/robots/file-serve.js.map +1 -0
  199. package/dist/alphalib/types/robots/file-verify.d.ts +441 -0
  200. package/dist/alphalib/types/robots/file-verify.d.ts.map +1 -0
  201. package/dist/alphalib/types/robots/file-verify.js +73 -0
  202. package/dist/alphalib/types/robots/file-verify.js.map +1 -0
  203. package/dist/alphalib/types/robots/file-virusscan.d.ts +435 -0
  204. package/dist/alphalib/types/robots/file-virusscan.d.ts.map +1 -0
  205. package/dist/alphalib/types/robots/file-virusscan.js +82 -0
  206. package/dist/alphalib/types/robots/file-virusscan.js.map +1 -0
  207. package/dist/alphalib/types/robots/file-watermark.d.ts +417 -0
  208. package/dist/alphalib/types/robots/file-watermark.d.ts.map +1 -0
  209. package/dist/alphalib/types/robots/file-watermark.js +28 -0
  210. package/dist/alphalib/types/robots/file-watermark.js.map +1 -0
  211. package/dist/alphalib/types/robots/ftp-import.d.ts +198 -0
  212. package/dist/alphalib/types/robots/ftp-import.d.ts.map +1 -0
  213. package/dist/alphalib/types/robots/ftp-import.js +60 -0
  214. package/dist/alphalib/types/robots/ftp-import.js.map +1 -0
  215. package/dist/alphalib/types/robots/ftp-store.d.ts +532 -0
  216. package/dist/alphalib/types/robots/ftp-store.d.ts.map +1 -0
  217. package/dist/alphalib/types/robots/ftp-store.js +91 -0
  218. package/dist/alphalib/types/robots/ftp-store.js.map +1 -0
  219. package/dist/alphalib/types/robots/google-import.d.ts +174 -0
  220. package/dist/alphalib/types/robots/google-import.d.ts.map +1 -0
  221. package/dist/alphalib/types/robots/google-import.js +77 -0
  222. package/dist/alphalib/types/robots/google-import.js.map +1 -0
  223. package/dist/alphalib/types/robots/google-store.d.ts +476 -0
  224. package/dist/alphalib/types/robots/google-store.d.ts.map +1 -0
  225. package/dist/alphalib/types/robots/google-store.js +111 -0
  226. package/dist/alphalib/types/robots/google-store.js.map +1 -0
  227. package/dist/alphalib/types/robots/html-convert.d.ts +531 -0
  228. package/dist/alphalib/types/robots/html-convert.d.ts.map +1 -0
  229. package/dist/alphalib/types/robots/html-convert.js +137 -0
  230. package/dist/alphalib/types/robots/html-convert.js.map +1 -0
  231. package/dist/alphalib/types/robots/http-import.d.ts +215 -0
  232. package/dist/alphalib/types/robots/http-import.d.ts.map +1 -0
  233. package/dist/alphalib/types/robots/http-import.js +135 -0
  234. package/dist/alphalib/types/robots/http-import.js.map +1 -0
  235. package/dist/alphalib/types/robots/image-bgremove.d.ts +453 -0
  236. package/dist/alphalib/types/robots/image-bgremove.d.ts.map +1 -0
  237. package/dist/alphalib/types/robots/image-bgremove.js +65 -0
  238. package/dist/alphalib/types/robots/image-bgremove.js.map +1 -0
  239. package/dist/alphalib/types/robots/image-describe.d.ts +453 -0
  240. package/dist/alphalib/types/robots/image-describe.d.ts.map +1 -0
  241. package/dist/alphalib/types/robots/image-describe.js +86 -0
  242. package/dist/alphalib/types/robots/image-describe.js.map +1 -0
  243. package/dist/alphalib/types/robots/image-facedetect.d.ts +477 -0
  244. package/dist/alphalib/types/robots/image-facedetect.d.ts.map +1 -0
  245. package/dist/alphalib/types/robots/image-facedetect.js +151 -0
  246. package/dist/alphalib/types/robots/image-facedetect.js.map +1 -0
  247. package/dist/alphalib/types/robots/image-generate.d.ts +522 -0
  248. package/dist/alphalib/types/robots/image-generate.d.ts.map +1 -0
  249. package/dist/alphalib/types/robots/image-generate.js +64 -0
  250. package/dist/alphalib/types/robots/image-generate.js.map +1 -0
  251. package/dist/alphalib/types/robots/image-merge.d.ts +477 -0
  252. package/dist/alphalib/types/robots/image-merge.d.ts.map +1 -0
  253. package/dist/alphalib/types/robots/image-merge.js +92 -0
  254. package/dist/alphalib/types/robots/image-merge.js.map +1 -0
  255. package/dist/alphalib/types/robots/image-ocr.d.ts +441 -0
  256. package/dist/alphalib/types/robots/image-ocr.d.ts.map +1 -0
  257. package/dist/alphalib/types/robots/image-ocr.js +79 -0
  258. package/dist/alphalib/types/robots/image-ocr.js.map +1 -0
  259. package/dist/alphalib/types/robots/image-optimize.d.ts +453 -0
  260. package/dist/alphalib/types/robots/image-optimize.d.ts.map +1 -0
  261. package/dist/alphalib/types/robots/image-optimize.js +81 -0
  262. package/dist/alphalib/types/robots/image-optimize.js.map +1 -0
  263. package/dist/alphalib/types/robots/image-resize.d.ts +1758 -0
  264. package/dist/alphalib/types/robots/image-resize.d.ts.map +1 -0
  265. package/dist/alphalib/types/robots/image-resize.js +602 -0
  266. package/dist/alphalib/types/robots/image-resize.js.map +1 -0
  267. package/dist/alphalib/types/robots/meta-read.d.ts +98 -0
  268. package/dist/alphalib/types/robots/meta-read.d.ts.map +1 -0
  269. package/dist/alphalib/types/robots/meta-read.js +24 -0
  270. package/dist/alphalib/types/robots/meta-read.js.map +1 -0
  271. package/dist/alphalib/types/robots/meta-write.d.ts +2842 -0
  272. package/dist/alphalib/types/robots/meta-write.d.ts.map +1 -0
  273. package/dist/alphalib/types/robots/meta-write.js +66 -0
  274. package/dist/alphalib/types/robots/meta-write.js.map +1 -0
  275. package/dist/alphalib/types/robots/minio-import.d.ts +234 -0
  276. package/dist/alphalib/types/robots/minio-import.d.ts.map +1 -0
  277. package/dist/alphalib/types/robots/minio-import.js +81 -0
  278. package/dist/alphalib/types/robots/minio-import.js.map +1 -0
  279. package/dist/alphalib/types/robots/minio-store.d.ts +514 -0
  280. package/dist/alphalib/types/robots/minio-store.d.ts.map +1 -0
  281. package/dist/alphalib/types/robots/minio-store.js +87 -0
  282. package/dist/alphalib/types/robots/minio-store.js.map +1 -0
  283. package/dist/alphalib/types/robots/progress-simulate.d.ts +229 -0
  284. package/dist/alphalib/types/robots/progress-simulate.d.ts.map +1 -0
  285. package/dist/alphalib/types/robots/progress-simulate.js +25 -0
  286. package/dist/alphalib/types/robots/progress-simulate.js.map +1 -0
  287. package/dist/alphalib/types/robots/s3-import.d.ts +246 -0
  288. package/dist/alphalib/types/robots/s3-import.d.ts.map +1 -0
  289. package/dist/alphalib/types/robots/s3-import.js +137 -0
  290. package/dist/alphalib/types/robots/s3-import.js.map +1 -0
  291. package/dist/alphalib/types/robots/s3-store.d.ts +593 -0
  292. package/dist/alphalib/types/robots/s3-store.d.ts.map +1 -0
  293. package/dist/alphalib/types/robots/s3-store.js +169 -0
  294. package/dist/alphalib/types/robots/s3-store.js.map +1 -0
  295. package/dist/alphalib/types/robots/script-run.d.ts +423 -0
  296. package/dist/alphalib/types/robots/script-run.d.ts.map +1 -0
  297. package/dist/alphalib/types/robots/script-run.js +95 -0
  298. package/dist/alphalib/types/robots/script-run.js.map +1 -0
  299. package/dist/alphalib/types/robots/sftp-import.d.ts +192 -0
  300. package/dist/alphalib/types/robots/sftp-import.d.ts.map +1 -0
  301. package/dist/alphalib/types/robots/sftp-import.js +62 -0
  302. package/dist/alphalib/types/robots/sftp-import.js.map +1 -0
  303. package/dist/alphalib/types/robots/sftp-store.d.ts +520 -0
  304. package/dist/alphalib/types/robots/sftp-store.d.ts.map +1 -0
  305. package/dist/alphalib/types/robots/sftp-store.js +83 -0
  306. package/dist/alphalib/types/robots/sftp-store.js.map +1 -0
  307. package/dist/alphalib/types/robots/speech-transcribe.d.ts +465 -0
  308. package/dist/alphalib/types/robots/speech-transcribe.d.ts.map +1 -0
  309. package/dist/alphalib/types/robots/speech-transcribe.js +103 -0
  310. package/dist/alphalib/types/robots/speech-transcribe.js.map +1 -0
  311. package/dist/alphalib/types/robots/supabase-import.d.ts +246 -0
  312. package/dist/alphalib/types/robots/supabase-import.d.ts.map +1 -0
  313. package/dist/alphalib/types/robots/supabase-import.js +83 -0
  314. package/dist/alphalib/types/robots/supabase-import.js.map +1 -0
  315. package/dist/alphalib/types/robots/supabase-store.d.ts +514 -0
  316. package/dist/alphalib/types/robots/supabase-store.d.ts.map +1 -0
  317. package/dist/alphalib/types/robots/supabase-store.js +77 -0
  318. package/dist/alphalib/types/robots/supabase-store.js.map +1 -0
  319. package/dist/alphalib/types/robots/swift-import.d.ts +246 -0
  320. package/dist/alphalib/types/robots/swift-import.d.ts.map +1 -0
  321. package/dist/alphalib/types/robots/swift-import.js +81 -0
  322. package/dist/alphalib/types/robots/swift-import.js.map +1 -0
  323. package/dist/alphalib/types/robots/swift-store.d.ts +526 -0
  324. package/dist/alphalib/types/robots/swift-store.d.ts.map +1 -0
  325. package/dist/alphalib/types/robots/swift-store.js +84 -0
  326. package/dist/alphalib/types/robots/swift-store.js.map +1 -0
  327. package/dist/alphalib/types/robots/text-speak.d.ts +465 -0
  328. package/dist/alphalib/types/robots/text-speak.d.ts.map +1 -0
  329. package/dist/alphalib/types/robots/text-speak.js +119 -0
  330. package/dist/alphalib/types/robots/text-speak.js.map +1 -0
  331. package/dist/alphalib/types/robots/text-translate.d.ts +441 -0
  332. package/dist/alphalib/types/robots/text-translate.d.ts.map +1 -0
  333. package/dist/alphalib/types/robots/text-translate.js +211 -0
  334. package/dist/alphalib/types/robots/text-translate.js.map +1 -0
  335. package/dist/alphalib/types/robots/tigris-import.d.ts +244 -0
  336. package/dist/alphalib/types/robots/tigris-import.d.ts.map +1 -0
  337. package/dist/alphalib/types/robots/tigris-import.js +85 -0
  338. package/dist/alphalib/types/robots/tigris-import.js.map +1 -0
  339. package/dist/alphalib/types/robots/tigris-store.d.ts +524 -0
  340. package/dist/alphalib/types/robots/tigris-store.d.ts.map +1 -0
  341. package/dist/alphalib/types/robots/tigris-store.js +91 -0
  342. package/dist/alphalib/types/robots/tigris-store.js.map +1 -0
  343. package/dist/alphalib/types/robots/tlcdn-deliver.d.ts +100 -0
  344. package/dist/alphalib/types/robots/tlcdn-deliver.d.ts.map +1 -0
  345. package/dist/alphalib/types/robots/tlcdn-deliver.js +46 -0
  346. package/dist/alphalib/types/robots/tlcdn-deliver.js.map +1 -0
  347. package/dist/alphalib/types/robots/tus-store.d.ts +477 -0
  348. package/dist/alphalib/types/robots/tus-store.d.ts.map +1 -0
  349. package/dist/alphalib/types/robots/tus-store.js +102 -0
  350. package/dist/alphalib/types/robots/tus-store.js.map +1 -0
  351. package/dist/alphalib/types/robots/upload-handle.d.ts +100 -0
  352. package/dist/alphalib/types/robots/upload-handle.d.ts.map +1 -0
  353. package/dist/alphalib/types/robots/upload-handle.js +66 -0
  354. package/dist/alphalib/types/robots/upload-handle.js.map +1 -0
  355. package/dist/alphalib/types/robots/video-adaptive.d.ts +2915 -0
  356. package/dist/alphalib/types/robots/video-adaptive.d.ts.map +1 -0
  357. package/dist/alphalib/types/robots/video-adaptive.js +144 -0
  358. package/dist/alphalib/types/robots/video-adaptive.js.map +1 -0
  359. package/dist/alphalib/types/robots/video-concat.d.ts +2891 -0
  360. package/dist/alphalib/types/robots/video-concat.d.ts.map +1 -0
  361. package/dist/alphalib/types/robots/video-concat.js +96 -0
  362. package/dist/alphalib/types/robots/video-concat.js.map +1 -0
  363. package/dist/alphalib/types/robots/video-encode.d.ts +3280 -0
  364. package/dist/alphalib/types/robots/video-encode.d.ts.map +1 -0
  365. package/dist/alphalib/types/robots/video-encode.js +107 -0
  366. package/dist/alphalib/types/robots/video-encode.js.map +1 -0
  367. package/dist/alphalib/types/robots/video-merge.d.ts +2987 -0
  368. package/dist/alphalib/types/robots/video-merge.d.ts.map +1 -0
  369. package/dist/alphalib/types/robots/video-merge.js +102 -0
  370. package/dist/alphalib/types/robots/video-merge.js.map +1 -0
  371. package/dist/alphalib/types/robots/video-ondemand.d.ts +4553 -0
  372. package/dist/alphalib/types/robots/video-ondemand.d.ts.map +1 -0
  373. package/dist/alphalib/types/robots/video-ondemand.js +112 -0
  374. package/dist/alphalib/types/robots/video-ondemand.js.map +1 -0
  375. package/dist/alphalib/types/robots/video-subtitle.d.ts +2975 -0
  376. package/dist/alphalib/types/robots/video-subtitle.d.ts.map +1 -0
  377. package/dist/alphalib/types/robots/video-subtitle.js +122 -0
  378. package/dist/alphalib/types/robots/video-subtitle.js.map +1 -0
  379. package/dist/alphalib/types/robots/video-thumbs.d.ts +2938 -0
  380. package/dist/alphalib/types/robots/video-thumbs.d.ts.map +1 -0
  381. package/dist/alphalib/types/robots/video-thumbs.js +122 -0
  382. package/dist/alphalib/types/robots/video-thumbs.js.map +1 -0
  383. package/dist/alphalib/types/robots/vimeo-import.d.ts +189 -0
  384. package/dist/alphalib/types/robots/vimeo-import.d.ts.map +1 -0
  385. package/dist/alphalib/types/robots/vimeo-import.js +92 -0
  386. package/dist/alphalib/types/robots/vimeo-import.js.map +1 -0
  387. package/dist/alphalib/types/robots/vimeo-store.d.ts +520 -0
  388. package/dist/alphalib/types/robots/vimeo-store.d.ts.map +1 -0
  389. package/dist/alphalib/types/robots/vimeo-store.js +115 -0
  390. package/dist/alphalib/types/robots/vimeo-store.js.map +1 -0
  391. package/dist/alphalib/types/robots/wasabi-import.d.ts +244 -0
  392. package/dist/alphalib/types/robots/wasabi-import.d.ts.map +1 -0
  393. package/dist/alphalib/types/robots/wasabi-import.js +85 -0
  394. package/dist/alphalib/types/robots/wasabi-import.js.map +1 -0
  395. package/dist/alphalib/types/robots/wasabi-store.d.ts +526 -0
  396. package/dist/alphalib/types/robots/wasabi-store.d.ts.map +1 -0
  397. package/dist/alphalib/types/robots/wasabi-store.js +85 -0
  398. package/dist/alphalib/types/robots/wasabi-store.js.map +1 -0
  399. package/dist/alphalib/types/robots/youtube-store.d.ts +477 -0
  400. package/dist/alphalib/types/robots/youtube-store.d.ts.map +1 -0
  401. package/dist/alphalib/types/robots/youtube-store.js +122 -0
  402. package/dist/alphalib/types/robots/youtube-store.js.map +1 -0
  403. package/dist/alphalib/types/stackVersions.d.ts +13 -0
  404. package/dist/alphalib/types/stackVersions.d.ts.map +1 -0
  405. package/dist/alphalib/types/stackVersions.js +13 -0
  406. package/dist/alphalib/types/stackVersions.js.map +1 -0
  407. package/dist/alphalib/types/template.d.ts +131710 -0
  408. package/dist/alphalib/types/template.d.ts.map +1 -0
  409. package/dist/alphalib/types/template.js +218 -0
  410. package/dist/alphalib/types/template.js.map +1 -0
  411. package/dist/alphalib/types/templateCredential.d.ts +95 -0
  412. package/dist/alphalib/types/templateCredential.d.ts.map +1 -0
  413. package/dist/alphalib/types/templateCredential.js +57 -0
  414. package/dist/alphalib/types/templateCredential.js.map +1 -0
  415. package/dist/alphalib/zodParseWithContext.d.ts +17 -0
  416. package/dist/alphalib/zodParseWithContext.d.ts.map +1 -0
  417. package/dist/alphalib/zodParseWithContext.js +248 -0
  418. package/dist/alphalib/zodParseWithContext.js.map +1 -0
  419. package/dist/apiTypes.d.ts +112 -0
  420. package/dist/apiTypes.d.ts.map +1 -0
  421. package/dist/apiTypes.js +3 -0
  422. package/dist/apiTypes.js.map +1 -0
  423. package/dist/cli/OutputCtl.d.ts +47 -0
  424. package/dist/cli/OutputCtl.d.ts.map +1 -0
  425. package/dist/cli/OutputCtl.js +85 -0
  426. package/dist/cli/OutputCtl.js.map +1 -0
  427. package/dist/cli/commands/BaseCommand.d.ts +24 -0
  428. package/dist/cli/commands/BaseCommand.d.ts.map +1 -0
  429. package/dist/cli/commands/BaseCommand.js +52 -0
  430. package/dist/cli/commands/BaseCommand.js.map +1 -0
  431. package/dist/cli/commands/assemblies.d.ts +93 -0
  432. package/dist/cli/commands/assemblies.d.ts.map +1 -0
  433. package/dist/cli/commands/assemblies.js +1021 -0
  434. package/dist/cli/commands/assemblies.js.map +1 -0
  435. package/dist/cli/commands/auth.d.ts +28 -0
  436. package/dist/cli/commands/auth.d.ts.map +1 -0
  437. package/dist/cli/commands/auth.js +280 -0
  438. package/dist/cli/commands/auth.js.map +1 -0
  439. package/dist/cli/commands/bills.d.ts +14 -0
  440. package/dist/cli/commands/bills.d.ts.map +1 -0
  441. package/dist/cli/commands/bills.js +69 -0
  442. package/dist/cli/commands/bills.js.map +1 -0
  443. package/dist/cli/commands/index.d.ts +3 -0
  444. package/dist/cli/commands/index.d.ts.map +1 -0
  445. package/dist/cli/commands/index.js +39 -0
  446. package/dist/cli/commands/index.js.map +1 -0
  447. package/dist/cli/commands/notifications.d.ts +9 -0
  448. package/dist/cli/commands/notifications.d.ts.map +1 -0
  449. package/dist/cli/commands/notifications.js +44 -0
  450. package/dist/cli/commands/notifications.js.map +1 -0
  451. package/dist/cli/commands/templates.d.ts +73 -0
  452. package/dist/cli/commands/templates.d.ts.map +1 -0
  453. package/dist/cli/commands/templates.js +428 -0
  454. package/dist/cli/commands/templates.js.map +1 -0
  455. package/dist/cli/helpers.d.ts +13 -0
  456. package/dist/cli/helpers.d.ts.map +1 -0
  457. package/dist/cli/helpers.js +39 -0
  458. package/dist/cli/helpers.js.map +1 -0
  459. package/dist/cli/template-last-modified.d.ts +10 -0
  460. package/dist/cli/template-last-modified.d.ts.map +1 -0
  461. package/dist/cli/template-last-modified.js +134 -0
  462. package/dist/cli/template-last-modified.js.map +1 -0
  463. package/dist/cli/types.d.ts +78 -0
  464. package/dist/cli/types.d.ts.map +1 -0
  465. package/dist/cli/types.js +49 -0
  466. package/dist/cli/types.js.map +1 -0
  467. package/dist/cli.d.ts +6 -0
  468. package/dist/cli.d.ts.map +1 -0
  469. package/dist/cli.js +41 -0
  470. package/dist/cli.js.map +1 -0
  471. package/dist/tus.d.ts +18 -0
  472. package/dist/tus.d.ts.map +1 -0
  473. package/dist/tus.js +122 -0
  474. package/dist/tus.js.map +1 -0
  475. package/package.json +92 -0
  476. package/src/ApiError.ts +49 -0
  477. package/src/InconsistentResponseError.ts +3 -0
  478. package/src/PaginationStream.ts +54 -0
  479. package/src/PollingTimeoutError.ts +5 -0
  480. package/src/Transloadit.ts +980 -0
  481. package/src/alphalib/lib/nativeGlobby.ts +244 -0
  482. package/src/alphalib/mcache.ts +184 -0
  483. package/src/alphalib/tryCatch.ts +30 -0
  484. package/src/alphalib/types/assembliesGet.ts +42 -0
  485. package/src/alphalib/types/assemblyReplay.ts +24 -0
  486. package/src/alphalib/types/assemblyReplayNotification.ts +16 -0
  487. package/src/alphalib/types/assemblyStatus.ts +794 -0
  488. package/src/alphalib/types/bill.ts +9 -0
  489. package/src/alphalib/types/robots/_index.ts +1201 -0
  490. package/src/alphalib/types/robots/_instructions-primitives.ts +1770 -0
  491. package/src/alphalib/types/robots/ai-chat.ts +278 -0
  492. package/src/alphalib/types/robots/assembly-savejson.ts +37 -0
  493. package/src/alphalib/types/robots/audio-artwork.ts +107 -0
  494. package/src/alphalib/types/robots/audio-concat.ts +142 -0
  495. package/src/alphalib/types/robots/audio-encode.ts +103 -0
  496. package/src/alphalib/types/robots/audio-loop.ts +102 -0
  497. package/src/alphalib/types/robots/audio-merge.ts +137 -0
  498. package/src/alphalib/types/robots/audio-waveform.ts +280 -0
  499. package/src/alphalib/types/robots/azure-import.ts +111 -0
  500. package/src/alphalib/types/robots/azure-store.ts +143 -0
  501. package/src/alphalib/types/robots/backblaze-import.ts +119 -0
  502. package/src/alphalib/types/robots/backblaze-store.ts +104 -0
  503. package/src/alphalib/types/robots/cloudfiles-import.ts +118 -0
  504. package/src/alphalib/types/robots/cloudfiles-store.ts +104 -0
  505. package/src/alphalib/types/robots/cloudflare-import.ts +121 -0
  506. package/src/alphalib/types/robots/cloudflare-store.ts +120 -0
  507. package/src/alphalib/types/robots/digitalocean-import.ts +118 -0
  508. package/src/alphalib/types/robots/digitalocean-store.ts +125 -0
  509. package/src/alphalib/types/robots/document-autorotate.ts +74 -0
  510. package/src/alphalib/types/robots/document-convert.ts +302 -0
  511. package/src/alphalib/types/robots/document-merge.ts +114 -0
  512. package/src/alphalib/types/robots/document-ocr.ts +120 -0
  513. package/src/alphalib/types/robots/document-split.ts +78 -0
  514. package/src/alphalib/types/robots/document-thumbs.ts +231 -0
  515. package/src/alphalib/types/robots/dropbox-import.ts +100 -0
  516. package/src/alphalib/types/robots/dropbox-store.ts +97 -0
  517. package/src/alphalib/types/robots/edgly-deliver.ts +73 -0
  518. package/src/alphalib/types/robots/file-compress.ts +167 -0
  519. package/src/alphalib/types/robots/file-decompress.ts +125 -0
  520. package/src/alphalib/types/robots/file-filter.ts +173 -0
  521. package/src/alphalib/types/robots/file-hash.ts +86 -0
  522. package/src/alphalib/types/robots/file-preview.ts +260 -0
  523. package/src/alphalib/types/robots/file-read.ts +71 -0
  524. package/src/alphalib/types/robots/file-serve.ts +128 -0
  525. package/src/alphalib/types/robots/file-verify.ts +102 -0
  526. package/src/alphalib/types/robots/file-virusscan.ts +113 -0
  527. package/src/alphalib/types/robots/file-watermark.ts +56 -0
  528. package/src/alphalib/types/robots/ftp-import.ts +95 -0
  529. package/src/alphalib/types/robots/ftp-store.ts +119 -0
  530. package/src/alphalib/types/robots/google-import.ts +115 -0
  531. package/src/alphalib/types/robots/google-store.ts +139 -0
  532. package/src/alphalib/types/robots/html-convert.ts +165 -0
  533. package/src/alphalib/types/robots/http-import.ts +168 -0
  534. package/src/alphalib/types/robots/image-bgremove.ts +95 -0
  535. package/src/alphalib/types/robots/image-describe.ts +121 -0
  536. package/src/alphalib/types/robots/image-facedetect.ts +187 -0
  537. package/src/alphalib/types/robots/image-generate.ts +92 -0
  538. package/src/alphalib/types/robots/image-merge.ts +127 -0
  539. package/src/alphalib/types/robots/image-ocr.ts +112 -0
  540. package/src/alphalib/types/robots/image-optimize.ts +114 -0
  541. package/src/alphalib/types/robots/image-resize.ts +653 -0
  542. package/src/alphalib/types/robots/meta-read.ts +44 -0
  543. package/src/alphalib/types/robots/meta-write.ts +93 -0
  544. package/src/alphalib/types/robots/minio-import.ts +120 -0
  545. package/src/alphalib/types/robots/minio-store.ts +115 -0
  546. package/src/alphalib/types/robots/progress-simulate.ts +40 -0
  547. package/src/alphalib/types/robots/s3-import.ts +175 -0
  548. package/src/alphalib/types/robots/s3-store.ts +198 -0
  549. package/src/alphalib/types/robots/script-run.ts +122 -0
  550. package/src/alphalib/types/robots/sftp-import.ts +92 -0
  551. package/src/alphalib/types/robots/sftp-store.ts +110 -0
  552. package/src/alphalib/types/robots/speech-transcribe.ts +139 -0
  553. package/src/alphalib/types/robots/supabase-import.ts +122 -0
  554. package/src/alphalib/types/robots/supabase-store.ts +105 -0
  555. package/src/alphalib/types/robots/swift-import.ts +120 -0
  556. package/src/alphalib/types/robots/swift-store.ts +112 -0
  557. package/src/alphalib/types/robots/text-speak.ts +152 -0
  558. package/src/alphalib/types/robots/text-translate.ts +245 -0
  559. package/src/alphalib/types/robots/tigris-import.ts +124 -0
  560. package/src/alphalib/types/robots/tigris-store.ts +119 -0
  561. package/src/alphalib/types/robots/tlcdn-deliver.ts +73 -0
  562. package/src/alphalib/types/robots/tus-store.ts +129 -0
  563. package/src/alphalib/types/robots/upload-handle.ts +95 -0
  564. package/src/alphalib/types/robots/video-adaptive.ts +179 -0
  565. package/src/alphalib/types/robots/video-concat.ts +130 -0
  566. package/src/alphalib/types/robots/video-encode.ts +141 -0
  567. package/src/alphalib/types/robots/video-merge.ts +138 -0
  568. package/src/alphalib/types/robots/video-ondemand.ts +161 -0
  569. package/src/alphalib/types/robots/video-subtitle.ts +159 -0
  570. package/src/alphalib/types/robots/video-thumbs.ts +158 -0
  571. package/src/alphalib/types/robots/vimeo-import.ts +126 -0
  572. package/src/alphalib/types/robots/vimeo-store.ts +143 -0
  573. package/src/alphalib/types/robots/wasabi-import.ts +124 -0
  574. package/src/alphalib/types/robots/wasabi-store.ts +113 -0
  575. package/src/alphalib/types/robots/youtube-store.ts +153 -0
  576. package/src/alphalib/types/stackVersions.ts +12 -0
  577. package/src/alphalib/types/template.ts +277 -0
  578. package/src/alphalib/types/templateCredential.ts +61 -0
  579. package/src/alphalib/zodParseWithContext.ts +306 -0
  580. package/src/apiTypes.ts +154 -0
  581. package/src/cli/OutputCtl.ts +115 -0
  582. package/src/cli/commands/BaseCommand.ts +71 -0
  583. package/src/cli/commands/assemblies.ts +1373 -0
  584. package/src/cli/commands/auth.ts +354 -0
  585. package/src/cli/commands/bills.ts +91 -0
  586. package/src/cli/commands/index.ts +65 -0
  587. package/src/cli/commands/notifications.ts +63 -0
  588. package/src/cli/commands/templates.ts +556 -0
  589. package/src/cli/helpers.ts +50 -0
  590. package/src/cli/template-last-modified.ts +156 -0
  591. package/src/cli/types.ts +70 -0
  592. package/src/cli.ts +44 -0
  593. package/src/tus.ts +168 -0
@@ -0,0 +1,1021 @@
1
+ import EventEmitter from 'node:events';
2
+ import fs from 'node:fs';
3
+ import fsp from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import process from 'node:process';
6
+ import { pipeline } from 'node:stream/promises';
7
+ import { setTimeout as delay } from 'node:timers/promises';
8
+ import tty from 'node:tty';
9
+ import { promisify } from 'node:util';
10
+ import { Command, Option } from 'clipanion';
11
+ import got from 'got';
12
+ import PQueue from 'p-queue';
13
+ import * as t from 'typanion';
14
+ import { z } from 'zod';
15
+ import { tryCatch } from "../../alphalib/tryCatch.js";
16
+ import { stepsSchema } from "../../alphalib/types/template.js";
17
+ import { createReadStream, formatAPIError, streamToBuffer } from "../helpers.js";
18
+ import { ensureError, isErrnoException } from "../types.js";
19
+ import { AuthenticatedCommand } from "./BaseCommand.js";
20
+ const AssemblySchema = z.object({
21
+ id: z.string(),
22
+ });
23
+ // --- Business logic functions (from assemblies.ts) ---
24
+ export function list(output, client, { before, after, fields, keywords }) {
25
+ const assemblies = client.streamAssemblies({
26
+ fromdate: after,
27
+ todate: before,
28
+ keywords,
29
+ });
30
+ assemblies.on('readable', () => {
31
+ const assembly = assemblies.read();
32
+ if (assembly == null)
33
+ return;
34
+ const parsed = AssemblySchema.safeParse(assembly);
35
+ if (!parsed.success)
36
+ return;
37
+ if (fields == null) {
38
+ output.print(parsed.data.id, assembly);
39
+ }
40
+ else {
41
+ const assemblyRecord = assembly;
42
+ output.print(fields.map((field) => assemblyRecord[field]).join(' '), assembly);
43
+ }
44
+ });
45
+ return new Promise((resolve) => {
46
+ assemblies.on('end', resolve);
47
+ assemblies.on('error', (err) => {
48
+ output.error(formatAPIError(err));
49
+ resolve();
50
+ });
51
+ });
52
+ }
53
+ export async function get(output, client, { assemblies }) {
54
+ for (const assembly of assemblies) {
55
+ await delay(1000);
56
+ const [err, result] = await tryCatch(client.getAssembly(assembly));
57
+ if (err) {
58
+ output.error(formatAPIError(err));
59
+ throw ensureError(err);
60
+ }
61
+ output.print(result, result);
62
+ }
63
+ }
64
+ async function deleteAssemblies(output, client, { assemblies }) {
65
+ const promises = assemblies.map(async (assembly) => {
66
+ const [err] = await tryCatch(client.cancelAssembly(assembly));
67
+ if (err) {
68
+ output.error(formatAPIError(err));
69
+ }
70
+ });
71
+ await Promise.all(promises);
72
+ }
73
+ // Export with `delete` alias for tests (can't use `delete` as function name)
74
+ export { deleteAssemblies as delete };
75
+ export async function replay(output, client, { fields, reparse, steps, notify_url, assemblies }) {
76
+ if (steps) {
77
+ try {
78
+ const buf = await streamToBuffer(createReadStream(steps));
79
+ const parsed = JSON.parse(buf.toString());
80
+ const validated = stepsSchema.safeParse(parsed);
81
+ if (!validated.success) {
82
+ throw new Error(`Invalid steps format: ${validated.error.message}`);
83
+ }
84
+ await apiCall(validated.data);
85
+ }
86
+ catch (err) {
87
+ const error = ensureError(err);
88
+ output.error(error.message);
89
+ }
90
+ }
91
+ else {
92
+ await apiCall();
93
+ }
94
+ async function apiCall(stepsOverride) {
95
+ const promises = assemblies.map(async (assembly) => {
96
+ const [err] = await tryCatch(client.replayAssembly(assembly, {
97
+ reparse_template: reparse ? 1 : 0,
98
+ fields,
99
+ notify_url,
100
+ // Steps (validated) is assignable to StepsInput at runtime; cast for TS
101
+ steps: stepsOverride,
102
+ }));
103
+ if (err) {
104
+ output.error(formatAPIError(err));
105
+ }
106
+ });
107
+ await Promise.all(promises);
108
+ }
109
+ }
110
+ let nodeWatch;
111
+ async function getNodeWatch() {
112
+ if (!nodeWatch) {
113
+ const mod = (await import('node-watch'));
114
+ nodeWatch = mod.default;
115
+ }
116
+ return nodeWatch;
117
+ }
118
+ // workaround for determining mime-type of stdin
119
+ const stdinWithPath = process.stdin;
120
+ stdinWithPath.path = '/dev/stdin';
121
+ const fstatAsync = promisify(fs.fstat);
122
+ async function myStat(stdioStream, filepath) {
123
+ if (filepath === '-') {
124
+ const stream = stdioStream;
125
+ return await fstatAsync(stream.fd);
126
+ }
127
+ return await fsp.stat(filepath);
128
+ }
129
+ function dirProvider(output) {
130
+ return async (inpath, indir = process.cwd()) => {
131
+ if (inpath == null || inpath === '-') {
132
+ throw new Error('You must provide an input to output to a directory');
133
+ }
134
+ let relpath = path.relative(indir, inpath);
135
+ relpath = relpath.replace(/^(\.\.\/)+/, '');
136
+ const outpath = path.join(output, relpath);
137
+ const outdir = path.dirname(outpath);
138
+ await fsp.mkdir(outdir, { recursive: true });
139
+ const [, stats] = await tryCatch(fsp.stat(outpath));
140
+ const mtime = stats?.mtime ?? new Date(0);
141
+ const outstream = fs.createWriteStream(outpath);
142
+ // Attach a no-op error handler to prevent unhandled errors if stream is destroyed
143
+ // before being consumed (e.g., due to output collision detection)
144
+ outstream.on('error', () => { });
145
+ outstream.mtime = mtime;
146
+ return outstream;
147
+ };
148
+ }
149
+ function fileProvider(output) {
150
+ const dirExistsP = fsp.mkdir(path.dirname(output), { recursive: true });
151
+ return async (_inpath) => {
152
+ await dirExistsP;
153
+ if (output === '-')
154
+ return process.stdout;
155
+ const [, stats] = await tryCatch(fsp.stat(output));
156
+ const mtime = stats?.mtime ?? new Date(0);
157
+ const outstream = fs.createWriteStream(output);
158
+ // Attach a no-op error handler to prevent unhandled errors if stream is destroyed
159
+ // before being consumed (e.g., due to output collision detection)
160
+ outstream.on('error', () => { });
161
+ outstream.mtime = mtime;
162
+ return outstream;
163
+ };
164
+ }
165
+ function nullProvider() {
166
+ return async (_inpath) => null;
167
+ }
168
+ class MyEventEmitter extends EventEmitter {
169
+ hasEnded;
170
+ constructor() {
171
+ super();
172
+ this.hasEnded = false;
173
+ }
174
+ emit(event, ...args) {
175
+ if (this.hasEnded)
176
+ return false;
177
+ if (event === 'end' || event === 'error') {
178
+ this.hasEnded = true;
179
+ return super.emit(event, ...args);
180
+ }
181
+ return super.emit(event, ...args);
182
+ }
183
+ }
184
+ class ReaddirJobEmitter extends MyEventEmitter {
185
+ constructor({ dir, streamRegistry, recursive, outstreamProvider, topdir = dir, }) {
186
+ super();
187
+ process.nextTick(() => {
188
+ this.processDirectory({ dir, streamRegistry, recursive, outstreamProvider, topdir }).catch((err) => {
189
+ this.emit('error', err);
190
+ });
191
+ });
192
+ }
193
+ async processDirectory({ dir, streamRegistry, recursive, outstreamProvider, topdir, }) {
194
+ const files = await fsp.readdir(dir);
195
+ const pendingOperations = [];
196
+ for (const filename of files) {
197
+ const file = path.normalize(path.join(dir, filename));
198
+ pendingOperations.push(this.processFile({ file, streamRegistry, recursive, outstreamProvider, topdir }));
199
+ }
200
+ await Promise.all(pendingOperations);
201
+ this.emit('end');
202
+ }
203
+ async processFile({ file, streamRegistry, recursive = false, outstreamProvider, topdir, }) {
204
+ const stats = await fsp.stat(file);
205
+ if (stats.isDirectory()) {
206
+ if (recursive) {
207
+ await new Promise((resolve, reject) => {
208
+ const subdirEmitter = new ReaddirJobEmitter({
209
+ dir: file,
210
+ streamRegistry,
211
+ recursive,
212
+ outstreamProvider,
213
+ topdir,
214
+ });
215
+ subdirEmitter.on('job', (job) => this.emit('job', job));
216
+ subdirEmitter.on('error', (error) => reject(error));
217
+ subdirEmitter.on('end', () => resolve());
218
+ });
219
+ }
220
+ }
221
+ else {
222
+ const existing = streamRegistry[file];
223
+ if (existing)
224
+ existing.end();
225
+ const outstream = await outstreamProvider(file, topdir);
226
+ streamRegistry[file] = outstream ?? undefined;
227
+ const instream = fs.createReadStream(file);
228
+ // Attach a no-op error handler to prevent unhandled errors if stream is destroyed
229
+ // before being consumed (e.g., due to output collision detection)
230
+ instream.on('error', () => { });
231
+ this.emit('job', { in: instream, out: outstream });
232
+ }
233
+ }
234
+ }
235
+ class SingleJobEmitter extends MyEventEmitter {
236
+ constructor({ file, streamRegistry, outstreamProvider }) {
237
+ super();
238
+ const normalizedFile = path.normalize(file);
239
+ const existing = streamRegistry[normalizedFile];
240
+ if (existing)
241
+ existing.end();
242
+ outstreamProvider(normalizedFile).then((outstream) => {
243
+ streamRegistry[normalizedFile] = outstream ?? undefined;
244
+ let instream;
245
+ if (normalizedFile === '-') {
246
+ if (tty.isatty(process.stdin.fd)) {
247
+ instream = null;
248
+ }
249
+ else {
250
+ instream = process.stdin;
251
+ }
252
+ }
253
+ else {
254
+ instream = fs.createReadStream(normalizedFile);
255
+ // Attach a no-op error handler to prevent unhandled errors if stream is destroyed
256
+ // before being consumed (e.g., due to output collision detection)
257
+ instream.on('error', () => { });
258
+ }
259
+ process.nextTick(() => {
260
+ this.emit('job', { in: instream, out: outstream });
261
+ this.emit('end');
262
+ });
263
+ });
264
+ }
265
+ }
266
+ class InputlessJobEmitter extends MyEventEmitter {
267
+ constructor({ outstreamProvider, }) {
268
+ super();
269
+ process.nextTick(() => {
270
+ outstreamProvider(null).then((outstream) => {
271
+ try {
272
+ this.emit('job', { in: null, out: outstream });
273
+ }
274
+ catch (err) {
275
+ this.emit('error', err);
276
+ }
277
+ this.emit('end');
278
+ });
279
+ });
280
+ }
281
+ }
282
+ class NullJobEmitter extends MyEventEmitter {
283
+ constructor() {
284
+ super();
285
+ process.nextTick(() => this.emit('end'));
286
+ }
287
+ }
288
+ class WatchJobEmitter extends MyEventEmitter {
289
+ watcher = null;
290
+ constructor({ file, streamRegistry, recursive, outstreamProvider }) {
291
+ super();
292
+ this.init({ file, streamRegistry, recursive, outstreamProvider }).catch((err) => {
293
+ this.emit('error', err);
294
+ });
295
+ // Clean up watcher on process exit signals
296
+ const cleanup = () => this.close();
297
+ process.once('SIGINT', cleanup);
298
+ process.once('SIGTERM', cleanup);
299
+ }
300
+ /** Close the file watcher and release resources */
301
+ close() {
302
+ if (this.watcher) {
303
+ this.watcher.close();
304
+ this.watcher = null;
305
+ }
306
+ }
307
+ async init({ file, streamRegistry, recursive, outstreamProvider, }) {
308
+ const stats = await fsp.stat(file);
309
+ const topdir = stats.isDirectory() ? file : undefined;
310
+ const watchFn = await getNodeWatch();
311
+ this.watcher = watchFn(file, { recursive });
312
+ this.watcher.on('error', (err) => {
313
+ this.close();
314
+ this.emit('error', err);
315
+ });
316
+ this.watcher.on('close', () => this.emit('end'));
317
+ this.watcher.on('change', (_evt, filename) => {
318
+ const normalizedFile = path.normalize(filename);
319
+ this.handleChange(normalizedFile, topdir, streamRegistry, outstreamProvider).catch((err) => {
320
+ this.emit('error', err);
321
+ });
322
+ });
323
+ }
324
+ async handleChange(normalizedFile, topdir, streamRegistry, outstreamProvider) {
325
+ const stats = await fsp.stat(normalizedFile);
326
+ if (stats.isDirectory())
327
+ return;
328
+ const existing = streamRegistry[normalizedFile];
329
+ if (existing)
330
+ existing.end();
331
+ const outstream = await outstreamProvider(normalizedFile, topdir);
332
+ streamRegistry[normalizedFile] = outstream ?? undefined;
333
+ const instream = fs.createReadStream(normalizedFile);
334
+ // Attach a no-op error handler to prevent unhandled errors if stream is destroyed
335
+ // before being consumed (e.g., due to output collision detection)
336
+ instream.on('error', () => { });
337
+ this.emit('job', { in: instream, out: outstream });
338
+ }
339
+ }
340
+ class MergedJobEmitter extends MyEventEmitter {
341
+ constructor(...jobEmitters) {
342
+ super();
343
+ let ncomplete = 0;
344
+ for (const jobEmitter of jobEmitters) {
345
+ jobEmitter.on('error', (err) => this.emit('error', err));
346
+ jobEmitter.on('job', (job) => this.emit('job', job));
347
+ jobEmitter.on('end', () => {
348
+ if (++ncomplete === jobEmitters.length)
349
+ this.emit('end');
350
+ });
351
+ }
352
+ if (jobEmitters.length === 0) {
353
+ this.emit('end');
354
+ }
355
+ }
356
+ }
357
+ class ConcattedJobEmitter extends MyEventEmitter {
358
+ constructor(emitterFn, ...emitterFns) {
359
+ super();
360
+ const emitter = emitterFn();
361
+ emitter.on('error', (err) => this.emit('error', err));
362
+ emitter.on('job', (job) => this.emit('job', job));
363
+ if (emitterFns.length === 0) {
364
+ emitter.on('end', () => this.emit('end'));
365
+ }
366
+ else {
367
+ emitter.on('end', () => {
368
+ const firstFn = emitterFns[0];
369
+ if (!firstFn) {
370
+ this.emit('end');
371
+ return;
372
+ }
373
+ const restEmitter = new ConcattedJobEmitter(firstFn, ...emitterFns.slice(1));
374
+ restEmitter.on('error', (err) => this.emit('error', err));
375
+ restEmitter.on('job', (job) => this.emit('job', job));
376
+ restEmitter.on('end', () => this.emit('end'));
377
+ });
378
+ }
379
+ }
380
+ }
381
+ function detectConflicts(jobEmitter) {
382
+ const emitter = new MyEventEmitter();
383
+ const outfileAssociations = {};
384
+ jobEmitter.on('end', () => emitter.emit('end'));
385
+ jobEmitter.on('error', (err) => emitter.emit('error', err));
386
+ jobEmitter.on('job', (job) => {
387
+ if (job.in == null || job.out == null) {
388
+ emitter.emit('job', job);
389
+ return;
390
+ }
391
+ const inPath = job.in.path;
392
+ const outPath = job.out.path;
393
+ if (Object.hasOwn(outfileAssociations, outPath) && outfileAssociations[outPath] !== inPath) {
394
+ emitter.emit('error', new Error(`Output collision between '${inPath}' and '${outfileAssociations[outPath]}'`));
395
+ }
396
+ else {
397
+ outfileAssociations[outPath] = inPath;
398
+ emitter.emit('job', job);
399
+ }
400
+ });
401
+ return emitter;
402
+ }
403
+ function dismissStaleJobs(jobEmitter) {
404
+ const emitter = new MyEventEmitter();
405
+ const pendingChecks = [];
406
+ jobEmitter.on('end', () => Promise.all(pendingChecks).then(() => emitter.emit('end')));
407
+ jobEmitter.on('error', (err) => emitter.emit('error', err));
408
+ jobEmitter.on('job', (job) => {
409
+ if (job.in == null || job.out == null) {
410
+ emitter.emit('job', job);
411
+ return;
412
+ }
413
+ const inPath = job.in.path;
414
+ const checkPromise = fsp
415
+ .stat(inPath)
416
+ .then((stats) => {
417
+ const inM = stats.mtime;
418
+ const outM = job.out?.mtime ?? new Date(0);
419
+ if (outM <= inM)
420
+ emitter.emit('job', job);
421
+ })
422
+ .catch(() => {
423
+ emitter.emit('job', job);
424
+ });
425
+ pendingChecks.push(checkPromise);
426
+ });
427
+ return emitter;
428
+ }
429
+ function makeJobEmitter(inputs, { recursive, outstreamProvider, streamRegistry, watch: watchOption, reprocessStale, }) {
430
+ const emitter = new EventEmitter();
431
+ const emitterFns = [];
432
+ const watcherFns = [];
433
+ async function processInputs() {
434
+ for (const input of inputs) {
435
+ if (input === '-') {
436
+ emitterFns.push(() => new SingleJobEmitter({ file: input, outstreamProvider, streamRegistry }));
437
+ watcherFns.push(() => new NullJobEmitter());
438
+ }
439
+ else {
440
+ const stats = await fsp.stat(input);
441
+ if (stats.isDirectory()) {
442
+ emitterFns.push(() => new ReaddirJobEmitter({ dir: input, recursive, outstreamProvider, streamRegistry }));
443
+ watcherFns.push(() => new WatchJobEmitter({ file: input, recursive, outstreamProvider, streamRegistry }));
444
+ }
445
+ else {
446
+ emitterFns.push(() => new SingleJobEmitter({ file: input, outstreamProvider, streamRegistry }));
447
+ watcherFns.push(() => new WatchJobEmitter({ file: input, recursive, outstreamProvider, streamRegistry }));
448
+ }
449
+ }
450
+ }
451
+ if (inputs.length === 0) {
452
+ emitterFns.push(() => new InputlessJobEmitter({ outstreamProvider, streamRegistry }));
453
+ }
454
+ startEmitting();
455
+ }
456
+ function startEmitting() {
457
+ let source = new MergedJobEmitter(...emitterFns.map((f) => f()));
458
+ if (watchOption) {
459
+ source = new ConcattedJobEmitter(() => source, () => new MergedJobEmitter(...watcherFns.map((f) => f())));
460
+ }
461
+ source.on('job', (job) => emitter.emit('job', job));
462
+ source.on('error', (err) => emitter.emit('error', err));
463
+ source.on('end', () => emitter.emit('end'));
464
+ }
465
+ processInputs().catch((err) => {
466
+ emitter.emit('error', err);
467
+ });
468
+ const stalefilter = reprocessStale ? (x) => x : dismissStaleJobs;
469
+ return stalefilter(detectConflicts(emitter));
470
+ }
471
+ const DEFAULT_CONCURRENCY = 5;
472
+ // --- Main assembly create function ---
473
+ export async function create(outputctl, client, { steps, template, fields, watch: watchOption, recursive, inputs, output, del, reprocessStale, singleAssembly, concurrency = DEFAULT_CONCURRENCY, }) {
474
+ // Quick fix for https://github.com/transloadit/transloadify/issues/13
475
+ // Only default to stdout when output is undefined (not provided), not when explicitly null
476
+ let resolvedOutput = output;
477
+ if (resolvedOutput === undefined && !process.stdout.isTTY)
478
+ resolvedOutput = '-';
479
+ // Read steps file async before entering the Promise constructor
480
+ // We use StepsInput (the input type) rather than Steps (the transformed output type)
481
+ // to avoid zod adding default values that the API may reject
482
+ let stepsData;
483
+ if (steps) {
484
+ const stepsContent = await fsp.readFile(steps, 'utf8');
485
+ const parsed = JSON.parse(stepsContent);
486
+ // Basic structural validation: must be an object with step names as keys
487
+ if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed)) {
488
+ throw new Error('Invalid steps format: expected an object with step names as keys');
489
+ }
490
+ // Validate each step has a robot field
491
+ for (const [stepName, step] of Object.entries(parsed)) {
492
+ if (step == null || typeof step !== 'object' || Array.isArray(step)) {
493
+ throw new Error(`Invalid steps format: step '${stepName}' must be an object`);
494
+ }
495
+ if (!('robot' in step) || typeof step.robot !== 'string') {
496
+ throw new Error(`Invalid steps format: step '${stepName}' must have a 'robot' string property`);
497
+ }
498
+ }
499
+ stepsData = parsed;
500
+ }
501
+ // Determine output stat async before entering the Promise constructor
502
+ let outstat;
503
+ if (resolvedOutput != null) {
504
+ const [err, stat] = await tryCatch(myStat(process.stdout, resolvedOutput));
505
+ if (err && (!isErrnoException(err) || err.code !== 'ENOENT'))
506
+ throw err;
507
+ outstat = stat ?? { isDirectory: () => false };
508
+ if (!outstat.isDirectory() && inputs.length !== 0) {
509
+ const firstInput = inputs[0];
510
+ if (firstInput) {
511
+ const firstInputStat = await myStat(process.stdin, firstInput);
512
+ if (inputs.length > 1 || firstInputStat.isDirectory()) {
513
+ const msg = 'Output must be a directory when specifying multiple inputs';
514
+ outputctl.error(msg);
515
+ throw new Error(msg);
516
+ }
517
+ }
518
+ }
519
+ }
520
+ return new Promise((resolve, reject) => {
521
+ const params = (stepsData ? { steps: stepsData } : { template_id: template });
522
+ if (fields) {
523
+ params.fields = fields;
524
+ }
525
+ const outstreamProvider = resolvedOutput == null
526
+ ? nullProvider()
527
+ : outstat?.isDirectory()
528
+ ? dirProvider(resolvedOutput)
529
+ : fileProvider(resolvedOutput);
530
+ const streamRegistry = {};
531
+ const emitter = makeJobEmitter(inputs, {
532
+ recursive,
533
+ watch: watchOption,
534
+ outstreamProvider,
535
+ streamRegistry,
536
+ reprocessStale,
537
+ });
538
+ // Use p-queue for concurrency management
539
+ const queue = new PQueue({ concurrency });
540
+ const results = [];
541
+ let hasFailures = false;
542
+ // AbortController to cancel all in-flight createAssembly calls when an error occurs
543
+ const abortController = new AbortController();
544
+ // Helper to process a single assembly job
545
+ async function processAssemblyJob(inPath, outPath, outMtime) {
546
+ outputctl.debug(`PROCESSING JOB ${inPath ?? 'null'} ${outPath ?? 'null'}`);
547
+ // Create fresh streams for this job
548
+ const inStream = inPath ? fs.createReadStream(inPath) : null;
549
+ inStream?.on('error', () => { });
550
+ const outStream = outPath ? fs.createWriteStream(outPath) : null;
551
+ outStream?.on('error', () => { });
552
+ if (outStream)
553
+ outStream.mtime = outMtime;
554
+ let superceded = false;
555
+ if (outStream != null) {
556
+ outStream.on('finish', () => {
557
+ superceded = true;
558
+ });
559
+ }
560
+ const createOptions = {
561
+ params,
562
+ signal: abortController.signal,
563
+ };
564
+ if (inStream != null) {
565
+ createOptions.uploads = { in: inStream };
566
+ }
567
+ const result = await client.createAssembly(createOptions);
568
+ if (superceded)
569
+ return undefined;
570
+ const assemblyId = result.assembly_id;
571
+ if (!assemblyId)
572
+ throw new Error('No assembly_id in result');
573
+ const assembly = await client.awaitAssemblyCompletion(assemblyId, {
574
+ signal: abortController.signal,
575
+ onPoll: () => {
576
+ if (superceded)
577
+ return false;
578
+ return true;
579
+ },
580
+ onAssemblyProgress: (status) => {
581
+ outputctl.debug(`Assembly status: ${status.ok}`);
582
+ },
583
+ });
584
+ if (superceded)
585
+ return undefined;
586
+ if (assembly.error || (assembly.ok && assembly.ok !== 'ASSEMBLY_COMPLETED')) {
587
+ const msg = `Assembly failed: ${assembly.error || assembly.message} (Status: ${assembly.ok})`;
588
+ outputctl.error(msg);
589
+ throw new Error(msg);
590
+ }
591
+ if (!assembly.results)
592
+ throw new Error('No results in assembly');
593
+ const resultsKeys = Object.keys(assembly.results);
594
+ const firstKey = resultsKeys[0];
595
+ if (!firstKey)
596
+ throw new Error('No results in assembly');
597
+ const firstResult = assembly.results[firstKey];
598
+ if (!firstResult || !firstResult[0])
599
+ throw new Error('No results in assembly');
600
+ const resulturl = firstResult[0].url;
601
+ if (outStream != null && resulturl && !superceded) {
602
+ outputctl.debug('DOWNLOADING');
603
+ const [dlErr] = await tryCatch(pipeline(got.stream(resulturl, { signal: abortController.signal }), outStream));
604
+ if (dlErr) {
605
+ if (dlErr.name !== 'AbortError') {
606
+ outputctl.error(dlErr.message);
607
+ throw dlErr;
608
+ }
609
+ }
610
+ }
611
+ outputctl.debug(`COMPLETED ${inPath ?? 'null'} ${outPath ?? 'null'}`);
612
+ if (del && inPath) {
613
+ await fsp.unlink(inPath);
614
+ }
615
+ return assembly;
616
+ }
617
+ if (singleAssembly) {
618
+ // Single-assembly mode: collect file paths, then create one assembly with all inputs
619
+ // We close streams immediately to avoid exhausting file descriptors with many files
620
+ const collectedPaths = [];
621
+ emitter.on('job', (job) => {
622
+ if (job.in != null) {
623
+ const inPath = job.in.path;
624
+ outputctl.debug(`COLLECTING JOB ${inPath}`);
625
+ collectedPaths.push(inPath);
626
+ job.in.destroy();
627
+ outputctl.debug(`STREAM CLOSED ${inPath}`);
628
+ }
629
+ });
630
+ emitter.on('error', (err) => {
631
+ abortController.abort();
632
+ queue.clear();
633
+ outputctl.error(err);
634
+ reject(err);
635
+ });
636
+ emitter.on('end', async () => {
637
+ if (collectedPaths.length === 0) {
638
+ resolve({ results: [], hasFailures: false });
639
+ return;
640
+ }
641
+ // Build uploads object, creating fresh streams for each file
642
+ const uploads = {};
643
+ const inputPaths = [];
644
+ for (const inPath of collectedPaths) {
645
+ const basename = path.basename(inPath);
646
+ let key = basename;
647
+ let counter = 1;
648
+ while (key in uploads) {
649
+ key = `${path.parse(basename).name}_${counter}${path.parse(basename).ext}`;
650
+ counter++;
651
+ }
652
+ uploads[key] = fs.createReadStream(inPath);
653
+ inputPaths.push(inPath);
654
+ }
655
+ outputctl.debug(`Creating single assembly with ${Object.keys(uploads).length} files`);
656
+ try {
657
+ const assembly = await queue.add(async () => {
658
+ const createOptions = {
659
+ params,
660
+ signal: abortController.signal,
661
+ };
662
+ if (Object.keys(uploads).length > 0) {
663
+ createOptions.uploads = uploads;
664
+ }
665
+ const result = await client.createAssembly(createOptions);
666
+ const assemblyId = result.assembly_id;
667
+ if (!assemblyId)
668
+ throw new Error('No assembly_id in result');
669
+ const asm = await client.awaitAssemblyCompletion(assemblyId, {
670
+ signal: abortController.signal,
671
+ onAssemblyProgress: (status) => {
672
+ outputctl.debug(`Assembly status: ${status.ok}`);
673
+ },
674
+ });
675
+ if (asm.error || (asm.ok && asm.ok !== 'ASSEMBLY_COMPLETED')) {
676
+ const msg = `Assembly failed: ${asm.error || asm.message} (Status: ${asm.ok})`;
677
+ outputctl.error(msg);
678
+ throw new Error(msg);
679
+ }
680
+ // Download all results
681
+ if (asm.results && resolvedOutput != null) {
682
+ for (const [stepName, stepResults] of Object.entries(asm.results)) {
683
+ for (const stepResult of stepResults) {
684
+ const resultUrl = stepResult.url;
685
+ if (!resultUrl)
686
+ continue;
687
+ let outPath;
688
+ if (outstat?.isDirectory()) {
689
+ outPath = path.join(resolvedOutput, stepResult.name || `${stepName}_result`);
690
+ }
691
+ else {
692
+ outPath = resolvedOutput;
693
+ }
694
+ outputctl.debug(`DOWNLOADING ${stepResult.name} to ${outPath}`);
695
+ const [dlErr] = await tryCatch(pipeline(got.stream(resultUrl, { signal: abortController.signal }), fs.createWriteStream(outPath)));
696
+ if (dlErr) {
697
+ if (dlErr.name === 'AbortError')
698
+ continue;
699
+ outputctl.error(dlErr.message);
700
+ throw dlErr;
701
+ }
702
+ }
703
+ }
704
+ }
705
+ // Delete input files if requested
706
+ if (del) {
707
+ for (const inPath of inputPaths) {
708
+ await fsp.unlink(inPath);
709
+ }
710
+ }
711
+ return asm;
712
+ });
713
+ results.push(assembly);
714
+ }
715
+ catch (err) {
716
+ hasFailures = true;
717
+ outputctl.error(err);
718
+ }
719
+ resolve({ results, hasFailures });
720
+ });
721
+ }
722
+ else {
723
+ // Default mode: one assembly per file with p-queue concurrency limiting
724
+ emitter.on('job', (job) => {
725
+ const inPath = job.in
726
+ ? (job.in.path ?? null)
727
+ : null;
728
+ const outPath = job.out?.path ?? null;
729
+ const outMtime = job.out?.mtime;
730
+ outputctl.debug(`GOT JOB ${inPath ?? 'null'} ${outPath ?? 'null'}`);
731
+ // Close the original streams immediately - we'll create fresh ones when processing
732
+ if (job.in != null) {
733
+ ;
734
+ job.in.destroy();
735
+ }
736
+ if (job.out != null) {
737
+ job.out.destroy();
738
+ }
739
+ // Add job to queue - p-queue handles concurrency automatically
740
+ queue
741
+ .add(async () => {
742
+ const result = await processAssemblyJob(inPath, outPath, outMtime);
743
+ if (result !== undefined) {
744
+ results.push(result);
745
+ }
746
+ })
747
+ .catch((err) => {
748
+ hasFailures = true;
749
+ outputctl.error(err);
750
+ });
751
+ });
752
+ emitter.on('error', (err) => {
753
+ abortController.abort();
754
+ queue.clear();
755
+ outputctl.error(err);
756
+ reject(err);
757
+ });
758
+ emitter.on('end', async () => {
759
+ // Wait for all queued jobs to complete
760
+ await queue.onIdle();
761
+ resolve({ results, hasFailures });
762
+ });
763
+ }
764
+ });
765
+ }
766
+ // --- Command classes ---
767
+ export class AssembliesCreateCommand extends AuthenticatedCommand {
768
+ static paths = [
769
+ ['assemblies', 'create'],
770
+ ['assembly', 'create'],
771
+ ['a', 'create'],
772
+ ['a', 'c'],
773
+ ];
774
+ static usage = Command.Usage({
775
+ category: 'Assemblies',
776
+ description: 'Create assemblies to process media',
777
+ details: `
778
+ Create assemblies to process media files using Transloadit.
779
+ You must specify either --steps or --template.
780
+ `,
781
+ examples: [
782
+ [
783
+ 'Process a file with steps',
784
+ 'transloadit assemblies create --steps steps.json -i input.jpg -o output.jpg',
785
+ ],
786
+ [
787
+ 'Process with a template',
788
+ 'transloadit assemblies create --template TEMPLATE_ID -i input.jpg -o output/',
789
+ ],
790
+ [
791
+ 'Watch for changes',
792
+ 'transloadit assemblies create --steps steps.json -i input/ -o output/ --watch',
793
+ ],
794
+ ],
795
+ });
796
+ steps = Option.String('--steps,-s', {
797
+ description: 'Specify assembly instructions with a JSON file',
798
+ });
799
+ template = Option.String('--template,-t', {
800
+ description: 'Specify a template to use for these assemblies',
801
+ });
802
+ inputs = Option.Array('--input,-i', {
803
+ description: 'Provide an input file or a directory',
804
+ });
805
+ outputPath = Option.String('--output,-o', {
806
+ description: 'Specify an output file or directory',
807
+ });
808
+ fields = Option.Array('--field,-f', {
809
+ description: 'Set a template field (KEY=VAL)',
810
+ });
811
+ watch = Option.Boolean('--watch,-w', false, {
812
+ description: 'Watch inputs for changes',
813
+ });
814
+ recursive = Option.Boolean('--recursive,-r', false, {
815
+ description: 'Enumerate input directories recursively',
816
+ });
817
+ deleteAfterProcessing = Option.Boolean('--delete-after-processing,-d', false, {
818
+ description: 'Delete input files after they are processed',
819
+ });
820
+ reprocessStale = Option.Boolean('--reprocess-stale', false, {
821
+ description: 'Process inputs even if output is newer',
822
+ });
823
+ singleAssembly = Option.Boolean('--single-assembly', false, {
824
+ description: 'Pass all input files to a single assembly instead of one assembly per file',
825
+ });
826
+ concurrency = Option.String('--concurrency,-c', {
827
+ description: 'Maximum number of concurrent assemblies (default: 5)',
828
+ validator: t.isNumber(),
829
+ });
830
+ async run() {
831
+ if (!this.steps && !this.template) {
832
+ this.output.error('assemblies create requires exactly one of either --steps or --template');
833
+ return 1;
834
+ }
835
+ if (this.steps && this.template) {
836
+ this.output.error('assemblies create requires exactly one of either --steps or --template');
837
+ return 1;
838
+ }
839
+ const inputList = this.inputs ?? [];
840
+ if (inputList.length === 0 && this.watch) {
841
+ this.output.error('assemblies create --watch requires at least one input');
842
+ return 1;
843
+ }
844
+ // Default to stdin if no inputs and not a TTY
845
+ if (inputList.length === 0 && !process.stdin.isTTY) {
846
+ inputList.push('-');
847
+ }
848
+ const fieldsMap = {};
849
+ for (const field of this.fields ?? []) {
850
+ const eqIndex = field.indexOf('=');
851
+ if (eqIndex === -1) {
852
+ this.output.error(`invalid argument for --field: '${field}'`);
853
+ return 1;
854
+ }
855
+ const key = field.slice(0, eqIndex);
856
+ const value = field.slice(eqIndex + 1);
857
+ fieldsMap[key] = value;
858
+ }
859
+ if (this.singleAssembly && this.watch) {
860
+ this.output.error('--single-assembly cannot be used with --watch');
861
+ return 1;
862
+ }
863
+ const { hasFailures } = await create(this.output, this.client, {
864
+ steps: this.steps,
865
+ template: this.template,
866
+ fields: fieldsMap,
867
+ watch: this.watch,
868
+ recursive: this.recursive,
869
+ inputs: inputList,
870
+ output: this.outputPath ?? null,
871
+ del: this.deleteAfterProcessing,
872
+ reprocessStale: this.reprocessStale,
873
+ singleAssembly: this.singleAssembly,
874
+ concurrency: this.concurrency,
875
+ });
876
+ return hasFailures ? 1 : undefined;
877
+ }
878
+ }
879
+ export class AssembliesListCommand extends AuthenticatedCommand {
880
+ static paths = [
881
+ ['assemblies', 'list'],
882
+ ['assembly', 'list'],
883
+ ['a', 'list'],
884
+ ['a', 'l'],
885
+ ];
886
+ static usage = Command.Usage({
887
+ category: 'Assemblies',
888
+ description: 'List assemblies matching given criteria',
889
+ examples: [
890
+ ['List recent assemblies', 'transloadit assemblies list'],
891
+ ['List assemblies after a date', 'transloadit assemblies list --after 2024-01-01'],
892
+ ],
893
+ });
894
+ before = Option.String('--before,-b', {
895
+ description: 'Return only assemblies created before specified date',
896
+ });
897
+ after = Option.String('--after,-a', {
898
+ description: 'Return only assemblies created after specified date',
899
+ });
900
+ keywords = Option.String('--keywords', {
901
+ description: 'Comma-separated list of keywords to match assemblies',
902
+ });
903
+ fields = Option.String('--fields', {
904
+ description: 'Comma-separated list of fields to return for each assembly',
905
+ });
906
+ async run() {
907
+ const keywordList = this.keywords ? this.keywords.split(',') : undefined;
908
+ const fieldList = this.fields ? this.fields.split(',') : undefined;
909
+ await list(this.output, this.client, {
910
+ before: this.before,
911
+ after: this.after,
912
+ keywords: keywordList,
913
+ fields: fieldList,
914
+ });
915
+ return undefined;
916
+ }
917
+ }
918
+ export class AssembliesGetCommand extends AuthenticatedCommand {
919
+ static paths = [
920
+ ['assemblies', 'get'],
921
+ ['assembly', 'get'],
922
+ ['a', 'get'],
923
+ ['a', 'g'],
924
+ ];
925
+ static usage = Command.Usage({
926
+ category: 'Assemblies',
927
+ description: 'Fetch assembly statuses',
928
+ examples: [['Get assembly status', 'transloadit assemblies get ASSEMBLY_ID']],
929
+ });
930
+ assemblyIds = Option.Rest({ required: 1 });
931
+ async run() {
932
+ await get(this.output, this.client, {
933
+ assemblies: this.assemblyIds,
934
+ });
935
+ return undefined;
936
+ }
937
+ }
938
+ export class AssembliesDeleteCommand extends AuthenticatedCommand {
939
+ static paths = [
940
+ ['assemblies', 'delete'],
941
+ ['assembly', 'delete'],
942
+ ['a', 'delete'],
943
+ ['a', 'd'],
944
+ ['assemblies', 'cancel'],
945
+ ['assembly', 'cancel'],
946
+ ];
947
+ static usage = Command.Usage({
948
+ category: 'Assemblies',
949
+ description: 'Cancel assemblies',
950
+ examples: [['Cancel an assembly', 'transloadit assemblies delete ASSEMBLY_ID']],
951
+ });
952
+ assemblyIds = Option.Rest({ required: 1 });
953
+ async run() {
954
+ await deleteAssemblies(this.output, this.client, {
955
+ assemblies: this.assemblyIds,
956
+ });
957
+ return undefined;
958
+ }
959
+ }
960
+ export class AssembliesReplayCommand extends AuthenticatedCommand {
961
+ static paths = [
962
+ ['assemblies', 'replay'],
963
+ ['assembly', 'replay'],
964
+ ['a', 'replay'],
965
+ ['a', 'r'],
966
+ ];
967
+ static usage = Command.Usage({
968
+ category: 'Assemblies',
969
+ description: 'Replay assemblies',
970
+ details: `
971
+ Replay one or more assemblies. By default, replays use the original assembly instructions.
972
+ Use --steps to override the instructions, or --reparse-template to use the latest template version.
973
+ `,
974
+ examples: [
975
+ ['Replay an assembly with original steps', 'transloadit assemblies replay ASSEMBLY_ID'],
976
+ [
977
+ 'Replay with different steps',
978
+ 'transloadit assemblies replay --steps new-steps.json ASSEMBLY_ID',
979
+ ],
980
+ [
981
+ 'Replay with updated template',
982
+ 'transloadit assemblies replay --reparse-template ASSEMBLY_ID',
983
+ ],
984
+ ],
985
+ });
986
+ fields = Option.Array('--field,-f', {
987
+ description: 'Set a template field (KEY=VAL)',
988
+ });
989
+ steps = Option.String('--steps,-s', {
990
+ description: 'Optional JSON file to override assembly instructions',
991
+ });
992
+ notifyUrl = Option.String('--notify-url', {
993
+ description: 'Specify a new URL for assembly notifications',
994
+ });
995
+ reparseTemplate = Option.Boolean('--reparse-template', false, {
996
+ description: 'Use the most up-to-date version of the template',
997
+ });
998
+ assemblyIds = Option.Rest({ required: 1 });
999
+ async run() {
1000
+ const fieldsMap = {};
1001
+ for (const field of this.fields ?? []) {
1002
+ const eqIndex = field.indexOf('=');
1003
+ if (eqIndex === -1) {
1004
+ this.output.error(`invalid argument for --field: '${field}'`);
1005
+ return 1;
1006
+ }
1007
+ const key = field.slice(0, eqIndex);
1008
+ const value = field.slice(eqIndex + 1);
1009
+ fieldsMap[key] = value;
1010
+ }
1011
+ await replay(this.output, this.client, {
1012
+ fields: fieldsMap,
1013
+ reparse: this.reparseTemplate,
1014
+ steps: this.steps,
1015
+ notify_url: this.notifyUrl,
1016
+ assemblies: this.assemblyIds,
1017
+ });
1018
+ return undefined;
1019
+ }
1020
+ }
1021
+ //# sourceMappingURL=assemblies.js.map