tersejson 0.1.0 → 0.2.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 +47 -4
- package/dist/{client-BQAZg7I8.d.mts → client-CFGvusCj.d.mts} +1 -1
- package/dist/{client-DOOGwp_p.d.ts → client-hUXNNGcN.d.ts} +1 -1
- package/dist/client.d.mts +2 -2
- package/dist/client.d.ts +2 -2
- package/dist/client.js.map +1 -1
- package/dist/client.mjs.map +1 -1
- package/dist/{express-LSVylWpN.d.ts → express-Da7WcJtt.d.ts} +1 -1
- package/dist/{express-BoL__Ao6.d.mts → express-O5w2NBTf.d.mts} +1 -1
- package/dist/express.d.mts +2 -2
- package/dist/express.d.ts +2 -2
- package/dist/graphql-C3PTnqnZ.d.mts +81 -0
- package/dist/graphql-DmtweJgh.d.ts +81 -0
- package/dist/graphql-client-2H4FjmRc.d.mts +123 -0
- package/dist/graphql-client-BXGtWqe9.d.ts +123 -0
- package/dist/graphql-client.d.mts +2 -0
- package/dist/graphql-client.d.ts +2 -0
- package/dist/graphql-client.js +215 -0
- package/dist/graphql-client.js.map +1 -0
- package/dist/graphql-client.mjs +207 -0
- package/dist/graphql-client.mjs.map +1 -0
- package/dist/graphql.d.mts +3 -0
- package/dist/graphql.d.ts +3 -0
- package/dist/graphql.js +304 -0
- package/dist/graphql.js.map +1 -0
- package/dist/graphql.mjs +296 -0
- package/dist/graphql.mjs.map +1 -0
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +400 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +398 -4
- package/dist/index.mjs.map +1 -1
- package/dist/integrations.js.map +1 -1
- package/dist/integrations.mjs.map +1 -1
- package/dist/{types-CzaGQaV7.d.mts → types-BTonKlz8.d.mts} +56 -1
- package/dist/{types-CzaGQaV7.d.ts → types-BTonKlz8.d.ts} +56 -1
- package/package.json +44 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/core.ts","../src/express.ts","../src/analytics.ts","../src/client.ts","../src/integrations.ts"],"names":["process","DEFAULT_OPTIONS"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * TerseJSON Types\n *\n * Defines the wire format and configuration options for transparent\n * JSON key compression.\n */\n\n/**\n * The compressed format sent over the wire\n */\nexport interface TersePayload<T = unknown> {\n /** Marker to identify this as a TerseJSON payload */\n __terse__: true;\n /** Version for future compatibility */\n v: 1;\n /** Key mapping: short key -> original key */\n k: Record<string, string>;\n /** The compressed data with short keys */\n d: T;\n /** Pattern used for key generation (for debugging/info) */\n p?: string;\n}\n\n/**\n * Built-in key pattern presets\n */\nexport type KeyPatternPreset =\n | 'alpha' // a, b, c, ... z, aa, ab (default)\n | 'numeric' // 0, 1, 2, ... 9, 10, 11\n | 'alphanumeric' // a1, a2, ... a9, b1, b2\n | 'short' // _, __, ___, a, b (shortest possible)\n | 'prefixed'; // k0, k1, k2 (with 'k' prefix)\n\n/**\n * Custom key generator function\n */\nexport type KeyGenerator = (index: number) => string;\n\n/**\n * Key pattern configuration\n */\nexport type KeyPattern =\n | KeyPatternPreset\n | { prefix: string; style?: 'numeric' | 'alpha' }\n | KeyGenerator;\n\n/**\n * How to handle nested structures\n */\nexport type NestedHandling =\n | 'deep' // Compress all nested objects/arrays (default)\n | 'shallow' // Only compress top-level array\n | 'arrays' // Only compress nested arrays, not single objects\n | number; // Specific depth limit (1 = shallow, Infinity = deep)\n\n/**\n * Compression options\n */\nexport interface CompressOptions {\n /**\n * Minimum key length to consider for compression\n * Keys shorter than this won't be shortened\n * @default 3\n */\n minKeyLength?: number;\n\n /**\n * Maximum depth to traverse for nested objects\n * @default 10\n */\n maxDepth?: number;\n\n /**\n * Key pattern to use for generating short keys\n * @default 'alpha'\n */\n keyPattern?: KeyPattern;\n\n /**\n * How to handle nested objects and arrays\n * @default 'deep'\n */\n nestedHandling?: NestedHandling;\n\n /**\n * Only compress keys that appear in all objects (homogeneous)\n * @default false\n */\n homogeneousOnly?: boolean;\n\n /**\n * Keys to always exclude from compression\n */\n excludeKeys?: string[];\n\n /**\n * Keys to always include in compression (even if short)\n */\n includeKeys?: string[];\n}\n\n/**\n * Configuration options for the Express middleware\n */\nexport interface TerseMiddlewareOptions extends CompressOptions {\n /**\n * Minimum array length to trigger compression\n * @default 2\n */\n minArrayLength?: number;\n\n /**\n * Custom function to determine if a response should be compressed\n * Return false to skip compression for specific responses\n */\n shouldCompress?: (data: unknown, req: unknown) => boolean;\n\n /**\n * Custom header name for signaling terse responses\n * @default 'x-terse-json'\n */\n headerName?: string;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n}\n\n/**\n * Configuration options for the client\n */\nexport interface TerseClientOptions {\n /**\n * Custom header name to check for terse responses\n * @default 'x-terse-json'\n */\n headerName?: string;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Automatically expand terse responses\n * @default true\n */\n autoExpand?: boolean;\n}\n\n/**\n * Type helper to preserve original types through compression\n */\nexport type Tersed<T> = T;\n\n/**\n * Check if a value is a TersePayload\n */\nexport function isTersePayload(value: unknown): value is TersePayload {\n return (\n typeof value === 'object' &&\n value !== null &&\n '__terse__' in value &&\n (value as TersePayload).__terse__ === true &&\n 'v' in value &&\n 'k' in value &&\n 'd' in value\n );\n}\n","/**\n * TerseJSON Core\n *\n * The core compression and expansion algorithms.\n */\n\nimport {\n TersePayload,\n isTersePayload,\n KeyPattern,\n KeyGenerator,\n NestedHandling,\n CompressOptions,\n} from './types';\n\n// ============================================================================\n// KEY PATTERN GENERATORS\n// ============================================================================\n\n/**\n * Alpha pattern: a, b, c, ... z, aa, ab, ...\n */\nfunction alphaGenerator(index: number): string {\n let key = '';\n let remaining = index;\n\n do {\n key = String.fromCharCode(97 + (remaining % 26)) + key;\n remaining = Math.floor(remaining / 26) - 1;\n } while (remaining >= 0);\n\n return key;\n}\n\n/**\n * Numeric pattern: 0, 1, 2, ... 9, 10, 11, ...\n */\nfunction numericGenerator(index: number): string {\n return String(index);\n}\n\n/**\n * Alphanumeric pattern: a1, a2, ... a9, b1, b2, ...\n */\nfunction alphanumericGenerator(index: number): string {\n const letterIndex = Math.floor(index / 9);\n const numIndex = (index % 9) + 1;\n return alphaGenerator(letterIndex) + numIndex;\n}\n\n/**\n * Short pattern: uses shortest possible keys\n * _, a, b, ..., z, aa, ab, ...\n */\nfunction shortGenerator(index: number): string {\n if (index === 0) return '_';\n return alphaGenerator(index - 1);\n}\n\n/**\n * Prefixed pattern: k0, k1, k2, ...\n */\nfunction prefixedGenerator(prefix: string, style: 'numeric' | 'alpha' = 'numeric'): KeyGenerator {\n return (index: number) => {\n if (style === 'alpha') {\n return prefix + alphaGenerator(index);\n }\n return prefix + index;\n };\n}\n\n/**\n * Creates a key generator from a pattern configuration\n */\nexport function createKeyGenerator(pattern: KeyPattern): { generator: KeyGenerator; name: string } {\n // If it's already a function, use it directly\n if (typeof pattern === 'function') {\n return { generator: pattern, name: 'custom' };\n }\n\n // If it's a preset string\n if (typeof pattern === 'string') {\n switch (pattern) {\n case 'alpha':\n return { generator: alphaGenerator, name: 'alpha' };\n case 'numeric':\n return { generator: numericGenerator, name: 'numeric' };\n case 'alphanumeric':\n return { generator: alphanumericGenerator, name: 'alphanumeric' };\n case 'short':\n return { generator: shortGenerator, name: 'short' };\n case 'prefixed':\n return { generator: prefixedGenerator('k'), name: 'prefixed:k' };\n default:\n return { generator: alphaGenerator, name: 'alpha' };\n }\n }\n\n // If it's a prefix config object\n if (typeof pattern === 'object' && 'prefix' in pattern) {\n return {\n generator: prefixedGenerator(pattern.prefix, pattern.style || 'numeric'),\n name: `prefixed:${pattern.prefix}`,\n };\n }\n\n return { generator: alphaGenerator, name: 'alpha' };\n}\n\n/**\n * Resolves nested handling to a numeric depth\n */\nfunction resolveNestedDepth(handling: NestedHandling | undefined, maxDepth: number): number {\n if (handling === undefined || handling === 'deep') {\n return maxDepth;\n }\n if (handling === 'shallow') {\n return 1;\n }\n if (handling === 'arrays') {\n return maxDepth; // Special handling in collect/compress functions\n }\n if (typeof handling === 'number') {\n return handling;\n }\n return maxDepth;\n}\n\n// Legacy generateShortKey removed - use createKeyGenerator instead\n\ninterface CollectKeysOptions {\n minKeyLength: number;\n maxDepth: number;\n nestedHandling: NestedHandling;\n excludeKeys?: string[];\n includeKeys?: string[];\n homogeneousOnly?: boolean;\n}\n\n/**\n * Collects all unique keys from an array of objects\n */\nfunction collectKeys(\n data: Record<string, unknown>[],\n options: CollectKeysOptions,\n currentDepth: number = 0\n): Set<string> {\n const keys = new Set<string>();\n const { minKeyLength, maxDepth, nestedHandling, excludeKeys, includeKeys } = options;\n\n if (currentDepth >= maxDepth) return keys;\n\n // For homogeneous mode, track key counts\n const keyCounts = new Map<string, number>();\n\n for (const item of data) {\n if (typeof item !== 'object' || item === null) continue;\n\n for (const key of Object.keys(item)) {\n // Skip excluded keys\n if (excludeKeys?.includes(key)) continue;\n\n // Include if in includeKeys, or if meets minKeyLength\n const shouldInclude = includeKeys?.includes(key) || key.length >= minKeyLength;\n\n if (shouldInclude) {\n keys.add(key);\n keyCounts.set(key, (keyCounts.get(key) || 0) + 1);\n }\n\n // Handle nested structures based on nestedHandling option\n const value = item[key];\n\n if (nestedHandling === 'shallow') {\n // Don't process nested structures\n continue;\n }\n\n if (Array.isArray(value) && value.length > 0 && isCompressibleArray(value)) {\n // Nested array of objects - always process\n const nestedKeys = collectKeys(\n value as Record<string, unknown>[],\n options,\n currentDepth + 1\n );\n nestedKeys.forEach(k => keys.add(k));\n } else if (\n nestedHandling !== 'arrays' &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n // Single nested object - skip if nestedHandling is 'arrays'\n const nestedKeys = collectKeys(\n [value as Record<string, unknown>],\n options,\n currentDepth + 1\n );\n nestedKeys.forEach(k => keys.add(k));\n }\n }\n }\n\n // If homogeneous mode, only keep keys that appear in ALL objects\n if (options.homogeneousOnly && data.length > 0) {\n for (const [key, count] of keyCounts) {\n if (count < data.length) {\n keys.delete(key);\n }\n }\n }\n\n return keys;\n}\n\n/**\n * Checks if an array is compressible (array of objects with consistent structure)\n */\nexport function isCompressibleArray(data: unknown): data is Record<string, unknown>[] {\n if (!Array.isArray(data) || data.length === 0) return false;\n\n // Check if all items are objects\n return data.every(\n item => typeof item === 'object' && item !== null && !Array.isArray(item)\n );\n}\n\n/**\n * Compresses an object using the key mapping\n */\nfunction compressObject(\n obj: Record<string, unknown>,\n keyToShort: Map<string, string>,\n maxDepth: number,\n currentDepth: number = 0\n): Record<string, unknown> {\n if (currentDepth >= maxDepth) return obj;\n\n const compressed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const shortKey = keyToShort.get(key) ?? key;\n\n if (Array.isArray(value) && isCompressibleArray(value)) {\n // Recursively compress nested arrays\n compressed[shortKey] = value.map(item =>\n compressObject(\n item as Record<string, unknown>,\n keyToShort,\n maxDepth,\n currentDepth + 1\n )\n );\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Compress single nested objects too\n compressed[shortKey] = compressObject(\n value as Record<string, unknown>,\n keyToShort,\n maxDepth,\n currentDepth + 1\n );\n } else {\n compressed[shortKey] = value;\n }\n }\n\n return compressed;\n}\n\n/**\n * Expands an object using the key mapping\n */\nfunction expandObject(\n obj: Record<string, unknown>,\n shortToKey: Map<string, string>,\n maxDepth: number,\n currentDepth: number = 0\n): Record<string, unknown> {\n if (currentDepth >= maxDepth) return obj;\n\n const expanded: Record<string, unknown> = {};\n\n for (const [shortKey, value] of Object.entries(obj)) {\n const originalKey = shortToKey.get(shortKey) ?? shortKey;\n\n if (Array.isArray(value)) {\n expanded[originalKey] = value.map(item => {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n return expandObject(\n item as Record<string, unknown>,\n shortToKey,\n maxDepth,\n currentDepth + 1\n );\n }\n return item;\n });\n } else if (typeof value === 'object' && value !== null) {\n expanded[originalKey] = expandObject(\n value as Record<string, unknown>,\n shortToKey,\n maxDepth,\n currentDepth + 1\n );\n } else {\n expanded[originalKey] = value;\n }\n }\n\n return expanded;\n}\n\n// Re-export CompressOptions from types for backwards compatibility\nexport type { CompressOptions } from './types';\n\n/**\n * Compresses an array of objects by replacing keys with short aliases\n */\nexport function compress<T extends Record<string, unknown>[]>(\n data: T,\n options: CompressOptions = {}\n): TersePayload<unknown[]> {\n const {\n minKeyLength = 3,\n maxDepth = 10,\n keyPattern = 'alpha',\n nestedHandling = 'deep',\n homogeneousOnly = false,\n excludeKeys,\n includeKeys,\n } = options;\n\n // Create key generator\n const { generator, name: patternName } = createKeyGenerator(keyPattern);\n\n // Resolve nested depth\n const effectiveDepth = resolveNestedDepth(nestedHandling, maxDepth);\n\n // Collect all unique keys\n const allKeys = collectKeys(data, {\n minKeyLength,\n maxDepth: effectiveDepth,\n nestedHandling,\n excludeKeys,\n includeKeys,\n homogeneousOnly,\n });\n\n // Sort keys by frequency of use (most used first) for optimal compression\n // For now, just sort alphabetically for deterministic output\n const sortedKeys = Array.from(allKeys).sort();\n\n // Create bidirectional mapping\n const keyToShort = new Map<string, string>();\n const keyMap: Record<string, string> = {};\n\n sortedKeys.forEach((key, index) => {\n const shortKey = generator(index);\n // Only use short key if it's actually shorter\n if (shortKey.length < key.length) {\n keyToShort.set(key, shortKey);\n keyMap[shortKey] = key;\n }\n });\n\n // Compress the data\n const compressed = data.map(item =>\n compressObject(item, keyToShort, effectiveDepth)\n );\n\n return {\n __terse__: true,\n v: 1,\n k: keyMap,\n d: compressed,\n p: patternName,\n };\n}\n\n/**\n * Expands a TersePayload back to its original form\n */\nexport function expand<T = unknown>(payload: TersePayload): T {\n const shortToKey = new Map(\n Object.entries(payload.k).map(([short, original]) => [short, original])\n );\n\n if (Array.isArray(payload.d)) {\n return payload.d.map(item => {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n return expandObject(item as Record<string, unknown>, shortToKey, 10);\n }\n return item;\n }) as T;\n }\n\n if (typeof payload.d === 'object' && payload.d !== null) {\n return expandObject(payload.d as Record<string, unknown>, shortToKey, 10) as T;\n }\n\n return payload.d as T;\n}\n\n/**\n * Creates a Proxy that transparently maps original keys to short keys\n * This is the magic that makes client-side access seamless\n */\nexport function createTerseProxy<T extends Record<string, unknown>>(\n compressed: Record<string, unknown>,\n keyMap: Record<string, string> // short -> original\n): T {\n // Create reverse map: original -> short\n const originalToShort = new Map(\n Object.entries(keyMap).map(([short, original]) => [original, short])\n );\n\n const handler: ProxyHandler<Record<string, unknown>> = {\n get(target, prop: string | symbol) {\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop);\n }\n\n // Check if accessing by original key name\n const shortKey = originalToShort.get(prop);\n const actualKey = shortKey ?? prop;\n const value = target[actualKey];\n\n // Recursively proxy nested objects/arrays\n if (Array.isArray(value)) {\n return value.map(item => {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n return createTerseProxy(item as Record<string, unknown>, keyMap);\n }\n return item;\n });\n }\n\n if (typeof value === 'object' && value !== null) {\n return createTerseProxy(value as Record<string, unknown>, keyMap);\n }\n\n return value;\n },\n\n has(target, prop: string | symbol) {\n if (typeof prop === 'symbol') {\n return Reflect.has(target, prop);\n }\n const shortKey = originalToShort.get(prop);\n return (shortKey ?? prop) in target;\n },\n\n ownKeys(target) {\n // Return original key names\n return Object.keys(target).map(shortKey => keyMap[shortKey] ?? shortKey);\n },\n\n getOwnPropertyDescriptor(target, prop: string | symbol) {\n if (typeof prop === 'symbol') {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n }\n const shortKey = originalToShort.get(prop);\n const actualKey = shortKey ?? prop;\n const descriptor = Object.getOwnPropertyDescriptor(target, actualKey);\n if (descriptor) {\n return { ...descriptor, enumerable: true, configurable: true };\n }\n return undefined;\n },\n };\n\n return new Proxy(compressed, handler) as T;\n}\n\n/**\n * Wraps TersePayload data with Proxies for transparent access\n */\nexport function wrapWithProxy<T>(payload: TersePayload): T {\n if (Array.isArray(payload.d)) {\n return payload.d.map(item => {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n return createTerseProxy(item as Record<string, unknown>, payload.k);\n }\n return item;\n }) as T;\n }\n\n if (typeof payload.d === 'object' && payload.d !== null) {\n return createTerseProxy(payload.d as Record<string, unknown>, payload.k) as T;\n }\n\n return payload.d as T;\n}\n\n// Re-export for convenience\nexport { isTersePayload };\n","/**\n * TerseJSON Express Middleware\n *\n * Automatically compresses JSON responses with repeated object structures.\n * Zero configuration required - just add the middleware.\n */\n\nimport type { Request, Response, NextFunction, RequestHandler } from 'express';\nimport { TerseMiddlewareOptions } from './types';\nimport { compress, isCompressibleArray } from './core';\nimport { recordEvent, TerseAnalytics, AnalyticsConfig } from './analytics';\n\n/**\n * Extended middleware options with analytics\n */\nexport interface TerseMiddlewareOptionsWithAnalytics extends TerseMiddlewareOptions {\n /**\n * Analytics configuration\n * Set to true for local-only analytics\n * Set to { apiKey: 'xxx' } for cloud reporting\n */\n analytics?: boolean | Partial<AnalyticsConfig> | TerseAnalytics;\n}\n\nconst DEFAULT_OPTIONS: Required<TerseMiddlewareOptions> = {\n // Middleware-specific options\n minArrayLength: 2,\n shouldCompress: () => true,\n headerName: 'x-terse-json',\n debug: false,\n // CompressOptions\n minKeyLength: 3,\n maxDepth: 10,\n keyPattern: 'alpha',\n nestedHandling: 'deep',\n homogeneousOnly: false,\n excludeKeys: [],\n includeKeys: [],\n};\n\n/**\n * Creates the TerseJSON Express middleware\n *\n * @example\n * ```typescript\n * import express from 'express';\n * import { terse } from 'tersejson/express';\n *\n * const app = express();\n * app.use(terse());\n *\n * app.get('/users', (req, res) => {\n * // Just send data as normal - compression is automatic\n * res.json(users);\n * });\n * ```\n */\nexport function terse(options: TerseMiddlewareOptionsWithAnalytics = {}): RequestHandler {\n const { analytics: analyticsOption, ...restOptions } = options;\n const config = { ...DEFAULT_OPTIONS, ...restOptions };\n\n // Setup analytics if enabled\n let analyticsInstance: TerseAnalytics | null = null;\n if (analyticsOption) {\n if (analyticsOption instanceof TerseAnalytics) {\n analyticsInstance = analyticsOption;\n } else if (analyticsOption === true) {\n // Local-only analytics\n analyticsInstance = new TerseAnalytics({ enabled: true, debug: config.debug });\n } else if (typeof analyticsOption === 'object') {\n analyticsInstance = new TerseAnalytics({ enabled: true, ...analyticsOption });\n }\n }\n\n return function terseMiddleware(\n req: Request,\n res: Response,\n next: NextFunction\n ): void {\n // Check if client supports terse responses\n const acceptsTerse = req.headers['accept-terse'] === 'true' ||\n req.headers['x-accept-terse'] === 'true';\n\n // Store original json method\n const originalJson = res.json.bind(res);\n\n // Override res.json\n res.json = function terseJson(data: unknown): Response {\n // Skip if client doesn't accept terse or compression is disabled\n if (!acceptsTerse) {\n return originalJson(data);\n }\n\n // Check if data is compressible\n if (!isCompressibleArray(data)) {\n return originalJson(data);\n }\n\n // Check minimum array length\n if ((data as unknown[]).length < config.minArrayLength) {\n return originalJson(data);\n }\n\n // Check custom shouldCompress function\n if (!config.shouldCompress(data, req)) {\n return originalJson(data);\n }\n\n try {\n const dataArray = data as Record<string, unknown>[];\n\n // Compress the data\n const compressed = compress(dataArray, {\n minKeyLength: config.minKeyLength,\n maxDepth: config.maxDepth,\n keyPattern: config.keyPattern,\n nestedHandling: config.nestedHandling,\n homogeneousOnly: config.homogeneousOnly,\n excludeKeys: config.excludeKeys,\n includeKeys: config.includeKeys,\n });\n\n // Calculate sizes\n const originalSize = JSON.stringify(data).length;\n const compressedSize = JSON.stringify(compressed).length;\n\n // Record analytics\n if (analyticsInstance) {\n analyticsInstance.record({\n originalSize,\n compressedSize,\n objectCount: dataArray.length,\n keysCompressed: Object.keys(compressed.k).length,\n endpoint: req.path,\n keyPattern: compressed.p || 'alpha',\n });\n }\n\n // Also record to global analytics if initialized\n recordEvent({\n originalSize,\n compressedSize,\n objectCount: dataArray.length,\n keysCompressed: Object.keys(compressed.k).length,\n endpoint: req.path,\n keyPattern: compressed.p || 'alpha',\n });\n\n // Debug logging\n if (config.debug) {\n const savings = ((1 - compressedSize / originalSize) * 100).toFixed(1);\n console.log(\n `[tersejson] Compressed ${originalSize} -> ${compressedSize} bytes (${savings}% savings)`\n );\n }\n\n // Set header to indicate terse response\n res.setHeader(config.headerName, 'true');\n\n return originalJson(compressed);\n } catch (error) {\n // If compression fails, fall back to original\n if (config.debug) {\n console.error('[tersejson] Compression failed:', error);\n }\n return originalJson(data);\n }\n };\n\n next();\n };\n}\n\n/**\n * Middleware to automatically add x-accept-terse header based on query param\n * Useful for testing or when you can't control client headers\n *\n * @example\n * ```typescript\n * app.use(terseQueryParam());\n * // Now ?terse=true will enable compression\n * ```\n */\nexport function terseQueryParam(paramName: string = 'terse'): RequestHandler {\n return function terseQueryMiddleware(\n req: Request,\n _res: Response,\n next: NextFunction\n ): void {\n if (req.query[paramName] === 'true') {\n req.headers['accept-terse'] = 'true';\n }\n next();\n };\n}\n\n// Re-export analytics for convenience\nexport { TerseAnalytics, analytics, initAnalytics, getAnalytics } from './analytics';\nexport type { AnalyticsConfig, AnalyticsStats, CompressionEvent } from './analytics';\n\n// Default export for convenience\nexport default terse;\n","/**\n * TerseJSON Analytics\n *\n * Opt-in analytics to track compression savings.\n * Data is anonymous and helps improve the library.\n */\n\n/**\n * Compression event data\n */\nexport interface CompressionEvent {\n /** Timestamp of the compression */\n timestamp: number;\n /** Original payload size in bytes */\n originalSize: number;\n /** Compressed payload size in bytes */\n compressedSize: number;\n /** Number of objects in the array */\n objectCount: number;\n /** Number of keys compressed */\n keysCompressed: number;\n /** Route/endpoint (optional, anonymized) */\n endpoint?: string;\n /** Key pattern used */\n keyPattern: string;\n}\n\n/**\n * Aggregated stats for reporting\n */\nexport interface AnalyticsStats {\n /** Total compression events */\n totalEvents: number;\n /** Total bytes before compression */\n totalOriginalBytes: number;\n /** Total bytes after compression */\n totalCompressedBytes: number;\n /** Total bytes saved */\n totalBytesSaved: number;\n /** Average compression ratio (0-1) */\n averageRatio: number;\n /** Total objects processed */\n totalObjects: number;\n /** Session start time */\n sessionStart: number;\n /** Last event time */\n lastEvent: number;\n}\n\n/**\n * Analytics configuration\n */\nexport interface AnalyticsConfig {\n /**\n * Enable analytics collection\n * @default false\n */\n enabled: boolean;\n\n /**\n * Send anonymous stats to tersejson.com\n * Helps improve the library\n * @default false\n */\n reportToCloud: boolean;\n\n /**\n * API key for tersejson.com (optional)\n * Get one at tersejson.com/dashboard\n */\n apiKey?: string;\n\n /**\n * Project/site identifier (optional)\n */\n projectId?: string;\n\n /**\n * Callback for each compression event\n * Use for custom logging/monitoring\n */\n onEvent?: (event: CompressionEvent) => void;\n\n /**\n * Callback for periodic stats summary\n */\n onStats?: (stats: AnalyticsStats) => void;\n\n /**\n * How often to report stats (ms)\n * @default 60000 (1 minute)\n */\n reportInterval?: number;\n\n /**\n * Include endpoint paths in analytics\n * Paths are hashed for privacy\n * @default false\n */\n trackEndpoints?: boolean;\n\n /**\n * Cloud reporting endpoint\n * @default 'https://api.tersejson.com/v1/analytics'\n */\n endpoint?: string;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<Omit<AnalyticsConfig, 'apiKey' | 'projectId' | 'onEvent' | 'onStats'>> = {\n enabled: false,\n reportToCloud: false,\n reportInterval: 60000,\n trackEndpoints: false,\n endpoint: 'https://api.tersejson.com/v1/analytics',\n debug: false,\n};\n\n/**\n * Analytics collector class\n */\nexport class TerseAnalytics {\n private config: Required<Omit<AnalyticsConfig, 'apiKey' | 'projectId' | 'onEvent' | 'onStats'>> &\n Pick<AnalyticsConfig, 'apiKey' | 'projectId' | 'onEvent' | 'onStats'>;\n private events: CompressionEvent[] = [];\n private stats: AnalyticsStats;\n private reportTimer?: ReturnType<typeof setInterval>;\n private isNode: boolean;\n\n constructor(config: Partial<AnalyticsConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.isNode = typeof window === 'undefined';\n this.stats = this.createEmptyStats();\n\n if (this.config.enabled && this.config.reportToCloud) {\n this.startReporting();\n }\n }\n\n /**\n * Create empty stats object\n */\n private createEmptyStats(): AnalyticsStats {\n return {\n totalEvents: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n totalBytesSaved: 0,\n averageRatio: 0,\n totalObjects: 0,\n sessionStart: Date.now(),\n lastEvent: Date.now(),\n };\n }\n\n /**\n * Record a compression event\n */\n record(event: Omit<CompressionEvent, 'timestamp'>): void {\n if (!this.config.enabled) return;\n\n const fullEvent: CompressionEvent = {\n ...event,\n timestamp: Date.now(),\n // Hash endpoint for privacy if tracking is enabled\n endpoint: this.config.trackEndpoints && event.endpoint\n ? this.hashEndpoint(event.endpoint)\n : undefined,\n };\n\n // Update stats\n this.stats.totalEvents++;\n this.stats.totalOriginalBytes += event.originalSize;\n this.stats.totalCompressedBytes += event.compressedSize;\n this.stats.totalBytesSaved += (event.originalSize - event.compressedSize);\n this.stats.totalObjects += event.objectCount;\n this.stats.lastEvent = fullEvent.timestamp;\n this.stats.averageRatio = this.stats.totalCompressedBytes / this.stats.totalOriginalBytes;\n\n // Store event for batch reporting\n this.events.push(fullEvent);\n\n // Call event callback\n if (this.config.onEvent) {\n this.config.onEvent(fullEvent);\n }\n\n // Debug logging\n if (this.config.debug) {\n const savings = ((1 - event.compressedSize / event.originalSize) * 100).toFixed(1);\n console.log(`[tersejson:analytics] ${event.originalSize} → ${event.compressedSize} bytes (${savings}% saved)`);\n }\n }\n\n /**\n * Get current stats\n */\n getStats(): AnalyticsStats {\n return { ...this.stats };\n }\n\n /**\n * Get formatted stats summary\n */\n getSummary(): string {\n const stats = this.stats;\n const savedKB = (stats.totalBytesSaved / 1024).toFixed(2);\n const savedPercent = stats.totalOriginalBytes > 0\n ? ((1 - stats.averageRatio) * 100).toFixed(1)\n : '0';\n\n return `TerseJSON Stats: ${stats.totalEvents} compressions, ${savedKB}KB saved (${savedPercent}% avg)`;\n }\n\n /**\n * Reset stats\n */\n reset(): void {\n this.events = [];\n this.stats = this.createEmptyStats();\n }\n\n /**\n * Start periodic reporting to cloud\n */\n private startReporting(): void {\n if (this.reportTimer) return;\n\n this.reportTimer = setInterval(() => {\n this.reportToCloud();\n }, this.config.reportInterval);\n\n // Report on exit (Node.js only)\n if (this.isNode && typeof process !== 'undefined') {\n process.on('beforeExit', () => this.reportToCloud());\n }\n }\n\n /**\n * Stop reporting\n */\n stop(): void {\n if (this.reportTimer) {\n clearInterval(this.reportTimer);\n this.reportTimer = undefined;\n }\n }\n\n /**\n * Report stats to tersejson.com\n */\n private async reportToCloud(): Promise<void> {\n if (!this.config.reportToCloud || this.events.length === 0) return;\n\n const payload = {\n apiKey: this.config.apiKey,\n projectId: this.config.projectId,\n stats: this.stats,\n events: this.events.slice(-100), // Last 100 events only\n meta: {\n version: '0.1.0',\n runtime: this.isNode ? 'node' : 'browser',\n },\n };\n\n try {\n // Use appropriate fetch based on environment\n const fetchFn = this.isNode\n ? (await import('node:https')).request\n : globalThis.fetch;\n\n if (this.isNode) {\n // Node.js - fire and forget\n const url = new URL(this.config.endpoint);\n const req = (fetchFn as typeof import('node:https').request)({\n hostname: url.hostname,\n port: url.port || 443,\n path: url.pathname,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n req.write(JSON.stringify(payload));\n req.end();\n } else {\n // Browser\n (fetchFn as typeof fetch)(this.config.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n keepalive: true, // Allow sending on page unload\n }).catch(() => {}); // Ignore errors\n }\n\n // Clear reported events\n this.events = [];\n\n // Call stats callback\n if (this.config.onStats) {\n this.config.onStats(this.stats);\n }\n\n if (this.config.debug) {\n console.log('[tersejson:analytics] Reported stats to cloud');\n }\n } catch {\n // Silently fail - analytics should never break the app\n if (this.config.debug) {\n console.log('[tersejson:analytics] Failed to report stats');\n }\n }\n }\n\n /**\n * Hash endpoint for privacy\n */\n private hashEndpoint(endpoint: string): string {\n // Simple hash - just keeps route structure without specifics\n return endpoint\n .replace(/\\/\\d+/g, '/:id')\n .replace(/\\/[a-f0-9-]{36}/gi, '/:uuid')\n .replace(/\\?.*$/, '');\n }\n}\n\n/**\n * Global analytics instance (singleton)\n */\nlet globalAnalytics: TerseAnalytics | null = null;\n\n/**\n * Initialize global analytics\n */\nexport function initAnalytics(config: Partial<AnalyticsConfig>): TerseAnalytics {\n globalAnalytics = new TerseAnalytics(config);\n return globalAnalytics;\n}\n\n/**\n * Get global analytics instance\n */\nexport function getAnalytics(): TerseAnalytics | null {\n return globalAnalytics;\n}\n\n/**\n * Record an event to global analytics (if initialized)\n */\nexport function recordEvent(event: Omit<CompressionEvent, 'timestamp'>): void {\n globalAnalytics?.record(event);\n}\n\n/**\n * Quick setup for common use cases\n */\nexport const analytics = {\n /**\n * Enable local-only analytics (no cloud reporting)\n */\n local(options: { debug?: boolean; onEvent?: AnalyticsConfig['onEvent'] } = {}) {\n return initAnalytics({\n enabled: true,\n reportToCloud: false,\n debug: options.debug,\n onEvent: options.onEvent,\n });\n },\n\n /**\n * Enable cloud analytics with API key\n */\n cloud(apiKey: string, options: Partial<AnalyticsConfig> = {}) {\n return initAnalytics({\n ...options,\n enabled: true,\n reportToCloud: true,\n apiKey,\n });\n },\n\n /**\n * Get current stats\n */\n getStats() {\n return globalAnalytics?.getStats() ?? null;\n },\n\n /**\n * Get formatted summary\n */\n getSummary() {\n return globalAnalytics?.getSummary() ?? 'Analytics not initialized';\n },\n};\n\nexport default analytics;\n","/**\n * TerseJSON Client\n *\n * Transparent client-side handling of TerseJSON responses.\n * Use the fetch wrapper or manually expand responses.\n */\n\nimport {\n TerseClientOptions,\n isTersePayload,\n} from './types';\nimport { expand, wrapWithProxy } from './core';\n\nconst DEFAULT_OPTIONS: Required<TerseClientOptions> = {\n headerName: 'x-terse-json',\n debug: false,\n autoExpand: true,\n};\n\n/**\n * Expands a TerseJSON payload back to original format\n * Use this if you want full expansion (not proxied)\n */\nexport { expand };\n\n/**\n * Wraps a TerseJSON payload with Proxy for transparent key access\n * More memory efficient than full expansion for large datasets\n */\nexport { wrapWithProxy as proxy };\n\n/**\n * Check if a response/data is a TerseJSON payload\n */\nexport { isTersePayload };\n\n/**\n * Process a potential TerseJSON response\n * Automatically detects and expands/proxies terse payloads\n */\nexport function process<T = unknown>(\n data: unknown,\n options: { useProxy?: boolean } = {}\n): T {\n const { useProxy = true } = options;\n\n if (isTersePayload(data)) {\n return useProxy ? wrapWithProxy<T>(data) : expand<T>(data);\n }\n\n return data as T;\n}\n\n/**\n * Creates a fetch wrapper that automatically handles TerseJSON responses\n *\n * @example\n * ```typescript\n * import { createFetch } from 'tersejson/client';\n *\n * const fetch = createFetch();\n *\n * // Use exactly like regular fetch\n * const users = await fetch('/api/users').then(r => r.json());\n * console.log(users[0].firstName); // Works transparently!\n * ```\n */\nexport function createFetch(options: TerseClientOptions = {}): typeof globalThis.fetch {\n const config = { ...DEFAULT_OPTIONS, ...options };\n\n return async function terseFetch(\n input: RequestInfo | URL,\n init: RequestInit = {}\n ): Promise<Response> {\n // Add header to indicate we accept terse responses\n const headers = new Headers(init.headers);\n headers.set('accept-terse', 'true');\n\n const response = await globalThis.fetch(input, {\n ...init,\n headers,\n });\n\n // Check if response is terse\n const isTerse = response.headers.get(config.headerName) === 'true';\n\n if (!isTerse || !config.autoExpand) {\n return response;\n }\n\n // Clone response and override json() method\n const clonedResponse = response.clone();\n\n // Create a wrapper that intercepts .json()\n return new Proxy(response, {\n get(target, prop) {\n if (prop === 'json') {\n return async function (): Promise<unknown> {\n const data = await clonedResponse.json();\n\n if (isTersePayload(data)) {\n if (config.debug) {\n console.log('[tersejson] Expanding terse response');\n }\n return wrapWithProxy(data);\n }\n\n return data;\n };\n }\n\n const value = Reflect.get(target, prop);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n };\n}\n\n/**\n * Drop-in fetch replacement with TerseJSON support\n *\n * @example\n * ```typescript\n * import { fetch } from 'tersejson/client';\n *\n * const users = await fetch('/api/users').then(r => r.json());\n * console.log(users[0].firstName); // Transparent!\n * ```\n */\nexport const fetch = createFetch();\n\n/**\n * React hook for fetching with TerseJSON support (if using React)\n * Returns a configured fetch function\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const terseFetch = useTerseFetch();\n * // Use in useEffect, etc.\n * }\n * ```\n */\nexport function useTerseFetch(options: TerseClientOptions = {}): typeof globalThis.fetch {\n // This is a simple hook that just returns the configured fetch\n // Could be extended with caching, SWR integration, etc.\n return createFetch(options);\n}\n\n/**\n * Axios interceptor for TerseJSON support\n *\n * @example\n * ```typescript\n * import axios from 'axios';\n * import { axiosInterceptor } from 'tersejson/client';\n *\n * axios.interceptors.request.use(axiosInterceptor.request);\n * axios.interceptors.response.use(axiosInterceptor.response);\n * ```\n */\nexport const axiosInterceptor = {\n request: (config: { headers?: Record<string, string> }) => {\n config.headers = config.headers || {};\n config.headers['accept-terse'] = 'true';\n return config;\n },\n\n response: (response: { headers?: Record<string, string>; data?: unknown }) => {\n const isTerse = response.headers?.['x-terse-json'] === 'true';\n\n if (isTerse && isTersePayload(response.data)) {\n response.data = wrapWithProxy(response.data);\n }\n\n return response;\n },\n};\n\n// Default export for convenience\nexport default { fetch, createFetch, expand, proxy: wrapWithProxy, process };\n","/**\n * TerseJSON Framework Integrations\n *\n * Ready-to-use integrations for popular HTTP clients and frameworks.\n */\n\nimport { isTersePayload } from './types';\nimport { wrapWithProxy, expand } from './core';\n\n// ============================================================================\n// AXIOS\n// ============================================================================\n\n/**\n * Axios request interceptor type\n */\ninterface AxiosRequestConfig {\n headers?: Record<string, string> | { set?: (key: string, value: string) => void };\n [key: string]: unknown;\n}\n\n/**\n * Axios response type\n */\ninterface AxiosResponse<T = unknown> {\n data: T;\n headers: Record<string, string> | { get?: (key: string) => string | null };\n status: number;\n statusText: string;\n config: AxiosRequestConfig;\n [key: string]: unknown;\n}\n\n/**\n * Create Axios interceptors for TerseJSON support\n *\n * @example\n * ```typescript\n * import axios from 'axios';\n * import { createAxiosInterceptors } from 'tersejson/integrations';\n *\n * const { request, response } = createAxiosInterceptors();\n * axios.interceptors.request.use(request);\n * axios.interceptors.response.use(response);\n *\n * // Now all axios requests automatically handle TerseJSON\n * const { data } = await axios.get('/api/users');\n * console.log(data[0].firstName); // Works transparently!\n * ```\n */\nexport function createAxiosInterceptors(options: { useProxy?: boolean; debug?: boolean } = {}) {\n const { useProxy = true, debug = false } = options;\n\n return {\n request: <T extends AxiosRequestConfig>(config: T): T => {\n // Handle both old-style object headers and new AxiosHeaders class\n if (config.headers) {\n if (typeof config.headers.set === 'function') {\n config.headers.set('accept-terse', 'true');\n } else {\n (config.headers as Record<string, string>)['accept-terse'] = 'true';\n }\n } else {\n config.headers = { 'accept-terse': 'true' };\n }\n return config;\n },\n\n response: <T>(response: AxiosResponse<T>): AxiosResponse<T> => {\n // Handle both old-style object headers and new AxiosHeaders class\n let isTerse = false;\n if (response.headers) {\n if (typeof response.headers.get === 'function') {\n isTerse = response.headers.get('x-terse-json') === 'true';\n } else {\n isTerse = (response.headers as Record<string, string>)['x-terse-json'] === 'true';\n }\n }\n\n if (isTerse && isTersePayload(response.data)) {\n if (debug) {\n console.log('[tersejson] Expanding Axios response');\n }\n response.data = (useProxy ? wrapWithProxy(response.data) : expand(response.data)) as T;\n }\n\n return response;\n },\n };\n}\n\n/**\n * Pre-configured Axios interceptors (convenience export)\n */\nexport const axiosInterceptors = createAxiosInterceptors();\n\n// ============================================================================\n// ANGULAR (Modern - HttpClient)\n// ============================================================================\n\n/**\n * Angular HttpInterceptor interface (simplified)\n */\ninterface HttpRequest<T = unknown> {\n clone: (options: { setHeaders?: Record<string, string> }) => HttpRequest<T>;\n [key: string]: unknown;\n}\n\ninterface HttpEvent<T = unknown> {\n type?: number;\n body?: T;\n headers?: { get: (name: string) => string | null };\n [key: string]: unknown;\n}\n\n// HttpHandler not needed - Angular uses its own\n\n/**\n * Creates an Angular HTTP interceptor for TerseJSON support\n *\n * @example\n * ```typescript\n * // terse.interceptor.ts\n * import { Injectable } from '@angular/core';\n * import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse } from '@angular/common/http';\n * import { Observable } from 'rxjs';\n * import { map } from 'rxjs/operators';\n * import { createAngularInterceptor } from 'tersejson/integrations';\n *\n * @Injectable()\n * export class TerseInterceptor implements HttpInterceptor {\n * private handler = createAngularInterceptor();\n *\n * intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n * return this.handler(req, next);\n * }\n * }\n *\n * // app.module.ts\n * providers: [\n * { provide: HTTP_INTERCEPTORS, useClass: TerseInterceptor, multi: true }\n * ]\n * ```\n */\nexport function createAngularInterceptor(options: { useProxy?: boolean; debug?: boolean } = {}) {\n const { useProxy = true, debug = false } = options;\n\n /**\n * Returns a function that can be used as the intercept method\n * Note: This returns the logic - you need to wrap it in an @Injectable class\n */\n return {\n /**\n * Modifies the request to include the accept-terse header\n */\n modifyRequest: <T>(req: HttpRequest<T>): HttpRequest<T> => {\n return req.clone({\n setHeaders: {\n 'accept-terse': 'true',\n },\n });\n },\n\n /**\n * Processes the response to expand TerseJSON payloads\n */\n processResponse: <T>(event: HttpEvent<T>): HttpEvent<T> => {\n // HttpResponse has type === 4\n if (event.type === 4 && event.body !== undefined) {\n const isTerse = event.headers?.get('x-terse-json') === 'true';\n\n if (isTerse && isTersePayload(event.body)) {\n if (debug) {\n console.log('[tersejson] Expanding Angular response');\n }\n // Create new response with expanded body\n return {\n ...event,\n body: (useProxy ? wrapWithProxy(event.body) : expand(event.body)) as T,\n };\n }\n }\n return event;\n },\n };\n}\n\n/**\n * Angular interceptor code snippet for copy-paste\n * Since Angular interceptors require decorators, we provide the implementation\n */\nexport const angularInterceptorSnippet = `\n// terse.interceptor.ts\nimport { Injectable } from '@angular/core';\nimport {\n HttpInterceptor,\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpResponse\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { isTersePayload, wrapWithProxy } from 'tersejson';\n\n@Injectable()\nexport class TerseInterceptor implements HttpInterceptor {\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n // Add accept-terse header\n const terseReq = req.clone({\n setHeaders: { 'accept-terse': 'true' }\n });\n\n return next.handle(terseReq).pipe(\n map(event => {\n if (event instanceof HttpResponse && event.body) {\n const isTerse = event.headers.get('x-terse-json') === 'true';\n if (isTerse && isTersePayload(event.body)) {\n return event.clone({ body: wrapWithProxy(event.body) });\n }\n }\n return event;\n })\n );\n }\n}\n\n// app.module.ts - Add to providers:\n// { provide: HTTP_INTERCEPTORS, useClass: TerseInterceptor, multi: true }\n`;\n\n// ============================================================================\n// ANGULARJS (1.x - $http)\n// ============================================================================\n\n/**\n * AngularJS $http config type\n */\ninterface AngularJSHttpConfig {\n headers?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * AngularJS $http response type\n */\ninterface AngularJSHttpResponse<T = unknown> {\n data: T;\n headers: (name: string) => string | null;\n status: number;\n statusText: string;\n config: AngularJSHttpConfig;\n}\n\n/**\n * Creates AngularJS $http interceptor for TerseJSON support\n *\n * @example\n * ```javascript\n * // In your AngularJS app config\n * angular.module('myApp', [])\n * .config(['$httpProvider', function($httpProvider) {\n * $httpProvider.interceptors.push(['$q', function($q) {\n * return createAngularJSInterceptor();\n * }]);\n * }]);\n * ```\n */\nexport function createAngularJSInterceptor(options: { useProxy?: boolean; debug?: boolean } = {}) {\n const { useProxy = true, debug = false } = options;\n\n return {\n /**\n * Request interceptor - adds accept-terse header\n */\n request: <T extends AngularJSHttpConfig>(config: T): T => {\n config.headers = config.headers || {};\n config.headers['accept-terse'] = 'true';\n return config;\n },\n\n /**\n * Response interceptor - expands TerseJSON payloads\n */\n response: <T>(response: AngularJSHttpResponse<T>): AngularJSHttpResponse<T> => {\n const isTerse = response.headers('x-terse-json') === 'true';\n\n if (isTerse && isTersePayload(response.data)) {\n if (debug) {\n console.log('[tersejson] Expanding AngularJS response');\n }\n response.data = (useProxy ? wrapWithProxy(response.data) : expand(response.data)) as T;\n }\n\n return response;\n },\n };\n}\n\n/**\n * AngularJS setup code snippet\n */\nexport const angularJSInterceptorSnippet = `\n// Setup TerseJSON with AngularJS\nangular.module('myApp', [])\n .factory('terseInterceptor', ['$q', function($q) {\n return {\n request: function(config) {\n config.headers = config.headers || {};\n config.headers['accept-terse'] = 'true';\n return config;\n },\n response: function(response) {\n var isTerse = response.headers('x-terse-json') === 'true';\n if (isTerse && response.data && response.data.__terse__) {\n // Use tersejson.process() or tersejson.wrapWithProxy()\n response.data = tersejson.process(response.data);\n }\n return response;\n }\n };\n }])\n .config(['$httpProvider', function($httpProvider) {\n $httpProvider.interceptors.push('terseInterceptor');\n }]);\n`;\n\n// ============================================================================\n// JQUERY AJAX\n// ============================================================================\n\n/**\n * jQuery AJAX setup for TerseJSON\n *\n * @example\n * ```javascript\n * import { setupJQueryAjax } from 'tersejson/integrations';\n * setupJQueryAjax($);\n *\n * // Now $.ajax, $.get, $.post all support TerseJSON\n * $.get('/api/users', function(data) {\n * console.log(data[0].firstName); // Works!\n * });\n * ```\n */\nexport function setupJQueryAjax(\n $: { ajaxSetup: (options: unknown) => void; ajaxPrefilter: (callback: unknown) => void },\n options: { useProxy?: boolean; debug?: boolean } = {}\n) {\n const { useProxy = true, debug = false } = options;\n\n // Add header to all requests\n $.ajaxSetup({\n headers: {\n 'accept-terse': 'true',\n },\n });\n\n // Process responses\n $.ajaxPrefilter((ajaxOptions: { dataFilter?: (data: string, type: string) => unknown }) => {\n const originalDataFilter = ajaxOptions.dataFilter;\n\n ajaxOptions.dataFilter = function (data: string, type: string) {\n let processed = data;\n\n if (originalDataFilter) {\n processed = originalDataFilter(data, type) as string;\n }\n\n if (type === 'json' || type === undefined) {\n try {\n const parsed = typeof processed === 'string' ? JSON.parse(processed) : processed;\n if (isTersePayload(parsed)) {\n if (debug) {\n console.log('[tersejson] Expanding jQuery response');\n }\n return useProxy ? wrapWithProxy(parsed) : expand(parsed);\n }\n return parsed;\n } catch {\n return processed;\n }\n }\n\n return processed;\n };\n });\n}\n\n/**\n * jQuery setup code snippet\n */\nexport const jQuerySetupSnippet = `\n// Setup TerseJSON with jQuery\n$.ajaxSetup({\n headers: { 'accept-terse': 'true' },\n dataFilter: function(data, type) {\n if (type === 'json') {\n var parsed = JSON.parse(data);\n if (parsed && parsed.__terse__) {\n return tersejson.process(parsed);\n }\n return parsed;\n }\n return data;\n }\n});\n`;\n\n// ============================================================================\n// SWR / React Query\n// ============================================================================\n\n/**\n * Creates a fetcher for SWR with TerseJSON support\n *\n * @example\n * ```typescript\n * import useSWR from 'swr';\n * import { createSWRFetcher } from 'tersejson/integrations';\n *\n * const fetcher = createSWRFetcher();\n *\n * function UserList() {\n * const { data, error } = useSWR('/api/users', fetcher);\n * return <div>{data?.[0].firstName}</div>;\n * }\n * ```\n */\nexport function createSWRFetcher(options: { useProxy?: boolean; debug?: boolean } = {}) {\n const { useProxy = true, debug = false } = options;\n\n return async <T>(url: string): Promise<T> => {\n const response = await globalThis.fetch(url, {\n headers: {\n 'accept-terse': 'true',\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (isTersePayload(data)) {\n if (debug) {\n console.log('[tersejson] Expanding SWR response');\n }\n return (useProxy ? wrapWithProxy(data) : expand(data)) as T;\n }\n\n return data as T;\n };\n}\n\n/**\n * Creates a query function for React Query / TanStack Query\n *\n * @example\n * ```typescript\n * import { useQuery } from '@tanstack/react-query';\n * import { createQueryFn } from 'tersejson/integrations';\n *\n * const queryFn = createQueryFn();\n *\n * function UserList() {\n * const { data } = useQuery({\n * queryKey: ['users'],\n * queryFn: () => queryFn('/api/users')\n * });\n * return <div>{data?.[0].firstName}</div>;\n * }\n * ```\n */\nexport const createQueryFn = createSWRFetcher; // Same implementation\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n // Axios\n createAxiosInterceptors,\n axiosInterceptors,\n\n // Angular\n createAngularInterceptor,\n angularInterceptorSnippet,\n\n // AngularJS\n createAngularJSInterceptor,\n angularJSInterceptorSnippet,\n\n // jQuery\n setupJQueryAjax,\n jQuerySetupSnippet,\n\n // SWR / React Query\n createSWRFetcher,\n createQueryFn,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/core.ts","../src/express.ts","../src/analytics.ts","../src/client.ts","../src/integrations.ts","../src/graphql.ts","../src/graphql-client.ts"],"names":["fetch","process","DEFAULT_OPTIONS","setAtPath","expandObject"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * TerseJSON Types\n *\n * Defines the wire format and configuration options for transparent\n * JSON key compression.\n */\n\n/**\n * The compressed format sent over the wire\n */\nexport interface TersePayload<T = unknown> {\n /** Marker to identify this as a TerseJSON payload */\n __terse__: true;\n /** Version for future compatibility */\n v: 1;\n /** Key mapping: short key -> original key */\n k: Record<string, string>;\n /** The compressed data with short keys */\n d: T;\n /** Pattern used for key generation (for debugging/info) */\n p?: string;\n}\n\n/**\n * Built-in key pattern presets\n */\nexport type KeyPatternPreset =\n | 'alpha' // a, b, c, ... z, aa, ab (default)\n | 'numeric' // 0, 1, 2, ... 9, 10, 11\n | 'alphanumeric' // a1, a2, ... a9, b1, b2\n | 'short' // _, __, ___, a, b (shortest possible)\n | 'prefixed'; // k0, k1, k2 (with 'k' prefix)\n\n/**\n * Custom key generator function\n */\nexport type KeyGenerator = (index: number) => string;\n\n/**\n * Key pattern configuration\n */\nexport type KeyPattern =\n | KeyPatternPreset\n | { prefix: string; style?: 'numeric' | 'alpha' }\n | KeyGenerator;\n\n/**\n * How to handle nested structures\n */\nexport type NestedHandling =\n | 'deep' // Compress all nested objects/arrays (default)\n | 'shallow' // Only compress top-level array\n | 'arrays' // Only compress nested arrays, not single objects\n | number; // Specific depth limit (1 = shallow, Infinity = deep)\n\n/**\n * Compression options\n */\nexport interface CompressOptions {\n /**\n * Minimum key length to consider for compression\n * Keys shorter than this won't be shortened\n * @default 3\n */\n minKeyLength?: number;\n\n /**\n * Maximum depth to traverse for nested objects\n * @default 10\n */\n maxDepth?: number;\n\n /**\n * Key pattern to use for generating short keys\n * @default 'alpha'\n */\n keyPattern?: KeyPattern;\n\n /**\n * How to handle nested objects and arrays\n * @default 'deep'\n */\n nestedHandling?: NestedHandling;\n\n /**\n * Only compress keys that appear in all objects (homogeneous)\n * @default false\n */\n homogeneousOnly?: boolean;\n\n /**\n * Keys to always exclude from compression\n */\n excludeKeys?: string[];\n\n /**\n * Keys to always include in compression (even if short)\n */\n includeKeys?: string[];\n}\n\n/**\n * Configuration options for the Express middleware\n */\nexport interface TerseMiddlewareOptions extends CompressOptions {\n /**\n * Minimum array length to trigger compression\n * @default 2\n */\n minArrayLength?: number;\n\n /**\n * Custom function to determine if a response should be compressed\n * Return false to skip compression for specific responses\n */\n shouldCompress?: (data: unknown, req: unknown) => boolean;\n\n /**\n * Custom header name for signaling terse responses\n * @default 'x-terse-json'\n */\n headerName?: string;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n}\n\n/**\n * Configuration options for the client\n */\nexport interface TerseClientOptions {\n /**\n * Custom header name to check for terse responses\n * @default 'x-terse-json'\n */\n headerName?: string;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Automatically expand terse responses\n * @default true\n */\n autoExpand?: boolean;\n}\n\n/**\n * Type helper to preserve original types through compression\n */\nexport type Tersed<T> = T;\n\n/**\n * Check if a value is a TersePayload\n */\nexport function isTersePayload(value: unknown): value is TersePayload {\n return (\n typeof value === 'object' &&\n value !== null &&\n '__terse__' in value &&\n (value as TersePayload).__terse__ === true &&\n 'v' in value &&\n 'k' in value &&\n 'd' in value\n );\n}\n\n/**\n * GraphQL terse metadata (attached to response)\n */\nexport interface GraphQLTerseMetadata {\n /** Version for compatibility */\n v: 1;\n /** Key mapping: short key -> original key */\n k: Record<string, string>;\n /** JSON paths to compressed arrays (e.g., [\"data.users\", \"data.products\"]) */\n paths: string[];\n}\n\n/**\n * GraphQL response with terse compression\n */\nexport interface GraphQLTerseResponse<T = unknown> {\n /** The compressed data with short keys in arrays */\n data: T;\n /** GraphQL errors (untouched) */\n errors?: Array<{ message: string; [key: string]: unknown }>;\n /** GraphQL extensions (untouched) */\n extensions?: Record<string, unknown>;\n /** Terse metadata */\n __terse__: GraphQLTerseMetadata;\n}\n\n/**\n * GraphQL middleware options\n */\nexport interface GraphQLTerseOptions extends CompressOptions {\n /**\n * Minimum array length to trigger compression\n * @default 2\n */\n minArrayLength?: number;\n\n /**\n * Custom function to determine if a path should be compressed\n * Return false to skip compression for specific paths\n */\n shouldCompress?: (data: unknown, path: string) => boolean;\n\n /**\n * Paths to exclude from compression (e.g., [\"data.config\"])\n */\n excludePaths?: string[];\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n}\n\n/**\n * Check if a value is a GraphQL terse response\n */\nexport function isGraphQLTersePayload(value: unknown): value is GraphQLTerseResponse {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'data' in value &&\n '__terse__' in value &&\n typeof (value as GraphQLTerseResponse).__terse__ === 'object' &&\n (value as GraphQLTerseResponse).__terse__ !== null &&\n 'v' in (value as GraphQLTerseResponse).__terse__ &&\n 'k' in (value as GraphQLTerseResponse).__terse__ &&\n 'paths' in (value as GraphQLTerseResponse).__terse__\n );\n}\n","/**\n * TerseJSON Core\n *\n * The core compression and expansion algorithms.\n */\n\nimport {\n TersePayload,\n isTersePayload,\n KeyPattern,\n KeyGenerator,\n NestedHandling,\n CompressOptions,\n} from './types';\n\n// ============================================================================\n// KEY PATTERN GENERATORS\n// ============================================================================\n\n/**\n * Alpha pattern: a, b, c, ... z, aa, ab, ...\n */\nfunction alphaGenerator(index: number): string {\n let key = '';\n let remaining = index;\n\n do {\n key = String.fromCharCode(97 + (remaining % 26)) + key;\n remaining = Math.floor(remaining / 26) - 1;\n } while (remaining >= 0);\n\n return key;\n}\n\n/**\n * Numeric pattern: 0, 1, 2, ... 9, 10, 11, ...\n */\nfunction numericGenerator(index: number): string {\n return String(index);\n}\n\n/**\n * Alphanumeric pattern: a1, a2, ... a9, b1, b2, ...\n */\nfunction alphanumericGenerator(index: number): string {\n const letterIndex = Math.floor(index / 9);\n const numIndex = (index % 9) + 1;\n return alphaGenerator(letterIndex) + numIndex;\n}\n\n/**\n * Short pattern: uses shortest possible keys\n * _, a, b, ..., z, aa, ab, ...\n */\nfunction shortGenerator(index: number): string {\n if (index === 0) return '_';\n return alphaGenerator(index - 1);\n}\n\n/**\n * Prefixed pattern: k0, k1, k2, ...\n */\nfunction prefixedGenerator(prefix: string, style: 'numeric' | 'alpha' = 'numeric'): KeyGenerator {\n return (index: number) => {\n if (style === 'alpha') {\n return prefix + alphaGenerator(index);\n }\n return prefix + index;\n };\n}\n\n/**\n * Creates a key generator from a pattern configuration\n */\nexport function createKeyGenerator(pattern: KeyPattern): { generator: KeyGenerator; name: string } {\n // If it's already a function, use it directly\n if (typeof pattern === 'function') {\n return { generator: pattern, name: 'custom' };\n }\n\n // If it's a preset string\n if (typeof pattern === 'string') {\n switch (pattern) {\n case 'alpha':\n return { generator: alphaGenerator, name: 'alpha' };\n case 'numeric':\n return { generator: numericGenerator, name: 'numeric' };\n case 'alphanumeric':\n return { generator: alphanumericGenerator, name: 'alphanumeric' };\n case 'short':\n return { generator: shortGenerator, name: 'short' };\n case 'prefixed':\n return { generator: prefixedGenerator('k'), name: 'prefixed:k' };\n default:\n return { generator: alphaGenerator, name: 'alpha' };\n }\n }\n\n // If it's a prefix config object\n if (typeof pattern === 'object' && 'prefix' in pattern) {\n return {\n generator: prefixedGenerator(pattern.prefix, pattern.style || 'numeric'),\n name: `prefixed:${pattern.prefix}`,\n };\n }\n\n return { generator: alphaGenerator, name: 'alpha' };\n}\n\n/**\n * Resolves nested handling to a numeric depth\n */\nfunction resolveNestedDepth(handling: NestedHandling | undefined, maxDepth: number): number {\n if (handling === undefined || handling === 'deep') {\n return maxDepth;\n }\n if (handling === 'shallow') {\n return 1;\n }\n if (handling === 'arrays') {\n return maxDepth; // Special handling in collect/compress functions\n }\n if (typeof handling === 'number') {\n return handling;\n }\n return maxDepth;\n}\n\n// Legacy generateShortKey removed - use createKeyGenerator instead\n\ninterface CollectKeysOptions {\n minKeyLength: number;\n maxDepth: number;\n nestedHandling: NestedHandling;\n excludeKeys?: string[];\n includeKeys?: string[];\n homogeneousOnly?: boolean;\n}\n\n/**\n * Collects all unique keys from an array of objects\n */\nfunction collectKeys(\n data: Record<string, unknown>[],\n options: CollectKeysOptions,\n currentDepth: number = 0\n): Set<string> {\n const keys = new Set<string>();\n const { minKeyLength, maxDepth, nestedHandling, excludeKeys, includeKeys } = options;\n\n if (currentDepth >= maxDepth) return keys;\n\n // For homogeneous mode, track key counts\n const keyCounts = new Map<string, number>();\n\n for (const item of data) {\n if (typeof item !== 'object' || item === null) continue;\n\n for (const key of Object.keys(item)) {\n // Skip excluded keys\n if (excludeKeys?.includes(key)) continue;\n\n // Include if in includeKeys, or if meets minKeyLength\n const shouldInclude = includeKeys?.includes(key) || key.length >= minKeyLength;\n\n if (shouldInclude) {\n keys.add(key);\n keyCounts.set(key, (keyCounts.get(key) || 0) + 1);\n }\n\n // Handle nested structures based on nestedHandling option\n const value = item[key];\n\n if (nestedHandling === 'shallow') {\n // Don't process nested structures\n continue;\n }\n\n if (Array.isArray(value) && value.length > 0 && isCompressibleArray(value)) {\n // Nested array of objects - always process\n const nestedKeys = collectKeys(\n value as Record<string, unknown>[],\n options,\n currentDepth + 1\n );\n nestedKeys.forEach(k => keys.add(k));\n } else if (\n nestedHandling !== 'arrays' &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n // Single nested object - skip if nestedHandling is 'arrays'\n const nestedKeys = collectKeys(\n [value as Record<string, unknown>],\n options,\n currentDepth + 1\n );\n nestedKeys.forEach(k => keys.add(k));\n }\n }\n }\n\n // If homogeneous mode, only keep keys that appear in ALL objects\n if (options.homogeneousOnly && data.length > 0) {\n for (const [key, count] of keyCounts) {\n if (count < data.length) {\n keys.delete(key);\n }\n }\n }\n\n return keys;\n}\n\n/**\n * Checks if an array is compressible (array of objects with consistent structure)\n */\nexport function isCompressibleArray(data: unknown): data is Record<string, unknown>[] {\n if (!Array.isArray(data) || data.length === 0) return false;\n\n // Check if all items are objects\n return data.every(\n item => typeof item === 'object' && item !== null && !Array.isArray(item)\n );\n}\n\n/**\n * Compresses an object using the key mapping\n */\nfunction compressObject(\n obj: Record<string, unknown>,\n keyToShort: Map<string, string>,\n maxDepth: number,\n currentDepth: number = 0\n): Record<string, unknown> {\n if (currentDepth >= maxDepth) return obj;\n\n const compressed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const shortKey = keyToShort.get(key) ?? key;\n\n if (Array.isArray(value) && isCompressibleArray(value)) {\n // Recursively compress nested arrays\n compressed[shortKey] = value.map(item =>\n compressObject(\n item as Record<string, unknown>,\n keyToShort,\n maxDepth,\n currentDepth + 1\n )\n );\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Compress single nested objects too\n compressed[shortKey] = compressObject(\n value as Record<string, unknown>,\n keyToShort,\n maxDepth,\n currentDepth + 1\n );\n } else {\n compressed[shortKey] = value;\n }\n }\n\n return compressed;\n}\n\n/**\n * Expands an object using the key mapping\n */\nfunction expandObject(\n obj: Record<string, unknown>,\n shortToKey: Map<string, string>,\n maxDepth: number,\n currentDepth: number = 0\n): Record<string, unknown> {\n if (currentDepth >= maxDepth) return obj;\n\n const expanded: Record<string, unknown> = {};\n\n for (const [shortKey, value] of Object.entries(obj)) {\n const originalKey = shortToKey.get(shortKey) ?? shortKey;\n\n if (Array.isArray(value)) {\n expanded[originalKey] = value.map(item => {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n return expandObject(\n item as Record<string, unknown>,\n shortToKey,\n maxDepth,\n currentDepth + 1\n );\n }\n return item;\n });\n } else if (typeof value === 'object' && value !== null) {\n expanded[originalKey] = expandObject(\n value as Record<string, unknown>,\n shortToKey,\n maxDepth,\n currentDepth + 1\n );\n } else {\n expanded[originalKey] = value;\n }\n }\n\n return expanded;\n}\n\n// Re-export CompressOptions from types for backwards compatibility\nexport type { CompressOptions } from './types';\n\n/**\n * Compresses an array of objects by replacing keys with short aliases\n */\nexport function compress<T extends Record<string, unknown>[]>(\n data: T,\n options: CompressOptions = {}\n): TersePayload<unknown[]> {\n const {\n minKeyLength = 3,\n maxDepth = 10,\n keyPattern = 'alpha',\n nestedHandling = 'deep',\n homogeneousOnly = false,\n excludeKeys,\n includeKeys,\n } = options;\n\n // Create key generator\n const { generator, name: patternName } = createKeyGenerator(keyPattern);\n\n // Resolve nested depth\n const effectiveDepth = resolveNestedDepth(nestedHandling, maxDepth);\n\n // Collect all unique keys\n const allKeys = collectKeys(data, {\n minKeyLength,\n maxDepth: effectiveDepth,\n nestedHandling,\n excludeKeys,\n includeKeys,\n homogeneousOnly,\n });\n\n // Sort keys by frequency of use (most used first) for optimal compression\n // For now, just sort alphabetically for deterministic output\n const sortedKeys = Array.from(allKeys).sort();\n\n // Create bidirectional mapping\n const keyToShort = new Map<string, string>();\n const keyMap: Record<string, string> = {};\n\n sortedKeys.forEach((key, index) => {\n const shortKey = generator(index);\n // Only use short key if it's actually shorter\n if (shortKey.length < key.length) {\n keyToShort.set(key, shortKey);\n keyMap[shortKey] = key;\n }\n });\n\n // Compress the data\n const compressed = data.map(item =>\n compressObject(item, keyToShort, effectiveDepth)\n );\n\n return {\n __terse__: true,\n v: 1,\n k: keyMap,\n d: compressed,\n p: patternName,\n };\n}\n\n/**\n * Expands a TersePayload back to its original form\n */\nexport function expand<T = unknown>(payload: TersePayload): T {\n const shortToKey = new Map(\n Object.entries(payload.k).map(([short, original]) => [short, original])\n );\n\n if (Array.isArray(payload.d)) {\n return payload.d.map(item => {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n return expandObject(item as Record<string, unknown>, shortToKey, 10);\n }\n return item;\n }) as T;\n }\n\n if (typeof payload.d === 'object' && payload.d !== null) {\n return expandObject(payload.d as Record<string, unknown>, shortToKey, 10) as T;\n }\n\n return payload.d as T;\n}\n\n/**\n * Creates a Proxy that transparently maps original keys to short keys\n * This is the magic that makes client-side access seamless\n */\nexport function createTerseProxy<T extends Record<string, unknown>>(\n compressed: Record<string, unknown>,\n keyMap: Record<string, string> // short -> original\n): T {\n // Create reverse map: original -> short\n const originalToShort = new Map(\n Object.entries(keyMap).map(([short, original]) => [original, short])\n );\n\n const handler: ProxyHandler<Record<string, unknown>> = {\n get(target, prop: string | symbol) {\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop);\n }\n\n // Check if accessing by original key name\n const shortKey = originalToShort.get(prop);\n const actualKey = shortKey ?? prop;\n const value = target[actualKey];\n\n // Recursively proxy nested objects/arrays\n if (Array.isArray(value)) {\n return value.map(item => {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n return createTerseProxy(item as Record<string, unknown>, keyMap);\n }\n return item;\n });\n }\n\n if (typeof value === 'object' && value !== null) {\n return createTerseProxy(value as Record<string, unknown>, keyMap);\n }\n\n return value;\n },\n\n has(target, prop: string | symbol) {\n if (typeof prop === 'symbol') {\n return Reflect.has(target, prop);\n }\n const shortKey = originalToShort.get(prop);\n return (shortKey ?? prop) in target;\n },\n\n ownKeys(target) {\n // Return original key names\n return Object.keys(target).map(shortKey => keyMap[shortKey] ?? shortKey);\n },\n\n getOwnPropertyDescriptor(target, prop: string | symbol) {\n if (typeof prop === 'symbol') {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n }\n const shortKey = originalToShort.get(prop);\n const actualKey = shortKey ?? prop;\n const descriptor = Object.getOwnPropertyDescriptor(target, actualKey);\n if (descriptor) {\n return { ...descriptor, enumerable: true, configurable: true };\n }\n return undefined;\n },\n };\n\n return new Proxy(compressed, handler) as T;\n}\n\n/**\n * Wraps TersePayload data with Proxies for transparent access\n */\nexport function wrapWithProxy<T>(payload: TersePayload): T {\n if (Array.isArray(payload.d)) {\n return payload.d.map(item => {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n return createTerseProxy(item as Record<string, unknown>, payload.k);\n }\n return item;\n }) as T;\n }\n\n if (typeof payload.d === 'object' && payload.d !== null) {\n return createTerseProxy(payload.d as Record<string, unknown>, payload.k) as T;\n }\n\n return payload.d as T;\n}\n\n// Re-export for convenience\nexport { isTersePayload };\n","/**\n * TerseJSON Express Middleware\n *\n * Automatically compresses JSON responses with repeated object structures.\n * Zero configuration required - just add the middleware.\n */\n\nimport type { Request, Response, NextFunction, RequestHandler } from 'express';\nimport { TerseMiddlewareOptions } from './types';\nimport { compress, isCompressibleArray } from './core';\nimport { recordEvent, TerseAnalytics, AnalyticsConfig } from './analytics';\n\n/**\n * Extended middleware options with analytics\n */\nexport interface TerseMiddlewareOptionsWithAnalytics extends TerseMiddlewareOptions {\n /**\n * Analytics configuration\n * Set to true for local-only analytics\n * Set to { apiKey: 'xxx' } for cloud reporting\n */\n analytics?: boolean | Partial<AnalyticsConfig> | TerseAnalytics;\n}\n\nconst DEFAULT_OPTIONS: Required<TerseMiddlewareOptions> = {\n // Middleware-specific options\n minArrayLength: 2,\n shouldCompress: () => true,\n headerName: 'x-terse-json',\n debug: false,\n // CompressOptions\n minKeyLength: 3,\n maxDepth: 10,\n keyPattern: 'alpha',\n nestedHandling: 'deep',\n homogeneousOnly: false,\n excludeKeys: [],\n includeKeys: [],\n};\n\n/**\n * Creates the TerseJSON Express middleware\n *\n * @example\n * ```typescript\n * import express from 'express';\n * import { terse } from 'tersejson/express';\n *\n * const app = express();\n * app.use(terse());\n *\n * app.get('/users', (req, res) => {\n * // Just send data as normal - compression is automatic\n * res.json(users);\n * });\n * ```\n */\nexport function terse(options: TerseMiddlewareOptionsWithAnalytics = {}): RequestHandler {\n const { analytics: analyticsOption, ...restOptions } = options;\n const config = { ...DEFAULT_OPTIONS, ...restOptions };\n\n // Setup analytics if enabled\n let analyticsInstance: TerseAnalytics | null = null;\n if (analyticsOption) {\n if (analyticsOption instanceof TerseAnalytics) {\n analyticsInstance = analyticsOption;\n } else if (analyticsOption === true) {\n // Local-only analytics\n analyticsInstance = new TerseAnalytics({ enabled: true, debug: config.debug });\n } else if (typeof analyticsOption === 'object') {\n analyticsInstance = new TerseAnalytics({ enabled: true, ...analyticsOption });\n }\n }\n\n return function terseMiddleware(\n req: Request,\n res: Response,\n next: NextFunction\n ): void {\n // Check if client supports terse responses\n const acceptsTerse = req.headers['accept-terse'] === 'true' ||\n req.headers['x-accept-terse'] === 'true';\n\n // Store original json method\n const originalJson = res.json.bind(res);\n\n // Override res.json\n res.json = function terseJson(data: unknown): Response {\n // Skip if client doesn't accept terse or compression is disabled\n if (!acceptsTerse) {\n return originalJson(data);\n }\n\n // Check if data is compressible\n if (!isCompressibleArray(data)) {\n return originalJson(data);\n }\n\n // Check minimum array length\n if ((data as unknown[]).length < config.minArrayLength) {\n return originalJson(data);\n }\n\n // Check custom shouldCompress function\n if (!config.shouldCompress(data, req)) {\n return originalJson(data);\n }\n\n try {\n const dataArray = data as Record<string, unknown>[];\n\n // Compress the data\n const compressed = compress(dataArray, {\n minKeyLength: config.minKeyLength,\n maxDepth: config.maxDepth,\n keyPattern: config.keyPattern,\n nestedHandling: config.nestedHandling,\n homogeneousOnly: config.homogeneousOnly,\n excludeKeys: config.excludeKeys,\n includeKeys: config.includeKeys,\n });\n\n // Calculate sizes\n const originalSize = JSON.stringify(data).length;\n const compressedSize = JSON.stringify(compressed).length;\n\n // Record analytics\n if (analyticsInstance) {\n analyticsInstance.record({\n originalSize,\n compressedSize,\n objectCount: dataArray.length,\n keysCompressed: Object.keys(compressed.k).length,\n endpoint: req.path,\n keyPattern: compressed.p || 'alpha',\n });\n }\n\n // Also record to global analytics if initialized\n recordEvent({\n originalSize,\n compressedSize,\n objectCount: dataArray.length,\n keysCompressed: Object.keys(compressed.k).length,\n endpoint: req.path,\n keyPattern: compressed.p || 'alpha',\n });\n\n // Debug logging\n if (config.debug) {\n const savings = ((1 - compressedSize / originalSize) * 100).toFixed(1);\n console.log(\n `[tersejson] Compressed ${originalSize} -> ${compressedSize} bytes (${savings}% savings)`\n );\n }\n\n // Set header to indicate terse response\n res.setHeader(config.headerName, 'true');\n\n return originalJson(compressed);\n } catch (error) {\n // If compression fails, fall back to original\n if (config.debug) {\n console.error('[tersejson] Compression failed:', error);\n }\n return originalJson(data);\n }\n };\n\n next();\n };\n}\n\n/**\n * Middleware to automatically add x-accept-terse header based on query param\n * Useful for testing or when you can't control client headers\n *\n * @example\n * ```typescript\n * app.use(terseQueryParam());\n * // Now ?terse=true will enable compression\n * ```\n */\nexport function terseQueryParam(paramName: string = 'terse'): RequestHandler {\n return function terseQueryMiddleware(\n req: Request,\n _res: Response,\n next: NextFunction\n ): void {\n if (req.query[paramName] === 'true') {\n req.headers['accept-terse'] = 'true';\n }\n next();\n };\n}\n\n// Re-export analytics for convenience\nexport { TerseAnalytics, analytics, initAnalytics, getAnalytics } from './analytics';\nexport type { AnalyticsConfig, AnalyticsStats, CompressionEvent } from './analytics';\n\n// Default export for convenience\nexport default terse;\n","/**\n * TerseJSON Analytics\n *\n * Opt-in analytics to track compression savings.\n * Data is anonymous and helps improve the library.\n */\n\n/**\n * Compression event data\n */\nexport interface CompressionEvent {\n /** Timestamp of the compression */\n timestamp: number;\n /** Original payload size in bytes */\n originalSize: number;\n /** Compressed payload size in bytes */\n compressedSize: number;\n /** Number of objects in the array */\n objectCount: number;\n /** Number of keys compressed */\n keysCompressed: number;\n /** Route/endpoint (optional, anonymized) */\n endpoint?: string;\n /** Key pattern used */\n keyPattern: string;\n}\n\n/**\n * Aggregated stats for reporting\n */\nexport interface AnalyticsStats {\n /** Total compression events */\n totalEvents: number;\n /** Total bytes before compression */\n totalOriginalBytes: number;\n /** Total bytes after compression */\n totalCompressedBytes: number;\n /** Total bytes saved */\n totalBytesSaved: number;\n /** Average compression ratio (0-1) */\n averageRatio: number;\n /** Total objects processed */\n totalObjects: number;\n /** Session start time */\n sessionStart: number;\n /** Last event time */\n lastEvent: number;\n}\n\n/**\n * Analytics configuration\n */\nexport interface AnalyticsConfig {\n /**\n * Enable analytics collection\n * @default false\n */\n enabled: boolean;\n\n /**\n * Send anonymous stats to tersejson.com\n * Helps improve the library\n * @default false\n */\n reportToCloud: boolean;\n\n /**\n * API key for tersejson.com (optional)\n * Get one at tersejson.com/dashboard\n */\n apiKey?: string;\n\n /**\n * Project/site identifier (optional)\n */\n projectId?: string;\n\n /**\n * Callback for each compression event\n * Use for custom logging/monitoring\n */\n onEvent?: (event: CompressionEvent) => void;\n\n /**\n * Callback for periodic stats summary\n */\n onStats?: (stats: AnalyticsStats) => void;\n\n /**\n * How often to report stats (ms)\n * @default 60000 (1 minute)\n */\n reportInterval?: number;\n\n /**\n * Include endpoint paths in analytics\n * Paths are hashed for privacy\n * @default false\n */\n trackEndpoints?: boolean;\n\n /**\n * Cloud reporting endpoint\n * @default 'https://api.tersejson.com/v1/analytics'\n */\n endpoint?: string;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: Required<Omit<AnalyticsConfig, 'apiKey' | 'projectId' | 'onEvent' | 'onStats'>> = {\n enabled: false,\n reportToCloud: false,\n reportInterval: 60000,\n trackEndpoints: false,\n endpoint: 'https://api.tersejson.com/v1/analytics',\n debug: false,\n};\n\n/**\n * Analytics collector class\n */\nexport class TerseAnalytics {\n private config: Required<Omit<AnalyticsConfig, 'apiKey' | 'projectId' | 'onEvent' | 'onStats'>> &\n Pick<AnalyticsConfig, 'apiKey' | 'projectId' | 'onEvent' | 'onStats'>;\n private events: CompressionEvent[] = [];\n private stats: AnalyticsStats;\n private reportTimer?: ReturnType<typeof setInterval>;\n private isNode: boolean;\n\n constructor(config: Partial<AnalyticsConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.isNode = typeof window === 'undefined';\n this.stats = this.createEmptyStats();\n\n if (this.config.enabled && this.config.reportToCloud) {\n this.startReporting();\n }\n }\n\n /**\n * Create empty stats object\n */\n private createEmptyStats(): AnalyticsStats {\n return {\n totalEvents: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n totalBytesSaved: 0,\n averageRatio: 0,\n totalObjects: 0,\n sessionStart: Date.now(),\n lastEvent: Date.now(),\n };\n }\n\n /**\n * Record a compression event\n */\n record(event: Omit<CompressionEvent, 'timestamp'>): void {\n if (!this.config.enabled) return;\n\n const fullEvent: CompressionEvent = {\n ...event,\n timestamp: Date.now(),\n // Hash endpoint for privacy if tracking is enabled\n endpoint: this.config.trackEndpoints && event.endpoint\n ? this.hashEndpoint(event.endpoint)\n : undefined,\n };\n\n // Update stats\n this.stats.totalEvents++;\n this.stats.totalOriginalBytes += event.originalSize;\n this.stats.totalCompressedBytes += event.compressedSize;\n this.stats.totalBytesSaved += (event.originalSize - event.compressedSize);\n this.stats.totalObjects += event.objectCount;\n this.stats.lastEvent = fullEvent.timestamp;\n this.stats.averageRatio = this.stats.totalCompressedBytes / this.stats.totalOriginalBytes;\n\n // Store event for batch reporting\n this.events.push(fullEvent);\n\n // Call event callback\n if (this.config.onEvent) {\n this.config.onEvent(fullEvent);\n }\n\n // Debug logging\n if (this.config.debug) {\n const savings = ((1 - event.compressedSize / event.originalSize) * 100).toFixed(1);\n console.log(`[tersejson:analytics] ${event.originalSize} → ${event.compressedSize} bytes (${savings}% saved)`);\n }\n }\n\n /**\n * Get current stats\n */\n getStats(): AnalyticsStats {\n return { ...this.stats };\n }\n\n /**\n * Get formatted stats summary\n */\n getSummary(): string {\n const stats = this.stats;\n const savedKB = (stats.totalBytesSaved / 1024).toFixed(2);\n const savedPercent = stats.totalOriginalBytes > 0\n ? ((1 - stats.averageRatio) * 100).toFixed(1)\n : '0';\n\n return `TerseJSON Stats: ${stats.totalEvents} compressions, ${savedKB}KB saved (${savedPercent}% avg)`;\n }\n\n /**\n * Reset stats\n */\n reset(): void {\n this.events = [];\n this.stats = this.createEmptyStats();\n }\n\n /**\n * Start periodic reporting to cloud\n */\n private startReporting(): void {\n if (this.reportTimer) return;\n\n this.reportTimer = setInterval(() => {\n this.reportToCloud();\n }, this.config.reportInterval);\n\n // Report on exit (Node.js only)\n if (this.isNode && typeof process !== 'undefined') {\n process.on('beforeExit', () => this.reportToCloud());\n }\n }\n\n /**\n * Stop reporting\n */\n stop(): void {\n if (this.reportTimer) {\n clearInterval(this.reportTimer);\n this.reportTimer = undefined;\n }\n }\n\n /**\n * Report stats to tersejson.com\n */\n private async reportToCloud(): Promise<void> {\n if (!this.config.reportToCloud || this.events.length === 0) return;\n\n const payload = {\n apiKey: this.config.apiKey,\n projectId: this.config.projectId,\n stats: this.stats,\n events: this.events.slice(-100), // Last 100 events only\n meta: {\n version: '0.1.0',\n runtime: this.isNode ? 'node' : 'browser',\n },\n };\n\n try {\n // Use appropriate fetch based on environment\n const fetchFn = this.isNode\n ? (await import('node:https')).request\n : globalThis.fetch;\n\n if (this.isNode) {\n // Node.js - fire and forget\n const url = new URL(this.config.endpoint);\n const req = (fetchFn as typeof import('node:https').request)({\n hostname: url.hostname,\n port: url.port || 443,\n path: url.pathname,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n req.write(JSON.stringify(payload));\n req.end();\n } else {\n // Browser\n (fetchFn as typeof fetch)(this.config.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n keepalive: true, // Allow sending on page unload\n }).catch(() => {}); // Ignore errors\n }\n\n // Clear reported events\n this.events = [];\n\n // Call stats callback\n if (this.config.onStats) {\n this.config.onStats(this.stats);\n }\n\n if (this.config.debug) {\n console.log('[tersejson:analytics] Reported stats to cloud');\n }\n } catch {\n // Silently fail - analytics should never break the app\n if (this.config.debug) {\n console.log('[tersejson:analytics] Failed to report stats');\n }\n }\n }\n\n /**\n * Hash endpoint for privacy\n */\n private hashEndpoint(endpoint: string): string {\n // Simple hash - just keeps route structure without specifics\n return endpoint\n .replace(/\\/\\d+/g, '/:id')\n .replace(/\\/[a-f0-9-]{36}/gi, '/:uuid')\n .replace(/\\?.*$/, '');\n }\n}\n\n/**\n * Global analytics instance (singleton)\n */\nlet globalAnalytics: TerseAnalytics | null = null;\n\n/**\n * Initialize global analytics\n */\nexport function initAnalytics(config: Partial<AnalyticsConfig>): TerseAnalytics {\n globalAnalytics = new TerseAnalytics(config);\n return globalAnalytics;\n}\n\n/**\n * Get global analytics instance\n */\nexport function getAnalytics(): TerseAnalytics | null {\n return globalAnalytics;\n}\n\n/**\n * Record an event to global analytics (if initialized)\n */\nexport function recordEvent(event: Omit<CompressionEvent, 'timestamp'>): void {\n globalAnalytics?.record(event);\n}\n\n/**\n * Quick setup for common use cases\n */\nexport const analytics = {\n /**\n * Enable local-only analytics (no cloud reporting)\n */\n local(options: { debug?: boolean; onEvent?: AnalyticsConfig['onEvent'] } = {}) {\n return initAnalytics({\n enabled: true,\n reportToCloud: false,\n debug: options.debug,\n onEvent: options.onEvent,\n });\n },\n\n /**\n * Enable cloud analytics with API key\n */\n cloud(apiKey: string, options: Partial<AnalyticsConfig> = {}) {\n return initAnalytics({\n ...options,\n enabled: true,\n reportToCloud: true,\n apiKey,\n });\n },\n\n /**\n * Get current stats\n */\n getStats() {\n return globalAnalytics?.getStats() ?? null;\n },\n\n /**\n * Get formatted summary\n */\n getSummary() {\n return globalAnalytics?.getSummary() ?? 'Analytics not initialized';\n },\n};\n\nexport default analytics;\n","/**\n * TerseJSON Client\n *\n * Transparent client-side handling of TerseJSON responses.\n * Use the fetch wrapper or manually expand responses.\n */\n\nimport {\n TerseClientOptions,\n isTersePayload,\n} from './types';\nimport { expand, wrapWithProxy } from './core';\n\nconst DEFAULT_OPTIONS: Required<TerseClientOptions> = {\n headerName: 'x-terse-json',\n debug: false,\n autoExpand: true,\n};\n\n/**\n * Expands a TerseJSON payload back to original format\n * Use this if you want full expansion (not proxied)\n */\nexport { expand };\n\n/**\n * Wraps a TerseJSON payload with Proxy for transparent key access\n * More memory efficient than full expansion for large datasets\n */\nexport { wrapWithProxy as proxy };\n\n/**\n * Check if a response/data is a TerseJSON payload\n */\nexport { isTersePayload };\n\n/**\n * Process a potential TerseJSON response\n * Automatically detects and expands/proxies terse payloads\n */\nexport function process<T = unknown>(\n data: unknown,\n options: { useProxy?: boolean } = {}\n): T {\n const { useProxy = true } = options;\n\n if (isTersePayload(data)) {\n return useProxy ? wrapWithProxy<T>(data) : expand<T>(data);\n }\n\n return data as T;\n}\n\n/**\n * Creates a fetch wrapper that automatically handles TerseJSON responses\n *\n * @example\n * ```typescript\n * import { createFetch } from 'tersejson/client';\n *\n * const fetch = createFetch();\n *\n * // Use exactly like regular fetch\n * const users = await fetch('/api/users').then(r => r.json());\n * console.log(users[0].firstName); // Works transparently!\n * ```\n */\nexport function createFetch(options: TerseClientOptions = {}): typeof globalThis.fetch {\n const config = { ...DEFAULT_OPTIONS, ...options };\n\n return async function terseFetch(\n input: RequestInfo | URL,\n init: RequestInit = {}\n ): Promise<Response> {\n // Add header to indicate we accept terse responses\n const headers = new Headers(init.headers);\n headers.set('accept-terse', 'true');\n\n const response = await globalThis.fetch(input, {\n ...init,\n headers,\n });\n\n // Check if response is terse\n const isTerse = response.headers.get(config.headerName) === 'true';\n\n if (!isTerse || !config.autoExpand) {\n return response;\n }\n\n // Clone response and override json() method\n const clonedResponse = response.clone();\n\n // Create a wrapper that intercepts .json()\n return new Proxy(response, {\n get(target, prop) {\n if (prop === 'json') {\n return async function (): Promise<unknown> {\n const data = await clonedResponse.json();\n\n if (isTersePayload(data)) {\n if (config.debug) {\n console.log('[tersejson] Expanding terse response');\n }\n return wrapWithProxy(data);\n }\n\n return data;\n };\n }\n\n const value = Reflect.get(target, prop);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n };\n}\n\n/**\n * Drop-in fetch replacement with TerseJSON support\n *\n * @example\n * ```typescript\n * import { fetch } from 'tersejson/client';\n *\n * const users = await fetch('/api/users').then(r => r.json());\n * console.log(users[0].firstName); // Transparent!\n * ```\n */\nexport const fetch = createFetch();\n\n/**\n * React hook for fetching with TerseJSON support (if using React)\n * Returns a configured fetch function\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const terseFetch = useTerseFetch();\n * // Use in useEffect, etc.\n * }\n * ```\n */\nexport function useTerseFetch(options: TerseClientOptions = {}): typeof globalThis.fetch {\n // This is a simple hook that just returns the configured fetch\n // Could be extended with caching, SWR integration, etc.\n return createFetch(options);\n}\n\n/**\n * Axios interceptor for TerseJSON support\n *\n * @example\n * ```typescript\n * import axios from 'axios';\n * import { axiosInterceptor } from 'tersejson/client';\n *\n * axios.interceptors.request.use(axiosInterceptor.request);\n * axios.interceptors.response.use(axiosInterceptor.response);\n * ```\n */\nexport const axiosInterceptor = {\n request: (config: { headers?: Record<string, string> }) => {\n config.headers = config.headers || {};\n config.headers['accept-terse'] = 'true';\n return config;\n },\n\n response: (response: { headers?: Record<string, string>; data?: unknown }) => {\n const isTerse = response.headers?.['x-terse-json'] === 'true';\n\n if (isTerse && isTersePayload(response.data)) {\n response.data = wrapWithProxy(response.data);\n }\n\n return response;\n },\n};\n\n// Default export for convenience\nexport default { fetch, createFetch, expand, proxy: wrapWithProxy, process };\n","/**\n * TerseJSON Framework Integrations\n *\n * Ready-to-use integrations for popular HTTP clients and frameworks.\n */\n\nimport { isTersePayload } from './types';\nimport { wrapWithProxy, expand } from './core';\n\n// ============================================================================\n// AXIOS\n// ============================================================================\n\n/**\n * Axios request interceptor type\n */\ninterface AxiosRequestConfig {\n headers?: Record<string, string> | { set?: (key: string, value: string) => void };\n [key: string]: unknown;\n}\n\n/**\n * Axios response type\n */\ninterface AxiosResponse<T = unknown> {\n data: T;\n headers: Record<string, string> | { get?: (key: string) => string | null };\n status: number;\n statusText: string;\n config: AxiosRequestConfig;\n [key: string]: unknown;\n}\n\n/**\n * Create Axios interceptors for TerseJSON support\n *\n * @example\n * ```typescript\n * import axios from 'axios';\n * import { createAxiosInterceptors } from 'tersejson/integrations';\n *\n * const { request, response } = createAxiosInterceptors();\n * axios.interceptors.request.use(request);\n * axios.interceptors.response.use(response);\n *\n * // Now all axios requests automatically handle TerseJSON\n * const { data } = await axios.get('/api/users');\n * console.log(data[0].firstName); // Works transparently!\n * ```\n */\nexport function createAxiosInterceptors(options: { useProxy?: boolean; debug?: boolean } = {}) {\n const { useProxy = true, debug = false } = options;\n\n return {\n request: <T extends AxiosRequestConfig>(config: T): T => {\n // Handle both old-style object headers and new AxiosHeaders class\n if (config.headers) {\n if (typeof config.headers.set === 'function') {\n config.headers.set('accept-terse', 'true');\n } else {\n (config.headers as Record<string, string>)['accept-terse'] = 'true';\n }\n } else {\n config.headers = { 'accept-terse': 'true' };\n }\n return config;\n },\n\n response: <T>(response: AxiosResponse<T>): AxiosResponse<T> => {\n // Handle both old-style object headers and new AxiosHeaders class\n let isTerse = false;\n if (response.headers) {\n if (typeof response.headers.get === 'function') {\n isTerse = response.headers.get('x-terse-json') === 'true';\n } else {\n isTerse = (response.headers as Record<string, string>)['x-terse-json'] === 'true';\n }\n }\n\n if (isTerse && isTersePayload(response.data)) {\n if (debug) {\n console.log('[tersejson] Expanding Axios response');\n }\n response.data = (useProxy ? wrapWithProxy(response.data) : expand(response.data)) as T;\n }\n\n return response;\n },\n };\n}\n\n/**\n * Pre-configured Axios interceptors (convenience export)\n */\nexport const axiosInterceptors = createAxiosInterceptors();\n\n// ============================================================================\n// ANGULAR (Modern - HttpClient)\n// ============================================================================\n\n/**\n * Angular HttpInterceptor interface (simplified)\n */\ninterface HttpRequest<T = unknown> {\n clone: (options: { setHeaders?: Record<string, string> }) => HttpRequest<T>;\n [key: string]: unknown;\n}\n\ninterface HttpEvent<T = unknown> {\n type?: number;\n body?: T;\n headers?: { get: (name: string) => string | null };\n [key: string]: unknown;\n}\n\n// HttpHandler not needed - Angular uses its own\n\n/**\n * Creates an Angular HTTP interceptor for TerseJSON support\n *\n * @example\n * ```typescript\n * // terse.interceptor.ts\n * import { Injectable } from '@angular/core';\n * import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse } from '@angular/common/http';\n * import { Observable } from 'rxjs';\n * import { map } from 'rxjs/operators';\n * import { createAngularInterceptor } from 'tersejson/integrations';\n *\n * @Injectable()\n * export class TerseInterceptor implements HttpInterceptor {\n * private handler = createAngularInterceptor();\n *\n * intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n * return this.handler(req, next);\n * }\n * }\n *\n * // app.module.ts\n * providers: [\n * { provide: HTTP_INTERCEPTORS, useClass: TerseInterceptor, multi: true }\n * ]\n * ```\n */\nexport function createAngularInterceptor(options: { useProxy?: boolean; debug?: boolean } = {}) {\n const { useProxy = true, debug = false } = options;\n\n /**\n * Returns a function that can be used as the intercept method\n * Note: This returns the logic - you need to wrap it in an @Injectable class\n */\n return {\n /**\n * Modifies the request to include the accept-terse header\n */\n modifyRequest: <T>(req: HttpRequest<T>): HttpRequest<T> => {\n return req.clone({\n setHeaders: {\n 'accept-terse': 'true',\n },\n });\n },\n\n /**\n * Processes the response to expand TerseJSON payloads\n */\n processResponse: <T>(event: HttpEvent<T>): HttpEvent<T> => {\n // HttpResponse has type === 4\n if (event.type === 4 && event.body !== undefined) {\n const isTerse = event.headers?.get('x-terse-json') === 'true';\n\n if (isTerse && isTersePayload(event.body)) {\n if (debug) {\n console.log('[tersejson] Expanding Angular response');\n }\n // Create new response with expanded body\n return {\n ...event,\n body: (useProxy ? wrapWithProxy(event.body) : expand(event.body)) as T,\n };\n }\n }\n return event;\n },\n };\n}\n\n/**\n * Angular interceptor code snippet for copy-paste\n * Since Angular interceptors require decorators, we provide the implementation\n */\nexport const angularInterceptorSnippet = `\n// terse.interceptor.ts\nimport { Injectable } from '@angular/core';\nimport {\n HttpInterceptor,\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpResponse\n} from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { isTersePayload, wrapWithProxy } from 'tersejson';\n\n@Injectable()\nexport class TerseInterceptor implements HttpInterceptor {\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n // Add accept-terse header\n const terseReq = req.clone({\n setHeaders: { 'accept-terse': 'true' }\n });\n\n return next.handle(terseReq).pipe(\n map(event => {\n if (event instanceof HttpResponse && event.body) {\n const isTerse = event.headers.get('x-terse-json') === 'true';\n if (isTerse && isTersePayload(event.body)) {\n return event.clone({ body: wrapWithProxy(event.body) });\n }\n }\n return event;\n })\n );\n }\n}\n\n// app.module.ts - Add to providers:\n// { provide: HTTP_INTERCEPTORS, useClass: TerseInterceptor, multi: true }\n`;\n\n// ============================================================================\n// ANGULARJS (1.x - $http)\n// ============================================================================\n\n/**\n * AngularJS $http config type\n */\ninterface AngularJSHttpConfig {\n headers?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * AngularJS $http response type\n */\ninterface AngularJSHttpResponse<T = unknown> {\n data: T;\n headers: (name: string) => string | null;\n status: number;\n statusText: string;\n config: AngularJSHttpConfig;\n}\n\n/**\n * Creates AngularJS $http interceptor for TerseJSON support\n *\n * @example\n * ```javascript\n * // In your AngularJS app config\n * angular.module('myApp', [])\n * .config(['$httpProvider', function($httpProvider) {\n * $httpProvider.interceptors.push(['$q', function($q) {\n * return createAngularJSInterceptor();\n * }]);\n * }]);\n * ```\n */\nexport function createAngularJSInterceptor(options: { useProxy?: boolean; debug?: boolean } = {}) {\n const { useProxy = true, debug = false } = options;\n\n return {\n /**\n * Request interceptor - adds accept-terse header\n */\n request: <T extends AngularJSHttpConfig>(config: T): T => {\n config.headers = config.headers || {};\n config.headers['accept-terse'] = 'true';\n return config;\n },\n\n /**\n * Response interceptor - expands TerseJSON payloads\n */\n response: <T>(response: AngularJSHttpResponse<T>): AngularJSHttpResponse<T> => {\n const isTerse = response.headers('x-terse-json') === 'true';\n\n if (isTerse && isTersePayload(response.data)) {\n if (debug) {\n console.log('[tersejson] Expanding AngularJS response');\n }\n response.data = (useProxy ? wrapWithProxy(response.data) : expand(response.data)) as T;\n }\n\n return response;\n },\n };\n}\n\n/**\n * AngularJS setup code snippet\n */\nexport const angularJSInterceptorSnippet = `\n// Setup TerseJSON with AngularJS\nangular.module('myApp', [])\n .factory('terseInterceptor', ['$q', function($q) {\n return {\n request: function(config) {\n config.headers = config.headers || {};\n config.headers['accept-terse'] = 'true';\n return config;\n },\n response: function(response) {\n var isTerse = response.headers('x-terse-json') === 'true';\n if (isTerse && response.data && response.data.__terse__) {\n // Use tersejson.process() or tersejson.wrapWithProxy()\n response.data = tersejson.process(response.data);\n }\n return response;\n }\n };\n }])\n .config(['$httpProvider', function($httpProvider) {\n $httpProvider.interceptors.push('terseInterceptor');\n }]);\n`;\n\n// ============================================================================\n// JQUERY AJAX\n// ============================================================================\n\n/**\n * jQuery AJAX setup for TerseJSON\n *\n * @example\n * ```javascript\n * import { setupJQueryAjax } from 'tersejson/integrations';\n * setupJQueryAjax($);\n *\n * // Now $.ajax, $.get, $.post all support TerseJSON\n * $.get('/api/users', function(data) {\n * console.log(data[0].firstName); // Works!\n * });\n * ```\n */\nexport function setupJQueryAjax(\n $: { ajaxSetup: (options: unknown) => void; ajaxPrefilter: (callback: unknown) => void },\n options: { useProxy?: boolean; debug?: boolean } = {}\n) {\n const { useProxy = true, debug = false } = options;\n\n // Add header to all requests\n $.ajaxSetup({\n headers: {\n 'accept-terse': 'true',\n },\n });\n\n // Process responses\n $.ajaxPrefilter((ajaxOptions: { dataFilter?: (data: string, type: string) => unknown }) => {\n const originalDataFilter = ajaxOptions.dataFilter;\n\n ajaxOptions.dataFilter = function (data: string, type: string) {\n let processed = data;\n\n if (originalDataFilter) {\n processed = originalDataFilter(data, type) as string;\n }\n\n if (type === 'json' || type === undefined) {\n try {\n const parsed = typeof processed === 'string' ? JSON.parse(processed) : processed;\n if (isTersePayload(parsed)) {\n if (debug) {\n console.log('[tersejson] Expanding jQuery response');\n }\n return useProxy ? wrapWithProxy(parsed) : expand(parsed);\n }\n return parsed;\n } catch {\n return processed;\n }\n }\n\n return processed;\n };\n });\n}\n\n/**\n * jQuery setup code snippet\n */\nexport const jQuerySetupSnippet = `\n// Setup TerseJSON with jQuery\n$.ajaxSetup({\n headers: { 'accept-terse': 'true' },\n dataFilter: function(data, type) {\n if (type === 'json') {\n var parsed = JSON.parse(data);\n if (parsed && parsed.__terse__) {\n return tersejson.process(parsed);\n }\n return parsed;\n }\n return data;\n }\n});\n`;\n\n// ============================================================================\n// SWR / React Query\n// ============================================================================\n\n/**\n * Creates a fetcher for SWR with TerseJSON support\n *\n * @example\n * ```typescript\n * import useSWR from 'swr';\n * import { createSWRFetcher } from 'tersejson/integrations';\n *\n * const fetcher = createSWRFetcher();\n *\n * function UserList() {\n * const { data, error } = useSWR('/api/users', fetcher);\n * return <div>{data?.[0].firstName}</div>;\n * }\n * ```\n */\nexport function createSWRFetcher(options: { useProxy?: boolean; debug?: boolean } = {}) {\n const { useProxy = true, debug = false } = options;\n\n return async <T>(url: string): Promise<T> => {\n const response = await globalThis.fetch(url, {\n headers: {\n 'accept-terse': 'true',\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n\n if (isTersePayload(data)) {\n if (debug) {\n console.log('[tersejson] Expanding SWR response');\n }\n return (useProxy ? wrapWithProxy(data) : expand(data)) as T;\n }\n\n return data as T;\n };\n}\n\n/**\n * Creates a query function for React Query / TanStack Query\n *\n * @example\n * ```typescript\n * import { useQuery } from '@tanstack/react-query';\n * import { createQueryFn } from 'tersejson/integrations';\n *\n * const queryFn = createQueryFn();\n *\n * function UserList() {\n * const { data } = useQuery({\n * queryKey: ['users'],\n * queryFn: () => queryFn('/api/users')\n * });\n * return <div>{data?.[0].firstName}</div>;\n * }\n * ```\n */\nexport const createQueryFn = createSWRFetcher; // Same implementation\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\nexport default {\n // Axios\n createAxiosInterceptors,\n axiosInterceptors,\n\n // Angular\n createAngularInterceptor,\n angularInterceptorSnippet,\n\n // AngularJS\n createAngularJSInterceptor,\n angularJSInterceptorSnippet,\n\n // jQuery\n setupJQueryAjax,\n jQuerySetupSnippet,\n\n // SWR / React Query\n createSWRFetcher,\n createQueryFn,\n};\n","/**\n * TerseJSON GraphQL Middleware\n *\n * Integration for express-graphql that compresses arrays within GraphQL responses.\n */\n\nimport type { Request, Response, NextFunction, RequestHandler } from 'express';\nimport {\n GraphQLTerseOptions,\n GraphQLTerseMetadata,\n GraphQLTerseResponse,\n CompressOptions,\n} from './types';\nimport { isCompressibleArray, createKeyGenerator } from './core';\n\n/**\n * Default options for GraphQL compression\n */\nconst DEFAULT_OPTIONS: Required<Omit<GraphQLTerseOptions, 'shouldCompress' | 'excludePaths'>> & {\n shouldCompress?: GraphQLTerseOptions['shouldCompress'];\n excludePaths: string[];\n} = {\n minArrayLength: 2,\n debug: false,\n minKeyLength: 3,\n maxDepth: 10,\n keyPattern: 'alpha',\n nestedHandling: 'deep',\n homogeneousOnly: false,\n excludeKeys: [],\n includeKeys: [],\n excludePaths: [],\n};\n\n/**\n * Result from finding compressible arrays\n */\ninterface CompressibleArrayInfo {\n path: string;\n data: Record<string, unknown>[];\n}\n\n/**\n * Finds all compressible arrays within a data structure\n */\nexport function findCompressibleArrays(\n data: unknown,\n basePath: string = 'data',\n options: { minArrayLength: number; excludePaths: string[]; maxDepth: number },\n currentDepth: number = 0\n): CompressibleArrayInfo[] {\n const results: CompressibleArrayInfo[] = [];\n\n if (currentDepth >= options.maxDepth) return results;\n\n if (Array.isArray(data)) {\n // Check if this array is compressible\n if (\n isCompressibleArray(data) &&\n data.length >= options.minArrayLength &&\n !options.excludePaths.includes(basePath)\n ) {\n results.push({ path: basePath, data: data as Record<string, unknown>[] });\n }\n\n // Also check for nested arrays within array items\n data.forEach((item, index) => {\n if (typeof item === 'object' && item !== null) {\n const nestedResults = findCompressibleArrays(\n item,\n `${basePath}[${index}]`,\n options,\n currentDepth + 1\n );\n results.push(...nestedResults);\n }\n });\n } else if (typeof data === 'object' && data !== null) {\n // Walk object properties\n for (const [key, value] of Object.entries(data)) {\n const path = `${basePath}.${key}`;\n const nestedResults = findCompressibleArrays(value, path, options, currentDepth + 1);\n results.push(...nestedResults);\n }\n }\n\n return results;\n}\n\n/**\n * Collects all unique keys from multiple arrays\n */\nfunction collectKeysFromArrays(\n arrays: CompressibleArrayInfo[],\n options: CompressOptions\n): Set<string> {\n const allKeys = new Set<string>();\n const { minKeyLength = 3, excludeKeys = [], includeKeys = [] } = options;\n\n function collectFromObject(obj: Record<string, unknown>, depth: number = 0): void {\n if (depth >= (options.maxDepth ?? 10)) return;\n\n for (const key of Object.keys(obj)) {\n // Skip excluded keys\n if (excludeKeys.includes(key)) continue;\n\n // Include if in includeKeys, or if meets minKeyLength\n const shouldInclude = includeKeys.includes(key) || key.length >= minKeyLength;\n if (shouldInclude) {\n allKeys.add(key);\n }\n\n // Recurse into nested structures\n const value = obj[key];\n if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n collectFromObject(item as Record<string, unknown>, depth + 1);\n }\n }\n } else if (typeof value === 'object' && value !== null) {\n collectFromObject(value as Record<string, unknown>, depth + 1);\n }\n }\n }\n\n for (const { data } of arrays) {\n for (const item of data) {\n collectFromObject(item);\n }\n }\n\n return allKeys;\n}\n\n/**\n * Compresses an object using the key mapping\n */\nfunction compressObjectWithMap(\n obj: Record<string, unknown>,\n keyToShort: Map<string, string>,\n maxDepth: number,\n currentDepth: number = 0\n): Record<string, unknown> {\n if (currentDepth >= maxDepth) return obj;\n\n const compressed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const shortKey = keyToShort.get(key) ?? key;\n\n if (Array.isArray(value)) {\n compressed[shortKey] = value.map(item => {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n return compressObjectWithMap(\n item as Record<string, unknown>,\n keyToShort,\n maxDepth,\n currentDepth + 1\n );\n }\n return item;\n });\n } else if (typeof value === 'object' && value !== null) {\n compressed[shortKey] = compressObjectWithMap(\n value as Record<string, unknown>,\n keyToShort,\n maxDepth,\n currentDepth + 1\n );\n } else {\n compressed[shortKey] = value;\n }\n }\n\n return compressed;\n}\n\n/**\n * Sets a value at a path in an object (mutates the object)\n */\nfunction setAtPath(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);\n let current: unknown = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n const isIndex = /^\\d+$/.test(part);\n if (isIndex) {\n current = (current as unknown[])[parseInt(part, 10)];\n } else {\n current = (current as Record<string, unknown>)[part];\n }\n }\n\n const lastPart = parts[parts.length - 1];\n const isLastIndex = /^\\d+$/.test(lastPart);\n if (isLastIndex) {\n (current as unknown[])[parseInt(lastPart, 10)] = value;\n } else {\n (current as Record<string, unknown>)[lastPart] = value;\n }\n}\n\n/**\n * Compresses a GraphQL response in-place\n */\nexport function compressGraphQLResponse<T extends { data?: unknown }>(\n response: T,\n options: GraphQLTerseOptions = {}\n): GraphQLTerseResponse<T['data']> | T {\n const config = { ...DEFAULT_OPTIONS, ...options };\n\n // If no data field, return as-is\n if (!response.data) {\n return response;\n }\n\n // Find all compressible arrays\n const arrays = findCompressibleArrays(response.data, 'data', {\n minArrayLength: config.minArrayLength,\n excludePaths: config.excludePaths,\n maxDepth: config.maxDepth,\n });\n\n // Apply custom shouldCompress filter\n const filteredArrays = config.shouldCompress\n ? arrays.filter(({ path, data }) => config.shouldCompress!(data, path))\n : arrays;\n\n // If no arrays to compress, return as-is\n if (filteredArrays.length === 0) {\n return response;\n }\n\n // Collect all unique keys from all arrays\n const allKeys = collectKeysFromArrays(filteredArrays, config);\n\n // Sort keys for deterministic output\n const sortedKeys = Array.from(allKeys).sort();\n\n // Create key generator\n const { generator } = createKeyGenerator(config.keyPattern);\n\n // Build key mapping\n const keyToShort = new Map<string, string>();\n const keyMap: Record<string, string> = {};\n\n sortedKeys.forEach((key, index) => {\n const shortKey = generator(index);\n // Only use short key if it's actually shorter\n if (shortKey.length < key.length) {\n keyToShort.set(key, shortKey);\n keyMap[shortKey] = key;\n }\n });\n\n // If no keys were actually shortened, return as-is\n if (Object.keys(keyMap).length === 0) {\n return response;\n }\n\n // Clone the data to avoid mutating the original\n const clonedData = JSON.parse(JSON.stringify(response.data));\n\n // Sort paths from deepest to shallowest to avoid breaking nested access\n // when parent arrays have their keys renamed\n const sortedArrays = [...filteredArrays].sort((a, b) => {\n const depthA = (a.path.match(/\\./g) || []).length + (a.path.match(/\\[/g) || []).length;\n const depthB = (b.path.match(/\\./g) || []).length + (b.path.match(/\\[/g) || []).length;\n return depthB - depthA; // Deepest first\n });\n\n // Compress each array and update in the cloned data\n const paths: string[] = [];\n for (const { path, data } of sortedArrays) {\n const compressedArray = data.map(item =>\n compressObjectWithMap(item, keyToShort, config.maxDepth)\n );\n setAtPath({ data: clonedData } as Record<string, unknown>, path, compressedArray);\n paths.push(path);\n }\n\n // Build the terse metadata\n const terseMeta: GraphQLTerseMetadata = {\n v: 1,\n k: keyMap,\n paths,\n };\n\n // Build the response\n const terseResponse: GraphQLTerseResponse<T['data']> = {\n data: clonedData as T['data'],\n __terse__: terseMeta,\n };\n\n // Preserve errors and extensions if present\n if ('errors' in response && response.errors) {\n terseResponse.errors = response.errors as GraphQLTerseResponse['errors'];\n }\n if ('extensions' in response && response.extensions) {\n terseResponse.extensions = response.extensions as GraphQLTerseResponse['extensions'];\n }\n\n if (config.debug) {\n const originalSize = JSON.stringify(response).length;\n const compressedSize = JSON.stringify(terseResponse).length;\n const savings = ((1 - compressedSize / originalSize) * 100).toFixed(1);\n console.log(\n `[tersejson/graphql] Compressed ${originalSize} -> ${compressedSize} bytes (${savings}% savings)`\n );\n console.log(`[tersejson/graphql] Compressed paths: ${paths.join(', ')}`);\n }\n\n return terseResponse;\n}\n\n/**\n * Creates a format function for express-graphql\n *\n * @example\n * ```typescript\n * import { graphqlHTTP } from 'express-graphql';\n * import { createTerseFormatFn } from 'tersejson/graphql';\n *\n * app.use('/graphql', graphqlHTTP({\n * schema: mySchema,\n * formatResult: createTerseFormatFn({ debug: true }),\n * }));\n * ```\n */\nexport function createTerseFormatFn(options: GraphQLTerseOptions = {}) {\n return function formatResult(\n result: { data?: unknown; errors?: unknown[]; extensions?: Record<string, unknown> },\n _context?: unknown,\n _info?: unknown\n ) {\n return compressGraphQLResponse(result, options);\n };\n}\n\n/**\n * Express middleware wrapper for express-graphql\n *\n * @example\n * ```typescript\n * import { graphqlHTTP } from 'express-graphql';\n * import { terseGraphQL } from 'tersejson/graphql';\n *\n * app.use('/graphql', terseGraphQL(\n * graphqlHTTP({\n * schema: mySchema,\n * graphiql: true,\n * }),\n * { debug: true }\n * ));\n * ```\n */\nexport function terseGraphQL(\n graphqlMiddleware: RequestHandler,\n options: GraphQLTerseOptions = {}\n): RequestHandler {\n const config = { ...DEFAULT_OPTIONS, ...options };\n\n return function terseGraphQLMiddleware(\n req: Request,\n res: Response,\n next: NextFunction\n ): void {\n // Check if client supports terse responses\n const acceptsTerse =\n req.headers['accept-terse'] === 'true' || req.headers['x-accept-terse'] === 'true';\n\n if (!acceptsTerse) {\n // Client doesn't support terse, pass through to original middleware\n graphqlMiddleware(req, res, next);\n return;\n }\n\n // Store original json method\n const originalJson = res.json.bind(res);\n\n // Override res.json to intercept the response\n res.json = function terseGraphQLJson(data: unknown): Response {\n // Check if this looks like a GraphQL response\n if (typeof data === 'object' && data !== null && 'data' in data) {\n try {\n const compressed = compressGraphQLResponse(\n data as { data?: unknown; errors?: unknown[]; extensions?: Record<string, unknown> },\n config\n );\n\n // If compression happened, set the header\n if ('__terse__' in compressed) {\n res.setHeader('x-terse-json', 'graphql');\n }\n\n return originalJson(compressed);\n } catch (error) {\n if (config.debug) {\n console.error('[tersejson/graphql] Compression failed:', error);\n }\n return originalJson(data);\n }\n }\n\n return originalJson(data);\n };\n\n // Call the original GraphQL middleware\n graphqlMiddleware(req, res, next);\n };\n}\n\n// Default export\nexport default terseGraphQL;\n","/**\n * TerseJSON GraphQL Client\n *\n * Apollo Client Link and utilities for expanding GraphQL responses.\n */\n\nimport { GraphQLTerseResponse, isGraphQLTersePayload } from './types';\nimport { createTerseProxy } from './core';\n\n/**\n * Options for GraphQL client processing\n */\nexport interface GraphQLTerseClientOptions {\n /**\n * Use Proxy for lazy expansion (more memory efficient)\n * @default true\n */\n useProxy?: boolean;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n}\n\nconst DEFAULT_OPTIONS: Required<GraphQLTerseClientOptions> = {\n useProxy: true,\n debug: false,\n};\n\n/**\n * Gets a value at a path in an object\n */\nfunction getAtPath(obj: unknown, path: string): unknown {\n const parts = path.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n const isIndex = /^\\d+$/.test(part);\n if (isIndex) {\n current = (current as unknown[])[parseInt(part, 10)];\n } else {\n current = (current as Record<string, unknown>)[part];\n }\n }\n\n return current;\n}\n\n/**\n * Sets a value at a path in an object (mutates the object)\n */\nfunction setAtPath(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);\n let current: unknown = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n const isIndex = /^\\d+$/.test(part);\n if (isIndex) {\n current = (current as unknown[])[parseInt(part, 10)];\n } else {\n current = (current as Record<string, unknown>)[part];\n }\n }\n\n const lastPart = parts[parts.length - 1];\n const isLastIndex = /^\\d+$/.test(lastPart);\n if (isLastIndex) {\n (current as unknown[])[parseInt(lastPart, 10)] = value;\n } else {\n (current as Record<string, unknown>)[lastPart] = value;\n }\n}\n\n/**\n * Expands an object using the key mapping\n */\nfunction expandObject(\n obj: Record<string, unknown>,\n keyMap: Record<string, string>,\n maxDepth: number = 10,\n currentDepth: number = 0\n): Record<string, unknown> {\n if (currentDepth >= maxDepth) return obj;\n\n const shortToKey = new Map(\n Object.entries(keyMap).map(([short, original]) => [short, original])\n );\n\n const expanded: Record<string, unknown> = {};\n\n for (const [shortKey, value] of Object.entries(obj)) {\n const originalKey = shortToKey.get(shortKey) ?? shortKey;\n\n if (Array.isArray(value)) {\n expanded[originalKey] = value.map(item => {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n return expandObject(item as Record<string, unknown>, keyMap, maxDepth, currentDepth + 1);\n }\n return item;\n });\n } else if (typeof value === 'object' && value !== null) {\n expanded[originalKey] = expandObject(\n value as Record<string, unknown>,\n keyMap,\n maxDepth,\n currentDepth + 1\n );\n } else {\n expanded[originalKey] = value;\n }\n }\n\n return expanded;\n}\n\n/**\n * Wraps an array with Proxies for transparent key access\n */\nfunction wrapArrayWithProxies<T extends Record<string, unknown>>(\n array: Record<string, unknown>[],\n keyMap: Record<string, string>\n): T[] {\n return array.map(item => createTerseProxy<T>(item, keyMap));\n}\n\n/**\n * Expands an array to its original form\n */\nfunction expandArray(\n array: Record<string, unknown>[],\n keyMap: Record<string, string>\n): Record<string, unknown>[] {\n return array.map(item => expandObject(item, keyMap));\n}\n\n/**\n * Processes a GraphQL terse response, expanding compressed arrays\n *\n * @example\n * ```typescript\n * import { processGraphQLResponse } from 'tersejson/graphql-client';\n *\n * const response = await fetch('/graphql', {\n * method: 'POST',\n * headers: {\n * 'Content-Type': 'application/json',\n * 'accept-terse': 'true',\n * },\n * body: JSON.stringify({ query: '{ users { firstName lastName } }' }),\n * }).then(r => r.json());\n *\n * const expanded = processGraphQLResponse(response);\n * console.log(expanded.data.users[0].firstName); // Works transparently\n * ```\n */\nexport function processGraphQLResponse<T = unknown>(\n response: unknown,\n options: GraphQLTerseClientOptions = {}\n): T {\n const config = { ...DEFAULT_OPTIONS, ...options };\n\n // If not a terse response, return as-is\n if (!isGraphQLTersePayload(response)) {\n return response as T;\n }\n\n const terseResponse = response as GraphQLTerseResponse;\n const { data, __terse__, ...rest } = terseResponse;\n const { k: keyMap, paths } = __terse__;\n\n if (config.debug) {\n console.log('[tersejson/graphql-client] Processing terse response');\n console.log('[tersejson/graphql-client] Paths:', paths);\n console.log('[tersejson/graphql-client] Key map:', keyMap);\n }\n\n // Clone the data to avoid mutating\n const clonedData = JSON.parse(JSON.stringify(data));\n const result: Record<string, unknown> = { data: clonedData, ...rest };\n\n // Process each compressed path\n for (const path of paths) {\n const array = getAtPath(result, path) as Record<string, unknown>[] | undefined;\n\n if (!array || !Array.isArray(array)) {\n if (config.debug) {\n console.warn(`[tersejson/graphql-client] Path not found or not array: ${path}`);\n }\n continue;\n }\n\n if (config.useProxy) {\n // Wrap with proxies for lazy expansion\n const proxied = wrapArrayWithProxies(array, keyMap);\n setAtPath(result, path, proxied);\n } else {\n // Fully expand the array\n const expanded = expandArray(array, keyMap);\n setAtPath(result, path, expanded);\n }\n }\n\n return result as T;\n}\n\n/**\n * Type for Apollo Link (avoiding direct dependency)\n */\ninterface ApolloLinkLike {\n request(\n operation: { getContext: () => Record<string, unknown>; setContext: (ctx: Record<string, unknown>) => void },\n forward: (operation: unknown) => { map: (fn: (result: unknown) => unknown) => unknown }\n ): unknown;\n}\n\n/**\n * Creates an Apollo Client Link for TerseJSON\n *\n * This link automatically adds the accept-terse header and processes\n * terse responses transparently.\n *\n * @example\n * ```typescript\n * import { ApolloClient, InMemoryCache, HttpLink, from } from '@apollo/client';\n * import { createTerseLink } from 'tersejson/graphql-client';\n *\n * const terseLink = createTerseLink({ debug: true });\n *\n * const httpLink = new HttpLink({\n * uri: '/graphql',\n * });\n *\n * const client = new ApolloClient({\n * link: from([terseLink, httpLink]),\n * cache: new InMemoryCache(),\n * });\n *\n * // Usage is completely transparent\n * const { data } = await client.query({\n * query: gql`\n * query GetUsers {\n * users { firstName lastName email }\n * }\n * `,\n * });\n *\n * console.log(data.users[0].firstName); // Just works!\n * ```\n */\nexport function createTerseLink(options: GraphQLTerseClientOptions = {}): ApolloLinkLike {\n const config = { ...DEFAULT_OPTIONS, ...options };\n\n return {\n request(operation, forward) {\n // Add accept-terse header to the request\n operation.setContext({\n ...operation.getContext(),\n headers: {\n ...((operation.getContext().headers as Record<string, string>) || {}),\n 'accept-terse': 'true',\n },\n });\n\n // Forward the operation and process the response\n return forward(operation).map((result: unknown) => {\n if (isGraphQLTersePayload(result)) {\n if (config.debug) {\n console.log('[tersejson/apollo] Processing terse response');\n }\n return processGraphQLResponse(result, config);\n }\n return result;\n });\n },\n };\n}\n\n/**\n * Creates a fetch wrapper for GraphQL requests\n *\n * Useful for non-Apollo GraphQL clients or direct fetch usage.\n *\n * @example\n * ```typescript\n * import { createGraphQLFetch } from 'tersejson/graphql-client';\n *\n * const gqlFetch = createGraphQLFetch({ debug: true });\n *\n * const result = await gqlFetch('/graphql', {\n * query: `{ users { firstName lastName } }`,\n * });\n *\n * console.log(result.data.users[0].firstName);\n * ```\n */\nexport function createGraphQLFetch(options: GraphQLTerseClientOptions = {}) {\n const config = { ...DEFAULT_OPTIONS, ...options };\n\n return async function graphqlFetch<T = unknown>(\n url: string,\n body: { query: string; variables?: Record<string, unknown>; operationName?: string },\n init: RequestInit = {}\n ): Promise<T> {\n const headers = new Headers(init.headers);\n headers.set('Content-Type', 'application/json');\n headers.set('accept-terse', 'true');\n\n const response = await fetch(url, {\n ...init,\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n\n return processGraphQLResponse<T>(data, config);\n };\n}\n\n// Re-export type guard for convenience\nexport { isGraphQLTersePayload } from './types';\n\n// Default export\nexport default processGraphQLResponse;\n"]}
|