{"version":3,"sources":["../toon-optimizer/index.ts","../toon-optimizer/core/wrapper.ts","../toon-optimizer/utils/tokenizer.ts","../toon-optimizer/core/analyzer.ts","../toon-optimizer/core/heuristics.ts","../toon-optimizer/utils/cost.ts","../toon-optimizer/core/optimizer.ts","../toon-optimizer/streaming/stream.ts"],"sourcesContent":["export { toTOONText as toTOON } from './core/wrapper';\r\nexport { fromTOONText as fromTOON } from './core/wrapper';\r\nexport { analyzeSavings } from './core/analyzer';\r\nexport { smartConvert, restore } from './core/optimizer';\r\nexport { streamTOON } from './streaming/stream';\r\n\r\nexport type {\r\n\tProvider,\r\n\tTokenizer,\r\n\tConvertOptions,\r\n\tSmartConvertOptions,\r\n\tCostOptions,\r\n\tSavings,\r\n\tTOONDocument\r\n} from './types/index';\r\n\r\nexport {\r\n\tNaiveCharTokenizer,\r\n\tOpenAITokenizer,\r\n\tAnthropicTokenizer,\r\n\tGoogleTokenizer,\r\n\tgetDefaultTokenizer\r\n} from './utils/tokenizer';\r\n\r\n\r\n","import { encode, decode } from '@toon-format/toon';\r\nimport type { ConvertOptions } from '../types/index';\r\n\r\nexport function toTOONText(data: unknown, _opts?: ConvertOptions): string {\r\n\t// Encoding is delegated to official package (text output).\r\n\treturn encode(data as any);\r\n}\r\n\r\nexport function fromTOONText(toonText: string): unknown {\r\n\treturn decode(toonText);\r\n}\r\n\r\n\r\n","import type { Provider, Tokenizer } from '../types/index';\r\n\r\n// Simple, dependency-free tokenizer adapters.\r\n// NOTE: These are estimators. Users can inject accurate tokenizers via the Tokenizer interface.\r\n\r\nexport class NaiveCharTokenizer implements Tokenizer {\r\n\tprivate avgCharsPerToken: number;\r\n\tconstructor(avgCharsPerToken = 4) {\r\n\t\tthis.avgCharsPerToken = Math.max(1, avgCharsPerToken);\r\n\t}\r\n\tcountTokens(text: string): number {\r\n\t\t// Roughly 4 chars per token for many English corpora; configurable.\r\n\t\treturn Math.max(0, Math.ceil((text?.length ?? 0) / this.avgCharsPerToken));\r\n\t}\r\n}\r\n\r\nexport class OpenAITokenizer implements Tokenizer {\r\n\tprivate fallback: Tokenizer;\r\n\tconstructor() {\r\n\t\t// Tune slightly lower avgCharsPerToken for GPT-4o family heuristics\r\n\t\tthis.fallback = new NaiveCharTokenizer(3.6);\r\n\t}\r\n\tcountTokens(text: string, _model?: string): number {\r\n\t\t// Placeholder: Use heuristic. Users may override with real tiktoken-based adapter.\r\n\t\treturn this.fallback.countTokens(text);\r\n\t}\r\n}\r\n\r\nexport class AnthropicTokenizer implements Tokenizer {\r\n\tprivate fallback: Tokenizer = new NaiveCharTokenizer(3.8);\r\n\tcountTokens(text: string, _model?: string): number {\r\n\t\treturn this.fallback.countTokens(text);\r\n\t}\r\n}\r\n\r\nexport class GoogleTokenizer implements Tokenizer {\r\n\tprivate fallback: Tokenizer = new NaiveCharTokenizer(3.7);\r\n\tcountTokens(text: string, _model?: string): number {\r\n\t\treturn this.fallback.countTokens(text);\r\n\t}\r\n}\r\n\r\nexport function getDefaultTokenizer(provider: Provider): Tokenizer {\r\n\tswitch (provider) {\r\n\t\tcase 'openai':\r\n\t\t\treturn new OpenAITokenizer();\r\n\t\tcase 'anthropic':\r\n\t\t\treturn new AnthropicTokenizer();\r\n\t\tcase 'google':\r\n\t\t\treturn new GoogleTokenizer();\r\n\t\tdefault:\r\n\t\t\treturn new NaiveCharTokenizer();\r\n\t}\r\n}\r\n\r\n\r\n","import type { CostOptions, Recommendation, Savings, StructureSummary, TokenSummary } from '../types/index';\r\nimport { NaiveCharTokenizer } from '../utils/tokenizer';\r\nimport { encode } from '@toon-format/toon';\r\nimport { analyzeStructure } from './heuristics';\r\nimport { calculateCostFromTokens } from '../utils/cost';\r\n\r\nexport interface AnalyzeOptions {\r\n\t// Optional tokenizer for analysis; default is naive estimator.\r\n\ttokenizer?: { countTokens(text: string, model?: string): number };\r\n\tmodel?: string;\r\n\tcost?: Partial<CostOptions>;\r\n\tconciseSummary?: boolean;\r\n}\r\n\r\nexport function analyzeSavings(data: unknown, opts?: AnalyzeOptions): Savings {\r\n\tconst tokenizer = opts?.tokenizer ?? new NaiveCharTokenizer();\r\n\tconst model = opts?.model;\r\n\r\n\t// JSON path\r\n\tconst jsonString = JSON.stringify(data);\r\n\tconst jsonTokens = tokenizer.countTokens(jsonString, model);\r\n\r\n\t// TOON path (textual)\r\n\tconst toonString = encode(data as any);\r\n\tconst toonTokens = tokenizer.countTokens(toonString, model);\r\n\r\n\tconst structure = analyzeStructure(data);\r\n\tconst tokens = summarizeTokens(jsonTokens, toonTokens);\r\n\tconst recommendation = buildRecommendation(structure, tokens);\r\n\tconst costOptions: CostOptions = {\r\n\t\tprovider: opts?.cost?.provider ?? 'openai',\r\n\t\tmodel: opts?.cost?.model ?? model ?? 'gpt-4o-mini'\r\n\t};\r\n\tif (opts?.cost?.pricing) {\r\n\t\t(costOptions as any).pricing = opts.cost.pricing;\r\n\t}\r\n\tconst cost = calculateCostFromTokens(jsonTokens, toonTokens, costOptions);\r\n\r\n\tconst result = {\r\n\t\ttokens,\r\n\t\tcost,\r\n\t\tstructure,\r\n\t\trecommendation\r\n\t};\r\n\t// When conciseSummary is requested, attach a one-liner for CI logs\r\n\tif (opts?.conciseSummary) {\r\n\t\t// @ts-ignore add non-typed field for convenience\r\n\t\t(result as any).summary = formatConciseSummary(structure, tokens, result.cost, recommendation);\r\n\t}\r\n\treturn result as any;\r\n}\r\n\r\nfunction summarizeTokens(jsonTokens: number, toonTokens: number): TokenSummary {\r\n\tconst diff = toonTokens - jsonTokens;\r\n\tconst diffPct = jsonTokens === 0 ? 0 : (diff / jsonTokens) * 100;\r\n\treturn {\r\n\t\tjsonTokens,\r\n\t\ttoonTokens,\r\n\t\ttokenDiff: diff,\r\n\t\tdiffPct\r\n\t};\r\n}\r\n\r\nfunction buildRecommendation(structure: StructureSummary, tokens: TokenSummary): Recommendation {\r\n\tconst suggestions: string[] = [];\r\n\tlet recommended = tokens.tokenDiff < 0 && structure.verdict === 'tabular';\r\n\tlet reason: string;\r\n\r\n\tif (structure.verdict !== 'tabular') {\r\n\t\trecommended = false;\r\n\t\tif (structure.verdict === 'deeply_nested') {\r\n\t\t\tconst exceeded = structure.exceededBy ?? Math.max(0, structure.maxDepth - 3);\r\n\t\t\treason = `Deep nesting detected (depth ${structure.maxDepth}, exceeded by ${exceeded}). TOON adds overhead.`;\r\n\t\t\tsuggestions.push('Flatten nested arrays or split payloads before converting.');\r\n\t\t\tsuggestions.push('Extract nested collections to top-level arrays and link by IDs.');\r\n\t\t} else if (structure.verdict === 'non_tabular') {\r\n\t\t\treason = 'Data is not a tabular array of objects.';\r\n\t\t\tsuggestions.push('TOON works best for arrays of objects with consistent keys.');\r\n\t\t} else {\r\n\t\t\treason = 'Row key consistency below threshold for TOON.';\r\n\t\t\tsuggestions.push('Normalize object keys across rows before converting.');\r\n\t\t}\r\n\t} else if (tokens.tokenDiff >= 0) {\r\n\t\trecommended = false;\r\n\t\tconst pct = tokens.diffPct.toFixed(1);\r\n\t\treason = `TOON uses ${pct}% more tokens than JSON.`;\r\n\t\tsuggestions.push('Keep JSON for this payload or flatten nested fields.');\r\n\t} else {\r\n\t\tconst pct = Math.abs(tokens.diffPct).toFixed(1);\r\n\t\treason = `TOON reduces tokens by ${pct}%.`;\r\n\t\tsuggestions.push('Proceed with TOON conversion for lower token usage.');\r\n\t}\r\n\r\n\tconst alternatives = buildAlternatives(structure);\r\n\tconst rec: Recommendation = { recommended, reason, suggestions };\r\n\tif (alternatives) (rec as any).alternatives = alternatives;\r\n\treturn rec;\r\n}\r\n\r\nfunction formatConciseSummary(\r\n\tstructure: StructureSummary,\r\n\ttokens: TokenSummary,\r\n\tcost: ReturnType<typeof calculateCostFromTokens>,\r\n\trec: Recommendation\r\n): string {\r\n\tconst dir = tokens.tokenDiff < 0 ? 'saves' : 'adds';\r\n\tconst pct = Math.abs(tokens.diffPct).toFixed(1);\r\n\tconst per1M = cost.per1M.differenceFormatted;\r\n\tconst depthPart =\r\n\t\tstructure.verdict === 'deeply_nested'\r\n\t\t\t? ` (depth ${structure.maxDepth} > ${structure.depthThreshold})`\r\n\t\t\t: '';\r\n\tconst action = rec.recommended ? 'convert to TOON' : 'keep JSON';\r\n\treturn `TOON ${dir} ${pct}% tokens (${per1M} per 1M)${depthPart}: ${action}.`;\r\n}\r\n\r\nfunction buildAlternatives(structure: StructureSummary): Recommendation['alternatives'] {\r\n\tif (structure.verdict === 'deeply_nested' || structure.verdict === 'mixed') {\r\n\t\tconst example = {\r\n\t\t\tinsteadOf: 'company.departments[].teams[].members[]',\r\n\t\t\tuse: {\r\n\t\t\t\tcompanies: [{ id: 'companyId', name: 'Acme' }],\r\n\t\t\t\tdepartments: [{ id: 'deptId', companyId: 'companyId', name: 'Engineering' }],\r\n\t\t\t\tteams: [{ id: 'teamId', deptId: 'deptId', name: 'Platform' }],\r\n\t\t\t\tmembers: [{ id: 'memberId', teamId: 'teamId', name: 'Alice' }]\r\n\t\t\t}\r\n\t\t};\r\n\t\treturn {\r\n\t\t\tcurrentStructure: `Deeply nested (depth ${structure.maxDepth})`,\r\n\t\t\tsuggestedStructure: 'Flat arrays with references (IDs linking relations)',\r\n\t\t\texampleRefactoring: example,\r\n\t\t\tpotentialSavings: '40–50% possible if arrays become tabular'\r\n\t\t};\r\n\t}\r\n\treturn undefined;\r\n}\r\n\r\n\r\n","import type { StructureSummary } from '../types/index';\r\n\r\ntype JSONValue = any;\r\n\r\nexport function analyzeStructure(data: JSONValue): StructureSummary {\r\n\tlet maxDepth = 0;\r\n\tlet arrayCount = 0;\r\n\tconst depthThreshold = 3;\r\n\tfunction depth(v: JSONValue, d: number) {\r\n\t\tif (d > maxDepth) maxDepth = d;\r\n\t\tif (v && typeof v === 'object') {\r\n\t\t\tif (Array.isArray(v)) {\r\n\t\t\t\tarrayCount++;\r\n\t\t\t\tfor (const it of v) depth(it, d + 1);\r\n\t\t\t} else {\r\n\t\t\t\tfor (const k of Object.keys(v)) depth(v[k], d + 1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tdepth(data, 0);\r\n\r\n\tlet verdict: StructureSummary['verdict'] = 'mixed';\r\n\tlet reason = 'Mixed structure.';\r\n\tlet rowCount = 0;\r\n\tlet keyConsistency = 0;\r\n\r\n\tif (Array.isArray(data) && data.every((r) => r && typeof r === 'object' && !Array.isArray(r))) {\r\n\t\tconst rows = data as Array<Record<string, unknown>>;\r\n\t\trowCount = rows.length;\r\n\t\tconst keyCounts = new Map<string, number>();\r\n\t\tconst rowKeySets: string[][] = [];\r\n\t\tfor (const r of rows) {\r\n\t\t\tconst keys = Object.keys(r).sort();\r\n\t\t\trowKeySets.push(keys);\r\n\t\t\tfor (const k of keys) keyCounts.set(k, (keyCounts.get(k) ?? 0) + 1);\r\n\t\t}\r\n\t\tconst commonKeys = [...keyCounts.entries()]\r\n\t\t\t.filter(([, c]) => c >= Math.ceil(rows.length * 0.8))\r\n\t\t\t.map(([k]) => k)\r\n\t\t\t.sort();\r\n\t\tlet stable = 0;\r\n\t\tfor (const ks of rowKeySets) {\r\n\t\t\tif (arrayEqual(ks, commonKeys)) stable++;\r\n\t\t}\r\n\t\tkeyConsistency = rows.length === 0 ? 0 : stable / rows.length;\r\n\t\tif (commonKeys.length > 0 && keyConsistency >= 0.8) {\r\n\t\t\tverdict = 'tabular';\r\n\t\t\treason = 'Array of objects with consistent keys.';\r\n\t\t} else {\r\n\t\t\tverdict = 'mixed';\r\n\t\t\treason = 'Array of objects but key sets vary between rows.';\r\n\t\t}\r\n\t} else {\r\n\t\tif (maxDepth > 3) {\r\n\t\t\tverdict = 'deeply_nested';\r\n\t\t\treason = `Deep nesting detected (max depth ${maxDepth}).`;\r\n\t\t} else {\r\n\t\t\tverdict = 'non_tabular';\r\n\t\t\treason = 'Data is not an array of objects suitable for tabular encoding.';\r\n\t\t}\r\n\t}\r\n\r\n\treturn {\r\n\t\tmaxDepth,\r\n\t\tarrayCount,\r\n\t\trowCount,\r\n\t\tkeyConsistency,\r\n\t\tverdict,\r\n\t\treason,\r\n\t\tdepthThreshold,\r\n\t\texceededBy: Math.max(0, maxDepth - depthThreshold)\r\n\t};\r\n}\r\n\r\nexport function shouldConvert(structure: StructureSummary): boolean {\r\n\tif (structure.verdict !== 'tabular') return false;\r\n\tif (structure.maxDepth > 3) return false;\r\n\tif (structure.rowCount < 2) return false;\r\n\treturn true;\r\n}\r\n\r\nfunction arrayEqual(a: string[], b: string[]): boolean {\r\n\tif (a.length !== b.length) return false;\r\n\tfor (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\r\n\treturn true;\r\n}\r\n\r\n\r\n","import type { CostOptions, Pricing, CostBreakdown, CostFigure } from '../types/index';\r\nimport { getDefaultTokenizer } from './tokenizer';\r\nimport { encode } from '@toon-format/toon';\r\n\r\nconst DEFAULT_PRICING: Record<string, Pricing> = {\r\n\t// per 1M tokens cost defaults (illustrative; users should override)\r\n\t'openai:gpt-4o': { input: 5, output: 15 },\r\n\t'openai:gpt-4o-mini': { input: 0.15, output: 0.6 },\r\n\t'anthropic:claude-3-5-sonnet': { input: 3, output: 15 },\r\n\t'google:gemini-1.5-pro': { input: 1.25, output: 5 }\r\n};\r\n\r\nfunction formatUsd(value: number): string {\r\n\tconst abs = Math.abs(value);\r\n\tconst decimals = abs < 0.0001 ? 6 : abs < 0.01 ? 5 : 4;\r\n\tconst formatted = value.toFixed(decimals);\r\n\treturn `$${formatted}`;\r\n}\r\n\r\nfunction buildFigure(tokensJson: number, tokensToon: number, pricing: Pricing, scale: number): CostFigure {\r\n\tconst jsonCost = (tokensJson * scale / 1_000_000) * pricing.input;\r\n\tconst toonCost = (tokensToon * scale / 1_000_000) * pricing.input;\r\n\tconst diff = toonCost - jsonCost;\r\n\treturn {\r\n\t\tjson: jsonCost,\r\n\t\ttoon: toonCost,\r\n\t\tdifference: diff,\r\n\t\tjsonFormatted: formatUsd(jsonCost),\r\n\t\ttoonFormatted: formatUsd(toonCost),\r\n\t\tdifferenceFormatted: formatUsd(diff)\r\n\t};\r\n}\r\n\r\nexport function calculateCostFromTokens(jsonTokens: number, toonTokens: number, opts: CostOptions): CostBreakdown {\r\n\tconst pricing = opts.pricing ?? DEFAULT_PRICING[`${opts.provider}:${opts.model}`] ?? { input: 1, output: 1 };\r\n\tconst perRequest = buildFigure(jsonTokens, toonTokens, pricing, 1);\r\n\tconst per1K = buildFigure(jsonTokens, toonTokens, pricing, 1000);\r\n\tconst per100K = buildFigure(jsonTokens, toonTokens, pricing, 100_000);\r\n\tconst per1M = buildFigure(jsonTokens, toonTokens, pricing, 1_000_000);\r\n\tconst centsPerRequest = `${((perRequest.difference) * 100).toFixed(4)}¢`;\r\n\treturn {\r\n\t\tpricing,\r\n\t\tperRequest,\r\n\t\tper1K,\r\n\t\tper1M,\r\n\t\tper100K,\r\n\t\tnormalized: {\r\n\t\t\tcentsPerRequest,\r\n\t\t\tper100K: per100K.differenceFormatted\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport function calculateCost(data: unknown, opts: CostOptions) {\r\n\tconst tokenizer = opts.tokenizer ?? getDefaultTokenizer(opts.provider);\r\n\tconst key = `${opts.provider}:${opts.model}`;\r\n\tconst pricing: Pricing = opts.pricing ?? DEFAULT_PRICING[key] ?? { input: 1, output: 1 };\r\n\r\n\tconst jsonStr = JSON.stringify(data);\r\n\tconst jsonTokens = tokenizer.countTokens(jsonStr, opts.model);\r\n\r\n\tconst toonStr = encode(data as any);\r\n\tconst toonTokens = tokenizer.countTokens(toonStr, opts.model);\r\n\r\n\treturn {\r\n\t\tpricing,\r\n\t\tperRequest: buildFigure(jsonTokens, toonTokens, pricing, 1),\r\n\t\tper1K: buildFigure(jsonTokens, toonTokens, pricing, 1000),\r\n\t\tper1M: buildFigure(jsonTokens, toonTokens, pricing, 1_000_000)\r\n\t};\r\n}\r\n\r\n\r\n","import { toTOONText } from './wrapper';\r\nimport { analyzeSavings } from './analyzer';\r\nimport type { SmartConvertOptions } from '../types/index';\r\nimport { decode } from '@toon-format/toon';\r\n\r\nexport function smartConvert<T = unknown>(data: T, options?: SmartConvertOptions) {\r\n\tconst autoDetect = options?.autoDetect ?? true;\r\n\tconst threshold = options?.threshold ?? 0.2; // 20%\r\n\tconst fallback = options?.fallback ?? 'json';\r\n\r\n\tconst analysis = analyzeSavings(data);\r\n\r\n\tif (!autoDetect) {\r\n\t\tconst toon = toTOONText(data as any, options);\r\n\t\treturn { format: 'toon-text' as const, data: toon, analysis };\r\n\t}\r\n\r\n\tconst diffPct = analysis.tokens.diffPct;\r\n\tconst baseRecommended = analysis.recommendation.recommended;\r\n\tconst meetsThreshold = baseRecommended && diffPct <= -threshold * 100;\r\n\r\n\tif (meetsThreshold) {\r\n\t\tconst toon = toTOONText(data as any, options);\r\n\t\treturn { format: 'toon-text' as const, data: toon, analysis };\r\n\t}\r\n\r\n\t// Fallback path\r\n\tif (fallback === 'json') {\r\n\t\treturn { format: 'json' as const, data, analysis };\r\n\t}\r\n\t// Fallback to TOON anyway (user choice)\r\n\tconst toon = toTOONText(data as any, options);\r\n\treturn { format: 'toon-text' as const, data: toon, analysis };\r\n}\r\n\r\nexport function restore<T = unknown>(payload: { format: 'json' | 'toon' | 'toon-text'; data: any }): T {\r\n\tif (payload.format === 'json') return payload.data as T;\r\n\treturn decode(payload.data) as T;\r\n}\r\n\r\n\r\n","import type { ConvertOptions } from '../types/index';\r\nimport { analyzeStructure } from '../core/heuristics';\r\n\r\ntype Row = Record<string, unknown>;\r\n\r\nexport interface StreamTOONOptions extends ConvertOptions {\r\n\tcolumns?: string[]; // if omitted, infer from first row\r\n\theaderName?: string; // e.g., 'rows'\r\n\tperChunk?: number; // how many rows to emit per read\r\n}\r\n\r\n/**\r\n * Stream textual TOON for arrays of objects with consistent keys.\r\n * Output example:\r\n * rows[2]{id,name}:\r\n *   1,Alice\r\n *   2,Bob\r\n */\r\nexport function streamTOON(\r\n\tsource: Iterable<Row> | AsyncIterable<Row>,\r\n\topts?: StreamTOONOptions\r\n): any {\r\n\tlet ReadableCtor: any;\r\n\ttry {\r\n\t\t// eslint-disable-next-line @typescript-eslint/no-var-requires\r\n\t\tReadableCtor = require('stream').Readable;\r\n\t} catch {\r\n\t\tthrow new Error('streamTOON requires Node.js stream module at runtime.');\r\n\t}\r\n\tconst iterator = getAsyncIterator(source);\r\n\tconst perChunk = Math.max(1, opts?.perChunk ?? 32);\r\n\tconst name = opts?.headerName ?? 'rows';\r\n\tlet columns = opts?.columns;\r\n\tlet started = false;\r\n\tlet count = 0;\r\n\treturn new ReadableCtor({\r\n\t\tasync read() {\r\n\t\t\ttry {\r\n\t\t\t\tif (!started) {\r\n\t\t\t\t\tstarted = true;\r\n\t\t\t\t\t// infer columns from first row if needed\r\n\t\t\t\t\tconst first = await iterator.next();\r\n\t\t\t\t\tif (first.done) {\r\n\t\t\t\t\t\tthis.push(`${name}[0]{}:\\n`);\r\n\t\t\t\t\t\tthis.push(null);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!columns) columns = Object.keys(first.value);\r\n\t\t\t\t\tthis.push(`${name}[?]{${columns.join(',')}}:\\n`);\r\n\t\t\t\t\tthis.push(`  ${columns.map((c) => stringify(first.value[c])).join(',')}\\n`);\r\n\t\t\t\t\tcount++;\r\n\t\t\t\t}\r\n\t\t\t\tfor (let i = 0; i < perChunk; i++) {\r\n\t\t\t\t\tconst next = await iterator.next();\r\n\t\t\t\t\tif (next.done) {\r\n\t\t\t\t\t\t// Fix the header count by rewriting the first line is not trivial in streaming;\r\n\t\t\t\t\t\t// we keep '?' as count marker. A wrapper can finalize count if needed.\r\n\t\t\t\t\t\tthis.push(null);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.push(`  ${columns!.map((c) => stringify(next.value[c])).join(',')}\\n`);\r\n\t\t\t\t\tcount++;\r\n\t\t\t\t}\r\n\t\t\t} catch (err) {\r\n\t\t\t\tthis.destroy(err as Error);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n}\r\n\r\nfunction stringify(v: unknown): string {\r\n\tif (v === null || v === undefined) return '';\r\n\tif (typeof v === 'string') return escapeCsv(v);\r\n\tif (typeof v === 'number' || typeof v === 'boolean') return String(v);\r\n\treturn escapeCsv(JSON.stringify(v));\r\n}\r\n\r\nfunction escapeCsv(s: string): string {\r\n\tif (/[,\\n\"]/.test(s)) {\r\n\t\treturn `\"${s.replace(/\"/g, '\"\"')}\"`;\r\n\t}\r\n\treturn s;\r\n}\r\n\r\nfunction getAsyncIterator<T>(src: Iterable<T> | AsyncIterable<T>): AsyncIterator<T> {\r\n\tif ((src as any)[Symbol.asyncIterator]) {\r\n\t\treturn (src as AsyncIterable<T>)[Symbol.asyncIterator]();\r\n\t}\r\n\tconst it = (src as Iterable<T>)[Symbol.iterator]();\r\n\treturn {\r\n\t\tnext: async () => it.next() as IteratorResult<T>,\r\n\t\treturn: async () => (it as any).return ? (it as any).return() : { done: true, value: undefined as any },\r\n\t\tthrow: async (e: unknown) => (it as any).throw ? (it as any).throw(e) : Promise.reject(e)\r\n\t};\r\n}\r\n\r\n\r\n"],"mappings":"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","names":["import_toon","import_toon","import_toon","toon"]}