@danceroutine/tango-core 0.1.0 → 1.0.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.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +82 -0
  3. package/dist/{TangoError-NPkVPfuH.js → TangoError-DdQVQNZU.js} +5 -1
  4. package/dist/TangoError-DdQVQNZU.js.map +1 -0
  5. package/dist/errors/AuthenticationError.d.ts +6 -1
  6. package/dist/errors/ConflictError.d.ts +6 -1
  7. package/dist/errors/NotFoundError.d.ts +6 -1
  8. package/dist/errors/PermissionDenied.d.ts +6 -1
  9. package/dist/errors/TangoError.d.ts +13 -1
  10. package/dist/errors/ValidationError.d.ts +5 -1
  11. package/dist/errors/factories/HttpErrorFactory.d.ts +20 -11
  12. package/dist/errors/factories/index.d.ts +1 -1
  13. package/dist/errors/index.d.ts +2 -2
  14. package/dist/errors/index.js +4 -4
  15. package/dist/{errors-CzSQXdgI.js → errors-_tWsmNyZ.js} +81 -34
  16. package/dist/errors-_tWsmNyZ.js.map +1 -0
  17. package/dist/http/TangoBody.d.ts +43 -18
  18. package/dist/http/TangoHeaders.d.ts +10 -5
  19. package/dist/http/TangoQueryParams.d.ts +69 -0
  20. package/dist/http/TangoRequest.d.ts +82 -0
  21. package/dist/http/TangoResponse.d.ts +184 -49
  22. package/dist/http/index.d.ts +2 -1
  23. package/dist/http/index.js +4 -4
  24. package/dist/{http-DOLwwAYt.js → http-D20MQa6p.js} +675 -295
  25. package/dist/http-D20MQa6p.js.map +1 -0
  26. package/dist/index.d.ts +9 -7
  27. package/dist/index.js +7 -6
  28. package/dist/logging/ConsoleLogger.d.ts +15 -0
  29. package/dist/logging/Logger.d.ts +13 -0
  30. package/dist/logging/getLogger.d.ts +23 -0
  31. package/dist/logging/index.d.ts +3 -0
  32. package/dist/logging/index.js +3 -0
  33. package/dist/logging-BWeD4HOO.js +48 -0
  34. package/dist/logging-BWeD4HOO.js.map +1 -0
  35. package/dist/runtime/binary/isArrayBuffer.d.ts +3 -0
  36. package/dist/runtime/binary/isBlob.d.ts +3 -0
  37. package/dist/runtime/binary/isUint8Array.d.ts +3 -0
  38. package/dist/runtime/date/isDate.d.ts +3 -0
  39. package/dist/runtime/error/isError.d.ts +3 -0
  40. package/dist/runtime/index.d.ts +1 -1
  41. package/dist/runtime/index.js +2 -2
  42. package/dist/runtime/object/index.d.ts +1 -0
  43. package/dist/runtime/object/isNil.d.ts +4 -0
  44. package/dist/runtime/object/isObject.d.ts +3 -0
  45. package/dist/runtime/web/isFile.d.ts +3 -0
  46. package/dist/runtime/web/isFormData.d.ts +3 -0
  47. package/dist/runtime/web/isReadableStream.d.ts +3 -0
  48. package/dist/runtime/web/isURLSearchParams.d.ts +3 -0
  49. package/dist/{runtime-DPpCYEe_.js → runtime-B8KkgD3R.js} +14 -4
  50. package/dist/runtime-B8KkgD3R.js.map +1 -0
  51. package/dist/sql/SqlDialect.d.ts +5 -0
  52. package/dist/sql/SqlIdentifierRole.d.ts +13 -0
  53. package/dist/sql/SqlSafetyEngine.d.ts +50 -0
  54. package/dist/sql/TrustedSqlFragment.d.ts +5 -0
  55. package/dist/sql/ValidatedSqlIdentifier.d.ts +7 -0
  56. package/dist/sql/index.d.ts +13 -0
  57. package/dist/sql/index.js +3 -0
  58. package/dist/sql/isTrustedSqlFragment.d.ts +5 -0
  59. package/dist/sql/quoteSqlIdentifier.d.ts +6 -0
  60. package/dist/sql/trustedSql.d.ts +5 -0
  61. package/dist/sql/validateSqlIdentifier.d.ts +6 -0
  62. package/dist/sql-D3frkfy-.js +116 -0
  63. package/dist/sql-D3frkfy-.js.map +1 -0
  64. package/package.json +65 -54
  65. package/dist/TangoError-NPkVPfuH.js.map +0 -1
  66. package/dist/errors/factories/HttpErrorFactory.js +0 -91
  67. package/dist/errors-CzSQXdgI.js.map +0 -1
  68. package/dist/http/TangoHeaders.js +0 -396
  69. package/dist/http/TangoResponse.js +0 -556
  70. package/dist/http-DOLwwAYt.js.map +0 -1
  71. package/dist/result/Err.d.ts +0 -21
  72. package/dist/result/Ok.d.ts +0 -21
  73. package/dist/result/Result.d.ts +0 -33
  74. package/dist/result/index.d.ts +0 -8
  75. package/dist/result/index.js +0 -3
  76. package/dist/result-CBqw9Hlg.js +0 -82
  77. package/dist/result-CBqw9Hlg.js.map +0 -1
  78. package/dist/runtime-DPpCYEe_.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-DOLwwAYt.js","names":["bodySource: TangoBodySource","headers?: HeadersLike","value: unknown","v: unknown","contentType: string | undefined","raw: string","body: TangoBodySource","parser: (input: TangoBodySource) => Promise<T>","stream: ReadableStream<Uint8Array>","chunks: Uint8Array[]","providedType?: string","headers?: HeadersInit","value: unknown","filename: string","name: string","value: string","options?: {\n domain?: string;\n expires?: Date;\n httpOnly?: boolean;\n maxAge?: number;\n path?: string;\n sameSite?: 'Strict' | 'Lax' | 'None';\n secure?: boolean;\n priority?: 'Low' | 'Medium' | 'High';\n partitioned?: boolean;\n }","options?: {\n domain?: string;\n path?: string;\n sameSite?: 'Strict' | 'Lax' | 'None';\n secure?: boolean;\n priority?: 'Low' | 'Medium' | 'High';\n partitioned?: boolean;\n }","options: {\n domain?: string;\n expires?: Date;\n httpOnly?: boolean;\n maxAge?: number;\n path?: string;\n sameSite?: 'Strict' | 'Lax' | 'None';\n secure?: boolean;\n priority?: 'Low' | 'Medium' | 'High';\n partitioned?: boolean;\n }","control: string | Record<string, string | number | boolean | undefined>","parts: string[]","url: string","mime: string","file: unknown","filename?: string","map: Record<string, string>","body: unknown","len: number | undefined","id: string","dur?: number","desc?: string","ms: number | string","input: string | Request","init: TangoRequestInit","requestInit: RequestInit","value: unknown","body: BodyInit | JsonValue | null | undefined","headers: Headers","method: string","value: unknown","init: TangoResponseInit","name: string","value: string","options?: Parameters<TangoHeaders['setCookie']>[2]","options?: Parameters<TangoHeaders['appendCookie']>[2]","options?: Parameters<TangoHeaders['deleteCookie']>[1]","control: Parameters<TangoHeaders['cacheControl']>[0]","url: string","mime: string","requestId: string | undefined | null","traceparent: string | undefined | null","timing: string | string[]","time: number | string","input: HeadersInit","data: JsonValue","init?: Omit<TangoResponseInit, 'body' | 'headers'> & { headers?: HeadersInit }","text: string","html: string","stream: ReadableStream<Uint8Array>","status: number","init?: Omit<TangoResponseInit, 'body' | 'headers' | 'status'> & {\n headers?: HeadersInit;\n }","init?: Omit<TangoResponseInit, 'body' | 'status' | 'headers'> & {\n headers?: HeadersInit;\n }","location?: string","body?: JsonValue","respBody: BodyInit | undefined","error: TangoError | ProblemDetails<TDetails>","code: string","message: string","details: ErrorDetails","fields: Record<string, string[]> | undefined","detail?: string | TangoError | ProblemDetails<TDetails>","problem?: string | TangoError | ProblemDetails<TDetails> | unknown","init?: Omit<TangoResponseInit, 'body' | 'headers'> & {\n headers?: HeadersInit;\n status?: number;\n }","envelope: ErrorEnvelope<ErrorDetails>","file: Blob | Uint8Array | ArrayBuffer | ReadableStream<Uint8Array> | string","opts?: {\n filename?: string;\n contentType?: string;\n init?: Omit<TangoResponseInit, 'body' | 'headers'> & { headers?: HeadersInit };\n }"],"sources":["../src/http/TangoBody.ts","../src/http/TangoHeaders.ts","../src/http/TangoRequest.ts","../src/http/TangoResponse.ts","../src/http/index.ts"],"sourcesContent":["import {\n isArrayBuffer,\n isBlob,\n isFile,\n isFormData,\n isReadableStream,\n isUint8Array,\n isURLSearchParams,\n} from '../runtime/index';\n\n/**\n * The full type of body that TangoResponse/TangoBody supports.\n * Unlike the fetch spec BodyInit, this can be directly:\n * - a string, ArrayBuffer, Uint8Array, Blob, FormData, ReadableStream, or JSON-like object, or null/undefined.\n */\n\ntype HeadersLike = { get?: (arg: string) => string | null };\n\ntype TangoBodySource = BodyInit | JsonValue | null;\n\nexport type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\nexport class TangoBody {\n static readonly BRAND = 'tango.http.body' as const;\n readonly __tangoBrand: typeof TangoBody.BRAND = TangoBody.BRAND;\n private bodySourceInternal: TangoBodySource;\n private bodyUsedInternal: boolean;\n private headers?: HeadersLike;\n\n constructor(bodySource: TangoBodySource, headers?: HeadersLike) {\n this.bodySourceInternal = bodySource;\n this.bodyUsedInternal = false;\n this.headers = headers;\n }\n\n static isTangoBody(value: unknown): value is TangoBody {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === TangoBody.BRAND\n );\n }\n\n public get bodySource(): TangoBodySource {\n return this.bodySourceInternal;\n }\n\n get bodyUsed(): boolean {\n return this.bodyUsedInternal;\n }\n\n get bodyType(): string {\n const body = this.bodySourceInternal;\n if (body == null) return 'null';\n if (typeof body === 'string') return 'string';\n if (isArrayBuffer(body)) return 'ArrayBuffer';\n if (isUint8Array(body)) return 'Uint8Array';\n if (isBlob(body)) return 'Blob';\n if (isFormData(body)) return 'FormData';\n if (isURLSearchParams(body)) return 'URLSearchParams';\n if (isReadableStream(body)) return 'ReadableStream';\n if (TangoBody.isJsonValue(body)) return 'JsonValue';\n return typeof body;\n }\n\n /**\n * Returns true if value is a valid JSON value (recursively).\n */\n public static isJsonValue(v: unknown): v is JsonValue {\n if (v === null || typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n return true;\n }\n if (Array.isArray(v)) {\n return v.every(TangoBody.isJsonValue);\n }\n if (typeof v === 'object' && v !== null && Object.prototype.toString.call(v) === '[object Object]') {\n return Object.values(v).every(TangoBody.isJsonValue);\n }\n return false;\n }\n\n /**\n * Reads the body as an ArrayBuffer.\n */\n async arrayBuffer(): Promise<ArrayBuffer> {\n return this.consumeBody(async (input) => {\n if (isArrayBuffer(input)) return input;\n if (isUint8Array(input)) {\n const copy = new Uint8Array(input.byteLength);\n copy.set(input);\n return copy.buffer;\n }\n if (typeof input === 'string') return new TextEncoder().encode(input).buffer as ArrayBuffer;\n if (isBlob(input)) return input.arrayBuffer();\n if (isReadableStream(input)) {\n return TangoBody.readStreamToArrayBuffer(input);\n }\n if (TangoBody.isJsonValue(input)) {\n // If body is object/array, encode as JSON and return buffer\n return new TextEncoder().encode(JSON.stringify(input)).buffer as ArrayBuffer;\n }\n throw new TypeError('Body is not an ArrayBuffer, Blob, string, stream, or JSON serializable object');\n });\n }\n\n /**\n * Reads the body as a Blob (browser only).\n */\n async blob(): Promise<Blob> {\n return this.consumeBody(async (input) => {\n if (isBlob(input)) return input;\n if (typeof input === 'string') return new Blob([input]);\n if (isArrayBuffer(input)) return new Blob([input]);\n if (isUint8Array(input)) return new Blob([new Uint8Array(input)]);\n if (isReadableStream(input)) {\n const buf = await TangoBody.readStreamToArrayBuffer(input);\n return new Blob([buf]);\n }\n if (TangoBody.isJsonValue(input)) {\n return new Blob([JSON.stringify(input)], { type: 'application/json' });\n }\n throw new TypeError(\n 'Body is not a Blob, string, ArrayBuffer, Uint8Array, stream, or JSON serializable object'\n );\n });\n }\n\n /**\n * Reads the body as a Uint8Array.\n */\n async bytes(): Promise<Uint8Array<ArrayBuffer>> {\n return this.consumeBody(async (input) => {\n if (isUint8Array(input)) return new Uint8Array(input);\n if (isArrayBuffer(input)) return new Uint8Array(input);\n if (typeof input === 'string') return new TextEncoder().encode(input);\n if (isBlob(input)) return new Uint8Array(await input.arrayBuffer());\n if (isReadableStream(input)) {\n return TangoBody.readStreamToUint8Array(input);\n }\n if (TangoBody.isJsonValue(input)) {\n return new TextEncoder().encode(JSON.stringify(input));\n }\n throw new TypeError('Body is not bytes, ArrayBuffer, Blob, string, stream, or JSON serializable object');\n });\n }\n\n /**\n * Reads the body as FormData.\n * Accepts FormData, or if type is urlencoded or multipart parses a string/bytes.\n */\n async formData(): Promise<FormData> {\n return this.consumeBody(async (input) => {\n if (isFormData(input)) return input;\n\n let contentType: string | undefined = undefined;\n if (this.headers && typeof this.headers.get === 'function') {\n const raw = this.headers.get('Content-Type');\n if (typeof raw === 'string') contentType = raw.toLowerCase();\n }\n\n let raw: string;\n if (typeof input === 'string') {\n raw = input;\n } else if (isArrayBuffer(input)) {\n raw = new TextDecoder().decode(input);\n } else if (isUint8Array(input)) {\n raw = new TextDecoder().decode(input);\n } else {\n throw new TypeError('Body is not valid for FormData');\n }\n\n // application/x-www-form-urlencoded\n if (contentType && contentType.includes('application/x-www-form-urlencoded')) {\n const form = new FormData();\n const params = new URLSearchParams(raw);\n params.forEach((value, key) => form.append(key, value));\n return form;\n }\n // multipart/form-data\n if (contentType && contentType.startsWith('multipart/form-data')) {\n const boundaryMatch = /boundary=([^\\s;]+)/i.exec(contentType);\n if (!boundaryMatch) throw new TypeError('Missing boundary in multipart/form-data');\n const boundary = boundaryMatch[1];\n\n // Warning: minimal multipart parsing, no file support\n const parts = raw.split(`--${boundary}`);\n const form = new FormData();\n for (const part of parts) {\n const trimmed = part.trim();\n if (!trimmed || trimmed === '--' || trimmed === '') continue;\n\n const [rawHeaders, ...rawBodyParts] = trimmed.split(/\\r?\\n\\r?\\n/);\n const body = rawBodyParts.join('\\n\\n').replace(/\\r?\\n$/, '');\n if (!rawHeaders) continue;\n const dispositionMatch = /Content-Disposition:\\s*form-data;\\s*name=\"([^\"]+)\"/i.exec(rawHeaders);\n if (!dispositionMatch) continue;\n const name = dispositionMatch[1];\n if (typeof name === 'string') {\n form.append(name, body);\n }\n }\n return form;\n }\n throw new TypeError('Body is not FormData, nor a supported form encoding');\n });\n }\n\n /**\n * Reads and parses the body as JSON (if possible).\n */\n async json<T = unknown>(): Promise<T> {\n return this.consumeBody(async (input) => {\n if (typeof input === 'string') return JSON.parse(input) as T;\n if (TangoBody.isJsonValue(input)) return input as T;\n if (isArrayBuffer(input) || isUint8Array(input)) {\n const text = new TextDecoder().decode(isUint8Array(input) ? input : new Uint8Array(input));\n return JSON.parse(text) as T;\n }\n if (isReadableStream(input)) {\n const text = await TangoBody.readStreamToText(input);\n return JSON.parse(text) as T;\n }\n throw new TypeError('Body is not valid JSON');\n });\n }\n\n /**\n * Reads the body as UTF-8 string.\n */\n async text(): Promise<string> {\n return this.consumeBody(async (input) => {\n if (typeof input === 'string') return input;\n if (isArrayBuffer(input)) return new TextDecoder().decode(input);\n if (isUint8Array(input)) return new TextDecoder().decode(input);\n if (isBlob(input)) return await input.text();\n if (isReadableStream(input)) return await TangoBody.readStreamToText(input);\n if (TangoBody.isJsonValue(input)) return JSON.stringify(input);\n throw new TypeError('Body is not text, ArrayBuffer, Uint8Array, Blob, stream, or JSON serializable object');\n });\n }\n\n /**\n * Returns the original body value (may be used for streaming or clone).\n */\n getRawBodyInit(): TangoBodySource {\n return this.bodySourceInternal;\n }\n\n /**\n * Deep clone utility for body values. Preserves types and values as in the legacy implementation.\n * If the source is a stream, the stream will be cloned if readable, otherwise throws.\n */\n static deepCloneBody(body: TangoBodySource): TangoBodySource {\n if (body == null || typeof body === 'undefined') {\n return null;\n }\n if (typeof body === 'string') {\n return body;\n }\n if (isArrayBuffer(body)) {\n return body.slice(0);\n }\n if (isUint8Array(body)) {\n return new Uint8Array(body);\n }\n if (isBlob(body)) {\n return body.slice(0, body.size, body.type);\n }\n if (isFormData(body)) {\n // Deep clone FormData: only text fields (files not handled)\n // This is the best we can do in cross-platform without File support.\n const cloned = new FormData();\n for (const [k, v] of body) {\n // If value is File, attempt to clone (not fully implemented)\n if (isFile(v)) {\n // Note: Cloning File loses prototype, but rarely needed\n const file = new File([v], v.name, { type: v.type, lastModified: v.lastModified });\n cloned.append(k, file);\n } else {\n cloned.append(k, v as string);\n }\n }\n return cloned;\n }\n if (isReadableStream(body)) {\n throw new TypeError('Cannot deep clone a ReadableStream directly; use TangoBody.clone()');\n }\n if (TangoBody.isJsonValue(body)) {\n return JSON.parse(JSON.stringify(body));\n }\n return null;\n }\n\n /**\n * Clone the body instance and stream if possible.\n * If the source is a stream, the stream will be cloned if readable, otherwise throws.\n */\n clone(): TangoBody {\n if (this.bodyUsedInternal) throw new TypeError('Body has already been used.');\n if (isReadableStream(this.bodySourceInternal)) {\n if (typeof this.bodySourceInternal.tee !== 'function') {\n throw new TypeError('Cannot clone: body is a ReadableStream and tee() is not available');\n }\n const [streamForOriginal, streamForClone] = this.bodySourceInternal.tee();\n this.bodySourceInternal = streamForOriginal;\n return new TangoBody(streamForClone, this.headers);\n }\n const cloneSource = TangoBody.deepCloneBody(this.bodySourceInternal);\n return new TangoBody(cloneSource, this.headers);\n }\n\n /**\n * Helper for all readers. Only allows reading once.\n */\n private async consumeBody<T>(parser: (input: TangoBodySource) => Promise<T>): Promise<T> {\n if (this.bodyUsedInternal) {\n return Promise.reject(new TypeError('Body has already been consumed.'));\n }\n this.bodyUsedInternal = true;\n return parser(this.bodySourceInternal);\n }\n\n // --- Utility: Read a ReadableStream into ArrayBuffer ---\n static async readStreamToArrayBuffer(stream: ReadableStream<Uint8Array>): Promise<ArrayBuffer> {\n const chunks: Uint8Array[] = [];\n const reader = stream.getReader();\n let total = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n chunks.push(value);\n total += value.length;\n }\n }\n const joined = new Uint8Array(total);\n let off = 0;\n for (const chunk of chunks) {\n joined.set(chunk, off);\n off += chunk.length;\n }\n return joined.buffer.slice(0, joined.byteLength) as ArrayBuffer;\n }\n\n // --- Utility: Read a ReadableStream into Uint8Array ---\n static async readStreamToUint8Array(stream: ReadableStream<Uint8Array>): Promise<Uint8Array<ArrayBuffer>> {\n const buf = await TangoBody.readStreamToArrayBuffer(stream);\n return new Uint8Array(buf) as Uint8Array<ArrayBuffer>;\n }\n\n // --- Utility: Read a ReadableStream into text ---\n static async readStreamToText(stream: ReadableStream<Uint8Array>): Promise<string> {\n const arr = await TangoBody.readStreamToUint8Array(stream);\n return new TextDecoder().decode(arr);\n }\n\n /**\n * Determine the content type for this body, if possible.\n * Respects an explicitly passed header, otherwise infers from value type.\n */\n static detectContentType(body: TangoBodySource, providedType?: string): string | undefined {\n if (providedType) return providedType;\n if (body == null) return undefined;\n if (typeof body === 'string') return 'text/plain; charset=utf-8';\n if (isArrayBuffer(body) || isUint8Array(body)) return 'application/octet-stream';\n if (isBlob(body)) {\n // Blob.type may be set\n if (body.type) return body.type;\n return 'application/octet-stream';\n }\n if (isFormData(body)) return undefined;\n if (typeof body === 'object' && TangoBody.isJsonValue(body)) return 'application/json; charset=utf-8';\n if (isReadableStream(body)) return undefined; // Could be anything\n return undefined;\n }\n\n /**\n * Attempt to determine the content length, in bytes, for this body.\n * Only available for certain body types, otherwise returns undefined.\n */\n static async getContentLength(body: TangoBodySource): Promise<number | undefined> {\n if (body == null) return 0;\n if (typeof body === 'string') return new TextEncoder().encode(body).length;\n if (isUint8Array(body)) return body.byteLength;\n if (isArrayBuffer(body)) return body.byteLength;\n if (isBlob(body)) return body.size;\n if (TangoBody.isJsonValue(body)) return new TextEncoder().encode(JSON.stringify(body)).length;\n // All streams/FormData: undefined (not efficiently computable)\n return undefined;\n }\n}\n","import { isArrayBuffer, isBlob, isUint8Array } from '../runtime/index';\n\n/**\n * TangoHeaders extends the Web Headers class, adding ergonomic helpers\n * for common HTTP header patterns, convenience features, and a consistent API for\n * setting, appending, and deleting headers and cookies. This is designed to be\n * used by TangoResponse and other Tango HTTP utilities.\n * Additionally, provides helpers for safely setting Content-Length based on a known body,\n * and setting Content-Disposition for inline or attachment filenames.\n *\n * Includes helpers for request tracing and correlation headers:\n * - X-Request-Id\n * - traceparent (W3C Trace Context)\n * - Server-Timing\n * - X-Response-Time\n */\nexport class TangoHeaders extends Headers {\n static readonly BRAND = 'tango.http.headers' as const;\n readonly __tangoBrand: typeof TangoHeaders.BRAND = TangoHeaders.BRAND;\n\n constructor(headers?: HeadersInit) {\n super(headers);\n }\n\n static isTangoHeaders(value: unknown): value is TangoHeaders {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === TangoHeaders.BRAND\n );\n }\n\n /**\n * Sets the Content-Disposition header with type \"inline\" and the specified filename.\n * This is useful to indicate that the content should be displayed inline in the browser,\n * but with a suggested filename for saving.\n *\n * @param filename The filename to include in the Content-Disposition header.\n */\n setContentDispositionInline(filename: string): void {\n const encoded = encodeURIComponent(filename);\n this.set('Content-Disposition', `inline; filename=\"${encoded}\"; filename*=UTF-8''${encoded}`);\n }\n\n /**\n * Sets the Content-Disposition header with type \"attachment\" and the specified filename.\n * This is useful to indicate that the response should be downloaded as a file.\n *\n * @param filename The filename to include in the Content-Disposition header.\n */\n setContentDispositionAttachment(filename: string): void {\n const encoded = encodeURIComponent(filename);\n this.set('Content-Disposition', `attachment; filename=\"${encoded}\"; filename*=UTF-8''${encoded}`);\n }\n\n clone(): TangoHeaders {\n const copy = new TangoHeaders();\n for (const [name, value] of this.entries()) {\n copy.append(name, value);\n }\n return copy;\n }\n\n /**\n * Set a header, replacing any existing value.\n */\n setHeader(name: string, value: string): void {\n this.set(name, value);\n }\n\n /**\n * Append a header, adding to any existing value(s) for the name.\n */\n appendHeader(name: string, value: string): void {\n this.append(name, value);\n }\n\n /**\n * Get a header value (first value if header is repeated).\n */\n getHeader(name: string): string | null {\n return this.get(name);\n }\n\n /**\n * Check if a header exists.\n */\n hasHeader(name: string): boolean {\n return this.has(name);\n }\n\n /**\n * Delete a header.\n */\n deleteHeader(name: string): void {\n this.delete(name);\n }\n\n /**\n * Ensure a header is present only once and fully replaces the old value.\n */\n ensureUnique(name: string, value: string): void {\n this.delete(name);\n this.set(name, value);\n }\n\n /**\n * Add a field (or fields) to the Vary header, merging with existing values.\n */\n vary(...fields: string[]): void {\n if (fields.length === 0) return;\n const key = 'Vary';\n const prev = this.get(key);\n const nextSet = new Set<string>();\n if (prev) {\n for (const v of prev.split(',')) {\n if (v.trim()) nextSet.add(v.trim());\n }\n }\n for (const f of fields) {\n if (f.trim()) nextSet.add(f.trim());\n }\n this.set(key, Array.from(nextSet).join(', '));\n }\n\n /**\n * Set a cookie header (for Set-Cookie).\n * @param name\n * @param value\n * @param options\n */\n setCookie(\n name: string,\n value: string,\n options?: {\n domain?: string;\n expires?: Date;\n httpOnly?: boolean;\n maxAge?: number;\n path?: string;\n sameSite?: 'Strict' | 'Lax' | 'None';\n secure?: boolean;\n priority?: 'Low' | 'Medium' | 'High';\n partitioned?: boolean;\n }\n ): void {\n this.append('Set-Cookie', TangoHeaders.serializeCookie(name, value, options));\n }\n\n /**\n * Append (additionally) a new cookie.\n */\n appendCookie(\n name: string,\n value: string,\n options?: {\n domain?: string;\n expires?: Date;\n httpOnly?: boolean;\n maxAge?: number;\n path?: string;\n sameSite?: 'Strict' | 'Lax' | 'None';\n secure?: boolean;\n priority?: 'Low' | 'Medium' | 'High';\n partitioned?: boolean;\n }\n ): void {\n this.append('Set-Cookie', TangoHeaders.serializeCookie(name, value, options));\n }\n\n /**\n * Delete a cookie (\"unset\" it via expired date).\n */\n deleteCookie(\n name: string,\n options?: {\n domain?: string;\n path?: string;\n sameSite?: 'Strict' | 'Lax' | 'None';\n secure?: boolean;\n priority?: 'Low' | 'Medium' | 'High';\n partitioned?: boolean;\n }\n ): void {\n this.setCookie(name, '', {\n ...options,\n expires: new Date(0),\n maxAge: 0,\n });\n }\n\n /**\n * Serialize a cookie for the Set-Cookie header line.\n */\n private static serializeCookie(\n name: string,\n value: string,\n options: {\n domain?: string;\n expires?: Date;\n httpOnly?: boolean;\n maxAge?: number;\n path?: string;\n sameSite?: 'Strict' | 'Lax' | 'None';\n secure?: boolean;\n priority?: 'Low' | 'Medium' | 'High';\n partitioned?: boolean;\n } = {}\n ): string {\n let cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value ?? '');\n if (options.domain) cookie += `; Domain=${options.domain}`;\n if (options.path) cookie += `; Path=${options.path}`;\n else cookie += '; Path=/';\n if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;\n if (typeof options.maxAge === 'number') cookie += `; Max-Age=${options.maxAge}`;\n if (options.secure) cookie += '; Secure';\n if (options.httpOnly) cookie += '; HttpOnly';\n if (options.sameSite) cookie += `; SameSite=${options.sameSite}`;\n if (options.priority) cookie += `; Priority=${options.priority}`;\n if (options.partitioned) cookie += '; Partitioned';\n return cookie;\n }\n\n /**\n * Add or override Cache-Control header with helpers for common policies.\n */\n cacheControl(control: string | Record<string, string | number | boolean | undefined>): void {\n if (typeof control === 'string') {\n this.set('Cache-Control', control);\n return;\n }\n // Compose Cache-Control from object\n const parts: string[] = [];\n for (const [k, v] of Object.entries(control)) {\n if (typeof v === 'boolean') {\n if (v) parts.push(k.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase()));\n } else if (typeof v === 'number' || (typeof v === 'string' && v.length > 0)) {\n parts.push(`${k.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase())}=${v}`);\n }\n }\n if (parts.length) {\n this.set('Cache-Control', parts.join(', '));\n }\n }\n\n /**\n * Set the Location header.\n */\n location(url: string): void {\n this.set('Location', url);\n }\n\n /**\n * Set the Content-Type header.\n */\n contentType(mime: string): void {\n this.set('Content-Type', mime);\n }\n\n /**\n * Attempt to guess and set the Content-Type header from a file (string or Blob) and optional filename.\n *\n * @param file File-like input (string or Blob)\n * @param filename Optional filename to help guess mime type by extension\n */\n setContentTypeByFile(file: unknown, filename?: string): void {\n // do not overwrite explicit content-type\n if (this.has('Content-Type')) return;\n\n // If file is a string and a filename is provided or can be guessed from file path\n if (typeof file === 'string' && filename) {\n // Guess type by extension\n const ext = filename.split('.').pop()?.toLowerCase() ?? '';\n const map: Record<string, string> = {\n txt: 'text/plain',\n text: 'text/plain',\n html: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n json: 'application/json',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n pdf: 'application/pdf',\n svg: 'image/svg+xml',\n ico: 'image/x-icon',\n md: 'text/markdown',\n };\n const mime = map[ext];\n if (mime) {\n this.set('Content-Type', mime);\n } else {\n this.set('Content-Type', 'application/octet-stream');\n }\n return;\n }\n\n // If it's a Blob, use its type, or fallback\n if (isBlob(file)) {\n if (file.type && file.type !== '') {\n this.set('Content-Type', file.type);\n } else {\n this.set('Content-Type', 'application/octet-stream');\n }\n return;\n }\n\n // Fallback\n this.set('Content-Type', 'application/octet-stream');\n }\n\n /**\n * Sets the Content-Length header, inferring it from the body if not explicitly provided.\n * If the body is a string, ArrayBuffer, Uint8Array, Blob/Buffer (or has a .size or .length property),\n * the length is computed. For unsupported types, does nothing.\n * Mirrors logic from TangoResponse.ts, but generalized for use anywhere.\n */\n setContentLengthFromBody(body: unknown): void {\n if (this.has('Content-Length') || body === null || body === undefined) {\n return;\n }\n\n let len: number | undefined;\n\n if (typeof body === 'string') {\n len = new TextEncoder().encode(body).length;\n } else if (isArrayBuffer(body)) {\n len = body.byteLength;\n } else if (isUint8Array(body)) {\n len = body.byteLength;\n } else if (isBlob(body)) {\n len = body.size;\n }\n // Node.js Buffer support (Buffer.isBuffer and .length)\n else if (\n typeof Buffer !== 'undefined' &&\n typeof (Buffer as any).isBuffer === 'function' &&\n (Buffer as any).isBuffer(body)\n ) {\n len = (body as { length: number }).length;\n }\n // Generic \"size\" (number) property\n else if (typeof (body as any)?.size === 'number') {\n len = (body as { size: number }).size;\n }\n // Generic \"length\" (number) property but not string/ArrayBuffer/Uint8Array/etc\n else if (\n typeof (body as any)?.length === 'number' &&\n typeof body !== 'string' &&\n !isArrayBuffer(body) &&\n !isUint8Array(body)\n ) {\n len = (body as { length: number }).length;\n }\n\n if (typeof len === 'number') {\n this.set('Content-Length', len.toString());\n }\n }\n\n /**\n * Set or update the X-Request-Id header. Used for associating a request/response with a unique id.\n * @param id The request id value to set.\n */\n withRequestId(id: string): this {\n this.set('X-Request-Id', id);\n return this;\n }\n\n /**\n * Set or update the traceparent header. Used for distributed trace context propagation (W3C Trace Context).\n * @param value The traceparent value (should be a valid traceparent header value).\n */\n withTraceParent(value: string): this {\n this.set('traceparent', value);\n return this;\n }\n\n /**\n * Set or append a value to the Server-Timing header.\n * For a single metric, supply name, and optionally dur and desc.\n * For advanced usage (many metrics), set the value directly or use appendServerTimingRaw.\n *\n * @param name Name of the server-timing metric (e.g., 'total', 'db').\n * @param dur Optional duration in ms.\n * @param desc Optional string description.\n */\n withServerTiming(name: string, dur?: number, desc?: string): this {\n // Build the metric string per spec: <metric>=<value>;dur=<duration>;desc=\"<description>\"\n let metric = name;\n if (typeof dur === 'number') {\n metric += `;dur=${dur}`;\n }\n if (desc) {\n metric += `;desc=\"${desc.replace(/\"/g, '\\\\\"')}\"`;\n }\n\n // Set or append. If header exists, append, separated by comma.\n const prev = this.get('Server-Timing');\n if (prev && prev.length > 0) {\n this.set('Server-Timing', prev + ', ' + metric);\n } else {\n this.set('Server-Timing', metric);\n }\n return this;\n }\n\n /**\n * Directly append a raw Server-Timing metric value.\n * This is useful for advanced cases where you have multiple metrics assembled.\n * @param value The server-timing value chunk to append.\n */\n appendServerTimingRaw(value: string): this {\n const prev = this.get('Server-Timing');\n if (prev && prev.length > 0) {\n this.set('Server-Timing', prev + ', ' + value);\n } else {\n this.set('Server-Timing', value);\n }\n return this;\n }\n\n /**\n * Set or update X-Response-Time header.\n * @param ms Elapsed time in milliseconds (number or string for flexibility).\n */\n withResponseTime(ms: number | string): this {\n this.set('X-Response-Time', typeof ms === 'number' ? `${ms}ms` : ms);\n return this;\n }\n\n /**\n * Return the current value of X-Request-Id.\n */\n getRequestId(): string | null {\n return this.get('X-Request-Id');\n }\n\n /**\n * Return the current value of traceparent header.\n */\n getTraceParent(): string | null {\n return this.get('traceparent');\n }\n\n /**\n * Return the current Server-Timing string, if set.\n */\n getServerTiming(): string | null {\n return this.get('Server-Timing');\n }\n\n /**\n * Return the current X-Response-Time string, if set.\n */\n getResponseTime(): string | null {\n return this.get('X-Response-Time');\n }\n}\n","import type { JsonValue } from './TangoBody';\nimport { isArrayBuffer, isBlob, isFormData, isReadableStream, isUint8Array, isURLSearchParams } from '../runtime/index';\n\ntype TangoRequestInit = {\n method?: string;\n headers?: HeadersInit;\n body?: BodyInit | JsonValue | null;\n redirect?: RequestRedirect;\n cache?: RequestCache;\n credentials?: RequestCredentials;\n integrity?: string;\n keepalive?: boolean;\n mode?: RequestMode;\n referrer?: string;\n referrerPolicy?: ReferrerPolicy;\n signal?: AbortSignal;\n};\nexport class TangoRequest implements Request {\n static readonly BRAND = 'tango.http.request' as const;\n readonly __tangoBrand: typeof TangoRequest.BRAND = TangoRequest.BRAND;\n\n private request: Request;\n private bodySourceValue: BodyInit | JsonValue | null;\n\n constructor(input: string | Request, init: TangoRequestInit = {}) {\n const sourceRequest = typeof input === 'string' ? undefined : input;\n const method = (init.method ?? sourceRequest?.method ?? 'GET').toUpperCase();\n const headers = new Headers(init.headers ?? sourceRequest?.headers);\n const normalizedBody = this.normalizeBody(init.body, headers, method);\n\n const requestInit: RequestInit = {\n method,\n headers,\n redirect: init.redirect ?? sourceRequest?.redirect,\n cache: init.cache ?? sourceRequest?.cache,\n credentials: init.credentials ?? sourceRequest?.credentials,\n integrity: init.integrity ?? sourceRequest?.integrity,\n keepalive: init.keepalive ?? sourceRequest?.keepalive,\n mode: init.mode ?? sourceRequest?.mode,\n referrer: init.referrer ?? sourceRequest?.referrer,\n referrerPolicy: init.referrerPolicy ?? sourceRequest?.referrerPolicy,\n signal: init.signal ?? sourceRequest?.signal,\n };\n\n if (normalizedBody !== undefined) {\n requestInit.body = normalizedBody;\n }\n\n this.request = new Request(input, requestInit);\n this.bodySourceValue = normalizedBody ?? null;\n }\n\n static isTangoRequest(value: unknown): value is TangoRequest {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === TangoRequest.BRAND\n );\n }\n\n get cache(): RequestCache {\n return this.request.cache;\n }\n\n get credentials(): RequestCredentials {\n return this.request.credentials;\n }\n\n get destination(): RequestDestination {\n return this.request.destination;\n }\n\n get headers(): Headers {\n return this.request.headers;\n }\n\n get integrity(): string {\n return this.request.integrity;\n }\n\n get keepalive(): boolean {\n return this.request.keepalive;\n }\n\n get method(): string {\n return this.request.method;\n }\n\n get mode(): RequestMode {\n return this.request.mode;\n }\n\n get redirect(): RequestRedirect {\n return this.request.redirect;\n }\n\n get referrer(): string {\n return this.request.referrer;\n }\n\n get referrerPolicy(): ReferrerPolicy {\n return this.request.referrerPolicy;\n }\n\n get signal(): AbortSignal {\n return this.request.signal;\n }\n\n get url(): string {\n return this.request.url;\n }\n\n get body(): Request['body'] {\n return this.request.body;\n }\n\n get bodyUsed(): boolean {\n return this.request.bodyUsed;\n }\n\n get bodySource(): BodyInit | JsonValue | null {\n return this.bodySourceValue;\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n return this.request.arrayBuffer();\n }\n\n async blob(): Promise<Blob> {\n return this.request.blob();\n }\n\n async bytes(): Promise<Uint8Array<ArrayBuffer>> {\n const requestWithBytes = this.request as Request & { bytes?: () => Promise<Uint8Array<ArrayBuffer>> };\n if (typeof requestWithBytes.bytes === 'function') {\n return requestWithBytes.bytes();\n }\n const buffer = await this.request.arrayBuffer();\n return new Uint8Array(buffer);\n }\n\n async formData(): Promise<FormData> {\n return this.request.formData();\n }\n\n async json<T = unknown>(): Promise<T> {\n return this.request.json() as Promise<T>;\n }\n\n async text(): Promise<string> {\n return this.request.text();\n }\n\n clone(): TangoRequest {\n return new TangoRequest(this.request.clone());\n }\n\n private normalizeBody(\n body: BodyInit | JsonValue | null | undefined,\n headers: Headers,\n method: string\n ): BodyInit | undefined {\n if (method === 'GET' || method === 'HEAD') {\n return undefined;\n }\n if (body == null) {\n return undefined;\n }\n if (typeof body === 'string') {\n return body;\n }\n if (isArrayBuffer(body) || isUint8Array(body) || isBlob(body)) {\n return body;\n }\n if (isURLSearchParams(body) || isFormData(body) || isReadableStream(body)) {\n return body as BodyInit;\n }\n\n const serialized = JSON.stringify(body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json; charset=utf-8');\n }\n return serialized;\n }\n}\n","import { TangoError, type ErrorEnvelope, type ErrorDetails, type ProblemDetails } from '../errors/TangoError';\nimport { isArrayBuffer, isBlob, isReadableStream } from '../runtime/index';\nimport { TangoHeaders } from '../http/TangoHeaders';\nimport { TangoBody, type JsonValue } from './TangoBody';\n\ntype TangoResponseInit = {\n body?: BodyInit | JsonValue | null;\n headers?: HeadersInit;\n ok?: boolean;\n redirected?: boolean;\n status?: number;\n statusText?: string;\n type?: ResponseType;\n url?: string;\n};\nexport class TangoResponse implements Response {\n static readonly BRAND = 'tango.http.response' as const;\n readonly __tangoBrand: typeof TangoResponse.BRAND = TangoResponse.BRAND;\n private tangoBody: TangoBody;\n private okValue: boolean | undefined;\n readonly headers: TangoHeaders;\n readonly redirected: boolean;\n readonly status: number;\n readonly statusText: string;\n readonly type: ResponseType;\n readonly url: string;\n readonly body: Response['body'];\n\n static isTangoResponse(value: unknown): value is TangoResponse {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === TangoResponse.BRAND\n );\n }\n\n // bodySource proxy for legacy convenience, but prefer using TangoBody/headers directly.\n get bodySource(): BodyInit | JsonValue | null {\n return this.tangoBody.bodySource;\n }\n\n constructor(init: TangoResponseInit = {}) {\n this.headers = new TangoHeaders(init.headers);\n this.redirected = Boolean(init.redirected);\n this.status = typeof init.status === 'number' ? init.status : 200;\n this.statusText = init.statusText || '';\n this.type = init.type || 'default';\n this.url = init.url || '';\n this.okValue = typeof init.ok === 'boolean' ? init.ok : undefined;\n\n this.tangoBody = new TangoBody(init.body ?? null, this.headers);\n this.body = isReadableStream(this.tangoBody.bodySource) ? this.tangoBody.bodySource : null;\n }\n\n get ok(): boolean {\n if (typeof this.okValue === 'boolean') return this.okValue;\n return this.status >= 200 && this.status < 300;\n }\n\n get bodyUsed(): boolean {\n return this.tangoBody.bodyUsed;\n }\n\n setHeader(name: string, value: string): void {\n this.headers.set(name, value);\n }\n appendHeader(name: string, value: string): void {\n this.headers.append(name, value);\n }\n getHeader(name: string): string | null {\n return this.headers.get(name);\n }\n hasHeader(name: string): boolean {\n return this.headers.has(name);\n }\n deleteHeader(name: string): void {\n this.headers.delete(name);\n }\n vary(...fields: string[]): void {\n this.headers.vary(...fields);\n }\n\n setCookie(name: string, value: string, options?: Parameters<TangoHeaders['setCookie']>[2]): void {\n this.headers.setCookie(name, value, options);\n }\n appendCookie(name: string, value: string, options?: Parameters<TangoHeaders['appendCookie']>[2]): void {\n this.headers.appendCookie(name, value, options);\n }\n deleteCookie(name: string, options?: Parameters<TangoHeaders['deleteCookie']>[1]): void {\n this.headers.deleteCookie(name, options);\n }\n\n cacheControl(control: Parameters<TangoHeaders['cacheControl']>[0]): void {\n this.headers.cacheControl(control);\n }\n\n location(url: string): void {\n this.headers.location(url);\n }\n\n contentType(mime: string): void {\n this.headers.contentType(mime);\n }\n\n // ---- Trace & Correlation helper methods ----\n\n /**\n * Set the X-Request-Id header (request correlation).\n * Returns this for fluent chaining.\n */\n withRequestId(requestId: string | undefined | null): this {\n if (requestId != null && typeof requestId === 'string' && requestId !== '') {\n this.headers.set('X-Request-Id', requestId);\n }\n return this;\n }\n\n /**\n * Set the traceparent header (W3C Trace Context propagation).\n * Returns this for fluent chaining.\n */\n withTraceparent(traceparent: string | undefined | null): this {\n if (traceparent != null && typeof traceparent === 'string' && traceparent !== '') {\n this.headers.set('traceparent', traceparent);\n }\n return this;\n }\n\n /**\n * Set the Server-Timing header.\n * Accepts a string or array of timing metrics.\n * Returns this for fluent chaining.\n */\n withServerTiming(timing: string | string[]): this {\n if (Array.isArray(timing)) {\n this.headers.set('Server-Timing', timing.join(', '));\n } else if (typeof timing === 'string') {\n this.headers.set('Server-Timing', timing);\n }\n return this;\n }\n\n /**\n * Set the X-Response-Time header (in ms).\n * Numeric or formatted string (e.g. \"76ms\").\n * Returns this for fluent chaining.\n */\n withResponseTime(time: number | string): this {\n if (typeof time === 'number') {\n this.headers.set('X-Response-Time', `${time}ms`);\n } else if (typeof time === 'string') {\n this.headers.set('X-Response-Time', time);\n }\n return this;\n }\n\n /**\n * Propagate common tracing/correlation headers from provided Headers, TangoHeaders, or plain object.\n * Known headers: x-request-id, traceparent, server-timing\n * Returns this for fluent chaining.\n */\n propagateTraceHeaders(input: HeadersInit): this {\n const incoming = new TangoHeaders(input);\n const traceHeaderNames = [\n 'x-request-id',\n 'traceparent',\n 'server-timing',\n // If you want to propagate response time, add 'x-response-time',\n ];\n for (const name of traceHeaderNames) {\n const value = incoming.get(name);\n if (value != null) this.headers.set(name, value);\n }\n return this;\n }\n\n static json(\n data: JsonValue,\n init?: Omit<TangoResponseInit, 'body' | 'headers'> & { headers?: HeadersInit }\n ): TangoResponse {\n const headers = new TangoHeaders(init?.headers);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json; charset=utf-8');\n }\n const body = JSON.stringify(data);\n if (!headers.has('Content-Length')) {\n headers.set('Content-Length', new TextEncoder().encode(body).length.toString());\n }\n return new TangoResponse({\n ...init,\n body,\n headers,\n });\n }\n\n static text(\n text: string,\n init?: Omit<TangoResponseInit, 'body' | 'headers'> & { headers?: HeadersInit }\n ): TangoResponse {\n const headers = new TangoHeaders(init?.headers);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'text/plain; charset=utf-8');\n }\n if (!headers.has('Content-Length')) {\n headers.set('Content-Length', new TextEncoder().encode(text).length.toString());\n }\n return new TangoResponse({\n ...init,\n body: text,\n headers,\n });\n }\n\n static html(\n html: string,\n init?: Omit<TangoResponseInit, 'body' | 'headers'> & { headers?: HeadersInit }\n ): TangoResponse {\n const headers = new TangoHeaders(init?.headers);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'text/html; charset=utf-8');\n }\n if (!headers.has('Content-Length')) {\n headers.set('Content-Length', new TextEncoder().encode(html).length.toString());\n }\n return new TangoResponse({\n ...init,\n body: html,\n headers,\n });\n }\n\n static stream(\n stream: ReadableStream<Uint8Array>,\n init?: Omit<TangoResponseInit, 'body' | 'headers'> & { headers?: HeadersInit }\n ): TangoResponse {\n return new TangoResponse({\n ...init,\n body: stream,\n headers: new TangoHeaders(init?.headers),\n });\n }\n\n static redirect(\n url: string,\n status: number = 302,\n init?: Omit<TangoResponseInit, 'body' | 'headers' | 'status'> & {\n headers?: HeadersInit;\n }\n ): TangoResponse {\n const headers = new TangoHeaders(init?.headers);\n headers.set('Location', url);\n return new TangoResponse({\n ...init,\n body: undefined,\n status,\n headers,\n redirected: true,\n url,\n });\n }\n\n static noContent(\n init?: Omit<TangoResponseInit, 'body' | 'status' | 'headers'> & {\n headers?: HeadersInit;\n }\n ): TangoResponse {\n const headers = new TangoHeaders(init?.headers);\n return new TangoResponse({\n ...init,\n body: undefined,\n status: 204,\n headers,\n });\n }\n\n static created(\n location?: string,\n body?: JsonValue,\n init?: Omit<TangoResponseInit, 'body' | 'status' | 'headers'> & {\n headers?: HeadersInit;\n }\n ): TangoResponse {\n const headers = new TangoHeaders(init?.headers);\n if (location) {\n headers.set('Location', location);\n }\n let respBody: BodyInit | undefined;\n if (body !== undefined) {\n respBody = JSON.stringify(body);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json; charset=utf-8');\n }\n }\n if (typeof respBody === 'string' && !headers.has('Content-Length')) {\n headers.set('Content-Length', new TextEncoder().encode(respBody).length.toString());\n } else if (isArrayBuffer(respBody) && !headers.has('Content-Length')) {\n headers.set('Content-Length', respBody.byteLength.toString());\n } else if (isBlob(respBody) && !headers.has('Content-Length')) {\n headers.set('Content-Length', respBody.size.toString());\n }\n return new TangoResponse({\n ...init,\n body: respBody,\n status: 201,\n headers,\n });\n }\n\n static error<TDetails extends ErrorDetails = null>(\n error: TangoError | ProblemDetails<TDetails>,\n init?: Omit<TangoResponseInit, 'body' | 'headers'> & { headers?: HeadersInit }\n ): TangoResponse {\n let code: string;\n let message: string;\n let details: ErrorDetails = undefined;\n let fields: Record<string, string[]> | undefined = undefined;\n let status = init?.status ?? 500;\n\n if (TangoError.isTangoError(error)) {\n const envelope = error.toErrorEnvelope();\n code = envelope.error.code;\n message = envelope.error.message;\n details = envelope.error.details;\n fields = envelope.error.fields;\n status = error.status;\n } else {\n code = error.code;\n message = error.message;\n details = error.details;\n fields = error.fields;\n }\n\n return TangoResponse.problem(\n {\n code,\n message,\n details,\n fields,\n },\n {\n ...init,\n status,\n }\n );\n }\n\n static badRequest<TDetails extends ErrorDetails = null>(\n detail?: string | TangoError | ProblemDetails<TDetails>,\n init?: Omit<TangoResponseInit, 'body' | 'status' | 'headers'> & {\n headers?: HeadersInit;\n }\n ): TangoResponse {\n if (TangoError.isTangoError(detail) || TangoError.isProblemDetails(detail)) {\n return TangoResponse.error(detail, { ...init, status: 400 });\n }\n\n if (typeof detail === 'string') {\n return TangoResponse.error(\n {\n code: 'bad_request',\n message: detail,\n },\n { ...init, status: 400 }\n );\n }\n\n return TangoResponse.error(\n {\n code: 'bad_request',\n message: 'Bad Request',\n },\n { ...init, status: 400 }\n );\n }\n\n static unauthorized<TDetails extends ErrorDetails = null>(\n detail?: string | TangoError | ProblemDetails<TDetails>,\n init?: Omit<TangoResponseInit, 'body' | 'status' | 'headers'> & {\n headers?: HeadersInit;\n }\n ): TangoResponse {\n if (TangoError.isTangoError(detail) || TangoError.isProblemDetails(detail)) {\n return TangoResponse.error(detail, { ...init, status: 401 });\n }\n if (typeof detail === 'string') {\n return TangoResponse.error(\n {\n code: 'unauthorized',\n message: detail,\n },\n { ...init, status: 401 }\n );\n }\n\n return TangoResponse.error(\n {\n code: 'unauthorized',\n message: 'Unauthorized',\n },\n { ...init, status: 401 }\n );\n }\n\n static forbidden<TDetails extends ErrorDetails = null>(\n detail?: string | TangoError | ProblemDetails<TDetails>,\n init?: Omit<TangoResponseInit, 'body' | 'status' | 'headers'> & {\n headers?: HeadersInit;\n }\n ): TangoResponse {\n if (TangoError.isTangoError(detail) || TangoError.isProblemDetails(detail)) {\n return TangoResponse.error(detail, { ...init, status: 403 });\n }\n\n if (typeof detail === 'string') {\n return TangoResponse.error(\n {\n code: 'forbidden',\n message: detail,\n },\n { ...init, status: 403 }\n );\n }\n\n return TangoResponse.error(\n {\n code: 'forbidden',\n message: 'Forbidden',\n },\n { ...init, status: 403 }\n );\n }\n\n static notFound<TDetails extends ErrorDetails = null>(\n detail?: string | TangoError | ProblemDetails<TDetails>,\n init?: Omit<TangoResponseInit, 'body' | 'status' | 'headers'> & {\n headers?: HeadersInit;\n }\n ): TangoResponse {\n if (TangoError.isTangoError(detail) || TangoError.isProblemDetails(detail)) {\n return TangoResponse.error(detail, { ...init, status: 404 });\n }\n\n if (typeof detail === 'string') {\n return TangoResponse.error(\n {\n code: 'not_found',\n message: detail,\n },\n { ...init, status: 404 }\n );\n }\n\n return TangoResponse.error(\n {\n code: 'not_found',\n message: 'Not Found',\n },\n { ...init, status: 404 }\n );\n }\n\n static conflict<TDetails extends ErrorDetails = null>(\n detail?: string | TangoError | ProblemDetails<TDetails>,\n init?: Omit<TangoResponseInit, 'body' | 'status' | 'headers'> & {\n headers?: HeadersInit;\n }\n ): TangoResponse {\n if (TangoError.isTangoError(detail) || TangoError.isProblemDetails(detail)) {\n return TangoResponse.error(detail, { ...init, status: 409 });\n }\n\n if (typeof detail === 'string') {\n return TangoResponse.error(\n {\n code: 'conflict',\n message: detail,\n },\n { ...init, status: 409 }\n );\n }\n\n return TangoResponse.error(\n {\n code: 'conflict',\n message: 'Conflict',\n },\n { ...init, status: 409 }\n );\n }\n\n static unprocessableEntity<TDetails extends ErrorDetails = null>(\n detail?: string | TangoError | ProblemDetails<TDetails>,\n init?: Omit<TangoResponseInit, 'body' | 'status' | 'headers'> & {\n headers?: HeadersInit;\n }\n ): TangoResponse {\n if (TangoError.isTangoError(detail) || TangoError.isProblemDetails(detail)) {\n return TangoResponse.error(detail, { ...init, status: 422 });\n }\n\n if (typeof detail === 'string') {\n return TangoResponse.error(\n {\n code: 'unprocessable_entity',\n message: detail,\n },\n { ...init, status: 422 }\n );\n }\n\n return TangoResponse.error(\n {\n code: 'unprocessable_entity',\n message: 'Unprocessable Entity',\n },\n { ...init, status: 422 }\n );\n }\n\n static tooManyRequests<TDetails extends ErrorDetails = null>(\n detail?: string | TangoError | ProblemDetails<TDetails>,\n init?: Omit<TangoResponseInit, 'body' | 'status' | 'headers'> & {\n headers?: HeadersInit;\n }\n ): TangoResponse {\n if (TangoError.isTangoError(detail) || TangoError.isProblemDetails(detail)) {\n return TangoResponse.error(detail, { ...init, status: 429 });\n }\n\n if (typeof detail === 'string') {\n return TangoResponse.error(\n {\n code: 'too_many_requests',\n message: detail,\n },\n { ...init, status: 429 }\n );\n }\n\n return TangoResponse.error(\n {\n code: 'too_many_requests',\n message: 'Too Many Requests',\n },\n { ...init, status: 429 }\n );\n }\n\n static problem<TDetails extends ErrorDetails = null>(\n problem?: string | TangoError | ProblemDetails<TDetails> | unknown,\n init?: Omit<TangoResponseInit, 'body' | 'headers'> & {\n headers?: HeadersInit;\n status?: number;\n }\n ): TangoResponse {\n let status = init?.status ?? 500;\n const headers = new TangoHeaders(init?.headers);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/problem+json; charset=utf-8');\n }\n\n let code = 'error';\n let message = 'An error occurred';\n let details: ErrorDetails = undefined;\n let fields: Record<string, string[]> | undefined;\n\n if (TangoError.isTangoError(problem)) {\n const envelope = problem.toErrorEnvelope();\n status = problem.status;\n code = envelope.error.code;\n message = envelope.error.message;\n details = envelope.error.details;\n fields = envelope.error.fields;\n } else if (TangoError.isProblemDetails(problem)) {\n code = problem.code;\n message = problem.message;\n details = problem.details;\n fields = problem.fields;\n } else if (typeof problem === 'string') {\n message = problem;\n } else if (problem && typeof problem === 'object') {\n const extracted = problem as {\n code?: string;\n message?: string;\n details?: ErrorDetails;\n fields?: Record<string, string[]>;\n };\n if (typeof extracted.code === 'string') code = extracted.code;\n if (typeof extracted.message === 'string') message = extracted.message;\n details = extracted.details;\n fields = extracted.fields;\n }\n\n const envelope: ErrorEnvelope<ErrorDetails> = {\n error: {\n code,\n message,\n ...(details !== undefined ? { details } : {}),\n ...(fields ? { fields } : {}),\n },\n };\n\n const body = JSON.stringify(envelope);\n if (!headers.has('Content-Length')) {\n headers.set('Content-Length', new TextEncoder().encode(body).length.toString());\n }\n return new TangoResponse({\n ...init,\n headers,\n status,\n body,\n });\n }\n\n clone(): TangoResponse {\n if (this.bodyUsed) {\n throw new TypeError('Body has already been used');\n }\n const clonedBody = this.tangoBody.clone();\n return new TangoResponse({\n body: clonedBody.bodySource,\n headers: this.headers.clone(),\n ok: this.okValue,\n redirected: this.redirected,\n status: this.status,\n statusText: this.statusText,\n type: this.type,\n url: this.url,\n });\n }\n\n //---- Spec Response interface fields and methods ----\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n return this.tangoBody.arrayBuffer();\n }\n async blob(): Promise<Blob> {\n return this.tangoBody.blob();\n }\n async bytes(): Promise<Uint8Array<ArrayBuffer>> {\n return this.tangoBody.bytes();\n }\n async formData(): Promise<FormData> {\n return this.tangoBody.formData();\n }\n async json<T = unknown>(): Promise<T> {\n return this.tangoBody.json<T>();\n }\n async text(): Promise<string> {\n return this.tangoBody.text();\n }\n\n /**\n * Returns a response for serving a file.\n */\n static file(\n file: Blob | Uint8Array | ArrayBuffer | ReadableStream<Uint8Array> | string,\n opts?: {\n filename?: string;\n contentType?: string;\n init?: Omit<TangoResponseInit, 'body' | 'headers'> & { headers?: HeadersInit };\n }\n ): TangoResponse {\n const headers = new TangoHeaders(opts?.init?.headers ?? {});\n if (opts?.filename) {\n // Serve as an attachment by default, but not 'download'\n headers.setContentDispositionInline(opts.filename);\n }\n if (opts?.contentType && !headers.has('Content-Type')) {\n headers.set('Content-Type', opts.contentType);\n } else if (!headers.has('Content-Type')) {\n headers.setContentTypeByFile(file, opts?.filename);\n }\n if (!headers.has('Content-Length')) {\n headers.setContentLengthFromBody(file);\n }\n return new TangoResponse({\n ...opts?.init,\n body: file as BodyInit,\n headers,\n });\n }\n\n /**\n * Returns a response that prompts the user to download the file.\n */\n static download(\n file: Blob | Uint8Array | ArrayBuffer | ReadableStream<Uint8Array> | string,\n opts?: {\n filename?: string;\n contentType?: string;\n init?: Omit<TangoResponseInit, 'body' | 'headers'> & { headers?: HeadersInit };\n }\n ): TangoResponse {\n const headers = new TangoHeaders(opts?.init?.headers ?? {});\n if (opts?.filename) {\n headers.setContentDispositionAttachment(opts.filename);\n } else {\n headers.set('Content-Disposition', 'attachment');\n }\n if (opts?.contentType && !headers.has('Content-Type')) {\n headers.set('Content-Type', opts.contentType);\n } else if (!headers.has('Content-Type')) {\n headers.setContentTypeByFile(file, opts?.filename);\n }\n if (!headers.has('Content-Length')) {\n headers.setContentLengthFromBody(file);\n }\n return new TangoResponse({\n ...opts?.init,\n body: file as BodyInit,\n headers,\n });\n }\n\n /**\n * Returns a plain object debug representation of this response: { status, headers: { ... }, bodyType: ... }.\n * Intended for testing and debug tooling.\n */\n toJSON(): { status: number; headers: Record<string, string>; bodyType: string } {\n return {\n status: this.status,\n headers: Object.fromEntries(this.headers.entries()),\n bodyType: this.tangoBody ? this.tangoBody.bodyType : typeof this.bodySource,\n };\n }\n\n /**\n * Returns the original body for test/debug purposes *without* consuming the stream.\n *\n * @throws {Error} if called in a production environment. Provided only for test or debug.\n * @remarks\n * This method gives direct access to the original body as provided to the constructor,\n * before consumption. It is primarily intended for use in test code, introspection, or\n * advanced debug tools. **Do not rely on this in production.**\n * In production (`process.env.NODE_ENV === 'production'`), using this method will throw.\n *\n * This method is _not_ part of the web Response interface, and is intentionally private/internal.\n */\n\n public __peekBodyForTestOnly(): BodyInit | JsonValue | null {\n // Strong guard against accidental shipping in production\n if (\n typeof process !== 'undefined' &&\n process.env &&\n (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'prod')\n ) {\n throw new Error('peekBody() is not available in production builds. For test/debug use only.');\n }\n return this.tangoBody.bodySource;\n }\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nimport { TangoBody, type JsonValue } from './TangoBody';\nimport { TangoHeaders } from './TangoHeaders';\nimport { TangoRequest } from './TangoRequest';\nimport { TangoResponse } from './TangoResponse';\n\nexport { TangoBody, TangoHeaders, TangoRequest, TangoResponse };\nexport type { JsonValue };\n"],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import type { Result } from './Result';
2
- /**
3
- * Represents a failed result containing an error.
4
- *
5
- * @template E - The type of the contained error
6
- */
7
- export declare class Err<E> {
8
- readonly error: E;
9
- static readonly BRAND: "tango.result.err";
10
- readonly __tangoBrand: typeof Err.BRAND;
11
- readonly ok: false;
12
- constructor(error: E);
13
- static isErr<E>(value: unknown): value is Err<E>;
14
- isOk(): false;
15
- isErr(): this is Err<E>;
16
- map<U>(_fn: (value: never) => U): Err<E>;
17
- mapErr<F>(fn: (error: E) => F): Err<F>;
18
- flatMap<U>(_fn: (value: never) => Result<U, E>): Err<E>;
19
- unwrap(): never;
20
- unwrapOr<T>(defaultValue: T): T;
21
- }
@@ -1,21 +0,0 @@
1
- import type { Result } from './Result';
2
- /**
3
- * Represents a successful result containing a value.
4
- *
5
- * @template T - The type of the contained value
6
- */
7
- export declare class Ok<T> {
8
- readonly value: T;
9
- static readonly BRAND: "tango.result.ok";
10
- readonly __tangoBrand: typeof Ok.BRAND;
11
- readonly ok: true;
12
- constructor(value: T);
13
- static isOk<T>(value: unknown): value is Ok<T>;
14
- isOk(): this is Ok<T>;
15
- isErr(): false;
16
- map<U>(fn: (value: T) => U): Ok<U>;
17
- mapErr<F>(_fn: (error: never) => F): Ok<T>;
18
- flatMap<U, E>(fn: (value: T) => Result<U, E>): Result<U, E>;
19
- unwrap(): T;
20
- unwrapOr(_defaultValue: T): T;
21
- }
@@ -1,33 +0,0 @@
1
- import type { Err } from './Err';
2
- import type { Ok } from './Ok';
3
- /**
4
- * A discriminated union representing either success (Ok) or failure (Err).
5
- * Supports both property-based narrowing (`if (result.ok)`) and method-based
6
- * narrowing (`if (result.isOk())`), as well as fluent chaining via
7
- * `map`, `mapErr`, and `flatMap`.
8
- *
9
- * @template T - The success value type
10
- * @template E - The error type (defaults to Error)
11
- *
12
- * @example
13
- * ```typescript
14
- * function divide(a: number, b: number): Result<number, Error> {
15
- * if (b === 0) {
16
- * return new Err(new Error('Division by zero'));
17
- * }
18
- * return new Ok(a / b);
19
- * }
20
- *
21
- * // Property narrowing
22
- * const result = divide(10, 2);
23
- * if (result.ok) {
24
- * console.log(result.value); // 5
25
- * }
26
- *
27
- * // Fluent chaining
28
- * const formatted = divide(10, 2)
29
- * .map(n => n.toFixed(2))
30
- * .mapErr(e => new TypeError(e.message));
31
- * ```
32
- */
33
- export type Result<T, E = Error> = Ok<T> | Err<E>;
@@ -1,8 +0,0 @@
1
- /**
2
- * Domain boundary barrel: centralizes this subdomain's public contract.
3
- */
4
- import { Err } from './Err';
5
- import { Ok } from './Ok';
6
- import type { Result } from './Result';
7
- export { Err, Ok };
8
- export type { Result };
@@ -1,3 +0,0 @@
1
- import { Err, Ok } from "../result-CBqw9Hlg.js";
2
-
3
- export { Err, Ok };
@@ -1,82 +0,0 @@
1
- import { __export } from "./chunk-BkvOhyD0.js";
2
-
3
- //#region src/result/Err.ts
4
- var Err = class Err {
5
- static BRAND = "tango.result.err";
6
- __tangoBrand = Err.BRAND;
7
- ok = false;
8
- constructor(error) {
9
- this.error = error;
10
- }
11
- static isErr(value) {
12
- return typeof value === "object" && value !== null && value.__tangoBrand === Err.BRAND;
13
- }
14
- isOk() {
15
- return false;
16
- }
17
- isErr() {
18
- return true;
19
- }
20
- map(_fn) {
21
- return this;
22
- }
23
- mapErr(fn) {
24
- return new Err(fn(this.error));
25
- }
26
- flatMap(_fn) {
27
- return this;
28
- }
29
- unwrap() {
30
- throw this.error;
31
- }
32
- unwrapOr(defaultValue) {
33
- return defaultValue;
34
- }
35
- };
36
-
37
- //#endregion
38
- //#region src/result/Ok.ts
39
- var Ok = class Ok {
40
- static BRAND = "tango.result.ok";
41
- __tangoBrand = Ok.BRAND;
42
- ok = true;
43
- constructor(value) {
44
- this.value = value;
45
- }
46
- static isOk(value) {
47
- return typeof value === "object" && value !== null && value.__tangoBrand === Ok.BRAND;
48
- }
49
- isOk() {
50
- return true;
51
- }
52
- isErr() {
53
- return false;
54
- }
55
- map(fn) {
56
- return new Ok(fn(this.value));
57
- }
58
- mapErr(_fn) {
59
- return this;
60
- }
61
- flatMap(fn) {
62
- return fn(this.value);
63
- }
64
- unwrap() {
65
- return this.value;
66
- }
67
- unwrapOr(_defaultValue) {
68
- return this.value;
69
- }
70
- };
71
-
72
- //#endregion
73
- //#region src/result/index.ts
74
- var result_exports = {};
75
- __export(result_exports, {
76
- Err: () => Err,
77
- Ok: () => Ok
78
- });
79
-
80
- //#endregion
81
- export { Err, Ok, result_exports };
82
- //# sourceMappingURL=result-CBqw9Hlg.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"result-CBqw9Hlg.js","names":["error: E","value: unknown","_fn: (value: never) => U","fn: (error: E) => F","_fn: (value: never) => Result<U, E>","defaultValue: T","value: T","value: unknown","fn: (value: T) => U","_fn: (error: never) => F","fn: (value: T) => Result<U, E>","_defaultValue: T"],"sources":["../src/result/Err.ts","../src/result/Ok.ts","../src/result/index.ts"],"sourcesContent":["import type { Result } from './Result';\n\n/**\n * Represents a failed result containing an error.\n *\n * @template E - The type of the contained error\n */\nexport class Err<E> {\n static readonly BRAND = 'tango.result.err' as const;\n readonly __tangoBrand: typeof Err.BRAND = Err.BRAND;\n readonly ok = false as const;\n\n constructor(readonly error: E) {}\n\n static isErr<E>(value: unknown): value is Err<E> {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === Err.BRAND\n );\n }\n\n isOk(): false {\n return false;\n }\n\n isErr(): this is Err<E> {\n return true;\n }\n\n map<U>(_fn: (value: never) => U): Err<E> {\n return this;\n }\n\n mapErr<F>(fn: (error: E) => F): Err<F> {\n return new Err(fn(this.error));\n }\n\n flatMap<U>(_fn: (value: never) => Result<U, E>): Err<E> {\n return this;\n }\n\n unwrap(): never {\n throw this.error;\n }\n\n unwrapOr<T>(defaultValue: T): T {\n return defaultValue;\n }\n}\n","import type { Result } from './Result';\n\n/**\n * Represents a successful result containing a value.\n *\n * @template T - The type of the contained value\n */\nexport class Ok<T> {\n static readonly BRAND = 'tango.result.ok' as const;\n readonly __tangoBrand: typeof Ok.BRAND = Ok.BRAND;\n readonly ok = true as const;\n\n constructor(readonly value: T) {}\n\n static isOk<T>(value: unknown): value is Ok<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === Ok.BRAND\n );\n }\n\n isOk(): this is Ok<T> {\n return true;\n }\n\n isErr(): false {\n return false;\n }\n\n map<U>(fn: (value: T) => U): Ok<U> {\n return new Ok(fn(this.value));\n }\n\n mapErr<F>(_fn: (error: never) => F): Ok<T> {\n return this;\n }\n\n flatMap<U, E>(fn: (value: T) => Result<U, E>): Result<U, E> {\n return fn(this.value);\n }\n\n unwrap(): T {\n return this.value;\n }\n\n unwrapOr(_defaultValue: T): T {\n return this.value;\n }\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nimport { Err } from './Err';\nimport { Ok } from './Ok';\nimport type { Result } from './Result';\n\nexport { Err, Ok };\nexport type { Result };\n"],"mappings":";;;IAOa,MAAN,MAAM,IAAO;CAChB,OAAgB,QAAQ;CACxB,eAA0C,IAAI;CAC9C,KAAc;CAEd,YAAqBA,OAAU;AAAA,OAAV,QAAA;CAAY;CAEjC,OAAO,MAASC,OAAiC;AAC7C,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,IAAI;CAElE;CAED,OAAc;AACV,SAAO;CACV;CAED,QAAwB;AACpB,SAAO;CACV;CAED,IAAOC,KAAkC;AACrC,SAAO;CACV;CAED,OAAUC,IAA6B;AACnC,SAAO,IAAI,IAAI,GAAG,KAAK,MAAM;CAChC;CAED,QAAWC,KAA6C;AACpD,SAAO;CACV;CAED,SAAgB;AACZ,QAAM,KAAK;CACd;CAED,SAAYC,cAAoB;AAC5B,SAAO;CACV;AACJ;;;;IC1CY,KAAN,MAAM,GAAM;CACf,OAAgB,QAAQ;CACxB,eAAyC,GAAG;CAC5C,KAAc;CAEd,YAAqBC,OAAU;AAAA,OAAV,QAAA;CAAY;CAEjC,OAAO,KAAQC,OAAgC;AAC3C,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,GAAG;CAEjE;CAED,OAAsB;AAClB,SAAO;CACV;CAED,QAAe;AACX,SAAO;CACV;CAED,IAAOC,IAA4B;AAC/B,SAAO,IAAI,GAAG,GAAG,KAAK,MAAM;CAC/B;CAED,OAAUC,KAAiC;AACvC,SAAO;CACV;CAED,QAAcC,IAA8C;AACxD,SAAO,GAAG,KAAK,MAAM;CACxB;CAED,SAAY;AACR,SAAO,KAAK;CACf;CAED,SAASC,eAAqB;AAC1B,SAAO,KAAK;CACf;AACJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-DPpCYEe_.js","names":["value: unknown","tag: string","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown"],"sources":["../src/runtime/internal/hasTag.ts","../src/runtime/binary/isArrayBuffer.ts","../src/runtime/binary/isUint8Array.ts","../src/runtime/binary/isBlob.ts","../src/runtime/binary/index.ts","../src/runtime/web/isFormData.ts","../src/runtime/web/isURLSearchParams.ts","../src/runtime/web/isReadableStream.ts","../src/runtime/web/isFile.ts","../src/runtime/web/index.ts","../src/runtime/object/isObject.ts","../src/runtime/object/index.ts","../src/runtime/error/isError.ts","../src/runtime/error/index.ts","../src/runtime/date/isDate.ts","../src/runtime/date/index.ts","../src/runtime/index.ts"],"sourcesContent":["export function hasTag(value: unknown, tag: string): boolean {\n return value != null && Object.prototype.toString.call(value) === `[object ${tag}]`;\n}\n","import { hasTag } from '../internal/hasTag';\n\nexport function isArrayBuffer(value: unknown): value is ArrayBuffer {\n return hasTag(value, 'ArrayBuffer');\n}\n","import { hasTag } from '../internal/hasTag';\n\nexport function isUint8Array(value: unknown): value is Uint8Array<ArrayBuffer> {\n return hasTag(value, 'Uint8Array');\n}\n","import { hasTag } from '../internal/hasTag';\n\nexport function isBlob(value: unknown): value is Blob {\n return hasTag(value, 'Blob');\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { isArrayBuffer } from './isArrayBuffer';\nexport { isUint8Array } from './isUint8Array';\nexport { isBlob } from './isBlob';\n","import { hasTag } from '../internal/hasTag';\n\nexport function isFormData(value: unknown): value is FormData {\n return hasTag(value, 'FormData');\n}\n","import { hasTag } from '../internal/hasTag';\n\nexport function isURLSearchParams(value: unknown): value is URLSearchParams {\n return hasTag(value, 'URLSearchParams');\n}\n","import { hasTag } from '../internal/hasTag';\n\nexport function isReadableStream(value: unknown): value is ReadableStream<Uint8Array<ArrayBuffer>> {\n return hasTag(value, 'ReadableStream');\n}\n","import { hasTag } from '../internal/hasTag';\n\nexport function isFile(value: unknown): value is File {\n return hasTag(value, 'File');\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { isFormData } from './isFormData';\nexport { isURLSearchParams } from './isURLSearchParams';\nexport { isReadableStream } from './isReadableStream';\nexport { isFile } from './isFile';\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { isObject } from './isObject';\n","import { isObject } from '../object/isObject';\n\nexport function isError(value: unknown): value is Error {\n return (\n isObject(value) &&\n typeof (value as { name?: unknown }).name === 'string' &&\n typeof (value as { message?: unknown }).message === 'string'\n );\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { isError } from './isError';\n","import { hasTag } from '../internal/hasTag';\n\nexport function isDate(value: unknown): value is Date {\n return hasTag(value, 'Date');\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { isDate } from './isDate';\n","/**\n * Domain boundary barrel: exposes namespaced exports for Django-style drill-down\n * imports and curated flat exports for TS-native ergonomics.\n */\n\nexport * as binary from './binary/index';\nexport * as web from './web/index';\nexport * as object from './object/index';\nexport * as error from './error/index';\nexport * as date from './date/index';\n\nexport { isArrayBuffer, isBlob, isUint8Array } from './binary/index';\nexport { isFile, isFormData, isReadableStream, isURLSearchParams } from './web/index';\nexport { isObject } from './object/index';\nexport { isError } from './error/index';\nexport { isDate } from './date/index';\n"],"mappings":";;;AAAO,SAAS,OAAOA,OAAgBC,KAAsB;AACzD,QAAO,SAAS,QAAQ,OAAO,UAAU,SAAS,KAAK,MAAM,MAAM,UAAU,IAAI;AACpF;;;;ACAM,SAAS,cAAcC,OAAsC;AAChE,QAAO,OAAO,OAAO,cAAc;AACtC;;;;ACFM,SAAS,aAAaC,OAAkD;AAC3E,QAAO,OAAO,OAAO,aAAa;AACrC;;;;ACFM,SAAS,OAAOC,OAA+B;AAClD,QAAO,OAAO,OAAO,OAAO;AAC/B;;;;;;;;;;;;;ACFM,SAAS,WAAWC,OAAmC;AAC1D,QAAO,OAAO,OAAO,WAAW;AACnC;;;;ACFM,SAAS,kBAAkBC,OAA0C;AACxE,QAAO,OAAO,OAAO,kBAAkB;AAC1C;;;;ACFM,SAAS,iBAAiBC,OAAkE;AAC/F,QAAO,OAAO,OAAO,iBAAiB;AACzC;;;;ACFM,SAAS,OAAOC,OAA+B;AAClD,QAAO,OAAO,OAAO,OAAO;AAC/B;;;;;;;;;;;;;;ACJM,SAAS,SAASC,OAAkD;AACvE,eAAc,UAAU,YAAY,UAAU;AACjD;;;;;;;;;ACAM,SAAS,QAAQC,OAAgC;AACpD,QACI,SAAS,MAAM,WACP,MAA6B,SAAS,mBACtC,MAAgC,YAAY;AAE3D;;;;;;;;;ACNM,SAAS,OAAOC,OAA+B;AAClD,QAAO,OAAO,OAAO,OAAO;AAC/B"}