/** Operational classification of a built-in blob destination. */ export type BlobDestinationStatus = "available" | "requires-account" | "incompatible" | "defunct"; /** Supported value shapes for destination configuration fields. */ export type BlobDestinationFieldType = "string" | "boolean" | "number" | "select"; /** A non-secret configuration field accepted by a destination. */ export interface BlobDestinationOptionDescriptor { /** Stable key stored below `images.urls.options`. */ readonly key: string; /** Human-readable field label. */ readonly label: string; /** Shape of the stored value. */ readonly type: BlobDestinationFieldType; /** Whether configuration must provide the field. */ readonly required?: boolean; /** Suggested value when the field is omitted. */ readonly default?: string | number | boolean; /** Allowed values for a select field. */ readonly choices?: readonly string[]; } /** A secret or account identifier accepted by a destination. */ export interface BlobDestinationCredentialDescriptor { /** Stable key stored below `images.urls.credentials`. */ readonly key: string; /** Human-readable field label. */ readonly label: string; /** Whether the destination cannot operate without the credential. */ readonly required?: boolean; /** Whether the value must be hidden in user interfaces and logs. */ readonly secret: boolean; } /** Static capability and configuration metadata for a built-in destination. */ export interface BlobDestinationMetadata { /** Stable registry identifier. */ readonly id: Id; /** Human-readable destination name. */ readonly label: string; /** Broad implementation family used for diagnostics and dispatch. */ readonly family: string; /** Current operational classification. */ readonly status: BlobDestinationStatus; /** Whether a publication URL serves image bytes rather than a viewer page. */ readonly directImage: boolean; /** Explanation for an unavailable or constrained destination. */ readonly reason?: string; /** Non-secret destination settings. */ readonly options: readonly BlobDestinationOptionDescriptor[]; /** Account identifiers and secrets required by the destination. */ readonly credentials: readonly BlobDestinationCredentialDescriptor[]; } const noFields = [] as const; /** Complete static registry of built-in blob publication destinations. */ export const BUILTIN_BLOB_DESTINATIONS = { imgur: { id: "imgur", label: "Imgur", family: "image-host", status: "requires-account", directImage: true, reason: "Uploads require either an Imgur access token or client ID.", options: [{ key: "album", label: "Album", type: "string" }], credentials: [ { key: "clientId", label: "Client ID", secret: true }, { key: "accessToken", label: "Access token", secret: true }, ], }, imageshack: { id: "imageshack", label: "ImageShack", family: "image-host", status: "requires-account", directImage: true, reason: "The API requires a paid subscription.", options: [{ key: "public", label: "Public image", type: "boolean", default: false }], credentials: [ { key: "apiKey", label: "API key", required: true, secret: true }, { key: "authToken", label: "Authentication token", required: true, secret: true }, ], }, flickr: { id: "flickr", label: "Flickr", family: "image-host", status: "requires-account", directImage: true, options: [ { key: "title", label: "Title", type: "string" }, { key: "description", label: "Description", type: "string" }, { key: "tags", label: "Tags", type: "string" }, { key: "isPublic", label: "Public visibility", type: "string" }, { key: "isFriend", label: "Friend visibility", type: "string" }, { key: "isFamily", label: "Family visibility", type: "string" }, { key: "safetyLevel", label: "Safety level", type: "string" }, { key: "contentType", label: "Content type", type: "string" }, { key: "hidden", label: "Hidden from searches", type: "string" }, ], credentials: [ { key: "apiKey", label: "API key", required: true, secret: false }, { key: "apiSecret", label: "API secret", required: true, secret: true }, { key: "oauthToken", label: "OAuth token", required: true, secret: true }, { key: "oauthTokenSecret", label: "OAuth token secret", required: true, secret: true }, ], }, photobucket: { id: "photobucket", label: "Photobucket", family: "image-host", status: "defunct", directImage: false, reason: "The legacy upload API is decommissioned and third-party embedding is paywalled.", options: noFields, credentials: noFields, }, chevereto: { id: "chevereto", label: "Chevereto", family: "self-hosted", status: "requires-account", directImage: true, options: [{ key: "endpoint", label: "API endpoint", type: "string", required: true }], credentials: [{ key: "apiKey", label: "API key", required: true, secret: true }], }, vgyme: { id: "vgyme", label: "vgy.me", family: "image-host", status: "available", directImage: true, options: noFields, credentials: [{ key: "userKey", label: "User key", secret: true }], }, "custom-image-uploader": { id: "custom-image-uploader", label: "ShareX custom image uploader", family: "sharex-custom", status: "incompatible", directImage: false, reason: "Arbitrary .sxcu definitions are intentionally unsupported by the built-in registry.", options: noFields, credentials: noFields, }, "file-uploader": { id: "file-uploader", label: "ShareX delegated file uploader", family: "sharex-routing", status: "incompatible", directImage: false, reason: "This ShareX routing sentinel is not a publication service.", options: noFields, credentials: noFields, }, dropbox: { id: "dropbox", label: "Dropbox", family: "cloud-files", status: "requires-account", directImage: true, options: [ { key: "uploadPath", label: "Upload path", type: "string", default: "ShareX/%y/%mo" }, { key: "createShareableLink", label: "Create shareable link", type: "boolean", default: true }, { key: "directLink", label: "Use direct link", type: "boolean", default: true }, ], credentials: [{ key: "oauthToken", label: "OAuth token", required: true, secret: true }], }, ftp: { id: "ftp", label: "FTP / FTPS / SFTP", family: "file-transfer", status: "requires-account", directImage: true, options: [ { key: "protocol", label: "Protocol", type: "select", default: "sftp", choices: ["ftp", "ftps", "sftp"] }, { key: "host", label: "Host", type: "string", required: true }, { key: "port", label: "Port", type: "number", default: 22 }, { key: "path", label: "Remote path", type: "string" }, { key: "publicBaseUrl", label: "Public base URL", type: "string", required: true }, { key: "commandBinary", label: "FTP command binary", type: "string" }, ], credentials: [ { key: "username", label: "Username", required: true, secret: false }, { key: "password", label: "Password", secret: true }, { key: "privateKey", label: "Private key path", secret: true }, ], }, onedrive: { id: "onedrive", label: "OneDrive", family: "cloud-files", status: "requires-account", directImage: true, options: [ { key: "folderId", label: "Folder ID", type: "string" }, { key: "directLink", label: "Use embed link", type: "boolean", default: true }, ], credentials: [{ key: "oauthToken", label: "OAuth token", required: true, secret: true }], }, "google-drive": { id: "google-drive", label: "Google Drive", family: "cloud-files", status: "requires-account", directImage: true, options: [ { key: "folderId", label: "Folder ID", type: "string" }, { key: "public", label: "Make public", type: "boolean", default: true }, ], credentials: [{ key: "oauthToken", label: "OAuth token", required: true, secret: true }], }, puush: { id: "puush", label: "puush-compatible endpoint", family: "legacy-host", status: "requires-account", directImage: true, reason: "The public service is defunct; a replacement endpoint is required.", options: [{ key: "endpoint", label: "Replacement endpoint", type: "string", required: true }], credentials: [{ key: "apiKey", label: "API key", required: true, secret: true }], }, box: { id: "box", label: "Box", family: "cloud-files", status: "requires-account", directImage: true, options: [ { key: "folderId", label: "Folder ID", type: "string", default: "0" }, { key: "directLink", label: "Use direct link", type: "boolean", default: true }, { key: "shareAccess", label: "Share access", type: "select", default: "open", choices: ["open", "company", "collaborators"], }, ], credentials: [{ key: "oauthToken", label: "OAuth token", required: true, secret: true }], }, "amazon-s3": { id: "amazon-s3", label: "Amazon S3", family: "s3", status: "requires-account", directImage: true, options: [ { key: "endpoint", label: "Endpoint", type: "string" }, { key: "region", label: "Region", type: "string", default: "us-east-1" }, { key: "bucket", label: "Bucket", type: "string", required: true }, { key: "keyPrefix", label: "Object key prefix", type: "string" }, { key: "prefix", label: "Object prefix", type: "string" }, { key: "path", label: "Object path", type: "string" }, { key: "publicBaseUrl", label: "Public base URL", type: "string" }, { key: "pathStyle", label: "Path-style requests", type: "boolean", default: false }, { key: "cacheControl", label: "Cache-Control", type: "string" }, ], credentials: [ { key: "accessKeyId", label: "Access key ID", required: true, secret: false }, { key: "secretAccessKey", label: "Secret access key", required: true, secret: true }, { key: "sessionToken", label: "Session token", secret: true }, ], }, "google-cloud-storage": { id: "google-cloud-storage", label: "Google Cloud Storage", family: "object-storage", status: "requires-account", directImage: true, options: [ { key: "bucket", label: "Bucket", type: "string", required: true }, { key: "keyPrefix", label: "Object key prefix", type: "string" }, { key: "prefix", label: "Object prefix", type: "string" }, { key: "path", label: "Object path", type: "string" }, { key: "publicBaseUrl", label: "Public base URL", type: "string" }, { key: "cacheControl", label: "Cache-Control", type: "string" }, ], credentials: [{ key: "oauthToken", label: "OAuth token", required: true, secret: true }], }, "azure-storage": { id: "azure-storage", label: "Azure Blob Storage", family: "object-storage", status: "requires-account", directImage: true, options: [ { key: "endpoint", label: "Endpoint", type: "string" }, { key: "container", label: "Container", type: "string", required: true }, { key: "keyPrefix", label: "Object key prefix", type: "string" }, { key: "prefix", label: "Object prefix", type: "string" }, { key: "path", label: "Upload path", type: "string" }, { key: "publicBaseUrl", label: "Public base URL", type: "string" }, { key: "cacheControl", label: "Cache-Control", type: "string" }, ], credentials: [ { key: "accountName", label: "Account name", required: true, secret: false }, { key: "accountKey", label: "Account key", required: true, secret: true }, ], }, "backblaze-b2": { id: "backblaze-b2", label: "Backblaze B2", family: "object-storage", status: "requires-account", directImage: true, reason: "Configure either native B2 application keys or S3-compatible access keys.", options: [ { key: "endpoint", label: "S3 endpoint", type: "string" }, { key: "region", label: "S3 region", type: "string", default: "us-west-004" }, { key: "bucket", label: "Bucket", type: "string", required: true }, { key: "keyPrefix", label: "Object key prefix", type: "string" }, { key: "prefix", label: "Object prefix", type: "string" }, { key: "path", label: "Upload path", type: "string" }, { key: "pathStyle", label: "Path-style requests", type: "boolean", default: false }, { key: "publicBaseUrl", label: "Public base URL", type: "string" }, { key: "cacheControl", label: "Cache-Control", type: "string" }, { key: "authorizeEndpoint", label: "Authorization endpoint", type: "string", default: "https://api.backblazeb2.com/b2api/v2/b2_authorize_account", }, ], credentials: [ { key: "applicationKeyId", label: "Application key ID", secret: false }, { key: "applicationKey", label: "Application key", secret: true }, { key: "accessKeyId", label: "S3 access key ID", secret: false }, { key: "secretAccessKey", label: "S3 secret access key", secret: true }, { key: "sessionToken", label: "S3 session token", secret: true }, ], }, owncloud: { id: "owncloud", label: "ownCloud / Nextcloud", family: "webdav", status: "requires-account", directImage: true, options: [ { key: "host", label: "Host", type: "string", required: true }, { key: "path", label: "Remote path", type: "string" }, { key: "directLink", label: "Use direct link", type: "boolean", default: true }, { key: "previewLink", label: "Use preview link", type: "boolean", default: false }, { key: "expiryDays", label: "Expiry days", type: "number" }, ], credentials: [ { key: "username", label: "Username", required: true, secret: false }, { key: "password", label: "Password", required: true, secret: true }, ], }, mediafire: { id: "mediafire", label: "MediaFire-compatible endpoint", family: "legacy-host", status: "available", directImage: true, reason: "The public API is deprecated; a replacement endpoint is required.", options: [ { key: "endpoint", label: "Replacement endpoint", type: "string", required: true }, { key: "path", label: "Upload path", type: "string" }, ], credentials: [ { key: "username", label: "Username", secret: false }, { key: "password", label: "Password", secret: true }, { key: "apiKey", label: "API key", secret: true }, ], }, pushbullet: { id: "pushbullet", label: "Pushbullet", family: "messaging", status: "requires-account", directImage: false, options: [{ key: "deviceId", label: "Device ID", type: "string" }], credentials: [{ key: "apiKey", label: "API key", required: true, secret: true }], }, sendspace: { id: "sendspace", label: "SendSpace-compatible endpoint", family: "legacy-host", status: "available", directImage: true, reason: "The public discovery API is deprecated; a replacement endpoint is required.", options: [{ key: "endpoint", label: "Replacement discovery endpoint", type: "string", required: true }], credentials: [{ key: "apiKey", label: "API key", secret: true }], }, localhostr: { id: "localhostr", label: "Hostr-compatible endpoint", family: "legacy-host", status: "available", directImage: true, reason: "The public service is offline; a replacement endpoint is required.", options: [ { key: "endpoint", label: "Replacement endpoint", type: "string", required: true }, { key: "publicBaseUrl", label: "Public base URL", type: "string" }, ], credentials: [ { key: "email", label: "Email", secret: false }, { key: "password", label: "Password", secret: true }, ], }, lambda: { id: "lambda", label: "Lambda-compatible endpoint", family: "legacy-host", status: "requires-account", directImage: true, reason: "The public service is offline; a replacement endpoint is required.", options: [ { key: "endpoint", label: "Replacement endpoint", type: "string", required: true }, { key: "resultBaseUrl", label: "Result base URL", type: "string" }, ], credentials: [{ key: "apiKey", label: "API key", required: true, secret: true }], }, pomf: { id: "pomf", label: "Pomf", family: "pomf", status: "available", directImage: true, options: [ { key: "uploadUrl", label: "Upload URL", type: "string", required: true }, { key: "resultBaseUrl", label: "Result base URL", type: "string" }, { key: "fileField", label: "Multipart file field", type: "string", default: "files[]" }, { key: "urlPath", label: "JSON URL path", type: "string", default: "files.0.url" }, ], credentials: noFields, }, uguu: { id: "uguu", label: "Uguu", family: "anonymous-host", status: "available", directImage: true, reason: "Public uploads expire after approximately three hours.", options: noFields, credentials: noFields, }, seafile: { id: "seafile", label: "Seafile", family: "cloud-files", status: "requires-account", directImage: true, options: [ { key: "apiUrl", label: "API URL", type: "string", required: true }, { key: "repositoryId", label: "Repository ID", type: "string", required: true }, { key: "path", label: "Remote path", type: "string" }, { key: "raw", label: "Use raw link", type: "boolean", default: true }, { key: "expiryDays", label: "Expiry days", type: "number" }, ], credentials: [ { key: "authToken", label: "Authentication token", required: true, secret: true }, { key: "sharePassword", label: "Share password", secret: true }, ], }, streamable: { id: "streamable", label: "Streamable", family: "video-host", status: "incompatible", directImage: false, reason: "Streamable accepts video, not image blobs.", options: noFields, credentials: noFields, }, "s-ul": { id: "s-ul", label: "s-ul", family: "file-host", status: "requires-account", directImage: true, options: noFields, credentials: [{ key: "apiKey", label: "API key", required: true, secret: true }], }, lobfile: { id: "lobfile", label: "LobFile-compatible endpoint", family: "legacy-host", status: "requires-account", directImage: true, reason: "The public service is offline; a replacement endpoint is required.", options: [{ key: "endpoint", label: "Replacement endpoint", type: "string", required: true }], credentials: [{ key: "apiKey", label: "API key", required: true, secret: true }], }, "transfer-sh": { id: "transfer-sh", label: "transfer.sh-compatible endpoint", family: "anonymous-host", status: "available", directImage: true, reason: "The defunct public endpoint is blocked; a self-hosted replacement is required.", options: [{ key: "endpoint", label: "Replacement endpoint", type: "string", required: true }], credentials: noFields, }, plik: { id: "plik", label: "Plik", family: "self-hosted", status: "available", directImage: true, options: [ { key: "endpoint", label: "Endpoint", type: "string", required: true }, { key: "ttlSeconds", label: "TTL seconds", type: "number" }, { key: "removable", label: "Allow deletion", type: "boolean", default: true }, ], credentials: [{ key: "apiKey", label: "API key", secret: true }], }, youtube: { id: "youtube", label: "YouTube", family: "video-host", status: "incompatible", directImage: false, reason: "YouTube accepts video, not image blobs.", options: noFields, credentials: noFields, }, vault: { id: "vault", label: "Vault.ooo", family: "encrypted-host", status: "defunct", directImage: false, reason: "The service is offline; its ciphertext viewer was also incompatible with direct images.", options: noFields, credentials: noFields, }, "shared-folder": { id: "shared-folder", label: "Shared folder", family: "filesystem", status: "available", directImage: true, options: [ { key: "root", label: "Root directory", type: "string", required: true }, { key: "path", label: "Subfolder path", type: "string" }, { key: "publicBaseUrl", label: "Public base URL", type: "string", required: true }, ], credentials: noFields, }, email: { id: "email", label: "Email", family: "messaging", status: "incompatible", directImage: false, reason: "SMTP attachments do not produce a public URL.", options: noFields, credentials: noFields, }, "custom-file-uploader": { id: "custom-file-uploader", label: "ShareX custom file uploader", family: "sharex-custom", status: "incompatible", directImage: false, reason: "Arbitrary .sxcu definitions are intentionally unsupported by the built-in registry.", options: noFields, credentials: noFields, }, catbox: { id: "catbox", label: "Catbox", family: "anonymous-host", status: "available", directImage: true, options: noFields, credentials: [{ key: "userHash", label: "User hash", secret: true }], }, litterbox: { id: "litterbox", label: "Litterbox", family: "anonymous-host", status: "available", directImage: true, reason: "Uploads are temporary.", options: [ { key: "ttl", label: "Retention", type: "select", default: "24h", choices: ["1h", "12h", "24h", "72h"] }, ], credentials: noFields, }, "0x0": { id: "0x0", label: "0x0.st", family: "anonymous-host", status: "available", directImage: true, reason: "Public uploads expire after a retention window determined by file size.", options: noFields, credentials: noFields, }, tmpfiles: { id: "tmpfiles", label: "tmpfiles.org", family: "anonymous-host", status: "available", directImage: true, reason: "Public uploads are temporary.", options: [{ key: "ttl", label: "Retention", type: "string", default: "1h" }], credentials: noFields, }, discord: { id: "discord", label: "Discord", family: "messaging", status: "requires-account", directImage: true, options: [ { key: "content", label: "Message content", type: "string" }, { key: "threadId", label: "Thread ID", type: "string" }, ], credentials: [{ key: "webhookUrl", label: "Webhook URL", required: true, secret: true }], }, "provider-files": { id: "provider-files", label: "Model provider files", family: "provider-files", status: "requires-account", directImage: false, reason: "Provider file references are API-local rather than public image URLs.", options: [ { key: "provider", label: "Provider", type: "select", required: true, choices: ["openai", "anthropic", "google"], }, ], credentials: noFields, }, direct: { id: "direct", label: "Direct public URL", family: "local-serving", status: "available", directImage: true, options: [{ key: "publicBaseUrl", label: "Public base URL", type: "string", required: true }], credentials: noFields, }, cloudflared: { id: "cloudflared", label: "Cloudflare quick tunnel", family: "tunnel", status: "available", directImage: true, options: noFields, credentials: noFields, }, ngrok: { id: "ngrok", label: "ngrok", family: "tunnel", status: "requires-account", directImage: true, options: noFields, credentials: [{ key: "authToken", label: "Authentication token", required: true, secret: true }], }, tailscale: { id: "tailscale", label: "Tailscale Funnel", family: "tunnel", status: "requires-account", directImage: true, options: noFields, credentials: noFields, }, ssh: { id: "ssh", label: "SSH reverse tunnel", family: "tunnel", status: "requires-account", directImage: true, options: [{ key: "host", label: "SSH host", type: "string", required: true }], credentials: [{ key: "privateKey", label: "SSH private key", secret: true }], }, command: { id: "command", label: "Uploader command", family: "external-command", status: "available", directImage: true, options: [{ key: "command", label: "Command template", type: "string", required: true }], credentials: noFields, }, "localhost-run": { id: "localhost-run", label: "localhost.run", family: "tunnel", status: "available", directImage: true, options: noFields, credentials: noFields, }, pinggy: { id: "pinggy", label: "Pinggy", family: "tunnel", status: "available", directImage: true, options: [{ key: "publicBaseUrl", label: "Stable public base URL", type: "string" }], credentials: [{ key: "token", label: "Pro token", secret: true }], }, devtunnel: { id: "devtunnel", label: "Microsoft dev tunnel", family: "tunnel", status: "requires-account", directImage: true, reason: "The devtunnel CLI must be logged in locally.", options: noFields, credentials: noFields, }, zrok: { id: "zrok", label: "zrok", family: "tunnel", status: "requires-account", directImage: true, reason: "The local zrok environment must be enabled.", options: noFields, credentials: noFields, }, bore: { id: "bore", label: "bore", family: "tunnel", status: "available", directImage: true, options: [{ key: "server", label: "Bore server", type: "string", default: "bore.pub" }], credentials: [{ key: "secret", label: "Authentication secret", secret: true }], }, "named-cloudflared": { id: "named-cloudflared", label: "Named Cloudflare Tunnel", family: "tunnel", status: "requires-account", directImage: true, options: [ { key: "publicBaseUrl", label: "Public base URL", type: "string", required: true }, { key: "configFile", label: "Cloudflared config file", type: "string" }, { key: "tunnelName", label: "Tunnel name or UUID", type: "string" }, ], credentials: [{ key: "tunnelToken", label: "Tunnel token", secret: true }], }, r2: { id: "r2", label: "Cloudflare R2", family: "s3", status: "requires-account", directImage: true, options: [ { key: "endpoint", label: "Endpoint", type: "string" }, { key: "accountId", label: "Account ID", type: "string" }, { key: "region", label: "Region", type: "string", default: "auto" }, { key: "bucket", label: "Bucket", type: "string", required: true }, { key: "keyPrefix", label: "Object key prefix", type: "string" }, { key: "prefix", label: "Object prefix", type: "string" }, { key: "path", label: "Object path", type: "string" }, { key: "pathStyle", label: "Path-style requests", type: "boolean", default: true }, { key: "publicBaseUrl", label: "Public base URL", type: "string" }, { key: "cacheControl", label: "Cache-Control", type: "string" }, ], credentials: [ { key: "accessKeyId", label: "Access key ID", required: true, secret: false }, { key: "secretAccessKey", label: "Secret access key", required: true, secret: true }, { key: "sessionToken", label: "Session token", secret: true }, ], }, tigris: { id: "tigris", label: "Tigris", family: "s3", status: "requires-account", directImage: true, options: [ { key: "endpoint", label: "Endpoint", type: "string" }, { key: "bucket", label: "Bucket", type: "string", required: true }, { key: "region", label: "Region", type: "string", default: "auto" }, { key: "keyPrefix", label: "Object key prefix", type: "string" }, { key: "prefix", label: "Object prefix", type: "string" }, { key: "path", label: "Object path", type: "string" }, { key: "pathStyle", label: "Path-style requests", type: "boolean", default: false }, { key: "publicBaseUrl", label: "Public base URL", type: "string" }, { key: "cacheControl", label: "Cache-Control", type: "string" }, ], credentials: [ { key: "accessKeyId", label: "Access key ID", required: true, secret: false }, { key: "secretAccessKey", label: "Secret access key", required: true, secret: true }, { key: "sessionToken", label: "Session token", secret: true }, ], }, minio: { id: "minio", label: "MinIO", family: "s3", status: "requires-account", directImage: true, options: [ { key: "endpoint", label: "Endpoint", type: "string", required: true }, { key: "bucket", label: "Bucket", type: "string", required: true }, { key: "region", label: "Region", type: "string", default: "us-east-1" }, { key: "keyPrefix", label: "Object key prefix", type: "string" }, { key: "prefix", label: "Object prefix", type: "string" }, { key: "path", label: "Object path", type: "string" }, { key: "pathStyle", label: "Path-style requests", type: "boolean", default: true }, { key: "publicBaseUrl", label: "Public base URL", type: "string" }, { key: "cacheControl", label: "Cache-Control", type: "string" }, ], credentials: [ { key: "accessKeyId", label: "Access key ID", required: true, secret: false }, { key: "secretAccessKey", label: "Secret access key", required: true, secret: true }, { key: "sessionToken", label: "Session token", secret: true }, ], }, garage: { id: "garage", label: "Garage", family: "s3", status: "requires-account", directImage: true, options: [ { key: "endpoint", label: "Endpoint", type: "string", required: true }, { key: "bucket", label: "Bucket", type: "string", required: true }, { key: "region", label: "Region", type: "string", default: "garage" }, { key: "keyPrefix", label: "Object key prefix", type: "string" }, { key: "prefix", label: "Object prefix", type: "string" }, { key: "path", label: "Object path", type: "string" }, { key: "pathStyle", label: "Path-style requests", type: "boolean", default: true }, { key: "publicBaseUrl", label: "Public base URL", type: "string" }, { key: "cacheControl", label: "Cache-Control", type: "string" }, ], credentials: [ { key: "accessKeyId", label: "Access key ID", required: true, secret: false }, { key: "secretAccessKey", label: "Secret access key", required: true, secret: true }, { key: "sessionToken", label: "Session token", secret: true }, ], }, } as const satisfies Record; /** Identifier of any built-in blob destination, derived from registry keys. */ export type BlobDestinationId = keyof typeof BUILTIN_BLOB_DESTINATIONS; /** Exhaustive mapping of ShareX `ImageDestination` members to registry entries. */ export const SHAREX_IMAGE_DESTINATIONS = { Imgur: "imgur", ImageShack: "imageshack", Flickr: "flickr", Photobucket: "photobucket", Chevereto: "chevereto", Vgyme: "vgyme", CustomImageUploader: "custom-image-uploader", FileUploader: "file-uploader", } as const satisfies Record; /** Exhaustive mapping of ShareX `FileDestination` members to registry entries. */ export const SHAREX_FILE_DESTINATIONS = { Dropbox: "dropbox", FTP: "ftp", OneDrive: "onedrive", GoogleDrive: "google-drive", Puush: "puush", Box: "box", AmazonS3: "amazon-s3", GoogleCloudStorage: "google-cloud-storage", AzureStorage: "azure-storage", BackblazeB2: "backblaze-b2", OwnCloud: "owncloud", MediaFire: "mediafire", Pushbullet: "pushbullet", SendSpace: "sendspace", Localhostr: "localhostr", Lambda: "lambda", Pomf: "pomf", Uguu: "uguu", Seafile: "seafile", Streamable: "streamable", Sul: "s-ul", Lithiio: "lobfile", Transfersh: "transfer-sh", Plik: "plik", YouTube: "youtube", Vault_ooo: "vault", SharedFolder: "shared-folder", Email: "email", CustomFileUploader: "custom-file-uploader", } as const satisfies Record;