@zenoaihq/tson 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.cjs +364 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +176 -10
- package/dist/index.d.ts +176 -10
- package/dist/index.js +354 -27
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/serializer.ts","../src/deserializer.ts"],"names":["keys","valueStr"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * TSON Utility Functions\n *\n * Helper functions for serialization, deserialization, and validation.\n */\n\nimport type { TSONValue, TSONObject, SchemaMap, KeySchema, ParsedKeys } from './types';\n\n/**\n * Special characters that require string quoting\n */\nexport const SPECIAL_CHARS = new Set([',', '|', '@', '#', '{', '}', '[', ']', '\\n', '\\r', '\\t', ' ', '\"', '(', ')']);\n\n/**\n * Determine if a string value needs to be quoted in TSON format.\n *\n * Strings need quoting if they:\n * - Are empty\n * - Contain special delimiter characters\n * - Have leading/trailing whitespace\n * - Look like numbers (to preserve them as strings)\n * - Look like reserved words (true/false/null) when we want them as strings\n */\nexport function needsQuoting(value: string): boolean {\n if (value.length === 0) {\n return true;\n }\n\n // Check for reserved words that we want to keep as strings\n if (value === 'true' || value === 'false' || value === 'null') {\n return true;\n }\n\n // Check for leading/trailing whitespace\n if (value[0].trim() === '' || value[value.length - 1].trim() === '') {\n return true;\n }\n\n // Check if it looks like a number (preserve type distinction)\n if (looksLikeNumber(value)) {\n return true;\n }\n\n // Check for special characters\n for (const char of value) {\n if (SPECIAL_CHARS.has(char)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Check if a string looks like a numeric value.\n *\n * Used to determine if we should quote a string to preserve it as a string\n * rather than having it parsed as a number.\n */\nexport function looksLikeNumber(value: string): boolean {\n if (value.length === 0) {\n return false;\n }\n\n // Try parsing as number\n const num = Number(value);\n return !isNaN(num) && value.trim() === value && isFinite(num);\n}\n\n/**\n * Escape special characters in a string for quoted representation.\n *\n * Uses standard JSON escape sequences.\n */\nexport function escapeString(value: string): string {\n // Order matters: backslash first to avoid double-escaping\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t');\n}\n\n/**\n * Unescape a quoted string back to its original form.\n *\n * Reverses the escaping done by escapeString().\n * Must process character by character to handle sequences like \\\\n correctly.\n */\nexport function unescapeString(value: string): string {\n const result: string[] = [];\n let i = 0;\n while (i < value.length) {\n if (value[i] === '\\\\' && i + 1 < value.length) {\n const nextChar = value[i + 1];\n if (nextChar === '\\\\') {\n result.push('\\\\');\n i += 2;\n } else if (nextChar === '\"') {\n result.push('\"');\n i += 2;\n } else if (nextChar === 'n') {\n result.push('\\n');\n i += 2;\n } else if (nextChar === 'r') {\n result.push('\\r');\n i += 2;\n } else if (nextChar === 't') {\n result.push('\\t');\n i += 2;\n } else {\n // Unknown escape, keep as-is\n result.push(value[i]);\n i += 1;\n }\n } else {\n result.push(value[i]);\n i += 1;\n }\n }\n return result.join('');\n}\n\n/**\n * Format a primitive value as TSON string.\n */\nexport function formatPrimitive(value: TSONValue): string {\n if (value === null) {\n return 'null';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (typeof value === 'number') {\n return String(value);\n }\n\n if (typeof value === 'string') {\n if (needsQuoting(value)) {\n return `\"${escapeString(value)}\"`;\n }\n return value;\n }\n\n throw new Error(`Cannot format non-primitive type: ${typeof value}`);\n}\n\n/**\n * Parse a TSON primitive value string to JavaScript type.\n */\nexport function parsePrimitive(value: string): TSONValue {\n const trimmed = value.trim();\n\n if (trimmed.length === 0) {\n return '';\n }\n\n // Check for boolean\n if (trimmed === 'true') {\n return true;\n }\n if (trimmed === 'false') {\n return false;\n }\n\n // Check for null\n if (trimmed === 'null') {\n return null;\n }\n\n // Check for quoted string\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return unescapeString(trimmed.slice(1, -1));\n }\n\n // Try to parse as number\n if (looksLikeNumber(trimmed)) {\n const num = Number(trimmed);\n if (!isNaN(num)) {\n return num;\n }\n }\n\n // Otherwise it's an unquoted string\n return trimmed;\n}\n\n/**\n * Check if a value is an array of objects with identical keys.\n *\n * This determines if we can use tabular format optimization.\n */\nexport function isUniformObjectArray(data: unknown): data is TSONObject[] {\n if (!Array.isArray(data) || data.length === 0) {\n return false;\n }\n\n // All elements must be plain objects\n if (!data.every(item => isPlainObject(item))) {\n return false;\n }\n\n // Get keys from first element\n const firstKeys = Object.keys(data[0]);\n\n // Check that all elements have the same keys in the same order\n for (let i = 1; i < data.length; i++) {\n const keys = Object.keys(data[i]);\n if (keys.length !== firstKeys.length) {\n return false;\n }\n for (let j = 0; j < keys.length; j++) {\n if (keys[j] !== firstKeys[j]) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Check if value is a plain object (not array, null, or other special object)\n */\nfunction isPlainObject(value: unknown): value is TSONObject {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Split text by delimiter, respecting quoted strings and nested structures.\n *\n * This is more sophisticated than string.split() because it handles:\n * - Quoted strings (don't split on delimiters inside quotes)\n * - Nested braces/brackets/parentheses (don't split inside nested structures)\n * - Escaped characters\n */\nexport function splitByDelimiter(text: string, delimiter: string): string[] {\n const result: string[] = [];\n const current: string[] = [];\n let inQuotes = false;\n let escapeNext = false;\n let depthCurly = 0;\n let depthSquare = 0;\n let depthParen = 0;\n\n for (const char of text) {\n // Handle escape sequences\n if (escapeNext) {\n current.push(char);\n escapeNext = false;\n continue;\n }\n\n if (char === '\\\\') {\n current.push(char);\n escapeNext = true;\n continue;\n }\n\n // Handle quotes\n if (char === '\"') {\n inQuotes = !inQuotes;\n current.push(char);\n continue;\n }\n\n // Inside quotes, add everything\n if (inQuotes) {\n current.push(char);\n continue;\n }\n\n // Track nesting depth\n if (char === '{') {\n depthCurly++;\n current.push(char);\n } else if (char === '}') {\n depthCurly--;\n current.push(char);\n } else if (char === '[') {\n depthSquare++;\n current.push(char);\n } else if (char === ']') {\n depthSquare--;\n current.push(char);\n } else if (char === '(') {\n depthParen++;\n current.push(char);\n } else if (char === ')') {\n depthParen--;\n current.push(char);\n } else if (\n char === delimiter &&\n depthCurly === 0 &&\n depthSquare === 0 &&\n depthParen === 0\n ) {\n // Found unquoted, unnested delimiter - split here\n result.push(current.join('').trim());\n current.length = 0;\n } else {\n current.push(char);\n }\n }\n\n // Add final segment\n if (current.length > 0) {\n result.push(current.join('').trim());\n }\n\n return result;\n}\n\n/**\n * Parse a key which may include nested schema notation.\n *\n * Examples:\n * \"name\" -> { keyName: \"name\", schema: null }\n * \"address(@city,zip)\" -> { keyName: \"address\", schema: [\"city\", \"zip\"] }\n * \"location(@coords(@lat,lng))\" -> { keyName: \"location\", schema: [\"coords(@lat,lng)\"] }\n */\nexport function parseKeySchema(keyString: string): KeySchema {\n const trimmed = keyString.trim();\n\n // If the entire key is quoted, it's a simple key (any parens inside are literal)\n // Must check this BEFORE looking for '(' to handle keys like \"company(\"\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return { keyName: unescapeString(trimmed.slice(1, -1)), schema: null };\n }\n\n // Check if key has nested schema (only for unquoted keys)\n if (!trimmed.includes('(')) {\n return { keyName: trimmed, schema: null };\n }\n\n // Find the opening parenthesis\n const parenIdx = trimmed.indexOf('(');\n let keyName = trimmed.slice(0, parenIdx).trim();\n\n // Unquote the key name if it's quoted\n if (keyName.startsWith('\"') && keyName.endsWith('\"')) {\n keyName = unescapeString(keyName.slice(1, -1));\n }\n\n // Extract schema (everything between outermost parentheses)\n if (!trimmed.endsWith(')')) {\n throw new Error(`Invalid key schema syntax: ${keyString}`);\n }\n\n let schemaStr = trimmed.slice(parenIdx + 1, -1).trim();\n\n // Strip leading @ if present (part of notation, not key name)\n if (schemaStr.startsWith('@')) {\n schemaStr = schemaStr.slice(1);\n }\n\n // Split schema by commas (respecting nested parentheses)\n const schemaKeys = splitByDelimiter(schemaStr, ',');\n\n return { keyName, schema: schemaKeys };\n}\n\n/**\n * Build a mapping of field names to their nested schemas.\n *\n * Example:\n * [\"id\", \"address(@city,zip)\"]\n * -> { id: null, address: [\"city\", \"zip\"] }\n */\nexport function buildSchemaMap(keys: string[]): SchemaMap {\n const schemaMap: SchemaMap = {};\n\n for (const key of keys) {\n const { keyName, schema } = parseKeySchema(key);\n schemaMap[keyName] = schema;\n }\n\n return schemaMap;\n}\n\n/**\n * Parse keys string and extract row count if present.\n *\n * Format: key1,key2,key3 or key1,key2,key3#N\n */\nexport function parseKeys(keysStr: string): ParsedKeys {\n // Check for row count marker, respecting quotes\n let hashIdx = -1;\n let inQuotes = false;\n\n // Scan backwards to find the last # that is NOT inside quotes\n for (let i = keysStr.length - 1; i >= 0; i--) {\n const char = keysStr[i];\n\n if (char === '\"') {\n // Check for escaped quote (count preceding backslashes)\n let backslashCount = 0;\n for (let j = i - 1; j >= 0; j--) {\n if (keysStr[j] === '\\\\') {\n backslashCount++;\n } else {\n break;\n }\n }\n\n // If even number of backslashes, it's a real quote\n if (backslashCount % 2 === 0) {\n inQuotes = !inQuotes;\n }\n }\n\n if (char === '#' && !inQuotes) {\n hashIdx = i;\n break;\n }\n }\n\n if (hashIdx !== -1) {\n // Found separator\n const keysPart = keysStr.slice(0, hashIdx);\n const countPart = keysStr.slice(hashIdx + 1).trim();\n\n const count = parseInt(countPart, 10);\n if (isNaN(count)) {\n // If it's not a valid number, ignore the hash (treat as part of key)\n // This handles edge cases where # might appear unquoted but not as separator\n // though strictly that should be quoted according to spec.\n // Fallback to normal parsing\n const keys = splitByDelimiter(keysStr, ',');\n return { keys, count: null };\n }\n\n const keys = splitByDelimiter(keysPart, ',');\n return { keys, count };\n } else {\n const keys = splitByDelimiter(keysStr, ',');\n return { keys, count: null };\n }\n}\n","/**\n * TSON Serializer\n *\n * Converts JavaScript data structures to TSON format.\n */\n\nimport type { TSONValue, TSONObject, TSONArray, SchemaMap } from './types';\nimport {\n formatPrimitive,\n needsQuoting,\n escapeString,\n isUniformObjectArray,\n} from './utils';\n\n/**\n * Serialize JavaScript object to TSON formatted string.\n *\n * @example\n * dumps({ name: \"Alice\", age: 30 })\n * // Returns: '{@name,age|Alice,30}'\n *\n * @example\n * dumps([{ id: 1, name: \"Alice\" }, { id: 2, name: \"Bob\" }])\n * // Returns: '{@id,name#2|1,Alice|2,Bob}'\n */\nexport function dumps(data: TSONValue): string {\n return serializeValue(data);\n}\n\n/**\n * Serialize JavaScript object to TSON formatted file (Node.js only).\n *\n * @param data - JavaScript object to serialize\n * @param filePath - Path to file to write\n */\nexport async function dump(data: TSONValue, filePath: string): Promise<void> {\n // Dynamic import for Node.js fs module\n const fs = await import('fs/promises');\n await fs.writeFile(filePath, dumps(data), 'utf-8');\n}\n\n/**\n * Serialize any JavaScript value to TSON format.\n *\n * Dispatches to appropriate serializer based on type.\n */\nexport function serializeValue(value: TSONValue): string {\n // Handle primitives\n if (\n value === null ||\n typeof value === 'boolean' ||\n typeof value === 'number' ||\n typeof value === 'string'\n ) {\n return formatPrimitive(value);\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n // Check if it's a uniform array of objects (tabular optimization)\n if (isUniformObjectArray(value)) {\n return serializeTabular(value);\n } else {\n return serializeArray(value);\n }\n }\n\n // Handle objects\n if (typeof value === 'object' && value !== null) {\n return serializeObject(value as TSONObject);\n }\n\n throw new TypeError(`Cannot serialize type: ${typeof value}`);\n}\n\n/**\n * Serialize a JavaScript object to TSON object format.\n *\n * Format: {@key1,key2|value1,value2}\n */\nexport function serializeObject(obj: TSONObject): string {\n const keys = Object.keys(obj);\n\n if (keys.length === 0) {\n return '{@}';\n }\n\n // Format keys\n const keyParts: string[] = [];\n for (const key of keys) {\n let keyStr = String(key);\n if (needsQuoting(keyStr)) {\n keyStr = `\"${escapeString(keyStr)}\"`;\n }\n keyParts.push(keyStr);\n }\n\n // Format values\n const valueParts: string[] = [];\n for (const key of keys) {\n valueParts.push(serializeValue(obj[key]));\n }\n\n // Build object string\n const keysStr = keyParts.join(',');\n const valuesStr = valueParts.join(',');\n\n return `{@${keysStr}|${valuesStr}}`;\n}\n\n/**\n * Serialize a JavaScript array to TSON array format.\n *\n * Format: [value1,value2,value3]\n */\nexport function serializeArray(arr: TSONArray): string {\n if (arr.length === 0) {\n return '[]';\n }\n\n // Serialize each element\n const valueParts: string[] = [];\n for (const value of arr) {\n valueParts.push(serializeValue(value));\n }\n\n return '[' + valueParts.join(',') + ']';\n}\n\n/**\n * Serialize a uniform array of objects in tabular format.\n *\n * Format: {@key1,key2#N|val1,val2|val1,val2}\n *\n * This is the key optimization: keys are declared once instead of repeated\n * for each object in the array.\n */\nexport function serializeTabular(arr: TSONObject[]): string {\n if (arr.length === 0) {\n return '[]';\n }\n\n if (!isUniformObjectArray(arr)) {\n throw new Error('Array is not uniform - cannot use tabular format');\n }\n\n // Get keys from first object\n const keys = Object.keys(arr[0]);\n const count = arr.length;\n\n // Check if any values are objects with uniform structure (nested schema opportunity)\n const nestedSchemas = detectNestedSchemas(arr, keys);\n\n // Format keys (with nested schemas if applicable)\n const keyParts: string[] = [];\n for (const key of keys) {\n let keyStr = String(key);\n if (needsQuoting(keyStr)) {\n keyStr = `\"${escapeString(keyStr)}\"`;\n }\n\n // Add nested schema notation if applicable\n if (key in nestedSchemas) {\n const schemaKeys = nestedSchemas[key]!;\n // Quote schema keys that need quoting (contain special chars)\n const formattedSchemaKeys = schemaKeys.map(sk => {\n if (needsQuoting(sk)) {\n return `\"${escapeString(sk)}\"`;\n }\n return sk;\n });\n const schemaStr = formattedSchemaKeys.join(',');\n keyStr = `${keyStr}(@${schemaStr})`;\n }\n\n keyParts.push(keyStr);\n }\n\n const keysStr = keyParts.join(',');\n\n // Format rows\n const rowParts: string[] = [];\n for (const obj of arr) {\n const valueParts: string[] = [];\n for (const key of keys) {\n const value = obj[key];\n\n // If this key has a nested schema, serialize as schematized object\n if (key in nestedSchemas) {\n valueParts.push(serializeSchematizedObject(value as TSONObject, nestedSchemas[key]!));\n } else {\n valueParts.push(serializeValue(value));\n }\n }\n rowParts.push(valueParts.join(','));\n }\n\n const rowsStr = rowParts.join('|');\n\n return `{@${keysStr}#${count}|${rowsStr}}`;\n}\n\n/**\n * Detect if any fields contain uniform nested objects that can use schema notation.\n *\n * For each key, checks if all values are objects with identical keys.\n * If so, that field can use nested schema notation.\n */\nexport function detectNestedSchemas(arr: TSONObject[], keys: string[]): SchemaMap {\n const nestedSchemas: SchemaMap = {};\n\n for (const key of keys) {\n // Get all values for this key\n const values = arr.map(obj => obj[key]);\n\n // Check if all values are plain objects\n if (!values.every(v => typeof v === 'object' && v !== null && !Array.isArray(v))) {\n continue;\n }\n\n if (values.length === 0) {\n continue;\n }\n\n // Check if all objects have the same keys\n const firstKeys = Object.keys(values[0] as TSONObject);\n const allSame = values.slice(1).every(v => {\n const objKeys = Object.keys(v as TSONObject);\n return (\n objKeys.length === firstKeys.length &&\n objKeys.every((k, i) => k === firstKeys[i])\n );\n });\n\n if (allSame) {\n // This field can use nested schema\n nestedSchemas[key] = firstKeys;\n }\n }\n\n return nestedSchemas;\n}\n\n/**\n * Serialize an object using a pre-declared schema.\n *\n * Format: {value1,value2} (no @ marker, values only)\n *\n * The @ marker is omitted because the schema was already declared in the\n * parent structure.\n */\nexport function serializeSchematizedObject(obj: TSONObject, schema: string[]): string {\n if (Object.keys(obj).length === 0) {\n return '{}';\n }\n\n // Serialize values in schema order\n const valueParts: string[] = [];\n for (const key of schema) {\n const value = obj[key];\n valueParts.push(serializeValue(value));\n }\n\n return '{' + valueParts.join(',') + '}';\n}\n","/**\n * TSON Deserializer\n *\n * Parses TSON format back to JavaScript data structures.\n */\n\nimport type { TSONValue, TSONObject, TSONArray, SchemaMap } from './types';\nimport {\n parsePrimitive,\n splitByDelimiter,\n buildSchemaMap,\n parseKeys,\n parseKeySchema,\n} from './utils';\n\n/**\n * Deserialize TSON formatted string to JavaScript object.\n *\n * @example\n * loads('{@name,age|Alice,30}')\n * // Returns: { name: 'Alice', age: 30 }\n *\n * @example\n * loads('{@id,name#2|1,Alice|2,Bob}')\n * // Returns: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]\n */\nexport function loads(s: string): TSONValue {\n const trimmed = s.trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n return parseValue(trimmed);\n}\n\n/**\n * Deserialize TSON formatted file to JavaScript object (Node.js only).\n *\n * @param filePath - Path to file to read\n * @returns Parsed JavaScript object\n */\nexport async function load(filePath: string): Promise<TSONValue> {\n // Dynamic import for Node.js fs module\n const fs = await import('fs/promises');\n const content = await fs.readFile(filePath, 'utf-8');\n return loads(content);\n}\n\n/**\n * Parse a TSON value of any type.\n *\n * Determines the type by looking at the first character and dispatches\n * to the appropriate parser.\n */\nexport function parseValue(text: string): TSONValue {\n const trimmed = text.trim();\n\n if (trimmed.length === 0) {\n return '';\n }\n\n // Check first character to determine type\n const firstChar = trimmed[0];\n\n if (firstChar === '{') {\n // Object (with @ marker) or schematized object\n return parseObject(trimmed);\n } else if (firstChar === '[') {\n // Array\n return parseArray(trimmed);\n } else {\n // Primitive value\n return parsePrimitive(trimmed);\n }\n}\n\n/**\n * Parse TSON object format.\n *\n * Handles both:\n * - {@key1,key2|val1,val2} - Single object or array of objects\n * - {val1,val2} - Schematized object (no @ marker)\n */\nexport function parseObject(text: string): TSONValue {\n const trimmed = text.trim();\n\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) {\n throw new Error(`Invalid object format: ${text}`);\n }\n\n // Extract content between braces\n const content = trimmed.slice(1, -1).trim();\n\n // Empty object\n if (content === '@' || content === '') {\n return {};\n }\n\n // Check if this has @ marker (object with keys)\n if (content.startsWith('@')) {\n return parseKeyedObject(content.slice(1)); // Remove @ marker\n } else {\n // Schematized object without @ marker (just values)\n // This shouldn't happen at top level but can occur as nested value\n // Parse as comma-separated values\n const values = splitByDelimiter(content, ',');\n const parsedValues = values.map(v => parseValue(v));\n\n // Return as array (since we don't have keys)\n // In practice, this shouldn't be hit at top level\n return parsedValues;\n }\n}\n\n/**\n * Parse content after @ marker in object.\n *\n * Format: key1,key2|val1,val2 or key1,key2#N|val1,val2|val1,val2\n */\nexport function parseKeyedObject(content: string): TSONValue {\n // Split by pipe to separate keys from values\n const parts = splitByDelimiter(content, '|');\n\n if (parts.length < 1) {\n throw new Error('Invalid object format: missing keys');\n }\n\n // First part contains keys (and possibly row count)\n const keysPart = parts[0];\n\n // Parse keys and extract count if present\n const { keys, count } = parseKeys(keysPart);\n\n // Build schema map (maps field names to nested schemas)\n const schemaMap = buildSchemaMap(keys);\n\n // Get actual field names (without schema notation)\n const fieldNames = keys.map(k => parseKeySchema(k).keyName);\n\n // If only one part, it's an error (no values)\n if (parts.length === 1) {\n throw new Error('Invalid object format: missing values');\n }\n\n // If two parts, could be single object or array with one row\n // If more than two parts, definitely array (multiple rows)\n const valueParts = parts.slice(1);\n\n // Check if this is tabular format (array) or single object\n // If count is specified or multiple value parts, it's tabular\n const isTabular = count !== null || valueParts.length > 1;\n\n if (isTabular) {\n // Array of objects (tabular format)\n return parseTabularArray(fieldNames, valueParts, schemaMap, count);\n } else {\n // Single object\n return parseSingleObject(fieldNames, valueParts[0], schemaMap);\n }\n}\n\n/**\n * Parse a single object from keys and values.\n */\nexport function parseSingleObject(\n fieldNames: string[],\n valuesStr: string,\n schemaMap: SchemaMap\n): TSONObject {\n // Split values\n const values = splitByDelimiter(valuesStr, ',');\n\n if (values.length !== fieldNames.length) {\n throw new Error(\n `Field count mismatch: ${fieldNames.length} fields but ${values.length} values`\n );\n }\n\n // Build object\n const obj: TSONObject = {};\n for (let i = 0; i < fieldNames.length; i++) {\n const fieldName = fieldNames[i];\n const valueStr = values[i];\n\n // Check if this field has a nested schema\n const schema = schemaMap[fieldName];\n\n if (schema) {\n // Parse as schematized object\n obj[fieldName] = parseSchematizedValue(valueStr, schema);\n } else {\n // Parse as regular value\n obj[fieldName] = parseValue(valueStr);\n }\n }\n\n return obj;\n}\n\n/**\n * Parse tabular format into array of objects.\n */\nexport function parseTabularArray(\n fieldNames: string[],\n rowParts: string[],\n schemaMap: SchemaMap,\n expectedCount: number | null\n): TSONObject[] {\n const result: TSONObject[] = [];\n\n for (const rowStr of rowParts) {\n if (rowStr.trim().length === 0) {\n continue;\n }\n\n const obj = parseSingleObject(fieldNames, rowStr, schemaMap);\n result.push(obj);\n }\n\n // Verify count if specified\n if (expectedCount !== null && result.length !== expectedCount) {\n throw new Error(\n `Row count mismatch: expected ${expectedCount} rows but got ${result.length}`\n );\n }\n\n return result;\n}\n\n/**\n * Parse a value that uses a nested schema.\n *\n * The value should be in format {val1,val2} where values correspond to\n * the keys in the schema.\n */\nexport function parseSchematizedValue(valueStr: string, schema: string[]): TSONObject {\n const trimmed = valueStr.trim();\n\n // Should be wrapped in braces\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) {\n throw new Error(`Schematized value must be wrapped in braces: ${valueStr}`);\n }\n\n // Extract content\n const content = trimmed.slice(1, -1).trim();\n\n // Empty object\n if (content.length === 0) {\n return {};\n }\n\n // Split by comma\n const values = splitByDelimiter(content, ',');\n\n if (values.length !== schema.length) {\n throw new Error(\n `Schema mismatch: ${schema.length} keys but ${values.length} values`\n );\n }\n\n // Build nested schema map for recursive schemas\n const nestedSchemaMap = buildSchemaMap(schema);\n\n // Get field names (without schema notation)\n const fieldNames = schema.map(k => parseKeySchema(k).keyName);\n\n // Build object\n const obj: TSONObject = {};\n for (let i = 0; i < fieldNames.length; i++) {\n const fieldName = fieldNames[i];\n const valueStr = values[i];\n\n // Check if this field itself has a nested schema\n const nestedSchema = nestedSchemaMap[fieldName];\n\n if (nestedSchema) {\n // Recursively parse with nested schema\n obj[fieldName] = parseSchematizedValue(valueStr, nestedSchema);\n } else {\n // Parse as regular value\n obj[fieldName] = parseValue(valueStr);\n }\n }\n\n return obj;\n}\n\n/**\n * Parse TSON array format.\n *\n * Format: [value1,value2,value3]\n */\nexport function parseArray(text: string): TSONArray {\n const trimmed = text.trim();\n\n if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {\n throw new Error(`Invalid array format: ${text}`);\n }\n\n // Extract content between brackets\n const content = trimmed.slice(1, -1).trim();\n\n // Empty array\n if (content.length === 0) {\n return [];\n }\n\n // Split by comma\n const values = splitByDelimiter(content, ',');\n\n // Parse each value\n const result: TSONArray = [];\n for (const valueStr of values) {\n if (valueStr.trim().length > 0) {\n // Skip empty strings from trailing commas\n result.push(parseValue(valueStr));\n }\n }\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/serializer.ts","../src/deserializer.ts","../src/prettify.ts","../src/fileio.ts"],"names":["keys","arr"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * TSON Utility Functions\n *\n * Helper functions for serialization, deserialization, and validation.\n */\n\nimport type { TSONValue, TSONObject, SchemaMap, KeySchema, ParsedKeys } from './types';\n\n/**\n * Special characters that require string quoting\n */\nexport const SPECIAL_CHARS = new Set([',', '|', '@', '#', '{', '}', '[', ']', '\\n', '\\r', '\\t', ' ', '\"', '(', ')']);\n\n/**\n * Determine if a string value needs to be quoted in TSON format.\n *\n * Strings need quoting if they:\n * - Are empty\n * - Contain special delimiter characters\n * - Have leading/trailing whitespace\n * - Look like numbers (to preserve them as strings)\n * - Look like reserved words (true/false/null) when we want them as strings\n */\nexport function needsQuoting(value: string): boolean {\n if (value.length === 0) {\n return true;\n }\n\n // Check for reserved words that we want to keep as strings\n if (value === 'true' || value === 'false' || value === 'null') {\n return true;\n }\n\n // Check for leading/trailing whitespace\n if (value[0].trim() === '' || value[value.length - 1].trim() === '') {\n return true;\n }\n\n // Check if it looks like a number (preserve type distinction)\n if (looksLikeNumber(value)) {\n return true;\n }\n\n // Check for special characters\n for (const char of value) {\n if (SPECIAL_CHARS.has(char)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Check if a string looks like a numeric value.\n *\n * Used to determine if we should quote a string to preserve it as a string\n * rather than having it parsed as a number.\n */\nexport function looksLikeNumber(value: string): boolean {\n if (value.length === 0) {\n return false;\n }\n\n // Try parsing as number\n const num = Number(value);\n return !isNaN(num) && value.trim() === value && isFinite(num);\n}\n\n/**\n * Escape special characters in a string for quoted representation.\n *\n * Uses standard JSON escape sequences.\n */\nexport function escapeString(value: string): string {\n // Order matters: backslash first to avoid double-escaping\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t');\n}\n\n/**\n * Unescape a quoted string back to its original form.\n *\n * Reverses the escaping done by escapeString().\n * Must process character by character to handle sequences like \\\\n correctly.\n */\nexport function unescapeString(value: string): string {\n const result: string[] = [];\n let i = 0;\n while (i < value.length) {\n if (value[i] === '\\\\' && i + 1 < value.length) {\n const nextChar = value[i + 1];\n if (nextChar === '\\\\') {\n result.push('\\\\');\n i += 2;\n } else if (nextChar === '\"') {\n result.push('\"');\n i += 2;\n } else if (nextChar === 'n') {\n result.push('\\n');\n i += 2;\n } else if (nextChar === 'r') {\n result.push('\\r');\n i += 2;\n } else if (nextChar === 't') {\n result.push('\\t');\n i += 2;\n } else {\n // Unknown escape, keep as-is\n result.push(value[i]);\n i += 1;\n }\n } else {\n result.push(value[i]);\n i += 1;\n }\n }\n return result.join('');\n}\n\n/**\n * Format a primitive value as TSON string.\n */\nexport function formatPrimitive(value: TSONValue): string {\n if (value === null) {\n return 'null';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (typeof value === 'number') {\n return String(value);\n }\n\n if (typeof value === 'string') {\n if (needsQuoting(value)) {\n return `\"${escapeString(value)}\"`;\n }\n return value;\n }\n\n throw new Error(`Cannot format non-primitive type: ${typeof value}`);\n}\n\n/**\n * Parse a TSON primitive value string to JavaScript type.\n */\nexport function parsePrimitive(value: string): TSONValue {\n const trimmed = value.trim();\n\n if (trimmed.length === 0) {\n return '';\n }\n\n // Check for boolean\n if (trimmed === 'true') {\n return true;\n }\n if (trimmed === 'false') {\n return false;\n }\n\n // Check for null\n if (trimmed === 'null') {\n return null;\n }\n\n // Check for quoted string\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return unescapeString(trimmed.slice(1, -1));\n }\n\n // Try to parse as number\n if (looksLikeNumber(trimmed)) {\n const num = Number(trimmed);\n if (!isNaN(num)) {\n return num;\n }\n }\n\n // Otherwise it's an unquoted string\n return trimmed;\n}\n\n/**\n * Check if a value is an array of objects with identical keys.\n *\n * This determines if we can use tabular format optimization.\n */\nexport function isUniformObjectArray(data: unknown): data is TSONObject[] {\n if (!Array.isArray(data) || data.length === 0) {\n return false;\n }\n\n // All elements must be plain objects\n if (!data.every(item => isPlainObject(item))) {\n return false;\n }\n\n // Get keys from first element\n const firstKeys = Object.keys(data[0]);\n\n // Check that all elements have the same keys in the same order\n for (let i = 1; i < data.length; i++) {\n const keys = Object.keys(data[i]);\n if (keys.length !== firstKeys.length) {\n return false;\n }\n for (let j = 0; j < keys.length; j++) {\n if (keys[j] !== firstKeys[j]) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Check if value is a plain object (not array, null, or other special object)\n */\nfunction isPlainObject(value: unknown): value is TSONObject {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n/**\n * Split text by delimiter, respecting quoted strings and nested structures.\n *\n * This is more sophisticated than string.split() because it handles:\n * - Quoted strings (don't split on delimiters inside quotes)\n * - Nested braces/brackets/parentheses (don't split inside nested structures)\n * - Escaped characters\n */\nexport function splitByDelimiter(text: string, delimiter: string): string[] {\n const result: string[] = [];\n const current: string[] = [];\n let inQuotes = false;\n let escapeNext = false;\n let depthCurly = 0;\n let depthSquare = 0;\n let depthParen = 0;\n\n for (const char of text) {\n // Handle escape sequences\n if (escapeNext) {\n current.push(char);\n escapeNext = false;\n continue;\n }\n\n if (char === '\\\\') {\n current.push(char);\n escapeNext = true;\n continue;\n }\n\n // Handle quotes\n if (char === '\"') {\n inQuotes = !inQuotes;\n current.push(char);\n continue;\n }\n\n // Inside quotes, add everything\n if (inQuotes) {\n current.push(char);\n continue;\n }\n\n // Track nesting depth\n if (char === '{') {\n depthCurly++;\n current.push(char);\n } else if (char === '}') {\n depthCurly--;\n current.push(char);\n } else if (char === '[') {\n depthSquare++;\n current.push(char);\n } else if (char === ']') {\n depthSquare--;\n current.push(char);\n } else if (char === '(') {\n depthParen++;\n current.push(char);\n } else if (char === ')') {\n depthParen--;\n current.push(char);\n } else if (\n char === delimiter &&\n depthCurly === 0 &&\n depthSquare === 0 &&\n depthParen === 0\n ) {\n // Found unquoted, unnested delimiter - split here\n result.push(current.join('').trim());\n current.length = 0;\n } else {\n current.push(char);\n }\n }\n\n // Add final segment\n if (current.length > 0) {\n result.push(current.join('').trim());\n }\n\n return result;\n}\n\n/**\n * Parse a key which may include nested schema notation and optional array count.\n *\n * The array count can be specified INSIDE the parentheses to avoid ambiguity:\n * - `key(@schema#N)` means key is an array of N objects with the given schema\n * - `key(@schema)` means key is a single object with the given schema\n *\n * Examples:\n * \"name\" -> { keyName: \"name\", schema: null, count: null }\n * \"address(@city,zip)\" -> { keyName: \"address\", schema: [\"city\", \"zip\"], count: null }\n * \"characters(@name,role#2)\" -> { keyName: \"characters\", schema: [\"name\", \"role\"], count: 2 }\n */\nexport function parseKeySchema(keyString: string): KeySchema {\n const trimmed = keyString.trim();\n\n // If the entire key is quoted, it's a simple key (any parens inside are literal)\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return { keyName: unescapeString(trimmed.slice(1, -1)), schema: null, count: null };\n }\n\n // Check if key has nested schema (only for unquoted keys)\n if (!trimmed.includes('(')) {\n return { keyName: trimmed, schema: null, count: null };\n }\n\n // Find the opening parenthesis\n const parenIdx = trimmed.indexOf('(');\n let keyName = trimmed.slice(0, parenIdx).trim();\n\n // Unquote the key name if it's quoted\n if (keyName.startsWith('\"') && keyName.endsWith('\"')) {\n keyName = unescapeString(keyName.slice(1, -1));\n }\n\n // Extract schema (everything between outermost parentheses)\n if (!trimmed.endsWith(')')) {\n throw new Error(`Invalid key schema syntax: ${keyString}`);\n }\n\n let schemaStr = trimmed.slice(parenIdx + 1, -1).trim();\n\n // Strip leading @ if present (part of notation, not key name)\n if (schemaStr.startsWith('@')) {\n schemaStr = schemaStr.slice(1);\n }\n\n // Check for array count at the END of the schema (inside parentheses)\n let nestedCount: number | null = null;\n const hashIdx = findTrailingHash(schemaStr);\n if (hashIdx !== -1) {\n const countPart = schemaStr.slice(hashIdx + 1).trim();\n const parsedCount = parseInt(countPart, 10);\n if (!isNaN(parsedCount)) {\n nestedCount = parsedCount;\n schemaStr = schemaStr.slice(0, hashIdx).trim();\n }\n }\n\n // Split schema by commas (respecting nested parentheses)\n const schemaKeys = splitByDelimiter(schemaStr, ',');\n\n return { keyName, schema: schemaKeys, count: nestedCount };\n}\n\n/**\n * Find the position of a trailing #N in a schema string.\n * Only finds # that is NOT inside quotes or nested parentheses.\n */\nfunction findTrailingHash(schemaStr: string): number {\n let inQuotes = false;\n let depthParen = 0;\n\n // Scan backwards to find the last # that is outside quotes and parens\n for (let i = schemaStr.length - 1; i >= 0; i--) {\n const char = schemaStr[i];\n\n if (char === '\"') {\n // Check for escaped quote\n let backslashCount = 0;\n for (let j = i - 1; j >= 0; j--) {\n if (schemaStr[j] === '\\\\') {\n backslashCount++;\n } else {\n break;\n }\n }\n if (backslashCount % 2 === 0) {\n inQuotes = !inQuotes;\n }\n }\n\n if (!inQuotes) {\n if (char === ')') {\n depthParen++;\n } else if (char === '(') {\n depthParen--;\n } else if (char === '#' && depthParen === 0) {\n return i;\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Build a mapping of field names to their nested schemas and array counts.\n *\n * Example:\n * [\"id\", \"address(@city,zip)\", \"items(@x,y#2)\"]\n * -> {\n * id: { schema: null, count: null },\n * address: { schema: [\"city\", \"zip\"], count: null },\n * items: { schema: [\"x\", \"y\"], count: 2 }\n * }\n */\nexport function buildSchemaMap(keys: string[]): SchemaMap {\n const schemaMap: SchemaMap = {};\n\n for (const key of keys) {\n const { keyName, schema, count } = parseKeySchema(key);\n schemaMap[keyName] = { schema, count };\n }\n\n return schemaMap;\n}\n\n/**\n * Parse keys string and extract row count if present.\n *\n * Format: key1,key2,key3 or key1,key2,key3#N\n */\nexport function parseKeys(keysStr: string): ParsedKeys {\n // Check for row count marker, respecting quotes\n let hashIdx = -1;\n let inQuotes = false;\n\n // Scan backwards to find the last # that is NOT inside quotes\n for (let i = keysStr.length - 1; i >= 0; i--) {\n const char = keysStr[i];\n\n if (char === '\"') {\n // Check for escaped quote (count preceding backslashes)\n let backslashCount = 0;\n for (let j = i - 1; j >= 0; j--) {\n if (keysStr[j] === '\\\\') {\n backslashCount++;\n } else {\n break;\n }\n }\n\n // If even number of backslashes, it's a real quote\n if (backslashCount % 2 === 0) {\n inQuotes = !inQuotes;\n }\n }\n\n if (char === '#' && !inQuotes) {\n hashIdx = i;\n break;\n }\n }\n\n if (hashIdx !== -1) {\n // Found separator\n const keysPart = keysStr.slice(0, hashIdx);\n const countPart = keysStr.slice(hashIdx + 1).trim();\n\n const count = parseInt(countPart, 10);\n if (isNaN(count)) {\n // If it's not a valid number, ignore the hash (treat as part of key)\n // This handles edge cases where # might appear unquoted but not as separator\n // though strictly that should be quoted according to spec.\n // Fallback to normal parsing\n const keys = splitByDelimiter(keysStr, ',');\n return { keys, count: null };\n }\n\n const keys = splitByDelimiter(keysPart, ',');\n return { keys, count };\n } else {\n const keys = splitByDelimiter(keysStr, ',');\n return { keys, count: null };\n }\n}\n","/**\n * TSON Serializer\n *\n * Converts JavaScript data structures to TSON format.\n */\n\nimport type { TSONValue, TSONObject, TSONArray } from './types';\nimport {\n formatPrimitive,\n needsQuoting,\n escapeString,\n isUniformObjectArray,\n} from './utils';\n\n/**\n * Serialize JavaScript object to TSON formatted string.\n *\n * @example\n * dumps({ name: \"Alice\", age: 30 })\n * // Returns: '{@name,age|Alice,30}'\n *\n * @example\n * dumps([{ id: 1, name: \"Alice\" }, { id: 2, name: \"Bob\" }])\n * // Returns: '{@id,name#2|1,Alice|2,Bob}'\n */\nexport function dumps(data: TSONValue): string {\n return serializeValue(data);\n}\n\n/**\n * Serialize JavaScript object to TSON formatted file (Node.js only).\n *\n * @param data - JavaScript object to serialize\n * @param filePath - Path to file to write\n */\nexport async function dump(data: TSONValue, filePath: string): Promise<void> {\n // Dynamic import for Node.js fs module\n const fs = await import('fs/promises');\n await fs.writeFile(filePath, dumps(data), 'utf-8');\n}\n\n/**\n * Serialize any JavaScript value to TSON format.\n *\n * Dispatches to appropriate serializer based on type.\n */\nexport function serializeValue(value: TSONValue): string {\n // Handle primitives\n if (\n value === null ||\n typeof value === 'boolean' ||\n typeof value === 'number' ||\n typeof value === 'string'\n ) {\n return formatPrimitive(value);\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n // Check if it's a uniform array of objects (tabular optimization)\n if (isUniformObjectArray(value)) {\n return serializeTabular(value);\n } else {\n return serializeArray(value);\n }\n }\n\n // Handle objects\n if (typeof value === 'object' && value !== null) {\n return serializeObject(value as TSONObject);\n }\n\n throw new TypeError(`Cannot serialize type: ${typeof value}`);\n}\n\n/**\n * Serialize a JavaScript object to TSON object format.\n *\n * Format: {@key1,key2|value1,value2}\n */\nexport function serializeObject(obj: TSONObject): string {\n const keys = Object.keys(obj);\n\n if (keys.length === 0) {\n return '{@}';\n }\n\n // Format keys\n const keyParts: string[] = [];\n for (const key of keys) {\n let keyStr = String(key);\n if (needsQuoting(keyStr)) {\n keyStr = `\"${escapeString(keyStr)}\"`;\n }\n keyParts.push(keyStr);\n }\n\n // Format values\n const valueParts: string[] = [];\n for (const key of keys) {\n valueParts.push(serializeValue(obj[key]));\n }\n\n // Build object string\n const keysStr = keyParts.join(',');\n const valuesStr = valueParts.join(',');\n\n return `{@${keysStr}|${valuesStr}}`;\n}\n\n/**\n * Serialize a JavaScript array to TSON array format.\n *\n * Format: [value1,value2,value3]\n */\nexport function serializeArray(arr: TSONArray): string {\n if (arr.length === 0) {\n return '[]';\n }\n\n // Serialize each element\n const valueParts: string[] = [];\n for (const value of arr) {\n valueParts.push(serializeValue(value));\n }\n\n return '[' + valueParts.join(',') + ']';\n}\n\n/**\n * Serialize a uniform array of objects in tabular format.\n *\n * Format: {@key1,key2#N|val1,val2|val1,val2}\n *\n * This is the key optimization: keys are declared once instead of repeated\n * for each object in the array.\n */\nexport function serializeTabular(arr: TSONObject[]): string {\n if (arr.length === 0) {\n return '[]';\n }\n\n if (!isUniformObjectArray(arr)) {\n throw new Error('Array is not uniform - cannot use tabular format');\n }\n\n // Get keys from first object\n const keys = Object.keys(arr[0]);\n const count = arr.length;\n\n // Check if any values are objects or arrays with uniform structure (nested schema opportunity)\n const nestedSchemas = detectNestedSchemas(arr, keys);\n\n // Format keys (with nested schemas if applicable)\n const keyParts: string[] = [];\n for (const key of keys) {\n let keyStr = String(key);\n if (needsQuoting(keyStr)) {\n keyStr = `\"${escapeString(keyStr)}\"`;\n }\n\n // Add nested schema notation if applicable\n if (key in nestedSchemas) {\n const schemaInfo = nestedSchemas[key];\n const schemaKeys = schemaInfo.schema;\n const nestedCount = schemaInfo.count;\n\n // Quote schema keys that need quoting (contain special chars)\n const formattedSchemaKeys = schemaKeys.map(sk => {\n if (needsQuoting(sk)) {\n return `\"${escapeString(sk)}\"`;\n }\n return sk;\n });\n const schemaStr = formattedSchemaKeys.join(',');\n\n // Add #N inside parentheses for nested arrays\n if (nestedCount !== null) {\n keyStr = `${keyStr}(@${schemaStr}#${nestedCount})`;\n } else {\n keyStr = `${keyStr}(@${schemaStr})`;\n }\n }\n\n keyParts.push(keyStr);\n }\n\n const keysStr = keyParts.join(',');\n\n // Format rows\n const rowParts: string[] = [];\n for (const obj of arr) {\n const valueParts: string[] = [];\n for (const key of keys) {\n const value = obj[key];\n\n // If this key has a nested schema, serialize according to type\n if (key in nestedSchemas) {\n const schemaInfo = nestedSchemas[key];\n if (schemaInfo.count !== null) {\n // Nested array - serialize as bracket-wrapped array\n valueParts.push(serializeSchematizedArray(value as TSONObject[], schemaInfo.schema));\n } else {\n // Nested object - serialize as schematized object\n valueParts.push(serializeSchematizedObject(value as TSONObject, schemaInfo.schema));\n }\n } else {\n valueParts.push(serializeValue(value));\n }\n }\n rowParts.push(valueParts.join(','));\n }\n\n const rowsStr = rowParts.join('|');\n\n return `{@${keysStr}#${count}|${rowsStr}}`;\n}\n\n/**\n * Nested schema info for serialization\n */\ninterface NestedSchemaInfo {\n schema: string[];\n count: number | null;\n}\n\ntype NestedSchemaMap = Record<string, NestedSchemaInfo>;\n\n/**\n * Detect if any fields contain uniform nested objects or arrays that can use schema notation.\n *\n * For each key, checks if all values are:\n * - Objects with identical keys -> single nested object\n * - Uniform arrays of objects with identical keys -> nested array\n */\nexport function detectNestedSchemas(arr: TSONObject[], keys: string[]): NestedSchemaMap {\n const nestedSchemas: NestedSchemaMap = {};\n\n for (const key of keys) {\n // Get all values for this key\n const values = arr.map(obj => obj[key]);\n\n // Check if all values are plain objects (nested object)\n if (values.every(v => typeof v === 'object' && v !== null && !Array.isArray(v))) {\n if (values.length === 0) {\n continue;\n }\n\n // Check if all objects have the same keys\n const firstKeys = Object.keys(values[0] as TSONObject);\n const allSame = values.slice(1).every(v => {\n const objKeys = Object.keys(v as TSONObject);\n return (\n objKeys.length === firstKeys.length &&\n objKeys.every((k, i) => k === firstKeys[i])\n );\n });\n\n if (allSame) {\n // This field can use nested object schema\n nestedSchemas[key] = { schema: firstKeys, count: null };\n }\n continue;\n }\n\n // Check if all values are uniform arrays of objects (nested array)\n if (values.every(v => Array.isArray(v))) {\n if (values.length === 0) {\n continue;\n }\n\n // Check if all arrays have objects with the same keys and same length\n let allUniform = true;\n let firstSchema: string[] | null = null;\n let arrayCount: number | null = null;\n\n for (const v of values) {\n const arr = v as TSONValue[];\n if (!isUniformObjectArray(arr)) {\n allUniform = false;\n break;\n }\n\n if (arr.length === 0) {\n continue;\n }\n\n const vSchema = Object.keys(arr[0] as TSONObject);\n const vCount = arr.length;\n\n if (firstSchema === null) {\n firstSchema = vSchema;\n arrayCount = vCount;\n } else if (\n vSchema.length !== firstSchema.length ||\n !vSchema.every((k, i) => k === firstSchema![i]) ||\n vCount !== arrayCount\n ) {\n allUniform = false;\n break;\n }\n }\n\n if (allUniform && firstSchema !== null) {\n // This field can use nested array schema\n nestedSchemas[key] = { schema: firstSchema, count: arrayCount };\n }\n }\n }\n\n return nestedSchemas;\n}\n\n/**\n * Serialize an object using a pre-declared schema.\n *\n * Format: {value1,value2} (no @ marker, values only)\n *\n * The @ marker is omitted because the schema was already declared in the\n * parent structure.\n */\nexport function serializeSchematizedObject(obj: TSONObject, schema: string[]): string {\n if (Object.keys(obj).length === 0) {\n return '{}';\n }\n\n // Serialize values in schema order\n const valueParts: string[] = [];\n for (const key of schema) {\n const value = obj[key];\n valueParts.push(serializeValue(value));\n }\n\n return '{' + valueParts.join(',') + '}';\n}\n\n/**\n * Serialize an array of objects using a pre-declared schema.\n *\n * Format: [{value1,value2},{value1,value2},...] (bracket-wrapped, comma-separated)\n *\n * Uses brackets to avoid conflict with the pipe separator used for top-level rows.\n */\nexport function serializeSchematizedArray(arr: TSONObject[], schema: string[]): string {\n if (arr.length === 0) {\n return '[]';\n }\n\n // Serialize each object in the array\n const objParts: string[] = [];\n for (const obj of arr) {\n objParts.push(serializeSchematizedObject(obj, schema));\n }\n\n return '[' + objParts.join(',') + ']';\n}\n","/**\n * TSON Deserializer\n *\n * Parses TSON format back to JavaScript data structures.\n */\n\nimport type { TSONValue, TSONObject, TSONArray, SchemaMap } from './types';\nimport {\n parsePrimitive,\n splitByDelimiter,\n buildSchemaMap,\n parseKeys,\n parseKeySchema,\n} from './utils';\n\n/**\n * Deserialize TSON formatted string to JavaScript object.\n *\n * @example\n * loads('{@name,age|Alice,30}')\n * // Returns: { name: 'Alice', age: 30 }\n *\n * @example\n * loads('{@id,name#2|1,Alice|2,Bob}')\n * // Returns: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]\n */\nexport function loads(s: string): TSONValue {\n const trimmed = s.trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n return parseValue(trimmed);\n}\n\n/**\n * Deserialize TSON formatted file to JavaScript object (Node.js only).\n *\n * @param filePath - Path to file to read\n * @returns Parsed JavaScript object\n */\nexport async function load(filePath: string): Promise<TSONValue> {\n // Dynamic import for Node.js fs module\n const fs = await import('fs/promises');\n const content = await fs.readFile(filePath, 'utf-8');\n return loads(content);\n}\n\n/**\n * Parse a TSON value of any type.\n *\n * Determines the type by looking at the first character and dispatches\n * to the appropriate parser.\n */\nexport function parseValue(text: string): TSONValue {\n const trimmed = text.trim();\n\n if (trimmed.length === 0) {\n return '';\n }\n\n // Check first character to determine type\n const firstChar = trimmed[0];\n\n if (firstChar === '{') {\n // Object (with @ marker) or schematized object\n return parseObject(trimmed);\n } else if (firstChar === '[') {\n // Array\n return parseArray(trimmed);\n } else {\n // Primitive value\n return parsePrimitive(trimmed);\n }\n}\n\n/**\n * Parse TSON object format.\n *\n * Handles both:\n * - {@key1,key2|val1,val2} - Single object or array of objects\n * - {val1,val2} - Schematized object (no @ marker)\n */\nexport function parseObject(text: string): TSONValue {\n const trimmed = text.trim();\n\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) {\n throw new Error(`Invalid object format: ${text}`);\n }\n\n // Extract content between braces\n const content = trimmed.slice(1, -1).trim();\n\n // Empty object\n if (content === '@' || content === '') {\n return {};\n }\n\n // Check if this has @ marker (object with keys)\n if (content.startsWith('@')) {\n return parseKeyedObject(content.slice(1)); // Remove @ marker\n } else {\n // Schematized object without @ marker (just values)\n // This shouldn't happen at top level but can occur as nested value\n // Parse as comma-separated values\n const values = splitByDelimiter(content, ',');\n const parsedValues = values.map(v => parseValue(v));\n\n // Return as array (since we don't have keys)\n // In practice, this shouldn't be hit at top level\n return parsedValues;\n }\n}\n\n/**\n * Parse content after @ marker in object.\n *\n * Format: key1,key2|val1,val2 or key1,key2#N|val1,val2|val1,val2\n */\nexport function parseKeyedObject(content: string): TSONValue {\n // Split by pipe to separate keys from values\n const parts = splitByDelimiter(content, '|');\n\n if (parts.length < 1) {\n throw new Error('Invalid object format: missing keys');\n }\n\n // First part contains keys (and possibly row count)\n const keysPart = parts[0];\n\n // Parse keys and extract count if present\n const { keys, count } = parseKeys(keysPart);\n\n // Handle special case: empty key list with count (array of empty objects)\n // e.g., {@#2|} means [{}, {}]\n if (keys.length === 0 && count !== null) {\n return Array.from({ length: count }, () => ({}));\n }\n\n // Build schema map (maps field names to nested schemas)\n const schemaMap = buildSchemaMap(keys);\n\n // Get actual field names (without schema notation)\n const fieldNames = keys.map(k => parseKeySchema(k).keyName);\n\n // Handle empty object (no keys, no count)\n if (keys.length === 0) {\n return {};\n }\n\n // If only one part, it's an error (no values) - but only if we have keys\n if (parts.length === 1) {\n throw new Error('Invalid object format: missing values');\n }\n\n // If two parts, could be single object or array with one row\n // If more than two parts, definitely array (multiple rows)\n const valueParts = parts.slice(1);\n\n // Check if this is tabular format (array) or single object\n // If count is specified or multiple value parts, it's tabular\n const isTabular = count !== null || valueParts.length > 1;\n\n if (isTabular) {\n // Array of objects (tabular format)\n return parseTabularArray(fieldNames, valueParts, schemaMap, count);\n } else {\n // Single object\n return parseSingleObject(fieldNames, valueParts[0], schemaMap);\n }\n}\n\n/**\n * Parse a single object from keys and values.\n */\nexport function parseSingleObject(\n fieldNames: string[],\n valuesStr: string,\n schemaMap: SchemaMap\n): TSONObject {\n // Split values\n const values = splitByDelimiter(valuesStr, ',');\n\n if (values.length !== fieldNames.length) {\n throw new Error(\n `Field count mismatch: ${fieldNames.length} fields but ${values.length} values`\n );\n }\n\n // Build object\n const obj: TSONObject = {};\n for (let i = 0; i < fieldNames.length; i++) {\n const fieldName = fieldNames[i];\n const valueStr = values[i];\n\n // Check if this field has a nested schema\n const schemaInfo = schemaMap[fieldName];\n const schema = schemaInfo?.schema;\n const count = schemaInfo?.count;\n\n if (schema) {\n // Parse as schematized value (object or array of objects)\n obj[fieldName] = parseSchematizedValue(valueStr, schema, count);\n } else {\n // Parse as regular value\n obj[fieldName] = parseValue(valueStr);\n }\n }\n\n return obj;\n}\n\n/**\n * Parse tabular format into array of objects.\n */\nexport function parseTabularArray(\n fieldNames: string[],\n rowParts: string[],\n schemaMap: SchemaMap,\n expectedCount: number | null\n): TSONObject[] {\n const result: TSONObject[] = [];\n\n for (const rowStr of rowParts) {\n if (rowStr.trim().length === 0) {\n continue;\n }\n\n const obj = parseSingleObject(fieldNames, rowStr, schemaMap);\n result.push(obj);\n }\n\n // Verify count if specified\n if (expectedCount !== null && result.length !== expectedCount) {\n throw new Error(\n `Row count mismatch: expected ${expectedCount} rows but got ${result.length}`\n );\n }\n\n return result;\n}\n\n/**\n * Parse a value that uses a nested schema.\n *\n * The value can be:\n * - A single object: {val1,val2}\n * - An array of objects: [{val1,val2},{val1,val2}] (when expectedCount is specified)\n */\nexport function parseSchematizedValue(\n valueStr: string,\n schema: string[],\n expectedCount: number | null = null\n): TSONValue {\n const trimmed = valueStr.trim();\n\n // If expectedCount is specified, this is an array of objects\n if (expectedCount !== null) {\n return parseSchematizedArray(trimmed, schema, expectedCount);\n }\n\n // Otherwise, parse as single object\n return parseSingleSchematizedObject(trimmed, schema);\n}\n\n/**\n * Parse an array of schematized objects.\n *\n * Format: [{val1,val2},{val1,val2},...] (bracket-wrapped, comma-separated)\n */\nexport function parseSchematizedArray(\n valueStr: string,\n schema: string[],\n expectedCount: number\n): TSONObject[] {\n const trimmed = valueStr.trim();\n\n // Should be wrapped in brackets\n if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {\n throw new Error(`Schematized array must be wrapped in brackets: ${valueStr}`);\n }\n\n // Extract content between brackets\n const content = trimmed.slice(1, -1).trim();\n\n // Empty array\n if (content.length === 0) {\n return [];\n }\n\n // Split by comma to get individual objects (respecting nested braces)\n const parts = splitByDelimiter(content, ',');\n\n if (parts.length !== expectedCount) {\n throw new Error(\n `Array count mismatch: expected ${expectedCount} objects but got ${parts.length}`\n );\n }\n\n const result: TSONObject[] = [];\n for (const part of parts) {\n const obj = parseSingleSchematizedObject(part.trim(), schema);\n result.push(obj);\n }\n\n return result;\n}\n\n/**\n * Parse a single schematized object.\n *\n * Format: {val1,val2}\n */\nexport function parseSingleSchematizedObject(\n valueStr: string,\n schema: string[]\n): TSONObject {\n const trimmed = valueStr.trim();\n\n // Should be wrapped in braces\n if (!trimmed.startsWith('{') || !trimmed.endsWith('}')) {\n throw new Error(`Schematized value must be wrapped in braces: ${valueStr}`);\n }\n\n // Extract content\n const content = trimmed.slice(1, -1).trim();\n\n // Empty object\n if (content.length === 0) {\n return {};\n }\n\n // Split by comma\n const values = splitByDelimiter(content, ',');\n\n if (values.length !== schema.length) {\n throw new Error(\n `Schema mismatch: ${schema.length} keys but ${values.length} values`\n );\n }\n\n // Build nested schema map for recursive schemas\n const nestedSchemaMap = buildSchemaMap(schema);\n\n // Get field names (without schema notation)\n const fieldNames = schema.map(k => parseKeySchema(k).keyName);\n\n // Build object\n const obj: TSONObject = {};\n for (let i = 0; i < fieldNames.length; i++) {\n const fieldName = fieldNames[i];\n const valStr = values[i];\n\n // Check if this field itself has a nested schema\n const schemaInfo = nestedSchemaMap[fieldName];\n const nestedSchema = schemaInfo?.schema;\n const nestedCount = schemaInfo?.count;\n\n if (nestedSchema) {\n // Recursively parse with nested schema\n obj[fieldName] = parseSchematizedValue(valStr, nestedSchema, nestedCount);\n } else {\n // Parse as regular value\n obj[fieldName] = parseValue(valStr);\n }\n }\n\n return obj;\n}\n\n/**\n * Parse TSON array format.\n *\n * Format: [value1,value2,value3]\n */\nexport function parseArray(text: string): TSONArray {\n const trimmed = text.trim();\n\n if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {\n throw new Error(`Invalid array format: ${text}`);\n }\n\n // Extract content between brackets\n const content = trimmed.slice(1, -1).trim();\n\n // Empty array\n if (content.length === 0) {\n return [];\n }\n\n // Split by comma\n const values = splitByDelimiter(content, ',');\n\n // Parse each value\n const result: TSONArray = [];\n for (const valueStr of values) {\n if (valueStr.trim().length > 0) {\n // Skip empty strings from trailing commas\n result.push(parseValue(valueStr));\n }\n }\n\n return result;\n}\n","/**\r\n * TSON Prettify\r\n *\r\n * Format TSON strings for human readability.\r\n * CSV-like format: schema on top, one row/value per line.\r\n */\r\n\r\n/**\r\n * Format a compact TSON string for human readability.\r\n *\r\n * Uses CSV-like formatting:\r\n * - Schema declaration on first line\r\n * - Each row/value on its own line with leading delimiter\r\n *\r\n * @example\r\n * prettify('{@id,name#2|1,Alice|2,Bob}')\r\n * // Returns: '{@id,name#2\\n|1,Alice\\n|2,Bob}'\r\n *\r\n * @param tsonStr - Compact TSON string\r\n * @param indent - Indentation string (default: 2 spaces)\r\n * @returns Pretty-formatted TSON string\r\n */\r\nexport function prettify(tsonStr: string, indent: string = ' '): string {\r\n if (!tsonStr || !tsonStr.trim()) {\r\n return tsonStr;\r\n }\r\n\r\n return prettifyValue(tsonStr.trim(), indent, 0);\r\n}\r\n\r\n/**\r\n * Remove all formatting from a TSON string.\r\n *\r\n * @param tsonStr - Pretty-formatted TSON string\r\n * @returns Compact single-line TSON string\r\n */\r\nexport function minify(tsonStr: string): string {\r\n if (!tsonStr) {\r\n return tsonStr;\r\n }\r\n\r\n const lines = tsonStr.split('\\n');\r\n const result: string[] = [];\r\n\r\n for (const line of lines) {\r\n // Remove leading/trailing whitespace but preserve content\r\n result.push(line.trim());\r\n }\r\n\r\n return result.join('');\r\n}\r\n\r\n/**\r\n * Recursively prettify a TSON value.\r\n */\r\nfunction prettifyValue(text: string, indent: string, depth: number): string {\r\n text = text.trim();\r\n\r\n if (!text) {\r\n return text;\r\n }\r\n\r\n // Object with schema: {@...}\r\n if (text.startsWith('{@')) {\r\n return prettifyObject(text, indent, depth);\r\n }\r\n\r\n // Schematized object (no @): {...}\r\n if (text.startsWith('{')) {\r\n return text; // Keep schematized values compact\r\n }\r\n\r\n // Array: [...]\r\n if (text.startsWith('[')) {\r\n return prettifyArray(text, indent, depth);\r\n }\r\n\r\n // Primitive value\r\n return text;\r\n}\r\n\r\n/**\r\n * Prettify a TSON object.\r\n *\r\n * Format:\r\n * {@key1,key2,key3#N\r\n * |value1,value2,value3\r\n * |value4,value5,value6}\r\n */\r\nfunction prettifyObject(text: string, indent: string, depth: number): string {\r\n if (!text.startsWith('{@') || !text.endsWith('}')) {\r\n return text;\r\n }\r\n\r\n // Extract content between {@ and }\r\n const content = text.slice(2, -1);\r\n\r\n if (!content) {\r\n return '{@}';\r\n }\r\n\r\n // Split by | to get schema and values\r\n const parts = splitTopLevel(content, '|');\r\n\r\n if (parts.length === 0) {\r\n return text;\r\n }\r\n\r\n const schema = parts[0];\r\n const valueRows = parts.slice(1);\r\n\r\n // Build pretty output\r\n const nextIndent = indent.repeat(depth + 1);\r\n\r\n if (valueRows.length === 0) {\r\n // Schema only, no values\r\n return `{@${schema}}`;\r\n }\r\n\r\n const lines: string[] = [`{@${schema}`];\r\n\r\n for (const row of valueRows) {\r\n lines.push(`${nextIndent}|${row}`);\r\n }\r\n\r\n // Close brace on same line as last value\r\n lines[lines.length - 1] = lines[lines.length - 1] + '}';\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Prettify a TSON array.\r\n *\r\n * Format:\r\n * [value1\r\n * ,value2\r\n * ,value3]\r\n */\r\nfunction prettifyArray(text: string, indent: string, depth: number): string {\r\n if (!text.startsWith('[') || !text.endsWith(']')) {\r\n return text;\r\n }\r\n\r\n const content = text.slice(1, -1);\r\n\r\n if (!content) {\r\n return '[]';\r\n }\r\n\r\n // Split array elements\r\n const elements = splitTopLevel(content, ',');\r\n\r\n if (elements.length <= 1) {\r\n // Single element or empty, keep compact\r\n return text;\r\n }\r\n\r\n const nextIndent = indent.repeat(depth + 1);\r\n\r\n const lines: string[] = [];\r\n for (let i = 0; i < elements.length; i++) {\r\n const prettified = prettifyValue(elements[i].trim(), indent, depth + 1);\r\n if (i === 0) {\r\n lines.push(`[${prettified}`);\r\n } else {\r\n lines.push(`${nextIndent},${prettified}`);\r\n }\r\n }\r\n\r\n lines[lines.length - 1] = lines[lines.length - 1] + ']';\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Split text by delimiter, respecting nested brackets and quotes.\r\n */\r\nfunction splitTopLevel(text: string, delimiter: string): string[] {\r\n const parts: string[] = [];\r\n const current: string[] = [];\r\n let depth = 0;\r\n let inString = false;\r\n let escapeNext = false;\r\n\r\n for (let i = 0; i < text.length; i++) {\r\n const char = text[i];\r\n\r\n if (escapeNext) {\r\n current.push(char);\r\n escapeNext = false;\r\n continue;\r\n }\r\n\r\n if (char === '\\\\') {\r\n current.push(char);\r\n escapeNext = true;\r\n continue;\r\n }\r\n\r\n if (char === '\"') {\r\n inString = !inString;\r\n current.push(char);\r\n continue;\r\n }\r\n\r\n if (inString) {\r\n current.push(char);\r\n continue;\r\n }\r\n\r\n if (char === '{' || char === '[') {\r\n depth++;\r\n current.push(char);\r\n } else if (char === '}' || char === ']') {\r\n depth--;\r\n current.push(char);\r\n } else if (char === delimiter && depth === 0) {\r\n parts.push(current.join(''));\r\n current.length = 0;\r\n } else {\r\n current.push(char);\r\n }\r\n }\r\n\r\n if (current.length > 0) {\r\n parts.push(current.join(''));\r\n }\r\n\r\n return parts;\r\n}\r\n","/**\r\n * TSON File Utilities\r\n *\r\n * Convenience functions for working with TSON and JSON files.\r\n * Includes support for:\r\n * - Loading JSON/TSON files\r\n * - Saving to TSON with formatting options\r\n *\r\n * Note: These functions are Node.js only (use dynamic imports for fs).\r\n */\r\n\r\nimport { dumps } from './serializer';\r\nimport { loads } from './deserializer';\r\nimport { prettify, minify } from './prettify';\r\n\r\ntype FormatOption = 'compact' | 'pretty';\r\n\r\n/**\r\n * Load a JSON file and return JavaScript data structure.\r\n *\r\n * @example\r\n * const data = await loadJson('data.json');\r\n *\r\n * @param filepath - Path to JSON file\r\n * @returns Parsed JavaScript object\r\n */\r\nexport async function loadJson(filepath: string): Promise<unknown> {\r\n const fs = await import('fs/promises');\r\n const content = await fs.readFile(filepath, 'utf-8');\r\n return JSON.parse(content);\r\n}\r\n\r\n/**\r\n * Load a TSON file and return JavaScript data structure.\r\n *\r\n * @example\r\n * const data = await loadTson('data.tson');\r\n *\r\n * @param filepath - Path to TSON file\r\n * @returns Parsed JavaScript object\r\n */\r\nexport async function loadTson(filepath: string): Promise<unknown> {\r\n const fs = await import('fs/promises');\r\n const content = await fs.readFile(filepath, 'utf-8');\r\n return loads(content);\r\n}\r\n\r\n/**\r\n * Save JavaScript data to a TSON file.\r\n *\r\n * @example\r\n * await saveTson(data, 'output.tson');\r\n * await saveTson(data, 'output.tson', { format: 'pretty' });\r\n *\r\n * @param data - JavaScript object to serialize\r\n * @param filepath - Output file path\r\n * @param options - Formatting options\r\n */\r\nexport async function saveTson(\r\n data: unknown,\r\n filepath: string,\r\n options: { format?: FormatOption; indent?: string } = {}\r\n): Promise<void> {\r\n const fs = await import('fs/promises');\r\n\r\n // Serialize to TSON\r\n let tsonStr = dumps(data as import('./types').TSONValue);\r\n\r\n // Apply formatting\r\n if (options.format === 'pretty') {\r\n tsonStr = prettify(tsonStr, options.indent || ' ');\r\n }\r\n\r\n await fs.writeFile(filepath, tsonStr, 'utf-8');\r\n}\r\n\r\n/**\r\n * Save a TSON string directly to file.\r\n *\r\n * @example\r\n * await saveTsonString(tsonData, 'output.tson');\r\n * await saveTsonString(tsonData, 'output.tson', { format: 'pretty' });\r\n *\r\n * @param tsonStr - TSON formatted string\r\n * @param filepath - Output file path\r\n * @param options - Formatting options\r\n */\r\nexport async function saveTsonString(\r\n tsonStr: string,\r\n filepath: string,\r\n options: { format?: FormatOption | null; indent?: string } = {}\r\n): Promise<void> {\r\n const fs = await import('fs/promises');\r\n\r\n // Apply formatting if requested\r\n if (options.format === 'pretty') {\r\n tsonStr = prettify(tsonStr, options.indent || ' ');\r\n } else if (options.format === 'compact') {\r\n tsonStr = minify(tsonStr);\r\n }\r\n\r\n await fs.writeFile(filepath, tsonStr, 'utf-8');\r\n}\r\n\r\n/**\r\n * Convert a JSON file to TSON format.\r\n *\r\n * @example\r\n * const tsonStr = await jsonToTson('data.json');\r\n * await jsonToTson('data.json', 'data.tson');\r\n *\r\n * @param inputPath - Path to input JSON file\r\n * @param outputPath - Path to output TSON file (optional)\r\n * @param options - Formatting options\r\n * @returns TSON string representation\r\n */\r\nexport async function jsonToTson(\r\n inputPath: string,\r\n outputPath?: string,\r\n options: { format?: FormatOption } = {}\r\n): Promise<string> {\r\n const data = await loadJson(inputPath);\r\n let tsonStr = dumps(data as import('./types').TSONValue);\r\n\r\n if (options.format === 'pretty') {\r\n tsonStr = prettify(tsonStr);\r\n }\r\n\r\n if (outputPath) {\r\n await saveTsonString(tsonStr, outputPath);\r\n }\r\n\r\n return tsonStr;\r\n}\r\n\r\n/**\r\n * Convert a TSON file to JSON format.\r\n *\r\n * @example\r\n * const jsonStr = await tsonToJson('data.tson');\r\n * await tsonToJson('data.tson', 'data.json');\r\n *\r\n * @param inputPath - Path to input TSON file\r\n * @param outputPath - Path to output JSON file (optional)\r\n * @param options - Formatting options\r\n * @returns JSON string representation\r\n */\r\nexport async function tsonToJson(\r\n inputPath: string,\r\n outputPath?: string,\r\n options: { indent?: number } = {}\r\n): Promise<string> {\r\n const data = await loadTson(inputPath);\r\n const jsonStr = JSON.stringify(data, null, options.indent ?? 2);\r\n\r\n if (outputPath) {\r\n const fs = await import('fs/promises');\r\n await fs.writeFile(outputPath, jsonStr, 'utf-8');\r\n }\r\n\r\n return jsonStr;\r\n}\r\n\r\n/**\r\n * Read a TSON file as raw string (without parsing).\r\n *\r\n * Useful when you want to prettify/minify without deserializing.\r\n *\r\n * @param filepath - Path to TSON file\r\n * @returns Raw TSON string\r\n */\r\nexport async function readTsonString(filepath: string): Promise<string> {\r\n const fs = await import('fs/promises');\r\n return fs.readFile(filepath, 'utf-8');\r\n}\r\n\r\n/**\r\n * Prettify a TSON file in place or to a new file.\r\n *\r\n * @param inputPath - Path to input TSON file\r\n * @param outputPath - Path to output file (default: overwrite input)\r\n * @param indent - Indentation string (default: 2 spaces)\r\n * @returns Prettified TSON string\r\n */\r\nexport async function prettifyFile(\r\n inputPath: string,\r\n outputPath?: string,\r\n indent: string = ' '\r\n): Promise<string> {\r\n const tsonStr = await readTsonString(inputPath);\r\n const prettyStr = prettify(tsonStr, indent);\r\n\r\n const target = outputPath || inputPath;\r\n await saveTsonString(prettyStr, target);\r\n\r\n return prettyStr;\r\n}\r\n\r\n/**\r\n * Minify a TSON file in place or to a new file.\r\n *\r\n * @param inputPath - Path to input TSON file\r\n * @param outputPath - Path to output file (default: overwrite input)\r\n * @returns Minified TSON string\r\n */\r\nexport async function minifyFile(\r\n inputPath: string,\r\n outputPath?: string\r\n): Promise<string> {\r\n const tsonStr = await readTsonString(inputPath);\r\n const compactStr = minify(tsonStr);\r\n\r\n const target = outputPath || inputPath;\r\n await saveTsonString(compactStr, target);\r\n\r\n return compactStr;\r\n}\r\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -21,17 +21,27 @@ type TSONObject = {
|
|
|
21
21
|
* Any valid TSON value
|
|
22
22
|
*/
|
|
23
23
|
type TSONValue = TSONPrimitive | TSONArray | TSONObject;
|
|
24
|
+
/**
|
|
25
|
+
* Schema info for nested object/array structures
|
|
26
|
+
* - schema: nested schema keys (or null if no schema)
|
|
27
|
+
* - count: array count (or null if single object)
|
|
28
|
+
*/
|
|
29
|
+
interface SchemaInfo {
|
|
30
|
+
schema: string[] | null;
|
|
31
|
+
count: number | null;
|
|
32
|
+
}
|
|
24
33
|
/**
|
|
25
34
|
* Schema map for nested object structures
|
|
26
|
-
* Maps field names to their
|
|
35
|
+
* Maps field names to their schema info
|
|
27
36
|
*/
|
|
28
|
-
type SchemaMap = Record<string,
|
|
37
|
+
type SchemaMap = Record<string, SchemaInfo>;
|
|
29
38
|
/**
|
|
30
39
|
* Result of parsing a key with optional schema notation
|
|
31
40
|
*/
|
|
32
41
|
interface KeySchema {
|
|
33
42
|
keyName: string;
|
|
34
43
|
schema: string[] | null;
|
|
44
|
+
count: number | null;
|
|
35
45
|
}
|
|
36
46
|
/**
|
|
37
47
|
* Result of parsing keys with optional row count
|
|
@@ -93,6 +103,154 @@ declare function loads(s: string): TSONValue;
|
|
|
93
103
|
*/
|
|
94
104
|
declare function load(filePath: string): Promise<TSONValue>;
|
|
95
105
|
|
|
106
|
+
/**
|
|
107
|
+
* TSON Prettify
|
|
108
|
+
*
|
|
109
|
+
* Format TSON strings for human readability.
|
|
110
|
+
* CSV-like format: schema on top, one row/value per line.
|
|
111
|
+
*/
|
|
112
|
+
/**
|
|
113
|
+
* Format a compact TSON string for human readability.
|
|
114
|
+
*
|
|
115
|
+
* Uses CSV-like formatting:
|
|
116
|
+
* - Schema declaration on first line
|
|
117
|
+
* - Each row/value on its own line with leading delimiter
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* prettify('{@id,name#2|1,Alice|2,Bob}')
|
|
121
|
+
* // Returns: '{@id,name#2\n|1,Alice\n|2,Bob}'
|
|
122
|
+
*
|
|
123
|
+
* @param tsonStr - Compact TSON string
|
|
124
|
+
* @param indent - Indentation string (default: 2 spaces)
|
|
125
|
+
* @returns Pretty-formatted TSON string
|
|
126
|
+
*/
|
|
127
|
+
declare function prettify(tsonStr: string, indent?: string): string;
|
|
128
|
+
/**
|
|
129
|
+
* Remove all formatting from a TSON string.
|
|
130
|
+
*
|
|
131
|
+
* @param tsonStr - Pretty-formatted TSON string
|
|
132
|
+
* @returns Compact single-line TSON string
|
|
133
|
+
*/
|
|
134
|
+
declare function minify(tsonStr: string): string;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* TSON File Utilities
|
|
138
|
+
*
|
|
139
|
+
* Convenience functions for working with TSON and JSON files.
|
|
140
|
+
* Includes support for:
|
|
141
|
+
* - Loading JSON/TSON files
|
|
142
|
+
* - Saving to TSON with formatting options
|
|
143
|
+
*
|
|
144
|
+
* Note: These functions are Node.js only (use dynamic imports for fs).
|
|
145
|
+
*/
|
|
146
|
+
type FormatOption = 'compact' | 'pretty';
|
|
147
|
+
/**
|
|
148
|
+
* Load a JSON file and return JavaScript data structure.
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* const data = await loadJson('data.json');
|
|
152
|
+
*
|
|
153
|
+
* @param filepath - Path to JSON file
|
|
154
|
+
* @returns Parsed JavaScript object
|
|
155
|
+
*/
|
|
156
|
+
declare function loadJson(filepath: string): Promise<unknown>;
|
|
157
|
+
/**
|
|
158
|
+
* Load a TSON file and return JavaScript data structure.
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* const data = await loadTson('data.tson');
|
|
162
|
+
*
|
|
163
|
+
* @param filepath - Path to TSON file
|
|
164
|
+
* @returns Parsed JavaScript object
|
|
165
|
+
*/
|
|
166
|
+
declare function loadTson(filepath: string): Promise<unknown>;
|
|
167
|
+
/**
|
|
168
|
+
* Save JavaScript data to a TSON file.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* await saveTson(data, 'output.tson');
|
|
172
|
+
* await saveTson(data, 'output.tson', { format: 'pretty' });
|
|
173
|
+
*
|
|
174
|
+
* @param data - JavaScript object to serialize
|
|
175
|
+
* @param filepath - Output file path
|
|
176
|
+
* @param options - Formatting options
|
|
177
|
+
*/
|
|
178
|
+
declare function saveTson(data: unknown, filepath: string, options?: {
|
|
179
|
+
format?: FormatOption;
|
|
180
|
+
indent?: string;
|
|
181
|
+
}): Promise<void>;
|
|
182
|
+
/**
|
|
183
|
+
* Save a TSON string directly to file.
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* await saveTsonString(tsonData, 'output.tson');
|
|
187
|
+
* await saveTsonString(tsonData, 'output.tson', { format: 'pretty' });
|
|
188
|
+
*
|
|
189
|
+
* @param tsonStr - TSON formatted string
|
|
190
|
+
* @param filepath - Output file path
|
|
191
|
+
* @param options - Formatting options
|
|
192
|
+
*/
|
|
193
|
+
declare function saveTsonString(tsonStr: string, filepath: string, options?: {
|
|
194
|
+
format?: FormatOption | null;
|
|
195
|
+
indent?: string;
|
|
196
|
+
}): Promise<void>;
|
|
197
|
+
/**
|
|
198
|
+
* Convert a JSON file to TSON format.
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* const tsonStr = await jsonToTson('data.json');
|
|
202
|
+
* await jsonToTson('data.json', 'data.tson');
|
|
203
|
+
*
|
|
204
|
+
* @param inputPath - Path to input JSON file
|
|
205
|
+
* @param outputPath - Path to output TSON file (optional)
|
|
206
|
+
* @param options - Formatting options
|
|
207
|
+
* @returns TSON string representation
|
|
208
|
+
*/
|
|
209
|
+
declare function jsonToTson(inputPath: string, outputPath?: string, options?: {
|
|
210
|
+
format?: FormatOption;
|
|
211
|
+
}): Promise<string>;
|
|
212
|
+
/**
|
|
213
|
+
* Convert a TSON file to JSON format.
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* const jsonStr = await tsonToJson('data.tson');
|
|
217
|
+
* await tsonToJson('data.tson', 'data.json');
|
|
218
|
+
*
|
|
219
|
+
* @param inputPath - Path to input TSON file
|
|
220
|
+
* @param outputPath - Path to output JSON file (optional)
|
|
221
|
+
* @param options - Formatting options
|
|
222
|
+
* @returns JSON string representation
|
|
223
|
+
*/
|
|
224
|
+
declare function tsonToJson(inputPath: string, outputPath?: string, options?: {
|
|
225
|
+
indent?: number;
|
|
226
|
+
}): Promise<string>;
|
|
227
|
+
/**
|
|
228
|
+
* Read a TSON file as raw string (without parsing).
|
|
229
|
+
*
|
|
230
|
+
* Useful when you want to prettify/minify without deserializing.
|
|
231
|
+
*
|
|
232
|
+
* @param filepath - Path to TSON file
|
|
233
|
+
* @returns Raw TSON string
|
|
234
|
+
*/
|
|
235
|
+
declare function readTsonString(filepath: string): Promise<string>;
|
|
236
|
+
/**
|
|
237
|
+
* Prettify a TSON file in place or to a new file.
|
|
238
|
+
*
|
|
239
|
+
* @param inputPath - Path to input TSON file
|
|
240
|
+
* @param outputPath - Path to output file (default: overwrite input)
|
|
241
|
+
* @param indent - Indentation string (default: 2 spaces)
|
|
242
|
+
* @returns Prettified TSON string
|
|
243
|
+
*/
|
|
244
|
+
declare function prettifyFile(inputPath: string, outputPath?: string, indent?: string): Promise<string>;
|
|
245
|
+
/**
|
|
246
|
+
* Minify a TSON file in place or to a new file.
|
|
247
|
+
*
|
|
248
|
+
* @param inputPath - Path to input TSON file
|
|
249
|
+
* @param outputPath - Path to output file (default: overwrite input)
|
|
250
|
+
* @returns Minified TSON string
|
|
251
|
+
*/
|
|
252
|
+
declare function minifyFile(inputPath: string, outputPath?: string): Promise<string>;
|
|
253
|
+
|
|
96
254
|
/**
|
|
97
255
|
* TSON Utility Functions
|
|
98
256
|
*
|
|
@@ -154,20 +312,28 @@ declare function isUniformObjectArray(data: unknown): data is TSONObject[];
|
|
|
154
312
|
*/
|
|
155
313
|
declare function splitByDelimiter(text: string, delimiter: string): string[];
|
|
156
314
|
/**
|
|
157
|
-
* Parse a key which may include nested schema notation.
|
|
315
|
+
* Parse a key which may include nested schema notation and optional array count.
|
|
316
|
+
*
|
|
317
|
+
* The array count can be specified INSIDE the parentheses to avoid ambiguity:
|
|
318
|
+
* - `key(@schema#N)` means key is an array of N objects with the given schema
|
|
319
|
+
* - `key(@schema)` means key is a single object with the given schema
|
|
158
320
|
*
|
|
159
321
|
* Examples:
|
|
160
|
-
* "name" -> { keyName: "name", schema: null }
|
|
161
|
-
* "address(@city,zip)" -> { keyName: "address", schema: ["city", "zip"] }
|
|
162
|
-
* "
|
|
322
|
+
* "name" -> { keyName: "name", schema: null, count: null }
|
|
323
|
+
* "address(@city,zip)" -> { keyName: "address", schema: ["city", "zip"], count: null }
|
|
324
|
+
* "characters(@name,role#2)" -> { keyName: "characters", schema: ["name", "role"], count: 2 }
|
|
163
325
|
*/
|
|
164
326
|
declare function parseKeySchema(keyString: string): KeySchema;
|
|
165
327
|
/**
|
|
166
|
-
* Build a mapping of field names to their nested schemas.
|
|
328
|
+
* Build a mapping of field names to their nested schemas and array counts.
|
|
167
329
|
*
|
|
168
330
|
* Example:
|
|
169
|
-
* ["id", "address(@city,zip)"]
|
|
170
|
-
* -> {
|
|
331
|
+
* ["id", "address(@city,zip)", "items(@x,y#2)"]
|
|
332
|
+
* -> {
|
|
333
|
+
* id: { schema: null, count: null },
|
|
334
|
+
* address: { schema: ["city", "zip"], count: null },
|
|
335
|
+
* items: { schema: ["x", "y"], count: 2 }
|
|
336
|
+
* }
|
|
171
337
|
*/
|
|
172
338
|
declare function buildSchemaMap(keys: string[]): SchemaMap;
|
|
173
339
|
/**
|
|
@@ -177,4 +343,4 @@ declare function buildSchemaMap(keys: string[]): SchemaMap;
|
|
|
177
343
|
*/
|
|
178
344
|
declare function parseKeys(keysStr: string): ParsedKeys;
|
|
179
345
|
|
|
180
|
-
export { type KeySchema, type ParsedKeys, type SchemaMap, type TSONArray, type TSONObject, type TSONPrimitive, type TSONValue, buildSchemaMap, dump, dumps, escapeString, formatPrimitive, isUniformObjectArray, load, loads, looksLikeNumber, needsQuoting, parseKeySchema, parseKeys, parsePrimitive, splitByDelimiter, unescapeString };
|
|
346
|
+
export { type KeySchema, type ParsedKeys, type SchemaInfo, type SchemaMap, type TSONArray, type TSONObject, type TSONPrimitive, type TSONValue, buildSchemaMap, dump, dumps, escapeString, formatPrimitive, isUniformObjectArray, jsonToTson, load, loadJson, loadTson, loads, looksLikeNumber, minify, minifyFile, needsQuoting, parseKeySchema, parseKeys, parsePrimitive, prettify, prettifyFile, readTsonString, saveTson, saveTsonString, splitByDelimiter, tsonToJson, unescapeString };
|