@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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["uploadsSubCommands: Map<string, Command<Args>>","filesSubCommands: Map<string, Command<Args>>"],"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { cli, define } from \"gunshi\";\nimport type { Args, Command } from \"gunshi\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { uploadsCreateCommand } from \"./commands/uploads/create.js\";\nimport { uploadsGetCommand } from \"./commands/uploads/get.js\";\nimport { uploadsProgressCommand } from \"./commands/uploads/progress.js\";\nimport { uploadsPartsUrlsCommand } from \"./commands/uploads/parts-urls.js\";\nimport { uploadsPartsListCommand } from \"./commands/uploads/parts-list.js\";\nimport { uploadsPartsCompleteCommand } from \"./commands/uploads/parts-complete.js\";\nimport { uploadsCompleteCommand } from \"./commands/uploads/complete.js\";\nimport { uploadsAbortCommand } from \"./commands/uploads/abort.js\";\nimport { uploadsContentCommand } from \"./commands/uploads/content.js\";\nimport { uploadsTransferCommand } from \"./commands/uploads/transfer.js\";\nimport { filesUploadCommand } from \"./commands/files/upload.js\";\nimport { filesListCommand } from \"./commands/files/list.js\";\nimport { filesGetCommand } from \"./commands/files/get.js\";\nimport { filesUpdateCommand } from \"./commands/files/update.js\";\nimport { filesDeleteCommand } from \"./commands/files/delete.js\";\nimport { filesDownloadUrlCommand } from \"./commands/files/download-url.js\";\nimport { filesDownloadCommand } from \"./commands/files/download.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(readFileSync(join(__dirname, \"../../package.json\"), \"utf-8\"));\nconst version = packageJson.version as string;\n\nexport const uploadsCommand = define({\n name: \"uploads\",\n description: \"Upload session commands\",\n});\n\nexport const filesCommand = define({\n name: \"files\",\n description: \"File commands\",\n});\n\nconst uploadsSubCommands: Map<string, Command<Args>> = new Map();\nuploadsSubCommands.set(\"create\", uploadsCreateCommand as Command<Args>);\nuploadsSubCommands.set(\"get\", uploadsGetCommand as Command<Args>);\nuploadsSubCommands.set(\"progress\", uploadsProgressCommand as Command<Args>);\nuploadsSubCommands.set(\"parts-urls\", uploadsPartsUrlsCommand as Command<Args>);\nuploadsSubCommands.set(\"parts-list\", uploadsPartsListCommand as Command<Args>);\nuploadsSubCommands.set(\"parts-complete\", uploadsPartsCompleteCommand as Command<Args>);\nuploadsSubCommands.set(\"complete\", uploadsCompleteCommand as Command<Args>);\nuploadsSubCommands.set(\"abort\", uploadsAbortCommand as Command<Args>);\nuploadsSubCommands.set(\"content\", uploadsContentCommand as Command<Args>);\nuploadsSubCommands.set(\"transfer\", uploadsTransferCommand as Command<Args>);\n\nconst filesSubCommands: Map<string, Command<Args>> = new Map();\nfilesSubCommands.set(\"upload\", filesUploadCommand as Command<Args>);\nfilesSubCommands.set(\"list\", filesListCommand as Command<Args>);\nfilesSubCommands.set(\"get\", filesGetCommand as Command<Args>);\nfilesSubCommands.set(\"update\", filesUpdateCommand as Command<Args>);\nfilesSubCommands.set(\"delete\", filesDeleteCommand as Command<Args>);\nfilesSubCommands.set(\"download-url\", filesDownloadUrlCommand as Command<Args>);\nfilesSubCommands.set(\"download\", filesDownloadCommand as Command<Args>);\n\nconst printMainHelp = () => {\n console.log(\"Upload management CLI for Fragno\");\n console.log(\"\");\n console.log(\"USAGE:\");\n console.log(\" fragno-upload <COMMAND>\");\n console.log(\"\");\n console.log(\"COMMANDS:\");\n console.log(\" uploads Manage upload sessions\");\n console.log(\" files Manage files\");\n console.log(\"\");\n console.log(\"GLOBAL OPTIONS:\");\n console.log(\" -b, --base-url Upload fragment base URL\");\n console.log(\" -H, --header Extra HTTP header (repeatable)\");\n console.log(\" --timeout Request timeout in ms (default: 15000)\");\n console.log(\" --retries Retry count for network/5xx/429 (default: 2)\");\n console.log(\" --retry-delay Retry delay in ms (default: 500)\");\n console.log(\"\");\n console.log(\"ENVIRONMENT:\");\n console.log(\" FRAGNO_UPLOAD_BASE_URL Default base URL\");\n console.log(\" FRAGNO_UPLOAD_HEADERS Extra headers separated by ';' or newlines\");\n console.log(\" FRAGNO_UPLOAD_TIMEOUT_MS Default timeout in ms\");\n console.log(\" FRAGNO_UPLOAD_RETRIES Default retry count\");\n console.log(\" FRAGNO_UPLOAD_RETRY_DELAY_MS Default retry delay in ms\");\n console.log(\"\");\n console.log(\"EXAMPLES:\");\n console.log(\n \" fragno-upload uploads create -b https://host/api/uploads --file-key s~Zm9v --filename demo.txt --size-bytes 10 --content-type text/plain\",\n );\n console.log(\" fragno-upload uploads get -b https://host/api/uploads -i upl_123\");\n console.log(\n \" fragno-upload uploads transfer -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v\",\n );\n console.log(\" fragno-upload files list -b https://host/api/uploads --prefix s~Zm9v.\");\n console.log(\n \" fragno-upload files download -b https://host/api/uploads --file-key s~Zm9v -o ./download.txt\",\n );\n};\n\nconst printUploadsHelp = () => {\n console.log(\"Upload session commands\");\n console.log(\"\");\n console.log(\"USAGE:\");\n console.log(\" fragno-upload uploads <COMMAND>\");\n console.log(\"\");\n console.log(\"COMMANDS:\");\n console.log(\" create Create an upload session\");\n console.log(\" get Get upload status\");\n console.log(\" progress Record upload progress\");\n console.log(\" parts-urls Get signed URLs for multipart upload\");\n console.log(\" parts-list List uploaded parts\");\n console.log(\" parts-complete Record completed parts\");\n console.log(\" complete Complete an upload\");\n console.log(\" abort Abort an upload\");\n console.log(\" content Upload file bytes via proxy upload\");\n console.log(\" transfer Create an upload and transfer a file\");\n console.log(\"\");\n console.log(\"EXAMPLES:\");\n console.log(\n \" fragno-upload uploads create -b https://host/api/uploads --file-key s~Zm9v --filename demo.txt --size-bytes 10 --content-type text/plain\",\n );\n console.log(\" fragno-upload uploads get -b https://host/api/uploads -i upl_123\");\n console.log(\n \" fragno-upload uploads transfer -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v\",\n );\n};\n\nconst printFilesHelp = () => {\n console.log(\"File commands\");\n console.log(\"\");\n console.log(\"USAGE:\");\n console.log(\" fragno-upload files <COMMAND>\");\n console.log(\"\");\n console.log(\"COMMANDS:\");\n console.log(\" upload Upload a file via /files\");\n console.log(\" list List files\");\n console.log(\" get Get file metadata\");\n console.log(\" update Update file metadata\");\n console.log(\" delete Delete a file\");\n console.log(\" download-url Get a signed download URL\");\n console.log(\" download Download file contents\");\n console.log(\"\");\n console.log(\"EXAMPLES:\");\n console.log(\n \" fragno-upload files upload -b https://host/api/uploads -f ./demo.txt --file-key s~Zm9v\",\n );\n console.log(\" fragno-upload files list -b https://host/api/uploads --prefix s~Zm9v.\");\n console.log(\n \" fragno-upload files download -b https://host/api/uploads --file-key s~Zm9v -o ./download.txt\",\n );\n};\n\nexport async function run() {\n try {\n const args = process.argv.slice(2);\n\n if (!args.length || args[0] === \"--help\" || args[0] === \"-h\") {\n printMainHelp();\n return;\n }\n\n if (args[0] === \"--version\" || args[0] === \"-v\") {\n console.log(version);\n return;\n }\n\n if (args[0] === \"uploads\") {\n const subCommandName = args[1];\n if (!subCommandName || subCommandName === \"--help\" || subCommandName === \"-h\") {\n printUploadsHelp();\n return;\n }\n if (subCommandName === \"--version\" || subCommandName === \"-v\") {\n console.log(version);\n return;\n }\n\n const subCommand = uploadsSubCommands.get(subCommandName);\n if (!subCommand) {\n console.error(`Unknown command: ${subCommandName}`);\n console.log(\"\");\n console.log(\"Run 'fragno-upload uploads --help' for available commands.\");\n process.exit(1);\n }\n\n await cli(args.slice(2), subCommand, {\n name: `fragno-upload uploads ${subCommandName}`,\n version,\n });\n return;\n }\n\n if (args[0] === \"files\") {\n const subCommandName = args[1];\n if (!subCommandName || subCommandName === \"--help\" || subCommandName === \"-h\") {\n printFilesHelp();\n return;\n }\n if (subCommandName === \"--version\" || subCommandName === \"-v\") {\n console.log(version);\n return;\n }\n\n const subCommand = filesSubCommands.get(subCommandName);\n if (!subCommand) {\n console.error(`Unknown command: ${subCommandName}`);\n console.log(\"\");\n console.log(\"Run 'fragno-upload files --help' for available commands.\");\n process.exit(1);\n }\n\n await cli(args.slice(2), subCommand, {\n name: `fragno-upload files ${subCommandName}`,\n version,\n });\n return;\n }\n\n console.error(`Unknown command: ${args[0]}`);\n console.log(\"\");\n console.log(\"Run 'fragno-upload --help' for available commands.\");\n process.exit(1);\n } catch (error) {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n}\n\nif (import.meta.main) {\n await run();\n}\n\nexport {\n uploadsCreateCommand,\n uploadsGetCommand,\n uploadsProgressCommand,\n uploadsPartsUrlsCommand,\n uploadsPartsListCommand,\n uploadsPartsCompleteCommand,\n uploadsCompleteCommand,\n uploadsAbortCommand,\n uploadsContentCommand,\n uploadsTransferCommand,\n filesUploadCommand,\n filesListCommand,\n filesGetCommand,\n filesUpdateCommand,\n filesDeleteCommand,\n filesDownloadUrlCommand,\n filesDownloadCommand,\n};\n"],"mappings":"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"}
|
package/dist/cli/keys.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/keys.ts
|
|
2
|
+
function base64UrlEncode(value) {
|
|
3
|
+
const bytes = new TextEncoder().encode(value);
|
|
4
|
+
if (typeof Buffer !== "undefined") return Buffer.from(bytes).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
|
|
5
|
+
const encoder = globalThis.btoa;
|
|
6
|
+
if (!encoder) throw new Error("Base64 encoding is not available");
|
|
7
|
+
let binary = "";
|
|
8
|
+
for (const byte of bytes) binary += String.fromCharCode(byte);
|
|
9
|
+
return encoder(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
|
|
10
|
+
}
|
|
11
|
+
function encodePart(part) {
|
|
12
|
+
if (typeof part === "string") return `s~${base64UrlEncode(part)}`;
|
|
13
|
+
if (typeof part === "number") {
|
|
14
|
+
if (!Number.isFinite(part)) throw new Error("File key number parts must be finite");
|
|
15
|
+
const serialized = String(part);
|
|
16
|
+
if (serialized.includes(".") || serialized.includes("e") || serialized.includes("E")) throw new Error("File key number parts must be integers");
|
|
17
|
+
return `n~${serialized}`;
|
|
18
|
+
}
|
|
19
|
+
throw new Error("File key parts must be strings or numbers");
|
|
20
|
+
}
|
|
21
|
+
function encodeFileKey(parts) {
|
|
22
|
+
if (parts.length === 0) return "";
|
|
23
|
+
return parts.map((part) => encodePart(part)).join(".");
|
|
24
|
+
}
|
|
25
|
+
function encodeFileKeyPrefix(parts) {
|
|
26
|
+
if (parts.length === 0) return "";
|
|
27
|
+
return `${encodeFileKey(parts)}.`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { encodeFileKey, encodeFileKeyPrefix };
|
|
32
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","names":[],"sources":["../../src/keys.ts"],"sourcesContent":["export type FileKeyPart = string | number;\nexport type FileKeyParts = readonly FileKeyPart[];\nexport type FileKeyEncoded = string;\n\nconst base64UrlPattern = /^[A-Za-z0-9_-]*$/;\n\nfunction base64UrlEncode(value: string): string {\n const bytes = new TextEncoder().encode(value);\n\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(bytes)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n }\n\n const encoder = (globalThis as { btoa?: (value: string) => string }).btoa;\n if (!encoder) {\n throw new Error(\"Base64 encoding is not available\");\n }\n\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n return encoder(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n}\n\nfunction base64UrlDecode(value: string): string {\n if (!base64UrlPattern.test(value)) {\n throw new Error(\"Invalid base64url value\");\n }\n\n const base64 = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = base64 + \"=\".repeat((4 - (base64.length % 4)) % 4);\n\n if (typeof Buffer !== \"undefined\") {\n return new TextDecoder().decode(Buffer.from(padded, \"base64\"));\n }\n\n const decoder = (globalThis as { atob?: (value: string) => string }).atob;\n if (!decoder) {\n throw new Error(\"Base64 decoding is not available\");\n }\n\n const binary = decoder(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return new TextDecoder().decode(bytes);\n}\n\nfunction encodePart(part: FileKeyPart): string {\n if (typeof part === \"string\") {\n return `s~${base64UrlEncode(part)}`;\n }\n\n if (typeof part === \"number\") {\n if (!Number.isFinite(part)) {\n throw new Error(\"File key number parts must be finite\");\n }\n\n const serialized = String(part);\n if (serialized.includes(\".\") || serialized.includes(\"e\") || serialized.includes(\"E\")) {\n throw new Error(\"File key number parts must be integers\");\n }\n\n return `n~${serialized}`;\n }\n\n throw new Error(\"File key parts must be strings or numbers\");\n}\n\nfunction decodeNumberPart(raw: string): number {\n if (raw.length === 0) {\n throw new Error(\"Invalid number part\");\n }\n\n if (raw.includes(\".\") || raw.includes(\"e\") || raw.includes(\"E\")) {\n throw new Error(\"Invalid number part\");\n }\n\n const value = Number(raw);\n if (!Number.isFinite(value)) {\n throw new Error(\"Invalid number part\");\n }\n\n if (String(value) !== raw) {\n throw new Error(\"Invalid number part\");\n }\n\n return value;\n}\n\nexport function encodeFileKey(parts: FileKeyParts): FileKeyEncoded {\n if (parts.length === 0) {\n return \"\";\n }\n\n return parts.map((part) => encodePart(part)).join(\".\");\n}\n\nexport function decodeFileKey(key: FileKeyEncoded): FileKeyParts {\n if (key.length === 0) {\n return [];\n }\n\n const segments = key.split(\".\");\n\n return segments.map((segment) => {\n const prefix = segment.slice(0, 2);\n const payload = segment.slice(2);\n\n if (prefix === \"s~\") {\n return base64UrlDecode(payload);\n }\n\n if (prefix === \"n~\") {\n return decodeNumberPart(payload);\n }\n\n throw new Error(\"Invalid file key segment\");\n });\n}\n\nexport function encodeFileKeyPrefix(parts: FileKeyParts): string {\n if (parts.length === 0) {\n return \"\";\n }\n\n return `${encodeFileKey(parts)}.`;\n}\n"],"mappings":";AAMA,SAAS,gBAAgB,OAAuB;CAC9C,MAAM,QAAQ,IAAI,aAAa,CAAC,OAAO,MAAM;AAE7C,KAAI,OAAO,WAAW,YACpB,QAAO,OAAO,KAAK,MAAM,CACtB,SAAS,SAAS,CAClB,QAAQ,OAAO,IAAI,CACnB,QAAQ,OAAO,IAAI,CACnB,QAAQ,QAAQ,GAAG;CAGxB,MAAM,UAAW,WAAoD;AACrE,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,mCAAmC;CAGrD,IAAI,SAAS;AACb,MAAK,MAAM,QAAQ,MACjB,WAAU,OAAO,aAAa,KAAK;AAGrC,QAAO,QAAQ,OAAO,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,QAAQ,GAAG;;AA6BpF,SAAS,WAAW,MAA2B;AAC7C,KAAI,OAAO,SAAS,SAClB,QAAO,KAAK,gBAAgB,KAAK;AAGnC,KAAI,OAAO,SAAS,UAAU;AAC5B,MAAI,CAAC,OAAO,SAAS,KAAK,CACxB,OAAM,IAAI,MAAM,uCAAuC;EAGzD,MAAM,aAAa,OAAO,KAAK;AAC/B,MAAI,WAAW,SAAS,IAAI,IAAI,WAAW,SAAS,IAAI,IAAI,WAAW,SAAS,IAAI,CAClF,OAAM,IAAI,MAAM,yCAAyC;AAG3D,SAAO,KAAK;;AAGd,OAAM,IAAI,MAAM,4CAA4C;;AAwB9D,SAAgB,cAAc,OAAqC;AACjE,KAAI,MAAM,WAAW,EACnB,QAAO;AAGT,QAAO,MAAM,KAAK,SAAS,WAAW,KAAK,CAAC,CAAC,KAAK,IAAI;;AA0BxD,SAAgB,oBAAoB,OAA6B;AAC/D,KAAI,MAAM,WAAW,EACnB,QAAO;AAGT,QAAO,GAAG,cAAc,MAAM,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { Readable } from "node:stream";
|
|
2
|
+
|
|
3
|
+
//#region src/cli/utils/client.ts
|
|
4
|
+
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
5
|
+
const buildUrl = (baseUrl, path, query) => {
|
|
6
|
+
const base = new URL(baseUrl);
|
|
7
|
+
base.pathname = `${base.pathname.endsWith("/") ? base.pathname.slice(0, -1) : base.pathname}${path.startsWith("/") ? path : `/${path}`}`;
|
|
8
|
+
if (query) for (const [key, value] of Object.entries(query)) {
|
|
9
|
+
if (value === void 0) continue;
|
|
10
|
+
base.searchParams.set(key, String(value));
|
|
11
|
+
}
|
|
12
|
+
return base.toString();
|
|
13
|
+
};
|
|
14
|
+
const shouldRetry = (response) => {
|
|
15
|
+
if (response.status >= 500) return true;
|
|
16
|
+
return response.status === 429;
|
|
17
|
+
};
|
|
18
|
+
async function fetchWithRetry(url, init, config) {
|
|
19
|
+
let attempt = 0;
|
|
20
|
+
let lastError;
|
|
21
|
+
while (attempt <= config.retries) {
|
|
22
|
+
const controller = new AbortController();
|
|
23
|
+
const timeoutId = setTimeout(() => controller.abort(), config.timeoutMs);
|
|
24
|
+
try {
|
|
25
|
+
const response = await fetch(url, {
|
|
26
|
+
...init,
|
|
27
|
+
signal: controller.signal
|
|
28
|
+
});
|
|
29
|
+
clearTimeout(timeoutId);
|
|
30
|
+
if (!response.ok && shouldRetry(response) && attempt < config.retries) {
|
|
31
|
+
attempt += 1;
|
|
32
|
+
await delay(config.retryDelayMs);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
return response;
|
|
36
|
+
} catch (error) {
|
|
37
|
+
clearTimeout(timeoutId);
|
|
38
|
+
lastError = error;
|
|
39
|
+
if (attempt >= config.retries) throw error;
|
|
40
|
+
attempt += 1;
|
|
41
|
+
await delay(config.retryDelayMs);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
throw lastError ?? /* @__PURE__ */ new Error("Request failed");
|
|
45
|
+
}
|
|
46
|
+
async function fetchWithTimeout(url, init, timeoutMs) {
|
|
47
|
+
const controller = new AbortController();
|
|
48
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
49
|
+
try {
|
|
50
|
+
return await fetch(url, {
|
|
51
|
+
...init,
|
|
52
|
+
signal: controller.signal
|
|
53
|
+
});
|
|
54
|
+
} finally {
|
|
55
|
+
clearTimeout(timeoutId);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const safeJsonParse = (text) => {
|
|
59
|
+
try {
|
|
60
|
+
return JSON.parse(text);
|
|
61
|
+
} catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const readErrorPayload = async (response) => {
|
|
66
|
+
const text = await response.text();
|
|
67
|
+
const parsed = text ? safeJsonParse(text) : void 0;
|
|
68
|
+
const errorPayload = parsed;
|
|
69
|
+
return {
|
|
70
|
+
text,
|
|
71
|
+
parsed,
|
|
72
|
+
message: errorPayload?.message ?? text ?? response.statusText,
|
|
73
|
+
code: errorPayload?.code
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
async function requestResponse(config, path, { method = "GET", query, body, json, headers, retry = true } = {}) {
|
|
77
|
+
const url = buildUrl(config.baseUrl, path, query);
|
|
78
|
+
const mergedHeaders = new Headers(config.headers ?? {});
|
|
79
|
+
if (headers) {
|
|
80
|
+
const extra = new Headers(headers);
|
|
81
|
+
for (const [key, value] of extra.entries()) mergedHeaders.set(key, value);
|
|
82
|
+
}
|
|
83
|
+
let payload;
|
|
84
|
+
if (json && body !== void 0) {
|
|
85
|
+
mergedHeaders.set("content-type", "application/json");
|
|
86
|
+
payload = JSON.stringify(body);
|
|
87
|
+
} else payload = body;
|
|
88
|
+
const init = {
|
|
89
|
+
method,
|
|
90
|
+
headers: mergedHeaders,
|
|
91
|
+
body: payload
|
|
92
|
+
};
|
|
93
|
+
if (payload && typeof payload === "object" && (payload instanceof Readable || "getReader" in payload)) init.duplex = "half";
|
|
94
|
+
const response = retry ? await fetchWithRetry(url, init, config) : await fetchWithTimeout(url, init, config.timeoutMs);
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
const { message, code } = await readErrorPayload(response);
|
|
97
|
+
const error = /* @__PURE__ */ new Error(`Request failed: ${response.status} ${message}${code ? ` (${code})` : ""}`);
|
|
98
|
+
if (code) error.code = code;
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
return response;
|
|
102
|
+
}
|
|
103
|
+
async function requestJson(config, path, { method = "GET", query, body } = {}) {
|
|
104
|
+
const text = await (await requestResponse(config, path, {
|
|
105
|
+
method,
|
|
106
|
+
query,
|
|
107
|
+
body,
|
|
108
|
+
json: true
|
|
109
|
+
})).text();
|
|
110
|
+
const parsed = text ? safeJsonParse(text) : void 0;
|
|
111
|
+
if (parsed === void 0) return;
|
|
112
|
+
if (parsed === null && text.trim() !== "null") throw new Error(`Expected JSON response from ${path}`);
|
|
113
|
+
return parsed;
|
|
114
|
+
}
|
|
115
|
+
function createClient(config) {
|
|
116
|
+
return {
|
|
117
|
+
buildUrl: (path, query) => buildUrl(config.baseUrl, path, query),
|
|
118
|
+
requestResponse: (path, options) => requestResponse(config, path, options),
|
|
119
|
+
createUpload: (payload) => requestJson(config, "/uploads", {
|
|
120
|
+
method: "POST",
|
|
121
|
+
body: payload
|
|
122
|
+
}),
|
|
123
|
+
getUpload: (uploadId) => requestJson(config, `/uploads/${uploadId}`),
|
|
124
|
+
reportProgress: (uploadId, payload) => requestJson(config, `/uploads/${uploadId}/progress`, {
|
|
125
|
+
method: "POST",
|
|
126
|
+
body: payload
|
|
127
|
+
}),
|
|
128
|
+
getPartUrls: (uploadId, partNumbers) => requestJson(config, `/uploads/${uploadId}/parts`, {
|
|
129
|
+
method: "POST",
|
|
130
|
+
body: { partNumbers }
|
|
131
|
+
}),
|
|
132
|
+
listParts: (uploadId) => requestJson(config, `/uploads/${uploadId}/parts`),
|
|
133
|
+
completeParts: (uploadId, parts) => requestJson(config, `/uploads/${uploadId}/parts/complete`, {
|
|
134
|
+
method: "POST",
|
|
135
|
+
body: { parts }
|
|
136
|
+
}),
|
|
137
|
+
completeUpload: (uploadId, parts) => requestJson(config, `/uploads/${uploadId}/complete`, {
|
|
138
|
+
method: "POST",
|
|
139
|
+
body: parts && parts.length > 0 ? { parts } : {}
|
|
140
|
+
}),
|
|
141
|
+
abortUpload: (uploadId) => requestJson(config, `/uploads/${uploadId}/abort`, { method: "POST" }),
|
|
142
|
+
uploadContent: async (uploadId, body, contentType) => {
|
|
143
|
+
return await (await requestResponse(config, `/uploads/${uploadId}/content`, {
|
|
144
|
+
method: "PUT",
|
|
145
|
+
body,
|
|
146
|
+
headers: { "Content-Type": contentType },
|
|
147
|
+
retry: false
|
|
148
|
+
})).json();
|
|
149
|
+
},
|
|
150
|
+
createFile: async (form) => {
|
|
151
|
+
return await (await requestResponse(config, "/files", {
|
|
152
|
+
method: "POST",
|
|
153
|
+
body: form,
|
|
154
|
+
retry: false
|
|
155
|
+
})).json();
|
|
156
|
+
},
|
|
157
|
+
listFiles: (query) => requestJson(config, "/files", {
|
|
158
|
+
method: "GET",
|
|
159
|
+
query
|
|
160
|
+
}),
|
|
161
|
+
getFile: (fileKey) => requestJson(config, `/files/${fileKey}`),
|
|
162
|
+
updateFile: (fileKey, payload) => requestJson(config, `/files/${fileKey}`, {
|
|
163
|
+
method: "PATCH",
|
|
164
|
+
body: payload
|
|
165
|
+
}),
|
|
166
|
+
deleteFile: (fileKey) => requestJson(config, `/files/${fileKey}`, { method: "DELETE" }),
|
|
167
|
+
getDownloadUrl: (fileKey) => requestJson(config, `/files/${fileKey}/download-url`),
|
|
168
|
+
downloadContent: (fileKey) => requestResponse(config, `/files/${fileKey}/content`, { method: "GET" })
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
//#endregion
|
|
173
|
+
export { createClient };
|
|
174
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":["lastError: unknown","payload: BodyInit | undefined","init: RequestInit & { duplex?: \"half\" }"],"sources":["../../../src/cli/utils/client.ts"],"sourcesContent":["import { Readable } from \"node:stream\";\n\nexport type ClientConfig = {\n baseUrl: string;\n headers?: HeadersInit;\n timeoutMs: number;\n retries: number;\n retryDelayMs: number;\n};\n\ntype RequestOptions = {\n method?: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: BodyInit | null | unknown;\n json?: boolean;\n headers?: HeadersInit;\n retry?: boolean;\n};\n\ntype JsonRequestOptions = Omit<RequestOptions, \"body\" | \"json\"> & { body?: unknown };\n\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst buildUrl = (\n baseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n) => {\n const base = new URL(baseUrl);\n const basePath = base.pathname.endsWith(\"/\") ? base.pathname.slice(0, -1) : base.pathname;\n const pathPart = path.startsWith(\"/\") ? path : `/${path}`;\n base.pathname = `${basePath}${pathPart}`;\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) {\n continue;\n }\n base.searchParams.set(key, String(value));\n }\n }\n\n return base.toString();\n};\n\nconst shouldRetry = (response: Response) => {\n if (response.status >= 500) {\n return true;\n }\n return response.status === 429;\n};\n\nasync function fetchWithRetry(\n url: string,\n init: RequestInit,\n config: Pick<ClientConfig, \"timeoutMs\" | \"retries\" | \"retryDelayMs\">,\n) {\n let attempt = 0;\n let lastError: unknown;\n\n while (attempt <= config.retries) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeoutMs);\n\n try {\n const response = await fetch(url, { ...init, signal: controller.signal });\n clearTimeout(timeoutId);\n\n if (!response.ok && shouldRetry(response) && attempt < config.retries) {\n attempt += 1;\n await delay(config.retryDelayMs);\n continue;\n }\n\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n lastError = error;\n if (attempt >= config.retries) {\n throw error;\n }\n attempt += 1;\n await delay(config.retryDelayMs);\n }\n }\n\n throw lastError ?? new Error(\"Request failed\");\n}\n\nasync function fetchWithTimeout(\n url: string,\n init: RequestInit,\n timeoutMs: number,\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\nconst safeJsonParse = (text: string) => {\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return null;\n }\n};\n\nconst readErrorPayload = async (response: Response) => {\n const text = await response.text();\n const parsed = text ? safeJsonParse(text) : undefined;\n const errorPayload = parsed as { message?: string; code?: string } | undefined;\n return {\n text,\n parsed,\n message: errorPayload?.message ?? text ?? response.statusText,\n code: errorPayload?.code,\n };\n};\n\nasync function requestResponse(\n config: ClientConfig,\n path: string,\n { method = \"GET\", query, body, json, headers, retry = true }: RequestOptions = {},\n): Promise<Response> {\n const url = buildUrl(config.baseUrl, path, query);\n const mergedHeaders = new Headers(config.headers ?? {});\n\n if (headers) {\n const extra = new Headers(headers);\n for (const [key, value] of extra.entries()) {\n mergedHeaders.set(key, value);\n }\n }\n\n let payload: BodyInit | undefined;\n\n if (json && body !== undefined) {\n mergedHeaders.set(\"content-type\", \"application/json\");\n payload = JSON.stringify(body);\n } else {\n payload = body as BodyInit | undefined;\n }\n\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers: mergedHeaders,\n body: payload,\n };\n\n if (\n payload &&\n typeof payload === \"object\" &&\n (payload instanceof Readable || \"getReader\" in (payload as object))\n ) {\n init.duplex = \"half\";\n }\n\n const response = retry\n ? await fetchWithRetry(url, init, config)\n : await fetchWithTimeout(url, init, config.timeoutMs);\n\n if (!response.ok) {\n const { message, code } = await readErrorPayload(response);\n const error = new Error(\n `Request failed: ${response.status} ${message}${code ? ` (${code})` : \"\"}`,\n ) as Error & {\n code?: string;\n };\n if (code) {\n error.code = code;\n }\n throw error;\n }\n\n return response;\n}\n\nasync function requestJson<T>(\n config: ClientConfig,\n path: string,\n { method = \"GET\", query, body }: JsonRequestOptions = {},\n): Promise<T> {\n const response = await requestResponse(config, path, { method, query, body, json: true });\n const text = await response.text();\n const parsed = text ? safeJsonParse(text) : undefined;\n\n if (parsed === undefined) {\n return undefined as T;\n }\n\n if (parsed === null && text.trim() !== \"null\") {\n throw new Error(`Expected JSON response from ${path}`);\n }\n\n return parsed as T;\n}\n\nexport function createClient(config: ClientConfig) {\n return {\n buildUrl: (path: string, query?: Record<string, string | number | boolean | undefined>) =>\n buildUrl(config.baseUrl, path, query),\n requestResponse: (path: string, options?: RequestOptions) =>\n requestResponse(config, path, options),\n createUpload: (payload: Record<string, unknown>) =>\n requestJson(config, \"/uploads\", { method: \"POST\", body: payload }),\n getUpload: (uploadId: string) => requestJson(config, `/uploads/${uploadId}`),\n reportProgress: (\n uploadId: string,\n payload: { bytesUploaded?: number; partsUploaded?: number },\n ) => requestJson(config, `/uploads/${uploadId}/progress`, { method: \"POST\", body: payload }),\n getPartUrls: (uploadId: string, partNumbers: number[]) =>\n requestJson(config, `/uploads/${uploadId}/parts`, {\n method: \"POST\",\n body: { partNumbers },\n }),\n listParts: (uploadId: string) => requestJson(config, `/uploads/${uploadId}/parts`),\n completeParts: (\n uploadId: string,\n parts: { partNumber: number; etag: string; sizeBytes: number }[],\n ) =>\n requestJson(config, `/uploads/${uploadId}/parts/complete`, {\n method: \"POST\",\n body: { parts },\n }),\n completeUpload: (uploadId: string, parts?: { partNumber: number; etag: string }[]) =>\n requestJson(config, `/uploads/${uploadId}/complete`, {\n method: \"POST\",\n body: parts && parts.length > 0 ? { parts } : {},\n }),\n abortUpload: (uploadId: string) =>\n requestJson(config, `/uploads/${uploadId}/abort`, { method: \"POST\" }),\n uploadContent: async (uploadId: string, body: BodyInit, contentType: string) => {\n const response = await requestResponse(config, `/uploads/${uploadId}/content`, {\n method: \"PUT\",\n body,\n headers: { \"Content-Type\": contentType },\n retry: false,\n });\n return (await response.json()) as unknown;\n },\n createFile: async (form: FormData) => {\n const response = await requestResponse(config, \"/files\", {\n method: \"POST\",\n body: form,\n retry: false,\n });\n return (await response.json()) as unknown;\n },\n listFiles: (query: Record<string, string | number | boolean | undefined>) =>\n requestJson(config, \"/files\", { method: \"GET\", query }),\n getFile: (fileKey: string) => requestJson(config, `/files/${fileKey}`),\n updateFile: (fileKey: string, payload: Record<string, unknown>) =>\n requestJson(config, `/files/${fileKey}`, { method: \"PATCH\", body: payload }),\n deleteFile: (fileKey: string) => requestJson(config, `/files/${fileKey}`, { method: \"DELETE\" }),\n getDownloadUrl: (fileKey: string) => requestJson(config, `/files/${fileKey}/download-url`),\n downloadContent: (fileKey: string) =>\n requestResponse(config, `/files/${fileKey}/content`, { method: \"GET\" }),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { encodeFileKey, encodeFileKeyPrefix } from "../keys.js";
|
|
2
|
+
import { createClient } from "./client.js";
|
|
3
|
+
|
|
4
|
+
//#region src/cli/utils/options.ts
|
|
5
|
+
const baseArgs = {
|
|
6
|
+
"base-url": {
|
|
7
|
+
type: "string",
|
|
8
|
+
short: "b",
|
|
9
|
+
description: "Upload fragment base URL (env: FRAGNO_UPLOAD_BASE_URL)"
|
|
10
|
+
},
|
|
11
|
+
header: {
|
|
12
|
+
type: "string",
|
|
13
|
+
short: "H",
|
|
14
|
+
description: "Extra HTTP header (repeatable), format: 'Name: value' (env: FRAGNO_UPLOAD_HEADERS)",
|
|
15
|
+
multiple: true
|
|
16
|
+
},
|
|
17
|
+
timeout: {
|
|
18
|
+
type: "number",
|
|
19
|
+
description: "Request timeout in ms (env: FRAGNO_UPLOAD_TIMEOUT_MS, default: 15000)"
|
|
20
|
+
},
|
|
21
|
+
retries: {
|
|
22
|
+
type: "number",
|
|
23
|
+
description: "Retry count for network/5xx/429 (env: FRAGNO_UPLOAD_RETRIES, default: 2)"
|
|
24
|
+
},
|
|
25
|
+
"retry-delay": {
|
|
26
|
+
type: "number",
|
|
27
|
+
description: "Delay between retries in ms (env: FRAGNO_UPLOAD_RETRY_DELAY_MS, default: 500)"
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const DEFAULT_TIMEOUT_MS = 15e3;
|
|
31
|
+
const DEFAULT_RETRIES = 2;
|
|
32
|
+
const DEFAULT_RETRY_DELAY_MS = 500;
|
|
33
|
+
const parseNumberEnv = (value) => {
|
|
34
|
+
if (!value) return;
|
|
35
|
+
const parsed = Number(value);
|
|
36
|
+
if (Number.isNaN(parsed)) return;
|
|
37
|
+
return parsed;
|
|
38
|
+
};
|
|
39
|
+
const normalizeHeaderValues = (value) => {
|
|
40
|
+
if (!value) return [];
|
|
41
|
+
if (Array.isArray(value)) return value.map(String);
|
|
42
|
+
return [String(value)];
|
|
43
|
+
};
|
|
44
|
+
const parseEnvHeaders = () => {
|
|
45
|
+
const envHeaders = process.env["FRAGNO_UPLOAD_HEADERS"];
|
|
46
|
+
if (!envHeaders) return [];
|
|
47
|
+
return envHeaders.split(/\n|;/).map((entry) => entry.trim()).filter(Boolean);
|
|
48
|
+
};
|
|
49
|
+
const buildHeaders = (values) => {
|
|
50
|
+
const headers = new Headers();
|
|
51
|
+
for (const value of values) {
|
|
52
|
+
const index = value.indexOf(":");
|
|
53
|
+
if (index === -1) throw new Error(`Invalid header: ${value}`);
|
|
54
|
+
const name = value.slice(0, index).trim();
|
|
55
|
+
const headerValue = value.slice(index + 1).trim();
|
|
56
|
+
if (!name || !headerValue) throw new Error(`Invalid header: ${value}`);
|
|
57
|
+
headers.append(name, headerValue);
|
|
58
|
+
}
|
|
59
|
+
return headers;
|
|
60
|
+
};
|
|
61
|
+
const resolveTimeout = (ctx) => ctx.values["timeout"] ?? parseNumberEnv(process.env["FRAGNO_UPLOAD_TIMEOUT_MS"]) ?? DEFAULT_TIMEOUT_MS;
|
|
62
|
+
const resolveRetries = (ctx) => ctx.values["retries"] ?? parseNumberEnv(process.env["FRAGNO_UPLOAD_RETRIES"]) ?? DEFAULT_RETRIES;
|
|
63
|
+
const resolveRetryDelay = (ctx) => ctx.values["retry-delay"] ?? parseNumberEnv(process.env["FRAGNO_UPLOAD_RETRY_DELAY_MS"]) ?? DEFAULT_RETRY_DELAY_MS;
|
|
64
|
+
const resolveBaseUrl = (ctx) => {
|
|
65
|
+
const baseUrl = ctx.values["base-url"] ?? process.env["FRAGNO_UPLOAD_BASE_URL"];
|
|
66
|
+
if (!baseUrl) throw new Error("Missing base URL. Provide --base-url or set FRAGNO_UPLOAD_BASE_URL.");
|
|
67
|
+
return baseUrl.replace(/\/$/, "");
|
|
68
|
+
};
|
|
69
|
+
const createClientFromContext = (ctx) => {
|
|
70
|
+
const headerValues = normalizeHeaderValues(ctx.values["header"]).concat(parseEnvHeaders());
|
|
71
|
+
return createClient({
|
|
72
|
+
baseUrl: resolveBaseUrl(ctx),
|
|
73
|
+
headers: buildHeaders(headerValues),
|
|
74
|
+
timeoutMs: resolveTimeout(ctx),
|
|
75
|
+
retries: resolveRetries(ctx),
|
|
76
|
+
retryDelayMs: resolveRetryDelay(ctx)
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
const parseJsonValue = (label, value) => {
|
|
80
|
+
if (value === void 0) return;
|
|
81
|
+
try {
|
|
82
|
+
return JSON.parse(value);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
85
|
+
throw new Error(`Invalid ${label} JSON: ${message}`);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const parseFileKeyParts = (label, value) => {
|
|
89
|
+
const parsed = parseJsonValue(label, value);
|
|
90
|
+
if (!Array.isArray(parsed)) throw new Error(`${label} must be a JSON array`);
|
|
91
|
+
for (const part of parsed) if (typeof part !== "string" && typeof part !== "number") throw new Error(`${label} must contain only strings or numbers`);
|
|
92
|
+
return parsed;
|
|
93
|
+
};
|
|
94
|
+
const resolveFileKeyValue = (input) => {
|
|
95
|
+
if (input.fileKey && input.keyParts) throw new Error("Provide either --file-key or --key-parts, not both.");
|
|
96
|
+
if (input.fileKey) return {
|
|
97
|
+
fileKey: input.fileKey,
|
|
98
|
+
keyParts: void 0
|
|
99
|
+
};
|
|
100
|
+
if (input.keyParts) {
|
|
101
|
+
const parts = parseFileKeyParts("key-parts", input.keyParts);
|
|
102
|
+
return {
|
|
103
|
+
fileKey: encodeFileKey(parts),
|
|
104
|
+
keyParts: parts
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
throw new Error("Missing file key. Provide --file-key or --key-parts.");
|
|
108
|
+
};
|
|
109
|
+
const resolveOptionalFileKeyValue = (input) => {
|
|
110
|
+
if (input.fileKey && input.keyParts) throw new Error("Provide either --file-key or --key-parts, not both.");
|
|
111
|
+
if (input.fileKey) return {
|
|
112
|
+
fileKey: input.fileKey,
|
|
113
|
+
keyParts: void 0
|
|
114
|
+
};
|
|
115
|
+
if (input.keyParts) {
|
|
116
|
+
const parts = parseFileKeyParts("key-parts", input.keyParts);
|
|
117
|
+
return {
|
|
118
|
+
fileKey: encodeFileKey(parts),
|
|
119
|
+
keyParts: parts
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
fileKey: void 0,
|
|
124
|
+
keyParts: void 0
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
const resolvePrefixValue = (input) => {
|
|
128
|
+
if (input.prefix && input.prefixParts) throw new Error("Provide either --prefix or --prefix-parts, not both.");
|
|
129
|
+
if (input.prefix) return input.prefix;
|
|
130
|
+
if (input.prefixParts) return encodeFileKeyPrefix(parseFileKeyParts("prefix-parts", input.prefixParts));
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
//#endregion
|
|
134
|
+
export { baseArgs, createClientFromContext, parseJsonValue, resolveFileKeyValue, resolveOptionalFileKeyValue, resolvePrefixValue };
|
|
135
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","names":[],"sources":["../../../src/cli/utils/options.ts"],"sourcesContent":["import { encodeFileKey, encodeFileKeyPrefix, type FileKeyParts } from \"../../keys.js\";\nimport { createClient, type ClientConfig } from \"./client.js\";\n\ntype CommandContext = { values: Record<string, unknown> };\n\nexport const baseArgs = {\n \"base-url\": {\n type: \"string\",\n short: \"b\",\n description: \"Upload fragment base URL (env: FRAGNO_UPLOAD_BASE_URL)\",\n },\n header: {\n type: \"string\",\n short: \"H\",\n description:\n \"Extra HTTP header (repeatable), format: 'Name: value' (env: FRAGNO_UPLOAD_HEADERS)\",\n multiple: true,\n },\n timeout: {\n type: \"number\",\n description: \"Request timeout in ms (env: FRAGNO_UPLOAD_TIMEOUT_MS, default: 15000)\",\n },\n retries: {\n type: \"number\",\n description: \"Retry count for network/5xx/429 (env: FRAGNO_UPLOAD_RETRIES, default: 2)\",\n },\n \"retry-delay\": {\n type: \"number\",\n description: \"Delay between retries in ms (env: FRAGNO_UPLOAD_RETRY_DELAY_MS, default: 500)\",\n },\n} as const;\n\nconst DEFAULT_TIMEOUT_MS = 15000;\nconst DEFAULT_RETRIES = 2;\nconst DEFAULT_RETRY_DELAY_MS = 500;\n\nconst parseNumberEnv = (value: string | undefined) => {\n if (!value) {\n return undefined;\n }\n const parsed = Number(value);\n if (Number.isNaN(parsed)) {\n return undefined;\n }\n return parsed;\n};\n\nconst normalizeHeaderValues = (value: unknown): string[] => {\n if (!value) {\n return [];\n }\n if (Array.isArray(value)) {\n return value.map(String);\n }\n return [String(value)];\n};\n\nconst parseEnvHeaders = () => {\n const envHeaders = process.env[\"FRAGNO_UPLOAD_HEADERS\"];\n if (!envHeaders) {\n return [];\n }\n return envHeaders\n .split(/\\n|;/)\n .map((entry) => entry.trim())\n .filter(Boolean);\n};\n\nconst buildHeaders = (values: string[]) => {\n const headers = new Headers();\n for (const value of values) {\n const index = value.indexOf(\":\");\n if (index === -1) {\n throw new Error(`Invalid header: ${value}`);\n }\n const name = value.slice(0, index).trim();\n const headerValue = value.slice(index + 1).trim();\n if (!name || !headerValue) {\n throw new Error(`Invalid header: ${value}`);\n }\n headers.append(name, headerValue);\n }\n return headers;\n};\n\nconst resolveTimeout = (ctx: CommandContext) =>\n (ctx.values[\"timeout\"] as number | undefined) ??\n parseNumberEnv(process.env[\"FRAGNO_UPLOAD_TIMEOUT_MS\"]) ??\n DEFAULT_TIMEOUT_MS;\n\nconst resolveRetries = (ctx: CommandContext) =>\n (ctx.values[\"retries\"] as number | undefined) ??\n parseNumberEnv(process.env[\"FRAGNO_UPLOAD_RETRIES\"]) ??\n DEFAULT_RETRIES;\n\nconst resolveRetryDelay = (ctx: CommandContext) =>\n (ctx.values[\"retry-delay\"] as number | undefined) ??\n parseNumberEnv(process.env[\"FRAGNO_UPLOAD_RETRY_DELAY_MS\"]) ??\n DEFAULT_RETRY_DELAY_MS;\n\nexport const resolveBaseUrl = (ctx: CommandContext) => {\n const baseUrl =\n (ctx.values[\"base-url\"] as string | undefined) ?? process.env[\"FRAGNO_UPLOAD_BASE_URL\"];\n if (!baseUrl) {\n throw new Error(\"Missing base URL. Provide --base-url or set FRAGNO_UPLOAD_BASE_URL.\");\n }\n return baseUrl.replace(/\\/$/, \"\");\n};\n\nexport const createClientFromContext = (ctx: CommandContext) => {\n const headerValues = normalizeHeaderValues(ctx.values[\"header\"]).concat(parseEnvHeaders());\n\n const clientConfig: ClientConfig = {\n baseUrl: resolveBaseUrl(ctx),\n headers: buildHeaders(headerValues),\n timeoutMs: resolveTimeout(ctx),\n retries: resolveRetries(ctx),\n retryDelayMs: resolveRetryDelay(ctx),\n };\n\n return createClient(clientConfig);\n};\n\nexport const parseJsonValue = (label: string, value: string | undefined) => {\n if (value === undefined) {\n return undefined;\n }\n try {\n return JSON.parse(value) as unknown;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid ${label} JSON: ${message}`);\n }\n};\n\nexport const parseFileKeyParts = (label: string, value: string | undefined): FileKeyParts => {\n const parsed = parseJsonValue(label, value);\n if (!Array.isArray(parsed)) {\n throw new Error(`${label} must be a JSON array`);\n }\n for (const part of parsed) {\n if (typeof part !== \"string\" && typeof part !== \"number\") {\n throw new Error(`${label} must contain only strings or numbers`);\n }\n }\n return parsed as FileKeyParts;\n};\n\nexport const resolveFileKeyValue = (input: {\n fileKey: string | undefined;\n keyParts: string | undefined;\n}) => {\n if (input.fileKey && input.keyParts) {\n throw new Error(\"Provide either --file-key or --key-parts, not both.\");\n }\n\n if (input.fileKey) {\n return { fileKey: input.fileKey, keyParts: undefined };\n }\n\n if (input.keyParts) {\n const parts = parseFileKeyParts(\"key-parts\", input.keyParts);\n return { fileKey: encodeFileKey(parts), keyParts: parts };\n }\n\n throw new Error(\"Missing file key. Provide --file-key or --key-parts.\");\n};\n\nexport const resolveOptionalFileKeyValue = (input: {\n fileKey: string | undefined;\n keyParts: string | undefined;\n}) => {\n if (input.fileKey && input.keyParts) {\n throw new Error(\"Provide either --file-key or --key-parts, not both.\");\n }\n\n if (input.fileKey) {\n return { fileKey: input.fileKey, keyParts: undefined };\n }\n\n if (input.keyParts) {\n const parts = parseFileKeyParts(\"key-parts\", input.keyParts);\n return { fileKey: encodeFileKey(parts), keyParts: parts };\n }\n\n return { fileKey: undefined, keyParts: undefined };\n};\n\nexport const resolvePrefixValue = (input: {\n prefix: string | undefined;\n prefixParts: string | undefined;\n}) => {\n if (input.prefix && input.prefixParts) {\n throw new Error(\"Provide either --prefix or --prefix-parts, not both.\");\n }\n\n if (input.prefix) {\n return input.prefix;\n }\n\n if (input.prefixParts) {\n const parts = parseFileKeyParts(\"prefix-parts\", input.prefixParts);\n return encodeFileKeyPrefix(parts);\n }\n\n return undefined;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as gunshi13 from "gunshi";
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/files/delete.d.ts
|
|
4
|
+
declare const filesDeleteCommand: gunshi13.Command<{
|
|
5
|
+
"file-key": {
|
|
6
|
+
type: "string";
|
|
7
|
+
description: string;
|
|
8
|
+
};
|
|
9
|
+
"key-parts": {
|
|
10
|
+
type: "string";
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
"base-url": {
|
|
14
|
+
readonly type: "string";
|
|
15
|
+
readonly short: "b";
|
|
16
|
+
readonly description: "Upload fragment base URL (env: FRAGNO_UPLOAD_BASE_URL)";
|
|
17
|
+
};
|
|
18
|
+
header: {
|
|
19
|
+
readonly type: "string";
|
|
20
|
+
readonly short: "H";
|
|
21
|
+
readonly description: "Extra HTTP header (repeatable), format: 'Name: value' (env: FRAGNO_UPLOAD_HEADERS)";
|
|
22
|
+
readonly multiple: true;
|
|
23
|
+
};
|
|
24
|
+
timeout: {
|
|
25
|
+
readonly type: "number";
|
|
26
|
+
readonly description: "Request timeout in ms (env: FRAGNO_UPLOAD_TIMEOUT_MS, default: 15000)";
|
|
27
|
+
};
|
|
28
|
+
retries: {
|
|
29
|
+
readonly type: "number";
|
|
30
|
+
readonly description: "Retry count for network/5xx/429 (env: FRAGNO_UPLOAD_RETRIES, default: 2)";
|
|
31
|
+
};
|
|
32
|
+
"retry-delay": {
|
|
33
|
+
readonly type: "number";
|
|
34
|
+
readonly description: "Delay between retries in ms (env: FRAGNO_UPLOAD_RETRY_DELAY_MS, default: 500)";
|
|
35
|
+
};
|
|
36
|
+
}>;
|
|
37
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
38
|
+
//#endregion
|
|
39
|
+
export { filesDeleteCommand };
|
|
40
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","names":[],"sources":["../../../../../src/cli/commands/files/delete.ts"],"sourcesContent":[],"mappings":";;;cAGa,oBAwBX,QAAA,CAxB6B;;;IAAlB,WAAA,EAAA,MAwBX"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { baseArgs, createClientFromContext, resolveFileKeyValue } from "../../utils/options.js";
|
|
2
|
+
import { define } from "gunshi";
|
|
3
|
+
|
|
4
|
+
//#region src/cli/commands/files/delete.ts
|
|
5
|
+
const filesDeleteCommand = define({
|
|
6
|
+
name: "delete",
|
|
7
|
+
description: "Delete a file",
|
|
8
|
+
args: {
|
|
9
|
+
...baseArgs,
|
|
10
|
+
"file-key": {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "File key (encoded)"
|
|
13
|
+
},
|
|
14
|
+
"key-parts": {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "File key parts as JSON array"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
run: async (ctx) => {
|
|
20
|
+
const resolvedKey = resolveFileKeyValue({
|
|
21
|
+
fileKey: ctx.values["file-key"],
|
|
22
|
+
keyParts: ctx.values["key-parts"]
|
|
23
|
+
});
|
|
24
|
+
const response = await createClientFromContext(ctx).deleteFile(resolvedKey.fileKey);
|
|
25
|
+
console.log(JSON.stringify(response, null, 2));
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
export { filesDeleteCommand };
|
|
31
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","names":[],"sources":["../../../../../src/cli/commands/files/delete.ts"],"sourcesContent":["import { define } from \"gunshi\";\nimport { baseArgs, createClientFromContext, resolveFileKeyValue } from \"../../utils/options.js\";\n\nexport const filesDeleteCommand = define({\n name: \"delete\",\n description: \"Delete a file\",\n args: {\n ...baseArgs,\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 },\n run: async (ctx) => {\n const resolvedKey = resolveFileKeyValue({\n fileKey: ctx.values[\"file-key\"] as string | undefined,\n keyParts: ctx.values[\"key-parts\"] as string | undefined,\n });\n\n const client = createClientFromContext(ctx);\n const response = await client.deleteFile(resolvedKey.fileKey);\n console.log(JSON.stringify(response, null, 2));\n },\n});\n"],"mappings":";;;;AAGA,MAAa,qBAAqB,OAAO;CACvC,MAAM;CACN,aAAa;CACb,MAAM;EACJ,GAAG;EACH,YAAY;GACV,MAAM;GACN,aAAa;GACd;EACD,aAAa;GACX,MAAM;GACN,aAAa;GACd;EACF;CACD,KAAK,OAAO,QAAQ;EAClB,MAAM,cAAc,oBAAoB;GACtC,SAAS,IAAI,OAAO;GACpB,UAAU,IAAI,OAAO;GACtB,CAAC;EAGF,MAAM,WAAW,MADF,wBAAwB,IAAI,CACb,WAAW,YAAY,QAAQ;AAC7D,UAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC;;CAEjD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as gunshi15 from "gunshi";
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/files/download-url.d.ts
|
|
4
|
+
declare const filesDownloadUrlCommand: gunshi15.Command<{
|
|
5
|
+
"file-key": {
|
|
6
|
+
type: "string";
|
|
7
|
+
description: string;
|
|
8
|
+
};
|
|
9
|
+
"key-parts": {
|
|
10
|
+
type: "string";
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
"base-url": {
|
|
14
|
+
readonly type: "string";
|
|
15
|
+
readonly short: "b";
|
|
16
|
+
readonly description: "Upload fragment base URL (env: FRAGNO_UPLOAD_BASE_URL)";
|
|
17
|
+
};
|
|
18
|
+
header: {
|
|
19
|
+
readonly type: "string";
|
|
20
|
+
readonly short: "H";
|
|
21
|
+
readonly description: "Extra HTTP header (repeatable), format: 'Name: value' (env: FRAGNO_UPLOAD_HEADERS)";
|
|
22
|
+
readonly multiple: true;
|
|
23
|
+
};
|
|
24
|
+
timeout: {
|
|
25
|
+
readonly type: "number";
|
|
26
|
+
readonly description: "Request timeout in ms (env: FRAGNO_UPLOAD_TIMEOUT_MS, default: 15000)";
|
|
27
|
+
};
|
|
28
|
+
retries: {
|
|
29
|
+
readonly type: "number";
|
|
30
|
+
readonly description: "Retry count for network/5xx/429 (env: FRAGNO_UPLOAD_RETRIES, default: 2)";
|
|
31
|
+
};
|
|
32
|
+
"retry-delay": {
|
|
33
|
+
readonly type: "number";
|
|
34
|
+
readonly description: "Delay between retries in ms (env: FRAGNO_UPLOAD_RETRY_DELAY_MS, default: 500)";
|
|
35
|
+
};
|
|
36
|
+
}>;
|
|
37
|
+
//# sourceMappingURL=download-url.d.ts.map
|
|
38
|
+
//#endregion
|
|
39
|
+
export { filesDownloadUrlCommand };
|
|
40
|
+
//# sourceMappingURL=download-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-url.d.ts","names":[],"sources":["../../../../../src/cli/commands/files/download-url.ts"],"sourcesContent":[],"mappings":";;;cAGa,yBAwBX,QAAA,CAxBkC;;;IAAvB,WAAA,EAAA,MAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { baseArgs, createClientFromContext, resolveFileKeyValue } from "../../utils/options.js";
|
|
2
|
+
import { define } from "gunshi";
|
|
3
|
+
|
|
4
|
+
//#region src/cli/commands/files/download-url.ts
|
|
5
|
+
const filesDownloadUrlCommand = define({
|
|
6
|
+
name: "download-url",
|
|
7
|
+
description: "Get a signed download URL",
|
|
8
|
+
args: {
|
|
9
|
+
...baseArgs,
|
|
10
|
+
"file-key": {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "File key (encoded)"
|
|
13
|
+
},
|
|
14
|
+
"key-parts": {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "File key parts as JSON array"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
run: async (ctx) => {
|
|
20
|
+
const resolvedKey = resolveFileKeyValue({
|
|
21
|
+
fileKey: ctx.values["file-key"],
|
|
22
|
+
keyParts: ctx.values["key-parts"]
|
|
23
|
+
});
|
|
24
|
+
const response = await createClientFromContext(ctx).getDownloadUrl(resolvedKey.fileKey);
|
|
25
|
+
console.log(JSON.stringify(response, null, 2));
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
export { filesDownloadUrlCommand };
|
|
31
|
+
//# sourceMappingURL=download-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-url.js","names":[],"sources":["../../../../../src/cli/commands/files/download-url.ts"],"sourcesContent":["import { define } from \"gunshi\";\nimport { baseArgs, createClientFromContext, resolveFileKeyValue } from \"../../utils/options.js\";\n\nexport const filesDownloadUrlCommand = define({\n name: \"download-url\",\n description: \"Get a signed download URL\",\n args: {\n ...baseArgs,\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 },\n run: async (ctx) => {\n const resolvedKey = resolveFileKeyValue({\n fileKey: ctx.values[\"file-key\"] as string | undefined,\n keyParts: ctx.values[\"key-parts\"] as string | undefined,\n });\n\n const client = createClientFromContext(ctx);\n const response = await client.getDownloadUrl(resolvedKey.fileKey);\n console.log(JSON.stringify(response, null, 2));\n },\n});\n"],"mappings":";;;;AAGA,MAAa,0BAA0B,OAAO;CAC5C,MAAM;CACN,aAAa;CACb,MAAM;EACJ,GAAG;EACH,YAAY;GACV,MAAM;GACN,aAAa;GACd;EACD,aAAa;GACX,MAAM;GACN,aAAa;GACd;EACF;CACD,KAAK,OAAO,QAAQ;EAClB,MAAM,cAAc,oBAAoB;GACtC,SAAS,IAAI,OAAO;GACpB,UAAU,IAAI,OAAO;GACtB,CAAC;EAGF,MAAM,WAAW,MADF,wBAAwB,IAAI,CACb,eAAe,YAAY,QAAQ;AACjE,UAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC;;CAEjD,CAAC"}
|