@fragno-dev/upload 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +16 -0
- package/README.md +43 -0
- package/bin/run.js +5 -0
- package/dist/browser/client/clients.js +49 -0
- package/dist/browser/client/clients.js.map +1 -0
- package/dist/browser/client/helpers.d.ts +51 -0
- package/dist/browser/client/helpers.d.ts.map +1 -0
- package/dist/browser/client/helpers.js +242 -0
- package/dist/browser/client/helpers.js.map +1 -0
- package/dist/browser/client/node_modules/.pnpm/@nanostores_query@0.3.4_nanostores@1.1.0/node_modules/@nanostores/query/dist/nanoquery.js +354 -0
- package/dist/browser/client/node_modules/.pnpm/@nanostores_query@0.3.4_nanostores@1.1.0/node_modules/@nanostores/query/dist/nanoquery.js.map +1 -0
- package/dist/browser/client/node_modules/.pnpm/@nanostores_solid@1.1.1_nanostores@1.1.0_solid-js@1.9.10/node_modules/@nanostores/solid/dist/index.js +14 -0
- package/dist/browser/client/node_modules/.pnpm/@nanostores_solid@1.1.1_nanostores@1.1.0_solid-js@1.9.10/node_modules/@nanostores/solid/dist/index.js.map +1 -0
- package/dist/browser/client/node_modules/.pnpm/nanoevents@9.1.0/node_modules/nanoevents/index.js +17 -0
- package/dist/browser/client/node_modules/.pnpm/nanoevents@9.1.0/node_modules/nanoevents/index.js.map +1 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js +62 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js.map +1 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js +6 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js.map +1 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/computed/index.js +50 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/computed/index.js.map +1 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/lifecycle/index.js +99 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/lifecycle/index.js.map +1 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/listen-keys/index.js +11 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/listen-keys/index.js.map +1 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/map/index.js +25 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/map/index.js.map +1 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/task/index.js +24 -0
- package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/task/index.js.map +1 -0
- package/dist/browser/client/packages/fragment-upload/src/definition.js +49 -0
- package/dist/browser/client/packages/fragment-upload/src/definition.js.map +1 -0
- package/dist/browser/client/packages/fragment-upload/src/keys.d.ts +7 -0
- package/dist/browser/client/packages/fragment-upload/src/keys.d.ts.map +1 -0
- package/dist/browser/client/packages/fragment-upload/src/keys.js +28 -0
- package/dist/browser/client/packages/fragment-upload/src/keys.js.map +1 -0
- package/dist/browser/client/packages/fragment-upload/src/routes/files.js +98 -0
- package/dist/browser/client/packages/fragment-upload/src/routes/files.js.map +1 -0
- package/dist/browser/client/packages/fragment-upload/src/routes/index.js +9 -0
- package/dist/browser/client/packages/fragment-upload/src/routes/index.js.map +1 -0
- package/dist/browser/client/packages/fragment-upload/src/routes/shared.js +41 -0
- package/dist/browser/client/packages/fragment-upload/src/routes/shared.js.map +1 -0
- package/dist/browser/client/packages/fragment-upload/src/routes/uploads.js +186 -0
- package/dist/browser/client/packages/fragment-upload/src/routes/uploads.js.map +1 -0
- package/dist/browser/client/packages/fragment-upload/src/schema.js +8 -0
- package/dist/browser/client/packages/fragment-upload/src/schema.js.map +1 -0
- package/dist/browser/client/packages/fragment-upload/src/storage/types.d.ts +9 -0
- package/dist/browser/client/packages/fragment-upload/src/storage/types.d.ts.map +1 -0
- package/dist/browser/client/packages/fragment-upload/src/types.d.ts +31 -0
- package/dist/browser/client/packages/fragment-upload/src/types.d.ts.map +1 -0
- package/dist/browser/client/packages/fragno/dist/api/error.js +48 -0
- package/dist/browser/client/packages/fragno/dist/api/error.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/api/internal/path.js +76 -0
- package/dist/browser/client/packages/fragno/dist/api/internal/path.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/api/internal/response-stream.js +81 -0
- package/dist/browser/client/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/api/internal/route.js +10 -0
- package/dist/browser/client/packages/fragno/dist/api/internal/route.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/api/request-input-context.js +185 -0
- package/dist/browser/client/packages/fragno/dist/api/request-input-context.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/api/request-output-context.js +119 -0
- package/dist/browser/client/packages/fragno/dist/api/request-output-context.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/api/route.js +17 -0
- package/dist/browser/client/packages/fragno/dist/api/route.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/client/client-error.js +92 -0
- package/dist/browser/client/packages/fragno/dist/client/client-error.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/client/client.js +495 -0
- package/dist/browser/client/packages/fragno/dist/client/client.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/client/client.svelte.js +120 -0
- package/dist/browser/client/packages/fragno/dist/client/client.svelte.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/client/internal/fetcher-merge.js +36 -0
- package/dist/browser/client/packages/fragno/dist/client/internal/fetcher-merge.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/client/internal/ndjson-streaming.js +139 -0
- package/dist/browser/client/packages/fragno/dist/client/internal/ndjson-streaming.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/client/react.js +70 -0
- package/dist/browser/client/packages/fragno/dist/client/react.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/client/solid.js +108 -0
- package/dist/browser/client/packages/fragno/dist/client/solid.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/client/vanilla.js +96 -0
- package/dist/browser/client/packages/fragno/dist/client/vanilla.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/client/vue.js +120 -0
- package/dist/browser/client/packages/fragno/dist/client/vue.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/util/async.js +40 -0
- package/dist/browser/client/packages/fragno/dist/util/async.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/util/content-type.js +49 -0
- package/dist/browser/client/packages/fragno/dist/util/content-type.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/util/nanostores.js +31 -0
- package/dist/browser/client/packages/fragno/dist/util/nanostores.js.map +1 -0
- package/dist/browser/client/packages/fragno/dist/util/ssr.js +18 -0
- package/dist/browser/client/packages/fragno/dist/util/ssr.js.map +1 -0
- package/dist/browser/client/react.d.ts +295 -0
- package/dist/browser/client/react.d.ts.map +1 -0
- package/dist/browser/client/react.js +11 -0
- package/dist/browser/client/react.js.map +1 -0
- package/dist/browser/client/solid.d.ts +303 -0
- package/dist/browser/client/solid.d.ts.map +1 -0
- package/dist/browser/client/solid.js +11 -0
- package/dist/browser/client/solid.js.map +1 -0
- package/dist/browser/client/svelte.d.ts +295 -0
- package/dist/browser/client/svelte.d.ts.map +1 -0
- package/dist/browser/client/svelte.js +11 -0
- package/dist/browser/client/svelte.js.map +1 -0
- package/dist/browser/client/vanilla.d.ts +296 -0
- package/dist/browser/client/vanilla.d.ts.map +1 -0
- package/dist/browser/client/vanilla.js +11 -0
- package/dist/browser/client/vanilla.js.map +1 -0
- package/dist/browser/client/vue.d.ts +295 -0
- package/dist/browser/client/vue.d.ts.map +1 -0
- package/dist/browser/client/vue.js +11 -0
- package/dist/browser/client/vue.js.map +1 -0
- package/dist/browser/index-BdjKPO4J.d.ts +177 -0
- package/dist/browser/index-BdjKPO4J.d.ts.map +1 -0
- package/dist/browser/index.js +3 -0
- package/dist/browser/src-vdNJUbjT.js +1982 -0
- package/dist/browser/src-vdNJUbjT.js.map +1 -0
- package/dist/cli/commands/files/delete.d.ts +40 -0
- package/dist/cli/commands/files/delete.d.ts.map +1 -0
- package/dist/cli/commands/files/delete.js +31 -0
- package/dist/cli/commands/files/delete.js.map +1 -0
- package/dist/cli/commands/files/download-url.d.ts +40 -0
- package/dist/cli/commands/files/download-url.d.ts.map +1 -0
- package/dist/cli/commands/files/download-url.js +31 -0
- package/dist/cli/commands/files/download-url.js.map +1 -0
- package/dist/cli/commands/files/download.d.ts +49 -0
- package/dist/cli/commands/files/download.d.ts.map +1 -0
- package/dist/cli/commands/files/download.js +65 -0
- package/dist/cli/commands/files/download.js.map +1 -0
- package/dist/cli/commands/files/get.d.ts +40 -0
- package/dist/cli/commands/files/get.d.ts.map +1 -0
- package/dist/cli/commands/files/get.js +31 -0
- package/dist/cli/commands/files/get.js.map +1 -0
- package/dist/cli/commands/files/list.d.ts +56 -0
- package/dist/cli/commands/files/list.d.ts.map +1 -0
- package/dist/cli/commands/files/list.js +53 -0
- package/dist/cli/commands/files/list.js.map +1 -0
- package/dist/cli/commands/files/update.d.ts +56 -0
- package/dist/cli/commands/files/update.d.ts.map +1 -0
- package/dist/cli/commands/files/update.js +53 -0
- package/dist/cli/commands/files/update.js.map +1 -0
- package/dist/cli/commands/files/upload.d.ts +73 -0
- package/dist/cli/commands/files/upload.d.ts.map +1 -0
- package/dist/cli/commands/files/upload.js +87 -0
- package/dist/cli/commands/files/upload.js.map +1 -0
- package/dist/cli/commands/uploads/abort.d.ts +37 -0
- package/dist/cli/commands/uploads/abort.d.ts.map +1 -0
- package/dist/cli/commands/uploads/abort.js +26 -0
- package/dist/cli/commands/uploads/abort.js.map +1 -0
- package/dist/cli/commands/uploads/complete.d.ts +41 -0
- package/dist/cli/commands/uploads/complete.d.ts.map +1 -0
- package/dist/cli/commands/uploads/complete.js +45 -0
- package/dist/cli/commands/uploads/complete.js.map +1 -0
- package/dist/cli/commands/uploads/content.d.ts +46 -0
- package/dist/cli/commands/uploads/content.d.ts.map +1 -0
- package/dist/cli/commands/uploads/content.js +43 -0
- package/dist/cli/commands/uploads/content.js.map +1 -0
- package/dist/cli/commands/uploads/create.d.ts +72 -0
- package/dist/cli/commands/uploads/create.d.ts.map +1 -0
- package/dist/cli/commands/uploads/create.js +84 -0
- package/dist/cli/commands/uploads/create.js.map +1 -0
- package/dist/cli/commands/uploads/get.d.ts +37 -0
- package/dist/cli/commands/uploads/get.d.ts.map +1 -0
- package/dist/cli/commands/uploads/get.js +26 -0
- package/dist/cli/commands/uploads/get.js.map +1 -0
- package/dist/cli/commands/uploads/parts-complete.d.ts +41 -0
- package/dist/cli/commands/uploads/parts-complete.d.ts.map +1 -0
- package/dist/cli/commands/uploads/parts-complete.js +44 -0
- package/dist/cli/commands/uploads/parts-complete.js.map +1 -0
- package/dist/cli/commands/uploads/parts-list.d.ts +37 -0
- package/dist/cli/commands/uploads/parts-list.d.ts.map +1 -0
- package/dist/cli/commands/uploads/parts-list.js +26 -0
- package/dist/cli/commands/uploads/parts-list.js.map +1 -0
- package/dist/cli/commands/uploads/parts-urls.d.ts +46 -0
- package/dist/cli/commands/uploads/parts-urls.d.ts.map +1 -0
- package/dist/cli/commands/uploads/parts-urls.js +57 -0
- package/dist/cli/commands/uploads/parts-urls.js.map +1 -0
- package/dist/cli/commands/uploads/progress.d.ts +45 -0
- package/dist/cli/commands/uploads/progress.d.ts.map +1 -0
- package/dist/cli/commands/uploads/progress.js +40 -0
- package/dist/cli/commands/uploads/progress.js.map +1 -0
- package/dist/cli/commands/uploads/transfer.d.ts +73 -0
- package/dist/cli/commands/uploads/transfer.d.ts.map +1 -0
- package/dist/cli/commands/uploads/transfer.js +170 -0
- package/dist/cli/commands/uploads/transfer.js.map +1 -0
- package/dist/cli/index.d.ts +27 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +198 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/keys.js +32 -0
- package/dist/cli/keys.js.map +1 -0
- package/dist/cli/utils/client.js +174 -0
- package/dist/cli/utils/client.js.map +1 -0
- package/dist/cli/utils/options.js +135 -0
- package/dist/cli/utils/options.js.map +1 -0
- package/dist/node/cli/commands/files/delete.d.ts +40 -0
- package/dist/node/cli/commands/files/delete.d.ts.map +1 -0
- package/dist/node/cli/commands/files/delete.js +31 -0
- package/dist/node/cli/commands/files/delete.js.map +1 -0
- package/dist/node/cli/commands/files/download-url.d.ts +40 -0
- package/dist/node/cli/commands/files/download-url.d.ts.map +1 -0
- package/dist/node/cli/commands/files/download-url.js +31 -0
- package/dist/node/cli/commands/files/download-url.js.map +1 -0
- package/dist/node/cli/commands/files/download.d.ts +49 -0
- package/dist/node/cli/commands/files/download.d.ts.map +1 -0
- package/dist/node/cli/commands/files/download.js +65 -0
- package/dist/node/cli/commands/files/download.js.map +1 -0
- package/dist/node/cli/commands/files/get.d.ts +40 -0
- package/dist/node/cli/commands/files/get.d.ts.map +1 -0
- package/dist/node/cli/commands/files/get.js +31 -0
- package/dist/node/cli/commands/files/get.js.map +1 -0
- package/dist/node/cli/commands/files/list.d.ts +56 -0
- package/dist/node/cli/commands/files/list.d.ts.map +1 -0
- package/dist/node/cli/commands/files/list.js +53 -0
- package/dist/node/cli/commands/files/list.js.map +1 -0
- package/dist/node/cli/commands/files/update.d.ts +56 -0
- package/dist/node/cli/commands/files/update.d.ts.map +1 -0
- package/dist/node/cli/commands/files/update.js +53 -0
- package/dist/node/cli/commands/files/update.js.map +1 -0
- package/dist/node/cli/commands/files/upload.d.ts +73 -0
- package/dist/node/cli/commands/files/upload.d.ts.map +1 -0
- package/dist/node/cli/commands/files/upload.js +87 -0
- package/dist/node/cli/commands/files/upload.js.map +1 -0
- package/dist/node/cli/commands/uploads/abort.d.ts +37 -0
- package/dist/node/cli/commands/uploads/abort.d.ts.map +1 -0
- package/dist/node/cli/commands/uploads/abort.js +26 -0
- package/dist/node/cli/commands/uploads/abort.js.map +1 -0
- package/dist/node/cli/commands/uploads/complete.d.ts +41 -0
- package/dist/node/cli/commands/uploads/complete.d.ts.map +1 -0
- package/dist/node/cli/commands/uploads/complete.js +45 -0
- package/dist/node/cli/commands/uploads/complete.js.map +1 -0
- package/dist/node/cli/commands/uploads/content.d.ts +46 -0
- package/dist/node/cli/commands/uploads/content.d.ts.map +1 -0
- package/dist/node/cli/commands/uploads/content.js +43 -0
- package/dist/node/cli/commands/uploads/content.js.map +1 -0
- package/dist/node/cli/commands/uploads/create.d.ts +72 -0
- package/dist/node/cli/commands/uploads/create.d.ts.map +1 -0
- package/dist/node/cli/commands/uploads/create.js +84 -0
- package/dist/node/cli/commands/uploads/create.js.map +1 -0
- package/dist/node/cli/commands/uploads/get.d.ts +37 -0
- package/dist/node/cli/commands/uploads/get.d.ts.map +1 -0
- package/dist/node/cli/commands/uploads/get.js +26 -0
- package/dist/node/cli/commands/uploads/get.js.map +1 -0
- package/dist/node/cli/commands/uploads/parts-complete.d.ts +41 -0
- package/dist/node/cli/commands/uploads/parts-complete.d.ts.map +1 -0
- package/dist/node/cli/commands/uploads/parts-complete.js +44 -0
- package/dist/node/cli/commands/uploads/parts-complete.js.map +1 -0
- package/dist/node/cli/commands/uploads/parts-list.d.ts +37 -0
- package/dist/node/cli/commands/uploads/parts-list.d.ts.map +1 -0
- package/dist/node/cli/commands/uploads/parts-list.js +26 -0
- package/dist/node/cli/commands/uploads/parts-list.js.map +1 -0
- package/dist/node/cli/commands/uploads/parts-urls.d.ts +46 -0
- package/dist/node/cli/commands/uploads/parts-urls.d.ts.map +1 -0
- package/dist/node/cli/commands/uploads/parts-urls.js +57 -0
- package/dist/node/cli/commands/uploads/parts-urls.js.map +1 -0
- package/dist/node/cli/commands/uploads/progress.d.ts +45 -0
- package/dist/node/cli/commands/uploads/progress.d.ts.map +1 -0
- package/dist/node/cli/commands/uploads/progress.js +40 -0
- package/dist/node/cli/commands/uploads/progress.js.map +1 -0
- package/dist/node/cli/commands/uploads/transfer.d.ts +73 -0
- package/dist/node/cli/commands/uploads/transfer.d.ts.map +1 -0
- package/dist/node/cli/commands/uploads/transfer.js +170 -0
- package/dist/node/cli/commands/uploads/transfer.js.map +1 -0
- package/dist/node/cli/index.d.ts +27 -0
- package/dist/node/cli/index.d.ts.map +1 -0
- package/dist/node/cli/index.js +198 -0
- package/dist/node/cli/index.js.map +1 -0
- package/dist/node/cli/utils/client.js +174 -0
- package/dist/node/cli/utils/client.js.map +1 -0
- package/dist/node/cli/utils/options.js +135 -0
- package/dist/node/cli/utils/options.js.map +1 -0
- package/dist/node/client/clients.d.ts +295 -0
- package/dist/node/client/clients.d.ts.map +1 -0
- package/dist/node/client/clients.js +49 -0
- package/dist/node/client/clients.js.map +1 -0
- package/dist/node/client/helpers.d.ts +51 -0
- package/dist/node/client/helpers.d.ts.map +1 -0
- package/dist/node/client/helpers.js +242 -0
- package/dist/node/client/helpers.js.map +1 -0
- package/dist/node/client/react.d.ts +295 -0
- package/dist/node/client/react.d.ts.map +1 -0
- package/dist/node/client/react.js +11 -0
- package/dist/node/client/react.js.map +1 -0
- package/dist/node/client/solid.d.ts +303 -0
- package/dist/node/client/solid.d.ts.map +1 -0
- package/dist/node/client/solid.js +11 -0
- package/dist/node/client/solid.js.map +1 -0
- package/dist/node/client/svelte.d.ts +295 -0
- package/dist/node/client/svelte.d.ts.map +1 -0
- package/dist/node/client/svelte.js +11 -0
- package/dist/node/client/svelte.js.map +1 -0
- package/dist/node/client/vanilla.d.ts +296 -0
- package/dist/node/client/vanilla.d.ts.map +1 -0
- package/dist/node/client/vanilla.js +11 -0
- package/dist/node/client/vanilla.js.map +1 -0
- package/dist/node/client/vue.d.ts +295 -0
- package/dist/node/client/vue.d.ts.map +1 -0
- package/dist/node/client/vue.js +11 -0
- package/dist/node/client/vue.js.map +1 -0
- package/dist/node/config.d.ts +41 -0
- package/dist/node/config.d.ts.map +1 -0
- package/dist/node/config.js +26 -0
- package/dist/node/config.js.map +1 -0
- package/dist/node/definition.d.ts +829 -0
- package/dist/node/definition.d.ts.map +1 -0
- package/dist/node/definition.js +59 -0
- package/dist/node/definition.js.map +1 -0
- package/dist/node/index.d.ts +1246 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +19 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/keys.d.ts +12 -0
- package/dist/node/keys.d.ts.map +1 -0
- package/dist/node/keys.js +63 -0
- package/dist/node/keys.js.map +1 -0
- package/dist/node/routes/files.js +450 -0
- package/dist/node/routes/files.js.map +1 -0
- package/dist/node/routes/index.d.ts +2023 -0
- package/dist/node/routes/index.d.ts.map +1 -0
- package/dist/node/routes/index.js +9 -0
- package/dist/node/routes/index.js.map +1 -0
- package/dist/node/routes/shared.js +66 -0
- package/dist/node/routes/shared.js.map +1 -0
- package/dist/node/routes/uploads.js +454 -0
- package/dist/node/routes/uploads.js.map +1 -0
- package/dist/node/schema.d.ts +14 -0
- package/dist/node/schema.d.ts.map +1 -0
- package/dist/node/schema.js +30 -0
- package/dist/node/schema.js.map +1 -0
- package/dist/node/services/files.d.ts +20 -0
- package/dist/node/services/files.d.ts.map +1 -0
- package/dist/node/services/files.js +93 -0
- package/dist/node/services/files.js.map +1 -0
- package/dist/node/services/helpers.js +36 -0
- package/dist/node/services/helpers.js.map +1 -0
- package/dist/node/services/index.js +4 -0
- package/dist/node/services/uploads.d.ts +50 -0
- package/dist/node/services/uploads.d.ts.map +1 -0
- package/dist/node/services/uploads.js +358 -0
- package/dist/node/services/uploads.js.map +1 -0
- package/dist/node/storage/fs.d.ts +16 -0
- package/dist/node/storage/fs.d.ts.map +1 -0
- package/dist/node/storage/fs.js +94 -0
- package/dist/node/storage/fs.js.map +1 -0
- package/dist/node/storage/r2.d.ts +103 -0
- package/dist/node/storage/r2.d.ts.map +1 -0
- package/dist/node/storage/r2.js +23 -0
- package/dist/node/storage/r2.js.map +1 -0
- package/dist/node/storage/s3.d.ts +44 -0
- package/dist/node/storage/s3.d.ts.map +1 -0
- package/dist/node/storage/s3.js +398 -0
- package/dist/node/storage/s3.js.map +1 -0
- package/dist/node/storage/types.d.ts +118 -0
- package/dist/node/storage/types.d.ts.map +1 -0
- package/dist/node/types.d.ts +32 -0
- package/dist/node/types.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { baseArgs, createClientFromContext, parseJsonValue } from "../../utils/options.js";
|
|
2
|
+
import { define } from "gunshi";
|
|
3
|
+
|
|
4
|
+
//#region src/cli/commands/uploads/parts-urls.ts
|
|
5
|
+
const parsePartNumbers = (rawParts, rawPart) => {
|
|
6
|
+
const parts = [];
|
|
7
|
+
if (rawParts) {
|
|
8
|
+
const parsed = parseJsonValue("parts", String(rawParts));
|
|
9
|
+
if (!Array.isArray(parsed)) throw new Error("--parts must be a JSON array of numbers");
|
|
10
|
+
for (const value of parsed) {
|
|
11
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 1) throw new Error("--parts must be a JSON array of positive integers");
|
|
12
|
+
parts.push(value);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
if (rawPart) {
|
|
16
|
+
const items = Array.isArray(rawPart) ? rawPart : [rawPart];
|
|
17
|
+
for (const value of items) {
|
|
18
|
+
const parsed = Number(value);
|
|
19
|
+
if (!Number.isInteger(parsed) || parsed < 1) throw new Error("--part must be a positive integer");
|
|
20
|
+
parts.push(parsed);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return Array.from(new Set(parts));
|
|
24
|
+
};
|
|
25
|
+
const uploadsPartsUrlsCommand = define({
|
|
26
|
+
name: "parts-urls",
|
|
27
|
+
description: "Get signed URLs for multipart upload",
|
|
28
|
+
args: {
|
|
29
|
+
...baseArgs,
|
|
30
|
+
"upload-id": {
|
|
31
|
+
type: "string",
|
|
32
|
+
short: "i",
|
|
33
|
+
description: "Upload id"
|
|
34
|
+
},
|
|
35
|
+
parts: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "JSON array of part numbers"
|
|
38
|
+
},
|
|
39
|
+
part: {
|
|
40
|
+
type: "number",
|
|
41
|
+
multiple: true,
|
|
42
|
+
description: "Part number (repeatable)"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
run: async (ctx) => {
|
|
46
|
+
const uploadId = ctx.values["upload-id"];
|
|
47
|
+
if (!uploadId) throw new Error("Missing --upload-id");
|
|
48
|
+
const partNumbers = parsePartNumbers(ctx.values["parts"], ctx.values["part"]);
|
|
49
|
+
if (!partNumbers.length) throw new Error("Provide --parts or at least one --part");
|
|
50
|
+
const response = await createClientFromContext(ctx).getPartUrls(uploadId, partNumbers);
|
|
51
|
+
console.log(JSON.stringify(response, null, 2));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
export { uploadsPartsUrlsCommand };
|
|
57
|
+
//# sourceMappingURL=parts-urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts-urls.js","names":["parts: number[]"],"sources":["../../../../src/cli/commands/uploads/parts-urls.ts"],"sourcesContent":["import { define } from \"gunshi\";\nimport { baseArgs, createClientFromContext, parseJsonValue } from \"../../utils/options.js\";\n\nconst parsePartNumbers = (rawParts: unknown, rawPart: unknown): number[] => {\n const parts: number[] = [];\n\n if (rawParts) {\n const parsed = parseJsonValue(\"parts\", String(rawParts));\n if (!Array.isArray(parsed)) {\n throw new Error(\"--parts must be a JSON array of numbers\");\n }\n for (const value of parsed) {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 1) {\n throw new Error(\"--parts must be a JSON array of positive integers\");\n }\n parts.push(value);\n }\n }\n\n if (rawPart) {\n const items = Array.isArray(rawPart) ? rawPart : [rawPart];\n for (const value of items) {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 1) {\n throw new Error(\"--part must be a positive integer\");\n }\n parts.push(parsed);\n }\n }\n\n return Array.from(new Set(parts));\n};\n\nexport const uploadsPartsUrlsCommand = define({\n name: \"parts-urls\",\n description: \"Get signed URLs for multipart upload\",\n args: {\n ...baseArgs,\n \"upload-id\": {\n type: \"string\",\n short: \"i\",\n description: \"Upload id\",\n },\n parts: {\n type: \"string\",\n description: \"JSON array of part numbers\",\n },\n part: {\n type: \"number\",\n multiple: true,\n description: \"Part number (repeatable)\",\n },\n },\n run: async (ctx) => {\n const uploadId = ctx.values[\"upload-id\"] as string | undefined;\n if (!uploadId) {\n throw new Error(\"Missing --upload-id\");\n }\n\n const partNumbers = parsePartNumbers(ctx.values[\"parts\"], ctx.values[\"part\"]);\n if (!partNumbers.length) {\n throw new Error(\"Provide --parts or at least one --part\");\n }\n\n const client = createClientFromContext(ctx);\n const response = await client.getPartUrls(uploadId, partNumbers);\n console.log(JSON.stringify(response, null, 2));\n },\n});\n"],"mappings":";;;;AAGA,MAAM,oBAAoB,UAAmB,YAA+B;CAC1E,MAAMA,QAAkB,EAAE;AAE1B,KAAI,UAAU;EACZ,MAAM,SAAS,eAAe,SAAS,OAAO,SAAS,CAAC;AACxD,MAAI,CAAC,MAAM,QAAQ,OAAO,CACxB,OAAM,IAAI,MAAM,0CAA0C;AAE5D,OAAK,MAAM,SAAS,QAAQ;AAC1B,OAAI,OAAO,UAAU,YAAY,CAAC,OAAO,UAAU,MAAM,IAAI,QAAQ,EACnE,OAAM,IAAI,MAAM,oDAAoD;AAEtE,SAAM,KAAK,MAAM;;;AAIrB,KAAI,SAAS;EACX,MAAM,QAAQ,MAAM,QAAQ,QAAQ,GAAG,UAAU,CAAC,QAAQ;AAC1D,OAAK,MAAM,SAAS,OAAO;GACzB,MAAM,SAAS,OAAO,MAAM;AAC5B,OAAI,CAAC,OAAO,UAAU,OAAO,IAAI,SAAS,EACxC,OAAM,IAAI,MAAM,oCAAoC;AAEtD,SAAM,KAAK,OAAO;;;AAItB,QAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;;AAGnC,MAAa,0BAA0B,OAAO;CAC5C,MAAM;CACN,aAAa;CACb,MAAM;EACJ,GAAG;EACH,aAAa;GACX,MAAM;GACN,OAAO;GACP,aAAa;GACd;EACD,OAAO;GACL,MAAM;GACN,aAAa;GACd;EACD,MAAM;GACJ,MAAM;GACN,UAAU;GACV,aAAa;GACd;EACF;CACD,KAAK,OAAO,QAAQ;EAClB,MAAM,WAAW,IAAI,OAAO;AAC5B,MAAI,CAAC,SACH,OAAM,IAAI,MAAM,sBAAsB;EAGxC,MAAM,cAAc,iBAAiB,IAAI,OAAO,UAAU,IAAI,OAAO,QAAQ;AAC7E,MAAI,CAAC,YAAY,OACf,OAAM,IAAI,MAAM,yCAAyC;EAI3D,MAAM,WAAW,MADF,wBAAwB,IAAI,CACb,YAAY,UAAU,YAAY;AAChE,UAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC;;CAEjD,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as gunshi1 from "gunshi";
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/uploads/progress.d.ts
|
|
4
|
+
declare const uploadsProgressCommand: gunshi1.Command<{
|
|
5
|
+
"upload-id": {
|
|
6
|
+
type: "string";
|
|
7
|
+
short: string;
|
|
8
|
+
description: string;
|
|
9
|
+
};
|
|
10
|
+
"bytes-uploaded": {
|
|
11
|
+
type: "number";
|
|
12
|
+
description: string;
|
|
13
|
+
};
|
|
14
|
+
"parts-uploaded": {
|
|
15
|
+
type: "number";
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
"base-url": {
|
|
19
|
+
readonly type: "string";
|
|
20
|
+
readonly short: "b";
|
|
21
|
+
readonly description: "Upload fragment base URL (env: FRAGNO_UPLOAD_BASE_URL)";
|
|
22
|
+
};
|
|
23
|
+
header: {
|
|
24
|
+
readonly type: "string";
|
|
25
|
+
readonly short: "H";
|
|
26
|
+
readonly description: "Extra HTTP header (repeatable), format: 'Name: value' (env: FRAGNO_UPLOAD_HEADERS)";
|
|
27
|
+
readonly multiple: true;
|
|
28
|
+
};
|
|
29
|
+
timeout: {
|
|
30
|
+
readonly type: "number";
|
|
31
|
+
readonly description: "Request timeout in ms (env: FRAGNO_UPLOAD_TIMEOUT_MS, default: 15000)";
|
|
32
|
+
};
|
|
33
|
+
retries: {
|
|
34
|
+
readonly type: "number";
|
|
35
|
+
readonly description: "Retry count for network/5xx/429 (env: FRAGNO_UPLOAD_RETRIES, default: 2)";
|
|
36
|
+
};
|
|
37
|
+
"retry-delay": {
|
|
38
|
+
readonly type: "number";
|
|
39
|
+
readonly description: "Delay between retries in ms (env: FRAGNO_UPLOAD_RETRY_DELAY_MS, default: 500)";
|
|
40
|
+
};
|
|
41
|
+
}>;
|
|
42
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
43
|
+
//#endregion
|
|
44
|
+
export { uploadsProgressCommand };
|
|
45
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","names":[],"sources":["../../../../src/cli/commands/uploads/progress.ts"],"sourcesContent":[],"mappings":";;;cAGa,wBAoCX,OAAA,CApCiC;;;IAAtB,KAAA,EAAA,MAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { baseArgs, createClientFromContext } from "../../utils/options.js";
|
|
2
|
+
import { define } from "gunshi";
|
|
3
|
+
|
|
4
|
+
//#region src/cli/commands/uploads/progress.ts
|
|
5
|
+
const uploadsProgressCommand = define({
|
|
6
|
+
name: "progress",
|
|
7
|
+
description: "Record upload progress",
|
|
8
|
+
args: {
|
|
9
|
+
...baseArgs,
|
|
10
|
+
"upload-id": {
|
|
11
|
+
type: "string",
|
|
12
|
+
short: "i",
|
|
13
|
+
description: "Upload id"
|
|
14
|
+
},
|
|
15
|
+
"bytes-uploaded": {
|
|
16
|
+
type: "number",
|
|
17
|
+
description: "Total bytes uploaded"
|
|
18
|
+
},
|
|
19
|
+
"parts-uploaded": {
|
|
20
|
+
type: "number",
|
|
21
|
+
description: "Total parts uploaded"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
run: async (ctx) => {
|
|
25
|
+
const uploadId = ctx.values["upload-id"];
|
|
26
|
+
if (!uploadId) throw new Error("Missing --upload-id");
|
|
27
|
+
const bytesUploaded = ctx.values["bytes-uploaded"];
|
|
28
|
+
const partsUploaded = ctx.values["parts-uploaded"];
|
|
29
|
+
if (bytesUploaded === void 0 && partsUploaded === void 0) throw new Error("Provide --bytes-uploaded, --parts-uploaded, or both.");
|
|
30
|
+
const response = await createClientFromContext(ctx).reportProgress(uploadId, {
|
|
31
|
+
bytesUploaded,
|
|
32
|
+
partsUploaded
|
|
33
|
+
});
|
|
34
|
+
console.log(JSON.stringify(response, null, 2));
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
export { uploadsProgressCommand };
|
|
40
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","names":[],"sources":["../../../../src/cli/commands/uploads/progress.ts"],"sourcesContent":["import { define } from \"gunshi\";\nimport { baseArgs, createClientFromContext } from \"../../utils/options.js\";\n\nexport const uploadsProgressCommand = define({\n name: \"progress\",\n description: \"Record upload progress\",\n args: {\n ...baseArgs,\n \"upload-id\": {\n type: \"string\",\n short: \"i\",\n description: \"Upload id\",\n },\n \"bytes-uploaded\": {\n type: \"number\",\n description: \"Total bytes uploaded\",\n },\n \"parts-uploaded\": {\n type: \"number\",\n description: \"Total parts uploaded\",\n },\n },\n run: async (ctx) => {\n const uploadId = ctx.values[\"upload-id\"] as string | undefined;\n if (!uploadId) {\n throw new Error(\"Missing --upload-id\");\n }\n\n const bytesUploaded = ctx.values[\"bytes-uploaded\"] as number | undefined;\n const partsUploaded = ctx.values[\"parts-uploaded\"] as number | undefined;\n\n if (bytesUploaded === undefined && partsUploaded === undefined) {\n throw new Error(\"Provide --bytes-uploaded, --parts-uploaded, or both.\");\n }\n\n const client = createClientFromContext(ctx);\n const response = await client.reportProgress(uploadId, { bytesUploaded, partsUploaded });\n console.log(JSON.stringify(response, null, 2));\n },\n});\n"],"mappings":";;;;AAGA,MAAa,yBAAyB,OAAO;CAC3C,MAAM;CACN,aAAa;CACb,MAAM;EACJ,GAAG;EACH,aAAa;GACX,MAAM;GACN,OAAO;GACP,aAAa;GACd;EACD,kBAAkB;GAChB,MAAM;GACN,aAAa;GACd;EACD,kBAAkB;GAChB,MAAM;GACN,aAAa;GACd;EACF;CACD,KAAK,OAAO,QAAQ;EAClB,MAAM,WAAW,IAAI,OAAO;AAC5B,MAAI,CAAC,SACH,OAAM,IAAI,MAAM,sBAAsB;EAGxC,MAAM,gBAAgB,IAAI,OAAO;EACjC,MAAM,gBAAgB,IAAI,OAAO;AAEjC,MAAI,kBAAkB,UAAa,kBAAkB,OACnD,OAAM,IAAI,MAAM,uDAAuD;EAIzE,MAAM,WAAW,MADF,wBAAwB,IAAI,CACb,eAAe,UAAU;GAAE;GAAe;GAAe,CAAC;AACxF,UAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC;;CAEjD,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as gunshi8 from "gunshi";
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/uploads/transfer.d.ts
|
|
4
|
+
declare const uploadsTransferCommand: gunshi8.Command<{
|
|
5
|
+
file: {
|
|
6
|
+
type: "string";
|
|
7
|
+
short: string;
|
|
8
|
+
description: string;
|
|
9
|
+
};
|
|
10
|
+
"file-key": {
|
|
11
|
+
type: "string";
|
|
12
|
+
description: string;
|
|
13
|
+
};
|
|
14
|
+
"key-parts": {
|
|
15
|
+
type: "string";
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
filename: {
|
|
19
|
+
type: "string";
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
"content-type": {
|
|
23
|
+
type: "string";
|
|
24
|
+
description: string;
|
|
25
|
+
};
|
|
26
|
+
checksum: {
|
|
27
|
+
type: "string";
|
|
28
|
+
description: string;
|
|
29
|
+
};
|
|
30
|
+
tags: {
|
|
31
|
+
type: "string";
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
visibility: {
|
|
35
|
+
type: "string";
|
|
36
|
+
description: string;
|
|
37
|
+
};
|
|
38
|
+
"uploader-id": {
|
|
39
|
+
type: "string";
|
|
40
|
+
description: string;
|
|
41
|
+
};
|
|
42
|
+
metadata: {
|
|
43
|
+
type: "string";
|
|
44
|
+
description: string;
|
|
45
|
+
};
|
|
46
|
+
"base-url": {
|
|
47
|
+
readonly type: "string";
|
|
48
|
+
readonly short: "b";
|
|
49
|
+
readonly description: "Upload fragment base URL (env: FRAGNO_UPLOAD_BASE_URL)";
|
|
50
|
+
};
|
|
51
|
+
header: {
|
|
52
|
+
readonly type: "string";
|
|
53
|
+
readonly short: "H";
|
|
54
|
+
readonly description: "Extra HTTP header (repeatable), format: 'Name: value' (env: FRAGNO_UPLOAD_HEADERS)";
|
|
55
|
+
readonly multiple: true;
|
|
56
|
+
};
|
|
57
|
+
timeout: {
|
|
58
|
+
readonly type: "number";
|
|
59
|
+
readonly description: "Request timeout in ms (env: FRAGNO_UPLOAD_TIMEOUT_MS, default: 15000)";
|
|
60
|
+
};
|
|
61
|
+
retries: {
|
|
62
|
+
readonly type: "number";
|
|
63
|
+
readonly description: "Retry count for network/5xx/429 (env: FRAGNO_UPLOAD_RETRIES, default: 2)";
|
|
64
|
+
};
|
|
65
|
+
"retry-delay": {
|
|
66
|
+
readonly type: "number";
|
|
67
|
+
readonly description: "Delay between retries in ms (env: FRAGNO_UPLOAD_RETRY_DELAY_MS, default: 500)";
|
|
68
|
+
};
|
|
69
|
+
}>;
|
|
70
|
+
//# sourceMappingURL=transfer.d.ts.map
|
|
71
|
+
//#endregion
|
|
72
|
+
export { uploadsTransferCommand };
|
|
73
|
+
//# sourceMappingURL=transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","names":[],"sources":["../../../../src/cli/commands/uploads/transfer.ts"],"sourcesContent":[],"mappings":";;;cAaa,wBAmMX,OAAA,CAnMiC;;;IAAtB,KAAA,EAAA,MAAA"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { baseArgs, createClientFromContext, parseJsonValue, resolveOptionalFileKeyValue } from "../../utils/options.js";
|
|
2
|
+
import { define } from "gunshi";
|
|
3
|
+
import { createReadStream, promises } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { Readable } from "node:stream";
|
|
6
|
+
|
|
7
|
+
//#region src/cli/commands/uploads/transfer.ts
|
|
8
|
+
const DEFAULT_CONTENT_TYPE = "application/octet-stream";
|
|
9
|
+
const uploadsTransferCommand = define({
|
|
10
|
+
name: "transfer",
|
|
11
|
+
description: "Create an upload and transfer a file",
|
|
12
|
+
args: {
|
|
13
|
+
...baseArgs,
|
|
14
|
+
file: {
|
|
15
|
+
type: "string",
|
|
16
|
+
short: "f",
|
|
17
|
+
description: "Path to file"
|
|
18
|
+
},
|
|
19
|
+
"file-key": {
|
|
20
|
+
type: "string",
|
|
21
|
+
description: "File key (encoded)"
|
|
22
|
+
},
|
|
23
|
+
"key-parts": {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "File key parts as JSON array"
|
|
26
|
+
},
|
|
27
|
+
filename: {
|
|
28
|
+
type: "string",
|
|
29
|
+
description: "Override filename"
|
|
30
|
+
},
|
|
31
|
+
"content-type": {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: "Content type (default: application/octet-stream)"
|
|
34
|
+
},
|
|
35
|
+
checksum: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "Checksum JSON, e.g. '{\"algo\":\"sha256\",\"value\":\"...\"}'"
|
|
38
|
+
},
|
|
39
|
+
tags: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description: "Tags as JSON array"
|
|
42
|
+
},
|
|
43
|
+
visibility: {
|
|
44
|
+
type: "string",
|
|
45
|
+
description: "Visibility (private, public, unlisted)"
|
|
46
|
+
},
|
|
47
|
+
"uploader-id": {
|
|
48
|
+
type: "string",
|
|
49
|
+
description: "Uploader id"
|
|
50
|
+
},
|
|
51
|
+
metadata: {
|
|
52
|
+
type: "string",
|
|
53
|
+
description: "Metadata JSON object"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
run: async (ctx) => {
|
|
57
|
+
const filePath = ctx.values["file"];
|
|
58
|
+
if (!filePath) throw new Error("Missing --file");
|
|
59
|
+
const resolvedKey = resolveOptionalFileKeyValue({
|
|
60
|
+
fileKey: ctx.values["file-key"],
|
|
61
|
+
keyParts: ctx.values["key-parts"]
|
|
62
|
+
});
|
|
63
|
+
if (!resolvedKey.fileKey && !resolvedKey.keyParts) throw new Error("Missing file key. Provide --file-key or --key-parts.");
|
|
64
|
+
const sizeBytes = (await promises.stat(filePath)).size;
|
|
65
|
+
const filename = ctx.values["filename"] ?? path.basename(filePath);
|
|
66
|
+
const contentType = ctx.values["content-type"] ?? DEFAULT_CONTENT_TYPE;
|
|
67
|
+
const checksum = parseJsonValue("checksum", ctx.values["checksum"]);
|
|
68
|
+
const tags = parseJsonValue("tags", ctx.values["tags"]);
|
|
69
|
+
const metadata = parseJsonValue("metadata", ctx.values["metadata"]);
|
|
70
|
+
const client = createClientFromContext(ctx);
|
|
71
|
+
const upload = await client.createUpload({
|
|
72
|
+
fileKey: resolvedKey.fileKey,
|
|
73
|
+
keyParts: resolvedKey.keyParts,
|
|
74
|
+
filename,
|
|
75
|
+
sizeBytes,
|
|
76
|
+
contentType,
|
|
77
|
+
checksum,
|
|
78
|
+
tags,
|
|
79
|
+
visibility: ctx.values["visibility"],
|
|
80
|
+
uploaderId: ctx.values["uploader-id"],
|
|
81
|
+
metadata
|
|
82
|
+
});
|
|
83
|
+
if (upload.strategy === "direct-single") {
|
|
84
|
+
if (!upload.upload.uploadUrl) throw new Error("Missing upload URL for direct upload");
|
|
85
|
+
const headers = new Headers(upload.upload.uploadHeaders ?? {});
|
|
86
|
+
headers.set("Content-Length", String(sizeBytes));
|
|
87
|
+
const init = {
|
|
88
|
+
method: "PUT",
|
|
89
|
+
headers,
|
|
90
|
+
body: Readable.toWeb(createReadStream(filePath)),
|
|
91
|
+
duplex: "half"
|
|
92
|
+
};
|
|
93
|
+
const response$1 = await fetch(upload.upload.uploadUrl, init);
|
|
94
|
+
if (!response$1.ok) throw new Error(`Direct upload failed (${response$1.status})`);
|
|
95
|
+
await client.reportProgress(upload.uploadId, {
|
|
96
|
+
bytesUploaded: sizeBytes,
|
|
97
|
+
partsUploaded: 1
|
|
98
|
+
});
|
|
99
|
+
const file = await client.completeUpload(upload.uploadId, []);
|
|
100
|
+
console.log(JSON.stringify({
|
|
101
|
+
upload,
|
|
102
|
+
file
|
|
103
|
+
}, null, 2));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (upload.strategy === "direct-multipart") {
|
|
107
|
+
const partSizeBytes = upload.upload.partSizeBytes;
|
|
108
|
+
if (!partSizeBytes) throw new Error("Missing multipart part size from server");
|
|
109
|
+
const totalParts = Math.ceil(sizeBytes / partSizeBytes);
|
|
110
|
+
if (upload.upload.maxParts && totalParts > upload.upload.maxParts) throw new Error("Multipart upload exceeds maximum parts");
|
|
111
|
+
const partNumbers = Array.from({ length: totalParts }, (_, index) => index + 1);
|
|
112
|
+
const orderedParts = (await client.getPartUrls(upload.uploadId, partNumbers)).parts.sort((a, b) => a.partNumber - b.partNumber);
|
|
113
|
+
const completedParts = [];
|
|
114
|
+
const completionParts = [];
|
|
115
|
+
let bytesUploaded = 0;
|
|
116
|
+
let partsUploaded = 0;
|
|
117
|
+
for (const part of orderedParts) {
|
|
118
|
+
const start = (part.partNumber - 1) * partSizeBytes;
|
|
119
|
+
const length = Math.min(partSizeBytes, sizeBytes - start);
|
|
120
|
+
const end = start + length - 1;
|
|
121
|
+
const headers = new Headers(part.headers ?? {});
|
|
122
|
+
headers.set("Content-Length", String(length));
|
|
123
|
+
const init = {
|
|
124
|
+
method: "PUT",
|
|
125
|
+
headers,
|
|
126
|
+
body: Readable.toWeb(createReadStream(filePath, {
|
|
127
|
+
start,
|
|
128
|
+
end
|
|
129
|
+
})),
|
|
130
|
+
duplex: "half"
|
|
131
|
+
};
|
|
132
|
+
const response$1 = await fetch(part.url, init);
|
|
133
|
+
if (!response$1.ok) throw new Error(`Multipart upload failed (${response$1.status})`);
|
|
134
|
+
const etag = response$1.headers.get("etag") ?? response$1.headers.get("ETag");
|
|
135
|
+
if (!etag) throw new Error("Missing ETag for uploaded part");
|
|
136
|
+
completedParts.push({
|
|
137
|
+
partNumber: part.partNumber,
|
|
138
|
+
etag,
|
|
139
|
+
sizeBytes: length
|
|
140
|
+
});
|
|
141
|
+
completionParts.push({
|
|
142
|
+
partNumber: part.partNumber,
|
|
143
|
+
etag
|
|
144
|
+
});
|
|
145
|
+
bytesUploaded += length;
|
|
146
|
+
partsUploaded += 1;
|
|
147
|
+
await client.reportProgress(upload.uploadId, {
|
|
148
|
+
bytesUploaded,
|
|
149
|
+
partsUploaded
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
await client.completeParts(upload.uploadId, completedParts);
|
|
153
|
+
const file = await client.completeUpload(upload.uploadId, completionParts);
|
|
154
|
+
console.log(JSON.stringify({
|
|
155
|
+
upload,
|
|
156
|
+
file
|
|
157
|
+
}, null, 2));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const response = await client.uploadContent(upload.uploadId, Readable.toWeb(createReadStream(filePath)), contentType);
|
|
161
|
+
console.log(JSON.stringify({
|
|
162
|
+
upload,
|
|
163
|
+
file: response
|
|
164
|
+
}, null, 2));
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
//#endregion
|
|
169
|
+
export { uploadsTransferCommand };
|
|
170
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { uploadsCreateCommand } from "./commands/uploads/create.js";
|
|
3
|
+
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
|
+
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";
|
|
11
|
+
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
|
+
import { Args, Command } from "gunshi";
|
|
20
|
+
|
|
21
|
+
//#region src/cli/index.d.ts
|
|
22
|
+
declare const uploadsCommand: Command<Args>;
|
|
23
|
+
declare const filesCommand: Command<Args>;
|
|
24
|
+
declare function run(): Promise<void>;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { filesCommand, filesDeleteCommand, filesDownloadCommand, filesDownloadUrlCommand, filesGetCommand, filesListCommand, filesUpdateCommand, filesUploadCommand, run, uploadsAbortCommand, uploadsCommand, uploadsCompleteCommand, uploadsContentCommand, uploadsCreateCommand, uploadsGetCommand, uploadsPartsCompleteCommand, uploadsPartsListCommand, uploadsPartsUrlsCommand, uploadsProgressCommand, uploadsTransferCommand };
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { uploadsCreateCommand } from "./commands/uploads/create.js";
|
|
3
|
+
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
|
+
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";
|
|
11
|
+
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
|
+
import { cli, define } from "gunshi";
|
|
20
|
+
import { readFileSync } from "node:fs";
|
|
21
|
+
import { dirname, join } from "node:path";
|
|
22
|
+
import { fileURLToPath } from "node:url";
|
|
23
|
+
|
|
24
|
+
//#region src/cli/index.ts
|
|
25
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
const version = JSON.parse(readFileSync(join(__dirname, "../../package.json"), "utf-8")).version;
|
|
27
|
+
const uploadsCommand = define({
|
|
28
|
+
name: "uploads",
|
|
29
|
+
description: "Upload session commands"
|
|
30
|
+
});
|
|
31
|
+
const filesCommand = define({
|
|
32
|
+
name: "files",
|
|
33
|
+
description: "File commands"
|
|
34
|
+
});
|
|
35
|
+
const uploadsSubCommands = /* @__PURE__ */ new Map();
|
|
36
|
+
uploadsSubCommands.set("create", uploadsCreateCommand);
|
|
37
|
+
uploadsSubCommands.set("get", uploadsGetCommand);
|
|
38
|
+
uploadsSubCommands.set("progress", uploadsProgressCommand);
|
|
39
|
+
uploadsSubCommands.set("parts-urls", uploadsPartsUrlsCommand);
|
|
40
|
+
uploadsSubCommands.set("parts-list", uploadsPartsListCommand);
|
|
41
|
+
uploadsSubCommands.set("parts-complete", uploadsPartsCompleteCommand);
|
|
42
|
+
uploadsSubCommands.set("complete", uploadsCompleteCommand);
|
|
43
|
+
uploadsSubCommands.set("abort", uploadsAbortCommand);
|
|
44
|
+
uploadsSubCommands.set("content", uploadsContentCommand);
|
|
45
|
+
uploadsSubCommands.set("transfer", uploadsTransferCommand);
|
|
46
|
+
const filesSubCommands = /* @__PURE__ */ new Map();
|
|
47
|
+
filesSubCommands.set("upload", filesUploadCommand);
|
|
48
|
+
filesSubCommands.set("list", filesListCommand);
|
|
49
|
+
filesSubCommands.set("get", filesGetCommand);
|
|
50
|
+
filesSubCommands.set("update", filesUpdateCommand);
|
|
51
|
+
filesSubCommands.set("delete", filesDeleteCommand);
|
|
52
|
+
filesSubCommands.set("download-url", filesDownloadUrlCommand);
|
|
53
|
+
filesSubCommands.set("download", filesDownloadCommand);
|
|
54
|
+
const printMainHelp = () => {
|
|
55
|
+
console.log("Upload management CLI for Fragno");
|
|
56
|
+
console.log("");
|
|
57
|
+
console.log("USAGE:");
|
|
58
|
+
console.log(" fragno-upload <COMMAND>");
|
|
59
|
+
console.log("");
|
|
60
|
+
console.log("COMMANDS:");
|
|
61
|
+
console.log(" uploads Manage upload sessions");
|
|
62
|
+
console.log(" files Manage files");
|
|
63
|
+
console.log("");
|
|
64
|
+
console.log("GLOBAL OPTIONS:");
|
|
65
|
+
console.log(" -b, --base-url Upload fragment base URL");
|
|
66
|
+
console.log(" -H, --header Extra HTTP header (repeatable)");
|
|
67
|
+
console.log(" --timeout Request timeout in ms (default: 15000)");
|
|
68
|
+
console.log(" --retries Retry count for network/5xx/429 (default: 2)");
|
|
69
|
+
console.log(" --retry-delay Retry delay in ms (default: 500)");
|
|
70
|
+
console.log("");
|
|
71
|
+
console.log("ENVIRONMENT:");
|
|
72
|
+
console.log(" FRAGNO_UPLOAD_BASE_URL Default base URL");
|
|
73
|
+
console.log(" FRAGNO_UPLOAD_HEADERS Extra headers separated by ';' or newlines");
|
|
74
|
+
console.log(" FRAGNO_UPLOAD_TIMEOUT_MS Default timeout in ms");
|
|
75
|
+
console.log(" FRAGNO_UPLOAD_RETRIES Default retry count");
|
|
76
|
+
console.log(" FRAGNO_UPLOAD_RETRY_DELAY_MS Default retry delay in ms");
|
|
77
|
+
console.log("");
|
|
78
|
+
console.log("EXAMPLES:");
|
|
79
|
+
console.log(" fragno-upload uploads create -b https://host/api/uploads --file-key s~Zm9v --filename demo.txt --size-bytes 10 --content-type text/plain");
|
|
80
|
+
console.log(" fragno-upload uploads get -b https://host/api/uploads -i upl_123");
|
|
81
|
+
console.log(" fragno-upload uploads transfer -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v");
|
|
82
|
+
console.log(" fragno-upload files list -b https://host/api/uploads --prefix s~Zm9v.");
|
|
83
|
+
console.log(" fragno-upload files download -b https://host/api/uploads --file-key s~Zm9v -o ./download.txt");
|
|
84
|
+
};
|
|
85
|
+
const printUploadsHelp = () => {
|
|
86
|
+
console.log("Upload session commands");
|
|
87
|
+
console.log("");
|
|
88
|
+
console.log("USAGE:");
|
|
89
|
+
console.log(" fragno-upload uploads <COMMAND>");
|
|
90
|
+
console.log("");
|
|
91
|
+
console.log("COMMANDS:");
|
|
92
|
+
console.log(" create Create an upload session");
|
|
93
|
+
console.log(" get Get upload status");
|
|
94
|
+
console.log(" progress Record upload progress");
|
|
95
|
+
console.log(" parts-urls Get signed URLs for multipart upload");
|
|
96
|
+
console.log(" parts-list List uploaded parts");
|
|
97
|
+
console.log(" parts-complete Record completed parts");
|
|
98
|
+
console.log(" complete Complete an upload");
|
|
99
|
+
console.log(" abort Abort an upload");
|
|
100
|
+
console.log(" content Upload file bytes via proxy upload");
|
|
101
|
+
console.log(" transfer Create an upload and transfer a file");
|
|
102
|
+
console.log("");
|
|
103
|
+
console.log("EXAMPLES:");
|
|
104
|
+
console.log(" fragno-upload uploads create -b https://host/api/uploads --file-key s~Zm9v --filename demo.txt --size-bytes 10 --content-type text/plain");
|
|
105
|
+
console.log(" fragno-upload uploads get -b https://host/api/uploads -i upl_123");
|
|
106
|
+
console.log(" fragno-upload uploads transfer -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v");
|
|
107
|
+
};
|
|
108
|
+
const printFilesHelp = () => {
|
|
109
|
+
console.log("File commands");
|
|
110
|
+
console.log("");
|
|
111
|
+
console.log("USAGE:");
|
|
112
|
+
console.log(" fragno-upload files <COMMAND>");
|
|
113
|
+
console.log("");
|
|
114
|
+
console.log("COMMANDS:");
|
|
115
|
+
console.log(" upload Upload a file via /files");
|
|
116
|
+
console.log(" list List files");
|
|
117
|
+
console.log(" get Get file metadata");
|
|
118
|
+
console.log(" update Update file metadata");
|
|
119
|
+
console.log(" delete Delete a file");
|
|
120
|
+
console.log(" download-url Get a signed download URL");
|
|
121
|
+
console.log(" download Download file contents");
|
|
122
|
+
console.log("");
|
|
123
|
+
console.log("EXAMPLES:");
|
|
124
|
+
console.log(" fragno-upload files upload -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v");
|
|
125
|
+
console.log(" fragno-upload files list -b https://host/api/uploads --prefix s~Zm9v.");
|
|
126
|
+
console.log(" fragno-upload files download -b https://host/api/uploads --file-key s~Zm9v -o ./download.txt");
|
|
127
|
+
};
|
|
128
|
+
async function run() {
|
|
129
|
+
try {
|
|
130
|
+
const args = process.argv.slice(2);
|
|
131
|
+
if (!args.length || args[0] === "--help" || args[0] === "-h") {
|
|
132
|
+
printMainHelp();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (args[0] === "--version" || args[0] === "-v") {
|
|
136
|
+
console.log(version);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (args[0] === "uploads") {
|
|
140
|
+
const subCommandName = args[1];
|
|
141
|
+
if (!subCommandName || subCommandName === "--help" || subCommandName === "-h") {
|
|
142
|
+
printUploadsHelp();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (subCommandName === "--version" || subCommandName === "-v") {
|
|
146
|
+
console.log(version);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const subCommand = uploadsSubCommands.get(subCommandName);
|
|
150
|
+
if (!subCommand) {
|
|
151
|
+
console.error(`Unknown command: ${subCommandName}`);
|
|
152
|
+
console.log("");
|
|
153
|
+
console.log("Run 'fragno-upload uploads --help' for available commands.");
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
await cli(args.slice(2), subCommand, {
|
|
157
|
+
name: `fragno-upload uploads ${subCommandName}`,
|
|
158
|
+
version
|
|
159
|
+
});
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (args[0] === "files") {
|
|
163
|
+
const subCommandName = args[1];
|
|
164
|
+
if (!subCommandName || subCommandName === "--help" || subCommandName === "-h") {
|
|
165
|
+
printFilesHelp();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (subCommandName === "--version" || subCommandName === "-v") {
|
|
169
|
+
console.log(version);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const subCommand = filesSubCommands.get(subCommandName);
|
|
173
|
+
if (!subCommand) {
|
|
174
|
+
console.error(`Unknown command: ${subCommandName}`);
|
|
175
|
+
console.log("");
|
|
176
|
+
console.log("Run 'fragno-upload files --help' for available commands.");
|
|
177
|
+
process.exit(1);
|
|
178
|
+
}
|
|
179
|
+
await cli(args.slice(2), subCommand, {
|
|
180
|
+
name: `fragno-upload files ${subCommandName}`,
|
|
181
|
+
version
|
|
182
|
+
});
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
console.error(`Unknown command: ${args[0]}`);
|
|
186
|
+
console.log("");
|
|
187
|
+
console.log("Run 'fragno-upload --help' for available commands.");
|
|
188
|
+
process.exit(1);
|
|
189
|
+
} catch (error) {
|
|
190
|
+
console.error(error instanceof Error ? error.message : error);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (import.meta.main) await run();
|
|
195
|
+
|
|
196
|
+
//#endregion
|
|
197
|
+
export { filesCommand, filesDeleteCommand, filesDownloadCommand, filesDownloadUrlCommand, filesGetCommand, filesListCommand, filesUpdateCommand, filesUploadCommand, run, uploadsAbortCommand, uploadsCommand, uploadsCompleteCommand, uploadsContentCommand, uploadsCreateCommand, uploadsGetCommand, uploadsPartsCompleteCommand, uploadsPartsListCommand, uploadsPartsUrlsCommand, uploadsProgressCommand, uploadsTransferCommand };
|
|
198
|
+
//# sourceMappingURL=index.js.map
|