@masters-union/union-stack 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/uploader.ts","../src/client.ts"],"names":[],"mappings":"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","file":"chunk-I4NHLGGL.js","sourcesContent":["import type { UploadError, UploadErrorCode } from './types.js';\n\nexport function makeError(\n code: UploadErrorCode,\n message: string,\n opts: { status?: number; retryable?: boolean; cause?: unknown } = {}\n): UploadError {\n return {\n code,\n message,\n status: opts.status,\n retryable: opts.retryable ?? defaultRetryable(code, opts.status),\n cause: opts.cause,\n };\n}\n\nfunction defaultRetryable(code: UploadErrorCode, status?: number): boolean {\n if (code === 'NETWORK' || code === 'PART_FAILED') return true;\n if (code === 'SERVER' && status && status >= 500) return true;\n return false;\n}\n\n/** Map an HTTP error response from the cdn-be API to an UploadError. */\nexport function fromApiResponse(status: number, body: unknown): UploadError {\n const err = (body as { error?: { code?: string; message?: string } } | null)?.error;\n const msg = err?.message || `Request failed with status ${status}`;\n const code = (err?.code || '').toUpperCase();\n\n if (status === 401) {\n return makeError('AUTH', msg, { status, retryable: false });\n }\n if (status === 403) {\n return makeError('AUTH', msg, { status, retryable: false });\n }\n if (status === 413) {\n return makeError('VALIDATION', msg, { status, retryable: false });\n }\n if (status === 415) {\n return makeError('VALIDATION', msg, { status, retryable: false });\n }\n if (status === 429) {\n const isQuota = code === 'QUOTA_EXCEEDED';\n return makeError(isQuota ? 'QUOTA' : 'NETWORK', msg, { status, retryable: !isQuota });\n }\n if (status >= 500) {\n return makeError('SERVER', msg, { status, retryable: true });\n }\n return makeError('SERVER', msg, { status, retryable: false });\n}\n","import type {\n ResolvedClientConfig,\n PickedFile,\n PickerConfig,\n UploadedFile,\n UploadOptions,\n ProgressEvent as USProgressEvent,\n} from './types.js';\nimport { fromApiResponse, makeError } from './errors.js';\n\ninterface InitResponse {\n sessionId: string;\n fileId: string;\n chunkSize: number;\n totalParts: number;\n partUrls: Array<{ partNumber: number; url: string }>;\n expiresAt: string;\n}\n\ninterface CompleteResponse {\n handle: string;\n fileId: string;\n url: string;\n filename: string;\n mimetype: string;\n size: number;\n etag?: string;\n}\n\ninterface PartResult {\n partNumber: number;\n etag: string;\n size: number;\n}\n\nconst DEFAULT_CONCURRENCY = 3;\nconst DEFAULT_MAX_RETRIES_PER_PART = 3;\n// Backoff schedule between part retries. Capped — past this we surrender.\nconst BACKOFF_MS = [400, 1200, 3600];\n\nexport class Uploader {\n constructor(private cfg: ResolvedClientConfig) {}\n\n /** Returns a stable PickedFile descriptor for the input blob/file. */\n describe(file: File | Blob, opts: { filename?: string; mimeType?: string } = {}): PickedFile {\n const isFile = typeof File !== 'undefined' && file instanceof File;\n const filename =\n opts.filename ||\n (isFile ? (file as File).name : 'untitled');\n const mimetype =\n opts.mimeType || (file as Blob).type || 'application/octet-stream';\n return {\n uploadId: cryptoRandomId(),\n filename,\n mimetype,\n size: file.size,\n source: 'local',\n };\n }\n\n /**\n * Upload a single Blob/File. Returns the persisted UploadedFile.\n * Fires Filestack-style per-file callbacks from `opts`.\n */\n async upload(file: File | Blob, opts: UploadOptions = {}): Promise<UploadedFile> {\n const picked = this.describe(file, { filename: opts.filename, mimeType: opts.mimeType });\n opts.onFileUploadStarted?.(picked);\n\n try {\n const init = await this.initUpload(picked, opts);\n const parts = await this.uploadAllParts(file, init, picked, opts);\n const completed = await this.completeUpload(init.sessionId, parts, opts);\n\n const uploaded: UploadedFile = {\n ...picked,\n handle: completed.handle,\n fileId: completed.fileId,\n url: completed.url,\n size: completed.size,\n mimetype: completed.mimetype,\n filename: completed.filename,\n status: 'Stored',\n etag: completed.etag,\n };\n opts.onFileUploadFinished?.(uploaded);\n return uploaded;\n } catch (rawErr) {\n const err = normalizeError(rawErr);\n opts.onFileUploadFailed?.(picked, err);\n // Best effort: tell the server to clean up the multipart, but ignore failures.\n if ((rawErr as { sessionId?: string })?.sessionId) {\n this.abortSilently((rawErr as { sessionId: string }).sessionId).catch(() => {});\n }\n throw err;\n }\n }\n\n /** Cancel an in-flight session server-side. */\n async abort(sessionId: string): Promise<void> {\n await this.api('POST', '/sdk/v1/uploads/abort', { sessionId });\n }\n\n /** Fetch the server-managed picker config (branding, theme, constraints). */\n async fetchPickerConfig(): Promise<PickerConfig> {\n return this.api<PickerConfig>('GET', '/sdk/v1/picker-config');\n }\n\n private async initUpload(picked: PickedFile, opts: UploadOptions): Promise<InitResponse> {\n return this.api<InitResponse>('POST', '/sdk/v1/uploads/init', {\n filename: picked.filename,\n mimeType: picked.mimetype,\n size: picked.size,\n metadata: opts.metadata,\n }, opts.signal);\n }\n\n private async uploadAllParts(\n file: File | Blob,\n init: InitResponse,\n picked: PickedFile,\n opts: UploadOptions,\n ): Promise<PartResult[]> {\n const totalParts = init.totalParts;\n const chunkSize = init.chunkSize;\n const concurrency = Math.max(1, opts.concurrency ?? DEFAULT_CONCURRENCY);\n const maxRetries = opts.maxRetriesPerPart ?? DEFAULT_MAX_RETRIES_PER_PART;\n\n // Quick lookup: partNumber → presigned URL.\n const urlByPart = new Map(init.partUrls.map(p => [p.partNumber, p.url] as const));\n\n const results: PartResult[] = new Array(totalParts);\n const loadedPerPart: number[] = new Array(totalParts).fill(0);\n let cursor = 1;\n\n const totalBytes = file.size;\n\n const reportProgress = () => {\n const loaded = loadedPerPart.reduce((a, b) => a + b, 0);\n const totalPercent = totalBytes > 0 ? Math.min(100, Math.round((loaded / totalBytes) * 100)) : 100;\n const ev: USProgressEvent = { totalBytes, loaded, totalPercent };\n opts.onFileUploadProgress?.(picked, ev);\n };\n\n const worker = async (): Promise<void> => {\n while (true) {\n if (opts.signal?.aborted) {\n throw makeError('ABORTED', 'Upload aborted by caller.', { retryable: false });\n }\n const partNumber = cursor++;\n if (partNumber > totalParts) return;\n\n const start = (partNumber - 1) * chunkSize;\n const end = Math.min(start + chunkSize, file.size);\n const chunk = file.slice(start, end);\n\n let attempt = 0;\n let lastErr: unknown;\n while (attempt <= maxRetries) {\n if (opts.signal?.aborted) {\n throw makeError('ABORTED', 'Upload aborted by caller.', { retryable: false });\n }\n try {\n let url = urlByPart.get(partNumber);\n if (!url) {\n const refreshed = await this.api<{ url: string }>(\n 'POST', '/sdk/v1/uploads/sign-part',\n { sessionId: init.sessionId, partNumber }, opts.signal,\n );\n url = refreshed.url;\n urlByPart.set(partNumber, url);\n }\n\n const res = await this.cfg.fetch?.(url, {\n method: 'PUT',\n body: chunk,\n signal: opts.signal,\n }) ?? await fetch(url, { method: 'PUT', body: chunk, signal: opts.signal });\n\n if (!res.ok) {\n // If R2 rejects with 403 the URL likely expired — drop it so the\n // next attempt re-signs.\n if (res.status === 403 || res.status === 401) urlByPart.delete(partNumber);\n throw makeError('PART_FAILED', `Part ${partNumber} PUT failed (HTTP ${res.status})`, { status: res.status });\n }\n const etag = res.headers.get('etag');\n if (!etag) {\n throw makeError('PART_FAILED', `Part ${partNumber}: R2 did not return an ETag.`);\n }\n\n results[partNumber - 1] = { partNumber, etag, size: chunk.size };\n loadedPerPart[partNumber - 1] = chunk.size;\n reportProgress();\n break;\n } catch (err) {\n lastErr = err;\n attempt++;\n if (attempt > maxRetries) break;\n await sleep(BACKOFF_MS[Math.min(attempt - 1, BACKOFF_MS.length - 1)]);\n }\n }\n if (!results[partNumber - 1]) {\n throw withSessionId(\n normalizeError(lastErr ?? makeError('PART_FAILED', `Part ${partNumber} failed after ${maxRetries} retries.`)),\n init.sessionId,\n );\n }\n }\n };\n\n const workers = Array.from({ length: Math.min(concurrency, totalParts) }, worker);\n await Promise.all(workers);\n return results;\n }\n\n private async completeUpload(\n sessionId: string,\n parts: PartResult[],\n opts: UploadOptions,\n ): Promise<CompleteResponse> {\n return this.api<CompleteResponse>('POST', '/sdk/v1/uploads/complete', {\n sessionId,\n parts: parts.map(p => ({ partNumber: p.partNumber, etag: p.etag })),\n }, opts.signal);\n }\n\n private async abortSilently(sessionId: string): Promise<void> {\n try { await this.abort(sessionId); } catch { /* ignore */ }\n }\n\n private async api<T>(\n method: 'GET' | 'POST' | 'DELETE',\n path: string,\n body?: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n const fetchImpl = this.cfg.fetch ?? fetch;\n const url = `${this.cfg.apiBase}${path}`;\n let res: Response;\n try {\n res = await fetchImpl(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.cfg.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n signal,\n });\n } catch (cause) {\n if ((cause as Error)?.name === 'AbortError') {\n throw makeError('ABORTED', 'Request aborted.', { retryable: false, cause });\n }\n throw makeError('NETWORK', 'Network request failed.', { retryable: true, cause });\n }\n let parsed: unknown = null;\n try { parsed = await res.json(); } catch { /* tolerate empty body */ }\n if (!res.ok) throw fromApiResponse(res.status, parsed);\n return parsed as T;\n }\n}\n\nfunction cryptoRandomId(): string {\n // Cheap unique id for client-side uploadId. Not security-sensitive.\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return (crypto as { randomUUID: () => string }).randomUUID().replace(/-/g, '');\n }\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms));\n}\n\nfunction normalizeError(err: unknown): ReturnType<typeof makeError> {\n if (err && typeof err === 'object' && 'code' in err && 'message' in err && 'retryable' in err) {\n return err as ReturnType<typeof makeError>;\n }\n const msg = (err as Error)?.message || 'Upload failed.';\n return makeError('NETWORK', msg, { cause: err });\n}\n\nfunction withSessionId<T>(err: T, sessionId: string): T {\n if (err && typeof err === 'object') (err as { sessionId?: string }).sessionId = sessionId;\n return err;\n}\n","import type {\n ClientConfig,\n ResolvedClientConfig,\n UploadOptions,\n BatchUploadOptions,\n UploadedFile,\n PickResponse,\n PickedFile,\n PickerConfig,\n UploadError,\n} from './types.js';\nimport { Uploader } from './uploader.js';\nimport { makeError } from './errors.js';\n\n/**\n * UnionStack API URL baked into the SDK. Consumers never see or set this —\n * we ship a new SDK version if the URL ever changes.\n *\n * For local development against a staging backend, change this constant in\n * src/ and rebuild — no consumer-facing override exists by design.\n */\nconst API_BASE = 'https://cdn-api.mastersunion.org/cdn-api';\n\n// Forward-declared minimal handle so client.ts doesn't pull in the picker bundle.\nexport interface PickerHandleLike {\n open(): Promise<PickResponse>;\n close(): void;\n cancel(): void;\n}\n\nexport class UnionStackClient {\n private uploader: Uploader;\n private resolvedCfg: ResolvedClientConfig;\n /**\n * Promise that resolves to the server-managed picker config. Pre-fetched on\n * construction (unless `skipConfigPrefetch: true`) so the picker opens\n * without a network hit. Fails silently — picker falls back to defaults.\n */\n pickerConfigPromise: Promise<PickerConfig | null>;\n\n constructor(cfg: ClientConfig) {\n if (!cfg.apiKey) throw makeError('CONFIG', 'apiKey is required.', { retryable: false });\n this.resolvedCfg = { ...cfg, apiBase: API_BASE };\n this.uploader = new Uploader(this.resolvedCfg);\n this.pickerConfigPromise = this.resolvedCfg.skipConfigPrefetch\n ? Promise.resolve(null)\n : this.uploader.fetchPickerConfig().catch(() => null);\n }\n\n /** Upload a single file. Mirrors Filestack's `client.upload()`. */\n upload(file: File | Blob, opts: UploadOptions = {}): Promise<UploadedFile> {\n return this.uploader.upload(file, opts);\n }\n\n /**\n * Upload multiple files concurrently. Mirrors Filestack's batch behavior:\n * onUploadDone fires once even if some files failed — failures land in\n * `filesFailed`, successes in `filesUploaded`. `onError` is reserved for\n * batch-level failures (no files even started).\n */\n async uploadMany(\n files: (File | Blob)[],\n opts: BatchUploadOptions = {},\n ): Promise<PickResponse> {\n if (!Array.isArray(files) || files.length === 0) {\n const err = makeError('VALIDATION', 'uploadMany requires a non-empty array of files.', { retryable: false });\n opts.onError?.(err);\n throw err;\n }\n\n const picked: PickedFile[] = files.map(f =>\n this.uploader.describe(f, { filename: opts.filename, mimeType: opts.mimeType })\n );\n opts.onUploadStarted?.(picked);\n\n const filesUploaded: UploadedFile[] = [];\n const filesFailed: Array<{ file: PickedFile; error: UploadError }> = [];\n\n // Process per-file in parallel; the per-part concurrency from `opts` still\n // applies inside each upload.\n await Promise.all(files.map(async (f, i) => {\n try {\n const uploaded = await this.uploader.upload(f, opts);\n // Sync the uploadId so callers can correlate picked → uploaded.\n uploaded.uploadId = picked[i].uploadId;\n filesUploaded.push(uploaded);\n } catch (err) {\n filesFailed.push({ file: picked[i], error: err as UploadError });\n }\n }));\n\n const result: PickResponse = { filesUploaded, filesFailed };\n opts.onUploadDone?.(result);\n return result;\n }\n\n /**\n * Open the file picker modal. Lazy-loads the picker bundle so the core\n * SDK stays small for callers that only use `upload()` directly.\n */\n picker(opts: import('./picker/types.js').PickerOptions = {}): PickerHandleLike {\n let real: PickerHandleLike | null = null;\n let opened = false;\n let pendingResolve!: (r: PickResponse) => void;\n let pendingReject!: (e: UploadError) => void;\n const donePromise = new Promise<PickResponse>((res, rej) => {\n pendingResolve = res; pendingReject = rej;\n });\n\n return {\n open: async () => {\n if (opened) return donePromise;\n opened = true;\n try {\n const mod = await import('./picker/index.js');\n real = mod.openPicker(this, opts);\n const result = await real.open();\n pendingResolve(result);\n return result;\n } catch (err) {\n const e = (err as UploadError)?.code\n ? (err as UploadError)\n : makeError('CONFIG', 'Failed to load picker.', { retryable: false, cause: err });\n pendingReject(e);\n throw e;\n }\n },\n close: () => { real?.close(); },\n cancel: () => { real?.cancel(); },\n };\n }\n\n /** Read-only accessor used by the React/picker packages. */\n get config(): Readonly<ResolvedClientConfig> { return this.resolvedCfg; }\n}\n"]}
@@ -67,8 +67,6 @@ interface BatchUploadOptions extends UploadOptions {
67
67
  interface ClientConfig {
68
68
  /** UnionStack API key, e.g. `unionstack_live_xxx`. */
69
69
  apiKey: string;
70
- /** Base URL of the cdn-be API. e.g. `https://api.unionstack.com/cdn-api` */
71
- apiBase: string;
72
70
  /** Override the upload chunk size in bytes (server may still cap this). */
73
71
  chunkSize?: number;
74
72
  /** Custom fetch impl — useful for testing / non-browser environments. */
@@ -79,6 +77,13 @@ interface ClientConfig {
79
77
  */
80
78
  skipConfigPrefetch?: boolean;
81
79
  }
80
+ /**
81
+ * Internal config with the API base resolved. Not exported from the package —
82
+ * consumers should never need to think about the URL the SDK calls.
83
+ */
84
+ interface ResolvedClientConfig extends ClientConfig {
85
+ apiBase: string;
86
+ }
82
87
  /** Server-managed picker chrome + upload constraints fetched on init(). */
83
88
  interface PickerConfig {
84
89
  branding: {
@@ -158,8 +163,8 @@ interface PickerHandleLike {
158
163
  cancel(): void;
159
164
  }
160
165
  declare class UnionStackClient {
161
- private cfg;
162
166
  private uploader;
167
+ private resolvedCfg;
163
168
  /**
164
169
  * Promise that resolves to the server-managed picker config. Pre-fetched on
165
170
  * construction (unless `skipConfigPrefetch: true`) so the picker opens
@@ -182,7 +187,7 @@ declare class UnionStackClient {
182
187
  */
183
188
  picker(opts?: PickerOptions): PickerHandleLike;
184
189
  /** Read-only accessor used by the React/picker packages. */
185
- get config(): Readonly<ClientConfig>;
190
+ get config(): Readonly<ResolvedClientConfig>;
186
191
  }
187
192
 
188
193
  export { type BatchUploadOptions as B, type ClientConfig as C, type PickResponse as P, type Source as S, UnionStackClient as U, type PickedFile as a, type ProgressEvent as b, type UploadError as c, type UploadErrorCode as d, type UploadOptions as e, type UploadedFile as f, type PickerOptions as g, type PickerHandle as h, type PickerBranding as i, type PickerTheme as j };
@@ -67,8 +67,6 @@ interface BatchUploadOptions extends UploadOptions {
67
67
  interface ClientConfig {
68
68
  /** UnionStack API key, e.g. `unionstack_live_xxx`. */
69
69
  apiKey: string;
70
- /** Base URL of the cdn-be API. e.g. `https://api.unionstack.com/cdn-api` */
71
- apiBase: string;
72
70
  /** Override the upload chunk size in bytes (server may still cap this). */
73
71
  chunkSize?: number;
74
72
  /** Custom fetch impl — useful for testing / non-browser environments. */
@@ -79,6 +77,13 @@ interface ClientConfig {
79
77
  */
80
78
  skipConfigPrefetch?: boolean;
81
79
  }
80
+ /**
81
+ * Internal config with the API base resolved. Not exported from the package —
82
+ * consumers should never need to think about the URL the SDK calls.
83
+ */
84
+ interface ResolvedClientConfig extends ClientConfig {
85
+ apiBase: string;
86
+ }
82
87
  /** Server-managed picker chrome + upload constraints fetched on init(). */
83
88
  interface PickerConfig {
84
89
  branding: {
@@ -158,8 +163,8 @@ interface PickerHandleLike {
158
163
  cancel(): void;
159
164
  }
160
165
  declare class UnionStackClient {
161
- private cfg;
162
166
  private uploader;
167
+ private resolvedCfg;
163
168
  /**
164
169
  * Promise that resolves to the server-managed picker config. Pre-fetched on
165
170
  * construction (unless `skipConfigPrefetch: true`) so the picker opens
@@ -182,7 +187,7 @@ declare class UnionStackClient {
182
187
  */
183
188
  picker(opts?: PickerOptions): PickerHandleLike;
184
189
  /** Read-only accessor used by the React/picker packages. */
185
- get config(): Readonly<ClientConfig>;
190
+ get config(): Readonly<ResolvedClientConfig>;
186
191
  }
187
192
 
188
193
  export { type BatchUploadOptions as B, type ClientConfig as C, type PickResponse as P, type Source as S, UnionStackClient as U, type PickedFile as a, type ProgressEvent as b, type UploadError as c, type UploadErrorCode as d, type UploadOptions as e, type UploadedFile as f, type PickerOptions as g, type PickerHandle as h, type PickerBranding as i, type PickerTheme as j };
package/dist/index.cjs CHANGED
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var chunkQE2P5WH4_cjs = require('./chunk-QE2P5WH4.cjs');
3
+ var chunk445C5G3Q_cjs = require('./chunk-445C5G3Q.cjs');
4
4
 
5
5
  // src/index.ts
6
6
  var UnionStack = {
7
7
  init(cfg) {
8
- return new chunkQE2P5WH4_cjs.UnionStackClient(cfg);
8
+ return new chunk445C5G3Q_cjs.UnionStackClient(cfg);
9
9
  }
10
10
  };
11
11
 
12
12
  Object.defineProperty(exports, "UnionStackClient", {
13
13
  enumerable: true,
14
- get: function () { return chunkQE2P5WH4_cjs.UnionStackClient; }
14
+ get: function () { return chunk445C5G3Q_cjs.UnionStackClient; }
15
15
  });
16
16
  exports.UnionStack = UnionStack;
17
17
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["UnionStackClient"],"mappings":";;;;;AAaO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAK,GAAA,EAAqC;AACxC,IAAA,OAAO,IAAIA,mCAAiB,GAAG,CAAA;AAAA,EACjC;AACF","file":"index.cjs","sourcesContent":["import { UnionStackClient } from './client.js';\nimport type { ClientConfig } from './types.js';\n\n/**\n * UnionStack — file upload SDK.\n *\n * import { UnionStack } from '@masters-union/union-stack';\n * const client = UnionStack.init({\n * apiKey: 'unionstack_live_…',\n * apiBase: 'https://api.unionstack.com/cdn-api',\n * });\n * const uploaded = await client.upload(file, { onFileUploadProgress: … });\n */\nexport const UnionStack = {\n init(cfg: ClientConfig): UnionStackClient {\n return new UnionStackClient(cfg);\n },\n};\n\nexport { UnionStackClient } from './client.js';\nexport type {\n ClientConfig,\n UploadOptions,\n BatchUploadOptions,\n PickedFile,\n UploadedFile,\n ProgressEvent,\n PickResponse,\n UploadError,\n UploadErrorCode,\n Source,\n} from './types.js';\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["UnionStackClient"],"mappings":";;;;;AAGO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAK,GAAA,EAAqC;AACxC,IAAA,OAAO,IAAIA,mCAAiB,GAAG,CAAA;AAAA,EACjC;AACF","file":"index.cjs","sourcesContent":["import { UnionStackClient } from './client.js';\nimport type { ClientConfig } from './types.js';\n\nexport const UnionStack = {\n init(cfg: ClientConfig): UnionStackClient {\n return new UnionStackClient(cfg);\n },\n};\n\nexport { UnionStackClient } from './client.js';\nexport type {\n ClientConfig,\n UploadOptions,\n BatchUploadOptions,\n PickedFile,\n UploadedFile,\n ProgressEvent,\n PickResponse,\n UploadError,\n UploadErrorCode,\n Source,\n} from './types.js';\n"]}
package/dist/index.d.cts CHANGED
@@ -1,16 +1,6 @@
1
- import { C as ClientConfig, U as UnionStackClient } from './client-xFfk4uu4.cjs';
2
- export { B as BatchUploadOptions, P as PickResponse, a as PickedFile, b as ProgressEvent, S as Source, c as UploadError, d as UploadErrorCode, e as UploadOptions, f as UploadedFile } from './client-xFfk4uu4.cjs';
1
+ import { C as ClientConfig, U as UnionStackClient } from './client-DrOHTZ94.cjs';
2
+ export { B as BatchUploadOptions, P as PickResponse, a as PickedFile, b as ProgressEvent, S as Source, c as UploadError, d as UploadErrorCode, e as UploadOptions, f as UploadedFile } from './client-DrOHTZ94.cjs';
3
3
 
4
- /**
5
- * UnionStack — file upload SDK.
6
- *
7
- * import { UnionStack } from '@masters-union/union-stack';
8
- * const client = UnionStack.init({
9
- * apiKey: 'unionstack_live_…',
10
- * apiBase: 'https://api.unionstack.com/cdn-api',
11
- * });
12
- * const uploaded = await client.upload(file, { onFileUploadProgress: … });
13
- */
14
4
  declare const UnionStack: {
15
5
  init(cfg: ClientConfig): UnionStackClient;
16
6
  };
package/dist/index.d.ts CHANGED
@@ -1,16 +1,6 @@
1
- import { C as ClientConfig, U as UnionStackClient } from './client-xFfk4uu4.js';
2
- export { B as BatchUploadOptions, P as PickResponse, a as PickedFile, b as ProgressEvent, S as Source, c as UploadError, d as UploadErrorCode, e as UploadOptions, f as UploadedFile } from './client-xFfk4uu4.js';
1
+ import { C as ClientConfig, U as UnionStackClient } from './client-DrOHTZ94.js';
2
+ export { B as BatchUploadOptions, P as PickResponse, a as PickedFile, b as ProgressEvent, S as Source, c as UploadError, d as UploadErrorCode, e as UploadOptions, f as UploadedFile } from './client-DrOHTZ94.js';
3
3
 
4
- /**
5
- * UnionStack — file upload SDK.
6
- *
7
- * import { UnionStack } from '@masters-union/union-stack';
8
- * const client = UnionStack.init({
9
- * apiKey: 'unionstack_live_…',
10
- * apiBase: 'https://api.unionstack.com/cdn-api',
11
- * });
12
- * const uploaded = await client.upload(file, { onFileUploadProgress: … });
13
- */
14
4
  declare const UnionStack: {
15
5
  init(cfg: ClientConfig): UnionStackClient;
16
6
  };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { UnionStackClient } from './chunk-5Q2UADFS.js';
2
- export { UnionStackClient } from './chunk-5Q2UADFS.js';
1
+ import { UnionStackClient } from './chunk-I4NHLGGL.js';
2
+ export { UnionStackClient } from './chunk-I4NHLGGL.js';
3
3
 
4
4
  // src/index.ts
5
5
  var UnionStack = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;AAaO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAK,GAAA,EAAqC;AACxC,IAAA,OAAO,IAAI,iBAAiB,GAAG,CAAA;AAAA,EACjC;AACF","file":"index.js","sourcesContent":["import { UnionStackClient } from './client.js';\nimport type { ClientConfig } from './types.js';\n\n/**\n * UnionStack — file upload SDK.\n *\n * import { UnionStack } from '@masters-union/union-stack';\n * const client = UnionStack.init({\n * apiKey: 'unionstack_live_…',\n * apiBase: 'https://api.unionstack.com/cdn-api',\n * });\n * const uploaded = await client.upload(file, { onFileUploadProgress: … });\n */\nexport const UnionStack = {\n init(cfg: ClientConfig): UnionStackClient {\n return new UnionStackClient(cfg);\n },\n};\n\nexport { UnionStackClient } from './client.js';\nexport type {\n ClientConfig,\n UploadOptions,\n BatchUploadOptions,\n PickedFile,\n UploadedFile,\n ProgressEvent,\n PickResponse,\n UploadError,\n UploadErrorCode,\n Source,\n} from './types.js';\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;AAGO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAK,GAAA,EAAqC;AACxC,IAAA,OAAO,IAAI,iBAAiB,GAAG,CAAA;AAAA,EACjC;AACF","file":"index.js","sourcesContent":["import { UnionStackClient } from './client.js';\nimport type { ClientConfig } from './types.js';\n\nexport const UnionStack = {\n init(cfg: ClientConfig): UnionStackClient {\n return new UnionStackClient(cfg);\n },\n};\n\nexport { UnionStackClient } from './client.js';\nexport type {\n ClientConfig,\n UploadOptions,\n BatchUploadOptions,\n PickedFile,\n UploadedFile,\n ProgressEvent,\n PickResponse,\n UploadError,\n UploadErrorCode,\n Source,\n} from './types.js';\n"]}
package/dist/picker.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { U as UnionStackClient, g as PickerOptions, P as PickResponse, h as PickerHandle } from './client-xFfk4uu4.cjs';
2
- export { i as PickerBranding, j as PickerTheme } from './client-xFfk4uu4.cjs';
1
+ import { U as UnionStackClient, g as PickerOptions, P as PickResponse, h as PickerHandle } from './client-DrOHTZ94.cjs';
2
+ export { i as PickerBranding, j as PickerTheme } from './client-DrOHTZ94.cjs';
3
3
 
4
4
  /**
5
5
  * Single-shot file picker modal. Built imperatively (no framework) so it can
package/dist/picker.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { U as UnionStackClient, g as PickerOptions, P as PickResponse, h as PickerHandle } from './client-xFfk4uu4.js';
2
- export { i as PickerBranding, j as PickerTheme } from './client-xFfk4uu4.js';
1
+ import { U as UnionStackClient, g as PickerOptions, P as PickResponse, h as PickerHandle } from './client-DrOHTZ94.js';
2
+ export { i as PickerBranding, j as PickerTheme } from './client-DrOHTZ94.js';
3
3
 
4
4
  /**
5
5
  * Single-shot file picker modal. Built imperatively (no framework) so it can
package/dist/react.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkQE2P5WH4_cjs = require('./chunk-QE2P5WH4.cjs');
3
+ var chunk445C5G3Q_cjs = require('./chunk-445C5G3Q.cjs');
4
4
  var React3 = require('react');
5
5
 
6
6
  function _interopNamespace(e) {
@@ -26,9 +26,9 @@ var React3__namespace = /*#__PURE__*/_interopNamespace(React3);
26
26
  var UnionStackContext = React3__namespace.createContext(null);
27
27
  function UnionStackProvider({ children, ...cfg }) {
28
28
  const client = React3__namespace.useMemo(
29
- () => new chunkQE2P5WH4_cjs.UnionStackClient(cfg),
29
+ () => new chunk445C5G3Q_cjs.UnionStackClient(cfg),
30
30
  // eslint-disable-next-line react-hooks/exhaustive-deps
31
- [cfg.apiKey, cfg.apiBase, cfg.chunkSize]
31
+ [cfg.apiKey, cfg.chunkSize]
32
32
  );
33
33
  return React3__namespace.createElement(UnionStackContext.Provider, { value: client }, children);
34
34
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/provider.tsx","../src/react/useUploader.ts","../src/react/UnionStackPicker.tsx"],"names":["React","UnionStackClient","React2","React3"],"mappings":"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","file":"react.cjs","sourcesContent":["import * as React from 'react';\nimport { UnionStackClient } from '../client.js';\nimport type { ClientConfig } from '../types.js';\n\nconst UnionStackContext = React.createContext<UnionStackClient | null>(null);\n\nexport interface UnionStackProviderProps extends ClientConfig {\n children: React.ReactNode;\n}\n\n/**\n * Provide an SDK client to the React tree.\n *\n * <UnionStackProvider apiKey=\"unionstack_live_…\" apiBase=\"…\">\n * <App />\n * </UnionStackProvider>\n */\nexport function UnionStackProvider({ children, ...cfg }: UnionStackProviderProps) {\n // Re-create the client when apiKey or apiBase changes; otherwise keep stable.\n const client = React.useMemo(\n () => new UnionStackClient(cfg),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [cfg.apiKey, cfg.apiBase, cfg.chunkSize],\n );\n return React.createElement(UnionStackContext.Provider, { value: client }, children);\n}\n\nexport function useUnionStack(): UnionStackClient {\n const ctx = React.useContext(UnionStackContext);\n if (!ctx) {\n throw new Error(\n '[union-stack] useUnionStack/useUploader must be used inside <UnionStackProvider>.',\n );\n }\n return ctx;\n}\n","import * as React from 'react';\nimport { useUnionStack } from './provider.js';\nimport type {\n BatchUploadOptions,\n PickedFile,\n PickResponse,\n ProgressEvent as USProgressEvent,\n UploadError,\n UploadedFile,\n} from '../types.js';\n\nexport interface UseUploaderState {\n /** True between `upload()` start and its terminal callback. */\n isUploading: boolean;\n /** 0-100, averaged across files in a batch. */\n progress: number;\n /** Files that successfully uploaded — populated as each completes. */\n uploaded: UploadedFile[];\n /** Files that failed — populated as each fails. */\n failed: Array<{ file: PickedFile; error: UploadError }>;\n /** Terminal error for the *batch* (auth fail etc.). Per-file errors land in `failed`. */\n error: UploadError | null;\n}\n\nexport interface UseUploaderResult extends UseUploaderState {\n /** Upload one or more files. Returns the same PickResponse shape as the SDK. */\n upload: (files: File | Blob | (File | Blob)[], opts?: BatchUploadOptions) => Promise<PickResponse>;\n /** Cancel any in-flight uploads from this hook. */\n cancel: () => void;\n /** Reset state to initial. */\n reset: () => void;\n}\n\nconst INITIAL_STATE: UseUploaderState = {\n isUploading: false,\n progress: 0,\n uploaded: [],\n failed: [],\n error: null,\n};\n\n/**\n * React hook wrapping `client.uploadMany`. Tracks aggregate progress,\n * accumulates uploaded/failed lists, and exposes a cancel handle.\n *\n * const { upload, isUploading, progress, uploaded } = useUploader();\n * <input type=\"file\" onChange={(e) => upload(e.target.files![0])} />\n */\nexport function useUploader(globalOpts: BatchUploadOptions = {}): UseUploaderResult {\n const client = useUnionStack();\n const [state, setState] = React.useState<UseUploaderState>(INITIAL_STATE);\n const abortRef = React.useRef<AbortController | null>(null);\n\n // Track in-flight progress per file so we can compute an aggregate.\n const progressRef = React.useRef<Map<string, { totalBytes: number; loaded: number }>>(new Map());\n\n const updateAggregateProgress = React.useCallback(() => {\n let total = 0, loaded = 0;\n progressRef.current.forEach(v => { total += v.totalBytes; loaded += v.loaded; });\n const pct = total > 0 ? Math.min(100, Math.round((loaded / total) * 100)) : 0;\n setState(s => ({ ...s, progress: pct }));\n }, []);\n\n const upload = React.useCallback(async (\n input: File | Blob | (File | Blob)[],\n opts: BatchUploadOptions = {},\n ): Promise<PickResponse> => {\n const files = Array.isArray(input) ? input : [input];\n const ctrl = new AbortController();\n abortRef.current = ctrl;\n progressRef.current = new Map();\n setState({ ...INITIAL_STATE, isUploading: true });\n\n const wrappedOpts: BatchUploadOptions = {\n ...globalOpts,\n ...opts,\n signal: opts.signal ?? ctrl.signal,\n onUploadStarted: (fs) => {\n fs.forEach(f => progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: 0 }));\n opts.onUploadStarted?.(fs);\n globalOpts.onUploadStarted?.(fs);\n },\n onFileUploadStarted: (f) => {\n opts.onFileUploadStarted?.(f);\n globalOpts.onFileUploadStarted?.(f);\n },\n onFileUploadProgress: (f, ev: USProgressEvent) => {\n progressRef.current.set(f.uploadId, { totalBytes: ev.totalBytes, loaded: ev.loaded });\n updateAggregateProgress();\n opts.onFileUploadProgress?.(f, ev);\n globalOpts.onFileUploadProgress?.(f, ev);\n },\n onFileUploadFinished: (f) => {\n progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: f.size });\n updateAggregateProgress();\n setState(s => ({ ...s, uploaded: [...s.uploaded, f] }));\n opts.onFileUploadFinished?.(f);\n globalOpts.onFileUploadFinished?.(f);\n },\n onFileUploadFailed: (f, error) => {\n // Treat failed bytes as \"fully accounted for\" so aggregate progress completes.\n progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: f.size });\n updateAggregateProgress();\n setState(s => ({ ...s, failed: [...s.failed, { file: f, error }] }));\n opts.onFileUploadFailed?.(f, error);\n globalOpts.onFileUploadFailed?.(f, error);\n },\n onUploadDone: (result) => {\n setState(s => ({ ...s, isUploading: false }));\n opts.onUploadDone?.(result);\n globalOpts.onUploadDone?.(result);\n },\n onError: (err) => {\n setState(s => ({ ...s, isUploading: false, error: err }));\n opts.onError?.(err);\n },\n };\n\n try {\n return await client.uploadMany(files, wrappedOpts);\n } catch (err) {\n setState(s => ({ ...s, isUploading: false, error: err as UploadError }));\n throw err;\n }\n }, [client, globalOpts, updateAggregateProgress]);\n\n const cancel = React.useCallback(() => {\n abortRef.current?.abort();\n setState(s => ({ ...s, isUploading: false }));\n }, []);\n\n const reset = React.useCallback(() => {\n progressRef.current = new Map();\n setState(INITIAL_STATE);\n }, []);\n\n return { ...state, upload, cancel, reset };\n}\n","import * as React from 'react';\nimport { useUnionStack } from './provider.js';\nimport type { PickerOptions, PickerHandle } from '../picker/types.js';\n\nexport interface UnionStackPickerProps extends PickerOptions {\n /**\n * Render-prop receives an `open()` function the caller wires to a button\n * or any other trigger.\n *\n * <UnionStackPicker onUploadDone={…}>\n * {({ open }) => <button onClick={open}>Upload</button>}\n * </UnionStackPicker>\n */\n children: (api: { open: () => Promise<void>; close: () => void; cancel: () => void }) => React.ReactNode;\n}\n\n/**\n * React wrapper around `client.picker()`. The picker bundle is lazy-loaded\n * the first time `open()` is called — the component itself is just a\n * render-prop and doesn't pull in the modal code at import time.\n */\nexport function UnionStackPicker(props: UnionStackPickerProps): React.ReactElement {\n const client = useUnionStack();\n const handleRef = React.useRef<PickerHandle | null>(null);\n\n // Stabilize the latest options without re-creating the handle on every render.\n const optsRef = React.useRef(props);\n optsRef.current = props;\n\n const open = React.useCallback(async () => {\n const { children: _children, ...opts } = optsRef.current;\n handleRef.current = client.picker(opts) as PickerHandle;\n await handleRef.current.open();\n }, [client]);\n\n const close = React.useCallback(() => { handleRef.current?.close(); }, []);\n const cancel = React.useCallback(() => { handleRef.current?.cancel(); }, []);\n\n // Make sure we tear down the modal if the component unmounts mid-upload.\n React.useEffect(() => () => { handleRef.current?.close(); }, []);\n\n return React.createElement(React.Fragment, null, props.children({ open, close, cancel }));\n}\n"]}
1
+ {"version":3,"sources":["../src/react/provider.tsx","../src/react/useUploader.ts","../src/react/UnionStackPicker.tsx"],"names":["React","UnionStackClient","React2","React3"],"mappings":"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","file":"react.cjs","sourcesContent":["import * as React from 'react';\nimport { UnionStackClient } from '../client.js';\nimport type { ClientConfig } from '../types.js';\n\nconst UnionStackContext = React.createContext<UnionStackClient | null>(null);\n\nexport interface UnionStackProviderProps extends ClientConfig {\n children: React.ReactNode;\n}\n\n/**\n * Provide an SDK client to the React tree.\n *\n * <UnionStackProvider apiKey=\"unionstack_live_…\" apiBase=\"…\">\n * <App />\n * </UnionStackProvider>\n */\nexport function UnionStackProvider({ children, ...cfg }: UnionStackProviderProps) {\n // Re-create the client when apiKey changes; otherwise keep stable.\n const client = React.useMemo(\n () => new UnionStackClient(cfg),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [cfg.apiKey, cfg.chunkSize],\n );\n return React.createElement(UnionStackContext.Provider, { value: client }, children);\n}\n\nexport function useUnionStack(): UnionStackClient {\n const ctx = React.useContext(UnionStackContext);\n if (!ctx) {\n throw new Error(\n '[union-stack] useUnionStack/useUploader must be used inside <UnionStackProvider>.',\n );\n }\n return ctx;\n}\n","import * as React from 'react';\nimport { useUnionStack } from './provider.js';\nimport type {\n BatchUploadOptions,\n PickedFile,\n PickResponse,\n ProgressEvent as USProgressEvent,\n UploadError,\n UploadedFile,\n} from '../types.js';\n\nexport interface UseUploaderState {\n /** True between `upload()` start and its terminal callback. */\n isUploading: boolean;\n /** 0-100, averaged across files in a batch. */\n progress: number;\n /** Files that successfully uploaded — populated as each completes. */\n uploaded: UploadedFile[];\n /** Files that failed — populated as each fails. */\n failed: Array<{ file: PickedFile; error: UploadError }>;\n /** Terminal error for the *batch* (auth fail etc.). Per-file errors land in `failed`. */\n error: UploadError | null;\n}\n\nexport interface UseUploaderResult extends UseUploaderState {\n /** Upload one or more files. Returns the same PickResponse shape as the SDK. */\n upload: (files: File | Blob | (File | Blob)[], opts?: BatchUploadOptions) => Promise<PickResponse>;\n /** Cancel any in-flight uploads from this hook. */\n cancel: () => void;\n /** Reset state to initial. */\n reset: () => void;\n}\n\nconst INITIAL_STATE: UseUploaderState = {\n isUploading: false,\n progress: 0,\n uploaded: [],\n failed: [],\n error: null,\n};\n\n/**\n * React hook wrapping `client.uploadMany`. Tracks aggregate progress,\n * accumulates uploaded/failed lists, and exposes a cancel handle.\n *\n * const { upload, isUploading, progress, uploaded } = useUploader();\n * <input type=\"file\" onChange={(e) => upload(e.target.files![0])} />\n */\nexport function useUploader(globalOpts: BatchUploadOptions = {}): UseUploaderResult {\n const client = useUnionStack();\n const [state, setState] = React.useState<UseUploaderState>(INITIAL_STATE);\n const abortRef = React.useRef<AbortController | null>(null);\n\n // Track in-flight progress per file so we can compute an aggregate.\n const progressRef = React.useRef<Map<string, { totalBytes: number; loaded: number }>>(new Map());\n\n const updateAggregateProgress = React.useCallback(() => {\n let total = 0, loaded = 0;\n progressRef.current.forEach(v => { total += v.totalBytes; loaded += v.loaded; });\n const pct = total > 0 ? Math.min(100, Math.round((loaded / total) * 100)) : 0;\n setState(s => ({ ...s, progress: pct }));\n }, []);\n\n const upload = React.useCallback(async (\n input: File | Blob | (File | Blob)[],\n opts: BatchUploadOptions = {},\n ): Promise<PickResponse> => {\n const files = Array.isArray(input) ? input : [input];\n const ctrl = new AbortController();\n abortRef.current = ctrl;\n progressRef.current = new Map();\n setState({ ...INITIAL_STATE, isUploading: true });\n\n const wrappedOpts: BatchUploadOptions = {\n ...globalOpts,\n ...opts,\n signal: opts.signal ?? ctrl.signal,\n onUploadStarted: (fs) => {\n fs.forEach(f => progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: 0 }));\n opts.onUploadStarted?.(fs);\n globalOpts.onUploadStarted?.(fs);\n },\n onFileUploadStarted: (f) => {\n opts.onFileUploadStarted?.(f);\n globalOpts.onFileUploadStarted?.(f);\n },\n onFileUploadProgress: (f, ev: USProgressEvent) => {\n progressRef.current.set(f.uploadId, { totalBytes: ev.totalBytes, loaded: ev.loaded });\n updateAggregateProgress();\n opts.onFileUploadProgress?.(f, ev);\n globalOpts.onFileUploadProgress?.(f, ev);\n },\n onFileUploadFinished: (f) => {\n progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: f.size });\n updateAggregateProgress();\n setState(s => ({ ...s, uploaded: [...s.uploaded, f] }));\n opts.onFileUploadFinished?.(f);\n globalOpts.onFileUploadFinished?.(f);\n },\n onFileUploadFailed: (f, error) => {\n // Treat failed bytes as \"fully accounted for\" so aggregate progress completes.\n progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: f.size });\n updateAggregateProgress();\n setState(s => ({ ...s, failed: [...s.failed, { file: f, error }] }));\n opts.onFileUploadFailed?.(f, error);\n globalOpts.onFileUploadFailed?.(f, error);\n },\n onUploadDone: (result) => {\n setState(s => ({ ...s, isUploading: false }));\n opts.onUploadDone?.(result);\n globalOpts.onUploadDone?.(result);\n },\n onError: (err) => {\n setState(s => ({ ...s, isUploading: false, error: err }));\n opts.onError?.(err);\n },\n };\n\n try {\n return await client.uploadMany(files, wrappedOpts);\n } catch (err) {\n setState(s => ({ ...s, isUploading: false, error: err as UploadError }));\n throw err;\n }\n }, [client, globalOpts, updateAggregateProgress]);\n\n const cancel = React.useCallback(() => {\n abortRef.current?.abort();\n setState(s => ({ ...s, isUploading: false }));\n }, []);\n\n const reset = React.useCallback(() => {\n progressRef.current = new Map();\n setState(INITIAL_STATE);\n }, []);\n\n return { ...state, upload, cancel, reset };\n}\n","import * as React from 'react';\nimport { useUnionStack } from './provider.js';\nimport type { PickerOptions, PickerHandle } from '../picker/types.js';\n\nexport interface UnionStackPickerProps extends PickerOptions {\n /**\n * Render-prop receives an `open()` function the caller wires to a button\n * or any other trigger.\n *\n * <UnionStackPicker onUploadDone={…}>\n * {({ open }) => <button onClick={open}>Upload</button>}\n * </UnionStackPicker>\n */\n children: (api: { open: () => Promise<void>; close: () => void; cancel: () => void }) => React.ReactNode;\n}\n\n/**\n * React wrapper around `client.picker()`. The picker bundle is lazy-loaded\n * the first time `open()` is called — the component itself is just a\n * render-prop and doesn't pull in the modal code at import time.\n */\nexport function UnionStackPicker(props: UnionStackPickerProps): React.ReactElement {\n const client = useUnionStack();\n const handleRef = React.useRef<PickerHandle | null>(null);\n\n // Stabilize the latest options without re-creating the handle on every render.\n const optsRef = React.useRef(props);\n optsRef.current = props;\n\n const open = React.useCallback(async () => {\n const { children: _children, ...opts } = optsRef.current;\n handleRef.current = client.picker(opts) as PickerHandle;\n await handleRef.current.open();\n }, [client]);\n\n const close = React.useCallback(() => { handleRef.current?.close(); }, []);\n const cancel = React.useCallback(() => { handleRef.current?.cancel(); }, []);\n\n // Make sure we tear down the modal if the component unmounts mid-upload.\n React.useEffect(() => () => { handleRef.current?.close(); }, []);\n\n return React.createElement(React.Fragment, null, props.children({ open, close, cancel }));\n}\n"]}
package/dist/react.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
- import { C as ClientConfig, U as UnionStackClient, f as UploadedFile, a as PickedFile, c as UploadError, B as BatchUploadOptions, P as PickResponse, g as PickerOptions } from './client-xFfk4uu4.cjs';
3
- export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-xFfk4uu4.cjs';
2
+ import { C as ClientConfig, U as UnionStackClient, f as UploadedFile, a as PickedFile, c as UploadError, B as BatchUploadOptions, P as PickResponse, g as PickerOptions } from './client-DrOHTZ94.cjs';
3
+ export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-DrOHTZ94.cjs';
4
4
 
5
5
  interface UnionStackProviderProps extends ClientConfig {
6
6
  children: React.ReactNode;
package/dist/react.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
- import { C as ClientConfig, U as UnionStackClient, f as UploadedFile, a as PickedFile, c as UploadError, B as BatchUploadOptions, P as PickResponse, g as PickerOptions } from './client-xFfk4uu4.js';
3
- export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-xFfk4uu4.js';
2
+ import { C as ClientConfig, U as UnionStackClient, f as UploadedFile, a as PickedFile, c as UploadError, B as BatchUploadOptions, P as PickResponse, g as PickerOptions } from './client-DrOHTZ94.js';
3
+ export { i as PickerBranding, h as PickerHandle, j as PickerTheme, b as ProgressEvent, d as UploadErrorCode, e as UploadOptions } from './client-DrOHTZ94.js';
4
4
 
5
5
  interface UnionStackProviderProps extends ClientConfig {
6
6
  children: React.ReactNode;
package/dist/react.js CHANGED
@@ -1,4 +1,4 @@
1
- import { UnionStackClient } from './chunk-5Q2UADFS.js';
1
+ import { UnionStackClient } from './chunk-I4NHLGGL.js';
2
2
  import * as React3 from 'react';
3
3
 
4
4
  var UnionStackContext = React3.createContext(null);
@@ -6,7 +6,7 @@ function UnionStackProvider({ children, ...cfg }) {
6
6
  const client = React3.useMemo(
7
7
  () => new UnionStackClient(cfg),
8
8
  // eslint-disable-next-line react-hooks/exhaustive-deps
9
- [cfg.apiKey, cfg.apiBase, cfg.chunkSize]
9
+ [cfg.apiKey, cfg.chunkSize]
10
10
  );
11
11
  return React3.createElement(UnionStackContext.Provider, { value: client }, children);
12
12
  }
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/provider.tsx","../src/react/useUploader.ts","../src/react/UnionStackPicker.tsx"],"names":["React","React2"],"mappings":"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","file":"react.js","sourcesContent":["import * as React from 'react';\nimport { UnionStackClient } from '../client.js';\nimport type { ClientConfig } from '../types.js';\n\nconst UnionStackContext = React.createContext<UnionStackClient | null>(null);\n\nexport interface UnionStackProviderProps extends ClientConfig {\n children: React.ReactNode;\n}\n\n/**\n * Provide an SDK client to the React tree.\n *\n * <UnionStackProvider apiKey=\"unionstack_live_…\" apiBase=\"…\">\n * <App />\n * </UnionStackProvider>\n */\nexport function UnionStackProvider({ children, ...cfg }: UnionStackProviderProps) {\n // Re-create the client when apiKey or apiBase changes; otherwise keep stable.\n const client = React.useMemo(\n () => new UnionStackClient(cfg),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [cfg.apiKey, cfg.apiBase, cfg.chunkSize],\n );\n return React.createElement(UnionStackContext.Provider, { value: client }, children);\n}\n\nexport function useUnionStack(): UnionStackClient {\n const ctx = React.useContext(UnionStackContext);\n if (!ctx) {\n throw new Error(\n '[union-stack] useUnionStack/useUploader must be used inside <UnionStackProvider>.',\n );\n }\n return ctx;\n}\n","import * as React from 'react';\nimport { useUnionStack } from './provider.js';\nimport type {\n BatchUploadOptions,\n PickedFile,\n PickResponse,\n ProgressEvent as USProgressEvent,\n UploadError,\n UploadedFile,\n} from '../types.js';\n\nexport interface UseUploaderState {\n /** True between `upload()` start and its terminal callback. */\n isUploading: boolean;\n /** 0-100, averaged across files in a batch. */\n progress: number;\n /** Files that successfully uploaded — populated as each completes. */\n uploaded: UploadedFile[];\n /** Files that failed — populated as each fails. */\n failed: Array<{ file: PickedFile; error: UploadError }>;\n /** Terminal error for the *batch* (auth fail etc.). Per-file errors land in `failed`. */\n error: UploadError | null;\n}\n\nexport interface UseUploaderResult extends UseUploaderState {\n /** Upload one or more files. Returns the same PickResponse shape as the SDK. */\n upload: (files: File | Blob | (File | Blob)[], opts?: BatchUploadOptions) => Promise<PickResponse>;\n /** Cancel any in-flight uploads from this hook. */\n cancel: () => void;\n /** Reset state to initial. */\n reset: () => void;\n}\n\nconst INITIAL_STATE: UseUploaderState = {\n isUploading: false,\n progress: 0,\n uploaded: [],\n failed: [],\n error: null,\n};\n\n/**\n * React hook wrapping `client.uploadMany`. Tracks aggregate progress,\n * accumulates uploaded/failed lists, and exposes a cancel handle.\n *\n * const { upload, isUploading, progress, uploaded } = useUploader();\n * <input type=\"file\" onChange={(e) => upload(e.target.files![0])} />\n */\nexport function useUploader(globalOpts: BatchUploadOptions = {}): UseUploaderResult {\n const client = useUnionStack();\n const [state, setState] = React.useState<UseUploaderState>(INITIAL_STATE);\n const abortRef = React.useRef<AbortController | null>(null);\n\n // Track in-flight progress per file so we can compute an aggregate.\n const progressRef = React.useRef<Map<string, { totalBytes: number; loaded: number }>>(new Map());\n\n const updateAggregateProgress = React.useCallback(() => {\n let total = 0, loaded = 0;\n progressRef.current.forEach(v => { total += v.totalBytes; loaded += v.loaded; });\n const pct = total > 0 ? Math.min(100, Math.round((loaded / total) * 100)) : 0;\n setState(s => ({ ...s, progress: pct }));\n }, []);\n\n const upload = React.useCallback(async (\n input: File | Blob | (File | Blob)[],\n opts: BatchUploadOptions = {},\n ): Promise<PickResponse> => {\n const files = Array.isArray(input) ? input : [input];\n const ctrl = new AbortController();\n abortRef.current = ctrl;\n progressRef.current = new Map();\n setState({ ...INITIAL_STATE, isUploading: true });\n\n const wrappedOpts: BatchUploadOptions = {\n ...globalOpts,\n ...opts,\n signal: opts.signal ?? ctrl.signal,\n onUploadStarted: (fs) => {\n fs.forEach(f => progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: 0 }));\n opts.onUploadStarted?.(fs);\n globalOpts.onUploadStarted?.(fs);\n },\n onFileUploadStarted: (f) => {\n opts.onFileUploadStarted?.(f);\n globalOpts.onFileUploadStarted?.(f);\n },\n onFileUploadProgress: (f, ev: USProgressEvent) => {\n progressRef.current.set(f.uploadId, { totalBytes: ev.totalBytes, loaded: ev.loaded });\n updateAggregateProgress();\n opts.onFileUploadProgress?.(f, ev);\n globalOpts.onFileUploadProgress?.(f, ev);\n },\n onFileUploadFinished: (f) => {\n progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: f.size });\n updateAggregateProgress();\n setState(s => ({ ...s, uploaded: [...s.uploaded, f] }));\n opts.onFileUploadFinished?.(f);\n globalOpts.onFileUploadFinished?.(f);\n },\n onFileUploadFailed: (f, error) => {\n // Treat failed bytes as \"fully accounted for\" so aggregate progress completes.\n progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: f.size });\n updateAggregateProgress();\n setState(s => ({ ...s, failed: [...s.failed, { file: f, error }] }));\n opts.onFileUploadFailed?.(f, error);\n globalOpts.onFileUploadFailed?.(f, error);\n },\n onUploadDone: (result) => {\n setState(s => ({ ...s, isUploading: false }));\n opts.onUploadDone?.(result);\n globalOpts.onUploadDone?.(result);\n },\n onError: (err) => {\n setState(s => ({ ...s, isUploading: false, error: err }));\n opts.onError?.(err);\n },\n };\n\n try {\n return await client.uploadMany(files, wrappedOpts);\n } catch (err) {\n setState(s => ({ ...s, isUploading: false, error: err as UploadError }));\n throw err;\n }\n }, [client, globalOpts, updateAggregateProgress]);\n\n const cancel = React.useCallback(() => {\n abortRef.current?.abort();\n setState(s => ({ ...s, isUploading: false }));\n }, []);\n\n const reset = React.useCallback(() => {\n progressRef.current = new Map();\n setState(INITIAL_STATE);\n }, []);\n\n return { ...state, upload, cancel, reset };\n}\n","import * as React from 'react';\nimport { useUnionStack } from './provider.js';\nimport type { PickerOptions, PickerHandle } from '../picker/types.js';\n\nexport interface UnionStackPickerProps extends PickerOptions {\n /**\n * Render-prop receives an `open()` function the caller wires to a button\n * or any other trigger.\n *\n * <UnionStackPicker onUploadDone={…}>\n * {({ open }) => <button onClick={open}>Upload</button>}\n * </UnionStackPicker>\n */\n children: (api: { open: () => Promise<void>; close: () => void; cancel: () => void }) => React.ReactNode;\n}\n\n/**\n * React wrapper around `client.picker()`. The picker bundle is lazy-loaded\n * the first time `open()` is called — the component itself is just a\n * render-prop and doesn't pull in the modal code at import time.\n */\nexport function UnionStackPicker(props: UnionStackPickerProps): React.ReactElement {\n const client = useUnionStack();\n const handleRef = React.useRef<PickerHandle | null>(null);\n\n // Stabilize the latest options without re-creating the handle on every render.\n const optsRef = React.useRef(props);\n optsRef.current = props;\n\n const open = React.useCallback(async () => {\n const { children: _children, ...opts } = optsRef.current;\n handleRef.current = client.picker(opts) as PickerHandle;\n await handleRef.current.open();\n }, [client]);\n\n const close = React.useCallback(() => { handleRef.current?.close(); }, []);\n const cancel = React.useCallback(() => { handleRef.current?.cancel(); }, []);\n\n // Make sure we tear down the modal if the component unmounts mid-upload.\n React.useEffect(() => () => { handleRef.current?.close(); }, []);\n\n return React.createElement(React.Fragment, null, props.children({ open, close, cancel }));\n}\n"]}
1
+ {"version":3,"sources":["../src/react/provider.tsx","../src/react/useUploader.ts","../src/react/UnionStackPicker.tsx"],"names":["React","React2"],"mappings":"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","file":"react.js","sourcesContent":["import * as React from 'react';\nimport { UnionStackClient } from '../client.js';\nimport type { ClientConfig } from '../types.js';\n\nconst UnionStackContext = React.createContext<UnionStackClient | null>(null);\n\nexport interface UnionStackProviderProps extends ClientConfig {\n children: React.ReactNode;\n}\n\n/**\n * Provide an SDK client to the React tree.\n *\n * <UnionStackProvider apiKey=\"unionstack_live_…\" apiBase=\"…\">\n * <App />\n * </UnionStackProvider>\n */\nexport function UnionStackProvider({ children, ...cfg }: UnionStackProviderProps) {\n // Re-create the client when apiKey changes; otherwise keep stable.\n const client = React.useMemo(\n () => new UnionStackClient(cfg),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [cfg.apiKey, cfg.chunkSize],\n );\n return React.createElement(UnionStackContext.Provider, { value: client }, children);\n}\n\nexport function useUnionStack(): UnionStackClient {\n const ctx = React.useContext(UnionStackContext);\n if (!ctx) {\n throw new Error(\n '[union-stack] useUnionStack/useUploader must be used inside <UnionStackProvider>.',\n );\n }\n return ctx;\n}\n","import * as React from 'react';\nimport { useUnionStack } from './provider.js';\nimport type {\n BatchUploadOptions,\n PickedFile,\n PickResponse,\n ProgressEvent as USProgressEvent,\n UploadError,\n UploadedFile,\n} from '../types.js';\n\nexport interface UseUploaderState {\n /** True between `upload()` start and its terminal callback. */\n isUploading: boolean;\n /** 0-100, averaged across files in a batch. */\n progress: number;\n /** Files that successfully uploaded — populated as each completes. */\n uploaded: UploadedFile[];\n /** Files that failed — populated as each fails. */\n failed: Array<{ file: PickedFile; error: UploadError }>;\n /** Terminal error for the *batch* (auth fail etc.). Per-file errors land in `failed`. */\n error: UploadError | null;\n}\n\nexport interface UseUploaderResult extends UseUploaderState {\n /** Upload one or more files. Returns the same PickResponse shape as the SDK. */\n upload: (files: File | Blob | (File | Blob)[], opts?: BatchUploadOptions) => Promise<PickResponse>;\n /** Cancel any in-flight uploads from this hook. */\n cancel: () => void;\n /** Reset state to initial. */\n reset: () => void;\n}\n\nconst INITIAL_STATE: UseUploaderState = {\n isUploading: false,\n progress: 0,\n uploaded: [],\n failed: [],\n error: null,\n};\n\n/**\n * React hook wrapping `client.uploadMany`. Tracks aggregate progress,\n * accumulates uploaded/failed lists, and exposes a cancel handle.\n *\n * const { upload, isUploading, progress, uploaded } = useUploader();\n * <input type=\"file\" onChange={(e) => upload(e.target.files![0])} />\n */\nexport function useUploader(globalOpts: BatchUploadOptions = {}): UseUploaderResult {\n const client = useUnionStack();\n const [state, setState] = React.useState<UseUploaderState>(INITIAL_STATE);\n const abortRef = React.useRef<AbortController | null>(null);\n\n // Track in-flight progress per file so we can compute an aggregate.\n const progressRef = React.useRef<Map<string, { totalBytes: number; loaded: number }>>(new Map());\n\n const updateAggregateProgress = React.useCallback(() => {\n let total = 0, loaded = 0;\n progressRef.current.forEach(v => { total += v.totalBytes; loaded += v.loaded; });\n const pct = total > 0 ? Math.min(100, Math.round((loaded / total) * 100)) : 0;\n setState(s => ({ ...s, progress: pct }));\n }, []);\n\n const upload = React.useCallback(async (\n input: File | Blob | (File | Blob)[],\n opts: BatchUploadOptions = {},\n ): Promise<PickResponse> => {\n const files = Array.isArray(input) ? input : [input];\n const ctrl = new AbortController();\n abortRef.current = ctrl;\n progressRef.current = new Map();\n setState({ ...INITIAL_STATE, isUploading: true });\n\n const wrappedOpts: BatchUploadOptions = {\n ...globalOpts,\n ...opts,\n signal: opts.signal ?? ctrl.signal,\n onUploadStarted: (fs) => {\n fs.forEach(f => progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: 0 }));\n opts.onUploadStarted?.(fs);\n globalOpts.onUploadStarted?.(fs);\n },\n onFileUploadStarted: (f) => {\n opts.onFileUploadStarted?.(f);\n globalOpts.onFileUploadStarted?.(f);\n },\n onFileUploadProgress: (f, ev: USProgressEvent) => {\n progressRef.current.set(f.uploadId, { totalBytes: ev.totalBytes, loaded: ev.loaded });\n updateAggregateProgress();\n opts.onFileUploadProgress?.(f, ev);\n globalOpts.onFileUploadProgress?.(f, ev);\n },\n onFileUploadFinished: (f) => {\n progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: f.size });\n updateAggregateProgress();\n setState(s => ({ ...s, uploaded: [...s.uploaded, f] }));\n opts.onFileUploadFinished?.(f);\n globalOpts.onFileUploadFinished?.(f);\n },\n onFileUploadFailed: (f, error) => {\n // Treat failed bytes as \"fully accounted for\" so aggregate progress completes.\n progressRef.current.set(f.uploadId, { totalBytes: f.size, loaded: f.size });\n updateAggregateProgress();\n setState(s => ({ ...s, failed: [...s.failed, { file: f, error }] }));\n opts.onFileUploadFailed?.(f, error);\n globalOpts.onFileUploadFailed?.(f, error);\n },\n onUploadDone: (result) => {\n setState(s => ({ ...s, isUploading: false }));\n opts.onUploadDone?.(result);\n globalOpts.onUploadDone?.(result);\n },\n onError: (err) => {\n setState(s => ({ ...s, isUploading: false, error: err }));\n opts.onError?.(err);\n },\n };\n\n try {\n return await client.uploadMany(files, wrappedOpts);\n } catch (err) {\n setState(s => ({ ...s, isUploading: false, error: err as UploadError }));\n throw err;\n }\n }, [client, globalOpts, updateAggregateProgress]);\n\n const cancel = React.useCallback(() => {\n abortRef.current?.abort();\n setState(s => ({ ...s, isUploading: false }));\n }, []);\n\n const reset = React.useCallback(() => {\n progressRef.current = new Map();\n setState(INITIAL_STATE);\n }, []);\n\n return { ...state, upload, cancel, reset };\n}\n","import * as React from 'react';\nimport { useUnionStack } from './provider.js';\nimport type { PickerOptions, PickerHandle } from '../picker/types.js';\n\nexport interface UnionStackPickerProps extends PickerOptions {\n /**\n * Render-prop receives an `open()` function the caller wires to a button\n * or any other trigger.\n *\n * <UnionStackPicker onUploadDone={…}>\n * {({ open }) => <button onClick={open}>Upload</button>}\n * </UnionStackPicker>\n */\n children: (api: { open: () => Promise<void>; close: () => void; cancel: () => void }) => React.ReactNode;\n}\n\n/**\n * React wrapper around `client.picker()`. The picker bundle is lazy-loaded\n * the first time `open()` is called — the component itself is just a\n * render-prop and doesn't pull in the modal code at import time.\n */\nexport function UnionStackPicker(props: UnionStackPickerProps): React.ReactElement {\n const client = useUnionStack();\n const handleRef = React.useRef<PickerHandle | null>(null);\n\n // Stabilize the latest options without re-creating the handle on every render.\n const optsRef = React.useRef(props);\n optsRef.current = props;\n\n const open = React.useCallback(async () => {\n const { children: _children, ...opts } = optsRef.current;\n handleRef.current = client.picker(opts) as PickerHandle;\n await handleRef.current.open();\n }, [client]);\n\n const close = React.useCallback(() => { handleRef.current?.close(); }, []);\n const cancel = React.useCallback(() => { handleRef.current?.cancel(); }, []);\n\n // Make sure we tear down the modal if the component unmounts mid-upload.\n React.useEffect(() => () => { handleRef.current?.close(); }, []);\n\n return React.createElement(React.Fragment, null, props.children({ open, close, cancel }));\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masters-union/union-stack",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "UnionStack — file upload SDK. Direct-to-R2 multipart uploads with a small client surface.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/uploader.ts","../src/client.ts"],"names":[],"mappings":"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","file":"chunk-5Q2UADFS.js","sourcesContent":["import type { UploadError, UploadErrorCode } from './types.js';\n\nexport function makeError(\n code: UploadErrorCode,\n message: string,\n opts: { status?: number; retryable?: boolean; cause?: unknown } = {}\n): UploadError {\n return {\n code,\n message,\n status: opts.status,\n retryable: opts.retryable ?? defaultRetryable(code, opts.status),\n cause: opts.cause,\n };\n}\n\nfunction defaultRetryable(code: UploadErrorCode, status?: number): boolean {\n if (code === 'NETWORK' || code === 'PART_FAILED') return true;\n if (code === 'SERVER' && status && status >= 500) return true;\n return false;\n}\n\n/** Map an HTTP error response from the cdn-be API to an UploadError. */\nexport function fromApiResponse(status: number, body: unknown): UploadError {\n const err = (body as { error?: { code?: string; message?: string } } | null)?.error;\n const msg = err?.message || `Request failed with status ${status}`;\n const code = (err?.code || '').toUpperCase();\n\n if (status === 401) {\n return makeError('AUTH', msg, { status, retryable: false });\n }\n if (status === 403) {\n return makeError('AUTH', msg, { status, retryable: false });\n }\n if (status === 413) {\n return makeError('VALIDATION', msg, { status, retryable: false });\n }\n if (status === 415) {\n return makeError('VALIDATION', msg, { status, retryable: false });\n }\n if (status === 429) {\n const isQuota = code === 'QUOTA_EXCEEDED';\n return makeError(isQuota ? 'QUOTA' : 'NETWORK', msg, { status, retryable: !isQuota });\n }\n if (status >= 500) {\n return makeError('SERVER', msg, { status, retryable: true });\n }\n return makeError('SERVER', msg, { status, retryable: false });\n}\n","import type {\n ClientConfig,\n PickedFile,\n PickerConfig,\n UploadedFile,\n UploadOptions,\n ProgressEvent as USProgressEvent,\n} from './types.js';\nimport { fromApiResponse, makeError } from './errors.js';\n\ninterface InitResponse {\n sessionId: string;\n fileId: string;\n chunkSize: number;\n totalParts: number;\n partUrls: Array<{ partNumber: number; url: string }>;\n expiresAt: string;\n}\n\ninterface CompleteResponse {\n handle: string;\n fileId: string;\n url: string;\n filename: string;\n mimetype: string;\n size: number;\n etag?: string;\n}\n\ninterface PartResult {\n partNumber: number;\n etag: string;\n size: number;\n}\n\nconst DEFAULT_CONCURRENCY = 3;\nconst DEFAULT_MAX_RETRIES_PER_PART = 3;\n// Backoff schedule between part retries. Capped — past this we surrender.\nconst BACKOFF_MS = [400, 1200, 3600];\n\nexport class Uploader {\n constructor(private cfg: ClientConfig) {}\n\n /** Returns a stable PickedFile descriptor for the input blob/file. */\n describe(file: File | Blob, opts: { filename?: string; mimeType?: string } = {}): PickedFile {\n const isFile = typeof File !== 'undefined' && file instanceof File;\n const filename =\n opts.filename ||\n (isFile ? (file as File).name : 'untitled');\n const mimetype =\n opts.mimeType || (file as Blob).type || 'application/octet-stream';\n return {\n uploadId: cryptoRandomId(),\n filename,\n mimetype,\n size: file.size,\n source: 'local',\n };\n }\n\n /**\n * Upload a single Blob/File. Returns the persisted UploadedFile.\n * Fires Filestack-style per-file callbacks from `opts`.\n */\n async upload(file: File | Blob, opts: UploadOptions = {}): Promise<UploadedFile> {\n const picked = this.describe(file, { filename: opts.filename, mimeType: opts.mimeType });\n opts.onFileUploadStarted?.(picked);\n\n try {\n const init = await this.initUpload(picked, opts);\n const parts = await this.uploadAllParts(file, init, picked, opts);\n const completed = await this.completeUpload(init.sessionId, parts, opts);\n\n const uploaded: UploadedFile = {\n ...picked,\n handle: completed.handle,\n fileId: completed.fileId,\n url: completed.url,\n size: completed.size,\n mimetype: completed.mimetype,\n filename: completed.filename,\n status: 'Stored',\n etag: completed.etag,\n };\n opts.onFileUploadFinished?.(uploaded);\n return uploaded;\n } catch (rawErr) {\n const err = normalizeError(rawErr);\n opts.onFileUploadFailed?.(picked, err);\n // Best effort: tell the server to clean up the multipart, but ignore failures.\n if ((rawErr as { sessionId?: string })?.sessionId) {\n this.abortSilently((rawErr as { sessionId: string }).sessionId).catch(() => {});\n }\n throw err;\n }\n }\n\n /** Cancel an in-flight session server-side. */\n async abort(sessionId: string): Promise<void> {\n await this.api('POST', '/sdk/v1/uploads/abort', { sessionId });\n }\n\n /** Fetch the server-managed picker config (branding, theme, constraints). */\n async fetchPickerConfig(): Promise<PickerConfig> {\n return this.api<PickerConfig>('GET', '/sdk/v1/picker-config');\n }\n\n private async initUpload(picked: PickedFile, opts: UploadOptions): Promise<InitResponse> {\n return this.api<InitResponse>('POST', '/sdk/v1/uploads/init', {\n filename: picked.filename,\n mimeType: picked.mimetype,\n size: picked.size,\n metadata: opts.metadata,\n }, opts.signal);\n }\n\n private async uploadAllParts(\n file: File | Blob,\n init: InitResponse,\n picked: PickedFile,\n opts: UploadOptions,\n ): Promise<PartResult[]> {\n const totalParts = init.totalParts;\n const chunkSize = init.chunkSize;\n const concurrency = Math.max(1, opts.concurrency ?? DEFAULT_CONCURRENCY);\n const maxRetries = opts.maxRetriesPerPart ?? DEFAULT_MAX_RETRIES_PER_PART;\n\n // Quick lookup: partNumber → presigned URL.\n const urlByPart = new Map(init.partUrls.map(p => [p.partNumber, p.url] as const));\n\n const results: PartResult[] = new Array(totalParts);\n const loadedPerPart: number[] = new Array(totalParts).fill(0);\n let cursor = 1;\n\n const totalBytes = file.size;\n\n const reportProgress = () => {\n const loaded = loadedPerPart.reduce((a, b) => a + b, 0);\n const totalPercent = totalBytes > 0 ? Math.min(100, Math.round((loaded / totalBytes) * 100)) : 100;\n const ev: USProgressEvent = { totalBytes, loaded, totalPercent };\n opts.onFileUploadProgress?.(picked, ev);\n };\n\n const worker = async (): Promise<void> => {\n while (true) {\n if (opts.signal?.aborted) {\n throw makeError('ABORTED', 'Upload aborted by caller.', { retryable: false });\n }\n const partNumber = cursor++;\n if (partNumber > totalParts) return;\n\n const start = (partNumber - 1) * chunkSize;\n const end = Math.min(start + chunkSize, file.size);\n const chunk = file.slice(start, end);\n\n let attempt = 0;\n let lastErr: unknown;\n while (attempt <= maxRetries) {\n if (opts.signal?.aborted) {\n throw makeError('ABORTED', 'Upload aborted by caller.', { retryable: false });\n }\n try {\n let url = urlByPart.get(partNumber);\n if (!url) {\n const refreshed = await this.api<{ url: string }>(\n 'POST', '/sdk/v1/uploads/sign-part',\n { sessionId: init.sessionId, partNumber }, opts.signal,\n );\n url = refreshed.url;\n urlByPart.set(partNumber, url);\n }\n\n const res = await this.cfg.fetch?.(url, {\n method: 'PUT',\n body: chunk,\n signal: opts.signal,\n }) ?? await fetch(url, { method: 'PUT', body: chunk, signal: opts.signal });\n\n if (!res.ok) {\n // If R2 rejects with 403 the URL likely expired — drop it so the\n // next attempt re-signs.\n if (res.status === 403 || res.status === 401) urlByPart.delete(partNumber);\n throw makeError('PART_FAILED', `Part ${partNumber} PUT failed (HTTP ${res.status})`, { status: res.status });\n }\n const etag = res.headers.get('etag');\n if (!etag) {\n throw makeError('PART_FAILED', `Part ${partNumber}: R2 did not return an ETag.`);\n }\n\n results[partNumber - 1] = { partNumber, etag, size: chunk.size };\n loadedPerPart[partNumber - 1] = chunk.size;\n reportProgress();\n break;\n } catch (err) {\n lastErr = err;\n attempt++;\n if (attempt > maxRetries) break;\n await sleep(BACKOFF_MS[Math.min(attempt - 1, BACKOFF_MS.length - 1)]);\n }\n }\n if (!results[partNumber - 1]) {\n throw withSessionId(\n normalizeError(lastErr ?? makeError('PART_FAILED', `Part ${partNumber} failed after ${maxRetries} retries.`)),\n init.sessionId,\n );\n }\n }\n };\n\n const workers = Array.from({ length: Math.min(concurrency, totalParts) }, worker);\n await Promise.all(workers);\n return results;\n }\n\n private async completeUpload(\n sessionId: string,\n parts: PartResult[],\n opts: UploadOptions,\n ): Promise<CompleteResponse> {\n return this.api<CompleteResponse>('POST', '/sdk/v1/uploads/complete', {\n sessionId,\n parts: parts.map(p => ({ partNumber: p.partNumber, etag: p.etag })),\n }, opts.signal);\n }\n\n private async abortSilently(sessionId: string): Promise<void> {\n try { await this.abort(sessionId); } catch { /* ignore */ }\n }\n\n private async api<T>(\n method: 'GET' | 'POST' | 'DELETE',\n path: string,\n body?: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n const fetchImpl = this.cfg.fetch ?? fetch;\n const url = `${this.cfg.apiBase.replace(/\\/$/, '')}${path}`;\n let res: Response;\n try {\n res = await fetchImpl(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.cfg.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n signal,\n });\n } catch (cause) {\n if ((cause as Error)?.name === 'AbortError') {\n throw makeError('ABORTED', 'Request aborted.', { retryable: false, cause });\n }\n throw makeError('NETWORK', 'Network request failed.', { retryable: true, cause });\n }\n let parsed: unknown = null;\n try { parsed = await res.json(); } catch { /* tolerate empty body */ }\n if (!res.ok) throw fromApiResponse(res.status, parsed);\n return parsed as T;\n }\n}\n\nfunction cryptoRandomId(): string {\n // Cheap unique id for client-side uploadId. Not security-sensitive.\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return (crypto as { randomUUID: () => string }).randomUUID().replace(/-/g, '');\n }\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms));\n}\n\nfunction normalizeError(err: unknown): ReturnType<typeof makeError> {\n if (err && typeof err === 'object' && 'code' in err && 'message' in err && 'retryable' in err) {\n return err as ReturnType<typeof makeError>;\n }\n const msg = (err as Error)?.message || 'Upload failed.';\n return makeError('NETWORK', msg, { cause: err });\n}\n\nfunction withSessionId<T>(err: T, sessionId: string): T {\n if (err && typeof err === 'object') (err as { sessionId?: string }).sessionId = sessionId;\n return err;\n}\n","import type {\n ClientConfig,\n UploadOptions,\n BatchUploadOptions,\n UploadedFile,\n PickResponse,\n PickedFile,\n PickerConfig,\n UploadError,\n} from './types.js';\nimport { Uploader } from './uploader.js';\nimport { makeError } from './errors.js';\n\n// Forward-declared minimal handle so client.ts doesn't pull in the picker bundle.\nexport interface PickerHandleLike {\n open(): Promise<PickResponse>;\n close(): void;\n cancel(): void;\n}\n\nexport class UnionStackClient {\n private uploader: Uploader;\n /**\n * Promise that resolves to the server-managed picker config. Pre-fetched on\n * construction (unless `skipConfigPrefetch: true`) so the picker opens\n * without a network hit. Fails silently — picker falls back to defaults.\n */\n pickerConfigPromise: Promise<PickerConfig | null>;\n\n constructor(private cfg: ClientConfig) {\n if (!cfg.apiKey) throw makeError('CONFIG', 'apiKey is required.', { retryable: false });\n if (!cfg.apiBase) throw makeError('CONFIG', 'apiBase is required.', { retryable: false });\n this.uploader = new Uploader(cfg);\n this.pickerConfigPromise = cfg.skipConfigPrefetch\n ? Promise.resolve(null)\n : this.uploader.fetchPickerConfig().catch(() => null);\n }\n\n /** Upload a single file. Mirrors Filestack's `client.upload()`. */\n upload(file: File | Blob, opts: UploadOptions = {}): Promise<UploadedFile> {\n return this.uploader.upload(file, opts);\n }\n\n /**\n * Upload multiple files concurrently. Mirrors Filestack's batch behavior:\n * onUploadDone fires once even if some files failed — failures land in\n * `filesFailed`, successes in `filesUploaded`. `onError` is reserved for\n * batch-level failures (no files even started).\n */\n async uploadMany(\n files: (File | Blob)[],\n opts: BatchUploadOptions = {},\n ): Promise<PickResponse> {\n if (!Array.isArray(files) || files.length === 0) {\n const err = makeError('VALIDATION', 'uploadMany requires a non-empty array of files.', { retryable: false });\n opts.onError?.(err);\n throw err;\n }\n\n const picked: PickedFile[] = files.map(f =>\n this.uploader.describe(f, { filename: opts.filename, mimeType: opts.mimeType })\n );\n opts.onUploadStarted?.(picked);\n\n const filesUploaded: UploadedFile[] = [];\n const filesFailed: Array<{ file: PickedFile; error: UploadError }> = [];\n\n // Process per-file in parallel; the per-part concurrency from `opts` still\n // applies inside each upload.\n await Promise.all(files.map(async (f, i) => {\n try {\n const uploaded = await this.uploader.upload(f, opts);\n // Sync the uploadId so callers can correlate picked → uploaded.\n uploaded.uploadId = picked[i].uploadId;\n filesUploaded.push(uploaded);\n } catch (err) {\n filesFailed.push({ file: picked[i], error: err as UploadError });\n }\n }));\n\n const result: PickResponse = { filesUploaded, filesFailed };\n opts.onUploadDone?.(result);\n return result;\n }\n\n /**\n * Open the file picker modal. Lazy-loads the picker bundle so the core\n * SDK stays small for callers that only use `upload()` directly.\n */\n picker(opts: import('./picker/types.js').PickerOptions = {}): PickerHandleLike {\n let real: PickerHandleLike | null = null;\n let opened = false;\n let pendingResolve!: (r: PickResponse) => void;\n let pendingReject!: (e: UploadError) => void;\n const donePromise = new Promise<PickResponse>((res, rej) => {\n pendingResolve = res; pendingReject = rej;\n });\n\n return {\n open: async () => {\n if (opened) return donePromise;\n opened = true;\n try {\n const mod = await import('./picker/index.js');\n real = mod.openPicker(this, opts);\n const result = await real.open();\n pendingResolve(result);\n return result;\n } catch (err) {\n const e = (err as UploadError)?.code\n ? (err as UploadError)\n : makeError('CONFIG', 'Failed to load picker.', { retryable: false, cause: err });\n pendingReject(e);\n throw e;\n }\n },\n close: () => { real?.close(); },\n cancel: () => { real?.cancel(); },\n };\n }\n\n /** Read-only accessor used by the React/picker packages. */\n get config(): Readonly<ClientConfig> { return this.cfg; }\n}\n"]}