@dropthis/cli 0.10.0 → 0.12.0
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/README.md +10 -6
- package/dist/cli.cjs +774 -86
- package/dist/cli.cjs.map +1 -1
- package/node_modules/@dropthis/node/README.md +48 -1
- package/node_modules/@dropthis/node/dist/{drops-D0MLPPF9.d.cts → drops-DEJcU6qw.d.cts} +130 -3
- package/node_modules/@dropthis/node/dist/{drops-D0MLPPF9.d.ts → drops-DEJcU6qw.d.ts} +130 -3
- package/node_modules/@dropthis/node/dist/edge.cjs +82 -3
- package/node_modules/@dropthis/node/dist/edge.cjs.map +1 -1
- package/node_modules/@dropthis/node/dist/edge.d.cts +3 -1
- package/node_modules/@dropthis/node/dist/edge.d.ts +3 -1
- package/node_modules/@dropthis/node/dist/edge.mjs +82 -3
- package/node_modules/@dropthis/node/dist/edge.mjs.map +1 -1
- package/node_modules/@dropthis/node/dist/index.cjs +84 -3
- package/node_modules/@dropthis/node/dist/index.cjs.map +1 -1
- package/node_modules/@dropthis/node/dist/index.d.cts +5 -3
- package/node_modules/@dropthis/node/dist/index.d.ts +5 -3
- package/node_modules/@dropthis/node/dist/index.mjs +83 -3
- package/node_modules/@dropthis/node/dist/index.mjs.map +1 -1
- package/node_modules/@dropthis/node/package.json +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/publish/node.ts","../src/errors.ts","../src/publish/checksum.ts","../src/publish/detect.ts","../src/publish/paths.ts","../src/publish/core.ts","../src/publish/files.ts","../src/resources/account.ts","../src/resources/api-keys.ts","../src/resources/auth.ts","../src/resources/deployments.ts","../src/pagination.ts","../src/resources/drops.ts","../src/resources/uploads.ts","../src/case.ts","../src/transport.ts","../src/dropthis.ts"],"sourcesContent":["export { Dropthis } from \"./dropthis.js\";\nexport {\n\tcreateErrorResult,\n\tPublishInputError,\n\tredactSecrets,\n} from \"./errors.js\";\nexport { CursorPage } from \"./pagination.js\";\nexport type {\n\tInMemoryPublishInput,\n\tPreparedPublishRequest,\n\tPreparedUploadFile,\n} from \"./publish/core.js\";\nexport { DeploymentsResource } from \"./resources/deployments.js\";\nexport { UploadsResource } from \"./resources/uploads.js\";\nexport type {\n\tAccountLimits,\n\tAccountResponse,\n\tActionResolve,\n\tCreateUploadSessionRequest,\n\tCreateUploadSessionResponse,\n\tDeploymentContentFile,\n\tDeploymentContentManifest,\n\tDropAction,\n\tDropContentFile,\n\tDropDeploymentResponse,\n\tDropOptions,\n\tDropResponse,\n\tDropthisClientOptions,\n\tDropthisErrorResponse,\n\tDropthisResult,\n\tGetContentOptions,\n\tLimitations,\n\tListDeploymentsParams,\n\tListDeploymentsResponse,\n\tListPage,\n\tPrepareOptions,\n\tPublishFileInput,\n\tPublishInput,\n\tPublishOptions,\n\tRequestControls,\n\tRequestOptions,\n\tTierInfo,\n\tUpdateContentOptions,\n\tUploadManifestFile,\n\tUploadSessionFileResponse,\n\tUploadSessionResponse,\n\tUploadTarget,\n} from \"./types.js\";\n","import { readFile, stat } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { PublishInputError } from \"../errors.js\";\nimport type { PublishInput, PublishOptions } from \"../types.js\";\nimport { sha256File } from \"./checksum.js\";\nimport {\n\tbuildStagedRequest,\n\ttype InMemoryPublishInput,\n\ttype PreparedPublishRequest,\n\ttype PreparedUploadFile,\n\tresolveInMemory,\n} from \"./core.js\";\nimport { isHttpUrl, isPathShaped } from \"./detect.js\";\nimport type { PublishFile } from \"./files.js\";\nimport { collectPublishFiles, detectPathContentType } from \"./files.js\";\nimport { assertValidManifestPath } from \"./paths.js\";\n\n/**\n * Files at or above this size get a precomputed sha256 so the server can verify\n * the signed upload. Smaller files skip the hash to keep publishes snappy.\n * Matches the threshold the legacy prepare.ts used.\n */\nconst SINGLE_PUT_CHECKSUM_THRESHOLD = 10 * 1024 * 1024;\n\n/**\n * Resolves any {@link PublishInput} into a {@link PreparedPublishRequest},\n * adding filesystem support on top of the pure in-memory resolver in core.ts.\n *\n * - URL / Uint8Array / `{ kind }` objects → delegate to {@link resolveInMemory}.\n * - `string[]` → a local bundle of files/directories.\n * - bare `string` → stat-first: http URL → source; multiline/oversized → inline\n * content; otherwise stat the path (file/dir) or treat as inline prose.\n */\nexport async function resolveInput(\n\tinput: PublishInput,\n\toptions: PublishOptions = {},\n): Promise<PreparedPublishRequest> {\n\tif (\n\t\tinput instanceof URL ||\n\t\tinput instanceof Uint8Array ||\n\t\t(typeof input === \"object\" && input !== null && \"kind\" in input)\n\t) {\n\t\treturn resolveInMemory(input as InMemoryPublishInput, options);\n\t}\n\n\tif (Array.isArray(input)) {\n\t\treturn resolveBundle(input, options);\n\t}\n\n\tif (typeof input === \"string\") {\n\t\treturn resolveString(input, options);\n\t}\n\n\t// Exhaustive: the PublishInput union has no other members.\n\treturn resolveInMemory(input as InMemoryPublishInput, options);\n}\n\n/**\n * Bare-string resolution. ORDER MATTERS:\n * 1. http(s) URL → source. MUST precede stat: a URL is path-shaped (has \"/\"),\n * so a stat/path-shaped check first would wrongly report file_not_found.\n * 2. multiline or oversized (>4096) → inline content (cannot be a path).\n * 3. stat the value: file → fileStaged, dir → folderStaged, missing →\n * file_not_found if path-shaped, else inline prose content.\n */\nasync function resolveString(\n\tvalue: string,\n\toptions: PublishOptions,\n): Promise<PreparedPublishRequest> {\n\tif (isHttpUrl(value)) return resolveInMemory(value, options);\n\tif (value.includes(\"\\n\") || value.length > 4096) {\n\t\treturn resolveInMemory(value, options);\n\t}\n\n\tlet info: Awaited<ReturnType<typeof stat>> | undefined;\n\ttry {\n\t\tinfo = await stat(value);\n\t} catch {\n\t\tinfo = undefined;\n\t}\n\n\tif (info?.isFile()) return fileStaged(value, options);\n\tif (info?.isDirectory()) return folderStaged(value, options);\n\n\tif (isPathShaped(value)) {\n\t\tthrow new PublishInputError(\n\t\t\t\"file_not_found\",\n\t\t\t`No file or directory at \"${value}\".`,\n\t\t\tvalue,\n\t\t\t'To publish this as inline text, pass { kind: \"content\", content }.',\n\t\t);\n\t}\n\treturn resolveInMemory(value, options);\n}\n\n/** Stages a single local file. Defers the entry to buildStagedRequest. */\nasync function fileStaged(\n\tpath: string,\n\toptions: PublishOptions,\n): Promise<PreparedPublishRequest> {\n\tconst fileStat = await stat(path);\n\tif (options.path !== undefined) assertValidManifestPath(options.path);\n\tconst manifestPath = options.path ?? basename(path);\n\tconst contentType =\n\t\toptions.contentType ?? (await detectPathContentType(path));\n\tconst checksumSha256 =\n\t\tfileStat.size > SINGLE_PUT_CHECKSUM_THRESHOLD\n\t\t\t? await sha256File(path)\n\t\t\t: undefined;\n\tconst file: PreparedUploadFile = {\n\t\tpath: manifestPath,\n\t\tcontentType,\n\t\tsizeBytes: fileStat.size,\n\t\t...(checksumSha256 ? { checksumSha256 } : {}),\n\t\tgetBody: () => readFile(path),\n\t};\n\treturn buildStagedRequest([file], options);\n}\n\n/** Stages every file under a local directory (tree-relative manifest paths). */\nasync function folderStaged(\n\tpath: string,\n\toptions: PublishOptions,\n): Promise<PreparedPublishRequest> {\n\tconst files = await collectPublishFiles(path, options);\n\tconst preparedFiles = await Promise.all(files.map(toPreparedFile));\n\treturn buildStagedRequest(preparedFiles, options);\n}\n\n/**\n * Stages a list of local file/directory paths. Each element is statted (missing\n * → file_not_found) then expanded via collectPublishFiles (basename for a file,\n * tree-relative for a directory). Basename collisions across elements surface as\n * duplicate_path from buildStagedRequest.\n */\nasync function resolveBundle(\n\tpaths: string[],\n\toptions: PublishOptions,\n): Promise<PreparedPublishRequest> {\n\tconst collected: PublishFile[] = [];\n\tfor (const element of paths) {\n\t\ttry {\n\t\t\tawait stat(element);\n\t\t} catch {\n\t\t\tthrow new PublishInputError(\n\t\t\t\t\"file_not_found\",\n\t\t\t\t`No file or directory at \"${element}\".`,\n\t\t\t\telement,\n\t\t\t);\n\t\t}\n\t\tcollected.push(...(await collectPublishFiles(element, options)));\n\t}\n\tconst preparedFiles = await Promise.all(collected.map(toPreparedFile));\n\treturn buildStagedRequest(preparedFiles, options);\n}\n\n/** Maps a collected PublishFile to a lazy-body PreparedUploadFile. */\nasync function toPreparedFile(pf: PublishFile): Promise<PreparedUploadFile> {\n\tconst checksumSha256 =\n\t\tpf.sizeBytes > SINGLE_PUT_CHECKSUM_THRESHOLD\n\t\t\t? await sha256File(pf.absolutePath)\n\t\t\t: undefined;\n\treturn {\n\t\tpath: pf.path,\n\t\tcontentType: pf.contentType,\n\t\tsizeBytes: pf.sizeBytes,\n\t\t...(checksumSha256 ? { checksumSha256 } : {}),\n\t\tgetBody: () => readFile(pf.absolutePath),\n\t};\n}\n","import type { DropthisResult } from \"./types.js\";\n\nconst API_KEY_RE = /sk_[A-Za-z0-9_-]+/g;\n\nexport function redactSecrets(message: string): string {\n\treturn message.replace(API_KEY_RE, \"sk_[redacted]\");\n}\n\nexport function createErrorResult<T>(\n\tcode: string,\n\tmessage: string,\n\tstatusCode: number | null,\n\textra: {\n\t\ttype?: string;\n\t\ttitle?: string;\n\t\tdetail?: string | null;\n\t\tinstance?: string | null;\n\t\tparam?: string | null;\n\t\tcurrentRevision?: number;\n\t\trequestId?: string | null;\n\t\theaders?: Record<string, string>;\n\t\tsuggestion?: string | null;\n\t\tretryable?: boolean | null;\n\t\tbody?: unknown;\n\t} = {},\n): DropthisResult<T> {\n\treturn {\n\t\tdata: null,\n\t\terror: {\n\t\t\tcode,\n\t\t\tmessage: redactSecrets(message),\n\t\t\tstatusCode,\n\t\t\t...(extra.type ? { type: extra.type } : {}),\n\t\t\t...(extra.title !== undefined ? { title: extra.title } : {}),\n\t\t\t...(extra.detail !== undefined ? { detail: extra.detail } : {}),\n\t\t\t...(extra.instance !== undefined ? { instance: extra.instance } : {}),\n\t\t\t...(extra.param !== undefined ? { param: extra.param } : {}),\n\t\t\t...(extra.currentRevision !== undefined\n\t\t\t\t? { currentRevision: extra.currentRevision }\n\t\t\t\t: {}),\n\t\t\t...(extra.requestId !== undefined ? { requestId: extra.requestId } : {}),\n\t\t\t...(extra.suggestion !== undefined\n\t\t\t\t? { suggestion: extra.suggestion }\n\t\t\t\t: {}),\n\t\t\t...(extra.retryable !== undefined ? { retryable: extra.retryable } : {}),\n\t\t\t...(extra.body !== undefined ? { body: extra.body } : {}),\n\t\t},\n\t\theaders: extra.headers ?? {},\n\t};\n}\n\nexport class PublishInputError extends Error {\n\tconstructor(\n\t\treadonly code: string,\n\t\tmessage: string,\n\t\treadonly param?: string,\n\t\treadonly suggestion?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"PublishInputError\";\n\t}\n}\n\nexport function toErrorResult<T>(err: unknown): DropthisResult<T> {\n\tif (err instanceof PublishInputError)\n\t\treturn createErrorResult<T>(err.code, err.message, null, {\n\t\t\tparam: err.param ?? null,\n\t\t\tsuggestion: err.suggestion ?? null,\n\t\t});\n\treturn createErrorResult<T>(\n\t\t\"sdk_error\",\n\t\terr instanceof Error ? err.message : \"Unknown SDK error\",\n\t\tnull,\n\t);\n}\n","import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\n\nexport function sha256Bytes(bytes: Uint8Array): string {\n\treturn createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\nexport async function sha256File(path: string): Promise<string> {\n\tconst hash = createHash(\"sha256\");\n\tfor await (const chunk of createReadStream(path)) {\n\t\thash.update(chunk);\n\t}\n\treturn hash.digest(\"hex\");\n}\n","export function isHttpUrl(value: string): boolean {\n\ttry {\n\t\tconst url = new URL(value);\n\t\treturn url.protocol === \"http:\" || url.protocol === \"https:\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function containsHtmlTag(value: string): boolean {\n\treturn /<[a-z!/][^>]*>/i.test(value);\n}\n\nconst FILE_EXT = /\\.[A-Za-z0-9]{1,8}([?#].*)?$/;\nexport function isPathShaped(value: string): boolean {\n\tif (value.length === 0 || value.length > 4096 || value.includes(\"\\n\"))\n\t\treturn false;\n\t// Reject strings that look like HTML (tags disqualify path interpretation)\n\tif (containsHtmlTag(value)) return false;\n\tif (value.includes(\"/\") || value.includes(\"\\\\\")) return true;\n\tif (/^[A-Za-z]:[\\\\/]/.test(value)) return true;\n\treturn FILE_EXT.test(value);\n}\n\nexport function contentTypeForString(value: string, override?: string): string {\n\tif (override) return override;\n\treturn containsHtmlTag(value) ? \"text/html\" : \"text/plain; charset=utf-8\";\n}\n\nexport function detectBytesContentType(bytes: Uint8Array): string {\n\tconst text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes);\n\tif (text.includes(\"�\")) return \"application/octet-stream\";\n\treturn containsHtmlTag(text) ? \"text/html\" : \"text/plain; charset=utf-8\";\n}\n\nexport function entryForContentType(contentType: string): string {\n\tconst m = contentType.toLowerCase().split(\";\", 1)[0]?.trim() ?? \"\";\n\tif (m === \"text/html\" || m === \"application/xhtml+xml\") return \"index.html\";\n\tif (m === \"application/json\") return \"index.json\";\n\tif (m === \"text/css\") return \"index.css\";\n\tif (m === \"text/javascript\" || m === \"application/javascript\")\n\t\treturn \"index.js\";\n\tif (m.startsWith(\"text/\")) return \"index.txt\";\n\treturn \"index\";\n}\n","import { PublishInputError } from \"../errors.js\";\n\nexport function normalizeManifestPath(path: string): string {\n\treturn path.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nexport function assertValidManifestPath(path: string): void {\n\t// User-supplied manifest paths ({kind:\"files\"}.path, options.path, options.entry) must be POSIX.\n\t// Local filesystem paths are normalized via normalizeManifestPath, NOT passed here.\n\tif (path.includes(\"\\\\\"))\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_path\",\n\t\t\t`Manifest path must use \"/\": \"${path}\".`,\n\t\t\tpath,\n\t\t);\n\tconst p = normalizeManifestPath(path);\n\tif (p === \"\")\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_path\",\n\t\t\t\"Manifest path must not be empty.\",\n\t\t\tpath,\n\t\t);\n\tif (p.startsWith(\"/\"))\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_path\",\n\t\t\t`Manifest path must be relative: \"${path}\".`,\n\t\t\tpath,\n\t\t);\n\tif (p.startsWith(\"~\"))\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_path\",\n\t\t\t`Manifest path must not start with \"~\": \"${path}\".`,\n\t\t\tpath,\n\t\t);\n\tif (p.split(\"/\").includes(\"..\"))\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_path\",\n\t\t\t`Manifest path must not contain \"..\": \"${path}\".`,\n\t\t\tpath,\n\t\t);\n}\n\nexport function assertNoDuplicatePaths(paths: string[]): void {\n\tconst seen = new Set<string>();\n\tfor (const raw of paths) {\n\t\tconst p = normalizeManifestPath(raw);\n\t\tif (seen.has(p))\n\t\t\tthrow new PublishInputError(\n\t\t\t\t\"duplicate_path\",\n\t\t\t\t`Duplicate file path after normalization: \"${p}\".`,\n\t\t\t\tp,\n\t\t\t\t\"Give each file a unique path; basename mapping for string[] can collide.\",\n\t\t\t);\n\t\tseen.add(p);\n\t}\n}\n\nexport function assertNonEmptyBundle(paths: string[]): void {\n\tif (paths.length === 0)\n\t\tthrow new PublishInputError(\n\t\t\t\"empty_bundle\",\n\t\t\t\"Nothing to publish: the bundle has no files.\",\n\t\t\tundefined,\n\t\t\t\"Pass at least one file, or a directory that contains files.\",\n\t\t);\n}\n","import { createErrorResult, PublishInputError } from \"../errors.js\";\nimport type { Transport } from \"../transport.js\";\nimport type {\n\tCreateUploadSessionFileResponse,\n\tCreateUploadSessionRequest,\n\tCreateUploadSessionResponse,\n\tDropResponse,\n\tDropthisResult,\n\tPublishFileInput,\n\tPublishOptions,\n\tUpdateContentOptions,\n\tUploadManifestFile,\n\tUploadSessionResponse,\n} from \"../types.js\";\nimport {\n\tcontentTypeForString,\n\tdetectBytesContentType,\n\tentryForContentType,\n\tisHttpUrl,\n} from \"./detect.js\";\nimport {\n\tassertNoDuplicatePaths,\n\tassertNonEmptyBundle,\n\tassertValidManifestPath,\n\tnormalizeManifestPath,\n} from \"./paths.js\";\n\n/**\n * A file ready to be staged for upload. The body is lazy: the orchestrator\n * calls `getBody()` per file when it is ready to push bytes to the signed URL.\n * This keeps the resolution layer pure and lets the filesystem layer (node.ts)\n * defer reads/streams until upload time.\n */\nexport type PreparedUploadFile = {\n\tpath: string;\n\tcontentType: string;\n\tsizeBytes: number;\n\tchecksumSha256?: string;\n\tgetBody(): Promise<Uint8Array | Blob | ReadableStream>;\n};\n\n/**\n * Resolves a publish input into a {@link PreparedPublishRequest}. Two implementations exist:\n * the fs-free {@link resolveInMemory} (Workers-safe) and the fs-capable `resolveInput` in\n * `publish/node.ts`. `DropsResource` takes one by injection so it can power both the Node client\n * and the edge client WITHOUT statically importing the Node-only pipeline (which would poison the\n * Workers bundle with `node:fs`/`fast-glob`). `TInput` is the input type the chosen resolver\n * accepts ({@link InMemoryPublishInput} on the edge, the full `PublishInput` on Node).\n */\nexport type PublishInputResolver<TInput> = (\n\tinput: TInput,\n\toptions: PublishOptions,\n) => Promise<PreparedPublishRequest>;\n\nexport type PreparedPublishRequest =\n\t| {\n\t\t\tkind: \"staged\";\n\t\t\tmanifest: CreateUploadSessionRequest;\n\t\t\tfiles: PreparedUploadFile[];\n\t\t\toptions: Record<string, unknown>;\n\t\t\tmetadata?: Record<string, unknown>;\n\t }\n\t| {\n\t\t\tkind: \"source\";\n\t\t\tsourceUrl: string;\n\t\t\toptions: Record<string, unknown>;\n\t\t\tmetadata?: Record<string, unknown>;\n\t };\n\n/**\n * The canonical publish inputs that can be resolved with no filesystem access:\n * the {@link PublishInput} union minus `string[]` (which is inherently a list\n * of filesystem paths handled by node.ts).\n */\nexport type InMemoryPublishInput =\n\t| string\n\t| URL\n\t| Uint8Array\n\t| { kind: \"content\"; content: string; contentType?: string; path?: string }\n\t| { kind: \"source_url\"; sourceUrl: string }\n\t| { kind: \"files\"; files: PublishFileInput[]; entry?: string };\n\nconst VALID_VISIBILITIES = [\"public\", \"unlisted\"] as const;\nconst MAX_TITLE_LENGTH = 500;\n\nexport function validatePublishOptions(options: PublishOptions): void {\n\tif (\n\t\toptions.title !== undefined &&\n\t\toptions.title !== null &&\n\t\toptions.title.length > MAX_TITLE_LENGTH\n\t) {\n\t\tthrow new Error(`Title must be ${MAX_TITLE_LENGTH} characters or less.`);\n\t}\n\n\tif (options.visibility !== undefined && options.visibility !== null) {\n\t\tif (\n\t\t\t!(VALID_VISIBILITIES as readonly string[]).includes(options.visibility)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid visibility \"${options.visibility}\". Use \"public\" or \"unlisted\".`,\n\t\t\t);\n\t\t}\n\t}\n\n\tif (options.expiresAt !== undefined && options.expiresAt !== null) {\n\t\tif (options.expiresAt instanceof Date) {\n\t\t\tif (Number.isNaN(options.expiresAt.getTime())) {\n\t\t\t\tthrow new Error(\"Invalid expiresAt date.\");\n\t\t\t}\n\t\t} else if (typeof options.expiresAt === \"string\") {\n\t\t\tconst parsed = new Date(options.expiresAt);\n\t\t\tif (Number.isNaN(parsed.getTime())) {\n\t\t\t\tthrow new Error(\"Invalid expiresAt date.\");\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function optionsBody(options: PublishOptions): Record<string, unknown> {\n\tvalidatePublishOptions(options);\n\tconst body: Record<string, unknown> = {};\n\tif (options.title !== undefined) body.title = options.title;\n\tif (options.visibility !== undefined) body.visibility = options.visibility;\n\tif (options.password !== undefined) body.password = options.password;\n\tif (options.noindex !== undefined) body.noindex = options.noindex;\n\tif (options.expiresAt !== undefined) {\n\t\tbody.expiresAt =\n\t\t\toptions.expiresAt instanceof Date\n\t\t\t\t? options.expiresAt.toISOString()\n\t\t\t\t: options.expiresAt;\n\t}\n\treturn body;\n}\n\n/**\n * Narrow options to the content-only subset for `drops.updateContent()`: a content update ships a\n * new content version and never changes drop settings (title, visibility, password, noindex,\n * expiry, metadata). Picking only content-prep + request controls drops any settings BEFORE\n * prepare, so they are never validated, sent, or applied.\n */\nexport function updateContentOptions(\n\toptions: UpdateContentOptions,\n): UpdateContentOptions {\n\tconst out: UpdateContentOptions = {};\n\tif (options.entry !== undefined) out.entry = options.entry;\n\tif (options.contentType !== undefined) out.contentType = options.contentType;\n\tif (options.path !== undefined) out.path = options.path;\n\tif (options.ignore !== undefined) out.ignore = options.ignore;\n\tif (options.ignoreDefaults !== undefined)\n\t\tout.ignoreDefaults = options.ignoreDefaults;\n\tif (options.idempotencyKey !== undefined)\n\t\tout.idempotencyKey = options.idempotencyKey;\n\tif (options.ifRevision !== undefined) out.ifRevision = options.ifRevision;\n\treturn out;\n}\n\n/**\n * Builds a staged upload request from already-prepared files. Validates the\n * bundle is non-empty, normalizes manifest paths, and rejects duplicates.\n * Reused by core's in-memory paths AND by node.ts for file/dir/string[] inputs.\n *\n * `entry` argument wins over `options.entry`.\n */\nexport function buildStagedRequest(\n\tfiles: PreparedUploadFile[],\n\toptions: PublishOptions,\n\tentry?: string,\n): PreparedPublishRequest {\n\tassertNonEmptyBundle(files.map((f) => f.path));\n\tconst normalizedPaths = files.map((f) => normalizeManifestPath(f.path));\n\tassertNoDuplicatePaths(normalizedPaths);\n\n\tconst manifestFiles: UploadManifestFile[] = files.map((file) => ({\n\t\tpath: normalizeManifestPath(file.path),\n\t\tcontentType: file.contentType,\n\t\tsizeBytes: file.sizeBytes,\n\t\t...(file.checksumSha256 ? { checksumSha256: file.checksumSha256 } : {}),\n\t}));\n\n\tconst resolvedEntry = entry ?? options.entry;\n\tif (resolvedEntry !== undefined) assertValidManifestPath(resolvedEntry);\n\tconst manifest: CreateUploadSessionRequest = {\n\t\tschemaVersion: 1,\n\t\tfiles: manifestFiles,\n\t\t...(resolvedEntry ? { entry: resolvedEntry } : {}),\n\t};\n\n\tconst prepared: Extract<PreparedPublishRequest, { kind: \"staged\" }> = {\n\t\tkind: \"staged\",\n\t\tmanifest,\n\t\tfiles,\n\t\toptions: optionsBody(options),\n\t};\n\tif (options.metadata) prepared.metadata = options.metadata;\n\treturn prepared;\n}\n\n/** Builds a `source_url` request (validates http(s)). */\nexport function buildSourceRequest(\n\tsourceUrl: string,\n\toptions: PublishOptions,\n): PreparedPublishRequest {\n\tif (!isHttpUrl(sourceUrl)) {\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_source_url\",\n\t\t\t\"source_url must be an http(s) URL.\",\n\t\t\tsourceUrl,\n\t\t\t\"Fetch the content first, then pass it as content/files.\",\n\t\t);\n\t}\n\tconst prepared: Extract<PreparedPublishRequest, { kind: \"source\" }> = {\n\t\tkind: \"source\",\n\t\tsourceUrl,\n\t\toptions: optionsBody(options),\n\t};\n\tif (options.metadata) prepared.metadata = options.metadata;\n\treturn prepared;\n}\n\nfunction decodeBase64(value: string): Uint8Array {\n\tconst binary = atob(value);\n\treturn Uint8Array.from(binary, (c) => c.charCodeAt(0));\n}\n\nfunction fileBytes(file: PublishFileInput): Uint8Array {\n\tif (file.content !== undefined) return new TextEncoder().encode(file.content);\n\tif (file.contentBase64 !== undefined) return decodeBase64(file.contentBase64);\n\tif (file.bytes !== undefined) return file.bytes;\n\tthrow new PublishInputError(\n\t\t\"missing_file_bytes\",\n\t\t`File \"${file.path}\" is missing content bytes.`,\n\t\tfile.path,\n\t\t\"Provide one of content, contentBase64, or bytes.\",\n\t);\n}\n\nfunction singleStagedFile(\n\tpath: string,\n\tcontentType: string,\n\tbytes: Uint8Array,\n\toptions: PublishOptions,\n): PreparedPublishRequest {\n\treturn buildStagedRequest(\n\t\t[\n\t\t\t{\n\t\t\t\tpath,\n\t\t\t\tcontentType,\n\t\t\t\tsizeBytes: bytes.byteLength,\n\t\t\t\tgetBody: async () => bytes,\n\t\t\t},\n\t\t],\n\t\toptions,\n\t);\n}\n\n/**\n * Resolves the in-memory canonical inputs (the edge subset of {@link PublishInput})\n * into a {@link PreparedPublishRequest}. Performs NO filesystem access.\n */\nexport async function resolveInMemory(\n\tinput: InMemoryPublishInput,\n\toptions: PublishOptions = {},\n): Promise<PreparedPublishRequest> {\n\tif (input instanceof URL) {\n\t\treturn buildSourceRequest(input.toString(), options);\n\t}\n\n\tif (typeof input === \"string\") {\n\t\tif (isHttpUrl(input)) return buildSourceRequest(input, options);\n\t\tconst contentType = contentTypeForString(input, options.contentType);\n\t\tif (options.path !== undefined) assertValidManifestPath(options.path);\n\t\tconst path = options.path ?? entryForContentType(contentType);\n\t\tconst bytes = new TextEncoder().encode(input);\n\t\treturn singleStagedFile(path, contentType, bytes, options);\n\t}\n\n\t// A Node binary buffer is a Uint8Array subclass, so this branch also covers\n\t// it without referencing the Node-only global.\n\tif (input instanceof Uint8Array) {\n\t\tconst contentType = options.contentType ?? detectBytesContentType(input);\n\t\tif (options.path !== undefined) assertValidManifestPath(options.path);\n\t\tconst path = options.path ?? entryForContentType(contentType);\n\t\treturn singleStagedFile(path, contentType, input, options);\n\t}\n\n\tif (input.kind === \"content\") {\n\t\tconst contentType = input.contentType ?? options.contentType ?? \"text/html\";\n\t\tif (input.path !== undefined) assertValidManifestPath(input.path);\n\t\tif (options.path !== undefined) assertValidManifestPath(options.path);\n\t\tconst path = input.path ?? options.path ?? entryForContentType(contentType);\n\t\tconst bytes = new TextEncoder().encode(input.content);\n\t\treturn singleStagedFile(path, contentType, bytes, options);\n\t}\n\n\tif (input.kind === \"source_url\") {\n\t\treturn buildSourceRequest(input.sourceUrl, options);\n\t}\n\n\t// input.kind === \"files\"\n\tconst files: PreparedUploadFile[] = input.files.map((file) => {\n\t\tassertValidManifestPath(file.path);\n\t\tconst bytes = fileBytes(file);\n\t\tconst contentType = file.contentType ?? detectBytesContentType(bytes);\n\t\treturn {\n\t\t\tpath: file.path,\n\t\t\tcontentType,\n\t\t\tsizeBytes: bytes.byteLength,\n\t\t\tgetBody: async () => bytes,\n\t\t};\n\t});\n\treturn buildStagedRequest(files, options, input.entry);\n}\n\n// ---------------------------------------------------------------------------\n// Orchestration helpers\n// ---------------------------------------------------------------------------\n\ntype StagedPublishOptions = { idempotencyKey?: string; ifRevision?: number };\n\n/** How many signed file PUTs run concurrently during a staged upload. */\nconst UPLOAD_CONCURRENCY = 5;\n\nfunction errorResult<T>(result: DropthisResult<unknown>): DropthisResult<T> {\n\tif (!result.error) throw new Error(\"Expected an error result\");\n\treturn { data: null, error: result.error, headers: result.headers };\n}\n\ntype UploadJob = {\n\tfile: PreparedUploadFile;\n\ttarget: CreateUploadSessionFileResponse;\n};\n\n/**\n * Uploads staged files through their signed PUT targets with bounded parallelism.\n * Fail-fast: the first failure stops new uploads from starting (in-flight ones\n * drain). Returns the lowest-index failure — attributed to its file path — or null\n * when every upload succeeded. Each PUT sends exactly the headers the server signed\n * for that file (this is what carries the checksum contract).\n */\nasync function uploadStagedFiles(\n\ttransport: Transport,\n\tjobs: UploadJob[],\n): Promise<DropthisResult<never> | null> {\n\tlet nextIndex = 0;\n\tlet failed = false;\n\tconst failures = new Map<number, DropthisResult<never>>();\n\n\tasync function worker(): Promise<void> {\n\t\twhile (!failed) {\n\t\t\tconst index = nextIndex;\n\t\t\tnextIndex += 1;\n\t\t\tif (index >= jobs.length) return;\n\t\t\tconst job = jobs[index];\n\t\t\tif (!job) return;\n\t\t\tconst put = await transport.putSignedUrl(\n\t\t\t\tjob.target.upload.url,\n\t\t\t\tawait job.file.getBody(),\n\t\t\t\tjob.target.upload.headers,\n\t\t\t);\n\t\t\tif (put.error) {\n\t\t\t\tfailed = true;\n\t\t\t\tfailures.set(index, {\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: {\n\t\t\t\t\t\t...put.error,\n\t\t\t\t\t\tmessage: `Upload failed for ${job.file.path}: ${put.error.message}`,\n\t\t\t\t\t},\n\t\t\t\t\theaders: put.headers,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst workers = Array.from(\n\t\t{ length: Math.min(UPLOAD_CONCURRENCY, jobs.length) },\n\t\t() => worker(),\n\t);\n\tawait Promise.all(workers);\n\n\tif (failures.size === 0) return null;\n\tconst firstIndex = Math.min(...failures.keys());\n\treturn failures.get(firstIndex) ?? null;\n}\n\n/**\n * Executes the staged-upload publish flow (single-PUT only).\n * Calls POST /uploads → PUT signed URL per file → POST /uploads/{id}/complete\n * → POST finalPath. (Paths are version-agnostic here; the transport prefixes /v1.)\n */\nexport async function publishStaged(\n\ttransport: Transport,\n\tprepared: Extract<PreparedPublishRequest, { kind: \"staged\" }>,\n\tfinalPath: string,\n\toptions: StagedPublishOptions = {},\n): Promise<DropthisResult<DropResponse>> {\n\tconst baseKey = options.idempotencyKey ?? `sdk-${crypto.randomUUID()}`;\n\n\t// Step 1: create upload session\n\tconst createResult = await transport.request<CreateUploadSessionResponse>(\n\t\t\"POST\",\n\t\t\"/uploads\",\n\t\t{\n\t\t\tbody: prepared.manifest,\n\t\t\tidempotencyKey: `${baseKey}:create-upload`,\n\t\t},\n\t);\n\tif (createResult.error) return errorResult(createResult);\n\n\t// Step 2: pair every file with its signed target, then upload via bounded-parallel\n\t// single PUTs. Target validation happens up front so no bytes move when the\n\t// session response is malformed.\n\tconst jobs: UploadJob[] = [];\n\tfor (const file of prepared.files) {\n\t\tconst target = createResult.data.files.find((f) => f.path === file.path);\n\t\tif (!target) {\n\t\t\treturn createErrorResult(\n\t\t\t\t\"upload_target_missing\",\n\t\t\t\t`Upload target missing for ${file.path}`,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tif (target.upload.strategy !== \"single_put\") {\n\t\t\t// Defensive: a single signed PUT per file IS the upload contract — the server\n\t\t\t// only ever assigns single_put. Anything else means a newer server contract\n\t\t\t// this SDK predates.\n\t\t\treturn createErrorResult(\n\t\t\t\t\"unsupported_upload_strategy\",\n\t\t\t\t`Unexpected upload strategy \"${target.upload.strategy}\" for ${file.path}. The dropthis upload contract is one signed PUT per file; update @dropthis/node.`,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tjobs.push({ file, target });\n\t}\n\tconst uploadFailure = await uploadStagedFiles(transport, jobs);\n\tif (uploadFailure) return uploadFailure;\n\n\t// Step 3: complete upload session (no request body — the server verifies the\n\t// staged objects against the manifest)\n\tconst completeResult = await transport.request<UploadSessionResponse>(\n\t\t\"POST\",\n\t\t`/uploads/${encodeURIComponent(createResult.data.uploadId)}/complete`,\n\t\t{\n\t\t\tidempotencyKey: `${baseKey}:complete-upload`,\n\t\t},\n\t);\n\tif (completeResult.error) return errorResult(completeResult);\n\n\t// Step 4: final publish\n\tconst finalOptions: Parameters<Transport[\"request\"]>[2] = {\n\t\tbody: {\n\t\t\tuploadId: createResult.data.uploadId,\n\t\t\t...(Object.keys(prepared.options).length > 0\n\t\t\t\t? { options: prepared.options }\n\t\t\t\t: {}),\n\t\t\t...(prepared.metadata ? { metadata: prepared.metadata } : {}),\n\t\t},\n\t\tidempotencyKey: `${baseKey}:publish`,\n\t};\n\tif (options.ifRevision !== undefined)\n\t\tfinalOptions.ifRevision = options.ifRevision;\n\treturn transport.request<DropResponse>(\"POST\", finalPath, finalOptions);\n}\n\n/**\n * Executes the source-URL publish flow.\n * Sends a single POST to finalPath with { sourceUrl, options } and optional metadata.\n */\nexport async function publishSource(\n\ttransport: Transport,\n\tprepared: Extract<PreparedPublishRequest, { kind: \"source\" }>,\n\tfinalPath: string,\n\toptions: StagedPublishOptions = {},\n): Promise<DropthisResult<DropResponse>> {\n\tconst baseKey = options.idempotencyKey ?? `sdk-${crypto.randomUUID()}`;\n\treturn transport.request<DropResponse>(\"POST\", finalPath, {\n\t\tbody: {\n\t\t\tsourceUrl: prepared.sourceUrl,\n\t\t\t...(Object.keys(prepared.options).length > 0\n\t\t\t\t? { options: prepared.options }\n\t\t\t\t: {}),\n\t\t\t...(prepared.metadata ? { metadata: prepared.metadata } : {}),\n\t\t},\n\t\tidempotencyKey: `${baseKey}:publish`,\n\t\t...(options.ifRevision !== undefined\n\t\t\t? { ifRevision: options.ifRevision }\n\t\t\t: {}),\n\t});\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { basename, sep } from \"node:path\";\nimport fg from \"fast-glob\";\nimport ignore from \"ignore\";\nimport { lookup } from \"mime-types\";\nimport { detectBytesContentType } from \"./detect.js\";\n\nexport type PublishFile = {\n\tabsolutePath: string;\n\tpath: string;\n\tcontentType: string;\n\tsizeBytes: number;\n};\n\nconst DEFAULT_IGNORES = [\n\t\".git\",\n\t\".git/**\",\n\t\"node_modules\",\n\t\"node_modules/**\",\n\t\".DS_Store\",\n\t\".env\",\n\t\".env.*\",\n\t\".cache\",\n\t\".cache/**\",\n\t\".tmp\",\n\t\".tmp/**\",\n\t\"dist/.cache\",\n\t\"dist/.cache/**\",\n];\n\nexport async function collectPublishFiles(\n\tinputPath: string,\n\toptions: { ignore?: string[]; ignoreDefaults?: boolean } = {},\n): Promise<PublishFile[]> {\n\tconst inputStat = await stat(inputPath);\n\tif (inputStat.isFile()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tabsolutePath: inputPath,\n\t\t\t\tpath: basename(inputPath),\n\t\t\t\tcontentType: await detectPathContentType(inputPath),\n\t\t\t\tsizeBytes: inputStat.size,\n\t\t\t},\n\t\t];\n\t}\n\tif (!inputStat.isDirectory()) {\n\t\tthrow new Error(`Input is not a file or directory: ${inputPath}`);\n\t}\n\n\tconst matcher = ignore().add([\n\t\t...(options.ignoreDefaults === false ? [] : DEFAULT_IGNORES),\n\t\t...(options.ignore ?? []),\n\t]);\n\tconst entries = await fg(\"**/*\", {\n\t\tcwd: inputPath,\n\t\tonlyFiles: true,\n\t\tfollowSymbolicLinks: false,\n\t\tdot: true,\n\t\tunique: true,\n\t});\n\tconst paths = entries\n\t\t.map((entry) => entry.split(sep).join(\"/\"))\n\t\t.filter((entry) => !matcher.ignores(entry))\n\t\t.sort((a, b) => a.localeCompare(b));\n\treturn Promise.all(\n\t\tpaths.map(async (path) => {\n\t\t\tconst absolutePath = `${inputPath}/${path}`;\n\t\t\tconst fileStat = await stat(absolutePath);\n\t\t\treturn {\n\t\t\t\tabsolutePath,\n\t\t\t\tpath,\n\t\t\t\tcontentType: await detectPathContentType(absolutePath),\n\t\t\t\tsizeBytes: fileStat.size,\n\t\t\t};\n\t\t}),\n\t);\n}\n\nexport async function detectPathContentType(path: string): Promise<string> {\n\tconst detected = lookup(path);\n\tif (detected) return detected;\n\treturn detectBytesContentType(await readFile(path));\n}\n","import type { Transport } from \"../transport.js\";\nimport type { AccountResponse, DropthisResult } from \"../types.js\";\n\nexport class AccountResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\tget(): Promise<DropthisResult<AccountResponse>> {\n\t\treturn this.transport.request(\"GET\", \"/account\");\n\t}\n\n\tupdate(input: {\n\t\tdisplayName: string | null;\n\t}): Promise<DropthisResult<AccountResponse>> {\n\t\treturn this.transport.request(\"PATCH\", \"/account\", { body: input });\n\t}\n\n\tdelete(): Promise<DropthisResult<null>> {\n\t\treturn this.transport.request(\"DELETE\", \"/account\");\n\t}\n}\n","import type { Transport } from \"../transport.js\";\nimport type {\n\tApiKeyCreatedResponse,\n\tApiKeyResponse,\n\tDropthisResult,\n} from \"../types.js\";\n\nexport class ApiKeysResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\tlist(): Promise<DropthisResult<{ object: \"list\"; data: ApiKeyResponse[] }>> {\n\t\treturn this.transport.request(\"GET\", \"/api-keys\");\n\t}\n\n\tcreate(input: {\n\t\tlabel: string;\n\t}): Promise<DropthisResult<ApiKeyCreatedResponse>> {\n\t\treturn this.transport.request(\"POST\", \"/api-keys\", { body: input });\n\t}\n\n\t/** Revoke an API key. 204 No Content — data is null on success. */\n\tdelete(keyId: string): Promise<DropthisResult<null>> {\n\t\treturn this.transport.request(\n\t\t\t\"DELETE\",\n\t\t\t`/api-keys/${encodeURIComponent(keyId)}`,\n\t\t);\n\t}\n}\n","import type { Transport } from \"../transport.js\";\nimport type {\n\tDropthisResult,\n\tEmailOtpResponse,\n\tSessionResponse,\n} from \"../types.js\";\n\nexport class AuthResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\trequestEmailOtp(input: {\n\t\temail: string;\n\t}): Promise<DropthisResult<EmailOtpResponse>> {\n\t\treturn this.transport.request(\"POST\", \"/auth/email/otp\", {\n\t\t\tbody: input,\n\t\t\tauthenticated: false,\n\t\t});\n\t}\n\n\tverifyEmailOtp(input: {\n\t\temail: string;\n\t\tcode: string;\n\t}): Promise<DropthisResult<SessionResponse>> {\n\t\treturn this.transport.request(\"POST\", \"/auth/email/verify\", {\n\t\t\tbody: input,\n\t\t\tauthenticated: false,\n\t\t});\n\t}\n\n\t/** Revoke the current `at_` session token. 204 No Content — data is null on success. */\n\tlogout(): Promise<DropthisResult<null>> {\n\t\treturn this.transport.request(\"DELETE\", \"/auth/session\");\n\t}\n}\n","import type { Transport } from \"../transport.js\";\nimport type {\n\tDropDeploymentResponse,\n\tDropthisResult,\n\tListDeploymentsParams,\n\tListDeploymentsResponse,\n} from \"../types.js\";\n\nexport class DeploymentsResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\tlist(\n\t\tdropId: string,\n\t\tparams: ListDeploymentsParams = {},\n\t): Promise<DropthisResult<ListDeploymentsResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"GET\",\n\t\t\t`/drops/${encodeURIComponent(dropId)}/deployments`,\n\t\t\t{ params },\n\t\t);\n\t}\n\n\tget(\n\t\tdropId: string,\n\t\tdeploymentId: string,\n\t): Promise<DropthisResult<DropDeploymentResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"GET\",\n\t\t\t`/drops/${encodeURIComponent(dropId)}/deployments/${encodeURIComponent(deploymentId)}`,\n\t\t);\n\t}\n}\n","import type { DropthisResult, ListPage } from \"./types.js\";\n\nexport class CursorPage<T> implements ListPage<T> {\n\treadonly object = \"list\" as const;\n\treadonly data: T[];\n\treadonly hasMore: boolean;\n\treadonly nextCursor: string | null;\n\tprivate readonly fetchNextPage:\n\t\t| (() => Promise<DropthisResult<CursorPage<T>>>)\n\t\t| undefined;\n\n\tconstructor(input: {\n\t\tdata: T[];\n\t\thasMore: boolean;\n\t\tnextCursor: string | null;\n\t\tfetchNextPage?: (() => Promise<DropthisResult<CursorPage<T>>>) | undefined;\n\t}) {\n\t\tthis.data = input.data;\n\t\tthis.hasMore = input.hasMore;\n\t\tthis.nextCursor = input.nextCursor;\n\t\tthis.fetchNextPage = input.fetchNextPage;\n\t}\n\n\tasync autoPagingToArray(options: { limit?: number } = {}): Promise<T[]> {\n\t\tconst items: T[] = [];\n\t\tfor await (const item of this) {\n\t\t\titems.push(item);\n\t\t\tif (options.limit !== undefined && items.length >= options.limit) break;\n\t\t}\n\t\treturn items;\n\t}\n\n\tasync *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n\t\tfor (const item of this.data) yield item;\n\t\tlet current: CursorPage<T> = this;\n\t\twhile (current.hasMore && current.fetchNextPage) {\n\t\t\tconst next = await current.fetchNextPage();\n\t\t\tif (next.error) break;\n\t\t\tcurrent = next.data;\n\t\t\tfor (const item of current.data) yield item;\n\t\t}\n\t}\n}\n","import { createErrorResult, toErrorResult } from \"../errors.js\";\nimport { CursorPage } from \"../pagination.js\";\nimport {\n\ttype PreparedPublishRequest,\n\ttype PublishInputResolver,\n\tpublishSource,\n\tpublishStaged,\n\tupdateContentOptions,\n} from \"../publish/core.js\";\nimport type { Transport } from \"../transport.js\";\nimport type {\n\tDeploymentContentManifest,\n\tDropContentFile,\n\tDropOptions,\n\tDropResponse,\n\tDropthisResult,\n\tGetContentOptions,\n\tListDropsParams,\n\tPublishInput,\n\tPublishOptions,\n\tRequestControls,\n\tUpdateContentOptions,\n} from \"../types.js\";\n\n/**\n * The drop lifecycle resource. `TInput` is the publish-input type the injected resolver accepts:\n * the full `PublishInput` on the Node client, the fs-free `InMemoryPublishInput` on the edge. The\n * resolver is injected (not statically imported) so this module never pulls in the Node-only\n * publish pipeline and stays Workers-safe.\n */\nexport class DropsResource<TInput = PublishInput> {\n\tprivate parentHosts?: ReadonlySet<string>;\n\n\tconstructor(\n\t\tprivate readonly transport: Transport,\n\t\tprivate readonly resolveInput: PublishInputResolver<TInput>,\n\t) {}\n\n\t/**\n\t * Hostnames the SDK can attribute to dropthis for slug parsing: the canonical\n\t * viewer domain plus the configured baseUrl's host (covers staging/self-hosted\n\t * setups where drops are served under the API's own domain).\n\t */\n\tprivate allowedParentHosts(): ReadonlySet<string> {\n\t\tif (!this.parentHosts) {\n\t\t\tconst hosts = new Set([CANONICAL_VIEWER_HOST]);\n\t\t\ttry {\n\t\t\t\thosts.add(new URL(this.transport.baseUrl).hostname);\n\t\t\t} catch {\n\t\t\t\t// Unparseable baseUrl — canonical host only.\n\t\t\t}\n\t\t\tthis.parentHosts = hosts;\n\t\t}\n\t\treturn this.parentHosts;\n\t}\n\n\t/**\n\t * Publish content to a NEW permanent public URL; returns the created drop (with its `drop_…` id).\n\t * Use to publish / share / post / put online / make public a report, dashboard, site, or file.\n\t * Creates a NEW drop every call — to change something already published, use {@link updateContent}\n\t * (the files at the URL) or {@link updateSettings} (title, visibility, password, expiry,\n\t * metadata) with the drop's id; calling publish again makes a duplicate. POST /drops.\n\t */\n\tasync publish(\n\t\tinput: TInput,\n\t\toptions: PublishOptions = {},\n\t): Promise<DropthisResult<DropResponse>> {\n\t\tlet prepared: PreparedPublishRequest;\n\t\ttry {\n\t\t\tprepared = await this.resolveInput(input, options);\n\t\t} catch (e) {\n\t\t\treturn toErrorResult<DropResponse>(e);\n\t\t}\n\t\treturn prepared.kind === \"source\"\n\t\t\t? publishSource(this.transport, prepared, \"/drops\", options)\n\t\t\t: publishStaged(this.transport, prepared, \"/drops\", options);\n\t}\n\n\t/**\n\t * Replace the content of an EXISTING drop, keeping its URL (ships a new deployment). Requires the\n\t * `drop_…` id from a publish response (not the slug/URL). Content-only: settings/metadata are\n\t * stripped BEFORE prepare, so they are never sent — change those with {@link updateSettings}; create\n\t * a new drop with {@link publish}. Not idempotent (each call is a new deployment) unless you pass the\n\t * same `idempotencyKey`. POST /drops/{id}/deployments.\n\t */\n\tasync updateContent(\n\t\tdropId: string,\n\t\tinput: TInput,\n\t\toptions: UpdateContentOptions = {},\n\t): Promise<DropthisResult<DropResponse>> {\n\t\tconst opts = updateContentOptions(options);\n\t\tlet prepared: PreparedPublishRequest;\n\t\ttry {\n\t\t\tprepared = await this.resolveInput(input, opts);\n\t\t} catch (e) {\n\t\t\treturn toErrorResult<DropResponse>(e);\n\t\t}\n\t\tconst path = `/drops/${encodeURIComponent(dropId)}/deployments`;\n\t\treturn prepared.kind === \"source\"\n\t\t\t? publishSource(this.transport, prepared, path, opts)\n\t\t\t: publishStaged(this.transport, prepared, path, opts);\n\t}\n\n\t/** List the account's drops, newest first (paginated). Each item carries its `drop_…` id. GET /drops. */\n\tasync list(\n\t\tparams: ListDropsParams = {},\n\t): Promise<DropthisResult<CursorPage<DropResponse>>> {\n\t\tconst result = await this.transport.request<{\n\t\t\tdrops: DropResponse[];\n\t\t\tnextCursor: string | null;\n\t\t}>(\"GET\", \"/drops\", {\n\t\t\tparams: params as Record<string, string | number | boolean>,\n\t\t});\n\t\tif (result.error) return result;\n\t\tconst page = new CursorPage<DropResponse>({\n\t\t\tdata: result.data.drops,\n\t\t\tnextCursor: result.data.nextCursor,\n\t\t\thasMore: result.data.nextCursor !== null,\n\t\t\tfetchNextPage: result.data.nextCursor\n\t\t\t\t? () => this.list({ ...params, cursor: result.data.nextCursor })\n\t\t\t\t: undefined,\n\t\t});\n\t\treturn { data: page, error: null, headers: result.headers };\n\t}\n\n\t/** Fetch one drop by its `drop_…` id (not the slug/URL). GET /drops/{id}. */\n\tget(dropId: string): Promise<DropthisResult<DropResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"GET\",\n\t\t\t`/drops/${encodeURIComponent(dropId)}`,\n\t\t);\n\t}\n\n\t/**\n\t * Resolve a drop URL (or bare slug) back to the drop — the way to recover a lost\n\t * `drop_…` id. The slug is parsed client-side from the first hostname label of a\n\t * dropthis-attributable hostname (`https://<slug>.dropthis.app/…`, or `<slug>.` +\n\t * the configured baseUrl's host), then matched owner-scoped via GET /drops?slug=.\n\t * Returns the drop, or `data: null` when no drop of yours has that slug.\n\t * Custom-domain URLs are rejected client-side with `invalid_drop_url` — they are\n\t * not resolvable yet.\n\t */\n\tasync resolve(\n\t\turlOrSlug: string,\n\t): Promise<DropthisResult<DropResponse | null>> {\n\t\tconst slug = parseSlug(urlOrSlug, this.allowedParentHosts());\n\t\tif (slug === null) {\n\t\t\treturn createErrorResult<DropResponse | null>(\n\t\t\t\t\"invalid_drop_url\",\n\t\t\t\t`Could not resolve a drop slug from \"${urlOrSlug}\". Pass a canonical drop URL like https://<slug>.dropthis.app/ or the bare slug — custom-domain URLs cannot be resolved yet.`,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tconst result = await this.transport.request<{\n\t\t\tdrops: DropResponse[];\n\t\t\tnextCursor: string | null;\n\t\t}>(\"GET\", \"/drops\", { params: { slug } });\n\t\tif (result.error)\n\t\t\treturn { data: null, error: result.error, headers: result.headers };\n\t\treturn {\n\t\t\tdata: result.data.drops[0] ?? null,\n\t\t\terror: null,\n\t\t\theaders: result.headers,\n\t\t};\n\t}\n\n\t/**\n\t * Read back what a drop is serving (owner-only; works regardless of any viewer\n\t * password). By default returns the JSON manifest of the CURRENT deployment's files;\n\t * pass `deploymentId` to read a historical (even superseded) deployment — downloading\n\t * an old version's files and republishing them via {@link updateContent} is the\n\t * rollback path. Pass `path` (one of the manifest's `files[].path` values) to download\n\t * that file's exact stored bytes instead. GET /drops/{id}/content.\n\t */\n\tgetContent(\n\t\tdropId: string,\n\t\toptions: GetContentOptions & { path: string },\n\t): Promise<DropthisResult<DropContentFile>>;\n\tgetContent(\n\t\tdropId: string,\n\t\toptions?: Omit<GetContentOptions, \"path\">,\n\t): Promise<DropthisResult<DeploymentContentManifest>>;\n\tasync getContent(\n\t\tdropId: string,\n\t\toptions: GetContentOptions = {},\n\t): Promise<DropthisResult<DeploymentContentManifest | DropContentFile>> {\n\t\tconst base =\n\t\t\toptions.deploymentId !== undefined\n\t\t\t\t? `/drops/${encodeURIComponent(dropId)}/deployments/${encodeURIComponent(options.deploymentId)}/content`\n\t\t\t\t: `/drops/${encodeURIComponent(dropId)}/content`;\n\t\tif (options.path === undefined)\n\t\t\treturn this.transport.request<DeploymentContentManifest>(\"GET\", base);\n\t\tconst path = options.path;\n\t\tconst result = await this.transport.requestBytes(base, {\n\t\t\tparams: { path },\n\t\t});\n\t\tif (result.error)\n\t\t\treturn { data: null, error: result.error, headers: result.headers };\n\t\tconst { bytes, contentType } = result.data;\n\t\treturn {\n\t\t\tdata: {\n\t\t\t\tpath,\n\t\t\t\tcontentType,\n\t\t\t\tbytes,\n\t\t\t\ttext: () => new TextDecoder().decode(bytes),\n\t\t\t},\n\t\t\terror: null,\n\t\t\theaders: result.headers,\n\t\t};\n\t}\n\n\t/**\n\t * Change an EXISTING drop's settings — title, visibility, password, noindex, expiry,\n\t * metadata — by its `drop_…` id. Does not touch content; replace that with {@link updateContent}.\n\t * Idempotent. PATCH /drops/{id}.\n\t */\n\tupdateSettings(\n\t\tdropId: string,\n\t\toptions: DropOptions & RequestControls = {},\n\t): Promise<DropthisResult<DropResponse>> {\n\t\tconst requestOptions: Parameters<Transport[\"request\"]>[2] = {\n\t\t\tbody: updateBody(options),\n\t\t};\n\t\tif (options.idempotencyKey)\n\t\t\trequestOptions.idempotencyKey = options.idempotencyKey;\n\t\tif (options.ifRevision !== undefined)\n\t\t\trequestOptions.ifRevision = options.ifRevision;\n\t\treturn this.transport.request(\n\t\t\t\"PATCH\",\n\t\t\t`/drops/${encodeURIComponent(dropId)}`,\n\t\t\trequestOptions,\n\t\t);\n\t}\n\n\t/** Permanently delete a drop and its public URL by its `drop_…` id. DELETE /drops/{id}. */\n\tdelete(dropId: string): Promise<DropthisResult<null>> {\n\t\treturn this.transport.request(\n\t\t\t\"DELETE\",\n\t\t\t`/drops/${encodeURIComponent(dropId)}`,\n\t\t);\n\t}\n}\n\nconst CANONICAL_VIEWER_HOST = \"dropthis.app\";\n\n/**\n * Extracts the drop slug from a drop URL, scheme-less hostname, or bare slug.\n * Drop URLs put the slug in the first hostname label (`https://<slug>.dropthis.app/`),\n * but only hostnames the SDK can attribute to dropthis are parsed: the slug label must\n * sit directly under one of `allowedParents` (the canonical viewer domain, plus the\n * client's configured baseUrl host). Any other hostname — e.g. a customer's custom\n * domain — returns null instead of guessing a slug from an unrelated first label.\n */\nfunction parseSlug(\n\tinput: string,\n\tallowedParents: ReadonlySet<string>,\n): string | null {\n\tconst value = input.trim();\n\tif (!value) return null;\n\t// A bare slug has no dots or slashes; anything else is treated as a URL/hostname.\n\tif (!/[./]/.test(value)) return value;\n\tconst withScheme = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(value)\n\t\t? value\n\t\t: `https://${value}`;\n\tlet hostname: string;\n\ttry {\n\t\thostname = new URL(withScheme).hostname;\n\t} catch {\n\t\treturn null;\n\t}\n\t// A trailing dot is a canonical FQDN form (\"slug.dropthis.app.\") — normalize it\n\t// so the parent match below cannot be dodged.\n\thostname = hostname.replace(/\\.$/, \"\");\n\t// Exactly <slug>.<allowed parent> — slugs never contain dots.\n\tconst dot = hostname.indexOf(\".\");\n\tif (dot <= 0) return null;\n\tconst slug = hostname.slice(0, dot);\n\tconst parent = hostname.slice(dot + 1);\n\treturn allowedParents.has(parent) ? slug : null;\n}\n\nconst SETTINGS = [\n\t\"title\",\n\t\"visibility\",\n\t\"password\",\n\t\"noindex\",\n\t\"expiresAt\",\n] as const;\n\nfunction updateBody(options: DropOptions & RequestControls): unknown {\n\tconst out: Record<string, unknown> = {};\n\tfor (const key of SETTINGS)\n\t\tif (options[key] !== undefined) out[key] = options[key];\n\treturn {\n\t\toptions: out,\n\t\t...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n\t};\n}\n","import type { Transport } from \"../transport.js\";\nimport type {\n\tCreateUploadSessionRequest,\n\tCreateUploadSessionResponse,\n\tDropthisResult,\n\tUploadSessionResponse,\n} from \"../types.js\";\n\nexport class UploadsResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\tcreate(\n\t\tbody: CreateUploadSessionRequest,\n\t\toptions: { idempotencyKey?: string } = {},\n\t): Promise<DropthisResult<CreateUploadSessionResponse>> {\n\t\tconst requestOptions: Parameters<Transport[\"request\"]>[2] = { body };\n\t\tif (options.idempotencyKey)\n\t\t\trequestOptions.idempotencyKey = options.idempotencyKey;\n\t\treturn this.transport.request(\"POST\", \"/uploads\", requestOptions);\n\t}\n\n\tget(uploadId: string): Promise<DropthisResult<UploadSessionResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"GET\",\n\t\t\t`/uploads/${encodeURIComponent(uploadId)}`,\n\t\t);\n\t}\n\n\t/**\n\t * Verify staged objects and mark the session complete. Takes no request body —\n\t * the server verifies the uploaded bytes against the staged manifest.\n\t */\n\tcomplete(\n\t\tuploadId: string,\n\t\toptions: { idempotencyKey?: string } = {},\n\t): Promise<DropthisResult<UploadSessionResponse>> {\n\t\tconst requestOptions: Parameters<Transport[\"request\"]>[2] = {};\n\t\tif (options.idempotencyKey)\n\t\t\trequestOptions.idempotencyKey = options.idempotencyKey;\n\t\treturn this.transport.request(\n\t\t\t\"POST\",\n\t\t\t`/uploads/${encodeURIComponent(uploadId)}/complete`,\n\t\t\trequestOptions,\n\t\t);\n\t}\n\n\tcancel(uploadId: string): Promise<DropthisResult<null>> {\n\t\treturn this.transport.request(\n\t\t\t\"DELETE\",\n\t\t\t`/uploads/${encodeURIComponent(uploadId)}`,\n\t\t);\n\t}\n}\n","export function toCamelKey(key: string): string {\n\treturn key.replace(/_([a-z])/g, (_, char: string) => char.toUpperCase());\n}\n\nexport function toSnakeKey(key: string): string {\n\treturn key.replace(/[A-Z]/g, (char) => `_${char.toLowerCase()}`);\n}\n\nconst PASSTHROUGH_KEYS = new Set([\"metadata\"]);\n\nexport function toCamelCase(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(toCamelCase);\n\tif (value && typeof value === \"object\") {\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(value).map(([key, item]) => [\n\t\t\t\ttoCamelKey(key),\n\t\t\t\tPASSTHROUGH_KEYS.has(key) ? item : toCamelCase(item),\n\t\t\t]),\n\t\t);\n\t}\n\treturn value;\n}\n\nexport function toSnakeCase(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(toSnakeCase);\n\tif (value && typeof value === \"object\") {\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(value)\n\t\t\t\t.filter(([, item]) => item !== undefined)\n\t\t\t\t.map(([key, item]) => [\n\t\t\t\t\ttoSnakeKey(key),\n\t\t\t\t\tPASSTHROUGH_KEYS.has(key) ? item : toSnakeCase(item),\n\t\t\t\t]),\n\t\t);\n\t}\n\treturn value;\n}\n","import { toCamelCase, toSnakeCase } from \"./case.js\";\nimport { createErrorResult } from \"./errors.js\";\nimport type {\n\tDropthisClientOptions,\n\tDropthisResult,\n\tRequestOptions,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.dropthis.app\";\nconst SDK_VERSION = \"0.10.0\";\n\nexport class Transport {\n\treadonly apiKey: string | undefined;\n\treadonly baseUrl: string;\n\treadonly timeoutMs: number;\n\treadonly uploadTimeoutMs: number;\n\treadonly fetchImpl: typeof globalThis.fetch;\n\n\tconstructor(options: DropthisClientOptions | string = {}) {\n\t\tconst resolved =\n\t\t\ttypeof options === \"string\" ? { apiKey: options } : options;\n\t\tthis.apiKey =\n\t\t\tresolved.apiKey ??\n\t\t\t(typeof process !== \"undefined\"\n\t\t\t\t? process.env?.DROPTHIS_API_KEY\n\t\t\t\t: undefined);\n\t\t// All API endpoints live under the /v1 version prefix; fold it into the configured host\n\t\t// (default or custom) once, so resource paths stay version-agnostic (\"/drops\", …). Parse via\n\t\t// URL so a stray trailing slash, query, or hash on the base can't corrupt the request path.\n\t\tconst base = new URL(resolved.baseUrl ?? DEFAULT_BASE_URL);\n\t\tconst basePath = base.pathname.replace(/\\/+$/, \"\");\n\t\tbase.pathname = basePath.endsWith(\"/v1\") ? basePath : `${basePath}/v1`;\n\t\tbase.search = \"\";\n\t\tbase.hash = \"\";\n\t\tthis.baseUrl = base.toString().replace(/\\/+$/, \"\");\n\t\tthis.timeoutMs = resolved.timeoutMs ?? 30_000;\n\t\tthis.uploadTimeoutMs = resolved.uploadTimeoutMs ?? 120_000;\n\t\tthis.fetchImpl = resolved.fetch ?? globalThis.fetch;\n\t}\n\n\tasync putSignedUrl(\n\t\turl: string,\n\t\tbody: Uint8Array | Blob | ReadableStream,\n\t\theaders: Record<string, string>,\n\t): Promise<DropthisResult<{ etag: string | null }>> {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), this.uploadTimeoutMs);\n\t\ttry {\n\t\t\tconst request: RequestInit & { duplex?: \"half\" } = {\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\theaders,\n\t\t\t\tbody: body as BodyInit,\n\t\t\t\tsignal: controller.signal,\n\t\t\t};\n\t\t\tif (body instanceof ReadableStream) request.duplex = \"half\";\n\t\t\tconst response = await this.fetchImpl(url, request);\n\t\t\tconst responseHeaders = headersToObject(response.headers);\n\t\t\tif (!response.ok) {\n\t\t\t\tconst text = await response.text();\n\t\t\t\treturn createErrorResult(\n\t\t\t\t\t`signed_upload_${response.status}`,\n\t\t\t\t\ttext || response.statusText,\n\t\t\t\t\tresponse.status,\n\t\t\t\t\t{ headers: responseHeaders },\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdata: {\n\t\t\t\t\tetag: response.headers.get(\"ETag\") ?? responseHeaders.etag ?? null,\n\t\t\t\t},\n\t\t\t\terror: null,\n\t\t\t\theaders: responseHeaders,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"Request timed out\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: \"Network error\";\n\t\t\treturn createErrorResult(\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"timeout\"\n\t\t\t\t\t: \"network_error\",\n\t\t\t\tmessage,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} finally {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t}\n\n\t/**\n\t * Authenticated GET that returns the raw response bytes untouched (no JSON parsing,\n\t * no case conversion). Error responses are still parsed as problem+json. Used for\n\t * content read-back (`drops.getContent` with a file path).\n\t */\n\tasync requestBytes(\n\t\tpath: string,\n\t\toptions: RequestOptions & {\n\t\t\tparams?: Record<string, string | number | boolean | null | undefined>;\n\t\t} = {},\n\t): Promise<\n\t\tDropthisResult<{ bytes: Uint8Array; contentType: string | null }>\n\t> {\n\t\tif (!this.apiKey) {\n\t\t\treturn createErrorResult(\n\t\t\t\t\"missing_api_key\",\n\t\t\t\t\"No API key provided. Pass apiKey or set DROPTHIS_API_KEY.\",\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\n\t\tconst headers: Record<string, string> = {\n\t\t\t\"user-agent\": `dropthis-node/${SDK_VERSION}`,\n\t\t\tauthorization: `Bearer ${this.apiKey}`,\n\t\t};\n\n\t\tconst url = new URL(`${this.baseUrl}${path}`);\n\t\tfor (const [key, value] of Object.entries(options.params ?? {})) {\n\t\t\tif (value !== undefined && value !== null)\n\t\t\t\turl.searchParams.set(key, String(value));\n\t\t}\n\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(\n\t\t\t() => controller.abort(),\n\t\t\toptions.timeoutMs ?? this.timeoutMs,\n\t\t);\n\t\ttry {\n\t\t\tconst response = await this.fetchImpl(url.toString(), {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders,\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\t\t\tconst responseHeaders = headersToObject(response.headers);\n\t\t\tif (!response.ok) {\n\t\t\t\tconst text = await response.text();\n\t\t\t\treturn problemResult(response, text, responseHeaders);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdata: {\n\t\t\t\t\tbytes: new Uint8Array(await response.arrayBuffer()),\n\t\t\t\t\tcontentType:\n\t\t\t\t\t\tresponse.headers.get(\"content-type\") ??\n\t\t\t\t\t\tresponseHeaders[\"content-type\"] ??\n\t\t\t\t\t\tnull,\n\t\t\t\t},\n\t\t\t\terror: null,\n\t\t\t\theaders: responseHeaders,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"Request timed out\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: \"Network error\";\n\t\t\treturn createErrorResult(\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"timeout\"\n\t\t\t\t\t: \"network_error\",\n\t\t\t\tmessage,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} finally {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t}\n\n\tasync request<T>(\n\t\tmethod: string,\n\t\tpath: string,\n\t\toptions: RequestOptions & {\n\t\t\tbody?: unknown;\n\t\t\tbodyCase?: \"snake\" | \"raw\";\n\t\t\tparams?: Record<string, string | number | boolean | null | undefined>;\n\t\t} = {},\n\t): Promise<DropthisResult<T>> {\n\t\tconst authenticated = options.authenticated ?? true;\n\t\tif (authenticated && !this.apiKey) {\n\t\t\treturn createErrorResult<T>(\n\t\t\t\t\"missing_api_key\",\n\t\t\t\t\"No API key provided. Pass apiKey or set DROPTHIS_API_KEY.\",\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\n\t\tconst headers: Record<string, string> = {\n\t\t\t\"user-agent\": `dropthis-node/${SDK_VERSION}`,\n\t\t};\n\t\tif (authenticated && this.apiKey)\n\t\t\theaders.authorization = `Bearer ${this.apiKey}`;\n\t\tif (options.idempotencyKey)\n\t\t\theaders[\"idempotency-key\"] = options.idempotencyKey;\n\t\tif (options.ifRevision !== undefined)\n\t\t\theaders[\"if-revision\"] = String(options.ifRevision);\n\t\tif (options.body !== undefined && !(options.body instanceof FormData))\n\t\t\theaders[\"content-type\"] = \"application/json\";\n\n\t\tconst url = new URL(`${this.baseUrl}${path}`);\n\t\tconst wireParams =\n\t\t\toptions.bodyCase === \"raw\"\n\t\t\t\t? options.params\n\t\t\t\t: (toSnakeCase(options.params ?? {}) as Record<string, unknown>);\n\t\tfor (const [key, value] of Object.entries(wireParams ?? {})) {\n\t\t\tif (value !== undefined && value !== null)\n\t\t\t\turl.searchParams.set(key, String(value));\n\t\t}\n\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(\n\t\t\t() => controller.abort(),\n\t\t\toptions.timeoutMs ?? this.timeoutMs,\n\t\t);\n\t\ttry {\n\t\t\tconst request: RequestInit = {\n\t\t\t\tmethod,\n\t\t\t\theaders,\n\t\t\t\tsignal: controller.signal,\n\t\t\t};\n\t\t\tif (options.body instanceof FormData) {\n\t\t\t\trequest.body = options.body;\n\t\t\t} else if (options.body !== undefined) {\n\t\t\t\tconst wireBody =\n\t\t\t\t\toptions.bodyCase === \"raw\" ? options.body : toSnakeCase(options.body);\n\t\t\t\trequest.body = JSON.stringify(wireBody);\n\t\t\t}\n\n\t\t\tconst response = await this.fetchImpl(url.toString(), request);\n\t\t\tconst responseHeaders = headersToObject(response.headers);\n\t\t\tconst text = await response.text();\n\t\t\tif (!response.ok)\n\t\t\t\treturn problemResult<T>(response, text, responseHeaders);\n\t\t\treturn {\n\t\t\t\tdata: toCamelCase(parseJson(text)) as T,\n\t\t\t\terror: null,\n\t\t\t\theaders: responseHeaders,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"Request timed out\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: \"Network error\";\n\t\t\treturn createErrorResult<T>(\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"timeout\"\n\t\t\t\t\t: \"network_error\",\n\t\t\t\tmessage,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} finally {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t}\n}\n\n/** Maps a non-2xx response's problem+json body into the typed error result shape. */\nfunction problemResult<T>(\n\tresponse: Response,\n\ttext: string,\n\tresponseHeaders: Record<string, string>,\n): DropthisResult<T> {\n\tconst parsed = parseJson(text);\n\tconst body =\n\t\tparsed && typeof parsed === \"object\"\n\t\t\t? (parsed as Record<string, unknown>)\n\t\t\t: {};\n\tconst message =\n\t\tstringValue(body.detail) ?? stringValue(body.title) ?? response.statusText;\n\tconst code =\n\t\tstringValue(body.code) ??\n\t\tstringValue(body.error_code) ??\n\t\t`http_${response.status}`;\n\tconst currentRevision = numberValue(body.current_revision);\n\tconst type = stringValue(body.type);\n\tconst title = stringValue(body.title);\n\tconst instance = stringValue(body.instance);\n\treturn createErrorResult<T>(code, message, response.status, {\n\t\tbody,\n\t\t...(type !== null ? { type } : {}),\n\t\t...(title !== null ? { title } : {}),\n\t\t...(instance !== null ? { instance } : {}),\n\t\tdetail: stringValue(body.detail),\n\t\tparam: stringValue(body.param),\n\t\t...(currentRevision !== undefined ? { currentRevision } : {}),\n\t\trequestId:\n\t\t\tstringValue(body.request_id) ?? responseHeaders[\"x-request-id\"] ?? null,\n\t\tsuggestion: stringValue(body.suggestion),\n\t\tretryable: booleanValue(body.retryable),\n\t\theaders: responseHeaders,\n\t});\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\theaders.forEach((value, key) => {\n\t\tresult[key.toLowerCase()] = value;\n\t});\n\treturn result;\n}\n\nfunction parseJson(text: string): unknown {\n\tif (!text) return null;\n\ttry {\n\t\treturn JSON.parse(text);\n\t} catch {\n\t\treturn text;\n\t}\n}\n\nfunction stringValue(value: unknown): string | null {\n\treturn typeof value === \"string\" ? value : null;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n\treturn typeof value === \"number\" ? value : undefined;\n}\n\nfunction booleanValue(value: unknown): boolean | null {\n\treturn typeof value === \"boolean\" ? value : null;\n}\n","import type { PreparedPublishRequest } from \"./publish/core.js\";\nimport { resolveInput } from \"./publish/node.js\";\nimport { AccountResource } from \"./resources/account.js\";\nimport { ApiKeysResource } from \"./resources/api-keys.js\";\nimport { AuthResource } from \"./resources/auth.js\";\nimport { DeploymentsResource } from \"./resources/deployments.js\";\nimport { DropsResource } from \"./resources/drops.js\";\nimport { UploadsResource } from \"./resources/uploads.js\";\nimport { Transport } from \"./transport.js\";\nimport type {\n\tDropthisClientOptions,\n\tPublishInput,\n\tPublishOptions,\n} from \"./types.js\";\n\nexport class Dropthis {\n\tprivate readonly transport: Transport;\n\tprivate authResource?: AuthResource;\n\tprivate apiKeysResource?: ApiKeysResource;\n\tprivate accountResource?: AccountResource;\n\tprivate dropsResource?: DropsResource<PublishInput>;\n\tprivate deploymentsResource?: DeploymentsResource;\n\tprivate uploadsResource?: UploadsResource;\n\n\tconstructor(options: DropthisClientOptions | string = {}) {\n\t\tthis.transport = new Transport(options);\n\t}\n\n\tget auth(): AuthResource {\n\t\tif (!this.authResource)\n\t\t\tthis.authResource = new AuthResource(this.transport);\n\t\treturn this.authResource;\n\t}\n\n\tget apiKeys(): ApiKeysResource {\n\t\tif (!this.apiKeysResource)\n\t\t\tthis.apiKeysResource = new ApiKeysResource(this.transport);\n\t\treturn this.apiKeysResource;\n\t}\n\n\tget account(): AccountResource {\n\t\tif (!this.accountResource)\n\t\t\tthis.accountResource = new AccountResource(this.transport);\n\t\treturn this.accountResource;\n\t}\n\n\tget drops(): DropsResource<PublishInput> {\n\t\tif (!this.dropsResource)\n\t\t\tthis.dropsResource = new DropsResource(this.transport, resolveInput);\n\t\treturn this.dropsResource;\n\t}\n\n\tget deployments(): DeploymentsResource {\n\t\tif (!this.deploymentsResource)\n\t\t\tthis.deploymentsResource = new DeploymentsResource(this.transport);\n\t\treturn this.deploymentsResource;\n\t}\n\n\tget uploads(): UploadsResource {\n\t\tif (!this.uploadsResource)\n\t\t\tthis.uploadsResource = new UploadsResource(this.transport);\n\t\treturn this.uploadsResource;\n\t}\n\n\tasync prepare(\n\t\tinput: PublishInput,\n\t\toptions: PublishOptions = {},\n\t): Promise<PreparedPublishRequest> {\n\t\treturn resolveInput(input, options);\n\t}\n}\n"],"mappings":"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","names":["import_promises","import_node_path","ignore","fg","resolveInput"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/publish/node.ts","../src/errors.ts","../src/publish/checksum.ts","../src/publish/detect.ts","../src/publish/paths.ts","../src/publish/core.ts","../src/publish/files.ts","../src/resources/account.ts","../src/resources/api-keys.ts","../src/resources/auth.ts","../src/resources/deployments.ts","../src/resources/domains.ts","../src/pagination.ts","../src/resources/drops.ts","../src/resources/uploads.ts","../src/case.ts","../src/transport.ts","../src/dropthis.ts"],"sourcesContent":["export { Dropthis } from \"./dropthis.js\";\nexport {\n\tcreateErrorResult,\n\tPublishInputError,\n\tredactSecrets,\n} from \"./errors.js\";\nexport { CursorPage } from \"./pagination.js\";\nexport type {\n\tInMemoryPublishInput,\n\tPreparedPublishRequest,\n\tPreparedUploadFile,\n} from \"./publish/core.js\";\nexport { DeploymentsResource } from \"./resources/deployments.js\";\nexport { DomainsResource } from \"./resources/domains.js\";\nexport { UploadsResource } from \"./resources/uploads.js\";\nexport type {\n\tAccountLimits,\n\tAccountResponse,\n\tActionResolve,\n\tCreateUploadSessionRequest,\n\tCreateUploadSessionResponse,\n\tDeploymentContentFile,\n\tDeploymentContentManifest,\n\tDnsRecord,\n\tDomainDeletedResponse,\n\tDomainListResponse,\n\tDomainResponse,\n\tDropAction,\n\tDropContentFile,\n\tDropDeploymentResponse,\n\tDropOptions,\n\tDropResponse,\n\tDropthisClientOptions,\n\tDropthisErrorResponse,\n\tDropthisResult,\n\tGetContentOptions,\n\tLimitations,\n\tListDeploymentsParams,\n\tListDeploymentsResponse,\n\tListPage,\n\tNextHint,\n\tPrepareOptions,\n\tPublishFileInput,\n\tPublishInput,\n\tPublishOptions,\n\tRequestControls,\n\tRequestOptions,\n\tTierInfo,\n\tUpdateContentOptions,\n\tUploadManifestFile,\n\tUploadSessionFileResponse,\n\tUploadSessionResponse,\n\tUploadTarget,\n} from \"./types.js\";\n","import { readFile, stat } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { PublishInputError } from \"../errors.js\";\nimport type { PublishInput, PublishOptions } from \"../types.js\";\nimport { sha256File } from \"./checksum.js\";\nimport {\n\tbuildStagedRequest,\n\ttype InMemoryPublishInput,\n\ttype PreparedPublishRequest,\n\ttype PreparedUploadFile,\n\tresolveInMemory,\n} from \"./core.js\";\nimport { isHttpUrl, isPathShaped } from \"./detect.js\";\nimport type { PublishFile } from \"./files.js\";\nimport { collectPublishFiles, detectPathContentType } from \"./files.js\";\nimport { assertValidManifestPath } from \"./paths.js\";\n\n/**\n * Files at or above this size get a precomputed sha256 so the server can verify\n * the signed upload. Smaller files skip the hash to keep publishes snappy.\n * Matches the threshold the legacy prepare.ts used.\n */\nconst SINGLE_PUT_CHECKSUM_THRESHOLD = 10 * 1024 * 1024;\n\n/**\n * Resolves any {@link PublishInput} into a {@link PreparedPublishRequest},\n * adding filesystem support on top of the pure in-memory resolver in core.ts.\n *\n * - URL / Uint8Array / `{ kind }` objects → delegate to {@link resolveInMemory}.\n * - `string[]` → a local bundle of files/directories.\n * - bare `string` → stat-first: http URL → source; multiline/oversized → inline\n * content; otherwise stat the path (file/dir) or treat as inline prose.\n */\nexport async function resolveInput(\n\tinput: PublishInput,\n\toptions: PublishOptions = {},\n): Promise<PreparedPublishRequest> {\n\tif (\n\t\tinput instanceof URL ||\n\t\tinput instanceof Uint8Array ||\n\t\t(typeof input === \"object\" && input !== null && \"kind\" in input)\n\t) {\n\t\treturn resolveInMemory(input as InMemoryPublishInput, options);\n\t}\n\n\tif (Array.isArray(input)) {\n\t\treturn resolveBundle(input, options);\n\t}\n\n\tif (typeof input === \"string\") {\n\t\treturn resolveString(input, options);\n\t}\n\n\t// Exhaustive: the PublishInput union has no other members.\n\treturn resolveInMemory(input as InMemoryPublishInput, options);\n}\n\n/**\n * Bare-string resolution. ORDER MATTERS:\n * 1. http(s) URL → source. MUST precede stat: a URL is path-shaped (has \"/\"),\n * so a stat/path-shaped check first would wrongly report file_not_found.\n * 2. multiline or oversized (>4096) → inline content (cannot be a path).\n * 3. stat the value: file → fileStaged, dir → folderStaged, missing →\n * file_not_found if path-shaped, else inline prose content.\n */\nasync function resolveString(\n\tvalue: string,\n\toptions: PublishOptions,\n): Promise<PreparedPublishRequest> {\n\tif (isHttpUrl(value)) return resolveInMemory(value, options);\n\tif (value.includes(\"\\n\") || value.length > 4096) {\n\t\treturn resolveInMemory(value, options);\n\t}\n\n\tlet info: Awaited<ReturnType<typeof stat>> | undefined;\n\ttry {\n\t\tinfo = await stat(value);\n\t} catch {\n\t\tinfo = undefined;\n\t}\n\n\tif (info?.isFile()) return fileStaged(value, options);\n\tif (info?.isDirectory()) return folderStaged(value, options);\n\n\tif (isPathShaped(value)) {\n\t\tthrow new PublishInputError(\n\t\t\t\"file_not_found\",\n\t\t\t`No file or directory at \"${value}\".`,\n\t\t\tvalue,\n\t\t\t'To publish this as inline text, pass { kind: \"content\", content }.',\n\t\t);\n\t}\n\treturn resolveInMemory(value, options);\n}\n\n/** Stages a single local file. Defers the entry to buildStagedRequest. */\nasync function fileStaged(\n\tpath: string,\n\toptions: PublishOptions,\n): Promise<PreparedPublishRequest> {\n\tconst fileStat = await stat(path);\n\tif (options.path !== undefined) assertValidManifestPath(options.path);\n\tconst manifestPath = options.path ?? basename(path);\n\tconst contentType =\n\t\toptions.contentType ?? (await detectPathContentType(path));\n\tconst checksumSha256 =\n\t\tfileStat.size > SINGLE_PUT_CHECKSUM_THRESHOLD\n\t\t\t? await sha256File(path)\n\t\t\t: undefined;\n\tconst file: PreparedUploadFile = {\n\t\tpath: manifestPath,\n\t\tcontentType,\n\t\tsizeBytes: fileStat.size,\n\t\t...(checksumSha256 ? { checksumSha256 } : {}),\n\t\tgetBody: () => readFile(path),\n\t};\n\treturn buildStagedRequest([file], options);\n}\n\n/** Stages every file under a local directory (tree-relative manifest paths). */\nasync function folderStaged(\n\tpath: string,\n\toptions: PublishOptions,\n): Promise<PreparedPublishRequest> {\n\tconst files = await collectPublishFiles(path, options);\n\tconst preparedFiles = await Promise.all(files.map(toPreparedFile));\n\treturn buildStagedRequest(preparedFiles, options);\n}\n\n/**\n * Stages a list of local file/directory paths. Each element is statted (missing\n * → file_not_found) then expanded via collectPublishFiles (basename for a file,\n * tree-relative for a directory). Basename collisions across elements surface as\n * duplicate_path from buildStagedRequest.\n */\nasync function resolveBundle(\n\tpaths: string[],\n\toptions: PublishOptions,\n): Promise<PreparedPublishRequest> {\n\tconst collected: PublishFile[] = [];\n\tfor (const element of paths) {\n\t\ttry {\n\t\t\tawait stat(element);\n\t\t} catch {\n\t\t\tthrow new PublishInputError(\n\t\t\t\t\"file_not_found\",\n\t\t\t\t`No file or directory at \"${element}\".`,\n\t\t\t\telement,\n\t\t\t);\n\t\t}\n\t\tcollected.push(...(await collectPublishFiles(element, options)));\n\t}\n\tconst preparedFiles = await Promise.all(collected.map(toPreparedFile));\n\treturn buildStagedRequest(preparedFiles, options);\n}\n\n/** Maps a collected PublishFile to a lazy-body PreparedUploadFile. */\nasync function toPreparedFile(pf: PublishFile): Promise<PreparedUploadFile> {\n\tconst checksumSha256 =\n\t\tpf.sizeBytes > SINGLE_PUT_CHECKSUM_THRESHOLD\n\t\t\t? await sha256File(pf.absolutePath)\n\t\t\t: undefined;\n\treturn {\n\t\tpath: pf.path,\n\t\tcontentType: pf.contentType,\n\t\tsizeBytes: pf.sizeBytes,\n\t\t...(checksumSha256 ? { checksumSha256 } : {}),\n\t\tgetBody: () => readFile(pf.absolutePath),\n\t};\n}\n","import type { DropthisResult } from \"./types.js\";\n\nconst API_KEY_RE = /sk_[A-Za-z0-9_-]+/g;\n\nexport function redactSecrets(message: string): string {\n\treturn message.replace(API_KEY_RE, \"sk_[redacted]\");\n}\n\nexport function createErrorResult<T>(\n\tcode: string,\n\tmessage: string,\n\tstatusCode: number | null,\n\textra: {\n\t\ttype?: string;\n\t\ttitle?: string;\n\t\tdetail?: string | null;\n\t\tinstance?: string | null;\n\t\tparam?: string | null;\n\t\tcurrentRevision?: number;\n\t\trequestId?: string | null;\n\t\theaders?: Record<string, string>;\n\t\tsuggestion?: string | null;\n\t\tretryable?: boolean | null;\n\t\tbody?: unknown;\n\t} = {},\n): DropthisResult<T> {\n\treturn {\n\t\tdata: null,\n\t\terror: {\n\t\t\tcode,\n\t\t\tmessage: redactSecrets(message),\n\t\t\tstatusCode,\n\t\t\t...(extra.type ? { type: extra.type } : {}),\n\t\t\t...(extra.title !== undefined ? { title: extra.title } : {}),\n\t\t\t...(extra.detail !== undefined ? { detail: extra.detail } : {}),\n\t\t\t...(extra.instance !== undefined ? { instance: extra.instance } : {}),\n\t\t\t...(extra.param !== undefined ? { param: extra.param } : {}),\n\t\t\t...(extra.currentRevision !== undefined\n\t\t\t\t? { currentRevision: extra.currentRevision }\n\t\t\t\t: {}),\n\t\t\t...(extra.requestId !== undefined ? { requestId: extra.requestId } : {}),\n\t\t\t...(extra.suggestion !== undefined\n\t\t\t\t? { suggestion: extra.suggestion }\n\t\t\t\t: {}),\n\t\t\t...(extra.retryable !== undefined ? { retryable: extra.retryable } : {}),\n\t\t\t...(extra.body !== undefined ? { body: extra.body } : {}),\n\t\t},\n\t\theaders: extra.headers ?? {},\n\t};\n}\n\nexport class PublishInputError extends Error {\n\tconstructor(\n\t\treadonly code: string,\n\t\tmessage: string,\n\t\treadonly param?: string,\n\t\treadonly suggestion?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"PublishInputError\";\n\t}\n}\n\nexport function toErrorResult<T>(err: unknown): DropthisResult<T> {\n\tif (err instanceof PublishInputError)\n\t\treturn createErrorResult<T>(err.code, err.message, null, {\n\t\t\tparam: err.param ?? null,\n\t\t\tsuggestion: err.suggestion ?? null,\n\t\t});\n\treturn createErrorResult<T>(\n\t\t\"sdk_error\",\n\t\terr instanceof Error ? err.message : \"Unknown SDK error\",\n\t\tnull,\n\t);\n}\n","import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\n\nexport function sha256Bytes(bytes: Uint8Array): string {\n\treturn createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\nexport async function sha256File(path: string): Promise<string> {\n\tconst hash = createHash(\"sha256\");\n\tfor await (const chunk of createReadStream(path)) {\n\t\thash.update(chunk);\n\t}\n\treturn hash.digest(\"hex\");\n}\n","export function isHttpUrl(value: string): boolean {\n\ttry {\n\t\tconst url = new URL(value);\n\t\treturn url.protocol === \"http:\" || url.protocol === \"https:\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function containsHtmlTag(value: string): boolean {\n\treturn /<[a-z!/][^>]*>/i.test(value);\n}\n\nconst FILE_EXT = /\\.[A-Za-z0-9]{1,8}([?#].*)?$/;\nexport function isPathShaped(value: string): boolean {\n\tif (value.length === 0 || value.length > 4096 || value.includes(\"\\n\"))\n\t\treturn false;\n\t// Reject strings that look like HTML (tags disqualify path interpretation)\n\tif (containsHtmlTag(value)) return false;\n\tif (value.includes(\"/\") || value.includes(\"\\\\\")) return true;\n\tif (/^[A-Za-z]:[\\\\/]/.test(value)) return true;\n\treturn FILE_EXT.test(value);\n}\n\nexport function contentTypeForString(value: string, override?: string): string {\n\tif (override) return override;\n\treturn containsHtmlTag(value) ? \"text/html\" : \"text/plain; charset=utf-8\";\n}\n\nexport function detectBytesContentType(bytes: Uint8Array): string {\n\tconst text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes);\n\tif (text.includes(\"�\")) return \"application/octet-stream\";\n\treturn containsHtmlTag(text) ? \"text/html\" : \"text/plain; charset=utf-8\";\n}\n\nexport function entryForContentType(contentType: string): string {\n\tconst m = contentType.toLowerCase().split(\";\", 1)[0]?.trim() ?? \"\";\n\tif (m === \"text/html\" || m === \"application/xhtml+xml\") return \"index.html\";\n\tif (m === \"application/json\") return \"index.json\";\n\tif (m === \"text/css\") return \"index.css\";\n\tif (m === \"text/javascript\" || m === \"application/javascript\")\n\t\treturn \"index.js\";\n\tif (m.startsWith(\"text/\")) return \"index.txt\";\n\treturn \"index\";\n}\n","import { PublishInputError } from \"../errors.js\";\n\nexport function normalizeManifestPath(path: string): string {\n\treturn path.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nexport function assertValidManifestPath(path: string): void {\n\t// User-supplied manifest paths ({kind:\"files\"}.path, options.path, options.entry) must be POSIX.\n\t// Local filesystem paths are normalized via normalizeManifestPath, NOT passed here.\n\tif (path.includes(\"\\\\\"))\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_path\",\n\t\t\t`Manifest path must use \"/\": \"${path}\".`,\n\t\t\tpath,\n\t\t);\n\tconst p = normalizeManifestPath(path);\n\tif (p === \"\")\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_path\",\n\t\t\t\"Manifest path must not be empty.\",\n\t\t\tpath,\n\t\t);\n\tif (p.startsWith(\"/\"))\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_path\",\n\t\t\t`Manifest path must be relative: \"${path}\".`,\n\t\t\tpath,\n\t\t);\n\tif (p.startsWith(\"~\"))\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_path\",\n\t\t\t`Manifest path must not start with \"~\": \"${path}\".`,\n\t\t\tpath,\n\t\t);\n\tif (p.split(\"/\").includes(\"..\"))\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_path\",\n\t\t\t`Manifest path must not contain \"..\": \"${path}\".`,\n\t\t\tpath,\n\t\t);\n}\n\nexport function assertNoDuplicatePaths(paths: string[]): void {\n\tconst seen = new Set<string>();\n\tfor (const raw of paths) {\n\t\tconst p = normalizeManifestPath(raw);\n\t\tif (seen.has(p))\n\t\t\tthrow new PublishInputError(\n\t\t\t\t\"duplicate_path\",\n\t\t\t\t`Duplicate file path after normalization: \"${p}\".`,\n\t\t\t\tp,\n\t\t\t\t\"Give each file a unique path; basename mapping for string[] can collide.\",\n\t\t\t);\n\t\tseen.add(p);\n\t}\n}\n\nexport function assertNonEmptyBundle(paths: string[]): void {\n\tif (paths.length === 0)\n\t\tthrow new PublishInputError(\n\t\t\t\"empty_bundle\",\n\t\t\t\"Nothing to publish: the bundle has no files.\",\n\t\t\tundefined,\n\t\t\t\"Pass at least one file, or a directory that contains files.\",\n\t\t);\n}\n","import { createErrorResult, PublishInputError } from \"../errors.js\";\nimport type { Transport } from \"../transport.js\";\nimport type {\n\tCreateUploadSessionFileResponse,\n\tCreateUploadSessionRequest,\n\tCreateUploadSessionResponse,\n\tDropResponse,\n\tDropthisResult,\n\tPublishFileInput,\n\tPublishOptions,\n\tUpdateContentOptions,\n\tUploadManifestFile,\n\tUploadSessionResponse,\n} from \"../types.js\";\nimport {\n\tcontentTypeForString,\n\tdetectBytesContentType,\n\tentryForContentType,\n\tisHttpUrl,\n} from \"./detect.js\";\nimport {\n\tassertNoDuplicatePaths,\n\tassertNonEmptyBundle,\n\tassertValidManifestPath,\n\tnormalizeManifestPath,\n} from \"./paths.js\";\n\n/**\n * A file ready to be staged for upload. The body is lazy: the orchestrator\n * calls `getBody()` per file when it is ready to push bytes to the signed URL.\n * This keeps the resolution layer pure and lets the filesystem layer (node.ts)\n * defer reads/streams until upload time.\n */\nexport type PreparedUploadFile = {\n\tpath: string;\n\tcontentType: string;\n\tsizeBytes: number;\n\tchecksumSha256?: string;\n\tgetBody(): Promise<Uint8Array | Blob | ReadableStream>;\n};\n\n/**\n * Resolves a publish input into a {@link PreparedPublishRequest}. Two implementations exist:\n * the fs-free {@link resolveInMemory} (Workers-safe) and the fs-capable `resolveInput` in\n * `publish/node.ts`. `DropsResource` takes one by injection so it can power both the Node client\n * and the edge client WITHOUT statically importing the Node-only pipeline (which would poison the\n * Workers bundle with `node:fs`/`fast-glob`). `TInput` is the input type the chosen resolver\n * accepts ({@link InMemoryPublishInput} on the edge, the full `PublishInput` on Node).\n */\nexport type PublishInputResolver<TInput> = (\n\tinput: TInput,\n\toptions: PublishOptions,\n) => Promise<PreparedPublishRequest>;\n\nexport type PreparedPublishRequest =\n\t| {\n\t\t\tkind: \"staged\";\n\t\t\tmanifest: CreateUploadSessionRequest;\n\t\t\tfiles: PreparedUploadFile[];\n\t\t\toptions: Record<string, unknown>;\n\t\t\tmetadata?: Record<string, unknown>;\n\t }\n\t| {\n\t\t\tkind: \"source\";\n\t\t\tsourceUrl: string;\n\t\t\toptions: Record<string, unknown>;\n\t\t\tmetadata?: Record<string, unknown>;\n\t };\n\n/**\n * The canonical publish inputs that can be resolved with no filesystem access:\n * the {@link PublishInput} union minus `string[]` (which is inherently a list\n * of filesystem paths handled by node.ts).\n */\nexport type InMemoryPublishInput =\n\t| string\n\t| URL\n\t| Uint8Array\n\t| { kind: \"content\"; content: string; contentType?: string; path?: string }\n\t| { kind: \"source_url\"; sourceUrl: string }\n\t| { kind: \"files\"; files: PublishFileInput[]; entry?: string };\n\nconst VALID_VISIBILITIES = [\"public\", \"unlisted\"] as const;\nconst MAX_TITLE_LENGTH = 500;\n\nexport function validatePublishOptions(options: PublishOptions): void {\n\tif (\n\t\toptions.title !== undefined &&\n\t\toptions.title !== null &&\n\t\toptions.title.length > MAX_TITLE_LENGTH\n\t) {\n\t\tthrow new Error(`Title must be ${MAX_TITLE_LENGTH} characters or less.`);\n\t}\n\n\tif (options.visibility !== undefined && options.visibility !== null) {\n\t\tif (\n\t\t\t!(VALID_VISIBILITIES as readonly string[]).includes(options.visibility)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid visibility \"${options.visibility}\". Use \"public\" or \"unlisted\".`,\n\t\t\t);\n\t\t}\n\t}\n\n\tif (options.expiresAt !== undefined && options.expiresAt !== null) {\n\t\tif (options.expiresAt instanceof Date) {\n\t\t\tif (Number.isNaN(options.expiresAt.getTime())) {\n\t\t\t\tthrow new Error(\"Invalid expiresAt date.\");\n\t\t\t}\n\t\t} else if (typeof options.expiresAt === \"string\") {\n\t\t\tconst parsed = new Date(options.expiresAt);\n\t\t\tif (Number.isNaN(parsed.getTime())) {\n\t\t\t\tthrow new Error(\"Invalid expiresAt date.\");\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function optionsBody(options: PublishOptions): Record<string, unknown> {\n\tvalidatePublishOptions(options);\n\tconst body: Record<string, unknown> = {};\n\tif (options.title !== undefined) body.title = options.title;\n\tif (options.visibility !== undefined) body.visibility = options.visibility;\n\tif (options.password !== undefined) body.password = options.password;\n\tif (options.noindex !== undefined) body.noindex = options.noindex;\n\tif (options.expiresAt !== undefined) {\n\t\tbody.expiresAt =\n\t\t\toptions.expiresAt instanceof Date\n\t\t\t\t? options.expiresAt.toISOString()\n\t\t\t\t: options.expiresAt;\n\t}\n\tif (options.domain !== undefined) body.domain = options.domain;\n\tif (options.slug !== undefined) body.slug = options.slug;\n\treturn body;\n}\n\n/**\n * Narrow options to the content-only subset for `drops.updateContent()`: a content update ships a\n * new content version and never changes drop settings (title, visibility, password, noindex,\n * expiry, metadata). Picking only content-prep + request controls drops any settings BEFORE\n * prepare, so they are never validated, sent, or applied.\n */\nexport function updateContentOptions(\n\toptions: UpdateContentOptions,\n): UpdateContentOptions {\n\tconst out: UpdateContentOptions = {};\n\tif (options.entry !== undefined) out.entry = options.entry;\n\tif (options.contentType !== undefined) out.contentType = options.contentType;\n\tif (options.path !== undefined) out.path = options.path;\n\tif (options.ignore !== undefined) out.ignore = options.ignore;\n\tif (options.ignoreDefaults !== undefined)\n\t\tout.ignoreDefaults = options.ignoreDefaults;\n\tif (options.idempotencyKey !== undefined)\n\t\tout.idempotencyKey = options.idempotencyKey;\n\tif (options.ifRevision !== undefined) out.ifRevision = options.ifRevision;\n\treturn out;\n}\n\n/**\n * Builds a staged upload request from already-prepared files. Validates the\n * bundle is non-empty, normalizes manifest paths, and rejects duplicates.\n * Reused by core's in-memory paths AND by node.ts for file/dir/string[] inputs.\n *\n * `entry` argument wins over `options.entry`.\n */\nexport function buildStagedRequest(\n\tfiles: PreparedUploadFile[],\n\toptions: PublishOptions,\n\tentry?: string,\n): PreparedPublishRequest {\n\tassertNonEmptyBundle(files.map((f) => f.path));\n\tconst normalizedPaths = files.map((f) => normalizeManifestPath(f.path));\n\tassertNoDuplicatePaths(normalizedPaths);\n\n\tconst manifestFiles: UploadManifestFile[] = files.map((file) => ({\n\t\tpath: normalizeManifestPath(file.path),\n\t\tcontentType: file.contentType,\n\t\tsizeBytes: file.sizeBytes,\n\t\t...(file.checksumSha256 ? { checksumSha256: file.checksumSha256 } : {}),\n\t}));\n\n\tconst resolvedEntry = entry ?? options.entry;\n\tif (resolvedEntry !== undefined) assertValidManifestPath(resolvedEntry);\n\tconst manifest: CreateUploadSessionRequest = {\n\t\tschemaVersion: 1,\n\t\tfiles: manifestFiles,\n\t\t...(resolvedEntry ? { entry: resolvedEntry } : {}),\n\t};\n\n\tconst prepared: Extract<PreparedPublishRequest, { kind: \"staged\" }> = {\n\t\tkind: \"staged\",\n\t\tmanifest,\n\t\tfiles,\n\t\toptions: optionsBody(options),\n\t};\n\tif (options.metadata) prepared.metadata = options.metadata;\n\treturn prepared;\n}\n\n/** Builds a `source_url` request (validates http(s)). */\nexport function buildSourceRequest(\n\tsourceUrl: string,\n\toptions: PublishOptions,\n): PreparedPublishRequest {\n\tif (!isHttpUrl(sourceUrl)) {\n\t\tthrow new PublishInputError(\n\t\t\t\"invalid_source_url\",\n\t\t\t\"source_url must be an http(s) URL.\",\n\t\t\tsourceUrl,\n\t\t\t\"Fetch the content first, then pass it as content/files.\",\n\t\t);\n\t}\n\tconst prepared: Extract<PreparedPublishRequest, { kind: \"source\" }> = {\n\t\tkind: \"source\",\n\t\tsourceUrl,\n\t\toptions: optionsBody(options),\n\t};\n\tif (options.metadata) prepared.metadata = options.metadata;\n\treturn prepared;\n}\n\nfunction decodeBase64(value: string): Uint8Array {\n\tconst binary = atob(value);\n\treturn Uint8Array.from(binary, (c) => c.charCodeAt(0));\n}\n\nfunction fileBytes(file: PublishFileInput): Uint8Array {\n\tif (file.content !== undefined) return new TextEncoder().encode(file.content);\n\tif (file.contentBase64 !== undefined) return decodeBase64(file.contentBase64);\n\tif (file.bytes !== undefined) return file.bytes;\n\tthrow new PublishInputError(\n\t\t\"missing_file_bytes\",\n\t\t`File \"${file.path}\" is missing content bytes.`,\n\t\tfile.path,\n\t\t\"Provide one of content, contentBase64, or bytes.\",\n\t);\n}\n\nfunction singleStagedFile(\n\tpath: string,\n\tcontentType: string,\n\tbytes: Uint8Array,\n\toptions: PublishOptions,\n): PreparedPublishRequest {\n\treturn buildStagedRequest(\n\t\t[\n\t\t\t{\n\t\t\t\tpath,\n\t\t\t\tcontentType,\n\t\t\t\tsizeBytes: bytes.byteLength,\n\t\t\t\tgetBody: async () => bytes,\n\t\t\t},\n\t\t],\n\t\toptions,\n\t);\n}\n\n/**\n * Resolves the in-memory canonical inputs (the edge subset of {@link PublishInput})\n * into a {@link PreparedPublishRequest}. Performs NO filesystem access.\n */\nexport async function resolveInMemory(\n\tinput: InMemoryPublishInput,\n\toptions: PublishOptions = {},\n): Promise<PreparedPublishRequest> {\n\tif (input instanceof URL) {\n\t\treturn buildSourceRequest(input.toString(), options);\n\t}\n\n\tif (typeof input === \"string\") {\n\t\tif (isHttpUrl(input)) return buildSourceRequest(input, options);\n\t\tconst contentType = contentTypeForString(input, options.contentType);\n\t\tif (options.path !== undefined) assertValidManifestPath(options.path);\n\t\tconst path = options.path ?? entryForContentType(contentType);\n\t\tconst bytes = new TextEncoder().encode(input);\n\t\treturn singleStagedFile(path, contentType, bytes, options);\n\t}\n\n\t// A Node binary buffer is a Uint8Array subclass, so this branch also covers\n\t// it without referencing the Node-only global.\n\tif (input instanceof Uint8Array) {\n\t\tconst contentType = options.contentType ?? detectBytesContentType(input);\n\t\tif (options.path !== undefined) assertValidManifestPath(options.path);\n\t\tconst path = options.path ?? entryForContentType(contentType);\n\t\treturn singleStagedFile(path, contentType, input, options);\n\t}\n\n\tif (input.kind === \"content\") {\n\t\tconst contentType = input.contentType ?? options.contentType ?? \"text/html\";\n\t\tif (input.path !== undefined) assertValidManifestPath(input.path);\n\t\tif (options.path !== undefined) assertValidManifestPath(options.path);\n\t\tconst path = input.path ?? options.path ?? entryForContentType(contentType);\n\t\tconst bytes = new TextEncoder().encode(input.content);\n\t\treturn singleStagedFile(path, contentType, bytes, options);\n\t}\n\n\tif (input.kind === \"source_url\") {\n\t\treturn buildSourceRequest(input.sourceUrl, options);\n\t}\n\n\t// input.kind === \"files\"\n\tconst files: PreparedUploadFile[] = input.files.map((file) => {\n\t\tassertValidManifestPath(file.path);\n\t\tconst bytes = fileBytes(file);\n\t\tconst contentType = file.contentType ?? detectBytesContentType(bytes);\n\t\treturn {\n\t\t\tpath: file.path,\n\t\t\tcontentType,\n\t\t\tsizeBytes: bytes.byteLength,\n\t\t\tgetBody: async () => bytes,\n\t\t};\n\t});\n\treturn buildStagedRequest(files, options, input.entry);\n}\n\n// ---------------------------------------------------------------------------\n// Orchestration helpers\n// ---------------------------------------------------------------------------\n\ntype StagedPublishOptions = { idempotencyKey?: string; ifRevision?: number };\n\n/** How many signed file PUTs run concurrently during a staged upload. */\nconst UPLOAD_CONCURRENCY = 5;\n\nfunction errorResult<T>(result: DropthisResult<unknown>): DropthisResult<T> {\n\tif (!result.error) throw new Error(\"Expected an error result\");\n\treturn { data: null, error: result.error, headers: result.headers };\n}\n\ntype UploadJob = {\n\tfile: PreparedUploadFile;\n\ttarget: CreateUploadSessionFileResponse;\n};\n\n/**\n * Uploads staged files through their signed PUT targets with bounded parallelism.\n * Fail-fast: the first failure stops new uploads from starting (in-flight ones\n * drain). Returns the lowest-index failure — attributed to its file path — or null\n * when every upload succeeded. Each PUT sends exactly the headers the server signed\n * for that file (this is what carries the checksum contract).\n */\nasync function uploadStagedFiles(\n\ttransport: Transport,\n\tjobs: UploadJob[],\n): Promise<DropthisResult<never> | null> {\n\tlet nextIndex = 0;\n\tlet failed = false;\n\tconst failures = new Map<number, DropthisResult<never>>();\n\n\tasync function worker(): Promise<void> {\n\t\twhile (!failed) {\n\t\t\tconst index = nextIndex;\n\t\t\tnextIndex += 1;\n\t\t\tif (index >= jobs.length) return;\n\t\t\tconst job = jobs[index];\n\t\t\tif (!job) return;\n\t\t\tconst put = await transport.putSignedUrl(\n\t\t\t\tjob.target.upload.url,\n\t\t\t\tawait job.file.getBody(),\n\t\t\t\tjob.target.upload.headers,\n\t\t\t);\n\t\t\tif (put.error) {\n\t\t\t\tfailed = true;\n\t\t\t\tfailures.set(index, {\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: {\n\t\t\t\t\t\t...put.error,\n\t\t\t\t\t\tmessage: `Upload failed for ${job.file.path}: ${put.error.message}`,\n\t\t\t\t\t},\n\t\t\t\t\theaders: put.headers,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst workers = Array.from(\n\t\t{ length: Math.min(UPLOAD_CONCURRENCY, jobs.length) },\n\t\t() => worker(),\n\t);\n\tawait Promise.all(workers);\n\n\tif (failures.size === 0) return null;\n\tconst firstIndex = Math.min(...failures.keys());\n\treturn failures.get(firstIndex) ?? null;\n}\n\n/**\n * Executes the staged-upload publish flow (single-PUT only).\n * Calls POST /uploads → PUT signed URL per file → POST /uploads/{id}/complete\n * → POST finalPath. (Paths are version-agnostic here; the transport prefixes /v1.)\n */\nexport async function publishStaged(\n\ttransport: Transport,\n\tprepared: Extract<PreparedPublishRequest, { kind: \"staged\" }>,\n\tfinalPath: string,\n\toptions: StagedPublishOptions = {},\n): Promise<DropthisResult<DropResponse>> {\n\tconst baseKey = options.idempotencyKey ?? `sdk-${crypto.randomUUID()}`;\n\n\t// Step 1: create upload session\n\tconst createResult = await transport.request<CreateUploadSessionResponse>(\n\t\t\"POST\",\n\t\t\"/uploads\",\n\t\t{\n\t\t\tbody: prepared.manifest,\n\t\t\tidempotencyKey: `${baseKey}:create-upload`,\n\t\t},\n\t);\n\tif (createResult.error) return errorResult(createResult);\n\n\t// Step 2: pair every file with its signed target, then upload via bounded-parallel\n\t// single PUTs. Target validation happens up front so no bytes move when the\n\t// session response is malformed.\n\tconst jobs: UploadJob[] = [];\n\tfor (const file of prepared.files) {\n\t\tconst target = createResult.data.files.find((f) => f.path === file.path);\n\t\tif (!target) {\n\t\t\treturn createErrorResult(\n\t\t\t\t\"upload_target_missing\",\n\t\t\t\t`Upload target missing for ${file.path}`,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tif (target.upload.strategy !== \"single_put\") {\n\t\t\t// Defensive: a single signed PUT per file IS the upload contract — the server\n\t\t\t// only ever assigns single_put. Anything else means a newer server contract\n\t\t\t// this SDK predates.\n\t\t\treturn createErrorResult(\n\t\t\t\t\"unsupported_upload_strategy\",\n\t\t\t\t`Unexpected upload strategy \"${target.upload.strategy}\" for ${file.path}. The dropthis upload contract is one signed PUT per file; update @dropthis/node.`,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tjobs.push({ file, target });\n\t}\n\tconst uploadFailure = await uploadStagedFiles(transport, jobs);\n\tif (uploadFailure) return uploadFailure;\n\n\t// Step 3: complete upload session (no request body — the server verifies the\n\t// staged objects against the manifest)\n\tconst completeResult = await transport.request<UploadSessionResponse>(\n\t\t\"POST\",\n\t\t`/uploads/${encodeURIComponent(createResult.data.uploadId)}/complete`,\n\t\t{\n\t\t\tidempotencyKey: `${baseKey}:complete-upload`,\n\t\t},\n\t);\n\tif (completeResult.error) return errorResult(completeResult);\n\n\t// Step 4: final publish\n\tconst finalOptions: Parameters<Transport[\"request\"]>[2] = {\n\t\tbody: {\n\t\t\tuploadId: createResult.data.uploadId,\n\t\t\t...(Object.keys(prepared.options).length > 0\n\t\t\t\t? { options: prepared.options }\n\t\t\t\t: {}),\n\t\t\t...(prepared.metadata ? { metadata: prepared.metadata } : {}),\n\t\t},\n\t\tidempotencyKey: `${baseKey}:publish`,\n\t};\n\tif (options.ifRevision !== undefined)\n\t\tfinalOptions.ifRevision = options.ifRevision;\n\treturn transport.request<DropResponse>(\"POST\", finalPath, finalOptions);\n}\n\n/**\n * Executes the source-URL publish flow.\n * Sends a single POST to finalPath with { sourceUrl, options } and optional metadata.\n */\nexport async function publishSource(\n\ttransport: Transport,\n\tprepared: Extract<PreparedPublishRequest, { kind: \"source\" }>,\n\tfinalPath: string,\n\toptions: StagedPublishOptions = {},\n): Promise<DropthisResult<DropResponse>> {\n\tconst baseKey = options.idempotencyKey ?? `sdk-${crypto.randomUUID()}`;\n\treturn transport.request<DropResponse>(\"POST\", finalPath, {\n\t\tbody: {\n\t\t\tsourceUrl: prepared.sourceUrl,\n\t\t\t...(Object.keys(prepared.options).length > 0\n\t\t\t\t? { options: prepared.options }\n\t\t\t\t: {}),\n\t\t\t...(prepared.metadata ? { metadata: prepared.metadata } : {}),\n\t\t},\n\t\tidempotencyKey: `${baseKey}:publish`,\n\t\t...(options.ifRevision !== undefined\n\t\t\t? { ifRevision: options.ifRevision }\n\t\t\t: {}),\n\t});\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { basename, sep } from \"node:path\";\nimport fg from \"fast-glob\";\nimport ignore from \"ignore\";\nimport { lookup } from \"mime-types\";\nimport { detectBytesContentType } from \"./detect.js\";\n\nexport type PublishFile = {\n\tabsolutePath: string;\n\tpath: string;\n\tcontentType: string;\n\tsizeBytes: number;\n};\n\nconst DEFAULT_IGNORES = [\n\t\".git\",\n\t\".git/**\",\n\t\"node_modules\",\n\t\"node_modules/**\",\n\t\".DS_Store\",\n\t\".env\",\n\t\".env.*\",\n\t\".cache\",\n\t\".cache/**\",\n\t\".tmp\",\n\t\".tmp/**\",\n\t\"dist/.cache\",\n\t\"dist/.cache/**\",\n];\n\nexport async function collectPublishFiles(\n\tinputPath: string,\n\toptions: { ignore?: string[]; ignoreDefaults?: boolean } = {},\n): Promise<PublishFile[]> {\n\tconst inputStat = await stat(inputPath);\n\tif (inputStat.isFile()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tabsolutePath: inputPath,\n\t\t\t\tpath: basename(inputPath),\n\t\t\t\tcontentType: await detectPathContentType(inputPath),\n\t\t\t\tsizeBytes: inputStat.size,\n\t\t\t},\n\t\t];\n\t}\n\tif (!inputStat.isDirectory()) {\n\t\tthrow new Error(`Input is not a file or directory: ${inputPath}`);\n\t}\n\n\tconst matcher = ignore().add([\n\t\t...(options.ignoreDefaults === false ? [] : DEFAULT_IGNORES),\n\t\t...(options.ignore ?? []),\n\t]);\n\tconst entries = await fg(\"**/*\", {\n\t\tcwd: inputPath,\n\t\tonlyFiles: true,\n\t\tfollowSymbolicLinks: false,\n\t\tdot: true,\n\t\tunique: true,\n\t});\n\tconst paths = entries\n\t\t.map((entry) => entry.split(sep).join(\"/\"))\n\t\t.filter((entry) => !matcher.ignores(entry))\n\t\t.sort((a, b) => a.localeCompare(b));\n\treturn Promise.all(\n\t\tpaths.map(async (path) => {\n\t\t\tconst absolutePath = `${inputPath}/${path}`;\n\t\t\tconst fileStat = await stat(absolutePath);\n\t\t\treturn {\n\t\t\t\tabsolutePath,\n\t\t\t\tpath,\n\t\t\t\tcontentType: await detectPathContentType(absolutePath),\n\t\t\t\tsizeBytes: fileStat.size,\n\t\t\t};\n\t\t}),\n\t);\n}\n\nexport async function detectPathContentType(path: string): Promise<string> {\n\tconst detected = lookup(path);\n\tif (detected) return detected;\n\treturn detectBytesContentType(await readFile(path));\n}\n","import type { Transport } from \"../transport.js\";\nimport type { AccountResponse, DropthisResult } from \"../types.js\";\n\nexport class AccountResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\tget(): Promise<DropthisResult<AccountResponse>> {\n\t\treturn this.transport.request(\"GET\", \"/account\");\n\t}\n\n\tupdate(input: {\n\t\tdisplayName: string | null;\n\t}): Promise<DropthisResult<AccountResponse>> {\n\t\treturn this.transport.request(\"PATCH\", \"/account\", { body: input });\n\t}\n\n\tdelete(): Promise<DropthisResult<null>> {\n\t\treturn this.transport.request(\"DELETE\", \"/account\");\n\t}\n}\n","import type { Transport } from \"../transport.js\";\nimport type {\n\tApiKeyCreatedResponse,\n\tApiKeyResponse,\n\tDropthisResult,\n} from \"../types.js\";\n\nexport class ApiKeysResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\tlist(): Promise<DropthisResult<{ object: \"list\"; data: ApiKeyResponse[] }>> {\n\t\treturn this.transport.request(\"GET\", \"/api-keys\");\n\t}\n\n\tcreate(input: {\n\t\tlabel: string;\n\t}): Promise<DropthisResult<ApiKeyCreatedResponse>> {\n\t\treturn this.transport.request(\"POST\", \"/api-keys\", { body: input });\n\t}\n\n\t/** Revoke an API key. 204 No Content — data is null on success. */\n\tdelete(keyId: string): Promise<DropthisResult<null>> {\n\t\treturn this.transport.request(\n\t\t\t\"DELETE\",\n\t\t\t`/api-keys/${encodeURIComponent(keyId)}`,\n\t\t);\n\t}\n}\n","import type { Transport } from \"../transport.js\";\nimport type {\n\tDropthisResult,\n\tEmailOtpResponse,\n\tSessionResponse,\n} from \"../types.js\";\n\nexport class AuthResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\trequestEmailOtp(input: {\n\t\temail: string;\n\t}): Promise<DropthisResult<EmailOtpResponse>> {\n\t\treturn this.transport.request(\"POST\", \"/auth/email/otp\", {\n\t\t\tbody: input,\n\t\t\tauthenticated: false,\n\t\t});\n\t}\n\n\tverifyEmailOtp(input: {\n\t\temail: string;\n\t\tcode: string;\n\t}): Promise<DropthisResult<SessionResponse>> {\n\t\treturn this.transport.request(\"POST\", \"/auth/email/verify\", {\n\t\t\tbody: input,\n\t\t\tauthenticated: false,\n\t\t});\n\t}\n\n\t/** Revoke the current `at_` session token. 204 No Content — data is null on success. */\n\tlogout(): Promise<DropthisResult<null>> {\n\t\treturn this.transport.request(\"DELETE\", \"/auth/session\");\n\t}\n}\n","import type { Transport } from \"../transport.js\";\nimport type {\n\tDropDeploymentResponse,\n\tDropthisResult,\n\tListDeploymentsParams,\n\tListDeploymentsResponse,\n} from \"../types.js\";\n\nexport class DeploymentsResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\tlist(\n\t\tdropId: string,\n\t\tparams: ListDeploymentsParams = {},\n\t): Promise<DropthisResult<ListDeploymentsResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"GET\",\n\t\t\t`/drops/${encodeURIComponent(dropId)}/deployments`,\n\t\t\t{ params },\n\t\t);\n\t}\n\n\tget(\n\t\tdropId: string,\n\t\tdeploymentId: string,\n\t): Promise<DropthisResult<DropDeploymentResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"GET\",\n\t\t\t`/drops/${encodeURIComponent(dropId)}/deployments/${encodeURIComponent(deploymentId)}`,\n\t\t);\n\t}\n}\n","import type { Transport } from \"../transport.js\";\nimport type {\n\tDomainDeletedResponse,\n\tDomainListResponse,\n\tDomainResponse,\n\tDropthisResult,\n} from \"../types.js\";\n\nexport class DomainsResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\t/**\n\t * Connect a custom domain to the account. Returns the domain in `pending_dns` status with\n\t * DNS instructions. Idempotent on (account, hostname) — re-connecting an already-connected\n\t * domain returns the existing row. POST /domains.\n\t */\n\tconnect(input: {\n\t\thostname: string;\n\t\tmode: \"path\" | \"dedicated\";\n\t}): Promise<DropthisResult<DomainResponse>> {\n\t\treturn this.transport.request(\"POST\", \"/domains\", { body: input });\n\t}\n\n\t/** List all custom domains connected to this account. GET /domains. */\n\tlist(): Promise<DropthisResult<DomainListResponse>> {\n\t\treturn this.transport.request(\"GET\", \"/domains\");\n\t}\n\n\t/** Get a domain by its stable id or hostname. GET /domains/{id_or_hostname}. */\n\tget(idOrHostname: string): Promise<DropthisResult<DomainResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"GET\",\n\t\t\t`/domains/${encodeURIComponent(idOrHostname)}`,\n\t\t);\n\t}\n\n\t/**\n\t * Trigger a DNS + Cloudflare verification check. Returns the domain with updated status and\n\t * per-record diagnostics. If DNS is still propagating, `dns[].retryAfter` tells you when to\n\t * re-call. POST /domains/{id_or_hostname}/verify.\n\t */\n\tverify(idOrHostname: string): Promise<DropthisResult<DomainResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"POST\",\n\t\t\t`/domains/${encodeURIComponent(idOrHostname)}/verify`,\n\t\t);\n\t}\n\n\t/**\n\t * Update a domain's `dropId` (dedicated mode: repoint to a different drop) or `default`\n\t * flag (path mode only: set/clear the account's default publish domain). Mode is immutable\n\t * — delete and reconnect to change it. PATCH /domains/{id_or_hostname}.\n\t */\n\tupdate(\n\t\tidOrHostname: string,\n\t\tinput: { dropId?: string | null; default?: boolean | null },\n\t): Promise<DropthisResult<DomainResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"PATCH\",\n\t\t\t`/domains/${encodeURIComponent(idOrHostname)}`,\n\t\t\t{ body: input },\n\t\t);\n\t}\n\n\t/**\n\t * Delete a custom domain and remove all its routes. The response includes a dangling-CNAME\n\t * warning — remove the DNS record after deleting so another account cannot re-claim the\n\t * hostname. DELETE /domains/{id_or_hostname}.\n\t */\n\tdelete(idOrHostname: string): Promise<DropthisResult<DomainDeletedResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"DELETE\",\n\t\t\t`/domains/${encodeURIComponent(idOrHostname)}`,\n\t\t);\n\t}\n}\n","import type { DropthisResult, ListPage } from \"./types.js\";\n\nexport class CursorPage<T> implements ListPage<T> {\n\treadonly object = \"list\" as const;\n\treadonly data: T[];\n\treadonly hasMore: boolean;\n\treadonly nextCursor: string | null;\n\tprivate readonly fetchNextPage:\n\t\t| (() => Promise<DropthisResult<CursorPage<T>>>)\n\t\t| undefined;\n\n\tconstructor(input: {\n\t\tdata: T[];\n\t\thasMore: boolean;\n\t\tnextCursor: string | null;\n\t\tfetchNextPage?: (() => Promise<DropthisResult<CursorPage<T>>>) | undefined;\n\t}) {\n\t\tthis.data = input.data;\n\t\tthis.hasMore = input.hasMore;\n\t\tthis.nextCursor = input.nextCursor;\n\t\tthis.fetchNextPage = input.fetchNextPage;\n\t}\n\n\tasync autoPagingToArray(options: { limit?: number } = {}): Promise<T[]> {\n\t\tconst items: T[] = [];\n\t\tfor await (const item of this) {\n\t\t\titems.push(item);\n\t\t\tif (options.limit !== undefined && items.length >= options.limit) break;\n\t\t}\n\t\treturn items;\n\t}\n\n\tasync *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n\t\tfor (const item of this.data) yield item;\n\t\tlet current: CursorPage<T> = this;\n\t\twhile (current.hasMore && current.fetchNextPage) {\n\t\t\tconst next = await current.fetchNextPage();\n\t\t\tif (next.error) break;\n\t\t\tcurrent = next.data;\n\t\t\tfor (const item of current.data) yield item;\n\t\t}\n\t}\n}\n","import { createErrorResult, toErrorResult } from \"../errors.js\";\nimport { CursorPage } from \"../pagination.js\";\nimport {\n\ttype PreparedPublishRequest,\n\ttype PublishInputResolver,\n\tpublishSource,\n\tpublishStaged,\n\tupdateContentOptions,\n} from \"../publish/core.js\";\nimport type { Transport } from \"../transport.js\";\nimport type {\n\tDeploymentContentManifest,\n\tDropContentFile,\n\tDropOptions,\n\tDropResponse,\n\tDropthisResult,\n\tGetContentOptions,\n\tListDropsParams,\n\tPublishInput,\n\tPublishOptions,\n\tRequestControls,\n\tUpdateContentOptions,\n} from \"../types.js\";\n\n/**\n * The drop lifecycle resource. `TInput` is the publish-input type the injected resolver accepts:\n * the full `PublishInput` on the Node client, the fs-free `InMemoryPublishInput` on the edge. The\n * resolver is injected (not statically imported) so this module never pulls in the Node-only\n * publish pipeline and stays Workers-safe.\n */\nexport class DropsResource<TInput = PublishInput> {\n\tprivate parentHosts?: ReadonlySet<string>;\n\n\tconstructor(\n\t\tprivate readonly transport: Transport,\n\t\tprivate readonly resolveInput: PublishInputResolver<TInput>,\n\t) {}\n\n\t/**\n\t * Hostnames the SDK can attribute to dropthis for slug parsing: the canonical\n\t * viewer domain plus the configured baseUrl's host (covers staging/self-hosted\n\t * setups where drops are served under the API's own domain).\n\t */\n\tprivate allowedParentHosts(): ReadonlySet<string> {\n\t\tif (!this.parentHosts) {\n\t\t\tconst hosts = new Set([CANONICAL_VIEWER_HOST]);\n\t\t\ttry {\n\t\t\t\thosts.add(new URL(this.transport.baseUrl).hostname);\n\t\t\t} catch {\n\t\t\t\t// Unparseable baseUrl — canonical host only.\n\t\t\t}\n\t\t\tthis.parentHosts = hosts;\n\t\t}\n\t\treturn this.parentHosts;\n\t}\n\n\t/**\n\t * Publish content to a NEW permanent public URL; returns the created drop (with its `drop_…` id).\n\t * Use to publish / share / post / put online / make public a report, dashboard, site, or file.\n\t * Creates a NEW drop every call — to change something already published, use {@link updateContent}\n\t * (the files at the URL) or {@link updateSettings} (title, visibility, password, expiry,\n\t * metadata) with the drop's id; calling publish again makes a duplicate. POST /drops.\n\t */\n\tasync publish(\n\t\tinput: TInput,\n\t\toptions: PublishOptions = {},\n\t): Promise<DropthisResult<DropResponse>> {\n\t\tlet prepared: PreparedPublishRequest;\n\t\ttry {\n\t\t\tprepared = await this.resolveInput(input, options);\n\t\t} catch (e) {\n\t\t\treturn toErrorResult<DropResponse>(e);\n\t\t}\n\t\treturn prepared.kind === \"source\"\n\t\t\t? publishSource(this.transport, prepared, \"/drops\", options)\n\t\t\t: publishStaged(this.transport, prepared, \"/drops\", options);\n\t}\n\n\t/**\n\t * Replace the content of an EXISTING drop, keeping its URL (ships a new deployment). Requires the\n\t * `drop_…` id from a publish response (not the slug/URL). Content-only: settings/metadata are\n\t * stripped BEFORE prepare, so they are never sent — change those with {@link updateSettings}; create\n\t * a new drop with {@link publish}. Not idempotent (each call is a new deployment) unless you pass the\n\t * same `idempotencyKey`. POST /drops/{id}/deployments.\n\t */\n\tasync updateContent(\n\t\tdropId: string,\n\t\tinput: TInput,\n\t\toptions: UpdateContentOptions = {},\n\t): Promise<DropthisResult<DropResponse>> {\n\t\tconst opts = updateContentOptions(options);\n\t\tlet prepared: PreparedPublishRequest;\n\t\ttry {\n\t\t\tprepared = await this.resolveInput(input, opts);\n\t\t} catch (e) {\n\t\t\treturn toErrorResult<DropResponse>(e);\n\t\t}\n\t\tconst path = `/drops/${encodeURIComponent(dropId)}/deployments`;\n\t\treturn prepared.kind === \"source\"\n\t\t\t? publishSource(this.transport, prepared, path, opts)\n\t\t\t: publishStaged(this.transport, prepared, path, opts);\n\t}\n\n\t/** List the account's drops, newest first (paginated). Each item carries its `drop_…` id. GET /drops. */\n\tasync list(\n\t\tparams: ListDropsParams = {},\n\t): Promise<DropthisResult<CursorPage<DropResponse>>> {\n\t\tconst result = await this.transport.request<{\n\t\t\tdrops: DropResponse[];\n\t\t\tnextCursor: string | null;\n\t\t}>(\"GET\", \"/drops\", {\n\t\t\tparams: params as Record<string, string | number | boolean>,\n\t\t});\n\t\tif (result.error) return result;\n\t\tconst page = new CursorPage<DropResponse>({\n\t\t\tdata: result.data.drops,\n\t\t\tnextCursor: result.data.nextCursor,\n\t\t\thasMore: result.data.nextCursor !== null,\n\t\t\tfetchNextPage: result.data.nextCursor\n\t\t\t\t? () => this.list({ ...params, cursor: result.data.nextCursor })\n\t\t\t\t: undefined,\n\t\t});\n\t\treturn { data: page, error: null, headers: result.headers };\n\t}\n\n\t/** Fetch one drop by its `drop_…` id (not the slug/URL). GET /drops/{id}. */\n\tget(dropId: string): Promise<DropthisResult<DropResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"GET\",\n\t\t\t`/drops/${encodeURIComponent(dropId)}`,\n\t\t);\n\t}\n\n\t/**\n\t * Resolve a drop URL (or bare slug) back to the drop — the way to recover a lost\n\t * `drop_…` id. The slug is parsed client-side from the first hostname label of a\n\t * dropthis-attributable hostname (`https://<slug>.dropthis.app/…`, or `<slug>.` +\n\t * the configured baseUrl's host), then matched owner-scoped via GET /drops?slug=.\n\t * Returns the drop, or `data: null` when no drop of yours has that slug.\n\t * Custom-domain URLs are rejected client-side with `invalid_drop_url` — they are\n\t * not resolvable yet.\n\t */\n\tasync resolve(\n\t\turlOrSlug: string,\n\t): Promise<DropthisResult<DropResponse | null>> {\n\t\tconst slug = parseSlug(urlOrSlug, this.allowedParentHosts());\n\t\tif (slug === null) {\n\t\t\treturn createErrorResult<DropResponse | null>(\n\t\t\t\t\"invalid_drop_url\",\n\t\t\t\t`Could not resolve a drop slug from \"${urlOrSlug}\". Pass a canonical drop URL like https://<slug>.dropthis.app/ or the bare slug — custom-domain URLs cannot be resolved yet.`,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tconst result = await this.transport.request<{\n\t\t\tdrops: DropResponse[];\n\t\t\tnextCursor: string | null;\n\t\t}>(\"GET\", \"/drops\", { params: { slug } });\n\t\tif (result.error)\n\t\t\treturn { data: null, error: result.error, headers: result.headers };\n\t\treturn {\n\t\t\tdata: result.data.drops[0] ?? null,\n\t\t\terror: null,\n\t\t\theaders: result.headers,\n\t\t};\n\t}\n\n\t/**\n\t * Read back what a drop is serving (owner-only; works regardless of any viewer\n\t * password). By default returns the JSON manifest of the CURRENT deployment's files;\n\t * pass `deploymentId` to read a historical (even superseded) deployment — downloading\n\t * an old version's files and republishing them via {@link updateContent} is the\n\t * rollback path. Pass `path` (one of the manifest's `files[].path` values) to download\n\t * that file's exact stored bytes instead. GET /drops/{id}/content.\n\t */\n\tgetContent(\n\t\tdropId: string,\n\t\toptions: GetContentOptions & { path: string },\n\t): Promise<DropthisResult<DropContentFile>>;\n\tgetContent(\n\t\tdropId: string,\n\t\toptions?: Omit<GetContentOptions, \"path\">,\n\t): Promise<DropthisResult<DeploymentContentManifest>>;\n\tasync getContent(\n\t\tdropId: string,\n\t\toptions: GetContentOptions = {},\n\t): Promise<DropthisResult<DeploymentContentManifest | DropContentFile>> {\n\t\tconst base =\n\t\t\toptions.deploymentId !== undefined\n\t\t\t\t? `/drops/${encodeURIComponent(dropId)}/deployments/${encodeURIComponent(options.deploymentId)}/content`\n\t\t\t\t: `/drops/${encodeURIComponent(dropId)}/content`;\n\t\tif (options.path === undefined)\n\t\t\treturn this.transport.request<DeploymentContentManifest>(\"GET\", base);\n\t\tconst path = options.path;\n\t\tconst result = await this.transport.requestBytes(base, {\n\t\t\tparams: { path },\n\t\t});\n\t\tif (result.error)\n\t\t\treturn { data: null, error: result.error, headers: result.headers };\n\t\tconst { bytes, contentType } = result.data;\n\t\treturn {\n\t\t\tdata: {\n\t\t\t\tpath,\n\t\t\t\tcontentType,\n\t\t\t\tbytes,\n\t\t\t\ttext: () => new TextDecoder().decode(bytes),\n\t\t\t},\n\t\t\terror: null,\n\t\t\theaders: result.headers,\n\t\t};\n\t}\n\n\t/**\n\t * Change an EXISTING drop's settings — title, visibility, password, noindex, expiry,\n\t * metadata, domain, or slug — by its `drop_…` id. Does not touch content; replace that\n\t * with {@link updateContent}. Idempotent. PATCH /drops/{id}.\n\t *\n\t * **`domain`** — move the drop to a different custom domain (must be live). Pass `null` to\n\t * move the drop back to the shared pool (unmount from its current domain).\n\t *\n\t * **`slug`** — rename the vanity slug on a path-mode custom domain. Only valid when the drop\n\t * lives on a path-mode domain. Unlike {@link publish} (which auto-suffixes taken slugs),\n\t * `updateSettings` returns 409 on a slug conflict and never auto-suffixes — your code must\n\t * catch 409 and retry with a different slug. Passing `slug` on the shared pool returns 422.\n\t */\n\tupdateSettings(\n\t\tdropId: string,\n\t\toptions: DropOptions & RequestControls = {},\n\t): Promise<DropthisResult<DropResponse>> {\n\t\tconst requestOptions: Parameters<Transport[\"request\"]>[2] = {\n\t\t\tbody: updateBody(options),\n\t\t};\n\t\tif (options.idempotencyKey)\n\t\t\trequestOptions.idempotencyKey = options.idempotencyKey;\n\t\tif (options.ifRevision !== undefined)\n\t\t\trequestOptions.ifRevision = options.ifRevision;\n\t\treturn this.transport.request(\n\t\t\t\"PATCH\",\n\t\t\t`/drops/${encodeURIComponent(dropId)}`,\n\t\t\trequestOptions,\n\t\t);\n\t}\n\n\t/** Permanently delete a drop and its public URL by its `drop_…` id. DELETE /drops/{id}. */\n\tdelete(dropId: string): Promise<DropthisResult<null>> {\n\t\treturn this.transport.request(\n\t\t\t\"DELETE\",\n\t\t\t`/drops/${encodeURIComponent(dropId)}`,\n\t\t);\n\t}\n}\n\nconst CANONICAL_VIEWER_HOST = \"dropthis.app\";\n\n/**\n * Extracts the drop slug from a drop URL, scheme-less hostname, or bare slug.\n * Drop URLs put the slug in the first hostname label (`https://<slug>.dropthis.app/`),\n * but only hostnames the SDK can attribute to dropthis are parsed: the slug label must\n * sit directly under one of `allowedParents` (the canonical viewer domain, plus the\n * client's configured baseUrl host). Any other hostname — e.g. a customer's custom\n * domain — returns null instead of guessing a slug from an unrelated first label.\n */\nfunction parseSlug(\n\tinput: string,\n\tallowedParents: ReadonlySet<string>,\n): string | null {\n\tconst value = input.trim();\n\tif (!value) return null;\n\t// A bare slug has no dots or slashes; anything else is treated as a URL/hostname.\n\tif (!/[./]/.test(value)) return value;\n\tconst withScheme = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(value)\n\t\t? value\n\t\t: `https://${value}`;\n\tlet hostname: string;\n\ttry {\n\t\thostname = new URL(withScheme).hostname;\n\t} catch {\n\t\treturn null;\n\t}\n\t// A trailing dot is a canonical FQDN form (\"slug.dropthis.app.\") — normalize it\n\t// so the parent match below cannot be dodged.\n\thostname = hostname.replace(/\\.$/, \"\");\n\t// Exactly <slug>.<allowed parent> — slugs never contain dots.\n\tconst dot = hostname.indexOf(\".\");\n\tif (dot <= 0) return null;\n\tconst slug = hostname.slice(0, dot);\n\tconst parent = hostname.slice(dot + 1);\n\treturn allowedParents.has(parent) ? slug : null;\n}\n\nconst SETTINGS = [\n\t\"title\",\n\t\"visibility\",\n\t\"password\",\n\t\"noindex\",\n\t\"expiresAt\",\n\t\"domain\",\n\t\"slug\",\n] as const;\n\nfunction updateBody(options: DropOptions & RequestControls): unknown {\n\tconst out: Record<string, unknown> = {};\n\tfor (const key of SETTINGS)\n\t\tif (options[key] !== undefined) out[key] = options[key];\n\treturn {\n\t\toptions: out,\n\t\t...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n\t};\n}\n","import type { Transport } from \"../transport.js\";\nimport type {\n\tCreateUploadSessionRequest,\n\tCreateUploadSessionResponse,\n\tDropthisResult,\n\tUploadSessionResponse,\n} from \"../types.js\";\n\nexport class UploadsResource {\n\tconstructor(private readonly transport: Transport) {}\n\n\tcreate(\n\t\tbody: CreateUploadSessionRequest,\n\t\toptions: { idempotencyKey?: string } = {},\n\t): Promise<DropthisResult<CreateUploadSessionResponse>> {\n\t\tconst requestOptions: Parameters<Transport[\"request\"]>[2] = { body };\n\t\tif (options.idempotencyKey)\n\t\t\trequestOptions.idempotencyKey = options.idempotencyKey;\n\t\treturn this.transport.request(\"POST\", \"/uploads\", requestOptions);\n\t}\n\n\tget(uploadId: string): Promise<DropthisResult<UploadSessionResponse>> {\n\t\treturn this.transport.request(\n\t\t\t\"GET\",\n\t\t\t`/uploads/${encodeURIComponent(uploadId)}`,\n\t\t);\n\t}\n\n\t/**\n\t * Verify staged objects and mark the session complete. Takes no request body —\n\t * the server verifies the uploaded bytes against the staged manifest.\n\t */\n\tcomplete(\n\t\tuploadId: string,\n\t\toptions: { idempotencyKey?: string } = {},\n\t): Promise<DropthisResult<UploadSessionResponse>> {\n\t\tconst requestOptions: Parameters<Transport[\"request\"]>[2] = {};\n\t\tif (options.idempotencyKey)\n\t\t\trequestOptions.idempotencyKey = options.idempotencyKey;\n\t\treturn this.transport.request(\n\t\t\t\"POST\",\n\t\t\t`/uploads/${encodeURIComponent(uploadId)}/complete`,\n\t\t\trequestOptions,\n\t\t);\n\t}\n\n\tcancel(uploadId: string): Promise<DropthisResult<null>> {\n\t\treturn this.transport.request(\n\t\t\t\"DELETE\",\n\t\t\t`/uploads/${encodeURIComponent(uploadId)}`,\n\t\t);\n\t}\n}\n","export function toCamelKey(key: string): string {\n\treturn key.replace(/_([a-z])/g, (_, char: string) => char.toUpperCase());\n}\n\nexport function toSnakeKey(key: string): string {\n\treturn key.replace(/[A-Z]/g, (char) => `_${char.toLowerCase()}`);\n}\n\nconst PASSTHROUGH_KEYS = new Set([\"metadata\"]);\n\nexport function toCamelCase(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(toCamelCase);\n\tif (value && typeof value === \"object\") {\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(value).map(([key, item]) => [\n\t\t\t\ttoCamelKey(key),\n\t\t\t\tPASSTHROUGH_KEYS.has(key) ? item : toCamelCase(item),\n\t\t\t]),\n\t\t);\n\t}\n\treturn value;\n}\n\nexport function toSnakeCase(value: unknown): unknown {\n\tif (Array.isArray(value)) return value.map(toSnakeCase);\n\tif (value && typeof value === \"object\") {\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(value)\n\t\t\t\t.filter(([, item]) => item !== undefined)\n\t\t\t\t.map(([key, item]) => [\n\t\t\t\t\ttoSnakeKey(key),\n\t\t\t\t\tPASSTHROUGH_KEYS.has(key) ? item : toSnakeCase(item),\n\t\t\t\t]),\n\t\t);\n\t}\n\treturn value;\n}\n","import { toCamelCase, toSnakeCase } from \"./case.js\";\nimport { createErrorResult } from \"./errors.js\";\nimport type {\n\tDropthisClientOptions,\n\tDropthisResult,\n\tRequestOptions,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.dropthis.app\";\nconst SDK_VERSION = \"0.10.0\";\n\nexport class Transport {\n\treadonly apiKey: string | undefined;\n\treadonly baseUrl: string;\n\treadonly timeoutMs: number;\n\treadonly uploadTimeoutMs: number;\n\treadonly fetchImpl: typeof globalThis.fetch;\n\n\tconstructor(options: DropthisClientOptions | string = {}) {\n\t\tconst resolved =\n\t\t\ttypeof options === \"string\" ? { apiKey: options } : options;\n\t\tthis.apiKey =\n\t\t\tresolved.apiKey ??\n\t\t\t(typeof process !== \"undefined\"\n\t\t\t\t? process.env?.DROPTHIS_API_KEY\n\t\t\t\t: undefined);\n\t\t// All API endpoints live under the /v1 version prefix; fold it into the configured host\n\t\t// (default or custom) once, so resource paths stay version-agnostic (\"/drops\", …). Parse via\n\t\t// URL so a stray trailing slash, query, or hash on the base can't corrupt the request path.\n\t\tconst base = new URL(resolved.baseUrl ?? DEFAULT_BASE_URL);\n\t\tconst basePath = base.pathname.replace(/\\/+$/, \"\");\n\t\tbase.pathname = basePath.endsWith(\"/v1\") ? basePath : `${basePath}/v1`;\n\t\tbase.search = \"\";\n\t\tbase.hash = \"\";\n\t\tthis.baseUrl = base.toString().replace(/\\/+$/, \"\");\n\t\tthis.timeoutMs = resolved.timeoutMs ?? 30_000;\n\t\tthis.uploadTimeoutMs = resolved.uploadTimeoutMs ?? 120_000;\n\t\tthis.fetchImpl = resolved.fetch ?? globalThis.fetch;\n\t}\n\n\tasync putSignedUrl(\n\t\turl: string,\n\t\tbody: Uint8Array | Blob | ReadableStream,\n\t\theaders: Record<string, string>,\n\t): Promise<DropthisResult<{ etag: string | null }>> {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), this.uploadTimeoutMs);\n\t\ttry {\n\t\t\tconst request: RequestInit & { duplex?: \"half\" } = {\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\theaders,\n\t\t\t\tbody: body as BodyInit,\n\t\t\t\tsignal: controller.signal,\n\t\t\t};\n\t\t\tif (body instanceof ReadableStream) request.duplex = \"half\";\n\t\t\tconst response = await this.fetchImpl(url, request);\n\t\t\tconst responseHeaders = headersToObject(response.headers);\n\t\t\tif (!response.ok) {\n\t\t\t\tconst text = await response.text();\n\t\t\t\treturn createErrorResult(\n\t\t\t\t\t`signed_upload_${response.status}`,\n\t\t\t\t\ttext || response.statusText,\n\t\t\t\t\tresponse.status,\n\t\t\t\t\t{ headers: responseHeaders },\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdata: {\n\t\t\t\t\tetag: response.headers.get(\"ETag\") ?? responseHeaders.etag ?? null,\n\t\t\t\t},\n\t\t\t\terror: null,\n\t\t\t\theaders: responseHeaders,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"Request timed out\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: \"Network error\";\n\t\t\treturn createErrorResult(\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"timeout\"\n\t\t\t\t\t: \"network_error\",\n\t\t\t\tmessage,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} finally {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t}\n\n\t/**\n\t * Authenticated GET that returns the raw response bytes untouched (no JSON parsing,\n\t * no case conversion). Error responses are still parsed as problem+json. Used for\n\t * content read-back (`drops.getContent` with a file path).\n\t */\n\tasync requestBytes(\n\t\tpath: string,\n\t\toptions: RequestOptions & {\n\t\t\tparams?: Record<string, string | number | boolean | null | undefined>;\n\t\t} = {},\n\t): Promise<\n\t\tDropthisResult<{ bytes: Uint8Array; contentType: string | null }>\n\t> {\n\t\tif (!this.apiKey) {\n\t\t\treturn createErrorResult(\n\t\t\t\t\"missing_api_key\",\n\t\t\t\t\"No API key provided. Pass apiKey or set DROPTHIS_API_KEY.\",\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\n\t\tconst headers: Record<string, string> = {\n\t\t\t\"user-agent\": `dropthis-node/${SDK_VERSION}`,\n\t\t\tauthorization: `Bearer ${this.apiKey}`,\n\t\t};\n\n\t\tconst url = new URL(`${this.baseUrl}${path}`);\n\t\tfor (const [key, value] of Object.entries(options.params ?? {})) {\n\t\t\tif (value !== undefined && value !== null)\n\t\t\t\turl.searchParams.set(key, String(value));\n\t\t}\n\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(\n\t\t\t() => controller.abort(),\n\t\t\toptions.timeoutMs ?? this.timeoutMs,\n\t\t);\n\t\ttry {\n\t\t\tconst response = await this.fetchImpl(url.toString(), {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders,\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\t\t\tconst responseHeaders = headersToObject(response.headers);\n\t\t\tif (!response.ok) {\n\t\t\t\tconst text = await response.text();\n\t\t\t\treturn problemResult(response, text, responseHeaders);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tdata: {\n\t\t\t\t\tbytes: new Uint8Array(await response.arrayBuffer()),\n\t\t\t\t\tcontentType:\n\t\t\t\t\t\tresponse.headers.get(\"content-type\") ??\n\t\t\t\t\t\tresponseHeaders[\"content-type\"] ??\n\t\t\t\t\t\tnull,\n\t\t\t\t},\n\t\t\t\terror: null,\n\t\t\t\theaders: responseHeaders,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"Request timed out\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: \"Network error\";\n\t\t\treturn createErrorResult(\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"timeout\"\n\t\t\t\t\t: \"network_error\",\n\t\t\t\tmessage,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} finally {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t}\n\n\tasync request<T>(\n\t\tmethod: string,\n\t\tpath: string,\n\t\toptions: RequestOptions & {\n\t\t\tbody?: unknown;\n\t\t\tbodyCase?: \"snake\" | \"raw\";\n\t\t\tparams?: Record<string, string | number | boolean | null | undefined>;\n\t\t} = {},\n\t): Promise<DropthisResult<T>> {\n\t\tconst authenticated = options.authenticated ?? true;\n\t\tif (authenticated && !this.apiKey) {\n\t\t\treturn createErrorResult<T>(\n\t\t\t\t\"missing_api_key\",\n\t\t\t\t\"No API key provided. Pass apiKey or set DROPTHIS_API_KEY.\",\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\n\t\tconst headers: Record<string, string> = {\n\t\t\t\"user-agent\": `dropthis-node/${SDK_VERSION}`,\n\t\t};\n\t\tif (authenticated && this.apiKey)\n\t\t\theaders.authorization = `Bearer ${this.apiKey}`;\n\t\tif (options.idempotencyKey)\n\t\t\theaders[\"idempotency-key\"] = options.idempotencyKey;\n\t\tif (options.ifRevision !== undefined)\n\t\t\theaders[\"if-revision\"] = String(options.ifRevision);\n\t\tif (options.body !== undefined && !(options.body instanceof FormData))\n\t\t\theaders[\"content-type\"] = \"application/json\";\n\n\t\tconst url = new URL(`${this.baseUrl}${path}`);\n\t\tconst wireParams =\n\t\t\toptions.bodyCase === \"raw\"\n\t\t\t\t? options.params\n\t\t\t\t: (toSnakeCase(options.params ?? {}) as Record<string, unknown>);\n\t\tfor (const [key, value] of Object.entries(wireParams ?? {})) {\n\t\t\tif (value !== undefined && value !== null)\n\t\t\t\turl.searchParams.set(key, String(value));\n\t\t}\n\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(\n\t\t\t() => controller.abort(),\n\t\t\toptions.timeoutMs ?? this.timeoutMs,\n\t\t);\n\t\ttry {\n\t\t\tconst request: RequestInit = {\n\t\t\t\tmethod,\n\t\t\t\theaders,\n\t\t\t\tsignal: controller.signal,\n\t\t\t};\n\t\t\tif (options.body instanceof FormData) {\n\t\t\t\trequest.body = options.body;\n\t\t\t} else if (options.body !== undefined) {\n\t\t\t\tconst wireBody =\n\t\t\t\t\toptions.bodyCase === \"raw\" ? options.body : toSnakeCase(options.body);\n\t\t\t\trequest.body = JSON.stringify(wireBody);\n\t\t\t}\n\n\t\t\tconst response = await this.fetchImpl(url.toString(), request);\n\t\t\tconst responseHeaders = headersToObject(response.headers);\n\t\t\tconst text = await response.text();\n\t\t\tif (!response.ok)\n\t\t\t\treturn problemResult<T>(response, text, responseHeaders);\n\t\t\treturn {\n\t\t\t\tdata: toCamelCase(parseJson(text)) as T,\n\t\t\t\terror: null,\n\t\t\t\theaders: responseHeaders,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"Request timed out\"\n\t\t\t\t\t: error instanceof Error\n\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t: \"Network error\";\n\t\t\treturn createErrorResult<T>(\n\t\t\t\terror instanceof Error && error.name === \"AbortError\"\n\t\t\t\t\t? \"timeout\"\n\t\t\t\t\t: \"network_error\",\n\t\t\t\tmessage,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} finally {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t}\n}\n\n/** Maps a non-2xx response's problem+json body into the typed error result shape. */\nfunction problemResult<T>(\n\tresponse: Response,\n\ttext: string,\n\tresponseHeaders: Record<string, string>,\n): DropthisResult<T> {\n\tconst parsed = parseJson(text);\n\tconst body =\n\t\tparsed && typeof parsed === \"object\"\n\t\t\t? (parsed as Record<string, unknown>)\n\t\t\t: {};\n\tconst message =\n\t\tstringValue(body.detail) ?? stringValue(body.title) ?? response.statusText;\n\tconst code =\n\t\tstringValue(body.code) ??\n\t\tstringValue(body.error_code) ??\n\t\t`http_${response.status}`;\n\tconst currentRevision = numberValue(body.current_revision);\n\tconst type = stringValue(body.type);\n\tconst title = stringValue(body.title);\n\tconst instance = stringValue(body.instance);\n\treturn createErrorResult<T>(code, message, response.status, {\n\t\tbody,\n\t\t...(type !== null ? { type } : {}),\n\t\t...(title !== null ? { title } : {}),\n\t\t...(instance !== null ? { instance } : {}),\n\t\tdetail: stringValue(body.detail),\n\t\tparam: stringValue(body.param),\n\t\t...(currentRevision !== undefined ? { currentRevision } : {}),\n\t\trequestId:\n\t\t\tstringValue(body.request_id) ?? responseHeaders[\"x-request-id\"] ?? null,\n\t\tsuggestion: stringValue(body.suggestion),\n\t\tretryable: booleanValue(body.retryable),\n\t\theaders: responseHeaders,\n\t});\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\theaders.forEach((value, key) => {\n\t\tresult[key.toLowerCase()] = value;\n\t});\n\treturn result;\n}\n\nfunction parseJson(text: string): unknown {\n\tif (!text) return null;\n\ttry {\n\t\treturn JSON.parse(text);\n\t} catch {\n\t\treturn text;\n\t}\n}\n\nfunction stringValue(value: unknown): string | null {\n\treturn typeof value === \"string\" ? value : null;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n\treturn typeof value === \"number\" ? value : undefined;\n}\n\nfunction booleanValue(value: unknown): boolean | null {\n\treturn typeof value === \"boolean\" ? value : null;\n}\n","import type { PreparedPublishRequest } from \"./publish/core.js\";\nimport { resolveInput } from \"./publish/node.js\";\nimport { AccountResource } from \"./resources/account.js\";\nimport { ApiKeysResource } from \"./resources/api-keys.js\";\nimport { AuthResource } from \"./resources/auth.js\";\nimport { DeploymentsResource } from \"./resources/deployments.js\";\nimport { DomainsResource } from \"./resources/domains.js\";\nimport { DropsResource } from \"./resources/drops.js\";\nimport { UploadsResource } from \"./resources/uploads.js\";\nimport { Transport } from \"./transport.js\";\nimport type {\n\tDropthisClientOptions,\n\tPublishInput,\n\tPublishOptions,\n} from \"./types.js\";\n\nexport class Dropthis {\n\tprivate readonly transport: Transport;\n\tprivate authResource?: AuthResource;\n\tprivate apiKeysResource?: ApiKeysResource;\n\tprivate accountResource?: AccountResource;\n\tprivate dropsResource?: DropsResource<PublishInput>;\n\tprivate deploymentsResource?: DeploymentsResource;\n\tprivate uploadsResource?: UploadsResource;\n\tprivate domainsResource?: DomainsResource;\n\n\tconstructor(options: DropthisClientOptions | string = {}) {\n\t\tthis.transport = new Transport(options);\n\t}\n\n\tget auth(): AuthResource {\n\t\tif (!this.authResource)\n\t\t\tthis.authResource = new AuthResource(this.transport);\n\t\treturn this.authResource;\n\t}\n\n\tget apiKeys(): ApiKeysResource {\n\t\tif (!this.apiKeysResource)\n\t\t\tthis.apiKeysResource = new ApiKeysResource(this.transport);\n\t\treturn this.apiKeysResource;\n\t}\n\n\tget account(): AccountResource {\n\t\tif (!this.accountResource)\n\t\t\tthis.accountResource = new AccountResource(this.transport);\n\t\treturn this.accountResource;\n\t}\n\n\tget drops(): DropsResource<PublishInput> {\n\t\tif (!this.dropsResource)\n\t\t\tthis.dropsResource = new DropsResource(this.transport, resolveInput);\n\t\treturn this.dropsResource;\n\t}\n\n\tget deployments(): DeploymentsResource {\n\t\tif (!this.deploymentsResource)\n\t\t\tthis.deploymentsResource = new DeploymentsResource(this.transport);\n\t\treturn this.deploymentsResource;\n\t}\n\n\tget uploads(): UploadsResource {\n\t\tif (!this.uploadsResource)\n\t\t\tthis.uploadsResource = new UploadsResource(this.transport);\n\t\treturn this.uploadsResource;\n\t}\n\n\tget domains(): DomainsResource {\n\t\tif (!this.domainsResource)\n\t\t\tthis.domainsResource = new DomainsResource(this.transport);\n\t\treturn this.domainsResource;\n\t}\n\n\tasync prepare(\n\t\tinput: PublishInput,\n\t\toptions: PublishOptions = {},\n\t): Promise<PreparedPublishRequest> {\n\t\treturn resolveInput(input, options);\n\t}\n}\n"],"mappings":"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","names":["import_promises","import_node_path","ignore","fg","resolveInput"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { A as AccountLimits, b as AccountResponse, c as ActionResolve, f as CursorPage, D as DeploymentContentFile, g as DeploymentContentManifest, i as
|
|
1
|
+
import { M as Transport, v as DropthisResult, E as EmailOtpResponse, S as SessionResponse, C as CreateUploadSessionRequest, e as CreateUploadSessionResponse, V as UploadSessionResponse, t as DropthisClientOptions, d as ApiKeysResource, a as AccountResource, s as DropsResource, H as PublishInput, h as DeploymentsResource, m as DomainsResource, J as PublishOptions, z as PreparedPublishRequest } from './drops-DEJcU6qw.cjs';
|
|
2
|
+
export { A as AccountLimits, b as AccountResponse, c as ActionResolve, f as CursorPage, D as DeploymentContentFile, g as DeploymentContentManifest, i as DnsRecord, j as DomainDeletedResponse, k as DomainListResponse, l as DomainResponse, n as DropAction, o as DropContentFile, p as DropDeploymentResponse, q as DropOptions, r as DropResponse, u as DropthisErrorResponse, G as GetContentOptions, I as InMemoryPublishInput, L as Limitations, w as ListDeploymentsParams, x as ListDeploymentsResponse, y as ListPage, N as NextHint, P as PrepareOptions, B as PreparedUploadFile, F as PublishFileInput, R as RequestControls, K as RequestOptions, T as TierInfo, U as UpdateContentOptions, O as UploadManifestFile, Q as UploadSessionFileResponse, W as UploadTarget } from './drops-DEJcU6qw.cjs';
|
|
3
3
|
|
|
4
4
|
declare class AuthResource {
|
|
5
5
|
private readonly transport;
|
|
@@ -40,6 +40,7 @@ declare class Dropthis {
|
|
|
40
40
|
private dropsResource?;
|
|
41
41
|
private deploymentsResource?;
|
|
42
42
|
private uploadsResource?;
|
|
43
|
+
private domainsResource?;
|
|
43
44
|
constructor(options?: DropthisClientOptions | string);
|
|
44
45
|
get auth(): AuthResource;
|
|
45
46
|
get apiKeys(): ApiKeysResource;
|
|
@@ -47,6 +48,7 @@ declare class Dropthis {
|
|
|
47
48
|
get drops(): DropsResource<PublishInput>;
|
|
48
49
|
get deployments(): DeploymentsResource;
|
|
49
50
|
get uploads(): UploadsResource;
|
|
51
|
+
get domains(): DomainsResource;
|
|
50
52
|
prepare(input: PublishInput, options?: PublishOptions): Promise<PreparedPublishRequest>;
|
|
51
53
|
}
|
|
52
54
|
|
|
@@ -71,4 +73,4 @@ declare class PublishInputError extends Error {
|
|
|
71
73
|
constructor(code: string, message: string, param?: string | undefined, suggestion?: string | undefined);
|
|
72
74
|
}
|
|
73
75
|
|
|
74
|
-
export { CreateUploadSessionRequest, CreateUploadSessionResponse, DeploymentsResource, Dropthis, DropthisClientOptions, DropthisResult, PreparedPublishRequest, PublishInput, PublishInputError, PublishOptions, UploadSessionResponse, UploadsResource, createErrorResult, redactSecrets };
|
|
76
|
+
export { CreateUploadSessionRequest, CreateUploadSessionResponse, DeploymentsResource, DomainsResource, Dropthis, DropthisClientOptions, DropthisResult, PreparedPublishRequest, PublishInput, PublishInputError, PublishOptions, UploadSessionResponse, UploadsResource, createErrorResult, redactSecrets };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { A as AccountLimits, b as AccountResponse, c as ActionResolve, f as CursorPage, D as DeploymentContentFile, g as DeploymentContentManifest, i as
|
|
1
|
+
import { M as Transport, v as DropthisResult, E as EmailOtpResponse, S as SessionResponse, C as CreateUploadSessionRequest, e as CreateUploadSessionResponse, V as UploadSessionResponse, t as DropthisClientOptions, d as ApiKeysResource, a as AccountResource, s as DropsResource, H as PublishInput, h as DeploymentsResource, m as DomainsResource, J as PublishOptions, z as PreparedPublishRequest } from './drops-DEJcU6qw.js';
|
|
2
|
+
export { A as AccountLimits, b as AccountResponse, c as ActionResolve, f as CursorPage, D as DeploymentContentFile, g as DeploymentContentManifest, i as DnsRecord, j as DomainDeletedResponse, k as DomainListResponse, l as DomainResponse, n as DropAction, o as DropContentFile, p as DropDeploymentResponse, q as DropOptions, r as DropResponse, u as DropthisErrorResponse, G as GetContentOptions, I as InMemoryPublishInput, L as Limitations, w as ListDeploymentsParams, x as ListDeploymentsResponse, y as ListPage, N as NextHint, P as PrepareOptions, B as PreparedUploadFile, F as PublishFileInput, R as RequestControls, K as RequestOptions, T as TierInfo, U as UpdateContentOptions, O as UploadManifestFile, Q as UploadSessionFileResponse, W as UploadTarget } from './drops-DEJcU6qw.js';
|
|
3
3
|
|
|
4
4
|
declare class AuthResource {
|
|
5
5
|
private readonly transport;
|
|
@@ -40,6 +40,7 @@ declare class Dropthis {
|
|
|
40
40
|
private dropsResource?;
|
|
41
41
|
private deploymentsResource?;
|
|
42
42
|
private uploadsResource?;
|
|
43
|
+
private domainsResource?;
|
|
43
44
|
constructor(options?: DropthisClientOptions | string);
|
|
44
45
|
get auth(): AuthResource;
|
|
45
46
|
get apiKeys(): ApiKeysResource;
|
|
@@ -47,6 +48,7 @@ declare class Dropthis {
|
|
|
47
48
|
get drops(): DropsResource<PublishInput>;
|
|
48
49
|
get deployments(): DeploymentsResource;
|
|
49
50
|
get uploads(): UploadsResource;
|
|
51
|
+
get domains(): DomainsResource;
|
|
50
52
|
prepare(input: PublishInput, options?: PublishOptions): Promise<PreparedPublishRequest>;
|
|
51
53
|
}
|
|
52
54
|
|
|
@@ -71,4 +73,4 @@ declare class PublishInputError extends Error {
|
|
|
71
73
|
constructor(code: string, message: string, param?: string | undefined, suggestion?: string | undefined);
|
|
72
74
|
}
|
|
73
75
|
|
|
74
|
-
export { CreateUploadSessionRequest, CreateUploadSessionResponse, DeploymentsResource, Dropthis, DropthisClientOptions, DropthisResult, PreparedPublishRequest, PublishInput, PublishInputError, PublishOptions, UploadSessionResponse, UploadsResource, createErrorResult, redactSecrets };
|
|
76
|
+
export { CreateUploadSessionRequest, CreateUploadSessionResponse, DeploymentsResource, DomainsResource, Dropthis, DropthisClientOptions, DropthisResult, PreparedPublishRequest, PublishInput, PublishInputError, PublishOptions, UploadSessionResponse, UploadsResource, createErrorResult, redactSecrets };
|