tjs-lang 0.7.3 → 0.7.4
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/demo/docs.json +30 -30
- package/dist/index.js +175 -176
- package/dist/index.js.map +5 -44
- package/dist/tjs-batteries.js +3 -4
- package/dist/tjs-batteries.js.map +5 -13
- package/dist/tjs-eval.js +47 -0
- package/dist/tjs-eval.js.map +7 -0
- package/dist/tjs-from-ts.js +58 -0
- package/dist/tjs-from-ts.js.map +7 -0
- package/dist/tjs-lang.js +349 -0
- package/dist/tjs-lang.js.map +7 -0
- package/dist/tjs-vm.js +51 -52
- package/dist/tjs-vm.js.map +4 -19
- package/package.json +17 -11
- package/dist/tjs-full.js +0 -437
- package/dist/tjs-full.js.map +0 -46
- package/dist/tjs-transpiler.js +0 -3
- package/dist/tjs-transpiler.js.map +0 -11
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../package.json", "../src/lang/emitters/from-ts.ts", "../src/lang/runtime.ts", "../src/lang/json-schema.ts", "../src/types/Type.ts"],
|
|
4
|
+
"sourcesContent": ["{\n \"name\": \"tjs-lang\",\n \"version\": \"0.7.3\",\n \"description\": \"Type-safe JavaScript dialect with runtime validation, sandboxed VM execution, and AI agent orchestration. Transpiles TypeScript to validated JS with fuel-metered execution for untrusted code.\",\n \"keywords\": [\n \"typescript\",\n \"transpiler\",\n \"runtime-validation\",\n \"type-safety\",\n \"sandbox\",\n \"virtual-machine\",\n \"wasm-alternative\",\n \"ai-agents\",\n \"llm\",\n \"orchestration\",\n \"security\",\n \"fuel-metering\",\n \"capability-based\",\n \"json-ast\",\n \"untrusted-code\"\n ],\n \"license\": \"Apache-2.0\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/src/index.d.ts\",\n \"exports\": {\n \".\": {\n \"bun\": \"./src/index.ts\",\n \"types\": \"./dist/src/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./eval\": {\n \"bun\": \"./src/lang/eval.ts\",\n \"types\": \"./dist/src/lang/eval.d.ts\",\n \"default\": \"./dist/tjs-eval.js\"\n },\n \"./lang\": {\n \"bun\": \"./src/lang/transpiler.ts\",\n \"types\": \"./dist/src/lang/transpiler.d.ts\",\n \"default\": \"./dist/tjs-lang.js\"\n },\n \"./lang/from-ts\": {\n \"bun\": \"./src/lang/emitters/from-ts.ts\",\n \"types\": \"./dist/src/lang/emitters/from-ts.d.ts\",\n \"default\": \"./dist/tjs-from-ts.js\"\n },\n \"./vm\": {\n \"bun\": \"./src/vm/index.ts\",\n \"types\": \"./dist/src/vm/index.d.ts\",\n \"default\": \"./dist/tjs-vm.js\"\n },\n \"./batteries\": {\n \"bun\": \"./src/batteries/index.ts\",\n \"types\": \"./dist/src/batteries/index.d.ts\",\n \"default\": \"./dist/tjs-batteries.js\"\n },\n \"./src\": \"./src/index.ts\",\n \"./editors/monaco\": \"./editors/monaco/ajs-monarch.js\",\n \"./editors/codemirror\": \"./editors/codemirror/ajs-language.js\",\n \"./editors/ace\": \"./editors/ace/ajs-mode.js\"\n },\n \"bin\": {\n \"tjs\": \"./src/cli/tjs.ts\",\n \"tjsx\": \"./src/cli/tjsx.ts\",\n \"tjs-playground\": \"./src/cli/playground.ts\",\n \"create-tjs-app\": \"./src/cli/create-app.ts\",\n \"ajs-install-vscode\": \"./bin/install-vscode.sh\",\n \"ajs-install-cursor\": \"./bin/install-cursor.sh\"\n },\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"src\",\n \"docs\",\n \"editors\",\n \"bin\",\n \"demo\",\n \"tjs-lang.svg\",\n \"CONTEXT.md\",\n \"CLAUDE.md\"\n ],\n \"sideEffects\": false,\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/tonioloewald/tjs-lang.git\"\n },\n \"devDependencies\": {\n \"@codemirror/lang-css\": \"^6.3.1\",\n \"@codemirror/lang-html\": \"^6.4.11\",\n \"@codemirror/lang-javascript\": \"^6.2.4\",\n \"@codemirror/lang-markdown\": \"^6.5.0\",\n \"@codemirror/state\": \"^6.5.3\",\n \"@codemirror/theme-one-dark\": \"^6.1.3\",\n \"@codemirror/view\": \"^6.39.9\",\n \"@happy-dom/global-registrator\": \"^20.1.0\",\n \"@types/bun\": \"latest\",\n \"@types/jsdom\": \"^21.1.7\",\n \"@typescript-eslint/eslint-plugin\": \"^5.62.0\",\n \"@typescript-eslint/parser\": \"^5.62.0\",\n \"acorn-walk\": \"^8.3.4\",\n \"chokidar\": \"^4.0.3\",\n \"codemirror\": \"^6.0.2\",\n \"esbuild\": \"^0.28.0\",\n \"eslint\": \"^8.57.1\",\n \"firebase\": \"^10.12.0\",\n \"firebase-admin\": \"^13.6.0\",\n \"firebase-functions\": \"^7.0.5\",\n \"marked\": \"^9.1.6\",\n \"prettier\": \"^2.8.8\",\n \"tosijs\": \"^1.5.6\",\n \"tosijs-ui\": \"^1.4.7\",\n \"typescript\": \"^5.6.2\",\n \"valibot\": \"^0.36.0\",\n \"vitest\": \"^2.0.5\"\n },\n \"scripts\": {\n \"format\": \"bun eslint src --fix && bun prettier --write .\",\n \"lint\": \"eslint src\",\n \"build:grammars\": \"bun editors/build-grammars.ts\",\n \"test:fast\": \"SKIP_LLM_TESTS=1 SKIP_BENCHMARKS=1 bun test\",\n \"test:llm\": \"bun test src/batteries/models.integration.test.ts\",\n \"bench\": \"bun bin/benchmarks.ts\",\n \"make\": \"rm -rf dist && bun format && bun run build:grammars && tsc -p tsconfig.build.json && bun scripts/build.ts\",\n \"build:bundles\": \"bun scripts/build.ts\",\n \"typecheck\": \"tsc --noEmit\",\n \"latest\": \"rm -rf node_modules && bun install\",\n \"docs\": \"node bin/docs.js\",\n \"dev\": \"bun run bin/dev.ts\",\n \"build:demo\": \"bun scripts/build-demo.ts\",\n \"build:cli\": \"bun build src/cli/tjs.ts --compile --outfile=dist/tjs && bun build src/cli/tjsx.ts --compile --outfile=dist/tjsx\",\n \"functions:build\": \"cd functions && npm run build\",\n \"functions:deploy\": \"cd functions && npm run deploy\",\n \"functions:serve\": \"cd functions && npm run serve\",\n \"deploy:hosting\": \"firebase deploy --only hosting\",\n \"deploy\": \"npm run build:demo && npm run functions:deploy && firebase deploy --only hosting\",\n \"start\": \"bun run build:demo && bun run dev\"\n },\n \"dependencies\": {\n \"acorn\": \"^8.15.0\",\n \"acorn-walk\": \"^8.3.4\",\n \"tosijs-schema\": \"^1.3.0\"\n }\n}\n", "/**\n * TypeScript to TJS Transpiler\n *\n * Converts TypeScript source to TJS (or directly to JS + metadata).\n *\n * Two modes:\n * 1. TS \u2192 TJS (for inspection/migration)\n * 2. TS \u2192 JS + __tjs metadata (for production)\n *\n * @example\n * ```typescript\n * // Input TypeScript:\n * function greet(name: string, age?: number): string {\n * return `Hello, ${name}!`\n * }\n *\n * // Output TJS:\n * function greet(name: '', age = 0): '' {\n * return `Hello, ${name}!`\n * }\n *\n * // Output JS + metadata:\n * function greet(name, age) {\n * return `Hello, ${name}!`\n * }\n * greet.__tjs = {\n * params: { name: { type: 'string', required: true }, age: { type: 'number', required: false } },\n * returns: { type: 'string' }\n * }\n * ```\n */\n\nimport ts from 'typescript'\nimport { emitClassWrapper } from '../runtime'\n\nexport interface FromTSOptions {\n /** Emit TJS intermediate instead of JS + metadata */\n emitTJS?: boolean\n /** Include sourcemap */\n sourceMap?: boolean\n /** Filename for error messages */\n filename?: string\n}\n\nexport interface FromTSResult {\n /** The transpiled code (TJS or JS depending on options) */\n code: string\n /** Function type metadata (only when emitting JS) */\n types?: Record<string, FunctionTypeInfo>\n /** Class type metadata (only when emitting JS) */\n classes?: Record<string, ClassTypeInfo>\n /** Any warnings during transpilation */\n warnings?: string[]\n}\n\nexport interface TypeParamInfo {\n /** Constraint schema (from `extends`) - example-based */\n constraint?: string | Record<string, any>\n /** Default schema (from `= Type`) - example-based */\n default?: string | Record<string, any>\n}\n\nexport interface FunctionTypeInfo {\n name: string\n params: Record<string, ParamTypeInfo>\n returns?: TypeInfo\n description?: string\n /** Generic type parameters with constraints/defaults */\n typeParams?: Record<string, TypeParamInfo>\n /** Overload signatures (when function has TS overloads) */\n overloads?: FunctionTypeInfo[]\n}\n\nexport interface ClassTypeInfo {\n name: string\n /** Constructor parameters - also serves as the type shape */\n constructor?: {\n params: Record<string, ParamTypeInfo>\n }\n /** Instance methods */\n methods: Record<string, FunctionTypeInfo>\n /** Static methods */\n staticMethods: Record<string, FunctionTypeInfo>\n /** Generic type parameters */\n typeParams?: Record<string, TypeParamInfo>\n}\n\nexport interface ParamTypeInfo {\n type: TypeInfo\n required: boolean\n default?: any\n description?: string\n}\n\nexport interface TypeInfo {\n kind:\n | 'string'\n | 'number'\n | 'boolean'\n | 'null'\n | 'undefined'\n | 'array'\n | 'tuple'\n | 'object'\n | 'union'\n | 'any'\n items?: TypeInfo\n /** For tuples: element types in order */\n elements?: TypeInfo[]\n shape?: Record<string, TypeInfo>\n members?: TypeInfo[]\n nullable?: boolean\n}\n\n/** Context for type resolution */\ninterface TypeResolutionContext {\n typeAliases?: Map<string, ts.TypeNode>\n interfaces?: Map<string, ts.InterfaceDeclaration>\n sourceFile?: ts.SourceFile\n warnings?: string[]\n /** Track visited types to prevent infinite recursion */\n visited?: Set<string>\n /** Type parameter constraints and defaults from enclosing generic function/class */\n typeParams?: Map<string, { constraint?: ts.TypeNode; default?: ts.TypeNode }>\n /** Cache resolved type alias/interface results to avoid redundant traversals */\n resolvedCache?: Map<string, TypeInfo>\n /** Current resolution depth \u2014 bail to 'any' when too deep */\n depth?: number\n}\n\n/** Maximum type resolution depth before degrading to 'any' */\nconst MAX_TYPE_DEPTH = 20\n\n/**\n * DOM interface types \u2014 not constructible but common in TS signatures.\n * Map to {} (opaque object) so params stay annotated and required\n * rather than degrading to bare names.\n */\nconst domInterfaceTypes = new Set([\n // Events\n 'Event',\n 'CustomEvent',\n 'MouseEvent',\n 'KeyboardEvent',\n 'PointerEvent',\n 'TouchEvent',\n 'FocusEvent',\n 'InputEvent',\n 'CompositionEvent',\n 'WheelEvent',\n 'DragEvent',\n 'AnimationEvent',\n 'TransitionEvent',\n 'ClipboardEvent',\n 'UIEvent',\n 'ProgressEvent',\n 'ErrorEvent',\n 'MessageEvent',\n 'PopStateEvent',\n 'HashChangeEvent',\n 'PageTransitionEvent',\n 'StorageEvent',\n 'BeforeUnloadEvent',\n 'SubmitEvent',\n // Event targets / misc\n 'EventTarget',\n 'EventListener',\n // Nodes\n 'Node',\n 'Element',\n 'HTMLElement',\n 'SVGElement',\n 'Document',\n 'DocumentFragment',\n 'ShadowRoot',\n 'Text',\n 'Comment',\n 'Attr',\n // Specific HTML elements\n 'HTMLInputElement',\n 'HTMLTextAreaElement',\n 'HTMLSelectElement',\n 'HTMLButtonElement',\n 'HTMLFormElement',\n 'HTMLAnchorElement',\n 'HTMLImageElement',\n 'HTMLVideoElement',\n 'HTMLAudioElement',\n 'HTMLCanvasElement',\n 'HTMLDivElement',\n 'HTMLSpanElement',\n 'HTMLParagraphElement',\n 'HTMLTableElement',\n 'HTMLTemplateElement',\n 'HTMLSlotElement',\n 'HTMLDialogElement',\n 'HTMLDetailsElement',\n 'HTMLLabelElement',\n 'HTMLOptionElement',\n 'HTMLIFrameElement',\n 'HTMLScriptElement',\n 'HTMLStyleElement',\n 'HTMLLinkElement',\n 'HTMLMetaElement',\n 'HTMLHeadElement',\n 'HTMLBodyElement',\n 'HTMLMediaElement',\n // SVG elements\n 'SVGSVGElement',\n 'SVGPathElement',\n 'SVGGElement',\n 'SVGCircleElement',\n 'SVGRectElement',\n 'SVGTextElement',\n 'SVGLineElement',\n 'SVGPolygonElement',\n // Collections / lists\n 'NodeList',\n 'HTMLCollection',\n 'NamedNodeMap',\n 'DOMTokenList',\n 'DOMStringMap',\n 'CSSStyleDeclaration',\n 'DOMRect',\n 'DOMRectReadOnly',\n 'DOMPoint',\n 'DOMMatrix',\n // Ranges / selection\n 'Range',\n 'Selection',\n 'StaticRange',\n // Observers\n 'MutationObserver',\n 'MutationRecord',\n 'IntersectionObserver',\n 'IntersectionObserverEntry',\n 'ResizeObserver',\n 'ResizeObserverEntry',\n 'PerformanceObserver',\n 'PerformanceEntry',\n // Window / global\n 'Window',\n 'Location',\n 'History',\n 'Navigator',\n 'Screen',\n 'Storage',\n // Canvas / media\n 'CanvasRenderingContext2D',\n 'WebGLRenderingContext',\n 'WebGL2RenderingContext',\n 'OffscreenCanvas',\n 'ImageData',\n 'ImageBitmap',\n 'MediaStream',\n 'MediaRecorder',\n 'AudioContext',\n 'AudioNode',\n 'AudioBuffer',\n // Workers / messaging\n 'Worker',\n 'SharedWorker',\n 'ServiceWorker',\n 'ServiceWorkerRegistration',\n 'BroadcastChannel',\n 'MessageChannel',\n 'MessagePort',\n // Other Web APIs\n 'WebSocket',\n 'XMLHttpRequest',\n 'FileReader',\n 'FileList',\n 'DataTransfer',\n 'Crypto',\n 'SubtleCrypto',\n 'CryptoKey',\n 'Geolocation',\n 'Notification',\n 'PermissionStatus',\n 'MediaQueryList',\n 'TreeWalker',\n 'NodeIterator',\n 'ClipboardItem',\n])\n\n/**\n * Convert a TypeScript type node to a TJS example value string\n *\n * @param warnings - Optional array to collect warnings about generic types\n */\nfunction typeToExample(\n type: ts.TypeNode | undefined,\n checker?: ts.TypeChecker,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): string {\n if (!type) return 'undefined'\n\n switch (type.kind) {\n case ts.SyntaxKind.StringKeyword:\n return \"''\"\n case ts.SyntaxKind.NumberKeyword:\n return '0.0'\n case ts.SyntaxKind.BooleanKeyword:\n return 'false'\n case ts.SyntaxKind.NullKeyword:\n return 'null'\n case ts.SyntaxKind.UndefinedKeyword:\n return 'undefined'\n case ts.SyntaxKind.VoidKeyword:\n return 'undefined'\n case ts.SyntaxKind.AnyKeyword:\n // For function params we use 'any', for object props we use 'null'\n return 'any'\n case ts.SyntaxKind.UnknownKeyword:\n return 'any'\n case ts.SyntaxKind.NeverKeyword:\n return 'null'\n case ts.SyntaxKind.SymbolKeyword:\n return \"Symbol('example')\"\n case ts.SyntaxKind.BigIntKeyword:\n return '0n'\n case ts.SyntaxKind.ObjectKeyword:\n return '{}'\n\n case ts.SyntaxKind.ArrayType: {\n const arrayType = type as ts.ArrayTypeNode\n let itemExample = typeToExample(arrayType.elementType, checker)\n // 'any' is not a valid literal value - use null for array items\n if (itemExample === 'any') itemExample = 'null'\n return `[${itemExample}]`\n }\n\n case ts.SyntaxKind.TypeReference: {\n const typeRef = type as ts.TypeReferenceNode\n const typeName = typeRef.typeName.getText()\n\n // Handle common generic types\n if (typeName === 'Array' && typeRef.typeArguments?.length) {\n const itemExample = typeToExample(\n typeRef.typeArguments[0],\n checker,\n warnings,\n ctx\n )\n return `[${itemExample}]`\n }\n if (typeName === 'Promise') {\n // Unwrap Promise type\n if (typeRef.typeArguments?.length) {\n return typeToExample(typeRef.typeArguments[0], checker, warnings, ctx)\n }\n return 'undefined'\n }\n if (\n typeName === 'Generator' ||\n typeName === 'AsyncGenerator' ||\n typeName === 'IterableIterator' ||\n typeName === 'AsyncIterableIterator'\n ) {\n // Unwrap to yield type (first type argument)\n if (typeRef.typeArguments?.length) {\n return typeToExample(typeRef.typeArguments[0], checker, warnings, ctx)\n }\n return 'undefined'\n }\n if (typeName === 'Record') {\n return '{}'\n }\n\n // Built-in constructible types \u2014 valid JS expressions as examples\n const builtinExamples: Record<string, string> = {\n // Collections\n Map: 'new Map()',\n Set: 'new Set()',\n WeakMap: 'new WeakMap()',\n WeakSet: 'new WeakSet()',\n WeakRef: 'new WeakRef({})',\n // Errors\n Error: \"new Error('example')\",\n TypeError: \"new TypeError('example')\",\n RangeError: \"new RangeError('example')\",\n SyntaxError: \"new SyntaxError('example')\",\n ReferenceError: \"new ReferenceError('example')\",\n URIError: \"new URIError('example')\",\n EvalError: \"new EvalError('example')\",\n // Date/Regex\n Date: 'new Date()',\n RegExp: '/example/',\n // Binary / WASM\n ArrayBuffer: 'new ArrayBuffer(0)',\n SharedArrayBuffer: 'new SharedArrayBuffer(0)',\n DataView: 'new DataView(new ArrayBuffer(0))',\n Float32Array: 'new Float32Array(0)',\n Float64Array: 'new Float64Array(0)',\n Int8Array: 'new Int8Array(0)',\n Int16Array: 'new Int16Array(0)',\n Int32Array: 'new Int32Array(0)',\n Uint8Array: 'new Uint8Array(0)',\n Uint16Array: 'new Uint16Array(0)',\n Uint32Array: 'new Uint32Array(0)',\n Uint8ClampedArray: 'new Uint8ClampedArray(0)',\n BigInt64Array: 'new BigInt64Array(0)',\n BigUint64Array: 'new BigUint64Array(0)',\n // Web APIs (constructible)\n URL: \"new URL('https://example.com')\",\n URLSearchParams: 'new URLSearchParams()',\n Headers: 'new Headers()',\n FormData: 'new FormData()',\n Blob: 'new Blob()',\n File: \"new File([], 'example')\",\n Response: 'new Response()',\n Request: \"new Request('https://example.com')\",\n AbortController: 'new AbortController()',\n AbortSignal: 'AbortSignal.abort()',\n // Streams\n ReadableStream: 'new ReadableStream()',\n WritableStream: 'new WritableStream()',\n TransformStream: 'new TransformStream()',\n // Structured data\n TextEncoder: 'new TextEncoder()',\n TextDecoder: 'new TextDecoder()',\n // Promises\n Promise: 'Promise.resolve(null)',\n }\n\n if (typeName in builtinExamples) {\n return builtinExamples[typeName]\n }\n\n // Resolve type aliases\n if (ctx?.typeAliases?.has(typeName)) {\n // Prevent infinite recursion\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n warnings?.push(`Circular type reference '${typeName}' - using 'any'`)\n return 'any'\n }\n visited.add(typeName)\n const resolvedType = ctx.typeAliases.get(typeName)!\n return typeToExample(resolvedType, checker, warnings, {\n ...ctx,\n visited,\n })\n }\n\n // Resolve interfaces\n if (ctx?.interfaces?.has(typeName)) {\n // Prevent infinite recursion\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n warnings?.push(`Circular type reference '${typeName}' - using 'any'`)\n return 'any'\n }\n visited.add(typeName)\n const iface = ctx.interfaces.get(typeName)!\n // Build example object from interface members\n const props: string[] = []\n for (const member of iface.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(ctx.sourceFile)\n const propExample = typeToExample(member.type, checker, warnings, {\n ...ctx,\n visited,\n })\n // Always use : for object shape properties \u2014 = is only valid\n // in destructuring patterns, not in object literal examples\n props.push(`${propName}: ${propExample}`)\n }\n }\n return `{ ${props.join(', ')} }`\n }\n\n // Type parameters (generics like T, K, V)\n // Check if we have constraint or default info from enclosing context\n if (ctx?.typeParams?.has(typeName)) {\n const tp = ctx.typeParams.get(typeName)!\n if (tp.constraint) {\n return typeToExample(tp.constraint, checker, warnings, ctx)\n }\n if (tp.default) {\n return typeToExample(tp.default, checker, warnings, ctx)\n }\n // No constraint or default \u2014 fall through to 'any'\n }\n\n // DOM interface types \u2014 opaque objects, keep params annotated\n if (domInterfaceTypes.has(typeName)) {\n return '{}'\n }\n\n // Single uppercase letter or common generic names \u2014 treat as any\n if (\n /^[A-Z]$/.test(typeName) ||\n ['T', 'K', 'V', 'U', 'TKey', 'TValue', 'TItem', 'TResult'].includes(\n typeName\n )\n ) {\n warnings?.push(\n `Generic type parameter '${typeName}' converted to 'any' - consider specializing`\n )\n return 'any'\n }\n // Unknown type reference - treat as any\n warnings?.push(\n `Unknown type '${typeName}' converted to 'any' - may need manual review`\n )\n return 'any'\n }\n\n case ts.SyntaxKind.TypeLiteral: {\n const typeLiteral = type as ts.TypeLiteralNode\n const props: string[] = []\n for (const member of typeLiteral.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText()\n let propType = typeToExample(member.type, checker)\n // 'any' is not a valid literal value - use null for object properties\n if (propType === 'any') propType = 'null'\n // In object literals, always use : syntax (= is for function params only)\n props.push(`${propName}: ${propType}`)\n }\n }\n return `{ ${props.join(', ')} }`\n }\n\n case ts.SyntaxKind.UnionType: {\n const unionType = type as ts.UnionTypeNode\n\n // Helper to check if a type is null or undefined\n const isNullType = (t: ts.TypeNode) =>\n t.kind === ts.SyntaxKind.NullKeyword ||\n (ts.isLiteralTypeNode(t) &&\n t.literal.kind === ts.SyntaxKind.NullKeyword)\n const isUndefinedType = (t: ts.TypeNode) =>\n t.kind === ts.SyntaxKind.UndefinedKeyword ||\n (ts.isLiteralTypeNode(t) &&\n t.literal.kind === ts.SyntaxKind.UndefinedKeyword)\n\n // Check for nullable: T | null or T | undefined\n const nonNullTypes = unionType.types.filter(\n (t) => !isNullType(t) && !isUndefinedType(t)\n )\n const hasNull = unionType.types.some(isNullType)\n const hasUndefined = unionType.types.some(isUndefinedType)\n\n // All null/undefined \u2014 just return the simplest form\n if (nonNullTypes.length === 0) {\n if (hasNull) return 'null'\n return 'undefined'\n }\n\n if (nonNullTypes.length === 1 && (hasNull || hasUndefined)) {\n // Nullable type: T | null -> T | null\n const baseExample = typeToExample(\n nonNullTypes[0],\n checker,\n warnings,\n ctx\n )\n // any | null/undefined is just any \u2014 don't emit 'any | null'\n if (baseExample === 'any') return 'any'\n if (hasNull) return `${baseExample} | null`\n if (hasUndefined) return `${baseExample} | undefined`\n }\n\n // General union: if any member can't be expressed (any), degrade\n // the whole union to any \u2014 don't silently drop members\n const examples = unionType.types\n .map((t) => typeToExample(t, checker, warnings, ctx))\n .filter((e, i, arr) => arr.indexOf(e) === i) // deduplicate\n if (examples.some((e) => e === 'any')) return 'any'\n if (examples.length === 1) return examples[0]\n if (examples.length > 0) {\n // Check if any member is a complex expression (function call, new, etc.)\n // that would make | ambiguous as JS bitwise OR\n const hasComplexMember = examples.some(\n (e) => /[()]/.test(e) || e.startsWith('new ')\n )\n if (hasComplexMember) return 'any'\n return examples.join(' | ')\n }\n return 'undefined'\n }\n\n case ts.SyntaxKind.LiteralType: {\n const literalType = type as ts.LiteralTypeNode\n if (ts.isStringLiteral(literalType.literal)) {\n return `'${literalType.literal.text}'`\n }\n if (ts.isNumericLiteral(literalType.literal)) {\n return literalType.literal.text\n }\n if (literalType.literal.kind === ts.SyntaxKind.TrueKeyword) {\n return 'true'\n }\n if (literalType.literal.kind === ts.SyntaxKind.FalseKeyword) {\n return 'false'\n }\n if (literalType.literal.kind === ts.SyntaxKind.NullKeyword) {\n return 'null'\n }\n return 'undefined'\n }\n\n case ts.SyntaxKind.ParenthesizedType: {\n const parenType = type as ts.ParenthesizedTypeNode\n return typeToExample(parenType.type, checker)\n }\n\n case ts.SyntaxKind.FunctionType: {\n // Convert to inline FunctionPredicate expression\n const funcType = type as ts.FunctionTypeNode\n const fpParams: string[] = []\n for (const param of funcType.parameters) {\n const name = param.name?.getText() || '_'\n if (name === 'this') continue\n let paramExample = typeToExample(param.type, checker, warnings, ctx)\n if (paramExample === 'any') paramExample = 'null'\n fpParams.push(`${name}: ${paramExample}`)\n }\n let fpReturn = typeToExample(funcType.type, checker, warnings, ctx)\n if (fpReturn === 'any') fpReturn = 'null'\n const spec: string[] = []\n if (fpParams.length > 0) spec.push(`params: { ${fpParams.join(', ')} }`)\n if (fpReturn !== 'undefined') spec.push(`returns: ${fpReturn}`)\n return `FunctionPredicate('function', { ${spec.join(', ')} })`\n }\n\n case ts.SyntaxKind.TupleType: {\n const tupleType = type as ts.TupleTypeNode\n const elements = tupleType.elements.map((e) => {\n const example = ts.isNamedTupleMember(e)\n ? typeToExample(e.type, checker)\n : typeToExample(e as ts.TypeNode, checker)\n // 'any' is not a valid literal value\n return example === 'any' ? 'null' : example\n })\n return `[${elements.join(', ')}]`\n }\n\n default:\n return 'undefined'\n }\n}\n\n/**\n * Convert TypeScript type to TypeInfo for metadata\n */\nfunction typeToInfo(\n type: ts.TypeNode | undefined,\n ctx?: TypeResolutionContext\n): TypeInfo {\n if (!type) return { kind: 'any' }\n\n // Bail on deeply nested type resolution to prevent exponential traversal\n const depth = ctx?.depth ?? 0\n if (depth > MAX_TYPE_DEPTH) return { kind: 'any' }\n // Increment depth for recursive calls (mutating ctx would be wrong since\n // sibling types share the same ctx; spread creates a child scope)\n ctx = ctx ? { ...ctx, depth: depth + 1 } : undefined\n\n switch (type.kind) {\n case ts.SyntaxKind.StringKeyword:\n return { kind: 'string' }\n case ts.SyntaxKind.NumberKeyword:\n return { kind: 'number' }\n case ts.SyntaxKind.BooleanKeyword:\n return { kind: 'boolean' }\n case ts.SyntaxKind.NullKeyword:\n return { kind: 'null' }\n case ts.SyntaxKind.UndefinedKeyword:\n case ts.SyntaxKind.VoidKeyword:\n return { kind: 'undefined' }\n\n case ts.SyntaxKind.ArrayType: {\n const arrayType = type as ts.ArrayTypeNode\n return { kind: 'array', items: typeToInfo(arrayType.elementType, ctx) }\n }\n\n case ts.SyntaxKind.TypeLiteral: {\n const typeLiteral = type as ts.TypeLiteralNode\n const shape: Record<string, TypeInfo> = {}\n for (const member of typeLiteral.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText()\n shape[propName] = typeToInfo(member.type, ctx)\n }\n }\n return { kind: 'object', shape }\n }\n\n case ts.SyntaxKind.UnionType: {\n const unionType = type as ts.UnionTypeNode\n const nonNullTypes = unionType.types.filter(\n (t) =>\n t.kind !== ts.SyntaxKind.NullKeyword &&\n t.kind !== ts.SyntaxKind.UndefinedKeyword\n )\n const hasNull = unionType.types.some(\n (t) => t.kind === ts.SyntaxKind.NullKeyword\n )\n\n if (nonNullTypes.length === 1 && hasNull) {\n return { ...typeToInfo(nonNullTypes[0], ctx), nullable: true }\n }\n\n return {\n kind: 'union',\n members: unionType.types.map((t) => typeToInfo(t, ctx)),\n }\n }\n\n case ts.SyntaxKind.IntersectionType: {\n const intersectionType = type as ts.IntersectionTypeNode\n // Flatten intersection into merged object shape\n const mergedShape: Record<string, TypeInfo> = {}\n for (const member of intersectionType.types) {\n const memberInfo = typeToInfo(member, ctx)\n if (memberInfo.kind === 'object' && memberInfo.shape) {\n Object.assign(mergedShape, memberInfo.shape)\n }\n }\n if (Object.keys(mergedShape).length > 0) {\n return { kind: 'object', shape: mergedShape }\n }\n // If no object shapes found, treat as any\n return { kind: 'any' }\n }\n\n case ts.SyntaxKind.TupleType: {\n const tupleType = type as ts.TupleTypeNode\n const elements: TypeInfo[] = []\n for (const element of tupleType.elements) {\n // Handle named tuple members: [x: number, y: string]\n if (ts.isNamedTupleMember(element)) {\n elements.push(typeToInfo(element.type, ctx))\n } else {\n elements.push(typeToInfo(element as ts.TypeNode, ctx))\n }\n }\n return { kind: 'tuple', elements }\n }\n\n case ts.SyntaxKind.TypeReference: {\n const typeRef = type as ts.TypeReferenceNode\n const typeName = typeRef.typeName.getText()\n if (typeName === 'Array' && typeRef.typeArguments?.length) {\n return {\n kind: 'array',\n items: typeToInfo(typeRef.typeArguments[0], ctx),\n }\n }\n if (typeName === 'Promise' && typeRef.typeArguments?.length) {\n return typeToInfo(typeRef.typeArguments[0], ctx)\n }\n if (\n (typeName === 'Generator' ||\n typeName === 'AsyncGenerator' ||\n typeName === 'IterableIterator' ||\n typeName === 'AsyncIterableIterator') &&\n typeRef.typeArguments?.length\n ) {\n return typeToInfo(typeRef.typeArguments[0], ctx)\n }\n\n // Handle utility types\n if (typeRef.typeArguments?.length) {\n const innerType = typeToInfo(typeRef.typeArguments[0], ctx)\n\n // Partial<T> - all properties become optional (we just return the shape)\n if (typeName === 'Partial') {\n return innerType\n }\n\n // Required<T> - all properties become required (we just return the shape)\n if (typeName === 'Required') {\n return innerType\n }\n\n // Readonly<T> - same shape, readonly is a compile-time concept\n if (typeName === 'Readonly') {\n return innerType\n }\n\n // Record<K, V> - object with string keys and V values\n if (typeName === 'Record' && typeRef.typeArguments.length >= 2) {\n const valueType = typeToInfo(typeRef.typeArguments[1], ctx)\n // Record is essentially an object with dynamic keys\n return { kind: 'object', shape: { '[key]': valueType } }\n }\n\n // Pick<T, K> and Omit<T, K> - just return the base type for now\n // Full implementation would need to filter properties\n if (typeName === 'Pick' || typeName === 'Omit') {\n return innerType\n }\n\n // NonNullable<T> - remove null/undefined\n if (typeName === 'NonNullable') {\n if (innerType.nullable) {\n return { ...innerType, nullable: false }\n }\n return innerType\n }\n\n // ReturnType<T>, Parameters<T>, etc. - complex, return any\n if (\n ['ReturnType', 'Parameters', 'ConstructorParameters'].includes(\n typeName\n )\n ) {\n return { kind: 'any' }\n }\n }\n\n // Resolve type aliases\n if (ctx?.typeAliases?.has(typeName)) {\n // Check cache first\n if (ctx.resolvedCache?.has(typeName)) {\n return ctx.resolvedCache.get(typeName)!\n }\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n return { kind: 'any' } // Circular reference\n }\n visited.add(typeName)\n const resolvedType = ctx.typeAliases.get(typeName)!\n const result = typeToInfo(resolvedType, { ...ctx, visited })\n ctx.resolvedCache?.set(typeName, result)\n return result\n }\n\n // Resolve interfaces\n if (ctx?.interfaces?.has(typeName)) {\n // Check cache first\n if (ctx.resolvedCache?.has(typeName)) {\n return ctx.resolvedCache.get(typeName)!\n }\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n return { kind: 'any' } // Circular reference\n }\n visited.add(typeName)\n const iface = ctx.interfaces.get(typeName)!\n const shape: Record<string, TypeInfo> = {}\n\n // Handle extends clauses - merge in base interface properties\n if (iface.heritageClauses) {\n for (const clause of iface.heritageClauses) {\n if (clause.token === ts.SyntaxKind.ExtendsKeyword) {\n for (const baseType of clause.types) {\n const baseName = baseType.expression.getText(ctx.sourceFile)\n // Look up the base interface and recursively resolve it\n if (ctx.interfaces?.has(baseName) && !visited.has(baseName)) {\n // Create a synthetic type reference node to look up the base\n const syntheticRef = {\n kind: ts.SyntaxKind.TypeReference,\n typeName: { getText: () => baseName },\n } as unknown as ts.TypeReferenceNode\n const baseInfo = typeToInfo(syntheticRef, { ...ctx, visited })\n if (baseInfo.kind === 'object' && baseInfo.shape) {\n Object.assign(shape, baseInfo.shape)\n }\n }\n }\n }\n }\n }\n\n // Add own members (may override base)\n for (const member of iface.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(ctx.sourceFile)\n shape[propName] = typeToInfo(member.type, { ...ctx, visited })\n }\n }\n const result = { kind: 'object' as const, shape }\n ctx.resolvedCache?.set(typeName, result)\n return result\n }\n\n // Check type parameter constraints/defaults from enclosing context\n if (ctx?.typeParams?.has(typeName)) {\n const tp = ctx.typeParams.get(typeName)!\n if (tp.constraint) {\n return typeToInfo(tp.constraint, ctx)\n }\n if (tp.default) {\n return typeToInfo(tp.default, ctx)\n }\n }\n\n // DOM interface types \u2014 opaque objects\n if (domInterfaceTypes.has(typeName)) {\n return { kind: 'object' }\n }\n\n // Generics and unknown types become 'any'\n return { kind: 'any' }\n }\n\n default:\n return { kind: 'any' }\n }\n}\n\n/**\n * Extract type parameter info (generics) from a function\n */\nfunction extractTypeParams(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n warnings?: string[]\n): Record<string, TypeParamInfo> | undefined {\n if (!node.typeParameters || node.typeParameters.length === 0) {\n return undefined\n }\n\n const typeParams: Record<string, TypeParamInfo> = {}\n\n for (const param of node.typeParameters) {\n const name = param.name.getText()\n const info: TypeParamInfo = {}\n\n // Extract constraint: T extends Foo\n if (param.constraint) {\n const constraintExample = typeToExample(\n param.constraint,\n undefined,\n warnings\n )\n // Try to parse as object/value for richer schema\n if (constraintExample.startsWith('{')) {\n try {\n // This is a rough parse - in production we'd use proper AST\n info.constraint = constraintExample\n } catch {\n info.constraint = constraintExample\n }\n } else {\n info.constraint = constraintExample\n }\n }\n\n // Extract default: T = Foo\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n info.default = defaultExample\n }\n\n typeParams[name] = info\n }\n\n return Object.keys(typeParams).length > 0 ? typeParams : undefined\n}\n\n/**\n * Transform a TypeScript function to TJS syntax\n */\n/**\n * Transform a TypeScript interface to TJS Type declaration\n *\n * interface User { name: string; age: number }\n * ->\n * Type User { example: { name: '', age: 0 } }\n */\nfunction transformInterfaceToType(\n node: ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n annotations?: TjsAnnotation[]\n): string | null {\n const typeName = node.name.getText(sourceFile)\n\n // Check for generics\n if (node.typeParameters && node.typeParameters.length > 0) {\n return transformGenericInterfaceToGeneric(\n node,\n sourceFile,\n warnings,\n annotations\n )\n }\n\n // Use @tjs example if provided, otherwise build from members\n const exampleAnnotation = annotations?.find((a) => a.kind === 'example')\n const predicateAnnotation = annotations?.find((a) => a.kind === 'predicate')\n\n let example: string\n if (exampleAnnotation?.text) {\n example = exampleAnnotation.text\n } else {\n const props: string[] = []\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n let propExample = typeToExample(member.type, undefined, warnings)\n if (propExample === 'any') propExample = 'null'\n props.push(`${propName}: ${propExample}`)\n }\n }\n if (props.length === 0 && !predicateAnnotation) {\n return `Type ${typeName} {}`\n }\n example = props.length > 0 ? `{ ${props.join(', ')} }` : '{}'\n }\n\n const parts = [`example: ${example}`]\n if (predicateAnnotation?.text) {\n parts.push(predicateAnnotation.text)\n }\n\n return `Type ${typeName} {\\n ${parts.join('\\n ')}\\n}`\n}\n\n/**\n * Transform a generic TypeScript interface to TJS Generic declaration\n *\n * interface Box<T> { value: T }\n * ->\n * Generic Box<T> {\n * description: 'Box'\n * predicate(x, T) { return typeof x === 'object' && x !== null && 'value' in x && T(x.value) }\n * }\n */\nfunction transformGenericInterfaceToGeneric(\n node: ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n annotations?: TjsAnnotation[]\n): string {\n const typeName = node.name.getText(sourceFile)\n const typeParams: string[] = []\n\n // Extract type parameters with constraints/defaults\n for (const param of node.typeParameters || []) {\n const paramName = param.name.getText(sourceFile)\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n typeParams.push(`${paramName} = ${defaultExample}`)\n } else {\n typeParams.push(paramName)\n }\n }\n\n // Use @tjs predicate if provided, otherwise auto-generate\n const predicateAnnotation = annotations?.find((a) => a.kind === 'predicate')\n const declarationAnnotation = annotations?.find(\n (a) => a.kind === 'declaration'\n )\n\n let predicateLine: string\n if (predicateAnnotation?.text) {\n predicateLine = predicateAnnotation.text\n } else {\n // Build predicate checks from interface members\n const typeParamNames = (node.typeParameters || []).map((p) =>\n p.name.getText(sourceFile)\n )\n const checks: string[] = [\"typeof x === 'object'\", 'x !== null']\n\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const isComputed = propName.startsWith('[') && propName.endsWith(']')\n const symbolName = isComputed ? propName.slice(1, -1) : null\n\n if (isComputed) {\n checks.push(`${symbolName} in x`)\n } else {\n checks.push(`'${propName}' in x`)\n }\n\n if (member.type && ts.isTypeReferenceNode(member.type)) {\n const refName = member.type.typeName.getText(sourceFile)\n if (typeParamNames.includes(refName)) {\n if (isComputed) {\n checks.push(`${refName}(x[${symbolName}])`)\n } else {\n checks.push(`${refName}(x.${propName})`)\n }\n }\n }\n }\n }\n\n const predicateParams = ['x', ...typeParamNames].join(', ')\n predicateLine = `predicate(${predicateParams}) { return ${checks.join(\n ' && '\n )} }`\n }\n\n const parts = [`description: '${typeName}'`, predicateLine]\n\n if (declarationAnnotation?.text) {\n parts.push(`declaration ${declarationAnnotation.text}`)\n } else {\n // Auto-generate declaration block from interface members\n const declMembers: string[] = []\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const optional = member.questionToken ? '?' : ''\n const typeText = member.type ? member.type.getText(sourceFile) : 'any'\n declMembers.push(`${propName}${optional}: ${typeText}`)\n } else if (ts.isMethodSignature(member) && member.name) {\n // Method: name(params): returnType\n const methodText = member.getText(sourceFile).trim()\n // Remove trailing semicolon if present\n declMembers.push(methodText.replace(/;$/, ''))\n }\n }\n if (declMembers.length > 0) {\n parts.push(`declaration {\\n ${declMembers.join('\\n ')}\\n }`)\n }\n }\n\n return `Generic ${typeName}<${typeParams.join(', ')}> {\\n ${parts.join(\n '\\n '\n )}\\n}`\n}\n\n/**\n * Check if a TypeScript union type is a literal union (e.g., 'up' | 'down' | 'left')\n * Returns the literal values if it is, null otherwise\n */\nfunction extractLiteralUnionValues(\n type: ts.TypeNode,\n _sourceFile: ts.SourceFile\n): string[] | null {\n if (!ts.isUnionTypeNode(type)) return null\n\n const values: string[] = []\n for (const member of type.types) {\n if (ts.isLiteralTypeNode(member)) {\n if (ts.isStringLiteral(member.literal)) {\n values.push(`'${member.literal.text}'`)\n } else if (ts.isNumericLiteral(member.literal)) {\n values.push(member.literal.text)\n } else if (member.literal.kind === ts.SyntaxKind.TrueKeyword) {\n values.push('true')\n } else if (member.literal.kind === ts.SyntaxKind.FalseKeyword) {\n values.push('false')\n } else if (member.literal.kind === ts.SyntaxKind.NullKeyword) {\n values.push('null')\n } else {\n // Not a literal we can handle\n return null\n }\n } else if (member.kind === ts.SyntaxKind.NullKeyword) {\n values.push('null')\n } else if (member.kind === ts.SyntaxKind.UndefinedKeyword) {\n values.push('undefined')\n } else {\n // Not a literal union (has complex types)\n return null\n }\n }\n\n return values.length > 0 ? values : null\n}\n\n/**\n * Transform a TypeScript enum to TJS Enum declaration\n *\n * enum Status { Pending, Active, Done }\n * ->\n * Enum Status 'Status' {\n * Pending\n * Active\n * Done\n * }\n *\n * enum Color { Red = 'red', Green = 'green', Blue = 'blue' }\n * ->\n * Enum Color 'Color' {\n * Red = 'red'\n * Green = 'green'\n * Blue = 'blue'\n * }\n */\nfunction transformEnumToTJS(\n node: ts.EnumDeclaration,\n sourceFile: ts.SourceFile,\n _warnings?: string[]\n): string | null {\n const enumName = node.name.getText(sourceFile)\n const members: string[] = []\n\n let nextValue = 0\n for (const member of node.members) {\n const memberName = member.name.getText(sourceFile)\n\n if (member.initializer) {\n // Has explicit value\n if (ts.isStringLiteral(member.initializer)) {\n members.push(` ${memberName} = '${member.initializer.text}'`)\n } else if (ts.isNumericLiteral(member.initializer)) {\n const numValue = parseInt(member.initializer.text, 10)\n members.push(` ${memberName} = ${numValue}`)\n nextValue = numValue + 1\n } else if (\n ts.isPrefixUnaryExpression(member.initializer) &&\n member.initializer.operator === ts.SyntaxKind.MinusToken\n ) {\n // Negative number\n const operand = member.initializer.operand\n if (ts.isNumericLiteral(operand)) {\n const numValue = -parseInt(operand.text, 10)\n members.push(` ${memberName} = ${numValue}`)\n nextValue = numValue + 1\n }\n } else {\n // Expression or other complex initializer - use the text directly\n members.push(\n ` ${memberName} = ${member.initializer.getText(sourceFile)}`\n )\n }\n } else {\n // Auto-increment numeric value\n members.push(` ${memberName} = ${nextValue}`)\n nextValue++\n }\n }\n\n return `Enum ${enumName} '${enumName}' {\n${members.join('\\n')}\n}`\n}\n\n/**\n * Transform a TypeScript type alias to TJS Type declaration\n *\n * type User = { name: string; age: number }\n * ->\n * Type User { example: { name: '', age: 0 } }\n *\n * type Direction = 'up' | 'down' | 'left' | 'right'\n * ->\n * Union Direction 'Direction' 'up' | 'down' | 'left' | 'right'\n */\nfunction transformTypeAliasToType(\n node: ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n annotations?: TjsAnnotation[]\n): string | null {\n const typeName = node.name.getText(sourceFile)\n\n // Check for generics\n if (node.typeParameters && node.typeParameters.length > 0) {\n // Generic function types \u2192 generic FunctionPredicate\n if (node.type.kind === ts.SyntaxKind.FunctionType) {\n return transformGenericFunctionTypeToFP(node, sourceFile, warnings)\n }\n return transformGenericTypeAliasToGeneric(\n node,\n sourceFile,\n warnings,\n annotations\n )\n }\n\n // Check for literal union type \u2192 emit Union syntax\n const literalValues = extractLiteralUnionValues(node.type, sourceFile)\n if (literalValues) {\n return `Union ${typeName} '${typeName}' ${literalValues.join(' | ')}`\n }\n\n // Function types \u2192 FunctionPredicate declaration\n if (node.type.kind === ts.SyntaxKind.FunctionType) {\n const funcType = node.type as ts.FunctionTypeNode\n const fpParams: string[] = []\n for (const param of funcType.parameters) {\n const name = param.name?.getText(sourceFile) || '_'\n if (name === 'this') continue\n let paramExample = typeToExample(param.type, undefined, warnings)\n if (paramExample === 'any') paramExample = 'null'\n fpParams.push(`${name}: ${paramExample}`)\n }\n let fpReturn = typeToExample(funcType.type, undefined, warnings)\n if (fpReturn === 'any') fpReturn = 'null'\n const spec: string[] = []\n if (fpParams.length > 0) spec.push(`params: { ${fpParams.join(', ')} }`)\n if (fpReturn !== 'undefined') spec.push(`returns: ${fpReturn}`)\n return `FunctionPredicate ${typeName} {\\n ${spec.join('\\n ')}\\n}`\n }\n\n const example = typeToExample(node.type, undefined, warnings)\n\n // 'any' and 'undefined' \u2014 preserve original TS body for DTS round-tripping\n if (example === 'any' || example === 'undefined') {\n const originalType = node.type.getText(sourceFile).trim()\n // Include the TS type body so the DTS emitter can recover it\n return `Type ${typeName} {\\n // TS: ${originalType}\\n}`\n }\n\n // For simple primitive types, use short form\n if (\n example === \"''\" ||\n example === '0' ||\n example === 'true' ||\n example === 'null'\n ) {\n return `Type ${typeName} ${example}`\n }\n\n return `Type ${typeName} {\n example: ${example}\n}`\n}\n\n/**\n * Transform a generic function type alias to a generic FunctionPredicate declaration.\n * e.g. `type Creator<T> = (x: string) => T` \u2192 `FunctionPredicate Creator<T> { params: { x: '' } returns: T }`\n */\nfunction transformGenericFunctionTypeToFP(\n node: ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string {\n const typeName = node.name.getText(sourceFile)\n const funcType = node.type as ts.FunctionTypeNode\n\n // Build type params string: <T, U = {}>\n const typeParamNames = new Set<string>()\n const typeParams: string[] = []\n for (const tp of node.typeParameters!) {\n const name = tp.name.getText(sourceFile)\n typeParamNames.add(name)\n if (tp.default) {\n const defaultExample = typeToExample(tp.default, undefined, warnings)\n typeParams.push(`${name} = ${defaultExample}`)\n } else {\n typeParams.push(name)\n }\n }\n\n // Build params \u2014 preserve type param references as bare identifiers\n const fpParams: string[] = []\n for (const param of funcType.parameters) {\n const name = param.name?.getText(sourceFile) || '_'\n if (name === 'this') continue\n const paramTypeText = param.type?.getText(sourceFile) || 'any'\n if (typeParamNames.has(paramTypeText)) {\n // Type param reference \u2014 keep as-is\n fpParams.push(`${name}: ${paramTypeText}`)\n } else {\n let paramExample = typeToExample(param.type, undefined, warnings)\n if (paramExample === 'any') paramExample = 'null'\n fpParams.push(`${name}: ${paramExample}`)\n }\n }\n\n // Build return type \u2014 preserve type param references\n const returnTypeText = funcType.type?.getText(sourceFile) || 'void'\n let fpReturn: string | undefined\n if (returnTypeText !== 'void') {\n if (typeParamNames.has(returnTypeText)) {\n fpReturn = returnTypeText\n } else {\n fpReturn = typeToExample(funcType.type, undefined, warnings)\n if (fpReturn === 'any') fpReturn = 'null'\n if (fpReturn === 'undefined') fpReturn = undefined\n }\n }\n\n const spec: string[] = []\n if (fpParams.length > 0) spec.push(`params: { ${fpParams.join(', ')} }`)\n if (fpReturn !== undefined) spec.push(`returns: ${fpReturn}`)\n return `FunctionPredicate ${typeName}<${typeParams.join(\n ', '\n )}> {\\n ${spec.join('\\n ')}\\n}`\n}\n\n/**\n * Transform a generic type alias to TJS Generic declaration\n */\nfunction transformGenericTypeAliasToGeneric(\n node: ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n annotations?: TjsAnnotation[]\n): string {\n const typeName = node.name.getText(sourceFile)\n const typeParams: string[] = []\n\n // Extract type parameters\n for (const param of node.typeParameters || []) {\n const paramName = param.name.getText(sourceFile)\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n typeParams.push(`${paramName} = ${defaultExample}`)\n } else {\n typeParams.push(paramName)\n }\n }\n\n const typeParamNames = (node.typeParameters || []).map((p) =>\n p.name.getText(sourceFile)\n )\n\n // Use @tjs predicate if provided, otherwise default placeholder\n const predicateAnnotation = annotations?.find((a) => a.kind === 'predicate')\n const declarationAnnotation = annotations?.find(\n (a) => a.kind === 'declaration'\n )\n\n let predicateLine: string\n if (predicateAnnotation?.text) {\n predicateLine = predicateAnnotation.text\n } else {\n const predicateParams = ['x', ...typeParamNames].join(', ')\n predicateLine = `predicate(${predicateParams}) { return true }`\n }\n\n const parts = [`description: '${typeName}'`, predicateLine]\n\n if (declarationAnnotation?.text) {\n parts.push(`declaration ${declarationAnnotation.text}`)\n } else {\n // Auto-generate declaration block from the type body\n const typeBody = node.type\n\n if (typeBody && ts.isTypeLiteralNode(typeBody)) {\n // Object type literal: { item: T; count: number }\n const declMembers: string[] = []\n for (const member of typeBody.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const optional = member.questionToken ? '?' : ''\n const typeText = member.type ? member.type.getText(sourceFile) : 'any'\n declMembers.push(`${propName}${optional}: ${typeText}`)\n } else if (ts.isMethodSignature(member) && member.name) {\n declMembers.push(member.getText(sourceFile).trim().replace(/;$/, ''))\n }\n }\n if (declMembers.length > 0) {\n parts.push(`declaration {\\n ${declMembers.join('\\n ')}\\n }`)\n }\n } else if (typeBody) {\n // Complex type (conditional, mapped, intersection, etc.)\n // Pass through the TS type body verbatim\n const typeText = typeBody.getText(sourceFile).trim()\n parts.push(`declaration {\\n // TS: ${typeText}\\n }`)\n }\n }\n\n return `Generic ${typeName}<${typeParams.join(', ')}> {\\n ${parts.join(\n '\\n '\n )}\\n}`\n}\n\nfunction transformFunctionToTJS(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n sourceFile: ts.SourceFile,\n explicitName?: string,\n warnings?: string[],\n includeLineNumber?: boolean,\n ctx?: TypeResolutionContext\n): string {\n // Build type parameter map from generic params (constraint/default)\n let typeParamMap:\n | Map<string, { constraint?: ts.TypeNode; default?: ts.TypeNode }>\n | undefined\n if (node.typeParameters && node.typeParameters.length > 0) {\n typeParamMap = new Map()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n }\n\n // Merge type params into ctx for resolution in typeToExample\n const resolveCtx: TypeResolutionContext | undefined =\n typeParamMap || ctx\n ? { ...ctx, typeParams: typeParamMap ?? ctx?.typeParams }\n : ctx\n\n const degraded: string[] = []\n const params = transformParams(\n node.parameters,\n sourceFile,\n warnings,\n degraded,\n resolveCtx\n )\n\n // Get line number (1-indexed) for source mapping\n const { line } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile)\n )\n const lineComment = includeLineNumber ? `/* line ${line + 1} */\\n` : ''\n\n const funcName =\n explicitName ||\n (ts.isFunctionDeclaration(node) && node.name\n ? node.name.getText(sourceFile)\n : '')\n const returnExample = node.type\n ? typeToExample(node.type, undefined, warnings, resolveCtx)\n : ''\n // Use :! to skip signature tests - TS types are compile-time only,\n // the example values won't necessarily match runtime behavior\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any' &&\n !returnExample.startsWith('new ') // new Set(), new Map() etc. aren't valid TJS literals\n ? `:! ${returnExample}`\n : ''\n\n // Track degraded return type\n if (node.type && (returnExample === 'any' || returnExample === 'undefined')) {\n const originalReturn = node.type.getText(sourceFile)\n if (\n originalReturn !== 'any' &&\n originalReturn !== 'unknown' &&\n originalReturn !== 'void'\n ) {\n degraded.push(`return: ${originalReturn}`)\n }\n }\n\n // Get function body and strip TypeScript syntax using ts.transpileModule\n let body = ''\n if (node.body) {\n const bodyText = ts.isBlock(node.body)\n ? node.body.getText(sourceFile)\n : `{ return ${node.body.getText(sourceFile)} }`\n\n // Use TypeScript's transpiler to strip all type syntax\n const transpiled = ts.transpileModule(bodyText, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = transpiled.outputText.trim()\n } else {\n body = '{ }'\n }\n\n // Check for export, async, and generator modifiers\n const isExported = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n const isAsync = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n const isGenerator = !!(node as ts.FunctionDeclaration).asteriskToken\n const exportPrefix = isExported ? 'export ' : ''\n const asyncPrefix = isAsync ? 'async ' : ''\n const funcKeyword = isGenerator ? 'function* ' : 'function '\n\n // Emit migration comment if any types were degraded\n const degradedComment =\n degraded.length > 0\n ? `/* TODO: TS types degraded \u2014 ${degraded.join(', ')} */\\n`\n : ''\n\n return `${lineComment}${degradedComment}${exportPrefix}${asyncPrefix}${funcKeyword}${funcName}(${params.join(\n ', '\n )})${returnAnnotation} ${body}`\n}\n\n/**\n * Emit a full TJS overload group: the implementation (renamed) + wrapper signatures.\n * Each overload signature becomes a TJS function that delegates to the implementation.\n * TJS polymorphic dispatch merges the wrappers into a dispatcher automatically.\n */\nfunction emitOverloadGroup(\n signatures: ts.FunctionDeclaration[],\n implementation: ts.FunctionDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string[] {\n const funcName = implementation.name?.getText(sourceFile) || ''\n const implName = `_${funcName}_impl`\n const results: string[] = []\n\n // Emit the implementation as a renamed private function\n const implParams = transformParams(\n implementation.parameters,\n sourceFile,\n warnings\n )\n let implBody = '{ }'\n if (implementation.body) {\n const bodyText = implementation.body.getText(sourceFile)\n const transpiled = ts.transpileModule(bodyText, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n implBody = transpiled.outputText.trim()\n }\n const isAsync = implementation.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n const isGenerator = !!implementation.asteriskToken\n const asyncPrefix = isAsync ? 'async ' : ''\n const funcKeyword = isGenerator ? 'function* ' : 'function '\n\n results.push(\n `${asyncPrefix}${funcKeyword}${implName}(${implParams.join(\n ', '\n )}) ${implBody}`\n )\n\n // Emit each overload signature as a wrapper that delegates to the implementation\n for (const sig of signatures) {\n const params = transformParams(sig.parameters, sourceFile, warnings)\n const paramNames = sig.parameters.map((p) => p.name.getText(sourceFile))\n const returnExample = sig.type\n ? typeToExample(sig.type, undefined, warnings)\n : ''\n const returnAnnotation =\n returnExample && returnExample !== 'undefined' && returnExample !== 'any'\n ? `:! ${returnExample}`\n : ''\n\n const { line } = sourceFile.getLineAndCharacterOfPosition(\n sig.getStart(sourceFile)\n )\n const lineComment = `/* line ${line + 1} */\\n`\n const returnKw = isGenerator ? 'yield* ' : 'return '\n\n results.push(\n `${lineComment}${asyncPrefix}${funcKeyword}${funcName}(${params.join(\n ', '\n )})${returnAnnotation} { ${returnKw}${implName}(${paramNames.join(\n ', '\n )}) }`\n )\n }\n\n return results\n}\n\n/**\n * Transform TypeScript class to TJS class\n * Converts TS type annotations to TJS example-based annotations\n */\nfunction transformClassToTJS(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext,\n convertPrivateToHash = false\n): string {\n // Build type parameter map from class-level generics\n let resolveCtx = ctx\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParamMap = new Map<\n string,\n { constraint?: ts.TypeNode; default?: ts.TypeNode }\n >()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n resolveCtx = { ...ctx, typeParams: typeParamMap }\n }\n\n const className = node.name?.getText(sourceFile) || 'Anonymous'\n // Get base class name, stripping type arguments (e.g. Component<T> \u2192 Component)\n const extendsType = node.heritageClauses?.find(\n (h) => h.token === ts.SyntaxKind.ExtendsKeyword\n )?.types[0]\n const extendsClause = extendsType?.expression?.getText(sourceFile)\n\n // With TjsClass: convert TS private to JS # (true runtime privacy).\n // Without TjsClass: strip the keyword, keep the name (TS private is compile-time only).\n const privateFieldMap = new Map<string, string>()\n if (convertPrivateToHash) {\n for (const member of node.members) {\n if (ts.isPropertyDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const isPrivate = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.PrivateKeyword\n )\n if (isPrivate && !propName.startsWith('#')) {\n privateFieldMap.set(propName, `#${propName}`)\n }\n }\n }\n }\n\n // Helper to replace private field references in transpiled code\n // Handles: this.prop, ClassName.prop (static), varName.prop (instance via variable)\n const replacePrivateRefs = (code: string): string => {\n let result = code\n for (const [tsName, jsName] of privateFieldMap) {\n // Match property access on any identifier: word.propName or this.propName\n // This covers this.prop, ClassName.prop, and varName.prop\n result = result.replace(\n new RegExp(`(\\\\b\\\\w+)\\\\.${tsName}\\\\b`, 'g'),\n `$1.${jsName}`\n )\n }\n return result\n }\n\n const members: string[] = []\n\n for (const member of node.members) {\n // Constructor\n if (ts.isConstructorDeclaration(member)) {\n const params = transformParams(member.parameters, sourceFile, warnings)\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n members.push(` constructor(${params.join(', ')}) ${body}`)\n }\n\n // Regular methods\n if (ts.isMethodDeclaration(member) && member.name) {\n const methodName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n const isAsync = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n\n const params = transformParams(\n member.parameters,\n sourceFile,\n warnings,\n undefined,\n resolveCtx\n )\n const returnExample = member.type\n ? typeToExample(member.type, undefined, warnings, resolveCtx)\n : ''\n // Use :! to skip signature tests for TS-transpiled code\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any'\n ? `:! ${returnExample}`\n : ''\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n const isGenerator = !!member.asteriskToken\n const staticPrefix = isStatic ? 'static ' : ''\n const asyncPrefix = isAsync ? 'async ' : ''\n const generatorStar = isGenerator ? '*' : ''\n members.push(\n ` ${staticPrefix}${asyncPrefix}${generatorStar}${methodName}(${params.join(\n ', '\n )})${returnAnnotation} ${body}`\n )\n }\n\n // Getters\n if (ts.isGetAccessorDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n const staticPrefix = isStatic ? 'static ' : ''\n const returnExample = member.type\n ? typeToExample(member.type, undefined, warnings, resolveCtx)\n : ''\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any' &&\n !returnExample.startsWith('new ')\n ? `: ${returnExample}`\n : ''\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n members.push(\n ` ${staticPrefix}get ${propName}()${returnAnnotation} ${body}`\n )\n }\n\n // Setters\n if (ts.isSetAccessorDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n const staticPrefix = isStatic ? 'static ' : ''\n const params = transformParams(member.parameters, sourceFile, warnings)\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n members.push(\n ` ${staticPrefix}set ${propName}(${params.join(', ')}) ${body}`\n )\n }\n\n // Properties with initializers (private fields, regular properties)\n if (ts.isPropertyDeclaration(member) && member.name) {\n const origName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n const staticPrefix = isStatic ? 'static ' : ''\n\n // Use mapped name (# for private) or original\n const propName = privateFieldMap.get(origName) || origName\n\n if (member.initializer) {\n // Wrap in parens so TS treats { ... } as an object expression,\n // not a block with labels (which mangles property colons)\n const initText = member.initializer.getText(sourceFile)\n const wrapped = initText.trimStart().startsWith('{')\n ? `(${initText})`\n : initText\n const transpiled = ts.transpileModule(wrapped, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n let output = transpiled.outputText.trim()\n // Strip the wrapping parens and trailing semicolon\n if (wrapped !== initText) {\n output = output.replace(/^\\(/, '').replace(/\\);?\\s*$/, '')\n }\n members.push(` ${staticPrefix}${propName} = ${output}`)\n } else {\n // Property without initializer - just declare it\n members.push(` ${staticPrefix}${propName}`)\n }\n }\n }\n\n const isExported = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n const exportPrefix = isExported ? 'export ' : ''\n const extendsStr = extendsClause ? ` extends ${extendsClause}` : ''\n return `${exportPrefix}class ${className}${extendsStr} {\\n${members.join(\n '\\n'\n )}\\n}`\n}\n\n/**\n * Helper to transform parameters to TJS format\n */\nfunction transformParams(\n parameters: ts.NodeArray<ts.ParameterDeclaration>,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n degraded?: string[],\n ctx?: TypeResolutionContext\n): string[] {\n const params: string[] = []\n\n for (const param of parameters) {\n const name = param.name.getText(sourceFile)\n // Skip TypeScript's `this` pseudo-parameter (declares `this` context type)\n if (name === 'this') continue\n const isRest = !!param.dotDotDotToken\n const isOptional = !!param.questionToken || !!param.initializer\n const typeExample = typeToExample(param.type, undefined, warnings, ctx)\n\n if (isRest) {\n // Rest parameter: ...args: T[] \u2192 ...args: [example]\n // typeToExample already converts T[] to [example], so use directly\n if (typeExample === 'any' || typeExample === 'undefined') {\n params.push(`...${name}: [null]`)\n } else {\n params.push(`...${name}: ${typeExample}`)\n }\n } else if (param.initializer) {\n // Has default value - use it directly\n const defaultText = param.initializer.getText(sourceFile)\n params.push(`${name} = ${defaultText}`)\n } else if (typeExample === 'any' || typeExample === 'undefined') {\n // any/undefined type - no annotation in TJS (bare name means any)\n params.push(name)\n // Record original TS type for migration comments\n if (degraded && param.type) {\n const originalType = param.type.getText(sourceFile)\n if (originalType !== 'any' && originalType !== 'unknown') {\n degraded.push(`${name}: ${originalType}`)\n }\n }\n } else if (isOptional) {\n // Optional without default - use union with undefined to preserve\n // three-state semantics (e.g. TS `flag?: boolean` can be true/false/undefined)\n params.push(`${name}: ${typeExample} | undefined`)\n } else {\n // Required - use : for required\n params.push(`${name}: ${typeExample}`)\n }\n }\n\n return params\n}\n\n/**\n * Extract type metadata from a TypeScript function\n */\nfunction extractFunctionMetadata(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): FunctionTypeInfo {\n // Build type parameter map from generic params\n let resolveCtx = ctx\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParamMap = new Map<\n string,\n { constraint?: ts.TypeNode; default?: ts.TypeNode }\n >()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n resolveCtx = { ...ctx, typeParams: typeParamMap }\n }\n\n const name =\n ts.isFunctionDeclaration(node) && node.name\n ? node.name.getText(sourceFile)\n : 'anonymous'\n const params: Record<string, ParamTypeInfo> = {}\n\n for (const param of node.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n // Try to extract literal default value\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, resolveCtx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n\n const result: FunctionTypeInfo = {\n name,\n params,\n returns: node.type ? typeToInfo(node.type, resolveCtx) : undefined,\n }\n\n // Extract generic type parameters\n const typeParams = extractTypeParams(node, warnings)\n if (typeParams) {\n result.typeParams = typeParams\n }\n\n return result\n}\n\n/**\n * Extract type metadata from a TypeScript class\n */\nfunction extractClassMetadata(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): ClassTypeInfo {\n // Build type parameter map from class-level generics\n let resolveCtx = ctx\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParamMap = new Map<\n string,\n { constraint?: ts.TypeNode; default?: ts.TypeNode }\n >()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n resolveCtx = { ...ctx, typeParams: typeParamMap }\n }\n\n const name = node.name?.getText(sourceFile) || 'anonymous'\n const methods: Record<string, FunctionTypeInfo> = {}\n const staticMethods: Record<string, FunctionTypeInfo> = {}\n let constructorInfo: { params: Record<string, ParamTypeInfo> } | undefined\n\n for (const member of node.members) {\n // Constructor\n if (ts.isConstructorDeclaration(member)) {\n const params: Record<string, ParamTypeInfo> = {}\n for (const param of member.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, resolveCtx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n constructorInfo = { params }\n }\n\n // Methods (instance and static)\n if (ts.isMethodDeclaration(member) && member.name) {\n const methodName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n\n const params: Record<string, ParamTypeInfo> = {}\n for (const param of member.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, resolveCtx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n\n const methodInfo: FunctionTypeInfo = {\n name: methodName,\n params,\n returns: member.type ? typeToInfo(member.type, resolveCtx) : undefined,\n }\n\n if (isStatic) {\n staticMethods[methodName] = methodInfo\n } else {\n methods[methodName] = methodInfo\n }\n }\n }\n\n const result: ClassTypeInfo = {\n name,\n methods,\n staticMethods,\n constructor: constructorInfo,\n }\n\n // Extract class-level generic type parameters\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParams: Record<string, TypeParamInfo> = {}\n for (const param of node.typeParameters) {\n const paramName = param.name.getText(sourceFile)\n const info: TypeParamInfo = {}\n if (param.constraint) {\n info.constraint = typeToExample(\n param.constraint,\n undefined,\n warnings,\n ctx\n )\n }\n if (param.default) {\n info.default = typeToExample(param.default, undefined, warnings, ctx)\n }\n typeParams[paramName] = info\n }\n result.typeParams = typeParams\n }\n\n return result\n}\n\n/**\n * Transpile TypeScript source to TJS or JS + metadata\n */\n/**\n * Extract embedded test comments from source\n * These use syntax: /*test 'description' { ... }* / (without space before /)\n * They survive TS compilation and should be preserved in TJS output\n */\n// =============================================================================\n// @tjs annotations \u2014 enrich TJS output from TS source comments\n// =============================================================================\n\ninterface TjsAnnotation {\n index: number\n kind: 'predicate' | 'example' | 'skip' | 'declaration'\n text?: string // raw text for predicate/example/declaration\n}\n\n/** Valid TJS mode directives */\nconst VALID_TJS_MODES = new Set([\n 'TjsStrict',\n 'TjsEquals',\n 'TjsClass',\n 'TjsDate',\n 'TjsNoeval',\n 'TjsNoVar',\n 'TjsStandard',\n 'TjsSafeEval',\n])\n\n/**\n * Extract TJS mode directives from /* @tjs ... * / comments.\n * e.g. /* @tjs TjsClass TjsEquals * / \u2192 ['TjsClass', 'TjsEquals']\n */\nfunction extractTjsModes(source: string): string[] {\n const modes: string[] = []\n const re = /\\/\\*\\s*@tjs\\s+((?:Tjs\\w+\\s*)+)\\*\\//g\n let m\n while ((m = re.exec(source)) !== null) {\n const words = m[1].trim().split(/\\s+/)\n for (const word of words) {\n if (VALID_TJS_MODES.has(word) && !modes.includes(word)) {\n modes.push(word)\n }\n }\n }\n return modes\n}\n\n/**\n * Extract @tjs annotations from source comments.\n *\n * Supported forms:\n * /* @tjs-skip * /\n * /* @tjs example: { name: '', age: 0 } * /\n * /* @tjs predicate(x, T) { return typeof x === 'object' && T(x.value) } * /\n * /* @tjs declaration { value: T; path: string } * /\n */\nfunction extractTjsAnnotations(source: string): TjsAnnotation[] {\n const annotations: TjsAnnotation[] = []\n\n // @tjs-skip\n const skipRe = /\\/\\*\\s*@tjs-skip\\s*\\*\\//g\n let m\n while ((m = skipRe.exec(source)) !== null) {\n annotations.push({ index: m.index, kind: 'skip' })\n }\n\n // @tjs predicate(...) { ... }\n const predRe = /\\/\\*\\s*@tjs\\s+predicate(\\([^)]*\\)\\s*\\{[\\s\\S]*?\\})\\s*\\*\\//g\n while ((m = predRe.exec(source)) !== null) {\n annotations.push({\n index: m.index,\n kind: 'predicate',\n text: `predicate${m[1].trim()}`,\n })\n }\n\n // @tjs example: ...\n const exRe = /\\/\\*\\s*@tjs\\s+example:\\s*([\\s\\S]*?)\\s*\\*\\//g\n while ((m = exRe.exec(source)) !== null) {\n annotations.push({ index: m.index, kind: 'example', text: m[1].trim() })\n }\n\n // @tjs declaration { ... }\n const declRe = /\\/\\*\\s*@tjs\\s+declaration\\s*(\\{[\\s\\S]*?\\})\\s*\\*\\//g\n while ((m = declRe.exec(source)) !== null) {\n annotations.push({\n index: m.index,\n kind: 'declaration',\n text: m[1].trim(),\n })\n }\n\n return annotations.sort((a, b) => a.index - b.index)\n}\n\n/**\n * Build a map from declaration name \u2192 annotations that precede it.\n */\nfunction buildAnnotationMap(\n annotations: TjsAnnotation[],\n sourceFile: ts.SourceFile\n): Map<string, TjsAnnotation[]> {\n const result = new Map<string, TjsAnnotation[]>()\n if (annotations.length === 0) return result\n\n const statements = sourceFile.statements\n for (let si = 0; si < statements.length; si++) {\n const stmt = statements[si]\n let name: string | undefined\n\n if (ts.isInterfaceDeclaration(stmt)) {\n name = stmt.name.getText(sourceFile)\n } else if (ts.isTypeAliasDeclaration(stmt)) {\n name = stmt.name.getText(sourceFile)\n } else if (ts.isEnumDeclaration(stmt)) {\n name = stmt.name.getText(sourceFile)\n }\n\n if (!name) continue\n\n const stmtStart = stmt.getStart(sourceFile)\n const prevEnd = si > 0 ? statements[si - 1].getEnd() : 0\n\n const matching = annotations.filter(\n (a) => a.index >= prevEnd && a.index < stmtStart\n )\n if (matching.length > 0) {\n result.set(name, matching)\n }\n }\n\n return result\n}\n\nfunction extractEmbeddedTestComments(source: string): string[] {\n const tests: string[] = []\n // Match: /*test 'description' { ... }*/ or /*test { ... }*/\n const embeddedRegex =\n /\\/\\*test\\s+(['\"`])([^'\"`]*)\\1\\s*\\{[\\s\\S]*?\\}\\s*\\*\\/|\\/\\*test\\s*\\{[\\s\\S]*?\\}\\s*\\*\\//g\n\n let match\n while ((match = embeddedRegex.exec(source)) !== null) {\n tests.push(match[0])\n }\n return tests\n}\n\n/**\n * Extract top-level TJS doc comments (/*# ... *\\/) from source with position info.\n * These need to be preserved in TJS output in their original positions.\n * Comments inside function bodies are already preserved by the TS transpiler.\n */\nfunction extractDocComments(\n source: string\n): Array<{ content: string; index: number }> {\n const comments: Array<{ content: string; index: number }> = []\n const docRegex = /\\/\\*#[\\s\\S]*?\\*\\//g\n\n // Track brace depth to identify top-level comments\n let braceDepth = 0\n let inString: string | null = null\n\n // Scan source to find brace depths at each position\n const braceDepthAt: number[] = []\n for (let i = 0; i < source.length; i++) {\n const ch = source[i]\n const prev = i > 0 ? source[i - 1] : ''\n\n // Handle string literals\n if (!inString && (ch === '\"' || ch === \"'\" || ch === '`')) {\n inString = ch\n } else if (inString && ch === inString && prev !== '\\\\') {\n inString = null\n }\n\n // Track braces only outside strings\n if (!inString) {\n if (ch === '{') braceDepth++\n if (ch === '}') braceDepth--\n }\n\n braceDepthAt[i] = braceDepth\n }\n\n let match\n while ((match = docRegex.exec(source)) !== null) {\n // Only include comments at top level (brace depth 0)\n if (braceDepthAt[match.index] === 0) {\n comments.push({\n content: match[0],\n index: match.index,\n })\n }\n }\n return comments\n}\n\nexport function fromTS(\n source: string,\n options: FromTSOptions = {}\n): FromTSResult {\n const { emitTJS = false, filename = 'input.ts' } = options\n const warnings: string[] = []\n\n // Extract embedded test comments before TS parsing (they need to be preserved)\n const embeddedTests = extractEmbeddedTestComments(source)\n\n // Extract doc comments (/*# ... */) with position info for TJS output\n const docComments = emitTJS ? extractDocComments(source) : []\n\n // Extract @tjs annotations for enriching TJS output\n const tjsAnnotations = emitTJS ? extractTjsAnnotations(source) : []\n\n // Extract TJS mode directives from /* @tjs TjsClass ... */ comments\n const tjsModes = extractTjsModes(source)\n const hasTjsClass =\n tjsModes.includes('TjsClass') || tjsModes.includes('TjsStrict')\n\n // Parse TypeScript\n const sourceFile = ts.createSourceFile(\n filename,\n source,\n ts.ScriptTarget.Latest,\n true\n )\n\n // Build annotation map from @tjs comments\n const annotationMap = emitTJS\n ? buildAnnotationMap(tjsAnnotations, sourceFile)\n : new Map<string, TjsAnnotation[]>()\n\n const tjsFunctions: string[] = []\n const seenTypeNames = new Set<string>() // Track emitted type names to avoid duplicates\n const metadata: Record<string, FunctionTypeInfo> = {}\n const classMetadata: Record<string, ClassTypeInfo> = {}\n\n // Track which doc comments have been emitted (by index in docComments array)\n const emittedDocComments = new Set<number>()\n\n // Helper: emit any doc comments that appear before a given source position\n const emitDocCommentsBefore = (pos: number) => {\n for (let i = 0; i < docComments.length; i++) {\n const doc = docComments[i]\n if (!emittedDocComments.has(i) && doc.index < pos) {\n tjsFunctions.push(doc.content)\n emittedDocComments.add(i)\n }\n }\n }\n\n // Build type alias and interface maps first (first pass)\n const typeAliases = new Map<string, ts.TypeNode>()\n const interfaces = new Map<string, ts.InterfaceDeclaration>()\n\n function collectTypes(node: ts.Node) {\n if (ts.isTypeAliasDeclaration(node)) {\n typeAliases.set(node.name.getText(sourceFile), node.type)\n }\n if (ts.isInterfaceDeclaration(node)) {\n const name = node.name.getText(sourceFile)\n const existing = interfaces.get(name)\n if (existing) {\n // Merge members (TS interface merging)\n const merged = ts.factory.updateInterfaceDeclaration(\n existing,\n existing.modifiers,\n existing.name,\n existing.typeParameters,\n existing.heritageClauses,\n [...existing.members, ...node.members]\n )\n interfaces.set(name, merged)\n } else {\n interfaces.set(name, node)\n }\n }\n ts.forEachChild(node, collectTypes)\n }\n collectTypes(sourceFile)\n\n // Create resolution context\n const resolutionCtx: TypeResolutionContext = {\n typeAliases,\n interfaces,\n sourceFile,\n warnings,\n resolvedCache: new Map(),\n }\n\n // Pre-scan: detect function overload groups\n // In TS, overloads are N bodyless signatures + 1 implementation with body\n const overloadGroups = new Map<\n string,\n {\n signatures: ts.FunctionDeclaration[] // body === undefined\n implementation: ts.FunctionDeclaration | null // has body\n }\n >()\n for (const stmt of sourceFile.statements) {\n if (ts.isFunctionDeclaration(stmt) && stmt.name) {\n const name = stmt.name.getText(sourceFile)\n if (!overloadGroups.has(name)) {\n overloadGroups.set(name, { signatures: [], implementation: null })\n }\n const group = overloadGroups.get(name)!\n if (stmt.body) {\n group.implementation = stmt\n } else {\n group.signatures.push(stmt)\n }\n }\n }\n // Only keep groups that actually have overloads (signatures + implementation)\n for (const [name, group] of overloadGroups) {\n if (group.signatures.length === 0 || !group.implementation) {\n overloadGroups.delete(name)\n }\n }\n\n // Walk top-level statements only (don't recurse into function bodies)\n for (const statement of sourceFile.statements) {\n let handled = false\n\n // Emit any doc comments before this statement\n if (emitTJS) {\n emitDocCommentsBefore(statement.getStart(sourceFile))\n }\n\n // Handle: function foo() {}\n if (ts.isFunctionDeclaration(statement) && statement.name) {\n const funcName = statement.name.getText(sourceFile)\n handled = true\n\n const overloadGroup = overloadGroups.get(funcName)\n\n if (overloadGroup) {\n // This function is part of an overload group\n if (!statement.body) {\n // Skip bodyless signatures \u2014 handled when we encounter the implementation\n } else {\n // Implementation: emit the entire overload group\n if (emitTJS) {\n tjsFunctions.push(\n ...emitOverloadGroup(\n overloadGroup.signatures,\n statement,\n sourceFile,\n warnings\n )\n )\n } else {\n const overloads: FunctionTypeInfo[] = []\n for (const sig of overloadGroup.signatures) {\n overloads.push(\n extractFunctionMetadata(\n sig,\n sourceFile,\n warnings,\n resolutionCtx\n )\n )\n }\n const implInfo = extractFunctionMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n implInfo.overloads = overloads\n metadata[funcName] = implInfo\n }\n }\n } else {\n // Normal (non-overloaded) function\n if (emitTJS) {\n tjsFunctions.push(\n transformFunctionToTJS(\n statement,\n sourceFile,\n undefined,\n warnings,\n true,\n resolutionCtx\n )\n )\n } else {\n metadata[funcName] = extractFunctionMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n }\n }\n }\n\n // Handle: const foo = () => {} or const foo = function() {}\n // Also handle: const x = ..., let x = ..., var x = ... (non-function)\n if (ts.isVariableStatement(statement)) {\n let hasFunctionDecl = false\n\n // Check if the variable statement itself is exported\n const varIsExported = statement.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n\n for (const decl of statement.declarationList.declarations) {\n if (\n ts.isIdentifier(decl.name) &&\n decl.initializer &&\n (ts.isArrowFunction(decl.initializer) ||\n ts.isFunctionExpression(decl.initializer))\n ) {\n hasFunctionDecl = true\n const funcName = decl.name.getText(sourceFile)\n const funcNode = decl.initializer\n\n if (emitTJS) {\n let tjsFunc = transformFunctionToTJS(\n funcNode,\n sourceFile,\n funcName,\n warnings,\n true,\n resolutionCtx\n )\n // Arrow/const functions: export is on the VariableStatement\n // Insert after any line comment or degraded comment\n if (varIsExported && !tjsFunc.includes('export ')) {\n const firstFuncLine = tjsFunc.search(/^(async\\s+)?function[\\s*]/m)\n if (firstFuncLine > 0) {\n tjsFunc =\n tjsFunc.slice(0, firstFuncLine) +\n 'export ' +\n tjsFunc.slice(firstFuncLine)\n } else {\n tjsFunc = 'export ' + tjsFunc\n }\n }\n tjsFunctions.push(tjsFunc)\n } else {\n const info = extractFunctionMetadata(\n funcNode,\n sourceFile,\n warnings,\n resolutionCtx\n )\n info.name = funcName\n metadata[funcName] = info\n }\n }\n }\n\n // If this variable statement doesn't contain function declarations,\n // transpile and preserve it (strips type annotations)\n if (!hasFunctionDecl && emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n tjsFunctions.push(transpiled.outputText.trim())\n }\n\n handled = true\n }\n\n // Handle: interface Foo { ... }\n if (ts.isInterfaceDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const typeName = statement.name.getText(sourceFile)\n const annotations = annotationMap.get(typeName)\n if (!seenTypeNames.has(typeName)) {\n seenTypeNames.add(typeName)\n // @tjs-skip \u2014 omit this declaration entirely\n if (annotations?.some((a) => a.kind === 'skip')) {\n // Skip \u2014 do not emit\n } else {\n // Use merged interface (handles declaration merging)\n const merged = interfaces.get(typeName) || statement\n const typeDecl = transformInterfaceToType(\n merged,\n sourceFile,\n warnings,\n annotations\n )\n if (typeDecl) {\n const isExported = statement.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n tjsFunctions.push(\n isExported\n ? typeDecl.replace(/^(\\/\\*[\\s\\S]*?\\*\\/\\s*)?/, '$1export ')\n : typeDecl\n )\n }\n }\n }\n }\n }\n\n // Handle: type Foo = { ... }\n if (ts.isTypeAliasDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const typeName = statement.name.getText(sourceFile)\n const annotations = annotationMap.get(typeName)\n if (!seenTypeNames.has(typeName)) {\n seenTypeNames.add(typeName)\n // @tjs-skip \u2014 omit this declaration entirely\n if (annotations?.some((a) => a.kind === 'skip')) {\n // Skip \u2014 do not emit\n } else {\n const typeDecl = transformTypeAliasToType(\n statement,\n sourceFile,\n warnings,\n annotations\n )\n if (typeDecl) {\n const isExported = statement.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n tjsFunctions.push(\n isExported\n ? typeDecl.replace(/^(\\/\\*[\\s\\S]*?\\*\\/\\s*)?/, '$1export ')\n : typeDecl\n )\n }\n }\n }\n }\n }\n\n // Handle: enum Status { Pending, Active, Done }\n if (ts.isEnumDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const enumName = statement.name.getText(sourceFile)\n const annotations = annotationMap.get(enumName)\n if (!seenTypeNames.has(enumName)) {\n seenTypeNames.add(enumName)\n if (annotations?.some((a) => a.kind === 'skip')) {\n // Skip \u2014 do not emit\n } else {\n const enumDecl = transformEnumToTJS(statement, sourceFile, warnings)\n if (enumDecl) {\n tjsFunctions.push(enumDecl)\n }\n }\n }\n }\n }\n\n // Handle: class Foo { ... }\n if (ts.isClassDeclaration(statement) && statement.name) {\n const className = statement.name.getText(sourceFile)\n handled = true\n if (emitTJS) {\n const classDecl = transformClassToTJS(\n statement,\n sourceFile,\n warnings,\n undefined,\n hasTjsClass\n )\n tjsFunctions.push(classDecl)\n } else {\n classMetadata[className] = extractClassMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n }\n }\n\n // Handle: import statements (strip type-only imports, keep value imports)\n if (ts.isImportDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n // Check if it's a type-only import\n const isTypeOnly =\n statement.importClause?.isTypeOnly ||\n (statement.importClause?.namedBindings &&\n ts.isNamedImports(statement.importClause.namedBindings) &&\n statement.importClause.namedBindings.elements.every(\n (e) => e.isTypeOnly\n ))\n\n if (!isTypeOnly) {\n // Emit import directly \u2014 don't use ts.transpileModule which\n // strips \"unused\" imports in isolation. Filter out type-only\n // specifiers manually.\n if (\n statement.importClause?.namedBindings &&\n ts.isNamedImports(statement.importClause.namedBindings)\n ) {\n const valueSpecs = statement.importClause.namedBindings.elements\n .filter((e) => !e.isTypeOnly)\n .map((e) => {\n const name = e.name.getText(sourceFile)\n const propName = e.propertyName?.getText(sourceFile)\n return propName ? `${propName} as ${name}` : name\n })\n if (valueSpecs.length > 0) {\n const modSpec = (statement.moduleSpecifier as ts.StringLiteral)\n .text\n tjsFunctions.push(\n `import { ${valueSpecs.join(', ')} } from '${modSpec}'`\n )\n }\n } else {\n // Default import, namespace import, or side-effect import\n // Emit as-is (strip types via getText which preserves structure)\n const importText = statement.getText(sourceFile)\n // Remove type annotations by running through TS\n const cleaned = importText\n .replace(/\\btype\\s+/g, '')\n .replace(/\\s*:\\s*\\w+/g, '')\n tjsFunctions.push(cleaned)\n }\n }\n }\n }\n\n // Handle: export statements\n if (ts.isExportDeclaration(statement) || ts.isExportAssignment(statement)) {\n handled = true\n if (emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n const trimmed = transpiled.outputText.trim()\n if (trimmed) {\n tjsFunctions.push(trimmed)\n }\n }\n }\n\n // Handle: expression statements (console.log(...), foo(), etc.)\n // and any other unhandled statements\n if (!handled && emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n const trimmed = transpiled.outputText.trim()\n if (trimmed) {\n tjsFunctions.push(trimmed)\n }\n }\n }\n\n if (emitTJS) {\n // Emit any remaining doc comments (after all statements)\n emitDocCommentsBefore(Infinity)\n\n // Include source file annotation and TJS mode directives\n const sourceFileName = filename || 'unknown'\n const modesLine = tjsModes.length > 0 ? tjsModes.join('\\n') + '\\n\\n' : ''\n const header = `${modesLine}/* tjs <- ${sourceFileName} */\\n\\n`\n\n // Append embedded test comments (they were extracted from original source)\n const testsSection =\n embeddedTests.length > 0 ? '\\n\\n' + embeddedTests.join('\\n\\n') : ''\n\n return {\n code: header + tjsFunctions.join('\\n\\n') + testsSection,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n }\n\n // For JS output, strip types and add metadata\n const jsOutput = ts.transpileModule(source, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n\n // Append __tjs metadata for each function\n let code = jsOutput.outputText\n for (const [funcName, info] of Object.entries(metadata)) {\n const metadataObj: Record<string, any> = {\n params: Object.fromEntries(\n Object.entries(info.params).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required, default: v.default },\n ])\n ),\n returns: info.returns ? { type: info.returns.kind } : undefined,\n }\n\n // Include type parameters (generics) if present\n if (info.typeParams) {\n metadataObj.typeParams = info.typeParams\n }\n\n const metadataStr = JSON.stringify(metadataObj, null, 2)\n code += `\\n${funcName}.__tjs = ${metadataStr};\\n`\n }\n\n // Append __tjs metadata for each class\n for (const [className, info] of Object.entries(classMetadata)) {\n const metadataObj: Record<string, any> = {\n constructor: info.constructor\n ? {\n params: Object.fromEntries(\n Object.entries(info.constructor.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required, default: v.default },\n ])\n ),\n }\n : undefined,\n methods: Object.fromEntries(\n Object.entries(info.methods ?? {}).map(([name, m]) => [\n name,\n {\n params: Object.fromEntries(\n Object.entries(m.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required },\n ])\n ),\n returns: m.returns ? { type: m.returns.kind } : undefined,\n },\n ])\n ),\n staticMethods: Object.fromEntries(\n Object.entries(info.staticMethods ?? {}).map(([name, m]) => [\n name,\n {\n params: Object.fromEntries(\n Object.entries(m.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required },\n ])\n ),\n returns: m.returns ? { type: m.returns.kind } : undefined,\n },\n ])\n ),\n }\n\n if (info.typeParams) {\n metadataObj.typeParams = info.typeParams\n }\n\n const metadataStr = JSON.stringify(metadataObj, null, 2)\n code += `\\n${className}.__tjs = ${metadataStr};\\n`\n\n // Wrap class to make it callable without `new`\n code += `\\n${emitClassWrapper(className)}\\n`\n }\n\n return {\n code,\n types: metadata,\n classes: Object.keys(classMetadata).length > 0 ? classMetadata : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n}\n", "/**\n * TJS Runtime\n *\n * Monadic type checking at runtime:\n * - Functions validate inputs against __tjs metadata\n * - If any input is an error, pass it through (no work)\n * - Type mismatches return error objects\n * - Errors propagate through call chains\n *\n * This runtime is attached to globalThis.__tjs and shared across modules.\n */\n\nimport { validate, s } from 'tosijs-schema'\nimport { functionMetaToJSONSchema } from './json-schema'\nimport {\n Type,\n isRuntimeType,\n Union,\n Generic,\n Enum,\n FunctionPredicate,\n Nullable,\n Optional,\n TArray,\n // Built-in types\n TString,\n TNumber,\n TBoolean,\n TInteger,\n TPositiveInt,\n TNonEmptyString,\n TEmail,\n TUrl,\n TUuid,\n Timestamp,\n LegalDate,\n // Built-in generics\n TPair,\n TRecord,\n // Portable predicate helpers (future AJS builtins)\n isValidUrl,\n isValidTimestamp,\n isValidLegalDate,\n} from '../types/Type'\n\n// Re-export Type utilities for consumers\nexport {\n Type,\n isRuntimeType,\n Union,\n Generic,\n Enum,\n FunctionPredicate,\n Nullable,\n Optional,\n TArray,\n TString,\n TNumber,\n TBoolean,\n TInteger,\n TPositiveInt,\n TNonEmptyString,\n TEmail,\n TUrl,\n TUuid,\n Timestamp,\n LegalDate,\n TPair,\n TRecord,\n isValidUrl,\n isValidTimestamp,\n isValidLegalDate,\n}\n\n// Version from package.json - injected at build time or imported\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst pkg = require('../../package.json') as { version: string }\n\nexport const TJS_VERSION: string = pkg.version\n\n/**\n * Well-known symbol for custom equality.\n *\n * Any object can implement `[tjsEquals](other)` to control how `==` / `Is()`\n * compares it. Useful for Proxies that should delegate equality to their target.\n *\n * Priority: tjsEquals symbol \u2192 .Equals method \u2192 structural comparison\n */\nexport const tjsEquals: unique symbol = Symbol.for('tjs.equals')\n\n/**\n * Parse semver version string into components\n */\nfunction parseVersion(version: string): {\n major: number\n minor: number\n patch: number\n} {\n const [major = 0, minor = 0, patch = 0] = version.split('.').map(Number)\n return { major, minor, patch }\n}\n\n/**\n * Compare two version strings\n * Returns: -1 if a < b, 0 if equal, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): -1 | 0 | 1 {\n const va = parseVersion(a)\n const vb = parseVersion(b)\n\n if (va.major !== vb.major) return va.major < vb.major ? -1 : 1\n if (va.minor !== vb.minor) return va.minor < vb.minor ? -1 : 1\n if (va.patch !== vb.patch) return va.patch < vb.patch ? -1 : 1\n return 0\n}\n\n/**\n * Check if two versions are compatible (same major version)\n */\nexport function versionsCompatible(a: string, b: string): boolean {\n const va = parseVersion(a)\n const vb = parseVersion(b)\n return va.major === vb.major\n}\n\n/**\n * MonadicError - Internal error type for monadic error propagation\n *\n * This extends Error so:\n * 1. It's a real Error with proper stack traces\n * 2. User code can't accidentally process it as data (unlike { $error: true })\n * 3. It flows through function calls via instanceof checks\n *\n * NOT exported to user code - they just see Error instances.\n */\nexport class MonadicError extends Error {\n /** Path where the error occurred, e.g., \"src/file.ts:42:greet.name\" */\n readonly path: string\n /** Expected type */\n readonly expected?: string\n /** Actual type received */\n readonly actual?: string\n /** TJS call stack (only in debug mode) - shows source locations */\n readonly callStack?: string[]\n\n constructor(\n message: string,\n path: string,\n expected?: string,\n actual?: string,\n callStack?: string[]\n ) {\n super(message)\n this.name = 'MonadicError'\n this.path = path\n this.expected = expected\n this.actual = actual\n this.callStack = callStack\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, MonadicError)\n }\n }\n}\n\n/**\n * Create a type error for inline validation\n *\n * Called ONLY when a type check fails - no overhead on happy path.\n * Returns a MonadicError that propagates through the call chain.\n * In debug mode, captures the TJS call stack with source locations.\n *\n * @param path - Location of the error, e.g., \"src/file.ts:42:greet.name\"\n * @param expected - Expected type, e.g., \"string\"\n * @param value - The actual value that failed the check\n */\nexport function typeError(\n path: string,\n expected: string,\n value: unknown\n): MonadicError {\n const actual = value === null ? 'null' : typeof value\n // Capture call stack in debug mode (getStack returns [] if not in debug mode)\n const stack = config.callStacks || config.debug ? getStack() : undefined\n const err = new MonadicError(\n `Expected ${expected} for '${path}', got ${actual}`,\n path,\n expected,\n actual,\n stack\n )\n\n // Track in error history ring buffer (zero cost on happy path)\n if (config.trackErrors !== false) {\n const size = config.maxErrors ?? ERROR_BUF_SIZE\n errorBuffer[errorHead] = err\n errorHead = (errorHead + 1) % size\n if (errorBufCount < size) errorBufCount++\n errorTotal++\n }\n\n // Log to console if configured (includes source location from path)\n if (config.logTypeErrors) {\n console.error(`[TJS TypeError] ${err.message}`)\n }\n\n // Throw instead of returning if configured (for debugging)\n if (config.throwTypeErrors) {\n throw err\n }\n\n return err\n}\n\n/**\n * Check if a value is a MonadicError (for internal use)\n */\nexport function isMonadicError(value: unknown): value is MonadicError {\n // Duck-type check instead of instanceof \u2014 works across module boundaries,\n // inline runtimes, and different copies of the MonadicError class\n return (\n value instanceof Error &&\n (value as any).name === 'MonadicError' &&\n 'path' in value\n )\n}\n\n/**\n * Error marker - identifies TJS error objects\n * @deprecated Use MonadicError instead. This interface is kept for backward compatibility.\n */\nexport interface TJSError {\n $error: true\n message: string\n /** Failure location - e.g., \"greet.name\" */\n path?: string\n /** Call stack in debug mode - e.g., [\"main\", \"processUser\", \"greet.name\"] */\n stack?: string[]\n expected?: string\n actual?: string\n cause?: Error | TJSError\n /** Source location for error reporting */\n loc?: { start: number; end: number }\n /** Multiple errors (when composing parameter errors) */\n errors?: TJSError[]\n}\n\n/**\n * Safety levels for runtime validation\n * - 'none': No validation unless explicitly forced with (?) or -?\n * - 'inputs': Validate inputs only (default) - outputs only with explicit -> or -?\n * - 'all': Validate both inputs and outputs unless explicitly skipped with (!) or -!\n */\nexport type SafetyLevel = 'none' | 'inputs' | 'all'\n\n/**\n * Runtime configuration\n */\nexport interface TJSConfig {\n /** Enable debug mode - captures call stacks in errors */\n debug?: boolean\n /** Safety level for validation (default: 'inputs') */\n safety?: SafetyLevel\n /** Require explicit return types (error if -> not specified) */\n requireReturnTypes?: boolean\n /** Track call stacks for error diagnostics (default: false).\n * Useful for server-side logging and agent debugging without devtools.\n * Uses a fixed ring buffer \u2014 no allocation pressure. */\n callStacks?: boolean\n /** Ring buffer size for call stack tracking (default: 64) */\n maxStackSize?: number\n /** Track recent type errors in a ring buffer (default: true).\n * Zero cost on happy path \u2014 only writes when an error occurs.\n * Lets you catch monadic errors that were silently ignored. */\n trackErrors?: boolean\n /** Ring buffer size for error tracking (default: 64) */\n maxErrors?: number\n /** Log type errors to console.error when they occur (default: false) */\n logTypeErrors?: boolean\n /** Throw type errors instead of returning them (default: false).\n * Useful for debugging \u2014 makes type errors impossible to ignore. */\n throwTypeErrors?: boolean\n}\n\n/** Default configuration values */\nconst DEFAULT_CONFIG: TJSConfig = {\n debug: false,\n safety: 'inputs',\n requireReturnTypes: false,\n callStacks: false,\n maxStackSize: 64,\n trackErrors: true,\n maxErrors: 64,\n}\n\n/** Current runtime configuration */\nlet config: TJSConfig = { ...DEFAULT_CONFIG }\n\n/** Ring buffer for call stack tracking \u2014 fixed size, zero allocation */\nconst STACK_SIZE = 64\nconst callStackBuffer: string[] = new Array(STACK_SIZE).fill('')\nlet callStackHead = 0\nlet callStackCount = 0\n\n/** Ring buffer for error history \u2014 zero cost on happy path */\nconst ERROR_BUF_SIZE = 64\nconst errorBuffer: any[] = new Array(ERROR_BUF_SIZE).fill(null)\nlet errorHead = 0\nlet errorBufCount = 0\nlet errorTotal = 0\n\n/** Unsafe mode depth - when > 0, skip validation in wrap() */\nlet unsafeDepth = 0\n\n/**\n * Enter unsafe mode - disables validation for all wrapped function calls\n * Can be nested (uses depth counter)\n */\nexport function enterUnsafe(): void {\n unsafeDepth++\n}\n\n/**\n * Exit unsafe mode - re-enables validation when depth returns to 0\n */\nexport function exitUnsafe(): void {\n if (unsafeDepth > 0) unsafeDepth--\n}\n\n/**\n * Check if currently in unsafe mode\n */\nexport function isUnsafeMode(): boolean {\n return unsafeDepth > 0\n}\n\n/**\n * Configure TJS runtime\n */\nexport function configure(options: TJSConfig): void {\n config = { ...config, ...options }\n}\n\n/**\n * Get current configuration\n */\nexport function getConfig(): TJSConfig {\n return { ...config }\n}\n\n/**\n * Push a function onto the call stack ring buffer.\n * Only tracks when callStacks or debug is enabled.\n * O(1), no allocation.\n */\nexport function pushStack(name: string): void {\n if ((config.callStacks || config.debug) && name) {\n const size = config.maxStackSize ?? STACK_SIZE\n callStackBuffer[callStackHead] = name\n callStackHead = (callStackHead + 1) % size\n if (callStackCount < size) callStackCount++\n }\n}\n\n/**\n * Pop a function from the call stack ring buffer.\n * O(1), no allocation.\n */\nexport function popStack(): void {\n if ((config.callStacks || config.debug) && callStackCount > 0) {\n const size = config.maxStackSize ?? STACK_SIZE\n callStackHead = (callStackHead - 1 + size) % size\n callStackCount--\n }\n}\n\n/**\n * Get current call stack snapshot (most recent entries, newest last)\n */\nexport function getStack(): string[] {\n if (callStackCount === 0) return []\n const size = config.maxStackSize ?? STACK_SIZE\n const result: string[] = []\n const start = (callStackHead - callStackCount + size) % size\n for (let i = 0; i < callStackCount; i++) {\n result.push(callStackBuffer[(start + i) % size])\n }\n return result\n}\n\n/**\n * Get recent type errors (newest last).\n * Only tracks when trackErrors is enabled (default: true).\n */\nexport function errors(): MonadicError[] {\n if (config.trackErrors === false || errorBufCount === 0) return []\n const size = config.maxErrors ?? ERROR_BUF_SIZE\n const result: MonadicError[] = []\n const start = (errorHead - errorBufCount + size) % size\n for (let i = 0; i < errorBufCount; i++) {\n result.push(errorBuffer[(start + i) % size])\n }\n return result\n}\n\n/**\n * Clear error history. Returns the cleared errors.\n */\nexport function clearErrors(): MonadicError[] {\n const cleared = errors()\n errorHead = 0\n errorBufCount = 0\n errorTotal = 0\n return cleared\n}\n\n/**\n * Total error count since last clear (may exceed buffer size).\n */\nexport function getErrorCount(): number {\n return errorTotal\n}\n\n/**\n * Reset runtime state to defaults\n *\n * Resets: config, callStack, errors, unsafeDepth\n * Use this in test teardown to prevent state leaking between tests.\n */\nexport function resetRuntime(): void {\n config = { ...DEFAULT_CONFIG }\n callStackHead = 0\n callStackCount = 0\n errorHead = 0\n errorBufCount = 0\n errorTotal = 0\n unsafeDepth = 0\n}\n\n/**\n * Structural equality - the == that works\n *\n * Rules:\n * 1. If left has [tjsEquals], call left[tjsEquals](right)\n * 2. If right has [tjsEquals], call right[tjsEquals](left)\n * 3. If left has .Equals, call left.Equals(right)\n * 4. If right has .Equals, call right.Equals(left)\n * 5. Arrays/objects: recursive structural comparison\n * 6. Primitives: strict equality (no coercion)\n *\n * Usage: `a Is b` transforms to `Is(a, b)`\n */\nexport function Is(a: unknown, b: unknown): boolean {\n // Check for [tjsEquals] symbol protocol (highest priority)\n if (\n a !== null &&\n typeof a === 'object' &&\n typeof (a as any)[tjsEquals] === 'function'\n ) {\n return (a as any)[tjsEquals](b)\n }\n if (\n b !== null &&\n typeof b === 'object' &&\n typeof (b as any)[tjsEquals] === 'function'\n ) {\n return (b as any)[tjsEquals](a)\n }\n\n // Check for .Equals method (backward compat)\n if (\n a !== null &&\n typeof a === 'object' &&\n typeof (a as any).Equals === 'function'\n ) {\n return (a as any).Equals(b)\n }\n if (\n b !== null &&\n typeof b === 'object' &&\n typeof (b as any).Equals === 'function'\n ) {\n return (b as any).Equals(a)\n }\n\n // Unwrap boxed primitives (new String, new Number, new Boolean)\n // so structural equality honors the intent: new String('foo') == 'foo'\n if (a instanceof String || a instanceof Number || a instanceof Boolean) {\n a = a.valueOf()\n }\n if (b instanceof String || b instanceof Number || b instanceof Boolean) {\n b = b.valueOf()\n }\n\n // Identical references or primitives\n if (a === b) return true\n\n // NaN === NaN (JS gets this wrong)\n if (\n typeof a === 'number' &&\n typeof b === 'number' &&\n isNaN(a as number) &&\n isNaN(b as number)\n ) {\n return true\n }\n\n // null and undefined are equal to each other (nullish equality)\n // This preserves the useful JS pattern: x == null checks for both\n if ((a === null || a === undefined) && (b === null || b === undefined)) {\n return true\n }\n\n // If only one is nullish, not equal\n if (a === null || a === undefined || b === null || b === undefined) {\n return false\n }\n\n // Different types - not equal (no coercion)\n if (typeof a !== typeof b) return false\n\n // Primitives that aren't === are not equal\n if (typeof a !== 'object') return false\n\n // Sets \u2014 order-independent element equality\n if (a instanceof Set && b instanceof Set) {\n if ((a as Set<unknown>).size !== (b as Set<unknown>).size) return false\n for (const v of a as Set<unknown>) {\n if (!(b as Set<unknown>).has(v)) return false\n }\n return true\n }\n\n // Maps \u2014 key-value structural equality\n if (a instanceof Map && b instanceof Map) {\n if ((a as Map<unknown, unknown>).size !== (b as Map<unknown, unknown>).size)\n return false\n for (const [k, v] of a as Map<unknown, unknown>) {\n if (!(b as Map<unknown, unknown>).has(k)) return false\n if (!Is(v, (b as Map<unknown, unknown>).get(k))) return false\n }\n return true\n }\n\n // Dates \u2014 compare timestamps\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n\n // RegExps \u2014 compare string representation\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.toString() === b.toString()\n }\n\n // Arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => Is(v, b[i]))\n }\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\n // Objects - structural comparison\n const keysA = Object.keys(a as object)\n const keysB = Object.keys(b as object)\n if (keysA.length !== keysB.length) return false\n return keysA.every((k) => Is((a as any)[k], (b as any)[k]))\n}\n\n/**\n * Structural inequality - the != that works\n *\n * Usage: `a IsNot b` transforms to `IsNot(a, b)`\n */\nexport function IsNot(a: unknown, b: unknown): boolean {\n return !Is(a, b)\n}\n\n/**\n * Honest equality \u2014 what == should have been.\n *\n * Like === but fixes the two remaining footguns:\n * 1. Unwraps boxed primitives: new String('foo') Eq 'foo' \u2192 true\n * 2. Nullish equality: null Eq undefined \u2192 true\n *\n * Does NOT do deep structural comparison on objects/arrays (that's O(n)).\n * Use Is/IsNot for explicit structural comparison when you need it.\n *\n * Usage: `a == b` with TjsEquals transforms to `Eq(a, b)`\n */\n\n/**\n * Honest typeof \u2014 fixes `typeof null === 'object'`\n *\n * Returns `'null'` for null instead of `'object'`.\n * All other values return the same as standard typeof.\n *\n * Usage: `typeof x` with TjsEquals transforms to `TypeOf(x)`\n */\nexport function TypeOf(value: unknown): string {\n if (value === null) return 'null'\n return typeof value\n}\n\nexport function Eq(a: unknown, b: unknown): boolean {\n // Unwrap boxed primitives\n if (a instanceof String || a instanceof Number || a instanceof Boolean) {\n a = a.valueOf()\n }\n if (b instanceof String || b instanceof Number || b instanceof Boolean) {\n b = b.valueOf()\n }\n\n // Identical references or primitives\n if (a === b) return true\n\n // NaN === NaN (JS gets this wrong)\n if (\n typeof a === 'number' &&\n typeof b === 'number' &&\n isNaN(a as number) &&\n isNaN(b as number)\n ) {\n return true\n }\n\n // null and undefined are equal to each other\n if ((a === null || a === undefined) && (b === null || b === undefined)) {\n return true\n }\n\n return false\n}\n\n/**\n * Honest inequality \u2014 what != should have been.\n *\n * Usage: `a != b` with TjsEquals transforms to `NotEq(a, b)`\n */\nexport function NotEq(a: unknown, b: unknown): boolean {\n return !Eq(a, b)\n}\n\n/**\n * Check if a value is a TJS error\n */\nexport function isError(value: unknown): value is TJSError {\n return (\n value !== null &&\n typeof value === 'object' &&\n (value as any).$error === true\n )\n}\n\n/**\n * Create a TJS error\n * In debug mode, captures the current call stack\n */\nexport function error(\n message: string,\n details?: Partial<Omit<TJSError, '$error' | 'message'>>\n): TJSError {\n const err: TJSError = {\n $error: true,\n message,\n ...details,\n }\n\n // Capture call stack when tracking is enabled\n if ((config.callStacks || config.debug) && callStackCount > 0) {\n const currentStack = getStack()\n const fullStack = details?.path\n ? [...currentStack, details.path]\n : currentStack\n err.stack = fullStack\n }\n\n return err\n}\n\n/**\n * Compose multiple errors into a single error\n * Used when multiple parameters have errors\n */\nexport function composeErrors(errors: TJSError[], funcName?: string): TJSError {\n if (errors.length === 0) {\n return error('Unknown error')\n }\n if (errors.length === 1) {\n return errors[0]\n }\n\n // Build a message listing all failed parameters\n const paramNames = errors\n .map((e) => {\n // Extract param name from path (e.g., \"func.paramName\" -> \"paramName\")\n if (e.path) {\n const parts = e.path.split('.')\n return parts[parts.length - 1]\n }\n return 'unknown'\n })\n .join(', ')\n\n const message = `Multiple parameter errors in ${\n funcName || 'function'\n }: ${paramNames}`\n\n return error(message, {\n path: funcName,\n errors,\n })\n}\n\n/**\n * Get the type of a value\n *\n * Enhanced typeof that handles:\n * - null (returns 'null' not 'object')\n * - undefined (returns 'undefined')\n * - arrays (returns 'array' not 'object')\n * - native/platform types (returns constructor name for objects)\n *\n * For objects, returns the constructor name which enables pragmatic\n * native type checking (e.g., 'HTMLElement', 'Buffer', 'Event')\n */\nexport function typeOf(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (Array.isArray(value)) return 'array'\n\n const t = typeof value\n if (t !== 'object') return t\n\n // For objects, return constructor name for pragmatic native type checking\n // This enables checking for HTMLElement, Buffer, Event, etc.\n const constructorName = (value as object).constructor?.name\n if (constructorName && constructorName !== 'Object') {\n return constructorName\n }\n\n return 'object'\n}\n\n/**\n * Check if a value is an instance of a native/platform type by constructor name\n *\n * This enables pragmatic native type checking without shipping type definitions:\n * - isNativeType(el, 'HTMLElement') - DOM element check\n * - isNativeType(buf, 'Buffer') - Node.js Buffer check\n * - isNativeType(evt, 'Event') - DOM Event check\n * - isNativeType(map, 'Map') - Map instance check\n *\n * @param value - The value to check\n * @param typeName - The constructor name to match (e.g., 'HTMLElement', 'Buffer')\n * @returns true if value's constructor.name matches or is in prototype chain\n */\nexport function isNativeType(value: unknown, typeName: string): boolean {\n if (value === null || value === undefined) return false\n if (typeof value !== 'object' && typeof value !== 'function') return false\n\n // Check constructor name\n let proto = value\n while (proto !== null) {\n const constructorName = (proto as object).constructor?.name\n if (constructorName === typeName) return true\n proto = Object.getPrototypeOf(proto)\n }\n\n return false\n}\n\n/**\n * Check if a value matches an expected type\n *\n * @param value - The value to check\n * @param expected - Either a string type name ('string', 'number', etc.)\n * or a RuntimeType instance with .check() method\n * @param path - Optional path for error messages\n */\nexport function checkType(\n value: unknown,\n expected: string | { check: (v: unknown) => boolean; description: string },\n path?: string\n): TJSError | null {\n // If value is already an error, propagate it\n if (isError(value)) return value\n\n // Handle RuntimeType instances (Type() results)\n if (\n typeof expected === 'object' &&\n expected !== null &&\n 'check' in expected\n ) {\n if (expected.check(value)) return null\n return error(`Expected ${expected.description} but got ${typeOf(value)}`, {\n path,\n expected: expected.description,\n actual: typeOf(value),\n })\n }\n\n const actual = typeOf(value)\n\n // Handle special cases\n if (expected === 'any') return null\n if (expected === actual) return null\n\n // Number accepts both number types\n if (expected === 'number' && actual === 'number') return null\n if (expected === 'integer' && actual === 'number' && Number.isInteger(value))\n return null\n if (\n expected === 'non-negative-integer' &&\n actual === 'number' &&\n Number.isInteger(value) &&\n (value as number) >= 0\n )\n return null\n\n // Object matching (basic)\n if (expected === 'object' && actual === 'object') return null\n\n return error(`Expected ${expected} but got ${actual}`, {\n path,\n expected,\n actual,\n })\n}\n\n/** Type specifier - either a string name or a RuntimeType */\ntype TypeSpec = string | { check: (v: unknown) => boolean; description: string }\n\n/** Parameter metadata with optional location */\ninterface ParamMeta {\n type: TypeSpec\n required: boolean\n default?: unknown\n loc?: { start: number; end: number }\n}\n\n/**\n * Validate function arguments against __tjs metadata\n * Returns first error found, or null if all valid\n */\nexport function validateArgs(\n args: Record<string, unknown>,\n meta: {\n params: Record<string, ParamMeta>\n },\n funcName?: string\n): TJSError | null {\n for (const [name, param] of Object.entries(meta.params)) {\n const value = args[name]\n\n // Check if any arg is already an error - propagate first one\n if (isError(value)) return value\n\n // Check required\n if (param.required && value === undefined) {\n const expectedDesc =\n typeof param.type === 'string' ? param.type : param.type.description\n return error(`Missing required parameter '${name}'`, {\n path: funcName ? `${funcName}.${name}` : name,\n expected: expectedDesc,\n actual: 'undefined',\n loc: param.loc,\n })\n }\n\n // Skip type check for undefined optional params\n if (value === undefined) continue\n\n // Type check\n const typeError = checkType(\n value,\n param.type,\n funcName ? `${funcName}.${name}` : name\n )\n if (typeError) {\n // Add location info if available\n if (param.loc) {\n typeError.loc = param.loc\n }\n return typeError\n }\n }\n\n return null\n}\n\n/**\n * Function metadata with safety flags\n */\nexport interface FunctionMeta {\n params: Record<string, any>\n returns?: { type: any; safe?: boolean; defaults?: Record<string, unknown> }\n /** Function marked with (!) - never validate inputs */\n unsafe?: boolean\n /** Function marked with (?) - always validate inputs */\n safe?: boolean\n /** Return type marked with -! - never validate output */\n unsafeReturn?: boolean\n /** Return type marked with -? - always validate output */\n safeReturn?: boolean\n /** Explicit function name for stack tracking (used when fn.name is empty) */\n name?: string\n /** Polymorphic dispatcher \u2014 skip wrapping, dispatch handles validation */\n polymorphic?: boolean\n}\n\n/**\n * Determine if we should validate inputs for this call\n * Reserved for future use with runtime validation modes\n */\nfunction _shouldValidateInputs(meta: FunctionMeta): boolean {\n // Per-function flags take precedence\n if (meta.unsafe) return false\n if (meta.safe) return true\n\n // Block-level override\n if (unsafeDepth > 0) return false\n\n // Global safety level\n return config.safety !== 'none'\n}\n\n/**\n * Determine if we should validate outputs for this call\n * Reserved for future use with runtime validation modes\n */\nfunction _shouldValidateOutputs(meta: FunctionMeta): boolean {\n // No return type declared = no validation\n if (!meta.returns) return false\n\n // Per-function return flags take precedence\n if (meta.unsafeReturn) return false\n if (meta.safeReturn) return true\n\n // Block-level override\n if (unsafeDepth > 0) return false\n\n // Global safety level: 'all' validates outputs, others don't by default\n return config.safety === 'all'\n}\n\n/**\n * Wrap a function with monadic type checking\n *\n * @param fn - The original function\n * @param meta - The __tjs metadata\n * @returns Wrapped function that validates inputs and propagates errors\n */\nexport function wrap<T extends (...args: any[]) => any>(\n fn: T,\n meta: FunctionMeta\n): T {\n // Always attach metadata for introspection/autocomplete\n ;(fn as any).__tjs = meta\n // Lazy JSON Schema generation \u2014 only computed when called\n ;(fn as any).__tjs.schema = () => functionMetaToJSONSchema(meta)\n\n // Determine if we need a wrapper at all\n // Polymorphic dispatchers handle their own routing \u2014 no wrapping needed\n const needsWrapper =\n !meta.polymorphic && // Has forced safety that requires validation\n (meta.safe ||\n meta.safeReturn ||\n // Global safety requires validation (and not explicitly unsafe)\n (config.safety !== 'none' && !meta.unsafe) ||\n // Has return type that might need validation\n (meta.returns && config.safety === 'all' && !meta.unsafeReturn))\n\n if (!needsWrapper) {\n return fn\n }\n\n // Pre-compute flags at wrap time\n const hasReturns = !!meta.returns\n const metaUnsafe = !!meta.unsafe\n const metaSafe = !!meta.safe\n const metaUnsafeReturn = !!meta.unsafeReturn\n const metaSafeReturn = !!meta.safeReturn\n // Pre-compute return defaults (for `key = value` in return type signatures)\n // NOTE: applying defaults adds an Object.assign per call \u2014 may need benchmarking\n const returnDefaults = meta.returns?.defaults\n const paramEntries = Object.entries(meta.params)\n const paramCount = paramEntries.length\n // Use meta.name as fallback when fn.name is empty (anonymous functions)\n const funcName = fn.name || meta.name || 'anonymous'\n\n const wrapped = function (this: any, ...args: Parameters<T>): ReturnType<T> {\n // Fast path: inside unsafe block, skip all validation\n if (unsafeDepth > 0) {\n return fn.apply(this, args)\n }\n\n // Compute validation flags\n const validateInputs = metaSafe || (!metaUnsafe && config.safety !== 'none')\n const validateOutputs =\n hasReturns &&\n (metaSafeReturn || (!metaUnsafeReturn && config.safety === 'all'))\n\n // Fast path: no validation needed\n if (!validateInputs && !validateOutputs) {\n return fn.apply(this, args)\n }\n\n // Fast path: check for error as first arg\n if (args.length > 0 && isError(args[0])) {\n return args[0] as ReturnType<T>\n }\n\n // Input validation\n if (validateInputs) {\n // Detect if single object arg (named params) vs positional\n const isNamedCall =\n args.length === 1 &&\n typeof args[0] === 'object' &&\n args[0] !== null &&\n !Array.isArray(args[0])\n\n // Collect all errors to compose them\n const collectedErrors: TJSError[] = []\n\n // Fast positional validation (avoids object allocation)\n if (!isNamedCall) {\n for (let i = 0; i < paramCount; i++) {\n const [name, param] = paramEntries[i]\n const value = args[i]\n\n // Check for error propagation (passed-in errors)\n if (isError(value)) {\n collectedErrors.push(value)\n continue\n }\n\n // Check required\n if (param.required && value === undefined) {\n collectedErrors.push(\n error(`Missing required parameter '${name}'`, {\n path: `${funcName}.${name}`,\n expected:\n typeof param.type === 'string'\n ? param.type\n : param.type?.description || 'value',\n actual: 'undefined',\n loc: param.loc,\n })\n )\n continue\n }\n\n // Type check (skip undefined optional)\n if (value !== undefined) {\n const typeErr = checkType(value, param.type, `${funcName}.${name}`)\n if (typeErr) {\n if (param.loc) typeErr.loc = param.loc\n collectedErrors.push(typeErr)\n }\n }\n }\n } else {\n // Named args path (slower, but supports object destructuring)\n const namedArgs = args[0] as Record<string, unknown>\n for (let i = 0; i < paramCount; i++) {\n const [name, param] = paramEntries[i]\n const value = namedArgs[name]\n\n if (isError(value)) {\n collectedErrors.push(value)\n continue\n }\n\n if (param.required && value === undefined) {\n collectedErrors.push(\n error(`Missing required parameter '${name}'`, {\n path: `${funcName}.${name}`,\n expected:\n typeof param.type === 'string'\n ? param.type\n : param.type?.description || 'value',\n actual: 'undefined',\n loc: param.loc,\n })\n )\n continue\n }\n\n if (value !== undefined) {\n const typeErr = checkType(value, param.type, `${funcName}.${name}`)\n if (typeErr) {\n if (param.loc) typeErr.loc = param.loc\n collectedErrors.push(typeErr)\n }\n }\n }\n }\n\n // If we collected any errors, compose and return them\n if (collectedErrors.length > 0) {\n return composeErrors(collectedErrors, funcName) as ReturnType<T>\n }\n }\n\n // Track call stack only when enabled (ring buffer, no allocation)\n const trackStack = config.callStacks || config.debug\n if (trackStack) pushStack(funcName)\n\n try {\n // Execute function\n const result = fn.apply(this, args)\n\n // Output validation\n if (validateOutputs && meta.returns && !isError(result)) {\n // Apply return defaults before validation\n const validated =\n returnDefaults && typeof result === 'object' && result !== null\n ? Object.assign({}, returnDefaults, result)\n : result\n const returnError = checkType(\n validated,\n meta.returns.type,\n `${funcName}()`\n )\n if (returnError) {\n if (trackStack) popStack()\n return returnError as ReturnType<T>\n }\n }\n\n if (trackStack) popStack()\n return result\n } catch (e) {\n if (trackStack) popStack()\n // Convert thrown errors to TJS errors\n return error((e as Error).message || String(e), {\n path: funcName,\n cause: e as Error,\n }) as ReturnType<T>\n }\n }\n\n // Preserve function name and metadata\n Object.defineProperty(wrapped, 'name', { value: fn.name })\n ;(wrapped as any).__tjs = meta\n ;(wrapped as any).__tjs.schema = () => functionMetaToJSONSchema(meta)\n\n return wrapped as T\n}\n\n/**\n * Wrap a class to make it callable without `new`\n *\n * In TJS, classes can be instantiated without the `new` keyword:\n * const obj = MyClass(args) // equivalent to new MyClass(args)\n *\n * This eliminates a common source of errors where developers forget `new`.\n * Using explicit `new` still works but should be flagged by the linter.\n */\nexport function wrapClass<T extends new (...args: any[]) => any>(\n cls: T\n): T & ((...args: ConstructorParameters<T>) => InstanceType<T>) {\n // Use a Proxy to intercept both `new Wrapper()` and `Wrapper()` calls\n const wrapped = new Proxy(cls, {\n // Called when using `new Wrapper(...)`\n construct(target, args, newTarget) {\n return Reflect.construct(target, args, newTarget)\n },\n // Called when using `Wrapper(...)` without new\n apply(target, _thisArg, args) {\n return Reflect.construct(target, args)\n },\n })\n\n // Preserve class name\n Object.defineProperty(wrapped, 'name', { value: cls.name })\n\n // Copy static properties and methods\n for (const key of Object.getOwnPropertyNames(cls)) {\n if (key !== 'length' && key !== 'name' && key !== 'prototype') {\n Object.defineProperty(\n wrapped,\n key,\n Object.getOwnPropertyDescriptor(cls, key)!\n )\n }\n }\n\n return wrapped as T & ((...args: ConstructorParameters<T>) => InstanceType<T>)\n}\n\n// ============================================================================\n// SafeFunction and Eval - moved to ./eval.ts\n// ============================================================================\n//\n// Eval and SafeFunction are in a separate module to keep the runtime lite.\n// Import from 'tjs-lang/eval' when you need dynamic code execution.\n//\n// Runtime (this file): ~5KB gzipped - type checking, Is/IsNot, wrap, etc.\n// Eval module: ~27KB gzipped - adds transpiler + VM for dynamic code\n// ============================================================================\n\n/**\n * Create an isolated TJS runtime instance\n *\n * Each call returns a fresh runtime with its own:\n * - config (debug, safety, etc.)\n * - callStack\n * - unsafeDepth\n *\n * The new instance inherits the current global config at creation time,\n * but subsequent changes are isolated.\n *\n * Use this to prevent state leaking between transpiled modules.\n */\nexport function createRuntime() {\n // Per-instance state - inherit current global config\n let instanceConfig: TJSConfig = { ...config }\n const instStackSize = instanceConfig.maxStackSize ?? STACK_SIZE\n const instanceStackBuffer: string[] = new Array(instStackSize).fill('')\n let instanceStackHead = 0\n let instanceStackCount = 0\n const instErrorSize = instanceConfig.maxErrors ?? ERROR_BUF_SIZE\n const instanceErrorBuffer: any[] = new Array(instErrorSize).fill(null)\n let instanceErrorHead = 0\n let instanceErrorBufCount = 0\n let instanceErrorTotal = 0\n let instanceUnsafeDepth = 0\n\n // Per-instance stateful functions\n function instanceConfigure(options: TJSConfig): void {\n instanceConfig = { ...instanceConfig, ...options }\n }\n\n function instanceGetConfig(): TJSConfig {\n return { ...instanceConfig }\n }\n\n function instancePushStack(name: string): void {\n if ((instanceConfig.callStacks || instanceConfig.debug) && name) {\n instanceStackBuffer[instanceStackHead] = name\n instanceStackHead = (instanceStackHead + 1) % instStackSize\n if (instanceStackCount < instStackSize) instanceStackCount++\n }\n }\n\n function instancePopStack(): void {\n if (\n (instanceConfig.callStacks || instanceConfig.debug) &&\n instanceStackCount > 0\n ) {\n instanceStackHead =\n (instanceStackHead - 1 + instStackSize) % instStackSize\n instanceStackCount--\n }\n }\n\n function instanceGetStack(): string[] {\n if (instanceStackCount === 0) return []\n const result: string[] = []\n const start =\n (instanceStackHead - instanceStackCount + instStackSize) % instStackSize\n for (let i = 0; i < instanceStackCount; i++) {\n result.push(instanceStackBuffer[(start + i) % instStackSize])\n }\n return result\n }\n\n function instanceResetRuntime(): void {\n instanceConfig = { ...DEFAULT_CONFIG }\n instanceStackHead = 0\n instanceStackCount = 0\n instanceErrorHead = 0\n instanceErrorBufCount = 0\n instanceErrorTotal = 0\n instanceUnsafeDepth = 0\n }\n\n function instanceEnterUnsafe(): void {\n instanceUnsafeDepth++\n }\n\n function instanceExitUnsafe(): void {\n if (instanceUnsafeDepth > 0) instanceUnsafeDepth--\n }\n\n function instanceIsUnsafeMode(): boolean {\n return instanceUnsafeDepth > 0\n }\n\n // Extension registry: typeName -> methodName -> fn\n const extensionRegistry = new Map<\n string,\n Map<string, (...args: any[]) => any>\n >()\n\n function instanceRegisterExtension(\n typeName: string,\n methodName: string,\n fn: (...args: any[]) => any\n ): void {\n if (!extensionRegistry.has(typeName)) {\n extensionRegistry.set(typeName, new Map())\n }\n extensionRegistry.get(typeName)!.set(methodName, fn)\n }\n\n function instanceResolveExtension(\n value: unknown,\n methodName: string\n ): ((...args: any[]) => any) | undefined {\n // Determine type name from value\n const t = typeof value\n let typeName: string\n if (value === null || value === undefined) return undefined\n if (t === 'string') typeName = 'String'\n else if (t === 'number') typeName = 'Number'\n else if (t === 'boolean') typeName = 'Boolean'\n else if (Array.isArray(value)) typeName = 'Array'\n else if (t === 'object') {\n // Check constructor name for class instances (including DOM classes)\n typeName = (value as any).constructor?.name || 'Object'\n } else {\n return undefined\n }\n\n // Walk prototype chain: HTMLInputElement -> HTMLElement -> Element -> Object\n let current: string | undefined = typeName\n while (current) {\n const methods = extensionRegistry.get(current)\n if (methods?.has(methodName)) {\n return methods.get(methodName)\n }\n // Walk up: try parent class (for DOM/custom class hierarchies)\n if (t === 'object' && !Array.isArray(value)) {\n const proto = Object.getPrototypeOf(\n current === typeName ? value : Object.getPrototypeOf(value)\n )\n current = proto?.constructor?.name\n if (current === 'Object' || current === typeName) break\n } else {\n break\n }\n }\n\n // Fallback: check 'Object' extensions\n const objectMethods = extensionRegistry.get('Object')\n if (objectMethods?.has(methodName)) {\n return objectMethods.get(methodName)\n }\n\n return undefined\n }\n\n function instanceTypeError(\n path: string,\n expected: string,\n value: unknown\n ): MonadicError {\n const actual = value === null ? 'null' : typeof value\n const stack =\n instanceConfig.callStacks || instanceConfig.debug\n ? instanceGetStack()\n : undefined\n const err = new MonadicError(\n `Expected ${expected} for '${path}', got ${actual}`,\n path,\n expected,\n actual,\n stack\n )\n\n // Track in error history\n if (instanceConfig.trackErrors !== false) {\n instanceErrorBuffer[instanceErrorHead] = err\n instanceErrorHead = (instanceErrorHead + 1) % instErrorSize\n if (instanceErrorBufCount < instErrorSize) instanceErrorBufCount++\n instanceErrorTotal++\n }\n\n if (instanceConfig.logTypeErrors) {\n console.error(`[TJS TypeError] ${err.message}`)\n }\n if (instanceConfig.throwTypeErrors) {\n throw err\n }\n\n return err\n }\n\n function instanceErrors(): MonadicError[] {\n if (instanceConfig.trackErrors === false || instanceErrorBufCount === 0)\n return []\n const result: MonadicError[] = []\n const start =\n (instanceErrorHead - instanceErrorBufCount + instErrorSize) %\n instErrorSize\n for (let i = 0; i < instanceErrorBufCount; i++) {\n result.push(instanceErrorBuffer[(start + i) % instErrorSize])\n }\n return result\n }\n\n function instanceClearErrors(): MonadicError[] {\n const cleared = instanceErrors()\n instanceErrorHead = 0\n instanceErrorBufCount = 0\n instanceErrorTotal = 0\n return cleared\n }\n\n function instanceGetErrorCount(): number {\n return instanceErrorTotal\n }\n\n function instanceError(\n message: string,\n details?: Partial<Omit<TJSError, '$error' | 'message'>>\n ): TJSError {\n const err: TJSError = {\n $error: true,\n message,\n ...details,\n }\n if (\n (instanceConfig.callStacks || instanceConfig.debug) &&\n instanceStackCount > 0\n ) {\n const fullStack = details?.path\n ? [...instanceGetStack(), details.path]\n : instanceGetStack()\n err.stack = fullStack\n }\n return err\n }\n\n /**\n * Bang access (!.) \u2014 asserted non-null member access.\n * Returns MonadicError if obj is null, undefined, or already a MonadicError.\n * Otherwise returns obj[prop] (bare access \u2014 throws as usual on other errors).\n */\n function instanceBang(obj: unknown, prop: string): unknown {\n if (obj === null || obj === undefined) {\n return instanceTypeError(`bang.${prop}`, 'non-null', obj)\n }\n if (isMonadicError(obj)) return obj\n return (obj as any)[prop]\n }\n\n return {\n version: TJS_VERSION,\n // Monadic error handling\n MonadicError,\n typeError: instanceTypeError,\n isMonadicError,\n // Bang access (!.)\n bang: instanceBang,\n // Legacy error handling\n isError,\n error: instanceError,\n composeErrors,\n typeOf,\n isNativeType,\n checkType,\n validateArgs,\n wrap,\n wrapClass,\n compareVersions,\n versionsCompatible,\n // Create child runtime instances\n createRuntime,\n // Debug mode (instance-specific)\n configure: instanceConfigure,\n getConfig: instanceGetConfig,\n pushStack: instancePushStack,\n popStack: instancePopStack,\n getStack: instanceGetStack,\n errors: instanceErrors,\n clearErrors: instanceClearErrors,\n getErrorCount: instanceGetErrorCount,\n resetRuntime: instanceResetRuntime,\n // Unsafe mode (instance-specific)\n enterUnsafe: instanceEnterUnsafe,\n exitUnsafe: instanceExitUnsafe,\n isUnsafeMode: instanceIsUnsafeMode,\n // Type system\n validate,\n infer: s.infer.bind(s),\n Type,\n isRuntimeType,\n Union,\n Generic,\n Enum,\n FunctionPredicate,\n Nullable,\n Optional,\n TArray,\n TString,\n TNumber,\n TBoolean,\n TInteger,\n TPositiveInt,\n TNonEmptyString,\n TEmail,\n TUrl,\n TUuid,\n TPair,\n TRecord,\n // Structural equality\n Is,\n IsNot,\n // Honest equality (== / != with TjsEquals)\n Eq,\n NotEq,\n // Honest typeof (typeof with TjsEquals)\n TypeOf,\n tjsEquals,\n // Extensions\n registerExtension: instanceRegisterExtension,\n resolveExtension: instanceResolveExtension,\n }\n}\n\n/** Type for runtime instances */\nexport type TJSRuntime = ReturnType<typeof createRuntime>\n\n/**\n * TJS Runtime object - attached to globalThis.__tjs\n *\n * NOTE: This is a shared global instance. For isolated execution,\n * use createRuntime() instead.\n */\nexport const runtime = {\n version: TJS_VERSION,\n // Monadic error handling (new)\n MonadicError,\n typeError,\n isMonadicError,\n // Legacy error handling (deprecated)\n isError,\n error,\n composeErrors,\n typeOf,\n isNativeType,\n checkType,\n validateArgs,\n wrap,\n wrapClass,\n compareVersions,\n versionsCompatible,\n // Debug mode\n configure,\n getConfig,\n pushStack,\n popStack,\n getStack,\n errors,\n clearErrors,\n getErrorCount,\n resetRuntime,\n // Unsafe mode\n enterUnsafe,\n exitUnsafe,\n isUnsafeMode,\n // Factory for isolated instances\n createRuntime,\n // Type system (used by transpiled Type declarations)\n validate,\n infer: s.infer.bind(s),\n Type,\n isRuntimeType,\n Union,\n Generic,\n Enum,\n FunctionPredicate,\n Nullable,\n Optional,\n TArray,\n // Built-in types\n TString,\n TNumber,\n TBoolean,\n TInteger,\n TPositiveInt,\n TNonEmptyString,\n TEmail,\n TUrl,\n TUuid,\n Timestamp,\n LegalDate,\n TPair,\n TRecord,\n // Structural equality (used by Is/IsNot operators)\n Is,\n IsNot,\n // Honest equality (used by == and != with TjsEquals)\n Eq,\n NotEq,\n // Honest typeof (used by typeof with TjsEquals)\n TypeOf,\n}\n\n/**\n * Install runtime globally (idempotent, version-checked)\n *\n * Version handling:\n * - Same version: reuse existing (no warning)\n * - Compatible (same major): reuse existing, log info\n * - Incompatible (different major): warn, use newer version\n */\nexport function installRuntime(): typeof runtime {\n const g = globalThis as any\n\n if (g.__tjs) {\n const existingVersion = g.__tjs.version\n\n // Guard against polluted __tjs without proper version\n if (typeof existingVersion !== 'string') {\n g.__tjs = runtime\n return runtime\n }\n\n const comparison = compareVersions(TJS_VERSION, existingVersion)\n\n if (comparison === 0) {\n // Exact same version - just reuse\n return g.__tjs\n }\n\n if (versionsCompatible(TJS_VERSION, existingVersion)) {\n // Same major version - compatible, use newer\n if (comparison > 0) {\n console.info(\n `TJS runtime: upgrading ${existingVersion} \u2192 ${TJS_VERSION}`\n )\n g.__tjs = runtime\n } else {\n console.info(\n `TJS runtime: keeping ${existingVersion} (newer than ${TJS_VERSION})`\n )\n }\n } else {\n // Different major version - breaking change potential\n console.warn(\n `TJS runtime version conflict: ${existingVersion} vs ${TJS_VERSION} (major version mismatch)`\n )\n // Use the newer one but warn about potential issues\n if (comparison > 0) {\n console.warn(`Upgrading to ${TJS_VERSION} - check for breaking changes`)\n g.__tjs = runtime\n }\n }\n\n return g.__tjs\n }\n\n g.__tjs = runtime\n return runtime\n}\n\n/**\n * Generate runtime wrapper code for emitted JS\n * Skips wrapping for unsafe functions (marked with !)\n */\nexport function emitRuntimeWrapper(funcName: string): string {\n return `\n// TJS runtime wrapper (skips unsafe functions)\nif (typeof ${funcName}.__tjs === 'object' && !${funcName}.__tjs.unsafe && typeof globalThis.__tjs?.wrap === 'function') {\n ${funcName} = globalThis.__tjs.wrap(${funcName}, ${funcName}.__tjs)\n}\n`.trim()\n}\n\n/**\n * Generate class wrapper code for emitted JS\n * Makes classes callable without `new` keyword\n * Emits standalone JS - no runtime dependency\n */\nexport function emitClassWrapper(className: string): string {\n return `\n// TJS: callable without new\n${className} = new Proxy(${className}, { apply(t, _, a) { return Reflect.construct(t, a) } });\n`.trim()\n}\n\n/**\n * Questions/Notes:\n *\n * Q1: Should wrap() be automatic or opt-in?\n * Current: Must be explicitly wrapped\n * Could: Auto-wrap all functions with __tjs metadata\n *\n * Q2: Performance overhead of validation?\n * Need benchmarks comparing wrapped vs unwrapped\n * Could have 'production' mode that skips validation\n *\n * Q3: Async function handling?\n * wrap() should detect async and handle Promise returns\n *\n * Q4: Deep object validation?\n * Currently only checks top-level type\n * Could recursively validate object shapes\n */\n", "/**\n * JSON Schema generation from TJS TypeDescriptors and example values\n *\n * Converts TJS type information into standard JSON Schema (draft 2020-12).\n */\n\nimport type { TypeDescriptor } from './types'\n\nexport interface JSONSchemaObject {\n type?: string | string[]\n properties?: Record<string, JSONSchemaObject>\n items?: JSONSchemaObject | JSONSchemaObject[]\n required?: string[]\n additionalProperties?: boolean\n anyOf?: JSONSchemaObject[]\n minimum?: number\n examples?: unknown[]\n description?: string\n [key: string]: unknown\n}\n\n/**\n * Convert a TypeDescriptor to JSON Schema\n */\nexport function typeDescriptorToJSONSchema(\n td: TypeDescriptor\n): JSONSchemaObject {\n if (td.nullable) {\n const base = typeDescriptorToJSONSchema({ ...td, nullable: false })\n return { anyOf: [base, { type: 'null' }] }\n }\n\n switch (td.kind) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return { type: 'number' }\n case 'integer':\n return { type: 'integer' }\n case 'non-negative-integer':\n return { type: 'integer', minimum: 0 }\n case 'boolean':\n return { type: 'boolean' }\n case 'null':\n return { type: 'null' }\n case 'undefined':\n return {}\n case 'any':\n return {}\n case 'array':\n if (td.items) {\n return { type: 'array', items: typeDescriptorToJSONSchema(td.items) }\n }\n return { type: 'array' }\n case 'object':\n if (td.shape) {\n const properties: Record<string, JSONSchemaObject> = {}\n const required: string[] = []\n for (const [key, fieldTd] of Object.entries(td.shape)) {\n properties[key] = typeDescriptorToJSONSchema(fieldTd)\n required.push(key)\n }\n return {\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n }\n }\n return { type: 'object' }\n case 'union':\n if (td.members) {\n return { anyOf: td.members.map(typeDescriptorToJSONSchema) }\n }\n return {}\n default:\n return {}\n }\n}\n\n/**\n * Infer a JSON Schema from an example value (without going through TypeDescriptor)\n */\nexport function exampleToJSONSchema(value: unknown): JSONSchemaObject {\n if (value === null) return { type: 'null' }\n if (value === undefined) return {}\n\n switch (typeof value) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return Number.isInteger(value) ? { type: 'integer' } : { type: 'number' }\n case 'boolean':\n return { type: 'boolean' }\n case 'object': {\n if (Array.isArray(value)) {\n if (value.length === 0) return { type: 'array' }\n // Infer item type from first element\n return { type: 'array', items: exampleToJSONSchema(value[0]) }\n }\n // Object\n const properties: Record<string, JSONSchemaObject> = {}\n const required: string[] = []\n for (const [key, val] of Object.entries(\n value as Record<string, unknown>\n )) {\n properties[key] = exampleToJSONSchema(val)\n required.push(key)\n }\n return {\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n }\n }\n default:\n return {}\n }\n}\n\n/**\n * Generate JSON Schema for function parameters (as an object schema)\n * and return type from __tjs metadata\n */\nexport function functionMetaToJSONSchema(meta: {\n params: Record<string, any>\n returns?: { type: any; example?: any }\n}): { input: JSONSchemaObject; output?: JSONSchemaObject } {\n const properties: Record<string, JSONSchemaObject> = {}\n const required: string[] = []\n\n for (const [name, paramInfo] of Object.entries(meta.params)) {\n if (paramInfo?.type?.kind) {\n // Has TypeDescriptor\n properties[name] = typeDescriptorToJSONSchema(paramInfo.type)\n } else if (paramInfo?.example !== undefined) {\n // Has example value\n properties[name] = exampleToJSONSchema(paramInfo.example)\n } else {\n properties[name] = {}\n }\n if (paramInfo?.required !== false) {\n required.push(name)\n }\n if (paramInfo?.example !== undefined) {\n properties[name].examples = [paramInfo.example]\n }\n }\n\n const input: JSONSchemaObject = {\n type: 'object',\n properties,\n required,\n }\n\n let output: JSONSchemaObject | undefined\n if (meta.returns) {\n if (meta.returns.type?.kind) {\n output = typeDescriptorToJSONSchema(meta.returns.type)\n } else if (meta.returns.example !== undefined) {\n output = exampleToJSONSchema(meta.returns.example)\n }\n }\n\n return { input, output }\n}\n", "/**\n * Type() - Runtime type definitions with descriptions and validation\n *\n * Forms:\n * Type(description, predicate) - full form with custom validation\n * Type(description, schema) - schema-based validation\n * Type(schema) - schema only, self-documenting\n *\n * Usage:\n * const ZipCode = Type('5-digit US zip code', (s) => /^\\d{5}$/.test(s))\n * const Email = Type('valid email', s.string.email)\n * const Age = Type(s.number.min(0).max(150))\n *\n * ZipCode.check('12345') // true\n * ZipCode.check('abc') // false\n * ZipCode.description // '5-digit US zip code'\n */\n\nimport { validate, filter as schemaFilter, s, type Base } from 'tosijs-schema'\nimport { exampleToJSONSchema, type JSONSchemaObject } from '../lang/json-schema'\n\n/** JSON Schema object type (simplified) */\ntype JSONSchema = {\n type?: string\n properties?: Record<string, JSONSchema>\n items?: JSONSchema\n required?: string[]\n [key: string]: unknown\n}\n\n/** Schema can be a tosijs-schema builder or a raw JSON Schema object */\ntype Schema = Base<any> | JSONSchema\n\n/** A runtime type with description and validation */\nexport interface RuntimeType<T = unknown> {\n /** Human-readable description of the type */\n readonly description: string\n /** Check if a value matches this type */\n check(value: unknown): value is T\n /** The underlying schema (if schema-based) */\n readonly schema?: Schema\n /** The predicate function (if predicate-based) */\n readonly predicate?: (value: unknown) => boolean\n /** Example value (for documentation and signature testing) */\n readonly example?: T\n /** Multiple example values (from schema metadata, for autocomplete hints) */\n readonly examples?: T[]\n /** Default value (for instantiation) */\n readonly default?: T\n /** Generate JSON Schema for this type */\n toJSONSchema(): JSONSchemaObject\n /** Strip a value down to only the fields matching this type's schema */\n strip(value: unknown): unknown\n /** Brand for type identification */\n readonly __runtimeType: true\n}\n\n/** Check if a value is a RuntimeType */\nexport function isRuntimeType(value: unknown): value is RuntimeType {\n return (\n value !== null &&\n typeof value === 'object' &&\n '__runtimeType' in value &&\n (value as any).__runtimeType === true\n )\n}\n\n/**\n * Create a runtime type with description and validation\n *\n * @overload Type(description, predicate) - custom validation function\n * @overload Type(description, schema) - schema-based validation\n * @overload Type(schema) - schema only\n */\n/**\n * Check if a value is a tosijs-schema builder (has .schema property)\n */\nfunction isSchemaBuilder(value: unknown): value is Base<any> {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'schema' in value &&\n typeof (value as any).schema === 'object'\n )\n}\n\n/**\n * Check if a value looks like a raw JSON Schema object\n */\nfunction isJSONSchema(value: unknown): value is JSONSchema {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'type' in value &&\n typeof (value as any).type === 'string'\n )\n}\n\nexport function Type<T = unknown>(\n descriptionOrSchema: string | Schema,\n predicateOrSchemaOrExample?:\n | ((value: unknown) => boolean)\n | Schema\n | T\n | undefined,\n exampleArg?: T,\n defaultArg?: T\n): RuntimeType<T> {\n // Parse arguments\n let description: string\n let predicate: ((value: unknown) => boolean) | undefined\n let schema: Schema | undefined\n let example: T | undefined = exampleArg\n let defaultValue: T | undefined = defaultArg\n\n if (typeof descriptionOrSchema === 'string') {\n // Form: Type(description, predicate/schema/example, example?, default?)\n description = descriptionOrSchema\n\n if (typeof predicateOrSchemaOrExample === 'function') {\n // Type(description, predicate, example?, default?)\n predicate = predicateOrSchemaOrExample as (value: unknown) => boolean\n // If we have example, infer schema from it for the type guard in predicate\n if (example !== undefined) {\n schema = s.infer(example)\n }\n } else if (\n predicateOrSchemaOrExample === undefined &&\n example !== undefined\n ) {\n // Type(description, undefined, example, default?) - example provides schema\n schema = s.infer(example)\n } else if (isSchemaBuilder(predicateOrSchemaOrExample)) {\n // Type(description, schemaBuilder)\n schema = predicateOrSchemaOrExample\n } else if (isJSONSchema(predicateOrSchemaOrExample)) {\n // Type(description, jsonSchema)\n schema = predicateOrSchemaOrExample\n } else if (predicateOrSchemaOrExample !== undefined) {\n // Type(description, example) - second arg is the example/default, infer schema\n // This is the simple form: Type('Name', 'Alice')\n example = predicateOrSchemaOrExample as T\n defaultValue = example // In simple form, example IS the default\n schema = s.infer(example)\n } else {\n throw new Error(\n 'Type(description) requires a predicate, schema, or example'\n )\n }\n } else {\n // Form: Type(schema) or Type(schemaBuilder)\n if (isSchemaBuilder(descriptionOrSchema)) {\n schema = descriptionOrSchema\n } else {\n schema = descriptionOrSchema as Schema\n }\n description = schemaToDescription(schema)\n }\n\n // Extract examples from schema metadata (if any)\n let examples: T[] | undefined\n if (schema) {\n const jsonSchema = (schema as any)?.schema ?? schema\n if (\n jsonSchema &&\n typeof jsonSchema === 'object' &&\n Array.isArray((jsonSchema as any).examples)\n ) {\n examples = (jsonSchema as any).examples as T[]\n }\n }\n\n // If no explicit example was provided, use first schema example for autocomplete\n if (example === undefined && examples && examples.length > 0) {\n example = examples[0]\n }\n\n // Build the check function\n const check = (value: unknown): value is T => {\n if (predicate) {\n return predicate(value)\n }\n if (schema) {\n return validate(value, schema)\n }\n return false\n }\n\n return {\n description,\n check,\n schema,\n predicate,\n example,\n examples,\n default: defaultValue,\n toJSONSchema(): JSONSchemaObject {\n // If we have an underlying JSON Schema or builder, extract it\n if (schema) {\n const raw = (schema as any)?.schema ?? schema\n if (raw && typeof raw === 'object' && 'type' in raw) {\n return raw as JSONSchemaObject\n }\n }\n // Fall back to inferring from example\n if (example !== undefined) {\n return exampleToJSONSchema(example)\n }\n // Predicate-only types: best-effort from description\n return { description }\n },\n strip(value: unknown): unknown {\n if (schema) {\n return schemaFilter(value, schema)\n }\n // No schema \u2014 can't strip, return as-is\n return value\n },\n __runtimeType: true as const,\n }\n}\n\n/**\n * Generate a description from a schema\n */\nfunction schemaToDescription(schema: Schema): string {\n // tosijs-schema wraps JSON schema in .schema property\n const jsonSchema = (schema as any)?.schema ?? schema\n\n // Handle schema objects with type property\n if (jsonSchema && typeof jsonSchema === 'object' && 'type' in jsonSchema) {\n const s = jsonSchema as any\n switch (s.type) {\n case 'string':\n if (s.format) return `string (${s.format})`\n if (s.pattern) return `string matching ${s.pattern}`\n if (s.minLength !== undefined && s.maxLength !== undefined)\n return `string (${s.minLength}-${s.maxLength} chars)`\n return 'string'\n case 'number':\n case 'integer':\n if (s.minimum !== undefined && s.maximum !== undefined)\n return `${s.type} (${s.minimum}-${s.maximum})`\n if (s.minimum !== undefined) return `${s.type} >= ${s.minimum}`\n if (s.maximum !== undefined) return `${s.type} <= ${s.maximum}`\n return s.type\n case 'boolean':\n return 'boolean'\n case 'array':\n return 'array'\n case 'object':\n return 'object'\n case 'null':\n return 'null'\n }\n }\n\n // Fallback\n return 'value'\n}\n\n// ============================================================================\n// Built-in Types\n// ============================================================================\n\n/** String type */\nexport const TString = Type<string>(\n 'string',\n (v: unknown) => typeof v === 'string'\n)\n\n/** Number type */\nexport const TNumber = Type<number>(\n 'number',\n (v: unknown) => typeof v === 'number'\n)\n\n/** Boolean type */\nexport const TBoolean = Type<boolean>(\n 'boolean',\n (v: unknown) => typeof v === 'boolean'\n)\n\n/** Integer type */\nexport const TInteger = Type<number>(\n 'integer',\n (v: unknown) => typeof v === 'number' && Number.isInteger(v)\n)\n\n/** Positive integer type */\nexport const TPositiveInt = Type<number>(\n 'positive integer',\n (v: unknown) => typeof v === 'number' && Number.isInteger(v) && v > 0\n)\n\n/** Non-empty string type */\nexport const TNonEmptyString = Type<string>(\n 'non-empty string',\n (v: unknown) => typeof v === 'string' && v.length > 0\n)\n\n/** Email type (basic validation) */\nexport const TEmail = Type<string>(\n 'email address',\n (v: unknown) => typeof v === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v)\n)\n\n/**\n * Check if a string is a valid URL (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidUrl = (v: string): boolean => {\n try {\n new URL(v)\n return true\n } catch {\n return false\n }\n}\n\n/** URL type */\nexport const TUrl = Type<string>(\n 'URL',\n (v: unknown) => typeof v === 'string' && isValidUrl(v)\n)\n\n/** UUID type */\nexport const TUuid = Type<string>(\n 'UUID',\n (v: unknown) =>\n typeof v === 'string' &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v)\n)\n\n/**\n * Check if a string is a valid ISO 8601 timestamp (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidTimestamp = (v: string): boolean => {\n const d = new Date(v)\n return !isNaN(d.getTime()) && v.includes('T')\n}\n\n/**\n * Check if a string is a valid YYYY-MM-DD date (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidLegalDate = (v: string): boolean => {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false\n const d = new Date(v + 'T00:00:00Z')\n return !isNaN(d.getTime())\n}\n\n/** ISO 8601 timestamp string (e.g., \"2024-01-15T10:30:00Z\") */\nexport const Timestamp = Type<string>(\n 'ISO 8601 timestamp',\n (v: unknown) => typeof v === 'string' && isValidTimestamp(v)\n)\n\n/** Legal date string in YYYY-MM-DD format */\nexport const LegalDate = Type<string>(\n 'date (YYYY-MM-DD)',\n (v: unknown) => typeof v === 'string' && isValidLegalDate(v)\n)\n\n// ============================================================================\n// Type Combinators\n// ============================================================================\n\n/** Create a nullable version of a type */\nexport function Nullable<T>(type: RuntimeType<T>): RuntimeType<T | null> {\n return Type<T | null>(\n `${type.description} or null`,\n (v: unknown) => v === null || type.check(v)\n )\n}\n\n/** Create an optional version of a type (nullable + undefined) */\nexport function Optional<T>(\n type: RuntimeType<T>\n): RuntimeType<T | null | undefined> {\n return Type<T | null | undefined>(\n `${type.description} (optional)`,\n (v: unknown) => v === null || v === undefined || type.check(v)\n )\n}\n\n/**\n * Create a union type\n *\n * Two forms:\n * Union(...types: RuntimeType[]) - combine existing types\n * Union(description, values) - create literal union from values\n *\n * @example\n * // From RuntimeTypes\n * const StringOrNumber = Union(TString, TNumber)\n *\n * // From literal values (used by TJS syntax)\n * const Direction = Union('cardinal direction', ['up', 'down', 'left', 'right'])\n */\nexport function Union<T extends unknown[]>(\n descriptionOrType: string | RuntimeType,\n valuesOrType?: T | RuntimeType,\n ...restTypes: RuntimeType[]\n): RuntimeType {\n // New form: Union(description, values[])\n if (typeof descriptionOrType === 'string' && Array.isArray(valuesOrType)) {\n const description = descriptionOrType\n const values = valuesOrType as unknown[]\n const valueSet = new Set(values)\n\n const result: RuntimeType & { values: unknown[] } = {\n description,\n check: (v: unknown): v is T[number] => valueSet.has(v),\n toJSONSchema: () => ({\n enum: values,\n }),\n strip: (value: unknown) => value,\n __runtimeType: true as const,\n values, // Expose values for introspection\n }\n return result\n }\n\n // Old form: Union(...types: RuntimeType[])\n const types: RuntimeType[] = []\n if (isRuntimeType(descriptionOrType)) {\n types.push(descriptionOrType)\n }\n if (isRuntimeType(valuesOrType)) {\n types.push(valuesOrType as RuntimeType)\n }\n types.push(...restTypes)\n\n const description = types.map((t) => t.description).join(' | ')\n return Type(description, (v: unknown) => types.some((t) => t.check(v)))\n}\n\n/** Create an array type */\nexport function TArray<T>(itemType: RuntimeType<T>): RuntimeType<T[]> {\n return Type<T[]>(\n `array of ${itemType.description}`,\n (v: unknown) => Array.isArray(v) && v.every((item) => itemType.check(item))\n )\n}\n\n// ============================================================================\n// Generic Types\n// ============================================================================\n\n/** Type parameter - can be a RuntimeType, schema, or example value */\nexport type TypeParam = RuntimeType | Base<any> | JSONSchema | unknown\n\n/** Generic type factory */\nexport interface GenericType<TParams extends string[] = string[]> {\n /** Instantiate the generic with concrete type arguments */\n (...typeArgs: TypeParam[]): RuntimeType\n /** The type parameter names */\n readonly params: TParams\n /** Description template */\n readonly description: string\n}\n\n/**\n * Convert a type param to a check function\n */\nfunction typeParamToCheck(param: TypeParam): (value: unknown) => boolean {\n if (isRuntimeType(param)) {\n return (v) => param.check(v)\n }\n // Check if it's a schema builder (has .schema property)\n if (param && typeof param === 'object' && 'schema' in param) {\n return (v) => validate(v, param as Base<any>)\n }\n // It's an example value - infer schema using s.infer\n const schema = s.infer(param)\n return (v) => validate(v, schema)\n}\n\n/**\n * Create a generic (parameterized) type factory\n *\n * @param params Array of type parameter names, with optional defaults: ['T', ['U', defaultSchema]]\n * @param predicate Function receiving (value, ...typeChecks) where typeChecks are validation functions\n * @param description Human-readable description template (type params will be substituted)\n *\n * @example\n * // Pair<T, U>\n * const Pair = Generic(\n * ['T', 'U'],\n * (x, checkT, checkU) =>\n * Array.isArray(x) && x.length === 2 && checkT(x[0]) && checkU(x[1]),\n * 'Pair<T, U>'\n * )\n *\n * // Usage: Pair(TString, TNumber) creates a type for [string, number]\n * // Or with examples: Pair('', 0)\n */\nexport function Generic<TParams extends string[]>(\n params: (string | [string, TypeParam])[],\n predicate: (\n value: unknown,\n ...typeChecks: Array<(v: unknown) => boolean>\n ) => boolean,\n description: string\n): GenericType<TParams> {\n // Extract param names and defaults\n const paramNames: string[] = []\n const defaults: (TypeParam | undefined)[] = []\n\n for (const p of params) {\n if (typeof p === 'string') {\n paramNames.push(p)\n defaults.push(undefined)\n } else {\n paramNames.push(p[0])\n defaults.push(p[1])\n }\n }\n\n // The factory function\n const factory = (...typeArgs: TypeParam[]): RuntimeType => {\n // Resolve type arguments, using defaults where not provided\n const checks = paramNames.map((_, i) => {\n const arg = i < typeArgs.length ? typeArgs[i] : defaults[i]\n if (arg === undefined) {\n // No arg and no default - accept anything\n return () => true\n }\n return typeParamToCheck(arg)\n })\n\n // Build description with substituted types\n let desc = description\n paramNames.forEach((name, i) => {\n const arg = i < typeArgs.length ? typeArgs[i] : defaults[i]\n let typeStr = 'any'\n if (isRuntimeType(arg)) {\n typeStr = arg.description\n } else if (arg !== undefined) {\n typeStr = typeof arg === 'string' ? 'string' : JSON.stringify(arg)\n }\n desc = desc.replace(new RegExp(`\\\\b${name}\\\\b`, 'g'), typeStr)\n })\n\n return Type(desc, (value: unknown) => predicate(value, ...checks))\n }\n\n ;(factory as any).params = paramNames as TParams\n ;(factory as any).description = description\n\n return factory as GenericType<TParams>\n}\n\n// ============================================================================\n// Built-in Generic Types\n// ============================================================================\n\n/** Pair<T, U> - 2-element tuple */\nexport const TPair = Generic(\n ['T', 'U'],\n (x, checkT, checkU) =>\n Array.isArray(x) && x.length === 2 && checkT(x[0]) && checkU(x[1]),\n 'Pair<T, U>'\n)\n\n/** Record<V> - object with string keys and values of type V */\nexport const TRecord = Generic(\n ['V'],\n (x, checkV) =>\n typeof x === 'object' &&\n x !== null &&\n !Array.isArray(x) &&\n Object.values(x).every(checkV),\n 'Record<string, V>'\n)\n\n// ============================================================================\n// Enum Types\n// ============================================================================\n\n/** Enum type with bidirectional lookup */\nexport interface EnumType<\n T extends Record<string, string | number> = Record<string, string | number>\n> extends RuntimeType<T[keyof T]> {\n /** The enum members as { Name: value } */\n readonly members: T\n /** Reverse lookup: value -> name */\n readonly names: Record<string | number, string>\n /** Get all valid values */\n readonly values: Array<T[keyof T]>\n /** Get all member names */\n readonly keys: Array<keyof T>\n}\n\n/**\n * Create an enum type with bidirectional lookup\n *\n * @param description Human-readable description\n * @param members Object mapping names to values { Pending: 0, Active: 1 }\n *\n * @example\n * const Status = Enum('task status', { Pending: 0, Active: 1, Done: 2 })\n * Status.check(0) // true\n * Status.check('done') // false\n * Status.members.Pending // 0\n * Status.names[0] // 'Pending'\n * Status.values // [0, 1, 2]\n * Status.keys // ['Pending', 'Active', 'Done']\n *\n * const Color = Enum('CSS color', { Red: 'red', Green: 'green', Blue: 'blue' })\n * Color.check('red') // true\n * Color.members.Red // 'red'\n */\nexport function Enum<T extends Record<string, string | number>>(\n description: string,\n members: T\n): EnumType<T> {\n const values = Object.values(members) as Array<T[keyof T]>\n const valueSet = new Set(values)\n const keys = Object.keys(members) as Array<keyof T>\n\n // Build reverse lookup\n const names: Record<string | number, string> = {}\n for (const [key, value] of Object.entries(members)) {\n names[value] = key\n }\n\n const enumType: EnumType<T> = {\n description,\n check: (v: unknown): v is T[keyof T] => valueSet.has(v as T[keyof T]),\n toJSONSchema: () => ({\n enum: values as unknown[],\n }),\n strip: (value: unknown) => value,\n __runtimeType: true as const,\n members,\n names,\n values,\n keys,\n }\n\n return enumType\n}\n\n// =============================================================================\n// FunctionPredicate - Runtime type for function signatures\n// =============================================================================\n\n/** Return contract levels in order of strictness */\nexport type ReturnContract = 'assertReturns' | 'returns' | 'checkedReturns'\n\n/** Specification for a FunctionPredicate */\nexport interface FunctionPredicateSpec {\n /** Parameter types as example values */\n params?: Record<string, any>\n /** Return type as example value */\n returns?: any\n /** Return contract level */\n returnContract?: ReturnContract\n}\n\n/** A runtime type that validates function signatures */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport interface FunctionPredicateType extends RuntimeType<Function> {\n /** Parameter specification */\n readonly params: Record<string, any>\n /** Return type specification */\n readonly returns?: any\n /** Return contract level */\n readonly returnContract: ReturnContract\n}\n\n/** A generic FunctionPredicate factory \u2014 call with type args to get a FunctionPredicateType */\nexport interface GenericFunctionPredicateType {\n (...typeArgs: TypeParam[]): FunctionPredicateType\n /** Type parameter names */\n readonly typeParamNames: string[]\n /** Description */\n readonly description: string\n /** Marker for runtime type detection */\n readonly __runtimeType: true\n}\n\n/** Infer a TypeDescriptor kind from an example value */\nfunction kindOfExample(example: unknown): string | null {\n if (example === null) return 'null'\n if (example === undefined) return 'undefined'\n switch (typeof example) {\n case 'string':\n return 'string'\n case 'boolean':\n return 'boolean'\n case 'number':\n return Number.isInteger(example) ? 'integer' : 'number'\n case 'object':\n return Array.isArray(example) ? 'array' : 'object'\n default:\n return null\n }\n}\n\n/**\n * Create a runtime type for function signatures.\n *\n * Forms:\n * FunctionPredicate(name, spec) - from a specification object\n * FunctionPredicate(name, fn) - from an existing typed function\n *\n * @example\n * const Callback = FunctionPredicate('Callback', {\n * params: { x: 0, y: 0 },\n * returns: 0,\n * })\n * Callback.check((a, b) => a + b) // true (typeof === 'function')\n * Callback.check(42) // false\n *\n * @example\n * function add(a: 0, b: 0) -> 0 { return a + b }\n * const Adder = FunctionPredicate('Adder', add)\n * // Extracts params/returns from add.__tjs\n *\n * @example\n * // Generic form \u2014 returns a factory\n * const Creator = FunctionPredicate('Creator', [['T', {}]], (T) => ({\n * params: { contents: [null] },\n * returns: T,\n * }))\n * const HtmlCreator = Creator({}) // FunctionPredicateType with returns: {}\n */\nexport function FunctionPredicate(\n name: string,\n // eslint-disable-next-line @typescript-eslint/ban-types\n specOrFn: FunctionPredicateSpec | Function | (string | [string, TypeParam])[],\n specBuilder?: (...typeArgs: any[]) => FunctionPredicateSpec\n): FunctionPredicateType | GenericFunctionPredicateType {\n // Generic form: FunctionPredicate(name, typeParams, specBuilder)\n if (Array.isArray(specOrFn) && specBuilder) {\n const typeParams = specOrFn as (string | [string, TypeParam])[]\n\n // Extract param names and defaults\n const paramNames: string[] = []\n const defaults: (TypeParam | undefined)[] = []\n for (const tp of typeParams) {\n if (Array.isArray(tp)) {\n paramNames.push(tp[0])\n defaults.push(tp[1])\n } else {\n paramNames.push(tp)\n defaults.push(undefined)\n }\n }\n\n const factory = ((...typeArgs: TypeParam[]) => {\n // Resolve type args with defaults\n const resolved: any[] = paramNames.map((_, idx) =>\n idx < typeArgs.length ? typeArgs[idx] : defaults[idx]\n )\n const spec = specBuilder(...resolved)\n return FunctionPredicate(name, spec) as FunctionPredicateType\n }) as GenericFunctionPredicateType\n\n Object.defineProperties(factory, {\n typeParamNames: { value: paramNames, enumerable: true },\n description: { value: name, enumerable: true },\n __runtimeType: { value: true, enumerable: true },\n })\n\n return factory\n }\n\n /* eslint-disable @typescript-eslint/ban-types */\n return _createFunctionPredicate(\n name,\n specOrFn as FunctionPredicateSpec | Function\n )\n /* eslint-enable @typescript-eslint/ban-types */\n}\n\n/** Internal: create a non-generic FunctionPredicateType */\nfunction _createFunctionPredicate(\n name: string,\n // eslint-disable-next-line @typescript-eslint/ban-types\n specOrFn: FunctionPredicateSpec | Function\n): FunctionPredicateType {\n let params: Record<string, any> = {}\n let returns: any = undefined\n let returnContract: ReturnContract = 'assertReturns'\n\n if (typeof specOrFn === 'function') {\n // Extract from function's __tjs metadata\n const meta = (specOrFn as any).__tjs\n if (meta) {\n // Build params from __tjs.params\n if (meta.params) {\n for (const [key, info] of Object.entries(meta.params)) {\n params[key] = (info as any)?.example ?? null\n }\n }\n // Extract return type\n if (meta.returns) {\n returns = (meta.returns as any)?.example ?? null\n }\n // Extract return contract from safety markers\n if (meta.safeReturn) returnContract = 'checkedReturns'\n else if (meta.unsafe) returnContract = 'assertReturns'\n else returnContract = 'returns'\n }\n } else {\n params = specOrFn.params ?? {}\n returns = specOrFn.returns\n returnContract = specOrFn.returnContract ?? 'assertReturns'\n }\n\n const fpType: FunctionPredicateType = {\n description: name,\n params,\n returns,\n returnContract,\n toJSONSchema: () => ({ description: name, type: 'function' as any }),\n strip: (value: unknown) => value,\n // eslint-disable-next-line @typescript-eslint/ban-types\n check: (value: unknown): value is Function => {\n if (typeof value !== 'function') return false\n\n // Structural validation: check arity and __tjs metadata\n const expectedArity = Object.keys(params).length\n if (expectedArity > 0) {\n // Check function.length (number of params before first default)\n // eslint-disable-next-line @typescript-eslint/ban-types\n const fn = value as Function\n const meta = (fn as any).__tjs\n if (meta?.params) {\n // Has TJS metadata \u2014 check param count matches\n const metaParamCount = Object.keys(meta.params).length\n if (metaParamCount !== expectedArity) return false\n\n // Check param type kinds match where both sides have type info\n const expectedKeys = Object.keys(params)\n const metaKeys = Object.keys(meta.params)\n for (let i = 0; i < expectedKeys.length; i++) {\n const metaInfo = meta.params[metaKeys[i]]\n const expectedExample = params[expectedKeys[i]]\n if (metaInfo?.type?.kind && expectedExample !== undefined) {\n const expectedKind = kindOfExample(expectedExample)\n if (\n expectedKind &&\n metaInfo.type.kind !== expectedKind &&\n metaInfo.type.kind !== 'any'\n )\n return false\n }\n }\n }\n }\n\n return true\n },\n __runtimeType: true as const,\n }\n\n return fpType\n}\n"],
|
|
5
|
+
"mappings": "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GAEA,QAAAC,GACA,QAAAC,GACA,SAAAC,GACA,SAAAC,GACA,aAAAC,GACA,gBAAAC,GACA,OAAAC,GACA,KAAAC,GACA,MAAAC,GACA,UAAAqB,GACA,UAAAC,GACA,MAAArB,GACA,QAAAC,GAEA,GAAAC,EACA,MAAAC,GAEA,GAAAC,GACA,MAAAC,GAEA,OAAAC,EACF,EA8EO,SAASgB,GAAiBC,EAA2B,CAC1D,MAAO;AAAA;AAAA,EAEPA,CAAS,gBAAgBA,CAAS;AAAA,EAClC,KAAK,CACP,CDhhDA,IAAMC,GAAiB,GAOjBC,GAAoB,IAAI,IAAI,CAEhC,QACA,cACA,aACA,gBACA,eACA,aACA,aACA,aACA,mBACA,aACA,YACA,iBACA,kBACA,iBACA,UACA,gBACA,aACA,eACA,gBACA,kBACA,sBACA,eACA,oBACA,cAEA,cACA,gBAEA,OACA,UACA,cACA,aACA,WACA,mBACA,aACA,OACA,UACA,OAEA,mBACA,sBACA,oBACA,oBACA,kBACA,oBACA,mBACA,mBACA,mBACA,oBACA,iBACA,kBACA,uBACA,mBACA,sBACA,kBACA,oBACA,qBACA,mBACA,oBACA,oBACA,oBACA,mBACA,kBACA,kBACA,kBACA,kBACA,mBAEA,gBACA,iBACA,cACA,mBACA,iBACA,iBACA,iBACA,oBAEA,WACA,iBACA,eACA,eACA,eACA,sBACA,UACA,kBACA,WACA,YAEA,QACA,YACA,cAEA,mBACA,iBACA,uBACA,4BACA,iBACA,sBACA,sBACA,mBAEA,SACA,WACA,UACA,YACA,SACA,UAEA,2BACA,wBACA,yBACA,kBACA,YACA,cACA,cACA,gBACA,eACA,YACA,cAEA,SACA,eACA,gBACA,4BACA,mBACA,iBACA,cAEA,YACA,iBACA,aACA,WACA,eACA,SACA,eACA,YACA,cACA,eACA,mBACA,iBACA,aACA,eACA,eACF,CAAC,EAOD,SAASC,EACPC,EACAC,EACAC,EACAC,EACQ,CACR,GAAI,CAACH,EAAM,MAAO,YAElB,OAAQA,EAAK,KAAM,CACjB,KAAKI,EAAG,WAAW,cACjB,MAAO,KACT,KAAKA,EAAG,WAAW,cACjB,MAAO,MACT,KAAKA,EAAG,WAAW,eACjB,MAAO,QACT,KAAKA,EAAG,WAAW,YACjB,MAAO,OACT,KAAKA,EAAG,WAAW,iBACjB,MAAO,YACT,KAAKA,EAAG,WAAW,YACjB,MAAO,YACT,KAAKA,EAAG,WAAW,WAEjB,MAAO,MACT,KAAKA,EAAG,WAAW,eACjB,MAAO,MACT,KAAKA,EAAG,WAAW,aACjB,MAAO,OACT,KAAKA,EAAG,WAAW,cACjB,MAAO,oBACT,KAAKA,EAAG,WAAW,cACjB,MAAO,KACT,KAAKA,EAAG,WAAW,cACjB,MAAO,KAET,KAAKA,EAAG,WAAW,UAAW,CAE5B,IAAIC,EAAcN,EADAC,EACwB,YAAaC,CAAO,EAE9D,OAAII,IAAgB,QAAOA,EAAc,QAClC,IAAIA,CAAW,GACxB,CAEA,KAAKD,EAAG,WAAW,cAAe,CAChC,IAAME,EAAUN,EACVO,EAAWD,EAAQ,SAAS,QAAQ,EAG1C,GAAIC,IAAa,SAAWD,EAAQ,eAAe,OAOjD,MAAO,IANaP,EAClBO,EAAQ,cAAc,CAAC,EACvBL,EACAC,EACAC,CACF,CACsB,IASxB,GAPII,IAAa,WAQfA,IAAa,aACbA,IAAa,kBACbA,IAAa,oBACbA,IAAa,wBAGb,OAAID,EAAQ,eAAe,OAClBP,EAAcO,EAAQ,cAAc,CAAC,EAAGL,EAASC,EAAUC,CAAG,EAEhE,YAET,GAAII,IAAa,SACf,MAAO,KAIT,IAAMC,EAA0C,CAE9C,IAAK,YACL,IAAK,YACL,QAAS,gBACT,QAAS,gBACT,QAAS,kBAET,MAAO,uBACP,UAAW,2BACX,WAAY,4BACZ,YAAa,6BACb,eAAgB,gCAChB,SAAU,0BACV,UAAW,2BAEX,KAAM,aACN,OAAQ,YAER,YAAa,qBACb,kBAAmB,2BACnB,SAAU,mCACV,aAAc,sBACd,aAAc,sBACd,UAAW,mBACX,WAAY,oBACZ,WAAY,oBACZ,WAAY,oBACZ,YAAa,qBACb,YAAa,qBACb,kBAAmB,2BACnB,cAAe,uBACf,eAAgB,wBAEhB,IAAK,iCACL,gBAAiB,wBACjB,QAAS,gBACT,SAAU,iBACV,KAAM,aACN,KAAM,0BACN,SAAU,iBACV,QAAS,qCACT,gBAAiB,wBACjB,YAAa,sBAEb,eAAgB,uBAChB,eAAgB,uBAChB,gBAAiB,wBAEjB,YAAa,oBACb,YAAa,oBAEb,QAAS,uBACX,EAEA,GAAID,KAAYC,EACd,OAAOA,EAAgBD,CAAQ,EAIjC,GAAIJ,GAAK,aAAa,IAAII,CAAQ,EAAG,CAEnC,IAAME,EAAUN,EAAI,SAAW,IAAI,IACnC,GAAIM,EAAQ,IAAIF,CAAQ,EACtB,OAAAL,GAAU,KAAK,4BAA4BK,CAAQ,iBAAiB,EAC7D,MAETE,EAAQ,IAAIF,CAAQ,EACpB,IAAMG,EAAeP,EAAI,YAAY,IAAII,CAAQ,EACjD,OAAOR,EAAcW,EAAcT,EAASC,EAAU,CACpD,GAAGC,EACH,QAAAM,CACF,CAAC,CACH,CAGA,GAAIN,GAAK,YAAY,IAAII,CAAQ,EAAG,CAElC,IAAME,EAAUN,EAAI,SAAW,IAAI,IACnC,GAAIM,EAAQ,IAAIF,CAAQ,EACtB,OAAAL,GAAU,KAAK,4BAA4BK,CAAQ,iBAAiB,EAC7D,MAETE,EAAQ,IAAIF,CAAQ,EACpB,IAAMI,EAAQR,EAAI,WAAW,IAAII,CAAQ,EAEnCK,EAAkB,CAAC,EACzB,QAAWC,KAAUF,EAAM,QACzB,GAAIP,EAAG,oBAAoBS,CAAM,GAAKA,EAAO,KAAM,CACjD,IAAMC,EAAWD,EAAO,KAAK,QAAQV,EAAI,UAAU,EAC7CY,EAAchB,EAAcc,EAAO,KAAMZ,EAASC,EAAU,CAChE,GAAGC,EACH,QAAAM,CACF,CAAC,EAGDG,EAAM,KAAK,GAAGE,CAAQ,KAAKC,CAAW,EAAE,CAC1C,CAEF,MAAO,KAAKH,EAAM,KAAK,IAAI,CAAC,IAC9B,CAIA,GAAIT,GAAK,YAAY,IAAII,CAAQ,EAAG,CAClC,IAAMS,EAAKb,EAAI,WAAW,IAAII,CAAQ,EACtC,GAAIS,EAAG,WACL,OAAOjB,EAAciB,EAAG,WAAYf,EAASC,EAAUC,CAAG,EAE5D,GAAIa,EAAG,QACL,OAAOjB,EAAciB,EAAG,QAASf,EAASC,EAAUC,CAAG,CAG3D,CAGA,OAAIL,GAAkB,IAAIS,CAAQ,EACzB,KAKP,UAAU,KAAKA,CAAQ,GACvB,CAAC,IAAK,IAAK,IAAK,IAAK,OAAQ,SAAU,QAAS,SAAS,EAAE,SACzDA,CACF,GAEAL,GAAU,KACR,2BAA2BK,CAAQ,8CACrC,EACO,QAGTL,GAAU,KACR,iBAAiBK,CAAQ,+CAC3B,EACO,MACT,CAEA,KAAKH,EAAG,WAAW,YAAa,CAC9B,IAAMa,EAAcjB,EACdY,EAAkB,CAAC,EACzB,QAAWC,KAAUI,EAAY,QAC/B,GAAIb,EAAG,oBAAoBS,CAAM,GAAKA,EAAO,KAAM,CACjD,IAAMC,EAAWD,EAAO,KAAK,QAAQ,EACjCK,EAAWnB,EAAcc,EAAO,KAAMZ,CAAO,EAE7CiB,IAAa,QAAOA,EAAW,QAEnCN,EAAM,KAAK,GAAGE,CAAQ,KAAKI,CAAQ,EAAE,CACvC,CAEF,MAAO,KAAKN,EAAM,KAAK,IAAI,CAAC,IAC9B,CAEA,KAAKR,EAAG,WAAW,UAAW,CAC5B,IAAMe,EAAYnB,EAGZoB,EAAcC,GAClBA,EAAE,OAASjB,EAAG,WAAW,aACxBA,EAAG,kBAAkBiB,CAAC,GACrBA,EAAE,QAAQ,OAASjB,EAAG,WAAW,YAC/BkB,EAAmBD,GACvBA,EAAE,OAASjB,EAAG,WAAW,kBACxBA,EAAG,kBAAkBiB,CAAC,GACrBA,EAAE,QAAQ,OAASjB,EAAG,WAAW,iBAG/BmB,EAAeJ,EAAU,MAAM,OAClCE,GAAM,CAACD,EAAWC,CAAC,GAAK,CAACC,EAAgBD,CAAC,CAC7C,EACMG,EAAUL,EAAU,MAAM,KAAKC,CAAU,EACzCK,EAAeN,EAAU,MAAM,KAAKG,CAAe,EAGzD,GAAIC,EAAa,SAAW,EAC1B,OAAIC,EAAgB,OACb,YAGT,GAAID,EAAa,SAAW,IAAMC,GAAWC,GAAe,CAE1D,IAAMC,EAAc3B,EAClBwB,EAAa,CAAC,EACdtB,EACAC,EACAC,CACF,EAEA,GAAIuB,IAAgB,MAAO,MAAO,MAClC,GAAIF,EAAS,MAAO,GAAGE,CAAW,UAClC,GAAID,EAAc,MAAO,GAAGC,CAAW,cACzC,CAIA,IAAMC,EAAWR,EAAU,MACxB,IAAKE,GAAMtB,EAAcsB,EAAGpB,EAASC,EAAUC,CAAG,CAAC,EACnD,OAAO,CAACyB,EAAGC,EAAGC,IAAQA,EAAI,QAAQF,CAAC,IAAMC,CAAC,EAC7C,OAAIF,EAAS,KAAMC,GAAMA,IAAM,KAAK,EAAU,MAC1CD,EAAS,SAAW,EAAUA,EAAS,CAAC,EACxCA,EAAS,OAAS,EAGKA,EAAS,KAC/BC,GAAM,OAAO,KAAKA,CAAC,GAAKA,EAAE,WAAW,MAAM,CAC9C,EAC6B,MACtBD,EAAS,KAAK,KAAK,EAErB,WACT,CAEA,KAAKvB,EAAG,WAAW,YAAa,CAC9B,IAAM2B,EAAc/B,EACpB,OAAII,EAAG,gBAAgB2B,EAAY,OAAO,EACjC,IAAIA,EAAY,QAAQ,IAAI,IAEjC3B,EAAG,iBAAiB2B,EAAY,OAAO,EAClCA,EAAY,QAAQ,KAEzBA,EAAY,QAAQ,OAAS3B,EAAG,WAAW,YACtC,OAEL2B,EAAY,QAAQ,OAAS3B,EAAG,WAAW,aACtC,QAEL2B,EAAY,QAAQ,OAAS3B,EAAG,WAAW,YACtC,OAEF,WACT,CAEA,KAAKA,EAAG,WAAW,kBAEjB,OAAOL,EADWC,EACa,KAAMC,CAAO,EAG9C,KAAKG,EAAG,WAAW,aAAc,CAE/B,IAAM4B,EAAWhC,EACXiC,EAAqB,CAAC,EAC5B,QAAWC,KAASF,EAAS,WAAY,CACvC,IAAMG,EAAOD,EAAM,MAAM,QAAQ,GAAK,IACtC,GAAIC,IAAS,OAAQ,SACrB,IAAIC,EAAerC,EAAcmC,EAAM,KAAMjC,EAASC,EAAUC,CAAG,EAC/DiC,IAAiB,QAAOA,EAAe,QAC3CH,EAAS,KAAK,GAAGE,CAAI,KAAKC,CAAY,EAAE,CAC1C,CACA,IAAIC,EAAWtC,EAAciC,EAAS,KAAM/B,EAASC,EAAUC,CAAG,EAC9DkC,IAAa,QAAOA,EAAW,QACnC,IAAMC,EAAiB,CAAC,EACxB,OAAIL,EAAS,OAAS,GAAGK,EAAK,KAAK,aAAaL,EAAS,KAAK,IAAI,CAAC,IAAI,EACnEI,IAAa,aAAaC,EAAK,KAAK,YAAYD,CAAQ,EAAE,EACvD,mCAAmCC,EAAK,KAAK,IAAI,CAAC,KAC3D,CAEA,KAAKlC,EAAG,WAAW,UASjB,MAAO,IARWJ,EACS,SAAS,IAAK4B,GAAM,CAC7C,IAAMW,EAAUnC,EAAG,mBAAmBwB,CAAC,EACnC7B,EAAc6B,EAAE,KAAM3B,CAAO,EAC7BF,EAAc6B,EAAkB3B,CAAO,EAE3C,OAAOsC,IAAY,MAAQ,OAASA,CACtC,CAAC,EACmB,KAAK,IAAI,CAAC,IAGhC,QACE,MAAO,WACX,CACF,CAKA,SAASC,EACPxC,EACAG,EACU,CACV,GAAI,CAACH,EAAM,MAAO,CAAE,KAAM,KAAM,EAGhC,IAAMyC,EAAQtC,GAAK,OAAS,EAC5B,GAAIsC,EAAQ5C,GAAgB,MAAO,CAAE,KAAM,KAAM,EAKjD,OAFAM,EAAMA,EAAM,CAAE,GAAGA,EAAK,MAAOsC,EAAQ,CAAE,EAAI,OAEnCzC,EAAK,KAAM,CACjB,KAAKI,EAAG,WAAW,cACjB,MAAO,CAAE,KAAM,QAAS,EAC1B,KAAKA,EAAG,WAAW,cACjB,MAAO,CAAE,KAAM,QAAS,EAC1B,KAAKA,EAAG,WAAW,eACjB,MAAO,CAAE,KAAM,SAAU,EAC3B,KAAKA,EAAG,WAAW,YACjB,MAAO,CAAE,KAAM,MAAO,EACxB,KAAKA,EAAG,WAAW,iBACnB,KAAKA,EAAG,WAAW,YACjB,MAAO,CAAE,KAAM,WAAY,EAE7B,KAAKA,EAAG,WAAW,UAEjB,MAAO,CAAE,KAAM,QAAS,MAAOoC,EADbxC,EACkC,YAAaG,CAAG,CAAE,EAGxE,KAAKC,EAAG,WAAW,YAAa,CAC9B,IAAMa,EAAcjB,EACd0C,EAAkC,CAAC,EACzC,QAAW7B,KAAUI,EAAY,QAC/B,GAAIb,EAAG,oBAAoBS,CAAM,GAAKA,EAAO,KAAM,CACjD,IAAMC,EAAWD,EAAO,KAAK,QAAQ,EACrC6B,EAAM5B,CAAQ,EAAI0B,EAAW3B,EAAO,KAAMV,CAAG,CAC/C,CAEF,MAAO,CAAE,KAAM,SAAU,MAAAuC,CAAM,CACjC,CAEA,KAAKtC,EAAG,WAAW,UAAW,CAC5B,IAAMe,EAAYnB,EACZuB,EAAeJ,EAAU,MAAM,OAClCE,GACCA,EAAE,OAASjB,EAAG,WAAW,aACzBiB,EAAE,OAASjB,EAAG,WAAW,gBAC7B,EACMoB,EAAUL,EAAU,MAAM,KAC7BE,GAAMA,EAAE,OAASjB,EAAG,WAAW,WAClC,EAEA,OAAImB,EAAa,SAAW,GAAKC,EACxB,CAAE,GAAGgB,EAAWjB,EAAa,CAAC,EAAGpB,CAAG,EAAG,SAAU,EAAK,EAGxD,CACL,KAAM,QACN,QAASgB,EAAU,MAAM,IAAKE,GAAMmB,EAAWnB,EAAGlB,CAAG,CAAC,CACxD,CACF,CAEA,KAAKC,EAAG,WAAW,iBAAkB,CACnC,IAAMuC,EAAmB3C,EAEnB4C,EAAwC,CAAC,EAC/C,QAAW/B,KAAU8B,EAAiB,MAAO,CAC3C,IAAME,EAAaL,EAAW3B,EAAQV,CAAG,EACrC0C,EAAW,OAAS,UAAYA,EAAW,OAC7C,OAAO,OAAOD,EAAaC,EAAW,KAAK,CAE/C,CACA,OAAI,OAAO,KAAKD,CAAW,EAAE,OAAS,EAC7B,CAAE,KAAM,SAAU,MAAOA,CAAY,EAGvC,CAAE,KAAM,KAAM,CACvB,CAEA,KAAKxC,EAAG,WAAW,UAAW,CAC5B,IAAM0C,EAAY9C,EACZ+C,EAAuB,CAAC,EAC9B,QAAWC,KAAWF,EAAU,SAE1B1C,EAAG,mBAAmB4C,CAAO,EAC/BD,EAAS,KAAKP,EAAWQ,EAAQ,KAAM7C,CAAG,CAAC,EAE3C4C,EAAS,KAAKP,EAAWQ,EAAwB7C,CAAG,CAAC,EAGzD,MAAO,CAAE,KAAM,QAAS,SAAA4C,CAAS,CACnC,CAEA,KAAK3C,EAAG,WAAW,cAAe,CAChC,IAAME,EAAUN,EACVO,EAAWD,EAAQ,SAAS,QAAQ,EAC1C,GAAIC,IAAa,SAAWD,EAAQ,eAAe,OACjD,MAAO,CACL,KAAM,QACN,MAAOkC,EAAWlC,EAAQ,cAAc,CAAC,EAAGH,CAAG,CACjD,EAKF,GAHII,IAAa,WAAaD,EAAQ,eAAe,SAIlDC,IAAa,aACZA,IAAa,kBACbA,IAAa,oBACbA,IAAa,0BACfD,EAAQ,eAAe,OAEvB,OAAOkC,EAAWlC,EAAQ,cAAc,CAAC,EAAGH,CAAG,EAIjD,GAAIG,EAAQ,eAAe,OAAQ,CACjC,IAAM2C,EAAYT,EAAWlC,EAAQ,cAAc,CAAC,EAAGH,CAAG,EAa1D,GAVII,IAAa,WAKbA,IAAa,YAKbA,IAAa,WACf,OAAO0C,EAIT,GAAI1C,IAAa,UAAYD,EAAQ,cAAc,QAAU,EAG3D,MAAO,CAAE,KAAM,SAAU,MAAO,CAAE,QAFhBkC,EAAWlC,EAAQ,cAAc,CAAC,EAAGH,CAAG,CAEL,CAAE,EAKzD,GAAII,IAAa,QAAUA,IAAa,OACtC,OAAO0C,EAIT,GAAI1C,IAAa,cACf,OAAI0C,EAAU,SACL,CAAE,GAAGA,EAAW,SAAU,EAAM,EAElCA,EAIT,GACE,CAAC,aAAc,aAAc,uBAAuB,EAAE,SACpD1C,CACF,EAEA,MAAO,CAAE,KAAM,KAAM,CAEzB,CAGA,GAAIJ,GAAK,aAAa,IAAII,CAAQ,EAAG,CAEnC,GAAIJ,EAAI,eAAe,IAAII,CAAQ,EACjC,OAAOJ,EAAI,cAAc,IAAII,CAAQ,EAEvC,IAAME,EAAUN,EAAI,SAAW,IAAI,IACnC,GAAIM,EAAQ,IAAIF,CAAQ,EACtB,MAAO,CAAE,KAAM,KAAM,EAEvBE,EAAQ,IAAIF,CAAQ,EACpB,IAAMG,EAAeP,EAAI,YAAY,IAAII,CAAQ,EAC3C2C,EAASV,EAAW9B,EAAc,CAAE,GAAGP,EAAK,QAAAM,CAAQ,CAAC,EAC3D,OAAAN,EAAI,eAAe,IAAII,EAAU2C,CAAM,EAChCA,CACT,CAGA,GAAI/C,GAAK,YAAY,IAAII,CAAQ,EAAG,CAElC,GAAIJ,EAAI,eAAe,IAAII,CAAQ,EACjC,OAAOJ,EAAI,cAAc,IAAII,CAAQ,EAEvC,IAAME,EAAUN,EAAI,SAAW,IAAI,IACnC,GAAIM,EAAQ,IAAIF,CAAQ,EACtB,MAAO,CAAE,KAAM,KAAM,EAEvBE,EAAQ,IAAIF,CAAQ,EACpB,IAAMI,EAAQR,EAAI,WAAW,IAAII,CAAQ,EACnCmC,EAAkC,CAAC,EAGzC,GAAI/B,EAAM,iBACR,QAAWwC,KAAUxC,EAAM,gBACzB,GAAIwC,EAAO,QAAU/C,EAAG,WAAW,eACjC,QAAWgD,KAAYD,EAAO,MAAO,CACnC,IAAME,EAAWD,EAAS,WAAW,QAAQjD,EAAI,UAAU,EAE3D,GAAIA,EAAI,YAAY,IAAIkD,CAAQ,GAAK,CAAC5C,EAAQ,IAAI4C,CAAQ,EAAG,CAE3D,IAAMC,EAAe,CACnB,KAAMlD,EAAG,WAAW,cACpB,SAAU,CAAE,QAAS,IAAMiD,CAAS,CACtC,EACME,EAAWf,EAAWc,EAAc,CAAE,GAAGnD,EAAK,QAAAM,CAAQ,CAAC,EACzD8C,EAAS,OAAS,UAAYA,EAAS,OACzC,OAAO,OAAOb,EAAOa,EAAS,KAAK,CAEvC,CACF,EAMN,QAAW1C,KAAUF,EAAM,QACzB,GAAIP,EAAG,oBAAoBS,CAAM,GAAKA,EAAO,KAAM,CACjD,IAAMC,EAAWD,EAAO,KAAK,QAAQV,EAAI,UAAU,EACnDuC,EAAM5B,CAAQ,EAAI0B,EAAW3B,EAAO,KAAM,CAAE,GAAGV,EAAK,QAAAM,CAAQ,CAAC,CAC/D,CAEF,IAAMyC,EAAS,CAAE,KAAM,SAAmB,MAAAR,CAAM,EAChD,OAAAvC,EAAI,eAAe,IAAII,EAAU2C,CAAM,EAChCA,CACT,CAGA,GAAI/C,GAAK,YAAY,IAAII,CAAQ,EAAG,CAClC,IAAMS,EAAKb,EAAI,WAAW,IAAII,CAAQ,EACtC,GAAIS,EAAG,WACL,OAAOwB,EAAWxB,EAAG,WAAYb,CAAG,EAEtC,GAAIa,EAAG,QACL,OAAOwB,EAAWxB,EAAG,QAASb,CAAG,CAErC,CAGA,OAAIL,GAAkB,IAAIS,CAAQ,EACzB,CAAE,KAAM,QAAS,EAInB,CAAE,KAAM,KAAM,CACvB,CAEA,QACE,MAAO,CAAE,KAAM,KAAM,CACzB,CACF,CAKA,SAASiD,GACPC,EACAvD,EAC2C,CAC3C,GAAI,CAACuD,EAAK,gBAAkBA,EAAK,eAAe,SAAW,EACzD,OAGF,IAAMC,EAA4C,CAAC,EAEnD,QAAWxB,KAASuB,EAAK,eAAgB,CACvC,IAAMtB,EAAOD,EAAM,KAAK,QAAQ,EAC1ByB,EAAsB,CAAC,EAG7B,GAAIzB,EAAM,WAAY,CACpB,IAAM0B,EAAoB7D,EACxBmC,EAAM,WACN,OACAhC,CACF,EAEA,GAAI0D,EAAkB,WAAW,GAAG,EAClC,GAAI,CAEFD,EAAK,WAAaC,CACpB,MAAQ,CACND,EAAK,WAAaC,CACpB,MAEAD,EAAK,WAAaC,CAEtB,CAGA,GAAI1B,EAAM,QAAS,CACjB,IAAM2B,EAAiB9D,EAAcmC,EAAM,QAAS,OAAWhC,CAAQ,EACvEyD,EAAK,QAAUE,CACjB,CAEAH,EAAWvB,CAAI,EAAIwB,CACrB,CAEA,OAAO,OAAO,KAAKD,CAAU,EAAE,OAAS,EAAIA,EAAa,MAC3D,CAYA,SAASI,GACPL,EACAM,EACA7D,EACA8D,EACe,CACf,IAAMzD,EAAWkD,EAAK,KAAK,QAAQM,CAAU,EAG7C,GAAIN,EAAK,gBAAkBA,EAAK,eAAe,OAAS,EACtD,OAAOQ,GACLR,EACAM,EACA7D,EACA8D,CACF,EAIF,IAAME,EAAoBF,GAAa,KAAMG,GAAMA,EAAE,OAAS,SAAS,EACjEC,EAAsBJ,GAAa,KAAMG,GAAMA,EAAE,OAAS,WAAW,EAEvE5B,EACJ,GAAI2B,GAAmB,KACrB3B,EAAU2B,EAAkB,SACvB,CACL,IAAMtD,EAAkB,CAAC,EACzB,QAAWC,KAAU4C,EAAK,QACxB,GAAIrD,EAAG,oBAAoBS,CAAM,GAAKA,EAAO,KAAM,CACjD,IAAMC,EAAWD,EAAO,KAAK,QAAQkD,CAAU,EAC3ChD,EAAchB,EAAcc,EAAO,KAAM,OAAWX,CAAQ,EAC5Da,IAAgB,QAAOA,EAAc,QACzCH,EAAM,KAAK,GAAGE,CAAQ,KAAKC,CAAW,EAAE,CAC1C,CAEF,GAAIH,EAAM,SAAW,GAAK,CAACwD,EACzB,MAAO,QAAQ7D,CAAQ,MAEzBgC,EAAU3B,EAAM,OAAS,EAAI,KAAKA,EAAM,KAAK,IAAI,CAAC,KAAO,IAC3D,CAEA,IAAMyD,EAAQ,CAAC,YAAY9B,CAAO,EAAE,EACpC,OAAI6B,GAAqB,MACvBC,EAAM,KAAKD,EAAoB,IAAI,EAG9B,QAAQ7D,CAAQ;AAAA,IAAS8D,EAAM,KAAK;AAAA,GAAM,CAAC;AAAA,EACpD,CAYA,SAASJ,GACPR,EACAM,EACA7D,EACA8D,EACQ,CACR,IAAMzD,EAAWkD,EAAK,KAAK,QAAQM,CAAU,EACvCL,EAAuB,CAAC,EAG9B,QAAWxB,KAASuB,EAAK,gBAAkB,CAAC,EAAG,CAC7C,IAAMa,EAAYpC,EAAM,KAAK,QAAQ6B,CAAU,EAC/C,GAAI7B,EAAM,QAAS,CACjB,IAAM2B,EAAiB9D,EAAcmC,EAAM,QAAS,OAAWhC,CAAQ,EACvEwD,EAAW,KAAK,GAAGY,CAAS,MAAMT,CAAc,EAAE,CACpD,MACEH,EAAW,KAAKY,CAAS,CAE7B,CAGA,IAAMF,EAAsBJ,GAAa,KAAMG,GAAMA,EAAE,OAAS,WAAW,EACrEI,EAAwBP,GAAa,KACxCG,GAAMA,EAAE,OAAS,aACpB,EAEIK,EACJ,GAAIJ,GAAqB,KACvBI,EAAgBJ,EAAoB,SAC/B,CAEL,IAAMK,GAAkBhB,EAAK,gBAAkB,CAAC,GAAG,IAAKiB,GACtDA,EAAE,KAAK,QAAQX,CAAU,CAC3B,EACMY,EAAmB,CAAC,wBAAyB,YAAY,EAE/D,QAAW9D,KAAU4C,EAAK,QACxB,GAAIrD,EAAG,oBAAoBS,CAAM,GAAKA,EAAO,KAAM,CACjD,IAAMC,EAAWD,EAAO,KAAK,QAAQkD,CAAU,EACzCa,EAAa9D,EAAS,WAAW,GAAG,GAAKA,EAAS,SAAS,GAAG,EAC9D+D,EAAaD,EAAa9D,EAAS,MAAM,EAAG,EAAE,EAAI,KAQxD,GANI8D,EACFD,EAAO,KAAK,GAAGE,CAAU,OAAO,EAEhCF,EAAO,KAAK,IAAI7D,CAAQ,QAAQ,EAG9BD,EAAO,MAAQT,EAAG,oBAAoBS,EAAO,IAAI,EAAG,CACtD,IAAMiE,EAAUjE,EAAO,KAAK,SAAS,QAAQkD,CAAU,EACnDU,EAAe,SAASK,CAAO,IAC7BF,EACFD,EAAO,KAAK,GAAGG,CAAO,MAAMD,CAAU,IAAI,EAE1CF,EAAO,KAAK,GAAGG,CAAO,MAAMhE,CAAQ,GAAG,EAG7C,CACF,CAIF0D,EAAgB,aADQ,CAAC,IAAK,GAAGC,CAAc,EAAE,KAAK,IAAI,CACd,cAAcE,EAAO,KAC/D,MACF,CAAC,IACH,CAEA,IAAMN,EAAQ,CAAC,iBAAiB9D,CAAQ,IAAKiE,CAAa,EAE1D,GAAID,GAAuB,KACzBF,EAAM,KAAK,eAAeE,EAAsB,IAAI,EAAE,MACjD,CAEL,IAAMQ,EAAwB,CAAC,EAC/B,QAAWlE,KAAU4C,EAAK,QACxB,GAAIrD,EAAG,oBAAoBS,CAAM,GAAKA,EAAO,KAAM,CACjD,IAAMC,EAAWD,EAAO,KAAK,QAAQkD,CAAU,EACzCiB,EAAWnE,EAAO,cAAgB,IAAM,GACxCoE,EAAWpE,EAAO,KAAOA,EAAO,KAAK,QAAQkD,CAAU,EAAI,MACjEgB,EAAY,KAAK,GAAGjE,CAAQ,GAAGkE,CAAQ,KAAKC,CAAQ,EAAE,CACxD,SAAW7E,EAAG,kBAAkBS,CAAM,GAAKA,EAAO,KAAM,CAEtD,IAAMqE,EAAarE,EAAO,QAAQkD,CAAU,EAAE,KAAK,EAEnDgB,EAAY,KAAKG,EAAW,QAAQ,KAAM,EAAE,CAAC,CAC/C,CAEEH,EAAY,OAAS,GACvBV,EAAM,KAAK;AAAA,MAAsBU,EAAY,KAAK;AAAA,KAAQ,CAAC;AAAA,IAAO,CAEtE,CAEA,MAAO,WAAWxE,CAAQ,IAAImD,EAAW,KAAK,IAAI,CAAC;AAAA,IAAUW,EAAM,KACjE;AAAA,GACF,CAAC;AAAA,EACH,CAMA,SAASc,GACPnF,EACAoF,EACiB,CACjB,GAAI,CAAChF,EAAG,gBAAgBJ,CAAI,EAAG,OAAO,KAEtC,IAAMqF,EAAmB,CAAC,EAC1B,QAAWxE,KAAUb,EAAK,MACxB,GAAII,EAAG,kBAAkBS,CAAM,EAC7B,GAAIT,EAAG,gBAAgBS,EAAO,OAAO,EACnCwE,EAAO,KAAK,IAAIxE,EAAO,QAAQ,IAAI,GAAG,UAC7BT,EAAG,iBAAiBS,EAAO,OAAO,EAC3CwE,EAAO,KAAKxE,EAAO,QAAQ,IAAI,UACtBA,EAAO,QAAQ,OAAST,EAAG,WAAW,YAC/CiF,EAAO,KAAK,MAAM,UACTxE,EAAO,QAAQ,OAAST,EAAG,WAAW,aAC/CiF,EAAO,KAAK,OAAO,UACVxE,EAAO,QAAQ,OAAST,EAAG,WAAW,YAC/CiF,EAAO,KAAK,MAAM,MAGlB,QAAO,aAEAxE,EAAO,OAAST,EAAG,WAAW,YACvCiF,EAAO,KAAK,MAAM,UACTxE,EAAO,OAAST,EAAG,WAAW,iBACvCiF,EAAO,KAAK,WAAW,MAGvB,QAAO,KAIX,OAAOA,EAAO,OAAS,EAAIA,EAAS,IACtC,CAqBA,SAASC,GACP7B,EACAM,EACAwB,EACe,CACf,IAAMC,EAAW/B,EAAK,KAAK,QAAQM,CAAU,EACvC0B,EAAoB,CAAC,EAEvBC,EAAY,EAChB,QAAW7E,KAAU4C,EAAK,QAAS,CACjC,IAAMkC,EAAa9E,EAAO,KAAK,QAAQkD,CAAU,EAEjD,GAAIlD,EAAO,YAET,GAAIT,EAAG,gBAAgBS,EAAO,WAAW,EACvC4E,EAAQ,KAAK,KAAKE,CAAU,OAAO9E,EAAO,YAAY,IAAI,GAAG,UACpDT,EAAG,iBAAiBS,EAAO,WAAW,EAAG,CAClD,IAAM+E,EAAW,SAAS/E,EAAO,YAAY,KAAM,EAAE,EACrD4E,EAAQ,KAAK,KAAKE,CAAU,MAAMC,CAAQ,EAAE,EAC5CF,EAAYE,EAAW,CACzB,SACExF,EAAG,wBAAwBS,EAAO,WAAW,GAC7CA,EAAO,YAAY,WAAaT,EAAG,WAAW,WAC9C,CAEA,IAAMyF,EAAUhF,EAAO,YAAY,QACnC,GAAIT,EAAG,iBAAiByF,CAAO,EAAG,CAChC,IAAMD,EAAW,CAAC,SAASC,EAAQ,KAAM,EAAE,EAC3CJ,EAAQ,KAAK,KAAKE,CAAU,MAAMC,CAAQ,EAAE,EAC5CF,EAAYE,EAAW,CACzB,CACF,MAEEH,EAAQ,KACN,KAAKE,CAAU,MAAM9E,EAAO,YAAY,QAAQkD,CAAU,CAAC,EAC7D,OAIF0B,EAAQ,KAAK,KAAKE,CAAU,MAAMD,CAAS,EAAE,EAC7CA,GAEJ,CAEA,MAAO,QAAQF,CAAQ,KAAKA,CAAQ;AAAA,EACpCC,EAAQ,KAAK;AAAA,CAAI,CAAC;AAAA,EAEpB,CAaA,SAASK,GACPrC,EACAM,EACA7D,EACA8D,EACe,CACf,IAAMzD,EAAWkD,EAAK,KAAK,QAAQM,CAAU,EAG7C,GAAIN,EAAK,gBAAkBA,EAAK,eAAe,OAAS,EAEtD,OAAIA,EAAK,KAAK,OAASrD,EAAG,WAAW,aAC5B2F,GAAiCtC,EAAMM,EAAY7D,CAAQ,EAE7D8F,GACLvC,EACAM,EACA7D,EACA8D,CACF,EAIF,IAAMiC,EAAgBd,GAA0B1B,EAAK,KAAMM,CAAU,EACrE,GAAIkC,EACF,MAAO,SAAS1F,CAAQ,KAAKA,CAAQ,KAAK0F,EAAc,KAAK,KAAK,CAAC,GAIrE,GAAIxC,EAAK,KAAK,OAASrD,EAAG,WAAW,aAAc,CACjD,IAAM4B,EAAWyB,EAAK,KAChBxB,EAAqB,CAAC,EAC5B,QAAWC,KAASF,EAAS,WAAY,CACvC,IAAMG,EAAOD,EAAM,MAAM,QAAQ6B,CAAU,GAAK,IAChD,GAAI5B,IAAS,OAAQ,SACrB,IAAIC,EAAerC,EAAcmC,EAAM,KAAM,OAAWhC,CAAQ,EAC5DkC,IAAiB,QAAOA,EAAe,QAC3CH,EAAS,KAAK,GAAGE,CAAI,KAAKC,CAAY,EAAE,CAC1C,CACA,IAAIC,EAAWtC,EAAciC,EAAS,KAAM,OAAW9B,CAAQ,EAC3DmC,IAAa,QAAOA,EAAW,QACnC,IAAMC,EAAiB,CAAC,EACxB,OAAIL,EAAS,OAAS,GAAGK,EAAK,KAAK,aAAaL,EAAS,KAAK,IAAI,CAAC,IAAI,EACnEI,IAAa,aAAaC,EAAK,KAAK,YAAYD,CAAQ,EAAE,EACvD,qBAAqB9B,CAAQ;AAAA,IAAS+B,EAAK,KAAK;AAAA,GAAM,CAAC;AAAA,EAChE,CAEA,IAAMC,EAAUxC,EAAc0D,EAAK,KAAM,OAAWvD,CAAQ,EAG5D,GAAIqC,IAAY,OAASA,IAAY,YAAa,CAChD,IAAM2D,EAAezC,EAAK,KAAK,QAAQM,CAAU,EAAE,KAAK,EAExD,MAAO,QAAQxD,CAAQ;AAAA,WAAgB2F,CAAY;AAAA,EACrD,CAGA,OACE3D,IAAY,MACZA,IAAY,KACZA,IAAY,QACZA,IAAY,OAEL,QAAQhC,CAAQ,IAAIgC,CAAO,GAG7B,QAAQhC,CAAQ;AAAA,aACZgC,CAAO;AAAA,EAEpB,CAMA,SAASwD,GACPtC,EACAM,EACA7D,EACQ,CACR,IAAMK,EAAWkD,EAAK,KAAK,QAAQM,CAAU,EACvC/B,EAAWyB,EAAK,KAGhBgB,EAAiB,IAAI,IACrBf,EAAuB,CAAC,EAC9B,QAAW1C,KAAMyC,EAAK,eAAiB,CACrC,IAAMtB,EAAOnB,EAAG,KAAK,QAAQ+C,CAAU,EAEvC,GADAU,EAAe,IAAItC,CAAI,EACnBnB,EAAG,QAAS,CACd,IAAM6C,EAAiB9D,EAAciB,EAAG,QAAS,OAAWd,CAAQ,EACpEwD,EAAW,KAAK,GAAGvB,CAAI,MAAM0B,CAAc,EAAE,CAC/C,MACEH,EAAW,KAAKvB,CAAI,CAExB,CAGA,IAAMF,EAAqB,CAAC,EAC5B,QAAWC,KAASF,EAAS,WAAY,CACvC,IAAMG,EAAOD,EAAM,MAAM,QAAQ6B,CAAU,GAAK,IAChD,GAAI5B,IAAS,OAAQ,SACrB,IAAMgE,EAAgBjE,EAAM,MAAM,QAAQ6B,CAAU,GAAK,MACzD,GAAIU,EAAe,IAAI0B,CAAa,EAElClE,EAAS,KAAK,GAAGE,CAAI,KAAKgE,CAAa,EAAE,MACpC,CACL,IAAI/D,EAAerC,EAAcmC,EAAM,KAAM,OAAWhC,CAAQ,EAC5DkC,IAAiB,QAAOA,EAAe,QAC3CH,EAAS,KAAK,GAAGE,CAAI,KAAKC,CAAY,EAAE,CAC1C,CACF,CAGA,IAAMgE,EAAiBpE,EAAS,MAAM,QAAQ+B,CAAU,GAAK,OACzD1B,EACA+D,IAAmB,SACjB3B,EAAe,IAAI2B,CAAc,EACnC/D,EAAW+D,GAEX/D,EAAWtC,EAAciC,EAAS,KAAM,OAAW9B,CAAQ,EACvDmC,IAAa,QAAOA,EAAW,QAC/BA,IAAa,cAAaA,EAAW,UAI7C,IAAMC,EAAiB,CAAC,EACxB,OAAIL,EAAS,OAAS,GAAGK,EAAK,KAAK,aAAaL,EAAS,KAAK,IAAI,CAAC,IAAI,EACnEI,IAAa,QAAWC,EAAK,KAAK,YAAYD,CAAQ,EAAE,EACrD,qBAAqB9B,CAAQ,IAAImD,EAAW,KACjD,IACF,CAAC;AAAA,IAAUpB,EAAK,KAAK;AAAA,GAAM,CAAC;AAAA,EAC9B,CAKA,SAAS0D,GACPvC,EACAM,EACA7D,EACA8D,EACQ,CACR,IAAMzD,EAAWkD,EAAK,KAAK,QAAQM,CAAU,EACvCL,EAAuB,CAAC,EAG9B,QAAWxB,KAASuB,EAAK,gBAAkB,CAAC,EAAG,CAC7C,IAAMa,EAAYpC,EAAM,KAAK,QAAQ6B,CAAU,EAC/C,GAAI7B,EAAM,QAAS,CACjB,IAAM2B,EAAiB9D,EAAcmC,EAAM,QAAS,OAAWhC,CAAQ,EACvEwD,EAAW,KAAK,GAAGY,CAAS,MAAMT,CAAc,EAAE,CACpD,MACEH,EAAW,KAAKY,CAAS,CAE7B,CAEA,IAAMG,GAAkBhB,EAAK,gBAAkB,CAAC,GAAG,IAAKiB,GACtDA,EAAE,KAAK,QAAQX,CAAU,CAC3B,EAGMK,EAAsBJ,GAAa,KAAMG,GAAMA,EAAE,OAAS,WAAW,EACrEI,EAAwBP,GAAa,KACxCG,GAAMA,EAAE,OAAS,aACpB,EAEIK,EACAJ,GAAqB,KACvBI,EAAgBJ,EAAoB,KAGpCI,EAAgB,aADQ,CAAC,IAAK,GAAGC,CAAc,EAAE,KAAK,IAAI,CACd,oBAG9C,IAAMJ,EAAQ,CAAC,iBAAiB9D,CAAQ,IAAKiE,CAAa,EAE1D,GAAID,GAAuB,KACzBF,EAAM,KAAK,eAAeE,EAAsB,IAAI,EAAE,MACjD,CAEL,IAAM8B,EAAW5C,EAAK,KAEtB,GAAI4C,GAAYjG,EAAG,kBAAkBiG,CAAQ,EAAG,CAE9C,IAAMtB,EAAwB,CAAC,EAC/B,QAAWlE,KAAUwF,EAAS,QAC5B,GAAIjG,EAAG,oBAAoBS,CAAM,GAAKA,EAAO,KAAM,CACjD,IAAMC,EAAWD,EAAO,KAAK,QAAQkD,CAAU,EACzCiB,EAAWnE,EAAO,cAAgB,IAAM,GACxCoE,EAAWpE,EAAO,KAAOA,EAAO,KAAK,QAAQkD,CAAU,EAAI,MACjEgB,EAAY,KAAK,GAAGjE,CAAQ,GAAGkE,CAAQ,KAAKC,CAAQ,EAAE,CACxD,MAAW7E,EAAG,kBAAkBS,CAAM,GAAKA,EAAO,MAChDkE,EAAY,KAAKlE,EAAO,QAAQkD,CAAU,EAAE,KAAK,EAAE,QAAQ,KAAM,EAAE,CAAC,EAGpEgB,EAAY,OAAS,GACvBV,EAAM,KAAK;AAAA,MAAsBU,EAAY,KAAK;AAAA,KAAQ,CAAC;AAAA,IAAO,CAEtE,SAAWsB,EAAU,CAGnB,IAAMpB,EAAWoB,EAAS,QAAQtC,CAAU,EAAE,KAAK,EACnDM,EAAM,KAAK;AAAA,aAA6BY,CAAQ;AAAA,IAAO,CACzD,CACF,CAEA,MAAO,WAAW1E,CAAQ,IAAImD,EAAW,KAAK,IAAI,CAAC;AAAA,IAAUW,EAAM,KACjE;AAAA,GACF,CAAC;AAAA,EACH,CAEA,SAASiC,GACP7C,EACAM,EACAwC,EACArG,EACAsG,EACArG,EACQ,CAER,IAAIsG,EAGJ,GAAIhD,EAAK,gBAAkBA,EAAK,eAAe,OAAS,EAAG,CACzDgD,EAAe,IAAI,IACnB,QAAWzF,KAAMyC,EAAK,eACpBgD,EAAa,IAAIzF,EAAG,KAAK,QAAQ+C,CAAU,EAAG,CAC5C,WAAY/C,EAAG,WACf,QAASA,EAAG,OACd,CAAC,CAEL,CAGA,IAAM0F,EACJD,GAAgBtG,EACZ,CAAE,GAAGA,EAAK,WAAYsG,GAAgBtG,GAAK,UAAW,EACtDA,EAEAwG,EAAqB,CAAC,EACtBC,EAASC,EACbpD,EAAK,WACLM,EACA7D,EACAyG,EACAD,CACF,EAGM,CAAE,KAAAI,CAAK,EAAI/C,EAAW,8BAC1BN,EAAK,SAASM,CAAU,CAC1B,EACMgD,EAAcP,EAAoB,WAAWM,EAAO,CAAC;AAAA,EAAU,GAE/DE,EACJT,IACCnG,EAAG,sBAAsBqD,CAAI,GAAKA,EAAK,KACpCA,EAAK,KAAK,QAAQM,CAAU,EAC5B,IACAkD,EAAgBxD,EAAK,KACvB1D,EAAc0D,EAAK,KAAM,OAAWvD,EAAUwG,CAAU,EACxD,GAGEQ,EACJD,GACAA,IAAkB,aAClBA,IAAkB,OAClB,CAACA,EAAc,WAAW,MAAM,EAC5B,MAAMA,CAAa,GACnB,GAGN,GAAIxD,EAAK,OAASwD,IAAkB,OAASA,IAAkB,aAAc,CAC3E,IAAME,EAAiB1D,EAAK,KAAK,QAAQM,CAAU,EAEjDoD,IAAmB,OACnBA,IAAmB,WACnBA,IAAmB,QAEnBR,EAAS,KAAK,WAAWQ,CAAc,EAAE,CAE7C,CAGA,IAAIC,EAAO,GACX,GAAI3D,EAAK,KAAM,CACb,IAAM4D,EAAWjH,EAAG,QAAQqD,EAAK,IAAI,EACjCA,EAAK,KAAK,QAAQM,CAAU,EAC5B,YAAYN,EAAK,KAAK,QAAQM,CAAU,CAAC,KAU7CqD,EAPmBhH,EAAG,gBAAgBiH,EAAU,CAC9C,gBAAiB,CACf,OAAQjH,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EACiB,WAAW,KAAK,CACpC,MACEgH,EAAO,MAIT,IAAME,EAAa7D,EAAK,WAAW,KAChC8D,GAAMA,EAAE,OAASnH,EAAG,WAAW,aAClC,EACMoH,EAAU/D,EAAK,WAAW,KAC7B8D,GAAMA,EAAE,OAASnH,EAAG,WAAW,YAClC,EACMqH,EAAc,CAAC,CAAEhE,EAAgC,cACjDiE,EAAeJ,EAAa,UAAY,GACxCK,EAAcH,EAAU,SAAW,GACnCI,EAAcH,EAAc,aAAe,YAG3CI,EACJlB,EAAS,OAAS,EACd,qCAAgCA,EAAS,KAAK,IAAI,CAAC;AAAA,EACnD,GAEN,MAAO,GAAGI,CAAW,GAAGc,CAAe,GAAGH,CAAY,GAAGC,CAAW,GAAGC,CAAW,GAAGZ,CAAQ,IAAIJ,EAAO,KACtG,IACF,CAAC,IAAIM,CAAgB,IAAIE,CAAI,EAC/B,CAOA,SAASU,GACPC,EACAC,EACAjE,EACA7D,EACU,CACV,IAAM8G,EAAWgB,EAAe,MAAM,QAAQjE,CAAU,GAAK,GACvDkE,EAAW,IAAIjB,CAAQ,QACvBkB,EAAoB,CAAC,EAGrBC,EAAatB,EACjBmB,EAAe,WACfjE,EACA7D,CACF,EACIkI,EAAW,MACf,GAAIJ,EAAe,KAAM,CACvB,IAAMX,EAAWW,EAAe,KAAK,QAAQjE,CAAU,EAQvDqE,EAPmBhI,EAAG,gBAAgBiH,EAAU,CAC9C,gBAAiB,CACf,OAAQjH,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EACqB,WAAW,KAAK,CACxC,CACA,IAAMoH,EAAUQ,EAAe,WAAW,KACvCT,GAAMA,EAAE,OAASnH,EAAG,WAAW,YAClC,EACMqH,EAAc,CAAC,CAACO,EAAe,cAC/BL,EAAcH,EAAU,SAAW,GACnCI,EAAcH,EAAc,aAAe,YAEjDS,EAAQ,KACN,GAAGP,CAAW,GAAGC,CAAW,GAAGK,CAAQ,IAAIE,EAAW,KACpD,IACF,CAAC,KAAKC,CAAQ,EAChB,EAGA,QAAWC,KAAON,EAAY,CAC5B,IAAMnB,EAASC,EAAgBwB,EAAI,WAAYtE,EAAY7D,CAAQ,EAC7DoI,EAAaD,EAAI,WAAW,IAAK3D,GAAMA,EAAE,KAAK,QAAQX,CAAU,CAAC,EACjEkD,EAAgBoB,EAAI,KACtBtI,EAAcsI,EAAI,KAAM,OAAWnI,CAAQ,EAC3C,GACEgH,EACJD,GAAiBA,IAAkB,aAAeA,IAAkB,MAChE,MAAMA,CAAa,GACnB,GAEA,CAAE,KAAAH,CAAK,EAAI/C,EAAW,8BAC1BsE,EAAI,SAAStE,CAAU,CACzB,EACMgD,EAAc,WAAWD,EAAO,CAAC;AAAA,EACjCyB,EAAWd,EAAc,UAAY,UAE3CS,EAAQ,KACN,GAAGnB,CAAW,GAAGY,CAAW,GAAGC,CAAW,GAAGZ,CAAQ,IAAIJ,EAAO,KAC9D,IACF,CAAC,IAAIM,CAAgB,MAAMqB,CAAQ,GAAGN,CAAQ,IAAIK,EAAW,KAC3D,IACF,CAAC,KACH,CACF,CAEA,OAAOJ,CACT,CAMA,SAASM,GACP/E,EACAM,EACA7D,EACAC,EACAsI,EAAuB,GACf,CAER,IAAI/B,EAAavG,EACjB,GAAIsD,EAAK,gBAAkBA,EAAK,eAAe,OAAS,EAAG,CACzD,IAAMgD,EAAe,IAAI,IAIzB,QAAWzF,KAAMyC,EAAK,eACpBgD,EAAa,IAAIzF,EAAG,KAAK,QAAQ+C,CAAU,EAAG,CAC5C,WAAY/C,EAAG,WACf,QAASA,EAAG,OACd,CAAC,EAEH0F,EAAa,CAAE,GAAGvG,EAAK,WAAYsG,CAAa,CAClD,CAEA,IAAMiC,EAAYjF,EAAK,MAAM,QAAQM,CAAU,GAAK,YAK9C4E,EAHclF,EAAK,iBAAiB,KACvCmF,GAAMA,EAAE,QAAUxI,EAAG,WAAW,cACnC,GAAG,MAAM,CAAC,GACyB,YAAY,QAAQ2D,CAAU,EAI3D8E,EAAkB,IAAI,IAC5B,GAAIJ,GACF,QAAW5H,KAAU4C,EAAK,QACxB,GAAIrD,EAAG,sBAAsBS,CAAM,GAAKA,EAAO,KAAM,CACnD,IAAMC,EAAWD,EAAO,KAAK,QAAQkD,CAAU,EAC7BlD,EAAO,WAAW,KACjC0G,GAAMA,EAAE,OAASnH,EAAG,WAAW,cAClC,GACiB,CAACU,EAAS,WAAW,GAAG,GACvC+H,EAAgB,IAAI/H,EAAU,IAAIA,CAAQ,EAAE,CAEhD,EAMJ,IAAMgI,EAAsBC,GAAyB,CACnD,IAAI7F,EAAS6F,EACb,OAAW,CAACC,EAAQC,CAAM,IAAKJ,EAG7B3F,EAASA,EAAO,QACd,IAAI,OAAO,eAAe8F,CAAM,MAAO,GAAG,EAC1C,MAAMC,CAAM,EACd,EAEF,OAAO/F,CACT,EAEMuC,EAAoB,CAAC,EAE3B,QAAW5E,KAAU4C,EAAK,QAAS,CAEjC,GAAIrD,EAAG,yBAAyBS,CAAM,EAAG,CACvC,IAAM+F,EAASC,EAAgBhG,EAAO,WAAYkD,EAAY7D,CAAQ,EAClEkH,EAAO,MACX,GAAIvG,EAAO,KAAM,CACf,IAAMqI,EAAa9I,EAAG,gBAAgBS,EAAO,KAAK,QAAQkD,CAAU,EAAG,CACrE,gBAAiB,CACf,OAAQ3D,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EACDgH,EAAO0B,EAAmBI,EAAW,WAAW,KAAK,CAAC,CACxD,CACAzD,EAAQ,KAAK,iBAAiBmB,EAAO,KAAK,IAAI,CAAC,KAAKQ,CAAI,EAAE,CAC5D,CAGA,GAAIhH,EAAG,oBAAoBS,CAAM,GAAKA,EAAO,KAAM,CACjD,IAAMsI,EAAatI,EAAO,KAAK,QAAQkD,CAAU,EAC3CqF,EAAWvI,EAAO,WAAW,KAChC0G,GAAMA,EAAE,OAASnH,EAAG,WAAW,aAClC,EACMoH,EAAU3G,EAAO,WAAW,KAC/B0G,GAAMA,EAAE,OAASnH,EAAG,WAAW,YAClC,EAEMwG,EAASC,EACbhG,EAAO,WACPkD,EACA7D,EACA,OACAwG,CACF,EACMO,EAAgBpG,EAAO,KACzBd,EAAcc,EAAO,KAAM,OAAWX,EAAUwG,CAAU,EAC1D,GAEEQ,EACJD,GACAA,IAAkB,aAClBA,IAAkB,MACd,MAAMA,CAAa,GACnB,GAEFG,EAAO,MACX,GAAIvG,EAAO,KAAM,CACf,IAAMqI,EAAa9I,EAAG,gBAAgBS,EAAO,KAAK,QAAQkD,CAAU,EAAG,CACrE,gBAAiB,CACf,OAAQ3D,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EACDgH,EAAO0B,EAAmBI,EAAW,WAAW,KAAK,CAAC,CACxD,CAEA,IAAMzB,EAAc,CAAC,CAAC5G,EAAO,cACvBwI,EAAeD,EAAW,UAAY,GACtCzB,EAAcH,EAAU,SAAW,GACnC8B,EAAgB7B,EAAc,IAAM,GAC1ChC,EAAQ,KACN,KAAK4D,CAAY,GAAG1B,CAAW,GAAG2B,CAAa,GAAGH,CAAU,IAAIvC,EAAO,KACrE,IACF,CAAC,IAAIM,CAAgB,IAAIE,CAAI,EAC/B,CACF,CAGA,GAAIhH,EAAG,yBAAyBS,CAAM,GAAKA,EAAO,KAAM,CACtD,IAAMC,EAAWD,EAAO,KAAK,QAAQkD,CAAU,EAIzCsF,EAHWxI,EAAO,WAAW,KAChC0G,GAAMA,EAAE,OAASnH,EAAG,WAAW,aAClC,EACgC,UAAY,GACtC6G,EAAgBpG,EAAO,KACzBd,EAAcc,EAAO,KAAM,OAAWX,EAAUwG,CAAU,EAC1D,GACEQ,EACJD,GACAA,IAAkB,aAClBA,IAAkB,OAClB,CAACA,EAAc,WAAW,MAAM,EAC5B,KAAKA,CAAa,GAClB,GAEFG,EAAO,MACX,GAAIvG,EAAO,KAAM,CACf,IAAMqI,EAAa9I,EAAG,gBAAgBS,EAAO,KAAK,QAAQkD,CAAU,EAAG,CACrE,gBAAiB,CACf,OAAQ3D,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EACDgH,EAAO0B,EAAmBI,EAAW,WAAW,KAAK,CAAC,CACxD,CAEAzD,EAAQ,KACN,KAAK4D,CAAY,OAAOvI,CAAQ,KAAKoG,CAAgB,IAAIE,CAAI,EAC/D,CACF,CAGA,GAAIhH,EAAG,yBAAyBS,CAAM,GAAKA,EAAO,KAAM,CACtD,IAAMC,EAAWD,EAAO,KAAK,QAAQkD,CAAU,EAIzCsF,EAHWxI,EAAO,WAAW,KAChC0G,GAAMA,EAAE,OAASnH,EAAG,WAAW,aAClC,EACgC,UAAY,GACtCwG,EAASC,EAAgBhG,EAAO,WAAYkD,EAAY7D,CAAQ,EAElEkH,EAAO,MACX,GAAIvG,EAAO,KAAM,CACf,IAAMqI,EAAa9I,EAAG,gBAAgBS,EAAO,KAAK,QAAQkD,CAAU,EAAG,CACrE,gBAAiB,CACf,OAAQ3D,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EACDgH,EAAO0B,EAAmBI,EAAW,WAAW,KAAK,CAAC,CACxD,CAEAzD,EAAQ,KACN,KAAK4D,CAAY,OAAOvI,CAAQ,IAAI8F,EAAO,KAAK,IAAI,CAAC,KAAKQ,CAAI,EAChE,CACF,CAGA,GAAIhH,EAAG,sBAAsBS,CAAM,GAAKA,EAAO,KAAM,CACnD,IAAM0I,EAAW1I,EAAO,KAAK,QAAQkD,CAAU,EAIzCsF,EAHWxI,EAAO,WAAW,KAChC0G,GAAMA,EAAE,OAASnH,EAAG,WAAW,aAClC,EACgC,UAAY,GAGtCU,EAAW+H,EAAgB,IAAIU,CAAQ,GAAKA,EAElD,GAAI1I,EAAO,YAAa,CAGtB,IAAM2I,EAAW3I,EAAO,YAAY,QAAQkD,CAAU,EAChD0F,EAAUD,EAAS,UAAU,EAAE,WAAW,GAAG,EAC/C,IAAIA,CAAQ,IACZA,EAQAE,EAPetJ,EAAG,gBAAgBqJ,EAAS,CAC7C,gBAAiB,CACf,OAAQrJ,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EACuB,WAAW,KAAK,EAEpCqJ,IAAYD,IACdE,EAASA,EAAO,QAAQ,MAAO,EAAE,EAAE,QAAQ,WAAY,EAAE,GAE3DjE,EAAQ,KAAK,KAAK4D,CAAY,GAAGvI,CAAQ,MAAM4I,CAAM,EAAE,CACzD,MAEEjE,EAAQ,KAAK,KAAK4D,CAAY,GAAGvI,CAAQ,EAAE,CAE/C,CACF,CAKA,IAAM4G,EAHajE,EAAK,WAAW,KAChC,GAAM,EAAE,OAASrD,EAAG,WAAW,aAClC,EACkC,UAAY,GACxCuJ,EAAahB,EAAgB,YAAYA,CAAa,GAAK,GACjE,MAAO,GAAGjB,CAAY,SAASgB,CAAS,GAAGiB,CAAU;AAAA,EAAOlE,EAAQ,KAClE;AAAA,CACF,CAAC;AAAA,EACH,CAKA,SAASoB,EACP+C,EACA7F,EACA7D,EACAyG,EACAxG,EACU,CACV,IAAMyG,EAAmB,CAAC,EAE1B,QAAW1E,KAAS0H,EAAY,CAC9B,IAAMzH,EAAOD,EAAM,KAAK,QAAQ6B,CAAU,EAE1C,GAAI5B,IAAS,OAAQ,SACrB,IAAM0H,EAAS,CAAC,CAAC3H,EAAM,eACjB4H,EAAa,CAAC,CAAC5H,EAAM,eAAiB,CAAC,CAACA,EAAM,YAC9C6H,EAAchK,EAAcmC,EAAM,KAAM,OAAWhC,EAAUC,CAAG,EAEtE,GAAI0J,EAGEE,IAAgB,OAASA,IAAgB,YAC3CnD,EAAO,KAAK,MAAMzE,CAAI,UAAU,EAEhCyE,EAAO,KAAK,MAAMzE,CAAI,KAAK4H,CAAW,EAAE,UAEjC7H,EAAM,YAAa,CAE5B,IAAM8H,EAAc9H,EAAM,YAAY,QAAQ6B,CAAU,EACxD6C,EAAO,KAAK,GAAGzE,CAAI,MAAM6H,CAAW,EAAE,CACxC,SAAWD,IAAgB,OAASA,IAAgB,aAIlD,GAFAnD,EAAO,KAAKzE,CAAI,EAEZwE,GAAYzE,EAAM,KAAM,CAC1B,IAAMgE,EAAehE,EAAM,KAAK,QAAQ6B,CAAU,EAC9CmC,IAAiB,OAASA,IAAiB,WAC7CS,EAAS,KAAK,GAAGxE,CAAI,KAAK+D,CAAY,EAAE,CAE5C,OACS4D,EAGTlD,EAAO,KAAK,GAAGzE,CAAI,KAAK4H,CAAW,cAAc,EAGjDnD,EAAO,KAAK,GAAGzE,CAAI,KAAK4H,CAAW,EAAE,CAEzC,CAEA,OAAOnD,CACT,CAKA,SAASqD,GACPxG,EACAM,EACA7D,EACAC,EACkB,CAElB,IAAIuG,EAAavG,EACjB,GAAIsD,EAAK,gBAAkBA,EAAK,eAAe,OAAS,EAAG,CACzD,IAAMgD,EAAe,IAAI,IAIzB,QAAWzF,KAAMyC,EAAK,eACpBgD,EAAa,IAAIzF,EAAG,KAAK,QAAQ+C,CAAU,EAAG,CAC5C,WAAY/C,EAAG,WACf,QAASA,EAAG,OACd,CAAC,EAEH0F,EAAa,CAAE,GAAGvG,EAAK,WAAYsG,CAAa,CAClD,CAEA,IAAMtE,EACJ/B,EAAG,sBAAsBqD,CAAI,GAAKA,EAAK,KACnCA,EAAK,KAAK,QAAQM,CAAU,EAC5B,YACA6C,EAAwC,CAAC,EAE/C,QAAW1E,KAASuB,EAAK,WAAY,CACnC,IAAMa,EAAYpC,EAAM,KAAK,QAAQ6B,CAAU,EACzC+F,EAAa,CAAC,CAAC5H,EAAM,eAAiB,CAAC,CAACA,EAAM,YAEhDgI,EACJ,GAAIhI,EAAM,YAAa,CAErB,IAAMsH,EAAWtH,EAAM,YAAY,QAAQ6B,CAAU,EACrD,GAAI,CACFmG,EAAe,KAAK,MAAMV,CAAQ,CACpC,MAAQ,CACNU,EAAeV,CACjB,CACF,CAEA5C,EAAOtC,CAAS,EAAI,CAClB,KAAM9B,EAAWN,EAAM,KAAMwE,CAAU,EACvC,SAAU,CAACoD,EACX,QAASI,CACX,CACF,CAEA,IAAMhH,EAA2B,CAC/B,KAAAf,EACA,OAAAyE,EACA,QAASnD,EAAK,KAAOjB,EAAWiB,EAAK,KAAMiD,CAAU,EAAI,MAC3D,EAGMhD,EAAaF,GAAkBC,EAAMvD,CAAQ,EACnD,OAAIwD,IACFR,EAAO,WAAaQ,GAGfR,CACT,CAKA,SAASiH,GACP1G,EACAM,EACA7D,EACAC,EACe,CAEf,IAAIuG,EAAavG,EACjB,GAAIsD,EAAK,gBAAkBA,EAAK,eAAe,OAAS,EAAG,CACzD,IAAMgD,EAAe,IAAI,IAIzB,QAAWzF,KAAMyC,EAAK,eACpBgD,EAAa,IAAIzF,EAAG,KAAK,QAAQ+C,CAAU,EAAG,CAC5C,WAAY/C,EAAG,WACf,QAASA,EAAG,OACd,CAAC,EAEH0F,EAAa,CAAE,GAAGvG,EAAK,WAAYsG,CAAa,CAClD,CAEA,IAAMtE,EAAOsB,EAAK,MAAM,QAAQM,CAAU,GAAK,YACzCqG,EAA4C,CAAC,EAC7CC,EAAkD,CAAC,EACrDC,EAEJ,QAAWzJ,KAAU4C,EAAK,QAAS,CAEjC,GAAIrD,EAAG,yBAAyBS,CAAM,EAAG,CACvC,IAAM+F,EAAwC,CAAC,EAC/C,QAAW1E,KAASrB,EAAO,WAAY,CACrC,IAAMyD,EAAYpC,EAAM,KAAK,QAAQ6B,CAAU,EACzC+F,EAAa,CAAC,CAAC5H,EAAM,eAAiB,CAAC,CAACA,EAAM,YAEhDgI,EACJ,GAAIhI,EAAM,YAAa,CACrB,IAAMsH,EAAWtH,EAAM,YAAY,QAAQ6B,CAAU,EACrD,GAAI,CACFmG,EAAe,KAAK,MAAMV,CAAQ,CACpC,MAAQ,CACNU,EAAeV,CACjB,CACF,CAEA5C,EAAOtC,CAAS,EAAI,CAClB,KAAM9B,EAAWN,EAAM,KAAMwE,CAAU,EACvC,SAAU,CAACoD,EACX,QAASI,CACX,CACF,CACAI,EAAkB,CAAE,OAAA1D,CAAO,CAC7B,CAGA,GAAIxG,EAAG,oBAAoBS,CAAM,GAAKA,EAAO,KAAM,CACjD,IAAMsI,EAAatI,EAAO,KAAK,QAAQkD,CAAU,EAC3CqF,EAAWvI,EAAO,WAAW,KAChC,GAAM,EAAE,OAAST,EAAG,WAAW,aAClC,EAEMwG,EAAwC,CAAC,EAC/C,QAAW1E,KAASrB,EAAO,WAAY,CACrC,IAAMyD,EAAYpC,EAAM,KAAK,QAAQ6B,CAAU,EACzC+F,EAAa,CAAC,CAAC5H,EAAM,eAAiB,CAAC,CAACA,EAAM,YAEhDgI,EACJ,GAAIhI,EAAM,YAAa,CACrB,IAAMsH,EAAWtH,EAAM,YAAY,QAAQ6B,CAAU,EACrD,GAAI,CACFmG,EAAe,KAAK,MAAMV,CAAQ,CACpC,MAAQ,CACNU,EAAeV,CACjB,CACF,CAEA5C,EAAOtC,CAAS,EAAI,CAClB,KAAM9B,EAAWN,EAAM,KAAMwE,CAAU,EACvC,SAAU,CAACoD,EACX,QAASI,CACX,CACF,CAEA,IAAMK,EAA+B,CACnC,KAAMpB,EACN,OAAAvC,EACA,QAAS/F,EAAO,KAAO2B,EAAW3B,EAAO,KAAM6F,CAAU,EAAI,MAC/D,EAEI0C,EACFiB,EAAclB,CAAU,EAAIoB,EAE5BH,EAAQjB,CAAU,EAAIoB,CAE1B,CACF,CAEA,IAAMrH,EAAwB,CAC5B,KAAAf,EACA,QAAAiI,EACA,cAAAC,EACA,YAAaC,CACf,EAGA,GAAI7G,EAAK,gBAAkBA,EAAK,eAAe,OAAS,EAAG,CACzD,IAAMC,EAA4C,CAAC,EACnD,QAAWxB,KAASuB,EAAK,eAAgB,CACvC,IAAMa,EAAYpC,EAAM,KAAK,QAAQ6B,CAAU,EACzCJ,EAAsB,CAAC,EACzBzB,EAAM,aACRyB,EAAK,WAAa5D,EAChBmC,EAAM,WACN,OACAhC,EACAC,CACF,GAEE+B,EAAM,UACRyB,EAAK,QAAU5D,EAAcmC,EAAM,QAAS,OAAWhC,EAAUC,CAAG,GAEtEuD,EAAWY,CAAS,EAAIX,CAC1B,CACAT,EAAO,WAAaQ,CACtB,CAEA,OAAOR,CACT,CAqBA,IAAMsH,GAAkB,IAAI,IAAI,CAC9B,YACA,YACA,WACA,UACA,YACA,WACA,cACA,aACF,CAAC,EAMD,SAASC,GAAgBC,EAA0B,CACjD,IAAMC,EAAkB,CAAC,EACnBC,EAAK,sCACPrD,EACJ,MAAQA,EAAIqD,EAAG,KAAKF,CAAM,KAAO,MAAM,CACrC,IAAMG,EAAQtD,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,EACrC,QAAWuD,KAAQD,EACbL,GAAgB,IAAIM,CAAI,GAAK,CAACH,EAAM,SAASG,CAAI,GACnDH,EAAM,KAAKG,CAAI,CAGrB,CACA,OAAOH,CACT,CAWA,SAASI,GAAsBL,EAAiC,CAC9D,IAAM1G,EAA+B,CAAC,EAGhCgH,EAAS,2BACXzD,EACJ,MAAQA,EAAIyD,EAAO,KAAKN,CAAM,KAAO,MACnC1G,EAAY,KAAK,CAAE,MAAOuD,EAAE,MAAO,KAAM,MAAO,CAAC,EAInD,IAAM0D,EAAS,4DACf,MAAQ1D,EAAI0D,EAAO,KAAKP,CAAM,KAAO,MACnC1G,EAAY,KAAK,CACf,MAAOuD,EAAE,MACT,KAAM,YACN,KAAM,YAAYA,EAAE,CAAC,EAAE,KAAK,CAAC,EAC/B,CAAC,EAIH,IAAM2D,EAAO,8CACb,MAAQ3D,EAAI2D,EAAK,KAAKR,CAAM,KAAO,MACjC1G,EAAY,KAAK,CAAE,MAAOuD,EAAE,MAAO,KAAM,UAAW,KAAMA,EAAE,CAAC,EAAE,KAAK,CAAE,CAAC,EAIzE,IAAM4D,EAAS,qDACf,MAAQ5D,EAAI4D,EAAO,KAAKT,CAAM,KAAO,MACnC1G,EAAY,KAAK,CACf,MAAOuD,EAAE,MACT,KAAM,cACN,KAAMA,EAAE,CAAC,EAAE,KAAK,CAClB,CAAC,EAGH,OAAOvD,EAAY,KAAK,CAACG,EAAGiH,IAAMjH,EAAE,MAAQiH,EAAE,KAAK,CACrD,CAKA,SAASC,GACPrH,EACAD,EAC8B,CAC9B,IAAMb,EAAS,IAAI,IACnB,GAAIc,EAAY,SAAW,EAAG,OAAOd,EAErC,IAAMoI,EAAavH,EAAW,WAC9B,QAASwH,EAAK,EAAGA,EAAKD,EAAW,OAAQC,IAAM,CAC7C,IAAMC,EAAOF,EAAWC,CAAE,EACtBpJ,EAUJ,IARI/B,EAAG,uBAAuBoL,CAAI,GAEvBpL,EAAG,uBAAuBoL,CAAI,GAE9BpL,EAAG,kBAAkBoL,CAAI,KAClCrJ,EAAOqJ,EAAK,KAAK,QAAQzH,CAAU,GAGjC,CAAC5B,EAAM,SAEX,IAAMsJ,EAAYD,EAAK,SAASzH,CAAU,EACpC2H,EAAUH,EAAK,EAAID,EAAWC,EAAK,CAAC,EAAE,OAAO,EAAI,EAEjDI,EAAW3H,EAAY,OAC1BG,GAAMA,EAAE,OAASuH,GAAWvH,EAAE,MAAQsH,CACzC,EACIE,EAAS,OAAS,GACpBzI,EAAO,IAAIf,EAAMwJ,CAAQ,CAE7B,CAEA,OAAOzI,CACT,CAEA,SAAS0I,GAA4BlB,EAA0B,CAC7D,IAAMmB,EAAkB,CAAC,EAEnBC,EACJ,sFAEEC,EACJ,MAAQA,EAAQD,EAAc,KAAKpB,CAAM,KAAO,MAC9CmB,EAAM,KAAKE,EAAM,CAAC,CAAC,EAErB,OAAOF,CACT,CAOA,SAASG,GACPtB,EAC2C,CAC3C,IAAMuB,EAAsD,CAAC,EACvDC,EAAW,qBAGbC,EAAa,EACbC,EAA0B,KAGxBC,EAAyB,CAAC,EAChC,QAASxK,EAAI,EAAGA,EAAI6I,EAAO,OAAQ7I,IAAK,CACtC,IAAMyK,EAAK5B,EAAO7I,CAAC,EACb0K,EAAO1K,EAAI,EAAI6I,EAAO7I,EAAI,CAAC,EAAI,GAGjC,CAACuK,IAAaE,IAAO,KAAOA,IAAO,KAAOA,IAAO,KACnDF,EAAWE,EACFF,GAAYE,IAAOF,GAAYG,IAAS,OACjDH,EAAW,MAIRA,IACCE,IAAO,KAAKH,IACZG,IAAO,KAAKH,KAGlBE,EAAaxK,CAAC,EAAIsK,CACpB,CAEA,IAAIJ,EACJ,MAAQA,EAAQG,EAAS,KAAKxB,CAAM,KAAO,MAErC2B,EAAaN,EAAM,KAAK,IAAM,GAChCE,EAAS,KAAK,CACZ,QAASF,EAAM,CAAC,EAChB,MAAOA,EAAM,KACf,CAAC,EAGL,OAAOE,CACT,CAEO,SAASO,GACd9B,EACA+B,EAAyB,CAAC,EACZ,CACd,GAAM,CAAE,QAAAC,EAAU,GAAO,SAAAC,EAAW,UAAW,EAAIF,EAC7CvM,EAAqB,CAAC,EAGtB0M,EAAgBhB,GAA4BlB,CAAM,EAGlDmC,EAAcH,EAAUV,GAAmBtB,CAAM,EAAI,CAAC,EAGtDoC,EAAiBJ,EAAU3B,GAAsBL,CAAM,EAAI,CAAC,EAG5DqC,EAAWtC,GAAgBC,CAAM,EACjCsC,EACJD,EAAS,SAAS,UAAU,GAAKA,EAAS,SAAS,WAAW,EAG1DhJ,EAAa3D,EAAG,iBACpBuM,EACAjC,EACAtK,EAAG,aAAa,OAChB,EACF,EAGM6M,EAAgBP,EAClBrB,GAAmByB,EAAgB/I,CAAU,EAC7C,IAAI,IAEFmJ,EAAyB,CAAC,EAC1BC,EAAgB,IAAI,IACpBC,EAA6C,CAAC,EAC9CC,EAA+C,CAAC,EAGhDC,EAAqB,IAAI,IAGzBC,EAAyBC,GAAgB,CAC7C,QAAS3L,EAAI,EAAGA,EAAIgL,EAAY,OAAQhL,IAAK,CAC3C,IAAM4L,EAAMZ,EAAYhL,CAAC,EACrB,CAACyL,EAAmB,IAAIzL,CAAC,GAAK4L,EAAI,MAAQD,IAC5CN,EAAa,KAAKO,EAAI,OAAO,EAC7BH,EAAmB,IAAIzL,CAAC,EAE5B,CACF,EAGM6L,EAAc,IAAI,IAClBC,EAAa,IAAI,IAEvB,SAASC,EAAanK,EAAe,CAInC,GAHIrD,EAAG,uBAAuBqD,CAAI,GAChCiK,EAAY,IAAIjK,EAAK,KAAK,QAAQM,CAAU,EAAGN,EAAK,IAAI,EAEtDrD,EAAG,uBAAuBqD,CAAI,EAAG,CACnC,IAAMtB,EAAOsB,EAAK,KAAK,QAAQM,CAAU,EACnC8J,EAAWF,EAAW,IAAIxL,CAAI,EACpC,GAAI0L,EAAU,CAEZ,IAAMC,EAAS1N,EAAG,QAAQ,2BACxByN,EACAA,EAAS,UACTA,EAAS,KACTA,EAAS,eACTA,EAAS,gBACT,CAAC,GAAGA,EAAS,QAAS,GAAGpK,EAAK,OAAO,CACvC,EACAkK,EAAW,IAAIxL,EAAM2L,CAAM,CAC7B,MACEH,EAAW,IAAIxL,EAAMsB,CAAI,CAE7B,CACArD,EAAG,aAAaqD,EAAMmK,CAAY,CACpC,CACAA,EAAa7J,CAAU,EAGvB,IAAMgK,EAAuC,CAC3C,YAAAL,EACA,WAAAC,EACA,WAAA5J,EACA,SAAA7D,EACA,cAAe,IAAI,GACrB,EAIM8N,EAAiB,IAAI,IAO3B,QAAWxC,KAAQzH,EAAW,WAC5B,GAAI3D,EAAG,sBAAsBoL,CAAI,GAAKA,EAAK,KAAM,CAC/C,IAAMrJ,EAAOqJ,EAAK,KAAK,QAAQzH,CAAU,EACpCiK,EAAe,IAAI7L,CAAI,GAC1B6L,EAAe,IAAI7L,EAAM,CAAE,WAAY,CAAC,EAAG,eAAgB,IAAK,CAAC,EAEnE,IAAM8L,EAAQD,EAAe,IAAI7L,CAAI,EACjCqJ,EAAK,KACPyC,EAAM,eAAiBzC,EAEvByC,EAAM,WAAW,KAAKzC,CAAI,CAE9B,CAGF,OAAW,CAACrJ,EAAM8L,CAAK,IAAKD,GACtBC,EAAM,WAAW,SAAW,GAAK,CAACA,EAAM,iBAC1CD,EAAe,OAAO7L,CAAI,EAK9B,QAAW+L,KAAanK,EAAW,WAAY,CAC7C,IAAIoK,EAAU,GAQd,GALIzB,GACFa,EAAsBW,EAAU,SAASnK,CAAU,CAAC,EAIlD3D,EAAG,sBAAsB8N,CAAS,GAAKA,EAAU,KAAM,CACzD,IAAMlH,EAAWkH,EAAU,KAAK,QAAQnK,CAAU,EAClDoK,EAAU,GAEV,IAAMC,EAAgBJ,EAAe,IAAIhH,CAAQ,EAEjD,GAAIoH,GAEF,GAAKF,EAAU,KAIb,GAAIxB,EACFQ,EAAa,KACX,GAAGpF,GACDsG,EAAc,WACdF,EACAnK,EACA7D,CACF,CACF,MACK,CACL,IAAMmO,EAAgC,CAAC,EACvC,QAAWhG,KAAO+F,EAAc,WAC9BC,EAAU,KACRpE,GACE5B,EACAtE,EACA7D,EACA6N,CACF,CACF,EAEF,IAAMO,EAAWrE,GACfiE,EACAnK,EACA7D,EACA6N,CACF,EACAO,EAAS,UAAYD,EACrBjB,EAASpG,CAAQ,EAAIsH,CACvB,OAIE5B,EACFQ,EAAa,KACX5G,GACE4H,EACAnK,EACA,OACA7D,EACA,GACA6N,CACF,CACF,EAEAX,EAASpG,CAAQ,EAAIiD,GACnBiE,EACAnK,EACA7D,EACA6N,CACF,CAGN,CAIA,GAAI3N,EAAG,oBAAoB8N,CAAS,EAAG,CACrC,IAAIK,EAAkB,GAGhBC,EAAgBN,EAAU,WAAW,KACxC3G,GAAMA,EAAE,OAASnH,EAAG,WAAW,aAClC,EAEA,QAAWqO,KAAQP,EAAU,gBAAgB,aAC3C,GACE9N,EAAG,aAAaqO,EAAK,IAAI,GACzBA,EAAK,cACJrO,EAAG,gBAAgBqO,EAAK,WAAW,GAClCrO,EAAG,qBAAqBqO,EAAK,WAAW,GAC1C,CACAF,EAAkB,GAClB,IAAMvH,EAAWyH,EAAK,KAAK,QAAQ1K,CAAU,EACvC2K,EAAWD,EAAK,YAEtB,GAAI/B,EAAS,CACX,IAAIiC,EAAUrI,GACZoI,EACA3K,EACAiD,EACA9G,EACA,GACA6N,CACF,EAGA,GAAIS,GAAiB,CAACG,EAAQ,SAAS,SAAS,EAAG,CACjD,IAAMC,EAAgBD,EAAQ,OAAO,4BAA4B,EAC7DC,EAAgB,EAClBD,EACEA,EAAQ,MAAM,EAAGC,CAAa,EAC9B,UACAD,EAAQ,MAAMC,CAAa,EAE7BD,EAAU,UAAYA,CAE1B,CACAzB,EAAa,KAAKyB,CAAO,CAC3B,KAAO,CACL,IAAMhL,EAAOsG,GACXyE,EACA3K,EACA7D,EACA6N,CACF,EACApK,EAAK,KAAOqD,EACZoG,EAASpG,CAAQ,EAAIrD,CACvB,CACF,CAKF,GAAI,CAAC4K,GAAmB7B,EAAS,CAC/B,IAAMxD,EAAa9I,EAAG,gBAAgB8N,EAAU,QAAQnK,CAAU,EAAG,CACnE,gBAAiB,CACf,OAAQ3D,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EACD8M,EAAa,KAAKhE,EAAW,WAAW,KAAK,CAAC,CAChD,CAEAiF,EAAU,EACZ,CAGA,GAAI/N,EAAG,uBAAuB8N,CAAS,IACrCC,EAAU,GACNzB,GAAS,CACX,IAAMnM,EAAW2N,EAAU,KAAK,QAAQnK,CAAU,EAC5CC,EAAciJ,EAAc,IAAI1M,CAAQ,EAC9C,GAAI,CAAC4M,EAAc,IAAI5M,CAAQ,IAC7B4M,EAAc,IAAI5M,CAAQ,EAEtB,CAAAyD,GAAa,KAAMG,GAAMA,EAAE,OAAS,MAAM,GAEvC,CAEL,IAAM2J,EAASH,EAAW,IAAIpN,CAAQ,GAAK2N,EACrCW,EAAW/K,GACfgK,EACA/J,EACA7D,EACA8D,CACF,EACA,GAAI6K,EAAU,CACZ,IAAMvH,EAAa4G,EAAU,WAAW,KACrC3G,GAAMA,EAAE,OAASnH,EAAG,WAAW,aAClC,EACA8M,EAAa,KACX5F,EACIuH,EAAS,QAAQ,0BAA2B,WAAW,EACvDA,CACN,CACF,CACF,CAEJ,CAIF,GAAIzO,EAAG,uBAAuB8N,CAAS,IACrCC,EAAU,GACNzB,GAAS,CACX,IAAMnM,EAAW2N,EAAU,KAAK,QAAQnK,CAAU,EAC5CC,EAAciJ,EAAc,IAAI1M,CAAQ,EAC9C,GAAI,CAAC4M,EAAc,IAAI5M,CAAQ,IAC7B4M,EAAc,IAAI5M,CAAQ,EAEtB,CAAAyD,GAAa,KAAMG,GAAMA,EAAE,OAAS,MAAM,GAEvC,CACL,IAAM0K,EAAW/I,GACfoI,EACAnK,EACA7D,EACA8D,CACF,EACA,GAAI6K,EAAU,CACZ,IAAMvH,EAAa4G,EAAU,WAAW,KACrC3G,GAAMA,EAAE,OAASnH,EAAG,WAAW,aAClC,EACA8M,EAAa,KACX5F,EACIuH,EAAS,QAAQ,0BAA2B,WAAW,EACvDA,CACN,CACF,CACF,CAEJ,CAIF,GAAIzO,EAAG,kBAAkB8N,CAAS,IAChCC,EAAU,GACNzB,GAAS,CACX,IAAMlH,EAAW0I,EAAU,KAAK,QAAQnK,CAAU,EAC5CC,EAAciJ,EAAc,IAAIzH,CAAQ,EAC9C,GAAI,CAAC2H,EAAc,IAAI3H,CAAQ,IAC7B2H,EAAc,IAAI3H,CAAQ,EACtB,CAAAxB,GAAa,KAAMG,GAAMA,EAAE,OAAS,MAAM,GAEvC,CACL,IAAM2K,EAAWxJ,GAAmB4I,EAAWnK,EAAY7D,CAAQ,EAC/D4O,GACF5B,EAAa,KAAK4B,CAAQ,CAE9B,CAEJ,CAIF,GAAI1O,EAAG,mBAAmB8N,CAAS,GAAKA,EAAU,KAAM,CACtD,IAAMxF,EAAYwF,EAAU,KAAK,QAAQnK,CAAU,EAEnD,GADAoK,EAAU,GACNzB,EAAS,CACX,IAAMqC,EAAYvG,GAChB0F,EACAnK,EACA7D,EACA,OACA8M,CACF,EACAE,EAAa,KAAK6B,CAAS,CAC7B,MACE1B,EAAc3E,CAAS,EAAIyB,GACzB+D,EACAnK,EACA7D,EACA6N,CACF,CAEJ,CAGA,GAAI3N,EAAG,oBAAoB8N,CAAS,IAClCC,EAAU,GACNzB,GAUE,EAPFwB,EAAU,cAAc,YACvBA,EAAU,cAAc,eACvB9N,EAAG,eAAe8N,EAAU,aAAa,aAAa,GACtDA,EAAU,aAAa,cAAc,SAAS,MAC3CtM,GAAMA,EAAE,UACX,IAMF,GACEsM,EAAU,cAAc,eACxB9N,EAAG,eAAe8N,EAAU,aAAa,aAAa,EACtD,CACA,IAAMc,EAAad,EAAU,aAAa,cAAc,SACrD,OAAQtM,GAAM,CAACA,EAAE,UAAU,EAC3B,IAAKA,GAAM,CACV,IAAMO,EAAOP,EAAE,KAAK,QAAQmC,CAAU,EAChCjD,EAAWc,EAAE,cAAc,QAAQmC,CAAU,EACnD,OAAOjD,EAAW,GAAGA,CAAQ,OAAOqB,CAAI,GAAKA,CAC/C,CAAC,EACH,GAAI6M,EAAW,OAAS,EAAG,CACzB,IAAMC,EAAWf,EAAU,gBACxB,KACHhB,EAAa,KACX,YAAY8B,EAAW,KAAK,IAAI,CAAC,YAAYC,CAAO,GACtD,CACF,CACF,KAAO,CAKL,IAAMC,EAFahB,EAAU,QAAQnK,CAAU,EAG5C,QAAQ,aAAc,EAAE,EACxB,QAAQ,cAAe,EAAE,EAC5BmJ,EAAa,KAAKgC,CAAO,CAC3B,CAMN,IAAI9O,EAAG,oBAAoB8N,CAAS,GAAK9N,EAAG,mBAAmB8N,CAAS,KACtEC,EAAU,GACNzB,GAAS,CAQX,IAAMyC,EAPa/O,EAAG,gBAAgB8N,EAAU,QAAQnK,CAAU,EAAG,CACnE,gBAAiB,CACf,OAAQ3D,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EAC0B,WAAW,KAAK,EACvC+O,GACFjC,EAAa,KAAKiC,CAAO,CAE7B,CAKF,GAAI,CAAChB,GAAWzB,EAAS,CAQvB,IAAMyC,EAPa/O,EAAG,gBAAgB8N,EAAU,QAAQnK,CAAU,EAAG,CACnE,gBAAiB,CACf,OAAQ3D,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EAC0B,WAAW,KAAK,EACvC+O,GACFjC,EAAa,KAAKiC,CAAO,CAE7B,CACF,CAEA,GAAIzC,EAAS,CAEXa,EAAsB,GAAQ,EAG9B,IAAM6B,EAAiBzC,GAAY,UAE7B0C,EAAS,GADGtC,EAAS,OAAS,EAAIA,EAAS,KAAK;AAAA,CAAI,EAAI;AAAA;AAAA,EAAS,EAC5C,aAAaqC,CAAc;AAAA;AAAA,EAGhDE,EACJ1C,EAAc,OAAS,EAAI;AAAA;AAAA,EAASA,EAAc,KAAK;AAAA;AAAA,CAAM,EAAI,GAEnE,MAAO,CACL,KAAMyC,EAASnC,EAAa,KAAK;AAAA;AAAA,CAAM,EAAIoC,EAC3C,SAAUpP,EAAS,OAAS,EAAIA,EAAW,MAC7C,CACF,CAYA,IAAI6I,EATa3I,EAAG,gBAAgBsK,EAAQ,CAC1C,gBAAiB,CACf,OAAQtK,EAAG,aAAa,OACxB,OAAQA,EAAG,WAAW,OACtB,eAAgB,EAClB,CACF,CAAC,EAGmB,WACpB,OAAW,CAAC4G,EAAUrD,CAAI,IAAK,OAAO,QAAQyJ,CAAQ,EAAG,CACvD,IAAMmC,EAAmC,CACvC,OAAQ,OAAO,YACb,OAAO,QAAQ5L,EAAK,MAAM,EAAE,IAAI,CAAC,CAAC6L,EAAGC,CAAC,IAAM,CAC1CD,EACA,CAAE,KAAMC,EAAE,KAAK,KAAM,SAAUA,EAAE,SAAU,QAASA,EAAE,OAAQ,CAChE,CAAC,CACH,EACA,QAAS9L,EAAK,QAAU,CAAE,KAAMA,EAAK,QAAQ,IAAK,EAAI,MACxD,EAGIA,EAAK,aACP4L,EAAY,WAAa5L,EAAK,YAGhC,IAAM+L,EAAc,KAAK,UAAUH,EAAa,KAAM,CAAC,EACvDxG,GAAQ;AAAA,EAAK/B,CAAQ,YAAY0I,CAAW;AAAA,CAC9C,CAGA,OAAW,CAAChH,EAAW/E,CAAI,IAAK,OAAO,QAAQ0J,CAAa,EAAG,CAC7D,IAAMkC,EAAmC,CACvC,YAAa5L,EAAK,YACd,CACE,OAAQ,OAAO,YACb,OAAO,QAAQA,EAAK,YAAY,QAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC6L,EAAGC,CAAC,IAAM,CAC5DD,EACA,CAAE,KAAMC,EAAE,KAAK,KAAM,SAAUA,EAAE,SAAU,QAASA,EAAE,OAAQ,CAChE,CAAC,CACH,CACF,EACA,OACJ,QAAS,OAAO,YACd,OAAO,QAAQ9L,EAAK,SAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAACxB,EAAMoF,CAAC,IAAM,CACpDpF,EACA,CACE,OAAQ,OAAO,YACb,OAAO,QAAQoF,EAAE,QAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAACiI,EAAGC,CAAC,IAAM,CAC7CD,EACA,CAAE,KAAMC,EAAE,KAAK,KAAM,SAAUA,EAAE,QAAS,CAC5C,CAAC,CACH,EACA,QAASlI,EAAE,QAAU,CAAE,KAAMA,EAAE,QAAQ,IAAK,EAAI,MAClD,CACF,CAAC,CACH,EACA,cAAe,OAAO,YACpB,OAAO,QAAQ5D,EAAK,eAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAACxB,EAAMoF,CAAC,IAAM,CAC1DpF,EACA,CACE,OAAQ,OAAO,YACb,OAAO,QAAQoF,EAAE,QAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAACiI,EAAGC,CAAC,IAAM,CAC7CD,EACA,CAAE,KAAMC,EAAE,KAAK,KAAM,SAAUA,EAAE,QAAS,CAC5C,CAAC,CACH,EACA,QAASlI,EAAE,QAAU,CAAE,KAAMA,EAAE,QAAQ,IAAK,EAAI,MAClD,CACF,CAAC,CACH,CACF,EAEI5D,EAAK,aACP4L,EAAY,WAAa5L,EAAK,YAGhC,IAAM+L,EAAc,KAAK,UAAUH,EAAa,KAAM,CAAC,EACvDxG,GAAQ;AAAA,EAAKL,CAAS,YAAYgH,CAAW;AAAA,EAG7C3G,GAAQ;AAAA,EAAK4G,GAAiBjH,CAAS,CAAC;AAAA,CAC1C,CAEA,MAAO,CACL,KAAAK,EACA,MAAOqE,EACP,QAAS,OAAO,KAAKC,CAAa,EAAE,OAAS,EAAIA,EAAgB,OACjE,SAAUnN,EAAS,OAAS,EAAIA,EAAW,MAC7C,CACF",
|
|
6
|
+
"names": ["require_package", "__commonJSMin", "exports", "module", "ts", "validate", "s", "typeDescriptorToJSONSchema", "td", "properties", "required", "key", "fieldTd", "exampleToJSONSchema", "value", "val", "functionMetaToJSONSchema", "meta", "name", "paramInfo", "input", "output", "validate", "schemaFilter", "s", "isRuntimeType", "value", "isSchemaBuilder", "isJSONSchema", "Type", "descriptionOrSchema", "predicateOrSchemaOrExample", "exampleArg", "defaultArg", "description", "predicate", "schema", "example", "defaultValue", "s", "schemaToDescription", "examples", "jsonSchema", "validate", "raw", "exampleToJSONSchema", "schemaFilter", "TString", "v", "TNumber", "TBoolean", "TInteger", "TPositiveInt", "TNonEmptyString", "TEmail", "isValidUrl", "TUrl", "TUuid", "isValidTimestamp", "d", "isValidLegalDate", "Timestamp", "LegalDate", "Nullable", "type", "Optional", "Union", "descriptionOrType", "valuesOrType", "restTypes", "values", "valueSet", "types", "t", "TArray", "itemType", "item", "typeParamToCheck", "param", "Generic", "params", "paramNames", "defaults", "p", "factory", "typeArgs", "checks", "_", "i", "arg", "desc", "name", "typeStr", "TPair", "x", "checkT", "checkU", "TRecord", "checkV", "Enum", "members", "keys", "names", "key", "kindOfExample", "FunctionPredicate", "specOrFn", "specBuilder", "typeParams", "tp", "resolved", "idx", "spec", "_createFunctionPredicate", "returns", "returnContract", "meta", "info", "expectedArity", "expectedKeys", "metaKeys", "metaInfo", "expectedExample", "expectedKind", "pkg", "TJS_VERSION", "tjsEquals", "parseVersion", "version", "major", "minor", "patch", "compareVersions", "a", "b", "va", "vb", "versionsCompatible", "MonadicError", "_MonadicError", "message", "path", "expected", "actual", "callStack", "typeError", "value", "stack", "config", "getStack", "err", "size", "ERROR_BUF_SIZE", "errorBuffer", "errorHead", "errorBufCount", "errorTotal", "isMonadicError", "DEFAULT_CONFIG", "STACK_SIZE", "callStackBuffer", "callStackHead", "callStackCount", "unsafeDepth", "enterUnsafe", "exitUnsafe", "isUnsafeMode", "configure", "options", "getConfig", "pushStack", "name", "popStack", "result", "start", "i", "errors", "clearErrors", "cleared", "getErrorCount", "resetRuntime", "Is", "v", "k", "keysA", "keysB", "IsNot", "TypeOf", "Eq", "NotEq", "isError", "error", "details", "currentStack", "fullStack", "composeErrors", "funcName", "paramNames", "e", "parts", "typeOf", "constructorName", "isNativeType", "typeName", "proto", "checkType", "validateArgs", "args", "meta", "param", "expectedDesc", "wrap", "fn", "meta", "functionMetaToJSONSchema", "config", "hasReturns", "metaUnsafe", "metaSafe", "metaUnsafeReturn", "metaSafeReturn", "returnDefaults", "paramEntries", "paramCount", "funcName", "wrapped", "args", "unsafeDepth", "validateInputs", "validateOutputs", "isError", "isNamedCall", "collectedErrors", "namedArgs", "i", "name", "param", "value", "error", "typeErr", "checkType", "composeErrors", "trackStack", "pushStack", "result", "validated", "returnError", "popStack", "e", "wrapClass", "cls", "target", "newTarget", "_thisArg", "key", "createRuntime", "instanceConfig", "instStackSize", "STACK_SIZE", "instanceStackBuffer", "instanceStackHead", "instanceStackCount", "instErrorSize", "ERROR_BUF_SIZE", "instanceErrorBuffer", "instanceErrorHead", "instanceErrorBufCount", "instanceErrorTotal", "instanceUnsafeDepth", "instanceConfigure", "options", "instanceGetConfig", "instancePushStack", "instancePopStack", "instanceGetStack", "start", "instanceResetRuntime", "DEFAULT_CONFIG", "instanceEnterUnsafe", "instanceExitUnsafe", "instanceIsUnsafeMode", "extensionRegistry", "instanceRegisterExtension", "typeName", "methodName", "instanceResolveExtension", "t", "current", "methods", "objectMethods", "instanceTypeError", "path", "expected", "actual", "stack", "err", "MonadicError", "instanceErrors", "instanceClearErrors", "cleared", "instanceGetErrorCount", "instanceError", "message", "details", "fullStack", "instanceBang", "obj", "prop", "isMonadicError", "TJS_VERSION", "typeOf", "isNativeType", "validateArgs", "compareVersions", "versionsCompatible", "validate", "s", "Type", "isRuntimeType", "Union", "Generic", "Enum", "FunctionPredicate", "Nullable", "Optional", "TArray", "TString", "TNumber", "TBoolean", "TInteger", "TPositiveInt", "TNonEmptyString", "TEmail", "TUrl", "TUuid", "TPair", "TRecord", "Is", "IsNot", "Eq", "NotEq", "TypeOf", "tjsEquals", "runtime", "typeError", "configure", "getConfig", "getStack", "errors", "clearErrors", "getErrorCount", "resetRuntime", "enterUnsafe", "exitUnsafe", "isUnsafeMode", "Timestamp", "LegalDate", "emitClassWrapper", "className", "MAX_TYPE_DEPTH", "domInterfaceTypes", "typeToExample", "type", "checker", "warnings", "ctx", "ts", "itemExample", "typeRef", "typeName", "builtinExamples", "visited", "resolvedType", "iface", "props", "member", "propName", "propExample", "tp", "typeLiteral", "propType", "unionType", "isNullType", "t", "isUndefinedType", "nonNullTypes", "hasNull", "hasUndefined", "baseExample", "examples", "e", "i", "arr", "literalType", "funcType", "fpParams", "param", "name", "paramExample", "fpReturn", "spec", "example", "typeToInfo", "depth", "shape", "intersectionType", "mergedShape", "memberInfo", "tupleType", "elements", "element", "innerType", "result", "clause", "baseType", "baseName", "syntheticRef", "baseInfo", "extractTypeParams", "node", "typeParams", "info", "constraintExample", "defaultExample", "transformInterfaceToType", "sourceFile", "annotations", "transformGenericInterfaceToGeneric", "exampleAnnotation", "a", "predicateAnnotation", "parts", "paramName", "declarationAnnotation", "predicateLine", "typeParamNames", "p", "checks", "isComputed", "symbolName", "refName", "declMembers", "optional", "typeText", "methodText", "extractLiteralUnionValues", "_sourceFile", "values", "transformEnumToTJS", "_warnings", "enumName", "members", "nextValue", "memberName", "numValue", "operand", "transformTypeAliasToType", "transformGenericFunctionTypeToFP", "transformGenericTypeAliasToGeneric", "literalValues", "originalType", "paramTypeText", "returnTypeText", "typeBody", "transformFunctionToTJS", "explicitName", "includeLineNumber", "typeParamMap", "resolveCtx", "degraded", "params", "transformParams", "line", "lineComment", "funcName", "returnExample", "returnAnnotation", "originalReturn", "body", "bodyText", "isExported", "m", "isAsync", "isGenerator", "exportPrefix", "asyncPrefix", "funcKeyword", "degradedComment", "emitOverloadGroup", "signatures", "implementation", "implName", "results", "implParams", "implBody", "sig", "paramNames", "returnKw", "transformClassToTJS", "convertPrivateToHash", "className", "extendsClause", "h", "privateFieldMap", "replacePrivateRefs", "code", "tsName", "jsName", "transpiled", "methodName", "isStatic", "staticPrefix", "generatorStar", "origName", "initText", "wrapped", "output", "extendsStr", "parameters", "isRest", "isOptional", "typeExample", "defaultText", "extractFunctionMetadata", "defaultValue", "extractClassMetadata", "methods", "staticMethods", "constructorInfo", "methodInfo", "VALID_TJS_MODES", "extractTjsModes", "source", "modes", "re", "words", "word", "extractTjsAnnotations", "skipRe", "predRe", "exRe", "declRe", "b", "buildAnnotationMap", "statements", "si", "stmt", "stmtStart", "prevEnd", "matching", "extractEmbeddedTestComments", "tests", "embeddedRegex", "match", "extractDocComments", "comments", "docRegex", "braceDepth", "inString", "braceDepthAt", "ch", "prev", "fromTS", "options", "emitTJS", "filename", "embeddedTests", "docComments", "tjsAnnotations", "tjsModes", "hasTjsClass", "annotationMap", "tjsFunctions", "seenTypeNames", "metadata", "classMetadata", "emittedDocComments", "emitDocCommentsBefore", "pos", "doc", "typeAliases", "interfaces", "collectTypes", "existing", "merged", "resolutionCtx", "overloadGroups", "group", "statement", "handled", "overloadGroup", "overloads", "implInfo", "hasFunctionDecl", "varIsExported", "decl", "funcNode", "tjsFunc", "firstFuncLine", "typeDecl", "enumDecl", "classDecl", "valueSpecs", "modSpec", "cleaned", "trimmed", "sourceFileName", "header", "testsSection", "metadataObj", "k", "v", "metadataStr", "emitClassWrapper"]
|
|
7
|
+
}
|