tjs-lang 0.7.7 → 0.7.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CLAUDE.md +90 -33
  2. package/bin/docs.js +4 -1
  3. package/demo/docs.json +45 -11
  4. package/demo/src/examples.test.ts +1 -0
  5. package/demo/src/imports.test.ts +16 -4
  6. package/demo/src/imports.ts +60 -15
  7. package/demo/src/playground-shared.ts +9 -8
  8. package/demo/src/tfs-worker.js +205 -147
  9. package/demo/src/tjs-playground.ts +34 -10
  10. package/demo/src/ts-playground.ts +24 -8
  11. package/dist/index.js +118 -101
  12. package/dist/index.js.map +4 -4
  13. package/dist/src/lang/bool-coercion.d.ts +50 -0
  14. package/dist/src/lang/docs.d.ts +31 -6
  15. package/dist/src/lang/linter.d.ts +8 -0
  16. package/dist/src/lang/parser-transforms.d.ts +18 -0
  17. package/dist/src/lang/parser-types.d.ts +2 -0
  18. package/dist/src/lang/parser.d.ts +3 -0
  19. package/dist/src/lang/runtime.d.ts +34 -0
  20. package/dist/src/lang/types.d.ts +9 -1
  21. package/dist/src/rbac/index.d.ts +1 -1
  22. package/dist/src/vm/runtime.d.ts +1 -1
  23. package/dist/tjs-eval.js +38 -36
  24. package/dist/tjs-eval.js.map +4 -4
  25. package/dist/tjs-from-ts.js +20 -20
  26. package/dist/tjs-from-ts.js.map +3 -3
  27. package/dist/tjs-lang.js +85 -83
  28. package/dist/tjs-lang.js.map +4 -4
  29. package/dist/tjs-vm.js +47 -45
  30. package/dist/tjs-vm.js.map +4 -4
  31. package/llms.txt +79 -0
  32. package/package.json +3 -2
  33. package/src/cli/commands/convert.test.ts +16 -21
  34. package/src/lang/bool-coercion.test.ts +203 -0
  35. package/src/lang/bool-coercion.ts +314 -0
  36. package/src/lang/codegen.test.ts +137 -0
  37. package/src/lang/docs.test.ts +328 -1
  38. package/src/lang/docs.ts +424 -24
  39. package/src/lang/emitters/ast.ts +11 -12
  40. package/src/lang/emitters/dts.test.ts +41 -0
  41. package/src/lang/emitters/dts.ts +9 -0
  42. package/src/lang/emitters/js-tests.ts +9 -4
  43. package/src/lang/emitters/js.ts +182 -2
  44. package/src/lang/inference.ts +54 -0
  45. package/src/lang/linter.test.ts +104 -1
  46. package/src/lang/linter.ts +124 -1
  47. package/src/lang/parser-params.ts +31 -0
  48. package/src/lang/parser-transforms.ts +304 -0
  49. package/src/lang/parser-types.ts +2 -0
  50. package/src/lang/parser.test.ts +73 -1
  51. package/src/lang/parser.ts +34 -1
  52. package/src/lang/runtime.ts +98 -0
  53. package/src/lang/types.ts +6 -0
  54. package/src/rbac/index.ts +2 -2
  55. package/src/rbac/rules.tjs.d.ts +9 -0
  56. package/src/vm/atoms/batteries.ts +2 -2
  57. package/src/vm/runtime.ts +10 -3
  58. package/dist/src/rbac/rules.d.ts +0 -184
  59. package/src/rbac/rules.js +0 -338
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../package.json", "../src/lang/parser.ts", "../src/lang/types.ts", "../src/lang/parser-params.ts", "../src/lang/parser-transforms.ts", "../src/lang/inference.ts", "../src/lang/emitters/ast.ts", "../src/lang/emitters/js.ts", "../src/lang/tests.ts", "../src/lang/runtime.ts", "../src/lang/json-schema.ts", "../src/types/Type.ts", "../src/lang/emitters/js-tests.ts", "../src/lang/wasm.ts", "../src/lang/emitters/js-wasm.ts", "../src/lang/core.ts", "../src/lang/schema.ts", "../node_modules/acorn-walk/dist/walk.mjs", "../src/lang/linter.ts"],
4
- "sourcesContent": ["{\n \"name\": \"tjs-lang\",\n \"version\": \"0.7.7\",\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 * TJS Parser \u2014 Orchestration Layer\n *\n * This module contains the main entry points: preprocess() and parse().\n * Transform functions are in parser-transforms.ts, param processing in parser-params.ts.\n */\n\nimport * as acorn from 'acorn'\nimport type { Program, FunctionDeclaration } from 'acorn'\nimport { SyntaxError } from './types'\n\n// Re-export types so external callers don't need to change imports\nexport type {\n ParseOptions,\n WasmBlock,\n TestBlock,\n PreprocessOptions,\n TjsModes,\n} from './parser-types'\n\nimport type {\n ParseOptions,\n WasmBlock,\n TestBlock,\n PreprocessOptions,\n TjsModes,\n} from './parser-types'\n\nimport { transformParenExpressions } from './parser-params'\n\nimport {\n transformTryWithoutCatch,\n extractWasmBlocks,\n transformIsOperators,\n insertAsiProtection,\n transformEqualityToStructural,\n transformTypeDeclarations,\n transformGenericDeclarations,\n transformFunctionPredicateDeclarations,\n transformUnionDeclarations,\n transformEnumDeclarations,\n transformExtendDeclarations,\n transformPolymorphicFunctions,\n transformPolymorphicConstructors,\n wrapClassDeclarations,\n transformBareAssignments,\n extractAndRunTests,\n validateNoDate,\n validateNoEval,\n validateNoVar,\n transformConstBang,\n transformBangAccess,\n transformExtensionCalls,\n} from './parser-transforms'\n\n// Re-export transformExtensionCalls for js.ts\nexport { transformExtensionCalls } from './parser-transforms'\n\n/**\n * Strip single-line comments (//) from source.\n * Replaces comment content with spaces to preserve character offsets.\n * Skips // inside strings and block comments.\n */\nexport function stripLineComments(source: string): string {\n let result = ''\n let i = 0\n while (i < source.length) {\n const ch = source[i]\n // String literals \u2014 skip to closing quote\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n const quote = ch\n result += ch\n i++\n while (i < source.length && source[i] !== quote) {\n if (source[i] === '\\\\') {\n result += source[i++]\n }\n if (i < source.length) result += source[i++]\n }\n if (i < source.length) result += source[i++] // closing quote\n continue\n }\n // Block comment \u2014 pass through (may contain //)\n if (ch === '/' && source[i + 1] === '*') {\n const end = source.indexOf('*/', i + 2)\n const slice = end === -1 ? source.slice(i) : source.slice(i, end + 2)\n result += slice\n i += slice.length\n continue\n }\n // Line comment \u2014 replace with spaces to preserve offsets\n if (ch === '/' && source[i + 1] === '/') {\n const nl = source.indexOf('\\n', i)\n const end = nl === -1 ? source.length : nl\n result += ' '.repeat(end - i)\n i = end // leave \\n for next iteration\n continue\n }\n result += ch\n i++\n }\n return result\n}\n\nexport function preprocess(\n source: string,\n options: PreprocessOptions = {}\n): {\n source: string\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n moduleSafety?: 'none' | 'inputs' | 'all'\n tjsModes: TjsModes\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n wasmBlocks: WasmBlock[]\n tests: TestBlock[]\n testErrors: string[]\n polymorphicNames: Set<string>\n extensions: Map<string, Set<string>>\n} {\n const originalSource = source\n let moduleSafety: 'none' | 'inputs' | 'all' | undefined\n const requiredParams = new Set<string>()\n const unsafeFunctions = new Set<string>()\n const safeFunctions = new Set<string>()\n\n // Detect whether this source was emitted by fromTS (TS-originated)\n // The /* tjs <- filename */ annotation is the signal\n const isFromTS = /\\/\\*\\s*tjs\\s*<-\\s*\\S+\\s*\\*\\//.test(source)\n\n // Native TJS: all modes ON by default (TJS is its own language)\n // TS-originated or VM target (AJS): all modes OFF, safety none (JS-compatible)\n const isCompat = isFromTS || options.vmTarget\n const tjsModes: TjsModes = isCompat\n ? {\n tjsEquals: false,\n tjsClass: false,\n tjsDate: false,\n tjsNoeval: false,\n tjsStandard: false,\n tjsSafeEval: false,\n tjsNoVar: false,\n }\n : {\n tjsEquals: true,\n tjsClass: true,\n tjsDate: true,\n tjsNoeval: true,\n tjsStandard: true,\n tjsSafeEval: false, // opt-in only (adds import)\n tjsNoVar: true,\n }\n\n // Safety: native TJS defaults to 'inputs' (runtime default),\n // TS-originated and VM targets default to 'none'\n if (isCompat) {\n moduleSafety = 'none'\n }\n\n // Handle module-level safety directive: safety none | safety inputs | safety all\n // Must be at the start of the file (possibly after comments/whitespace)\n // Explicit directive always overrides the default\n const safetyMatch = source.match(\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*safety\\s+(none|inputs|all)\\b/\n )\n if (safetyMatch) {\n moduleSafety = safetyMatch[2] as 'none' | 'inputs' | 'all'\n // Remove the directive from source\n source = source.replace(\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*safety\\s+(none|inputs|all)\\s*/,\n '$1'\n )\n }\n\n // Handle TJS mode directives (can appear in any order after safety)\n // TjsStrict enables all TJS modes (useful for TS-originated code opting in)\n // TjsCompat disables all TJS modes (useful for native TJS opting out)\n // Individual modes: TjsEquals, TjsClass, TjsDate, TjsNoeval, TjsStandard, TjsSafeEval\n const directivePattern =\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*(TjsStrict|TjsCompat|TjsEquals|TjsClass|TjsDate|TjsNoeval|TjsNoVar|TjsStandard|TjsSafeEval)\\b/\n\n let match\n while ((match = source.match(directivePattern))) {\n const directive = match[2]\n\n if (directive === 'TjsStrict') {\n // Enable all TJS modes\n tjsModes.tjsEquals = true\n tjsModes.tjsClass = true\n tjsModes.tjsDate = true\n tjsModes.tjsNoeval = true\n tjsModes.tjsNoVar = true\n tjsModes.tjsStandard = true\n } else if (directive === 'TjsCompat') {\n // Disable all TJS modes (JS-compatible)\n tjsModes.tjsEquals = false\n tjsModes.tjsClass = false\n tjsModes.tjsDate = false\n tjsModes.tjsNoeval = false\n tjsModes.tjsNoVar = false\n tjsModes.tjsStandard = false\n tjsModes.tjsSafeEval = false\n } else if (directive === 'TjsEquals') {\n tjsModes.tjsEquals = true\n } else if (directive === 'TjsClass') {\n tjsModes.tjsClass = true\n } else if (directive === 'TjsDate') {\n tjsModes.tjsDate = true\n } else if (directive === 'TjsNoeval') {\n tjsModes.tjsNoeval = true\n } else if (directive === 'TjsNoVar') {\n tjsModes.tjsNoVar = true\n } else if (directive === 'TjsStandard') {\n tjsModes.tjsStandard = true\n } else if (directive === 'TjsSafeEval') {\n tjsModes.tjsSafeEval = true\n }\n\n // Remove the directive from source\n source = source.replace(\n new RegExp(\n `^(\\\\s*(?:\\\\/\\\\/[^\\\\n]*\\\\n|\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/\\\\s*)*)\\\\s*${directive}\\\\s*`\n ),\n '$1'\n )\n }\n\n // Strip single-line comments early \u2014 they confuse brace matching,\n // ASI protection, and test extraction (e.g. apostrophes in comments)\n // Preserves line structure by keeping the newline\n source = stripLineComments(source)\n\n // TjsStandard mode: insert semicolons to prevent ASI footguns\n // Must happen early before other transformations modify line structure\n if (tjsModes.tjsStandard) {\n source = insertAsiProtection(source)\n }\n\n // Transform const! declarations \u2014 validate immutability and emit as const\n // Must happen before acorn parsing since const! is not valid JS\n source = transformConstBang(source)\n\n // Transform !. bang access to __tjs.bang() calls\n // Must happen before acorn parsing since !. is not valid JS\n source = transformBangAccess(source)\n\n // Transform Is/IsNot infix operators to function calls\n // a Is b -> Is(a, b)\n // a IsNot b -> IsNot(a, b)\n // These are always available for explicit structural equality\n source = transformIsOperators(source)\n\n // Transform == and != to structural equality (Is/IsNot)\n // Only when TjsEquals mode is enabled and not for VM targets\n // VM targets already handle == correctly at runtime\n if (tjsModes.tjsEquals && !options.vmTarget) {\n source = transformEqualityToStructural(source)\n }\n\n // Transform Type, Generic, Union, and Enum declarations\n // Type Foo { ... } -> const Foo = Type(...)\n // Generic Bar<T, U> { ... } -> const Bar = Generic(...)\n // Union Dir 'up' | 'down' -> const Dir = Union(...)\n // Enum Status { Pending, Active, Done } -> const Status = Enum(...)\n source = transformTypeDeclarations(source)\n source = transformGenericDeclarations(source)\n source = transformFunctionPredicateDeclarations(source)\n source = transformUnionDeclarations(source)\n source = transformEnumDeclarations(source)\n\n // Transform bare assignments to const declarations\n // Foo = ... -> const Foo = ...\n source = transformBareAssignments(source)\n\n // Unified paren expression transformer\n // Handles: function params, arrow params, return types, safe/unsafe markers\n // Model: open paren can be ( or (? or (!, close can be ) or )-> or )-? or )-!\n const {\n source: transformedSource,\n returnType,\n returnSafety,\n } = transformParenExpressions(source, {\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n })\n source = transformedSource\n\n // NOTE: unsafe {} blocks removed - they provided no performance benefit because\n // the wrapper decision is made at transpile time. Use (!) on functions instead.\n // See ideas parking lot for potential future approaches.\n\n // Transform extend blocks: extend TypeName { methods } -> __ext_TypeName object\n // Must happen after paren expressions so method params are already transformed\n const extResult = transformExtendDeclarations(source)\n source = extResult.source\n\n // Handle try-without-catch: try { ... } (no catch/finally) -> monadic error handling\n // This is the idiomatic TJS way to convert exceptions to AgentError\n source = transformTryWithoutCatch(source)\n\n // Transform polymorphic functions: multiple declarations with same name -> dispatcher\n // Must happen after param transformation but before class wrapping and test extraction\n const polyResult = transformPolymorphicFunctions(source, requiredParams)\n source = polyResult.source\n\n // Extract WASM blocks: wasm(args) { ... } fallback { ... }\n const wasmBlocks = extractWasmBlocks(source)\n source = wasmBlocks.source\n\n // Extract and run test blocks: test 'desc'? { body }\n // Tests run at transpile time and are stripped from output\n const testResult = extractAndRunTests(source, options.dangerouslySkipTests)\n source = testResult.source\n\n // Transform polymorphic constructors: multiple constructor() -> factory functions\n // Must happen before wrapClassDeclarations (which needs to know about poly ctors)\n const polyCtorResult = transformPolymorphicConstructors(\n source,\n requiredParams\n )\n source = polyCtorResult.source\n\n // Mark $dispatch functions as unsafe (internal Proxy trap params, not user-facing)\n for (const cls of polyCtorResult.polyCtorClasses) {\n unsafeFunctions.add(`${cls}$dispatch`)\n }\n\n // Wrap class declarations to make them callable without `new`\n // Only when TjsClass mode is enabled\n // class Foo { } -> let Foo = class Foo { }; Foo = globalThis.__tjs?.wrapClass?.(Foo) ?? Foo;\n if (tjsModes.tjsClass) {\n source = wrapClassDeclarations(source, polyCtorResult.polyCtorClasses)\n }\n\n // Validate TjsDate mode - check for Date usage\n if (tjsModes.tjsDate) {\n source = validateNoDate(source)\n }\n\n // Validate TjsNoeval mode - check for eval/Function usage\n if (tjsModes.tjsNoeval) {\n source = validateNoEval(source)\n }\n\n // Validate TjsNoVar mode - check for var declarations\n if (tjsModes.tjsNoVar) {\n source = validateNoVar(source)\n }\n\n // Rewrite extension method calls on known-type receivers\n // Must happen after all other transforms so literals are in final form\n source = transformExtensionCalls(source, extResult.extensions)\n\n return {\n source,\n returnType,\n returnSafety,\n moduleSafety,\n tjsModes,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks: wasmBlocks.blocks,\n tests: testResult.tests,\n testErrors: testResult.errors,\n polymorphicNames: polyResult.polymorphicNames,\n extensions: extResult.extensions,\n }\n}\n\n/**\n * Parse source code into an Acorn AST\n */\nexport function parse(\n source: string,\n options: ParseOptions = {}\n): {\n ast: Program\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n moduleSafety?: 'none' | 'inputs' | 'all'\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n wasmBlocks: WasmBlock[]\n tests: TestBlock[]\n testErrors: string[]\n} {\n const {\n filename = '<source>',\n colonShorthand = true,\n vmTarget = false,\n } = options\n\n // Preprocess for custom syntax\n const {\n source: processedSource,\n returnType,\n returnSafety,\n moduleSafety,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks,\n tests,\n testErrors,\n } = colonShorthand\n ? preprocess(source, { vmTarget })\n : {\n source,\n returnType: undefined,\n returnSafety: undefined,\n moduleSafety: undefined,\n originalSource: source,\n requiredParams: new Set<string>(),\n unsafeFunctions: new Set<string>(),\n safeFunctions: new Set<string>(),\n wasmBlocks: [] as WasmBlock[],\n tests: [] as TestBlock[],\n testErrors: [] as string[],\n }\n\n try {\n const ast = acorn.parse(processedSource, {\n ecmaVersion: 2022,\n sourceType: 'module',\n locations: true,\n allowReturnOutsideFunction: false,\n })\n\n return {\n ast,\n returnType,\n returnSafety,\n moduleSafety,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks,\n tests,\n testErrors,\n }\n } catch (e: any) {\n // Convert Acorn error to our error type\n const loc = e.loc || { line: 1, column: 0 }\n throw new SyntaxError(\n e.message.replace(/\\s*\\(\\d+:\\d+\\)$/, ''), // Remove acorn's location suffix\n loc,\n originalSource,\n filename\n )\n }\n}\n\n/**\n * Validate that the source contains exactly one function declaration\n */\nexport function validateSingleFunction(\n ast: Program,\n filename?: string\n): FunctionDeclaration {\n // Check for unsupported top-level constructs FIRST\n // This gives better error messages for things like classes\n for (const node of ast.body) {\n if (node.type === 'ImportDeclaration') {\n throw new SyntaxError(\n 'Imports are not supported. All atoms must be registered with the VM.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (\n node.type === 'ExportNamedDeclaration' ||\n node.type === 'ExportDefaultDeclaration'\n ) {\n throw new SyntaxError(\n 'Exports are not supported. The function is automatically exported.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (node.type === 'ClassDeclaration') {\n throw new SyntaxError(\n 'Classes are not supported. Agent99 uses functional composition.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n }\n\n const functions = ast.body.filter(\n (node): node is FunctionDeclaration => node.type === 'FunctionDeclaration'\n )\n\n if (functions.length === 0) {\n throw new SyntaxError(\n 'Source must contain a function declaration',\n { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (functions.length > 1) {\n const second = functions[1]\n throw new SyntaxError(\n 'Only a single function per agent is allowed',\n second.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n return functions[0]\n}\n\n/**\n * Extract TDoc comment from before a function\n *\n * TJS doc comments use /\\*# ... \\*\\/ syntax and preserve full markdown content.\n * Legacy JSDoc (/\\*\\* ... \\*\\/) is supported as a fallback.\n */\nexport function extractTDoc(\n source: string,\n func: FunctionDeclaration\n): {\n description?: string\n params: Record<string, string>\n} {\n const result: { description?: string; params: Record<string, string> } = {\n params: {},\n }\n\n if (!func.loc) return result\n\n const beforeFunc = source.substring(0, func.start)\n\n // First, check for TJS doc comment: /*# ... */\n // This preserves full markdown content\n // Find the LAST /*# ... */ block and verify it immediately precedes the function\n // (only whitespace and line comments allowed between)\n const allDocBlocks = [...beforeFunc.matchAll(/\\/\\*#([\\s\\S]*?)\\*\\//g)]\n if (allDocBlocks.length > 0) {\n const lastBlock = allDocBlocks[allDocBlocks.length - 1]\n const afterBlock = beforeFunc.substring(\n lastBlock.index! + lastBlock[0].length\n )\n\n // Only attach if nothing but whitespace and line comments between doc and function\n if (/^(?:\\s|\\/\\/[^\\n]*)*$/.test(afterBlock)) {\n // Extract content, trim leading/trailing whitespace, preserve internal formatting\n let content = lastBlock[1]\n\n // Remove common leading whitespace (like dedent)\n const lines = content.split('\\n')\n // Find minimum indentation (ignoring empty lines)\n const minIndent = lines\n .filter((line) => line.trim().length > 0)\n .reduce((min, line) => {\n const indent = line.match(/^(\\s*)/)?.[1].length || 0\n return Math.min(min, indent)\n }, Infinity)\n\n // Remove that indentation from all lines\n if (minIndent > 0 && minIndent < Infinity) {\n content = lines.map((line) => line.slice(minIndent)).join('\\n')\n }\n\n result.description = content.trim()\n return result\n }\n }\n\n // Fall back to JSDoc: /** ... */\n const jsdocMatch = beforeFunc.match(/\\/\\*\\*[\\s\\S]*?\\*\\/\\s*$/)\n if (!jsdocMatch) return result\n\n const jsdoc = jsdocMatch[0]\n\n // Extract description (first non-tag content)\n const descMatch = jsdoc.match(/\\/\\*\\*\\s*\\n?\\s*\\*?\\s*([^@\\n][^\\n]*)/m)\n if (descMatch) {\n result.description = descMatch[1].trim()\n }\n\n // Extract @param tags\n const paramRegex = /@param\\s+(?:\\{[^}]+\\}\\s+)?(\\w+)\\s*-?\\s*(.*)/g\n let match\n while ((match = paramRegex.exec(jsdoc)) !== null) {\n result.params[match[1]] = match[2].trim()\n }\n\n return result\n}\n", "/**\n * Type definitions for the Agent99 JavaScript transpiler\n */\n\nimport type { Node } from 'acorn'\nimport type { SeqNode } from '../builder'\n\n// ============================================================================\n// Type System Types\n// ============================================================================\n\n/** Represents a type extracted from value patterns */\nexport interface TypeDescriptor {\n kind:\n | 'string'\n | 'number'\n | 'integer'\n | 'non-negative-integer'\n | 'boolean'\n | 'null'\n | 'undefined'\n | 'array'\n | 'object'\n | 'union'\n | 'any'\n nullable?: boolean\n /** For arrays: the element type */\n items?: TypeDescriptor\n /** For objects: the shape */\n shape?: Record<string, TypeDescriptor>\n /** For unions: the member types */\n members?: TypeDescriptor[]\n /** For destructured parameters: full parameter descriptors */\n destructuredParams?: Record<string, ParameterDescriptor>\n}\n\n/** Describes a function parameter */\nexport interface ParameterDescriptor {\n name: string\n type: TypeDescriptor\n required: boolean\n default?: any\n /** The example value used to infer the type (for autocomplete) */\n example?: any\n description?: string\n /** Source location for error reporting */\n loc?: { start: number; end: number }\n}\n\n/** Describes a function's complete signature */\nexport interface FunctionSignature {\n name: string\n description?: string\n parameters: Record<string, ParameterDescriptor>\n returns?: TypeDescriptor\n}\n\n// ============================================================================\n// Transpiler Options and Results\n// ============================================================================\n\n/** Options for the transpile function */\nexport interface TranspileOptions {\n /** Include source locations in output AST */\n sourceMaps?: boolean\n /** Atom registry for validation (optional) */\n atoms?: Record<string, { op: string }>\n /** Filename for error messages */\n filename?: string\n /** Whether to use strict type checking */\n strict?: boolean\n}\n\n/** Result of transpilation */\nexport interface TranspileResult {\n /** The Agent99 AST */\n ast: SeqNode\n /** The function signature with types */\n signature: FunctionSignature\n /** Source map (if enabled) */\n sourceMap?: SourceMap\n /** Warnings (non-fatal issues) */\n warnings: TranspileWarning[]\n}\n\n/** A non-fatal warning during transpilation */\nexport interface TranspileWarning {\n message: string\n line: number\n column: number\n source?: string\n}\n\n/** Source map for debugging */\nexport interface SourceMap {\n version: 3\n file: string\n sources: string[]\n mappings: string\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/** Base class for transpiler errors with source location */\nexport class TranspileError extends Error {\n line: number\n column: number\n source?: string\n filename?: string\n\n constructor(\n message: string,\n location: { line: number; column: number },\n source?: string,\n filename?: string\n ) {\n const loc = `${filename || '<source>'}:${location.line}:${location.column}`\n super(`${message} at ${loc}`)\n this.name = 'TranspileError'\n this.line = location.line\n this.column = location.column\n this.source = source\n this.filename = filename\n }\n}\n\n/** Syntax error during parsing */\nexport class SyntaxError extends TranspileError {\n constructor(\n message: string,\n location: { line: number; column: number },\n source?: string,\n filename?: string\n ) {\n super(message, location, source, filename)\n this.name = 'SyntaxError'\n }\n\n /**\n * Format the error with source context for better debugging\n * Shows the problematic line with a caret pointing to the error location\n */\n formatWithContext(contextLines = 2): string {\n if (!this.source) return this.message\n\n const lines = this.source.split('\\n')\n const errorLine = this.line - 1 // 0-indexed\n const startLine = Math.max(0, errorLine - contextLines)\n const endLine = Math.min(lines.length - 1, errorLine + contextLines)\n\n const output: string[] = []\n const lineNumWidth = String(endLine + 1).length\n\n // Add context before\n for (let i = startLine; i <= endLine; i++) {\n const lineNum = String(i + 1).padStart(lineNumWidth)\n const marker = i === errorLine ? '>' : ' '\n output.push(`${marker} ${lineNum} | ${lines[i]}`)\n\n // Add caret pointing to error column\n if (i === errorLine) {\n const caretPadding = ' '.repeat(lineNumWidth + 4 + this.column)\n output.push(`${caretPadding}^ ${this.message.split(' at ')[0]}`)\n }\n }\n\n return output.join('\\n')\n }\n}\n\n/** Type error during transpilation or runtime */\nexport class TypeError extends TranspileError {\n expected?: string\n received?: string\n suggestion?: string\n\n constructor(\n message: string,\n location: { line: number; column: number },\n options?: {\n expected?: string\n received?: string\n suggestion?: string\n source?: string\n filename?: string\n }\n ) {\n super(message, location, options?.source, options?.filename)\n this.name = 'TypeError'\n this.expected = options?.expected\n this.received = options?.received\n this.suggestion = options?.suggestion\n }\n}\n\n// ============================================================================\n// Transform Context\n// ============================================================================\n\n/** Context passed through the transformer */\nexport interface TransformContext {\n /** Current scope depth */\n depth: number\n /** Variables declared in current scope with their types */\n locals: Map<string, TypeDescriptor>\n /** Parent scope's context (for scope chain) */\n parent?: TransformContext\n /** Function parameters */\n parameters: Map<string, ParameterDescriptor>\n /** Registered atom names */\n atoms: Set<string>\n /** Accumulated warnings */\n warnings: TranspileWarning[]\n /** Source code for error messages */\n source: string\n /** Filename */\n filename: string\n /** Options */\n options: TranspileOptions\n}\n\n/** Create a child context for nested scopes */\nexport function createChildContext(parent: TransformContext): TransformContext {\n return {\n depth: parent.depth + 1,\n locals: new Map(),\n parent,\n parameters: parent.parameters,\n atoms: parent.atoms,\n warnings: parent.warnings,\n source: parent.source,\n filename: parent.filename,\n options: parent.options,\n }\n}\n\n/** Look up a variable in the scope chain */\nexport function lookupVariable(\n name: string,\n ctx: TransformContext\n): TypeDescriptor | undefined {\n // Check locals first\n if (ctx.locals.has(name)) {\n return ctx.locals.get(name)\n }\n // Check parameters\n if (ctx.parameters.has(name)) {\n return ctx.parameters.get(name)?.type\n }\n // Check parent scope\n if (ctx.parent) {\n return lookupVariable(name, ctx.parent)\n }\n return undefined\n}\n\n// ============================================================================\n// AST Node Helpers\n// ============================================================================\n\n/** Extract location from an Acorn node */\nexport function getLocation(node: Node): { line: number; column: number } {\n if (node.loc) {\n return { line: node.loc.start.line, column: node.loc.start.column }\n }\n return { line: 1, column: 0 }\n}\n", "/**\n * Parser parameter and annotation processing\n *\n * Handles the unified paren expression transformer that converts TJS syntax\n * (colon defaults, return type annotations, safe/unsafe markers) into valid JS.\n */\n\nimport { SyntaxError } from './types'\nimport type {\n TokenizerState,\n StructuralContext,\n ContextFrame,\n TjsModes,\n} from './parser-types'\n\nexport function transformParenExpressions(\n source: string,\n ctx: {\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n }\n): {\n source: string\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n} {\n let result = ''\n let i = 0\n let firstReturnType: string | undefined\n let firstReturnSafety: 'safe' | 'unsafe' | undefined\n\n // State machine for tokenizing\n let state: TokenizerState = 'normal'\n // Stack for template string interpolation depth (each entry is brace depth within that interpolation)\n const templateStack: number[] = []\n\n // Structural context tracking - know if we're in a class body, function body, etc.\n const contextStack: ContextFrame[] = [{ type: 'top-level', braceDepth: 0 }]\n let braceDepth = 0\n\n // Helper to get current structural context (reserved for future use)\n const _currentContext = (): StructuralContext =>\n contextStack[contextStack.length - 1]?.type || 'top-level'\n\n // Helper to check if we're directly in a class body (not nested in a function/block inside it)\n const isInClassBody = (): boolean => {\n const frame = contextStack[contextStack.length - 1]\n return frame?.type === 'class-body' && braceDepth === frame.braceDepth + 1\n }\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n // Handle state transitions based on current state\n switch (state) {\n case 'single-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === \"'\") {\n state = 'normal'\n }\n i++\n continue\n\n case 'double-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '\"') {\n state = 'normal'\n }\n i++\n continue\n\n case 'template-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n // Enter template expression\n result += nextChar\n i += 2\n templateStack.push(1) // Start with brace depth 1\n state = 'normal' // Back to normal parsing inside ${}\n continue\n }\n if (char === '`') {\n state = 'normal'\n }\n i++\n continue\n\n case 'line-comment':\n result += char\n if (char === '\\n') {\n state = 'normal'\n }\n i++\n continue\n\n case 'block-comment':\n result += char\n if (char === '*' && nextChar === '/') {\n result += nextChar\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'regex':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '[') {\n // Character class - read until ]\n i++\n while (i < source.length && source[i] !== ']') {\n result += source[i]\n if (source[i] === '\\\\' && i + 1 < source.length) {\n result += source[i + 1]\n i += 2\n } else {\n i++\n }\n }\n if (i < source.length) {\n result += source[i]\n i++\n }\n continue\n }\n if (char === '/') {\n // End of regex, consume flags\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) {\n result += source[i]\n i++\n }\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'normal':\n // Handle template stack - track braces inside template expressions\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n // Exiting template expression, back to template string\n templateStack.pop()\n result += char\n i++\n state = 'template-string'\n continue\n }\n }\n }\n\n // Check for string/comment/regex start\n if (char === \"'\") {\n result += char\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n result += char\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n result += char\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n result += char + nextChar\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n result += char + nextChar\n i += 2\n state = 'block-comment'\n continue\n }\n\n // Check for regex literal\n if (char === '/') {\n const before = result.trimEnd()\n const lastChar = before[before.length - 1]\n const isRegexContext =\n !lastChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]$/.test(before) ||\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)\\s*$/.test(\n before\n )\n if (isRegexContext) {\n result += char\n i++\n state = 'regex'\n continue\n }\n }\n\n // Now handle TJS-specific transformations in normal state\n break\n }\n\n // We're in normal state - look for TJS patterns\n\n // Track braces for structural context\n if (char === '{') {\n braceDepth++\n result += char\n i++\n continue\n }\n if (char === '}') {\n braceDepth--\n // Pop context if we're exiting it\n const frame = contextStack[contextStack.length - 1]\n if (frame && braceDepth === frame.braceDepth) {\n contextStack.pop()\n }\n result += char\n i++\n continue\n }\n\n // Look for class declarations: class Name { or class Name extends Base {\n const classMatch = source\n .slice(i)\n .match(/^class\\s+\\w+(?:\\s+extends\\s+\\w+)?\\s*\\{/)\n if (classMatch) {\n // Output everything up to but not including the {\n const classHeader = classMatch[0].slice(0, -1)\n result += classHeader\n i += classHeader.length\n // Push class-body context (will be entered when we see the {)\n contextStack.push({ type: 'class-body', braceDepth })\n continue\n }\n\n // Look for function declarations: function name( or function name (\n const funcMatch = source.slice(i).match(/^function\\s+(\\w+)\\s*\\(/)\n if (funcMatch) {\n const funcName = funcMatch[1]\n const matchLen = funcMatch[0].length\n\n // Check for safety marker right after opening paren: (? or (!\n const afterParen = source[i + matchLen]\n let safetyMarker: '?' | '!' | null = null\n let paramStart = i + matchLen\n\n if (afterParen === '?' || afterParen === '!') {\n safetyMarker = afterParen\n paramStart++\n if (safetyMarker === '!') {\n ctx.unsafeFunctions.add(funcName)\n } else {\n ctx.safeFunctions.add(funcName)\n }\n }\n\n result += `function ${funcName}(`\n i = paramStart\n\n // Find matching ) using balanced counting\n const paramsResult = extractBalancedContent(source, i, '(', ')')\n if (!paramsResult) {\n // Unbalanced - just copy character and continue\n result += source[i]\n i++\n continue\n }\n\n const { content: params, endPos } = paramsResult\n i = endPos\n\n // Process the params (transform : to = for required params, handle nested arrows)\n const processedParams = processParamString(params, ctx, true)\n result += processedParams + ')'\n\n // Check what follows the closing paren: return type annotation (:, :?, :!)\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n let safety: 'safe' | 'unsafe' | undefined\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n safety = colonMarker === ':?' ? 'safe' : 'unsafe'\n } else {\n j += 1\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n if (firstReturnType === undefined) {\n firstReturnType = typeResult.type\n if (safety) firstReturnSafety = safety\n }\n i = typeResult.endPos\n }\n }\n continue\n }\n\n // Look for class method syntax: constructor(, methodName(, get name(, set name(\n // These appear inside class bodies and need param transformation\n // Only match if we're actually in a class body (proper context tracking)\n // Must NOT match function calls in expressions (div(), span(), etc.)\n const methodMatch = source\n .slice(i)\n .match(/^(constructor|(?:get|set)\\s+\\w+|async\\s+\\w+|\\w+)\\s*\\(/)\n // Check that the preceding non-whitespace character indicates this is a\n // declaration, not a function call in an expression.\n // Method declarations follow: newline, {, ;, or start of file\n // Function calls follow: = => , [ ( . operators etc.\n const prevNonWs = (() => {\n for (let k = result.length - 1; k >= 0; k--) {\n if (!/\\s/.test(result[k])) return result[k]\n }\n return '\\n' // start of input\n })()\n // Method declarations can follow almost anything (property, }, ;, etc.)\n // Function CALLS in expressions specifically follow: = => , [ (\n const isMethodDecl =\n prevNonWs !== '=' &&\n prevNonWs !== ',' &&\n prevNonWs !== '(' &&\n prevNonWs !== '[' &&\n prevNonWs !== '>' // catches =>\n if (methodMatch && isInClassBody() && !isMethodDecl) {\n // Not a method declaration (it's a function call in an expression).\n // Skip past the identifier to prevent re-matching a suffix\n // (e.g. 'div(' \u2192 skip 'div', don't let 'iv(' match next).\n const skipLen = methodMatch[1].length\n result += source.slice(i, i + skipLen)\n i += skipLen\n continue\n }\n if (methodMatch && isInClassBody() && isMethodDecl) {\n // We're actually in a class body - this is a method definition\n const methodPart = methodMatch[1]\n const matchLen = methodMatch[0].length\n const paramStart = i + matchLen\n\n result += methodPart + '('\n i = paramStart\n\n // Find matching )\n const paramsResult = extractBalancedContent(source, i, '(', ')')\n if (!paramsResult) {\n result += source[i]\n i++\n continue\n }\n\n const { content: params, endPos } = paramsResult\n i = endPos\n\n // Process the params (transform : to = for TJS types)\n const processedParams = processParamString(params, ctx, true)\n result += processedParams + ')'\n\n // Check for return type annotation: ): type, ):! type, ):? type\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n } else {\n j++\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n i = typeResult.endPos\n }\n }\n\n continue\n }\n\n // Look for arrow function params: (params) =>\n // We need to be careful to only transform when followed by =>\n if (source[i] === '(') {\n // First, find the matching ) without consuming any safety marker\n // We'll check for safety marker only if this is actually an arrow function\n const fullParamsResult = extractBalancedContent(source, i + 1, '(', ')')\n if (!fullParamsResult) {\n result += source[i]\n i++\n continue\n }\n\n const fullContent = fullParamsResult.content\n const endPos = fullParamsResult.endPos\n\n // Check what follows: whitespace then => (arrow function) or -> (return type on arrow)\n let j = endPos\n while (j < source.length && /\\s/.test(source[j])) j++\n\n // Check for return type annotation on arrow function: ): type =>\n let arrowReturnType: string | undefined\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n } else {\n j++\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n arrowReturnType = typeResult.type\n j = typeResult.endPos\n while (j < source.length && /\\s/.test(source[j])) j++\n }\n }\n\n if (source.slice(j, j + 2) === '=>') {\n // This IS an arrow function - now check for safety marker\n let safetyMarker: '?' | '!' | null = null\n let params = fullContent\n\n // Check if content starts with safety marker (? or !) followed by whitespace\n const trimmedContent = fullContent.trimStart()\n if (\n trimmedContent.startsWith('?') &&\n (trimmedContent.length === 1 || /\\s/.test(trimmedContent[1]))\n ) {\n safetyMarker = '?'\n params = trimmedContent.slice(1)\n } else if (\n trimmedContent.startsWith('!') &&\n (trimmedContent.length === 1 || /\\s/.test(trimmedContent[1]))\n ) {\n safetyMarker = '!'\n params = trimmedContent.slice(1)\n }\n\n // Process the params\n const processedParams = processParamString(params, ctx, false)\n // Add safety marker as comment for arrow functions (since we can't track them by name)\n const safetyComment =\n safetyMarker === '?'\n ? '/* safe */ '\n : safetyMarker === '!'\n ? '/* unsafe */ '\n : ''\n result += `(${safetyComment}${processedParams})`\n // Skip the return type annotation (we extracted it but don't emit it)\n i = endPos\n // Skip to just before the =>\n while (i < j && /\\s/.test(source[i])) {\n result += source[i]\n i++\n }\n // If there was a return type, we need to skip past it to =>\n if (arrowReturnType) {\n i = j\n }\n } else {\n // Not an arrow function - recursively transform the content for nested arrows\n // but don't process as param declarations (no colon-to-equals transform)\n const transformed = transformParenExpressions(fullContent, ctx)\n result += `(${transformed.source})`\n i = endPos\n }\n continue\n }\n\n result += source[i]\n i++\n }\n\n return {\n source: result,\n returnType: firstReturnType,\n returnSafety: firstReturnSafety,\n }\n}\n\n/**\n * Extract balanced content between delimiters\n * @param source The source string\n * @param start Position after the opening delimiter\n * @param open Opening delimiter character (for depth counting of nested structures)\n * @param close Closing delimiter character\n * @returns The content between delimiters and position after closing delimiter, or null if unbalanced\n */\nfunction extractBalancedContent(\n source: string,\n start: number,\n open: string,\n close: string\n): { content: string; endPos: number } | null {\n let depth = 1\n let i = start\n let inString = false\n let stringChar = ''\n\n while (i < source.length && depth > 0) {\n const char = source[i]\n\n // Handle string literals\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n } else if (inString && char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n } else if (!inString) {\n if (char === open) depth++\n else if (char === close) depth--\n }\n i++\n }\n\n if (depth !== 0) return null\n\n return {\n content: source.slice(start, i - 1),\n endPos: i,\n }\n}\n\n/**\n * Extract a JS value starting at a position in source.\n * Handles nested objects {}, arrays [], strings, numbers, booleans, null.\n * Uses state machine to properly track nesting.\n */\nexport function extractJSValue(\n source: string,\n start: number\n): { value: string; endPos: number } | null {\n let i = start\n\n // Skip leading whitespace\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i >= source.length) return null\n\n const valueStart = i\n const firstChar = source[i]\n\n // Handle objects and arrays with balanced parsing\n if (firstChar === '{' || firstChar === '[') {\n const close = firstChar === '{' ? '}' : ']'\n const result = extractBalancedContent(source, i + 1, firstChar, close)\n if (!result) return null\n return {\n value: source.slice(valueStart, result.endPos),\n endPos: result.endPos,\n }\n }\n\n // Handle strings\n if (firstChar === \"'\" || firstChar === '\"' || firstChar === '`') {\n i++\n while (i < source.length) {\n if (source[i] === firstChar && source[i - 1] !== '\\\\') {\n i++\n return { value: source.slice(valueStart, i), endPos: i }\n }\n i++\n }\n return null // Unterminated string\n }\n\n // Handle numbers (including negative and decimals)\n if (/[-+\\d]/.test(firstChar)) {\n while (i < source.length && /[\\d.eE+-]/.test(source[i])) i++\n return { value: source.slice(valueStart, i), endPos: i }\n }\n\n // Handle keywords: true, false, null, undefined\n const keywordMatch = source.slice(i).match(/^(true|false|null|undefined)\\b/)\n if (keywordMatch) {\n return {\n value: keywordMatch[1],\n endPos: i + keywordMatch[1].length,\n }\n }\n\n return null\n}\n\n/**\n * Normalize union syntax in type strings\n * Converts single | to || for TJS consistency (needed for JS parsing)\n */\nfunction normalizeUnionSyntax(type: string): string {\n // Replace single | (not ||) with || for proper JS parsing\n // Use negative lookbehind and lookahead to avoid matching ||\n return type.replace(/(?<!\\|)\\|(?!\\|)/g, ' || ')\n}\n\n/**\n * Extract a return type value starting at the given position\n * Handles: simple types ('', 0, null), objects ({ }), arrays ([ ]), unions (| or ||)\n */\nfunction extractReturnTypeValue(\n source: string,\n start: number\n): { type: string; endPos: number } | null {\n let i = start\n let depth = 0\n let inString = false\n let stringChar = ''\n let sawContent = false\n\n // Helper to create result with normalized type\n const makeResult = (endPos: number) => ({\n type: normalizeUnionSyntax(source.slice(start, endPos).trim()),\n endPos,\n })\n\n while (i < source.length) {\n const char = source[i]\n\n // Handle string literals\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n sawContent = true\n i++\n continue\n }\n if (inString) {\n if (char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n i++ // Move past closing quote\n // Just finished a string at depth 0\n if (depth === 0) {\n // Check if next non-ws is function body { or union |\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n if (source[j] === '{') {\n // Check if it's object type or function body\n const afterBrace = source.slice(j + 1).match(/^\\s*(\\w+)\\s*:/)\n if (!afterBrace) {\n // Function body - type ends here\n return makeResult(i)\n }\n }\n if (source[j] !== '|' && source[j] !== '&') {\n // No union - type ends here\n return makeResult(i)\n }\n }\n continue\n }\n i++\n continue\n }\n\n // Track bracket depth\n if (char === '{' || char === '[' || char === '(') {\n depth++\n sawContent = true\n i++\n continue\n }\n if (char === '}' || char === ']' || char === ')') {\n depth--\n if (depth === 0) {\n i++\n // Check for union after closing bracket\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n if (source[j] === '|' || source[j] === '&') {\n continue // More type content\n }\n return makeResult(i)\n }\n i++\n continue\n }\n\n // At depth 0, check for function body\n if (depth === 0 && char === '{') {\n if (sawContent) {\n return makeResult(i)\n }\n // First { - check if object type or function body\n const afterBrace = source.slice(i + 1).match(/^\\s*(\\w+)\\s*:/)\n if (afterBrace) {\n depth++\n sawContent = true\n i++\n continue\n }\n return makeResult(i)\n }\n\n // Handle union/intersection at depth 0\n if (depth === 0 && (char === '|' || char === '&')) {\n i++\n if (i < source.length && source[i] === '|') i++ // Skip second | for ||\n while (i < source.length && /\\s/.test(source[i])) i++\n continue\n }\n\n // Handle numbers (including decimals like 14.5, -3.14)\n if (\n depth === 0 &&\n (/\\d/.test(char) || (char === '-' && /\\d/.test(source[i + 1])))\n ) {\n let j = i\n if (source[j] === '-') j++ // Skip negative sign\n while (j < source.length && /\\d/.test(source[j])) j++\n // Handle decimal part\n if (j < source.length && source[j] === '.' && /\\d/.test(source[j + 1])) {\n j++ // Skip decimal point\n while (j < source.length && /\\d/.test(source[j])) j++\n }\n // Handle exponent (1e10, 1.5e-3)\n if (j < source.length && (source[j] === 'e' || source[j] === 'E')) {\n j++\n if (j < source.length && (source[j] === '+' || source[j] === '-')) j++\n while (j < source.length && /\\d/.test(source[j])) j++\n }\n sawContent = true\n i = j\n // Check what's next\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i < source.length && source[i] === '{') {\n // Function body - type ends here\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n if (source[i] !== '|' && source[i] !== '&') {\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n continue\n }\n\n // Handle identifiers (null, undefined, true, false, type names)\n if (depth === 0 && /[a-zA-Z_]/.test(char)) {\n let j = i\n while (j < source.length && /\\w/.test(source[j])) j++\n sawContent = true\n i = j\n // Check what's next\n while (i < source.length && /\\s/.test(source[i])) i++\n\n // Identifier followed by ( \u2014 constructor/function call as return type\n // e.g. FunctionPredicate('function', { params: ... })\n if (i < source.length && source[i] === '(') {\n depth++\n i++\n continue\n }\n\n if (i < source.length && source[i] === '{') {\n // Check if function body\n const afterBrace = source.slice(i + 1).match(/^\\s*(\\w+)\\s*:/)\n if (!afterBrace) {\n // Function body - type ends before whitespace\n let typeEnd = j\n while (typeEnd > start && /\\s/.test(source[typeEnd - 1])) typeEnd--\n return {\n type: normalizeUnionSyntax(source.slice(start, typeEnd).trim()),\n endPos: j,\n }\n }\n }\n if (source[i] !== '|' && source[i] !== '&') {\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n continue\n }\n\n i++\n }\n\n // Reached end of source\n if (sawContent) {\n return makeResult(i)\n }\n return null\n}\n\n/**\n * Split parameter string respecting nested braces/brackets\n */\nfunction splitParameters(params: string): string[] {\n const result: string[] = []\n let current = ''\n let depth = 0\n let inLineComment = false\n let inBlockComment = false\n let i = 0\n\n while (i < params.length) {\n const char = params[i]\n const nextChar = params[i + 1]\n\n // Handle line comments - preserve them in output\n if (!inBlockComment && char === '/' && nextChar === '/') {\n inLineComment = true\n current += '//'\n i += 2\n continue\n }\n\n // Handle block comments - preserve them in output\n if (!inLineComment && char === '/' && nextChar === '*') {\n inBlockComment = true\n current += '/*'\n i += 2\n continue\n }\n\n // End of line comment\n if (inLineComment && char === '\\n') {\n inLineComment = false\n current += char\n i++\n continue\n }\n\n // End of block comment - preserve closing\n if (inBlockComment && char === '*' && nextChar === '/') {\n inBlockComment = false\n current += '*/'\n i += 2\n continue\n }\n\n // Inside comments - preserve the content\n if (inLineComment || inBlockComment) {\n current += char\n i++\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n current += char\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n current += char\n } else if (char === ',' && depth === 0) {\n result.push(current)\n current = ''\n } else {\n current += char\n }\n i++\n }\n\n if (current.trim()) {\n result.push(current)\n }\n\n return result\n}\n\n/**\n * Process a parameter string, transforming : to = for required params\n * and recursively handling nested arrow functions\n */\nfunction processParamString(\n params: string,\n ctx: {\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n },\n trackRequired: boolean\n): string {\n // First recursively process any nested arrow functions\n const withArrows = transformParenExpressions(params, {\n originalSource: params,\n requiredParams: ctx.requiredParams,\n unsafeFunctions: ctx.unsafeFunctions,\n safeFunctions: ctx.safeFunctions,\n }).source\n\n // Now split and process each parameter\n const paramList = splitParameters(withArrows)\n let sawOptional = false\n const seenNames = new Set<string>()\n\n // Helper to check for duplicate names\n const checkDuplicate = (name: string) => {\n if (trackRequired && /^\\w+$/.test(name)) {\n if (seenNames.has(name)) {\n throw new Error(`Duplicate parameter name '${name}'`)\n }\n seenNames.add(name)\n }\n }\n\n const processed = paramList.map((param) => {\n const trimmed = param.trim()\n if (!trimmed) return param\n\n // Handle destructured object parameters: { name: 'Clara', age = 30 }\n // Transform colons to equals inside the braces (recursive)\n // Order doesn't matter for objects, so don't enforce required-before-optional\n // ONLY do this when trackRequired is true - i.e., actual function parameters\n if (trackRequired && trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const inner = trimmed.slice(1, -1)\n const processedInner = processDestructuredObjectParams(inner, ctx)\n return `{ ${processedInner} }`\n }\n\n // Handle destructured array parameters: [first: '', second: 0]\n // ONLY do this when trackRequired is true - i.e., actual function parameters\n if (trackRequired && trimmed.startsWith('[') && trimmed.endsWith(']')) {\n const inner = trimmed.slice(1, -1)\n const processedInner = processDestructuredObjectParams(inner, ctx)\n return `[ ${processedInner} ]`\n }\n\n // Handle rest parameters: ...args: [0] -> ...args (strip type, JS forbids defaults on rest)\n // The type annotation is still captured by extractFunctionTypeInfo for __tjs metadata\n if (trimmed.startsWith('...')) {\n const restColonPos = findTopLevelColon(trimmed)\n if (restColonPos !== -1) {\n const restName = trimmed.slice(0, restColonPos).trim()\n return restName\n }\n return param\n }\n\n // Handle optional param syntax: x?: type -> x = type (not required)\n const optionalMatch = trimmed.match(/^(\\w+)\\s*\\?\\s*:\\s*(.+)$/)\n if (optionalMatch) {\n const [, name, type] = optionalMatch\n checkDuplicate(name)\n sawOptional = true\n // Optional params are NOT tracked as required\n return `${name} = ${type}`\n }\n\n // Check if param already has a default value (x = value)\n if (!hasColonNotEquals(trimmed)) {\n // Has equals sign (default value) - this is optional\n // Extract name from \"name = value\" pattern\n const eqMatch = trimmed.match(/^(\\w+)\\s*=/)\n if (eqMatch) {\n checkDuplicate(eqMatch[1])\n }\n sawOptional = true\n return param\n }\n\n // Handle required param syntax: x: type -> x = type (tracked as required)\n const colonPos = findTopLevelColon(trimmed)\n if (colonPos !== -1) {\n const name = trimmed.slice(0, colonPos).trim()\n const type = trimmed.slice(colonPos + 1).trim()\n\n checkDuplicate(name)\n\n // Required param after optional \u2014 warn but allow.\n // TypeScript permits this, and the TS\u2192TJS converter can produce it\n // when earlier params degrade to 'any' (bare name, no : or =).\n if (sawOptional && trackRequired && /^\\w+$/.test(name)) {\n // Allow it \u2014 JavaScript handles this fine (caller passes undefined)\n }\n\n if (trackRequired && /^\\w+$/.test(name)) {\n ctx.requiredParams.add(name)\n }\n return `${name} = ${type}`\n }\n\n return param\n })\n\n return processed.join(',')\n}\n\n/**\n * Process destructured object/array parameters\n *\n * In TJS destructuring patterns:\n * - `name: 'Clara'` means required param with example (transforms to `name = 'Clara'`)\n * - `age = 30` means optional param with default (stays as `age = 30`)\n * - Nested objects like `address: { street: '9 High St', zip = '0000' }` are tricky:\n * the inner object is a value (object literal), not a pattern, so we transform it back\n *\n * Key insight: In destructuring, `foo: value` at top level is a required param,\n * but at nested levels within an object value, `:` is normal object literal syntax.\n *\n * Order does NOT matter in objects (unlike positional function params).\n */\nfunction processDestructuredObjectParams(\n inner: string,\n ctx: {\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n }\n): string {\n // Split on commas at the top level (respecting nested braces)\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Check for nested destructured object: name: { ... }\n // The inner { ... } is an object literal value, not a destructuring pattern\n const nestedObjectMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjectMatch) {\n const [, name, objectLiteral] = nestedObjectMatch\n ctx.requiredParams.add(name)\n // Process the inner object as an object literal (transform = to : for values)\n const processedLiteral = processObjectLiteralValue(objectLiteral)\n return `${name} = ${processedLiteral}`\n }\n\n // Check for nested destructured array: name: [ ... ]\n const nestedArrayMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrayMatch) {\n const [, name, arrayLiteral] = nestedArrayMatch\n ctx.requiredParams.add(name)\n // Process the inner array as an array literal\n const processedLiteral = processArrayLiteralValue(arrayLiteral)\n return `${name} = ${processedLiteral}`\n }\n\n // Handle simple colon syntax: name: 'value' -> name = 'value' (required)\n const colonMatch = trimmed.match(/^(\\w+)\\s*:\\s*([\\s\\S]+)$/)\n if (colonMatch) {\n const [, name, value] = colonMatch\n ctx.requiredParams.add(name)\n return `${name} = ${value}`\n }\n\n // Handle equals syntax: name = value (optional, already valid JS)\n // Just preserve it as-is\n return part\n })\n\n return processed.join(', ')\n}\n\n/**\n * Process an object literal value (nested inside destructuring)\n *\n * In object literals, TJS allows `=` for optional values:\n * { street: '9 High St', zip = '0000' }\n *\n * This must become valid JS object literal syntax:\n * { street: '9 High St', zip: '0000' }\n *\n * (The `=` is TJS shorthand indicating the value is optional/has default,\n * but in an object literal context it must use `:`)\n */\nfunction processObjectLiteralValue(literal: string): string {\n // Remove outer braces, process content, restore braces\n const inner = literal.slice(1, -1).trim()\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Handle nested objects: key: { ... } or key = { ... }\n const nestedObjColonMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjColonMatch) {\n const [, key, nested] = nestedObjColonMatch\n return `${key}: ${processObjectLiteralValue(nested)}`\n }\n const nestedObjEqualsMatch = trimmed.match(/^(\\w+)\\s*=\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjEqualsMatch) {\n const [, key, nested] = nestedObjEqualsMatch\n return `${key}: ${processObjectLiteralValue(nested)}`\n }\n\n // Handle nested arrays: key: [ ... ] or key = [ ... ]\n const nestedArrColonMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrColonMatch) {\n const [, key, nested] = nestedArrColonMatch\n return `${key}: ${processArrayLiteralValue(nested)}`\n }\n const nestedArrEqualsMatch = trimmed.match(/^(\\w+)\\s*=\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrEqualsMatch) {\n const [, key, nested] = nestedArrEqualsMatch\n return `${key}: ${processArrayLiteralValue(nested)}`\n }\n\n // Transform equals to colon for simple values: key = value -> key: value\n const equalsMatch = trimmed.match(/^(\\w+)\\s*=\\s*([\\s\\S]+)$/)\n if (equalsMatch) {\n const [, key, value] = equalsMatch\n return `${key}: ${value}`\n }\n\n // Colon syntax is already valid: key: value\n return part\n })\n\n return `{ ${processed.join(', ')} }`\n}\n\n/**\n * Process an array literal value (nested inside destructuring)\n * Similar to processObjectLiteralValue but for arrays\n */\nfunction processArrayLiteralValue(literal: string): string {\n // Remove outer brackets, process content, restore brackets\n const inner = literal.slice(1, -1).trim()\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Handle nested objects\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n return processObjectLiteralValue(trimmed)\n }\n\n // Handle nested arrays\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n return processArrayLiteralValue(trimmed)\n }\n\n // Array elements are just values, no transformation needed\n return part\n })\n\n return `[ ${processed.join(', ')} ]`\n}\n\n/**\n * Check if param has a top-level colon but no top-level equals\n * This distinguishes x: type from x = type and handles nested structures\n */\nfunction hasColonNotEquals(param: string): boolean {\n let depth = 0\n let hasColon = false\n let hasEquals = false\n let inString = false\n let stringChar = ''\n\n for (let i = 0; i < param.length; i++) {\n const char = param[i]\n\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n continue\n }\n if (inString) {\n if (char === stringChar && param[i - 1] !== '\\\\') inString = false\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n } else if (depth === 0) {\n if (char === ':') hasColon = true\n if (char === '=' && param[i + 1] !== '>') hasEquals = true // Ignore =>\n }\n }\n\n return hasColon && !hasEquals\n}\n\n/**\n * Find the position of the first top-level colon in a param\n */\nfunction findTopLevelColon(param: string): number {\n let depth = 0\n let inString = false\n let stringChar = ''\n\n for (let i = 0; i < param.length; i++) {\n const char = param[i]\n\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n continue\n }\n if (inString) {\n if (char === stringChar && param[i - 1] !== '\\\\') inString = false\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n } else if (depth === 0 && char === ':') {\n return i\n }\n }\n\n return -1\n}\n\n/**\n * Preprocess source to handle custom syntax extensions\n *\n * Transforms:\n * function foo(x: 'example') { }\n * Into:\n * function foo(x = 'example') { }\n * And tracks that 'x' is a required parameter.\n *\n * Also handles return type annotation:\n * function foo(x: 'example') -> { result: 'string' } { }\n */\n", "/**\n * Parser source transforms\n *\n * All source-to-source text transforms used by the preprocess pipeline.\n * These operate on raw source strings before Acorn parsing.\n */\n\nimport { SyntaxError } from './types'\n\n/**\n * Extract a brace-balanced value from source after a regex match.\n * Returns a match-like object with [1] being the balanced { ... } content,\n * or null if no match. Handles nested braces.\n */\nfunction extractBalancedValue(\n source: string,\n startRe: RegExp\n): RegExpMatchArray | null {\n const m = source.match(startRe)\n if (!m) return null\n\n const braceStart = m.index! + m[0].length - 1 // position of opening {\n let depth = 1\n let j = braceStart + 1\n while (j < source.length && depth > 0) {\n if (source[j] === '{') depth++\n else if (source[j] === '}') depth--\n j++\n }\n if (depth !== 0) return null\n\n const balanced = source.slice(braceStart, j) // includes { and }\n const result = [m[0].slice(0, -1) + balanced, balanced] as RegExpMatchArray\n result.index = m.index\n return result\n}\nimport type {\n WasmBlock,\n TestBlock,\n ExtensionInfo,\n PolyVariant,\n TokenizerState,\n} from './parser-types'\nimport { extractJSValue } from './parser-params'\n\nexport function transformTryWithoutCatch(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'try' keyword followed by '{'\n const tryMatch = source.slice(i).match(/^\\btry\\s*\\{/)\n if (tryMatch) {\n // Found 'try {', now find the matching closing brace\n const startBrace = i + tryMatch[0].length - 1\n const bodyStart = startBrace + 1\n let depth = 1\n let j = bodyStart\n\n while (j < source.length && depth > 0) {\n const char = source[j]\n if (char === '{') depth++\n else if (char === '}') depth--\n j++\n }\n\n if (depth !== 0) {\n // Unbalanced braces, let the parser handle the error\n result += source[i]\n i++\n continue\n }\n\n // Check what comes after the closing brace\n const afterTry = source.slice(j).match(/^\\s*(catch|finally)\\b/)\n\n if (afterTry) {\n // Has catch or finally - leave it alone, copy the try block as-is\n result += source.slice(i, j)\n i = j\n } else {\n // No catch or finally - add monadic error handler\n // Returns MonadicError to maintain monadic flow (propagates through function chains)\n const body = source.slice(bodyStart, j - 1)\n result += `try {${body}} catch (__try_err) { return new (__tjs?.MonadicError ?? Error)(__try_err?.message || String(__try_err), 'try', undefined, undefined, __tjs?.getStack?.()) }`\n i = j\n }\n } else {\n result += source[i]\n i++\n }\n }\n\n return result\n}\n\n/**\n * Extract WASM blocks from source and replace with runtime dispatch code\n *\n * Simple form (body used as both WASM source and JS fallback):\n * wasm {\n * for (let i = 0; i < arr.length; i++) { arr[i] *= 2 }\n * }\n *\n * With explicit fallback (when you need different JS code):\n * wasm {\n * // WASM-optimized version\n * } fallback {\n * // Different JS implementation\n * }\n *\n * Output:\n * (globalThis.__tjs_wasm_0\n * ? globalThis.__tjs_wasm_0(captures...)\n * : (() => { body })())\n *\n * Variables are auto-captured from the body.\n */\nexport function extractWasmBlocks(source: string): {\n source: string\n blocks: WasmBlock[]\n} {\n const blocks: WasmBlock[] = []\n let result = ''\n let i = 0\n let blockId = 0\n\n while (i < source.length) {\n // Look for 'wasm {' or 'wasm{' - simple block without params\n const wasmMatch = source.slice(i).match(/^\\bwasm\\s*\\{/)\n if (wasmMatch) {\n const matchStart = i\n\n // Find the body\n const bodyStart = i + wasmMatch[0].length\n let braceDepth = 1\n let j = bodyStart\n\n while (j < source.length && braceDepth > 0) {\n const char = source[j]\n if (char === '{') braceDepth++\n else if (char === '}') braceDepth--\n j++\n }\n\n if (braceDepth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const body = source.slice(bodyStart, j - 1)\n let fallbackBody: string | undefined\n let matchEnd = j\n\n // Check for optional 'fallback {' block\n const fallbackMatch = source.slice(j).match(/^\\s*fallback\\s*\\{/)\n if (fallbackMatch) {\n const fallbackStart = j + fallbackMatch[0].length\n braceDepth = 1\n let k = fallbackStart\n\n while (k < source.length && braceDepth > 0) {\n const char = source[k]\n if (char === '{') braceDepth++\n else if (char === '}') braceDepth--\n k++\n }\n\n if (braceDepth === 0) {\n fallbackBody = source.slice(fallbackStart, k - 1)\n matchEnd = k\n }\n }\n\n // Auto-detect captured variables from the body\n const captureNames = detectCaptures(body)\n\n // Try to find type annotations from enclosing function parameters\n // Look backwards from matchStart to find the function signature\n const captures = captureNames.map((name) => {\n const typeAnnotation = findParameterType(source, matchStart, name)\n return typeAnnotation ? `${name}: ${typeAnnotation}` : name\n })\n\n // Create the block record\n const block: WasmBlock = {\n id: `__tjs_wasm_${blockId}`,\n body,\n fallback: fallbackBody,\n captures,\n start: matchStart,\n end: matchEnd,\n }\n blocks.push(block)\n\n // Generate runtime dispatch code:\n // The fallback is the body itself (or explicit fallback if provided)\n const fallbackCode = fallbackBody ?? body\n // Strip type annotations from captures for runtime args (e.g., \"xs: Float32Array\" -> \"xs\")\n const captureArgNames = captures.map((c) => c.split(':')[0].trim())\n const captureArgs =\n captureArgNames.length > 0 ? captureArgNames.join(', ') : ''\n\n // For WASM: pass captures as arguments\n // For fallback: just run inline (captures are in scope)\n const wasmCall =\n captureArgNames.length > 0\n ? `globalThis.${block.id}(${captureArgs})`\n : `globalThis.${block.id}()`\n\n const dispatch = `(globalThis.${block.id} ? ${wasmCall} : (() => {${fallbackCode}})())`\n\n result += dispatch\n i = matchEnd\n blockId++\n } else {\n result += source[i]\n i++\n }\n }\n\n return { source: result, blocks }\n}\n\n/** Check if an identifier is a WASM SIMD intrinsic (not a captured variable) */\nfunction isWasmIntrinsic(name: string): boolean {\n return name.startsWith('f32x4_') || name.startsWith('v128_')\n}\n\n/**\n * Detect variables captured from enclosing scope\n *\n * Finds identifiers that are:\n * - Used in the body\n * - Not declared within the body (let, const, var, function params)\n *\n * This is a simple heuristic - a full implementation would use proper AST analysis\n */\nfunction detectCaptures(body: string): string[] {\n // Strip comments first to avoid extracting words from comments\n const bodyWithoutComments = body\n .replace(/\\/\\/[^\\n]*/g, '') // line comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // block comments\n\n // Collect identifiers that appear as property accesses (after a dot)\n const propertyOnly = new Set<string>()\n const propPattern = /\\.([a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g\n let match\n while ((match = propPattern.exec(bodyWithoutComments)) !== null) {\n propertyOnly.add(match[1])\n }\n\n // Find all identifiers used in the body (not after a dot)\n const identifierPattern = /(?<!\\.)(\\b[a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g\n const allIdentifiers = new Set<string>()\n while ((match = identifierPattern.exec(bodyWithoutComments)) !== null) {\n allIdentifiers.add(match[1])\n }\n\n // Remove identifiers that ONLY appear as property accesses\n for (const prop of propertyOnly) {\n if (!allIdentifiers.has(prop)) continue\n // Check if this identifier is also used standalone (not just as .prop)\n const standalonePattern = new RegExp(`(?<!\\\\.)\\\\b${prop}\\\\b`, 'g')\n const dotPattern = new RegExp(`\\\\.${prop}\\\\b`, 'g')\n const standaloneMatches =\n bodyWithoutComments.match(standalonePattern)?.length || 0\n const dotMatches = bodyWithoutComments.match(dotPattern)?.length || 0\n // If every occurrence is a property access, remove it\n if (standaloneMatches <= dotMatches) {\n allIdentifiers.delete(prop)\n }\n }\n\n // Find identifiers declared in the body\n const declared = new Set<string>()\n\n // let/const/var declarations\n const declPattern = /\\b(?:let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g\n while ((match = declPattern.exec(bodyWithoutComments)) !== null) {\n declared.add(match[1])\n }\n\n // for loop variables: for (let i = ...)\n const forPattern =\n /\\bfor\\s*\\(\\s*(?:let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g\n while ((match = forPattern.exec(bodyWithoutComments)) !== null) {\n declared.add(match[1])\n }\n\n // function declarations and parameters would go here for full impl\n\n // JS keywords and builtins to exclude\n const reserved = new Set([\n 'if',\n 'else',\n 'for',\n 'while',\n 'do',\n 'switch',\n 'case',\n 'break',\n 'continue',\n 'return',\n 'function',\n 'let',\n 'const',\n 'var',\n 'new',\n 'this',\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'typeof',\n 'instanceof',\n 'in',\n 'of',\n 'try',\n 'catch',\n 'finally',\n 'throw',\n 'async',\n 'await',\n 'class',\n 'extends',\n 'super',\n 'import',\n 'export',\n 'default',\n 'from',\n 'as',\n 'static',\n 'get',\n 'set',\n 'yield',\n // Common globals\n 'console',\n 'Math',\n 'Array',\n 'Object',\n 'String',\n 'Number',\n 'Boolean',\n 'Date',\n 'JSON',\n 'Promise',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Float32Array',\n 'Float64Array',\n 'Int8Array',\n 'Int16Array',\n 'Int32Array',\n 'Uint8Array',\n 'Uint16Array',\n 'Uint32Array',\n 'BigInt64Array',\n 'BigUint64Array',\n 'ArrayBuffer',\n 'DataView',\n 'Error',\n 'TypeError',\n 'RangeError',\n 'length',\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'slice',\n 'splice',\n 'map',\n 'filter',\n 'reduce',\n 'forEach',\n 'find',\n 'findIndex',\n 'indexOf',\n 'includes',\n 'globalThis',\n 'window',\n 'document',\n 'Infinity',\n 'NaN',\n 'isNaN',\n 'isFinite',\n 'parseInt',\n 'parseFloat',\n 'encodeURI',\n 'decodeURI',\n 'eval',\n 'wasmBuffer',\n ])\n\n // Return identifiers that are used but not declared or reserved\n const captures: string[] = []\n for (const id of allIdentifiers) {\n if (!declared.has(id) && !reserved.has(id) && !isWasmIntrinsic(id)) {\n captures.push(id)\n }\n }\n\n return captures.sort()\n}\n\n/**\n * Find the type annotation for a parameter in the enclosing function\n *\n * Looks backwards from wasmBlockStart to find the function signature,\n * then extracts the type annotation for the given parameter name.\n *\n * Supports:\n * - TJS colon syntax: `param: Float32Array`\n * - TypeScript syntax: `param: Float32Array`\n */\nfunction findParameterType(\n source: string,\n wasmBlockStart: number,\n paramName: string\n): string | undefined {\n // Look backwards to find the function signature\n // Find the nearest 'function' keyword before the wasm block\n const beforeBlock = source.slice(0, wasmBlockStart)\n\n // Match function declaration with parameters\n // This regex finds function signatures and captures the parameter list\n const funcPattern = /function\\s+\\w+\\s*\\(([^)]*)\\)\\s*(?:->.*?)?\\s*\\{[^}]*$/\n const match = beforeBlock.match(funcPattern)\n\n if (!match) {\n // Try arrow function or method syntax\n const arrowPattern =\n /(?:const|let|var)?\\s*\\w+\\s*=\\s*(?:async\\s*)?\\(([^)]*)\\)\\s*(?:=>|->)?\\s*\\{[^}]*$/\n const arrowMatch = beforeBlock.match(arrowPattern)\n if (!arrowMatch) return undefined\n return extractTypeFromParams(arrowMatch[1], paramName)\n }\n\n return extractTypeFromParams(match[1], paramName)\n}\n\n/**\n * Extract the type annotation for a specific parameter from a parameter list string\n */\nfunction extractTypeFromParams(\n paramsStr: string,\n paramName: string\n): string | undefined {\n // Split by comma (handling nested structures)\n const params = paramsStr.split(',').map((p) => p.trim())\n\n for (const param of params) {\n // Match patterns like:\n // - `name: Float32Array`\n // - `name: number`\n // - `name = Float32Array` (TJS example syntax)\n const colonMatch = param.match(\n new RegExp(`^${paramName}\\\\s*:\\\\s*([A-Za-z][A-Za-z0-9]*)`)\n )\n if (colonMatch) {\n return colonMatch[1]\n }\n\n // Match TypeScript-style with equals (default value that's a type constructor)\n const equalsMatch = param.match(\n new RegExp(\n `^${paramName}\\\\s*=\\\\s*(Float32Array|Float64Array|Int32Array|Uint8Array|Int8Array|Int16Array|Uint16Array|Uint32Array)`\n )\n )\n if (equalsMatch) {\n return equalsMatch[1]\n }\n }\n\n return undefined\n}\n\n/**\n * Transform Is/IsNot infix operators to function calls\n *\n * Syntax:\n * a Is b -> Is(a, b)\n * a IsNot b -> IsNot(a, b)\n *\n * This enables structural equality with a clean syntax.\n */\nexport function transformIsOperators(source: string): string {\n // Match: (simpleExpr) IsNot (simpleExpr) - must check IsNot first (longer match)\n // simpleExpr = identifier chain with optional [], () OR literals\n const exprPat =\n '([\\\\w][\\\\w.\\\\[\\\\]()]*|null|undefined|true|false|\\\\d+(?:\\\\.\\\\d+)?|\\'[^\\']*\\'|\"[^\"]*\")'\n\n // Transform IsNot first (longer keyword)\n const isNotRegex = new RegExp(exprPat + '\\\\s+IsNot\\\\s+' + exprPat, 'g')\n source = source.replace(isNotRegex, 'IsNot($1, $2)')\n\n // Transform Is\n const isRegex = new RegExp(exprPat + '\\\\s+Is\\\\s+' + exprPat, 'g')\n source = source.replace(isRegex, 'Is($1, $2)')\n\n return source\n}\n\n/**\n * Insert semicolons to prevent ASI footguns (TjsStandard mode)\n *\n * JavaScript's ASI (Automatic Semicolon Insertion) has notorious footguns:\n *\n * foo // Intended: call foo, then IIFE\n * (() => {})() // Actual: foo(...)(...) - calls foo with IIFE as argument!\n *\n * TjsStandard prevents this by treating newlines as statement terminators\n * (like Go, Swift, Kotlin). When a line starts with a problematic character\n * that could continue the previous line, we insert a semicolon.\n *\n * Problematic line starts: ( [ / + - `\n *\n * We only insert when the previous line doesn't already end with:\n * - A semicolon\n * - An opening brace/bracket/paren (multi-line expression)\n * - A comma (array/object literal or params)\n * - An operator that clearly continues (+, -, *, /, =, etc.)\n * - A keyword that expects continuation (return, throw, etc. followed by value)\n */\nexport function insertAsiProtection(source: string): string {\n // Characters that can continue a previous expression (ASI footguns)\n // Only (, [, and ` \u2014 these are the real hazards where ASI causes bugs.\n // +, -, / at line start are continuations or literals, not footguns.\n const continuationStarts = /^[\\s]*[([`]/\n\n // Characters/patterns that indicate the previous line expects continuation\n // (don't insert semicolon after these)\n const expectsContinuation = /[{([,;:+\\-*/%=&|?<>!~^]\\s*$|^\\s*$/\n\n // Keywords that expect an expression to follow on same or next line\n const continueKeywords =\n /\\b(return|throw|yield|await|case|default|extends|new|typeof|void|delete|in|of|instanceof)\\s*$/\n\n const lines = source.split('\\n')\n const result: string[] = []\n let inBlockComment = false\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const prevLine = i > 0 ? lines[i - 1] : ''\n\n // Track block comment state\n if (inBlockComment) {\n result.push(line)\n if (line.includes('*/')) inBlockComment = false\n continue\n }\n\n // Check if this line opens a block comment\n const commentOpen = line.indexOf('/*')\n const commentClose = line.indexOf('*/')\n if (\n commentOpen !== -1 &&\n (commentClose === -1 || commentClose < commentOpen)\n ) {\n inBlockComment = true\n result.push(line)\n continue\n }\n\n // Check if this line starts with a problematic character\n if (i > 0 && continuationStarts.test(line)) {\n // Get the previous line without trailing comment\n const prevNoComment = prevLine\n .replace(/\\/\\/.*$/, '')\n .replace(/\\/\\*.*\\*\\/\\s*$/, '')\n\n // Don't insert if prev line clearly expects continuation\n if (\n !expectsContinuation.test(prevNoComment) &&\n !continueKeywords.test(prevNoComment)\n ) {\n // Insert semicolon at start of this line (preserving whitespace)\n const match = line.match(/^(\\s*)/)\n const indent = match ? match[1] : ''\n const rest = line.slice(indent.length)\n result.push(indent + ';' + rest)\n continue\n }\n }\n\n result.push(line)\n }\n\n return result.join('\\n')\n}\n\n/**\n * Replace `typeof X` with `TypeOf(X)` outside string/template/comment/regex bodies.\n * X may be `ident`, `ident.foo`, `ident?.foo`, etc. Anything that doesn't look\n * like a simple identifier expression (e.g. `typeof (x + 1)`) is left alone.\n */\nfunction transformTypeofKeyword(source: string): string {\n type Match = { keywordStart: number; operandEnd: number; operand: string }\n const matches: Match[] = []\n let i = 0\n let state: TokenizerState = 'normal'\n const templateStack: number[] = []\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n switch (state) {\n case 'single-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === \"'\") state = 'normal'\n i++\n continue\n case 'double-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '\"') state = 'normal'\n i++\n continue\n case 'template-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n i += 2\n templateStack.push(1)\n state = 'normal'\n continue\n }\n if (char === '`') state = 'normal'\n i++\n continue\n case 'line-comment':\n if (char === '\\n') state = 'normal'\n i++\n continue\n case 'block-comment':\n if (char === '*' && nextChar === '/') {\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n case 'regex':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '[') {\n i++\n while (i < source.length && source[i] !== ']') {\n if (source[i] === '\\\\' && i + 1 < source.length) i += 2\n else i++\n }\n if (i < source.length) i++\n continue\n }\n if (char === '/') {\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) i++\n state = 'normal'\n continue\n }\n i++\n continue\n case 'normal':\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n templateStack.pop()\n i++\n state = 'template-string'\n continue\n }\n }\n }\n if (char === \"'\") {\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n i += 2\n state = 'block-comment'\n continue\n }\n if (char === '/') {\n let j = i - 1\n while (j >= 0 && /\\s/.test(source[j])) j--\n const beforeChar = j >= 0 ? source[j] : ''\n const isRegexContext =\n !beforeChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]/.test(beforeChar) ||\n (j >= 5 &&\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)$/.test(\n source.slice(Math.max(0, j - 10), j + 1)\n ))\n if (isRegexContext) {\n i++\n state = 'regex'\n continue\n }\n }\n\n // Detect `typeof <ident-chain>` \u2014 only when preceded by a non-word\n // boundary and followed by whitespace then an identifier.\n if (\n char === 't' &&\n source.slice(i, i + 6) === 'typeof' &&\n (i === 0 || !/[\\w$]/.test(source[i - 1])) &&\n /\\s/.test(source[i + 6] ?? '')\n ) {\n let j = i + 6\n while (j < source.length && /\\s/.test(source[j])) j++\n if (j < source.length && /[a-zA-Z_$]/.test(source[j])) {\n const operandStart = j\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n // Optional `.name` or `?.name` chains\n while (j < source.length) {\n if (source[j] === '.' && /[a-zA-Z_$]/.test(source[j + 1] ?? '')) {\n j++\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n } else if (\n source[j] === '?' &&\n source[j + 1] === '.' &&\n /[a-zA-Z_$]/.test(source[j + 2] ?? '')\n ) {\n j += 2\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n } else {\n break\n }\n }\n matches.push({\n keywordStart: i,\n operandEnd: j,\n operand: source.slice(operandStart, j),\n })\n i = j\n continue\n }\n }\n break\n }\n i++\n }\n\n if (matches.length === 0) return source\n\n // Apply replacements from end to start so earlier positions remain valid.\n let result = source\n for (let k = matches.length - 1; k >= 0; k--) {\n const m = matches[k]\n result =\n result.slice(0, m.keywordStart) +\n `TypeOf(${m.operand})` +\n result.slice(m.operandEnd)\n }\n return result\n}\n\n/**\n * Transform == and != to Is() and IsNot() calls\n *\n * In TJS normal mode:\n * a == b -> Is(a, b) (structural equality)\n * a != b -> IsNot(a, b) (structural inequality)\n * a === b -> a === b (identity, unchanged)\n *\n * Uses a two-pass algorithm:\n * 1. Find all == and != positions (outside strings/comments/regex)\n * 2. Transform from end to start (so positions remain valid)\n */\nexport function transformEqualityToStructural(source: string): string {\n // Transform typeof to TypeOf() \u2014 fixes typeof null === 'object'.\n // Uses the same tokenizer state machine as the equality pass so it skips\n // string/template/comment/regex bodies (a regex replace would rewrite\n // 'typeof x' inside string literals).\n source = transformTypeofKeyword(source)\n\n // First pass: find all == and != positions (outside strings/comments/regex)\n const equalityOps: Array<{ pos: number; op: '==' | '!=' }> = []\n let i = 0\n let state: TokenizerState = 'normal'\n const templateStack: number[] = []\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n // Handle state transitions\n switch (state) {\n case 'single-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === \"'\") state = 'normal'\n i++\n continue\n\n case 'double-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '\"') state = 'normal'\n i++\n continue\n\n case 'template-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n i += 2\n templateStack.push(1)\n state = 'normal'\n continue\n }\n if (char === '`') state = 'normal'\n i++\n continue\n\n case 'line-comment':\n if (char === '\\n') state = 'normal'\n i++\n continue\n\n case 'block-comment':\n if (char === '*' && nextChar === '/') {\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'regex':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '[') {\n i++\n while (i < source.length && source[i] !== ']') {\n if (source[i] === '\\\\' && i + 1 < source.length) {\n i += 2\n } else {\n i++\n }\n }\n if (i < source.length) i++\n continue\n }\n if (char === '/') {\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) i++\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'normal':\n // Handle template stack\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n templateStack.pop()\n i++\n state = 'template-string'\n continue\n }\n }\n }\n\n // Check for string/comment/regex start\n if (char === \"'\") {\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n i += 2\n state = 'block-comment'\n continue\n }\n\n // Check for regex literal (simplified detection)\n if (char === '/') {\n let j = i - 1\n while (j >= 0 && /\\s/.test(source[j])) j--\n const beforeChar = j >= 0 ? source[j] : ''\n const isRegexContext =\n !beforeChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]/.test(beforeChar) ||\n (j >= 5 &&\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)$/.test(\n source.slice(Math.max(0, j - 10), j + 1)\n ))\n if (isRegexContext) {\n i++\n state = 'regex'\n continue\n }\n }\n\n // Look for == or != (but not === or !==)\n // For ==: check it's not part of !== (char before is !)\n // For !=: check it's not !== (third char is =)\n if (\n char === '=' &&\n nextChar === '=' &&\n source[i + 2] !== '=' &&\n source[i - 1] !== '!'\n ) {\n equalityOps.push({ pos: i, op: '==' })\n i += 2\n continue\n }\n if (char === '!' && nextChar === '=' && source[i + 2] !== '=') {\n equalityOps.push({ pos: i, op: '!=' })\n i += 2\n continue\n }\n break\n }\n\n i++\n }\n\n // If no equality operators found, return source unchanged\n if (equalityOps.length === 0) {\n return source\n }\n\n // Second pass: transform from end to start (so positions remain valid)\n let result = source\n for (let k = equalityOps.length - 1; k >= 0; k--) {\n const { pos, op } = equalityOps[k]\n const funcName = op === '==' ? 'Eq' : 'NotEq'\n\n // Find left operand boundary\n const leftBoundary = findLeftOperandBoundary(result, pos)\n // Find right operand boundary\n const rightBoundary = findRightOperandBoundary(result, pos + 2)\n\n const leftExpr = result.slice(leftBoundary, pos).trim()\n const rightExpr = result.slice(pos + 2, rightBoundary).trim()\n\n if (leftExpr && rightExpr) {\n // Build the replacement\n const before = result.slice(0, leftBoundary)\n const after = result.slice(rightBoundary)\n // Add space after keyword if needed (e.g., return, throw, typeof)\n const needsSpace = /[a-zA-Z0-9_$]$/.test(before)\n const spacer = needsSpace ? ' ' : ''\n result = `${before}${spacer}${funcName}(${leftExpr}, ${rightExpr})${after}`\n }\n }\n\n return result\n}\n\n/**\n * Find the start position of the left operand\n *\n * Scans backwards from the operator position to find where the left expression starts.\n * Respects operator precedence: == has lower precedence than arithmetic operators,\n * so `x % 2 == 0` has left operand `x % 2`.\n */\nfunction findLeftOperandBoundary(source: string, opPos: number): number {\n let i = opPos - 1\n\n // Skip whitespace before operator\n while (i >= 0 && /\\s/.test(source[i])) i--\n if (i < 0) return 0\n\n let depth = 0\n let inString = false\n let stringChar = ''\n\n while (i >= 0) {\n const char = source[i]\n const prevChar = i > 0 ? source[i - 1] : ''\n\n // Handle string literals (scan backwards through them)\n if (inString) {\n if (char === stringChar && prevChar !== '\\\\') {\n inString = false\n }\n i--\n continue\n }\n\n // Check for string end (we're scanning backwards, so end is opening quote)\n if ((char === '\"' || char === \"'\" || char === '`') && prevChar !== '\\\\') {\n inString = true\n stringChar = char\n i--\n continue\n }\n\n // Track depth of parens/brackets/braces (reversed since we're going backwards)\n if (char === ')' || char === ']' || char === '}') {\n depth++\n i--\n continue\n }\n if (char === '(' || char === '[') {\n if (depth > 0) {\n depth--\n i--\n continue\n }\n // Opening paren/bracket at depth 0 - this is a grouping/call paren\n // The expression starts AFTER it, not including it\n return i + 1\n }\n if (char === '{') {\n if (depth > 0) {\n depth--\n i--\n continue\n }\n // Opening brace at depth 0 \u2014 could be block statement boundary\n return i + 1\n }\n\n // Inside nested expression - keep scanning\n if (depth > 0) {\n i--\n continue\n }\n\n // At depth 0 - check for expression boundaries\n // Statement delimiters\n if (char === ';') {\n return i + 1\n }\n\n // Check for keywords that precede expressions (return, throw, etc.)\n // We need to look backwards for a word boundary and check if it's a keyword\n if (/[a-z]/.test(char)) {\n // Might be end of a keyword - scan backwards to get full word\n const wordEnd = i + 1\n let wordStart = i\n while (wordStart > 0 && /[a-z]/i.test(source[wordStart - 1])) {\n wordStart--\n }\n const word = source.slice(wordStart, wordEnd)\n // Check if preceded by word char (not a keyword then)\n const beforeWord = wordStart > 0 ? source[wordStart - 1] : ''\n if (!/[a-zA-Z0-9_$]/.test(beforeWord)) {\n // These keywords start an expression - stop after them\n if (\n [\n 'return',\n 'throw',\n 'case',\n 'typeof',\n 'void',\n 'delete',\n 'await',\n 'yield',\n ].includes(word)\n ) {\n return wordEnd\n }\n // 'new' is part of the operand (new Foo() == bar),\n // so include it by continuing the scan\n if (word === 'new') {\n return wordStart\n }\n }\n }\n\n // Arrow function - stop before =>\n if (char === '>' && prevChar === '=') {\n return i + 1\n }\n\n // Assignment operator (but not ==, !=, <=, >=)\n if (\n char === '=' &&\n prevChar !== '=' &&\n prevChar !== '!' &&\n prevChar !== '<' &&\n prevChar !== '>'\n ) {\n return i + 1\n }\n\n // Logical operators (lower precedence than ==)\n if (char === '&' && prevChar === '&') {\n return i + 1\n }\n if (char === '|' && prevChar === '|') {\n return i + 1\n }\n\n // Ternary operators\n if (char === '?' || char === ':') {\n return i + 1\n }\n\n // Comma\n if (char === ',') {\n return i + 1\n }\n\n i--\n }\n\n return 0\n}\n\n/**\n * Find the end position of the right operand\n *\n * Scans forward from after the operator to find where the right expression ends.\n */\nfunction findRightOperandBoundary(\n source: string,\n startAfterOp: number\n): number {\n let i = startAfterOp\n\n // Skip whitespace after operator\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i >= source.length) return source.length\n\n let depth = 0\n let inString = false\n let stringChar = ''\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = i + 1 < source.length ? source[i + 1] : ''\n\n // Handle string literals\n if (inString) {\n if (char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n }\n i++\n continue\n }\n\n if (\n (char === '\"' || char === \"'\" || char === '`') &&\n source[i - 1] !== '\\\\'\n ) {\n inString = true\n stringChar = char\n i++\n continue\n }\n\n // Track depth\n if (char === '(' || char === '[' || char === '{') {\n depth++\n i++\n continue\n }\n if (char === ')' || char === ']' || char === '}') {\n if (depth > 0) {\n depth--\n i++\n continue\n }\n // Closing paren at depth 0 - boundary\n return i\n }\n\n // Inside nested - keep scanning\n if (depth > 0) {\n i++\n continue\n }\n\n // At depth 0 - check for expression boundaries\n if (char === ';') {\n return i\n }\n\n // Logical operators - lower precedence than ==\n if (char === '&' && nextChar === '&') {\n return i\n }\n if (char === '|' && nextChar === '|') {\n return i\n }\n\n // Ternary\n if (char === '?') {\n return i\n }\n if (char === ':') {\n return i\n }\n\n // Comma\n if (char === ',') {\n return i\n }\n\n // Another == or != (chained equality - stop before it)\n if (\n (char === '=' || char === '!') &&\n nextChar === '=' &&\n source[i + 2] !== '='\n ) {\n return i\n }\n\n i++\n }\n\n return source.length\n}\n\n/**\n * Transform Type block declarations\n *\n * Syntax forms:\n * Type Foo 'example' -> const Foo = Type('Foo', 'example')\n * Type Foo { example: 'value' } -> const Foo = Type('Foo', 'value')\n * Type Foo 'description' { example: 'value' }\n * -> const Foo = Type('description', 'value')\n * Type Foo 'description' { example: 0, predicate(x) { return x > 0 } }\n * -> const Foo = Type('description', (x) => { ... }, 0)\n *\n * When predicate + example: auto-generate type guard from example\n */\nexport function transformTypeDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Type' keyword followed by identifier\n const typeMatch = source\n .slice(i)\n .match(/^\\bType\\s+([A-Z_][a-zA-Z0-9_]*)\\s*/)\n if (typeMatch) {\n const typeName = typeMatch[1]\n let j = i + typeMatch[0].length\n\n // Check for optional description string\n // Only treat as description if followed by = or {\n let description = typeName\n let descriptionWasExplicit = false\n const descStringMatch = source.slice(j).match(/^(['\"`])([^]*?)\\1\\s*/)\n if (descStringMatch) {\n const afterString = j + descStringMatch[0].length\n const nextChar = source[afterString]\n // Check if this looks like end of statement (not followed by = or {)\n // Note: the \\s* in the regex consumes trailing whitespace including newlines\n const isEndOfStatement =\n nextChar === undefined ||\n afterString >= source.length ||\n (nextChar !== '=' && nextChar !== '{')\n\n if (nextChar === '=' || nextChar === '{') {\n // It's a description followed by = or { block\n description = descStringMatch[2]\n descriptionWasExplicit = true\n j = afterString\n } else if (isEndOfStatement) {\n // Old simple form: Type Name 'value' - value is both example and default\n const value = descStringMatch[0].trim()\n // Preserve trailing whitespace (newlines) that was consumed by the regex\n const trailingWs = descStringMatch[0].slice(value.length)\n result += `const ${typeName} = Type('${typeName}', ${value})${trailingWs}`\n i = afterString\n continue\n }\n }\n\n // Check for = default value\n let defaultValue: string | undefined\n let posAfterDefault = j // Track position right after the default value\n const equalsMatch = source.slice(j).match(/^=\\s*/)\n if (equalsMatch) {\n j += equalsMatch[0].length\n // Parse the default value (handles +number, strings, objects, arrays, etc.)\n const valueMatch = source\n .slice(j)\n .match(\n /^(\\+?\\d+(?:\\.\\d+)?|['\"`][^'\"`]*['\"`]|\\{[^}]*\\}|\\[[^\\]]*\\]|true|false|null)/\n )\n if (valueMatch) {\n defaultValue = valueMatch[0]\n j += valueMatch[0].length\n posAfterDefault = j // Save position before consuming whitespace\n // Skip whitespace after default (only to check for block)\n const wsMatch = source.slice(j).match(/^\\s*/)\n if (wsMatch) j += wsMatch[0].length\n }\n }\n\n // Check for block { ... }\n if (source[j] === '{') {\n // Block form: Type Foo 'desc'? = default? { ... }\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n // Unbalanced - just copy and continue\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse block body for description (old syntax fallback), example, predicate\n const descInsideMatch = blockBody.match(\n /description\\s*:\\s*(['\"`])([^]*?)\\1/\n )\n if (descInsideMatch && !descriptionWasExplicit) {\n description = descInsideMatch[2]\n }\n\n // Extract example value using state machine for nested structures\n let example: string | undefined\n const exampleKeyword = blockBody.match(/example\\s*:\\s*/)\n if (exampleKeyword) {\n const valueStart = exampleKeyword.index! + exampleKeyword[0].length\n const extracted = extractJSValue(blockBody, valueStart)\n if (extracted) {\n example = extracted.value.trim()\n }\n }\n\n const predicateMatch = blockBody.match(\n /predicate\\s*\\(([^)]*)\\)\\s*\\{([^]*)\\}/\n )\n\n // Build Type() call with appropriate arguments\n // Type(description, predicateOrExample, example?, default?)\n if (predicateMatch && example) {\n // Predicate + example\n const params = predicateMatch[1].trim()\n const body = predicateMatch[2].trim()\n const defaultArg = defaultValue ? `, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', (${params}) => { if (!globalThis.__tjs?.validate(${params}, globalThis.__tjs?.infer(${example}))) return false; ${body} }, ${example}${defaultArg})`\n } else if (predicateMatch) {\n // Predicate only\n const params = predicateMatch[1].trim()\n const body = predicateMatch[2].trim()\n const defaultArg = defaultValue ? `, undefined, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', (${params}) => { ${body} }${defaultArg})`\n } else if (example) {\n // Example only (becomes validation schema)\n const defaultArg = defaultValue ? `, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', undefined, ${example}${defaultArg})`\n } else if (defaultValue) {\n // Default only (infer schema from default)\n result += `const ${typeName} = Type('${description}', ${defaultValue})`\n } else {\n // Empty block - error or description-only type\n result += `const ${typeName} = Type('${description}')`\n }\n\n i = blockEnd\n continue\n } else if (defaultValue) {\n // Simple form with default: Type Foo = 'value' or Type Foo 'desc' = 'value'\n result += `const ${typeName} = Type('${description}', ${defaultValue})`\n i = posAfterDefault // Use position before whitespace was consumed\n continue\n } else if (!descStringMatch) {\n // No description, no default, no block - look for old simple form: Type Foo 'value'\n const valueMatch = source\n .slice(j)\n .match(\n /^(['\"`][^]*?['\"`]|\\+?\\d+(?:\\.\\d+)?|true|false|null|\\{[^]*?\\}|\\[[^]*?\\])/\n )\n if (valueMatch) {\n const example = valueMatch[0]\n result += `const ${typeName} = Type('${typeName}', ${example})`\n i = j + valueMatch[0].length\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform FunctionPredicate declarations\n *\n * Block form:\n * FunctionPredicate Callback {\n * params: { x: 0, y: '' }\n * returns: false\n * }\n * \u2192 const Callback = FunctionPredicate('Callback', { params: { x: 0, y: '' }, returns: false })\n *\n * Generic block form:\n * FunctionPredicate Creator<T = {}> {\n * params: { contents: [null] }\n * returns: T\n * }\n * \u2192 const Creator = FunctionPredicate('Creator', [['T', {}]], (T) => ({ params: { contents: [null] }, returns: T }))\n *\n * Function form:\n * FunctionPredicate Handler(existingFn, 'description')\n * \u2192 const Handler = FunctionPredicate('description', existingFn)\n */\nexport function transformFunctionPredicateDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n const fpMatch = source\n .slice(i)\n .match(/^\\bFunctionPredicate\\s+([A-Z_][a-zA-Z0-9_]*)\\s*(?:<([^>]+)>)?\\s*/)\n if (fpMatch) {\n const fpName = fpMatch[1]\n const typeParamsStr = fpMatch[2] // undefined if no <...>\n const j = i + fpMatch[0].length\n\n // Check for block form: FunctionPredicate Name { ... } or FunctionPredicate Name<T> { ... }\n if (source[j] === '{') {\n // Find matching closing brace\n let depth = 1\n let k = j + 1\n while (k < source.length && depth > 0) {\n if (source[k] === '{') depth++\n else if (source[k] === '}') depth--\n k++\n }\n\n if (depth === 0) {\n const blockBody = source.slice(j + 1, k - 1).trim()\n\n // Extract params: { ... } (brace-balanced for nested objects like { el: {} })\n const paramsMatch = extractBalancedValue(blockBody, /params\\s*:\\s*\\{/)\n // Extract returns value\n const returnsMatch = blockBody.match(/returns\\s*:\\s*(.+?)(?:\\n|$)/)\n // Extract returnContract\n const contractMatch = blockBody.match(\n /returnContract\\s*:\\s*['\"](\\w+)['\"]/\n )\n // Extract description\n const descMatch = blockBody.match(/description\\s*:\\s*(['\"])([^]*?)\\1/)\n\n const spec: string[] = []\n if (paramsMatch) spec.push(`params: ${paramsMatch[1]}`)\n if (returnsMatch) spec.push(`returns: ${returnsMatch[1].trim()}`)\n if (contractMatch) {\n spec.push(`returnContract: '${contractMatch[1]}'`)\n }\n\n const desc = descMatch ? descMatch[2] : fpName\n\n if (typeParamsStr) {\n // Generic form \u2014 emit factory with type params\n const typeParams = typeParamsStr.split(',').map((p) => {\n const parts = p\n .trim()\n .split('=')\n .map((s) => s.trim())\n if (parts.length === 2) {\n const defaultVal =\n parts[1] === 'any' || parts[1] === 'undefined'\n ? 'null'\n : parts[1]\n return `['${parts[0]}', ${defaultVal}]`\n }\n return `'${parts[0]}'`\n })\n const paramNames = typeParamsStr\n .split(',')\n .map((p) => p.trim().split('=')[0].trim())\n result += `const ${fpName} = FunctionPredicate('${desc}', [${typeParams.join(\n ', '\n )}], (${paramNames.join(', ')}) => ({ ${spec.join(', ')} }))`\n } else {\n // Non-generic form\n result += `const ${fpName} = FunctionPredicate('${desc}', { ${spec.join(\n ', '\n )} })`\n }\n i = k\n continue\n }\n }\n\n // Check for function form: FunctionPredicate Name(fn, 'desc')\n if (source[j] === '(') {\n // Find matching closing paren\n let depth = 1\n let k = j + 1\n while (k < source.length && depth > 0) {\n if (source[k] === '(') depth++\n else if (source[k] === ')') depth--\n k++\n }\n\n if (depth === 0) {\n const args = source.slice(j + 1, k - 1).trim()\n // Split on comma: fn, 'description'\n const commaIdx = args.indexOf(',')\n if (commaIdx !== -1) {\n const fnRef = args.slice(0, commaIdx).trim()\n const desc = args.slice(commaIdx + 1).trim()\n result += `const ${fpName} = FunctionPredicate(${desc}, ${fnRef})`\n } else {\n // Just a function reference, name as description\n result += `const ${fpName} = FunctionPredicate('${fpName}', ${args})`\n }\n i = k\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform Generic block declarations\n *\n * Syntax:\n * Generic Pair<T, U> { description: '...', predicate(obj, T, U) { ... } }\n * Generic Container<T, U = ''> { ... } // U has default\n *\n * Transforms to:\n * const Pair = Generic(['T', 'U'], (obj, checkT, checkU) => { ... }, '...')\n * const Container = Generic(['T', ['U', '']], (obj, checkT, checkU) => { ... }, '...')\n */\nexport function transformGenericDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Generic' keyword followed by identifier and type params\n const genericMatch = source\n .slice(i)\n .match(/^\\bGeneric\\s+([A-Z][a-zA-Z0-9_]*)\\s*<([^>]+)>\\s*\\{/)\n if (genericMatch) {\n const genericName = genericMatch[1]\n const typeParamsStr = genericMatch[2]\n const blockStart = i + genericMatch[0].length - 1\n const bodyStart = blockStart + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n // Unbalanced - just copy and continue\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse type params: T, U = Default\n const typeParams = typeParamsStr.split(',').map((p) => {\n const parts = p\n .trim()\n .split('=')\n .map((s) => s.trim())\n if (parts.length === 2) {\n // 'any' and 'undefined' aren't valid JS values \u2014 use null\n const defaultVal =\n parts[1] === 'any' || parts[1] === 'undefined' ? 'null' : parts[1]\n return `['${parts[0]}', ${defaultVal}]`\n }\n return `'${parts[0]}'`\n })\n\n // Parse the block body\n // Strip declaration { ... } block before parsing (it's .d.ts metadata, not runtime)\n let parsedBody = blockBody\n const declIdx = parsedBody.search(/\\bdeclaration\\s*\\{/)\n if (declIdx !== -1) {\n // Find matching closing brace for the declaration block\n const declBraceStart = parsedBody.indexOf('{', declIdx)\n let dDepth = 1\n let dj = declBraceStart + 1\n while (dj < parsedBody.length && dDepth > 0) {\n if (parsedBody[dj] === '{') dDepth++\n else if (parsedBody[dj] === '}') dDepth--\n dj++\n }\n // Remove the declaration block\n parsedBody = parsedBody.slice(0, declIdx) + parsedBody.slice(dj)\n }\n\n const descMatch = parsedBody.match(/description\\s*:\\s*(['\"`])([^]*?)\\1/)\n const predicateMatch = parsedBody.match(\n /predicate\\s*\\(([^)]*)\\)\\s*\\{([^]*)\\}/\n )\n\n const description = descMatch ? descMatch[2] : genericName\n\n if (predicateMatch) {\n const params = predicateMatch[1]\n .trim()\n .split(',')\n .map((s) => s.trim())\n let body = predicateMatch[2].trim()\n\n // First param is the value, rest are type params\n const valueParam = params[0] || 'x'\n const typeParamNames = params.slice(1)\n const typeCheckParams = typeParamNames.map((p) => `check${p}`)\n\n // Replace type param names with check functions in body\n // e.g., T(x[0]) becomes checkT(x[0])\n typeParamNames.forEach((name, idx) => {\n body = body.replace(\n new RegExp(`\\\\b${name}\\\\s*\\\\(`, 'g'),\n `${typeCheckParams[idx]}(`\n )\n })\n\n result += `const ${genericName} = Generic([${typeParams.join(\n ', '\n )}], (${valueParam}, ${typeCheckParams.join(\n ', '\n )}) => { ${body} }, '${description}')`\n } else {\n // No predicate - create a generic that always passes\n result += `const ${genericName} = Generic([${typeParams.join(\n ', '\n )}], () => true, '${description}')`\n }\n\n i = blockEnd\n continue\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform Union declarations\n *\n * Syntax:\n * Union Direction 'cardinal direction' {\n * 'up' | 'down' | 'left' | 'right'\n * }\n *\n * Transforms to:\n * const Direction = Union('cardinal direction', ['up', 'down', 'left', 'right'])\n *\n * Also supports inline form:\n * Union Direction 'cardinal direction' 'up' | 'down' | 'left' | 'right'\n */\nexport function transformUnionDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Union' keyword followed by identifier and description\n const unionMatch = source\n .slice(i)\n .match(/^\\bUnion\\s+([A-Z][a-zA-Z0-9_]*)\\s+(['\"`])([^]*?)\\2\\s*/)\n if (unionMatch) {\n const unionName = unionMatch[1]\n const description = unionMatch[3]\n const j = i + unionMatch[0].length\n\n // Check what follows: block or inline values\n if (source[j] === '{') {\n // Block form: Union Foo 'desc' { ... }\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse values: 'a' | 'b' | 'c' or \"a\" | \"b\" or mixed\n const values = parseUnionValues(blockBody)\n result += `const ${unionName} = Union('${description}', [${values.join(\n ', '\n )}])`\n i = blockEnd\n continue\n } else {\n // Inline form: Union Foo 'desc' 'a' | 'b' | 'c'\n // Find the end of the line or statement\n let lineEnd = source.indexOf('\\n', j)\n if (lineEnd === -1) lineEnd = source.length\n const inlineValues = source.slice(j, lineEnd).trim()\n\n if (inlineValues) {\n const values = parseUnionValues(inlineValues)\n result += `const ${unionName} = Union('${description}', [${values.join(\n ', '\n )}])`\n i = lineEnd\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Parse union values from a string like: 'a' | 'b' | 123 | true\n * Returns array of value literals as strings\n */\nfunction parseUnionValues(input: string): string[] {\n const values: string[] = []\n // Split on | and trim, preserving quoted strings and literals\n const parts = input.split('|').map((p) => p.trim())\n\n for (const part of parts) {\n if (!part) continue\n // Keep the value as-is (already a valid JS literal)\n values.push(part)\n }\n\n return values\n}\n\n/**\n * Transform Enum declarations\n *\n * Syntax:\n * Enum Status 'task status' {\n * Pending\n * Active\n * Done\n * }\n *\n * Enum Color 'CSS color' {\n * Red = 'red'\n * Green = 'green'\n * Blue = 'blue'\n * }\n *\n * Transforms to:\n * const Status = Enum('task status', { Pending: 0, Active: 1, Done: 2 })\n * const Color = Enum('CSS color', { Red: 'red', Green: 'green', Blue: 'blue' })\n */\nexport function transformEnumDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Enum' keyword followed by identifier and description\n const enumMatch = source\n .slice(i)\n .match(/^\\bEnum\\s+([A-Z][a-zA-Z0-9_]*)\\s+(['\"`])([^]*?)\\2\\s*\\{/)\n if (enumMatch) {\n const enumName = enumMatch[1]\n const description = enumMatch[3]\n const blockStart = i + enumMatch[0].length - 1\n const bodyStart = blockStart + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse enum members\n const members = parseEnumMembers(blockBody)\n const membersStr = members\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ')\n\n result += `const ${enumName} = Enum('${description}', { ${membersStr} })`\n i = blockEnd\n continue\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Parse enum members from block body\n * Handles: Pending, Active = 5, Done, Name = 'value'\n * Returns array of [key, value] pairs\n */\nfunction parseEnumMembers(input: string): [string, string][] {\n const members: [string, string][] = []\n let currentNumericValue = 0\n\n // Split on newlines and commas, filter empty\n const lines = input\n .split(/[\\n,]/)\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith('//'))\n\n for (const line of lines) {\n // Match: Name or Name = value\n const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*(?:=\\s*(.+))?$/)\n if (match) {\n const key = match[1]\n const explicitValue = match[2]?.trim()\n\n if (explicitValue !== undefined) {\n members.push([key, explicitValue])\n // If it's a number, update the counter\n const numVal = Number(explicitValue)\n if (!isNaN(numVal)) {\n currentNumericValue = numVal + 1\n }\n } else {\n // Auto-increment numeric value\n members.push([key, String(currentNumericValue)])\n currentNumericValue++\n }\n }\n }\n\n return members\n}\n\n/**\n * Extension info for a single extend block\n */\n\nexport function transformExtendDeclarations(source: string): {\n source: string\n extensions: Map<string, Set<string>>\n} {\n const extensions = new Map<string, Set<string>>()\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'extend' keyword at statement boundary\n const remaining = source.slice(i)\n const extendMatch = remaining.match(/^(\\s*)extend\\s+([A-Z]\\w*)\\s*\\{/)\n\n if (!extendMatch) {\n // Check if we're at start of line or after semicolon/brace\n const lineStart =\n i === 0 ||\n source[i - 1] === '\\n' ||\n source[i - 1] === ';' ||\n source[i - 1] === '}'\n\n if (lineStart) {\n const afterWS = remaining.match(/^(\\s*)extend\\s+([A-Z]\\w*)\\s*\\{/)\n if (afterWS) {\n // Already handled above, fall through\n }\n }\n result += source[i]\n i++\n continue\n }\n\n const indent = extendMatch[1]\n const typeName = extendMatch[2]\n const blockStart = i + extendMatch[0].length - 1 // position of {\n\n // Find matching closing brace\n const blockEnd = findFunctionBodyEnd(source, blockStart)\n const blockBody = source.slice(blockStart + 1, blockEnd - 1).trim()\n\n // Parse methods from the block body\n // Match: methodName(params) { body } or async methodName(params) { body }\n const methods: { name: string; isAsync: boolean; fullText: string }[] = []\n let j = 0\n const bodySource = source.slice(blockStart + 1, blockEnd - 1)\n\n while (j < bodySource.length) {\n const methodRemaining = bodySource.slice(j)\n const methodMatch = methodRemaining.match(/^(\\s*)(async\\s+)?(\\w+)\\s*\\(/)\n\n if (!methodMatch) {\n j++\n continue\n }\n\n const methodIndent = methodMatch[1]\n const isAsync = !!methodMatch[2]\n const methodName = methodMatch[3]\n\n // Reject arrow functions \u2014 they don't bind `this`\n // We'll check after finding the body\n\n // Find the opening paren\n const parenStart = j + methodMatch[0].length - 1\n let parenDepth = 1\n let k = parenStart + 1\n while (k < bodySource.length && parenDepth > 0) {\n if (bodySource[k] === '(') parenDepth++\n if (bodySource[k] === ')') parenDepth--\n k++\n }\n const paramsStr = bodySource.slice(parenStart + 1, k - 1)\n\n // Skip whitespace to find { or =>\n let afterParams = k\n while (\n afterParams < bodySource.length &&\n /\\s/.test(bodySource[afterParams])\n ) {\n afterParams++\n }\n\n // Check for arrow function\n if (\n bodySource[afterParams] === '=' &&\n bodySource[afterParams + 1] === '>'\n ) {\n const loc = locAt(source, blockStart + 1 + j)\n throw new SyntaxError(\n `Arrow functions are not allowed in extend blocks (method '${methodName}' in extend ${typeName}). ` +\n `Use regular function syntax instead, as extension methods need 'this' binding.`,\n loc\n )\n }\n\n if (bodySource[afterParams] !== '{') {\n j++\n continue\n }\n\n // Find matching closing brace for the method body\n const methodBodyEnd = findFunctionBodyEnd(bodySource, afterParams)\n const fullMethodText = bodySource.slice(j, methodBodyEnd).trim()\n\n // Build: methodName: function(params) { body }\n // Transform TJS colon params (name: value) to JS defaults (name = value)\n const transformedParams = paramsStr\n .split(',')\n .map((p) => p.trim())\n .filter((p) => p.length > 0)\n .map((p) => {\n // name: value -> name = value (TJS colon shorthand)\n const colonMatch = p.match(/^(\\w+)\\s*:\\s*(.+)$/)\n if (colonMatch) return `${colonMatch[1]} = ${colonMatch[2]}`\n return p\n })\n .join(', ')\n const asyncPrefix = isAsync ? 'async ' : ''\n const methodBody = bodySource.slice(afterParams + 1, methodBodyEnd - 1)\n methods.push({\n name: methodName,\n isAsync,\n fullText: `${methodName}: ${asyncPrefix}function(${transformedParams}) {${methodBody}}`,\n })\n\n j = methodBodyEnd\n }\n\n // Track extensions\n const isFirstForType = !extensions.has(typeName)\n if (isFirstForType) {\n extensions.set(typeName, new Set())\n }\n const extSet = extensions.get(typeName)!\n for (const m of methods) {\n extSet.add(m.name)\n }\n\n // Generate the __ext object (or merge into existing)\n const methodEntries = methods.map((m) => ` ${m.fullText}`).join(',\\n')\n let replacement: string\n if (isFirstForType) {\n replacement = `${indent}const __ext_${typeName} = {\\n${methodEntries}\\n${indent}}\\n`\n } else {\n // Merge into existing: Object.assign(__ext_TypeName, { ... })\n replacement = `${indent}Object.assign(__ext_${typeName}, {\\n${methodEntries}\\n${indent}})\\n`\n }\n\n // Generate registration calls\n for (const m of methods) {\n replacement += `${indent}if (__tjs?.registerExtension) { __tjs.registerExtension('${typeName}', '${m.name}', __ext_${typeName}.${m.name}) }\\n`\n }\n\n result += replacement\n i = blockEnd\n }\n\n // Append any remaining source\n if (i <= source.length && result.length < source.length) {\n // Already handled character by character\n }\n\n return { source: result, extensions }\n}\n\n/**\n * Transform method calls on known-type receivers to use extension objects.\n *\n * For literals and typed variables where the type is known:\n * 'hello'.capitalize() -> __ext_String.capitalize.call('hello')\n * [1,2,3].last() -> __ext_Array.last.call([1,2,3])\n *\n * This is a best-effort source-level transform. For unknown types,\n * the runtime fallback (resolveExtension) handles it.\n */\nexport function transformExtensionCalls(\n source: string,\n extensions: Map<string, Set<string>>\n): string {\n if (extensions.size === 0) return source\n\n // Build a map of method names to possible type names for quick lookup\n const methodToTypes = new Map<string, string[]>()\n for (const [typeName, methods] of extensions) {\n for (const method of methods) {\n if (!methodToTypes.has(method)) {\n methodToTypes.set(method, [])\n }\n methodToTypes.get(method)!.push(typeName)\n }\n }\n\n let result = source\n\n // Rewrite calls on string literals: 'str'.method(...) or \"str\".method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('String')) continue\n\n // Match string literal followed by .method(\n // Single-quoted strings\n const singleQuotePattern = new RegExp(\n `('(?:[^'\\\\\\\\]|\\\\\\\\.)*')\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(singleQuotePattern, (_, str, meth, closeParen) => {\n return closeParen\n ? `__ext_String.${meth}.call(${str})`\n : `__ext_String.${meth}.call(${str}, `\n })\n\n // Double-quoted strings\n const doubleQuotePattern = new RegExp(\n `(\"(?:[^\"\\\\\\\\]|\\\\\\\\.)*\")\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(doubleQuotePattern, (_, str, meth, closeParen) => {\n return closeParen\n ? `__ext_String.${meth}.call(${str})`\n : `__ext_String.${meth}.call(${str}, `\n })\n\n // Template literals (backtick) \u2014 simple case only (no nested templates)\n const templatePattern = new RegExp(\n '(`(?:[^`\\\\\\\\]|\\\\\\\\.)*`)\\\\.' + method + '\\\\((\\\\))?',\n 'g'\n )\n result = result.replace(templatePattern, (_, str, closeParen) => {\n return closeParen\n ? `__ext_String.${method}.call(${str})`\n : `__ext_String.${method}.call(${str}, `\n })\n }\n\n // Rewrite calls on array literals: [1,2,3].method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('Array')) continue\n\n // Match array literal [...].method(\n // This is tricky \u2014 we need to find balanced brackets\n // Simple approach: find ].method( and walk backward to find matching [\n const methodDot = `].${method}(`\n let searchFrom = 0\n let idx: number\n while ((idx = result.indexOf(methodDot, searchFrom)) !== -1) {\n // Walk backward from idx to find matching [\n let bracketDepth = 1\n let k = idx - 1\n let inStr: string | false = false\n while (k >= 0 && bracketDepth > 0) {\n const ch = result[k]\n if (inStr) {\n if (ch === inStr && (k === 0 || result[k - 1] !== '\\\\')) {\n inStr = false\n }\n } else {\n if (ch === ']') bracketDepth++\n if (ch === '[') bracketDepth--\n if (ch === \"'\" || ch === '\"' || ch === '`') inStr = ch\n }\n k--\n }\n\n if (bracketDepth === 0) {\n const arrayLiteral = result.slice(k + 1, idx + 1)\n const before = result.slice(0, k + 1)\n const after = result.slice(idx + methodDot.length)\n // Check if no-args call: next char is )\n if (after[0] === ')') {\n result = `${before}__ext_Array.${method}.call(${arrayLiteral})${after.slice(\n 1\n )}`\n } else {\n result = `${before}__ext_Array.${method}.call(${arrayLiteral}, ${after}`\n }\n }\n\n searchFrom = idx + 1\n }\n }\n\n // Rewrite calls on number literals: (42).method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('Number')) continue\n\n const numPattern = new RegExp(\n `(\\\\d+(?:\\\\.\\\\d+)?)\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(numPattern, (_, num, meth, closeParen) => {\n return closeParen\n ? `__ext_Number.${meth}.call(${num})`\n : `__ext_Number.${meth}.call(${num}, `\n })\n }\n\n return result\n}\n\n/**\n * Compute {line, column} from a character offset in source.\n */\nexport function locAt(\n source: string,\n pos: number\n): { line: number; column: number } {\n let line = 1\n let column = 0\n for (let i = 0; i < pos && i < source.length; i++) {\n if (source[i] === '\\n') {\n line++\n column = 0\n } else {\n column++\n }\n }\n return { line, column }\n}\n\n/**\n * Info about a single function variant for polymorphic dispatch\n */\n\nfunction typeCheckForDefault(argExpr: string, defaultValue: string): string {\n const dv = defaultValue.trim()\n\n // String literal\n if (/^['\"`]/.test(dv)) return `typeof ${argExpr} === 'string'`\n\n // Boolean\n if (dv === 'true' || dv === 'false') return `typeof ${argExpr} === 'boolean'`\n\n // null\n if (dv === 'null') return `${argExpr} === null`\n\n // undefined\n if (dv === 'undefined') return `${argExpr} === undefined`\n\n // Array literal\n if (dv.startsWith('[')) return `Array.isArray(${argExpr})`\n\n // Object literal\n if (dv.startsWith('{'))\n return `(typeof ${argExpr} === 'object' && ${argExpr} !== null && !Array.isArray(${argExpr}))`\n\n // Non-negative integer: +N\n if (/^\\+\\d+/.test(dv))\n return `(typeof ${argExpr} === 'number' && Number.isInteger(${argExpr}) && ${argExpr} >= 0)`\n\n // Number with decimal \u2192 float\n if (/^-?\\d+\\.\\d+/.test(dv)) return `typeof ${argExpr} === 'number'`\n\n // Integer (whole number, possibly negative)\n if (/^-?\\d+$/.test(dv))\n return `(typeof ${argExpr} === 'number' && Number.isInteger(${argExpr}))`\n\n // Fallback: any\n return 'true'\n}\n\n/**\n * Get a type \"signature\" string from a default value for ambiguity checking.\n * Two params with the same signature at the same position are ambiguous.\n */\nfunction typeSignatureForDefault(defaultValue: string): string {\n const dv = defaultValue.trim()\n if (/^['\"`]/.test(dv)) return 'string'\n if (dv === 'true' || dv === 'false') return 'boolean'\n if (dv === 'null') return 'null'\n if (dv === 'undefined') return 'undefined'\n if (dv.startsWith('[')) return 'array'\n if (dv.startsWith('{')) return 'object'\n if (/^\\+\\d+/.test(dv)) return 'non-negative-integer'\n if (/^-?\\d+\\.\\d+/.test(dv)) return 'number'\n if (/^-?\\d+$/.test(dv)) return 'integer'\n return 'any'\n}\n\n/**\n * Parse a parameter string like \"a = 0, b = 'hello', c = { x: 0 }\"\n * into an array of { name, defaultValue, required } objects.\n * Handles nested braces/brackets/parens and template literals.\n */\nfunction parseParamList(\n paramStr: string,\n requiredParams: Set<string>\n): { name: string; defaultValue: string; required: boolean }[] {\n const params: { name: string; defaultValue: string; required: boolean }[] = []\n let depth = 0\n let current = ''\n let inString: string | false = false\n\n for (let i = 0; i < paramStr.length; i++) {\n const ch = paramStr[i]\n\n // Track string state\n if (!inString && (ch === \"'\" || ch === '\"' || ch === '`')) {\n inString = ch\n current += ch\n continue\n }\n if (inString) {\n current += ch\n if (ch === '\\\\') {\n i++\n if (i < paramStr.length) current += paramStr[i]\n continue\n }\n if (ch === inString) inString = false\n continue\n }\n\n // Track nesting\n if (ch === '(' || ch === '[' || ch === '{') {\n depth++\n current += ch\n continue\n }\n if (ch === ')' || ch === ']' || ch === '}') {\n depth--\n current += ch\n continue\n }\n\n // Split on comma at depth 0\n if (ch === ',' && depth === 0) {\n const param = parseOneParam(current.trim(), requiredParams)\n if (param) params.push(param)\n current = ''\n continue\n }\n\n current += ch\n }\n\n // Last param\n const trimmed = current.trim()\n if (trimmed) {\n const param = parseOneParam(trimmed, requiredParams)\n if (param) params.push(param)\n }\n\n return params\n}\n\n/**\n * Parse a single parameter like \"name = 'Alice'\" or \"/* unsafe * / x = 0\"\n */\nfunction parseOneParam(\n paramStr: string,\n requiredParams: Set<string>\n): { name: string; defaultValue: string; required: boolean } | null {\n // Strip leading /* unsafe */ comment\n const str = paramStr.replace(/^\\/\\*\\s*unsafe\\s*\\*\\/\\s*/, '')\n\n // Rest params not supported in polymorphic functions\n if (str.startsWith('...')) return null\n\n // Find = sign (the param has been transformed from : to = by transformParenExpressions)\n const eqIdx = str.indexOf('=')\n if (eqIdx === -1) {\n // No default value \u2014 untyped param\n return { name: str.trim(), defaultValue: '', required: true }\n }\n\n const name = str.slice(0, eqIdx).trim()\n const defaultValue = str.slice(eqIdx + 1).trim()\n return { name, defaultValue, required: requiredParams.has(name) }\n}\n\n/**\n * Find the end of a function body (matching closing brace).\n * Handles nested braces, strings, template literals, comments, and regex.\n * Returns the index AFTER the closing brace.\n */\nexport function findFunctionBodyEnd(\n source: string,\n openBracePos: number\n): number {\n let depth = 1\n let i = openBracePos + 1\n let inString: string | false = false\n let inLineComment = false\n let inBlockComment = false\n\n while (i < source.length && depth > 0) {\n const ch = source[i]\n const next = i + 1 < source.length ? source[i + 1] : ''\n\n // Line comment\n if (inLineComment) {\n if (ch === '\\n') inLineComment = false\n i++\n continue\n }\n\n // Block comment\n if (inBlockComment) {\n if (ch === '*' && next === '/') {\n inBlockComment = false\n i += 2\n continue\n }\n i++\n continue\n }\n\n // String tracking\n if (inString) {\n if (ch === '\\\\') {\n i += 2\n continue\n }\n if (ch === inString) inString = false\n i++\n continue\n }\n\n // Start comments\n if (ch === '/' && next === '/') {\n inLineComment = true\n i += 2\n continue\n }\n if (ch === '/' && next === '*') {\n inBlockComment = true\n i += 2\n continue\n }\n\n // Start strings\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n inString = ch\n i++\n continue\n }\n\n // Braces\n if (ch === '{') depth++\n if (ch === '}') depth--\n\n i++\n }\n\n return i\n}\n\n/**\n * Transform polymorphic functions: multiple function declarations with the\n * same name are merged into a single dispatcher function.\n *\n * Must be called AFTER transformParenExpressions (so params have = defaults)\n * but BEFORE wrapClassDeclarations.\n *\n * function greet(name = '') { ... }\n * function greet(first = '', last = '') { ... }\n *\n * becomes:\n *\n * function greet$1(name = '') { ... }\n * function greet$2(first = '', last = '') { ... }\n * function greet(...__args) {\n * if (__args.length === 1 && typeof __args[0] === 'string') return greet$1(__args[0])\n * if (__args.length === 2 && ...) return greet$2(__args[0], __args[1])\n * return __tjs.typeError('greet', 'no matching overload', __args)\n * }\n */\nexport function transformPolymorphicFunctions(\n source: string,\n requiredParams: Set<string>\n): { source: string; polymorphicNames: Set<string> } {\n const polymorphicNames = new Set<string>()\n\n // Phase 1: Find all function declarations and group by name\n // Match: optional \"export\" + optional \"async\" + \"function\" + name + \"(\"\n const funcPattern =\n /(?:^|(?<=[\\n;{}]))\\s*(export\\s+)?(async\\s+)?function\\s+(\\w+)\\s*\\(/gm\n const declarations = new Map<string, PolyVariant[]>()\n let match: RegExpExecArray | null\n\n // First pass: collect all function positions and names\n const allMatches: {\n name: string\n fullMatchStart: number\n funcKeywordStart: number\n exported: boolean\n isAsync: boolean\n }[] = []\n\n while ((match = funcPattern.exec(source)) !== null) {\n const exported = !!match[1]\n const isAsync = !!match[2]\n const name = match[3]\n const fullMatchStart = match.index\n // Find where \"function\" keyword starts (skip whitespace and export/async)\n let funcKeywordStart = fullMatchStart\n const prefix = match[0]\n const funcIdx = prefix.indexOf('function')\n if (funcIdx >= 0) funcKeywordStart = fullMatchStart + funcIdx\n\n allMatches.push({\n name,\n fullMatchStart,\n funcKeywordStart,\n exported,\n isAsync,\n })\n }\n\n // Group by name\n for (const m of allMatches) {\n if (!declarations.has(m.name)) {\n declarations.set(m.name, [])\n }\n }\n\n // Count occurrences \u2014 only process names that appear more than once\n const nameCounts = new Map<string, number>()\n for (const m of allMatches) {\n nameCounts.set(m.name, (nameCounts.get(m.name) || 0) + 1)\n }\n\n const polyNames = new Set<string>()\n for (const [name, count] of nameCounts) {\n if (count > 1) polyNames.add(name)\n }\n\n if (polyNames.size === 0) {\n return { source, polymorphicNames }\n }\n\n // Phase 2: For each polymorphic function, extract full details\n for (const m of allMatches) {\n if (!polyNames.has(m.name)) continue\n\n // Find the opening paren\n const afterFunc = source.indexOf('(', m.funcKeywordStart)\n if (afterFunc === -1) continue\n\n // Find matching closing paren\n let parenDepth = 1\n let j = afterFunc + 1\n while (j < source.length && parenDepth > 0) {\n if (source[j] === '(') parenDepth++\n if (source[j] === ')') parenDepth--\n j++\n }\n const closeParen = j - 1\n const paramStr = source.slice(afterFunc + 1, closeParen)\n\n // Find the opening brace of the function body\n let bodyStart = j\n while (bodyStart < source.length && source[bodyStart] !== '{') bodyStart++\n if (bodyStart >= source.length) continue\n\n // Find matching closing brace\n const bodyEnd = findFunctionBodyEnd(source, bodyStart)\n\n // Determine the real start (including leading whitespace, export, async)\n let realStart = m.fullMatchStart\n // Include leading whitespace on the same line\n while (realStart > 0 && source[realStart - 1] === ' ') realStart--\n\n const variants = declarations.get(m.name)!\n const params = parseParamList(paramStr, requiredParams)\n\n // Check for rest params\n const hasRestParam = paramStr.includes('...')\n if (hasRestParam) {\n const loc = locAt(source, m.funcKeywordStart)\n throw new SyntaxError(\n `Rest parameters are not supported in polymorphic function '${m.name}'. ` +\n `Use separate function names instead.`,\n loc\n )\n }\n\n variants.push({\n index: variants.length + 1,\n start: realStart,\n end: bodyEnd,\n text: source.slice(realStart, bodyEnd),\n exported: m.exported,\n isAsync: m.isAsync,\n params,\n })\n }\n\n // Phase 3: Validate \u2014 check for ambiguous variants\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n\n // Check async consistency\n const asyncCount = variants.filter((v) => v.isAsync).length\n if (asyncCount > 0 && asyncCount < variants.length) {\n const loc = locAt(source, variants[0].start)\n throw new SyntaxError(\n `Polymorphic function '${name}': all variants must be either sync or async, not mixed.`,\n loc\n )\n }\n\n // Check for ambiguous signatures (same types at same positions, differing only in required/optional)\n for (let i = 0; i < variants.length; i++) {\n for (let j = i + 1; j < variants.length; j++) {\n const a = variants[i]\n const b = variants[j]\n\n // Different max arity is fine\n if (a.params.length !== b.params.length) continue\n\n // Same arity \u2014 check if types are identical at every position\n let allSame = true\n for (let k = 0; k < a.params.length; k++) {\n const sigA = a.params[k].defaultValue\n ? typeSignatureForDefault(a.params[k].defaultValue)\n : 'any'\n const sigB = b.params[k].defaultValue\n ? typeSignatureForDefault(b.params[k].defaultValue)\n : 'any'\n if (sigA !== sigB) {\n allSame = false\n break\n }\n }\n\n if (allSame) {\n const loc = locAt(source, b.start)\n throw new SyntaxError(\n `Polymorphic function '${name}': variants ${i + 1} and ${\n j + 1\n } have ambiguous signatures ` +\n `(same parameter types at every position). Overloads must differ by arity or parameter types.`,\n loc\n )\n }\n }\n }\n }\n\n // Phase 4: Build the transformed source\n // Sort all variants by position (reverse order for safe replacement)\n const allVariants: { name: string; variant: PolyVariant }[] = []\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n for (const v of variants) {\n allVariants.push({ name, variant: v })\n }\n }\n allVariants.sort((a, b) => b.variant.start - a.variant.start)\n\n // Replace each variant in reverse order (preserves positions)\n let result = source\n for (const { name, variant } of allVariants) {\n const asyncPrefix = variant.isAsync ? 'async ' : ''\n // Rename: function greet(...) -> function greet$1(...)\n // Strip \"export\" from variants \u2014 only the dispatcher is exported\n // Use $$ in replacement to produce literal $ (avoid backreference interpretation)\n const renamed = variant.text.replace(\n new RegExp(\n `(?:export\\\\s+)?${\n asyncPrefix ? asyncPrefix.replace(/\\s+$/, '\\\\s+') : ''\n }function\\\\s+${name}\\\\s*\\\\(`\n ),\n `${asyncPrefix}function ${name}$$${variant.index}(`\n )\n result =\n result.slice(0, variant.start) + renamed + result.slice(variant.end)\n }\n\n // Phase 5: Append dispatcher functions\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n polymorphicNames.add(name)\n\n const isAsync = variants[0].isAsync\n const isExported = variants.some((v) => v.exported)\n const asyncPrefix = isAsync ? 'async ' : ''\n const exportPrefix = isExported ? 'export ' : ''\n\n // Sort variants by specificity for dispatch order:\n // 1. More params first (higher arity)\n // 2. More specific types first (integer before number, object before any)\n const sorted = [...variants].sort((a, b) => {\n // Different arity: more params = more specific (checked first within same arity group)\n if (a.params.length !== b.params.length) return 0 // arity groups handled in dispatch\n\n // Same arity: count specificity\n let specA = 0\n let specB = 0\n for (const p of a.params) {\n const sig = p.defaultValue\n ? typeSignatureForDefault(p.defaultValue)\n : 'any'\n if (sig === 'non-negative-integer') specA += 3\n else if (sig === 'integer') specA += 2\n else if (sig !== 'any') specA += 1\n }\n for (const p of b.params) {\n const sig = p.defaultValue\n ? typeSignatureForDefault(p.defaultValue)\n : 'any'\n if (sig === 'non-negative-integer') specB += 3\n else if (sig === 'integer') specB += 2\n else if (sig !== 'any') specB += 1\n }\n return specB - specA // More specific first\n })\n\n // Generate dispatch branches\n const branches: string[] = []\n for (const v of sorted) {\n const checks: string[] = [`__args.length === ${v.params.length}`]\n const args: string[] = []\n\n for (let k = 0; k < v.params.length; k++) {\n const p = v.params[k]\n args.push(`__args[${k}]`)\n if (p.defaultValue) {\n const check = typeCheckForDefault(`__args[${k}]`, p.defaultValue)\n if (check !== 'true') checks.push(check)\n }\n }\n\n branches.push(\n ` if (${checks.join(' && ')}) return ${name}$${v.index}(${args.join(\n ', '\n )})`\n )\n }\n\n const dispatcher = `\n${exportPrefix}${asyncPrefix}function ${name}(...__args) {\n${branches.join('\\n')}\n return __tjs.typeError('${name}', 'no matching overload', __args)\n}\n`\n result += dispatcher\n }\n\n return { source: result, polymorphicNames }\n}\n\n/**\n * Transform bare assignments to const declarations\n *\n * Foo = ... -> const Foo = ...\n *\n * Only transforms assignments at statement level (start of line or after semicolon/brace)\n * where the identifier starts with uppercase (to avoid breaking normal assignments)\n */\nexport function transformBareAssignments(source: string): string {\n // Match: start of line/statement, uppercase identifier, =, not ==\n // Negative lookbehind for const/let/var to avoid double-declaring\n return source.replace(\n /(?<=^|[;\\n{])\\s*([A-Z][a-zA-Z0-9_]*)\\s*=(?!=)/gm,\n (match, name) => {\n // Check if already has const/let/var before it\n return match.replace(name, `const ${name}`)\n }\n )\n}\n\n/**\n * Parse source code into an Acorn AST\n */\n\nexport function extractAndRunTests(\n source: string,\n skipTests = false\n): {\n source: string\n tests: TestBlock[]\n errors: string[]\n} {\n const tests: TestBlock[] = []\n const errors: string[] = []\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'test' keyword followed by optional string then {\n const testMatch = source.slice(i).match(/^\\btest\\s+/)\n if (testMatch) {\n const start = i\n let j = i + testMatch[0].length\n\n // Check for optional description string\n let description: string | undefined\n const descMatch = source.slice(j).match(/^(['\"`])([^]*?)\\1\\s*/)\n if (descMatch) {\n description = descMatch[2]\n j += descMatch[0].length\n }\n\n // Must have opening brace\n if (source[j] === '{') {\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace (skip strings and comments)\n let inStr: string | null = null\n let escaped = false\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (escaped) {\n escaped = false\n k++\n continue\n }\n if (char === '\\\\' && inStr) {\n escaped = true\n k++\n continue\n }\n if (inStr) {\n if (char === inStr) inStr = null\n k++\n continue\n }\n // Line comment \u2014 skip to end of line\n if (char === '/' && source[k + 1] === '/') {\n const nl = source.indexOf('\\n', k)\n k = nl === -1 ? source.length : nl + 1\n continue\n }\n // Block comment \u2014 skip to */\n if (char === '/' && source[k + 1] === '*') {\n const end = source.indexOf('*/', k + 2)\n k = end === -1 ? source.length : end + 2\n continue\n }\n if (char === \"'\" || char === '\"' || char === '`') {\n inStr = char\n k++\n continue\n }\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth === 0) {\n const body = source.slice(bodyStart, k - 1).trim()\n const end = k\n\n const line = (source.slice(0, start).match(/\\n/g) || []).length + 1\n tests.push({ description, body, start, end, line })\n\n // Run the test unless skipped\n if (!skipTests) {\n try {\n // Execute test in isolated context\n // The test has access to the Types defined before it\n const testFn = new Function(body)\n testFn()\n } catch (err: any) {\n const desc = description || `test at line ${line}`\n errors.push(\n `Test failed: ${desc} (line ${line})\\n ${err.message || err}`\n )\n }\n }\n\n // Strip the test block from output (replace with whitespace to preserve line numbers)\n const removed = source.slice(start, end)\n const newlines = (removed.match(/\\n/g) || []).length\n result += '\\n'.repeat(newlines)\n i = end\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return { source: result, tests, errors }\n}\n\n/**\n * Wrap class declarations to make them callable without `new`\n *\n * Transforms:\n * class Foo { ... }\n * To:\n * let Foo = class Foo { ... };\n * Foo = new Proxy(Foo, { apply(t, _, a) { return Reflect.construct(t, a) } });\n *\n * This emits standalone JS with no runtime dependencies.\n */\n\n/**\n * Transform polymorphic constructors into static factory functions.\n *\n * When a class has multiple constructor() declarations, the first becomes\n * the real constructor and the rest become factory functions. The wrapClass\n * Proxy routes through a polymorphic dispatcher.\n *\n * class Point {\n * constructor(x: 0.0, y: 0.0) { this.x = x; this.y = y }\n * constructor(coords: { x: 0.0, y: 0.0 }) { this.x = coords.x; this.y = coords.y }\n * }\n *\n * becomes:\n *\n * class Point {\n * constructor(x = 0.0, y = 0.0) { this.x = x; this.y = y }\n * }\n * function Point$ctor$2(coords = { x: 0.0, y: 0.0 }) { return new Point(coords.x, coords.y) }\n * // wrapClass Proxy dispatches through polymorphic factory\n */\nexport function transformPolymorphicConstructors(\n source: string,\n requiredParams: Set<string>\n): { source: string; polyCtorClasses: Set<string> } {\n const polyCtorClasses = new Set<string>()\n\n // Find classes with multiple constructors\n const classRegex = /\\bclass\\s+(\\w+)(\\s+extends\\s+\\w+)?\\s*\\{/g\n let classMatch\n\n // Collect all class info first\n const classInfos: {\n className: string\n extendsClause: string\n bodyStart: number\n bodyEnd: number\n body: string\n }[] = []\n\n while ((classMatch = classRegex.exec(source)) !== null) {\n const className = classMatch[1]\n const extendsClause = classMatch[2]?.trim() || ''\n const bodyStart = classMatch.index + classMatch[0].length - 1\n\n const bodyEnd = findFunctionBodyEnd(source, bodyStart)\n const body = source.slice(bodyStart, bodyEnd)\n\n classInfos.push({ className, extendsClause, bodyStart, bodyEnd, body })\n }\n\n // Process in reverse order to preserve positions\n let result = source\n for (let ci = classInfos.length - 1; ci >= 0; ci--) {\n const { className, extendsClause, bodyStart, bodyEnd, body } =\n classInfos[ci]\n\n // Find all constructor declarations in the class body\n const ctorPattern = /\\bconstructor\\s*\\(/g\n let ctorMatch\n const ctorPositions: number[] = []\n\n while ((ctorMatch = ctorPattern.exec(body)) !== null) {\n ctorPositions.push(ctorMatch.index)\n }\n\n if (ctorPositions.length < 2) continue // Not polymorphic\n\n polyCtorClasses.add(className)\n\n // Parse each constructor\n interface CtorInfo {\n index: number\n paramStr: string\n bodyText: string\n fullStart: number // relative to class body\n fullEnd: number // relative to class body\n }\n const ctors: CtorInfo[] = []\n\n for (let i = 0; i < ctorPositions.length; i++) {\n const pos = ctorPositions[i]\n\n // Find opening paren\n const parenStart = body.indexOf('(', pos)\n let parenDepth = 1\n let j = parenStart + 1\n while (j < body.length && parenDepth > 0) {\n if (body[j] === '(') parenDepth++\n if (body[j] === ')') parenDepth--\n j++\n }\n const paramStr = body.slice(parenStart + 1, j - 1)\n\n // Find opening brace\n let braceStart = j\n while (braceStart < body.length && body[braceStart] !== '{') braceStart++\n\n // Find matching closing brace\n const ctorBodyEnd = findFunctionBodyEnd(body, braceStart)\n const bodyText = body.slice(braceStart + 1, ctorBodyEnd - 1)\n\n ctors.push({\n index: i + 1,\n paramStr,\n bodyText,\n fullStart: pos,\n fullEnd: ctorBodyEnd,\n })\n }\n\n // Keep the first constructor in the class, remove the rest\n // Build new class body with only the first constructor\n let newBody = body.slice(0, ctors[0].fullEnd)\n // Skip subsequent constructors\n const afterLastCtor = ctors[ctors.length - 1].fullEnd\n newBody += body.slice(afterLastCtor)\n\n // But we need to remove just the extra constructors, keeping other methods\n // Better approach: remove constructors 2..N from the body\n let cleanBody = body\n for (let i = ctors.length - 1; i >= 1; i--) {\n const ctor = ctors[i]\n // Find start of this constructor (including leading whitespace)\n let start = ctor.fullStart\n while (start > 0 && cleanBody[start - 1] === ' ') start--\n if (start > 0 && cleanBody[start - 1] === '\\n') start--\n\n cleanBody = cleanBody.slice(0, start) + cleanBody.slice(ctor.fullEnd)\n }\n\n // Generate factory functions for constructors 2..N\n let factories = ''\n for (let i = 1; i < ctors.length; i++) {\n const ctor = ctors[i]\n // Parse params for type checking in dispatcher\n const params = parseParamList(ctor.paramStr, requiredParams)\n const hasRest = ctor.paramStr.includes('...')\n if (hasRest) {\n const loc = locAt(source, bodyStart + ctor.fullStart)\n throw new SyntaxError(\n `Rest parameters are not supported in polymorphic constructors for '${className}'.`,\n loc\n )\n }\n\n // The factory function creates the object manually\n // For base classes: use Object.create + call constructor body\n // Simpler: just use new ClassName() with the first ctor's params mapped\n // Actually simplest: the factory body IS the constructor body but with\n // `this.x = ...` replaced by building an object... No, that doesn't work\n // for inheritance.\n //\n // Best approach: factory creates via new, then applies the extra ctor body\n factories += `\\nfunction ${className}$ctor$${ctor.index}(${ctor.paramStr}) {`\n factories += `\\n const __obj = Object.create(${className}.prototype)`\n if (extendsClause) {\n // For derived classes, we can't easily call super() outside constructor\n // Just call the constructor body and hope it sets fields\n // Actually \u2014 the factory can just do: new ClassName(defaultArgs) then overwrite\n // Let's use a simpler approach: the factory just does new + field assignment\n }\n factories += `\\n ;(function() {${ctor.bodyText}}).call(__obj)`\n factories += `\\n return __obj`\n factories += `\\n}\\n`\n }\n\n // Generate the polymorphic dispatcher for the Proxy's apply trap\n // First constructor variant uses Reflect.construct, rest use factories\n const dispatchBranches: string[] = []\n\n for (let i = 0; i < ctors.length; i++) {\n const ctor = ctors[i]\n const params = parseParamList(ctor.paramStr, requiredParams)\n const checks: string[] = [`a.length === ${params.length}`]\n\n for (let k = 0; k < params.length; k++) {\n const p = params[k]\n if (p.defaultValue) {\n const check = typeCheckForDefault(`a[${k}]`, p.defaultValue)\n if (check !== 'true') checks.push(check)\n }\n }\n\n if (i === 0) {\n // First constructor \u2014 use Reflect.construct\n dispatchBranches.push(\n ` if (${checks.join(' && ')}) return Reflect.construct(t, a)`\n )\n } else {\n // Factory function\n const args = params.map((_, k) => `a[${k}]`).join(', ')\n dispatchBranches.push(\n ` if (${checks.join(' && ')}) return ${className}$ctor$${\n ctor.index\n }(${args})`\n )\n }\n }\n\n // Generate the dispatcher function\n factories += `\\nfunction ${className}$dispatch(t, a) {\\n`\n factories += dispatchBranches.join('\\n') + '\\n'\n factories += ` return __tjs.typeError('${className}', 'no matching constructor', a)\\n`\n factories += `}\\n`\n\n // Replace the class body and append factories\n result = result.slice(0, bodyStart) + cleanBody + result.slice(bodyEnd)\n\n // Insert factories after the class\n const insertPos = bodyStart + cleanBody.length\n result = result.slice(0, insertPos) + factories + result.slice(insertPos)\n }\n\n return { source: result, polyCtorClasses }\n}\n\nexport function wrapClassDeclarations(\n source: string,\n polyCtorClasses: Set<string> = new Set()\n): string {\n // Match class declarations: class Name { or class Name extends Base {\n // Capture the class name and find the full class body\n const classRegex = /\\bclass\\s+(\\w+)(\\s+extends\\s+\\w+)?\\s*\\{/g\n let result = ''\n let lastIndex = 0\n let match\n\n while ((match = classRegex.exec(source)) !== null) {\n const className = match[1]\n const extendsClause = match[2] || ''\n const classStart = match.index\n const bodyStart = classStart + match[0].length - 1 // position of {\n\n // Find matching closing brace\n let depth = 1\n let i = bodyStart + 1\n while (i < source.length && depth > 0) {\n const char = source[i]\n if (char === '{') depth++\n else if (char === '}') depth--\n i++\n }\n\n if (depth === 0) {\n const classEnd = i\n const classBody = source.slice(bodyStart, classEnd)\n\n // Emit standalone JS - no runtime dependency\n result += source.slice(lastIndex, classStart)\n result += `let ${className} = class ${className}${extendsClause} ${classBody}; `\n\n if (polyCtorClasses.has(className)) {\n // Polymorphic constructor: use dispatcher function for apply trap\n result += `${className} = new Proxy(${className}, { apply(t, _, a) { return ${className}$dispatch(t, a) }, construct(t, a) { return ${className}$dispatch(t, a) } });`\n } else {\n result += `${className} = new Proxy(${className}, { apply(t, _, a) { return Reflect.construct(t, a) } });`\n }\n lastIndex = classEnd\n }\n }\n\n result += source.slice(lastIndex)\n return result\n}\n\n/**\n * Validate that Date is not used (TjsDate mode)\n * Throws an error if Date constructor or static methods are found\n */\nexport function validateNoDate(source: string): string {\n // Match Date usage: new Date, Date.now, Date.parse, Date.UTC\n const datePatterns = [\n {\n pattern: /\\bnew\\s+Date\\b/,\n message:\n 'new Date() is not allowed in TjsDate mode. Use Timestamp.now() or Timestamp.from()',\n },\n {\n pattern: /\\bDate\\.now\\b/,\n message: 'Date.now() is not allowed in TjsDate mode. Use Timestamp.now()',\n },\n {\n pattern: /\\bDate\\.parse\\b/,\n message:\n 'Date.parse() is not allowed in TjsDate mode. Use Timestamp.parse()',\n },\n {\n pattern: /\\bDate\\.UTC\\b/,\n message:\n 'Date.UTC() is not allowed in TjsDate mode. Use Timestamp.from()',\n },\n ]\n\n for (const { pattern, message } of datePatterns) {\n if (pattern.test(source)) {\n throw new Error(message)\n }\n }\n\n return source\n}\n\n/**\n * Validate that eval and Function constructor are not used (TjsNoeval mode)\n * Note: Eval and SafeFunction from TJS runtime are allowed\n */\n/**\n * Transform const! declarations to const and validate immutability\n *\n * const! declares compile-time immutable bindings. The object itself\n * is not frozen at runtime (performance trap), but the transpiler\n * rejects any code that attempts to mutate the binding's properties.\n *\n * const! config = { debug: false, port: 8080 }\n * config.debug = true // ERROR: Cannot mutate immutable binding 'config'\n * console.log(config.port) // OK: reads are fine\n *\n * Emits as plain `const` \u2014 semantics are enforced at transpile time.\n * When runtimes support records/tuples, const! can emit those instead.\n */\nexport function transformConstBang(source: string): string {\n // Find all const! declarations and collect binding names\n const immutableNames = new Set<string>()\n\n // Match: const! name = ... or const! { a, b } = ... or const! [a, b] = ...\n const constBangRe = /\\bconst!\\s+(\\w+)\\b/g\n let m\n while ((m = constBangRe.exec(source)) !== null) {\n immutableNames.add(m[1])\n }\n\n if (immutableNames.size === 0) return source\n\n // Replace const! with const\n source = source.replace(/\\bconst!\\s+/g, 'const ')\n\n // Strip comments before checking mutations (avoid false positives\n // from code examples in TDoc comments)\n const stripped = source\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // block comments\n .replace(/\\/\\/[^\\n]*/g, '') // line comments\n\n // Check for mutations to immutable bindings\n for (const name of immutableNames) {\n // Property assignment: name.prop = ..., name[key] = ...\n const assignRe = new RegExp(\n `\\\\b${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])\\\\s*(?:=(?!=)|\\\\+\\\\+|--|\\\\+=|-=|\\\\*=|\\\\/=|%=|&&=|\\\\|\\\\|=|\\\\?\\\\?=|<<=|>>=|>>>=|\\\\^=|&=|\\\\|=)`,\n 'g'\n )\n if (assignRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // Prefix increment/decrement: ++name.prop, --name.prop\n const prefixRe = new RegExp(\n `(?:\\\\+\\\\+|--)\\\\s*${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])`,\n 'g'\n )\n if (prefixRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // delete name.prop\n const deleteRe = new RegExp(\n `\\\\bdelete\\\\s+${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])`,\n 'g'\n )\n if (deleteRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // push/pop/splice/shift/unshift/sort/reverse/fill on the binding\n const mutatingMethods =\n 'push|pop|splice|shift|unshift|sort|reverse|fill|copyWithin|set'\n const methodRe = new RegExp(\n `\\\\b${name}\\\\s*\\\\.\\\\s*(?:${mutatingMethods})\\\\s*\\\\(`,\n 'g'\n )\n if (methodRe.test(stripped)) {\n throw new Error(\n `Cannot call mutating method on immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n }\n\n return source\n}\n\nexport function validateNoVar(source: string): string {\n // Match var declarations at statement level (not inside strings/comments)\n // Catches: var x, var x = ..., var {x} = ..., var [x] = ...\n const varPattern = /(?<![a-zA-Z_$])\\bvar\\s+/\n if (varPattern.test(source)) {\n throw new Error(\n 'var is not allowed in TjsNoVar mode. Use const or let instead.'\n )\n }\n return source\n}\n\nexport function validateNoEval(source: string): string {\n // Match eval() calls - but not Eval() (capital E)\n // Use negative lookbehind to avoid matching inside words\n const evalPattern = /(?<![A-Za-z_$])\\beval\\s*\\(/\n if (evalPattern.test(source)) {\n throw new Error(\n 'eval() is not allowed in TjsNoeval mode. Use Eval() from TJS runtime for safe evaluation.'\n )\n }\n\n // Match new Function() - but not SafeFunction or other *Function names\n const functionPattern = /\\bnew\\s+Function\\s*\\(/\n if (functionPattern.test(source)) {\n throw new Error(\n 'new Function() is not allowed in TjsNoeval mode. Use SafeFunction() from TJS runtime.'\n )\n }\n\n return source\n}\n\n/**\n * Transform bang access (!.) to __tjs.bang() calls.\n *\n * x!.foo \u2192 __tjs.bang(x,'foo')\n * x.y!.foo \u2192 __tjs.bang(x.y,'foo')\n * fn()!.foo \u2192 __tjs.bang(fn(),'foo')\n * arr[0]!.foo \u2192 __tjs.bang(arr[0],'foo')\n * x!.foo!.bar \u2192 __tjs.bang(__tjs.bang(x,'foo'),'bar')\n *\n * If the source is null/undefined, returns MonadicError.\n * If the source is a MonadicError, propagates it.\n * Otherwise, performs a bare property access (throws as usual).\n */\nexport function transformBangAccess(source: string): string {\n // Quick bail \u2014 no !. in source at all\n if (!source.includes('!.')) return source\n\n let result = ''\n let i = 0\n\n // State tracking for strings/comments\n type State =\n | 'normal'\n | 'string-single'\n | 'string-double'\n | 'string-template'\n | 'line-comment'\n | 'block-comment'\n let state: State = 'normal'\n let templateDepth = 0\n\n while (i < source.length) {\n const ch = source[i]\n const next = source[i + 1]\n\n // State transitions\n if (state === 'normal') {\n if (ch === '/' && next === '/') {\n state = 'line-comment'\n result += ch\n i++\n continue\n }\n if (ch === '/' && next === '*') {\n state = 'block-comment'\n result += ch\n i++\n continue\n }\n if (ch === \"'\") {\n state = 'string-single'\n result += ch\n i++\n continue\n }\n if (ch === '\"') {\n state = 'string-double'\n result += ch\n i++\n continue\n }\n if (ch === '`') {\n state = 'string-template'\n templateDepth++\n result += ch\n i++\n continue\n }\n\n // Detect bang access: ! followed by . followed by a word char (not digit)\n if (\n ch === '!' &&\n next === '.' &&\n i + 2 < source.length &&\n /[a-zA-Z_$]/.test(source[i + 2])\n ) {\n // Scan backward in `result` to find the expression start\n const exprEnd = result.length\n const exprStart = findExprStartBackward(result)\n\n if (exprStart < exprEnd) {\n const expr = result.slice(exprStart)\n result = result.slice(0, exprStart)\n\n // Scan forward to capture the property name after !.\n let j = i + 2\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n const prop = source.slice(i + 2, j)\n\n result += `__tjs.bang(${expr},'${prop}')`\n i = j\n continue\n }\n }\n\n result += ch\n i++\n } else if (state === 'line-comment') {\n result += ch\n if (ch === '\\n') state = 'normal'\n i++\n } else if (state === 'block-comment') {\n result += ch\n if (ch === '*' && next === '/') {\n result += next\n state = 'normal'\n i += 2\n } else {\n i++\n }\n } else if (state === 'string-single') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === \"'\") {\n state = 'normal'\n i++\n } else {\n i++\n }\n } else if (state === 'string-double') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === '\"') {\n state = 'normal'\n i++\n } else {\n i++\n }\n } else if (state === 'string-template') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === '`') {\n templateDepth--\n state = templateDepth > 0 ? 'string-template' : 'normal'\n i++\n } else if (ch === '$' && next === '{') {\n result += next\n i += 2\n state = 'normal'\n } else {\n i++\n }\n } else {\n result += ch\n i++\n }\n }\n\n return result\n}\n\n/**\n * Scan backward through `text` to find the start of the expression\n * that ends at the last character of `text`.\n *\n * Handles: identifiers, member chains (. and ?.), function calls (),\n * computed access [], and nested combinations.\n */\nfunction findExprStartBackward(text: string): number {\n let pos = text.length - 1\n\n // Skip trailing whitespace\n while (pos >= 0 && /\\s/.test(text[pos])) pos--\n if (pos < 0) return text.length\n\n // Walk backward consuming expression parts\n while (pos >= 0) {\n const ch = text[pos]\n\n if (/[\\w$]/.test(ch)) {\n // Identifier \u2014 consume word chars\n while (pos >= 0 && /[\\w$]/.test(text[pos])) pos--\n // Check if preceded by . or ?. (member chain continues)\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') {\n pos -= 2\n } else {\n pos--\n }\n continue\n }\n return pos + 1\n } else if (ch === ')') {\n pos = findMatchingOpen(text, pos, '(', ')')\n if (pos < 0) return 0\n pos--\n if (pos >= 0 && /[\\w$]/.test(text[pos])) continue\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') pos -= 2\n else pos--\n continue\n }\n return pos + 1\n } else if (ch === ']') {\n pos = findMatchingOpen(text, pos, '[', ']')\n if (pos < 0) return 0\n pos--\n if (pos >= 0 && /[\\w$]/.test(text[pos])) continue\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') pos -= 2\n else pos--\n continue\n }\n return pos + 1\n } else {\n return pos + 1\n }\n }\n\n return 0\n}\n\n/** Find the matching opening bracket/paren scanning backward from `pos`. */\nfunction findMatchingOpen(\n text: string,\n pos: number,\n open: string,\n close: string\n): number {\n let depth = 1\n pos--\n while (pos >= 0 && depth > 0) {\n if (text[pos] === close) depth++\n else if (text[pos] === open) depth--\n if (depth > 0) pos--\n }\n return pos\n}\n", "/**\n * Type inference from value patterns\n *\n * Extracts types from example values:\n * 'string' -> { kind: 'string' }\n * 10 -> { kind: 'number' }\n * ['string'] -> { kind: 'array', items: { kind: 'string' } }\n * { name: 'string' } -> { kind: 'object', shape: { name: { kind: 'string' } } }\n * 'string' | null -> { kind: 'string', nullable: true }\n * 'string' | 0 -> { kind: 'union', members: [{ kind: 'string' }, { kind: 'number' }] }\n */\n\nimport { parseExpressionAt } from 'acorn'\nimport type { Expression, Pattern } from 'acorn'\nimport type { TypeDescriptor, ParameterDescriptor } from './types'\nimport { getLocation, TranspileError } from './types'\n\n/**\n * Infer type from a value expression (example value)\n */\nexport function inferTypeFromValue(node: Expression): TypeDescriptor {\n switch (node.type) {\n case 'Literal': {\n const value = (node as any).value\n if (value === null) {\n return { kind: 'null' }\n }\n if (typeof value === 'string') {\n return { kind: 'string' }\n }\n if (typeof value === 'number') {\n // Distinguish float vs integer by checking if source contains '.'\n // 2.0 -> number (float), 42 -> integer\n const raw = (node as any).raw as string | undefined\n if (raw && raw.includes('.')) {\n return { kind: 'number' }\n }\n return { kind: 'integer' }\n }\n if (typeof value === 'boolean') {\n return { kind: 'boolean' }\n }\n return { kind: 'any' }\n }\n\n case 'ArrayExpression': {\n const elements = (node as any).elements as Expression[]\n if (elements.length === 0) {\n return { kind: 'array', items: { kind: 'any' } }\n }\n // Infer type from all elements \u2014 if homogeneous, use that type;\n // if heterogeneous, produce a union of distinct kinds\n const itemTypes = elements\n .filter((el) => el != null)\n .map((el) => inferTypeFromValue(el))\n if (itemTypes.length === 0) {\n return { kind: 'array', items: { kind: 'any' } }\n }\n // Deduplicate by structure\n const seen = new Map<string, TypeDescriptor>()\n for (const t of itemTypes) {\n const key = JSON.stringify(t)\n if (!seen.has(key)) seen.set(key, t)\n }\n const unique = [...seen.values()]\n const items =\n unique.length === 1\n ? unique[0]\n : { kind: 'union' as const, members: unique }\n return { kind: 'array', items }\n }\n\n case 'ObjectExpression': {\n const properties = (node as any).properties as any[]\n const shape: Record<string, TypeDescriptor> = {}\n\n for (const prop of properties) {\n if (prop.type === 'Property' && prop.key.type === 'Identifier') {\n const key = prop.key.name\n shape[key] = inferTypeFromValue(prop.value)\n }\n }\n\n return { kind: 'object', shape }\n }\n\n case 'LogicalExpression': {\n const { operator, left, right } = node as any\n\n if (operator === '||') {\n // || is JavaScript logical OR \u2014 infer type from left operand\n return inferTypeFromValue(left)\n }\n\n if (operator === '&&') {\n // null && type means required type (null is just a marker)\n const rightType = inferTypeFromValue(right)\n return rightType\n }\n\n if (operator === '??') {\n // Nullish coalescing: left ?? right - type is the right side (fallback)\n const rightType = inferTypeFromValue(right)\n return rightType\n }\n\n return { kind: 'any' }\n }\n\n case 'BinaryExpression': {\n const { operator, left, right } = node as any\n // | means union type (e.g., 0 | null, '' | undefined)\n if (operator === '|') {\n const leftType = inferTypeFromValue(left)\n const rightType = inferTypeFromValue(right)\n\n if (rightType.kind === 'null') {\n return { ...leftType, nullable: true }\n }\n if (leftType.kind === 'null') {\n return { ...rightType, nullable: true }\n }\n return {\n kind: 'union',\n members: [leftType, rightType],\n }\n }\n return { kind: 'any' }\n }\n\n case 'Identifier': {\n // Handle undefined as a type\n if ((node as any).name === 'undefined') {\n return { kind: 'undefined' }\n }\n // Other identifiers in type position aren't valid example types\n return { kind: 'any' }\n }\n\n case 'UnaryExpression': {\n const op = (node as any).operator\n const arg = (node as any).argument\n\n // +N means non-negative integer (e.g., +1, +3)\n if (op === '+' && arg.type === 'Literal') {\n const value = arg.value\n if (typeof value === 'number') {\n return { kind: 'non-negative-integer' }\n }\n }\n\n // -N means integer or float depending on source\n if (op === '-' && arg.type === 'Literal') {\n const value = arg.value\n if (typeof value === 'number') {\n const raw = arg.raw as string | undefined\n if (raw && raw.includes('.')) {\n return { kind: 'number' }\n }\n return { kind: 'integer' }\n }\n }\n return { kind: 'any' }\n }\n\n default:\n return { kind: 'any' }\n }\n}\n\n/**\n * Parse a parameter and extract its type and default value\n *\n * @param param - The AST node for the parameter\n * @param requiredParams - Optional set of parameter names that are required (from colon syntax)\n */\nexport function parseParameter(\n param: Pattern,\n requiredParams?: Set<string>\n): ParameterDescriptor {\n // Simple identifier: function foo(x) - required, any type\n if (param.type === 'Identifier') {\n return {\n name: (param as any).name,\n type: { kind: 'any' },\n required: true,\n }\n }\n\n // Assignment pattern: function foo(x = value)\n if (param.type === 'AssignmentPattern') {\n const { left, right } = param as any\n\n if (left.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple parameter names are supported',\n getLocation(param)\n )\n }\n\n const name = left.name\n\n // Check if this parameter was marked as required via colon syntax\n const isRequired = requiredParams?.has(name) ?? false\n\n // Infer type from the example value\n const type = inferTypeFromValue(right)\n const exampleValue = extractLiteralValue(right)\n\n return {\n name,\n type,\n required: isRequired,\n default: isRequired ? null : exampleValue,\n example: exampleValue,\n loc: { start: param.start, end: param.end },\n }\n }\n\n // Destructuring pattern: function foo({ a, b })\n if (param.type === 'ObjectPattern') {\n // For destructuring, we create a synthetic \"args\" parameter\n // The individual properties become fields with their own defaults\n const properties = (param as any).properties as any[]\n const shape: Record<string, TypeDescriptor> = {}\n // Store full parameter descriptors for destructured properties\n const destructuredParams: Record<string, ParameterDescriptor> = {}\n\n for (const prop of properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? prop.key.name\n : String(prop.key.value)\n\n if (prop.value.type === 'Identifier') {\n // { name } - required, any type\n shape[key] = { kind: 'any' }\n destructuredParams[key] = {\n name: key,\n type: { kind: 'any' },\n required: true,\n }\n } else if (prop.value.type === 'AssignmentPattern') {\n // { name = default } - check requiredParams to see if this was originally colon syntax\n const innerParam = parseParameter(prop.value, requiredParams)\n const isRequired = requiredParams?.has(key) ?? false\n shape[key] = innerParam.type\n destructuredParams[key] = {\n name: key,\n type: innerParam.type,\n required: isRequired,\n default: isRequired ? null : innerParam.example,\n example: innerParam.example,\n }\n }\n }\n }\n\n return {\n name: '__destructured__',\n type: { kind: 'object', shape, destructuredParams },\n required: true,\n }\n }\n\n throw new TranspileError(\n `Unsupported parameter pattern: ${param.type}`,\n getLocation(param)\n )\n}\n\n/**\n * Extract a literal value from an expression for default values\n */\nexport function extractLiteralValue(node: Expression): any {\n switch (node.type) {\n case 'Literal':\n return (node as any).value\n\n case 'ArrayExpression':\n return (node as any).elements.map((el: Expression) =>\n el ? extractLiteralValue(el) : null\n )\n\n case 'ObjectExpression': {\n const result: Record<string, any> = {}\n for (const prop of (node as any).properties) {\n if (prop.type === 'Property' && prop.key.type === 'Identifier') {\n result[prop.key.name] = extractLiteralValue(prop.value)\n }\n }\n return result\n }\n\n case 'UnaryExpression':\n if ((node as any).operator === '-') {\n const arg = extractLiteralValue((node as any).argument)\n return typeof arg === 'number' ? -arg : undefined\n }\n if ((node as any).operator === '+') {\n const arg = extractLiteralValue((node as any).argument)\n return typeof arg === 'number' ? +arg : undefined\n }\n return undefined\n\n case 'BinaryExpression': {\n const { operator, left } = node as any\n // | is union type \u2014 extract the left (primary) example value\n if (operator === '|') {\n return extractLiteralValue(left)\n }\n return undefined\n }\n\n case 'LogicalExpression': {\n const { operator, left, right } = node as any\n if (operator === '&&') {\n // null && type evaluates to null (falsy short-circuit)\n if (left.type === 'Literal' && left.value === null) {\n return null\n }\n }\n if (operator === '||') {\n // value || fallback - return left if truthy\n const leftVal = extractLiteralValue(left)\n return leftVal ?? extractLiteralValue(right)\n }\n if (operator === '??') {\n // value ?? fallback - return left if not null/undefined\n const leftVal = extractLiteralValue(left)\n return leftVal ?? extractLiteralValue(right)\n }\n return undefined\n }\n\n default:\n return undefined\n }\n}\n\n/**\n * Parse return type from a type annotation expression\n */\nexport function parseReturnType(typeExpr: string): TypeDescriptor {\n // Simple approach: parse as expression and infer type\n try {\n const ast = parseExpressionAt(typeExpr, 0, {\n ecmaVersion: 2022,\n })\n return inferTypeFromValue(ast)\n } catch {\n return { kind: 'any' }\n }\n}\n\n/**\n * Convert TypeDescriptor to a human-readable string\n */\nexport function typeToString(type: TypeDescriptor): string {\n switch (type.kind) {\n case 'string':\n return type.nullable ? 'string | null' : 'string'\n case 'number':\n return type.nullable ? 'number | null' : 'number'\n case 'integer':\n return type.nullable ? 'integer | null' : 'integer'\n case 'non-negative-integer':\n return type.nullable\n ? 'non-negative integer | null'\n : 'non-negative integer'\n case 'boolean':\n return type.nullable ? 'boolean | null' : 'boolean'\n case 'null':\n return 'null'\n case 'any':\n return 'any'\n case 'array': {\n const items = type.items ? typeToString(type.items) : 'any'\n return type.nullable ? `${items}[] | null` : `${items}[]`\n }\n case 'object': {\n if (!type.shape || Object.keys(type.shape).length === 0) {\n return type.nullable ? 'object | null' : 'object'\n }\n const props = Object.entries(type.shape)\n .map(([k, v]) => `${k}: ${typeToString(v)}`)\n .join(', ')\n return type.nullable ? `{ ${props} } | null` : `{ ${props} }`\n }\n case 'union':\n return type.members?.map(typeToString).join(' | ') || 'any'\n default:\n return 'any'\n }\n}\n\n/**\n * Check if a value matches a type descriptor\n */\nexport function checkType(value: any, type: TypeDescriptor): boolean {\n // Handle null\n if (value === null || value === undefined) {\n return type.nullable || type.kind === 'null' || type.kind === 'any'\n }\n\n switch (type.kind) {\n case 'any':\n return true\n case 'null':\n return value === null\n case 'string':\n return typeof value === 'string'\n case 'number':\n return typeof value === 'number'\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value)\n case 'non-negative-integer':\n return typeof value === 'number' && Number.isInteger(value) && value >= 0\n case 'boolean':\n return typeof value === 'boolean'\n case 'array':\n if (!Array.isArray(value)) return false\n if (!type.items) return true\n return value.every((item) => checkType(item, type.items!))\n case 'object':\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false\n }\n if (!type.shape) return true\n // Check that all required shape properties exist and match\n for (const [key, propType] of Object.entries(type.shape)) {\n if (!checkType(value[key], propType)) {\n return false\n }\n }\n return true\n case 'union':\n if (!type.members) return true\n return type.members.some((member) => checkType(value, member))\n default:\n return true\n }\n}\n", "/**\n * ESTree to Agent99 AST Transformer\n *\n * Converts parsed JavaScript into Agent99's JSON AST format.\n */\n\nimport type {\n Statement,\n Expression,\n FunctionDeclaration,\n BlockStatement,\n VariableDeclaration,\n ExpressionStatement,\n IfStatement,\n WhileStatement,\n ForOfStatement,\n TryStatement,\n ReturnStatement,\n CallExpression,\n AssignmentExpression,\n BinaryExpression,\n LogicalExpression,\n MemberExpression,\n Identifier,\n Literal,\n TemplateLiteral,\n ArrayExpression,\n ObjectExpression,\n} from 'acorn'\nimport type { BaseNode } from '../../builder'\nimport type { ExprNode } from '../../runtime'\nimport type {\n TransformContext,\n TranspileOptions,\n FunctionSignature,\n ParameterDescriptor,\n TypeDescriptor,\n TranspileWarning,\n} from '../types'\nimport { TranspileError, getLocation, createChildContext } from '../types'\nimport {\n parseParameter,\n inferTypeFromValue,\n parseReturnType,\n} from '../inference'\nimport { extractTDoc } from '../parser'\n\n/**\n * Convert TypeDescriptor to JSON Schema\n */\nfunction typeToJsonSchema(type: TypeDescriptor): any {\n switch (type.kind) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return { type: 'number' }\n case 'boolean':\n return { type: 'boolean' }\n case 'null':\n // null as a default value means \"any type, defaults to null\"\n // In JSON Schema, empty object means any type is allowed\n return {}\n case 'undefined':\n return {} // JSON Schema doesn't have undefined, treat as any\n case 'any':\n return {} // No constraints\n case 'array':\n return {\n type: 'array',\n items: type.items ? typeToJsonSchema(type.items) : {},\n }\n case 'object':\n if (type.shape) {\n const properties: Record<string, any> = {}\n for (const [key, propType] of Object.entries(type.shape)) {\n properties[key] = typeToJsonSchema(propType)\n }\n return {\n type: 'object',\n properties,\n additionalProperties: false,\n }\n }\n return { type: 'object' }\n case 'union':\n if (type.members) {\n return { oneOf: type.members.map(typeToJsonSchema) }\n }\n return {}\n default:\n return {}\n }\n}\n\n/**\n * Convert function parameters to JSON Schema for input validation\n */\nfunction parametersToJsonSchema(\n parameters: Record<string, ParameterDescriptor>\n): any {\n const properties: Record<string, any> = {}\n const required: string[] = []\n\n for (const [name, param] of Object.entries(parameters)) {\n properties[name] = typeToJsonSchema(param.type)\n if (param.required) {\n required.push(name)\n }\n }\n\n return {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n additionalProperties: false,\n }\n}\n\n/**\n * Transform a function declaration into Agent99 AST\n */\nexport function transformFunction(\n func: FunctionDeclaration,\n source: string,\n returnTypeAnnotation: string | undefined,\n options: TranspileOptions = {},\n requiredParamsFromPreprocess?: Set<string>\n): {\n ast: BaseNode\n signature: FunctionSignature\n warnings: TranspileWarning[]\n} {\n // Extract TDoc (/*# ... */) comments\n const tdoc = extractTDoc(source, func)\n\n // Parse parameters\n const parameters = new Map<string, ParameterDescriptor>()\n\n for (const param of func.params) {\n const parsed = parseParameter(param, requiredParamsFromPreprocess)\n\n // Handle destructured parameters - expand into individual params\n if (\n parsed.name === '__destructured__' &&\n parsed.type.kind === 'object' &&\n parsed.type.destructuredParams\n ) {\n for (const [key, paramDesc] of Object.entries(\n parsed.type.destructuredParams\n )) {\n parameters.set(key, {\n ...(paramDesc as any),\n description: tdoc.params[key],\n })\n }\n } else {\n parsed.description = tdoc.params[parsed.name]\n parameters.set(parsed.name, parsed)\n }\n }\n\n // Parse return type\n let returnType: TypeDescriptor | undefined\n if (returnTypeAnnotation) {\n returnType = parseReturnType(returnTypeAnnotation)\n }\n\n // Create transform context\n const ctx: TransformContext = {\n depth: 0,\n locals: new Map(),\n parameters,\n atoms: new Set(Object.keys(options.atoms || {})),\n warnings: [],\n source,\n filename: options.filename || '<source>',\n options,\n }\n\n // Transform function body\n const bodySteps = transformBlock(func.body, ctx)\n\n // Handle parameters: varsImport for required, varSet with defaults for optional\n const steps: BaseNode[] = []\n const requiredParams: string[] = []\n const optionalParams: Array<{ name: string; defaultValue: any }> = []\n\n for (const [name, param] of parameters.entries()) {\n if (param.required) {\n requiredParams.push(name)\n } else if (param.default !== undefined) {\n optionalParams.push({ name, defaultValue: param.default })\n } else {\n // Optional without explicit default - still import from args\n requiredParams.push(name)\n }\n }\n\n // Import required params directly from args\n if (requiredParams.length > 0) {\n steps.push({\n op: 'varsImport',\n keys: requiredParams,\n })\n }\n\n // For optional params with defaults: import from args, then check and set default if null\n for (const { name, defaultValue } of optionalParams) {\n // Import from args (will be undefined if not provided)\n steps.push({\n op: 'varsImport',\n keys: [name],\n })\n // If null/undefined, set the default\n steps.push({\n op: 'if',\n condition: {\n $expr: 'binary',\n op: '==',\n left: { $expr: 'ident', name },\n right: { $expr: 'literal', value: null },\n },\n then: [\n {\n op: 'varSet',\n key: name,\n value: defaultValue,\n },\n ],\n })\n }\n\n steps.push(...bodySteps)\n\n // Build signature\n const signatureParams = Object.fromEntries(parameters)\n const signature: FunctionSignature = {\n name: func.id?.name || 'anonymous',\n description: tdoc.description,\n parameters: signatureParams,\n returns: returnType,\n }\n\n // Generate input schema for runtime validation\n const inputSchema = parametersToJsonSchema(signatureParams)\n\n return {\n ast: { op: 'seq', steps, inputSchema },\n signature,\n warnings: ctx.warnings,\n }\n}\n\n/**\n * Transform a block statement into a list of steps\n */\nexport function transformBlock(\n block: BlockStatement,\n ctx: TransformContext\n): BaseNode[] {\n const steps: BaseNode[] = []\n\n for (const stmt of block.body) {\n const transformed = transformStatement(stmt, ctx)\n if (transformed) {\n if (Array.isArray(transformed)) {\n steps.push(...transformed)\n } else {\n steps.push(transformed)\n }\n }\n }\n\n return steps\n}\n\n/**\n * Transform a statement\n */\nexport function transformStatement(\n stmt: Statement,\n ctx: TransformContext\n): BaseNode | BaseNode[] | null {\n switch (stmt.type) {\n case 'VariableDeclaration':\n return transformVariableDeclaration(stmt as VariableDeclaration, ctx)\n\n case 'ExpressionStatement':\n return transformExpressionStatement(stmt as ExpressionStatement, ctx)\n\n case 'IfStatement':\n return transformIfStatement(stmt as IfStatement, ctx)\n\n case 'WhileStatement':\n return transformWhileStatement(stmt as WhileStatement, ctx)\n\n case 'ForOfStatement':\n return transformForOfStatement(stmt as ForOfStatement, ctx)\n\n case 'TryStatement':\n return transformTryStatement(stmt as TryStatement, ctx)\n\n case 'ReturnStatement':\n return transformReturnStatement(stmt as ReturnStatement, ctx)\n\n case 'ThrowStatement':\n throw new TranspileError(\n `'throw' is not supported in AsyncJS. Use Error('message') to trigger error flow`,\n getLocation(stmt),\n ctx.source,\n ctx.filename\n )\n\n case 'BlockStatement':\n // Nested block creates a scope\n return {\n op: 'scope',\n steps: transformBlock(stmt as BlockStatement, createChildContext(ctx)),\n }\n\n case 'EmptyStatement':\n return null\n\n default:\n throw new TranspileError(\n `Unsupported statement type: ${stmt.type}`,\n getLocation(stmt),\n ctx.source,\n ctx.filename\n )\n }\n}\n\n/**\n * Transform variable declaration: let x = value or const x = value\n */\nfunction transformVariableDeclaration(\n decl: VariableDeclaration,\n ctx: TransformContext\n): BaseNode[] {\n const steps: BaseNode[] = []\n const isConst = decl.kind === 'const'\n const opName = isConst ? 'constSet' : 'varSet'\n\n for (const declarator of decl.declarations) {\n if (declarator.id.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable names are supported',\n getLocation(declarator),\n ctx.source,\n ctx.filename\n )\n }\n\n const name = (declarator.id as Identifier).name\n\n if (declarator.init) {\n // Transform the initializer\n const { step, resultVar } = transformExpressionToStep(\n declarator.init,\n ctx,\n name,\n isConst\n )\n\n if (step) {\n steps.push(step)\n } else if (resultVar !== name) {\n // Simple value assignment\n steps.push({\n op: opName,\n key: name,\n value: resultVar,\n })\n }\n\n // Track variable type\n const type = inferTypeFromValue(declarator.init as Expression)\n ctx.locals.set(name, type)\n } else {\n // Uninitialized variable (only valid for let, not const)\n if (isConst) {\n throw new TranspileError(\n 'const declarations must be initialized',\n getLocation(declarator),\n ctx.source,\n ctx.filename\n )\n }\n steps.push({\n op: 'varSet',\n key: name,\n value: null,\n })\n ctx.locals.set(name, { kind: 'any', nullable: true })\n }\n }\n\n return steps\n}\n\n/**\n * Transform expression statement (e.g., function call)\n */\nfunction transformExpressionStatement(\n stmt: ExpressionStatement,\n ctx: TransformContext\n): BaseNode | null {\n const expr = stmt.expression\n\n // Assignment expression: x = value\n if (expr.type === 'AssignmentExpression') {\n return transformAssignment(expr as AssignmentExpression, ctx)\n }\n\n // Function call (side effect)\n if (expr.type === 'CallExpression') {\n const { step, resultVar } = transformExpressionToStep(expr, ctx)\n if (step) {\n return step\n }\n // If no step but we got an expression (e.g., method call on builtin),\n // we still need to evaluate it for side effects (like s.add(x))\n if (resultVar) {\n return {\n op: 'varSet',\n key: '_',\n value: resultVar,\n }\n }\n return null\n }\n\n // Other expressions (e.g., just a value) - no-op\n ctx.warnings.push({\n message: 'Expression statement has no effect',\n line: getLocation(stmt).line,\n column: getLocation(stmt).column,\n })\n\n return null\n}\n\n/**\n * Transform assignment: x = value\n */\nfunction transformAssignment(\n expr: AssignmentExpression,\n ctx: TransformContext\n): BaseNode {\n if (expr.left.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable assignment is supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n const name = (expr.left as Identifier).name\n const { step, resultVar } = transformExpressionToStep(expr.right, ctx, name)\n\n if (step) {\n return step\n }\n\n return {\n op: 'varSet',\n key: name,\n value: resultVar,\n }\n}\n\n/**\n * Transform if statement\n */\nfunction transformIfStatement(\n stmt: IfStatement,\n ctx: TransformContext\n): BaseNode {\n // Convert condition to ExprNode\n const condition = expressionToExprNode(stmt.test, ctx)\n\n // Transform then branch\n const thenSteps =\n stmt.consequent.type === 'BlockStatement'\n ? transformBlock(\n stmt.consequent as BlockStatement,\n createChildContext(ctx)\n )\n : ([transformStatement(stmt.consequent, ctx)].filter(\n Boolean\n ) as BaseNode[])\n\n // Transform else branch if present\n let elseSteps: BaseNode[] | undefined\n if (stmt.alternate) {\n elseSteps =\n stmt.alternate.type === 'BlockStatement'\n ? transformBlock(\n stmt.alternate as BlockStatement,\n createChildContext(ctx)\n )\n : ([transformStatement(stmt.alternate, ctx)].filter(\n Boolean\n ) as BaseNode[])\n }\n\n return {\n op: 'if',\n condition,\n then: thenSteps,\n ...(elseSteps && { else: elseSteps }),\n }\n}\n\n/**\n * Transform while statement\n */\nfunction transformWhileStatement(\n stmt: WhileStatement,\n ctx: TransformContext\n): BaseNode {\n const condition = expressionToExprNode(stmt.test, ctx)\n\n const body =\n stmt.body.type === 'BlockStatement'\n ? transformBlock(stmt.body as BlockStatement, createChildContext(ctx))\n : ([transformStatement(stmt.body, ctx)].filter(Boolean) as BaseNode[])\n\n return {\n op: 'while',\n condition,\n body,\n }\n}\n\n/**\n * Transform for...of statement into map atom\n */\nfunction transformForOfStatement(\n stmt: ForOfStatement,\n ctx: TransformContext\n): BaseNode {\n // Get the loop variable name\n let varName: string\n if (stmt.left.type === 'VariableDeclaration') {\n const decl = stmt.left.declarations[0]\n if (decl.id.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable names are supported in for...of',\n getLocation(stmt.left),\n ctx.source,\n ctx.filename\n )\n }\n varName = (decl.id as Identifier).name\n } else if (stmt.left.type === 'Identifier') {\n varName = (stmt.left as Identifier).name\n } else {\n throw new TranspileError(\n 'Unsupported for...of left-hand side',\n getLocation(stmt.left),\n ctx.source,\n ctx.filename\n )\n }\n\n // Get the iterable\n const items = expressionToValue(stmt.right, ctx)\n\n // Create child context with loop variable\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(varName, { kind: 'any' })\n\n // Transform body\n const steps =\n stmt.body.type === 'BlockStatement'\n ? transformBlock(stmt.body as BlockStatement, childCtx)\n : ([transformStatement(stmt.body, childCtx)].filter(\n Boolean\n ) as BaseNode[])\n\n return {\n op: 'map',\n items,\n as: varName,\n steps,\n }\n}\n\n/**\n * Transform try/catch statement\n */\nfunction transformTryStatement(\n stmt: TryStatement,\n ctx: TransformContext\n): BaseNode {\n const trySteps = transformBlock(stmt.block, createChildContext(ctx))\n\n let catchSteps: BaseNode[] | undefined\n let catchParam: string | undefined\n if (stmt.handler) {\n const catchCtx = createChildContext(ctx)\n // Add error variable to scope if named\n if (stmt.handler.param?.type === 'Identifier') {\n catchParam = (stmt.handler.param as Identifier).name\n catchCtx.locals.set(catchParam, {\n kind: 'any',\n })\n }\n catchSteps = transformBlock(stmt.handler.body, catchCtx)\n }\n\n return {\n op: 'try',\n try: trySteps,\n ...(catchSteps && { catch: catchSteps }),\n ...(catchParam && { catchParam }),\n }\n}\n\n/**\n * Transform return statement\n */\nfunction transformReturnStatement(\n stmt: ReturnStatement,\n ctx: TransformContext\n): BaseNode | BaseNode[] {\n if (!stmt.argument) {\n return { op: 'return', value: {} }\n }\n\n // Check if the return expression requires a preceding step (e.g., atom call)\n const { step, resultVar } = transformExpressionToStep(\n stmt.argument,\n ctx,\n '__returnVal__'\n )\n\n // If there's a step (atom call), emit it first, then return the result variable\n if (step) {\n return [step, { op: 'return', value: resultVar }]\n }\n\n // Otherwise, convert expression directly to a value for return\n const value = expressionToValue(stmt.argument, ctx)\n return { op: 'return', value }\n}\n\n// Known builtins that should be evaluated as expressions, not atom calls\nconst BUILTIN_OBJECTS = new Set([\n 'Math',\n 'JSON',\n 'Array',\n 'Object',\n 'String',\n 'Number',\n 'console',\n 'Date', // Date factory with static methods like Date.now()\n 'Schema', // tosijs-schema fluent API for building JSON Schemas\n])\n\nconst BUILTIN_GLOBALS = new Set([\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'encodeURI',\n 'decodeURI',\n 'encodeURIComponent',\n 'decodeURIComponent',\n 'Set', // Factory function for set-like objects\n 'Date', // Factory function for date-like objects\n 'filter', // Schema-based object filtering\n])\n\nconst UNSUPPORTED_BUILTINS = new Set([\n 'RegExp',\n 'Promise',\n 'Map',\n 'WeakSet',\n 'WeakMap',\n 'Symbol',\n 'Proxy',\n 'Reflect',\n 'Function',\n 'eval',\n 'setTimeout',\n 'setInterval',\n 'fetch',\n 'require',\n 'import',\n 'process',\n 'window',\n 'document',\n 'global',\n 'globalThis',\n])\n\n// Instance methods that should be evaluated as expressions, not atom calls\n// These are methods on values (strings, arrays, etc.) that have native implementations\nconst INSTANCE_METHODS = new Set([\n // String methods\n 'toUpperCase',\n 'toLowerCase',\n 'trim',\n 'trimStart',\n 'trimEnd',\n 'charAt',\n 'charCodeAt',\n 'codePointAt',\n 'concat',\n 'includes',\n 'indexOf',\n 'lastIndexOf',\n 'startsWith',\n 'endsWith',\n 'slice',\n 'substring',\n 'substr',\n 'replace',\n 'replaceAll',\n 'match',\n 'search',\n 'padStart',\n 'padEnd',\n 'repeat',\n 'normalize',\n 'localeCompare',\n 'toString',\n 'valueOf',\n 'at',\n // Array methods (that don't need special atom handling)\n 'reverse',\n 'sort',\n 'fill',\n 'copyWithin',\n 'flat',\n 'flatMap',\n 'every',\n 'some',\n 'forEach',\n // Note: map, filter, find, reduce are handled specially as atoms for lambda support\n // Set methods (from Set() builtin)\n 'add',\n 'remove',\n 'has',\n 'clear',\n 'toArray',\n 'union',\n 'intersection',\n 'diff',\n // Date methods (from Date() builtin)\n 'format',\n 'isBefore',\n 'isAfter',\n // Note: Date.add and Date.diff are method calls that return new values\n])\n\n/**\n * Check if a CallExpression is a builtin call (Math.floor, JSON.parse, etc.)\n * or an instance method call (str.toUpperCase(), arr.includes(), etc.)\n */\nfunction isBuiltinCall(expr: CallExpression): boolean {\n // Check for global functions like parseInt()\n if (expr.callee.type === 'Identifier') {\n const name = (expr.callee as Identifier).name\n return BUILTIN_GLOBALS.has(name) || UNSUPPORTED_BUILTINS.has(name)\n }\n\n // Check for method calls\n if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n\n // Check for method calls on builtin objects like Math.floor()\n if (member.object.type === 'Identifier') {\n const objName = (member.object as Identifier).name\n if (BUILTIN_OBJECTS.has(objName) || UNSUPPORTED_BUILTINS.has(objName)) {\n return true\n }\n }\n\n // Check for instance method calls like str.toUpperCase()\n if (member.property.type === 'Identifier') {\n const methodName = (member.property as Identifier).name\n if (INSTANCE_METHODS.has(methodName)) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Check if a MemberExpression is accessing a builtin object (Math.PI, Number.MAX_VALUE, etc.)\n */\nfunction isBuiltinMemberAccess(expr: MemberExpression): boolean {\n if (expr.object.type === 'Identifier') {\n const objName = (expr.object as Identifier).name\n return BUILTIN_OBJECTS.has(objName) || UNSUPPORTED_BUILTINS.has(objName)\n }\n return false\n}\n\n// Error messages for unsupported builtins\nconst UNSUPPORTED_BUILTIN_MESSAGES: Record<string, string> = {\n RegExp: 'RegExp is not available. Use string methods or the regexMatch atom.',\n Promise: 'Promise is not needed. All operations are implicitly async.',\n Map: 'Map is not available. Use plain objects instead.',\n WeakSet: 'WeakSet is not available.',\n WeakMap: 'WeakMap is not available.',\n Symbol: 'Symbol is not available.',\n Proxy: 'Proxy is not available.',\n Reflect: 'Reflect is not available.',\n Function: 'Function constructor is not available. Define functions normally.',\n eval: 'eval is not available. Code is compiled, not evaluated.',\n setTimeout: 'setTimeout is not available. Use the delay atom.',\n setInterval: 'setInterval is not available. Use while loops with delay.',\n fetch: 'fetch is not available. Use the httpFetch atom.',\n require: 'require is not available. Atoms must be registered with the VM.',\n import: 'import is not available. Atoms must be registered with the VM.',\n process: 'process is not available. AsyncJS runs in a sandboxed environment.',\n window: 'window is not available. AsyncJS runs in a sandboxed environment.',\n document:\n 'document is not available. AsyncJS runs in a sandboxed environment.',\n global: 'global is not available. AsyncJS runs in a sandboxed environment.',\n globalThis: 'globalThis is not available. Use builtins directly.',\n}\n\n/**\n * Check if expression uses an unsupported builtin and return error message if so\n */\nfunction getUnsupportedBuiltinError(expr: CallExpression): string | null {\n if (expr.callee.type === 'Identifier') {\n const name = (expr.callee as Identifier).name\n if (UNSUPPORTED_BUILTINS.has(name)) {\n return (\n UNSUPPORTED_BUILTIN_MESSAGES[name] ||\n `${name} is not available in AsyncJS.`\n )\n }\n }\n\n if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n if (member.object.type === 'Identifier') {\n const objName = (member.object as Identifier).name\n if (UNSUPPORTED_BUILTINS.has(objName)) {\n return (\n UNSUPPORTED_BUILTIN_MESSAGES[objName] ||\n `${objName} is not available in AsyncJS.`\n )\n }\n }\n }\n\n return null\n}\n\n/**\n * Get helpful suggestion for 'new' expression alternatives\n */\nfunction getNewExpressionSuggestion(constructorName: string): string {\n const suggestions: Record<string, string> = {\n Date: \" Use Date() or Date('2024-01-15') instead - no 'new' needed.\",\n Set: \" Use Set([items]) instead - no 'new' needed.\",\n Map: ' Use plain objects instead of Map.',\n Array: ' Use array literals like [1, 2, 3] instead.',\n Object: ' Use object literals like { key: value } instead.',\n Error: \" Return an error object like { error: 'message' } instead.\",\n RegExp: ' Use string methods or the regexMatch atom.',\n Promise: ' Not needed - all operations are implicitly async.',\n WeakSet: ' WeakSet is not available.',\n WeakMap: ' WeakMap is not available.',\n }\n return (\n suggestions[constructorName] ||\n ' Use factory functions or object literals instead.'\n )\n}\n\n/**\n * Transform an expression, potentially into a step with a result variable\n */\nfunction transformExpressionToStep(\n expr: Expression,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode | null; resultVar: any } {\n const varOp = isConst ? 'constSet' : 'varSet'\n\n // Unwrap ChainExpression (optional chaining wrapper)\n if (expr.type === 'ChainExpression') {\n const chain = expr as any\n // The inner expression has optional: true on the relevant nodes\n // Just recurse with the unwrapped expression\n return transformExpressionToStep(\n chain.expression as Expression,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Check for 'new' keyword - not supported in AsyncJS\n if (expr.type === 'NewExpression') {\n const newExpr = expr as any\n let constructorName = 'constructor'\n if (newExpr.callee.type === 'Identifier') {\n constructorName = newExpr.callee.name\n }\n const suggestion = getNewExpressionSuggestion(constructorName)\n throw new TranspileError(\n `The 'new' keyword is not supported in AsyncJS.${suggestion}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n // Check for unsupported builtins first and give helpful error\n if (expr.type === 'CallExpression') {\n const unsupportedError = getUnsupportedBuiltinError(expr as CallExpression)\n if (unsupportedError) {\n throw new TranspileError(\n unsupportedError,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n }\n\n // Check if this is a builtin call (Math.floor, JSON.parse, parseInt, etc.)\n // Builtins are evaluated as expressions, not atom calls\n if (expr.type === 'CallExpression' && isBuiltinCall(expr as CallExpression)) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n return { step: null, resultVar: exprNode as any }\n }\n\n // Check if this is a builtin member access (Math.PI, Number.MAX_SAFE_INTEGER, etc.)\n if (\n expr.type === 'MemberExpression' &&\n isBuiltinMemberAccess(expr as MemberExpression)\n ) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n return { step: null, resultVar: exprNode as any }\n }\n\n // Function call -> atom invocation\n if (expr.type === 'CallExpression') {\n return transformCallExpression(\n expr as CallExpression,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Template literal -> template atom\n if (expr.type === 'TemplateLiteral') {\n return transformTemplateLiteral(\n expr as TemplateLiteral,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Binary/logical/unary expression - convert to ExprNode\n if (\n expr.type === 'BinaryExpression' ||\n expr.type === 'LogicalExpression' ||\n expr.type === 'UnaryExpression'\n ) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n // If we need to store the result, emit a varSet/constSet with the expression node as value\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n // No storage needed, just return the expression node as the result\n return { step: null, resultVar: exprNode as any }\n }\n\n // Simple value - no step needed\n const value = expressionToValue(expr, ctx)\n return { step: null, resultVar: value }\n}\n\n/**\n * Transform a function call expression\n */\nfunction transformCallExpression(\n expr: CallExpression,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n // Get the function name\n let funcName: string\n let isMethodCall = false\n let receiver: any\n\n if (expr.callee.type === 'Identifier') {\n funcName = (expr.callee as Identifier).name\n } else if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n if (member.property.type === 'Identifier') {\n funcName = (member.property as Identifier).name\n isMethodCall = true\n receiver = expressionToValue(member.object as Expression, ctx)\n } else {\n throw new TranspileError(\n 'Computed method names are not supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n } else {\n throw new TranspileError(\n 'Only named function calls are supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n // Handle built-in method calls\n if (isMethodCall) {\n return transformMethodCall(\n funcName,\n receiver,\n expr.arguments as Expression[],\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Handle console.log specially\n if (funcName === 'console' && expr.callee.type === 'MemberExpression') {\n // This would be caught above, but just in case\n }\n\n // Check if it's a known atom\n // For now, we assume any function call is an atom call\n // The VM will validate at runtime\n\n // Extract arguments\n const args = extractCallArguments(expr, ctx)\n\n return {\n step: {\n op: funcName,\n ...args,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Handle method calls like arr.map(), str.slice(), etc.\n */\nfunction transformMethodCall(\n method: string,\n receiver: any,\n args: Expression[],\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n switch (method) {\n case 'map':\n // arr.map(x => ...) -> map atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n let steps: BaseNode[]\n if (callback.body.type === 'BlockStatement') {\n steps = transformBlock(callback.body, childCtx)\n } else {\n // Expression body: x => x * 2\n const { step, resultVar: exprResult } = transformExpressionToStep(\n callback.body,\n childCtx,\n 'result'\n )\n steps = step\n ? [step]\n : [{ op: 'varSet', key: 'result', value: exprResult }]\n }\n\n return {\n step: {\n op: 'map',\n items: receiver,\n as: paramName,\n steps,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'filter':\n // arr.filter(x => condition) -> filter atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n // For filter, the callback should return a boolean expression\n // Convert the body to an ExprNode\n let condition: any\n if (callback.body.type === 'BlockStatement') {\n // Block body - look for return statement\n throw new TranspileError(\n 'filter callback must be an expression, not a block',\n getLocation(args[0]),\n ctx.source,\n ctx.filename\n )\n } else {\n // Expression body: x => x > 5\n condition = expressionToExprNode(callback.body, childCtx)\n }\n\n return {\n step: {\n op: 'filter',\n items: receiver,\n as: paramName,\n condition,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'find':\n // arr.find(x => condition) -> find atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n let condition: any\n if (callback.body.type === 'BlockStatement') {\n throw new TranspileError(\n 'find callback must be an expression, not a block',\n getLocation(args[0]),\n ctx.source,\n ctx.filename\n )\n } else {\n condition = expressionToExprNode(callback.body, childCtx)\n }\n\n return {\n step: {\n op: 'find',\n items: receiver,\n as: paramName,\n condition,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'reduce':\n // arr.reduce((acc, x) => expr, initial) -> reduce atom\n if (\n args.length >= 2 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const accParam = callback.params[0]\n const itemParam = callback.params[1]\n const accName = accParam?.type === 'Identifier' ? accParam.name : 'acc'\n const itemName =\n itemParam?.type === 'Identifier' ? itemParam.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(accName, { kind: 'any' })\n childCtx.locals.set(itemName, { kind: 'any' })\n\n let steps: BaseNode[]\n if (callback.body.type === 'BlockStatement') {\n steps = transformBlock(callback.body, childCtx)\n } else {\n // Expression body: (acc, x) => acc + x\n const { step, resultVar: exprResult } = transformExpressionToStep(\n callback.body,\n childCtx,\n 'result'\n )\n steps = step\n ? [step]\n : [{ op: 'varSet', key: 'result', value: exprResult }]\n }\n\n const initial = expressionToValue(args[1], ctx)\n\n return {\n step: {\n op: 'reduce',\n items: receiver,\n as: itemName,\n accumulator: accName,\n initial,\n steps,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'slice':\n // TODO: Could map to a slice atom\n break\n\n case 'push':\n return {\n step: {\n op: 'push',\n list: receiver,\n item: expressionToValue(args[0], ctx),\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n\n case 'join':\n return {\n step: {\n op: 'join',\n list: receiver,\n sep: args.length > 0 ? expressionToValue(args[0], ctx) : '',\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n\n case 'split':\n return {\n step: {\n op: 'split',\n str: receiver,\n sep: args.length > 0 ? expressionToValue(args[0], ctx) : '',\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n\n // Unknown method - emit warning and try as generic call\n ctx.warnings.push({\n message: `Unknown method '${method}' - treating as atom call`,\n line: 0,\n column: 0,\n })\n\n return {\n step: {\n op: method,\n receiver,\n args: args.map((a) => expressionToValue(a, ctx)),\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Transform template literal\n */\nfunction transformTemplateLiteral(\n expr: TemplateLiteral,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n // Build template string with {{var}} placeholders\n let tmpl = ''\n const vars: Record<string, any> = {}\n\n for (let i = 0; i < expr.quasis.length; i++) {\n tmpl += expr.quasis[i].value.cooked || expr.quasis[i].value.raw\n\n if (i < expr.expressions.length) {\n const exprNode = expr.expressions[i]\n const varName = `_${i}`\n vars[varName] = expressionToValue(exprNode as Expression, ctx)\n tmpl += `{{${varName}}}`\n }\n }\n\n return {\n step: {\n op: 'template',\n tmpl,\n vars,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Convert an Acorn expression to an ExprNode for direct VM evaluation.\n * This replaces the string-based condition system.\n */\nfunction expressionToExprNode(\n expr: Expression,\n ctx: TransformContext\n): ExprNode {\n switch (expr.type) {\n case 'Literal': {\n const lit = expr as Literal\n return { $expr: 'literal', value: lit.value }\n }\n\n case 'Identifier': {\n const id = expr as Identifier\n return { $expr: 'ident', name: id.name }\n }\n\n case 'MemberExpression': {\n const mem = expr as MemberExpression\n const obj = expressionToExprNode(mem.object as Expression, ctx)\n const isOptional = (mem as any).optional === true\n\n if (mem.computed) {\n // arr[0] or obj[key] - computed access\n // For now, only support literal indices\n const prop = mem.property as Expression\n if (prop.type === 'Literal') {\n return {\n $expr: 'member',\n object: obj,\n property: String((prop as Literal).value),\n computed: true,\n ...(isOptional && { optional: true }),\n }\n }\n // For computed with variable, we'd need more complex handling\n throw new TranspileError(\n 'Computed member access with variables not yet supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n const propName = (mem.property as Identifier).name\n return {\n $expr: 'member',\n object: obj,\n property: propName,\n ...(isOptional && { optional: true }),\n }\n }\n\n case 'ChainExpression': {\n // ChainExpression wraps optional chaining (?.)\n // Just unwrap to the inner expression which will have optional: true\n const chain = expr as any\n return expressionToExprNode(chain.expression as Expression, ctx)\n }\n\n case 'BinaryExpression': {\n const bin = expr as BinaryExpression\n return {\n $expr: 'binary',\n op: bin.operator,\n left: expressionToExprNode(bin.left as Expression, ctx),\n right: expressionToExprNode(bin.right as Expression, ctx),\n }\n }\n\n case 'LogicalExpression': {\n const log = expr as LogicalExpression\n return {\n $expr: 'logical',\n op: log.operator as '&&' | '||' | '??',\n left: expressionToExprNode(log.left as Expression, ctx),\n right: expressionToExprNode(log.right as Expression, ctx),\n }\n }\n\n case 'UnaryExpression': {\n const un = expr as any\n return {\n $expr: 'unary',\n op: un.operator,\n argument: expressionToExprNode(un.argument as Expression, ctx),\n }\n }\n\n case 'ConditionalExpression': {\n const cond = expr as any\n return {\n $expr: 'conditional',\n test: expressionToExprNode(cond.test as Expression, ctx),\n consequent: expressionToExprNode(cond.consequent as Expression, ctx),\n alternate: expressionToExprNode(cond.alternate as Expression, ctx),\n }\n }\n\n case 'ArrayExpression': {\n const arr = expr as ArrayExpression\n return {\n $expr: 'array',\n elements: arr.elements\n .filter((el): el is Expression => el !== null)\n .map((el) => expressionToExprNode(el, ctx)),\n }\n }\n\n case 'ObjectExpression': {\n const obj = expr as ObjectExpression\n const properties: { key: string; value: ExprNode }[] = []\n\n for (const prop of obj.properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n properties.push({\n key,\n value: expressionToExprNode(prop.value as Expression, ctx),\n })\n }\n }\n\n return { $expr: 'object', properties }\n }\n\n case 'CallExpression': {\n const call = expr as CallExpression\n\n // Handle method calls (e.g., Math.floor(x), str.toUpperCase(), arr.push(x))\n if (call.callee.type === 'MemberExpression') {\n const member = call.callee as MemberExpression\n const method =\n member.property.type === 'Identifier'\n ? (member.property as Identifier).name\n : String((member.property as Literal).value)\n\n // Check for optional chaining: obj?.method() or obj.method?.()\n const isOptional =\n (member as any).optional === true || (call as any).optional === true\n\n return {\n $expr: 'methodCall',\n object: expressionToExprNode(member.object as Expression, ctx),\n method,\n arguments: call.arguments.map((arg) =>\n expressionToExprNode(arg as Expression, ctx)\n ),\n ...(isOptional && { optional: true }),\n }\n }\n\n // Handle global function calls (e.g., parseInt(x), parseFloat(x))\n if (call.callee.type === 'Identifier') {\n const funcName = (call.callee as Identifier).name\n return {\n $expr: 'call',\n callee: funcName,\n arguments: call.arguments.map((arg) =>\n expressionToExprNode(arg as Expression, ctx)\n ),\n }\n }\n\n // Other call types not supported in expressions\n throw new TranspileError(\n 'Complex function calls in expressions should be lifted to statements',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n case 'NewExpression': {\n const newExpr = expr as any\n let constructorName = 'constructor'\n if (newExpr.callee.type === 'Identifier') {\n constructorName = newExpr.callee.name\n }\n const suggestion = getNewExpressionSuggestion(constructorName)\n throw new TranspileError(\n `The 'new' keyword is not supported in AsyncJS.${suggestion}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n case 'TemplateLiteral':\n throw new TranspileError(\n 'Template literals inside expressions are not supported. ' +\n 'Assign to a variable first: const msg = `hello ${name}`; then use msg',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n\n default:\n throw new TranspileError(\n `Unsupported expression type in condition: ${expr.type}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n}\n\n// Note: extractCondition, expressionToConditionString, and extractVariablesFromExpression\n// have been removed. Use expressionToExprNode instead - it converts Acorn AST directly\n// to ExprNode format, eliminating the need for JSEP string parsing at runtime.\n\n/**\n * Convert an expression to a runtime value (for varSet, etc.)\n */\nfunction expressionToValue(expr: Expression, ctx: TransformContext): any {\n switch (expr.type) {\n case 'Literal':\n return (expr as Literal).value\n\n case 'Identifier': {\n const name = (expr as Identifier).name\n // Parameters are imported into state via varsImport at function start,\n // so we reference them as state variables (just the name string)\n // No need for $kind: 'arg' since args are copied to state\n return name\n }\n\n case 'MemberExpression': {\n const mem = expr as MemberExpression\n const isOptional = (mem as any).optional === true\n\n // If optional chaining, we need an ExprNode for proper runtime handling\n if (isOptional) {\n return expressionToExprNode(expr, ctx)\n }\n\n const objValue = expressionToValue(mem.object as Expression, ctx)\n\n // If the object resolved to an ExprNode (e.g., from nested optional chaining),\n // we need to build an ExprNode for this access too\n if (objValue && typeof objValue === 'object' && objValue.$expr) {\n const prop = mem.computed\n ? String((mem.property as Literal).value)\n : (mem.property as Identifier).name\n return {\n $expr: 'member',\n object: objValue,\n property: prop,\n ...(mem.computed && { computed: true }),\n }\n }\n\n if (mem.computed) {\n // arr[0] - would need runtime evaluation\n return `${objValue}[${expressionToValue(\n mem.property as Expression,\n ctx\n )}]`\n }\n\n const prop = (mem.property as Identifier).name\n\n // If objValue is a string path, extend it\n if (typeof objValue === 'string') {\n return `${objValue}.${prop}`\n }\n\n // If objValue is an arg ref, extend the path\n if (objValue && objValue.$kind === 'arg') {\n return { $kind: 'arg', path: `${objValue.path}.${prop}` }\n }\n\n return `${objValue}.${prop}`\n }\n\n case 'ChainExpression': {\n // Unwrap ChainExpression and process the inner expression\n const chain = expr as any\n return expressionToValue(chain.expression as Expression, ctx)\n }\n\n case 'ArrayExpression':\n return (expr as ArrayExpression).elements.map((el) =>\n el ? expressionToValue(el as Expression, ctx) : null\n )\n\n case 'ObjectExpression': {\n const result: Record<string, any> = {}\n for (const prop of (expr as ObjectExpression).properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n result[key] = expressionToValue(prop.value as Expression, ctx)\n }\n }\n return result\n }\n\n case 'TemplateLiteral':\n // Template literals need runtime evaluation - convert to ExprNode\n // This will throw a helpful error explaining the limitation\n return expressionToExprNode(expr, ctx)\n\n case 'CallExpression':\n // Method calls like s.toArray() used as values need to be ExprNodes\n return expressionToExprNode(expr, ctx)\n\n case 'BinaryExpression':\n case 'LogicalExpression':\n case 'UnaryExpression':\n case 'ConditionalExpression':\n // Complex expressions need to be ExprNodes for runtime evaluation\n return expressionToExprNode(expr, ctx)\n\n default:\n return null\n }\n}\n\n/**\n * Extract call arguments from a call expression\n */\nfunction extractCallArguments(\n expr: CallExpression,\n ctx: TransformContext\n): Record<string, any> {\n // If single object argument, spread it\n if (\n expr.arguments.length === 1 &&\n expr.arguments[0].type === 'ObjectExpression'\n ) {\n const obj = expr.arguments[0] as ObjectExpression\n const result: Record<string, any> = {}\n\n for (const prop of obj.properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n result[key] = expressionToValue(prop.value as Expression, ctx)\n }\n }\n\n return result\n }\n\n // Otherwise, use positional args\n return {\n args: expr.arguments.map((arg) =>\n expressionToValue(arg as Expression, ctx)\n ),\n }\n}\n", "/**\n * TJS to JavaScript Emitter\n *\n * Transforms TJS source into standard JavaScript with runtime type metadata.\n * Unlike the AST emitter (for AgentJS), this outputs executable JS code.\n *\n * Input:\n * function greet(name: 'world'): '' {\n * return `Hello, ${name}!`\n * }\n *\n * Output:\n * function greet(name = 'world') {\n * return `Hello, ${name}!`\n * }\n * greet.__tjs = {\n * params: { name: { type: 'string', required: true, example: 'world' } },\n * returns: { type: 'string' }\n * }\n *\n * TODO: Self-contained output (no runtime dependency)\n * =====================================================\n * Currently, transpiled code references `globalThis.__tjs` for:\n * - __tjs.pushStack() / popStack() - debug stack traces\n * - __tjs.typeError() - monadic error creation\n * - __tjs.Is() / IsNot() - structural equality (when == / != used)\n *\n * This requires either:\n * 1. The runtime to be installed via installRuntime()\n * 2. A stub to be provided (e.g., playground's inline stub)\n *\n * The ideal is that TJS produces completely independent code that only needs\n * things it semantically needs (like fetch for HTTP calls). The runtime\n * functions above are ~30 lines and could be inlined when used:\n *\n * - typeError: Create a simple Error with extra properties\n * - pushStack/popStack: Could be no-ops in production, or inline array ops\n * - Is/IsNot: ~20 lines for deep structural equality\n *\n * Options to explore:\n * 1. Inline minimal runtime when needed (adds ~1KB unminified per output)\n * 2. Add transpile option: { standalone: true } to emit self-contained code\n * 3. Tree-shake: only inline the specific functions actually referenced\n *\n * See also: demo/src/tjs-playground.ts which has a manual __tjs stub that\n * must stay in sync with the runtime - a symptom of this leaky abstraction.\n */\n\nimport type { FunctionDeclaration, Program } from 'acorn'\nimport { parseExpressionAt } from 'acorn'\nimport {\n parse,\n extractTDoc,\n preprocess,\n transformExtensionCalls,\n stripLineComments,\n} from '../parser'\nimport {\n transformEqualityToStructural,\n transformIsOperators,\n} from '../parser-transforms'\nimport type { TypeDescriptor, ParameterDescriptor } from '../types'\nimport { inferTypeFromValue, parseParameter } from '../inference'\nimport { extractTests } from '../tests'\nimport {\n runAllTests,\n extractSignatureTestInfos,\n extractReturnExampleFromSource,\n} from './js-tests'\nexport { stripModuleSyntax, stripTjsPreamble } from './js-tests'\nimport { generateWasmBootstrap } from './js-wasm'\n\nexport interface TJSTranspileOptions {\n /** Filename for error messages */\n filename?: string\n /** Include source map comment */\n sourceMap?: boolean\n /** Mode: 'dev' | 'strict' | 'production' */\n mode?: 'dev' | 'strict' | 'production'\n /**\n * Test execution mode:\n * - true (default): run tests at transpile time, throw on failure\n * - false: skip tests entirely (production build)\n * - 'only': only run tests, don't emit code (CI/test runner)\n * - 'report': run tests, report results in testResults, don't throw\n * (caller decides whether to use the code based on results)\n */\n runTests?: boolean | 'only' | 'report'\n /**\n * Debug mode: include source locations in __tjs metadata\n * Enables better error messages with file:line:column info\n */\n debug?: boolean\n /**\n * Pre-resolved import code for test execution.\n * Map of import specifier to compiled JavaScript code.\n * Used when tests depend on imported modules.\n */\n resolvedImports?: Record<string, string>\n}\n\n/** Result of running tests at transpile time */\nexport type { TestResult } from './js-tests'\nimport type { TestResult } from './js-tests'\n\nexport interface TJSTranspileResult {\n /** The transpiled JavaScript code */\n code: string\n /** Type information for the function(s) - Record of function name to type info */\n types: Record<string, TJSTypeInfo>\n /** Function metadata (alias for types, used by runtime) */\n metadata: Record<string, TJSTypeInfo>\n /** Any warnings during transpilation */\n warnings?: string[]\n /** Generated test runner code (if tests were present) - DEPRECATED, tests now run at transpile time */\n testRunner?: string\n /** Number of tests extracted */\n testCount?: number\n /** Test results (when runTests is true or 'only') */\n testResults?: TestResult[]\n /** WASM compilation results (for debugging/inspection) */\n wasmCompiled?: {\n id: string\n success: boolean\n error?: string\n byteLength?: number\n }[]\n}\n\nexport interface TJSTypeInfo {\n /** Function name */\n name: string\n /** Parameter types */\n params: Record<string, ParameterDescriptor>\n /** Return type */\n returns?: TypeDescriptor\n /** TDoc description */\n description?: string\n /** True if function uses destructured object param (the fast path) */\n isDestructuredParam?: boolean\n /** The shape of the destructured param (for inline validation) */\n destructuredShape?: Record<string, TypeDescriptor>\n /** Which fields in destructuredShape are required */\n destructuredRequired?: Set<string>\n}\n\n/**\n * Check if a param used `:` (required) or `=` (optional) in the raw source.\n * Finds the function's param list by name, then looks for `paramName:` vs `paramName =`.\n */\nfunction isParamRequiredInSource(\n source: string,\n funcName: string,\n paramName: string\n): boolean {\n if (!source || !funcName) return false\n // Find the function declaration and its param list\n const funcPattern = new RegExp(\n `function\\\\s+${funcName}\\\\s*\\\\([^)]*?\\\\b${paramName}\\\\s*([=:])`,\n 's'\n )\n const match = source.match(funcPattern)\n if (!match) return false\n return match[1] === ':'\n}\n\n/**\n * Extract type info for a single function declaration\n */\nfunction extractFunctionTypeInfo(\n func: FunctionDeclaration,\n originalSource: string,\n requiredParams: Set<string>,\n returnTypeStr: string | null,\n inputSource?: string\n): { types: TJSTypeInfo; warnings: string[] } {\n const warnings: string[] = []\n\n // Extract TDoc (/*# ... */) comments\n const tdoc = extractTDoc(originalSource, func)\n\n // Build parameter type info\n const params: Record<string, ParameterDescriptor> = {}\n let isDestructuredParam = false\n let destructuredShape: Record<string, TypeDescriptor> | undefined\n let destructuredRequired: Set<string> | undefined\n\n // Check if this is a single destructured object param (the fast path)\n if (\n func.params.length === 1 &&\n (func.params[0].type === 'ObjectPattern' ||\n (func.params[0].type === 'AssignmentPattern' &&\n func.params[0].left.type === 'ObjectPattern'))\n ) {\n isDestructuredParam = true\n const param = func.params[0]\n const objectPattern =\n param.type === 'ObjectPattern' ? param : (param as any).left\n\n const paramInfo = parseParameter(objectPattern, requiredParams)\n if (paramInfo.type.kind === 'object' && paramInfo.type.destructuredParams) {\n destructuredShape = {}\n destructuredRequired = new Set()\n\n // Build shape and track required fields\n for (const [key, descriptor] of Object.entries(\n paramInfo.type.destructuredParams\n )) {\n params[key] = {\n ...descriptor,\n description: tdoc.params[key],\n }\n destructuredShape[key] = descriptor.type\n if (descriptor.required) {\n destructuredRequired.add(key)\n }\n }\n }\n } else {\n // Traditional param handling (multiple params or non-destructured)\n for (const param of func.params) {\n if (param.type === 'Identifier') {\n const paramInfo = parseParameter(param, requiredParams)\n params[param.name] = {\n ...paramInfo,\n required: requiredParams.has(param.name),\n description: tdoc.params[param.name],\n }\n } else if (\n param.type === 'AssignmentPattern' &&\n param.left.type === 'Identifier'\n ) {\n const paramInfo = parseParameter(param, requiredParams)\n // Determine if this param used `:` (required) or `=` (optional).\n // The global requiredParams set is name-based, which fails when\n // two functions share a param name with different syntax.\n // Use the raw input source to check the actual syntax.\n const isRequired = isParamRequiredInSource(\n inputSource || '',\n func.id?.name || '',\n param.left.name\n )\n params[param.left.name] = {\n ...paramInfo,\n required: isRequired,\n default: isRequired ? null : paramInfo.example ?? paramInfo.default,\n description: tdoc.params[param.left.name],\n }\n } else if (param.type === 'ObjectPattern') {\n // Handle destructured object parameters (non-single case)\n const paramInfo = parseParameter(param, requiredParams)\n if (\n paramInfo.type.kind === 'object' &&\n paramInfo.type.destructuredParams\n ) {\n for (const [key, descriptor] of Object.entries(\n paramInfo.type.destructuredParams\n )) {\n params[key] = {\n ...descriptor,\n description: tdoc.params[key],\n }\n }\n }\n } else if (\n param.type === 'RestElement' &&\n param.argument?.type === 'Identifier'\n ) {\n // Handle rest parameters: ...args: [0]\n // The type annotation was stripped by preprocessing (JS forbids\n // defaults on rest params), so extract it from the original source\n const restName = param.argument.name\n const restTypeMatch = originalSource.match(\n new RegExp(`\\\\.\\\\.\\\\.${restName}\\\\s*:\\\\s*([^)]+?)\\\\s*\\\\)`)\n )\n if (restTypeMatch) {\n try {\n const typeExpr = parseExpressionAt(restTypeMatch[1].trim(), 0, {\n ecmaVersion: 2022,\n })\n const restItemType = inferTypeFromValue(typeExpr as any)\n params[restName] = {\n name: restName,\n type: restItemType,\n required: false,\n description: tdoc.params[restName],\n }\n } catch {\n // If we can't parse the type, emit as any array\n params[restName] = {\n name: restName,\n type: { kind: 'array' },\n required: false,\n description: tdoc.params[restName],\n }\n }\n } else {\n // No type annotation \u2014 bare rest param\n params[restName] = {\n name: restName,\n type: { kind: 'array' },\n required: false,\n description: tdoc.params[restName],\n }\n }\n }\n }\n }\n\n // Parse return type if present\n let returns: TypeDescriptor | undefined\n if (returnTypeStr) {\n try {\n // Transform `key = value` (default keys) to `key: value` for acorn parsing\n const parsableReturnStr = returnTypeStr.includes('=')\n ? transformReturnDefaults(returnTypeStr)\n : returnTypeStr\n const returnExpr = parseExpressionAt(parsableReturnStr, 0, {\n ecmaVersion: 2022,\n })\n returns = inferTypeFromValue(returnExpr as any)\n } catch {\n // If we can't parse the return type, just store it as-is\n returns = { kind: 'any' }\n warnings.push(`Could not parse return type: ${returnTypeStr}`)\n }\n }\n\n // Build type info object\n const types: TJSTypeInfo = {\n name: func.id?.name || 'anonymous',\n params,\n returns,\n description: tdoc.description,\n isDestructuredParam,\n destructuredShape,\n destructuredRequired,\n }\n\n return { types, warnings }\n}\n\n/**\n * Generate inline validation code to be inserted at the start of a function body\n *\n * Implements proper monadic error handling:\n * 1. Check if any param is an Error - if so, pass it through (no work)\n * 2. Check types with fast inline typeof checks\n * 3. On type mismatch, call __tjs.typeError() (only on error path)\n *\n * @param funcName - Function name for error paths\n * @param types - Type information for the function\n * @param source - Source location (e.g., \"src/utils.ts:42\") for error reporting\n */\nfunction generateInlineValidationCode(\n funcName: string,\n types: TJSTypeInfo,\n source?: string\n): { preamble: string; suffix: string } | null {\n const lines: string[] = []\n // Include source in path if available: \"src/file.ts:42:funcName.param\"\n const pathPrefix = source ? `${source}:` : ''\n const stackEntry = source ? `${source}:${funcName}` : funcName\n\n // Destructured params: validate each field of the input object\n if (types.isDestructuredParam && types.destructuredShape) {\n const shape = types.destructuredShape\n const requiredFields = types.destructuredRequired || new Set()\n const fieldNames = Object.keys(shape)\n\n if (fieldNames.length === 0) return null\n\n // 1. Error pass-through: check if any field is an Error\n for (const fieldName of fieldNames) {\n lines.push(`if (${fieldName} instanceof Error) return ${fieldName};`)\n }\n\n // 2. Type checks with proper error emission\n for (const [fieldName, fieldType] of Object.entries(shape)) {\n const isRequired = requiredFields.has(fieldName)\n const path = `${pathPrefix}${funcName}.${fieldName}`\n const typeCheck = generateTypeCheckExpr(fieldName, fieldType)\n\n if (typeCheck) {\n const expectedType = fieldType.kind\n if (isRequired) {\n lines.push(\n `if (${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${fieldName});`\n )\n } else {\n lines.push(\n `if (${fieldName} !== undefined && ${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${fieldName});`\n )\n }\n }\n }\n\n if (lines.length === 0) return null\n\n // pushStack is a no-op unless callStacks/debug is enabled at runtime.\n // No try/finally needed \u2014 the ring buffer tolerates missed popStack.\n lines.unshift(`__tjs.pushStack('${stackEntry}');`)\n\n return {\n preamble: lines.join('\\n '),\n suffix: '__tjs.popStack();',\n }\n }\n\n // Positional params: validate each param\n const params = Object.entries(types.params)\n if (params.length === 0) return null\n\n // 1. Error pass-through: check if any param is an Error\n for (const [paramName] of params) {\n lines.push(`if (${paramName} instanceof Error) return ${paramName};`)\n }\n\n // 2. Type checks with proper error emission\n for (const [paramName, param] of params) {\n const path = `${pathPrefix}${funcName}.${paramName}`\n const typeCheck = generateTypeCheckExpr(paramName, param.type)\n\n if (typeCheck) {\n const expectedType =\n param.type.kind === 'union'\n ? (param.type as any).members.map((m: any) => m.kind).join(' | ')\n : param.type.kind\n if (param.required) {\n lines.push(\n `if (${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${paramName});`\n )\n } else {\n lines.push(\n `if (${paramName} !== undefined && ${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${paramName});`\n )\n }\n }\n }\n\n if (lines.length === 0) return null\n\n // pushStack is a no-op unless callStacks/debug is enabled at runtime.\n // No try/finally needed \u2014 the ring buffer tolerates missed popStack.\n lines.unshift(`__tjs.pushStack('${stackEntry}');`)\n\n return {\n preamble: lines.join('\\n '),\n suffix: '__tjs.popStack();',\n }\n}\n\n/**\n * Transform `key = value` to `key: value` in a return type string\n * so acorn can parse it as a valid JS object expression.\n */\nfunction transformReturnDefaults(str: string): string {\n let result = ''\n let depth = 0\n\n for (let i = 0; i < str.length; i++) {\n const ch = str[i]\n if (ch === '{' || ch === '[' || ch === '(') {\n depth++\n result += ch\n } else if (ch === '}' || ch === ']' || ch === ')') {\n depth--\n result += ch\n } else if (ch === \"'\" || ch === '\"' || ch === '`') {\n result += ch\n i++\n while (i < str.length && str[i] !== ch) {\n if (str[i] === '\\\\') result += str[i++]\n result += str[i++]\n }\n if (i < str.length) result += str[i]\n } else if (\n depth === 1 &&\n ch === '=' &&\n str[i - 1] !== '!' &&\n str[i + 1] !== '='\n ) {\n // Top-level = that isn't != or == \u2014 replace with :\n result += ':'\n } else {\n result += ch\n }\n }\n\n return result\n}\n\n/**\n * Extract the return type string for a specific function from source\n * Returns null if no return type found\n */\nfunction extractFunctionReturnType(\n source: string,\n funcName: string\n): string | null {\n // Match: function funcName(params): returnExample {\n // or: function funcName(params):? returnExample {\n // or: function funcName(params):! returnExample {\n const regex = new RegExp(\n `function\\\\s+${funcName}\\\\s*\\\\([^)]*\\\\)\\\\s*(:[?!]?)\\\\s*`,\n 'g'\n )\n const match = regex.exec(source)\n if (!match) return null\n\n const afterMarker = source.slice(match.index + match[0].length)\n return extractReturnExampleFromSource(afterMarker)\n}\n\n/**\n * Extract return safety marker for a specific function from source\n * Returns 'safe' for :?, 'unsafe' for :!, undefined for : or no marker\n */\nfunction extractFunctionReturnSafety(\n source: string,\n funcName: string\n): 'safe' | 'unsafe' | undefined {\n const regex = new RegExp(\n `function\\\\s+${funcName}\\\\s*\\\\([^)]*\\\\)\\\\s*:([?!]?)`,\n 'g'\n )\n const match = regex.exec(source)\n if (!match) return undefined\n\n const marker = match[1]\n if (marker === '?') return 'safe'\n if (marker === '!') return 'unsafe'\n return undefined // : is the default, no special safety flag\n}\n\n/**\n * Extract source file annotation from TJS source\n * Looks for: /\u2605 tjs <- path/to/file.ts \u2605/ at the start (\u2605 = *)\n */\nfunction extractSourceFileAnnotation(source: string): string | undefined {\n const match = source.match(/^\\/\\*\\s*tjs\\s*<-\\s*([^*]+?)\\s*\\*\\//)\n return match ? match[1].trim() : undefined\n}\n\n/**\n * Extract line number annotation for a specific function\n * Looks for: /\u2605 line N \u2605/ immediately before the function declaration\n */\nfunction extractLineAnnotation(\n source: string,\n funcName: string\n): number | undefined {\n // Match: /* line N */ followed by function declaration\n // Allow for async, whitespace variations\n const regex = new RegExp(\n `\\\\/\\\\*\\\\s*line\\\\s+(\\\\d+)\\\\s*\\\\*\\\\/\\\\s*(?:async\\\\s+)?function\\\\s+${funcName}\\\\s*\\\\(`,\n 'm'\n )\n const match = source.match(regex)\n return match ? parseInt(match[1], 10) : undefined\n}\n\n/**\n * Transpile TJS source to JavaScript\n *\n * This function handles:\n * - Files with no functions (just statements/tests)\n * - Files with multiple functions\n * - Inline validation (no wrappers)\n * - __tjs metadata inserted immediately after each function\n */\nexport function transpileToJS(\n source: string,\n options: TJSTranspileOptions = {}\n): TJSTranspileResult {\n const {\n filename = '<source>',\n runTests = true,\n debug = false,\n resolvedImports = {},\n } = options\n const warnings: string[] = []\n\n // Strip single-line comments early \u2014 apostrophes in comments (e.g. \"don't\")\n // confuse brace matching in test extraction and other transforms\n source = stripLineComments(source)\n\n // Extract source file annotation if present (from TS transpilation)\n const sourceFileAnnotation = extractSourceFileAnnotation(source)\n const effectiveFilename = sourceFileAnnotation || filename\n\n // Extract test/mock blocks before parsing (they're not valid JS)\n const { code: cleanSource, tests, mocks, testRunner } = extractTests(source)\n\n // Parse the cleaned source (handles TJS syntax like x: 'type' and : ReturnType)\n const {\n ast: program,\n originalSource,\n requiredParams,\n unsafeFunctions,\n } = parse(cleanSource, {\n filename,\n colonShorthand: true,\n })\n\n // Find ALL functions in the program\n const functions = findAllFunctions(program)\n\n // Preprocess source (handles TJS syntax transformations)\n const preprocessed = preprocess(cleanSource)\n\n // Apply the same source-level equality transforms to extracted test/mock\n // bodies so they observe the module's TJS semantics (e.g. structural ==).\n // Test bodies are extracted as raw text before parse(), so they would\n // otherwise run with native JS == coercion regardless of TjsEquals mode.\n for (const t of tests) {\n t.body = transformIsOperators(t.body)\n if (preprocessed.tjsModes.tjsEquals) {\n t.body = transformEqualityToStructural(t.body)\n }\n }\n for (const m of mocks) {\n m.body = transformIsOperators(m.body)\n if (preprocessed.tjsModes.tjsEquals) {\n m.body = transformEqualityToStructural(m.body)\n }\n }\n\n // Build types map for all functions\n const allTypes: Record<string, TJSTypeInfo> = {}\n\n // Collect insertions: { position, text } to be applied in reverse order\n const insertions: { position: number; text: string }[] = []\n // Collect deletions for | union suffixes in param defaults\n // e.g. `x = false | undefined` -> `x = false` (the `| undefined` is type-only)\n const deletions: { start: number; end: number }[] = []\n\n // Process each function\n for (const func of functions) {\n const funcName = func.id?.name || 'anonymous'\n\n // Extract return type for this specific function from original source\n const returnTypeStr = extractFunctionReturnType(cleanSource, funcName)\n\n // Extract default values from return type (e.g. { value: 0, error = '' })\n let returnDefaults: Record<string, unknown> | undefined\n if (returnTypeStr && returnTypeStr.includes('=')) {\n try {\n const defaultsMatch = returnTypeStr.matchAll(/(\\w+)\\s*=\\s*/g)\n const transformed = transformReturnDefaults(returnTypeStr)\n const parsed = new Function(`return ${transformed}`)()\n const defaults: Record<string, unknown> = {}\n for (const m of defaultsMatch) {\n const key = m[1]\n if (key in parsed) defaults[key] = parsed[key]\n }\n if (Object.keys(defaults).length > 0) returnDefaults = defaults\n } catch {\n // If parsing fails, skip defaults\n }\n }\n\n // Extract type info for this function\n const { types, warnings: funcWarnings } = extractFunctionTypeInfo(\n func,\n originalSource,\n requiredParams,\n returnTypeStr,\n cleanSource\n )\n warnings.push(...funcWarnings)\n allTypes[funcName] = types\n\n // Clean up param defaults in the emitted JS.\n // After colon\u2192equals transform, `x: false | undefined` becomes\n // `x = false | undefined` in the parsed source.\n // - For required params (`:` syntax), strip the entire `= value` \u2014 there's\n // no JS default for required params, the value is a type annotation only.\n // - For union defaults, strip just the `| suffix` to avoid bitwise OR.\n for (const param of func.params) {\n if (param.type === 'AssignmentPattern') {\n const paramName =\n (param as any).left?.name || (param as any).left?.value\n const paramInfo = paramName ? types.params[paramName] : null\n\n if (paramInfo?.required && paramInfo.default === null) {\n // Required param \u2014 strip entire `= value` from JS output\n deletions.push({\n start: (param as any).left.end,\n end: (param as any).right.end,\n })\n } else {\n // Optional param with union \u2014 strip just the `| suffix`\n const right = (param as any).right\n if (right.type === 'BinaryExpression' && right.operator === '|') {\n deletions.push({ start: right.left.end, end: right.end })\n }\n }\n }\n }\n\n // Determine safety options\n // Module-level \"safety none\" makes ALL functions unsafe (no validation)\n const isUnsafe =\n preprocessed.moduleSafety === 'none' || unsafeFunctions.has(funcName)\n const isSafe = preprocessed.safeFunctions.has(funcName)\n // Extract return safety per-function from original source\n const returnSafety = extractFunctionReturnSafety(cleanSource, funcName)\n\n // Get source location - prefer line annotation from TS transpilation\n const annotatedLine = extractLineAnnotation(source, funcName)\n const funcLoc = {\n file: effectiveFilename,\n line: annotatedLine ?? func.loc?.start.line ?? 0,\n column: func.loc?.start.column ?? 0,\n }\n\n const safetyOptions = {\n unsafe: isUnsafe,\n safe: isSafe,\n returnSafety,\n }\n\n // Check if this is a polymorphic dispatcher\n const isPolymorphicDispatcher = preprocessed.polymorphicNames.has(funcName)\n\n // Generate __tjs metadata (to insert after function)\n let typeMetadata: string\n if (isPolymorphicDispatcher) {\n // Build composite metadata referencing variants\n const variantNames: string[] = []\n for (const f of functions) {\n const fn = f.id?.name || ''\n if (fn.startsWith(funcName + '$')) variantNames.push(fn)\n }\n const metadata: any = {\n polymorphic: true,\n variants: variantNames,\n }\n if (funcLoc) {\n metadata.source = `${funcLoc.file}:${funcLoc.line}`\n }\n typeMetadata = `${funcName}.__tjs = ${JSON.stringify(metadata, null, 2)}`\n } else {\n typeMetadata = generateTypeMetadata(funcName, types, safetyOptions, {\n debug,\n source: funcLoc,\n returnDefaults,\n })\n }\n\n // Queue insertion of __tjs after function closing brace\n insertions.push({\n position: func.end,\n text: `\\n${typeMetadata}`,\n })\n\n // Generate inline validation (to insert at start of function body)\n // Skip for unsafe functions and polymorphic dispatchers (they handle routing)\n if (!isUnsafe && !isPolymorphicDispatcher) {\n const sourceStr = `${funcLoc.file}:${funcLoc.line}`\n const validation = generateInlineValidationCode(\n funcName,\n types,\n sourceStr\n )\n if (validation && func.body && func.body.start !== undefined) {\n // Insert preamble right after the opening brace\n insertions.push({\n position: func.body.start + 1,\n text: `\\n ${validation.preamble}\\n`,\n })\n if (validation.suffix) {\n insertions.push({\n position: func.body.end - 1,\n text: `\\n ${validation.suffix}\\n`,\n })\n }\n }\n }\n }\n\n // Apply deletions first (reverse order to maintain offsets), then insertions.\n // Deletions strip | union suffixes from param defaults in the output JS.\n deletions.sort((a, b) => b.start - a.start)\n let code = preprocessed.source\n for (const { start, end } of deletions) {\n code = code.slice(0, start) + code.slice(end)\n }\n\n // Adjust insertion positions for any deletions that shifted offsets\n for (const ins of insertions) {\n let shift = 0\n for (const del of deletions) {\n if (del.start < ins.position) {\n shift += del.end - del.start\n }\n }\n ins.position -= shift\n }\n\n // Apply insertions in reverse position order\n insertions.sort((a, b) => b.position - a.position)\n for (const { position, text } of insertions) {\n code = code.slice(0, position) + text + code.slice(position)\n }\n\n // Add __tjs reference for monadic error handling and structural equality\n // Use createRuntime() for isolated state per-module\n const needsTypeError = code.includes('__tjs.typeError(')\n const needsStack = code.includes('__tjs.pushStack(')\n const needsIs = code.includes('Is(')\n const needsIsNot = code.includes('IsNot(')\n const needsEq = code.includes('Eq(')\n const needsNotEq = code.includes('NotEq(')\n const needsTypeOf = code.includes('TypeOf(')\n // Type system constructors (from Type/Generic/FunctionPredicate/Enum/Union declarations)\n const needsType = /\\bType\\(/.test(code)\n const needsGeneric = /\\bGeneric\\(/.test(code)\n const needsFunctionPredicate = /\\bFunctionPredicate\\(/.test(code)\n const needsEnum = /\\bEnum\\(/.test(code)\n const needsUnion = /\\bUnion\\(/.test(code)\n const needsBang = code.includes('__tjs.bang(')\n const needsSafeEval = preprocessed.tjsModes.tjsSafeEval\n\n const needsRuntime =\n needsTypeError ||\n needsStack ||\n needsIs ||\n needsIsNot ||\n needsEq ||\n needsNotEq ||\n needsTypeOf ||\n needsType ||\n needsGeneric ||\n needsFunctionPredicate ||\n needsEnum ||\n needsUnion ||\n needsBang ||\n needsSafeEval\n\n if (needsRuntime) {\n // Build standalone preamble \u2014 emitted JS must work without any setup.\n // Use globalThis.__tjs if available (shared runtime), otherwise inline\n // a minimal self-contained runtime. Only includes functions actually used.\n const inlineParts: string[] = []\n\n // Core: MonadicError + typeError (needed by almost all validated functions)\n if (needsTypeError) {\n inlineParts.push(\n `class MonadicError extends Error{constructor(m,p,e,a,c,r){super(m);this.name='MonadicError';this.path=p;this.expected=e;this.actual=a;this.callStack=c;this.reason=r}}`,\n `function typeError(p,e,v,r){const a=v===null?'null':typeof v;const m=r?'Expected '+e+\" for '\"+p+\"': \"+r:'Expected '+e+\" for '\"+p+\"', got \"+a;const err=new MonadicError(m,p,e,a,undefined,r);const c=globalThis.__tjs?.getConfig?.();if(c?.logTypeErrors)console.error('[TJS TypeError] '+err.message);if(c?.throwTypeErrors)throw err;return err}`,\n `function isMonadicError(v){return v instanceof Error&&v.name==='MonadicError'&&'path' in v}`\n )\n }\n\n // Stack tracking\n if (needsStack) {\n inlineParts.push(\n `const __stack=[];function pushStack(n){__stack.push(n)}function popStack(){__stack.pop()}function getStack(){return[...__stack]}`\n )\n }\n\n // Eq/NotEq (honest equality)\n if (needsEq) {\n inlineParts.push(\n `function Eq(a,b){if(a instanceof String||a instanceof Number||a instanceof Boolean)a=a.valueOf();if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();if(a===b)return true;if(typeof a==='number'&&typeof b==='number'&&isNaN(a)&&isNaN(b))return true;if((a===null||a===undefined)&&(b===null||b===undefined))return true;return false}`\n )\n }\n if (needsNotEq) {\n inlineParts.push(`function NotEq(a,b){return!Eq(a,b)}`)\n }\n\n // TypeOf (honest typeof)\n if (needsTypeOf) {\n inlineParts.push(`function TypeOf(v){return v===null?'null':typeof v}`)\n }\n\n // Is/IsNot (structural equality)\n if (needsIs) {\n inlineParts.push(\n `const tjsEquals=Symbol.for('tjs.equals');function Is(a,b){if(a!=null&&typeof a==='object'&&typeof a[tjsEquals]==='function')return a[tjsEquals](b);if(b!=null&&typeof b==='object'&&typeof b[tjsEquals]==='function')return b[tjsEquals](a);if(a!=null&&typeof a==='object'&&typeof a.Equals==='function')return a.Equals(b);if(b!=null&&typeof b==='object'&&typeof b.Equals==='function')return b.Equals(a);if(a instanceof String||a instanceof Number||a instanceof Boolean)a=a.valueOf();if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();if(a===b)return true;if(typeof a==='number'&&typeof b==='number'&&isNaN(a)&&isNaN(b))return true;if((a==null)&&(b==null))return true;if(a==null||b==null)return false;if(typeof a!==typeof b)return false;if(typeof a!=='object')return false;if(a instanceof Set&&b instanceof Set){if(a.size!==b.size)return false;for(const v of a)if(!b.has(v))return false;return true}if(a instanceof Map&&b instanceof Map){if(a.size!==b.size)return false;for(const[k,v]of a)if(!b.has(k)||!Is(v,b.get(k)))return false;return true}if(a instanceof Date&&b instanceof Date)return a.getTime()===b.getTime();if(a instanceof RegExp&&b instanceof RegExp)return a.toString()===b.toString();if(Array.isArray(a)&&Array.isArray(b)){if(a.length!==b.length)return false;return a.every((v,i)=>Is(v,b[i]))}if(Array.isArray(a)!==Array.isArray(b))return false;const ka=Object.keys(a),kb=Object.keys(b);if(ka.length!==kb.length)return false;return ka.every(k=>Is(a[k],b[k]))}`\n )\n }\n if (needsIsNot) {\n inlineParts.push(`function IsNot(a,b){return!Is(a,b)}`)\n }\n\n // Type system constructors \u2014 these need tosijs-schema for full\n // functionality but we provide a working fallback\n if (needsType) {\n inlineParts.push(\n `function Type(d,p,e){const t={description:d,__runtimeType:true};if(typeof p==='function'){t.check=p;t.default=e??null}else{const ex=e??p;t.default=ex;t.check=v=>{if(ex===null)return true;return typeof v===typeof ex}}return t}`\n )\n }\n if (needsGeneric) {\n inlineParts.push(\n `function Generic(tp,pred,d){const f=(...args)=>{const t={description:d||'generic',__runtimeType:true,check:v=>pred(v,...args)};return t};f.__runtimeType=true;f.description=d;return f}`\n )\n }\n if (needsFunctionPredicate) {\n inlineParts.push(\n `function FunctionPredicate(n,s,b){if(Array.isArray(s)&&b){const f=(...a)=>FunctionPredicate(n,b(...a));f.typeParamNames=s.map(p=>Array.isArray(p)?p[0]:p);f.description=n;f.__runtimeType=true;return f}const spec=typeof s==='function'?{}:s||{};return{description:n,params:spec.params||{},returns:spec.returns,returnContract:spec.returnContract||'assertReturns',check:v=>typeof v==='function',__runtimeType:true}}`\n )\n }\n if (needsEnum) {\n inlineParts.push(\n `function Enum(d,m){const vals=typeof m==='object'?Object.values(m):[];return{description:d,check:v=>vals.includes(v),values:vals,__runtimeType:true}}`\n )\n }\n if (needsUnion) {\n inlineParts.push(\n `function Union(d,...v){const vals=v.flat();return{description:d,check:x=>vals.includes(x),values:vals,__runtimeType:true}}`\n )\n }\n // Bang access (!.) \u2014 asserted non-null member access\n if (needsBang) {\n // bang depends on typeError and isMonadicError \u2014 ensure they're inlined\n if (!needsTypeError) {\n inlineParts.push(\n `class MonadicError extends Error{constructor(m,p,e,a,c,r){super(m);this.name='MonadicError';this.path=p;this.expected=e;this.actual=a;this.callStack=c;this.reason=r}}`,\n `function typeError(p,e,v,r){const a=v===null?'null':typeof v;const m=r?'Expected '+e+\" for '\"+p+\"': \"+r:'Expected '+e+\" for '\"+p+\"', got \"+a;const err=new MonadicError(m,p,e,a,undefined,r);const c=globalThis.__tjs?.getConfig?.();if(c?.logTypeErrors)console.error('[TJS TypeError] '+err.message);if(c?.throwTypeErrors)throw err;return err}`,\n `function isMonadicError(v){return v instanceof Error&&v.name==='MonadicError'&&'path' in v}`\n )\n }\n inlineParts.push(\n `function bang(o,p){if(o===null||o===undefined)return typeError('bang.'+p,'non-null',o);if(isMonadicError(o))return o;return o[p]}`\n )\n }\n\n // Build preamble: inline functions are declared at module scope,\n // then __tjs either uses the shared runtime or references the inlined ones.\n const inlineBlock =\n inlineParts.length > 0 ? inlineParts.join(';\\n') + ';\\n' : ''\n\n // Build __tjs object from inlined functions (fallback when no shared runtime)\n const fallbackEntries: string[] = []\n if (needsTypeError) fallbackEntries.push('typeError', 'isMonadicError')\n if (needsStack) fallbackEntries.push('pushStack', 'popStack', 'getStack')\n if (needsEq) fallbackEntries.push('Eq')\n if (needsNotEq) fallbackEntries.push('NotEq')\n if (needsTypeOf) fallbackEntries.push('TypeOf')\n if (needsIs) fallbackEntries.push('Is', 'tjsEquals')\n if (needsIsNot) fallbackEntries.push('IsNot')\n if (needsType) fallbackEntries.push('Type')\n if (needsGeneric) fallbackEntries.push('Generic')\n if (needsFunctionPredicate) fallbackEntries.push('FunctionPredicate')\n if (needsEnum) fallbackEntries.push('Enum')\n if (needsUnion) fallbackEntries.push('Union')\n if (needsBang) {\n fallbackEntries.push('bang')\n // Ensure typeError/isMonadicError are in fallback even if not otherwise needed\n if (!needsTypeError) {\n fallbackEntries.push('typeError', 'isMonadicError')\n }\n }\n\n const fallbackObj =\n fallbackEntries.length > 0\n ? `{${fallbackEntries.join(',')}}`\n : 'undefined'\n\n const preamble =\n inlineBlock +\n `const __tjs = globalThis.__tjs?.createRuntime?.() ?? ${fallbackObj};\\n`\n\n code = preamble + code\n }\n\n // Add Eval/SafeFunction import when TjsSafeEval directive is present\n if (needsSafeEval) {\n code = `import { Eval, SafeFunction } from 'tjs-lang';\\n` + code\n }\n\n // Run tests at transpile time if enabled\n let testResults: TestResult[] | undefined\n\n if (runTests) {\n // Extract signature tests info (doesn't execute yet)\n const sigTestInfos = extractSignatureTestInfos(source)\n\n // Run all tests in a single execution context\n testResults = runAllTests(\n tests,\n mocks,\n sigTestInfos,\n code,\n resolvedImports,\n preprocessed.extensions\n )\n\n // Check for failures and throw only if runTests === true (strict mode)\n // 'only' and 'report' modes return results without throwing\n const failures = testResults.filter((r) => !r.passed)\n if (failures.length > 0 && runTests === true) {\n const errorLines = failures.map((f) => {\n if (f.isSignatureTest) {\n return ` Function signature example is inconsistent:\\n ${f.error}`\n }\n const loc = f.line ? ` (line ${f.line})` : ''\n return ` Test '${f.description}'${loc} failed:\\n ${f.error}`\n })\n throw new Error(`Transpile-time test failures:\\n${errorLines.join('\\n')}`)\n }\n }\n\n // If runTests === 'only', return minimal result\n if (runTests === 'only') {\n return {\n code: '',\n types: allTypes,\n metadata: allTypes,\n testResults,\n testCount: testResults?.length,\n }\n }\n\n // Compile WASM blocks at transpile time and embed in output\n let wasmCompiled:\n | { id: string; success: boolean; error?: string; byteLength?: number }[]\n | undefined\n if (preprocessed.wasmBlocks.length > 0) {\n wasmCompiled = []\n const wasmBootstrap = generateWasmBootstrap(preprocessed.wasmBlocks)\n if (wasmBootstrap.code) {\n code = wasmBootstrap.code + '\\n' + code\n }\n wasmCompiled = wasmBootstrap.results\n }\n\n return {\n code,\n types: allTypes,\n metadata: allTypes, // alias for runtime compatibility\n warnings: warnings.length > 0 ? warnings : undefined,\n testRunner: tests.length > 0 ? testRunner : undefined,\n testCount: tests.length > 0 ? tests.length : undefined,\n testResults,\n wasmCompiled,\n }\n}\n\n/**\n * Find ALL function declarations in the AST\n * Includes functions inside export declarations\n */\nfunction findAllFunctions(program: Program): FunctionDeclaration[] {\n const functions: FunctionDeclaration[] = []\n\n for (const node of program.body) {\n if (node.type === 'FunctionDeclaration') {\n functions.push(node)\n } else if (\n node.type === 'ExportNamedDeclaration' &&\n node.declaration?.type === 'FunctionDeclaration'\n ) {\n functions.push(node.declaration as FunctionDeclaration)\n } else if (\n node.type === 'ExportDefaultDeclaration' &&\n node.declaration?.type === 'FunctionDeclaration'\n ) {\n functions.push(node.declaration as FunctionDeclaration)\n }\n }\n\n return functions\n}\n\n/**\n * Serialize a TypeDescriptor to JSON-compatible object\n * Preserves full type structure (shape, items, members)\n */\nfunction serializeType(t: TypeDescriptor): any {\n const result: any = { kind: t.kind }\n if (t.nullable) result.nullable = true\n if (t.items) result.items = serializeType(t.items)\n if (t.shape) {\n result.shape = Object.fromEntries(\n Object.entries(t.shape).map(([k, v]) => [k, serializeType(v)])\n )\n }\n if (t.members) result.members = t.members.map(serializeType)\n return result\n}\n\n/**\n * Safety options for metadata generation\n */\ninterface SafetyOptions {\n /** Function marked with (!) - never validate inputs */\n unsafe?: boolean\n /** Function marked with (?) - always validate inputs */\n safe?: boolean\n /** Return type safety: 'safe' (:?) or 'unsafe' (:!) */\n returnSafety?: 'safe' | 'unsafe'\n}\n\n/**\n * Debug options for metadata generation\n */\ninterface DebugOptions {\n /** Include source locations in metadata */\n debug?: boolean\n /** Source location of the function */\n source?: {\n file: string\n line: number\n column: number\n }\n /** Default values for optional return type keys */\n returnDefaults?: Record<string, unknown>\n}\n\n/**\n * Generate type metadata code\n *\n * @param funcName - Function name\n * @param types - Type information\n * @param safety - Safety flags for the function\n * @param debugOpts - Debug options (source locations)\n */\nfunction generateTypeMetadata(\n funcName: string,\n types: TJSTypeInfo,\n safety: SafetyOptions = {},\n debugOpts: DebugOptions = {}\n): string {\n const paramsObj: Record<string, any> = {}\n\n for (const [name, param] of Object.entries(types.params)) {\n paramsObj[name] = {\n type: serializeType(param.type),\n required: param.required,\n }\n if (param.default !== undefined) {\n paramsObj[name].default = param.default\n }\n if (param.description) {\n paramsObj[name].description = param.description\n }\n }\n\n const metadata: any = {\n params: paramsObj,\n }\n\n if (types.returns) {\n metadata.returns = {\n type: serializeType(types.returns),\n }\n if (debugOpts.returnDefaults) {\n metadata.returns.defaults = debugOpts.returnDefaults\n }\n // Add return safety flags\n if (safety.returnSafety === 'safe') {\n metadata.safeReturn = true // :? forces output validation\n } else if (safety.returnSafety === 'unsafe') {\n metadata.unsafeReturn = true // :! skips output validation\n }\n }\n\n if (types.description) {\n metadata.description = types.description\n }\n\n // Mark unsafe functions - they skip runtime input validation\n if (safety.unsafe) {\n metadata.unsafe = true\n }\n\n // Mark safe functions - they force runtime input validation\n if (safety.safe) {\n metadata.safe = true\n }\n\n // Always include source location for error reporting\n if (debugOpts.source) {\n const { file, line } = debugOpts.source\n metadata.source = `${file}:${line}`\n }\n\n return `${funcName}.__tjs = ${JSON.stringify(metadata, null, 2)}`\n}\n\n/**\n * Check if this function can use inline validation (the fast path)\n *\n * Two patterns qualify:\n * 1. Single destructured object param: function foo({ x: 0, y: '' }) { ... }\n * 2. Single named object param: function foo(input: { x: 0, y: '' }) { ... }\n *\n * These can be validated with fast inline checks instead of schema interpretation.\n */\nfunction canUseInlineValidation(types: TJSTypeInfo): boolean {\n // Destructured params always qualify\n if (types.isDestructuredParam && types.destructuredShape) {\n return true\n }\n\n // Any function with params can use inline validation\n // (we generate typeof checks for primitives too)\n return Object.keys(types.params).length > 0\n}\n\n/**\n * Generate inline validation code for single-arg object types\n *\n * This is ~20x faster than schema-based validation because:\n * 1. No schema interpretation at runtime\n * 2. No object iteration\n * 3. JIT can inline the checks\n *\n * Generated code looks like:\n * if (typeof input !== 'object' || input === null ||\n * typeof input.x !== 'number' ||\n * typeof input.y !== 'number') {\n * return __tjs.typeError('funcName.input', 'object', input)\n * }\n */\nexport function generateInlineValidation(\n funcName: string,\n paramName: string,\n shape: Record<string, TypeDescriptor>,\n requiredFields: Set<string>\n): string {\n const checks: string[] = []\n const path = `${funcName}.${paramName}`\n\n // Check it's an object\n checks.push(`typeof ${paramName} !== 'object'`)\n checks.push(`${paramName} === null`)\n\n // Check each field\n for (const [fieldName, fieldType] of Object.entries(shape)) {\n const fieldPath = `${paramName}.${fieldName}`\n const isRequired = requiredFields.has(fieldName)\n\n const typeCheck = generateTypeCheck(fieldPath, fieldType)\n if (typeCheck) {\n if (isRequired) {\n // Required: must exist and have correct type\n checks.push(typeCheck)\n } else {\n // Optional: only check type if defined\n checks.push(`(${fieldPath} !== undefined && ${typeCheck})`)\n }\n }\n }\n\n if (checks.length === 0) return ''\n\n return `if (${checks.join(' || ')}) {\n return __tjs.typeError('${path}', 'object', ${paramName})\n}`\n}\n\n/**\n * Generate a type check expression for a single field\n * Returns null if no check needed (e.g., 'any' type)\n */\n/**\n * Generate a type check expression for a single field\n * Returns an expression that evaluates to true when type is INVALID\n * Returns null if no check needed (e.g., 'any' type)\n */\nfunction generateTypeCheckExpr(\n fieldPath: string,\n type: TypeDescriptor\n): string | null {\n let check: string | null\n\n switch (type.kind) {\n case 'string':\n check = `typeof ${fieldPath} !== 'string'`\n break\n case 'number':\n check = `typeof ${fieldPath} !== 'number'`\n break\n case 'integer':\n check = `(typeof ${fieldPath} !== 'number' || !Number.isInteger(${fieldPath}))`\n break\n case 'non-negative-integer':\n check = `(typeof ${fieldPath} !== 'number' || !Number.isInteger(${fieldPath}) || ${fieldPath} < 0)`\n break\n case 'boolean':\n check = `typeof ${fieldPath} !== 'boolean'`\n break\n case 'null':\n return `${fieldPath} !== null` // nullable doesn't apply to null itself\n case 'undefined':\n return `${fieldPath} !== undefined`\n case 'array':\n check = `!Array.isArray(${fieldPath})`\n break\n case 'object':\n // For nested objects, just check it's an object (deep validation is separate)\n check = `(typeof ${fieldPath} !== 'object' || ${fieldPath} === null || Array.isArray(${fieldPath}))`\n break\n case 'union': {\n const checks = (type as any).members\n .map((m: TypeDescriptor) => generateTypeCheckExpr(fieldPath, m))\n .filter((c: string | null) => c !== null)\n if (checks.length === 0) return null\n check = `(${checks.join(' && ')})`\n break\n }\n case 'any':\n return null // No check needed\n default:\n return null\n }\n\n // If type is nullable, allow null to pass\n if (check && type.nullable) {\n check = `(${fieldPath} !== null && ${check})`\n }\n\n return check\n}\n\n// Alias for backward compatibility with other functions that use this\nconst generateTypeCheck = generateTypeCheckExpr\n\n/**\n * Generate the complete function wrapper with inline validation\n *\n * For destructured object params, this generates:\n *\n * const _original_funcName = funcName\n * funcName = function(__input) {\n * if (typeof __input !== 'object' || __input === null || ...) {\n * return __tjs.typeError('funcName.input', 'object', __input)\n * }\n * return _original_funcName.call(this, __input)\n * }\n *\n * For single named object params, same pattern with the actual param name.\n */\nexport function generateInlineWrapper(\n funcName: string,\n types: TJSTypeInfo,\n safety: SafetyOptions = {}\n): string | null {\n // Check if we can use inline validation\n if (!canUseInlineValidation(types)) return null\n\n // Unsafe functions don't need wrappers\n if (safety.unsafe) return null\n\n // Destructured params: use __input as the wrapper param name\n if (types.isDestructuredParam && types.destructuredShape) {\n const paramName = '__input'\n const shape = types.destructuredShape\n const requiredFields = types.destructuredRequired || new Set()\n\n const validation = generateInlineValidation(\n funcName,\n paramName,\n shape,\n requiredFields\n )\n if (!validation) return null\n\n return `\nconst _original_${funcName} = ${funcName}\n${funcName} = function(${paramName}) {\n ${validation}\n return _original_${funcName}.call(this, ${paramName})\n}\n`.trim()\n }\n\n // Positional params path (primitives or single object param)\n const params = Object.entries(types.params)\n\n // Check if it's a single object param with shape\n if (params.length === 1) {\n const [paramName, param] = params[0]\n if (param.type.kind === 'object' && param.type.shape) {\n // Single named object param\n const shape = param.type.shape\n const requiredFields = new Set<string>()\n for (const [fieldName] of Object.entries(shape)) {\n requiredFields.add(fieldName)\n }\n\n const validation = generateInlineValidation(\n funcName,\n paramName,\n shape,\n requiredFields\n )\n if (!validation) return null\n\n return `\nconst _original_${funcName} = ${funcName}\n${funcName} = function(${paramName}) {\n ${validation}\n return _original_${funcName}.call(this, ${paramName})\n}\n`.trim()\n }\n }\n\n // Generate validation for positional primitive params\n const validation = generatePositionalValidation(funcName, params)\n if (!validation) return null\n\n const paramNames = params.map(([name]) => name).join(', ')\n return `\nconst _original_${funcName} = ${funcName}\n${funcName} = function(${paramNames}) {\n ${validation}\n return _original_${funcName}.call(this, ${paramNames})\n}\n`.trim()\n}\n\n/**\n * Generate validation for positional (primitive) params\n */\nfunction generatePositionalValidation(\n funcName: string,\n params: [string, ParameterDescriptor][]\n): string | null {\n const lines: string[] = []\n\n for (const [paramName, param] of params) {\n const typeCheck = generateTypeCheck(paramName, param.type)\n if (typeCheck) {\n const path = `${funcName}.${paramName}`\n const expectedType = param.type.kind\n if (param.required) {\n lines.push(\n `if (${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${paramName});`\n )\n } else {\n lines.push(\n `if (${paramName} !== undefined && ${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${paramName});`\n )\n }\n }\n }\n\n if (lines.length === 0) return null\n\n return lines.join('\\n ')\n}\n\n// =============================================================================\n// Transpile-time Test Execution\n// =============================================================================\n\n/**\n * Fuzzy comparison for floating point numbers\n */\n", "/**\n * TJS Inline Tests\n *\n * Extracts test blocks from TJS source and generates test runners.\n *\n * Syntax (TJS):\n * test 'description' {\n * assert(condition)\n * expect(a).toBe(b)\n * }\n *\n * test {\n * // Anonymous test\n * }\n *\n * mock {\n * // Setup code that runs before each test\n * }\n *\n * Syntax (TypeScript - embedded in comments):\n * /*test 'description' {\n * expect(add(2, 3)).toBe(5)\n * }* /\n *\n * This syntax survives TypeScript compilation, enabling literate\n * programming for TypeScript: tests live alongside the code they\n * verify, extracted and executed at runtime by TJS.\n *\n * For TS developers who don't care about TJS: you still get inline\n * tests that live with your code, literate development, and faster\n * debug loops. Set `safety none` and keep living in your world.\n *\n * Output:\n * - code: Clean source with tests stripped\n * - tests: Array of extracted test definitions\n * - testRunner: Generated code to execute tests\n */\n\n// Note: parser could be used for more robust test extraction in future\n\nexport interface ExtractedTest {\n description: string\n body: string\n line?: number\n}\n\nexport interface ExtractedMock {\n body: string\n line?: number\n}\n\nexport interface TestExtractionResult {\n /** Source code with tests and mocks removed */\n code: string\n /** Extracted test definitions */\n tests: ExtractedTest[]\n /** Extracted mock/setup blocks */\n mocks: ExtractedMock[]\n /** Generated test runner code */\n testRunner: string\n}\n\n/**\n * Check if a position in source is inside a comment\n */\nfunction isInsideComment(source: string, pos: number): boolean {\n // Check for line comment - scan backwards to start of line\n let lineStart = pos\n while (lineStart > 0 && source[lineStart - 1] !== '\\n') {\n lineStart--\n }\n const lineBeforePos = source.slice(lineStart, pos)\n if (lineBeforePos.includes('//')) {\n return true\n }\n\n // Check for block comment - find last /* and */ before pos\n let i = 0\n let inBlockComment = false\n while (i < pos) {\n if (!inBlockComment && source.slice(i, i + 2) === '/*') {\n inBlockComment = true\n i += 2\n } else if (inBlockComment && source.slice(i, i + 2) === '*/') {\n inBlockComment = false\n i += 2\n } else {\n i++\n }\n }\n return inBlockComment\n}\n\n/**\n * Extract embedded tests from block comments\n *\n * Syntax:\n * /*test 'description' {\n * assert(condition)\n * }* /\n *\n * This allows tests to be embedded in TypeScript files that would\n * otherwise strip out `test {}` blocks during TS compilation.\n */\nfunction extractEmbeddedTests(source: string): ExtractedTest[] {\n const tests: ExtractedTest[] = []\n\n // Match: /*test 'description' { ... }*/ or /*test { ... }*/\n // Each quote type gets its own alternative so the description can contain\n // the other quote types (e.g. `test 'typeof null is \"null\"' {`).\n const embeddedRegex =\n /\\/\\*test\\s+'([^']*)'\\s*\\{([\\s\\S]*?)\\}\\s*\\*\\/|\\/\\*test\\s+\"([^\"]*)\"\\s*\\{([\\s\\S]*?)\\}\\s*\\*\\/|\\/\\*test\\s+`([^`]*)`\\s*\\{([\\s\\S]*?)\\}\\s*\\*\\/|\\/\\*test\\s*\\{([\\s\\S]*?)\\}\\s*\\*\\//g\n\n let match\n while ((match = embeddedRegex.exec(source)) !== null) {\n // Groups: 1/3/5 = description for ' \" ` ; 2/4/6 = body for ' \" ` ; 7 = body for anonymous\n const desc =\n match[1] || match[3] || match[5] || `embedded test ${tests.length + 1}`\n const body = (match[2] || match[4] || match[6] || match[7] || '').trim()\n\n tests.push({\n description: desc,\n body,\n line: getLineNumber(source, match.index),\n })\n }\n\n return tests\n}\n\n/**\n * Extract inline tests from TJS source\n *\n * Note: Signature tests (from -> return types) are handled separately by the\n * transpiler in js.ts. This function only extracts explicit test blocks.\n */\nexport function extractTests(source: string): TestExtractionResult {\n const tests: ExtractedTest[] = []\n const mocks: ExtractedMock[] = []\n\n // First, extract embedded tests from block comments (for TS compatibility)\n // These use syntax: /*test 'description' { ... }*/\n const embeddedTests = extractEmbeddedTests(source)\n tests.push(...embeddedTests)\n\n // Regex to match test blocks - three syntaxes supported:\n // test { ... } (anonymous test)\n // test 'description' { ... } (canonical TJS)\n // test('description') { ... } (also valid - parenthesized string is still a string)\n // Each quote type has its own alternative so the description can contain\n // the other quote types (e.g. `test 'typeof null is \"null\"' {`).\n const testRegex =\n /test\\s+'([^']*)'\\s*\\{|test\\s+\"([^\"]*)\"\\s*\\{|test\\s+`([^`]*)`\\s*\\{|test\\s*\\(\\s*'([^']*)'\\s*\\)\\s*\\{|test\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*\\{|test\\s*\\(\\s*`([^`]*)`\\s*\\)\\s*\\{|test\\s*\\{/g\n const mockRegex = /mock\\s*\\{/g\n\n let cleanCode = source\n let match\n\n // Extract test blocks\n // We need to find matching braces for each test\n const testMatches: Array<{ start: number; end: number; desc: string }> = []\n\n while ((match = testRegex.exec(source)) !== null) {\n const start = match.index\n\n // Skip matches inside comments (but embedded tests were already extracted above)\n if (isInsideComment(source, start)) {\n continue\n }\n\n // Groups 1/2/3 = `test 'desc'` / `test \"desc\"` / `test \\`desc\\``\n // Groups 4/5/6 = parenthesized variants\n // No group when description is omitted\n const desc =\n match[1] ||\n match[2] ||\n match[3] ||\n match[4] ||\n match[5] ||\n match[6] ||\n `test ${tests.length + 1}`\n const bodyStart = match.index + match[0].length\n\n // Find matching closing brace\n const end = findMatchingBrace(source, bodyStart - 1)\n if (end === -1) continue\n\n const body = source.slice(bodyStart, end).trim()\n\n tests.push({\n description: desc,\n body,\n line: getLineNumber(source, start),\n })\n\n testMatches.push({ start, end: end + 1, desc })\n }\n\n // Extract mock blocks\n const mockMatches: Array<{ start: number; end: number }> = []\n\n while ((match = mockRegex.exec(source)) !== null) {\n const start = match.index\n const bodyStart = match.index + match[0].length\n\n const end = findMatchingBrace(source, bodyStart - 1)\n if (end === -1) continue\n\n const body = source.slice(bodyStart, end).trim()\n\n mocks.push({\n body,\n line: getLineNumber(source, start),\n })\n\n mockMatches.push({ start, end: end + 1 })\n }\n\n // Remove test and mock blocks from source (in reverse order to preserve indices)\n const allMatches = [...testMatches, ...mockMatches].sort(\n (a, b) => b.start - a.start\n )\n\n for (const m of allMatches) {\n cleanCode = cleanCode.slice(0, m.start) + cleanCode.slice(m.end)\n }\n\n // Clean up extra whitespace\n cleanCode = cleanCode.replace(/\\n\\s*\\n\\s*\\n/g, '\\n\\n').trim()\n\n // Generate test runner\n const testRunner = generateTestRunner(tests, mocks)\n\n return {\n code: cleanCode,\n tests,\n mocks,\n testRunner,\n }\n}\n\n/**\n * Find the matching closing brace\n */\nfunction findMatchingBrace(source: string, start: number): number {\n let depth = 0\n let inString: string | null = null\n let escaped = false\n\n for (let i = start; i < source.length; i++) {\n const char = source[i]\n\n if (escaped) {\n escaped = false\n continue\n }\n\n if (char === '\\\\') {\n escaped = true\n continue\n }\n\n // Track string state\n if (!inString && (char === '\"' || char === \"'\" || char === '`')) {\n inString = char\n continue\n }\n if (inString === char) {\n inString = null\n continue\n }\n if (inString) continue\n\n // Track braces\n if (char === '{') depth++\n if (char === '}') {\n depth--\n if (depth === 0) return i\n }\n }\n\n return -1\n}\n\n/**\n * Get line number for a position in source\n */\nfunction getLineNumber(source: string, pos: number): number {\n return source.slice(0, pos).split('\\n').length\n}\n\n/**\n * Generate test runner code\n */\nfunction generateTestRunner(\n tests: ExtractedTest[],\n mocks: ExtractedMock[]\n): string {\n if (tests.length === 0) {\n return '// No tests defined'\n }\n\n const mockSetup = mocks.map((m) => m.body).join('\\n')\n\n const testCases = tests\n .map(\n (t, i) => `\n // Test ${i + 1}: ${t.description}\n try {\n ${mockSetup}\n await (async () => {\n ${t.body}\n })()\n __results.push({ description: ${JSON.stringify(\n t.description\n )}, passed: true })\n } catch (__e) {\n __results.push({ description: ${JSON.stringify(\n t.description\n )}, passed: false, error: __e.message })\n }`\n )\n .join('\\n')\n\n // Note: No comment before IIFE - ASI would break `return (async...)` if comment is between\n return `(async () => {\nconst __results = []\n\n${testCases}\n\n// Compute summary (no console output - caller handles reporting)\nconst __passed = __results.filter(r => r.passed).length\nconst __failed = __results.filter(r => !r.passed).length\n\n// Return summary\nreturn { passed: __passed, failed: __failed, results: __results }\n})()`.trim()\n}\n\n/**\n * Test utilities - assert and expect\n * Include this in the runtime or inject it\n */\nexport const assertFunction = `\nfunction assert(condition, message) {\n if (!condition) {\n throw new Error(message || 'Assertion failed')\n }\n}\n`\n\n/**\n * Expect API for richer test assertions\n * Uses deep equality, handles null/undefined correctly\n */\nexport const expectFunction = `\nfunction expect(actual) {\n const deepEqual = (a, b) => {\n if (a === b) return true\n if (a === null || b === null) return a === b\n if (a === undefined || b === undefined) return a === undefined && b === undefined\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return a === b\n if (Array.isArray(a) !== Array.isArray(b)) return false\n if (Array.isArray(a)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => deepEqual(v, b[i]))\n }\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n return keysA.every(k => deepEqual(a[k], b[k]))\n }\n\n const format = (v) => {\n if (v === null) return 'null'\n if (v === undefined) return 'undefined'\n if (typeof v === 'string') return JSON.stringify(v)\n if (typeof v === 'object') return JSON.stringify(v)\n return String(v)\n }\n\n return {\n toBe(expected) {\n if (!deepEqual(actual, expected)) {\n throw new Error(\\`Expected \\${format(expected)} but got \\${format(actual)}\\`)\n }\n },\n toEqual(expected) {\n if (!deepEqual(actual, expected)) {\n throw new Error(\\`Expected \\${format(expected)} but got \\${format(actual)}\\`)\n }\n },\n toContain(item) {\n if (!Array.isArray(actual) || !actual.some(v => deepEqual(v, item))) {\n throw new Error(\\`Expected \\${format(actual)} to contain \\${format(item)}\\`)\n }\n },\n toThrow(message) {\n let threw = false\n let thrownMessage = ''\n try {\n if (typeof actual === 'function') actual()\n } catch (e) {\n threw = true\n thrownMessage = e.message || String(e)\n }\n if (!threw) {\n throw new Error('Expected function to throw but it did not')\n }\n if (message && !thrownMessage.includes(message)) {\n throw new Error(\\`Expected error containing \"\\${message}\" but got \"\\${thrownMessage}\"\\`)\n }\n },\n toBeTruthy() {\n if (!actual) {\n throw new Error(\\`Expected \\${format(actual)} to be truthy\\`)\n }\n },\n toBeFalsy() {\n if (actual) {\n throw new Error(\\`Expected \\${format(actual)} to be falsy\\`)\n }\n },\n toBeNull() {\n if (actual !== null) {\n throw new Error(\\`Expected null but got \\${format(actual)}\\`)\n }\n },\n toBeUndefined() {\n if (actual !== undefined) {\n throw new Error(\\`Expected undefined but got \\${format(actual)}\\`)\n }\n },\n toBeGreaterThan(n) {\n if (!(actual > n)) {\n throw new Error(\\`Expected \\${format(actual)} to be greater than \\${n}\\`)\n }\n },\n toBeLessThan(n) {\n if (!(actual < n)) {\n throw new Error(\\`Expected \\${format(actual)} to be less than \\${n}\\`)\n }\n }\n }\n}\n`\n\n/**\n * Combined test utilities (assert + expect)\n */\nexport const testUtils = assertFunction + '\\n' + expectFunction\n\n/**\n * Questions/Notes:\n *\n * Q1: Should mocks be scoped per-test or shared?\n * Current: Each test runs all mocks before executing\n *\n * Q2: Should we support test.only / test.skip?\n * Easy to add with syntax: test.only('...') { } or test.skip('...') { }\n *\n * Q3: Integration with playground?\n * Playground could run extractTests() and show test results in a panel\n *\n * Q4: DOM tests - test.browser('desc') { }?\n * SHELVED: Plan is to run tests in actual browser (playground)\n * Happy-DOM is ~1MB packed, too heavy to bundle\n * If needed later: lazy-load happy-dom only for Node/Bun DOM tests\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 /** Why the check failed (from predicate reason strings) */\n readonly reason?: string\n\n constructor(\n message: string,\n path: string,\n expected?: string,\n actual?: string,\n callStack?: string[],\n reason?: 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 this.reason = reason\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 reason?: string\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 msg = reason\n ? `Expected ${expected} for '${path}': ${reason}`\n : `Expected ${expected} for '${path}', got ${actual}`\n const err = new MonadicError(msg, path, expected, actual, stack, reason)\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 /** Why the check failed (from predicate reason strings) */\n reason?: 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:\n | string\n | { check: (v: unknown) => boolean | string; 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 const result = expected.check(value)\n if (result === true) return null\n const reason = typeof result === 'string' ? result : undefined\n const msg = reason\n ? `Expected ${expected.description} for '${path}': ${reason}`\n : `Expected ${expected.description} but got ${typeOf(value)}`\n return error(msg, {\n path,\n expected: expected.description,\n actual: typeOf(value),\n reason,\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 =\n | string\n | { check: (v: unknown) => boolean | string; 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. Returns true on pass, false on fail, or a reason string on fail. */\n check(value: unknown): boolean | string\n /** The underlying schema (if schema-based) */\n readonly schema?: Schema\n /** The predicate function (if predicate-based). May return a reason string on failure. */\n readonly predicate?: (value: unknown) => boolean | string\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 | string)\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 | string) | 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 (\n value: unknown\n ) => boolean | string\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 // Returns true on pass, false on fail, or a reason string on fail\n const check = (value: unknown): boolean | string => {\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>('string', (v: unknown) => {\n if (typeof v === 'string') return true\n return `expected string, got ${v === null ? 'null' : typeof v}`\n})\n\n/** Number type */\nexport const TNumber = Type<number>('number', (v: unknown) => {\n if (typeof v === 'number') return true\n return `expected number, got ${v === null ? 'null' : typeof v}`\n})\n\n/** Boolean type */\nexport const TBoolean = Type<boolean>('boolean', (v: unknown) => {\n if (typeof v === 'boolean') return true\n return `expected boolean, got ${v === null ? 'null' : typeof v}`\n})\n\n/** Integer type */\nexport const TInteger = Type<number>('integer', (v: unknown) => {\n if (typeof v !== 'number')\n return `expected integer, got ${v === null ? 'null' : typeof v}`\n if (!Number.isInteger(v)) return `${v} is not an integer`\n return true\n})\n\n/** Positive integer type */\nexport const TPositiveInt = Type<number>('positive integer', (v: unknown) => {\n if (typeof v !== 'number')\n return `expected positive integer, got ${v === null ? 'null' : typeof v}`\n if (!Number.isInteger(v)) return `${v} is not an integer`\n if (v <= 0) return `${v} is not positive`\n return true\n})\n\n/** Non-empty string type */\nexport const TNonEmptyString = Type<string>(\n 'non-empty string',\n (v: unknown) => {\n if (typeof v !== 'string')\n return `expected string, got ${v === null ? 'null' : typeof v}`\n if (v.length === 0) return 'string is empty'\n return true\n }\n)\n\n/** Email type (basic validation) */\nexport const TEmail = Type<string>('email address', (v: unknown) => {\n if (typeof v !== 'string')\n return `expected string, got ${v === null ? 'null' : typeof v}`\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v))\n return `\"${v}\" is not a valid email`\n return true\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>('URL', (v: unknown) => {\n if (typeof v !== 'string')\n return `expected string, got ${v === null ? 'null' : typeof v}`\n if (!isValidUrl(v)) return `\"${v}\" is not a valid URL`\n return true\n})\n\n/** UUID type */\nexport const TUuid = Type<string>('UUID', (v: unknown) => {\n if (typeof v !== 'string')\n return `expected string, got ${v === null ? 'null' : typeof v}`\n if (\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 return `\"${v}\" is not a valid UUID`\n return true\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) === true\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) === true\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) =>\n types.some((t) => t.check(v) === true)\n )\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) =>\n Array.isArray(v) && v.every((item) => itemType.check(item) === true)\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) === true\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 check: (value: unknown): boolean | string => {\n if (typeof value !== 'function')\n return `expected function, got ${\n value === null ? 'null' : typeof value\n }`\n\n // Structural validation: check arity and __tjs metadata\n const expectedArity = Object.keys(params).length\n if (expectedArity > 0) {\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)\n return `expected ${expectedArity} params, got ${metaParamCount}`\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 `param '${expectedKeys[i]}' expected ${expectedKind}, got ${metaInfo.type.kind}`\n }\n }\n }\n }\n\n return true\n },\n __runtimeType: true as const,\n }\n\n return fpType\n}\n", "/**\n * TJS Test Execution\n *\n * Handles transpile-time test execution, signature validation, and test utilities.\n */\n\nimport { transformExtensionCalls } from '../parser'\nimport { installRuntime } from '../runtime'\nimport type { TypeDescriptor } from '../types'\nimport type { ExtractedTest, ExtractedMock } from '../tests'\n\nexport interface TestResult {\n /** Test description */\n description: string\n /** Whether the test passed */\n passed: boolean\n /** Error message if failed */\n error?: string\n /** Whether this was an implicit signature test */\n isSignatureTest?: boolean\n /** Source line number (1-indexed) where the test or error occurred */\n line?: number\n /** Source column number (1-indexed) */\n column?: number\n}\n\nfunction fuzzyEqual(a: unknown, b: unknown, epsilon = 1e-9): boolean {\n if (a === b) return true\n if (typeof a === 'number' && typeof b === 'number') {\n // Check if either is non-integer (float)\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n const diff = Math.abs(a - b)\n const maxAbs = Math.max(Math.abs(a), Math.abs(b), 1)\n return diff / maxAbs < epsilon\n }\n }\n return false\n}\n\n/**\n * Deep equality check with fuzzy float comparison\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n // NaN === NaN is false in JS, but NaN should equal NaN in tests\n if (\n typeof a === 'number' &&\n typeof b === 'number' &&\n Number.isNaN(a) &&\n Number.isNaN(b)\n )\n return true\n if (fuzzyEqual(a, b)) return true\n if (a === null || b === null) return a === b\n if (a === undefined || b === undefined) return a === b\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return false\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => deepEqual(v, b[i]))\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\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) => deepEqual((a as any)[k], (b as any)[k]))\n}\n\n/**\n * Check if a value matches an expected type pattern (from example value)\n * Unlike deepEqual, this checks TYPE compatibility, not value equality.\n *\n * Example patterns:\n * 0 matches any number\n * \"\" matches any string\n * true matches any boolean\n * null matches null\n * [] matches any array\n * [0] matches array of numbers\n * {name: \"\", age: 0} matches object with string name and number age\n */\nfunction typeMatches(\n actual: unknown,\n pattern: unknown,\n path = ''\n): { matches: boolean; error?: string } {\n // null pattern matches null\n if (pattern === null) {\n if (actual === null) return { matches: true }\n return {\n matches: false,\n error: `Expected null at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n // undefined pattern matches undefined\n if (pattern === undefined) {\n if (actual === undefined) return { matches: true }\n return {\n matches: false,\n error: `Expected undefined at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n // Primitive types - check type only (used by :? runtime validation)\n if (typeof pattern === 'number') {\n if (typeof actual === 'number') return { matches: true }\n return {\n matches: false,\n error: `Expected number at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n if (typeof pattern === 'string') {\n if (typeof actual === 'string') return { matches: true }\n return {\n matches: false,\n error: `Expected string at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n if (typeof pattern === 'boolean') {\n if (typeof actual === 'boolean') return { matches: true }\n return {\n matches: false,\n error: `Expected boolean at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n // Arrays\n if (Array.isArray(pattern)) {\n if (!Array.isArray(actual)) {\n return {\n matches: false,\n error: `Expected array at '${path}', got ${typeOf(actual)}`,\n }\n }\n // Empty array pattern matches any array\n if (pattern.length === 0) return { matches: true }\n // Non-empty array pattern: check each element against first pattern element\n const elementPattern = pattern[0]\n for (let i = 0; i < actual.length; i++) {\n const result = typeMatches(actual[i], elementPattern, `${path}[${i}]`)\n if (!result.matches) return result\n }\n return { matches: true }\n }\n\n // Objects\n if (typeof pattern === 'object' && pattern !== null) {\n if (\n typeof actual !== 'object' ||\n actual === null ||\n Array.isArray(actual)\n ) {\n return {\n matches: false,\n error: `Expected object at '${path}', got ${typeOf(actual)}`,\n }\n }\n // Check all pattern keys exist and match types\n for (const key of Object.keys(pattern)) {\n const keyPath = path ? `${path}.${key}` : key\n if (!(key in actual)) {\n return { matches: false, error: `Missing property '${keyPath}'` }\n }\n const result = typeMatches(\n (actual as any)[key],\n (pattern as any)[key],\n keyPath\n )\n if (!result.matches) return result\n }\n return { matches: true }\n }\n\n // Fallback: exact equality\n if (actual === pattern) return { matches: true }\n return { matches: false, error: `Type mismatch at '${path}'` }\n}\n\n/**\n * Get a human-readable type description\n */\nfunction typeOf(v: unknown): string {\n if (v === null) return 'null'\n if (v === undefined) return 'undefined'\n if (Array.isArray(v)) return 'array'\n return typeof v\n}\n\n/**\n * Format a value for error messages - uses cleaner object notation\n * Multi-line for objects with 3+ properties\n */\nfunction formatValue(v: unknown, indent = 0): string {\n if (v === null) return 'null'\n if (v === undefined) return 'undefined'\n if (typeof v === 'string') return JSON.stringify(v)\n if (typeof v === 'number') return String(v)\n if (typeof v === 'boolean') return String(v)\n if (Array.isArray(v)) {\n if (v.length === 0) return '[]'\n if (v.length <= 3)\n return `[${v.map((x) => formatValue(x, indent)).join(', ')}]`\n return `[${v\n .slice(0, 3)\n .map((x) => formatValue(x, indent))\n .join(', ')}, ...]`\n }\n if (typeof v === 'object') {\n const entries = Object.entries(v)\n if (entries.length === 0) return '{}'\n\n const formatKey = (k: string) =>\n /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(k) ? k : JSON.stringify(k)\n\n // Single line for 1-2 properties\n if (entries.length <= 2) {\n const formatted = entries\n .map(([k, val]) => `${formatKey(k)}: ${formatValue(val, indent)}`)\n .join(', ')\n return `{${formatted}}`\n }\n\n // Multi-line for 3+ properties\n const pad = ' '.repeat(indent + 1)\n const closePad = ' '.repeat(indent)\n const formatted = entries\n .slice(0, 8)\n .map(\n ([k, val]) => `${pad}${formatKey(k)}: ${formatValue(val, indent + 1)}`\n )\n .join(',\\n')\n const suffix = entries.length > 8 ? `,\\n${pad}...` : ''\n return `{\\n${formatted}${suffix}\\n${closePad}}`\n }\n return String(v)\n}\n\n/**\n * Strip comments from source code\n * Used to avoid matching code patterns inside comments\n */\nfunction stripComments(code: string): string {\n // Replace block comments with equivalent whitespace (preserve line numbers)\n let result = code.replace(/\\/\\*[\\s\\S]*?\\*\\//g, (match) => {\n // Replace with same number of newlines to preserve line numbers\n const newlines = match.split('\\n').length - 1\n return '\\n'.repeat(newlines)\n })\n\n // Replace line comments\n result = result.replace(/\\/\\/[^\\n]*/g, '')\n\n return result\n}\n\n/**\n * Strip import/export syntax for test execution context\n * Tests run in new Function() which doesn't support ES modules\n *\n * Useful for:\n * - Running tests in new Function() context\n * - CLI test runners\n * - Bundler plugins that need to extract module code\n */\nexport function stripModuleSyntax(code: string): string {\n // Remove import statements (entire line)\n let result = code.replace(/^import\\s+.*?from\\s+['\"][^'\"]+['\"];?\\s*$/gm, '')\n result = result.replace(/^import\\s+['\"][^'\"]+['\"];?\\s*$/gm, '')\n\n // Remove 'export ' keyword but keep the declaration\n result = result.replace(/^export\\s+default\\s+/gm, '')\n result = result.replace(/^export\\s+/gm, '')\n\n // Strip top-level await (not inside functions) \u2014 incompatible with new Function()\n // Match lines that start with await or \"const/let/var x = await ...\"\n result = result.replace(\n /^(\\s*)((?:const|let|var)\\s+\\w+\\s*=\\s*)?await\\s+.+$/gm,\n '$1/* top-level await removed for test execution */'\n )\n\n return result\n}\n\n/**\n * Strip the __tjs runtime preamble from transpiled code\n * This is needed when injecting resolved imports into a test context\n * that already has its own __tjs stub\n *\n * Useful for:\n * - Combining multiple TJS modules into a single execution context\n * - Test runners that provide their own __tjs runtime\n * - Bundlers that need to deduplicate runtime setup\n */\nexport function stripTjsPreamble(code: string): string {\n // Remove the __tjs runtime setup lines:\n // const __tjs = globalThis.__tjs?.createRuntime?.() ?? globalThis.__tjs;\n // const { Is, IsNot, Eq, NotEq } = __tjs ?? {};\n let result = code.replace(\n /^const __tjs = globalThis\\.__tjs\\?\\.createRuntime\\?\\.\\(\\) \\?\\? globalThis\\.__tjs;\\n?/m,\n ''\n )\n result = result.replace(/^const \\{ [\\w, ]+ \\} = __tjs \\?\\? \\{\\};\\n?/m, '')\n return result\n}\n\n/**\n * Build code to inject resolved imports into test execution context\n *\n * Takes a map of module specifier -> compiled code and returns code that\n * makes those exports available in the test scope.\n *\n * For example, if resolvedImports contains:\n * { 'mymath': 'function add(a, b) { return a + b }\\nadd.__tjs = {...}' }\n *\n * This will return code that evaluates that module and makes `add` available.\n */\nfunction buildResolvedImportsCode(\n resolvedImports: Record<string, string>\n): string {\n if (Object.keys(resolvedImports).length === 0) {\n return ''\n }\n\n const lines: string[] = []\n\n for (const [specifier, moduleCode] of Object.entries(resolvedImports)) {\n // Strip module syntax from the imported code too (it may have exports)\n const cleanCode = stripModuleSyntax(moduleCode)\n\n lines.push(`// Resolved import: ${specifier}`)\n lines.push(cleanCode)\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Parse a return type example that may contain `key = defaultValue` syntax.\n * Transforms `{ value: 0, error = '' }` into valid JS `{ value: 0, error: '' }`\n * and extracts the default values for optional keys.\n */\nfunction parseReturnExample(\n str: string\n): { pattern: unknown; defaults: Record<string, unknown> } | null {\n const defaults: Record<string, unknown> = {}\n\n // Only process objects that might contain = syntax\n const trimmed = str.trim()\n if (!trimmed.startsWith('{') || !trimmed.includes('=')) {\n try {\n return { pattern: new Function(`return ${str}`)(), defaults }\n } catch {\n return null\n }\n }\n\n // Transform top-level `key = value` to `key: value` and track defaults\n // Walk the string respecting nesting depth\n let transformed = ''\n let depth = 0\n let i = 0\n\n while (i < trimmed.length) {\n const ch = trimmed[i]\n\n if (ch === '{' || ch === '[' || ch === '(') {\n depth++\n transformed += ch\n i++\n } else if (ch === '}' || ch === ']' || ch === ')') {\n depth--\n transformed += ch\n i++\n } else if (ch === \"'\" || ch === '\"' || ch === '`') {\n // Skip string literals\n const quote = ch\n transformed += ch\n i++\n while (i < trimmed.length && trimmed[i] !== quote) {\n if (trimmed[i] === '\\\\') {\n transformed += trimmed[i++]\n }\n transformed += trimmed[i++]\n }\n if (i < trimmed.length) {\n transformed += trimmed[i++]\n }\n } else if (depth === 1 && ch === '=') {\n // Top-level `key = value` \u2014 look back for the key name\n const beforeEq = transformed.slice(transformed.lastIndexOf('{') + 1)\n const lastSegment = beforeEq.split(',').pop() || ''\n const keyMatch = lastSegment.match(/\\s*(\\w+)\\s*$/)\n if (keyMatch) {\n // Find the value after =\n let j = i + 1\n while (j < trimmed.length && /\\s/.test(trimmed[j])) j++\n\n // Extract value (up to , or } at depth 1)\n let valStr = ''\n let valDepth = 0\n while (j < trimmed.length) {\n const vc = trimmed[j]\n if (vc === '{' || vc === '[' || vc === '(') valDepth++\n else if (vc === '}' || vc === ']' || vc === ')') {\n if (valDepth === 0) break\n valDepth--\n } else if (vc === ',' && valDepth === 0) break\n valStr += vc\n j++\n }\n\n try {\n defaults[keyMatch[1]] = new Function(`return ${valStr.trim()}`)()\n } catch {\n // Can't parse default, skip\n }\n\n // Replace = with : in output\n transformed += ':'\n i++\n continue\n }\n transformed += ch\n i++\n } else {\n transformed += ch\n i++\n }\n }\n\n try {\n return { pattern: new Function(`return ${transformed}`)(), defaults }\n } catch {\n return null\n }\n}\n\n/**\n * Info about a signature test (extracted but not yet executed)\n */\ninterface SignatureTestInfo {\n funcName: string\n args: unknown[]\n expected: unknown\n defaults?: Record<string, unknown>\n line: number\n isAsync?: boolean\n /** For class method tests: the class name */\n className?: string\n /** For class method tests: args to pass to the first constructor */\n constructorArgs?: unknown[]\n}\n\n/**\n * Extract signature test info from source without executing\n */\nexport function extractSignatureTestInfos(\n originalSource: string\n): SignatureTestInfo[] {\n const infos: SignatureTestInfo[] = []\n\n // Strip comments to avoid matching functions inside doc comments/code examples\n const sourceWithoutComments = stripComments(originalSource)\n\n // Match function declarations with return type marker (: or :?)\n // Skip :! which means \"don't test\"\n // Pattern: [async] function name(params): returnExample {\n const funcRegex = /(async\\s+)?function\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*(:[?!]?)\\s*/g\n\n let match\n while ((match = funcRegex.exec(sourceWithoutComments)) !== null) {\n const isAsync = !!match[1]\n const funcName = match[2]\n const paramsStr = match[3]\n const returnMarker = match[4]\n\n // Calculate line number from match position in stripped source\n const lineNumber = sourceWithoutComments\n .slice(0, match.index)\n .split('\\n').length\n\n // :! means skip test\n if (returnMarker === ':!') continue\n\n // Extract return example - handle nested braces/brackets\n const afterMarker = sourceWithoutComments.slice(\n match.index + match[0].length\n )\n const returnExample = extractReturnExampleFromSource(afterMarker)\n if (!returnExample) continue\n\n // Extract parameter examples\n const paramExamples = extractParamExamples(paramsStr)\n if (paramsStr.trim() && paramExamples.length === 0) continue\n\n try {\n // Parse expected value (with optional default keys) and args\n const parsed = parseReturnExample(returnExample)\n if (!parsed) continue\n\n const args = paramExamples.map((p) => new Function(`return ${p}`)())\n\n infos.push({\n funcName,\n args,\n expected: parsed.pattern,\n defaults:\n Object.keys(parsed.defaults).length > 0 ? parsed.defaults : undefined,\n line: lineNumber,\n isAsync,\n })\n } catch {\n // Skip if parsing fails - will be reported as error during execution\n }\n }\n\n // Extract class method signature tests\n // Find class declarations and their first constructor's params,\n // then find methods with return type markers (: or :?)\n const classRegex = /class\\s+(\\w+)(?:\\s+extends\\s+\\w+)?\\s*\\{/g\n let classMatch\n while ((classMatch = classRegex.exec(sourceWithoutComments)) !== null) {\n const className = classMatch[1]\n const classBodyStart = classMatch.index + classMatch[0].length\n\n // Find the matching closing brace for the class body\n let braceDepth = 1\n let classBodyEnd = classBodyStart\n for (let i = classBodyStart; i < sourceWithoutComments.length; i++) {\n if (sourceWithoutComments[i] === '{') braceDepth++\n else if (sourceWithoutComments[i] === '}') {\n braceDepth--\n if (braceDepth === 0) {\n classBodyEnd = i\n break\n }\n }\n }\n const classBody = sourceWithoutComments.slice(classBodyStart, classBodyEnd)\n\n // Find the first constructor's params\n const ctorRegex = /constructor\\s*\\(([^)]*)\\)/\n const ctorMatch = ctorRegex.exec(classBody)\n if (!ctorMatch) continue\n\n const ctorParamsStr = ctorMatch[1]\n const ctorParamExamples = extractParamExamples(ctorParamsStr)\n if (ctorParamsStr.trim() && ctorParamExamples.length === 0) continue\n\n let ctorArgs: unknown[]\n try {\n ctorArgs = ctorParamExamples.map((p) => new Function(`return ${p}`)())\n } catch {\n continue\n }\n\n // Find methods with return type markers inside the class body\n const methodRegex = /(async\\s+)?(\\w+)\\s*\\(([^)]*)\\)\\s*(:[?!]?)\\s*/g\n let methodMatch\n while ((methodMatch = methodRegex.exec(classBody)) !== null) {\n const methodName = methodMatch[2]\n // Skip constructors and special names\n if (methodName === 'constructor') continue\n\n const isAsync = !!methodMatch[1]\n const paramsStr = methodMatch[3]\n const returnMarker = methodMatch[4]\n\n if (returnMarker === ':!') continue\n\n // Calculate line number from position in original source\n const methodPosInSource = classBodyStart + methodMatch.index\n const lineNumber = sourceWithoutComments\n .slice(0, methodPosInSource)\n .split('\\n').length\n\n const afterMarker = classBody.slice(\n methodMatch.index + methodMatch[0].length\n )\n const returnExample = extractReturnExampleFromSource(afterMarker)\n if (!returnExample) continue\n\n const paramExamples = extractParamExamples(paramsStr)\n if (paramsStr.trim() && paramExamples.length === 0) continue\n\n try {\n const parsed = parseReturnExample(returnExample)\n if (!parsed) continue\n\n const args = paramExamples.map((p) => new Function(`return ${p}`)())\n\n infos.push({\n funcName: methodName,\n args,\n expected: parsed.pattern,\n defaults:\n Object.keys(parsed.defaults).length > 0\n ? parsed.defaults\n : undefined,\n line: lineNumber,\n isAsync,\n className,\n constructorArgs: ctorArgs,\n })\n } catch {\n // Skip if parsing fails\n }\n }\n }\n\n return infos\n}\n\n/**\n * Run all tests (explicit blocks + signature tests) in a single execution context\n * This executes the module only once, then runs all tests against that context\n */\nexport function runAllTests(\n tests: ExtractedTest[],\n mocks: ExtractedMock[],\n sigTestInfos: SignatureTestInfo[],\n transpiledCode: string,\n resolvedImports: Record<string, string> = {},\n extensions: Map<string, Set<string>> = new Map()\n): TestResult[] {\n const results: TestResult[] = []\n\n // If no tests at all, return empty\n if (tests.length === 0 && sigTestInfos.length === 0) {\n return results\n }\n\n // Detect unresolved imports \u2014 imports in source that aren't in resolvedImports\n const importSpecifiers =\n transpiledCode.match(/^import\\s+.*?from\\s+['\"]([^'\"]+)['\"];?\\s*$/gm) || []\n const hasUnresolvedImports =\n importSpecifiers.length > 0 &&\n importSpecifiers.some((imp) => {\n const match = imp.match(/from\\s+['\"]([^'\"]+)['\"]/)\n return match && !(match[1] in resolvedImports)\n })\n\n // Strip import/export for test execution (can't use modules in new Function)\n const executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n // Real runtime installed via installRuntime() \u2014 preamble finds it via globalThis.__tjs\n\n // Build resolved imports code - inject imported module code into execution context\n const importedCode = buildResolvedImportsCode(resolvedImports)\n\n // Build mock setup\n const mockSetup = mocks.map((m) => m.body).join('\\n')\n\n // Test bodies may reference Is/IsNot/Eq/NotEq/TypeOf \u2014 these come from the\n // == / != / typeof source-level transforms applied to test bodies in js.ts.\n // The module's own destructuring may not include them (if the module never\n // uses ==), so each test block re-destructures into its own block scope.\n const testRuntimeImports = `const { Is, IsNot, Eq, NotEq, TypeOf } = globalThis.__tjs ?? {};`\n\n // Build test execution code that runs all tests in sequence\n const testBodies = tests\n .map((t, i) => {\n // Apply extension call rewriting to test body if extensions exist\n const body =\n extensions.size > 0\n ? transformExtensionCalls(t.body, extensions)\n : t.body\n return `\n // Test ${i}: ${t.description}\n try {\n ${testRuntimeImports}\n ${body}\n __testResults.push({ idx: ${i}, passed: true });\n } catch (e) {\n __testResults.push({ idx: ${i}, passed: false, error: e.message || String(e) });\n }\n `\n })\n .join('\\n')\n\n // Filter out async functions \u2014 can't be tested synchronously at transpile time\n // Users should test async functions with explicit test blocks instead\n const syncSigTestInfos = sigTestInfos.filter((info) => !info.isAsync)\n const asyncSigTestInfos = sigTestInfos.filter((info) => info.isAsync)\n\n // Build signature test execution code\n const sigTestBodies = syncSigTestInfos\n .map((info, i) => {\n const testLabel = info.className\n ? `${info.className}.${info.funcName}`\n : info.funcName\n const callExpr = info.className\n ? `new ${info.className}(${(info.constructorArgs || [])\n .map((a) => JSON.stringify(a))\n .join(', ')}).${info.funcName}(${info.args\n .map((a) => JSON.stringify(a))\n .join(', ')})`\n : `${info.funcName}(${info.args\n .map((a) => JSON.stringify(a))\n .join(', ')})`\n return `\n // Signature test ${i}: ${testLabel}\n try {\n let __actual = ${callExpr};\n const __expected = ${JSON.stringify(info.expected)};${\n info.defaults\n ? `\n const __defaults = ${JSON.stringify(info.defaults)};\n if (typeof __actual === 'object' && __actual !== null) __actual = Object.assign({}, __defaults, __actual);`\n : ''\n }\n if (__deepEqual(__actual, __expected)) {\n __sigTestResults.push({ idx: ${i}, passed: true });\n } else {\n __sigTestResults.push({ idx: ${i}, passed: false, error: 'Expected ' + __format(__expected) + ' at \\\\'${testLabel}\\\\', got ' + __format(__actual) });\n }\n } catch (e) {\n __sigTestResults.push({ idx: ${i}, passed: false, error: e.message || String(e) });\n }\n `\n })\n .join('\\n')\n\n // Install real TJS runtime for test execution\n installRuntime()\n\n const tjsStub = `\n const __saved_tjs = globalThis.__tjs;\n `\n const tjsRestore = `globalThis.__tjs = __saved_tjs;`\n\n // Combined test code - execute module ONCE, then run all tests\n const testCode = `\n ${tjsStub}\n const __testResults = [];\n const __sigTestResults = [];\n try {\n // Test assertions\n function assert(condition, message) {\n if (!condition) throw new Error(message || 'Assertion failed')\n }\n\n function expect(actual) {\n return {\n toBe(expected) {\n if (!__deepEqual(actual, expected)) {\n throw new Error('Expected ' + __format(expected) + ' but got ' + __format(actual))\n }\n },\n toEqual(expected) {\n if (!__deepEqual(actual, expected)) {\n throw new Error('Expected ' + __format(expected) + ' but got ' + __format(actual))\n }\n },\n toContain(item) {\n if (!Array.isArray(actual) || !actual.some(function(v) { return __deepEqual(v, item) })) {\n throw new Error('Expected ' + __format(actual) + ' to contain ' + __format(item))\n }\n },\n toBeTruthy() {\n if (!actual) {\n throw new Error('Expected ' + __format(actual) + ' to be truthy')\n }\n },\n toBeFalsy() {\n if (actual) {\n throw new Error('Expected ' + __format(actual) + ' to be falsy')\n }\n },\n toBeNull() {\n if (actual !== null) {\n throw new Error('Expected null but got ' + __format(actual))\n }\n },\n toBeUndefined() {\n if (actual !== undefined) {\n throw new Error('Expected undefined but got ' + __format(actual))\n }\n },\n toBeGreaterThan(n) {\n if (!(actual > n)) {\n throw new Error('Expected ' + __format(actual) + ' to be greater than ' + n)\n }\n },\n toBeLessThan(n) {\n if (!(actual < n)) {\n throw new Error('Expected ' + __format(actual) + ' to be less than ' + n)\n }\n },\n toBeNaN() {\n if (typeof actual !== 'number' || !Number.isNaN(actual)) {\n throw new Error('Expected NaN but got ' + __format(actual))\n }\n }\n }\n }\n\n // Inject resolved imports first (they may be dependencies)\n ${importedCode}\n\n // Execute the module code ONCE\n ${executableCode}\n ${mockSetup}\n\n // Run explicit test blocks\n ${testBodies}\n\n // Run signature tests\n ${sigTestBodies}\n\n } finally {\n ${tjsRestore}\n }\n return { testResults: __testResults, sigTestResults: __sigTestResults };\n `\n\n try {\n // Execute all tests\n const fn = new Function(\n '__deepEqual',\n '__format',\n '__typeMatches',\n testCode\n )\n const { testResults: blockResults, sigTestResults } = fn(\n deepEqual,\n formatValue,\n typeMatches\n )\n\n // Map block test results\n for (const r of blockResults) {\n const test = tests[r.idx]\n // Skip block tests that fail due to unresolved imports\n const isImportError =\n hasUnresolvedImports &&\n !r.passed &&\n r.error &&\n /is not defined$/.test(r.error)\n results.push({\n description: test.description,\n passed: isImportError ? true : r.passed,\n error: isImportError ? undefined : r.error,\n line: test.line,\n })\n }\n\n // Map signature test results\n for (const r of sigTestResults) {\n const info = syncSigTestInfos[r.idx]\n // Skip signature tests that fail due to unresolved imports\n const isImportError =\n hasUnresolvedImports &&\n !r.passed &&\n r.error &&\n /is not defined$/.test(r.error)\n const label = info.className\n ? `${info.className}.${info.funcName}`\n : info.funcName\n results.push({\n description: `${label} signature example`,\n passed: isImportError ? true : r.passed,\n error: isImportError ? undefined : r.error,\n isSignatureTest: true,\n line: info.line,\n })\n }\n } catch (e: any) {\n // If module fails due to unresolved imports (ReferenceError from stripped imports),\n // skip tests gracefully rather than marking them as failures\n const isUnresolvedRef = hasUnresolvedImports && e instanceof ReferenceError\n\n for (const test of tests) {\n results.push({\n description: test.description,\n passed: isUnresolvedRef,\n error: isUnresolvedRef\n ? undefined\n : `Module execution failed: ${e.message}`,\n line: test.line,\n })\n }\n for (const info of syncSigTestInfos) {\n const label = info.className\n ? `${info.className}.${info.funcName}`\n : info.funcName\n results.push({\n description: `${label} signature example`,\n passed: isUnresolvedRef,\n error: isUnresolvedRef\n ? undefined\n : `Module execution failed: ${e.message}`,\n isSignatureTest: true,\n line: info.line,\n })\n }\n }\n\n // Add skipped results for async signature tests\n for (const info of asyncSigTestInfos) {\n const label = info.className\n ? `${info.className}.${info.funcName}`\n : info.funcName\n results.push({\n description: `${label} signature example`,\n passed: true,\n isSignatureTest: true,\n line: info.line,\n })\n }\n\n return results\n}\n\n/**\n * Run extracted test blocks at transpile time\n * @deprecated Use runAllTests instead for single execution context\n */\nfunction runTestBlocks(\n tests: ExtractedTest[],\n mocks: ExtractedMock[],\n transpiledCode: string,\n resolvedImports: Record<string, string> = {}\n): TestResult[] {\n const results: TestResult[] = []\n\n // Strip import/export for test execution (can't use modules in new Function)\n const executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n // Real runtime installed via installRuntime() \u2014 preamble finds it via globalThis.__tjs\n\n // Build resolved imports code - inject imported module code into execution context\n const importedCode = buildResolvedImportsCode(resolvedImports)\n\n // Build execution context with the transpiled function\n const mockSetup = mocks.map((m) => m.body).join('\\n')\n\n for (const test of tests) {\n try {\n // Create a function that runs the test\n // Always provide a clean __tjs stub for isolated test execution\n // Save and restore globalThis.__tjs to prevent pollution\n const tjsStub = `\n const __saved_tjs = globalThis.__tjs;\n class __MonadicError extends Error { constructor(m,p,e,a,c){super(m);this.name='MonadicError';this.path=p;this.expected=e;this.actual=a;this.callStack=c;} }\n const __stub_tjs = { version: '0.0.0', MonadicError: __MonadicError, pushStack: () => {}, popStack: () => {}, getStack: () => [], typeError: (path, expected, value) => new __MonadicError(\\`Type error at \\${path}: expected \\${expected}\\`, path, expected, typeof value), createRuntime: function() { return this; } };\n globalThis.__tjs = __stub_tjs;\n `\n const tjsRestore = `globalThis.__tjs = __saved_tjs;`\n const testCode = `\n ${tjsStub}\n try {\n // Inject resolved imports first (they may be dependencies)\n ${importedCode}\n ${executableCode}\n ${mockSetup}\n\n // Test assertions\n function assert(condition, message) {\n if (!condition) throw new Error(message || 'Assertion failed')\n }\n\n function expect(actual) {\n return {\n toBe(expected) {\n if (!__deepEqual(actual, expected)) {\n throw new Error('Expected ' + __format(expected) + ' but got ' + __format(actual))\n }\n },\n toEqual(expected) {\n if (!__deepEqual(actual, expected)) {\n throw new Error('Expected ' + __format(expected) + ' but got ' + __format(actual))\n }\n },\n toContain(item) {\n if (!Array.isArray(actual) || !actual.some(function(v) { return __deepEqual(v, item) })) {\n throw new Error('Expected ' + __format(actual) + ' to contain ' + __format(item))\n }\n },\n toBeTruthy() {\n if (!actual) {\n throw new Error('Expected ' + __format(actual) + ' to be truthy')\n }\n },\n toBeFalsy() {\n if (actual) {\n throw new Error('Expected ' + __format(actual) + ' to be falsy')\n }\n },\n toBeNull() {\n if (actual !== null) {\n throw new Error('Expected null but got ' + __format(actual))\n }\n },\n toBeUndefined() {\n if (actual !== undefined) {\n throw new Error('Expected undefined but got ' + __format(actual))\n }\n },\n toBeGreaterThan(n) {\n if (!(actual > n)) {\n throw new Error('Expected ' + __format(actual) + ' to be greater than ' + n)\n }\n },\n toBeLessThan(n) {\n if (!(actual < n)) {\n throw new Error('Expected ' + __format(actual) + ' to be less than ' + n)\n }\n },\n toBeNaN() {\n if (typeof actual !== 'number' || !Number.isNaN(actual)) {\n throw new Error('Expected NaN but got ' + __format(actual))\n }\n }\n }\n }\n\n // Run the test body\n ${test.body}\n } finally {\n ${tjsRestore}\n }\n `\n\n // Execute the test\n const fn = new Function('__deepEqual', '__format', testCode)\n fn(deepEqual, formatValue)\n\n results.push({\n description: test.description,\n passed: true,\n line: test.line,\n })\n } catch (e: any) {\n results.push({\n description: test.description,\n passed: false,\n error: e.message || String(e),\n line: test.line,\n })\n }\n }\n\n return results\n}\n\n/**\n * Evaluate an ObjectExpression AST node to a plain object\n */\nfunction evalObjectExpression(node: any): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const prop of node.properties) {\n if (prop.type === 'Property' && prop.key) {\n const key =\n prop.key.type === 'Identifier' ? prop.key.name : prop.key.value\n if (prop.value.type === 'Literal') {\n result[key] = prop.value.value\n } else if (prop.value.type === 'ObjectExpression') {\n result[key] = evalObjectExpression(prop.value)\n } else if (prop.value.type === 'ArrayExpression') {\n result[key] = evalArrayExpression(prop.value)\n } else {\n throw new Error('Unsupported value type')\n }\n }\n }\n return result\n}\n\n/**\n * Evaluate an ArrayExpression AST node to an array\n */\nfunction evalArrayExpression(node: any): unknown[] {\n const result: unknown[] = []\n for (const elem of node.elements) {\n if (elem.type === 'Literal') {\n result.push(elem.value)\n } else if (elem.type === 'ObjectExpression') {\n result.push(evalObjectExpression(elem))\n } else if (elem.type === 'ArrayExpression') {\n result.push(evalArrayExpression(elem))\n } else {\n throw new Error('Unsupported element type')\n }\n }\n return result\n}\n\n/**\n * Extract and run signature tests for ALL functions with return type annotations\n * Parses the original source to find function signatures\n *\n * Current limitations (future work):\n * - Only tests top-level `function` declarations (not arrow functions yet)\n * - Nested functions (inside other functions/blocks) are not excluded yet\n * and will fail if tested since they're not in global scope\n * - Arrow functions like `Foo = (x: 5): 10 => {}` not yet supported\n */\nfunction runAllSignatureTests(\n originalSource: string,\n transpiledCode: string,\n resolvedImports: Record<string, string> = {}\n): TestResult[] {\n const results: TestResult[] = []\n\n // Strip comments to avoid matching functions inside doc comments/code examples\n const sourceWithoutComments = stripComments(originalSource)\n\n // Match function declarations with return type marker (: or :?)\n // Skip :! which means \"don't test\"\n // Pattern: function name(params): returnExample {\n const funcRegex = /function\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*(:[?!]?)\\s*/g\n\n let match\n while ((match = funcRegex.exec(sourceWithoutComments)) !== null) {\n const funcName = match[1]\n const paramsStr = match[2]\n const returnMarker = match[3]\n\n // Calculate line number from match position in stripped source\n const lineNumber = sourceWithoutComments\n .slice(0, match.index)\n .split('\\n').length\n\n // :! means skip test\n if (returnMarker === ':!') continue\n\n // Extract return example - handle nested braces/brackets\n // Use stripped source since match.index is from that\n const afterMarker = sourceWithoutComments.slice(\n match.index + match[0].length\n )\n const returnExample = extractReturnExampleFromSource(afterMarker)\n if (!returnExample) continue\n\n // Extract parameter examples\n const paramExamples = extractParamExamples(paramsStr)\n if (paramsStr.trim() && paramExamples.length === 0) continue\n\n // Run the signature test\n try {\n // Parse expected value (with optional default keys)\n const parsed = parseReturnExample(returnExample)\n if (!parsed) continue\n\n // Parse args\n const args = paramExamples.map((p) => new Function(`return ${p}`)())\n\n const result = runSignatureTest(\n funcName,\n transpiledCode,\n args,\n parsed.pattern,\n resolvedImports,\n Object.keys(parsed.defaults).length > 0 ? parsed.defaults : undefined\n )\n result.line = lineNumber\n results.push(result)\n } catch (e: any) {\n results.push({\n description: `${funcName} signature example`,\n passed: false,\n error: `Failed to parse signature: ${e.message}`,\n isSignatureTest: true,\n line: lineNumber,\n })\n }\n }\n\n return results\n}\n\n/**\n * Extract return type example from source, handling nested braces\n */\nexport function extractReturnExampleFromSource(source: string): string | null {\n let result = ''\n let depth = 0\n let hasContent = false\n\n for (let i = 0; i < source.length; i++) {\n const char = source[i]\n\n if (char === '{' || char === '[' || char === '(') {\n if (char === '{' && depth === 0 && hasContent) {\n // Found the function body opening brace\n break\n }\n depth++\n result += char\n hasContent = true\n } else if (char === '}' || char === ']' || char === ')') {\n depth--\n result += char\n } else if (!/\\s/.test(char)) {\n result += char\n hasContent = true\n } else {\n result += char\n }\n }\n\n const trimmed = result.trim()\n return trimmed || null\n}\n\n/**\n * Extract parameter example values from params string\n */\nfunction extractParamExamples(paramsStr: string): string[] {\n if (!paramsStr.trim()) return []\n\n const examples: string[] = []\n const params = splitParams(paramsStr)\n\n for (const param of params) {\n const trimmed = param.trim()\n\n // Rest parameter: ...name: [examples] \u2014 spread the array elements as individual args\n const restMatch = trimmed.match(/^\\.\\.\\.(\\w+)\\s*[:=]\\s*(\\[.+\\])$/)\n if (restMatch) {\n try {\n const arr = new Function(`return ${restMatch[2]}`)()\n if (Array.isArray(arr)) {\n for (const el of arr) {\n examples.push(JSON.stringify(el))\n }\n }\n } catch {\n // Can't parse \u2014 skip rest param examples\n }\n continue\n }\n\n // Bare rest param without type: ...name \u2014 skip (no example to use)\n if (trimmed.startsWith('...')) continue\n\n // Match: name: example or name = example (with optional safety markers)\n // Handle: (? name: example) or (! name: example)\n const match = trimmed.match(/(?:\\(\\s*[?!]\\s*)?(\\w+)\\s*[:=]\\s*(.+?)(?:\\))?$/)\n if (match) {\n examples.push(match[2].trim())\n } else {\n // No example value - can't run signature test\n return []\n }\n }\n\n return examples\n}\n\n/**\n * Split parameter string on commas, respecting nested structures\n */\nfunction splitParams(paramsStr: string): string[] {\n const params: string[] = []\n let current = ''\n let depth = 0\n\n for (const char of paramsStr) {\n if (char === '(' || char === '[' || char === '{') depth++\n else if (char === ')' || char === ']' || char === '}') depth--\n else if (char === ',' && depth === 0) {\n params.push(current.trim())\n current = ''\n continue\n }\n current += char\n }\n\n if (current.trim()) params.push(current.trim())\n return params\n}\n\n/**\n * Run signature example test\n */\nfunction runSignatureTest(\n funcName: string,\n transpiledCode: string,\n args: unknown[],\n expected: unknown,\n resolvedImports: Record<string, string> = {},\n defaults?: Record<string, unknown>\n): TestResult {\n const description = `${funcName} signature example`\n\n // Strip import/export for test execution (can't use modules in new Function)\n const executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n // Real runtime installed via installRuntime() \u2014 preamble finds it via globalThis.__tjs\n\n // Build resolved imports code - inject imported module code into execution context\n const importedCode = buildResolvedImportsCode(resolvedImports)\n\n try {\n // Execute the function with example args\n // Provide a minimal __tjs stub for pushStack/typeError (used by inline validation)\n // Only define if not already in the transpiled code\n // Always provide a clean __tjs stub for isolated test execution\n // Save and restore globalThis.__tjs to prevent pollution\n const tjsStub = `\n const __saved_tjs = globalThis.__tjs;\n class __MonadicError extends Error { constructor(m,p,e,a,c){super(m);this.name='MonadicError';this.path=p;this.expected=e;this.actual=a;this.callStack=c;} }\n const __stub_tjs = { version: '0.0.0', MonadicError: __MonadicError, pushStack: () => {}, popStack: () => {}, getStack: () => [], typeError: (path, expected, value) => new __MonadicError(\\`Type error at \\${path}: expected \\${expected}\\`, path, expected, typeof value), createRuntime: function() { return this; } };\n globalThis.__tjs = __stub_tjs;\n `\n const tjsRestore = `globalThis.__tjs = __saved_tjs;`\n const testCode = `\n ${tjsStub}\n try {\n // Inject resolved imports first (they may be dependencies)\n ${importedCode}\n ${executableCode}\n return ${funcName}(${args.map((a) => JSON.stringify(a)).join(', ')})\n } finally {\n ${tjsRestore}\n }\n `\n const fn = new Function(testCode)\n let actual = fn()\n\n // Merge defaults for optional keys before type checking\n if (defaults && typeof actual === 'object' && actual !== null) {\n actual = Object.assign({}, defaults, actual)\n }\n\n // Signature tests check exact values \u2014 the example is a test case\n if (!deepEqual(actual, expected)) {\n return {\n description,\n passed: false,\n error: `Expected ${formatValue(\n expected\n )} at '${funcName}', got ${formatValue(actual)}`,\n isSignatureTest: true,\n }\n }\n\n return { description, passed: true, isSignatureTest: true }\n } catch (e: any) {\n return {\n description,\n passed: false,\n error: e.message || String(e),\n isSignatureTest: true,\n }\n }\n}\n\n/**\n * Compile WASM blocks and generate bootstrap code that embeds the compiled bytes\n * and instantiates them on load.\n */\n", "/**\n * TJS to WebAssembly Compiler\n *\n * Compiles a subset of TJS to WebAssembly for performance-critical code.\n *\n * Supported features:\n * - Numeric operations (+, -, *, /, %)\n * - Typed arrays (Float32Array, Float64Array, Int32Array, Uint8Array)\n * - For loops with numeric bounds\n * - Math functions (sin, cos, sqrt, abs, floor, ceil, min, max)\n * - Basic conditionals (if/else)\n * - Variable declarations (let)\n *\n * The goal is to enable real-world WASM acceleration for hot paths like\n * audio processing, image manipulation, and physics simulations.\n */\n\nimport * as acorn from 'acorn'\nimport type { WasmBlock } from './parser'\n\n// ============================================================================\n// WASM Binary Encoding Constants\n// ============================================================================\n\n/** WASM value type codes */\nconst Type = {\n i32: 0x7f,\n i64: 0x7e,\n f32: 0x7d,\n f64: 0x7c,\n v128: 0x7b,\n funcref: 0x70,\n externref: 0x6f,\n void: 0x40, // empty block type\n} as const\n\n/** WASM section codes */\nconst Section = {\n custom: 0,\n type: 1,\n import: 2,\n function: 3,\n table: 4,\n memory: 5,\n global: 6,\n export: 7,\n start: 8,\n element: 9,\n code: 10,\n data: 11,\n} as const\n\n/** WASM opcodes */\nconst Op = {\n // Control flow\n unreachable: 0x00,\n nop: 0x01,\n block: 0x02,\n loop: 0x03,\n if: 0x04,\n else: 0x05,\n end: 0x0b,\n br: 0x0c,\n br_if: 0x0d,\n br_table: 0x0e,\n return: 0x0f,\n call: 0x10,\n call_indirect: 0x11,\n\n // Parametric\n drop: 0x1a,\n select: 0x1b,\n\n // Variable access\n local_get: 0x20,\n local_set: 0x21,\n local_tee: 0x22,\n global_get: 0x23,\n global_set: 0x24,\n\n // Memory operations\n i32_load: 0x28,\n i64_load: 0x29,\n f32_load: 0x2a,\n f64_load: 0x2b,\n i32_load8_s: 0x2c,\n i32_load8_u: 0x2d,\n i32_load16_s: 0x2e,\n i32_load16_u: 0x2f,\n i32_store: 0x36,\n i64_store: 0x37,\n f32_store: 0x38,\n f64_store: 0x39,\n i32_store8: 0x3a,\n i32_store16: 0x3b,\n memory_size: 0x3f,\n memory_grow: 0x40,\n\n // Constants\n i32_const: 0x41,\n i64_const: 0x42,\n f32_const: 0x43,\n f64_const: 0x44,\n\n // i32 comparison\n i32_eqz: 0x45,\n i32_eq: 0x46,\n i32_ne: 0x47,\n i32_lt_s: 0x48,\n i32_lt_u: 0x49,\n i32_gt_s: 0x4a,\n i32_gt_u: 0x4b,\n i32_le_s: 0x4c,\n i32_le_u: 0x4d,\n i32_ge_s: 0x4e,\n i32_ge_u: 0x4f,\n\n // i64 comparison\n i64_eqz: 0x50,\n i64_eq: 0x51,\n i64_ne: 0x52,\n i64_lt_s: 0x53,\n i64_lt_u: 0x54,\n i64_gt_s: 0x55,\n i64_gt_u: 0x56,\n i64_le_s: 0x57,\n i64_le_u: 0x58,\n i64_ge_s: 0x59,\n i64_ge_u: 0x5a,\n\n // f32 comparison\n f32_eq: 0x5b,\n f32_ne: 0x5c,\n f32_lt: 0x5d,\n f32_gt: 0x5e,\n f32_le: 0x5f,\n f32_ge: 0x60,\n\n // f64 comparison\n f64_eq: 0x61,\n f64_ne: 0x62,\n f64_lt: 0x63,\n f64_gt: 0x64,\n f64_le: 0x65,\n f64_ge: 0x66,\n\n // i32 arithmetic\n i32_clz: 0x67,\n i32_ctz: 0x68,\n i32_popcnt: 0x69,\n i32_add: 0x6a,\n i32_sub: 0x6b,\n i32_mul: 0x6c,\n i32_div_s: 0x6d,\n i32_div_u: 0x6e,\n i32_rem_s: 0x6f,\n i32_rem_u: 0x70,\n i32_and: 0x71,\n i32_or: 0x72,\n i32_xor: 0x73,\n i32_shl: 0x74,\n i32_shr_s: 0x75,\n i32_shr_u: 0x76,\n i32_rotl: 0x77,\n i32_rotr: 0x78,\n\n // i64 arithmetic\n i64_add: 0x7c,\n i64_sub: 0x7d,\n i64_mul: 0x7e,\n i64_div_s: 0x7f,\n\n // f32 arithmetic\n f32_abs: 0x8b,\n f32_neg: 0x8c,\n f32_ceil: 0x8d,\n f32_floor: 0x8e,\n f32_trunc: 0x8f,\n f32_nearest: 0x90,\n f32_sqrt: 0x91,\n f32_add: 0x92,\n f32_sub: 0x93,\n f32_mul: 0x94,\n f32_div: 0x95,\n f32_min: 0x96,\n f32_max: 0x97,\n f32_copysign: 0x98,\n\n // f64 arithmetic\n f64_abs: 0x99,\n f64_neg: 0x9a,\n f64_ceil: 0x9b,\n f64_floor: 0x9c,\n f64_trunc: 0x9d,\n f64_nearest: 0x9e,\n f64_sqrt: 0x9f,\n f64_add: 0xa0,\n f64_sub: 0xa1,\n f64_mul: 0xa2,\n f64_div: 0xa3,\n f64_min: 0xa4,\n f64_max: 0xa5,\n f64_copysign: 0xa6,\n\n // Conversions\n i32_wrap_i64: 0xa7,\n i32_trunc_f32_s: 0xa8,\n i32_trunc_f32_u: 0xa9,\n i32_trunc_f64_s: 0xaa,\n i32_trunc_f64_u: 0xab,\n i64_extend_i32_s: 0xac,\n i64_extend_i32_u: 0xad,\n f32_convert_i32_s: 0xb2,\n f32_convert_i32_u: 0xb3,\n f32_convert_i64_s: 0xb4,\n f32_demote_f64: 0xb6,\n f64_convert_i32_s: 0xb7,\n f64_convert_i32_u: 0xb8,\n f64_convert_i64_s: 0xb9,\n f64_promote_f32: 0xbb,\n i32_reinterpret_f32: 0xbc,\n f32_reinterpret_i32: 0xbe,\n f64_reinterpret_i64: 0xbf,\n\n // Sign extension\n i32_extend8_s: 0xc0,\n i32_extend16_s: 0xc1,\n} as const\n\n/** Reverse lookup: opcode byte -> instruction name */\nconst OpName: Record<number, string> = Object.fromEntries(\n Object.entries(Op).map(([name, code]) => [code, name.replace(/_/g, '.')])\n)\n\n// ============================================================================\n// SIMD (v128/f32x4) Constants\n// ============================================================================\n\n/** WASM SIMD prefix byte \u2014 all SIMD instructions start with this */\nconst SIMD_PREFIX = 0xfd\n\n/** SIMD sub-opcodes (follow the 0xfd prefix, LEB128-encoded) */\nconst SimdOp = {\n // Memory\n v128_load: 0x00,\n v128_store: 0x0b,\n\n // Constants\n v128_const: 0x0c,\n\n // Splat (scalar \u2192 all 4 lanes)\n f32x4_splat: 0x13,\n\n // Lane access\n f32x4_extract_lane: 0x1f,\n f32x4_replace_lane: 0x20,\n\n // f32x4 arithmetic\n f32x4_neg: 0xe1,\n f32x4_sqrt: 0xe3,\n f32x4_add: 0xe4,\n f32x4_sub: 0xe5,\n f32x4_mul: 0xe6,\n f32x4_div: 0xe7,\n} as const\n\n/** Reverse lookup for SIMD opcodes */\nconst SimdOpName: Record<number, string> = Object.fromEntries(\n Object.entries(SimdOp).map(([name, code]) => [code, name.replace(/_/g, '.')])\n)\n\n/** Encode a SIMD instruction (0xfd prefix + LEB128 sub-opcode) */\nfunction encodeSIMD(subOp: number): number[] {\n return [SIMD_PREFIX, ...encodeULEB128(subOp)]\n}\n\n/** Encode a SIMD instruction with memarg (align + offset) */\nfunction encodeSIMDMemarg(\n subOp: number,\n align: number,\n offset: number\n): number[] {\n return [\n SIMD_PREFIX,\n ...encodeULEB128(subOp),\n ...encodeULEB128(align),\n ...encodeULEB128(offset),\n ]\n}\n\n/** Emit WAT instruction to context */\nfunction wat(ctx: CompileContext, instruction: string): void {\n ctx.wat.push(' '.repeat(ctx.watIndent) + instruction)\n}\n\n// ============================================================================\n// LEB128 Encoding\n// ============================================================================\n\nfunction encodeULEB128(value: number): number[] {\n const result: number[] = []\n do {\n let byte = value & 0x7f\n value >>>= 7\n if (value !== 0) byte |= 0x80\n result.push(byte)\n } while (value !== 0)\n return result\n}\n\nfunction encodeSLEB128(value: number): number[] {\n const result: number[] = []\n let more = true\n while (more) {\n let byte = value & 0x7f\n value >>= 7\n if (\n (value === 0 && (byte & 0x40) === 0) ||\n (value === -1 && (byte & 0x40) !== 0)\n ) {\n more = false\n } else {\n byte |= 0x80\n }\n result.push(byte)\n }\n return result\n}\n\nfunction encodeF32(value: number): number[] {\n const buffer = new ArrayBuffer(4)\n new Float32Array(buffer)[0] = value\n return [...new Uint8Array(buffer)]\n}\n\nfunction encodeF64(value: number): number[] {\n const buffer = new ArrayBuffer(8)\n new Float64Array(buffer)[0] = value\n return [...new Uint8Array(buffer)]\n}\n\nfunction encodeString(s: string): number[] {\n const bytes = new TextEncoder().encode(s)\n return [...encodeULEB128(bytes.length), ...bytes]\n}\n\nfunction encodeSection(id: number, contents: number[]): number[] {\n return [id, ...encodeULEB128(contents.length), ...contents]\n}\n\nfunction encodeVector(items: number[][]): number[] {\n return [...encodeULEB128(items.length), ...items.flat()]\n}\n\n// ============================================================================\n// Disassembly (for debugging)\n// ============================================================================\n\n/** Decode ULEB128 from bytes, return [value, bytesConsumed] */\nfunction decodeULEB128(bytes: number[], offset: number): [number, number] {\n let result = 0\n let shift = 0\n let i = offset\n while (i < bytes.length) {\n const byte = bytes[i]\n result |= (byte & 0x7f) << shift\n i++\n if ((byte & 0x80) === 0) break\n shift += 7\n }\n return [result, i - offset]\n}\n\n/** Decode f64 from 8 bytes */\nfunction decodeF64(bytes: number[], offset: number): number {\n const buffer = new ArrayBuffer(8)\n const view = new Uint8Array(buffer)\n for (let i = 0; i < 8; i++) view[i] = bytes[offset + i]\n return new Float64Array(buffer)[0]\n}\n\n/** Disassemble function body bytes to WAT-like text */\nfunction disassemble(\n code: number[],\n params: TypedParam[],\n localTypes: WasmValueType[]\n): string {\n const lines: string[] = []\n let indent = 1\n const ind = () => ' '.repeat(indent)\n\n // Function signature\n const paramStr = params\n .map((p, i) => `(param $${p.name} ${p.type})`)\n .join(' ')\n const localStr = localTypes\n .map((t, i) => `(local $L${params.length + i} ${t})`)\n .join(' ')\n lines.push(`(func (export \"compute\") ${paramStr} (result f64)`)\n if (localStr) lines.push(` ${localStr}`)\n\n let i = 0\n while (i < code.length) {\n const op = code[i]\n const name = OpName[op] || `unknown(0x${op.toString(16)})`\n i++\n\n // Handle instructions with immediates\n if (op === Op.local_get || op === Op.local_set || op === Op.local_tee) {\n const [idx, len] = decodeULEB128(code, i)\n i += len\n const paramName =\n idx < params.length ? `$${params[idx].name}` : `$L${idx}`\n lines.push(`${ind()}${name} ${paramName}`)\n } else if (op === Op.br || op === Op.br_if) {\n const [depth, len] = decodeULEB128(code, i)\n i += len\n lines.push(`${ind()}${name} ${depth}`)\n } else if (op === Op.i32_const) {\n const [val, len] = decodeULEB128(code, i)\n i += len\n lines.push(`${ind()}i32.const ${val}`)\n } else if (op === Op.f32_const) {\n const buffer = new ArrayBuffer(4)\n const view = new Uint8Array(buffer)\n for (let j = 0; j < 4; j++) view[j] = code[i + j]\n const val = new Float32Array(buffer)[0]\n i += 4\n lines.push(`${ind()}f32.const ${val}`)\n } else if (op === Op.f64_const) {\n const val = decodeF64(code, i)\n i += 8\n lines.push(`${ind()}f64.const ${val}`)\n } else if (op === Op.block || op === Op.loop) {\n const blockType = code[i]\n i++\n lines.push(\n `${ind()}${name}${\n blockType === Type.void\n ? ''\n : ` (result ${blockType === Type.f64 ? 'f64' : 'i32'})`\n }`\n )\n indent++\n } else if (op === Op.if) {\n const blockType = code[i]\n i++\n lines.push(\n `${ind()}if${\n blockType === Type.void\n ? ''\n : ` (result ${blockType === Type.f64 ? 'f64' : 'i32'})`\n }`\n )\n indent++\n } else if (op === Op.else) {\n indent--\n lines.push(`${ind()}else`)\n indent++\n } else if (op === Op.end) {\n indent = Math.max(1, indent - 1)\n lines.push(`${ind()}end`)\n } else if (\n op === Op.f64_load ||\n op === Op.f64_store ||\n op === Op.f32_load ||\n op === Op.f32_store ||\n op === Op.i32_load ||\n op === Op.i32_store\n ) {\n const [align, len1] = decodeULEB128(code, i)\n i += len1\n const [offset, len2] = decodeULEB128(code, i)\n i += len2\n lines.push(`${ind()}${name}${offset ? ` offset=${offset}` : ''}`)\n } else if (op === SIMD_PREFIX) {\n // SIMD instruction: 0xfd + LEB128 sub-opcode\n const [subOp, subLen] = decodeULEB128(code, i)\n i += subLen\n const simdName =\n SimdOpName[subOp] || `simd.unknown(0x${subOp.toString(16)})`\n if (subOp === SimdOp.v128_load || subOp === SimdOp.v128_store) {\n const [_align, len1] = decodeULEB128(code, i)\n i += len1\n const [offset, len2] = decodeULEB128(code, i)\n i += len2\n lines.push(`${ind()}${simdName}${offset ? ` offset=${offset}` : ''}`)\n } else if (subOp === SimdOp.v128_const) {\n const bytes = code.slice(i, i + 16)\n i += 16\n lines.push(\n `${ind()}v128.const ${bytes\n .map((b) => '0x' + b.toString(16).padStart(2, '0'))\n .join(' ')}`\n )\n } else if (\n subOp === SimdOp.f32x4_extract_lane ||\n subOp === SimdOp.f32x4_replace_lane\n ) {\n const lane = code[i]\n i++\n lines.push(`${ind()}${simdName} ${lane}`)\n } else {\n lines.push(`${ind()}${simdName}`)\n }\n } else {\n lines.push(`${ind()}${name}`)\n }\n }\n\n lines.push(')')\n return lines.join('\\n')\n}\n\n// ============================================================================\n// Type System\n// ============================================================================\n\n/** TJS type that maps to WASM */\ntype WasmValueType = 'i32' | 'i64' | 'f32' | 'f64' | 'v128'\n\n/** Typed array info */\ninterface TypedArrayInfo {\n elementType: WasmValueType\n bytesPerElement: number\n loadOp: number\n storeOp: number\n}\n\nconst TYPED_ARRAYS: Record<string, TypedArrayInfo> = {\n Int8Array: {\n elementType: 'i32',\n bytesPerElement: 1,\n loadOp: Op.i32_load8_s,\n storeOp: Op.i32_store8,\n },\n Uint8Array: {\n elementType: 'i32',\n bytesPerElement: 1,\n loadOp: Op.i32_load8_u,\n storeOp: Op.i32_store8,\n },\n Uint8ClampedArray: {\n elementType: 'i32',\n bytesPerElement: 1,\n loadOp: Op.i32_load8_u,\n storeOp: Op.i32_store8,\n },\n Int16Array: {\n elementType: 'i32',\n bytesPerElement: 2,\n loadOp: Op.i32_load16_s,\n storeOp: Op.i32_store16,\n },\n Uint16Array: {\n elementType: 'i32',\n bytesPerElement: 2,\n loadOp: Op.i32_load16_u,\n storeOp: Op.i32_store16,\n },\n Int32Array: {\n elementType: 'i32',\n bytesPerElement: 4,\n loadOp: Op.i32_load,\n storeOp: Op.i32_store,\n },\n Uint32Array: {\n elementType: 'i32',\n bytesPerElement: 4,\n loadOp: Op.i32_load,\n storeOp: Op.i32_store,\n },\n Float32Array: {\n elementType: 'f32',\n bytesPerElement: 4,\n loadOp: Op.f32_load,\n storeOp: Op.f32_store,\n },\n Float64Array: {\n elementType: 'f64',\n bytesPerElement: 8,\n loadOp: Op.f64_load,\n storeOp: Op.f64_store,\n },\n}\n\n/** Parameter with type annotation */\ninterface TypedParam {\n name: string\n type: WasmValueType\n isArray?: boolean\n arrayType?: string // e.g., \"Float32Array\"\n}\n\n// ============================================================================\n// Compilation Context\n// ============================================================================\n\ninterface CompileContext {\n /** Parameter definitions */\n params: TypedParam[]\n /** Local variable definitions (name -> local index, type) */\n locals: Map<string, { index: number; type: WasmValueType }>\n /** Next available local index */\n nextLocalIndex: number\n /** Local types for the locals section */\n localTypes: WasmValueType[]\n /** Warnings collected during compilation */\n warnings: string[]\n /** Errors collected during compilation */\n errors: string[]\n /** Current loop depth (for break/continue) */\n loopDepth: number\n /** Whether we need to import Math functions */\n needsMathImports: Set<string>\n /** Whether we need memory */\n needsMemory: boolean\n /** Whether the function has a return statement */\n hasReturn: boolean\n /** WAT text representation lines (for debugging) */\n wat: string[]\n /** Current indentation level for WAT */\n watIndent: number\n}\n\nfunction createContext(params: TypedParam[]): CompileContext {\n const ctx: CompileContext = {\n params,\n locals: new Map(),\n nextLocalIndex: params.length,\n localTypes: [],\n warnings: [],\n errors: [],\n loopDepth: 0,\n needsMathImports: new Set(),\n needsMemory: false,\n hasReturn: false,\n wat: [],\n watIndent: 1,\n }\n\n // Add params to locals map\n params.forEach((p, i) => {\n ctx.locals.set(p.name, { index: i, type: p.type })\n })\n\n return ctx\n}\n\nfunction declareLocal(\n ctx: CompileContext,\n name: string,\n type: WasmValueType\n): number {\n if (ctx.locals.has(name)) {\n ctx.errors.push(`Duplicate local declaration: ${name}`)\n return ctx.locals.get(name)!.index\n }\n const index = ctx.nextLocalIndex++\n ctx.locals.set(name, { index, type })\n ctx.localTypes.push(type)\n return index\n}\n\nfunction getLocal(\n ctx: CompileContext,\n name: string\n): { index: number; type: WasmValueType } | undefined {\n return ctx.locals.get(name)\n}\n\n// ============================================================================\n// AST Compilation\n// ============================================================================\n\n/** Compile a statement, return WASM instructions */\nfunction compileStatement(\n node: acorn.Statement,\n ctx: CompileContext\n): number[] {\n switch (node.type) {\n case 'ExpressionStatement': {\n // Expression statement - compile and drop result\n const expr = (node as acorn.ExpressionStatement).expression\n const exprCode = compileExpression(expr, ctx)\n // Drop the result since this is a statement (value not used)\n return [...exprCode, Op.drop]\n }\n\n case 'ReturnStatement': {\n const ret = node as acorn.ReturnStatement\n ctx.hasReturn = true\n if (!ret.argument) {\n // Void return - just return without a value\n return [Op.return]\n }\n const code = compileExpression(ret.argument as acorn.Expression, ctx)\n // Ensure return value is f64 (function always returns f64 if it returns a value)\n const retType = inferExprType(ret.argument as acorn.Expression, ctx)\n if (retType === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (retType === 'f32') {\n code.push(Op.f64_promote_f32)\n }\n code.push(Op.return)\n return code\n }\n\n case 'VariableDeclaration': {\n const decl = node as acorn.VariableDeclaration\n const code: number[] = []\n for (const declarator of decl.declarations) {\n if (declarator.id.type !== 'Identifier') {\n ctx.errors.push('Destructuring not supported in WASM blocks')\n continue\n }\n const name = (declarator.id as acorn.Identifier).name\n // Infer type from initializer or default to f64\n let type: WasmValueType = 'f64'\n if (declarator.init) {\n type = inferExprType(declarator.init as acorn.Expression, ctx)\n }\n const index = declareLocal(ctx, name, type)\n if (declarator.init) {\n code.push(\n ...compileExpression(declarator.init as acorn.Expression, ctx)\n )\n code.push(Op.local_set, ...encodeULEB128(index))\n }\n }\n return code\n }\n\n case 'ForStatement': {\n const forStmt = node as acorn.ForStatement\n return compileForLoop(forStmt, ctx)\n }\n\n case 'IfStatement': {\n const ifStmt = node as acorn.IfStatement\n return compileIf(ifStmt, ctx)\n }\n\n case 'BlockStatement': {\n const block = node as acorn.BlockStatement\n const code: number[] = []\n for (const stmt of block.body) {\n code.push(...compileStatement(stmt, ctx))\n }\n return code\n }\n\n default:\n ctx.errors.push(`Unsupported statement type: ${node.type}`)\n return []\n }\n}\n\n/** Compile a for loop */\nfunction compileForLoop(\n node: acorn.ForStatement,\n ctx: CompileContext\n): number[] {\n const code: number[] = []\n\n // Compile init\n if (node.init) {\n if (node.init.type === 'VariableDeclaration') {\n code.push(...compileStatement(node.init, ctx))\n } else {\n code.push(...compileExpression(node.init as acorn.Expression, ctx))\n }\n }\n\n // block $break\n // loop $continue\n // br_if $break (condition is false)\n // body\n // update\n // br $continue\n // end\n // end\n\n code.push(Op.block, Type.void) // $break block\n code.push(Op.loop, Type.void) // $continue loop\n\n // Test condition - break if false\n if (node.test) {\n code.push(...compileExpression(node.test, ctx))\n code.push(Op.i32_eqz) // invert: break if condition is false\n code.push(Op.br_if, 1) // br to $break (depth 1)\n }\n\n // Body\n ctx.loopDepth++\n if (node.body) {\n code.push(...compileStatement(node.body, ctx))\n }\n ctx.loopDepth--\n\n // Update\n if (node.update) {\n code.push(...compileExpression(node.update, ctx))\n code.push(Op.drop) // discard update expression result\n }\n\n // Continue loop\n code.push(Op.br, 0) // br to $continue (depth 0)\n\n code.push(Op.end) // end loop\n code.push(Op.end) // end block\n\n return code\n}\n\n/** Compile an if statement */\nfunction compileIf(node: acorn.IfStatement, ctx: CompileContext): number[] {\n const code: number[] = []\n\n // Compile condition\n code.push(...compileExpression(node.test, ctx))\n\n // if (result type void since we're not returning a value from if)\n code.push(Op.if, Type.void)\n\n // Consequent\n code.push(...compileStatement(node.consequent, ctx))\n\n // Alternate\n if (node.alternate) {\n code.push(Op.else)\n code.push(...compileStatement(node.alternate, ctx))\n }\n\n code.push(Op.end)\n\n return code\n}\n\n/** Infer the WASM type of an expression */\nfunction inferExprType(\n node: acorn.Expression,\n ctx: CompileContext\n): WasmValueType {\n switch (node.type) {\n case 'Literal': {\n const lit = node as acorn.Literal\n if (typeof lit.value === 'number') {\n // Check if the raw source contains a decimal point (e.g., \"0.0\")\n // This indicates the user wants a float even if the value is an integer\n if (lit.raw && (lit.raw.includes('.') || lit.raw.includes('e'))) {\n return 'f64'\n }\n // Check if it's an integer that fits in i32\n if (\n Number.isInteger(lit.value) &&\n lit.value >= -2147483648 &&\n lit.value <= 2147483647\n ) {\n return 'i32'\n }\n return 'f64'\n }\n return 'f64'\n }\n\n case 'Identifier': {\n const local = getLocal(ctx, (node as acorn.Identifier).name)\n return local?.type ?? 'f64'\n }\n\n case 'BinaryExpression':\n case 'AssignmentExpression': {\n const binExpr = node as acorn.BinaryExpression\n // Comparison operators return i32\n if (\n ['<', '>', '<=', '>=', '==', '!=', '===', '!=='].includes(\n binExpr.operator\n )\n ) {\n return 'i32'\n }\n // Bitwise operators are i32\n if (['|', '&', '^', '<<', '>>', '>>>'].includes(binExpr.operator)) {\n return 'i32'\n }\n // Otherwise infer from operands\n const leftType = inferExprType(binExpr.left as acorn.Expression, ctx)\n const rightType = inferExprType(binExpr.right as acorn.Expression, ctx)\n // v128 operations stay v128\n if (leftType === 'v128' || rightType === 'v128') return 'v128'\n // If either is f64 or f32, result is floating point\n if (leftType === 'f64' || rightType === 'f64') return 'f64'\n if (leftType === 'f32' || rightType === 'f32') return 'f32'\n return 'i32'\n }\n\n case 'UnaryExpression': {\n const unary = node as acorn.UnaryExpression\n if (unary.operator === '!') {\n return 'i32' // boolean result\n }\n // For negation and bitwise not, result type matches argument type\n return inferExprType(unary.argument as acorn.Expression, ctx)\n }\n\n case 'MemberExpression': {\n // Array access - check array type\n const member = node as acorn.MemberExpression\n if (member.object.type === 'Identifier') {\n const local = getLocal(ctx, (member.object as acorn.Identifier).name)\n if (local) {\n const param = ctx.params.find(\n (p) => p.name === (member.object as acorn.Identifier).name\n )\n if (param?.arrayType) {\n const arrayInfo = TYPED_ARRAYS[param.arrayType]\n if (arrayInfo) return arrayInfo.elementType\n }\n }\n }\n return 'f64'\n }\n\n case 'CallExpression': {\n const call = node as acorn.CallExpression\n if (call.callee.type === 'MemberExpression') {\n const callee = call.callee as acorn.MemberExpression\n if (\n callee.object.type === 'Identifier' &&\n (callee.object as acorn.Identifier).name === 'Math'\n ) {\n // Math functions return f64\n return 'f64'\n }\n }\n // SIMD intrinsics\n if (call.callee.type === 'Identifier') {\n const name = (call.callee as acorn.Identifier).name\n if (name === 'f32x4_extract_lane') return 'f32'\n if (name.startsWith('f32x4_') || name === 'v128_load') return 'v128'\n }\n return 'f64'\n }\n\n default:\n return 'f64'\n }\n}\n\n/** Compile an expression, return WASM instructions */\nfunction compileExpression(\n node: acorn.Expression,\n ctx: CompileContext\n): number[] {\n switch (node.type) {\n case 'Literal': {\n const lit = node as acorn.Literal\n if (typeof lit.value === 'number') {\n const type = inferExprType(node, ctx)\n if (type === 'i32') {\n return [Op.i32_const, ...encodeSLEB128(lit.value | 0)]\n } else if (type === 'f32') {\n return [Op.f32_const, ...encodeF32(lit.value)]\n } else {\n return [Op.f64_const, ...encodeF64(lit.value)]\n }\n }\n ctx.errors.push(`Unsupported literal type: ${typeof lit.value}`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n\n case 'Identifier': {\n const name = (node as acorn.Identifier).name\n const local = getLocal(ctx, name)\n if (local) {\n return [Op.local_get, ...encodeULEB128(local.index)]\n }\n ctx.errors.push(`Unknown identifier: ${name}`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n\n case 'BinaryExpression': {\n const bin = node as acorn.BinaryExpression\n return compileBinaryExpr(bin, ctx)\n }\n\n case 'UnaryExpression': {\n const unary = node as acorn.UnaryExpression\n return compileUnaryExpr(unary, ctx)\n }\n\n case 'AssignmentExpression': {\n const assign = node as acorn.AssignmentExpression\n return compileAssignment(assign, ctx)\n }\n\n case 'UpdateExpression': {\n const update = node as acorn.UpdateExpression\n return compileUpdate(update, ctx)\n }\n\n case 'MemberExpression': {\n const member = node as acorn.MemberExpression\n return compileArrayAccess(member, ctx)\n }\n\n case 'CallExpression': {\n const call = node as acorn.CallExpression\n return compileCall(call, ctx)\n }\n\n case 'SequenceExpression': {\n const seq = node as acorn.SequenceExpression\n const code: number[] = []\n for (let i = 0; i < seq.expressions.length; i++) {\n code.push(...compileExpression(seq.expressions[i], ctx))\n // Drop all but last value\n if (i < seq.expressions.length - 1) {\n code.push(Op.drop)\n }\n }\n return code\n }\n\n default:\n ctx.errors.push(`Unsupported expression type: ${node.type}`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n}\n\n/** Compile a binary expression */\nfunction compileBinaryExpr(\n node: acorn.BinaryExpression,\n ctx: CompileContext\n): number[] {\n const left = compileExpression(node.left as acorn.Expression, ctx)\n const right = compileExpression(node.right as acorn.Expression, ctx)\n const resultType = inferExprType(node, ctx)\n\n // Type coercion if needed\n const leftType = inferExprType(node.left as acorn.Expression, ctx)\n const rightType = inferExprType(node.right as acorn.Expression, ctx)\n\n // Determine operand type for the operation\n const isComparison = [\n '<',\n '>',\n '<=',\n '>=',\n '==',\n '===',\n '!=',\n '!==',\n ].includes(node.operator)\n\n // For comparisons and arithmetic, we need operands to match\n // Promote to the \"wider\" type\n let opType: WasmValueType\n if (leftType === 'f64' || rightType === 'f64') {\n opType = 'f64'\n } else if (leftType === 'f32' || rightType === 'f32') {\n opType = 'f32'\n } else {\n opType = 'i32'\n }\n\n // For non-comparison ops, use result type if it's wider\n if (!isComparison && resultType === 'f64') {\n opType = 'f64'\n }\n\n let leftCode = left\n let rightCode = right\n\n // Coerce operands to opType\n if (opType === 'f64') {\n if (leftType === 'i32') {\n leftCode = [...left, Op.f64_convert_i32_s]\n } else if (leftType === 'f32') {\n leftCode = [...left, Op.f64_promote_f32]\n }\n if (rightType === 'i32') {\n rightCode = [...right, Op.f64_convert_i32_s]\n } else if (rightType === 'f32') {\n rightCode = [...right, Op.f64_promote_f32]\n }\n } else if (opType === 'f32') {\n if (leftType === 'i32') {\n leftCode = [...left, Op.f32_convert_i32_s]\n }\n if (rightType === 'i32') {\n rightCode = [...right, Op.f32_convert_i32_s]\n }\n }\n\n const opMap: Record<string, Record<string, number>> = {\n '+': { i32: Op.i32_add, f32: Op.f32_add, f64: Op.f64_add },\n '-': { i32: Op.i32_sub, f32: Op.f32_sub, f64: Op.f64_sub },\n '*': { i32: Op.i32_mul, f32: Op.f32_mul, f64: Op.f64_mul },\n '/': { i32: Op.i32_div_s, f32: Op.f32_div, f64: Op.f64_div },\n '%': { i32: Op.i32_rem_s },\n '<': { i32: Op.i32_lt_s, f32: Op.f32_lt, f64: Op.f64_lt },\n '>': { i32: Op.i32_gt_s, f32: Op.f32_gt, f64: Op.f64_gt },\n '<=': { i32: Op.i32_le_s, f32: Op.f32_le, f64: Op.f64_le },\n '>=': { i32: Op.i32_ge_s, f32: Op.f32_ge, f64: Op.f64_ge },\n '==': { i32: Op.i32_eq, f32: Op.f32_eq, f64: Op.f64_eq },\n '===': { i32: Op.i32_eq, f32: Op.f32_eq, f64: Op.f64_eq },\n '!=': { i32: Op.i32_ne, f32: Op.f32_ne, f64: Op.f64_ne },\n '!==': { i32: Op.i32_ne, f32: Op.f32_ne, f64: Op.f64_ne },\n '|': { i32: Op.i32_or },\n '&': { i32: Op.i32_and },\n '^': { i32: Op.i32_xor },\n '<<': { i32: Op.i32_shl },\n '>>': { i32: Op.i32_shr_s },\n '>>>': { i32: Op.i32_shr_u },\n }\n\n const ops = opMap[node.operator]\n if (!ops) {\n ctx.errors.push(`Unsupported operator: ${node.operator}`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n\n const opcode = ops[opType] ?? ops.f64 ?? ops.i32\n if (opcode === undefined) {\n ctx.errors.push(\n `Operator ${node.operator} not supported for type ${opType}`\n )\n return [Op.f64_const, ...encodeF64(0)]\n }\n\n return [...leftCode, ...rightCode, opcode]\n}\n\n/** Compile a unary expression */\nfunction compileUnaryExpr(\n node: acorn.UnaryExpression,\n ctx: CompileContext\n): number[] {\n const arg = compileExpression(node.argument as acorn.Expression, ctx)\n const type = inferExprType(node.argument as acorn.Expression, ctx)\n\n switch (node.operator) {\n case '-':\n if (type === 'i32') {\n // 0 - x\n return [Op.i32_const, 0, ...arg, Op.i32_sub]\n } else if (type === 'f32') {\n return [...arg, Op.f32_neg]\n } else {\n return [...arg, Op.f64_neg]\n }\n\n case '!':\n // Boolean not: x == 0\n return [...arg, Op.i32_eqz]\n\n case '~':\n // Bitwise not: x ^ -1\n return [...arg, Op.i32_const, ...encodeSLEB128(-1), Op.i32_xor]\n\n default:\n ctx.errors.push(`Unsupported unary operator: ${node.operator}`)\n return arg\n }\n}\n\n/** Compile an assignment expression */\nfunction compileAssignment(\n node: acorn.AssignmentExpression,\n ctx: CompileContext\n): number[] {\n // Handle array element assignment: arr[i] = value\n if (node.left.type === 'MemberExpression') {\n return compileArrayStore(\n node.left as acorn.MemberExpression,\n node.right as acorn.Expression,\n node.operator,\n ctx\n )\n }\n\n // Handle simple variable assignment\n if (node.left.type !== 'Identifier') {\n ctx.errors.push('Assignment target must be identifier or array element')\n return []\n }\n\n const name = (node.left as acorn.Identifier).name\n const local = getLocal(ctx, name)\n if (!local) {\n ctx.errors.push(`Unknown variable: ${name}`)\n return []\n }\n\n const code: number[] = []\n\n if (node.operator === '=') {\n code.push(...compileExpression(node.right as acorn.Expression, ctx))\n // Type coercion if needed\n const valType = inferExprType(node.right as acorn.Expression, ctx)\n if (local.type === 'f64' && valType === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (local.type === 'f64' && valType === 'f32') {\n code.push(Op.f64_promote_f32)\n } else if (local.type === 'i32' && valType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n } else if (local.type === 'i32' && valType === 'f32') {\n code.push(Op.i32_trunc_f32_s)\n } else if (local.type === 'f32' && valType === 'i32') {\n code.push(Op.f32_convert_i32_s)\n } else if (local.type === 'f32' && valType === 'f64') {\n code.push(Op.f32_demote_f64)\n }\n } else {\n // Compound assignment: +=, -=, etc.\n const valType = inferExprType(node.right as acorn.Expression, ctx)\n\n // Determine operation type - promote to wider type for the operation\n let opType: WasmValueType = local.type\n if (valType === 'f64' || local.type === 'f64') {\n opType = 'f64'\n } else if (valType === 'f32' || local.type === 'f32') {\n opType = 'f32'\n }\n\n // Get left operand and convert to opType if needed\n code.push(Op.local_get, ...encodeULEB128(local.index))\n if (opType === 'f64' && local.type === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (opType === 'f64' && local.type === 'f32') {\n code.push(Op.f64_promote_f32)\n } else if (opType === 'f32' && local.type === 'i32') {\n code.push(Op.f32_convert_i32_s)\n }\n\n // Get right operand and convert to opType if needed\n code.push(...compileExpression(node.right as acorn.Expression, ctx))\n if (opType === 'f64' && valType === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (opType === 'f64' && valType === 'f32') {\n code.push(Op.f64_promote_f32)\n } else if (opType === 'f32' && valType === 'i32') {\n code.push(Op.f32_convert_i32_s)\n }\n\n // Perform operation in opType\n const op = node.operator.slice(0, -1) // Remove '='\n const opMap: Record<string, Record<string, number>> = {\n '+': { i32: Op.i32_add, f32: Op.f32_add, f64: Op.f64_add },\n '-': { i32: Op.i32_sub, f32: Op.f32_sub, f64: Op.f64_sub },\n '*': { i32: Op.i32_mul, f32: Op.f32_mul, f64: Op.f64_mul },\n '/': { i32: Op.i32_div_s, f32: Op.f32_div, f64: Op.f64_div },\n }\n const opcode = opMap[op]?.[opType]\n if (!opcode) {\n ctx.errors.push(`Unsupported compound assignment: ${node.operator}`)\n return []\n }\n code.push(opcode)\n\n // Convert result back to local type if needed\n if (local.type === 'i32' && opType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n } else if (local.type === 'i32' && opType === 'f32') {\n code.push(Op.i32_trunc_f32_s)\n } else if (local.type === 'f32' && opType === 'f64') {\n code.push(Op.f32_demote_f64)\n }\n }\n\n code.push(Op.local_tee, ...encodeULEB128(local.index)) // tee returns the value\n\n return code\n}\n\n/** Compile an update expression (++, --) */\nfunction compileUpdate(\n node: acorn.UpdateExpression,\n ctx: CompileContext\n): number[] {\n if (node.argument.type !== 'Identifier') {\n ctx.errors.push('Update expression argument must be identifier')\n return []\n }\n\n const name = (node.argument as acorn.Identifier).name\n const local = getLocal(ctx, name)\n if (!local) {\n ctx.errors.push(`Unknown variable: ${name}`)\n return []\n }\n\n const code: number[] = []\n const isI32 = local.type === 'i32'\n\n if (node.prefix) {\n // ++x or --x: modify then return new value\n code.push(Op.local_get, ...encodeULEB128(local.index))\n if (isI32) {\n code.push(Op.i32_const, 1)\n code.push(node.operator === '++' ? Op.i32_add : Op.i32_sub)\n } else {\n code.push(Op.f64_const, ...encodeF64(1))\n code.push(node.operator === '++' ? Op.f64_add : Op.f64_sub)\n }\n code.push(Op.local_tee, ...encodeULEB128(local.index))\n } else {\n // x++ or x--: return old value, then modify\n code.push(Op.local_get, ...encodeULEB128(local.index))\n // Store incremented value\n code.push(Op.local_get, ...encodeULEB128(local.index))\n if (isI32) {\n code.push(Op.i32_const, 1)\n code.push(node.operator === '++' ? Op.i32_add : Op.i32_sub)\n } else {\n code.push(Op.f64_const, ...encodeF64(1))\n code.push(node.operator === '++' ? Op.f64_add : Op.f64_sub)\n }\n code.push(Op.local_set, ...encodeULEB128(local.index))\n }\n\n return code\n}\n\n/** Compile array element access: arr[i] */\nfunction compileArrayAccess(\n node: acorn.MemberExpression,\n ctx: CompileContext\n): number[] {\n if (node.object.type !== 'Identifier') {\n ctx.errors.push('Array access requires identifier')\n return []\n }\n\n const name = (node.object as acorn.Identifier).name\n const param = ctx.params.find((p) => p.name === name)\n\n if (!param?.isArray || !param.arrayType) {\n ctx.errors.push(`${name} is not a typed array parameter`)\n return []\n }\n\n const arrayInfo = TYPED_ARRAYS[param.arrayType]\n if (!arrayInfo) {\n ctx.errors.push(`Unknown array type: ${param.arrayType}`)\n return []\n }\n\n ctx.needsMemory = true\n\n const code: number[] = []\n\n // Get base address (array pointer param)\n const local = getLocal(ctx, name)\n if (!local) {\n ctx.errors.push(`Unknown array: ${name}`)\n return []\n }\n code.push(Op.local_get, ...encodeULEB128(local.index))\n\n // Compute offset: index * bytesPerElement\n if (!node.computed || !node.property) {\n ctx.errors.push('Array access requires computed index')\n return []\n }\n\n const indexCode = compileExpression(node.property as acorn.Expression, ctx)\n const indexType = inferExprType(node.property as acorn.Expression, ctx)\n\n code.push(...indexCode)\n\n // Convert index to i32 if needed\n if (indexType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n }\n\n // Multiply by bytes per element\n if (arrayInfo.bytesPerElement > 1) {\n code.push(Op.i32_const, ...encodeSLEB128(arrayInfo.bytesPerElement))\n code.push(Op.i32_mul)\n }\n\n // Add base address\n code.push(Op.i32_add)\n\n // Load value (align=0, offset=0)\n code.push(arrayInfo.loadOp, 0, 0)\n\n return code\n}\n\n/** Compile array element store: arr[i] = value */\nfunction compileArrayStore(\n target: acorn.MemberExpression,\n value: acorn.Expression,\n operator: string,\n ctx: CompileContext\n): number[] {\n if (target.object.type !== 'Identifier') {\n ctx.errors.push('Array store requires identifier')\n return []\n }\n\n const name = (target.object as acorn.Identifier).name\n const param = ctx.params.find((p) => p.name === name)\n\n if (!param?.isArray || !param.arrayType) {\n ctx.errors.push(`${name} is not a typed array parameter`)\n return []\n }\n\n const arrayInfo = TYPED_ARRAYS[param.arrayType]\n if (!arrayInfo) {\n ctx.errors.push(`Unknown array type: ${param.arrayType}`)\n return []\n }\n\n ctx.needsMemory = true\n\n const code: number[] = []\n\n // Get local for array pointer\n const local = getLocal(ctx, name)\n if (!local) return []\n\n if (!target.computed || !target.property) {\n ctx.errors.push('Array store requires computed index')\n return []\n }\n\n const indexCode = compileExpression(target.property as acorn.Expression, ctx)\n const indexType = inferExprType(target.property as acorn.Expression, ctx)\n\n // Helper to generate address computation code\n const computeAddress = (): number[] => {\n const addr: number[] = []\n addr.push(Op.local_get, ...encodeULEB128(local.index))\n addr.push(...indexCode)\n if (indexType === 'f64') {\n addr.push(Op.i32_trunc_f64_s)\n }\n if (arrayInfo.bytesPerElement > 1) {\n addr.push(Op.i32_const, ...encodeSLEB128(arrayInfo.bytesPerElement))\n addr.push(Op.i32_mul)\n }\n addr.push(Op.i32_add)\n return addr\n }\n\n // Compile value\n if (operator === '=') {\n code.push(...compileExpression(value, ctx))\n } else {\n // Compound assignment - load current value, compute, store\n // Use a temp local to store address for reuse\n const addrLocal = declareLocal(ctx, `__addr_${ctx.nextLocalIndex}`, 'i32')\n\n // Compute address and save it\n code.push(...computeAddress())\n code.push(Op.local_tee, ...encodeULEB128(addrLocal))\n code.push(arrayInfo.loadOp, 0, 0)\n\n // Compile right side and convert to match array element type\n code.push(...compileExpression(value, ctx))\n const rhsType = inferExprType(value, ctx)\n if (arrayInfo.elementType === 'f32' && rhsType === 'f64') {\n code.push(Op.f32_demote_f64)\n } else if (arrayInfo.elementType === 'f64' && rhsType === 'f32') {\n code.push(Op.f64_promote_f32)\n } else if (arrayInfo.elementType === 'f32' && rhsType === 'i32') {\n code.push(Op.f32_convert_i32_s)\n } else if (arrayInfo.elementType === 'f64' && rhsType === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (arrayInfo.elementType === 'i32' && rhsType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n } else if (arrayInfo.elementType === 'i32' && rhsType === 'f32') {\n code.push(Op.i32_trunc_f32_s)\n }\n\n const op = operator.slice(0, -1)\n const opMap: Record<string, number> = {\n '+':\n arrayInfo.elementType === 'i32'\n ? Op.i32_add\n : arrayInfo.elementType === 'f32'\n ? Op.f32_add\n : Op.f64_add,\n '-':\n arrayInfo.elementType === 'i32'\n ? Op.i32_sub\n : arrayInfo.elementType === 'f32'\n ? Op.f32_sub\n : Op.f64_sub,\n '*':\n arrayInfo.elementType === 'i32'\n ? Op.i32_mul\n : arrayInfo.elementType === 'f32'\n ? Op.f32_mul\n : Op.f64_mul,\n }\n code.push(opMap[op] ?? Op.f64_add)\n\n // Store: need address then value\n // Swap: store value in temp, get address, get value back\n const valLocal = declareLocal(\n ctx,\n `__val_${ctx.nextLocalIndex}`,\n arrayInfo.elementType\n )\n code.push(Op.local_set, ...encodeULEB128(valLocal))\n code.push(Op.local_get, ...encodeULEB128(addrLocal))\n code.push(Op.local_get, ...encodeULEB128(valLocal))\n code.push(arrayInfo.storeOp, 0, 0)\n\n // Return the stored value\n code.push(Op.local_get, ...encodeULEB128(valLocal))\n return code\n }\n\n // Convert value type if needed\n const valType = inferExprType(value, ctx)\n if (arrayInfo.elementType === 'f32' && valType === 'f64') {\n code.push(Op.f32_demote_f64)\n } else if (arrayInfo.elementType === 'f64' && valType === 'f32') {\n code.push(Op.f64_promote_f32)\n } else if (arrayInfo.elementType === 'i32' && valType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n }\n\n // Store needs address then value - we have value on top\n // Swap using temp local\n const tempLocal = declareLocal(\n ctx,\n `__tmp_${ctx.nextLocalIndex}`,\n arrayInfo.elementType\n )\n code.push(Op.local_set, ...encodeULEB128(tempLocal))\n\n // Recompute address (simpler than complex stack manipulation)\n code.push(Op.local_get, ...encodeULEB128(local.index))\n code.push(...indexCode)\n if (indexType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n }\n if (arrayInfo.bytesPerElement > 1) {\n code.push(Op.i32_const, ...encodeSLEB128(arrayInfo.bytesPerElement))\n code.push(Op.i32_mul)\n }\n code.push(Op.i32_add)\n\n code.push(Op.local_get, ...encodeULEB128(tempLocal))\n code.push(arrayInfo.storeOp, 0, 0)\n\n // Return stored value\n code.push(Op.local_get, ...encodeULEB128(tempLocal))\n\n return code\n}\n\n/** Compile a function call */\nfunction compileCall(\n node: acorn.CallExpression,\n ctx: CompileContext\n): number[] {\n // Handle Math.xxx calls\n if (node.callee.type === 'MemberExpression') {\n const callee = node.callee as acorn.MemberExpression\n if (\n callee.object.type === 'Identifier' &&\n (callee.object as acorn.Identifier).name === 'Math' &&\n callee.property.type === 'Identifier'\n ) {\n const method = (callee.property as acorn.Identifier).name\n return compileMathCall(method, node.arguments as acorn.Expression[], ctx)\n }\n }\n\n // Handle SIMD intrinsics: f32x4_xxx(...), v128_load(...)\n if (node.callee.type === 'Identifier') {\n const name = (node.callee as acorn.Identifier).name\n if (name.startsWith('f32x4_') || name.startsWith('v128_')) {\n return compileSIMDCall(name, node.arguments as acorn.Expression[], ctx)\n }\n }\n\n ctx.errors.push(`Unsupported function call: ${node.callee.type}`)\n return [Op.f64_const, ...encodeF64(0)]\n}\n\n/** Compile SIMD intrinsic calls */\nfunction compileSIMDCall(\n name: string,\n args: acorn.Expression[],\n ctx: CompileContext\n): number[] {\n ctx.needsMemory = true\n const code: number[] = []\n\n switch (name) {\n case 'v128_load':\n case 'f32x4_load': {\n // f32x4_load(arrayPtr, byteOffset) \u2192 v128\n code.push(...compileExpression(args[0], ctx))\n const ptrType = inferExprType(args[0], ctx)\n if (ptrType === 'f64') code.push(Op.i32_trunc_f64_s)\n code.push(...compileExpression(args[1], ctx))\n const offType = inferExprType(args[1], ctx)\n if (offType === 'f64') code.push(Op.i32_trunc_f64_s)\n else if (offType === 'f32') code.push(Op.i32_trunc_f32_s)\n code.push(Op.i32_add)\n // v128.load align=2 (2^2=4, f32 natural alignment), offset=0\n code.push(...encodeSIMDMemarg(SimdOp.v128_load, 2, 0))\n return code\n }\n\n case 'v128_store':\n case 'f32x4_store': {\n // f32x4_store(arrayPtr, byteOffset, v128value) \u2192 void (push dummy for drop)\n code.push(...compileExpression(args[0], ctx))\n const ptrType = inferExprType(args[0], ctx)\n if (ptrType === 'f64') code.push(Op.i32_trunc_f64_s)\n code.push(...compileExpression(args[1], ctx))\n const offType = inferExprType(args[1], ctx)\n if (offType === 'f64') code.push(Op.i32_trunc_f64_s)\n else if (offType === 'f32') code.push(Op.i32_trunc_f32_s)\n code.push(Op.i32_add)\n code.push(...compileExpression(args[2], ctx))\n code.push(...encodeSIMDMemarg(SimdOp.v128_store, 2, 0))\n // v128.store doesn't push a value; push dummy i32 0 so ExpressionStatement's drop works\n code.push(Op.i32_const, 0)\n return code\n }\n\n case 'f32x4_splat': {\n // f32x4_splat(scalar) \u2192 v128\n code.push(...compileExpression(args[0], ctx))\n const argType = inferExprType(args[0], ctx)\n if (argType === 'i32') code.push(Op.f32_convert_i32_s)\n else if (argType === 'f64') code.push(Op.f32_demote_f64)\n code.push(...encodeSIMD(SimdOp.f32x4_splat))\n return code\n }\n\n case 'f32x4_extract_lane': {\n // f32x4_extract_lane(vec, laneIndex) \u2192 f32\n code.push(...compileExpression(args[0], ctx))\n const lane = (args[1] as acorn.Literal).value as number\n if (!Number.isInteger(lane) || lane < 0 || lane > 3) {\n ctx.errors.push(`f32x4_extract_lane: lane must be 0-3, got ${lane}`)\n return [Op.f32_const, ...encodeF32(0)]\n }\n code.push(SIMD_PREFIX, ...encodeULEB128(SimdOp.f32x4_extract_lane), lane)\n return code\n }\n\n case 'f32x4_replace_lane': {\n // f32x4_replace_lane(vec, laneIndex, scalar) \u2192 v128\n code.push(...compileExpression(args[0], ctx))\n const lane = (args[1] as acorn.Literal).value as number\n if (!Number.isInteger(lane) || lane < 0 || lane > 3) {\n ctx.errors.push(`f32x4_replace_lane: lane must be 0-3, got ${lane}`)\n return [Op.f32_const, ...encodeF32(0)]\n }\n code.push(...compileExpression(args[2], ctx))\n const valType = inferExprType(args[2], ctx)\n if (valType === 'i32') code.push(Op.f32_convert_i32_s)\n else if (valType === 'f64') code.push(Op.f32_demote_f64)\n code.push(SIMD_PREFIX, ...encodeULEB128(SimdOp.f32x4_replace_lane), lane)\n return code\n }\n\n case 'f32x4_add':\n case 'f32x4_sub':\n case 'f32x4_mul':\n case 'f32x4_div': {\n // Binary v128 op: f32x4_add(a, b) \u2192 v128\n code.push(...compileExpression(args[0], ctx))\n code.push(...compileExpression(args[1], ctx))\n const opMap: Record<string, number> = {\n f32x4_add: SimdOp.f32x4_add,\n f32x4_sub: SimdOp.f32x4_sub,\n f32x4_mul: SimdOp.f32x4_mul,\n f32x4_div: SimdOp.f32x4_div,\n }\n code.push(...encodeSIMD(opMap[name]))\n return code\n }\n\n case 'f32x4_neg':\n case 'f32x4_sqrt': {\n // Unary v128 op: f32x4_neg(a) \u2192 v128\n code.push(...compileExpression(args[0], ctx))\n const unaryMap: Record<string, number> = {\n f32x4_neg: SimdOp.f32x4_neg,\n f32x4_sqrt: SimdOp.f32x4_sqrt,\n }\n code.push(...encodeSIMD(unaryMap[name]))\n return code\n }\n\n default:\n ctx.errors.push(`Unknown SIMD intrinsic: ${name}`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n}\n\n/** Compile Math.xxx calls */\nfunction compileMathCall(\n method: string,\n args: acorn.Expression[],\n ctx: CompileContext\n): number[] {\n const code: number[] = []\n\n // Compile arguments\n for (const arg of args) {\n code.push(...compileExpression(arg, ctx))\n // Ensure f64 for math functions\n const type = inferExprType(arg, ctx)\n if (type === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (type === 'f32') {\n code.push(Op.f64_promote_f32)\n }\n }\n\n // Map to WASM ops or imports\n const builtins: Record<string, number> = {\n abs: Op.f64_abs,\n ceil: Op.f64_ceil,\n floor: Op.f64_floor,\n trunc: Op.f64_trunc,\n sqrt: Op.f64_sqrt,\n min: Op.f64_min,\n max: Op.f64_max,\n }\n\n const opcode = builtins[method]\n if (opcode !== undefined) {\n code.push(opcode)\n return code\n }\n\n // Functions that need imports (sin, cos, etc.)\n const needsImport = [\n 'sin',\n 'cos',\n 'tan',\n 'asin',\n 'acos',\n 'atan',\n 'atan2',\n 'exp',\n 'log',\n 'pow',\n ]\n if (needsImport.includes(method)) {\n ctx.needsMathImports.add(method)\n // Will be handled by import section\n // For now, error\n ctx.errors.push(`Math.${method} requires JS import (not yet implemented)`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n\n ctx.errors.push(`Unknown Math method: ${method}`)\n return [Op.f64_const, ...encodeF64(0)]\n}\n\n// ============================================================================\n// Module Building\n// ============================================================================\n\n/** Parse type annotation from capture string like \"arr: Float32Array\" */\nfunction parseTypeAnnotation(capture: string): TypedParam {\n const parts = capture.split(':').map((s) => s.trim())\n const name = parts[0]\n\n if (parts.length === 1) {\n // No annotation - default to f64\n return { name, type: 'f64' }\n }\n\n const typeStr = parts[1]\n\n // Check for typed arrays\n if (TYPED_ARRAYS[typeStr]) {\n return { name, type: 'i32', isArray: true, arrayType: typeStr }\n }\n\n // Check for primitives\n const typeMap: Record<string, WasmValueType> = {\n i32: 'i32',\n i64: 'i64',\n f32: 'f32',\n f64: 'f64',\n number: 'f64',\n int: 'i32',\n }\n\n return { name, type: typeMap[typeStr] ?? 'f64' }\n}\n\n/** Build a complete WASM module */\nfunction buildModule(\n params: TypedParam[],\n bodyCode: number[],\n localTypes: WasmValueType[],\n needsMemory: boolean,\n hasReturn: boolean\n): number[] {\n // Magic number and version\n const header = [0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]\n\n // Type section: function signature\n const paramWasmTypes = params.map((p) => Type[p.type])\n const returnSpec = hasReturn ? [0x01, Type.f64] : [0x00] // one f64 return OR void\n const typeSection = encodeSection(Section.type, [\n 0x01, // one type\n 0x60, // func type\n ...encodeULEB128(params.length),\n ...paramWasmTypes,\n ...returnSpec,\n ])\n\n // Memory section (if needed)\n const memorySection: number[] = []\n if (needsMemory) {\n // Import memory from JS instead of declaring it\n // This lets us share memory with typed arrays\n }\n\n // Import section for memory\n let importSection: number[] = []\n if (needsMemory) {\n importSection = encodeSection(Section.import, [\n 0x01, // one import\n ...encodeString('env'),\n ...encodeString('memory'),\n 0x02, // memory\n 0x00, // flags: no max\n 0x01, // initial: 1 page (64KB)\n ])\n }\n\n // Function section: function 0 has type 0\n const funcSection = encodeSection(Section.function, [\n 0x01, // one function\n 0x00, // type index 0\n ])\n\n // Export section: export function as \"compute\"\n const exportSection = encodeSection(Section.export, [\n 0x01, // one export\n ...encodeString('compute'),\n 0x00, // export kind: function\n 0x00, // function index 0\n ])\n\n // Code section\n // Encode locals: group by type\n const localGroups: number[][] = []\n if (localTypes.length > 0) {\n let currentType = localTypes[0]\n let count = 1\n for (let i = 1; i < localTypes.length; i++) {\n if (localTypes[i] === currentType) {\n count++\n } else {\n localGroups.push([...encodeULEB128(count), Type[currentType]])\n currentType = localTypes[i]\n count = 1\n }\n }\n localGroups.push([...encodeULEB128(count), Type[currentType]])\n }\n\n const localsEncoded = [\n ...encodeULEB128(localGroups.length),\n ...localGroups.flat(),\n ]\n\n const funcBody = [...localsEncoded, ...bodyCode, Op.end]\n\n const codeSection = encodeSection(Section.code, [\n 0x01, // one function\n ...encodeULEB128(funcBody.length),\n ...funcBody,\n ])\n\n // Assemble module\n const sections = [...header, ...typeSection]\n\n if (importSection.length > 0) {\n sections.push(...importSection)\n }\n\n sections.push(...funcSection, ...exportSection, ...codeSection)\n\n return sections\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/** Compile result */\nexport interface WasmCompileResult {\n /** The compiled WebAssembly module bytes */\n bytes: Uint8Array\n /** Any warnings during compilation */\n warnings: string[]\n /** Whether compilation succeeded */\n success: boolean\n /** Error message if compilation failed */\n error?: string\n /** Whether the module needs imported memory */\n needsMemory?: boolean\n /** WAT text representation (for debugging) */\n wat?: string\n}\n\n/**\n * Compile a WASM block to WebAssembly\n */\nexport function compileToWasm(block: WasmBlock): WasmCompileResult {\n try {\n // Parse type annotations from captures\n const params = block.captures.map(parseTypeAnnotation)\n\n // Parse the body as JavaScript\n let ast: acorn.Program\n try {\n // Wrap in function to allow return statements\n const wrapped = `function __wasm__(${params\n .map((p) => p.name)\n .join(', ')}) { ${block.body} }`\n ast = acorn.parse(wrapped, { ecmaVersion: 2022 }) as acorn.Program\n } catch (e: any) {\n return {\n bytes: new Uint8Array(),\n warnings: [],\n success: false,\n error: `Parse error: ${e.message}`,\n }\n }\n\n // Get the function body\n const funcDecl = ast.body[0] as acorn.FunctionDeclaration\n const body = funcDecl.body.body\n\n // Create compilation context\n const ctx = createContext(params)\n\n // Compile statements\n const code: number[] = []\n for (const stmt of body) {\n code.push(...compileStatement(stmt, ctx))\n }\n\n // Check for errors\n if (ctx.errors.length > 0) {\n return {\n bytes: new Uint8Array(),\n warnings: ctx.warnings,\n success: false,\n error: ctx.errors.join('; '),\n }\n }\n\n // Build the module\n const moduleBytes = buildModule(\n params,\n code,\n ctx.localTypes,\n ctx.needsMemory,\n ctx.hasReturn\n )\n\n // Generate WAT disassembly for debugging\n const watText = disassemble(code, params, ctx.localTypes)\n\n return {\n bytes: new Uint8Array(moduleBytes),\n warnings: ctx.warnings,\n success: true,\n needsMemory: ctx.needsMemory,\n wat: watText,\n }\n } catch (e: any) {\n return {\n bytes: new Uint8Array(),\n warnings: [],\n success: false,\n error: e.message,\n }\n }\n}\n\n/**\n * Instantiate a compiled WASM module\n */\nexport async function instantiateWasm(\n bytes: Uint8Array,\n memory?: WebAssembly.Memory\n): Promise<WebAssembly.Instance> {\n const imports: WebAssembly.Imports = {}\n\n if (memory) {\n imports.env = { memory }\n }\n\n const module = await WebAssembly.compile(bytes)\n return WebAssembly.instantiate(module, imports)\n}\n\n/**\n * Create a callable function from a WASM block with typed array support\n */\nexport async function createWasmFunction(block: WasmBlock): Promise<{\n fn: (...args: any[]) => any\n memory?: WebAssembly.Memory\n success: boolean\n error?: string\n}> {\n const result = compileToWasm(block)\n\n if (!result.success) {\n return { fn: () => 0, success: false, error: result.error }\n }\n\n try {\n let memory: WebAssembly.Memory | undefined\n\n if (result.needsMemory) {\n // Create shared memory for typed arrays (256 pages = 16MB)\n memory = new WebAssembly.Memory({ initial: 256 })\n }\n\n const instance = await instantiateWasm(result.bytes, memory)\n const compute = instance.exports.compute as (...args: number[]) => number\n\n // Wrap to handle typed array arguments\n const params = block.captures.map(parseTypeAnnotation)\n const hasArrays = params.some((p) => p.isArray)\n\n if (!hasArrays) {\n return { fn: compute, memory, success: true }\n }\n\n // Create wrapper that copies typed arrays to/from WASM memory\n const wrappedFn = (...args: any[]) => {\n if (!memory) throw new Error('Memory not initialized')\n\n const memoryView = new Uint8Array(memory.buffer)\n let offset = 0\n const pointers: number[] = []\n\n // Copy input arrays to memory\n for (let i = 0; i < params.length; i++) {\n const param = params[i]\n const arg = args[i]\n\n if (param.isArray && arg instanceof Object && 'buffer' in arg) {\n const typedArray = arg as\n | Float32Array\n | Float64Array\n | Int32Array\n | Uint8Array\n const bytes = new Uint8Array(\n typedArray.buffer,\n typedArray.byteOffset,\n typedArray.byteLength\n )\n memoryView.set(bytes, offset)\n pointers.push(offset)\n offset += bytes.length\n // Align to 8 bytes\n offset = (offset + 15) & ~15\n } else {\n pointers.push(arg as number)\n }\n }\n\n // Call WASM function\n const resultVal = compute(...pointers)\n\n // Copy output arrays back (they're modified in place)\n offset = 0\n for (let i = 0; i < params.length; i++) {\n const param = params[i]\n const arg = args[i]\n\n if (param.isArray && arg instanceof Object && 'buffer' in arg) {\n const typedArray = arg as\n | Float32Array\n | Float64Array\n | Int32Array\n | Uint8Array\n const bytes = new Uint8Array(\n typedArray.buffer,\n typedArray.byteOffset,\n typedArray.byteLength\n )\n bytes.set(memoryView.slice(offset, offset + bytes.length))\n offset += bytes.length\n offset = (offset + 15) & ~15\n }\n }\n\n return resultVal\n }\n\n return { fn: wrappedFn, memory, success: true }\n } catch (e: any) {\n return { fn: () => 0, success: false, error: e.message }\n }\n}\n\n/**\n * Compile and register a WASM block globally\n */\nexport async function registerWasmBlock(block: WasmBlock): Promise<boolean> {\n const result = await createWasmFunction(block)\n\n if (!result.success) {\n console.warn(`WASM compilation failed for ${block.id}:`, result.error)\n return false\n }\n\n // Register globally\n ;(globalThis as any)[block.id] = result.fn\n\n return true\n}\n\n/**\n * Compile all WASM blocks from a preprocessed source\n */\nexport async function compileWasmBlocks(blocks: WasmBlock[]): Promise<{\n compiled: number\n failed: number\n errors: string[]\n}> {\n let compiled = 0\n let failed = 0\n const errors: string[] = []\n\n for (const block of blocks) {\n const success = await registerWasmBlock(block)\n if (success) {\n compiled++\n } else {\n failed++\n errors.push(`Failed to compile ${block.id}`)\n }\n }\n\n return { compiled, failed, errors }\n}\n\n/**\n * Compiled WASM data that can be serialized and passed to an iframe\n */\nexport interface CompiledWasmData {\n id: string\n bytes: number[] // Uint8Array as plain array for JSON serialization\n captures: string[]\n needsMemory: boolean\n}\n\n/**\n * Compile WASM blocks and return serializable data for iframe instantiation\n */\nexport async function compileWasmBlocksForIframe(blocks: WasmBlock[]): Promise<{\n compiled: CompiledWasmData[]\n failed: number\n errors: string[]\n}> {\n const compiled: CompiledWasmData[] = []\n let failed = 0\n const errors: string[] = []\n\n for (const block of blocks) {\n const result = compileToWasm(block)\n if (result.success) {\n compiled.push({\n id: block.id,\n bytes: Array.from(result.bytes),\n captures: block.captures,\n needsMemory: result.needsMemory ?? false,\n })\n } else {\n failed++\n errors.push(`Failed to compile ${block.id}: ${result.error}`)\n }\n }\n\n return { compiled, failed, errors }\n}\n\n/**\n * Generate JavaScript code that instantiates compiled WASM in an iframe\n * This code should be injected into the iframe's script\n */\nexport function generateWasmInstantiationCode(\n compiledBlocks: CompiledWasmData[]\n): string {\n if (compiledBlocks.length === 0) return ''\n\n // Helper function to parse type annotations (same as parseTypeAnnotation)\n const parseTypeCode = `\nfunction __parseWasmType(capture) {\n const match = capture.match(/^(\\\\w+)\\\\s*:\\\\s*(\\\\w+)$/);\n if (!match) return { name: capture, type: 'f64', isArray: false };\n const [, name, typeStr] = match;\n const arrayTypes = { Float32Array: 'f32', Float64Array: 'f64', Int32Array: 'i32', Uint8Array: 'i32' };\n if (arrayTypes[typeStr]) {\n return { name, type: 'i32', isArray: true, arrayType: typeStr };\n }\n const typeMap = { i32: 'i32', i64: 'i64', f32: 'f32', f64: 'f64', number: 'f64', int: 'i32' };\n return { name, type: typeMap[typeStr] || 'f64', isArray: false };\n}\n`\n\n // Helper to create wrapped function\n const wrapperCode = `\nasync function __instantiateWasm(id, bytes, captures, needsMemory) {\n const params = captures.map(__parseWasmType);\n const hasArrays = params.some(p => p.isArray);\n\n let memory;\n if (needsMemory) {\n memory = new WebAssembly.Memory({ initial: 256 });\n }\n\n const importObject = memory ? { env: { memory } } : {};\n const module = await WebAssembly.compile(new Uint8Array(bytes));\n const instance = await WebAssembly.instantiate(module, importObject);\n const compute = instance.exports.compute;\n\n if (!hasArrays) {\n globalThis[id] = compute;\n return;\n }\n\n // Create wrapper that copies typed arrays to/from WASM memory\n globalThis[id] = function(...args) {\n const memoryView = new Uint8Array(memory.buffer);\n let offset = 0;\n const pointers = [];\n\n // Copy input arrays to memory\n for (let i = 0; i < params.length; i++) {\n const param = params[i];\n const arg = args[i];\n\n if (param.isArray && arg && arg.buffer) {\n const bytes = new Uint8Array(arg.buffer, arg.byteOffset, arg.byteLength);\n memoryView.set(bytes, offset);\n pointers.push(offset);\n offset += bytes.length;\n offset = (offset + 15) & ~15; // Align to 16 bytes (SIMD)\n } else {\n pointers.push(arg);\n }\n }\n\n // Call WASM function\n const result = compute(...pointers);\n\n // Copy output arrays back\n offset = 0;\n for (let i = 0; i < params.length; i++) {\n const param = params[i];\n const arg = args[i];\n\n if (param.isArray && arg && arg.buffer) {\n const bytes = new Uint8Array(arg.buffer, arg.byteOffset, arg.byteLength);\n bytes.set(memoryView.slice(offset, offset + bytes.length));\n offset += bytes.length;\n offset = (offset + 15) & ~15;\n }\n }\n\n return result;\n };\n}\n`\n\n // Generate instantiation calls for each block\n const instantiationCalls = compiledBlocks\n .map(\n (block) =>\n `__instantiateWasm(${JSON.stringify(block.id)}, ${JSON.stringify(\n block.bytes\n )}, ${JSON.stringify(block.captures)}, ${block.needsMemory})`\n )\n .join(',\\n ')\n\n return `\n // WASM instantiation helpers\n ${parseTypeCode}\n ${wrapperCode}\n\n // Instantiate all WASM blocks\n await Promise.all([\n ${instantiationCalls}\n ]);\n `\n}\n", "/**\n * TJS WASM Bootstrap Generation\n *\n * Compiles inline WASM blocks and generates JavaScript bootstrap code.\n */\n\nimport { compileToWasm } from '../wasm'\nimport type { WasmBlock } from '../parser'\n\nexport function generateWasmBootstrap(blocks: WasmBlock[]): {\n code: string\n results: {\n id: string\n success: boolean\n error?: string\n byteLength?: number\n }[]\n} {\n const results: {\n id: string\n success: boolean\n error?: string\n byteLength?: number\n }[] = []\n const compiledBlocks: {\n id: string\n base64: string\n captures: string[]\n needsMemory: boolean\n wat: string\n }[] = []\n\n for (const block of blocks) {\n const result = compileToWasm(block)\n if (result.success) {\n // Convert bytes to base64 for embedding\n const base64 = btoa(String.fromCharCode(...result.bytes))\n compiledBlocks.push({\n id: block.id,\n base64,\n captures: block.captures,\n needsMemory: result.needsMemory ?? false,\n wat: result.wat ?? '',\n })\n results.push({\n id: block.id,\n success: true,\n byteLength: result.bytes.length,\n })\n } else {\n results.push({\n id: block.id,\n success: false,\n error: result.error,\n })\n }\n }\n\n if (compiledBlocks.length === 0) {\n return { code: '', results }\n }\n\n // Generate WAT comments for each block\n const watComments = compiledBlocks\n .map((b) => {\n const watLines = b.wat.split('\\n').map((line) => ` * ${line}`)\n return `/**\\n * WASM: ${b.id}\\n${watLines.join('\\n')}\\n */`\n })\n .join('\\n')\n\n // Generate self-contained bootstrap code\n // This runs immediately and sets up globalThis.__tjs_wasm_N functions\n const blockData = compiledBlocks\n .map(\n (b) =>\n `{id:${JSON.stringify(b.id)},b64:${JSON.stringify(\n b.base64\n )},c:${JSON.stringify(b.captures)},m:${b.needsMemory}}`\n )\n .join(',')\n\n // Check if any block needs memory (shared across all blocks)\n const anyNeedsMemory = compiledBlocks.some((b) => b.needsMemory)\n\n const code = `${watComments}\n;(async()=>{\nconst __wasmBlocks=[${blockData}];\nconst __b64ToBytes=s=>{const b=atob(s),a=new Uint8Array(b.length);for(let i=0;i<b.length;i++)a[i]=b.charCodeAt(i);return a};\nconst __parseType=c=>{const m=c.match(/^(\\\\w+)\\\\s*:\\\\s*(\\\\w+)$/);if(!m)return{n:c,t:'f64',a:false};const[,n,ts]=m;const at={Float32Array:'f32',Float64Array:'f64',Int32Array:'i32',Uint8Array:'i32'};if(at[ts])return{n,t:'i32',a:true,at:ts};return{n,t:'f64',a:false}};\n${\n anyNeedsMemory\n ? `const __wasmMem=new WebAssembly.Memory({initial:1024});\nlet __woff=0;\nglobalThis.wasmBuffer=function(Ctor,len){const bytes=len*Ctor.BYTES_PER_ELEMENT;const align=Math.max(Ctor.BYTES_PER_ELEMENT,16);__woff=(__woff+align-1)&~(align-1);const arr=new Ctor(__wasmMem.buffer,__woff,len);__woff+=bytes;return arr};`\n : ''\n}\nfor(const{id,b64,c,m}of __wasmBlocks){\n const bytes=__b64ToBytes(b64);\n const params=c.map(__parseType);\n const hasArrays=params.some(p=>p.a);\n const mem=m?__wasmMem:null;\n const imp=mem?{env:{memory:mem}}:{};\n const inst=await WebAssembly.instantiate(await WebAssembly.compile(bytes),imp);\n const compute=inst.exports.compute;\n if(!hasArrays){globalThis[id]=compute;continue}\n globalThis[id]=function(...args){\n const mv=new Uint8Array(mem.buffer);let off=__woff;const ptrs=[];\n for(let i=0;i<params.length;i++){const p=params[i],a=args[i];\n if(p.a&&a?.buffer){\n if(a.buffer===mem.buffer){ptrs.push(a.byteOffset)}\n else{const ab=new Uint8Array(a.buffer,a.byteOffset,a.byteLength);off=(off+15)&~15;mv.set(ab,off);ptrs.push(off);off+=ab.length}\n } else ptrs.push(a)}\n const r=compute(...ptrs);off=__woff;\n for(let i=0;i<params.length;i++){const p=params[i],a=args[i];\n if(p.a&&a?.buffer){\n if(a.buffer===mem.buffer) continue;\n const ab=new Uint8Array(a.buffer,a.byteOffset,a.byteLength);off=(off+15)&~15;ab.set(mv.slice(off,off+ab.length));off+=ab.length}}\n return r};\n}})();\n`.trim()\n\n return { code, results }\n}\n", "/**\n * TJS Core - Essential transpiler functions without TypeScript dependency\n *\n * This module provides the core AJS transpilation functions.\n * Import from here (not ./index) to avoid pulling in the TS compiler.\n */\n\nimport type { SeqNode } from '../builder'\nimport type {\n TranspileOptions,\n TranspileResult,\n FunctionSignature,\n TypeDescriptor,\n} from './types'\nimport { parse, validateSingleFunction } from './parser'\nimport { transformFunction } from './emitters/ast'\nimport {\n transpileToJS,\n type TJSTranspileResult,\n type TJSTranspileOptions,\n} from './emitters/js'\n\nexport * from './types'\nexport {\n parse,\n preprocess,\n extractTDoc,\n validateSingleFunction,\n} from './parser'\nexport { transformFunction } from './emitters/ast'\n\n/**\n * Transpile JavaScript source code to Agent99 AST\n */\nexport function transpile(\n source: string,\n options: TranspileOptions = {}\n): TranspileResult {\n const {\n ast: program,\n returnType,\n originalSource,\n requiredParams,\n } = parse(source, {\n filename: options.filename,\n colonShorthand: true,\n vmTarget: true,\n })\n\n const func = validateSingleFunction(program, options.filename)\n\n const { ast, signature, warnings } = transformFunction(\n func,\n originalSource,\n returnType,\n options,\n requiredParams\n )\n\n return {\n ast: ast as SeqNode,\n signature,\n warnings,\n }\n}\n\n/**\n * Transpile AsyncJS source and return just the AST\n */\nexport function ajs(strings: TemplateStringsArray, ...values: any[]): SeqNode\nexport function ajs(source: string): SeqNode\nexport function ajs(\n sourceOrStrings: string | TemplateStringsArray,\n ...values: any[]\n): SeqNode {\n if (typeof sourceOrStrings === 'string') {\n return transpile(sourceOrStrings).ast\n }\n const source = sourceOrStrings.reduce(\n (acc, str, i) =>\n acc + str + (values[i] !== undefined ? String(values[i]) : ''),\n ''\n )\n return transpile(source).ast\n}\n\n/**\n * Create a function with attached signature for introspection\n */\nexport function createAgent(\n source: string,\n vm: { run: (ast: any, args: any, options?: any) => Promise<any> },\n runOptions?: { fuel?: number; capabilities?: any }\n): ((args: Record<string, any>) => Promise<any>) & {\n signature: FunctionSignature\n ast: SeqNode\n} {\n const { ast, signature } = transpile(source)\n\n const agent = async (args: Record<string, any>) => {\n const result = await vm.run(ast, args, runOptions)\n return result.result\n }\n\n ;(agent as any).signature = signature\n ;(agent as any).ast = ast\n\n return agent as any\n}\n\n/**\n * Convert TypeDescriptor to JSON Schema\n */\nfunction typeDescriptorToJsonSchema(type: TypeDescriptor): any {\n switch (type.kind) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return { type: 'number' }\n case 'boolean':\n return { type: 'boolean' }\n case 'null':\n return { type: 'null' }\n case 'array':\n return {\n type: 'array',\n items: type.items ? typeDescriptorToJsonSchema(type.items) : {},\n }\n case 'object':\n if (!type.shape) {\n return { type: 'object' }\n }\n return {\n type: 'object',\n properties: Object.fromEntries(\n Object.entries(type.shape).map(([k, v]) => [\n k,\n typeDescriptorToJsonSchema(v),\n ])\n ),\n }\n case 'union':\n if (!type.members) {\n return {}\n }\n return {\n anyOf: type.members.map(typeDescriptorToJsonSchema),\n }\n case 'any':\n default:\n return {}\n }\n}\n\n/**\n * Get tool definitions from a set of agent functions\n */\nexport function getToolDefinitions(\n agents: Record<string, { signature: FunctionSignature }>\n): Array<{\n type: 'function'\n function: {\n name: string\n description?: string\n parameters: {\n type: 'object'\n properties: Record<string, any>\n required: string[]\n }\n }\n}> {\n return Object.entries(agents).map(([name, agent]) => {\n const sig = agent.signature\n\n const properties: Record<string, any> = {}\n const required: string[] = []\n\n for (const [paramName, param] of Object.entries(sig.parameters)) {\n properties[paramName] = typeDescriptorToJsonSchema(param.type)\n if (param.description) {\n properties[paramName].description = param.description\n }\n if (param.required) {\n required.push(paramName)\n }\n }\n\n return {\n type: 'function' as const,\n function: {\n name,\n description: sig.description,\n parameters: {\n type: 'object' as const,\n properties,\n required,\n },\n },\n }\n })\n}\n\n/**\n * Transpile TJS source to JavaScript with type metadata.\n * Works as both a function and a tagged template literal.\n */\nexport function tjs(\n strings: TemplateStringsArray,\n ...values: any[]\n): TJSTranspileResult\nexport function tjs(\n source: string,\n options?: TJSTranspileOptions\n): TJSTranspileResult\nexport function tjs(\n sourceOrStrings: string | TemplateStringsArray,\n optionsOrFirstValue?: TJSTranspileOptions | any,\n ...restValues: any[]\n): TJSTranspileResult {\n if (typeof sourceOrStrings === 'string') {\n return transpileToJS(\n sourceOrStrings,\n optionsOrFirstValue as TJSTranspileOptions\n )\n }\n // Tagged template literal\n const values =\n optionsOrFirstValue !== undefined\n ? [optionsOrFirstValue, ...restValues]\n : restValues\n const source = sourceOrStrings.reduce(\n (acc, str, i) =>\n acc + str + (values[i] !== undefined ? String(values[i]) : ''),\n ''\n )\n return transpileToJS(source)\n}\n", "/**\n * TJS Schema - Runtime type system for Typed JavaScript\n *\n * Builds on tosijs-schema to provide:\n * - Schema(x) callable for inference by example\n * - Schema.type(x) for \"fixed typeof\" (null returns 'null', not 'object')\n * - All tosijs-schema methods (string, number, object, array, etc.)\n *\n * Usage:\n * Schema('hello') // Schema matching string\n * Schema(42) // Schema matching number (integer)\n * Schema(null) // Schema matching null\n * Schema(undefined) // Schema matching undefined\n * Schema([1, 2, 3]) // Schema matching array of integers\n * Schema({name: 'Anne'}) // Schema matching object with name: string\n *\n * Schema.type(null) // 'null' (not 'object' like typeof)\n * Schema.type(undefined) // 'undefined'\n * Schema.type([]) // 'array' (not 'object' like typeof)\n *\n * Schema.null.validate(x) // true if x is null\n * Schema.undefined.validate(x) // true if x is undefined\n */\n\nimport { s, type Base } from 'tosijs-schema'\n\n/**\n * Get the \"fixed\" type of a value - unlike typeof, correctly handles null and arrays\n */\nfunction getType(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (Array.isArray(value)) return 'array'\n return typeof value\n}\n\n/**\n * Infer a schema from an example value\n * This wraps tosijs-schema's s.infer() for consistency\n */\nfunction infer(value: unknown): Base<unknown> {\n return s.infer(value)\n}\n\n// The base callable function\nfunction schemaCallable(value: unknown): Base<unknown> {\n return infer(value)\n}\n\n// Add our custom methods\nschemaCallable.type = getType\nschemaCallable.infer = infer\n\n// Create the Schema callable that proxies to s for all other properties\ntype SchemaCallable = {\n (value: unknown): Base<unknown>\n type: (value: unknown) => string\n infer: (value: unknown) => Base<unknown>\n} & typeof s\n\n/**\n * Schema - callable for inference, with all tosijs-schema methods attached\n * Uses a Proxy to delegate property access to tosijs-schema's s object\n */\nexport const Schema: SchemaCallable = new Proxy(schemaCallable as any, {\n get(target, prop) {\n // Our custom methods take precedence\n if (prop === 'type') return getType\n if (prop === 'infer') return infer\n // Delegate everything else to tosijs-schema's s\n return (s as any)[prop]\n },\n apply(target, thisArg, args) {\n // Make it callable - Schema(value) infers schema\n return infer(args[0])\n },\n})\n\n// Re-export useful types from tosijs-schema\nexport type { Base, Infer } from 'tosijs-schema'\n", "// AST walker module for ESTree compatible trees\n\n// A simple walk is one where you simply specify callbacks to be\n// called on specific nodes. The last two arguments are optional. A\n// simple use would be\n//\n// walk.simple(myTree, {\n// Expression: function(node) { ... }\n// });\n//\n// to do something with all expressions. All ESTree node types\n// can be used to identify node types, as well as Expression and\n// Statement, which denote categories of nodes.\n//\n// The base argument can be used to pass a custom (recursive)\n// walker, and state can be used to give this walked an initial\n// state.\n\nfunction simple(node, visitors, baseVisitor, state, override) {\n if (!baseVisitor) { baseVisitor = base\n ; }(function c(node, st, override) {\n var type = override || node.type;\n baseVisitor[type](node, st, c);\n if (visitors[type]) { visitors[type](node, st); }\n })(node, state, override);\n}\n\n// An ancestor walk keeps an array of ancestor nodes (including the\n// current node) and passes them to the callback as third parameter\n// (and also as state parameter when no other state is present).\nfunction ancestor(node, visitors, baseVisitor, state, override) {\n var ancestors = [];\n if (!baseVisitor) { baseVisitor = base\n ; }(function c(node, st, override) {\n var type = override || node.type;\n var isNew = node !== ancestors[ancestors.length - 1];\n if (isNew) { ancestors.push(node); }\n baseVisitor[type](node, st, c);\n if (visitors[type]) { visitors[type](node, st || ancestors, ancestors); }\n if (isNew) { ancestors.pop(); }\n })(node, state, override);\n}\n\n// A recursive walk is one where your functions override the default\n// walkers. They can modify and replace the state parameter that's\n// threaded through the walk, and can opt how and whether to walk\n// their child nodes (by calling their third argument on these\n// nodes).\nfunction recursive(node, state, funcs, baseVisitor, override) {\n var visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor\n ;(function c(node, st, override) {\n visitor[override || node.type](node, st, c);\n })(node, state, override);\n}\n\nfunction makeTest(test) {\n if (typeof test === \"string\")\n { return function (type) { return type === test; } }\n else if (!test)\n { return function () { return true; } }\n else\n { return test }\n}\n\nvar Found = function Found(node, state) { this.node = node; this.state = state; };\n\n// A full walk triggers the callback on each node\nfunction full(node, callback, baseVisitor, state, override) {\n if (!baseVisitor) { baseVisitor = base; }\n var last\n ;(function c(node, st, override) {\n var type = override || node.type;\n baseVisitor[type](node, st, c);\n if (last !== node) {\n callback(node, st, type);\n last = node;\n }\n })(node, state, override);\n}\n\n// An fullAncestor walk is like an ancestor walk, but triggers\n// the callback on each node\nfunction fullAncestor(node, callback, baseVisitor, state) {\n if (!baseVisitor) { baseVisitor = base; }\n var ancestors = [], last\n ;(function c(node, st, override) {\n var type = override || node.type;\n var isNew = node !== ancestors[ancestors.length - 1];\n if (isNew) { ancestors.push(node); }\n baseVisitor[type](node, st, c);\n if (last !== node) {\n callback(node, st || ancestors, ancestors, type);\n last = node;\n }\n if (isNew) { ancestors.pop(); }\n })(node, state);\n}\n\n// Find a node with a given start, end, and type (all are optional,\n// null can be used as wildcard). Returns a {node, state} object, or\n// undefined when it doesn't find a matching node.\nfunction findNodeAt(node, start, end, test, baseVisitor, state) {\n if (!baseVisitor) { baseVisitor = base; }\n test = makeTest(test);\n try {\n (function c(node, st, override) {\n var type = override || node.type;\n if ((start == null || node.start <= start) &&\n (end == null || node.end >= end))\n { baseVisitor[type](node, st, c); }\n if ((start == null || node.start === start) &&\n (end == null || node.end === end) &&\n test(type, node))\n { throw new Found(node, st) }\n })(node, state);\n } catch (e) {\n if (e instanceof Found) { return e }\n throw e\n }\n}\n\n// Find the innermost node of a given type that contains the given\n// position. Interface similar to findNodeAt.\nfunction findNodeAround(node, pos, test, baseVisitor, state) {\n test = makeTest(test);\n if (!baseVisitor) { baseVisitor = base; }\n try {\n (function c(node, st, override) {\n var type = override || node.type;\n if (node.start > pos || node.end < pos) { return }\n baseVisitor[type](node, st, c);\n if (test(type, node)) { throw new Found(node, st) }\n })(node, state);\n } catch (e) {\n if (e instanceof Found) { return e }\n throw e\n }\n}\n\n// Find the outermost matching node after a given position.\nfunction findNodeAfter(node, pos, test, baseVisitor, state) {\n test = makeTest(test);\n if (!baseVisitor) { baseVisitor = base; }\n try {\n (function c(node, st, override) {\n if (node.end < pos) { return }\n var type = override || node.type;\n if (node.start >= pos && test(type, node)) { throw new Found(node, st) }\n baseVisitor[type](node, st, c);\n })(node, state);\n } catch (e) {\n if (e instanceof Found) { return e }\n throw e\n }\n}\n\n// Find the outermost matching node before a given position.\nfunction findNodeBefore(node, pos, test, baseVisitor, state) {\n test = makeTest(test);\n if (!baseVisitor) { baseVisitor = base; }\n var max\n ;(function c(node, st, override) {\n if (node.start > pos) { return }\n var type = override || node.type;\n if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node))\n { max = new Found(node, st); }\n baseVisitor[type](node, st, c);\n })(node, state);\n return max\n}\n\n// Used to create a custom walker. Will fill in all missing node\n// type properties with the defaults.\nfunction make(funcs, baseVisitor) {\n var visitor = Object.create(baseVisitor || base);\n for (var type in funcs) { visitor[type] = funcs[type]; }\n return visitor\n}\n\nfunction skipThrough(node, st, c) { c(node, st); }\nfunction ignore(_node, _st, _c) {}\n\n// Node walkers.\n\nvar base = {};\n\nbase.Program = base.BlockStatement = base.StaticBlock = function (node, st, c) {\n for (var i = 0, list = node.body; i < list.length; i += 1)\n {\n var stmt = list[i];\n\n c(stmt, st, \"Statement\");\n }\n};\nbase.Statement = skipThrough;\nbase.EmptyStatement = ignore;\nbase.ExpressionStatement = base.ParenthesizedExpression = base.ChainExpression =\n function (node, st, c) { return c(node.expression, st, \"Expression\"); };\nbase.IfStatement = function (node, st, c) {\n c(node.test, st, \"Expression\");\n c(node.consequent, st, \"Statement\");\n if (node.alternate) { c(node.alternate, st, \"Statement\"); }\n};\nbase.LabeledStatement = function (node, st, c) { return c(node.body, st, \"Statement\"); };\nbase.BreakStatement = base.ContinueStatement = ignore;\nbase.WithStatement = function (node, st, c) {\n c(node.object, st, \"Expression\");\n c(node.body, st, \"Statement\");\n};\nbase.SwitchStatement = function (node, st, c) {\n c(node.discriminant, st, \"Expression\");\n for (var i = 0, list = node.cases; i < list.length; i += 1) {\n var cs = list[i];\n\n c(cs, st);\n }\n};\nbase.SwitchCase = function (node, st, c) {\n if (node.test) { c(node.test, st, \"Expression\"); }\n for (var i = 0, list = node.consequent; i < list.length; i += 1)\n {\n var cons = list[i];\n\n c(cons, st, \"Statement\");\n }\n};\nbase.ReturnStatement = base.YieldExpression = base.AwaitExpression = function (node, st, c) {\n if (node.argument) { c(node.argument, st, \"Expression\"); }\n};\nbase.ThrowStatement = base.SpreadElement =\n function (node, st, c) { return c(node.argument, st, \"Expression\"); };\nbase.TryStatement = function (node, st, c) {\n c(node.block, st, \"Statement\");\n if (node.handler) { c(node.handler, st); }\n if (node.finalizer) { c(node.finalizer, st, \"Statement\"); }\n};\nbase.CatchClause = function (node, st, c) {\n if (node.param) { c(node.param, st, \"Pattern\"); }\n c(node.body, st, \"Statement\");\n};\nbase.WhileStatement = base.DoWhileStatement = function (node, st, c) {\n c(node.test, st, \"Expression\");\n c(node.body, st, \"Statement\");\n};\nbase.ForStatement = function (node, st, c) {\n if (node.init) { c(node.init, st, \"ForInit\"); }\n if (node.test) { c(node.test, st, \"Expression\"); }\n if (node.update) { c(node.update, st, \"Expression\"); }\n c(node.body, st, \"Statement\");\n};\nbase.ForInStatement = base.ForOfStatement = function (node, st, c) {\n c(node.left, st, \"ForInit\");\n c(node.right, st, \"Expression\");\n c(node.body, st, \"Statement\");\n};\nbase.ForInit = function (node, st, c) {\n if (node.type === \"VariableDeclaration\") { c(node, st); }\n else { c(node, st, \"Expression\"); }\n};\nbase.DebuggerStatement = ignore;\n\nbase.FunctionDeclaration = function (node, st, c) { return c(node, st, \"Function\"); };\nbase.VariableDeclaration = function (node, st, c) {\n for (var i = 0, list = node.declarations; i < list.length; i += 1)\n {\n var decl = list[i];\n\n c(decl, st);\n }\n};\nbase.VariableDeclarator = function (node, st, c) {\n c(node.id, st, \"Pattern\");\n if (node.init) { c(node.init, st, \"Expression\"); }\n};\n\nbase.Function = function (node, st, c) {\n if (node.id) { c(node.id, st, \"Pattern\"); }\n for (var i = 0, list = node.params; i < list.length; i += 1)\n {\n var param = list[i];\n\n c(param, st, \"Pattern\");\n }\n c(node.body, st, node.expression ? \"Expression\" : \"Statement\");\n};\n\nbase.Pattern = function (node, st, c) {\n if (node.type === \"Identifier\")\n { c(node, st, \"VariablePattern\"); }\n else if (node.type === \"MemberExpression\")\n { c(node, st, \"MemberPattern\"); }\n else\n { c(node, st); }\n};\nbase.VariablePattern = ignore;\nbase.MemberPattern = skipThrough;\nbase.RestElement = function (node, st, c) { return c(node.argument, st, \"Pattern\"); };\nbase.ArrayPattern = function (node, st, c) {\n for (var i = 0, list = node.elements; i < list.length; i += 1) {\n var elt = list[i];\n\n if (elt) { c(elt, st, \"Pattern\"); }\n }\n};\nbase.ObjectPattern = function (node, st, c) {\n for (var i = 0, list = node.properties; i < list.length; i += 1) {\n var prop = list[i];\n\n if (prop.type === \"Property\") {\n if (prop.computed) { c(prop.key, st, \"Expression\"); }\n c(prop.value, st, \"Pattern\");\n } else if (prop.type === \"RestElement\") {\n c(prop.argument, st, \"Pattern\");\n }\n }\n};\n\nbase.Expression = skipThrough;\nbase.ThisExpression = base.Super = base.MetaProperty = ignore;\nbase.ArrayExpression = function (node, st, c) {\n for (var i = 0, list = node.elements; i < list.length; i += 1) {\n var elt = list[i];\n\n if (elt) { c(elt, st, \"Expression\"); }\n }\n};\nbase.ObjectExpression = function (node, st, c) {\n for (var i = 0, list = node.properties; i < list.length; i += 1)\n {\n var prop = list[i];\n\n c(prop, st);\n }\n};\nbase.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration;\nbase.SequenceExpression = function (node, st, c) {\n for (var i = 0, list = node.expressions; i < list.length; i += 1)\n {\n var expr = list[i];\n\n c(expr, st, \"Expression\");\n }\n};\nbase.TemplateLiteral = function (node, st, c) {\n for (var i = 0, list = node.quasis; i < list.length; i += 1)\n {\n var quasi = list[i];\n\n c(quasi, st);\n }\n\n for (var i$1 = 0, list$1 = node.expressions; i$1 < list$1.length; i$1 += 1)\n {\n var expr = list$1[i$1];\n\n c(expr, st, \"Expression\");\n }\n};\nbase.TemplateElement = ignore;\nbase.UnaryExpression = base.UpdateExpression = function (node, st, c) {\n c(node.argument, st, \"Expression\");\n};\nbase.BinaryExpression = base.LogicalExpression = function (node, st, c) {\n c(node.left, st, \"Expression\");\n c(node.right, st, \"Expression\");\n};\nbase.AssignmentExpression = base.AssignmentPattern = function (node, st, c) {\n c(node.left, st, \"Pattern\");\n c(node.right, st, \"Expression\");\n};\nbase.ConditionalExpression = function (node, st, c) {\n c(node.test, st, \"Expression\");\n c(node.consequent, st, \"Expression\");\n c(node.alternate, st, \"Expression\");\n};\nbase.NewExpression = base.CallExpression = function (node, st, c) {\n c(node.callee, st, \"Expression\");\n if (node.arguments)\n { for (var i = 0, list = node.arguments; i < list.length; i += 1)\n {\n var arg = list[i];\n\n c(arg, st, \"Expression\");\n } }\n};\nbase.MemberExpression = function (node, st, c) {\n c(node.object, st, \"Expression\");\n if (node.computed) { c(node.property, st, \"Expression\"); }\n};\nbase.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) {\n if (node.declaration)\n { c(node.declaration, st, node.type === \"ExportNamedDeclaration\" || node.declaration.id ? \"Statement\" : \"Expression\"); }\n if (node.source) { c(node.source, st, \"Expression\"); }\n};\nbase.ExportAllDeclaration = function (node, st, c) {\n if (node.exported)\n { c(node.exported, st); }\n c(node.source, st, \"Expression\");\n};\nbase.ImportDeclaration = function (node, st, c) {\n for (var i = 0, list = node.specifiers; i < list.length; i += 1)\n {\n var spec = list[i];\n\n c(spec, st);\n }\n c(node.source, st, \"Expression\");\n};\nbase.ImportExpression = function (node, st, c) {\n c(node.source, st, \"Expression\");\n};\nbase.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.PrivateIdentifier = base.Literal = ignore;\n\nbase.TaggedTemplateExpression = function (node, st, c) {\n c(node.tag, st, \"Expression\");\n c(node.quasi, st, \"Expression\");\n};\nbase.ClassDeclaration = base.ClassExpression = function (node, st, c) { return c(node, st, \"Class\"); };\nbase.Class = function (node, st, c) {\n if (node.id) { c(node.id, st, \"Pattern\"); }\n if (node.superClass) { c(node.superClass, st, \"Expression\"); }\n c(node.body, st);\n};\nbase.ClassBody = function (node, st, c) {\n for (var i = 0, list = node.body; i < list.length; i += 1)\n {\n var elt = list[i];\n\n c(elt, st);\n }\n};\nbase.MethodDefinition = base.PropertyDefinition = base.Property = function (node, st, c) {\n if (node.computed) { c(node.key, st, \"Expression\"); }\n if (node.value) { c(node.value, st, \"Expression\"); }\n};\n\nexport { ancestor, base, findNodeAfter, findNodeAround, findNodeAt, findNodeBefore, full, fullAncestor, make, recursive, simple };\n", "/**\n * TJS Linter\n *\n * Static analysis for TJS code:\n * - Unused variables\n * - Undefined variables\n * - Type mismatches (when __tjs metadata available)\n * - Unreachable code\n *\n * POC: Focus on variable usage first, then type checking.\n */\n\nimport type { Program, Node, Identifier, VariableDeclaration } from 'acorn'\nimport { parse } from './parser'\nimport * as walk from 'acorn-walk'\n\nexport interface LintDiagnostic {\n severity: 'error' | 'warning' | 'info'\n message: string\n line?: number\n column?: number\n rule: string\n}\n\nexport interface LintResult {\n diagnostics: LintDiagnostic[]\n valid: boolean\n}\n\nexport interface LintOptions {\n /** Check for unused variables */\n unusedVariables?: boolean\n /** Check for undefined variables */\n undefinedVariables?: boolean\n /** Check for unreachable code */\n unreachableCode?: boolean\n /** Warn about explicit `new` keyword usage (TJS makes classes callable without new) */\n noExplicitNew?: boolean\n /** Filename for error messages */\n filename?: string\n}\n\nconst DEFAULT_OPTIONS: LintOptions = {\n unusedVariables: true,\n undefinedVariables: true,\n unreachableCode: true,\n noExplicitNew: true,\n}\n\n/**\n * Lint TJS source code\n */\nexport function lint(source: string, options: LintOptions = {}): LintResult {\n const opts = { ...DEFAULT_OPTIONS, ...options }\n const diagnostics: LintDiagnostic[] = []\n\n // Parse the source\n let program: Program\n try {\n const result = parse(source, {\n filename: opts.filename,\n colonShorthand: true,\n })\n program = result.ast\n } catch (error: any) {\n return {\n diagnostics: [\n {\n severity: 'error',\n message: error.message,\n line: error.loc?.line,\n column: error.loc?.column,\n rule: 'parse-error',\n },\n ],\n valid: false,\n }\n }\n\n // Track variable declarations and usages per scope\n const scopes: Scope[] = [createScope()] // Global scope\n\n // First pass: collect all declarations\n walk.ancestor(program, {\n FunctionDeclaration(node: any, _state: any, _ancestors: any) {\n // Function creates new scope\n const scope = createScope()\n scopes.push(scope)\n\n // Add parameters to scope\n for (const param of node.params) {\n addDeclaration(scope, param, 'parameter')\n }\n\n // Function name is in parent scope\n if (node.id) {\n const parentScope = scopes[scopes.length - 2] || scopes[0]\n parentScope.declarations.set(node.id.name, {\n node: node.id,\n kind: 'function',\n used: false,\n })\n }\n },\n\n VariableDeclaration(node: VariableDeclaration) {\n const scope = scopes[scopes.length - 1]\n for (const decl of node.declarations) {\n if (decl.id.type === 'Identifier') {\n scope.declarations.set(decl.id.name, {\n node: decl.id,\n kind: node.kind as 'let' | 'const' | 'var',\n used: false,\n })\n }\n // TODO: handle destructuring patterns\n }\n },\n })\n\n // Second pass: check usages\n walk.simple(program, {\n Identifier(node: Identifier) {\n // Skip declaration sites (handled above)\n // This is a simplified check - just mark as used\n for (let i = scopes.length - 1; i >= 0; i--) {\n const decl = scopes[i].declarations.get(node.name)\n if (decl) {\n decl.used = true\n break\n }\n }\n },\n })\n\n // Report unused variables\n if (opts.unusedVariables) {\n for (const scope of scopes) {\n for (const [name, decl] of scope.declarations) {\n // Skip parameters starting with _ (intentionally unused)\n if (name.startsWith('_')) continue\n\n if (!decl.used && decl.kind !== 'function') {\n diagnostics.push({\n severity: 'warning',\n message: `'${name}' is declared but never used`,\n line: (decl.node as any).loc?.start?.line,\n column: (decl.node as any).loc?.start?.column,\n rule: 'no-unused-vars',\n })\n }\n }\n }\n }\n\n // Check for unreachable code\n if (opts.unreachableCode) {\n walk.simple(program, {\n BlockStatement(node: any) {\n let foundReturn = false\n for (const stmt of node.body) {\n if (foundReturn) {\n diagnostics.push({\n severity: 'warning',\n message: 'Unreachable code after return statement',\n line: stmt.loc?.start?.line,\n column: stmt.loc?.start?.column,\n rule: 'no-unreachable',\n })\n break // Only report once per block\n }\n if (stmt.type === 'ReturnStatement') {\n foundReturn = true\n }\n }\n },\n })\n }\n\n // Check for explicit `new` keyword usage\n // In TJS, classes are callable without `new`, so using `new` is unnecessary\n if (opts.noExplicitNew) {\n walk.simple(program, {\n NewExpression(node: any) {\n // Get the callee name\n let calleeName = 'class'\n if (node.callee.type === 'Identifier') {\n calleeName = node.callee.name\n } else if (node.callee.type === 'MemberExpression') {\n // e.g., new foo.Bar()\n if (node.callee.property.type === 'Identifier') {\n calleeName = node.callee.property.name\n }\n }\n\n diagnostics.push({\n severity: 'warning',\n message: `Unnecessary 'new' keyword. In TJS, classes are callable without 'new': ${calleeName}(...) instead of new ${calleeName}(...)`,\n line: node.loc?.start?.line,\n column: node.loc?.start?.column,\n rule: 'no-explicit-new',\n })\n },\n })\n }\n\n return {\n diagnostics,\n valid: diagnostics.filter((d) => d.severity === 'error').length === 0,\n }\n}\n\n// --- Internal types and helpers ---\n\ninterface Scope {\n declarations: Map<string, Declaration>\n}\n\ninterface Declaration {\n node: Node\n kind: 'let' | 'const' | 'var' | 'parameter' | 'function'\n used: boolean\n}\n\nfunction createScope(): Scope {\n return { declarations: new Map() }\n}\n\nfunction addDeclaration(scope: Scope, node: Node, kind: Declaration['kind']) {\n if (node.type === 'Identifier') {\n scope.declarations.set((node as Identifier).name, {\n node,\n kind,\n used: false,\n })\n } else if (\n node.type === 'AssignmentPattern' &&\n (node as any).left.type === 'Identifier'\n ) {\n scope.declarations.set((node as any).left.name, {\n node: (node as any).left,\n kind,\n used: false,\n })\n }\n // TODO: handle destructuring\n}\n\n/**\n * Questions/Notes for future:\n *\n * Q1: Should we integrate with __tjs metadata for cross-file type checking?\n * - Would need to load metadata from imported modules\n * - Could check function call arguments against declared parameter types\n *\n * Q2: How strict should undefined variable checking be?\n * - Currently relies on JS globals being available\n * - Could have a whitelist of known globals (console, Math, etc.)\n *\n * Q3: Should linting be incremental / cacheable?\n * - For large projects, re-linting everything is slow\n * - Could hash files and skip unchanged ones\n */\n"],
5
- "mappings": "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",
6
- "names": ["require_package", "__commonJSMin", "exports", "module", "acorn", "TranspileError", "message", "location", "source", "filename", "loc", "SyntaxError", "contextLines", "lines", "errorLine", "startLine", "endLine", "output", "lineNumWidth", "i", "lineNum", "marker", "caretPadding", "createChildContext", "parent", "getLocation", "node", "transformParenExpressions", "source", "ctx", "result", "i", "firstReturnType", "firstReturnSafety", "state", "templateStack", "contextStack", "braceDepth", "_currentContext", "isInClassBody", "frame", "char", "nextChar", "before", "classMatch", "classHeader", "funcMatch", "funcName", "matchLen", "afterParen", "safetyMarker", "paramStart", "paramsResult", "extractBalancedContent", "params", "endPos", "processedParams", "processParamString", "j", "colonMarker", "safety", "typeResult", "extractReturnTypeValue", "methodMatch", "prevNonWs", "k", "isMethodDecl", "skipLen", "methodPart", "fullParamsResult", "fullContent", "arrowReturnType", "trimmedContent", "transformed", "start", "open", "close", "depth", "inString", "stringChar", "extractJSValue", "valueStart", "firstChar", "keywordMatch", "normalizeUnionSyntax", "type", "sawContent", "makeResult", "typeEnd", "splitParameters", "current", "inLineComment", "inBlockComment", "trackRequired", "withArrows", "paramList", "sawOptional", "seenNames", "checkDuplicate", "name", "param", "trimmed", "inner", "processDestructuredObjectParams", "restColonPos", "findTopLevelColon", "optionalMatch", "hasColonNotEquals", "eqMatch", "colonPos", "part", "nestedObjectMatch", "objectLiteral", "processedLiteral", "processObjectLiteralValue", "nestedArrayMatch", "arrayLiteral", "processArrayLiteralValue", "colonMatch", "value", "literal", "nestedObjColonMatch", "key", "nested", "nestedObjEqualsMatch", "nestedArrColonMatch", "nestedArrEqualsMatch", "equalsMatch", "hasColon", "hasEquals", "extractBalancedValue", "source", "startRe", "m", "braceStart", "depth", "j", "balanced", "result", "transformTryWithoutCatch", "i", "tryMatch", "bodyStart", "char", "body", "extractWasmBlocks", "blocks", "blockId", "wasmMatch", "matchStart", "braceDepth", "fallbackBody", "matchEnd", "fallbackMatch", "fallbackStart", "k", "captures", "detectCaptures", "name", "typeAnnotation", "findParameterType", "block", "fallbackCode", "captureArgNames", "c", "captureArgs", "wasmCall", "dispatch", "isWasmIntrinsic", "bodyWithoutComments", "propertyOnly", "propPattern", "match", "identifierPattern", "allIdentifiers", "prop", "standalonePattern", "dotPattern", "standaloneMatches", "dotMatches", "declared", "declPattern", "forPattern", "reserved", "id", "wasmBlockStart", "paramName", "beforeBlock", "funcPattern", "arrowPattern", "arrowMatch", "extractTypeFromParams", "paramsStr", "params", "p", "param", "colonMatch", "equalsMatch", "transformIsOperators", "exprPat", "isNotRegex", "isRegex", "insertAsiProtection", "continuationStarts", "expectsContinuation", "continueKeywords", "lines", "inBlockComment", "line", "prevLine", "commentOpen", "commentClose", "prevNoComment", "indent", "rest", "transformTypeofKeyword", "matches", "state", "templateStack", "nextChar", "beforeChar", "operandStart", "transformEqualityToStructural", "equalityOps", "pos", "op", "funcName", "leftBoundary", "findLeftOperandBoundary", "rightBoundary", "findRightOperandBoundary", "leftExpr", "rightExpr", "before", "after", "spacer", "opPos", "inString", "stringChar", "prevChar", "wordEnd", "wordStart", "word", "beforeWord", "startAfterOp", "transformTypeDeclarations", "typeMatch", "typeName", "description", "descriptionWasExplicit", "descStringMatch", "afterString", "isEndOfStatement", "value", "trailingWs", "defaultValue", "posAfterDefault", "valueMatch", "wsMatch", "blockBody", "blockEnd", "descInsideMatch", "example", "exampleKeyword", "valueStart", "extracted", "extractJSValue", "predicateMatch", "defaultArg", "transformFunctionPredicateDeclarations", "fpMatch", "fpName", "typeParamsStr", "paramsMatch", "returnsMatch", "contractMatch", "descMatch", "spec", "desc", "typeParams", "parts", "s", "defaultVal", "paramNames", "args", "commaIdx", "fnRef", "transformGenericDeclarations", "genericMatch", "genericName", "parsedBody", "declIdx", "declBraceStart", "dDepth", "dj", "valueParam", "typeParamNames", "typeCheckParams", "idx", "transformUnionDeclarations", "unionMatch", "unionName", "values", "parseUnionValues", "lineEnd", "inlineValues", "input", "part", "transformEnumDeclarations", "enumMatch", "enumName", "membersStr", "parseEnumMembers", "key", "members", "currentNumericValue", "l", "explicitValue", "numVal", "transformExtendDeclarations", "extensions", "remaining", "extendMatch", "afterWS", "blockStart", "findFunctionBodyEnd", "methods", "bodySource", "methodMatch", "methodIndent", "isAsync", "methodName", "parenStart", "parenDepth", "afterParams", "loc", "locAt", "SyntaxError", "methodBodyEnd", "fullMethodText", "transformedParams", "asyncPrefix", "methodBody", "isFirstForType", "extSet", "methodEntries", "replacement", "transformExtensionCalls", "methodToTypes", "method", "typeNames", "singleQuotePattern", "_", "str", "meth", "closeParen", "doubleQuotePattern", "templatePattern", "methodDot", "searchFrom", "bracketDepth", "inStr", "ch", "arrayLiteral", "numPattern", "num", "column", "typeCheckForDefault", "argExpr", "dv", "typeSignatureForDefault", "parseParamList", "paramStr", "requiredParams", "current", "parseOneParam", "trimmed", "eqIdx", "openBracePos", "inLineComment", "next", "transformPolymorphicFunctions", "polymorphicNames", "declarations", "allMatches", "exported", "fullMatchStart", "funcKeywordStart", "funcIdx", "nameCounts", "polyNames", "count", "afterFunc", "bodyEnd", "realStart", "variants", "asyncCount", "v", "a", "b", "allSame", "sigA", "sigB", "allVariants", "variant", "renamed", "isExported", "exportPrefix", "sorted", "specA", "specB", "sig", "branches", "checks", "check", "dispatcher", "transformBareAssignments", "extractAndRunTests", "skipTests", "tests", "errors", "testMatch", "start", "escaped", "nl", "end", "err", "newlines", "transformPolymorphicConstructors", "polyCtorClasses", "classRegex", "classMatch", "classInfos", "className", "extendsClause", "ci", "ctorPattern", "ctorMatch", "ctorPositions", "ctors", "ctorBodyEnd", "bodyText", "newBody", "afterLastCtor", "cleanBody", "ctor", "factories", "dispatchBranches", "insertPos", "wrapClassDeclarations", "lastIndex", "classStart", "classEnd", "classBody", "validateNoDate", "datePatterns", "pattern", "message", "transformConstBang", "immutableNames", "constBangRe", "stripped", "mutatingMethods", "validateNoVar", "validateNoEval", "transformBangAccess", "templateDepth", "exprEnd", "exprStart", "findExprStartBackward", "expr", "text", "findMatchingOpen", "open", "close", "stripLineComments", "source", "result", "i", "ch", "quote", "end", "slice", "nl", "preprocess", "options", "originalSource", "moduleSafety", "requiredParams", "unsafeFunctions", "safeFunctions", "isCompat", "tjsModes", "safetyMatch", "directivePattern", "match", "directive", "insertAsiProtection", "transformConstBang", "transformBangAccess", "transformIsOperators", "transformEqualityToStructural", "transformTypeDeclarations", "transformGenericDeclarations", "transformFunctionPredicateDeclarations", "transformUnionDeclarations", "transformEnumDeclarations", "transformBareAssignments", "transformedSource", "returnType", "returnSafety", "transformParenExpressions", "extResult", "transformExtendDeclarations", "transformTryWithoutCatch", "polyResult", "transformPolymorphicFunctions", "wasmBlocks", "extractWasmBlocks", "testResult", "extractAndRunTests", "polyCtorResult", "transformPolymorphicConstructors", "cls", "wrapClassDeclarations", "validateNoDate", "validateNoEval", "validateNoVar", "transformExtensionCalls", "parse", "filename", "colonShorthand", "vmTarget", "processedSource", "tests", "testErrors", "e", "loc", "SyntaxError", "validateSingleFunction", "ast", "node", "functions", "second", "extractTDoc", "func", "beforeFunc", "allDocBlocks", "lastBlock", "afterBlock", "content", "lines", "minIndent", "line", "min", "indent", "jsdocMatch", "jsdoc", "descMatch", "paramRegex", "parseExpressionAt", "inferTypeFromValue", "node", "value", "raw", "elements", "itemTypes", "el", "seen", "t", "key", "unique", "properties", "shape", "prop", "operator", "left", "right", "leftType", "rightType", "op", "arg", "parseParameter", "param", "requiredParams", "TranspileError", "getLocation", "name", "isRequired", "type", "exampleValue", "extractLiteralValue", "destructuredParams", "innerParam", "result", "parseReturnType", "typeExpr", "ast", "parseExpressionAt", "typeToString", "items", "props", "k", "v", "typeToJsonSchema", "type", "properties", "key", "propType", "parametersToJsonSchema", "parameters", "required", "name", "param", "transformFunction", "func", "source", "returnTypeAnnotation", "options", "requiredParamsFromPreprocess", "tdoc", "extractTDoc", "parsed", "parseParameter", "paramDesc", "returnType", "parseReturnType", "ctx", "bodySteps", "transformBlock", "steps", "requiredParams", "optionalParams", "defaultValue", "signatureParams", "signature", "inputSchema", "block", "stmt", "transformed", "transformStatement", "transformVariableDeclaration", "transformExpressionStatement", "transformIfStatement", "transformWhileStatement", "transformForOfStatement", "transformTryStatement", "transformReturnStatement", "TranspileError", "getLocation", "createChildContext", "decl", "isConst", "opName", "declarator", "step", "resultVar", "transformExpressionToStep", "inferTypeFromValue", "expr", "transformAssignment", "condition", "expressionToExprNode", "thenSteps", "elseSteps", "body", "varName", "items", "expressionToValue", "childCtx", "trySteps", "catchSteps", "catchParam", "catchCtx", "BUILTIN_OBJECTS", "BUILTIN_GLOBALS", "UNSUPPORTED_BUILTINS", "INSTANCE_METHODS", "isBuiltinCall", "member", "objName", "methodName", "isBuiltinMemberAccess", "UNSUPPORTED_BUILTIN_MESSAGES", "getUnsupportedBuiltinError", "getNewExpressionSuggestion", "constructorName", "varOp", "newExpr", "suggestion", "unsupportedError", "exprNode", "transformCallExpression", "transformTemplateLiteral", "funcName", "isMethodCall", "receiver", "transformMethodCall", "args", "extractCallArguments", "method", "callback", "paramName", "exprResult", "accParam", "itemParam", "accName", "itemName", "initial", "a", "tmpl", "vars", "mem", "obj", "isOptional", "prop", "propName", "bin", "log", "un", "cond", "el", "call", "arg", "objValue", "result", "parseExpressionAt", "isInsideComment", "source", "pos", "lineStart", "i", "inBlockComment", "extractEmbeddedTests", "tests", "embeddedRegex", "match", "desc", "body", "getLineNumber", "extractTests", "mocks", "embeddedTests", "testRegex", "mockRegex", "cleanCode", "testMatches", "start", "bodyStart", "end", "findMatchingBrace", "mockMatches", "allMatches", "a", "b", "m", "testRunner", "generateTestRunner", "depth", "inString", "escaped", "char", "mockSetup", "t", "assertFunction", "expectFunction", "testUtils", "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", "metaParamCount", "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", "reason", "typeError", "value", "stack", "config", "getStack", "msg", "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", "t", "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", "installRuntime", "g", "existingVersion", "comparison", "emitRuntimeWrapper", "fuzzyEqual", "a", "b", "epsilon", "diff", "maxAbs", "deepEqual", "v", "i", "keysA", "keysB", "k", "typeMatches", "actual", "pattern", "path", "typeOf", "elementPattern", "result", "key", "keyPath", "formatValue", "indent", "x", "entries", "formatKey", "val", "pad", "closePad", "formatted", "suffix", "stripComments", "code", "match", "newlines", "stripModuleSyntax", "buildResolvedImportsCode", "resolvedImports", "lines", "specifier", "moduleCode", "cleanCode", "stripModuleSyntax", "parseReturnExample", "str", "defaults", "trimmed", "transformed", "depth", "i", "ch", "quote", "keyMatch", "j", "valStr", "valDepth", "vc", "extractSignatureTestInfos", "originalSource", "infos", "sourceWithoutComments", "stripComments", "funcRegex", "match", "isAsync", "funcName", "paramsStr", "returnMarker", "lineNumber", "afterMarker", "returnExample", "extractReturnExampleFromSource", "paramExamples", "extractParamExamples", "parsed", "args", "p", "classRegex", "classMatch", "className", "classBodyStart", "braceDepth", "classBodyEnd", "classBody", "ctorMatch", "ctorParamsStr", "ctorParamExamples", "ctorArgs", "methodRegex", "methodMatch", "methodName", "methodPosInSource", "runAllTests", "tests", "mocks", "sigTestInfos", "transpiledCode", "extensions", "results", "importSpecifiers", "hasUnresolvedImports", "imp", "executableCode", "importedCode", "mockSetup", "m", "testRuntimeImports", "testBodies", "t", "body", "transformExtensionCalls", "syncSigTestInfos", "info", "asyncSigTestInfos", "sigTestBodies", "testLabel", "callExpr", "a", "installRuntime", "testCode", "fn", "blockResults", "sigTestResults", "deepEqual", "formatValue", "typeMatches", "r", "test", "isImportError", "label", "e", "isUnresolvedRef", "extractReturnExampleFromSource", "source", "result", "depth", "hasContent", "i", "char", "extractParamExamples", "paramsStr", "examples", "params", "splitParams", "param", "trimmed", "restMatch", "arr", "el", "match", "current", "acorn", "Type", "Section", "Op", "OpName", "name", "code", "SIMD_PREFIX", "SimdOp", "SimdOpName", "encodeSIMD", "subOp", "encodeULEB128", "encodeSIMDMemarg", "align", "offset", "encodeULEB128", "value", "result", "byte", "encodeSLEB128", "more", "encodeF32", "buffer", "encodeF64", "encodeString", "s", "bytes", "encodeSection", "id", "contents", "decodeULEB128", "bytes", "offset", "result", "shift", "i", "byte", "decodeF64", "buffer", "view", "disassemble", "code", "params", "localTypes", "lines", "indent", "ind", "paramStr", "p", "localStr", "t", "op", "name", "OpName", "Op", "idx", "len", "paramName", "depth", "val", "j", "blockType", "Type", "align", "len1", "len2", "SIMD_PREFIX", "subOp", "subLen", "simdName", "SimdOpName", "SimdOp", "_align", "b", "lane", "TYPED_ARRAYS", "createContext", "ctx", "declareLocal", "type", "index", "getLocal", "compileStatement", "node", "expr", "compileExpression", "ret", "retType", "inferExprType", "decl", "declarator", "encodeULEB128", "compileForLoop", "compileIf", "block", "stmt", "lit", "binExpr", "leftType", "rightType", "unary", "member", "param", "arrayInfo", "call", "callee", "encodeSLEB128", "encodeF32", "encodeF64", "local", "compileBinaryExpr", "compileUnaryExpr", "compileAssignment", "compileUpdate", "compileArrayAccess", "compileCall", "seq", "left", "right", "resultType", "isComparison", "opType", "leftCode", "rightCode", "ops", "opcode", "arg", "compileArrayStore", "valType", "isI32", "indexCode", "indexType", "target", "value", "operator", "computeAddress", "addr", "addrLocal", "rhsType", "opMap", "valLocal", "tempLocal", "method", "compileMathCall", "compileSIMDCall", "args", "offType", "encodeSIMDMemarg", "argType", "encodeSIMD", "unaryMap", "parseTypeAnnotation", "capture", "parts", "s", "typeStr", "buildModule", "bodyCode", "needsMemory", "hasReturn", "header", "paramWasmTypes", "returnSpec", "typeSection", "encodeSection", "Section", "memorySection", "importSection", "encodeString", "funcSection", "exportSection", "localGroups", "currentType", "count", "funcBody", "codeSection", "sections", "compileToWasm", "ast", "wrapped", "e", "body", "moduleBytes", "watText", "generateWasmBootstrap", "blocks", "results", "compiledBlocks", "block", "result", "compileToWasm", "base64", "watComments", "b", "watLines", "line", "blockData", "anyNeedsMemory", "isParamRequiredInSource", "source", "funcName", "paramName", "funcPattern", "match", "extractFunctionTypeInfo", "func", "originalSource", "requiredParams", "returnTypeStr", "inputSource", "warnings", "tdoc", "extractTDoc", "params", "isDestructuredParam", "destructuredShape", "destructuredRequired", "param", "objectPattern", "paramInfo", "parseParameter", "key", "descriptor", "isRequired", "restName", "restTypeMatch", "typeExpr", "parseExpressionAt", "restItemType", "inferTypeFromValue", "returns", "parsableReturnStr", "transformReturnDefaults", "returnExpr", "generateInlineValidationCode", "types", "lines", "pathPrefix", "stackEntry", "shape", "requiredFields", "fieldNames", "fieldName", "fieldType", "path", "typeCheck", "generateTypeCheckExpr", "expectedType", "m", "str", "result", "depth", "i", "ch", "extractFunctionReturnType", "afterMarker", "extractReturnExampleFromSource", "extractFunctionReturnSafety", "marker", "extractSourceFileAnnotation", "extractLineAnnotation", "regex", "transpileToJS", "options", "filename", "runTests", "debug", "resolvedImports", "stripLineComments", "effectiveFilename", "cleanSource", "tests", "mocks", "testRunner", "extractTests", "program", "unsafeFunctions", "parse", "functions", "findAllFunctions", "preprocessed", "preprocess", "t", "transformIsOperators", "transformEqualityToStructural", "allTypes", "insertions", "deletions", "returnDefaults", "defaultsMatch", "transformed", "parsed", "defaults", "funcWarnings", "right", "isUnsafe", "isSafe", "returnSafety", "annotatedLine", "funcLoc", "safetyOptions", "isPolymorphicDispatcher", "typeMetadata", "variantNames", "f", "fn", "metadata", "generateTypeMetadata", "sourceStr", "validation", "a", "b", "code", "start", "end", "ins", "shift", "del", "position", "text", "needsTypeError", "needsStack", "needsIs", "needsIsNot", "needsEq", "needsNotEq", "needsTypeOf", "needsType", "needsGeneric", "needsFunctionPredicate", "needsEnum", "needsUnion", "needsBang", "needsSafeEval", "inlineParts", "inlineBlock", "fallbackEntries", "fallbackObj", "testResults", "sigTestInfos", "extractSignatureTestInfos", "runAllTests", "failures", "r", "errorLines", "loc", "wasmCompiled", "wasmBootstrap", "generateWasmBootstrap", "node", "serializeType", "k", "v", "safety", "debugOpts", "paramsObj", "name", "file", "line", "generateTypeCheckExpr", "fieldPath", "type", "check", "checks", "m", "c", "transpile", "source", "options", "program", "returnType", "originalSource", "requiredParams", "parse", "func", "validateSingleFunction", "ast", "signature", "warnings", "transformFunction", "ajs", "sourceOrStrings", "values", "acc", "str", "i", "createAgent", "vm", "runOptions", "agent", "args", "typeDescriptorToJsonSchema", "type", "k", "v", "getToolDefinitions", "agents", "name", "sig", "properties", "required", "paramName", "param", "tjs", "optionsOrFirstValue", "restValues", "transpileToJS", "s", "getType", "value", "infer", "schemaCallable", "Schema", "target", "prop", "thisArg", "args", "simple", "node", "visitors", "baseVisitor", "state", "override", "base", "c", "st", "type", "ancestor", "ancestors", "isNew", "skipThrough", "node", "st", "c", "ignore", "_node", "_st", "_c", "base", "i", "list", "stmt", "cs", "cons", "decl", "param", "elt", "prop", "expr", "quasi", "i$1", "list$1", "arg", "spec", "DEFAULT_OPTIONS", "lint", "source", "options", "opts", "diagnostics", "program", "parse", "error", "scopes", "createScope", "ancestor", "node", "_state", "_ancestors", "scope", "param", "addDeclaration", "decl", "simple", "i", "name", "foundReturn", "stmt", "calleeName", "d", "kind"]
3
+ "sources": ["../package.json", "../src/lang/parser.ts", "../src/lang/types.ts", "../src/lang/parser-transforms.ts", "../src/lang/parser-params.ts", "../src/lang/inference.ts", "../src/lang/emitters/ast.ts", "../src/lang/emitters/js.ts", "../src/lang/tests.ts", "../src/lang/runtime.ts", "../src/lang/json-schema.ts", "../src/types/Type.ts", "../src/lang/emitters/js-tests.ts", "../src/lang/wasm.ts", "../src/lang/emitters/js-wasm.ts", "../src/lang/bool-coercion.ts", "../src/lang/core.ts", "../src/lang/schema.ts", "../node_modules/acorn-walk/dist/walk.mjs", "../src/lang/linter.ts"],
4
+ "sourcesContent": ["{\n \"name\": \"tjs-lang\",\n \"version\": \"0.7.8\",\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 \"llms.txt\"\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 * TJS Parser \u2014 Orchestration Layer\n *\n * This module contains the main entry points: preprocess() and parse().\n * Transform functions are in parser-transforms.ts, param processing in parser-params.ts.\n */\n\nimport * as acorn from 'acorn'\nimport type { Program, FunctionDeclaration } from 'acorn'\nimport { SyntaxError } from './types'\n\n// Re-export types so external callers don't need to change imports\nexport type {\n ParseOptions,\n WasmBlock,\n TestBlock,\n PreprocessOptions,\n TjsModes,\n} from './parser-types'\n\nimport type {\n ParseOptions,\n WasmBlock,\n TestBlock,\n PreprocessOptions,\n TjsModes,\n} from './parser-types'\n\nimport { transformParenExpressions } from './parser-params'\n\nimport {\n transformTryWithoutCatch,\n extractWasmBlocks,\n transformIsOperators,\n insertAsiProtection,\n transformEqualityToStructural,\n transformTypeDeclarations,\n transformGenericDeclarations,\n transformFunctionPredicateDeclarations,\n transformUnionDeclarations,\n transformEnumDeclarations,\n transformExtendDeclarations,\n transformPolymorphicFunctions,\n transformPolymorphicConstructors,\n wrapClassDeclarations,\n transformBareAssignments,\n extractAndRunTests,\n validateNoDate,\n validateNoEval,\n validateNoVar,\n transformConstBang,\n transformBangAccess,\n transformExtensionCalls,\n transformLetTypeAnnotations,\n} from './parser-transforms'\n\n// Re-export transformExtensionCalls for js.ts\nexport { transformExtensionCalls } from './parser-transforms'\n\n/**\n * Strip single-line comments (//) from source.\n * Replaces comment content with spaces to preserve character offsets.\n * Skips // inside strings and block comments.\n */\nexport function stripLineComments(source: string): string {\n let result = ''\n let i = 0\n while (i < source.length) {\n const ch = source[i]\n // String literals \u2014 skip to closing quote\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n const quote = ch\n result += ch\n i++\n while (i < source.length && source[i] !== quote) {\n if (source[i] === '\\\\') {\n result += source[i++]\n }\n if (i < source.length) result += source[i++]\n }\n if (i < source.length) result += source[i++] // closing quote\n continue\n }\n // Block comment \u2014 pass through (may contain //)\n if (ch === '/' && source[i + 1] === '*') {\n const end = source.indexOf('*/', i + 2)\n const slice = end === -1 ? source.slice(i) : source.slice(i, end + 2)\n result += slice\n i += slice.length\n continue\n }\n // Line comment \u2014 replace with spaces to preserve offsets\n if (ch === '/' && source[i + 1] === '/') {\n const nl = source.indexOf('\\n', i)\n const end = nl === -1 ? source.length : nl\n result += ' '.repeat(end - i)\n i = end // leave \\n for next iteration\n continue\n }\n result += ch\n i++\n }\n return result\n}\n\nexport function preprocess(\n source: string,\n options: PreprocessOptions = {}\n): {\n source: string\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n moduleSafety?: 'none' | 'inputs' | 'all'\n tjsModes: TjsModes\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n wasmBlocks: WasmBlock[]\n tests: TestBlock[]\n testErrors: string[]\n polymorphicNames: Set<string>\n extensions: Map<string, Set<string>>\n letAnnotations: Map<string, string>\n} {\n const originalSource = source\n let moduleSafety: 'none' | 'inputs' | 'all' | undefined\n const requiredParams = new Set<string>()\n const unsafeFunctions = new Set<string>()\n const safeFunctions = new Set<string>()\n\n // Detect whether this source was emitted by fromTS (TS-originated)\n // The /* tjs <- filename */ annotation is the signal\n const isFromTS = /\\/\\*\\s*tjs\\s*<-\\s*\\S+\\s*\\*\\//.test(source)\n\n // Native TJS: all modes ON by default (TJS is its own language)\n // TS-originated or VM target (AJS): all modes OFF, safety none (JS-compatible)\n const isCompat = isFromTS || options.vmTarget\n const tjsModes: TjsModes = isCompat\n ? {\n tjsEquals: false,\n tjsClass: false,\n tjsDate: false,\n tjsNoeval: false,\n tjsStandard: false,\n tjsSafeEval: false,\n tjsNoVar: false,\n tjsSafeAssign: false,\n }\n : {\n tjsEquals: true,\n tjsClass: true,\n tjsDate: true,\n tjsNoeval: true,\n tjsStandard: true,\n tjsSafeEval: false, // opt-in only (adds import)\n tjsNoVar: true,\n tjsSafeAssign: true,\n }\n\n // Safety: native TJS defaults to 'inputs' (runtime default),\n // TS-originated and VM targets default to 'none'\n if (isCompat) {\n moduleSafety = 'none'\n }\n\n // Handle module-level safety directive: safety none | safety inputs | safety all\n // Must be at the start of the file (possibly after comments/whitespace)\n // Explicit directive always overrides the default\n const safetyMatch = source.match(\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*safety\\s+(none|inputs|all)\\b/\n )\n if (safetyMatch) {\n moduleSafety = safetyMatch[2] as 'none' | 'inputs' | 'all'\n // Remove the directive from source\n source = source.replace(\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*safety\\s+(none|inputs|all)\\s*/,\n '$1'\n )\n }\n\n // Handle TJS mode directives (can appear in any order after safety)\n // TjsStrict enables all TJS modes (useful for TS-originated code opting in)\n // TjsCompat disables all TJS modes (useful for native TJS opting out)\n // Individual modes: TjsEquals, TjsClass, TjsDate, TjsNoeval, TjsStandard, TjsSafeEval\n const directivePattern =\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*(TjsStrict|TjsCompat|TjsEquals|TjsClass|TjsDate|TjsNoeval|TjsNoVar|TjsStandard|TjsSafeEval|TjsSafeAssign)\\b/\n\n let match\n while ((match = source.match(directivePattern))) {\n const directive = match[2]\n\n if (directive === 'TjsStrict') {\n // Enable all TJS modes\n tjsModes.tjsEquals = true\n tjsModes.tjsClass = true\n tjsModes.tjsDate = true\n tjsModes.tjsNoeval = true\n tjsModes.tjsNoVar = true\n tjsModes.tjsStandard = true\n tjsModes.tjsSafeAssign = true\n } else if (directive === 'TjsCompat') {\n // Disable all TJS modes (JS-compatible)\n tjsModes.tjsEquals = false\n tjsModes.tjsClass = false\n tjsModes.tjsDate = false\n tjsModes.tjsNoeval = false\n tjsModes.tjsNoVar = false\n tjsModes.tjsStandard = false\n tjsModes.tjsSafeEval = false\n tjsModes.tjsSafeAssign = false\n } else if (directive === 'TjsEquals') {\n tjsModes.tjsEquals = true\n } else if (directive === 'TjsClass') {\n tjsModes.tjsClass = true\n } else if (directive === 'TjsDate') {\n tjsModes.tjsDate = true\n } else if (directive === 'TjsNoeval') {\n tjsModes.tjsNoeval = true\n } else if (directive === 'TjsNoVar') {\n tjsModes.tjsNoVar = true\n } else if (directive === 'TjsStandard') {\n tjsModes.tjsStandard = true\n } else if (directive === 'TjsSafeEval') {\n tjsModes.tjsSafeEval = true\n } else if (directive === 'TjsSafeAssign') {\n tjsModes.tjsSafeAssign = true\n }\n\n // Remove the directive from source\n source = source.replace(\n new RegExp(\n `^(\\\\s*(?:\\\\/\\\\/[^\\\\n]*\\\\n|\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/\\\\s*)*)\\\\s*${directive}\\\\s*`\n ),\n '$1'\n )\n }\n\n // Strip single-line comments early \u2014 they confuse brace matching,\n // ASI protection, and test extraction (e.g. apostrophes in comments)\n // Preserves line structure by keeping the newline\n source = stripLineComments(source)\n\n // TjsStandard mode: insert semicolons to prevent ASI footguns\n // Must happen early before other transformations modify line structure\n if (tjsModes.tjsStandard) {\n source = insertAsiProtection(source)\n }\n\n // Transform const! declarations \u2014 validate immutability and emit as const\n // Must happen before acorn parsing since const! is not valid JS\n source = transformConstBang(source)\n\n // Transform !. bang access to __tjs.bang() calls\n // Must happen before acorn parsing since !. is not valid JS\n source = transformBangAccess(source)\n\n // Transform `let x: <example>` declarations: strip annotation and record\n // varName -> example. Must happen before paren transforms so the colon\n // is not confused with TS-style annotations on params/returns.\n const letAnnoResult = transformLetTypeAnnotations(source)\n source = letAnnoResult.source\n const letAnnotations = letAnnoResult.annotations\n\n // Transform Is/IsNot infix operators to function calls\n // a Is b -> Is(a, b)\n // a IsNot b -> IsNot(a, b)\n // These are always available for explicit structural equality\n source = transformIsOperators(source)\n\n // Transform == and != to structural equality (Is/IsNot)\n // Only when TjsEquals mode is enabled and not for VM targets\n // VM targets already handle == correctly at runtime\n if (tjsModes.tjsEquals && !options.vmTarget) {\n source = transformEqualityToStructural(source)\n }\n\n // Transform Type, Generic, Union, and Enum declarations\n // Type Foo { ... } -> const Foo = Type(...)\n // Generic Bar<T, U> { ... } -> const Bar = Generic(...)\n // Union Dir 'up' | 'down' -> const Dir = Union(...)\n // Enum Status { Pending, Active, Done } -> const Status = Enum(...)\n source = transformTypeDeclarations(source)\n source = transformGenericDeclarations(source)\n source = transformFunctionPredicateDeclarations(source)\n source = transformUnionDeclarations(source)\n source = transformEnumDeclarations(source)\n\n // Transform bare assignments to const declarations\n // Foo = ... -> const Foo = ...\n source = transformBareAssignments(source)\n\n // Unified paren expression transformer\n // Handles: function params, arrow params, return types, safe/unsafe markers\n // Model: open paren can be ( or (? or (!, close can be ) or )-> or )-? or )-!\n const {\n source: transformedSource,\n returnType,\n returnSafety,\n } = transformParenExpressions(source, {\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n })\n source = transformedSource\n\n // NOTE: unsafe {} blocks removed - they provided no performance benefit because\n // the wrapper decision is made at transpile time. Use (!) on functions instead.\n // See ideas parking lot for potential future approaches.\n\n // Transform extend blocks: extend TypeName { methods } -> __ext_TypeName object\n // Must happen after paren expressions so method params are already transformed\n const extResult = transformExtendDeclarations(source)\n source = extResult.source\n\n // Handle try-without-catch: try { ... } (no catch/finally) -> monadic error handling\n // This is the idiomatic TJS way to convert exceptions to AgentError\n source = transformTryWithoutCatch(source)\n\n // Transform polymorphic functions: multiple declarations with same name -> dispatcher\n // Must happen after param transformation but before class wrapping and test extraction\n const polyResult = transformPolymorphicFunctions(source, requiredParams)\n source = polyResult.source\n\n // Extract WASM blocks: wasm(args) { ... } fallback { ... }\n const wasmBlocks = extractWasmBlocks(source)\n source = wasmBlocks.source\n\n // Extract and run test blocks: test 'desc'? { body }\n // Tests run at transpile time and are stripped from output\n const testResult = extractAndRunTests(source, options.dangerouslySkipTests)\n source = testResult.source\n\n // Transform polymorphic constructors: multiple constructor() -> factory functions\n // Must happen before wrapClassDeclarations (which needs to know about poly ctors)\n const polyCtorResult = transformPolymorphicConstructors(\n source,\n requiredParams\n )\n source = polyCtorResult.source\n\n // Mark $dispatch functions as unsafe (internal Proxy trap params, not user-facing)\n for (const cls of polyCtorResult.polyCtorClasses) {\n unsafeFunctions.add(`${cls}$dispatch`)\n }\n\n // Wrap class declarations to make them callable without `new`\n // Only when TjsClass mode is enabled\n // class Foo { } -> let Foo = class Foo { }; Foo = globalThis.__tjs?.wrapClass?.(Foo) ?? Foo;\n if (tjsModes.tjsClass) {\n source = wrapClassDeclarations(source, polyCtorResult.polyCtorClasses)\n }\n\n // Validate TjsDate mode - check for Date usage\n if (tjsModes.tjsDate) {\n source = validateNoDate(source)\n }\n\n // Validate TjsNoeval mode - check for eval/Function usage\n if (tjsModes.tjsNoeval) {\n source = validateNoEval(source)\n }\n\n // Validate TjsNoVar mode - check for var declarations\n if (tjsModes.tjsNoVar) {\n source = validateNoVar(source)\n }\n\n // Rewrite extension method calls on known-type receivers\n // Must happen after all other transforms so literals are in final form\n source = transformExtensionCalls(source, extResult.extensions)\n\n return {\n source,\n returnType,\n returnSafety,\n moduleSafety,\n tjsModes,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks: wasmBlocks.blocks,\n tests: testResult.tests,\n testErrors: testResult.errors,\n polymorphicNames: polyResult.polymorphicNames,\n extensions: extResult.extensions,\n letAnnotations,\n }\n}\n\n/**\n * Parse source code into an Acorn AST\n */\nexport function parse(\n source: string,\n options: ParseOptions = {}\n): {\n ast: Program\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n moduleSafety?: 'none' | 'inputs' | 'all'\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n wasmBlocks: WasmBlock[]\n tests: TestBlock[]\n testErrors: string[]\n letAnnotations: Map<string, string>\n tjsModes: TjsModes\n} {\n const {\n filename = '<source>',\n colonShorthand = true,\n vmTarget = false,\n } = options\n\n // Preprocess for custom syntax\n const {\n source: processedSource,\n returnType,\n returnSafety,\n moduleSafety,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks,\n tests,\n testErrors,\n letAnnotations,\n tjsModes,\n } = colonShorthand\n ? preprocess(source, { vmTarget })\n : {\n source,\n returnType: undefined,\n returnSafety: undefined,\n moduleSafety: undefined,\n originalSource: source,\n requiredParams: new Set<string>(),\n unsafeFunctions: new Set<string>(),\n safeFunctions: new Set<string>(),\n wasmBlocks: [] as WasmBlock[],\n tests: [] as TestBlock[],\n testErrors: [] as string[],\n letAnnotations: new Map<string, string>(),\n tjsModes: {\n tjsEquals: false,\n tjsClass: false,\n tjsDate: false,\n tjsNoeval: false,\n tjsStandard: false,\n tjsSafeEval: false,\n tjsNoVar: false,\n tjsSafeAssign: false,\n } as TjsModes,\n }\n\n try {\n const ast = acorn.parse(processedSource, {\n ecmaVersion: 2022,\n sourceType: 'module',\n locations: true,\n allowReturnOutsideFunction: false,\n })\n\n return {\n ast,\n returnType,\n returnSafety,\n moduleSafety,\n originalSource,\n requiredParams,\n unsafeFunctions,\n safeFunctions,\n wasmBlocks,\n tests,\n testErrors,\n letAnnotations,\n tjsModes,\n }\n } catch (e: any) {\n // Convert Acorn error to our error type\n const loc = e.loc || { line: 1, column: 0 }\n throw new SyntaxError(\n e.message.replace(/\\s*\\(\\d+:\\d+\\)$/, ''), // Remove acorn's location suffix\n loc,\n originalSource,\n filename\n )\n }\n}\n\n/**\n * Validate that the source contains exactly one function declaration\n */\nexport function validateSingleFunction(\n ast: Program,\n filename?: string\n): FunctionDeclaration {\n // Check for unsupported top-level constructs FIRST\n // This gives better error messages for things like classes\n for (const node of ast.body) {\n if (node.type === 'ImportDeclaration') {\n throw new SyntaxError(\n 'Imports are not supported. All atoms must be registered with the VM.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (\n node.type === 'ExportNamedDeclaration' ||\n node.type === 'ExportDefaultDeclaration'\n ) {\n throw new SyntaxError(\n 'Exports are not supported. The function is automatically exported.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (node.type === 'ClassDeclaration') {\n throw new SyntaxError(\n 'Classes are not supported. Agent99 uses functional composition.',\n node.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n }\n\n const functions = ast.body.filter(\n (node): node is FunctionDeclaration => node.type === 'FunctionDeclaration'\n )\n\n if (functions.length === 0) {\n throw new SyntaxError(\n 'Source must contain a function declaration',\n { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n if (functions.length > 1) {\n const second = functions[1]\n throw new SyntaxError(\n 'Only a single function per agent is allowed',\n second.loc?.start || { line: 1, column: 0 },\n undefined,\n filename\n )\n }\n\n return functions[0]\n}\n\n/**\n * Extract TDoc comment from before a function\n *\n * TJS doc comments use /\\*# ... \\*\\/ syntax and preserve full markdown content.\n * Legacy JSDoc (/\\*\\* ... \\*\\/) is supported as a fallback.\n */\nexport function extractTDoc(\n source: string,\n func: FunctionDeclaration\n): {\n description?: string\n params: Record<string, string>\n} {\n const result: { description?: string; params: Record<string, string> } = {\n params: {},\n }\n\n if (!func.loc) return result\n\n const beforeFunc = source.substring(0, func.start)\n\n // First, check for TJS doc comment: /*# ... */\n // This preserves full markdown content\n // Find the LAST /*# ... */ block and verify it immediately precedes the function\n // (only whitespace and line comments allowed between)\n const allDocBlocks = [...beforeFunc.matchAll(/\\/\\*#([\\s\\S]*?)\\*\\//g)]\n if (allDocBlocks.length > 0) {\n const lastBlock = allDocBlocks[allDocBlocks.length - 1]\n const afterBlock = beforeFunc.substring(\n lastBlock.index! + lastBlock[0].length\n )\n\n // Only attach if nothing but whitespace and line comments between doc and function\n if (/^(?:\\s|\\/\\/[^\\n]*)*$/.test(afterBlock)) {\n // Extract content, trim leading/trailing whitespace, preserve internal formatting\n let content = lastBlock[1]\n\n // Remove common leading whitespace (like dedent)\n const lines = content.split('\\n')\n // Find minimum indentation (ignoring empty lines)\n const minIndent = lines\n .filter((line) => line.trim().length > 0)\n .reduce((min, line) => {\n const indent = line.match(/^(\\s*)/)?.[1].length || 0\n return Math.min(min, indent)\n }, Infinity)\n\n // Remove that indentation from all lines\n if (minIndent > 0 && minIndent < Infinity) {\n content = lines.map((line) => line.slice(minIndent)).join('\\n')\n }\n\n result.description = content.trim()\n return result\n }\n }\n\n // Fall back to JSDoc: /** ... */\n const jsdocMatch = beforeFunc.match(/\\/\\*\\*[\\s\\S]*?\\*\\/\\s*$/)\n if (!jsdocMatch) return result\n\n const jsdoc = jsdocMatch[0]\n\n // Extract description (first non-tag content)\n const descMatch = jsdoc.match(/\\/\\*\\*\\s*\\n?\\s*\\*?\\s*([^@\\n][^\\n]*)/m)\n if (descMatch) {\n result.description = descMatch[1].trim()\n }\n\n // Extract @param tags\n const paramRegex = /@param\\s+(?:\\{[^}]+\\}\\s+)?(\\w+)\\s*-?\\s*(.*)/g\n let match\n while ((match = paramRegex.exec(jsdoc)) !== null) {\n result.params[match[1]] = match[2].trim()\n }\n\n return result\n}\n", "/**\n * Type definitions for the Agent99 JavaScript transpiler\n */\n\nimport type { Node } from 'acorn'\nimport type { SeqNode } from '../builder'\n\n// ============================================================================\n// Type System Types\n// ============================================================================\n\n/** Represents a type extracted from value patterns */\nexport interface TypeDescriptor {\n kind:\n | 'string'\n | 'number'\n | 'integer'\n | 'non-negative-integer'\n | 'boolean'\n | 'null'\n | 'undefined'\n | 'array'\n | 'object'\n | 'union'\n | 'function'\n | 'any'\n nullable?: boolean\n /** For arrays: the element type */\n items?: TypeDescriptor\n /** For objects: the shape */\n shape?: Record<string, TypeDescriptor>\n /** For unions: the member types */\n members?: TypeDescriptor[]\n /** For destructured parameters: full parameter descriptors */\n destructuredParams?: Record<string, ParameterDescriptor>\n /** For functions: declared parameters with names and inferred types */\n params?: Array<{ name: string; type: TypeDescriptor }>\n /** For functions: inferred return type. Concise arrow bodies infer from\n * the expression; block bodies and complex expressions stay `any`. */\n returns?: TypeDescriptor\n}\n\n/** Describes a function parameter */\nexport interface ParameterDescriptor {\n name: string\n type: TypeDescriptor\n required: boolean\n default?: any\n /** The example value used to infer the type (for autocomplete) */\n example?: any\n description?: string\n /** Source location for error reporting */\n loc?: { start: number; end: number }\n}\n\n/** Describes a function's complete signature */\nexport interface FunctionSignature {\n name: string\n description?: string\n parameters: Record<string, ParameterDescriptor>\n returns?: TypeDescriptor\n}\n\n// ============================================================================\n// Transpiler Options and Results\n// ============================================================================\n\n/** Options for the transpile function */\nexport interface TranspileOptions {\n /** Include source locations in output AST */\n sourceMaps?: boolean\n /** Atom registry for validation (optional) */\n atoms?: Record<string, { op: string }>\n /** Filename for error messages */\n filename?: string\n /** Whether to use strict type checking */\n strict?: boolean\n}\n\n/** Result of transpilation */\nexport interface TranspileResult {\n /** The Agent99 AST */\n ast: SeqNode\n /** The function signature with types */\n signature: FunctionSignature\n /** Source map (if enabled) */\n sourceMap?: SourceMap\n /** Warnings (non-fatal issues) */\n warnings: TranspileWarning[]\n}\n\n/** A non-fatal warning during transpilation */\nexport interface TranspileWarning {\n message: string\n line: number\n column: number\n source?: string\n}\n\n/** Source map for debugging */\nexport interface SourceMap {\n version: 3\n file: string\n sources: string[]\n mappings: string\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/** Base class for transpiler errors with source location */\nexport class TranspileError extends Error {\n line: number\n column: number\n source?: string\n filename?: string\n\n constructor(\n message: string,\n location: { line: number; column: number },\n source?: string,\n filename?: string\n ) {\n const loc = `${filename || '<source>'}:${location.line}:${location.column}`\n super(`${message} at ${loc}`)\n this.name = 'TranspileError'\n this.line = location.line\n this.column = location.column\n this.source = source\n this.filename = filename\n }\n}\n\n/** Syntax error during parsing */\nexport class SyntaxError extends TranspileError {\n constructor(\n message: string,\n location: { line: number; column: number },\n source?: string,\n filename?: string\n ) {\n super(message, location, source, filename)\n this.name = 'SyntaxError'\n }\n\n /**\n * Format the error with source context for better debugging\n * Shows the problematic line with a caret pointing to the error location\n */\n formatWithContext(contextLines = 2): string {\n if (!this.source) return this.message\n\n const lines = this.source.split('\\n')\n const errorLine = this.line - 1 // 0-indexed\n const startLine = Math.max(0, errorLine - contextLines)\n const endLine = Math.min(lines.length - 1, errorLine + contextLines)\n\n const output: string[] = []\n const lineNumWidth = String(endLine + 1).length\n\n // Add context before\n for (let i = startLine; i <= endLine; i++) {\n const lineNum = String(i + 1).padStart(lineNumWidth)\n const marker = i === errorLine ? '>' : ' '\n output.push(`${marker} ${lineNum} | ${lines[i]}`)\n\n // Add caret pointing to error column\n if (i === errorLine) {\n const caretPadding = ' '.repeat(lineNumWidth + 4 + this.column)\n output.push(`${caretPadding}^ ${this.message.split(' at ')[0]}`)\n }\n }\n\n return output.join('\\n')\n }\n}\n\n/** Type error during transpilation or runtime */\nexport class TypeError extends TranspileError {\n expected?: string\n received?: string\n suggestion?: string\n\n constructor(\n message: string,\n location: { line: number; column: number },\n options?: {\n expected?: string\n received?: string\n suggestion?: string\n source?: string\n filename?: string\n }\n ) {\n super(message, location, options?.source, options?.filename)\n this.name = 'TypeError'\n this.expected = options?.expected\n this.received = options?.received\n this.suggestion = options?.suggestion\n }\n}\n\n// ============================================================================\n// Transform Context\n// ============================================================================\n\n/** Context passed through the transformer */\nexport interface TransformContext {\n /** Current scope depth */\n depth: number\n /** Variables declared in current scope with their types */\n locals: Map<string, TypeDescriptor>\n /** Parent scope's context (for scope chain) */\n parent?: TransformContext\n /** Function parameters */\n parameters: Map<string, ParameterDescriptor>\n /** Registered atom names */\n atoms: Set<string>\n /** Accumulated warnings */\n warnings: TranspileWarning[]\n /** Source code for error messages */\n source: string\n /** Filename */\n filename: string\n /** Options */\n options: TranspileOptions\n}\n\n/** Create a child context for nested scopes */\nexport function createChildContext(parent: TransformContext): TransformContext {\n return {\n depth: parent.depth + 1,\n locals: new Map(),\n parent,\n parameters: parent.parameters,\n atoms: parent.atoms,\n warnings: parent.warnings,\n source: parent.source,\n filename: parent.filename,\n options: parent.options,\n }\n}\n\n/** Look up a variable in the scope chain */\nexport function lookupVariable(\n name: string,\n ctx: TransformContext\n): TypeDescriptor | undefined {\n // Check locals first\n if (ctx.locals.has(name)) {\n return ctx.locals.get(name)\n }\n // Check parameters\n if (ctx.parameters.has(name)) {\n return ctx.parameters.get(name)?.type\n }\n // Check parent scope\n if (ctx.parent) {\n return lookupVariable(name, ctx.parent)\n }\n return undefined\n}\n\n// ============================================================================\n// AST Node Helpers\n// ============================================================================\n\n/** Extract location from an Acorn node */\nexport function getLocation(node: Node): { line: number; column: number } {\n if (node.loc) {\n return { line: node.loc.start.line, column: node.loc.start.column }\n }\n return { line: 1, column: 0 }\n}\n", "/**\n * Parser source transforms\n *\n * All source-to-source text transforms used by the preprocess pipeline.\n * These operate on raw source strings before Acorn parsing.\n */\n\nimport { SyntaxError } from './types'\n\n/**\n * Extract a brace-balanced value from source after a regex match.\n * Returns a match-like object with [1] being the balanced { ... } content,\n * or null if no match. Handles nested braces.\n */\nfunction extractBalancedValue(\n source: string,\n startRe: RegExp\n): RegExpMatchArray | null {\n const m = source.match(startRe)\n if (!m) return null\n\n const braceStart = m.index! + m[0].length - 1 // position of opening {\n let depth = 1\n let j = braceStart + 1\n while (j < source.length && depth > 0) {\n if (source[j] === '{') depth++\n else if (source[j] === '}') depth--\n j++\n }\n if (depth !== 0) return null\n\n const balanced = source.slice(braceStart, j) // includes { and }\n const result = [m[0].slice(0, -1) + balanced, balanced] as RegExpMatchArray\n result.index = m.index\n return result\n}\nimport type {\n WasmBlock,\n TestBlock,\n ExtensionInfo,\n PolyVariant,\n TokenizerState,\n} from './parser-types'\nimport { extractJSValue } from './parser-params'\n\nexport function transformTryWithoutCatch(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'try' keyword followed by '{'\n const tryMatch = source.slice(i).match(/^\\btry\\s*\\{/)\n if (tryMatch) {\n // Found 'try {', now find the matching closing brace\n const startBrace = i + tryMatch[0].length - 1\n const bodyStart = startBrace + 1\n let depth = 1\n let j = bodyStart\n\n while (j < source.length && depth > 0) {\n const char = source[j]\n if (char === '{') depth++\n else if (char === '}') depth--\n j++\n }\n\n if (depth !== 0) {\n // Unbalanced braces, let the parser handle the error\n result += source[i]\n i++\n continue\n }\n\n // Check what comes after the closing brace\n const afterTry = source.slice(j).match(/^\\s*(catch|finally)\\b/)\n\n if (afterTry) {\n // Has catch or finally - leave it alone, copy the try block as-is\n result += source.slice(i, j)\n i = j\n } else {\n // No catch or finally - add monadic error handler\n // Returns MonadicError to maintain monadic flow (propagates through function chains)\n const body = source.slice(bodyStart, j - 1)\n result += `try {${body}} catch (__try_err) { return new (__tjs?.MonadicError ?? Error)(__try_err?.message || String(__try_err), 'try', undefined, undefined, __tjs?.getStack?.()) }`\n i = j\n }\n } else {\n result += source[i]\n i++\n }\n }\n\n return result\n}\n\n/**\n * Extract WASM blocks from source and replace with runtime dispatch code\n *\n * Simple form (body used as both WASM source and JS fallback):\n * wasm {\n * for (let i = 0; i < arr.length; i++) { arr[i] *= 2 }\n * }\n *\n * With explicit fallback (when you need different JS code):\n * wasm {\n * // WASM-optimized version\n * } fallback {\n * // Different JS implementation\n * }\n *\n * Output:\n * (globalThis.__tjs_wasm_0\n * ? globalThis.__tjs_wasm_0(captures...)\n * : (() => { body })())\n *\n * Variables are auto-captured from the body.\n */\nexport function extractWasmBlocks(source: string): {\n source: string\n blocks: WasmBlock[]\n} {\n const blocks: WasmBlock[] = []\n let result = ''\n let i = 0\n let blockId = 0\n\n while (i < source.length) {\n // Look for 'wasm {' or 'wasm{' - simple block without params\n const wasmMatch = source.slice(i).match(/^\\bwasm\\s*\\{/)\n if (wasmMatch) {\n const matchStart = i\n\n // Find the body\n const bodyStart = i + wasmMatch[0].length\n let braceDepth = 1\n let j = bodyStart\n\n while (j < source.length && braceDepth > 0) {\n const char = source[j]\n if (char === '{') braceDepth++\n else if (char === '}') braceDepth--\n j++\n }\n\n if (braceDepth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const body = source.slice(bodyStart, j - 1)\n let fallbackBody: string | undefined\n let matchEnd = j\n\n // Check for optional 'fallback {' block\n const fallbackMatch = source.slice(j).match(/^\\s*fallback\\s*\\{/)\n if (fallbackMatch) {\n const fallbackStart = j + fallbackMatch[0].length\n braceDepth = 1\n let k = fallbackStart\n\n while (k < source.length && braceDepth > 0) {\n const char = source[k]\n if (char === '{') braceDepth++\n else if (char === '}') braceDepth--\n k++\n }\n\n if (braceDepth === 0) {\n fallbackBody = source.slice(fallbackStart, k - 1)\n matchEnd = k\n }\n }\n\n // Auto-detect captured variables from the body\n const captureNames = detectCaptures(body)\n\n // Try to find type annotations from enclosing function parameters\n // Look backwards from matchStart to find the function signature\n const captures = captureNames.map((name) => {\n const typeAnnotation = findParameterType(source, matchStart, name)\n return typeAnnotation ? `${name}: ${typeAnnotation}` : name\n })\n\n // Create the block record\n const block: WasmBlock = {\n id: `__tjs_wasm_${blockId}`,\n body,\n fallback: fallbackBody,\n captures,\n start: matchStart,\n end: matchEnd,\n }\n blocks.push(block)\n\n // Generate runtime dispatch code:\n // The fallback is the body itself (or explicit fallback if provided)\n const fallbackCode = fallbackBody ?? body\n // Strip type annotations from captures for runtime args (e.g., \"xs: Float32Array\" -> \"xs\")\n const captureArgNames = captures.map((c) => c.split(':')[0].trim())\n const captureArgs =\n captureArgNames.length > 0 ? captureArgNames.join(', ') : ''\n\n // For WASM: pass captures as arguments\n // For fallback: just run inline (captures are in scope)\n const wasmCall =\n captureArgNames.length > 0\n ? `globalThis.${block.id}(${captureArgs})`\n : `globalThis.${block.id}()`\n\n const dispatch = `(globalThis.${block.id} ? ${wasmCall} : (() => {${fallbackCode}})())`\n\n result += dispatch\n i = matchEnd\n blockId++\n } else {\n result += source[i]\n i++\n }\n }\n\n return { source: result, blocks }\n}\n\n/** Check if an identifier is a WASM SIMD intrinsic (not a captured variable) */\nfunction isWasmIntrinsic(name: string): boolean {\n return name.startsWith('f32x4_') || name.startsWith('v128_')\n}\n\n/**\n * Detect variables captured from enclosing scope\n *\n * Finds identifiers that are:\n * - Used in the body\n * - Not declared within the body (let, const, var, function params)\n *\n * This is a simple heuristic - a full implementation would use proper AST analysis\n */\nfunction detectCaptures(body: string): string[] {\n // Strip comments first to avoid extracting words from comments\n const bodyWithoutComments = body\n .replace(/\\/\\/[^\\n]*/g, '') // line comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // block comments\n\n // Collect identifiers that appear as property accesses (after a dot)\n const propertyOnly = new Set<string>()\n const propPattern = /\\.([a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g\n let match\n while ((match = propPattern.exec(bodyWithoutComments)) !== null) {\n propertyOnly.add(match[1])\n }\n\n // Find all identifiers used in the body (not after a dot)\n const identifierPattern = /(?<!\\.)(\\b[a-zA-Z_$][a-zA-Z0-9_$]*)\\b/g\n const allIdentifiers = new Set<string>()\n while ((match = identifierPattern.exec(bodyWithoutComments)) !== null) {\n allIdentifiers.add(match[1])\n }\n\n // Remove identifiers that ONLY appear as property accesses\n for (const prop of propertyOnly) {\n if (!allIdentifiers.has(prop)) continue\n // Check if this identifier is also used standalone (not just as .prop)\n const standalonePattern = new RegExp(`(?<!\\\\.)\\\\b${prop}\\\\b`, 'g')\n const dotPattern = new RegExp(`\\\\.${prop}\\\\b`, 'g')\n const standaloneMatches =\n bodyWithoutComments.match(standalonePattern)?.length || 0\n const dotMatches = bodyWithoutComments.match(dotPattern)?.length || 0\n // If every occurrence is a property access, remove it\n if (standaloneMatches <= dotMatches) {\n allIdentifiers.delete(prop)\n }\n }\n\n // Find identifiers declared in the body\n const declared = new Set<string>()\n\n // let/const/var declarations\n const declPattern = /\\b(?:let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g\n while ((match = declPattern.exec(bodyWithoutComments)) !== null) {\n declared.add(match[1])\n }\n\n // for loop variables: for (let i = ...)\n const forPattern =\n /\\bfor\\s*\\(\\s*(?:let|const|var)\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g\n while ((match = forPattern.exec(bodyWithoutComments)) !== null) {\n declared.add(match[1])\n }\n\n // function declarations and parameters would go here for full impl\n\n // JS keywords and builtins to exclude\n const reserved = new Set([\n 'if',\n 'else',\n 'for',\n 'while',\n 'do',\n 'switch',\n 'case',\n 'break',\n 'continue',\n 'return',\n 'function',\n 'let',\n 'const',\n 'var',\n 'new',\n 'this',\n 'true',\n 'false',\n 'null',\n 'undefined',\n 'typeof',\n 'instanceof',\n 'in',\n 'of',\n 'try',\n 'catch',\n 'finally',\n 'throw',\n 'async',\n 'await',\n 'class',\n 'extends',\n 'super',\n 'import',\n 'export',\n 'default',\n 'from',\n 'as',\n 'static',\n 'get',\n 'set',\n 'yield',\n // Common globals\n 'console',\n 'Math',\n 'Array',\n 'Object',\n 'String',\n 'Number',\n 'Boolean',\n 'Date',\n 'JSON',\n 'Promise',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Float32Array',\n 'Float64Array',\n 'Int8Array',\n 'Int16Array',\n 'Int32Array',\n 'Uint8Array',\n 'Uint16Array',\n 'Uint32Array',\n 'BigInt64Array',\n 'BigUint64Array',\n 'ArrayBuffer',\n 'DataView',\n 'Error',\n 'TypeError',\n 'RangeError',\n 'length',\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'slice',\n 'splice',\n 'map',\n 'filter',\n 'reduce',\n 'forEach',\n 'find',\n 'findIndex',\n 'indexOf',\n 'includes',\n 'globalThis',\n 'window',\n 'document',\n 'Infinity',\n 'NaN',\n 'isNaN',\n 'isFinite',\n 'parseInt',\n 'parseFloat',\n 'encodeURI',\n 'decodeURI',\n 'eval',\n 'wasmBuffer',\n ])\n\n // Return identifiers that are used but not declared or reserved\n const captures: string[] = []\n for (const id of allIdentifiers) {\n if (!declared.has(id) && !reserved.has(id) && !isWasmIntrinsic(id)) {\n captures.push(id)\n }\n }\n\n return captures.sort()\n}\n\n/**\n * Find the type annotation for a parameter in the enclosing function\n *\n * Looks backwards from wasmBlockStart to find the function signature,\n * then extracts the type annotation for the given parameter name.\n *\n * Supports:\n * - TJS colon syntax: `param: Float32Array`\n * - TypeScript syntax: `param: Float32Array`\n */\nfunction findParameterType(\n source: string,\n wasmBlockStart: number,\n paramName: string\n): string | undefined {\n // Look backwards to find the function signature\n // Find the nearest 'function' keyword before the wasm block\n const beforeBlock = source.slice(0, wasmBlockStart)\n\n // Match function declaration with parameters\n // This regex finds function signatures and captures the parameter list\n const funcPattern = /function\\s+\\w+\\s*\\(([^)]*)\\)\\s*(?:->.*?)?\\s*\\{[^}]*$/\n const match = beforeBlock.match(funcPattern)\n\n if (!match) {\n // Try arrow function or method syntax\n const arrowPattern =\n /(?:const|let|var)?\\s*\\w+\\s*=\\s*(?:async\\s*)?\\(([^)]*)\\)\\s*(?:=>|->)?\\s*\\{[^}]*$/\n const arrowMatch = beforeBlock.match(arrowPattern)\n if (!arrowMatch) return undefined\n return extractTypeFromParams(arrowMatch[1], paramName)\n }\n\n return extractTypeFromParams(match[1], paramName)\n}\n\n/**\n * Extract the type annotation for a specific parameter from a parameter list string\n */\nfunction extractTypeFromParams(\n paramsStr: string,\n paramName: string\n): string | undefined {\n // Split by comma (handling nested structures)\n const params = paramsStr.split(',').map((p) => p.trim())\n\n for (const param of params) {\n // Match patterns like:\n // - `name: Float32Array`\n // - `name: number`\n // - `name = Float32Array` (TJS example syntax)\n const colonMatch = param.match(\n new RegExp(`^${paramName}\\\\s*:\\\\s*([A-Za-z][A-Za-z0-9]*)`)\n )\n if (colonMatch) {\n return colonMatch[1]\n }\n\n // Match TypeScript-style with equals (default value that's a type constructor)\n const equalsMatch = param.match(\n new RegExp(\n `^${paramName}\\\\s*=\\\\s*(Float32Array|Float64Array|Int32Array|Uint8Array|Int8Array|Int16Array|Uint16Array|Uint32Array)`\n )\n )\n if (equalsMatch) {\n return equalsMatch[1]\n }\n }\n\n return undefined\n}\n\n/**\n * Transform Is/IsNot infix operators to function calls\n *\n * Syntax:\n * a Is b -> Is(a, b)\n * a IsNot b -> IsNot(a, b)\n *\n * This enables structural equality with a clean syntax.\n */\nexport function transformIsOperators(source: string): string {\n // Match: (simpleExpr) IsNot (simpleExpr) - must check IsNot first (longer match)\n // simpleExpr = identifier chain with optional [], () OR literals\n const exprPat =\n '([\\\\w][\\\\w.\\\\[\\\\]()]*|null|undefined|true|false|\\\\d+(?:\\\\.\\\\d+)?|\\'[^\\']*\\'|\"[^\"]*\")'\n\n // Transform IsNot first (longer keyword)\n const isNotRegex = new RegExp(exprPat + '\\\\s+IsNot\\\\s+' + exprPat, 'g')\n source = source.replace(isNotRegex, 'IsNot($1, $2)')\n\n // Transform Is\n const isRegex = new RegExp(exprPat + '\\\\s+Is\\\\s+' + exprPat, 'g')\n source = source.replace(isRegex, 'Is($1, $2)')\n\n return source\n}\n\n/**\n * Insert semicolons to prevent ASI footguns (TjsStandard mode)\n *\n * JavaScript's ASI (Automatic Semicolon Insertion) has notorious footguns:\n *\n * foo // Intended: call foo, then IIFE\n * (() => {})() // Actual: foo(...)(...) - calls foo with IIFE as argument!\n *\n * TjsStandard prevents this by treating newlines as statement terminators\n * (like Go, Swift, Kotlin). When a line starts with a problematic character\n * that could continue the previous line, we insert a semicolon.\n *\n * Problematic line starts: ( [ / + - `\n *\n * We only insert when the previous line doesn't already end with:\n * - A semicolon\n * - An opening brace/bracket/paren (multi-line expression)\n * - A comma (array/object literal or params)\n * - An operator that clearly continues (+, -, *, /, =, etc.)\n * - A keyword that expects continuation (return, throw, etc. followed by value)\n */\nexport function insertAsiProtection(source: string): string {\n // Characters that can continue a previous expression (ASI footguns)\n // Only (, [, and ` \u2014 these are the real hazards where ASI causes bugs.\n // +, -, / at line start are continuations or literals, not footguns.\n const continuationStarts = /^[\\s]*[([`]/\n\n // Characters/patterns that indicate the previous line expects continuation\n // (don't insert semicolon after these)\n const expectsContinuation = /[{([,;:+\\-*/%=&|?<>!~^]\\s*$|^\\s*$/\n\n // Keywords that expect an expression to follow on same or next line\n const continueKeywords =\n /\\b(return|throw|yield|await|case|default|extends|new|typeof|void|delete|in|of|instanceof)\\s*$/\n\n const lines = source.split('\\n')\n const result: string[] = []\n let inBlockComment = false\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const prevLine = i > 0 ? lines[i - 1] : ''\n\n // Track block comment state\n if (inBlockComment) {\n result.push(line)\n if (line.includes('*/')) inBlockComment = false\n continue\n }\n\n // Check if this line opens a block comment\n const commentOpen = line.indexOf('/*')\n const commentClose = line.indexOf('*/')\n if (\n commentOpen !== -1 &&\n (commentClose === -1 || commentClose < commentOpen)\n ) {\n inBlockComment = true\n result.push(line)\n continue\n }\n\n // Check if this line starts with a problematic character\n if (i > 0 && continuationStarts.test(line)) {\n // Get the previous line without trailing comment\n const prevNoComment = prevLine\n .replace(/\\/\\/.*$/, '')\n .replace(/\\/\\*.*\\*\\/\\s*$/, '')\n\n // Don't insert if prev line clearly expects continuation\n if (\n !expectsContinuation.test(prevNoComment) &&\n !continueKeywords.test(prevNoComment)\n ) {\n // Insert semicolon at start of this line (preserving whitespace)\n const match = line.match(/^(\\s*)/)\n const indent = match ? match[1] : ''\n const rest = line.slice(indent.length)\n result.push(indent + ';' + rest)\n continue\n }\n }\n\n result.push(line)\n }\n\n return result.join('\\n')\n}\n\n/**\n * Replace `typeof X` with `TypeOf(X)` outside string/template/comment/regex bodies.\n * X may be `ident`, `ident.foo`, `ident?.foo`, etc. Anything that doesn't look\n * like a simple identifier expression (e.g. `typeof (x + 1)`) is left alone.\n */\nfunction transformTypeofKeyword(source: string): string {\n type Match = { keywordStart: number; operandEnd: number; operand: string }\n const matches: Match[] = []\n let i = 0\n let state: TokenizerState = 'normal'\n const templateStack: number[] = []\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n switch (state) {\n case 'single-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === \"'\") state = 'normal'\n i++\n continue\n case 'double-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '\"') state = 'normal'\n i++\n continue\n case 'template-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n i += 2\n templateStack.push(1)\n state = 'normal'\n continue\n }\n if (char === '`') state = 'normal'\n i++\n continue\n case 'line-comment':\n if (char === '\\n') state = 'normal'\n i++\n continue\n case 'block-comment':\n if (char === '*' && nextChar === '/') {\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n case 'regex':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '[') {\n i++\n while (i < source.length && source[i] !== ']') {\n if (source[i] === '\\\\' && i + 1 < source.length) i += 2\n else i++\n }\n if (i < source.length) i++\n continue\n }\n if (char === '/') {\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) i++\n state = 'normal'\n continue\n }\n i++\n continue\n case 'normal':\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n templateStack.pop()\n i++\n state = 'template-string'\n continue\n }\n }\n }\n if (char === \"'\") {\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n i += 2\n state = 'block-comment'\n continue\n }\n if (char === '/') {\n let j = i - 1\n while (j >= 0 && /\\s/.test(source[j])) j--\n const beforeChar = j >= 0 ? source[j] : ''\n const isRegexContext =\n !beforeChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]/.test(beforeChar) ||\n (j >= 5 &&\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)$/.test(\n source.slice(Math.max(0, j - 10), j + 1)\n ))\n if (isRegexContext) {\n i++\n state = 'regex'\n continue\n }\n }\n\n // Detect `typeof <ident-chain>` \u2014 only when preceded by a non-word\n // boundary and followed by whitespace then an identifier.\n if (\n char === 't' &&\n source.slice(i, i + 6) === 'typeof' &&\n (i === 0 || !/[\\w$]/.test(source[i - 1])) &&\n /\\s/.test(source[i + 6] ?? '')\n ) {\n let j = i + 6\n while (j < source.length && /\\s/.test(source[j])) j++\n if (j < source.length && /[a-zA-Z_$]/.test(source[j])) {\n const operandStart = j\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n // Optional `.name` or `?.name` chains\n while (j < source.length) {\n if (source[j] === '.' && /[a-zA-Z_$]/.test(source[j + 1] ?? '')) {\n j++\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n } else if (\n source[j] === '?' &&\n source[j + 1] === '.' &&\n /[a-zA-Z_$]/.test(source[j + 2] ?? '')\n ) {\n j += 2\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n } else {\n break\n }\n }\n matches.push({\n keywordStart: i,\n operandEnd: j,\n operand: source.slice(operandStart, j),\n })\n i = j\n continue\n }\n }\n break\n }\n i++\n }\n\n if (matches.length === 0) return source\n\n // Apply replacements from end to start so earlier positions remain valid.\n let result = source\n for (let k = matches.length - 1; k >= 0; k--) {\n const m = matches[k]\n result =\n result.slice(0, m.keywordStart) +\n `TypeOf(${m.operand})` +\n result.slice(m.operandEnd)\n }\n return result\n}\n\n/**\n * Transform == and != to Is() and IsNot() calls\n *\n * In TJS normal mode:\n * a == b -> Is(a, b) (structural equality)\n * a != b -> IsNot(a, b) (structural inequality)\n * a === b -> a === b (identity, unchanged)\n *\n * Uses a two-pass algorithm:\n * 1. Find all == and != positions (outside strings/comments/regex)\n * 2. Transform from end to start (so positions remain valid)\n */\nexport function transformEqualityToStructural(source: string): string {\n // Transform typeof to TypeOf() \u2014 fixes typeof null === 'object'.\n // Uses the same tokenizer state machine as the equality pass so it skips\n // string/template/comment/regex bodies (a regex replace would rewrite\n // 'typeof x' inside string literals).\n source = transformTypeofKeyword(source)\n\n // First pass: find all == and != positions (outside strings/comments/regex)\n const equalityOps: Array<{ pos: number; op: '==' | '!=' }> = []\n let i = 0\n let state: TokenizerState = 'normal'\n const templateStack: number[] = []\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n // Handle state transitions\n switch (state) {\n case 'single-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === \"'\") state = 'normal'\n i++\n continue\n\n case 'double-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '\"') state = 'normal'\n i++\n continue\n\n case 'template-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n i += 2\n templateStack.push(1)\n state = 'normal'\n continue\n }\n if (char === '`') state = 'normal'\n i++\n continue\n\n case 'line-comment':\n if (char === '\\n') state = 'normal'\n i++\n continue\n\n case 'block-comment':\n if (char === '*' && nextChar === '/') {\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'regex':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '[') {\n i++\n while (i < source.length && source[i] !== ']') {\n if (source[i] === '\\\\' && i + 1 < source.length) {\n i += 2\n } else {\n i++\n }\n }\n if (i < source.length) i++\n continue\n }\n if (char === '/') {\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) i++\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'normal':\n // Handle template stack\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n templateStack.pop()\n i++\n state = 'template-string'\n continue\n }\n }\n }\n\n // Check for string/comment/regex start\n if (char === \"'\") {\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n i += 2\n state = 'block-comment'\n continue\n }\n\n // Check for regex literal (simplified detection)\n if (char === '/') {\n let j = i - 1\n while (j >= 0 && /\\s/.test(source[j])) j--\n const beforeChar = j >= 0 ? source[j] : ''\n const isRegexContext =\n !beforeChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]/.test(beforeChar) ||\n (j >= 5 &&\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)$/.test(\n source.slice(Math.max(0, j - 10), j + 1)\n ))\n if (isRegexContext) {\n i++\n state = 'regex'\n continue\n }\n }\n\n // Look for == or != (but not === or !==)\n // For ==: check it's not part of !== (char before is !)\n // For !=: check it's not !== (third char is =)\n if (\n char === '=' &&\n nextChar === '=' &&\n source[i + 2] !== '=' &&\n source[i - 1] !== '!'\n ) {\n equalityOps.push({ pos: i, op: '==' })\n i += 2\n continue\n }\n if (char === '!' && nextChar === '=' && source[i + 2] !== '=') {\n equalityOps.push({ pos: i, op: '!=' })\n i += 2\n continue\n }\n break\n }\n\n i++\n }\n\n // If no equality operators found, return source unchanged\n if (equalityOps.length === 0) {\n return source\n }\n\n // Second pass: transform from end to start (so positions remain valid)\n let result = source\n for (let k = equalityOps.length - 1; k >= 0; k--) {\n const { pos, op } = equalityOps[k]\n const funcName = op === '==' ? 'Eq' : 'NotEq'\n\n // Find left operand boundary\n const leftBoundary = findLeftOperandBoundary(result, pos)\n // Find right operand boundary\n const rightBoundary = findRightOperandBoundary(result, pos + 2)\n\n const leftExpr = result.slice(leftBoundary, pos).trim()\n const rightExpr = result.slice(pos + 2, rightBoundary).trim()\n\n if (leftExpr && rightExpr) {\n // Build the replacement\n const before = result.slice(0, leftBoundary)\n const after = result.slice(rightBoundary)\n // Add space after keyword if needed (e.g., return, throw, typeof)\n const needsSpace = /[a-zA-Z0-9_$]$/.test(before)\n const spacer = needsSpace ? ' ' : ''\n result = `${before}${spacer}${funcName}(${leftExpr}, ${rightExpr})${after}`\n }\n }\n\n return result\n}\n\n/**\n * Find the start position of the left operand\n *\n * Scans backwards from the operator position to find where the left expression starts.\n * Respects operator precedence: == has lower precedence than arithmetic operators,\n * so `x % 2 == 0` has left operand `x % 2`.\n */\nfunction findLeftOperandBoundary(source: string, opPos: number): number {\n let i = opPos - 1\n\n // Skip whitespace before operator\n while (i >= 0 && /\\s/.test(source[i])) i--\n if (i < 0) return 0\n\n let depth = 0\n let inString = false\n let stringChar = ''\n\n while (i >= 0) {\n const char = source[i]\n const prevChar = i > 0 ? source[i - 1] : ''\n\n // Handle string literals (scan backwards through them)\n if (inString) {\n if (char === stringChar && prevChar !== '\\\\') {\n inString = false\n }\n i--\n continue\n }\n\n // Check for string end (we're scanning backwards, so end is opening quote)\n if ((char === '\"' || char === \"'\" || char === '`') && prevChar !== '\\\\') {\n inString = true\n stringChar = char\n i--\n continue\n }\n\n // Track depth of parens/brackets/braces (reversed since we're going backwards)\n if (char === ')' || char === ']' || char === '}') {\n depth++\n i--\n continue\n }\n if (char === '(' || char === '[') {\n if (depth > 0) {\n depth--\n i--\n continue\n }\n // Opening paren/bracket at depth 0 - this is a grouping/call paren\n // The expression starts AFTER it, not including it\n return i + 1\n }\n if (char === '{') {\n if (depth > 0) {\n depth--\n i--\n continue\n }\n // Opening brace at depth 0 \u2014 could be block statement boundary\n return i + 1\n }\n\n // Inside nested expression - keep scanning\n if (depth > 0) {\n i--\n continue\n }\n\n // At depth 0 - check for expression boundaries\n // Statement delimiters\n if (char === ';') {\n return i + 1\n }\n\n // Check for keywords that precede expressions (return, throw, etc.)\n // We need to look backwards for a word boundary and check if it's a keyword\n if (/[a-z]/.test(char)) {\n // Might be end of a keyword - scan backwards to get full word\n const wordEnd = i + 1\n let wordStart = i\n while (wordStart > 0 && /[a-z]/i.test(source[wordStart - 1])) {\n wordStart--\n }\n const word = source.slice(wordStart, wordEnd)\n // Check if preceded by word char (not a keyword then)\n const beforeWord = wordStart > 0 ? source[wordStart - 1] : ''\n if (!/[a-zA-Z0-9_$]/.test(beforeWord)) {\n // These keywords start an expression - stop after them\n if (\n [\n 'return',\n 'throw',\n 'case',\n 'typeof',\n 'void',\n 'delete',\n 'await',\n 'yield',\n ].includes(word)\n ) {\n return wordEnd\n }\n // 'new' is part of the operand (new Foo() == bar),\n // so include it by continuing the scan\n if (word === 'new') {\n return wordStart\n }\n }\n }\n\n // Arrow function - stop before =>\n if (char === '>' && prevChar === '=') {\n return i + 1\n }\n\n // Assignment operator (but not ==, !=, <=, >=)\n if (\n char === '=' &&\n prevChar !== '=' &&\n prevChar !== '!' &&\n prevChar !== '<' &&\n prevChar !== '>'\n ) {\n return i + 1\n }\n\n // Logical operators (lower precedence than ==)\n if (char === '&' && prevChar === '&') {\n return i + 1\n }\n if (char === '|' && prevChar === '|') {\n return i + 1\n }\n\n // Ternary operators\n if (char === '?' || char === ':') {\n return i + 1\n }\n\n // Comma\n if (char === ',') {\n return i + 1\n }\n\n i--\n }\n\n return 0\n}\n\n/**\n * Find the end position of the right operand\n *\n * Scans forward from after the operator to find where the right expression ends.\n */\nfunction findRightOperandBoundary(\n source: string,\n startAfterOp: number\n): number {\n let i = startAfterOp\n\n // Skip whitespace after operator\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i >= source.length) return source.length\n\n let depth = 0\n let inString = false\n let stringChar = ''\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = i + 1 < source.length ? source[i + 1] : ''\n\n // Handle string literals\n if (inString) {\n if (char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n }\n i++\n continue\n }\n\n if (\n (char === '\"' || char === \"'\" || char === '`') &&\n source[i - 1] !== '\\\\'\n ) {\n inString = true\n stringChar = char\n i++\n continue\n }\n\n // Track depth\n if (char === '(' || char === '[' || char === '{') {\n depth++\n i++\n continue\n }\n if (char === ')' || char === ']' || char === '}') {\n if (depth > 0) {\n depth--\n i++\n continue\n }\n // Closing paren at depth 0 - boundary\n return i\n }\n\n // Inside nested - keep scanning\n if (depth > 0) {\n i++\n continue\n }\n\n // At depth 0 - check for expression boundaries\n if (char === ';') {\n return i\n }\n\n // Logical operators - lower precedence than ==\n if (char === '&' && nextChar === '&') {\n return i\n }\n if (char === '|' && nextChar === '|') {\n return i\n }\n\n // Ternary\n if (char === '?') {\n return i\n }\n if (char === ':') {\n return i\n }\n\n // Comma\n if (char === ',') {\n return i\n }\n\n // Another == or != (chained equality - stop before it)\n if (\n (char === '=' || char === '!') &&\n nextChar === '=' &&\n source[i + 2] !== '='\n ) {\n return i\n }\n\n i++\n }\n\n return source.length\n}\n\n/**\n * Transform Type block declarations\n *\n * Syntax forms:\n * Type Foo 'example' -> const Foo = Type('Foo', 'example')\n * Type Foo { example: 'value' } -> const Foo = Type('Foo', 'value')\n * Type Foo 'description' { example: 'value' }\n * -> const Foo = Type('description', 'value')\n * Type Foo 'description' { example: 0, predicate(x) { return x > 0 } }\n * -> const Foo = Type('description', (x) => { ... }, 0)\n *\n * When predicate + example: auto-generate type guard from example\n */\nexport function transformTypeDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Type' keyword followed by identifier\n const typeMatch = source\n .slice(i)\n .match(/^\\bType\\s+([A-Z_][a-zA-Z0-9_]*)\\s*/)\n if (typeMatch) {\n const typeName = typeMatch[1]\n let j = i + typeMatch[0].length\n\n // Check for optional description string\n // Only treat as description if followed by = or {\n let description = typeName\n let descriptionWasExplicit = false\n const descStringMatch = source.slice(j).match(/^(['\"`])([^]*?)\\1\\s*/)\n if (descStringMatch) {\n const afterString = j + descStringMatch[0].length\n const nextChar = source[afterString]\n // Check if this looks like end of statement (not followed by = or {)\n // Note: the \\s* in the regex consumes trailing whitespace including newlines\n const isEndOfStatement =\n nextChar === undefined ||\n afterString >= source.length ||\n (nextChar !== '=' && nextChar !== '{')\n\n if (nextChar === '=' || nextChar === '{') {\n // It's a description followed by = or { block\n description = descStringMatch[2]\n descriptionWasExplicit = true\n j = afterString\n } else if (isEndOfStatement) {\n // Old simple form: Type Name 'value' - value is both example and default\n const value = descStringMatch[0].trim()\n // Preserve trailing whitespace (newlines) that was consumed by the regex\n const trailingWs = descStringMatch[0].slice(value.length)\n result += `const ${typeName} = Type('${typeName}', ${value})${trailingWs}`\n i = afterString\n continue\n }\n }\n\n // Check for = default value\n let defaultValue: string | undefined\n let posAfterDefault = j // Track position right after the default value\n const equalsMatch = source.slice(j).match(/^=\\s*/)\n if (equalsMatch) {\n j += equalsMatch[0].length\n // Parse the default value (handles +number, strings, objects, arrays, etc.)\n const valueMatch = source\n .slice(j)\n .match(\n /^(\\+?\\d+(?:\\.\\d+)?|['\"`][^'\"`]*['\"`]|\\{[^}]*\\}|\\[[^\\]]*\\]|true|false|null)/\n )\n if (valueMatch) {\n defaultValue = valueMatch[0]\n j += valueMatch[0].length\n posAfterDefault = j // Save position before consuming whitespace\n // Skip whitespace after default (only to check for block)\n const wsMatch = source.slice(j).match(/^\\s*/)\n if (wsMatch) j += wsMatch[0].length\n }\n }\n\n // Check for block { ... }\n if (source[j] === '{') {\n // Block form: Type Foo 'desc'? = default? { ... }\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n // Unbalanced - just copy and continue\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse block body for description (old syntax fallback), example, predicate\n const descInsideMatch = blockBody.match(\n /description\\s*:\\s*(['\"`])([^]*?)\\1/\n )\n if (descInsideMatch && !descriptionWasExplicit) {\n description = descInsideMatch[2]\n }\n\n // Extract example value using state machine for nested structures\n let example: string | undefined\n const exampleKeyword = blockBody.match(/example\\s*:\\s*/)\n if (exampleKeyword) {\n const valueStart = exampleKeyword.index! + exampleKeyword[0].length\n const extracted = extractJSValue(blockBody, valueStart)\n if (extracted) {\n example = extracted.value.trim()\n }\n }\n\n const predicateMatch = blockBody.match(\n /predicate\\s*\\(([^)]*)\\)\\s*\\{([^]*)\\}/\n )\n\n // Build Type() call with appropriate arguments\n // Type(description, predicateOrExample, example?, default?)\n if (predicateMatch && example) {\n // Predicate + example\n const params = predicateMatch[1].trim()\n const body = predicateMatch[2].trim()\n const defaultArg = defaultValue ? `, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', (${params}) => { if (!globalThis.__tjs?.validate(${params}, globalThis.__tjs?.infer(${example}))) return false; ${body} }, ${example}${defaultArg})`\n } else if (predicateMatch) {\n // Predicate only\n const params = predicateMatch[1].trim()\n const body = predicateMatch[2].trim()\n const defaultArg = defaultValue ? `, undefined, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', (${params}) => { ${body} }${defaultArg})`\n } else if (example) {\n // Example only (becomes validation schema)\n const defaultArg = defaultValue ? `, ${defaultValue}` : ''\n result += `const ${typeName} = Type('${description}', undefined, ${example}${defaultArg})`\n } else if (defaultValue) {\n // Default only (infer schema from default)\n result += `const ${typeName} = Type('${description}', ${defaultValue})`\n } else {\n // Empty block - error or description-only type\n result += `const ${typeName} = Type('${description}')`\n }\n\n i = blockEnd\n continue\n } else if (defaultValue) {\n // Simple form with default: Type Foo = 'value' or Type Foo 'desc' = 'value'\n result += `const ${typeName} = Type('${description}', ${defaultValue})`\n i = posAfterDefault // Use position before whitespace was consumed\n continue\n } else if (!descStringMatch) {\n // No description, no default, no block - look for old simple form: Type Foo 'value'\n const valueMatch = source\n .slice(j)\n .match(\n /^(['\"`][^]*?['\"`]|\\+?\\d+(?:\\.\\d+)?|true|false|null|\\{[^]*?\\}|\\[[^]*?\\])/\n )\n if (valueMatch) {\n const example = valueMatch[0]\n result += `const ${typeName} = Type('${typeName}', ${example})`\n i = j + valueMatch[0].length\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform FunctionPredicate declarations\n *\n * Block form:\n * FunctionPredicate Callback {\n * params: { x: 0, y: '' }\n * returns: false\n * }\n * \u2192 const Callback = FunctionPredicate('Callback', { params: { x: 0, y: '' }, returns: false })\n *\n * Generic block form:\n * FunctionPredicate Creator<T = {}> {\n * params: { contents: [null] }\n * returns: T\n * }\n * \u2192 const Creator = FunctionPredicate('Creator', [['T', {}]], (T) => ({ params: { contents: [null] }, returns: T }))\n *\n * Function form:\n * FunctionPredicate Handler(existingFn, 'description')\n * \u2192 const Handler = FunctionPredicate('description', existingFn)\n */\nexport function transformFunctionPredicateDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n const fpMatch = source\n .slice(i)\n .match(/^\\bFunctionPredicate\\s+([A-Z_][a-zA-Z0-9_]*)\\s*(?:<([^>]+)>)?\\s*/)\n if (fpMatch) {\n const fpName = fpMatch[1]\n const typeParamsStr = fpMatch[2] // undefined if no <...>\n const j = i + fpMatch[0].length\n\n // Check for block form: FunctionPredicate Name { ... } or FunctionPredicate Name<T> { ... }\n if (source[j] === '{') {\n // Find matching closing brace\n let depth = 1\n let k = j + 1\n while (k < source.length && depth > 0) {\n if (source[k] === '{') depth++\n else if (source[k] === '}') depth--\n k++\n }\n\n if (depth === 0) {\n const blockBody = source.slice(j + 1, k - 1).trim()\n\n // Extract params: { ... } (brace-balanced for nested objects like { el: {} })\n const paramsMatch = extractBalancedValue(blockBody, /params\\s*:\\s*\\{/)\n // Extract returns value\n const returnsMatch = blockBody.match(/returns\\s*:\\s*(.+?)(?:\\n|$)/)\n // Extract returnContract\n const contractMatch = blockBody.match(\n /returnContract\\s*:\\s*['\"](\\w+)['\"]/\n )\n // Extract description\n const descMatch = blockBody.match(/description\\s*:\\s*(['\"])([^]*?)\\1/)\n\n const spec: string[] = []\n if (paramsMatch) spec.push(`params: ${paramsMatch[1]}`)\n if (returnsMatch) spec.push(`returns: ${returnsMatch[1].trim()}`)\n if (contractMatch) {\n spec.push(`returnContract: '${contractMatch[1]}'`)\n }\n\n const desc = descMatch ? descMatch[2] : fpName\n\n if (typeParamsStr) {\n // Generic form \u2014 emit factory with type params\n const typeParams = typeParamsStr.split(',').map((p) => {\n const parts = p\n .trim()\n .split('=')\n .map((s) => s.trim())\n if (parts.length === 2) {\n const defaultVal =\n parts[1] === 'any' || parts[1] === 'undefined'\n ? 'null'\n : parts[1]\n return `['${parts[0]}', ${defaultVal}]`\n }\n return `'${parts[0]}'`\n })\n const paramNames = typeParamsStr\n .split(',')\n .map((p) => p.trim().split('=')[0].trim())\n result += `const ${fpName} = FunctionPredicate('${desc}', [${typeParams.join(\n ', '\n )}], (${paramNames.join(', ')}) => ({ ${spec.join(', ')} }))`\n } else {\n // Non-generic form\n result += `const ${fpName} = FunctionPredicate('${desc}', { ${spec.join(\n ', '\n )} })`\n }\n i = k\n continue\n }\n }\n\n // Check for function form: FunctionPredicate Name(fn, 'desc')\n if (source[j] === '(') {\n // Find matching closing paren\n let depth = 1\n let k = j + 1\n while (k < source.length && depth > 0) {\n if (source[k] === '(') depth++\n else if (source[k] === ')') depth--\n k++\n }\n\n if (depth === 0) {\n const args = source.slice(j + 1, k - 1).trim()\n // Split on comma: fn, 'description'\n const commaIdx = args.indexOf(',')\n if (commaIdx !== -1) {\n const fnRef = args.slice(0, commaIdx).trim()\n const desc = args.slice(commaIdx + 1).trim()\n result += `const ${fpName} = FunctionPredicate(${desc}, ${fnRef})`\n } else {\n // Just a function reference, name as description\n result += `const ${fpName} = FunctionPredicate('${fpName}', ${args})`\n }\n i = k\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform Generic block declarations\n *\n * Syntax:\n * Generic Pair<T, U> { description: '...', predicate(obj, T, U) { ... } }\n * Generic Container<T, U = ''> { ... } // U has default\n *\n * Transforms to:\n * const Pair = Generic(['T', 'U'], (obj, checkT, checkU) => { ... }, '...')\n * const Container = Generic(['T', ['U', '']], (obj, checkT, checkU) => { ... }, '...')\n */\nexport function transformGenericDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Generic' keyword followed by identifier and type params\n const genericMatch = source\n .slice(i)\n .match(/^\\bGeneric\\s+([A-Z][a-zA-Z0-9_]*)\\s*<([^>]+)>\\s*\\{/)\n if (genericMatch) {\n const genericName = genericMatch[1]\n const typeParamsStr = genericMatch[2]\n const blockStart = i + genericMatch[0].length - 1\n const bodyStart = blockStart + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n // Unbalanced - just copy and continue\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse type params: T, U = Default\n const typeParams = typeParamsStr.split(',').map((p) => {\n const parts = p\n .trim()\n .split('=')\n .map((s) => s.trim())\n if (parts.length === 2) {\n // 'any' and 'undefined' aren't valid JS values \u2014 use null\n const defaultVal =\n parts[1] === 'any' || parts[1] === 'undefined' ? 'null' : parts[1]\n return `['${parts[0]}', ${defaultVal}]`\n }\n return `'${parts[0]}'`\n })\n\n // Parse the block body\n // Strip declaration { ... } block before parsing (it's .d.ts metadata, not runtime)\n let parsedBody = blockBody\n const declIdx = parsedBody.search(/\\bdeclaration\\s*\\{/)\n if (declIdx !== -1) {\n // Find matching closing brace for the declaration block\n const declBraceStart = parsedBody.indexOf('{', declIdx)\n let dDepth = 1\n let dj = declBraceStart + 1\n while (dj < parsedBody.length && dDepth > 0) {\n if (parsedBody[dj] === '{') dDepth++\n else if (parsedBody[dj] === '}') dDepth--\n dj++\n }\n // Remove the declaration block\n parsedBody = parsedBody.slice(0, declIdx) + parsedBody.slice(dj)\n }\n\n const descMatch = parsedBody.match(/description\\s*:\\s*(['\"`])([^]*?)\\1/)\n const predicateMatch = parsedBody.match(\n /predicate\\s*\\(([^)]*)\\)\\s*\\{([^]*)\\}/\n )\n\n const description = descMatch ? descMatch[2] : genericName\n\n if (predicateMatch) {\n const params = predicateMatch[1]\n .trim()\n .split(',')\n .map((s) => s.trim())\n let body = predicateMatch[2].trim()\n\n // First param is the value, rest are type params\n const valueParam = params[0] || 'x'\n const typeParamNames = params.slice(1)\n const typeCheckParams = typeParamNames.map((p) => `check${p}`)\n\n // Replace type param names with check functions in body\n // e.g., T(x[0]) becomes checkT(x[0])\n typeParamNames.forEach((name, idx) => {\n body = body.replace(\n new RegExp(`\\\\b${name}\\\\s*\\\\(`, 'g'),\n `${typeCheckParams[idx]}(`\n )\n })\n\n result += `const ${genericName} = Generic([${typeParams.join(\n ', '\n )}], (${valueParam}, ${typeCheckParams.join(\n ', '\n )}) => { ${body} }, '${description}')`\n } else {\n // No predicate - create a generic that always passes\n result += `const ${genericName} = Generic([${typeParams.join(\n ', '\n )}], () => true, '${description}')`\n }\n\n i = blockEnd\n continue\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Transform Union declarations\n *\n * Syntax:\n * Union Direction 'cardinal direction' {\n * 'up' | 'down' | 'left' | 'right'\n * }\n *\n * Transforms to:\n * const Direction = Union('cardinal direction', ['up', 'down', 'left', 'right'])\n *\n * Also supports inline form:\n * Union Direction 'cardinal direction' 'up' | 'down' | 'left' | 'right'\n */\nexport function transformUnionDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Union' keyword followed by identifier and description\n const unionMatch = source\n .slice(i)\n .match(/^\\bUnion\\s+([A-Z][a-zA-Z0-9_]*)\\s+(['\"`])([^]*?)\\2\\s*/)\n if (unionMatch) {\n const unionName = unionMatch[1]\n const description = unionMatch[3]\n const j = i + unionMatch[0].length\n\n // Check what follows: block or inline values\n if (source[j] === '{') {\n // Block form: Union Foo 'desc' { ... }\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse values: 'a' | 'b' | 'c' or \"a\" | \"b\" or mixed\n const values = parseUnionValues(blockBody)\n result += `const ${unionName} = Union('${description}', [${values.join(\n ', '\n )}])`\n i = blockEnd\n continue\n } else {\n // Inline form: Union Foo 'desc' 'a' | 'b' | 'c'\n // Find the end of the line or statement\n let lineEnd = source.indexOf('\\n', j)\n if (lineEnd === -1) lineEnd = source.length\n const inlineValues = source.slice(j, lineEnd).trim()\n\n if (inlineValues) {\n const values = parseUnionValues(inlineValues)\n result += `const ${unionName} = Union('${description}', [${values.join(\n ', '\n )}])`\n i = lineEnd\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Parse union values from a string like: 'a' | 'b' | 123 | true\n * Returns array of value literals as strings\n */\nfunction parseUnionValues(input: string): string[] {\n const values: string[] = []\n // Split on | and trim, preserving quoted strings and literals\n const parts = input.split('|').map((p) => p.trim())\n\n for (const part of parts) {\n if (!part) continue\n // Keep the value as-is (already a valid JS literal)\n values.push(part)\n }\n\n return values\n}\n\n/**\n * Transform Enum declarations\n *\n * Syntax:\n * Enum Status 'task status' {\n * Pending\n * Active\n * Done\n * }\n *\n * Enum Color 'CSS color' {\n * Red = 'red'\n * Green = 'green'\n * Blue = 'blue'\n * }\n *\n * Transforms to:\n * const Status = Enum('task status', { Pending: 0, Active: 1, Done: 2 })\n * const Color = Enum('CSS color', { Red: 'red', Green: 'green', Blue: 'blue' })\n */\nexport function transformEnumDeclarations(source: string): string {\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'Enum' keyword followed by identifier and description\n const enumMatch = source\n .slice(i)\n .match(/^\\bEnum\\s+([A-Z][a-zA-Z0-9_]*)\\s+(['\"`])([^]*?)\\2\\s*\\{/)\n if (enumMatch) {\n const enumName = enumMatch[1]\n const description = enumMatch[3]\n const blockStart = i + enumMatch[0].length - 1\n const bodyStart = blockStart + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth !== 0) {\n result += source[i]\n i++\n continue\n }\n\n const blockBody = source.slice(bodyStart, k - 1).trim()\n const blockEnd = k\n\n // Parse enum members\n const members = parseEnumMembers(blockBody)\n const membersStr = members\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ')\n\n result += `const ${enumName} = Enum('${description}', { ${membersStr} })`\n i = blockEnd\n continue\n }\n\n result += source[i]\n i++\n }\n\n return result\n}\n\n/**\n * Parse enum members from block body\n * Handles: Pending, Active = 5, Done, Name = 'value'\n * Returns array of [key, value] pairs\n */\nfunction parseEnumMembers(input: string): [string, string][] {\n const members: [string, string][] = []\n let currentNumericValue = 0\n\n // Split on newlines and commas, filter empty\n const lines = input\n .split(/[\\n,]/)\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith('//'))\n\n for (const line of lines) {\n // Match: Name or Name = value\n const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*(?:=\\s*(.+))?$/)\n if (match) {\n const key = match[1]\n const explicitValue = match[2]?.trim()\n\n if (explicitValue !== undefined) {\n members.push([key, explicitValue])\n // If it's a number, update the counter\n const numVal = Number(explicitValue)\n if (!isNaN(numVal)) {\n currentNumericValue = numVal + 1\n }\n } else {\n // Auto-increment numeric value\n members.push([key, String(currentNumericValue)])\n currentNumericValue++\n }\n }\n }\n\n return members\n}\n\n/**\n * Extension info for a single extend block\n */\n\nexport function transformExtendDeclarations(source: string): {\n source: string\n extensions: Map<string, Set<string>>\n} {\n const extensions = new Map<string, Set<string>>()\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'extend' keyword at statement boundary\n const remaining = source.slice(i)\n const extendMatch = remaining.match(/^(\\s*)extend\\s+([A-Z]\\w*)\\s*\\{/)\n\n if (!extendMatch) {\n // Check if we're at start of line or after semicolon/brace\n const lineStart =\n i === 0 ||\n source[i - 1] === '\\n' ||\n source[i - 1] === ';' ||\n source[i - 1] === '}'\n\n if (lineStart) {\n const afterWS = remaining.match(/^(\\s*)extend\\s+([A-Z]\\w*)\\s*\\{/)\n if (afterWS) {\n // Already handled above, fall through\n }\n }\n result += source[i]\n i++\n continue\n }\n\n const indent = extendMatch[1]\n const typeName = extendMatch[2]\n const blockStart = i + extendMatch[0].length - 1 // position of {\n\n // Find matching closing brace\n const blockEnd = findFunctionBodyEnd(source, blockStart)\n const blockBody = source.slice(blockStart + 1, blockEnd - 1).trim()\n\n // Parse methods from the block body\n // Match: methodName(params) { body } or async methodName(params) { body }\n const methods: { name: string; isAsync: boolean; fullText: string }[] = []\n let j = 0\n const bodySource = source.slice(blockStart + 1, blockEnd - 1)\n\n while (j < bodySource.length) {\n const methodRemaining = bodySource.slice(j)\n const methodMatch = methodRemaining.match(/^(\\s*)(async\\s+)?(\\w+)\\s*\\(/)\n\n if (!methodMatch) {\n j++\n continue\n }\n\n const methodIndent = methodMatch[1]\n const isAsync = !!methodMatch[2]\n const methodName = methodMatch[3]\n\n // Reject arrow functions \u2014 they don't bind `this`\n // We'll check after finding the body\n\n // Find the opening paren\n const parenStart = j + methodMatch[0].length - 1\n let parenDepth = 1\n let k = parenStart + 1\n while (k < bodySource.length && parenDepth > 0) {\n if (bodySource[k] === '(') parenDepth++\n if (bodySource[k] === ')') parenDepth--\n k++\n }\n const paramsStr = bodySource.slice(parenStart + 1, k - 1)\n\n // Skip whitespace to find { or =>\n let afterParams = k\n while (\n afterParams < bodySource.length &&\n /\\s/.test(bodySource[afterParams])\n ) {\n afterParams++\n }\n\n // Check for arrow function\n if (\n bodySource[afterParams] === '=' &&\n bodySource[afterParams + 1] === '>'\n ) {\n const loc = locAt(source, blockStart + 1 + j)\n throw new SyntaxError(\n `Arrow functions are not allowed in extend blocks (method '${methodName}' in extend ${typeName}). ` +\n `Use regular function syntax instead, as extension methods need 'this' binding.`,\n loc\n )\n }\n\n if (bodySource[afterParams] !== '{') {\n j++\n continue\n }\n\n // Find matching closing brace for the method body\n const methodBodyEnd = findFunctionBodyEnd(bodySource, afterParams)\n const fullMethodText = bodySource.slice(j, methodBodyEnd).trim()\n\n // Build: methodName: function(params) { body }\n // Transform TJS colon params (name: value) to JS defaults (name = value)\n const transformedParams = paramsStr\n .split(',')\n .map((p) => p.trim())\n .filter((p) => p.length > 0)\n .map((p) => {\n // name: value -> name = value (TJS colon shorthand)\n const colonMatch = p.match(/^(\\w+)\\s*:\\s*(.+)$/)\n if (colonMatch) return `${colonMatch[1]} = ${colonMatch[2]}`\n return p\n })\n .join(', ')\n const asyncPrefix = isAsync ? 'async ' : ''\n const methodBody = bodySource.slice(afterParams + 1, methodBodyEnd - 1)\n methods.push({\n name: methodName,\n isAsync,\n fullText: `${methodName}: ${asyncPrefix}function(${transformedParams}) {${methodBody}}`,\n })\n\n j = methodBodyEnd\n }\n\n // Track extensions\n const isFirstForType = !extensions.has(typeName)\n if (isFirstForType) {\n extensions.set(typeName, new Set())\n }\n const extSet = extensions.get(typeName)!\n for (const m of methods) {\n extSet.add(m.name)\n }\n\n // Generate the __ext object (or merge into existing)\n const methodEntries = methods.map((m) => ` ${m.fullText}`).join(',\\n')\n let replacement: string\n if (isFirstForType) {\n replacement = `${indent}const __ext_${typeName} = {\\n${methodEntries}\\n${indent}}\\n`\n } else {\n // Merge into existing: Object.assign(__ext_TypeName, { ... })\n replacement = `${indent}Object.assign(__ext_${typeName}, {\\n${methodEntries}\\n${indent}})\\n`\n }\n\n // Generate registration calls\n for (const m of methods) {\n replacement += `${indent}if (__tjs?.registerExtension) { __tjs.registerExtension('${typeName}', '${m.name}', __ext_${typeName}.${m.name}) }\\n`\n }\n\n result += replacement\n i = blockEnd\n }\n\n // Append any remaining source\n if (i <= source.length && result.length < source.length) {\n // Already handled character by character\n }\n\n return { source: result, extensions }\n}\n\n/**\n * Transform method calls on known-type receivers to use extension objects.\n *\n * For literals and typed variables where the type is known:\n * 'hello'.capitalize() -> __ext_String.capitalize.call('hello')\n * [1,2,3].last() -> __ext_Array.last.call([1,2,3])\n *\n * This is a best-effort source-level transform. For unknown types,\n * the runtime fallback (resolveExtension) handles it.\n */\nexport function transformExtensionCalls(\n source: string,\n extensions: Map<string, Set<string>>\n): string {\n if (extensions.size === 0) return source\n\n // Build a map of method names to possible type names for quick lookup\n const methodToTypes = new Map<string, string[]>()\n for (const [typeName, methods] of extensions) {\n for (const method of methods) {\n if (!methodToTypes.has(method)) {\n methodToTypes.set(method, [])\n }\n methodToTypes.get(method)!.push(typeName)\n }\n }\n\n let result = source\n\n // Rewrite calls on string literals: 'str'.method(...) or \"str\".method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('String')) continue\n\n // Match string literal followed by .method(\n // Single-quoted strings\n const singleQuotePattern = new RegExp(\n `('(?:[^'\\\\\\\\]|\\\\\\\\.)*')\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(singleQuotePattern, (_, str, meth, closeParen) => {\n return closeParen\n ? `__ext_String.${meth}.call(${str})`\n : `__ext_String.${meth}.call(${str}, `\n })\n\n // Double-quoted strings\n const doubleQuotePattern = new RegExp(\n `(\"(?:[^\"\\\\\\\\]|\\\\\\\\.)*\")\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(doubleQuotePattern, (_, str, meth, closeParen) => {\n return closeParen\n ? `__ext_String.${meth}.call(${str})`\n : `__ext_String.${meth}.call(${str}, `\n })\n\n // Template literals (backtick) \u2014 simple case only (no nested templates)\n const templatePattern = new RegExp(\n '(`(?:[^`\\\\\\\\]|\\\\\\\\.)*`)\\\\.' + method + '\\\\((\\\\))?',\n 'g'\n )\n result = result.replace(templatePattern, (_, str, closeParen) => {\n return closeParen\n ? `__ext_String.${method}.call(${str})`\n : `__ext_String.${method}.call(${str}, `\n })\n }\n\n // Rewrite calls on array literals: [1,2,3].method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('Array')) continue\n\n // Match array literal [...].method(\n // This is tricky \u2014 we need to find balanced brackets\n // Simple approach: find ].method( and walk backward to find matching [\n const methodDot = `].${method}(`\n let searchFrom = 0\n let idx: number\n while ((idx = result.indexOf(methodDot, searchFrom)) !== -1) {\n // Walk backward from idx to find matching [\n let bracketDepth = 1\n let k = idx - 1\n let inStr: string | false = false\n while (k >= 0 && bracketDepth > 0) {\n const ch = result[k]\n if (inStr) {\n if (ch === inStr && (k === 0 || result[k - 1] !== '\\\\')) {\n inStr = false\n }\n } else {\n if (ch === ']') bracketDepth++\n if (ch === '[') bracketDepth--\n if (ch === \"'\" || ch === '\"' || ch === '`') inStr = ch\n }\n k--\n }\n\n if (bracketDepth === 0) {\n const arrayLiteral = result.slice(k + 1, idx + 1)\n const before = result.slice(0, k + 1)\n const after = result.slice(idx + methodDot.length)\n // Check if no-args call: next char is )\n if (after[0] === ')') {\n result = `${before}__ext_Array.${method}.call(${arrayLiteral})${after.slice(\n 1\n )}`\n } else {\n result = `${before}__ext_Array.${method}.call(${arrayLiteral}, ${after}`\n }\n }\n\n searchFrom = idx + 1\n }\n }\n\n // Rewrite calls on number literals: (42).method(...)\n for (const [method, typeNames] of methodToTypes) {\n if (!typeNames.includes('Number')) continue\n\n const numPattern = new RegExp(\n `(\\\\d+(?:\\\\.\\\\d+)?)\\\\.(${method})\\\\((\\\\))?`,\n 'g'\n )\n result = result.replace(numPattern, (_, num, meth, closeParen) => {\n return closeParen\n ? `__ext_Number.${meth}.call(${num})`\n : `__ext_Number.${meth}.call(${num}, `\n })\n }\n\n return result\n}\n\n/**\n * Compute {line, column} from a character offset in source.\n */\nexport function locAt(\n source: string,\n pos: number\n): { line: number; column: number } {\n let line = 1\n let column = 0\n for (let i = 0; i < pos && i < source.length; i++) {\n if (source[i] === '\\n') {\n line++\n column = 0\n } else {\n column++\n }\n }\n return { line, column }\n}\n\n/**\n * Info about a single function variant for polymorphic dispatch\n */\n\nfunction typeCheckForDefault(argExpr: string, defaultValue: string): string {\n const dv = defaultValue.trim()\n\n // String literal\n if (/^['\"`]/.test(dv)) return `typeof ${argExpr} === 'string'`\n\n // Boolean\n if (dv === 'true' || dv === 'false') return `typeof ${argExpr} === 'boolean'`\n\n // null\n if (dv === 'null') return `${argExpr} === null`\n\n // undefined\n if (dv === 'undefined') return `${argExpr} === undefined`\n\n // Array literal\n if (dv.startsWith('[')) return `Array.isArray(${argExpr})`\n\n // Object literal\n if (dv.startsWith('{'))\n return `(typeof ${argExpr} === 'object' && ${argExpr} !== null && !Array.isArray(${argExpr}))`\n\n // Non-negative integer: +N\n if (/^\\+\\d+/.test(dv))\n return `(typeof ${argExpr} === 'number' && Number.isInteger(${argExpr}) && ${argExpr} >= 0)`\n\n // Number with decimal \u2192 float\n if (/^-?\\d+\\.\\d+/.test(dv)) return `typeof ${argExpr} === 'number'`\n\n // Integer (whole number, possibly negative)\n if (/^-?\\d+$/.test(dv))\n return `(typeof ${argExpr} === 'number' && Number.isInteger(${argExpr}))`\n\n // Fallback: any\n return 'true'\n}\n\n/**\n * Get a type \"signature\" string from a default value for ambiguity checking.\n * Two params with the same signature at the same position are ambiguous.\n */\nfunction typeSignatureForDefault(defaultValue: string): string {\n const dv = defaultValue.trim()\n if (/^['\"`]/.test(dv)) return 'string'\n if (dv === 'true' || dv === 'false') return 'boolean'\n if (dv === 'null') return 'null'\n if (dv === 'undefined') return 'undefined'\n if (dv.startsWith('[')) return 'array'\n if (dv.startsWith('{')) return 'object'\n if (/^\\+\\d+/.test(dv)) return 'non-negative-integer'\n if (/^-?\\d+\\.\\d+/.test(dv)) return 'number'\n if (/^-?\\d+$/.test(dv)) return 'integer'\n return 'any'\n}\n\n/**\n * Parse a parameter string like \"a = 0, b = 'hello', c = { x: 0 }\"\n * into an array of { name, defaultValue, required } objects.\n * Handles nested braces/brackets/parens and template literals.\n */\nfunction parseParamList(\n paramStr: string,\n requiredParams: Set<string>\n): { name: string; defaultValue: string; required: boolean }[] {\n const params: { name: string; defaultValue: string; required: boolean }[] = []\n let depth = 0\n let current = ''\n let inString: string | false = false\n\n for (let i = 0; i < paramStr.length; i++) {\n const ch = paramStr[i]\n\n // Track string state\n if (!inString && (ch === \"'\" || ch === '\"' || ch === '`')) {\n inString = ch\n current += ch\n continue\n }\n if (inString) {\n current += ch\n if (ch === '\\\\') {\n i++\n if (i < paramStr.length) current += paramStr[i]\n continue\n }\n if (ch === inString) inString = false\n continue\n }\n\n // Track nesting\n if (ch === '(' || ch === '[' || ch === '{') {\n depth++\n current += ch\n continue\n }\n if (ch === ')' || ch === ']' || ch === '}') {\n depth--\n current += ch\n continue\n }\n\n // Split on comma at depth 0\n if (ch === ',' && depth === 0) {\n const param = parseOneParam(current.trim(), requiredParams)\n if (param) params.push(param)\n current = ''\n continue\n }\n\n current += ch\n }\n\n // Last param\n const trimmed = current.trim()\n if (trimmed) {\n const param = parseOneParam(trimmed, requiredParams)\n if (param) params.push(param)\n }\n\n return params\n}\n\n/**\n * Parse a single parameter like \"name = 'Alice'\" or \"/* unsafe * / x = 0\"\n */\nfunction parseOneParam(\n paramStr: string,\n requiredParams: Set<string>\n): { name: string; defaultValue: string; required: boolean } | null {\n // Strip leading /* unsafe */ comment\n const str = paramStr.replace(/^\\/\\*\\s*unsafe\\s*\\*\\/\\s*/, '')\n\n // Rest params not supported in polymorphic functions\n if (str.startsWith('...')) return null\n\n // Find = sign (the param has been transformed from : to = by transformParenExpressions)\n const eqIdx = str.indexOf('=')\n if (eqIdx === -1) {\n // No default value \u2014 untyped param\n return { name: str.trim(), defaultValue: '', required: true }\n }\n\n const name = str.slice(0, eqIdx).trim()\n const defaultValue = str.slice(eqIdx + 1).trim()\n return { name, defaultValue, required: requiredParams.has(name) }\n}\n\n/**\n * Find the end of a function body (matching closing brace).\n * Handles nested braces, strings, template literals, comments, and regex.\n * Returns the index AFTER the closing brace.\n */\nexport function findFunctionBodyEnd(\n source: string,\n openBracePos: number\n): number {\n let depth = 1\n let i = openBracePos + 1\n let inString: string | false = false\n let inLineComment = false\n let inBlockComment = false\n\n while (i < source.length && depth > 0) {\n const ch = source[i]\n const next = i + 1 < source.length ? source[i + 1] : ''\n\n // Line comment\n if (inLineComment) {\n if (ch === '\\n') inLineComment = false\n i++\n continue\n }\n\n // Block comment\n if (inBlockComment) {\n if (ch === '*' && next === '/') {\n inBlockComment = false\n i += 2\n continue\n }\n i++\n continue\n }\n\n // String tracking\n if (inString) {\n if (ch === '\\\\') {\n i += 2\n continue\n }\n if (ch === inString) inString = false\n i++\n continue\n }\n\n // Start comments\n if (ch === '/' && next === '/') {\n inLineComment = true\n i += 2\n continue\n }\n if (ch === '/' && next === '*') {\n inBlockComment = true\n i += 2\n continue\n }\n\n // Start strings\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n inString = ch\n i++\n continue\n }\n\n // Braces\n if (ch === '{') depth++\n if (ch === '}') depth--\n\n i++\n }\n\n return i\n}\n\n/**\n * Transform polymorphic functions: multiple function declarations with the\n * same name are merged into a single dispatcher function.\n *\n * Must be called AFTER transformParenExpressions (so params have = defaults)\n * but BEFORE wrapClassDeclarations.\n *\n * function greet(name = '') { ... }\n * function greet(first = '', last = '') { ... }\n *\n * becomes:\n *\n * function greet$1(name = '') { ... }\n * function greet$2(first = '', last = '') { ... }\n * function greet(...__args) {\n * if (__args.length === 1 && typeof __args[0] === 'string') return greet$1(__args[0])\n * if (__args.length === 2 && ...) return greet$2(__args[0], __args[1])\n * return __tjs.typeError('greet', 'no matching overload', __args)\n * }\n */\nexport function transformPolymorphicFunctions(\n source: string,\n requiredParams: Set<string>\n): { source: string; polymorphicNames: Set<string> } {\n const polymorphicNames = new Set<string>()\n\n // Phase 1: Find all function declarations and group by name\n // Match: optional \"export\" + optional \"async\" + \"function\" + name + \"(\"\n const funcPattern =\n /(?:^|(?<=[\\n;{}]))\\s*(export\\s+)?(async\\s+)?function\\s+(\\w+)\\s*\\(/gm\n const declarations = new Map<string, PolyVariant[]>()\n let match: RegExpExecArray | null\n\n // First pass: collect all function positions and names\n const allMatches: {\n name: string\n fullMatchStart: number\n funcKeywordStart: number\n exported: boolean\n isAsync: boolean\n }[] = []\n\n while ((match = funcPattern.exec(source)) !== null) {\n const exported = !!match[1]\n const isAsync = !!match[2]\n const name = match[3]\n const fullMatchStart = match.index\n // Find where \"function\" keyword starts (skip whitespace and export/async)\n let funcKeywordStart = fullMatchStart\n const prefix = match[0]\n const funcIdx = prefix.indexOf('function')\n if (funcIdx >= 0) funcKeywordStart = fullMatchStart + funcIdx\n\n allMatches.push({\n name,\n fullMatchStart,\n funcKeywordStart,\n exported,\n isAsync,\n })\n }\n\n // Group by name\n for (const m of allMatches) {\n if (!declarations.has(m.name)) {\n declarations.set(m.name, [])\n }\n }\n\n // Count occurrences \u2014 only process names that appear more than once\n const nameCounts = new Map<string, number>()\n for (const m of allMatches) {\n nameCounts.set(m.name, (nameCounts.get(m.name) || 0) + 1)\n }\n\n const polyNames = new Set<string>()\n for (const [name, count] of nameCounts) {\n if (count > 1) polyNames.add(name)\n }\n\n if (polyNames.size === 0) {\n return { source, polymorphicNames }\n }\n\n // Phase 2: For each polymorphic function, extract full details\n for (const m of allMatches) {\n if (!polyNames.has(m.name)) continue\n\n // Find the opening paren\n const afterFunc = source.indexOf('(', m.funcKeywordStart)\n if (afterFunc === -1) continue\n\n // Find matching closing paren\n let parenDepth = 1\n let j = afterFunc + 1\n while (j < source.length && parenDepth > 0) {\n if (source[j] === '(') parenDepth++\n if (source[j] === ')') parenDepth--\n j++\n }\n const closeParen = j - 1\n const paramStr = source.slice(afterFunc + 1, closeParen)\n\n // Find the opening brace of the function body\n let bodyStart = j\n while (bodyStart < source.length && source[bodyStart] !== '{') bodyStart++\n if (bodyStart >= source.length) continue\n\n // Find matching closing brace\n const bodyEnd = findFunctionBodyEnd(source, bodyStart)\n\n // Determine the real start (including leading whitespace, export, async)\n let realStart = m.fullMatchStart\n // Include leading whitespace on the same line\n while (realStart > 0 && source[realStart - 1] === ' ') realStart--\n\n const variants = declarations.get(m.name)!\n const params = parseParamList(paramStr, requiredParams)\n\n // Check for rest params\n const hasRestParam = paramStr.includes('...')\n if (hasRestParam) {\n const loc = locAt(source, m.funcKeywordStart)\n throw new SyntaxError(\n `Rest parameters are not supported in polymorphic function '${m.name}'. ` +\n `Use separate function names instead.`,\n loc\n )\n }\n\n variants.push({\n index: variants.length + 1,\n start: realStart,\n end: bodyEnd,\n text: source.slice(realStart, bodyEnd),\n exported: m.exported,\n isAsync: m.isAsync,\n params,\n })\n }\n\n // Phase 3: Validate \u2014 check for ambiguous variants\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n\n // Check async consistency\n const asyncCount = variants.filter((v) => v.isAsync).length\n if (asyncCount > 0 && asyncCount < variants.length) {\n const loc = locAt(source, variants[0].start)\n throw new SyntaxError(\n `Polymorphic function '${name}': all variants must be either sync or async, not mixed.`,\n loc\n )\n }\n\n // Check for ambiguous signatures (same types at same positions, differing only in required/optional)\n for (let i = 0; i < variants.length; i++) {\n for (let j = i + 1; j < variants.length; j++) {\n const a = variants[i]\n const b = variants[j]\n\n // Different max arity is fine\n if (a.params.length !== b.params.length) continue\n\n // Same arity \u2014 check if types are identical at every position\n let allSame = true\n for (let k = 0; k < a.params.length; k++) {\n const sigA = a.params[k].defaultValue\n ? typeSignatureForDefault(a.params[k].defaultValue)\n : 'any'\n const sigB = b.params[k].defaultValue\n ? typeSignatureForDefault(b.params[k].defaultValue)\n : 'any'\n if (sigA !== sigB) {\n allSame = false\n break\n }\n }\n\n if (allSame) {\n const loc = locAt(source, b.start)\n throw new SyntaxError(\n `Polymorphic function '${name}': variants ${i + 1} and ${\n j + 1\n } have ambiguous signatures ` +\n `(same parameter types at every position). Overloads must differ by arity or parameter types.`,\n loc\n )\n }\n }\n }\n }\n\n // Phase 4: Build the transformed source\n // Sort all variants by position (reverse order for safe replacement)\n const allVariants: { name: string; variant: PolyVariant }[] = []\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n for (const v of variants) {\n allVariants.push({ name, variant: v })\n }\n }\n allVariants.sort((a, b) => b.variant.start - a.variant.start)\n\n // Replace each variant in reverse order (preserves positions)\n let result = source\n for (const { name, variant } of allVariants) {\n const asyncPrefix = variant.isAsync ? 'async ' : ''\n // Rename: function greet(...) -> function greet$1(...)\n // Strip \"export\" from variants \u2014 only the dispatcher is exported\n // Use $$ in replacement to produce literal $ (avoid backreference interpretation)\n const renamed = variant.text.replace(\n new RegExp(\n `(?:export\\\\s+)?${\n asyncPrefix ? asyncPrefix.replace(/\\s+$/, '\\\\s+') : ''\n }function\\\\s+${name}\\\\s*\\\\(`\n ),\n `${asyncPrefix}function ${name}$$${variant.index}(`\n )\n result =\n result.slice(0, variant.start) + renamed + result.slice(variant.end)\n }\n\n // Phase 5: Append dispatcher functions\n for (const [name, variants] of declarations) {\n if (variants.length < 2) continue\n polymorphicNames.add(name)\n\n const isAsync = variants[0].isAsync\n const isExported = variants.some((v) => v.exported)\n const asyncPrefix = isAsync ? 'async ' : ''\n const exportPrefix = isExported ? 'export ' : ''\n\n // Sort variants by specificity for dispatch order:\n // 1. More params first (higher arity)\n // 2. More specific types first (integer before number, object before any)\n const sorted = [...variants].sort((a, b) => {\n // Different arity: more params = more specific (checked first within same arity group)\n if (a.params.length !== b.params.length) return 0 // arity groups handled in dispatch\n\n // Same arity: count specificity\n let specA = 0\n let specB = 0\n for (const p of a.params) {\n const sig = p.defaultValue\n ? typeSignatureForDefault(p.defaultValue)\n : 'any'\n if (sig === 'non-negative-integer') specA += 3\n else if (sig === 'integer') specA += 2\n else if (sig !== 'any') specA += 1\n }\n for (const p of b.params) {\n const sig = p.defaultValue\n ? typeSignatureForDefault(p.defaultValue)\n : 'any'\n if (sig === 'non-negative-integer') specB += 3\n else if (sig === 'integer') specB += 2\n else if (sig !== 'any') specB += 1\n }\n return specB - specA // More specific first\n })\n\n // Generate dispatch branches\n const branches: string[] = []\n for (const v of sorted) {\n const checks: string[] = [`__args.length === ${v.params.length}`]\n const args: string[] = []\n\n for (let k = 0; k < v.params.length; k++) {\n const p = v.params[k]\n args.push(`__args[${k}]`)\n if (p.defaultValue) {\n const check = typeCheckForDefault(`__args[${k}]`, p.defaultValue)\n if (check !== 'true') checks.push(check)\n }\n }\n\n branches.push(\n ` if (${checks.join(' && ')}) return ${name}$${v.index}(${args.join(\n ', '\n )})`\n )\n }\n\n const dispatcher = `\n${exportPrefix}${asyncPrefix}function ${name}(...__args) {\n${branches.join('\\n')}\n return __tjs.typeError('${name}', 'no matching overload', __args)\n}\n`\n result += dispatcher\n }\n\n return { source: result, polymorphicNames }\n}\n\n/**\n * Transform bare assignments to const declarations\n *\n * Foo = ... -> const Foo = ...\n *\n * Only transforms assignments at statement level (start of line or after semicolon/brace)\n * where the identifier starts with uppercase (to avoid breaking normal assignments)\n */\nexport function transformBareAssignments(source: string): string {\n // Match: start of line/statement, uppercase identifier, =, not ==\n // Negative lookbehind for const/let/var to avoid double-declaring\n return source.replace(\n /(?<=^|[;\\n{])\\s*([A-Z][a-zA-Z0-9_]*)\\s*=(?!=)/gm,\n (match, name) => {\n // Check if already has const/let/var before it\n return match.replace(name, `const ${name}`)\n }\n )\n}\n\n/**\n * Parse source code into an Acorn AST\n */\n\nexport function extractAndRunTests(\n source: string,\n skipTests = false\n): {\n source: string\n tests: TestBlock[]\n errors: string[]\n} {\n const tests: TestBlock[] = []\n const errors: string[] = []\n let result = ''\n let i = 0\n\n while (i < source.length) {\n // Look for 'test' keyword followed by optional string then {\n const testMatch = source.slice(i).match(/^\\btest\\s+/)\n if (testMatch) {\n const start = i\n let j = i + testMatch[0].length\n\n // Check for optional description string\n let description: string | undefined\n const descMatch = source.slice(j).match(/^(['\"`])([^]*?)\\1\\s*/)\n if (descMatch) {\n description = descMatch[2]\n j += descMatch[0].length\n }\n\n // Must have opening brace\n if (source[j] === '{') {\n const bodyStart = j + 1\n let depth = 1\n let k = bodyStart\n\n // Find matching closing brace (skip strings and comments)\n let inStr: string | null = null\n let escaped = false\n while (k < source.length && depth > 0) {\n const char = source[k]\n if (escaped) {\n escaped = false\n k++\n continue\n }\n if (char === '\\\\' && inStr) {\n escaped = true\n k++\n continue\n }\n if (inStr) {\n if (char === inStr) inStr = null\n k++\n continue\n }\n // Line comment \u2014 skip to end of line\n if (char === '/' && source[k + 1] === '/') {\n const nl = source.indexOf('\\n', k)\n k = nl === -1 ? source.length : nl + 1\n continue\n }\n // Block comment \u2014 skip to */\n if (char === '/' && source[k + 1] === '*') {\n const end = source.indexOf('*/', k + 2)\n k = end === -1 ? source.length : end + 2\n continue\n }\n if (char === \"'\" || char === '\"' || char === '`') {\n inStr = char\n k++\n continue\n }\n if (char === '{') depth++\n else if (char === '}') depth--\n k++\n }\n\n if (depth === 0) {\n const body = source.slice(bodyStart, k - 1).trim()\n const end = k\n\n const line = (source.slice(0, start).match(/\\n/g) || []).length + 1\n tests.push({ description, body, start, end, line })\n\n // Run the test unless skipped\n if (!skipTests) {\n try {\n // Execute test in isolated context\n // The test has access to the Types defined before it\n const testFn = new Function(body)\n testFn()\n } catch (err: any) {\n const desc = description || `test at line ${line}`\n errors.push(\n `Test failed: ${desc} (line ${line})\\n ${err.message || err}`\n )\n }\n }\n\n // Strip the test block from output (replace with whitespace to preserve line numbers)\n const removed = source.slice(start, end)\n const newlines = (removed.match(/\\n/g) || []).length\n result += '\\n'.repeat(newlines)\n i = end\n continue\n }\n }\n }\n\n result += source[i]\n i++\n }\n\n return { source: result, tests, errors }\n}\n\n/**\n * Wrap class declarations to make them callable without `new`\n *\n * Transforms:\n * class Foo { ... }\n * To:\n * let Foo = class Foo { ... };\n * Foo = new Proxy(Foo, { apply(t, _, a) { return Reflect.construct(t, a) } });\n *\n * This emits standalone JS with no runtime dependencies.\n */\n\n/**\n * Transform polymorphic constructors into static factory functions.\n *\n * When a class has multiple constructor() declarations, the first becomes\n * the real constructor and the rest become factory functions. The wrapClass\n * Proxy routes through a polymorphic dispatcher.\n *\n * class Point {\n * constructor(x: 0.0, y: 0.0) { this.x = x; this.y = y }\n * constructor(coords: { x: 0.0, y: 0.0 }) { this.x = coords.x; this.y = coords.y }\n * }\n *\n * becomes:\n *\n * class Point {\n * constructor(x = 0.0, y = 0.0) { this.x = x; this.y = y }\n * }\n * function Point$ctor$2(coords = { x: 0.0, y: 0.0 }) { return new Point(coords.x, coords.y) }\n * // wrapClass Proxy dispatches through polymorphic factory\n */\nexport function transformPolymorphicConstructors(\n source: string,\n requiredParams: Set<string>\n): { source: string; polyCtorClasses: Set<string> } {\n const polyCtorClasses = new Set<string>()\n\n // Find classes with multiple constructors\n const classRegex = /\\bclass\\s+(\\w+)(\\s+extends\\s+\\w+)?\\s*\\{/g\n let classMatch\n\n // Collect all class info first\n const classInfos: {\n className: string\n extendsClause: string\n bodyStart: number\n bodyEnd: number\n body: string\n }[] = []\n\n while ((classMatch = classRegex.exec(source)) !== null) {\n const className = classMatch[1]\n const extendsClause = classMatch[2]?.trim() || ''\n const bodyStart = classMatch.index + classMatch[0].length - 1\n\n const bodyEnd = findFunctionBodyEnd(source, bodyStart)\n const body = source.slice(bodyStart, bodyEnd)\n\n classInfos.push({ className, extendsClause, bodyStart, bodyEnd, body })\n }\n\n // Process in reverse order to preserve positions\n let result = source\n for (let ci = classInfos.length - 1; ci >= 0; ci--) {\n const { className, extendsClause, bodyStart, bodyEnd, body } =\n classInfos[ci]\n\n // Find all constructor declarations in the class body\n const ctorPattern = /\\bconstructor\\s*\\(/g\n let ctorMatch\n const ctorPositions: number[] = []\n\n while ((ctorMatch = ctorPattern.exec(body)) !== null) {\n ctorPositions.push(ctorMatch.index)\n }\n\n if (ctorPositions.length < 2) continue // Not polymorphic\n\n polyCtorClasses.add(className)\n\n // Parse each constructor\n interface CtorInfo {\n index: number\n paramStr: string\n bodyText: string\n fullStart: number // relative to class body\n fullEnd: number // relative to class body\n }\n const ctors: CtorInfo[] = []\n\n for (let i = 0; i < ctorPositions.length; i++) {\n const pos = ctorPositions[i]\n\n // Find opening paren\n const parenStart = body.indexOf('(', pos)\n let parenDepth = 1\n let j = parenStart + 1\n while (j < body.length && parenDepth > 0) {\n if (body[j] === '(') parenDepth++\n if (body[j] === ')') parenDepth--\n j++\n }\n const paramStr = body.slice(parenStart + 1, j - 1)\n\n // Find opening brace\n let braceStart = j\n while (braceStart < body.length && body[braceStart] !== '{') braceStart++\n\n // Find matching closing brace\n const ctorBodyEnd = findFunctionBodyEnd(body, braceStart)\n const bodyText = body.slice(braceStart + 1, ctorBodyEnd - 1)\n\n ctors.push({\n index: i + 1,\n paramStr,\n bodyText,\n fullStart: pos,\n fullEnd: ctorBodyEnd,\n })\n }\n\n // Keep the first constructor in the class, remove the rest\n // Build new class body with only the first constructor\n let newBody = body.slice(0, ctors[0].fullEnd)\n // Skip subsequent constructors\n const afterLastCtor = ctors[ctors.length - 1].fullEnd\n newBody += body.slice(afterLastCtor)\n\n // But we need to remove just the extra constructors, keeping other methods\n // Better approach: remove constructors 2..N from the body\n let cleanBody = body\n for (let i = ctors.length - 1; i >= 1; i--) {\n const ctor = ctors[i]\n // Find start of this constructor (including leading whitespace)\n let start = ctor.fullStart\n while (start > 0 && cleanBody[start - 1] === ' ') start--\n if (start > 0 && cleanBody[start - 1] === '\\n') start--\n\n cleanBody = cleanBody.slice(0, start) + cleanBody.slice(ctor.fullEnd)\n }\n\n // Generate factory functions for constructors 2..N\n let factories = ''\n for (let i = 1; i < ctors.length; i++) {\n const ctor = ctors[i]\n // Parse params for type checking in dispatcher\n const params = parseParamList(ctor.paramStr, requiredParams)\n const hasRest = ctor.paramStr.includes('...')\n if (hasRest) {\n const loc = locAt(source, bodyStart + ctor.fullStart)\n throw new SyntaxError(\n `Rest parameters are not supported in polymorphic constructors for '${className}'.`,\n loc\n )\n }\n\n // The factory function creates the object manually\n // For base classes: use Object.create + call constructor body\n // Simpler: just use new ClassName() with the first ctor's params mapped\n // Actually simplest: the factory body IS the constructor body but with\n // `this.x = ...` replaced by building an object... No, that doesn't work\n // for inheritance.\n //\n // Best approach: factory creates via new, then applies the extra ctor body\n factories += `\\nfunction ${className}$ctor$${ctor.index}(${ctor.paramStr}) {`\n factories += `\\n const __obj = Object.create(${className}.prototype)`\n if (extendsClause) {\n // For derived classes, we can't easily call super() outside constructor\n // Just call the constructor body and hope it sets fields\n // Actually \u2014 the factory can just do: new ClassName(defaultArgs) then overwrite\n // Let's use a simpler approach: the factory just does new + field assignment\n }\n factories += `\\n ;(function() {${ctor.bodyText}}).call(__obj)`\n factories += `\\n return __obj`\n factories += `\\n}\\n`\n }\n\n // Generate the polymorphic dispatcher for the Proxy's apply trap\n // First constructor variant uses Reflect.construct, rest use factories\n const dispatchBranches: string[] = []\n\n for (let i = 0; i < ctors.length; i++) {\n const ctor = ctors[i]\n const params = parseParamList(ctor.paramStr, requiredParams)\n const checks: string[] = [`a.length === ${params.length}`]\n\n for (let k = 0; k < params.length; k++) {\n const p = params[k]\n if (p.defaultValue) {\n const check = typeCheckForDefault(`a[${k}]`, p.defaultValue)\n if (check !== 'true') checks.push(check)\n }\n }\n\n if (i === 0) {\n // First constructor \u2014 use Reflect.construct\n dispatchBranches.push(\n ` if (${checks.join(' && ')}) return Reflect.construct(t, a)`\n )\n } else {\n // Factory function\n const args = params.map((_, k) => `a[${k}]`).join(', ')\n dispatchBranches.push(\n ` if (${checks.join(' && ')}) return ${className}$ctor$${\n ctor.index\n }(${args})`\n )\n }\n }\n\n // Generate the dispatcher function\n factories += `\\nfunction ${className}$dispatch(t, a) {\\n`\n factories += dispatchBranches.join('\\n') + '\\n'\n factories += ` return __tjs.typeError('${className}', 'no matching constructor', a)\\n`\n factories += `}\\n`\n\n // Replace the class body and append factories\n result = result.slice(0, bodyStart) + cleanBody + result.slice(bodyEnd)\n\n // Insert factories after the class\n const insertPos = bodyStart + cleanBody.length\n result = result.slice(0, insertPos) + factories + result.slice(insertPos)\n }\n\n return { source: result, polyCtorClasses }\n}\n\nexport function wrapClassDeclarations(\n source: string,\n polyCtorClasses: Set<string> = new Set()\n): string {\n // Match class declarations: class Name { or class Name extends Base {\n // Capture the class name and find the full class body\n const classRegex = /\\bclass\\s+(\\w+)(\\s+extends\\s+\\w+)?\\s*\\{/g\n let result = ''\n let lastIndex = 0\n let match\n\n while ((match = classRegex.exec(source)) !== null) {\n const className = match[1]\n const extendsClause = match[2] || ''\n const classStart = match.index\n const bodyStart = classStart + match[0].length - 1 // position of {\n\n // Find matching closing brace\n let depth = 1\n let i = bodyStart + 1\n while (i < source.length && depth > 0) {\n const char = source[i]\n if (char === '{') depth++\n else if (char === '}') depth--\n i++\n }\n\n if (depth === 0) {\n const classEnd = i\n const classBody = source.slice(bodyStart, classEnd)\n\n // Emit standalone JS - no runtime dependency\n result += source.slice(lastIndex, classStart)\n result += `let ${className} = class ${className}${extendsClause} ${classBody}; `\n\n if (polyCtorClasses.has(className)) {\n // Polymorphic constructor: use dispatcher function for apply trap\n result += `${className} = new Proxy(${className}, { apply(t, _, a) { return ${className}$dispatch(t, a) }, construct(t, a) { return ${className}$dispatch(t, a) } });`\n } else {\n result += `${className} = new Proxy(${className}, { apply(t, _, a) { return Reflect.construct(t, a) } });`\n }\n lastIndex = classEnd\n }\n }\n\n result += source.slice(lastIndex)\n return result\n}\n\n/**\n * Validate that Date is not used (TjsDate mode)\n * Throws an error if Date constructor or static methods are found\n */\nexport function validateNoDate(source: string): string {\n // Match Date usage: new Date, Date.now, Date.parse, Date.UTC\n const datePatterns = [\n {\n pattern: /\\bnew\\s+Date\\b/,\n message:\n 'new Date() is not allowed in TjsDate mode. Use Timestamp.now() or Timestamp.from()',\n },\n {\n pattern: /\\bDate\\.now\\b/,\n message: 'Date.now() is not allowed in TjsDate mode. Use Timestamp.now()',\n },\n {\n pattern: /\\bDate\\.parse\\b/,\n message:\n 'Date.parse() is not allowed in TjsDate mode. Use Timestamp.parse()',\n },\n {\n pattern: /\\bDate\\.UTC\\b/,\n message:\n 'Date.UTC() is not allowed in TjsDate mode. Use Timestamp.from()',\n },\n ]\n\n for (const { pattern, message } of datePatterns) {\n if (pattern.test(source)) {\n throw new Error(message)\n }\n }\n\n return source\n}\n\n/**\n * Validate that eval and Function constructor are not used (TjsNoeval mode)\n * Note: Eval and SafeFunction from TJS runtime are allowed\n */\n/**\n * Transform const! declarations to const and validate immutability\n *\n * const! declares compile-time immutable bindings. The object itself\n * is not frozen at runtime (performance trap), but the transpiler\n * rejects any code that attempts to mutate the binding's properties.\n *\n * const! config = { debug: false, port: 8080 }\n * config.debug = true // ERROR: Cannot mutate immutable binding 'config'\n * console.log(config.port) // OK: reads are fine\n *\n * Emits as plain `const` \u2014 semantics are enforced at transpile time.\n * When runtimes support records/tuples, const! can emit those instead.\n */\nexport function transformConstBang(source: string): string {\n // Find all const! declarations and collect binding names\n const immutableNames = new Set<string>()\n\n // Match: const! name = ... or const! { a, b } = ... or const! [a, b] = ...\n const constBangRe = /\\bconst!\\s+(\\w+)\\b/g\n let m\n while ((m = constBangRe.exec(source)) !== null) {\n immutableNames.add(m[1])\n }\n\n if (immutableNames.size === 0) return source\n\n // Replace const! with const\n source = source.replace(/\\bconst!\\s+/g, 'const ')\n\n // Strip comments before checking mutations (avoid false positives\n // from code examples in TDoc comments)\n const stripped = source\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // block comments\n .replace(/\\/\\/[^\\n]*/g, '') // line comments\n\n // Check for mutations to immutable bindings\n for (const name of immutableNames) {\n // Property assignment: name.prop = ..., name[key] = ...\n const assignRe = new RegExp(\n `\\\\b${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])\\\\s*(?:=(?!=)|\\\\+\\\\+|--|\\\\+=|-=|\\\\*=|\\\\/=|%=|&&=|\\\\|\\\\|=|\\\\?\\\\?=|<<=|>>=|>>>=|\\\\^=|&=|\\\\|=)`,\n 'g'\n )\n if (assignRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // Prefix increment/decrement: ++name.prop, --name.prop\n const prefixRe = new RegExp(\n `(?:\\\\+\\\\+|--)\\\\s*${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])`,\n 'g'\n )\n if (prefixRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // delete name.prop\n const deleteRe = new RegExp(\n `\\\\bdelete\\\\s+${name}\\\\s*(?:\\\\.[\\\\w]+|\\\\[[^\\\\]]+\\\\])`,\n 'g'\n )\n if (deleteRe.test(stripped)) {\n throw new Error(\n `Cannot mutate immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n\n // push/pop/splice/shift/unshift/sort/reverse/fill on the binding\n const mutatingMethods =\n 'push|pop|splice|shift|unshift|sort|reverse|fill|copyWithin|set'\n const methodRe = new RegExp(\n `\\\\b${name}\\\\s*\\\\.\\\\s*(?:${mutatingMethods})\\\\s*\\\\(`,\n 'g'\n )\n if (methodRe.test(stripped)) {\n throw new Error(\n `Cannot call mutating method on immutable binding '${name}'. ` +\n `const! bindings are read-only at compile time.`\n )\n }\n }\n\n return source\n}\n\nexport function validateNoVar(source: string): string {\n // Match var declarations at statement level (not inside strings/comments)\n // Catches: var x, var x = ..., var {x} = ..., var [x] = ...\n const varPattern = /(?<![a-zA-Z_$])\\bvar\\s+/\n if (varPattern.test(source)) {\n throw new Error(\n 'var is not allowed in TjsNoVar mode. Use const or let instead.'\n )\n }\n return source\n}\n\nexport function validateNoEval(source: string): string {\n // Match eval() calls - but not Eval() (capital E)\n // Use negative lookbehind to avoid matching inside words\n const evalPattern = /(?<![A-Za-z_$])\\beval\\s*\\(/\n if (evalPattern.test(source)) {\n throw new Error(\n 'eval() is not allowed in TjsNoeval mode. Use Eval() from TJS runtime for safe evaluation.'\n )\n }\n\n // Match new Function() - but not SafeFunction or other *Function names\n const functionPattern = /\\bnew\\s+Function\\s*\\(/\n if (functionPattern.test(source)) {\n throw new Error(\n 'new Function() is not allowed in TjsNoeval mode. Use SafeFunction() from TJS runtime.'\n )\n }\n\n return source\n}\n\n/**\n * Transform bang access (!.) to __tjs.bang() calls.\n *\n * x!.foo \u2192 __tjs.bang(x,'foo')\n * x.y!.foo \u2192 __tjs.bang(x.y,'foo')\n * fn()!.foo \u2192 __tjs.bang(fn(),'foo')\n * arr[0]!.foo \u2192 __tjs.bang(arr[0],'foo')\n * x!.foo!.bar \u2192 __tjs.bang(__tjs.bang(x,'foo'),'bar')\n *\n * If the source is null/undefined, returns MonadicError.\n * If the source is a MonadicError, propagates it.\n * Otherwise, performs a bare property access (throws as usual).\n */\nexport function transformBangAccess(source: string): string {\n // Quick bail \u2014 no !. in source at all\n if (!source.includes('!.')) return source\n\n let result = ''\n let i = 0\n\n // State tracking for strings/comments\n type State =\n | 'normal'\n | 'string-single'\n | 'string-double'\n | 'string-template'\n | 'line-comment'\n | 'block-comment'\n let state: State = 'normal'\n let templateDepth = 0\n\n while (i < source.length) {\n const ch = source[i]\n const next = source[i + 1]\n\n // State transitions\n if (state === 'normal') {\n if (ch === '/' && next === '/') {\n state = 'line-comment'\n result += ch\n i++\n continue\n }\n if (ch === '/' && next === '*') {\n state = 'block-comment'\n result += ch\n i++\n continue\n }\n if (ch === \"'\") {\n state = 'string-single'\n result += ch\n i++\n continue\n }\n if (ch === '\"') {\n state = 'string-double'\n result += ch\n i++\n continue\n }\n if (ch === '`') {\n state = 'string-template'\n templateDepth++\n result += ch\n i++\n continue\n }\n\n // Detect bang access: ! followed by . followed by a word char (not digit)\n if (\n ch === '!' &&\n next === '.' &&\n i + 2 < source.length &&\n /[a-zA-Z_$]/.test(source[i + 2])\n ) {\n // Scan backward in `result` to find the expression start\n const exprEnd = result.length\n const exprStart = findExprStartBackward(result)\n\n if (exprStart < exprEnd) {\n const expr = result.slice(exprStart)\n result = result.slice(0, exprStart)\n\n // Scan forward to capture the property name after !.\n let j = i + 2\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n const prop = source.slice(i + 2, j)\n\n result += `__tjs.bang(${expr},'${prop}')`\n i = j\n continue\n }\n }\n\n result += ch\n i++\n } else if (state === 'line-comment') {\n result += ch\n if (ch === '\\n') state = 'normal'\n i++\n } else if (state === 'block-comment') {\n result += ch\n if (ch === '*' && next === '/') {\n result += next\n state = 'normal'\n i += 2\n } else {\n i++\n }\n } else if (state === 'string-single') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === \"'\") {\n state = 'normal'\n i++\n } else {\n i++\n }\n } else if (state === 'string-double') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === '\"') {\n state = 'normal'\n i++\n } else {\n i++\n }\n } else if (state === 'string-template') {\n result += ch\n if (ch === '\\\\') {\n result += next || ''\n i += 2\n } else if (ch === '`') {\n templateDepth--\n state = templateDepth > 0 ? 'string-template' : 'normal'\n i++\n } else if (ch === '$' && next === '{') {\n result += next\n i += 2\n state = 'normal'\n } else {\n i++\n }\n } else {\n result += ch\n i++\n }\n }\n\n return result\n}\n\n/**\n * Scan backward through `text` to find the start of the expression\n * that ends at the last character of `text`.\n *\n * Handles: identifiers, member chains (. and ?.), function calls (),\n * computed access [], and nested combinations.\n */\nfunction findExprStartBackward(text: string): number {\n let pos = text.length - 1\n\n // Skip trailing whitespace\n while (pos >= 0 && /\\s/.test(text[pos])) pos--\n if (pos < 0) return text.length\n\n // Walk backward consuming expression parts\n while (pos >= 0) {\n const ch = text[pos]\n\n if (/[\\w$]/.test(ch)) {\n // Identifier \u2014 consume word chars\n while (pos >= 0 && /[\\w$]/.test(text[pos])) pos--\n // Check if preceded by . or ?. (member chain continues)\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') {\n pos -= 2\n } else {\n pos--\n }\n continue\n }\n return pos + 1\n } else if (ch === ')') {\n pos = findMatchingOpen(text, pos, '(', ')')\n if (pos < 0) return 0\n pos--\n if (pos >= 0 && /[\\w$]/.test(text[pos])) continue\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') pos -= 2\n else pos--\n continue\n }\n return pos + 1\n } else if (ch === ']') {\n pos = findMatchingOpen(text, pos, '[', ']')\n if (pos < 0) return 0\n pos--\n if (pos >= 0 && /[\\w$]/.test(text[pos])) continue\n if (pos >= 0 && text[pos] === '.') {\n if (pos >= 1 && text[pos - 1] === '?') pos -= 2\n else pos--\n continue\n }\n return pos + 1\n } else {\n return pos + 1\n }\n }\n\n return 0\n}\n\n/** Find the matching opening bracket/paren scanning backward from `pos`. */\nfunction findMatchingOpen(\n text: string,\n pos: number,\n open: string,\n close: string\n): number {\n let depth = 1\n pos--\n while (pos >= 0 && depth > 0) {\n if (text[pos] === close) depth++\n else if (text[pos] === open) depth--\n if (depth > 0) pos--\n }\n return pos\n}\n\n/**\n * Transform `let x: <example>` and `let x: <example> = value` declarations.\n *\n * Strips the `: <example>` annotation so Acorn can parse, and records the\n * variable name + example text so the linter and (later) type inference can\n * use the annotation. Acorn rejects the colon since it is not valid JS.\n *\n * let x: '' \u2192 let x (annotation: x \u2192 '')\n * let x: 0 = 5 \u2192 let x = 5 (annotation: x \u2192 0)\n * let result: { ok: false } = ... (annotation: result \u2192 { ok: false })\n *\n * Only `let` is processed. `const` always has an initializer, so the type\n * is always inferable. `var` is rejected by TjsNoVar mode.\n */\nexport function transformLetTypeAnnotations(source: string): {\n source: string\n annotations: Map<string, string>\n} {\n const annotations = new Map<string, string>()\n if (!source.includes('let ')) return { source, annotations }\n\n type Replacement = { start: number; end: number; replacement: string }\n const replacements: Replacement[] = []\n\n let i = 0\n let state: TokenizerState = 'normal'\n const templateStack: number[] = []\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n switch (state) {\n case 'single-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === \"'\") state = 'normal'\n i++\n continue\n case 'double-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '\"') state = 'normal'\n i++\n continue\n case 'template-string':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n i += 2\n templateStack.push(1)\n state = 'normal'\n continue\n }\n if (char === '`') state = 'normal'\n i++\n continue\n case 'line-comment':\n if (char === '\\n') state = 'normal'\n i++\n continue\n case 'block-comment':\n if (char === '*' && nextChar === '/') {\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n case 'regex':\n if (char === '\\\\' && i + 1 < source.length) {\n i += 2\n continue\n }\n if (char === '[') {\n i++\n while (i < source.length && source[i] !== ']') {\n if (source[i] === '\\\\' && i + 1 < source.length) i += 2\n else i++\n }\n if (i < source.length) i++\n continue\n }\n if (char === '/') {\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) i++\n state = 'normal'\n continue\n }\n i++\n continue\n case 'normal':\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n templateStack.pop()\n i++\n state = 'template-string'\n continue\n }\n }\n }\n if (char === \"'\") {\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n i += 2\n state = 'block-comment'\n continue\n }\n if (char === '/') {\n let j = i - 1\n while (j >= 0 && /\\s/.test(source[j])) j--\n const beforeChar = j >= 0 ? source[j] : ''\n const isRegexContext =\n !beforeChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]/.test(beforeChar) ||\n (j >= 5 &&\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)$/.test(\n source.slice(Math.max(0, j - 10), j + 1)\n ))\n if (isRegexContext) {\n i++\n state = 'regex'\n continue\n }\n }\n\n // Detect `let <ident> :` at top-level normal state\n if (\n char === 'l' &&\n source.slice(i, i + 4) === 'let ' &&\n (i === 0 || !/[\\w$]/.test(source[i - 1]))\n ) {\n // Skip past `let` and whitespace\n let j = i + 4\n while (j < source.length && /\\s/.test(source[j])) j++\n // Match identifier\n if (j < source.length && /[a-zA-Z_$]/.test(source[j])) {\n const nameStart = j\n while (j < source.length && /[\\w$]/.test(source[j])) j++\n const nameEnd = j\n const varName = source.slice(nameStart, nameEnd)\n // Skip whitespace; require a `:` (not `::` or part of `?:`)\n let k = j\n while (k < source.length && /\\s/.test(source[k])) k++\n if (\n k < source.length &&\n source[k] === ':' &&\n source[k + 1] !== ':'\n ) {\n const colonPos = k\n // Skip whitespace after colon\n let exStart = colonPos + 1\n while (exStart < source.length && /[ \\t]/.test(source[exStart])) {\n exStart++\n }\n // Scan example expression until `=`, `,`, `;`, or newline at depth 0\n const exEnd = scanExampleEnd(source, exStart)\n if (exEnd > exStart) {\n const example = source.slice(exStart, exEnd).trim()\n annotations.set(varName, example)\n replacements.push({\n start: nameEnd,\n end: exEnd,\n replacement: '',\n })\n i = exEnd\n continue\n }\n }\n }\n }\n break\n }\n i++\n }\n\n if (replacements.length === 0) return { source, annotations }\n\n // Apply right-to-left to preserve positions\n let result = source\n for (let k = replacements.length - 1; k >= 0; k--) {\n const r = replacements[k]\n result = result.slice(0, r.start) + r.replacement + result.slice(r.end)\n }\n return { source: result, annotations }\n}\n\n/**\n * Scan forward from `start` and return the position where the example\n * expression ends. Stops at `=`, `,`, `;`, or a newline when paren/brace/\n * bracket depth is 0. Skips through nested brackets, strings, and templates.\n */\nfunction scanExampleEnd(source: string, start: number): number {\n let i = start\n let parens = 0\n let braces = 0\n let brackets = 0\n let state: 'normal' | 'sq' | 'dq' | 'tpl' = 'normal'\n const templateStack: number[] = []\n while (i < source.length) {\n const c = source[i]\n if (state === 'sq') {\n if (c === '\\\\') {\n i += 2\n continue\n }\n if (c === \"'\") state = 'normal'\n i++\n continue\n }\n if (state === 'dq') {\n if (c === '\\\\') {\n i += 2\n continue\n }\n if (c === '\"') state = 'normal'\n i++\n continue\n }\n if (state === 'tpl') {\n if (c === '\\\\') {\n i += 2\n continue\n }\n if (c === '$' && source[i + 1] === '{') {\n templateStack.push(1)\n state = 'normal'\n i += 2\n continue\n }\n if (c === '`') state = 'normal'\n i++\n continue\n }\n // normal\n if (templateStack.length > 0) {\n if (c === '{') templateStack[templateStack.length - 1]++\n else if (c === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n templateStack.pop()\n state = 'tpl'\n i++\n continue\n }\n }\n }\n if (c === \"'\") {\n state = 'sq'\n i++\n continue\n }\n if (c === '\"') {\n state = 'dq'\n i++\n continue\n }\n if (c === '`') {\n state = 'tpl'\n i++\n continue\n }\n if (c === '(') parens++\n else if (c === ')') parens--\n else if (c === '{') braces++\n else if (c === '}') braces--\n else if (c === '[') brackets++\n else if (c === ']') brackets--\n if (parens === 0 && braces === 0 && brackets === 0) {\n if (c === '=' || c === ',' || c === ';' || c === '\\n') return i\n }\n i++\n }\n return i\n}\n", "/**\n * Parser parameter and annotation processing\n *\n * Handles the unified paren expression transformer that converts TJS syntax\n * (colon defaults, return type annotations, safe/unsafe markers) into valid JS.\n */\n\nimport { SyntaxError } from './types'\nimport type {\n TokenizerState,\n StructuralContext,\n ContextFrame,\n TjsModes,\n} from './parser-types'\nimport { locAt } from './parser-transforms'\n\nexport function transformParenExpressions(\n source: string,\n ctx: {\n originalSource: string\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n }\n): {\n source: string\n returnType?: string\n returnSafety?: 'safe' | 'unsafe'\n} {\n let result = ''\n let i = 0\n let firstReturnType: string | undefined\n let firstReturnSafety: 'safe' | 'unsafe' | undefined\n\n // State machine for tokenizing\n let state: TokenizerState = 'normal'\n // Stack for template string interpolation depth (each entry is brace depth within that interpolation)\n const templateStack: number[] = []\n\n // Structural context tracking - know if we're in a class body, function body, etc.\n const contextStack: ContextFrame[] = [{ type: 'top-level', braceDepth: 0 }]\n let braceDepth = 0\n\n // Helper to get current structural context (reserved for future use)\n const _currentContext = (): StructuralContext =>\n contextStack[contextStack.length - 1]?.type || 'top-level'\n\n // Helper to check if we're directly in a class body (not nested in a function/block inside it)\n const isInClassBody = (): boolean => {\n const frame = contextStack[contextStack.length - 1]\n return frame?.type === 'class-body' && braceDepth === frame.braceDepth + 1\n }\n\n while (i < source.length) {\n const char = source[i]\n const nextChar = source[i + 1]\n\n // Handle state transitions based on current state\n switch (state) {\n case 'single-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === \"'\") {\n state = 'normal'\n }\n i++\n continue\n\n case 'double-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '\"') {\n state = 'normal'\n }\n i++\n continue\n\n case 'template-string':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '$' && nextChar === '{') {\n // Enter template expression\n result += nextChar\n i += 2\n templateStack.push(1) // Start with brace depth 1\n state = 'normal' // Back to normal parsing inside ${}\n continue\n }\n if (char === '`') {\n state = 'normal'\n }\n i++\n continue\n\n case 'line-comment':\n result += char\n if (char === '\\n') {\n state = 'normal'\n }\n i++\n continue\n\n case 'block-comment':\n result += char\n if (char === '*' && nextChar === '/') {\n result += nextChar\n i += 2\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'regex':\n result += char\n if (char === '\\\\' && i + 1 < source.length) {\n result += nextChar\n i += 2\n continue\n }\n if (char === '[') {\n // Character class - read until ]\n i++\n while (i < source.length && source[i] !== ']') {\n result += source[i]\n if (source[i] === '\\\\' && i + 1 < source.length) {\n result += source[i + 1]\n i += 2\n } else {\n i++\n }\n }\n if (i < source.length) {\n result += source[i]\n i++\n }\n continue\n }\n if (char === '/') {\n // End of regex, consume flags\n i++\n while (i < source.length && /[gimsuy]/.test(source[i])) {\n result += source[i]\n i++\n }\n state = 'normal'\n continue\n }\n i++\n continue\n\n case 'normal':\n // Handle template stack - track braces inside template expressions\n if (templateStack.length > 0) {\n if (char === '{') {\n templateStack[templateStack.length - 1]++\n } else if (char === '}') {\n templateStack[templateStack.length - 1]--\n if (templateStack[templateStack.length - 1] === 0) {\n // Exiting template expression, back to template string\n templateStack.pop()\n result += char\n i++\n state = 'template-string'\n continue\n }\n }\n }\n\n // Check for string/comment/regex start\n if (char === \"'\") {\n result += char\n i++\n state = 'single-string'\n continue\n }\n if (char === '\"') {\n result += char\n i++\n state = 'double-string'\n continue\n }\n if (char === '`') {\n result += char\n i++\n state = 'template-string'\n continue\n }\n if (char === '/' && nextChar === '/') {\n result += char + nextChar\n i += 2\n state = 'line-comment'\n continue\n }\n if (char === '/' && nextChar === '*') {\n result += char + nextChar\n i += 2\n state = 'block-comment'\n continue\n }\n\n // Check for regex literal\n if (char === '/') {\n const before = result.trimEnd()\n const lastChar = before[before.length - 1]\n const isRegexContext =\n !lastChar ||\n /[=(!,;:{[&|?+\\-*%<>~^]$/.test(before) ||\n /\\b(return|case|throw|in|of|typeof|instanceof|new|delete|void)\\s*$/.test(\n before\n )\n if (isRegexContext) {\n result += char\n i++\n state = 'regex'\n continue\n }\n }\n\n // Now handle TJS-specific transformations in normal state\n break\n }\n\n // We're in normal state - look for TJS patterns\n\n // Track braces for structural context\n if (char === '{') {\n braceDepth++\n result += char\n i++\n continue\n }\n if (char === '}') {\n braceDepth--\n // Pop context if we're exiting it\n const frame = contextStack[contextStack.length - 1]\n if (frame && braceDepth === frame.braceDepth) {\n contextStack.pop()\n }\n result += char\n i++\n continue\n }\n\n // Look for class declarations: class Name { or class Name extends Base {\n const classMatch = source\n .slice(i)\n .match(/^class\\s+\\w+(?:\\s+extends\\s+\\w+)?\\s*\\{/)\n if (classMatch) {\n // Output everything up to but not including the {\n const classHeader = classMatch[0].slice(0, -1)\n result += classHeader\n i += classHeader.length\n // Push class-body context (will be entered when we see the {)\n contextStack.push({ type: 'class-body', braceDepth })\n continue\n }\n\n // Look for function declarations: function name( or function name (\n const funcMatch = source.slice(i).match(/^function\\s+(\\w+)\\s*\\(/)\n if (funcMatch) {\n const funcName = funcMatch[1]\n const matchLen = funcMatch[0].length\n\n // Check for safety marker right after opening paren: (? or (!\n const afterParen = source[i + matchLen]\n let safetyMarker: '?' | '!' | null = null\n let paramStart = i + matchLen\n\n if (afterParen === '?' || afterParen === '!') {\n safetyMarker = afterParen\n paramStart++\n if (safetyMarker === '!') {\n ctx.unsafeFunctions.add(funcName)\n } else {\n ctx.safeFunctions.add(funcName)\n }\n }\n\n result += `function ${funcName}(`\n i = paramStart\n\n // Find matching ) using balanced counting\n const paramsResult = extractBalancedContent(source, i, '(', ')')\n if (!paramsResult) {\n // Unbalanced - just copy character and continue\n result += source[i]\n i++\n continue\n }\n\n const { content: params, endPos } = paramsResult\n i = endPos\n\n // Process the params (transform : to = for required params, handle nested arrows)\n const processedParams = processParamString(params, ctx, true)\n result += processedParams + ')'\n\n // Check what follows the closing paren: return type annotation (:, :?, :!)\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n let safety: 'safe' | 'unsafe' | undefined\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n safety = colonMarker === ':?' ? 'safe' : 'unsafe'\n } else {\n j += 1\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n if (firstReturnType === undefined) {\n firstReturnType = typeResult.type\n if (safety) firstReturnSafety = safety\n }\n i = typeResult.endPos\n }\n }\n\n // Catch a common mistake: writing `=> {` after a function declaration's\n // return type (or after `)`), as if it were an arrow function. Without\n // this check, the `=>` would pass through to Acorn, which complains\n // with a generic \"Unexpected token\" at a misleading position.\n let arrowCheck = i\n while (arrowCheck < source.length && /\\s/.test(source[arrowCheck]))\n arrowCheck++\n if (source[arrowCheck] === '=' && source[arrowCheck + 1] === '>') {\n throw new SyntaxError(\n \"Unexpected '=>' after function declaration. \" +\n 'Function declarations use `function name(params) { body }`, ' +\n 'not arrow syntax. Remove the `=>`.',\n locAt(ctx.originalSource, arrowCheck),\n ctx.originalSource\n )\n }\n continue\n }\n\n // Look for class method syntax: constructor(, methodName(, get name(, set name(\n // These appear inside class bodies and need param transformation\n // Only match if we're actually in a class body (proper context tracking)\n // Must NOT match function calls in expressions (div(), span(), etc.)\n const methodMatch = source\n .slice(i)\n .match(/^(constructor|(?:get|set)\\s+\\w+|async\\s+\\w+|\\w+)\\s*\\(/)\n // Check that the preceding non-whitespace character indicates this is a\n // declaration, not a function call in an expression.\n // Method declarations follow: newline, {, ;, or start of file\n // Function calls follow: = => , [ ( . operators etc.\n const prevNonWs = (() => {\n for (let k = result.length - 1; k >= 0; k--) {\n if (!/\\s/.test(result[k])) return result[k]\n }\n return '\\n' // start of input\n })()\n // Method declarations can follow almost anything (property, }, ;, etc.)\n // Function CALLS in expressions specifically follow: = => , [ (\n const isMethodDecl =\n prevNonWs !== '=' &&\n prevNonWs !== ',' &&\n prevNonWs !== '(' &&\n prevNonWs !== '[' &&\n prevNonWs !== '>' // catches =>\n if (methodMatch && isInClassBody() && !isMethodDecl) {\n // Not a method declaration (it's a function call in an expression).\n // Skip past the identifier to prevent re-matching a suffix\n // (e.g. 'div(' \u2192 skip 'div', don't let 'iv(' match next).\n const skipLen = methodMatch[1].length\n result += source.slice(i, i + skipLen)\n i += skipLen\n continue\n }\n if (methodMatch && isInClassBody() && isMethodDecl) {\n // We're actually in a class body - this is a method definition\n const methodPart = methodMatch[1]\n const matchLen = methodMatch[0].length\n const paramStart = i + matchLen\n\n result += methodPart + '('\n i = paramStart\n\n // Find matching )\n const paramsResult = extractBalancedContent(source, i, '(', ')')\n if (!paramsResult) {\n result += source[i]\n i++\n continue\n }\n\n const { content: params, endPos } = paramsResult\n i = endPos\n\n // Process the params (transform : to = for TJS types)\n const processedParams = processParamString(params, ctx, true)\n result += processedParams + ')'\n\n // Check for return type annotation: ): type, ):! type, ):? type\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n } else {\n j++\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n i = typeResult.endPos\n }\n }\n\n // Same `=>` check for class methods.\n let k = i\n while (k < source.length && /\\s/.test(source[k])) k++\n if (source[k] === '=' && source[k + 1] === '>') {\n throw new SyntaxError(\n \"Unexpected '=>' after method declaration. \" +\n 'Methods use `name(params) { body }`, not arrow syntax. ' +\n 'Remove the `=>`.',\n locAt(ctx.originalSource, k),\n ctx.originalSource\n )\n }\n\n continue\n }\n\n // Look for arrow function params: (params) =>\n // We need to be careful to only transform when followed by =>\n if (source[i] === '(') {\n // First, find the matching ) without consuming any safety marker\n // We'll check for safety marker only if this is actually an arrow function\n const fullParamsResult = extractBalancedContent(source, i + 1, '(', ')')\n if (!fullParamsResult) {\n result += source[i]\n i++\n continue\n }\n\n const fullContent = fullParamsResult.content\n const endPos = fullParamsResult.endPos\n\n // Check what follows: whitespace then => (arrow function) or -> (return type on arrow)\n let j = endPos\n while (j < source.length && /\\s/.test(source[j])) j++\n\n // Check for return type annotation on arrow function: ): type =>\n let arrowReturnType: string | undefined\n if (source[j] === ':') {\n const colonMarker = source.slice(j, j + 2)\n if (colonMarker === ':?' || colonMarker === ':!') {\n j += 2\n } else {\n j++\n }\n while (j < source.length && /\\s/.test(source[j])) j++\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n arrowReturnType = typeResult.type\n j = typeResult.endPos\n while (j < source.length && /\\s/.test(source[j])) j++\n }\n }\n\n if (source.slice(j, j + 2) === '=>') {\n // This IS an arrow function - now check for safety marker\n let safetyMarker: '?' | '!' | null = null\n let params = fullContent\n\n // Check if content starts with safety marker (? or !) followed by whitespace\n const trimmedContent = fullContent.trimStart()\n if (\n trimmedContent.startsWith('?') &&\n (trimmedContent.length === 1 || /\\s/.test(trimmedContent[1]))\n ) {\n safetyMarker = '?'\n params = trimmedContent.slice(1)\n } else if (\n trimmedContent.startsWith('!') &&\n (trimmedContent.length === 1 || /\\s/.test(trimmedContent[1]))\n ) {\n safetyMarker = '!'\n params = trimmedContent.slice(1)\n }\n\n // Process the params\n const processedParams = processParamString(params, ctx, false)\n // Add safety marker as comment for arrow functions (since we can't track them by name)\n const safetyComment =\n safetyMarker === '?'\n ? '/* safe */ '\n : safetyMarker === '!'\n ? '/* unsafe */ '\n : ''\n result += `(${safetyComment}${processedParams})`\n // Skip the return type annotation (we extracted it but don't emit it)\n i = endPos\n // Skip to just before the =>\n while (i < j && /\\s/.test(source[i])) {\n result += source[i]\n i++\n }\n // If there was a return type, we need to skip past it to =>\n if (arrowReturnType) {\n i = j\n }\n } else {\n // Not an arrow function - recursively transform the content for nested arrows\n // but don't process as param declarations (no colon-to-equals transform)\n const transformed = transformParenExpressions(fullContent, ctx)\n result += `(${transformed.source})`\n i = endPos\n }\n continue\n }\n\n result += source[i]\n i++\n }\n\n return {\n source: result,\n returnType: firstReturnType,\n returnSafety: firstReturnSafety,\n }\n}\n\n/**\n * Extract balanced content between delimiters\n * @param source The source string\n * @param start Position after the opening delimiter\n * @param open Opening delimiter character (for depth counting of nested structures)\n * @param close Closing delimiter character\n * @returns The content between delimiters and position after closing delimiter, or null if unbalanced\n */\nfunction extractBalancedContent(\n source: string,\n start: number,\n open: string,\n close: string\n): { content: string; endPos: number } | null {\n let depth = 1\n let i = start\n let inString = false\n let stringChar = ''\n\n while (i < source.length && depth > 0) {\n const char = source[i]\n\n // Handle string literals\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n } else if (inString && char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n } else if (!inString) {\n if (char === open) depth++\n else if (char === close) depth--\n }\n i++\n }\n\n if (depth !== 0) return null\n\n return {\n content: source.slice(start, i - 1),\n endPos: i,\n }\n}\n\n/**\n * Extract a JS value starting at a position in source.\n * Handles nested objects {}, arrays [], strings, numbers, booleans, null.\n * Uses state machine to properly track nesting.\n */\nexport function extractJSValue(\n source: string,\n start: number\n): { value: string; endPos: number } | null {\n let i = start\n\n // Skip leading whitespace\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i >= source.length) return null\n\n const valueStart = i\n const firstChar = source[i]\n\n // Handle objects and arrays with balanced parsing\n if (firstChar === '{' || firstChar === '[') {\n const close = firstChar === '{' ? '}' : ']'\n const result = extractBalancedContent(source, i + 1, firstChar, close)\n if (!result) return null\n return {\n value: source.slice(valueStart, result.endPos),\n endPos: result.endPos,\n }\n }\n\n // Handle strings\n if (firstChar === \"'\" || firstChar === '\"' || firstChar === '`') {\n i++\n while (i < source.length) {\n if (source[i] === firstChar && source[i - 1] !== '\\\\') {\n i++\n return { value: source.slice(valueStart, i), endPos: i }\n }\n i++\n }\n return null // Unterminated string\n }\n\n // Handle numbers (including negative and decimals)\n if (/[-+\\d]/.test(firstChar)) {\n while (i < source.length && /[\\d.eE+-]/.test(source[i])) i++\n return { value: source.slice(valueStart, i), endPos: i }\n }\n\n // Handle keywords: true, false, null, undefined\n const keywordMatch = source.slice(i).match(/^(true|false|null|undefined)\\b/)\n if (keywordMatch) {\n return {\n value: keywordMatch[1],\n endPos: i + keywordMatch[1].length,\n }\n }\n\n return null\n}\n\n/**\n * Normalize union syntax in type strings\n * Converts single | to || for TJS consistency (needed for JS parsing)\n */\nfunction normalizeUnionSyntax(type: string): string {\n // Replace single | (not ||) with || for proper JS parsing\n // Use negative lookbehind and lookahead to avoid matching ||\n return type.replace(/(?<!\\|)\\|(?!\\|)/g, ' || ')\n}\n\n/**\n * Extract a return type value starting at the given position\n * Handles: simple types ('', 0, null), objects ({ }), arrays ([ ]), unions (| or ||)\n */\nfunction extractReturnTypeValue(\n source: string,\n start: number\n): { type: string; endPos: number } | null {\n let i = start\n let depth = 0\n let inString = false\n let stringChar = ''\n let sawContent = false\n\n // Helper to create result with normalized type\n const makeResult = (endPos: number) => ({\n type: normalizeUnionSyntax(source.slice(start, endPos).trim()),\n endPos,\n })\n\n while (i < source.length) {\n const char = source[i]\n\n // Handle string literals\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n sawContent = true\n i++\n continue\n }\n if (inString) {\n if (char === stringChar && source[i - 1] !== '\\\\') {\n inString = false\n i++ // Move past closing quote\n // Just finished a string at depth 0\n if (depth === 0) {\n // Check if next non-ws is function body { or union |\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n if (source[j] === '{') {\n // Check if it's object type or function body\n const afterBrace = source.slice(j + 1).match(/^\\s*(\\w+)\\s*:/)\n if (!afterBrace) {\n // Function body - type ends here\n return makeResult(i)\n }\n }\n if (source[j] !== '|' && source[j] !== '&') {\n // No union - type ends here\n return makeResult(i)\n }\n }\n continue\n }\n i++\n continue\n }\n\n // Track bracket depth\n if (char === '{' || char === '[' || char === '(') {\n depth++\n sawContent = true\n i++\n continue\n }\n if (char === '}' || char === ']' || char === ')') {\n depth--\n if (depth === 0) {\n i++\n // Check for union after closing bracket\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n if (source[j] === '|' || source[j] === '&') {\n continue // More type content\n }\n return makeResult(i)\n }\n i++\n continue\n }\n\n // At depth 0, check for function body\n if (depth === 0 && char === '{') {\n if (sawContent) {\n return makeResult(i)\n }\n // First { - check if object type or function body\n const afterBrace = source.slice(i + 1).match(/^\\s*(\\w+)\\s*:/)\n if (afterBrace) {\n depth++\n sawContent = true\n i++\n continue\n }\n return makeResult(i)\n }\n\n // Handle union/intersection at depth 0\n if (depth === 0 && (char === '|' || char === '&')) {\n i++\n if (i < source.length && source[i] === '|') i++ // Skip second | for ||\n while (i < source.length && /\\s/.test(source[i])) i++\n continue\n }\n\n // Handle numbers (including decimals like 14.5, -3.14)\n if (\n depth === 0 &&\n (/\\d/.test(char) || (char === '-' && /\\d/.test(source[i + 1])))\n ) {\n let j = i\n if (source[j] === '-') j++ // Skip negative sign\n while (j < source.length && /\\d/.test(source[j])) j++\n // Handle decimal part\n if (j < source.length && source[j] === '.' && /\\d/.test(source[j + 1])) {\n j++ // Skip decimal point\n while (j < source.length && /\\d/.test(source[j])) j++\n }\n // Handle exponent (1e10, 1.5e-3)\n if (j < source.length && (source[j] === 'e' || source[j] === 'E')) {\n j++\n if (j < source.length && (source[j] === '+' || source[j] === '-')) j++\n while (j < source.length && /\\d/.test(source[j])) j++\n }\n sawContent = true\n i = j\n // Check what's next\n while (i < source.length && /\\s/.test(source[i])) i++\n if (i < source.length && source[i] === '{') {\n // Function body - type ends here\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n if (source[i] !== '|' && source[i] !== '&') {\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n continue\n }\n\n // Handle identifiers (null, undefined, true, false, type names)\n if (depth === 0 && /[a-zA-Z_]/.test(char)) {\n let j = i\n while (j < source.length && /\\w/.test(source[j])) j++\n sawContent = true\n i = j\n // Check what's next\n while (i < source.length && /\\s/.test(source[i])) i++\n\n // Identifier followed by ( \u2014 constructor/function call as return type\n // e.g. FunctionPredicate('function', { params: ... })\n if (i < source.length && source[i] === '(') {\n depth++\n i++\n continue\n }\n\n if (i < source.length && source[i] === '{') {\n // Check if function body\n const afterBrace = source.slice(i + 1).match(/^\\s*(\\w+)\\s*:/)\n if (!afterBrace) {\n // Function body - type ends before whitespace\n let typeEnd = j\n while (typeEnd > start && /\\s/.test(source[typeEnd - 1])) typeEnd--\n return {\n type: normalizeUnionSyntax(source.slice(start, typeEnd).trim()),\n endPos: j,\n }\n }\n }\n if (source[i] !== '|' && source[i] !== '&') {\n return {\n type: normalizeUnionSyntax(source.slice(start, j).trim()),\n endPos: j,\n }\n }\n continue\n }\n\n i++\n }\n\n // Reached end of source\n if (sawContent) {\n return makeResult(i)\n }\n return null\n}\n\n/**\n * Split parameter string respecting nested braces/brackets\n */\nfunction splitParameters(params: string): string[] {\n const result: string[] = []\n let current = ''\n let depth = 0\n let inLineComment = false\n let inBlockComment = false\n let i = 0\n\n while (i < params.length) {\n const char = params[i]\n const nextChar = params[i + 1]\n\n // Handle line comments - preserve them in output\n if (!inBlockComment && char === '/' && nextChar === '/') {\n inLineComment = true\n current += '//'\n i += 2\n continue\n }\n\n // Handle block comments - preserve them in output\n if (!inLineComment && char === '/' && nextChar === '*') {\n inBlockComment = true\n current += '/*'\n i += 2\n continue\n }\n\n // End of line comment\n if (inLineComment && char === '\\n') {\n inLineComment = false\n current += char\n i++\n continue\n }\n\n // End of block comment - preserve closing\n if (inBlockComment && char === '*' && nextChar === '/') {\n inBlockComment = false\n current += '*/'\n i += 2\n continue\n }\n\n // Inside comments - preserve the content\n if (inLineComment || inBlockComment) {\n current += char\n i++\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n current += char\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n current += char\n } else if (char === ',' && depth === 0) {\n result.push(current)\n current = ''\n } else {\n current += char\n }\n i++\n }\n\n if (current.trim()) {\n result.push(current)\n }\n\n return result\n}\n\n/**\n * Process a parameter string, transforming : to = for required params\n * and recursively handling nested arrow functions\n */\nfunction processParamString(\n params: string,\n ctx: {\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n },\n trackRequired: boolean\n): string {\n // First recursively process any nested arrow functions\n const withArrows = transformParenExpressions(params, {\n originalSource: params,\n requiredParams: ctx.requiredParams,\n unsafeFunctions: ctx.unsafeFunctions,\n safeFunctions: ctx.safeFunctions,\n }).source\n\n // Now split and process each parameter\n const paramList = splitParameters(withArrows)\n let sawOptional = false\n const seenNames = new Set<string>()\n\n // Helper to check for duplicate names\n const checkDuplicate = (name: string) => {\n if (trackRequired && /^\\w+$/.test(name)) {\n if (seenNames.has(name)) {\n throw new Error(`Duplicate parameter name '${name}'`)\n }\n seenNames.add(name)\n }\n }\n\n const processed = paramList.map((param) => {\n const trimmed = param.trim()\n if (!trimmed) return param\n\n // Handle destructured object parameters: { name: 'Clara', age = 30 }\n // Transform colons to equals inside the braces (recursive)\n // Order doesn't matter for objects, so don't enforce required-before-optional\n // ONLY do this when trackRequired is true - i.e., actual function parameters\n if (trackRequired && trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const inner = trimmed.slice(1, -1)\n const processedInner = processDestructuredObjectParams(inner, ctx)\n return `{ ${processedInner} }`\n }\n\n // Handle destructured array parameters: [first: '', second: 0]\n // ONLY do this when trackRequired is true - i.e., actual function parameters\n if (trackRequired && trimmed.startsWith('[') && trimmed.endsWith(']')) {\n const inner = trimmed.slice(1, -1)\n const processedInner = processDestructuredObjectParams(inner, ctx)\n return `[ ${processedInner} ]`\n }\n\n // Handle rest parameters: ...args: [0] -> ...args (strip type, JS forbids defaults on rest)\n // The type annotation is still captured by extractFunctionTypeInfo for __tjs metadata\n if (trimmed.startsWith('...')) {\n const restColonPos = findTopLevelColon(trimmed)\n if (restColonPos !== -1) {\n const restName = trimmed.slice(0, restColonPos).trim()\n return restName\n }\n return param\n }\n\n // Handle optional param syntax: x?: type -> x = type (not required)\n const optionalMatch = trimmed.match(/^(\\w+)\\s*\\?\\s*:\\s*(.+)$/)\n if (optionalMatch) {\n const [, name, type] = optionalMatch\n checkDuplicate(name)\n sawOptional = true\n // Optional params are NOT tracked as required\n return `${name} = ${type}`\n }\n\n // Check if param already has a default value (x = value)\n if (!hasColonNotEquals(trimmed)) {\n // Has equals sign (default value) - this is optional\n // Extract name from \"name = value\" pattern\n const eqMatch = trimmed.match(/^(\\w+)\\s*=/)\n if (eqMatch) {\n checkDuplicate(eqMatch[1])\n }\n sawOptional = true\n return param\n }\n\n // Handle required param syntax: x: type -> x = type (tracked as required)\n const colonPos = findTopLevelColon(trimmed)\n if (colonPos !== -1) {\n const name = trimmed.slice(0, colonPos).trim()\n const type = trimmed.slice(colonPos + 1).trim()\n\n checkDuplicate(name)\n\n // Required param after optional \u2014 warn but allow.\n // TypeScript permits this, and the TS\u2192TJS converter can produce it\n // when earlier params degrade to 'any' (bare name, no : or =).\n if (sawOptional && trackRequired && /^\\w+$/.test(name)) {\n // Allow it \u2014 JavaScript handles this fine (caller passes undefined)\n }\n\n if (trackRequired && /^\\w+$/.test(name)) {\n ctx.requiredParams.add(name)\n }\n return `${name} = ${type}`\n }\n\n return param\n })\n\n return processed.join(',')\n}\n\n/**\n * Process destructured object/array parameters\n *\n * In TJS destructuring patterns:\n * - `name: 'Clara'` means required param with example (transforms to `name = 'Clara'`)\n * - `age = 30` means optional param with default (stays as `age = 30`)\n * - Nested objects like `address: { street: '9 High St', zip = '0000' }` are tricky:\n * the inner object is a value (object literal), not a pattern, so we transform it back\n *\n * Key insight: In destructuring, `foo: value` at top level is a required param,\n * but at nested levels within an object value, `:` is normal object literal syntax.\n *\n * Order does NOT matter in objects (unlike positional function params).\n */\nfunction processDestructuredObjectParams(\n inner: string,\n ctx: {\n requiredParams: Set<string>\n unsafeFunctions: Set<string>\n safeFunctions: Set<string>\n }\n): string {\n // Split on commas at the top level (respecting nested braces)\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Check for nested destructured object: name: { ... }\n // The inner { ... } is an object literal value, not a destructuring pattern\n const nestedObjectMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjectMatch) {\n const [, name, objectLiteral] = nestedObjectMatch\n ctx.requiredParams.add(name)\n // Process the inner object as an object literal (transform = to : for values)\n const processedLiteral = processObjectLiteralValue(objectLiteral)\n return `${name} = ${processedLiteral}`\n }\n\n // Check for nested destructured array: name: [ ... ]\n const nestedArrayMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrayMatch) {\n const [, name, arrayLiteral] = nestedArrayMatch\n ctx.requiredParams.add(name)\n // Process the inner array as an array literal\n const processedLiteral = processArrayLiteralValue(arrayLiteral)\n return `${name} = ${processedLiteral}`\n }\n\n // Handle simple colon syntax: name: 'value' -> name = 'value' (required)\n const colonMatch = trimmed.match(/^(\\w+)\\s*:\\s*([\\s\\S]+)$/)\n if (colonMatch) {\n const [, name, value] = colonMatch\n ctx.requiredParams.add(name)\n return `${name} = ${value}`\n }\n\n // Handle equals syntax: name = value (optional, already valid JS)\n // Just preserve it as-is\n return part\n })\n\n return processed.join(', ')\n}\n\n/**\n * Process an object literal value (nested inside destructuring)\n *\n * In object literals, TJS allows `=` for optional values:\n * { street: '9 High St', zip = '0000' }\n *\n * This must become valid JS object literal syntax:\n * { street: '9 High St', zip: '0000' }\n *\n * (The `=` is TJS shorthand indicating the value is optional/has default,\n * but in an object literal context it must use `:`)\n */\nfunction processObjectLiteralValue(literal: string): string {\n // Remove outer braces, process content, restore braces\n const inner = literal.slice(1, -1).trim()\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Handle nested objects: key: { ... } or key = { ... }\n const nestedObjColonMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjColonMatch) {\n const [, key, nested] = nestedObjColonMatch\n return `${key}: ${processObjectLiteralValue(nested)}`\n }\n const nestedObjEqualsMatch = trimmed.match(/^(\\w+)\\s*=\\s*(\\{[\\s\\S]*\\})$/)\n if (nestedObjEqualsMatch) {\n const [, key, nested] = nestedObjEqualsMatch\n return `${key}: ${processObjectLiteralValue(nested)}`\n }\n\n // Handle nested arrays: key: [ ... ] or key = [ ... ]\n const nestedArrColonMatch = trimmed.match(/^(\\w+)\\s*:\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrColonMatch) {\n const [, key, nested] = nestedArrColonMatch\n return `${key}: ${processArrayLiteralValue(nested)}`\n }\n const nestedArrEqualsMatch = trimmed.match(/^(\\w+)\\s*=\\s*(\\[[\\s\\S]*\\])$/)\n if (nestedArrEqualsMatch) {\n const [, key, nested] = nestedArrEqualsMatch\n return `${key}: ${processArrayLiteralValue(nested)}`\n }\n\n // Transform equals to colon for simple values: key = value -> key: value\n const equalsMatch = trimmed.match(/^(\\w+)\\s*=\\s*([\\s\\S]+)$/)\n if (equalsMatch) {\n const [, key, value] = equalsMatch\n return `${key}: ${value}`\n }\n\n // Colon syntax is already valid: key: value\n return part\n })\n\n return `{ ${processed.join(', ')} }`\n}\n\n/**\n * Process an array literal value (nested inside destructuring)\n * Similar to processObjectLiteralValue but for arrays\n */\nfunction processArrayLiteralValue(literal: string): string {\n // Remove outer brackets, process content, restore brackets\n const inner = literal.slice(1, -1).trim()\n const parts = splitParameters(inner)\n\n const processed = parts.map((part) => {\n const trimmed = part.trim()\n if (!trimmed) return part\n\n // Handle nested objects\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n return processObjectLiteralValue(trimmed)\n }\n\n // Handle nested arrays\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n return processArrayLiteralValue(trimmed)\n }\n\n // Array elements are just values, no transformation needed\n return part\n })\n\n return `[ ${processed.join(', ')} ]`\n}\n\n/**\n * Check if param has a top-level colon but no top-level equals\n * This distinguishes x: type from x = type and handles nested structures\n */\nfunction hasColonNotEquals(param: string): boolean {\n let depth = 0\n let hasColon = false\n let hasEquals = false\n let inString = false\n let stringChar = ''\n\n for (let i = 0; i < param.length; i++) {\n const char = param[i]\n\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n continue\n }\n if (inString) {\n if (char === stringChar && param[i - 1] !== '\\\\') inString = false\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n } else if (depth === 0) {\n if (char === ':') hasColon = true\n if (char === '=' && param[i + 1] !== '>') hasEquals = true // Ignore =>\n }\n }\n\n return hasColon && !hasEquals\n}\n\n/**\n * Find the position of the first top-level colon in a param\n */\nfunction findTopLevelColon(param: string): number {\n let depth = 0\n let inString = false\n let stringChar = ''\n\n for (let i = 0; i < param.length; i++) {\n const char = param[i]\n\n if (!inString && (char === \"'\" || char === '\"' || char === '`')) {\n inString = true\n stringChar = char\n continue\n }\n if (inString) {\n if (char === stringChar && param[i - 1] !== '\\\\') inString = false\n continue\n }\n\n if (char === '(' || char === '{' || char === '[') {\n depth++\n } else if (char === ')' || char === '}' || char === ']') {\n depth--\n } else if (depth === 0 && char === ':') {\n return i\n }\n }\n\n return -1\n}\n\n/**\n * Preprocess source to handle custom syntax extensions\n *\n * Transforms:\n * function foo(x: 'example') { }\n * Into:\n * function foo(x = 'example') { }\n * And tracks that 'x' is a required parameter.\n *\n * Also handles return type annotation:\n * function foo(x: 'example') -> { result: 'string' } { }\n */\n", "/**\n * Type inference from value patterns\n *\n * Extracts types from example values:\n * 'string' -> { kind: 'string' }\n * 10 -> { kind: 'number' }\n * ['string'] -> { kind: 'array', items: { kind: 'string' } }\n * { name: 'string' } -> { kind: 'object', shape: { name: { kind: 'string' } } }\n * 'string' | null -> { kind: 'string', nullable: true }\n * 'string' | 0 -> { kind: 'union', members: [{ kind: 'string' }, { kind: 'number' }] }\n */\n\nimport { parseExpressionAt } from 'acorn'\nimport type { Expression, Pattern } from 'acorn'\nimport type { TypeDescriptor, ParameterDescriptor } from './types'\nimport { getLocation, TranspileError } from './types'\n\n/**\n * Infer type from a value expression (example value)\n */\nexport function inferTypeFromValue(node: Expression): TypeDescriptor {\n switch (node.type) {\n case 'Literal': {\n const value = (node as any).value\n if (value === null) {\n return { kind: 'null' }\n }\n if (typeof value === 'string') {\n return { kind: 'string' }\n }\n if (typeof value === 'number') {\n // Distinguish float vs integer by checking if source contains '.'\n // 2.0 -> number (float), 42 -> integer\n const raw = (node as any).raw as string | undefined\n if (raw && raw.includes('.')) {\n return { kind: 'number' }\n }\n return { kind: 'integer' }\n }\n if (typeof value === 'boolean') {\n return { kind: 'boolean' }\n }\n return { kind: 'any' }\n }\n\n case 'ArrayExpression': {\n const elements = (node as any).elements as Expression[]\n if (elements.length === 0) {\n return { kind: 'array', items: { kind: 'any' } }\n }\n // Infer type from all elements \u2014 if homogeneous, use that type;\n // if heterogeneous, produce a union of distinct kinds\n const itemTypes = elements\n .filter((el) => el != null)\n .map((el) => inferTypeFromValue(el))\n if (itemTypes.length === 0) {\n return { kind: 'array', items: { kind: 'any' } }\n }\n // Deduplicate by structure\n const seen = new Map<string, TypeDescriptor>()\n for (const t of itemTypes) {\n const key = JSON.stringify(t)\n if (!seen.has(key)) seen.set(key, t)\n }\n const unique = [...seen.values()]\n const items =\n unique.length === 1\n ? unique[0]\n : { kind: 'union' as const, members: unique }\n return { kind: 'array', items }\n }\n\n case 'ObjectExpression': {\n const properties = (node as any).properties as any[]\n const shape: Record<string, TypeDescriptor> = {}\n\n for (const prop of properties) {\n if (prop.type === 'Property' && prop.key.type === 'Identifier') {\n const key = prop.key.name\n shape[key] = inferTypeFromValue(prop.value)\n }\n }\n\n return { kind: 'object', shape }\n }\n\n case 'LogicalExpression': {\n const { operator, left, right } = node as any\n\n if (operator === '||') {\n // || is JavaScript logical OR \u2014 infer type from left operand\n return inferTypeFromValue(left)\n }\n\n if (operator === '&&') {\n // null && type means required type (null is just a marker)\n const rightType = inferTypeFromValue(right)\n return rightType\n }\n\n if (operator === '??') {\n // Nullish coalescing: left ?? right - type is the right side (fallback)\n const rightType = inferTypeFromValue(right)\n return rightType\n }\n\n return { kind: 'any' }\n }\n\n case 'BinaryExpression': {\n const { operator, left, right } = node as any\n // | means union type (e.g., 0 | null, '' | undefined)\n if (operator === '|') {\n const leftType = inferTypeFromValue(left)\n const rightType = inferTypeFromValue(right)\n\n if (rightType.kind === 'null') {\n return { ...leftType, nullable: true }\n }\n if (leftType.kind === 'null') {\n return { ...rightType, nullable: true }\n }\n return {\n kind: 'union',\n members: [leftType, rightType],\n }\n }\n return { kind: 'any' }\n }\n\n case 'Identifier': {\n // Handle undefined as a type\n if ((node as any).name === 'undefined') {\n return { kind: 'undefined' }\n }\n // Other identifiers in type position aren't valid example types\n return { kind: 'any' }\n }\n\n case 'ArrowFunctionExpression':\n case 'FunctionExpression': {\n // Function example value (e.g. `fn = (x) => x` or `cb = function() {}`).\n // Capture parameter names + types and (for concise arrow bodies)\n // infer the return type from the body expression.\n const fn = node as any\n const params: Array<{ name: string; type: TypeDescriptor }> =\n fn.params.map((p: any) => paramShape(p))\n\n // Concise arrow body: body IS the return expression, so we can\n // infer its type. Block bodies (function expressions, multi-line\n // arrows) stay `any` \u2014 scanning return statements is a separate\n // can of worms.\n let returns: TypeDescriptor = { kind: 'any' }\n if (\n fn.type === 'ArrowFunctionExpression' &&\n fn.body &&\n fn.body.type !== 'BlockStatement'\n ) {\n returns = inferTypeFromValue(fn.body)\n }\n\n return { kind: 'function', params, returns }\n }\n\n case 'UnaryExpression': {\n const op = (node as any).operator\n const arg = (node as any).argument\n\n // +N means non-negative integer (e.g., +1, +3)\n if (op === '+' && arg.type === 'Literal') {\n const value = arg.value\n if (typeof value === 'number') {\n return { kind: 'non-negative-integer' }\n }\n }\n\n // -N means integer or float depending on source\n if (op === '-' && arg.type === 'Literal') {\n const value = arg.value\n if (typeof value === 'number') {\n const raw = arg.raw as string | undefined\n if (raw && raw.includes('.')) {\n return { kind: 'number' }\n }\n return { kind: 'integer' }\n }\n }\n return { kind: 'any' }\n }\n\n default:\n return { kind: 'any' }\n }\n}\n\n/**\n * Extract a function-parameter shape from a Pattern AST node. Used when\n * we encounter a function/arrow EXAMPLE value and want to record what\n * its declared parameters look like for documentation and .d.ts emit.\n *\n * Plain identifier (`x`) \u2192 { name: 'x', type: any }\n * Default value (`x = 0`) \u2192 { name: 'x', type: integer }\n * Rest (`...args`) \u2192 { name: '...args', type: array }\n * Destructuring (`{a}`, `[x]`) \u2192 name: '?', type: any (we'd need\n * to mirror parseParameter to do\n * this properly; not worth the\n * complexity for example values)\n */\nfunction paramShape(p: any): { name: string; type: TypeDescriptor } {\n if (p.type === 'Identifier') {\n return { name: p.name, type: { kind: 'any' } }\n }\n if (p.type === 'AssignmentPattern' && p.left?.type === 'Identifier') {\n return { name: p.left.name, type: inferTypeFromValue(p.right) }\n }\n if (p.type === 'RestElement' && p.argument?.type === 'Identifier') {\n return {\n name: `...${p.argument.name}`,\n type: { kind: 'array', items: { kind: 'any' } },\n }\n }\n return { name: '?', type: { kind: 'any' } }\n}\n\n/**\n * Parse a parameter and extract its type and default value\n *\n * @param param - The AST node for the parameter\n * @param requiredParams - Optional set of parameter names that are required (from colon syntax)\n */\nexport function parseParameter(\n param: Pattern,\n requiredParams?: Set<string>\n): ParameterDescriptor {\n // Simple identifier: function foo(x) - required, any type\n if (param.type === 'Identifier') {\n return {\n name: (param as any).name,\n type: { kind: 'any' },\n required: true,\n }\n }\n\n // Assignment pattern: function foo(x = value)\n if (param.type === 'AssignmentPattern') {\n const { left, right } = param as any\n\n if (left.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple parameter names are supported',\n getLocation(param)\n )\n }\n\n const name = left.name\n\n // Check if this parameter was marked as required via colon syntax\n const isRequired = requiredParams?.has(name) ?? false\n\n // Infer type from the example value\n const type = inferTypeFromValue(right)\n const exampleValue = extractLiteralValue(right)\n\n return {\n name,\n type,\n required: isRequired,\n default: isRequired ? null : exampleValue,\n example: exampleValue,\n loc: { start: param.start, end: param.end },\n }\n }\n\n // Destructuring pattern: function foo({ a, b })\n if (param.type === 'ObjectPattern') {\n // For destructuring, we create a synthetic \"args\" parameter\n // The individual properties become fields with their own defaults\n const properties = (param as any).properties as any[]\n const shape: Record<string, TypeDescriptor> = {}\n // Store full parameter descriptors for destructured properties\n const destructuredParams: Record<string, ParameterDescriptor> = {}\n\n for (const prop of properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? prop.key.name\n : String(prop.key.value)\n\n if (prop.value.type === 'Identifier') {\n // { name } - required, any type\n shape[key] = { kind: 'any' }\n destructuredParams[key] = {\n name: key,\n type: { kind: 'any' },\n required: true,\n }\n } else if (prop.value.type === 'AssignmentPattern') {\n // { name = default } - check requiredParams to see if this was originally colon syntax\n const innerParam = parseParameter(prop.value, requiredParams)\n const isRequired = requiredParams?.has(key) ?? false\n shape[key] = innerParam.type\n destructuredParams[key] = {\n name: key,\n type: innerParam.type,\n required: isRequired,\n default: isRequired ? null : innerParam.example,\n example: innerParam.example,\n }\n }\n }\n }\n\n return {\n name: '__destructured__',\n type: { kind: 'object', shape, destructuredParams },\n required: true,\n }\n }\n\n throw new TranspileError(\n `Unsupported parameter pattern: ${param.type}`,\n getLocation(param)\n )\n}\n\n/**\n * Extract a literal value from an expression for default values\n */\nexport function extractLiteralValue(node: Expression): any {\n switch (node.type) {\n case 'Literal':\n return (node as any).value\n\n case 'ArrayExpression':\n return (node as any).elements.map((el: Expression) =>\n el ? extractLiteralValue(el) : null\n )\n\n case 'ObjectExpression': {\n const result: Record<string, any> = {}\n for (const prop of (node as any).properties) {\n if (prop.type === 'Property' && prop.key.type === 'Identifier') {\n result[prop.key.name] = extractLiteralValue(prop.value)\n }\n }\n return result\n }\n\n case 'UnaryExpression':\n if ((node as any).operator === '-') {\n const arg = extractLiteralValue((node as any).argument)\n return typeof arg === 'number' ? -arg : undefined\n }\n if ((node as any).operator === '+') {\n const arg = extractLiteralValue((node as any).argument)\n return typeof arg === 'number' ? +arg : undefined\n }\n return undefined\n\n case 'BinaryExpression': {\n const { operator, left } = node as any\n // | is union type \u2014 extract the left (primary) example value\n if (operator === '|') {\n return extractLiteralValue(left)\n }\n return undefined\n }\n\n case 'LogicalExpression': {\n const { operator, left, right } = node as any\n if (operator === '&&') {\n // null && type evaluates to null (falsy short-circuit)\n if (left.type === 'Literal' && left.value === null) {\n return null\n }\n }\n if (operator === '||') {\n // value || fallback - return left if truthy\n const leftVal = extractLiteralValue(left)\n return leftVal ?? extractLiteralValue(right)\n }\n if (operator === '??') {\n // value ?? fallback - return left if not null/undefined\n const leftVal = extractLiteralValue(left)\n return leftVal ?? extractLiteralValue(right)\n }\n return undefined\n }\n\n default:\n return undefined\n }\n}\n\n/**\n * Parse return type from a type annotation expression\n */\nexport function parseReturnType(typeExpr: string): TypeDescriptor {\n // Simple approach: parse as expression and infer type\n try {\n const ast = parseExpressionAt(typeExpr, 0, {\n ecmaVersion: 2022,\n })\n return inferTypeFromValue(ast)\n } catch {\n return { kind: 'any' }\n }\n}\n\n/**\n * Convert TypeDescriptor to a human-readable string\n */\nexport function typeToString(type: TypeDescriptor): string {\n switch (type.kind) {\n case 'string':\n return type.nullable ? 'string | null' : 'string'\n case 'number':\n return type.nullable ? 'number | null' : 'number'\n case 'integer':\n return type.nullable ? 'integer | null' : 'integer'\n case 'non-negative-integer':\n return type.nullable\n ? 'non-negative integer | null'\n : 'non-negative integer'\n case 'boolean':\n return type.nullable ? 'boolean | null' : 'boolean'\n case 'null':\n return 'null'\n case 'any':\n return 'any'\n case 'array': {\n const items = type.items ? typeToString(type.items) : 'any'\n return type.nullable ? `${items}[] | null` : `${items}[]`\n }\n case 'object': {\n if (!type.shape || Object.keys(type.shape).length === 0) {\n return type.nullable ? 'object | null' : 'object'\n }\n const props = Object.entries(type.shape)\n .map(([k, v]) => `${k}: ${typeToString(v)}`)\n .join(', ')\n return type.nullable ? `{ ${props} } | null` : `{ ${props} }`\n }\n case 'union':\n return type.members?.map(typeToString).join(' | ') || 'any'\n default:\n return 'any'\n }\n}\n\n/**\n * Check if a value matches a type descriptor\n */\nexport function checkType(value: any, type: TypeDescriptor): boolean {\n // Handle null\n if (value === null || value === undefined) {\n return type.nullable || type.kind === 'null' || type.kind === 'any'\n }\n\n switch (type.kind) {\n case 'any':\n return true\n case 'null':\n return value === null\n case 'string':\n return typeof value === 'string'\n case 'number':\n return typeof value === 'number'\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value)\n case 'non-negative-integer':\n return typeof value === 'number' && Number.isInteger(value) && value >= 0\n case 'boolean':\n return typeof value === 'boolean'\n case 'array':\n if (!Array.isArray(value)) return false\n if (!type.items) return true\n return value.every((item) => checkType(item, type.items!))\n case 'object':\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false\n }\n if (!type.shape) return true\n // Check that all required shape properties exist and match\n for (const [key, propType] of Object.entries(type.shape)) {\n if (!checkType(value[key], propType)) {\n return false\n }\n }\n return true\n case 'union':\n if (!type.members) return true\n return type.members.some((member) => checkType(value, member))\n default:\n return true\n }\n}\n", "/**\n * ESTree to Agent99 AST Transformer\n *\n * Converts parsed JavaScript into Agent99's JSON AST format.\n */\n\nimport type {\n Statement,\n Expression,\n FunctionDeclaration,\n BlockStatement,\n VariableDeclaration,\n ExpressionStatement,\n IfStatement,\n WhileStatement,\n ForOfStatement,\n TryStatement,\n ReturnStatement,\n CallExpression,\n AssignmentExpression,\n BinaryExpression,\n LogicalExpression,\n MemberExpression,\n Identifier,\n Literal,\n TemplateLiteral,\n ArrayExpression,\n ObjectExpression,\n} from 'acorn'\nimport type { BaseNode } from '../../builder'\nimport type { ExprNode } from '../../runtime'\nimport type {\n TransformContext,\n TranspileOptions,\n FunctionSignature,\n ParameterDescriptor,\n TypeDescriptor,\n TranspileWarning,\n} from '../types'\nimport { TranspileError, getLocation, createChildContext } from '../types'\nimport {\n parseParameter,\n inferTypeFromValue,\n parseReturnType,\n} from '../inference'\nimport { extractTDoc } from '../parser'\n\n/**\n * Convert TypeDescriptor to JSON Schema\n */\nfunction typeToJsonSchema(type: TypeDescriptor): any {\n switch (type.kind) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return { type: 'number' }\n case 'boolean':\n return { type: 'boolean' }\n case 'null':\n // null as a default value means \"any type, defaults to null\"\n // In JSON Schema, empty object means any type is allowed\n return {}\n case 'undefined':\n return {} // JSON Schema doesn't have undefined, treat as any\n case 'any':\n return {} // No constraints\n case 'array':\n return {\n type: 'array',\n items: type.items ? typeToJsonSchema(type.items) : {},\n }\n case 'object':\n if (type.shape) {\n const properties: Record<string, any> = {}\n for (const [key, propType] of Object.entries(type.shape)) {\n properties[key] = typeToJsonSchema(propType)\n }\n return {\n type: 'object',\n properties,\n additionalProperties: false,\n }\n }\n return { type: 'object' }\n case 'union':\n if (type.members) {\n return { oneOf: type.members.map(typeToJsonSchema) }\n }\n return {}\n default:\n return {}\n }\n}\n\n/**\n * Convert function parameters to JSON Schema for input validation\n */\nfunction parametersToJsonSchema(\n parameters: Record<string, ParameterDescriptor>\n): any {\n const properties: Record<string, any> = {}\n const required: string[] = []\n\n for (const [name, param] of Object.entries(parameters)) {\n properties[name] = typeToJsonSchema(param.type)\n if (param.required) {\n required.push(name)\n }\n }\n\n return {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n additionalProperties: false,\n }\n}\n\n/**\n * Transform a function declaration into Agent99 AST\n */\nexport function transformFunction(\n func: FunctionDeclaration,\n source: string,\n returnTypeAnnotation: string | undefined,\n options: TranspileOptions = {},\n requiredParamsFromPreprocess?: Set<string>\n): {\n ast: BaseNode\n signature: FunctionSignature\n warnings: TranspileWarning[]\n} {\n // Extract TDoc (/*# ... */) comments\n const tdoc = extractTDoc(source, func)\n\n // Parse parameters\n const parameters = new Map<string, ParameterDescriptor>()\n\n for (const param of func.params) {\n const parsed = parseParameter(param, requiredParamsFromPreprocess)\n\n // Handle destructured parameters - expand into individual params\n if (\n parsed.name === '__destructured__' &&\n parsed.type.kind === 'object' &&\n parsed.type.destructuredParams\n ) {\n for (const [key, paramDesc] of Object.entries(\n parsed.type.destructuredParams\n )) {\n parameters.set(key, {\n ...(paramDesc as any),\n description: tdoc.params[key],\n })\n }\n } else {\n parsed.description = tdoc.params[parsed.name]\n parameters.set(parsed.name, parsed)\n }\n }\n\n // Parse return type\n let returnType: TypeDescriptor | undefined\n if (returnTypeAnnotation) {\n returnType = parseReturnType(returnTypeAnnotation)\n }\n\n // Create transform context\n const ctx: TransformContext = {\n depth: 0,\n locals: new Map(),\n parameters,\n atoms: new Set(Object.keys(options.atoms || {})),\n warnings: [],\n source,\n filename: options.filename || '<source>',\n options,\n }\n\n // Transform function body\n const bodySteps = transformBlock(func.body, ctx)\n\n // Handle parameters: varsImport for required, varSet with defaults for optional\n const steps: BaseNode[] = []\n const requiredParams: string[] = []\n const optionalParams: Array<{ name: string; defaultValue: any }> = []\n\n for (const [name, param] of parameters.entries()) {\n if (param.required) {\n requiredParams.push(name)\n } else if (param.default !== undefined) {\n optionalParams.push({ name, defaultValue: param.default })\n } else {\n // Optional without explicit default - still import from args\n requiredParams.push(name)\n }\n }\n\n // Import required params directly from args\n if (requiredParams.length > 0) {\n steps.push({\n op: 'varsImport',\n keys: requiredParams,\n })\n }\n\n // For optional params with defaults: import from args, then check and set default if null\n for (const { name, defaultValue } of optionalParams) {\n // Import from args (will be undefined if not provided)\n steps.push({\n op: 'varsImport',\n keys: [name],\n })\n // If null/undefined, set the default\n steps.push({\n op: 'if',\n condition: {\n $expr: 'binary',\n op: '==',\n left: { $expr: 'ident', name },\n right: { $expr: 'literal', value: null },\n },\n then: [\n {\n op: 'varSet',\n key: name,\n value: defaultValue,\n },\n ],\n })\n }\n\n steps.push(...bodySteps)\n\n // Build signature\n const signatureParams = Object.fromEntries(parameters)\n const signature: FunctionSignature = {\n name: func.id?.name || 'anonymous',\n description: tdoc.description,\n parameters: signatureParams,\n returns: returnType,\n }\n\n // Generate input schema for runtime validation\n const inputSchema = parametersToJsonSchema(signatureParams)\n\n return {\n ast: { op: 'seq', steps, inputSchema },\n signature,\n warnings: ctx.warnings,\n }\n}\n\n/**\n * Transform a block statement into a list of steps\n */\nexport function transformBlock(\n block: BlockStatement,\n ctx: TransformContext\n): BaseNode[] {\n const steps: BaseNode[] = []\n\n for (const stmt of block.body) {\n const transformed = transformStatement(stmt, ctx)\n if (transformed) {\n if (Array.isArray(transformed)) {\n steps.push(...transformed)\n } else {\n steps.push(transformed)\n }\n }\n }\n\n return steps\n}\n\n/**\n * Transform a statement\n */\nexport function transformStatement(\n stmt: Statement,\n ctx: TransformContext\n): BaseNode | BaseNode[] | null {\n switch (stmt.type) {\n case 'VariableDeclaration':\n return transformVariableDeclaration(stmt as VariableDeclaration, ctx)\n\n case 'ExpressionStatement':\n return transformExpressionStatement(stmt as ExpressionStatement, ctx)\n\n case 'IfStatement':\n return transformIfStatement(stmt as IfStatement, ctx)\n\n case 'WhileStatement':\n return transformWhileStatement(stmt as WhileStatement, ctx)\n\n case 'ForOfStatement':\n return transformForOfStatement(stmt as ForOfStatement, ctx)\n\n case 'TryStatement':\n return transformTryStatement(stmt as TryStatement, ctx)\n\n case 'ReturnStatement':\n return transformReturnStatement(stmt as ReturnStatement, ctx)\n\n case 'ThrowStatement':\n throw new TranspileError(\n `'throw' is not supported in AsyncJS. Use Error('message') to trigger error flow`,\n getLocation(stmt),\n ctx.source,\n ctx.filename\n )\n\n case 'BlockStatement':\n // Nested block creates a scope\n return {\n op: 'scope',\n steps: transformBlock(stmt as BlockStatement, createChildContext(ctx)),\n }\n\n case 'EmptyStatement':\n return null\n\n default:\n throw new TranspileError(\n `Unsupported statement type: ${stmt.type}`,\n getLocation(stmt),\n ctx.source,\n ctx.filename\n )\n }\n}\n\n/**\n * Transform variable declaration: let x = value or const x = value\n */\nfunction transformVariableDeclaration(\n decl: VariableDeclaration,\n ctx: TransformContext\n): BaseNode[] {\n const steps: BaseNode[] = []\n const isConst = decl.kind === 'const'\n const opName = isConst ? 'constSet' : 'varSet'\n\n for (const declarator of decl.declarations) {\n if (declarator.id.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable names are supported',\n getLocation(declarator),\n ctx.source,\n ctx.filename\n )\n }\n\n const name = (declarator.id as Identifier).name\n\n if (declarator.init) {\n // Transform the initializer\n const { step, resultVar } = transformExpressionToStep(\n declarator.init,\n ctx,\n name,\n isConst\n )\n\n if (step) {\n steps.push(step)\n } else if (resultVar !== name) {\n // Simple value assignment\n steps.push({\n op: opName,\n key: name,\n value: resultVar,\n })\n }\n\n // Track variable type\n const type = inferTypeFromValue(declarator.init as Expression)\n ctx.locals.set(name, type)\n } else {\n // Uninitialized variable (only valid for let, not const)\n if (isConst) {\n throw new TranspileError(\n 'const declarations must be initialized',\n getLocation(declarator),\n ctx.source,\n ctx.filename\n )\n }\n steps.push({\n op: 'varSet',\n key: name,\n value: null,\n })\n ctx.locals.set(name, { kind: 'any', nullable: true })\n }\n }\n\n return steps\n}\n\n/**\n * Transform expression statement (e.g., function call)\n */\nfunction transformExpressionStatement(\n stmt: ExpressionStatement,\n ctx: TransformContext\n): BaseNode | null {\n const expr = stmt.expression\n\n // Assignment expression: x = value\n if (expr.type === 'AssignmentExpression') {\n return transformAssignment(expr as AssignmentExpression, ctx)\n }\n\n // Function call (side effect)\n if (expr.type === 'CallExpression') {\n const { step, resultVar } = transformExpressionToStep(expr, ctx)\n if (step) {\n return step\n }\n // If no step but we got an expression (e.g., method call on builtin),\n // we still need to evaluate it for side effects (like s.add(x))\n if (resultVar) {\n return {\n op: 'varSet',\n key: '_',\n value: resultVar,\n }\n }\n return null\n }\n\n // Other expressions (e.g., just a value) - no-op\n ctx.warnings.push({\n message: 'Expression statement has no effect',\n line: getLocation(stmt).line,\n column: getLocation(stmt).column,\n })\n\n return null\n}\n\n/**\n * Transform assignment: x = value\n */\nfunction transformAssignment(\n expr: AssignmentExpression,\n ctx: TransformContext\n): BaseNode {\n if (expr.left.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable assignment is supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n const name = (expr.left as Identifier).name\n const { step, resultVar } = transformExpressionToStep(expr.right, ctx, name)\n\n if (step) {\n return step\n }\n\n return {\n op: 'varSet',\n key: name,\n value: resultVar,\n }\n}\n\n/**\n * Transform if statement\n */\nfunction transformIfStatement(\n stmt: IfStatement,\n ctx: TransformContext\n): BaseNode {\n // Convert condition to ExprNode\n const condition = expressionToExprNode(stmt.test, ctx)\n\n // Transform then branch\n const thenSteps =\n stmt.consequent.type === 'BlockStatement'\n ? transformBlock(\n stmt.consequent as BlockStatement,\n createChildContext(ctx)\n )\n : ([transformStatement(stmt.consequent, ctx)].filter(\n Boolean\n ) as BaseNode[])\n\n // Transform else branch if present\n let elseSteps: BaseNode[] | undefined\n if (stmt.alternate) {\n elseSteps =\n stmt.alternate.type === 'BlockStatement'\n ? transformBlock(\n stmt.alternate as BlockStatement,\n createChildContext(ctx)\n )\n : ([transformStatement(stmt.alternate, ctx)].filter(\n Boolean\n ) as BaseNode[])\n }\n\n return {\n op: 'if',\n condition,\n then: thenSteps,\n ...(elseSteps && { else: elseSteps }),\n }\n}\n\n/**\n * Transform while statement\n */\nfunction transformWhileStatement(\n stmt: WhileStatement,\n ctx: TransformContext\n): BaseNode {\n const condition = expressionToExprNode(stmt.test, ctx)\n\n const body =\n stmt.body.type === 'BlockStatement'\n ? transformBlock(stmt.body as BlockStatement, createChildContext(ctx))\n : ([transformStatement(stmt.body, ctx)].filter(Boolean) as BaseNode[])\n\n return {\n op: 'while',\n condition,\n body,\n }\n}\n\n/**\n * Transform for...of statement into map atom\n */\nfunction transformForOfStatement(\n stmt: ForOfStatement,\n ctx: TransformContext\n): BaseNode {\n // Get the loop variable name\n let varName: string\n if (stmt.left.type === 'VariableDeclaration') {\n const decl = stmt.left.declarations[0]\n if (decl.id.type !== 'Identifier') {\n throw new TranspileError(\n 'Only simple variable names are supported in for...of',\n getLocation(stmt.left),\n ctx.source,\n ctx.filename\n )\n }\n varName = (decl.id as Identifier).name\n } else if (stmt.left.type === 'Identifier') {\n varName = (stmt.left as Identifier).name\n } else {\n throw new TranspileError(\n 'Unsupported for...of left-hand side',\n getLocation(stmt.left),\n ctx.source,\n ctx.filename\n )\n }\n\n // Get the iterable\n const items = expressionToValue(stmt.right, ctx)\n\n // Create child context with loop variable\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(varName, { kind: 'any' })\n\n // Transform body\n const steps =\n stmt.body.type === 'BlockStatement'\n ? transformBlock(stmt.body as BlockStatement, childCtx)\n : ([transformStatement(stmt.body, childCtx)].filter(\n Boolean\n ) as BaseNode[])\n\n return {\n op: 'map',\n items,\n as: varName,\n steps,\n }\n}\n\n/**\n * Transform try/catch statement\n */\nfunction transformTryStatement(\n stmt: TryStatement,\n ctx: TransformContext\n): BaseNode {\n const trySteps = transformBlock(stmt.block, createChildContext(ctx))\n\n let catchSteps: BaseNode[] | undefined\n let catchParam: string | undefined\n if (stmt.handler) {\n const catchCtx = createChildContext(ctx)\n // Add error variable to scope if named\n if (stmt.handler.param?.type === 'Identifier') {\n catchParam = (stmt.handler.param as Identifier).name\n catchCtx.locals.set(catchParam, {\n kind: 'any',\n })\n }\n catchSteps = transformBlock(stmt.handler.body, catchCtx)\n }\n\n return {\n op: 'try',\n try: trySteps,\n ...(catchSteps && { catch: catchSteps }),\n ...(catchParam && { catchParam }),\n }\n}\n\n/**\n * Transform return statement\n */\nfunction transformReturnStatement(\n stmt: ReturnStatement,\n ctx: TransformContext\n): BaseNode | BaseNode[] {\n if (!stmt.argument) {\n return { op: 'return', value: {} }\n }\n\n // Check if the return expression requires a preceding step (e.g., atom call)\n const { step, resultVar } = transformExpressionToStep(\n stmt.argument,\n ctx,\n '__returnVal__'\n )\n\n // If there's a step (atom call), emit it first, then return the result variable\n if (step) {\n return [step, { op: 'return', value: resultVar }]\n }\n\n // Otherwise, convert expression directly to a value for return\n const value = expressionToValue(stmt.argument, ctx)\n return { op: 'return', value }\n}\n\n// Known builtins that should be evaluated as expressions, not atom calls\nconst BUILTIN_OBJECTS = new Set([\n 'Math',\n 'JSON',\n 'Array',\n 'Object',\n 'String',\n 'Number',\n 'console',\n 'Date', // Date factory with static methods like Date.now()\n 'Schema', // tosijs-schema fluent API for building JSON Schemas\n])\n\nconst BUILTIN_GLOBALS = new Set([\n 'parseInt',\n 'parseFloat',\n 'isNaN',\n 'isFinite',\n 'encodeURI',\n 'decodeURI',\n 'encodeURIComponent',\n 'decodeURIComponent',\n 'Set', // Factory function for set-like objects\n 'Date', // Factory function for date-like objects\n 'filter', // Schema-based object filtering\n])\n\nconst UNSUPPORTED_BUILTINS = new Set([\n 'RegExp',\n 'Promise',\n 'Map',\n 'WeakSet',\n 'WeakMap',\n 'Symbol',\n 'Proxy',\n 'Reflect',\n 'Function',\n 'eval',\n 'setTimeout',\n 'setInterval',\n 'fetch',\n 'require',\n 'import',\n 'process',\n 'window',\n 'document',\n 'global',\n 'globalThis',\n])\n\n// Instance methods that should be evaluated as expressions, not atom calls\n// These are methods on values (strings, arrays, etc.) that have native implementations\nconst INSTANCE_METHODS = new Set([\n // String methods\n 'toUpperCase',\n 'toLowerCase',\n 'trim',\n 'trimStart',\n 'trimEnd',\n 'charAt',\n 'charCodeAt',\n 'codePointAt',\n 'concat',\n 'includes',\n 'indexOf',\n 'lastIndexOf',\n 'startsWith',\n 'endsWith',\n 'slice',\n 'substring',\n 'substr',\n 'replace',\n 'replaceAll',\n 'match',\n 'search',\n 'padStart',\n 'padEnd',\n 'repeat',\n 'normalize',\n 'localeCompare',\n 'toString',\n 'valueOf',\n 'at',\n // Array methods (that don't need special atom handling)\n 'reverse',\n 'sort',\n 'fill',\n 'copyWithin',\n 'flat',\n 'flatMap',\n 'every',\n 'some',\n 'forEach',\n // Note: map, filter, find, reduce are handled specially as atoms for lambda support\n // Set methods (from Set() builtin)\n 'add',\n 'remove',\n 'has',\n 'clear',\n 'toArray',\n 'union',\n 'intersection',\n 'diff',\n // Date methods (from Date() builtin)\n 'format',\n 'isBefore',\n 'isAfter',\n // Note: Date.add and Date.diff are method calls that return new values\n])\n\n/**\n * Check if a CallExpression is a builtin call (Math.floor, JSON.parse, etc.)\n * or an instance method call (str.toUpperCase(), arr.includes(), etc.)\n */\nfunction isBuiltinCall(expr: CallExpression): boolean {\n // Check for global functions like parseInt()\n if (expr.callee.type === 'Identifier') {\n const name = (expr.callee as Identifier).name\n return BUILTIN_GLOBALS.has(name) || UNSUPPORTED_BUILTINS.has(name)\n }\n\n // Check for method calls\n if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n\n // Check for method calls on builtin objects like Math.floor()\n if (member.object.type === 'Identifier') {\n const objName = (member.object as Identifier).name\n if (BUILTIN_OBJECTS.has(objName) || UNSUPPORTED_BUILTINS.has(objName)) {\n return true\n }\n }\n\n // Check for instance method calls like str.toUpperCase()\n if (member.property.type === 'Identifier') {\n const methodName = (member.property as Identifier).name\n if (INSTANCE_METHODS.has(methodName)) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Check if a MemberExpression is accessing a builtin object (Math.PI, Number.MAX_VALUE, etc.)\n */\nfunction isBuiltinMemberAccess(expr: MemberExpression): boolean {\n if (expr.object.type === 'Identifier') {\n const objName = (expr.object as Identifier).name\n return BUILTIN_OBJECTS.has(objName) || UNSUPPORTED_BUILTINS.has(objName)\n }\n return false\n}\n\n// Error messages for unsupported builtins\nconst UNSUPPORTED_BUILTIN_MESSAGES: Record<string, string> = {\n RegExp: 'RegExp is not available. Use string methods or the regexMatch atom.',\n Promise: 'Promise is not needed. All operations are implicitly async.',\n Map: 'Map is not available. Use plain objects instead.',\n WeakSet: 'WeakSet is not available.',\n WeakMap: 'WeakMap is not available.',\n Symbol: 'Symbol is not available.',\n Proxy: 'Proxy is not available.',\n Reflect: 'Reflect is not available.',\n Function: 'Function constructor is not available. Define functions normally.',\n eval: 'eval is not available. Code is compiled, not evaluated.',\n setTimeout: 'setTimeout is not available. Use the delay atom.',\n setInterval: 'setInterval is not available. Use while loops with delay.',\n fetch: 'fetch is not available. Use the httpFetch atom.',\n require: 'require is not available. Atoms must be registered with the VM.',\n import: 'import is not available. Atoms must be registered with the VM.',\n process: 'process is not available. AsyncJS runs in a sandboxed environment.',\n window: 'window is not available. AsyncJS runs in a sandboxed environment.',\n document:\n 'document is not available. AsyncJS runs in a sandboxed environment.',\n global: 'global is not available. AsyncJS runs in a sandboxed environment.',\n globalThis: 'globalThis is not available. Use builtins directly.',\n}\n\n/**\n * Check if expression uses an unsupported builtin and return error message if so\n */\nfunction getUnsupportedBuiltinError(expr: CallExpression): string | null {\n if (expr.callee.type === 'Identifier') {\n const name = (expr.callee as Identifier).name\n if (UNSUPPORTED_BUILTINS.has(name)) {\n return (\n UNSUPPORTED_BUILTIN_MESSAGES[name] ||\n `${name} is not available in AsyncJS.`\n )\n }\n }\n\n if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n if (member.object.type === 'Identifier') {\n const objName = (member.object as Identifier).name\n if (UNSUPPORTED_BUILTINS.has(objName)) {\n return (\n UNSUPPORTED_BUILTIN_MESSAGES[objName] ||\n `${objName} is not available in AsyncJS.`\n )\n }\n }\n }\n\n return null\n}\n\n/**\n * Get helpful suggestion for 'new' expression alternatives\n */\nfunction getNewExpressionSuggestion(constructorName: string): string {\n const suggestions: Record<string, string> = {\n Date: \" Use Date() or Date('2024-01-15') instead - no 'new' needed.\",\n Set: \" Use Set([items]) instead - no 'new' needed.\",\n Map: ' Use plain objects instead of Map.',\n Array: ' Use array literals like [1, 2, 3] instead.',\n Object: ' Use object literals like { key: value } instead.',\n Error: \" Return an error object like { error: 'message' } instead.\",\n RegExp: ' Use string methods or the regexMatch atom.',\n Promise: ' Not needed - all operations are implicitly async.',\n WeakSet: ' WeakSet is not available.',\n WeakMap: ' WeakMap is not available.',\n }\n return (\n suggestions[constructorName] ||\n ' Use factory functions or object literals instead.'\n )\n}\n\n/**\n * Transform an expression, potentially into a step with a result variable\n */\nfunction transformExpressionToStep(\n expr: Expression,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode | null; resultVar: any } {\n const varOp = isConst ? 'constSet' : 'varSet'\n\n // Unwrap ChainExpression (optional chaining wrapper)\n if (expr.type === 'ChainExpression') {\n const chain = expr as any\n // The inner expression has optional: true on the relevant nodes\n // Just recurse with the unwrapped expression\n return transformExpressionToStep(\n chain.expression as Expression,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Check for 'new' keyword - not supported in AsyncJS\n if (expr.type === 'NewExpression') {\n const newExpr = expr as any\n let constructorName = 'constructor'\n if (newExpr.callee.type === 'Identifier') {\n constructorName = newExpr.callee.name\n }\n const suggestion = getNewExpressionSuggestion(constructorName)\n throw new TranspileError(\n `The 'new' keyword is not supported in AsyncJS.${suggestion}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n // Check for unsupported builtins first and give helpful error\n if (expr.type === 'CallExpression') {\n const unsupportedError = getUnsupportedBuiltinError(expr as CallExpression)\n if (unsupportedError) {\n throw new TranspileError(\n unsupportedError,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n }\n\n // Check if this is a builtin call (Math.floor, JSON.parse, parseInt, etc.)\n // Builtins are evaluated as expressions, not atom calls\n if (expr.type === 'CallExpression' && isBuiltinCall(expr as CallExpression)) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n return { step: null, resultVar: exprNode as any }\n }\n\n // Check if this is a builtin member access (Math.PI, Number.MAX_SAFE_INTEGER, etc.)\n if (\n expr.type === 'MemberExpression' &&\n isBuiltinMemberAccess(expr as MemberExpression)\n ) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n return { step: null, resultVar: exprNode as any }\n }\n\n // Function call -> atom invocation\n if (expr.type === 'CallExpression') {\n return transformCallExpression(\n expr as CallExpression,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Template literal -> template atom\n if (expr.type === 'TemplateLiteral') {\n return transformTemplateLiteral(\n expr as TemplateLiteral,\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Binary/logical/unary expression - convert to ExprNode\n if (\n expr.type === 'BinaryExpression' ||\n expr.type === 'LogicalExpression' ||\n expr.type === 'UnaryExpression'\n ) {\n const exprNode = expressionToExprNode(expr, ctx)\n\n // If we need to store the result, emit a varSet/constSet with the expression node as value\n if (resultVar) {\n return {\n step: {\n op: varOp,\n key: resultVar,\n value: exprNode,\n },\n resultVar,\n }\n }\n\n // No storage needed, just return the expression node as the result\n return { step: null, resultVar: exprNode as any }\n }\n\n // Simple value - no step needed\n const value = expressionToValue(expr, ctx)\n return { step: null, resultVar: value }\n}\n\n/**\n * Transform a function call expression\n */\nfunction transformCallExpression(\n expr: CallExpression,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n // Get the function name\n let funcName: string\n let isMethodCall = false\n let receiver: any\n\n if (expr.callee.type === 'Identifier') {\n funcName = (expr.callee as Identifier).name\n } else if (expr.callee.type === 'MemberExpression') {\n const member = expr.callee as MemberExpression\n if (member.property.type === 'Identifier') {\n funcName = (member.property as Identifier).name\n isMethodCall = true\n receiver = expressionToValue(member.object as Expression, ctx)\n } else {\n throw new TranspileError(\n 'Computed method names are not supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n } else {\n throw new TranspileError(\n 'Only named function calls are supported',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n // Handle built-in method calls\n if (isMethodCall) {\n return transformMethodCall(\n funcName,\n receiver,\n expr.arguments as Expression[],\n ctx,\n resultVar,\n isConst\n )\n }\n\n // Handle console.log specially\n if (funcName === 'console' && expr.callee.type === 'MemberExpression') {\n // This would be caught above, but just in case\n }\n\n // Check if it's a known atom\n // For now, we assume any function call is an atom call\n // The VM will validate at runtime\n\n // Extract arguments\n const args = extractCallArguments(expr, ctx)\n\n return {\n step: {\n op: funcName,\n ...args,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Handle method calls like arr.map(), str.slice(), etc.\n */\nfunction transformMethodCall(\n method: string,\n receiver: any,\n args: Expression[],\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n switch (method) {\n case 'map':\n // arr.map(x => ...) -> map atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n let steps: BaseNode[]\n if (callback.body.type === 'BlockStatement') {\n steps = transformBlock(callback.body, childCtx)\n } else {\n // Expression body: x => x * 2\n const { step, resultVar: exprResult } = transformExpressionToStep(\n callback.body,\n childCtx,\n 'result'\n )\n steps = step\n ? [step]\n : [{ op: 'varSet', key: 'result', value: exprResult }]\n }\n\n return {\n step: {\n op: 'map',\n items: receiver,\n as: paramName,\n steps,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'filter':\n // arr.filter(x => condition) -> filter atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n // For filter, the callback should return a boolean expression\n // Convert the body to an ExprNode\n let condition: any\n if (callback.body.type === 'BlockStatement') {\n // Block body - look for return statement\n throw new TranspileError(\n 'filter callback must be an expression, not a block',\n getLocation(args[0]),\n ctx.source,\n ctx.filename\n )\n } else {\n // Expression body: x => x > 5\n condition = expressionToExprNode(callback.body, childCtx)\n }\n\n return {\n step: {\n op: 'filter',\n items: receiver,\n as: paramName,\n condition,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'find':\n // arr.find(x => condition) -> find atom\n if (\n args.length > 0 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const param = callback.params[0]\n const paramName = param?.type === 'Identifier' ? param.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(paramName, { kind: 'any' })\n\n let condition: any\n if (callback.body.type === 'BlockStatement') {\n throw new TranspileError(\n 'find callback must be an expression, not a block',\n getLocation(args[0]),\n ctx.source,\n ctx.filename\n )\n } else {\n condition = expressionToExprNode(callback.body, childCtx)\n }\n\n return {\n step: {\n op: 'find',\n items: receiver,\n as: paramName,\n condition,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'reduce':\n // arr.reduce((acc, x) => expr, initial) -> reduce atom\n if (\n args.length >= 2 &&\n (args[0].type === 'ArrowFunctionExpression' ||\n args[0].type === 'FunctionExpression')\n ) {\n const callback = args[0] as any\n const accParam = callback.params[0]\n const itemParam = callback.params[1]\n const accName = accParam?.type === 'Identifier' ? accParam.name : 'acc'\n const itemName =\n itemParam?.type === 'Identifier' ? itemParam.name : 'item'\n\n const childCtx = createChildContext(ctx)\n childCtx.locals.set(accName, { kind: 'any' })\n childCtx.locals.set(itemName, { kind: 'any' })\n\n let steps: BaseNode[]\n if (callback.body.type === 'BlockStatement') {\n steps = transformBlock(callback.body, childCtx)\n } else {\n // Expression body: (acc, x) => acc + x\n const { step, resultVar: exprResult } = transformExpressionToStep(\n callback.body,\n childCtx,\n 'result'\n )\n steps = step\n ? [step]\n : [{ op: 'varSet', key: 'result', value: exprResult }]\n }\n\n const initial = expressionToValue(args[1], ctx)\n\n return {\n step: {\n op: 'reduce',\n items: receiver,\n as: itemName,\n accumulator: accName,\n initial,\n steps,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n break\n\n case 'slice':\n // TODO: Could map to a slice atom\n break\n\n case 'push':\n return {\n step: {\n op: 'push',\n list: receiver,\n item: expressionToValue(args[0], ctx),\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n\n case 'join':\n return {\n step: {\n op: 'join',\n list: receiver,\n sep: args.length > 0 ? expressionToValue(args[0], ctx) : '',\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n\n case 'split':\n return {\n step: {\n op: 'split',\n str: receiver,\n sep: args.length > 0 ? expressionToValue(args[0], ctx) : '',\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n }\n\n // Unknown method - emit warning and try as generic call\n ctx.warnings.push({\n message: `Unknown method '${method}' - treating as atom call`,\n line: 0,\n column: 0,\n })\n\n return {\n step: {\n op: method,\n receiver,\n args: args.map((a) => expressionToValue(a, ctx)),\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Transform template literal\n */\nfunction transformTemplateLiteral(\n expr: TemplateLiteral,\n ctx: TransformContext,\n resultVar?: string,\n isConst?: boolean\n): { step: BaseNode; resultVar: string | undefined } {\n // Build template string with {{var}} placeholders\n let tmpl = ''\n const vars: Record<string, any> = {}\n\n for (let i = 0; i < expr.quasis.length; i++) {\n tmpl += expr.quasis[i].value.cooked || expr.quasis[i].value.raw\n\n if (i < expr.expressions.length) {\n const exprNode = expr.expressions[i]\n const varName = `_${i}`\n vars[varName] = expressionToValue(exprNode as Expression, ctx)\n tmpl += `{{${varName}}}`\n }\n }\n\n return {\n step: {\n op: 'template',\n tmpl,\n vars,\n ...(resultVar && { result: resultVar }),\n ...(resultVar && isConst && { resultConst: true }),\n },\n resultVar,\n }\n}\n\n/**\n * Convert an Acorn expression to an ExprNode for direct VM evaluation.\n * This replaces the string-based condition system.\n */\nfunction expressionToExprNode(\n expr: Expression,\n ctx: TransformContext\n): ExprNode {\n switch (expr.type) {\n case 'Literal': {\n const lit = expr as Literal\n return { $expr: 'literal', value: lit.value }\n }\n\n case 'Identifier': {\n const id = expr as Identifier\n return { $expr: 'ident', name: id.name }\n }\n\n case 'MemberExpression': {\n const mem = expr as MemberExpression\n const obj = expressionToExprNode(mem.object as Expression, ctx)\n const isOptional = (mem as any).optional === true\n\n if (mem.computed) {\n // arr[0] or obj[key] - computed access\n // For now, only support literal indices\n const prop = mem.property as Expression\n if (prop.type === 'Literal') {\n return {\n $expr: 'member',\n object: obj,\n property: String((prop as Literal).value),\n computed: true,\n ...(isOptional && { optional: true }),\n }\n }\n // Computed with expression (e.g. arr[i]) \u2014 emit as member with expr property\n return {\n $expr: 'member',\n object: obj,\n property: expressionToExprNode(prop, ctx),\n computed: true,\n ...(isOptional && { optional: true }),\n }\n }\n\n const propName = (mem.property as Identifier).name\n return {\n $expr: 'member',\n object: obj,\n property: propName,\n ...(isOptional && { optional: true }),\n }\n }\n\n case 'ChainExpression': {\n // ChainExpression wraps optional chaining (?.)\n // Just unwrap to the inner expression which will have optional: true\n const chain = expr as any\n return expressionToExprNode(chain.expression as Expression, ctx)\n }\n\n case 'BinaryExpression': {\n const bin = expr as BinaryExpression\n return {\n $expr: 'binary',\n op: bin.operator,\n left: expressionToExprNode(bin.left as Expression, ctx),\n right: expressionToExprNode(bin.right as Expression, ctx),\n }\n }\n\n case 'LogicalExpression': {\n const log = expr as LogicalExpression\n return {\n $expr: 'logical',\n op: log.operator as '&&' | '||' | '??',\n left: expressionToExprNode(log.left as Expression, ctx),\n right: expressionToExprNode(log.right as Expression, ctx),\n }\n }\n\n case 'UnaryExpression': {\n const un = expr as any\n return {\n $expr: 'unary',\n op: un.operator,\n argument: expressionToExprNode(un.argument as Expression, ctx),\n }\n }\n\n case 'ConditionalExpression': {\n const cond = expr as any\n return {\n $expr: 'conditional',\n test: expressionToExprNode(cond.test as Expression, ctx),\n consequent: expressionToExprNode(cond.consequent as Expression, ctx),\n alternate: expressionToExprNode(cond.alternate as Expression, ctx),\n }\n }\n\n case 'ArrayExpression': {\n const arr = expr as ArrayExpression\n return {\n $expr: 'array',\n elements: arr.elements\n .filter((el): el is Expression => el !== null)\n .map((el) => expressionToExprNode(el, ctx)),\n }\n }\n\n case 'ObjectExpression': {\n const obj = expr as ObjectExpression\n const properties: { key: string; value: ExprNode }[] = []\n\n for (const prop of obj.properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n properties.push({\n key,\n value: expressionToExprNode(prop.value as Expression, ctx),\n })\n }\n }\n\n return { $expr: 'object', properties }\n }\n\n case 'CallExpression': {\n const call = expr as CallExpression\n\n // Handle method calls (e.g., Math.floor(x), str.toUpperCase(), arr.push(x))\n if (call.callee.type === 'MemberExpression') {\n const member = call.callee as MemberExpression\n const method =\n member.property.type === 'Identifier'\n ? (member.property as Identifier).name\n : String((member.property as Literal).value)\n\n // Check for optional chaining: obj?.method() or obj.method?.()\n const isOptional =\n (member as any).optional === true || (call as any).optional === true\n\n return {\n $expr: 'methodCall',\n object: expressionToExprNode(member.object as Expression, ctx),\n method,\n arguments: call.arguments.map((arg) =>\n expressionToExprNode(arg as Expression, ctx)\n ),\n ...(isOptional && { optional: true }),\n }\n }\n\n // Handle global function calls (e.g., parseInt(x), parseFloat(x))\n if (call.callee.type === 'Identifier') {\n const funcName = (call.callee as Identifier).name\n return {\n $expr: 'call',\n callee: funcName,\n arguments: call.arguments.map((arg) =>\n expressionToExprNode(arg as Expression, ctx)\n ),\n }\n }\n\n // Other call types not supported in expressions\n throw new TranspileError(\n 'Complex function calls in expressions should be lifted to statements',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n case 'NewExpression': {\n const newExpr = expr as any\n let constructorName = 'constructor'\n if (newExpr.callee.type === 'Identifier') {\n constructorName = newExpr.callee.name\n }\n const suggestion = getNewExpressionSuggestion(constructorName)\n throw new TranspileError(\n `The 'new' keyword is not supported in AsyncJS.${suggestion}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n\n case 'TemplateLiteral':\n throw new TranspileError(\n 'Template literals inside expressions are not supported. ' +\n 'Assign to a variable first: const msg = `hello ${name}`; then use msg',\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n\n default:\n throw new TranspileError(\n `Unsupported expression type in condition: ${expr.type}`,\n getLocation(expr),\n ctx.source,\n ctx.filename\n )\n }\n}\n\n// Note: extractCondition, expressionToConditionString, and extractVariablesFromExpression\n// have been removed. Use expressionToExprNode instead - it converts Acorn AST directly\n// to ExprNode format, eliminating the need for JSEP string parsing at runtime.\n\n/**\n * Convert an expression to a runtime value (for varSet, etc.)\n */\nfunction expressionToValue(expr: Expression, ctx: TransformContext): any {\n switch (expr.type) {\n case 'Literal':\n return (expr as Literal).value\n\n case 'Identifier': {\n const name = (expr as Identifier).name\n // Parameters are imported into state via varsImport at function start,\n // so we reference them as state variables (just the name string)\n // No need for $kind: 'arg' since args are copied to state\n return name\n }\n\n case 'MemberExpression': {\n const mem = expr as MemberExpression\n const isOptional = (mem as any).optional === true\n\n // If optional chaining, we need an ExprNode for proper runtime handling\n if (isOptional) {\n return expressionToExprNode(expr, ctx)\n }\n\n const objValue = expressionToValue(mem.object as Expression, ctx)\n\n // If the object resolved to an ExprNode (e.g., from nested optional chaining),\n // we need to build an ExprNode for this access too\n if (objValue && typeof objValue === 'object' && objValue.$expr) {\n const prop = mem.computed\n ? String((mem.property as Literal).value)\n : (mem.property as Identifier).name\n return {\n $expr: 'member',\n object: objValue,\n property: prop,\n ...(mem.computed && { computed: true }),\n }\n }\n\n if (mem.computed) {\n // Computed member (arr[i] or arr[0]) \u2014 always emit as $expr node so the\n // runtime evaluates the index rather than treating it as a string path.\n return expressionToExprNode(expr, ctx)\n }\n\n const prop = (mem.property as Identifier).name\n\n // If objValue is a string path, extend it\n if (typeof objValue === 'string') {\n return `${objValue}.${prop}`\n }\n\n // If objValue is an arg ref, extend the path\n if (objValue && objValue.$kind === 'arg') {\n return { $kind: 'arg', path: `${objValue.path}.${prop}` }\n }\n\n return `${objValue}.${prop}`\n }\n\n case 'ChainExpression': {\n // Unwrap ChainExpression and process the inner expression\n const chain = expr as any\n return expressionToValue(chain.expression as Expression, ctx)\n }\n\n case 'ArrayExpression':\n return (expr as ArrayExpression).elements.map((el) =>\n el ? expressionToValue(el as Expression, ctx) : null\n )\n\n case 'ObjectExpression': {\n const result: Record<string, any> = {}\n for (const prop of (expr as ObjectExpression).properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n result[key] = expressionToValue(prop.value as Expression, ctx)\n }\n }\n return result\n }\n\n case 'TemplateLiteral':\n // Template literals need runtime evaluation - convert to ExprNode\n // This will throw a helpful error explaining the limitation\n return expressionToExprNode(expr, ctx)\n\n case 'CallExpression':\n // Method calls like s.toArray() used as values need to be ExprNodes\n return expressionToExprNode(expr, ctx)\n\n case 'BinaryExpression':\n case 'LogicalExpression':\n case 'UnaryExpression':\n case 'ConditionalExpression':\n // Complex expressions need to be ExprNodes for runtime evaluation\n return expressionToExprNode(expr, ctx)\n\n default:\n return null\n }\n}\n\n/**\n * Extract call arguments from a call expression\n */\nfunction extractCallArguments(\n expr: CallExpression,\n ctx: TransformContext\n): Record<string, any> {\n // If single object argument, spread it\n if (\n expr.arguments.length === 1 &&\n expr.arguments[0].type === 'ObjectExpression'\n ) {\n const obj = expr.arguments[0] as ObjectExpression\n const result: Record<string, any> = {}\n\n for (const prop of obj.properties) {\n if (prop.type === 'Property') {\n const key =\n prop.key.type === 'Identifier'\n ? (prop.key as Identifier).name\n : String((prop.key as Literal).value)\n result[key] = expressionToValue(prop.value as Expression, ctx)\n }\n }\n\n return result\n }\n\n // Otherwise, use positional args\n return {\n args: expr.arguments.map((arg) =>\n expressionToValue(arg as Expression, ctx)\n ),\n }\n}\n", "/**\n * TJS to JavaScript Emitter\n *\n * Transforms TJS source into standard JavaScript with runtime type metadata.\n * Unlike the AST emitter (for AgentJS), this outputs executable JS code.\n *\n * Input:\n * function greet(name: 'world'): '' {\n * return `Hello, ${name}!`\n * }\n *\n * Output:\n * function greet(name = 'world') {\n * return `Hello, ${name}!`\n * }\n * greet.__tjs = {\n * params: { name: { type: 'string', required: true, example: 'world' } },\n * returns: { type: 'string' }\n * }\n *\n * TODO: Self-contained output (no runtime dependency)\n * =====================================================\n * Currently, transpiled code references `globalThis.__tjs` for:\n * - __tjs.pushStack() / popStack() - debug stack traces\n * - __tjs.typeError() - monadic error creation\n * - __tjs.Is() / IsNot() - structural equality (when == / != used)\n *\n * This requires either:\n * 1. The runtime to be installed via installRuntime()\n * 2. A stub to be provided (e.g., playground's inline stub)\n *\n * The ideal is that TJS produces completely independent code that only needs\n * things it semantically needs (like fetch for HTTP calls). The runtime\n * functions above are ~30 lines and could be inlined when used:\n *\n * - typeError: Create a simple Error with extra properties\n * - pushStack/popStack: Could be no-ops in production, or inline array ops\n * - Is/IsNot: ~20 lines for deep structural equality\n *\n * Options to explore:\n * 1. Inline minimal runtime when needed (adds ~1KB unminified per output)\n * 2. Add transpile option: { standalone: true } to emit self-contained code\n * 3. Tree-shake: only inline the specific functions actually referenced\n *\n * See also: demo/src/tjs-playground.ts which has a manual __tjs stub that\n * must stay in sync with the runtime - a symptom of this leaky abstraction.\n */\n\nimport type { FunctionDeclaration, Program } from 'acorn'\nimport { parseExpressionAt } from 'acorn'\nimport {\n parse,\n extractTDoc,\n preprocess,\n transformExtensionCalls,\n stripLineComments,\n} from '../parser'\nimport {\n transformEqualityToStructural,\n transformIsOperators,\n} from '../parser-transforms'\nimport type { TypeDescriptor, ParameterDescriptor } from '../types'\nimport { inferTypeFromValue, parseParameter } from '../inference'\nimport { extractTests } from '../tests'\nimport {\n runAllTests,\n extractSignatureTestInfos,\n extractReturnExampleFromSource,\n} from './js-tests'\nexport { stripModuleSyntax, stripTjsPreamble } from './js-tests'\nimport { generateWasmBootstrap } from './js-wasm'\nimport {\n rewriteBoolCoercion,\n rewriteBoolCoercionInSource,\n} from '../bool-coercion'\n\nexport interface TJSTranspileOptions {\n /** Filename for error messages */\n filename?: string\n /** Include source map comment */\n sourceMap?: boolean\n /** Mode: 'dev' | 'strict' | 'production' */\n mode?: 'dev' | 'strict' | 'production'\n /**\n * Test execution mode:\n * - true (default): run tests at transpile time, throw on failure\n * - false: skip tests entirely (production build)\n * - 'only': only run tests, don't emit code (CI/test runner)\n * - 'report': run tests, report results in testResults, don't throw\n * (caller decides whether to use the code based on results)\n */\n runTests?: boolean | 'only' | 'report'\n /**\n * Debug mode: include source locations in __tjs metadata\n * Enables better error messages with file:line:column info\n */\n debug?: boolean\n /**\n * Pre-resolved import code for test execution.\n * Map of import specifier to compiled JavaScript code.\n * Used when tests depend on imported modules.\n */\n resolvedImports?: Record<string, string>\n}\n\n/** Result of running tests at transpile time */\nexport type { TestResult } from './js-tests'\nimport type { TestResult } from './js-tests'\n\nexport interface TJSTranspileResult {\n /** The transpiled JavaScript code */\n code: string\n /** Type information for the function(s) - Record of function name to type info */\n types: Record<string, TJSTypeInfo>\n /** Function metadata (alias for types, used by runtime) */\n metadata: Record<string, TJSTypeInfo>\n /** Any warnings during transpilation */\n warnings?: string[]\n /** Generated test runner code (if tests were present) - DEPRECATED, tests now run at transpile time */\n testRunner?: string\n /** Number of tests extracted */\n testCount?: number\n /** Test results (when runTests is true or 'only') */\n testResults?: TestResult[]\n /** WASM compilation results (for debugging/inspection) */\n wasmCompiled?: {\n id: string\n success: boolean\n error?: string\n byteLength?: number\n }[]\n}\n\nexport interface TJSTypeInfo {\n /** Function name */\n name: string\n /** Parameter types */\n params: Record<string, ParameterDescriptor>\n /** Return type */\n returns?: TypeDescriptor\n /** TDoc description */\n description?: string\n /** True if function uses destructured object param (the fast path) */\n isDestructuredParam?: boolean\n /** The shape of the destructured param (for inline validation) */\n destructuredShape?: Record<string, TypeDescriptor>\n /** Which fields in destructuredShape are required */\n destructuredRequired?: Set<string>\n}\n\n/**\n * Check if a param used `:` (required) or `=` (optional) in the raw source.\n * Finds the function's param list by name, then looks for `paramName:` vs `paramName =`.\n */\nfunction isParamRequiredInSource(\n source: string,\n funcName: string,\n paramName: string\n): boolean {\n if (!source || !funcName) return false\n // Find the function declaration and its param list\n const funcPattern = new RegExp(\n `function\\\\s+${funcName}\\\\s*\\\\([^)]*?\\\\b${paramName}\\\\s*([=:])`,\n 's'\n )\n const match = source.match(funcPattern)\n if (!match) return false\n return match[1] === ':'\n}\n\n/**\n * Extract type info for a single function declaration\n */\nfunction extractFunctionTypeInfo(\n func: FunctionDeclaration,\n originalSource: string,\n requiredParams: Set<string>,\n returnTypeStr: string | null,\n inputSource?: string\n): { types: TJSTypeInfo; warnings: string[] } {\n const warnings: string[] = []\n\n // Extract TDoc (/*# ... */) comments\n const tdoc = extractTDoc(originalSource, func)\n\n // Build parameter type info\n const params: Record<string, ParameterDescriptor> = {}\n let isDestructuredParam = false\n let destructuredShape: Record<string, TypeDescriptor> | undefined\n let destructuredRequired: Set<string> | undefined\n\n // Check if this is a single destructured object param (the fast path)\n if (\n func.params.length === 1 &&\n (func.params[0].type === 'ObjectPattern' ||\n (func.params[0].type === 'AssignmentPattern' &&\n func.params[0].left.type === 'ObjectPattern'))\n ) {\n isDestructuredParam = true\n const param = func.params[0]\n const objectPattern =\n param.type === 'ObjectPattern' ? param : (param as any).left\n\n const paramInfo = parseParameter(objectPattern, requiredParams)\n if (paramInfo.type.kind === 'object' && paramInfo.type.destructuredParams) {\n destructuredShape = {}\n destructuredRequired = new Set()\n\n // Build shape and track required fields\n for (const [key, descriptor] of Object.entries(\n paramInfo.type.destructuredParams\n )) {\n params[key] = {\n ...descriptor,\n description: tdoc.params[key],\n }\n destructuredShape[key] = descriptor.type\n if (descriptor.required) {\n destructuredRequired.add(key)\n }\n }\n }\n } else {\n // Traditional param handling (multiple params or non-destructured)\n for (const param of func.params) {\n if (param.type === 'Identifier') {\n const paramInfo = parseParameter(param, requiredParams)\n params[param.name] = {\n ...paramInfo,\n required: requiredParams.has(param.name),\n description: tdoc.params[param.name],\n }\n } else if (\n param.type === 'AssignmentPattern' &&\n param.left.type === 'Identifier'\n ) {\n const paramInfo = parseParameter(param, requiredParams)\n // Determine if this param used `:` (required) or `=` (optional).\n // The global requiredParams set is name-based, which fails when\n // two functions share a param name with different syntax.\n // Use the raw input source to check the actual syntax.\n const isRequired = isParamRequiredInSource(\n inputSource || '',\n func.id?.name || '',\n param.left.name\n )\n params[param.left.name] = {\n ...paramInfo,\n required: isRequired,\n default: isRequired ? null : paramInfo.example ?? paramInfo.default,\n description: tdoc.params[param.left.name],\n }\n } else if (param.type === 'ObjectPattern') {\n // Handle destructured object parameters (non-single case)\n const paramInfo = parseParameter(param, requiredParams)\n if (\n paramInfo.type.kind === 'object' &&\n paramInfo.type.destructuredParams\n ) {\n for (const [key, descriptor] of Object.entries(\n paramInfo.type.destructuredParams\n )) {\n params[key] = {\n ...descriptor,\n description: tdoc.params[key],\n }\n }\n }\n } else if (\n param.type === 'RestElement' &&\n param.argument?.type === 'Identifier'\n ) {\n // Handle rest parameters: ...args: [0]\n // The type annotation was stripped by preprocessing (JS forbids\n // defaults on rest params), so extract it from the original source\n const restName = param.argument.name\n const restTypeMatch = originalSource.match(\n new RegExp(`\\\\.\\\\.\\\\.${restName}\\\\s*:\\\\s*([^)]+?)\\\\s*\\\\)`)\n )\n if (restTypeMatch) {\n try {\n const typeExpr = parseExpressionAt(restTypeMatch[1].trim(), 0, {\n ecmaVersion: 2022,\n })\n const restItemType = inferTypeFromValue(typeExpr as any)\n params[restName] = {\n name: restName,\n type: restItemType,\n required: false,\n description: tdoc.params[restName],\n }\n } catch {\n // If we can't parse the type, emit as any array\n params[restName] = {\n name: restName,\n type: { kind: 'array' },\n required: false,\n description: tdoc.params[restName],\n }\n }\n } else {\n // No type annotation \u2014 bare rest param\n params[restName] = {\n name: restName,\n type: { kind: 'array' },\n required: false,\n description: tdoc.params[restName],\n }\n }\n }\n }\n }\n\n // Parse return type if present\n let returns: TypeDescriptor | undefined\n if (returnTypeStr) {\n try {\n // Transform `key = value` (default keys) to `key: value` for acorn parsing\n const parsableReturnStr = returnTypeStr.includes('=')\n ? transformReturnDefaults(returnTypeStr)\n : returnTypeStr\n const returnExpr = parseExpressionAt(parsableReturnStr, 0, {\n ecmaVersion: 2022,\n })\n returns = inferTypeFromValue(returnExpr as any)\n } catch {\n // If we can't parse the return type, just store it as-is\n returns = { kind: 'any' }\n warnings.push(`Could not parse return type: ${returnTypeStr}`)\n }\n }\n\n // Build type info object\n const types: TJSTypeInfo = {\n name: func.id?.name || 'anonymous',\n params,\n returns,\n description: tdoc.description,\n isDestructuredParam,\n destructuredShape,\n destructuredRequired,\n }\n\n return { types, warnings }\n}\n\n/**\n * Generate inline validation code to be inserted at the start of a function body\n *\n * Implements proper monadic error handling:\n * 1. Check if any param is an Error - if so, pass it through (no work)\n * 2. Check types with fast inline typeof checks\n * 3. On type mismatch, call __tjs.typeError() (only on error path)\n *\n * @param funcName - Function name for error paths\n * @param types - Type information for the function\n * @param source - Source location (e.g., \"src/utils.ts:42\") for error reporting\n */\nfunction generateInlineValidationCode(\n funcName: string,\n types: TJSTypeInfo,\n source?: string\n): { preamble: string; suffix: string } | null {\n const lines: string[] = []\n // Include source in path if available: \"src/file.ts:42:funcName.param\"\n const pathPrefix = source ? `${source}:` : ''\n const stackEntry = source ? `${source}:${funcName}` : funcName\n\n // Destructured params: validate each field of the input object\n if (types.isDestructuredParam && types.destructuredShape) {\n const shape = types.destructuredShape\n const requiredFields = types.destructuredRequired || new Set()\n const fieldNames = Object.keys(shape)\n\n if (fieldNames.length === 0) return null\n\n // 1. Error pass-through: check if any field is an Error\n for (const fieldName of fieldNames) {\n lines.push(`if (${fieldName} instanceof Error) return ${fieldName};`)\n }\n\n // 2. Type checks with proper error emission\n for (const [fieldName, fieldType] of Object.entries(shape)) {\n const isRequired = requiredFields.has(fieldName)\n const path = `${pathPrefix}${funcName}.${fieldName}`\n const typeCheck = generateTypeCheckExpr(fieldName, fieldType)\n\n if (typeCheck) {\n const expectedType = fieldType.kind\n if (isRequired) {\n lines.push(\n `if (${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${fieldName});`\n )\n } else {\n lines.push(\n `if (${fieldName} !== undefined && ${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${fieldName});`\n )\n }\n }\n }\n\n if (lines.length === 0) return null\n\n // pushStack is a no-op unless callStacks/debug is enabled at runtime.\n // No try/finally needed \u2014 the ring buffer tolerates missed popStack.\n lines.unshift(`__tjs.pushStack('${stackEntry}');`)\n\n return {\n preamble: lines.join('\\n '),\n suffix: '__tjs.popStack();',\n }\n }\n\n // Positional params: validate each param\n const params = Object.entries(types.params)\n if (params.length === 0) return null\n\n // 1. Error pass-through: check if any param is an Error\n for (const [paramName] of params) {\n lines.push(`if (${paramName} instanceof Error) return ${paramName};`)\n }\n\n // 2. Type checks with proper error emission\n for (const [paramName, param] of params) {\n const path = `${pathPrefix}${funcName}.${paramName}`\n\n // For array params: if the array contains a MonadicError, propagate\n // the first one we find instead of failing the type check with\n // \"expected array, got X\". This is the \"errors propagate, not\n // accumulate\" rule \u2014 a function receiving an array of values where\n // one is an error should surface that error, not say the array's\n // shape is wrong.\n if (param.type.kind === 'array') {\n lines.push(\n `if (Array.isArray(${paramName})) { for (const __i of ${paramName}) { if (__i instanceof Error && __i.path !== undefined) return __i } }`\n )\n }\n\n const typeCheck = generateTypeCheckExpr(paramName, param.type)\n\n if (typeCheck) {\n const expectedType =\n param.type.kind === 'union'\n ? (param.type as any).members.map((m: any) => m.kind).join(' | ')\n : param.type.kind\n if (param.required) {\n lines.push(\n `if (${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${paramName});`\n )\n } else {\n lines.push(\n `if (${paramName} !== undefined && ${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${paramName});`\n )\n }\n }\n\n // If the param is a function with declared shape (e.g. `fn = (x: 0) => 0`),\n // wrap it so its arguments and return value are validated on every call.\n // Skipped when shape is unspecified or contains non-simple kinds.\n if (param.type.kind === 'function') {\n const shapeCheck = generateFunctionShapeCheck(paramName, param.type, path)\n if (shapeCheck) {\n lines.push(shapeCheck)\n // checkFnShape returns either the function unchanged or a\n // MonadicError. Re-check Error propagation after the assignment.\n lines.push(`if (${paramName} instanceof Error) return ${paramName};`)\n }\n }\n }\n\n if (lines.length === 0) return null\n\n // pushStack is a no-op unless callStacks/debug is enabled at runtime.\n // No try/finally needed \u2014 the ring buffer tolerates missed popStack.\n lines.unshift(`__tjs.pushStack('${stackEntry}');`)\n\n return {\n preamble: lines.join('\\n '),\n suffix: '__tjs.popStack();',\n }\n}\n\n/**\n * Transform `key = value` to `key: value` in a return type string\n * so acorn can parse it as a valid JS object expression.\n */\nfunction transformReturnDefaults(str: string): string {\n let result = ''\n let depth = 0\n\n for (let i = 0; i < str.length; i++) {\n const ch = str[i]\n if (ch === '{' || ch === '[' || ch === '(') {\n depth++\n result += ch\n } else if (ch === '}' || ch === ']' || ch === ')') {\n depth--\n result += ch\n } else if (ch === \"'\" || ch === '\"' || ch === '`') {\n result += ch\n i++\n while (i < str.length && str[i] !== ch) {\n if (str[i] === '\\\\') result += str[i++]\n result += str[i++]\n }\n if (i < str.length) result += str[i]\n } else if (\n depth === 1 &&\n ch === '=' &&\n str[i - 1] !== '!' &&\n str[i + 1] !== '='\n ) {\n // Top-level = that isn't != or == \u2014 replace with :\n result += ':'\n } else {\n result += ch\n }\n }\n\n return result\n}\n\n/**\n * Extract the return type string for a specific function from source\n * Returns null if no return type found\n */\nfunction extractFunctionReturnType(\n source: string,\n funcName: string\n): string | null {\n // Match: function funcName(params): returnExample {\n // or: function funcName(params):? returnExample {\n // or: function funcName(params):! returnExample {\n const regex = new RegExp(\n `function\\\\s+${funcName}\\\\s*\\\\([^)]*\\\\)\\\\s*(:[?!]?)\\\\s*`,\n 'g'\n )\n const match = regex.exec(source)\n if (!match) return null\n\n const afterMarker = source.slice(match.index + match[0].length)\n return extractReturnExampleFromSource(afterMarker)\n}\n\n/**\n * Extract return safety marker for a specific function from source\n * Returns 'safe' for :?, 'unsafe' for :!, undefined for : or no marker\n */\nfunction extractFunctionReturnSafety(\n source: string,\n funcName: string\n): 'safe' | 'unsafe' | undefined {\n const regex = new RegExp(\n `function\\\\s+${funcName}\\\\s*\\\\([^)]*\\\\)\\\\s*:([?!]?)`,\n 'g'\n )\n const match = regex.exec(source)\n if (!match) return undefined\n\n const marker = match[1]\n if (marker === '?') return 'safe'\n if (marker === '!') return 'unsafe'\n return undefined // : is the default, no special safety flag\n}\n\n/**\n * Extract source file annotation from TJS source\n * Looks for: /\u2605 tjs <- path/to/file.ts \u2605/ at the start (\u2605 = *)\n */\nfunction extractSourceFileAnnotation(source: string): string | undefined {\n const match = source.match(/^\\/\\*\\s*tjs\\s*<-\\s*([^*]+?)\\s*\\*\\//)\n return match ? match[1].trim() : undefined\n}\n\n/**\n * Extract line number annotation for a specific function\n * Looks for: /\u2605 line N \u2605/ immediately before the function declaration\n */\nfunction extractLineAnnotation(\n source: string,\n funcName: string\n): number | undefined {\n // Match: /* line N */ followed by function declaration\n // Allow for async, whitespace variations\n const regex = new RegExp(\n `\\\\/\\\\*\\\\s*line\\\\s+(\\\\d+)\\\\s*\\\\*\\\\/\\\\s*(?:async\\\\s+)?function\\\\s+${funcName}\\\\s*\\\\(`,\n 'm'\n )\n const match = source.match(regex)\n return match ? parseInt(match[1], 10) : undefined\n}\n\n/**\n * Transpile TJS source to JavaScript\n *\n * This function handles:\n * - Files with no functions (just statements/tests)\n * - Files with multiple functions\n * - Inline validation (no wrappers)\n * - __tjs metadata inserted immediately after each function\n */\nexport function transpileToJS(\n source: string,\n options: TJSTranspileOptions = {}\n): TJSTranspileResult {\n const {\n filename = '<source>',\n runTests = true,\n debug = false,\n resolvedImports = {},\n } = options\n const warnings: string[] = []\n\n // Strip single-line comments early \u2014 apostrophes in comments (e.g. \"don't\")\n // confuse brace matching in test extraction and other transforms\n source = stripLineComments(source)\n\n // Extract source file annotation if present (from TS transpilation)\n const sourceFileAnnotation = extractSourceFileAnnotation(source)\n const effectiveFilename = sourceFileAnnotation || filename\n\n // Extract test/mock blocks before parsing (they're not valid JS)\n const { code: cleanSource, tests, mocks, testRunner } = extractTests(source)\n\n // Parse the cleaned source (handles TJS syntax like x: 'type' and : ReturnType)\n const {\n ast: program,\n originalSource,\n requiredParams,\n unsafeFunctions,\n } = parse(cleanSource, {\n filename,\n colonShorthand: true,\n })\n\n // Find ALL functions in the program\n const functions = findAllFunctions(program)\n\n // Preprocess source (handles TJS syntax transformations)\n const preprocessed = preprocess(cleanSource)\n\n // Apply the same source-level equality transforms to extracted test/mock\n // bodies so they observe the module's TJS semantics (e.g. structural ==).\n // Test bodies are extracted as raw text before parse(), so they would\n // otherwise run with native JS == coercion regardless of TjsEquals mode.\n for (const t of tests) {\n t.body = transformIsOperators(t.body)\n if (preprocessed.tjsModes.tjsEquals) {\n t.body = transformEqualityToStructural(t.body)\n }\n if (preprocessed.tjsModes.tjsStandard) {\n t.body = rewriteBoolCoercionInSource(t.body)\n }\n }\n for (const m of mocks) {\n m.body = transformIsOperators(m.body)\n if (preprocessed.tjsModes.tjsEquals) {\n m.body = transformEqualityToStructural(m.body)\n }\n if (preprocessed.tjsModes.tjsStandard) {\n m.body = rewriteBoolCoercionInSource(m.body)\n }\n }\n\n // Build types map for all functions\n const allTypes: Record<string, TJSTypeInfo> = {}\n\n // Collect insertions: { position, text } to be applied in reverse order\n const insertions: { position: number; text: string }[] = []\n // Collect deletions for | union suffixes in param defaults\n // e.g. `x = false | undefined` -> `x = false` (the `| undefined` is type-only)\n const deletions: { start: number; end: number }[] = []\n\n // Process each function\n for (const func of functions) {\n const funcName = func.id?.name || 'anonymous'\n\n // Extract return type for this specific function from original source\n const returnTypeStr = extractFunctionReturnType(cleanSource, funcName)\n\n // Extract default values from return type (e.g. { value: 0, error = '' })\n let returnDefaults: Record<string, unknown> | undefined\n if (returnTypeStr && returnTypeStr.includes('=')) {\n try {\n const defaultsMatch = returnTypeStr.matchAll(/(\\w+)\\s*=\\s*/g)\n const transformed = transformReturnDefaults(returnTypeStr)\n const parsed = new Function(`return ${transformed}`)()\n const defaults: Record<string, unknown> = {}\n for (const m of defaultsMatch) {\n const key = m[1]\n if (key in parsed) defaults[key] = parsed[key]\n }\n if (Object.keys(defaults).length > 0) returnDefaults = defaults\n } catch {\n // If parsing fails, skip defaults\n }\n }\n\n // Extract type info for this function\n const { types, warnings: funcWarnings } = extractFunctionTypeInfo(\n func,\n originalSource,\n requiredParams,\n returnTypeStr,\n cleanSource\n )\n warnings.push(...funcWarnings)\n allTypes[funcName] = types\n\n // Cross-reference inference: when a parameter default is a bare\n // identifier referring to a previously-declared TJS function, use that\n // function's signature as the parameter's type. So\n //\n // function strLength(s: ''): 0 { ... }\n // function map(arr: [''], counter = strLength) { ... }\n //\n // makes `counter`'s type `(s: string) => integer` (instead of `any`),\n // which means the checkFnShape pass-time check fires when a wrong-\n // shape callback is passed at the call site.\n for (const param of func.params) {\n if (\n param.type === 'AssignmentPattern' &&\n param.left.type === 'Identifier' &&\n param.right.type === 'Identifier'\n ) {\n const localName = param.left.name\n const refName = (param.right as any).name as string\n const refInfo = allTypes[refName]\n if (refInfo && types.params[localName]) {\n const fnParams = Object.entries(refInfo.params).map(([n, p]) => ({\n name: n,\n type: p.type,\n }))\n const fnReturns =\n (refInfo as any).returns ?? ({ kind: 'any' } as TypeDescriptor)\n types.params[localName].type = {\n kind: 'function',\n params: fnParams,\n returns: fnReturns,\n }\n }\n }\n }\n\n // Clean up param defaults in the emitted JS.\n // After colon\u2192equals transform, `x: false | undefined` becomes\n // `x = false | undefined` in the parsed source.\n // - For required params (`:` syntax), strip the entire `= value` \u2014 there's\n // no JS default for required params, the value is a type annotation only.\n // - For union defaults, strip just the `| suffix` to avoid bitwise OR.\n for (const param of func.params) {\n if (param.type === 'AssignmentPattern') {\n const paramName =\n (param as any).left?.name || (param as any).left?.value\n const paramInfo = paramName ? types.params[paramName] : null\n\n if (paramInfo?.required && paramInfo.default === null) {\n // Required param \u2014 strip entire `= value` from JS output\n deletions.push({\n start: (param as any).left.end,\n end: (param as any).right.end,\n })\n } else {\n // Optional param with union \u2014 strip just the `| suffix`\n const right = (param as any).right\n if (right.type === 'BinaryExpression' && right.operator === '|') {\n deletions.push({ start: right.left.end, end: right.end })\n }\n }\n }\n }\n\n // Determine safety options\n // Module-level \"safety none\" makes ALL functions unsafe (no validation)\n const isUnsafe =\n preprocessed.moduleSafety === 'none' || unsafeFunctions.has(funcName)\n const isSafe = preprocessed.safeFunctions.has(funcName)\n // Extract return safety per-function from original source\n const returnSafety = extractFunctionReturnSafety(cleanSource, funcName)\n\n // Get source location - prefer line annotation from TS transpilation\n const annotatedLine = extractLineAnnotation(source, funcName)\n const funcLoc = {\n file: effectiveFilename,\n line: annotatedLine ?? func.loc?.start.line ?? 0,\n column: func.loc?.start.column ?? 0,\n }\n\n const safetyOptions = {\n unsafe: isUnsafe,\n safe: isSafe,\n returnSafety,\n }\n\n // Check if this is a polymorphic dispatcher\n const isPolymorphicDispatcher = preprocessed.polymorphicNames.has(funcName)\n\n // Generate __tjs metadata (to insert after function)\n let typeMetadata: string\n if (isPolymorphicDispatcher) {\n // Build composite metadata referencing variants\n const variantNames: string[] = []\n for (const f of functions) {\n const fn = f.id?.name || ''\n if (fn.startsWith(funcName + '$')) variantNames.push(fn)\n }\n const metadata: any = {\n polymorphic: true,\n variants: variantNames,\n }\n if (funcLoc) {\n metadata.source = `${funcLoc.file}:${funcLoc.line}`\n }\n typeMetadata = `${funcName}.__tjs = ${JSON.stringify(metadata, null, 2)}`\n } else {\n typeMetadata = generateTypeMetadata(funcName, types, safetyOptions, {\n debug,\n source: funcLoc,\n returnDefaults,\n })\n }\n\n // Queue insertion of __tjs after function closing brace\n insertions.push({\n position: func.end,\n text: `\\n${typeMetadata}`,\n })\n\n // Generate inline validation (to insert at start of function body)\n // Skip for unsafe functions and polymorphic dispatchers (they handle routing)\n if (!isUnsafe && !isPolymorphicDispatcher) {\n const sourceStr = `${funcLoc.file}:${funcLoc.line}`\n const validation = generateInlineValidationCode(\n funcName,\n types,\n sourceStr\n )\n if (validation && func.body && func.body.start !== undefined) {\n // Insert preamble right after the opening brace\n insertions.push({\n position: func.body.start + 1,\n text: `\\n ${validation.preamble}\\n`,\n })\n if (validation.suffix) {\n insertions.push({\n position: func.body.end - 1,\n text: `\\n ${validation.suffix}\\n`,\n })\n }\n }\n }\n }\n\n // Boolean coercion rewrite (TjsStandard). Rewrites every truthiness\n // context (`if`, `while`, `for`, `do/while`, `!`, `&&`, `||`, `?:`,\n // and `Boolean(x)` calls) to call `__tjs.toBool` so boxed primitives\n // unwrap before coercion. See src/lang/bool-coercion.ts.\n if (preprocessed.tjsModes.tjsStandard) {\n const boolPatches = rewriteBoolCoercion(program, preprocessed.source)\n for (const p of boolPatches) {\n deletions.push({ start: p.start, end: p.end })\n insertions.push({ position: p.start, text: p.newText })\n }\n }\n\n // Apply deletions first (reverse order to maintain offsets), then insertions.\n // Deletions strip | union suffixes from param defaults in the output JS.\n deletions.sort((a, b) => b.start - a.start)\n let code = preprocessed.source\n for (const { start, end } of deletions) {\n code = code.slice(0, start) + code.slice(end)\n }\n\n // Adjust insertion positions for any deletions that shifted offsets\n for (const ins of insertions) {\n let shift = 0\n for (const del of deletions) {\n if (del.start < ins.position) {\n shift += del.end - del.start\n }\n }\n ins.position -= shift\n }\n\n // Apply insertions in reverse position order\n insertions.sort((a, b) => b.position - a.position)\n for (const { position, text } of insertions) {\n code = code.slice(0, position) + text + code.slice(position)\n }\n\n // Add __tjs reference for monadic error handling and structural equality\n // Use createRuntime() for isolated state per-module\n const needsTypeError = code.includes('__tjs.typeError(')\n const needsStack = code.includes('__tjs.pushStack(')\n const needsIs = code.includes('Is(')\n const needsIsNot = code.includes('IsNot(')\n const needsEq = code.includes('Eq(')\n const needsNotEq = code.includes('NotEq(')\n const needsTypeOf = code.includes('TypeOf(')\n // Type system constructors (from Type/Generic/FunctionPredicate/Enum/Union declarations)\n const needsType = /\\bType\\(/.test(code)\n const needsGeneric = /\\bGeneric\\(/.test(code)\n const needsFunctionPredicate = /\\bFunctionPredicate\\(/.test(code)\n const needsEnum = /\\bEnum\\(/.test(code)\n const needsUnion = /\\bUnion\\(/.test(code)\n const needsBang = code.includes('__tjs.bang(')\n const needsToBool = code.includes('__tjs.toBool(')\n const needsCheckFnShape = code.includes('__tjs.checkFnShape(')\n const needsSafeEval = preprocessed.tjsModes.tjsSafeEval\n\n const needsRuntime =\n needsTypeError ||\n needsStack ||\n needsIs ||\n needsIsNot ||\n needsEq ||\n needsNotEq ||\n needsTypeOf ||\n needsType ||\n needsGeneric ||\n needsFunctionPredicate ||\n needsEnum ||\n needsUnion ||\n needsBang ||\n needsToBool ||\n needsCheckFnShape ||\n needsSafeEval\n\n if (needsRuntime) {\n // Build standalone preamble \u2014 emitted JS must work without any setup.\n // Use globalThis.__tjs if available (shared runtime), otherwise inline\n // a minimal self-contained runtime. Only includes functions actually used.\n const inlineParts: string[] = []\n\n // Core: MonadicError + typeError (needed by almost all validated functions)\n if (needsTypeError) {\n inlineParts.push(\n `class MonadicError extends Error{constructor(m,p,e,a,c,r){super(m);this.name='MonadicError';this.path=p;this.expected=e;this.actual=a;this.callStack=c;this.reason=r}}`,\n `function typeError(p,e,v,r){const a=v===null?'null':typeof v;const m=r?'Expected '+e+\" for '\"+p+\"': \"+r:'Expected '+e+\" for '\"+p+\"', got \"+a;const err=new MonadicError(m,p,e,a,undefined,r);const c=globalThis.__tjs?.getConfig?.();if(c?.logTypeErrors)console.error('[TJS TypeError] '+err.message);if(c?.throwTypeErrors)throw err;return err}`,\n `function isMonadicError(v){return v instanceof Error&&v.name==='MonadicError'&&'path' in v}`\n )\n }\n\n // Stack tracking\n if (needsStack) {\n inlineParts.push(\n `const __stack=[];function pushStack(n){__stack.push(n)}function popStack(){__stack.pop()}function getStack(){return[...__stack]}`\n )\n }\n\n // Eq/NotEq (honest equality)\n if (needsEq) {\n inlineParts.push(\n `function Eq(a,b){if(a instanceof String||a instanceof Number||a instanceof Boolean)a=a.valueOf();if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();if(a===b)return true;if(typeof a==='number'&&typeof b==='number'&&isNaN(a)&&isNaN(b))return true;if((a===null||a===undefined)&&(b===null||b===undefined))return true;return false}`\n )\n }\n if (needsNotEq) {\n inlineParts.push(`function NotEq(a,b){return!Eq(a,b)}`)\n }\n\n // TypeOf (honest typeof)\n if (needsTypeOf) {\n inlineParts.push(`function TypeOf(v){return v===null?'null':typeof v}`)\n }\n\n // Is/IsNot (structural equality)\n if (needsIs) {\n inlineParts.push(\n `const tjsEquals=Symbol.for('tjs.equals');function Is(a,b){if(a!=null&&typeof a==='object'&&typeof a[tjsEquals]==='function')return a[tjsEquals](b);if(b!=null&&typeof b==='object'&&typeof b[tjsEquals]==='function')return b[tjsEquals](a);if(a!=null&&typeof a==='object'&&typeof a.Equals==='function')return a.Equals(b);if(b!=null&&typeof b==='object'&&typeof b.Equals==='function')return b.Equals(a);if(a instanceof String||a instanceof Number||a instanceof Boolean)a=a.valueOf();if(b instanceof String||b instanceof Number||b instanceof Boolean)b=b.valueOf();if(a===b)return true;if(typeof a==='number'&&typeof b==='number'&&isNaN(a)&&isNaN(b))return true;if((a==null)&&(b==null))return true;if(a==null||b==null)return false;if(typeof a!==typeof b)return false;if(typeof a!=='object')return false;if(a instanceof Set&&b instanceof Set){if(a.size!==b.size)return false;for(const v of a)if(!b.has(v))return false;return true}if(a instanceof Map&&b instanceof Map){if(a.size!==b.size)return false;for(const[k,v]of a)if(!b.has(k)||!Is(v,b.get(k)))return false;return true}if(a instanceof Date&&b instanceof Date)return a.getTime()===b.getTime();if(a instanceof RegExp&&b instanceof RegExp)return a.toString()===b.toString();if(Array.isArray(a)&&Array.isArray(b)){if(a.length!==b.length)return false;return a.every((v,i)=>Is(v,b[i]))}if(Array.isArray(a)!==Array.isArray(b))return false;const ka=Object.keys(a),kb=Object.keys(b);if(ka.length!==kb.length)return false;return ka.every(k=>Is(a[k],b[k]))}`\n )\n }\n if (needsIsNot) {\n inlineParts.push(`function IsNot(a,b){return!Is(a,b)}`)\n }\n\n // Type system constructors \u2014 these need tosijs-schema for full\n // functionality but we provide a working fallback\n if (needsType) {\n inlineParts.push(\n `function Type(d,p,e){const t={description:d,__runtimeType:true};if(typeof p==='function'){t.check=p;t.default=e??null}else{const ex=e??p;t.default=ex;t.check=v=>{if(ex===null)return true;return typeof v===typeof ex}}return t}`\n )\n }\n if (needsGeneric) {\n inlineParts.push(\n `function Generic(tp,pred,d){const f=(...args)=>{const t={description:d||'generic',__runtimeType:true,check:v=>pred(v,...args)};return t};f.__runtimeType=true;f.description=d;return f}`\n )\n }\n if (needsFunctionPredicate) {\n inlineParts.push(\n `function FunctionPredicate(n,s,b){if(Array.isArray(s)&&b){const f=(...a)=>FunctionPredicate(n,b(...a));f.typeParamNames=s.map(p=>Array.isArray(p)?p[0]:p);f.description=n;f.__runtimeType=true;return f}const spec=typeof s==='function'?{}:s||{};return{description:n,params:spec.params||{},returns:spec.returns,returnContract:spec.returnContract||'assertReturns',check:v=>typeof v==='function',__runtimeType:true}}`\n )\n }\n if (needsEnum) {\n inlineParts.push(\n `function Enum(d,m){const vals=typeof m==='object'?Object.values(m):[];return{description:d,check:v=>vals.includes(v),values:vals,__runtimeType:true}}`\n )\n }\n if (needsUnion) {\n inlineParts.push(\n `function Union(d,...v){const vals=v.flat();return{description:d,check:x=>vals.includes(x),values:vals,__runtimeType:true}}`\n )\n }\n // toBool \u2014 honest truthiness (unwraps boxed primitives)\n if (needsToBool) {\n inlineParts.push(\n `function toBool(v){if(v instanceof Boolean||v instanceof Number||v instanceof String)return Boolean(v.valueOf());return Boolean(v)}`\n )\n }\n\n // checkFnShape \u2014 pass-time shape check for function-typed params\n if (needsCheckFnShape) {\n // checkFnShape depends on MonadicError; ensure it's inlined\n if (!needsTypeError) {\n inlineParts.push(\n `class MonadicError extends Error{constructor(m,p,e,a,c,r){super(m);this.name='MonadicError';this.path=p;this.expected=e;this.actual=a;this.callStack=c;this.reason=r}}`,\n `function typeError(p,e,v,r){const a=v===null?'null':typeof v;const m=r?'Expected '+e+\" for '\"+p+\"': \"+r:'Expected '+e+\" for '\"+p+\"', got \"+a;const err=new MonadicError(m,p,e,a,undefined,r);const c=globalThis.__tjs?.getConfig?.();if(c?.logTypeErrors)console.error('[TJS TypeError] '+err.message);if(c?.throwTypeErrors)throw err;return err}`,\n `function isMonadicError(v){return v instanceof Error&&v.name==='MonadicError'&&'path' in v}`\n )\n }\n inlineParts.push(\n `function checkFnShape(fn,expectedParams,expectedReturn,path){if(typeof fn!=='function')return fn;const meta=fn.__tjs;if(!meta||!meta.params)return fn;const entries=Object.entries(meta.params);for(let i=0;i<expectedParams.length;i++){const e=expectedParams[i];if(e==='any')continue;const a=entries[i];if(!a)continue;const ak=a[1]&&a[1].type&&a[1].type.kind;if(!ak||ak==='any')continue;if(ak!==e)return new MonadicError(\"Expected (...arg\"+i+\": \"+e+\", ...) for '\"+path+\"', but callback declares arg\"+i+\" as \"+ak,path+\"(arg\"+i+\")\",e,ak)}if(expectedReturn!=='any'&&meta.returns){const ar=(meta.returns.type&&meta.returns.type.kind)||meta.returns.kind;if(ar&&ar!=='any'&&ar!==expectedReturn)return new MonadicError(\"Expected callback returning \"+expectedReturn+\" for '\"+path+\"', but callback returns \"+ar,path+\"(return)\",expectedReturn,ar)}return fn}`\n )\n }\n\n // Bang access (!.) \u2014 asserted non-null member access\n if (needsBang) {\n // bang depends on typeError and isMonadicError \u2014 ensure they're inlined\n if (!needsTypeError) {\n inlineParts.push(\n `class MonadicError extends Error{constructor(m,p,e,a,c,r){super(m);this.name='MonadicError';this.path=p;this.expected=e;this.actual=a;this.callStack=c;this.reason=r}}`,\n `function typeError(p,e,v,r){const a=v===null?'null':typeof v;const m=r?'Expected '+e+\" for '\"+p+\"': \"+r:'Expected '+e+\" for '\"+p+\"', got \"+a;const err=new MonadicError(m,p,e,a,undefined,r);const c=globalThis.__tjs?.getConfig?.();if(c?.logTypeErrors)console.error('[TJS TypeError] '+err.message);if(c?.throwTypeErrors)throw err;return err}`,\n `function isMonadicError(v){return v instanceof Error&&v.name==='MonadicError'&&'path' in v}`\n )\n }\n inlineParts.push(\n `function bang(o,p){if(o===null||o===undefined)return typeError('bang.'+p,'non-null',o);if(isMonadicError(o))return o;return o[p]}`\n )\n }\n\n // Build preamble: inline functions are declared at module scope,\n // then __tjs either uses the shared runtime or references the inlined ones.\n const inlineBlock =\n inlineParts.length > 0 ? inlineParts.join(';\\n') + ';\\n' : ''\n\n // Build __tjs object from inlined functions (fallback when no shared runtime)\n const fallbackEntries: string[] = []\n if (needsTypeError) fallbackEntries.push('typeError', 'isMonadicError')\n if (needsStack) fallbackEntries.push('pushStack', 'popStack', 'getStack')\n if (needsEq) fallbackEntries.push('Eq')\n if (needsNotEq) fallbackEntries.push('NotEq')\n if (needsTypeOf) fallbackEntries.push('TypeOf')\n if (needsIs) fallbackEntries.push('Is', 'tjsEquals')\n if (needsIsNot) fallbackEntries.push('IsNot')\n if (needsType) fallbackEntries.push('Type')\n if (needsGeneric) fallbackEntries.push('Generic')\n if (needsFunctionPredicate) fallbackEntries.push('FunctionPredicate')\n if (needsEnum) fallbackEntries.push('Enum')\n if (needsUnion) fallbackEntries.push('Union')\n if (needsToBool) fallbackEntries.push('toBool')\n if (needsCheckFnShape) {\n fallbackEntries.push('checkFnShape')\n if (!needsTypeError) fallbackEntries.push('typeError', 'isMonadicError')\n }\n if (needsBang) {\n fallbackEntries.push('bang')\n // Ensure typeError/isMonadicError are in fallback even if not otherwise needed\n if (!needsTypeError) {\n fallbackEntries.push('typeError', 'isMonadicError')\n }\n }\n\n const fallbackObj =\n fallbackEntries.length > 0\n ? `{${fallbackEntries.join(',')}}`\n : 'undefined'\n\n const preamble =\n inlineBlock +\n `const __tjs = globalThis.__tjs?.createRuntime?.() ?? ${fallbackObj};\\n`\n\n code = preamble + code\n }\n\n // Add Eval/SafeFunction import when TjsSafeEval directive is present\n if (needsSafeEval) {\n code = `import { Eval, SafeFunction } from 'tjs-lang';\\n` + code\n }\n\n // Run tests at transpile time if enabled\n let testResults: TestResult[] | undefined\n\n if (runTests) {\n // Extract signature tests info (doesn't execute yet)\n const sigTestInfos = extractSignatureTestInfos(source)\n\n // Run all tests in a single execution context\n testResults = runAllTests(\n tests,\n mocks,\n sigTestInfos,\n code,\n resolvedImports,\n preprocessed.extensions\n )\n\n // Check for failures and throw only if runTests === true (strict mode)\n // 'only' and 'report' modes return results without throwing\n const failures = testResults.filter((r) => !r.passed)\n if (failures.length > 0 && runTests === true) {\n const errorLines = failures.map((f) => {\n if (f.isSignatureTest) {\n return ` Function signature example is inconsistent:\\n ${f.error}`\n }\n const loc = f.line ? ` (line ${f.line})` : ''\n return ` Test '${f.description}'${loc} failed:\\n ${f.error}`\n })\n throw new Error(`Transpile-time test failures:\\n${errorLines.join('\\n')}`)\n }\n }\n\n // If runTests === 'only', return minimal result\n if (runTests === 'only') {\n return {\n code: '',\n types: allTypes,\n metadata: allTypes,\n testResults,\n testCount: testResults?.length,\n }\n }\n\n // Compile WASM blocks at transpile time and embed in output\n let wasmCompiled:\n | { id: string; success: boolean; error?: string; byteLength?: number }[]\n | undefined\n if (preprocessed.wasmBlocks.length > 0) {\n wasmCompiled = []\n const wasmBootstrap = generateWasmBootstrap(preprocessed.wasmBlocks)\n if (wasmBootstrap.code) {\n code = wasmBootstrap.code + '\\n' + code\n }\n wasmCompiled = wasmBootstrap.results\n }\n\n return {\n code,\n types: allTypes,\n metadata: allTypes, // alias for runtime compatibility\n warnings: warnings.length > 0 ? warnings : undefined,\n testRunner: tests.length > 0 ? testRunner : undefined,\n testCount: tests.length > 0 ? tests.length : undefined,\n testResults,\n wasmCompiled,\n }\n}\n\n/**\n * Find ALL function declarations in the AST\n * Includes functions inside export declarations\n */\nfunction findAllFunctions(program: Program): FunctionDeclaration[] {\n const functions: FunctionDeclaration[] = []\n\n for (const node of program.body) {\n if (node.type === 'FunctionDeclaration') {\n functions.push(node)\n } else if (\n node.type === 'ExportNamedDeclaration' &&\n node.declaration?.type === 'FunctionDeclaration'\n ) {\n functions.push(node.declaration as FunctionDeclaration)\n } else if (\n node.type === 'ExportDefaultDeclaration' &&\n node.declaration?.type === 'FunctionDeclaration'\n ) {\n functions.push(node.declaration as FunctionDeclaration)\n }\n }\n\n return functions\n}\n\n/**\n * Serialize a TypeDescriptor to JSON-compatible object\n * Preserves full type structure (shape, items, members)\n */\nfunction serializeType(t: TypeDescriptor): any {\n const result: any = { kind: t.kind }\n if (t.nullable) result.nullable = true\n if (t.items) result.items = serializeType(t.items)\n if (t.shape) {\n result.shape = Object.fromEntries(\n Object.entries(t.shape).map(([k, v]) => [k, serializeType(v)])\n )\n }\n if (t.members) result.members = t.members.map(serializeType)\n return result\n}\n\n/**\n * Safety options for metadata generation\n */\ninterface SafetyOptions {\n /** Function marked with (!) - never validate inputs */\n unsafe?: boolean\n /** Function marked with (?) - always validate inputs */\n safe?: boolean\n /** Return type safety: 'safe' (:?) or 'unsafe' (:!) */\n returnSafety?: 'safe' | 'unsafe'\n}\n\n/**\n * Debug options for metadata generation\n */\ninterface DebugOptions {\n /** Include source locations in metadata */\n debug?: boolean\n /** Source location of the function */\n source?: {\n file: string\n line: number\n column: number\n }\n /** Default values for optional return type keys */\n returnDefaults?: Record<string, unknown>\n}\n\n/**\n * Generate type metadata code\n *\n * @param funcName - Function name\n * @param types - Type information\n * @param safety - Safety flags for the function\n * @param debugOpts - Debug options (source locations)\n */\nfunction generateTypeMetadata(\n funcName: string,\n types: TJSTypeInfo,\n safety: SafetyOptions = {},\n debugOpts: DebugOptions = {}\n): string {\n const paramsObj: Record<string, any> = {}\n\n for (const [name, param] of Object.entries(types.params)) {\n paramsObj[name] = {\n type: serializeType(param.type),\n required: param.required,\n }\n if (param.default !== undefined) {\n paramsObj[name].default = param.default\n }\n if (param.description) {\n paramsObj[name].description = param.description\n }\n }\n\n const metadata: any = {\n params: paramsObj,\n }\n\n if (types.returns) {\n metadata.returns = {\n type: serializeType(types.returns),\n }\n if (debugOpts.returnDefaults) {\n metadata.returns.defaults = debugOpts.returnDefaults\n }\n // Add return safety flags\n if (safety.returnSafety === 'safe') {\n metadata.safeReturn = true // :? forces output validation\n } else if (safety.returnSafety === 'unsafe') {\n metadata.unsafeReturn = true // :! skips output validation\n }\n }\n\n if (types.description) {\n metadata.description = types.description\n }\n\n // Mark unsafe functions - they skip runtime input validation\n if (safety.unsafe) {\n metadata.unsafe = true\n }\n\n // Mark safe functions - they force runtime input validation\n if (safety.safe) {\n metadata.safe = true\n }\n\n // Always include source location for error reporting\n if (debugOpts.source) {\n const { file, line } = debugOpts.source\n metadata.source = `${file}:${line}`\n }\n\n return `${funcName}.__tjs = ${JSON.stringify(metadata, null, 2)}`\n}\n\n/**\n * Check if this function can use inline validation (the fast path)\n *\n * Two patterns qualify:\n * 1. Single destructured object param: function foo({ x: 0, y: '' }) { ... }\n * 2. Single named object param: function foo(input: { x: 0, y: '' }) { ... }\n *\n * These can be validated with fast inline checks instead of schema interpretation.\n */\nfunction canUseInlineValidation(types: TJSTypeInfo): boolean {\n // Destructured params always qualify\n if (types.isDestructuredParam && types.destructuredShape) {\n return true\n }\n\n // Any function with params can use inline validation\n // (we generate typeof checks for primitives too)\n return Object.keys(types.params).length > 0\n}\n\n/**\n * Generate inline validation code for single-arg object types\n *\n * This is ~20x faster than schema-based validation because:\n * 1. No schema interpretation at runtime\n * 2. No object iteration\n * 3. JIT can inline the checks\n *\n * Generated code looks like:\n * if (typeof input !== 'object' || input === null ||\n * typeof input.x !== 'number' ||\n * typeof input.y !== 'number') {\n * return __tjs.typeError('funcName.input', 'object', input)\n * }\n */\nexport function generateInlineValidation(\n funcName: string,\n paramName: string,\n shape: Record<string, TypeDescriptor>,\n requiredFields: Set<string>\n): string {\n const checks: string[] = []\n const path = `${funcName}.${paramName}`\n\n // Check it's an object\n checks.push(`typeof ${paramName} !== 'object'`)\n checks.push(`${paramName} === null`)\n\n // Check each field\n for (const [fieldName, fieldType] of Object.entries(shape)) {\n const fieldPath = `${paramName}.${fieldName}`\n const isRequired = requiredFields.has(fieldName)\n\n const typeCheck = generateTypeCheck(fieldPath, fieldType)\n if (typeCheck) {\n if (isRequired) {\n // Required: must exist and have correct type\n checks.push(typeCheck)\n } else {\n // Optional: only check type if defined\n checks.push(`(${fieldPath} !== undefined && ${typeCheck})`)\n }\n }\n }\n\n if (checks.length === 0) return ''\n\n return `if (${checks.join(' || ')}) {\n return __tjs.typeError('${path}', 'object', ${paramName})\n}`\n}\n\n/**\n * Generate a type check expression for a single field\n * Returns null if no check needed (e.g., 'any' type)\n */\n/**\n * Generate a type check expression for a single field\n * Returns an expression that evaluates to true when type is INVALID\n * Returns null if no check needed (e.g., 'any' type)\n */\nfunction generateTypeCheckExpr(\n fieldPath: string,\n type: TypeDescriptor\n): string | null {\n let check: string | null\n\n switch (type.kind) {\n case 'string':\n check = `typeof ${fieldPath} !== 'string'`\n break\n case 'number':\n check = `typeof ${fieldPath} !== 'number'`\n break\n case 'integer':\n check = `(typeof ${fieldPath} !== 'number' || !Number.isInteger(${fieldPath}))`\n break\n case 'non-negative-integer':\n check = `(typeof ${fieldPath} !== 'number' || !Number.isInteger(${fieldPath}) || ${fieldPath} < 0)`\n break\n case 'boolean':\n check = `typeof ${fieldPath} !== 'boolean'`\n break\n case 'null':\n return `${fieldPath} !== null` // nullable doesn't apply to null itself\n case 'undefined':\n return `${fieldPath} !== undefined`\n case 'array': {\n // Always require an Array. If item type is known and non-trivial,\n // also validate every item \u2014 `arr: [0]` means \"array of integers\",\n // not \"any array\". Without this, a function returning\n // `[MonadicError, MonadicError]` would pass the `: [0]` return-\n // type check (it's an array) and surface a confusing array-of-\n // errors to the caller.\n const itemCheck =\n type.items && type.items.kind !== 'any'\n ? generateTypeCheckExpr('__a', type.items)\n : null\n if (itemCheck) {\n check = `(!Array.isArray(${fieldPath}) || ${fieldPath}.some(__a => ${itemCheck}))`\n } else {\n check = `!Array.isArray(${fieldPath})`\n }\n break\n }\n case 'object':\n // For nested objects, just check it's an object (deep validation is separate)\n check = `(typeof ${fieldPath} !== 'object' || ${fieldPath} === null || Array.isArray(${fieldPath}))`\n break\n case 'function':\n // Shape isn't validated at call time (we don't introspect arity or\n // call the function with probes) \u2014 just check it IS callable.\n check = `typeof ${fieldPath} !== 'function'`\n break\n case 'union': {\n const checks = (type as any).members\n .map((m: TypeDescriptor) => generateTypeCheckExpr(fieldPath, m))\n .filter((c: string | null) => c !== null)\n if (checks.length === 0) return null\n check = `(${checks.join(' && ')})`\n break\n }\n case 'any':\n return null // No check needed\n default:\n return null\n }\n\n // If type is nullable, allow null to pass\n if (check && type.nullable) {\n check = `(${fieldPath} !== null && ${check})`\n }\n\n return check\n}\n\n// Alias for backward compatibility with other functions that use this\nconst generateTypeCheck = generateTypeCheckExpr\n\n/** Kinds checkType can validate by string name (no RuntimeType needed). */\nconst SIMPLE_KINDS = new Set([\n 'string',\n 'number',\n 'integer',\n 'non-negative-integer',\n 'boolean',\n 'function',\n 'any',\n 'undefined',\n 'null',\n 'object', // checkType handles this via typeof\n])\n\n/**\n * Generate a `__tjs.checkFnShape(...)` call that validates a passed-in\n * function's declared shape against the expected shape ONCE at pass time.\n * On mismatch the param is reassigned to a MonadicError; the existing\n * `if (param instanceof Error) return param` check above handles\n * propagation. On match the param is unchanged. Untyped functions\n * (no `__tjs` metadata \u2014 anonymous arrows) pass through unchanged.\n *\n * Returns null when the expected shape can't be represented as simple\n * TypeSpec strings, or when there's nothing useful to check (all-`any`).\n */\nfunction generateFunctionShapeCheck(\n paramName: string,\n type: TypeDescriptor,\n path: string\n): string | null {\n const fnParams = (type.params ?? []) as Array<{\n name: string\n type: TypeDescriptor\n }>\n const fnReturns = type.returns ?? { kind: 'any' as const }\n const paramKinds = fnParams.map((p) => p.type?.kind)\n const allSimple =\n paramKinds.every((k) => k && SIMPLE_KINDS.has(k)) &&\n SIMPLE_KINDS.has(fnReturns.kind)\n const hasUsefulCheck =\n paramKinds.some((k) => k !== 'any') || fnReturns.kind !== 'any'\n if (!allSimple || !hasUsefulCheck) return null\n const paramTypesJson = JSON.stringify(paramKinds)\n return `if (typeof ${paramName} === 'function') ${paramName} = __tjs.checkFnShape(${paramName}, ${paramTypesJson}, '${fnReturns.kind}', '${path}');`\n}\n\n/**\n * Generate the complete function wrapper with inline validation\n *\n * For destructured object params, this generates:\n *\n * const _original_funcName = funcName\n * funcName = function(__input) {\n * if (typeof __input !== 'object' || __input === null || ...) {\n * return __tjs.typeError('funcName.input', 'object', __input)\n * }\n * return _original_funcName.call(this, __input)\n * }\n *\n * For single named object params, same pattern with the actual param name.\n */\nexport function generateInlineWrapper(\n funcName: string,\n types: TJSTypeInfo,\n safety: SafetyOptions = {}\n): string | null {\n // Check if we can use inline validation\n if (!canUseInlineValidation(types)) return null\n\n // Unsafe functions don't need wrappers\n if (safety.unsafe) return null\n\n // Destructured params: use __input as the wrapper param name\n if (types.isDestructuredParam && types.destructuredShape) {\n const paramName = '__input'\n const shape = types.destructuredShape\n const requiredFields = types.destructuredRequired || new Set()\n\n const validation = generateInlineValidation(\n funcName,\n paramName,\n shape,\n requiredFields\n )\n if (!validation) return null\n\n return `\nconst _original_${funcName} = ${funcName}\n${funcName} = function(${paramName}) {\n ${validation}\n return _original_${funcName}.call(this, ${paramName})\n}\n`.trim()\n }\n\n // Positional params path (primitives or single object param)\n const params = Object.entries(types.params)\n\n // Check if it's a single object param with shape\n if (params.length === 1) {\n const [paramName, param] = params[0]\n if (param.type.kind === 'object' && param.type.shape) {\n // Single named object param\n const shape = param.type.shape\n const requiredFields = new Set<string>()\n for (const [fieldName] of Object.entries(shape)) {\n requiredFields.add(fieldName)\n }\n\n const validation = generateInlineValidation(\n funcName,\n paramName,\n shape,\n requiredFields\n )\n if (!validation) return null\n\n return `\nconst _original_${funcName} = ${funcName}\n${funcName} = function(${paramName}) {\n ${validation}\n return _original_${funcName}.call(this, ${paramName})\n}\n`.trim()\n }\n }\n\n // Generate validation for positional primitive params\n const validation = generatePositionalValidation(funcName, params)\n if (!validation) return null\n\n const paramNames = params.map(([name]) => name).join(', ')\n return `\nconst _original_${funcName} = ${funcName}\n${funcName} = function(${paramNames}) {\n ${validation}\n return _original_${funcName}.call(this, ${paramNames})\n}\n`.trim()\n}\n\n/**\n * Generate validation for positional (primitive) params\n */\nfunction generatePositionalValidation(\n funcName: string,\n params: [string, ParameterDescriptor][]\n): string | null {\n const lines: string[] = []\n\n for (const [paramName, param] of params) {\n const typeCheck = generateTypeCheck(paramName, param.type)\n if (typeCheck) {\n const path = `${funcName}.${paramName}`\n const expectedType = param.type.kind\n if (param.required) {\n lines.push(\n `if (${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${paramName});`\n )\n } else {\n lines.push(\n `if (${paramName} !== undefined && ${typeCheck}) return __tjs.typeError('${path}', '${expectedType}', ${paramName});`\n )\n }\n }\n }\n\n if (lines.length === 0) return null\n\n return lines.join('\\n ')\n}\n\n// =============================================================================\n// Transpile-time Test Execution\n// =============================================================================\n\n/**\n * Fuzzy comparison for floating point numbers\n */\n", "/**\n * TJS Inline Tests\n *\n * Extracts test blocks from TJS source and generates test runners.\n *\n * Syntax (TJS):\n * test 'description' {\n * assert(condition)\n * expect(a).toBe(b)\n * }\n *\n * test {\n * // Anonymous test\n * }\n *\n * mock {\n * // Setup code that runs before each test\n * }\n *\n * Syntax (TypeScript - embedded in comments):\n * /*test 'description' {\n * expect(add(2, 3)).toBe(5)\n * }* /\n *\n * This syntax survives TypeScript compilation, enabling literate\n * programming for TypeScript: tests live alongside the code they\n * verify, extracted and executed at runtime by TJS.\n *\n * For TS developers who don't care about TJS: you still get inline\n * tests that live with your code, literate development, and faster\n * debug loops. Set `safety none` and keep living in your world.\n *\n * Output:\n * - code: Clean source with tests stripped\n * - tests: Array of extracted test definitions\n * - testRunner: Generated code to execute tests\n */\n\n// Note: parser could be used for more robust test extraction in future\n\nexport interface ExtractedTest {\n description: string\n body: string\n line?: number\n}\n\nexport interface ExtractedMock {\n body: string\n line?: number\n}\n\nexport interface TestExtractionResult {\n /** Source code with tests and mocks removed */\n code: string\n /** Extracted test definitions */\n tests: ExtractedTest[]\n /** Extracted mock/setup blocks */\n mocks: ExtractedMock[]\n /** Generated test runner code */\n testRunner: string\n}\n\n/**\n * Check if a position in source is inside a comment\n */\nfunction isInsideComment(source: string, pos: number): boolean {\n // Check for line comment - scan backwards to start of line\n let lineStart = pos\n while (lineStart > 0 && source[lineStart - 1] !== '\\n') {\n lineStart--\n }\n const lineBeforePos = source.slice(lineStart, pos)\n if (lineBeforePos.includes('//')) {\n return true\n }\n\n // Check for block comment - find last /* and */ before pos\n let i = 0\n let inBlockComment = false\n while (i < pos) {\n if (!inBlockComment && source.slice(i, i + 2) === '/*') {\n inBlockComment = true\n i += 2\n } else if (inBlockComment && source.slice(i, i + 2) === '*/') {\n inBlockComment = false\n i += 2\n } else {\n i++\n }\n }\n return inBlockComment\n}\n\n/**\n * Extract embedded tests from block comments\n *\n * Syntax:\n * /*test 'description' {\n * assert(condition)\n * }* /\n *\n * This allows tests to be embedded in TypeScript files that would\n * otherwise strip out `test {}` blocks during TS compilation.\n */\nfunction extractEmbeddedTests(source: string): ExtractedTest[] {\n const tests: ExtractedTest[] = []\n\n // Match: /*test 'description' { ... }*/ or /*test { ... }*/\n // Each quote type gets its own alternative so the description can contain\n // the other quote types (e.g. `test 'typeof null is \"null\"' {`).\n const embeddedRegex =\n /\\/\\*test\\s+'([^']*)'\\s*\\{([\\s\\S]*?)\\}\\s*\\*\\/|\\/\\*test\\s+\"([^\"]*)\"\\s*\\{([\\s\\S]*?)\\}\\s*\\*\\/|\\/\\*test\\s+`([^`]*)`\\s*\\{([\\s\\S]*?)\\}\\s*\\*\\/|\\/\\*test\\s*\\{([\\s\\S]*?)\\}\\s*\\*\\//g\n\n let match\n while ((match = embeddedRegex.exec(source)) !== null) {\n // Groups: 1/3/5 = description for ' \" ` ; 2/4/6 = body for ' \" ` ; 7 = body for anonymous\n const desc =\n match[1] || match[3] || match[5] || `embedded test ${tests.length + 1}`\n const body = (match[2] || match[4] || match[6] || match[7] || '').trim()\n\n tests.push({\n description: desc,\n body,\n line: getLineNumber(source, match.index),\n })\n }\n\n return tests\n}\n\n/**\n * Extract inline tests from TJS source\n *\n * Note: Signature tests (from -> return types) are handled separately by the\n * transpiler in js.ts. This function only extracts explicit test blocks.\n */\nexport function extractTests(source: string): TestExtractionResult {\n const tests: ExtractedTest[] = []\n const mocks: ExtractedMock[] = []\n\n // First, extract embedded tests from block comments (for TS compatibility)\n // These use syntax: /*test 'description' { ... }*/\n const embeddedTests = extractEmbeddedTests(source)\n tests.push(...embeddedTests)\n\n // Regex to match test blocks - three syntaxes supported:\n // test { ... } (anonymous test)\n // test 'description' { ... } (canonical TJS)\n // test('description') { ... } (also valid - parenthesized string is still a string)\n // Each quote type has its own alternative so the description can contain\n // the other quote types (e.g. `test 'typeof null is \"null\"' {`).\n const testRegex =\n /test\\s+'([^']*)'\\s*\\{|test\\s+\"([^\"]*)\"\\s*\\{|test\\s+`([^`]*)`\\s*\\{|test\\s*\\(\\s*'([^']*)'\\s*\\)\\s*\\{|test\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*\\{|test\\s*\\(\\s*`([^`]*)`\\s*\\)\\s*\\{|test\\s*\\{/g\n const mockRegex = /mock\\s*\\{/g\n\n let cleanCode = source\n let match\n\n // Extract test blocks\n // We need to find matching braces for each test\n const testMatches: Array<{ start: number; end: number; desc: string }> = []\n\n while ((match = testRegex.exec(source)) !== null) {\n const start = match.index\n\n // Skip matches inside comments (but embedded tests were already extracted above)\n if (isInsideComment(source, start)) {\n continue\n }\n\n // Groups 1/2/3 = `test 'desc'` / `test \"desc\"` / `test \\`desc\\``\n // Groups 4/5/6 = parenthesized variants\n // No group when description is omitted\n const desc =\n match[1] ||\n match[2] ||\n match[3] ||\n match[4] ||\n match[5] ||\n match[6] ||\n `test ${tests.length + 1}`\n const bodyStart = match.index + match[0].length\n\n // Find matching closing brace\n const end = findMatchingBrace(source, bodyStart - 1)\n if (end === -1) continue\n\n const body = source.slice(bodyStart, end).trim()\n\n tests.push({\n description: desc,\n body,\n line: getLineNumber(source, start),\n })\n\n testMatches.push({ start, end: end + 1, desc })\n }\n\n // Extract mock blocks\n const mockMatches: Array<{ start: number; end: number }> = []\n\n while ((match = mockRegex.exec(source)) !== null) {\n const start = match.index\n const bodyStart = match.index + match[0].length\n\n const end = findMatchingBrace(source, bodyStart - 1)\n if (end === -1) continue\n\n const body = source.slice(bodyStart, end).trim()\n\n mocks.push({\n body,\n line: getLineNumber(source, start),\n })\n\n mockMatches.push({ start, end: end + 1 })\n }\n\n // Remove test and mock blocks from source (in reverse order to preserve indices)\n const allMatches = [...testMatches, ...mockMatches].sort(\n (a, b) => b.start - a.start\n )\n\n for (const m of allMatches) {\n cleanCode = cleanCode.slice(0, m.start) + cleanCode.slice(m.end)\n }\n\n // Clean up extra whitespace\n cleanCode = cleanCode.replace(/\\n\\s*\\n\\s*\\n/g, '\\n\\n').trim()\n\n // Generate test runner\n const testRunner = generateTestRunner(tests, mocks)\n\n return {\n code: cleanCode,\n tests,\n mocks,\n testRunner,\n }\n}\n\n/**\n * Find the matching closing brace\n */\nfunction findMatchingBrace(source: string, start: number): number {\n let depth = 0\n let inString: string | null = null\n let escaped = false\n\n for (let i = start; i < source.length; i++) {\n const char = source[i]\n\n if (escaped) {\n escaped = false\n continue\n }\n\n if (char === '\\\\') {\n escaped = true\n continue\n }\n\n // Track string state\n if (!inString && (char === '\"' || char === \"'\" || char === '`')) {\n inString = char\n continue\n }\n if (inString === char) {\n inString = null\n continue\n }\n if (inString) continue\n\n // Track braces\n if (char === '{') depth++\n if (char === '}') {\n depth--\n if (depth === 0) return i\n }\n }\n\n return -1\n}\n\n/**\n * Get line number for a position in source\n */\nfunction getLineNumber(source: string, pos: number): number {\n return source.slice(0, pos).split('\\n').length\n}\n\n/**\n * Generate test runner code\n */\nfunction generateTestRunner(\n tests: ExtractedTest[],\n mocks: ExtractedMock[]\n): string {\n if (tests.length === 0) {\n return '// No tests defined'\n }\n\n const mockSetup = mocks.map((m) => m.body).join('\\n')\n\n const testCases = tests\n .map(\n (t, i) => `\n // Test ${i + 1}: ${t.description}\n try {\n ${mockSetup}\n await (async () => {\n ${t.body}\n })()\n __results.push({ description: ${JSON.stringify(\n t.description\n )}, passed: true })\n } catch (__e) {\n __results.push({ description: ${JSON.stringify(\n t.description\n )}, passed: false, error: __e.message })\n }`\n )\n .join('\\n')\n\n // Note: No comment before IIFE - ASI would break `return (async...)` if comment is between\n return `(async () => {\nconst __results = []\n\n${testCases}\n\n// Compute summary (no console output - caller handles reporting)\nconst __passed = __results.filter(r => r.passed).length\nconst __failed = __results.filter(r => !r.passed).length\n\n// Return summary\nreturn { passed: __passed, failed: __failed, results: __results }\n})()`.trim()\n}\n\n/**\n * Test utilities - assert and expect\n * Include this in the runtime or inject it\n */\nexport const assertFunction = `\nfunction assert(condition, message) {\n if (!condition) {\n throw new Error(message || 'Assertion failed')\n }\n}\n`\n\n/**\n * Expect API for richer test assertions\n * Uses deep equality, handles null/undefined correctly\n */\nexport const expectFunction = `\nfunction expect(actual) {\n const deepEqual = (a, b) => {\n if (a === b) return true\n if (a === null || b === null) return a === b\n if (a === undefined || b === undefined) return a === undefined && b === undefined\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return a === b\n if (Array.isArray(a) !== Array.isArray(b)) return false\n if (Array.isArray(a)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => deepEqual(v, b[i]))\n }\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n return keysA.every(k => deepEqual(a[k], b[k]))\n }\n\n const format = (v) => {\n if (v === null) return 'null'\n if (v === undefined) return 'undefined'\n if (typeof v === 'string') return JSON.stringify(v)\n if (typeof v === 'object') return JSON.stringify(v)\n return String(v)\n }\n\n return {\n toBe(expected) {\n if (!deepEqual(actual, expected)) {\n throw new Error(\\`Expected \\${format(expected)} but got \\${format(actual)}\\`)\n }\n },\n toEqual(expected) {\n if (!deepEqual(actual, expected)) {\n throw new Error(\\`Expected \\${format(expected)} but got \\${format(actual)}\\`)\n }\n },\n toContain(item) {\n if (!Array.isArray(actual) || !actual.some(v => deepEqual(v, item))) {\n throw new Error(\\`Expected \\${format(actual)} to contain \\${format(item)}\\`)\n }\n },\n toThrow(message) {\n let threw = false\n let thrownMessage = ''\n try {\n if (typeof actual === 'function') actual()\n } catch (e) {\n threw = true\n thrownMessage = e.message || String(e)\n }\n if (!threw) {\n throw new Error('Expected function to throw but it did not')\n }\n if (message && !thrownMessage.includes(message)) {\n throw new Error(\\`Expected error containing \"\\${message}\" but got \"\\${thrownMessage}\"\\`)\n }\n },\n toBeTruthy() {\n if (!actual) {\n throw new Error(\\`Expected \\${format(actual)} to be truthy\\`)\n }\n },\n toBeFalsy() {\n if (actual) {\n throw new Error(\\`Expected \\${format(actual)} to be falsy\\`)\n }\n },\n toBeNull() {\n if (actual !== null) {\n throw new Error(\\`Expected null but got \\${format(actual)}\\`)\n }\n },\n toBeUndefined() {\n if (actual !== undefined) {\n throw new Error(\\`Expected undefined but got \\${format(actual)}\\`)\n }\n },\n toBeGreaterThan(n) {\n if (!(actual > n)) {\n throw new Error(\\`Expected \\${format(actual)} to be greater than \\${n}\\`)\n }\n },\n toBeLessThan(n) {\n if (!(actual < n)) {\n throw new Error(\\`Expected \\${format(actual)} to be less than \\${n}\\`)\n }\n }\n }\n}\n`\n\n/**\n * Combined test utilities (assert + expect)\n */\nexport const testUtils = assertFunction + '\\n' + expectFunction\n\n/**\n * Questions/Notes:\n *\n * Q1: Should mocks be scoped per-test or shared?\n * Current: Each test runs all mocks before executing\n *\n * Q2: Should we support test.only / test.skip?\n * Easy to add with syntax: test.only('...') { } or test.skip('...') { }\n *\n * Q3: Integration with playground?\n * Playground could run extractTests() and show test results in a panel\n *\n * Q4: DOM tests - test.browser('desc') { }?\n * SHELVED: Plan is to run tests in actual browser (playground)\n * Happy-DOM is ~1MB packed, too heavy to bundle\n * If needed later: lazy-load happy-dom only for Node/Bun DOM tests\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 /** Why the check failed (from predicate reason strings) */\n readonly reason?: string\n\n constructor(\n message: string,\n path: string,\n expected?: string,\n actual?: string,\n callStack?: string[],\n reason?: 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 this.reason = reason\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 reason?: string\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 msg = reason\n ? `Expected ${expected} for '${path}': ${reason}`\n : `Expected ${expected} for '${path}', got ${actual}`\n const err = new MonadicError(msg, path, expected, actual, stack, reason)\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 /** Why the check failed (from predicate reason strings) */\n reason?: 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\n/**\n * Honest boolean coercion. Like `Boolean(x)` but unwraps boxed primitives\n * first, fixing the JS footgun `Boolean(new Boolean(false)) === true`.\n *\n * Under TjsStandard, the source rewriter wraps every truthiness context\n * (if/while/for/do-while conditions, `!`, `&&`, `||`, ternary, and\n * top-level `Boolean(x)` calls) with this function so a boxed `false`\n * actually behaves as `false`.\n */\nexport function toBool(value: unknown): boolean {\n if (\n value instanceof Boolean ||\n value instanceof Number ||\n value instanceof String\n ) {\n return Boolean((value as any).valueOf())\n }\n return Boolean(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:\n | string\n | { check: (v: unknown) => boolean | string; 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 const result = expected.check(value)\n if (result === true) return null\n const reason = typeof result === 'string' ? result : undefined\n const msg = reason\n ? `Expected ${expected.description} for '${path}': ${reason}`\n : `Expected ${expected.description} but got ${typeOf(value)}`\n return error(msg, {\n path,\n expected: expected.description,\n actual: typeOf(value),\n reason,\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 =\n | string\n | { check: (v: unknown) => boolean | string; description: string }\n\n/**\n * Check that a passed-in function's declared shape matches the expected\n * shape. Returns the function unchanged on a match, or a MonadicError on\n * mismatch. Untyped functions (no `__tjs` metadata \u2014 anonymous arrows\n * like `x => false`) pass through unchanged on the assumption that the\n * caller knows what they're doing; they accept any args and return\n * whatever they return.\n *\n * This is a ONE-SHOT check at pass time, NOT a per-call wrapper. The TJS\n * design call: a wrong-shape callback is ONE error at the boundary, not\n * N errors when the receiving function invokes the callback N times.\n *\n * Compatibility rules (deliberately permissive \u2014 strict subtyping is a\n * separate, larger feature):\n * - For each expected param: the actual function may declare fewer\n * params (extras simply not used). If both declare a kind, they\n * must match exactly. Either side being `any` always matches.\n * - For the return type: same exact-match rule when both are known.\n */\nexport function checkFnShape(\n fn: unknown,\n expectedParamKinds: string[],\n expectedReturnKind: string,\n path: string\n): unknown {\n if (typeof fn !== 'function') return fn // outer \"is callable\" check already ran\n const meta = (fn as any).__tjs\n if (!meta || !meta.params) return fn // untyped \u2014 let it run\n\n const actualEntries = Object.entries(meta.params) as Array<\n [string, { type?: { kind?: string } }]\n >\n for (let i = 0; i < expectedParamKinds.length; i++) {\n const expectedKind = expectedParamKinds[i]\n if (expectedKind === 'any') continue\n const actual = actualEntries[i]\n if (!actual) continue // function takes fewer params, OK\n const actualKind = actual[1]?.type?.kind\n if (!actualKind || actualKind === 'any') continue\n if (actualKind !== expectedKind) {\n return new MonadicError(\n `Expected (...arg${i}: ${expectedKind}, ...) for '${path}', ` +\n `but callback declares arg${i} as ${actualKind}`,\n `${path}(arg${i})`,\n expectedKind,\n actualKind\n )\n }\n }\n\n if (expectedReturnKind !== 'any' && meta.returns) {\n // Metadata's `returns` is `{ type: TypeDescriptor, defaults?: ... }`,\n // but defensively also accept a bare TypeDescriptor.\n const actualReturnKind = meta.returns.type?.kind ?? meta.returns.kind\n if (\n actualReturnKind &&\n actualReturnKind !== 'any' &&\n actualReturnKind !== expectedReturnKind\n ) {\n return new MonadicError(\n `Expected callback returning ${expectedReturnKind} for '${path}', ` +\n `but callback returns ${actualReturnKind}`,\n `${path}(return)`,\n expectedReturnKind,\n actualReturnKind\n )\n }\n }\n\n return fn\n}\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 checkFnShape,\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 // Honest truthiness (unwraps boxed primitives)\n toBool,\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 checkFnShape,\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 // Honest truthiness (used in TjsStandard for boxed-primitive coercion)\n toBool,\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. Returns true on pass, false on fail, or a reason string on fail. */\n check(value: unknown): boolean | string\n /** The underlying schema (if schema-based) */\n readonly schema?: Schema\n /** The predicate function (if predicate-based). May return a reason string on failure. */\n readonly predicate?: (value: unknown) => boolean | string\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 | string)\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 | string) | 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 (\n value: unknown\n ) => boolean | string\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 // Returns true on pass, false on fail, or a reason string on fail\n const check = (value: unknown): boolean | string => {\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>('string', (v: unknown) => {\n if (typeof v === 'string') return true\n return `expected string, got ${v === null ? 'null' : typeof v}`\n})\n\n/** Number type */\nexport const TNumber = Type<number>('number', (v: unknown) => {\n if (typeof v === 'number') return true\n return `expected number, got ${v === null ? 'null' : typeof v}`\n})\n\n/** Boolean type */\nexport const TBoolean = Type<boolean>('boolean', (v: unknown) => {\n if (typeof v === 'boolean') return true\n return `expected boolean, got ${v === null ? 'null' : typeof v}`\n})\n\n/** Integer type */\nexport const TInteger = Type<number>('integer', (v: unknown) => {\n if (typeof v !== 'number')\n return `expected integer, got ${v === null ? 'null' : typeof v}`\n if (!Number.isInteger(v)) return `${v} is not an integer`\n return true\n})\n\n/** Positive integer type */\nexport const TPositiveInt = Type<number>('positive integer', (v: unknown) => {\n if (typeof v !== 'number')\n return `expected positive integer, got ${v === null ? 'null' : typeof v}`\n if (!Number.isInteger(v)) return `${v} is not an integer`\n if (v <= 0) return `${v} is not positive`\n return true\n})\n\n/** Non-empty string type */\nexport const TNonEmptyString = Type<string>(\n 'non-empty string',\n (v: unknown) => {\n if (typeof v !== 'string')\n return `expected string, got ${v === null ? 'null' : typeof v}`\n if (v.length === 0) return 'string is empty'\n return true\n }\n)\n\n/** Email type (basic validation) */\nexport const TEmail = Type<string>('email address', (v: unknown) => {\n if (typeof v !== 'string')\n return `expected string, got ${v === null ? 'null' : typeof v}`\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v))\n return `\"${v}\" is not a valid email`\n return true\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>('URL', (v: unknown) => {\n if (typeof v !== 'string')\n return `expected string, got ${v === null ? 'null' : typeof v}`\n if (!isValidUrl(v)) return `\"${v}\" is not a valid URL`\n return true\n})\n\n/** UUID type */\nexport const TUuid = Type<string>('UUID', (v: unknown) => {\n if (typeof v !== 'string')\n return `expected string, got ${v === null ? 'null' : typeof v}`\n if (\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 return `\"${v}\" is not a valid UUID`\n return true\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) === true\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) === true\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) =>\n types.some((t) => t.check(v) === true)\n )\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) =>\n Array.isArray(v) && v.every((item) => itemType.check(item) === true)\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) === true\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 check: (value: unknown): boolean | string => {\n if (typeof value !== 'function')\n return `expected function, got ${\n value === null ? 'null' : typeof value\n }`\n\n // Structural validation: check arity and __tjs metadata\n const expectedArity = Object.keys(params).length\n if (expectedArity > 0) {\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)\n return `expected ${expectedArity} params, got ${metaParamCount}`\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 `param '${expectedKeys[i]}' expected ${expectedKind}, got ${metaInfo.type.kind}`\n }\n }\n }\n }\n\n return true\n },\n __runtimeType: true as const,\n }\n\n return fpType\n}\n", "/**\n * TJS Test Execution\n *\n * Handles transpile-time test execution, signature validation, and test utilities.\n */\n\nimport { transformExtensionCalls } from '../parser'\nimport { installRuntime } from '../runtime'\nimport type { TypeDescriptor } from '../types'\nimport type { ExtractedTest, ExtractedMock } from '../tests'\n\nexport interface TestResult {\n /** Test description */\n description: string\n /** Whether the test passed */\n passed: boolean\n /** Error message if failed */\n error?: string\n /** Whether this was an implicit signature test */\n isSignatureTest?: boolean\n /** Source line number (1-indexed) where the test or error occurred */\n line?: number\n /** Source column number (1-indexed) */\n column?: number\n}\n\nfunction fuzzyEqual(a: unknown, b: unknown, epsilon = 1e-9): boolean {\n if (a === b) return true\n if (typeof a === 'number' && typeof b === 'number') {\n // Check if either is non-integer (float)\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n const diff = Math.abs(a - b)\n const maxAbs = Math.max(Math.abs(a), Math.abs(b), 1)\n return diff / maxAbs < epsilon\n }\n }\n return false\n}\n\n/**\n * Deep equality check with fuzzy float comparison\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n // NaN === NaN is false in JS, but NaN should equal NaN in tests\n if (\n typeof a === 'number' &&\n typeof b === 'number' &&\n Number.isNaN(a) &&\n Number.isNaN(b)\n )\n return true\n if (fuzzyEqual(a, b)) return true\n if (a === null || b === null) return a === b\n if (a === undefined || b === undefined) return a === b\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return false\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((v, i) => deepEqual(v, b[i]))\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false\n\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) => deepEqual((a as any)[k], (b as any)[k]))\n}\n\n/**\n * Check if a value matches an expected type pattern (from example value)\n * Unlike deepEqual, this checks TYPE compatibility, not value equality.\n *\n * Example patterns:\n * 0 matches any number\n * \"\" matches any string\n * true matches any boolean\n * null matches null\n * [] matches any array\n * [0] matches array of numbers\n * {name: \"\", age: 0} matches object with string name and number age\n */\nfunction typeMatches(\n actual: unknown,\n pattern: unknown,\n path = ''\n): { matches: boolean; error?: string } {\n // null pattern matches null\n if (pattern === null) {\n if (actual === null) return { matches: true }\n return {\n matches: false,\n error: `Expected null at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n // undefined pattern matches undefined\n if (pattern === undefined) {\n if (actual === undefined) return { matches: true }\n return {\n matches: false,\n error: `Expected undefined at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n // Primitive types - check type only (used by :? runtime validation)\n if (typeof pattern === 'number') {\n if (typeof actual === 'number') return { matches: true }\n return {\n matches: false,\n error: `Expected number at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n if (typeof pattern === 'string') {\n if (typeof actual === 'string') return { matches: true }\n return {\n matches: false,\n error: `Expected string at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n if (typeof pattern === 'boolean') {\n if (typeof actual === 'boolean') return { matches: true }\n return {\n matches: false,\n error: `Expected boolean at '${path}', got ${typeOf(actual)}`,\n }\n }\n\n // Arrays\n if (Array.isArray(pattern)) {\n if (!Array.isArray(actual)) {\n return {\n matches: false,\n error: `Expected array at '${path}', got ${typeOf(actual)}`,\n }\n }\n // Empty array pattern matches any array\n if (pattern.length === 0) return { matches: true }\n // Non-empty array pattern: check each element against first pattern element\n const elementPattern = pattern[0]\n for (let i = 0; i < actual.length; i++) {\n const result = typeMatches(actual[i], elementPattern, `${path}[${i}]`)\n if (!result.matches) return result\n }\n return { matches: true }\n }\n\n // Objects\n if (typeof pattern === 'object' && pattern !== null) {\n if (\n typeof actual !== 'object' ||\n actual === null ||\n Array.isArray(actual)\n ) {\n return {\n matches: false,\n error: `Expected object at '${path}', got ${typeOf(actual)}`,\n }\n }\n // Check all pattern keys exist and match types\n for (const key of Object.keys(pattern)) {\n const keyPath = path ? `${path}.${key}` : key\n if (!(key in actual)) {\n return { matches: false, error: `Missing property '${keyPath}'` }\n }\n const result = typeMatches(\n (actual as any)[key],\n (pattern as any)[key],\n keyPath\n )\n if (!result.matches) return result\n }\n return { matches: true }\n }\n\n // Fallback: exact equality\n if (actual === pattern) return { matches: true }\n return { matches: false, error: `Type mismatch at '${path}'` }\n}\n\n/**\n * Get a human-readable type description\n */\nfunction typeOf(v: unknown): string {\n if (v === null) return 'null'\n if (v === undefined) return 'undefined'\n if (Array.isArray(v)) return 'array'\n return typeof v\n}\n\n/**\n * Format a value for error messages - uses cleaner object notation\n * Multi-line for objects with 3+ properties\n */\nfunction formatValue(v: unknown, indent = 0): string {\n if (v === null) return 'null'\n if (v === undefined) return 'undefined'\n if (typeof v === 'string') return JSON.stringify(v)\n if (typeof v === 'number') return String(v)\n if (typeof v === 'boolean') return String(v)\n if (Array.isArray(v)) {\n if (v.length === 0) return '[]'\n if (v.length <= 3)\n return `[${v.map((x) => formatValue(x, indent)).join(', ')}]`\n return `[${v\n .slice(0, 3)\n .map((x) => formatValue(x, indent))\n .join(', ')}, ...]`\n }\n if (typeof v === 'object') {\n const entries = Object.entries(v)\n if (entries.length === 0) return '{}'\n\n const formatKey = (k: string) =>\n /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(k) ? k : JSON.stringify(k)\n\n // Single line for 1-2 properties\n if (entries.length <= 2) {\n const formatted = entries\n .map(([k, val]) => `${formatKey(k)}: ${formatValue(val, indent)}`)\n .join(', ')\n return `{${formatted}}`\n }\n\n // Multi-line for 3+ properties\n const pad = ' '.repeat(indent + 1)\n const closePad = ' '.repeat(indent)\n const formatted = entries\n .slice(0, 8)\n .map(\n ([k, val]) => `${pad}${formatKey(k)}: ${formatValue(val, indent + 1)}`\n )\n .join(',\\n')\n const suffix = entries.length > 8 ? `,\\n${pad}...` : ''\n return `{\\n${formatted}${suffix}\\n${closePad}}`\n }\n return String(v)\n}\n\n/**\n * Strip comments from source code\n * Used to avoid matching code patterns inside comments\n */\nfunction stripComments(code: string): string {\n // Replace block comments with equivalent whitespace (preserve line numbers)\n let result = code.replace(/\\/\\*[\\s\\S]*?\\*\\//g, (match) => {\n // Replace with same number of newlines to preserve line numbers\n const newlines = match.split('\\n').length - 1\n return '\\n'.repeat(newlines)\n })\n\n // Replace line comments\n result = result.replace(/\\/\\/[^\\n]*/g, '')\n\n return result\n}\n\n/**\n * Strip import/export syntax for test execution context\n * Tests run in new Function() which doesn't support ES modules\n *\n * Useful for:\n * - Running tests in new Function() context\n * - CLI test runners\n * - Bundler plugins that need to extract module code\n */\nexport function stripModuleSyntax(code: string): string {\n // Remove import statements (entire line)\n let result = code.replace(/^import\\s+.*?from\\s+['\"][^'\"]+['\"];?\\s*$/gm, '')\n result = result.replace(/^import\\s+['\"][^'\"]+['\"];?\\s*$/gm, '')\n\n // Remove 'export ' keyword but keep the declaration\n result = result.replace(/^export\\s+default\\s+/gm, '')\n result = result.replace(/^export\\s+/gm, '')\n\n // Strip top-level await (not inside functions) \u2014 incompatible with new Function()\n // Match lines that start with await or \"const/let/var x = await ...\"\n result = result.replace(\n /^(\\s*)((?:const|let|var)\\s+\\w+\\s*=\\s*)?await\\s+.+$/gm,\n '$1/* top-level await removed for test execution */'\n )\n\n return result\n}\n\n/**\n * Strip the __tjs runtime preamble from transpiled code\n * This is needed when injecting resolved imports into a test context\n * that already has its own __tjs stub\n *\n * Useful for:\n * - Combining multiple TJS modules into a single execution context\n * - Test runners that provide their own __tjs runtime\n * - Bundlers that need to deduplicate runtime setup\n */\nexport function stripTjsPreamble(code: string): string {\n // Remove the __tjs runtime setup lines:\n // const __tjs = globalThis.__tjs?.createRuntime?.() ?? globalThis.__tjs;\n // const { Is, IsNot, Eq, NotEq } = __tjs ?? {};\n let result = code.replace(\n /^const __tjs = globalThis\\.__tjs\\?\\.createRuntime\\?\\.\\(\\) \\?\\? globalThis\\.__tjs;\\n?/m,\n ''\n )\n result = result.replace(/^const \\{ [\\w, ]+ \\} = __tjs \\?\\? \\{\\};\\n?/m, '')\n return result\n}\n\n/**\n * Build code to inject resolved imports into test execution context\n *\n * Takes a map of module specifier -> compiled code and returns code that\n * makes those exports available in the test scope.\n *\n * For example, if resolvedImports contains:\n * { 'mymath': 'function add(a, b) { return a + b }\\nadd.__tjs = {...}' }\n *\n * This will return code that evaluates that module and makes `add` available.\n */\nfunction buildResolvedImportsCode(\n resolvedImports: Record<string, string>\n): string {\n if (Object.keys(resolvedImports).length === 0) {\n return ''\n }\n\n const lines: string[] = []\n\n for (const [specifier, moduleCode] of Object.entries(resolvedImports)) {\n // Strip module syntax from the imported code too (it may have exports)\n const cleanCode = stripModuleSyntax(moduleCode)\n\n lines.push(`// Resolved import: ${specifier}`)\n lines.push(cleanCode)\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Parse a return type example that may contain `key = defaultValue` syntax.\n * Transforms `{ value: 0, error = '' }` into valid JS `{ value: 0, error: '' }`\n * and extracts the default values for optional keys.\n */\nfunction parseReturnExample(\n str: string\n): { pattern: unknown; defaults: Record<string, unknown> } | null {\n const defaults: Record<string, unknown> = {}\n\n // Only process objects that might contain = syntax\n const trimmed = str.trim()\n if (!trimmed.startsWith('{') || !trimmed.includes('=')) {\n try {\n return { pattern: new Function(`return ${str}`)(), defaults }\n } catch {\n return null\n }\n }\n\n // Transform top-level `key = value` to `key: value` and track defaults\n // Walk the string respecting nesting depth\n let transformed = ''\n let depth = 0\n let i = 0\n\n while (i < trimmed.length) {\n const ch = trimmed[i]\n\n if (ch === '{' || ch === '[' || ch === '(') {\n depth++\n transformed += ch\n i++\n } else if (ch === '}' || ch === ']' || ch === ')') {\n depth--\n transformed += ch\n i++\n } else if (ch === \"'\" || ch === '\"' || ch === '`') {\n // Skip string literals\n const quote = ch\n transformed += ch\n i++\n while (i < trimmed.length && trimmed[i] !== quote) {\n if (trimmed[i] === '\\\\') {\n transformed += trimmed[i++]\n }\n transformed += trimmed[i++]\n }\n if (i < trimmed.length) {\n transformed += trimmed[i++]\n }\n } else if (depth === 1 && ch === '=') {\n // Top-level `key = value` \u2014 look back for the key name\n const beforeEq = transformed.slice(transformed.lastIndexOf('{') + 1)\n const lastSegment = beforeEq.split(',').pop() || ''\n const keyMatch = lastSegment.match(/\\s*(\\w+)\\s*$/)\n if (keyMatch) {\n // Find the value after =\n let j = i + 1\n while (j < trimmed.length && /\\s/.test(trimmed[j])) j++\n\n // Extract value (up to , or } at depth 1)\n let valStr = ''\n let valDepth = 0\n while (j < trimmed.length) {\n const vc = trimmed[j]\n if (vc === '{' || vc === '[' || vc === '(') valDepth++\n else if (vc === '}' || vc === ']' || vc === ')') {\n if (valDepth === 0) break\n valDepth--\n } else if (vc === ',' && valDepth === 0) break\n valStr += vc\n j++\n }\n\n try {\n defaults[keyMatch[1]] = new Function(`return ${valStr.trim()}`)()\n } catch {\n // Can't parse default, skip\n }\n\n // Replace = with : in output\n transformed += ':'\n i++\n continue\n }\n transformed += ch\n i++\n } else {\n transformed += ch\n i++\n }\n }\n\n try {\n return { pattern: new Function(`return ${transformed}`)(), defaults }\n } catch {\n return null\n }\n}\n\n/**\n * Info about a signature test (extracted but not yet executed)\n */\ninterface SignatureTestInfo {\n funcName: string\n args: unknown[]\n expected: unknown\n defaults?: Record<string, unknown>\n line: number\n isAsync?: boolean\n /** For class method tests: the class name */\n className?: string\n /** For class method tests: args to pass to the first constructor */\n constructorArgs?: unknown[]\n}\n\n/**\n * Extract signature test info from source without executing\n */\nexport function extractSignatureTestInfos(\n originalSource: string\n): SignatureTestInfo[] {\n const infos: SignatureTestInfo[] = []\n\n // Strip comments to avoid matching functions inside doc comments/code examples\n const sourceWithoutComments = stripComments(originalSource)\n\n // Match function declarations with return type marker (: or :?)\n // Skip :! which means \"don't test\"\n // Pattern: [async] function name(params): returnExample {\n const funcRegex = /(async\\s+)?function\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*(:[?!]?)\\s*/g\n\n let match\n while ((match = funcRegex.exec(sourceWithoutComments)) !== null) {\n const isAsync = !!match[1]\n const funcName = match[2]\n const paramsStr = match[3]\n const returnMarker = match[4]\n\n // Calculate line number from match position in stripped source\n const lineNumber = sourceWithoutComments\n .slice(0, match.index)\n .split('\\n').length\n\n // :! means skip test\n if (returnMarker === ':!') continue\n\n // Extract return example - handle nested braces/brackets\n const afterMarker = sourceWithoutComments.slice(\n match.index + match[0].length\n )\n const returnExample = extractReturnExampleFromSource(afterMarker)\n if (!returnExample) continue\n\n // Extract parameter examples\n const paramExamples = extractParamExamples(paramsStr)\n if (paramsStr.trim() && paramExamples.length === 0) continue\n\n try {\n // Parse expected value (with optional default keys) and args\n const parsed = parseReturnExample(returnExample)\n if (!parsed) continue\n\n const args = paramExamples.map((p) => new Function(`return ${p}`)())\n\n infos.push({\n funcName,\n args,\n expected: parsed.pattern,\n defaults:\n Object.keys(parsed.defaults).length > 0 ? parsed.defaults : undefined,\n line: lineNumber,\n isAsync,\n })\n } catch {\n // Skip if parsing fails - will be reported as error during execution\n }\n }\n\n // Extract class method signature tests\n // Find class declarations and their first constructor's params,\n // then find methods with return type markers (: or :?)\n const classRegex = /class\\s+(\\w+)(?:\\s+extends\\s+\\w+)?\\s*\\{/g\n let classMatch\n while ((classMatch = classRegex.exec(sourceWithoutComments)) !== null) {\n const className = classMatch[1]\n const classBodyStart = classMatch.index + classMatch[0].length\n\n // Find the matching closing brace for the class body\n let braceDepth = 1\n let classBodyEnd = classBodyStart\n for (let i = classBodyStart; i < sourceWithoutComments.length; i++) {\n if (sourceWithoutComments[i] === '{') braceDepth++\n else if (sourceWithoutComments[i] === '}') {\n braceDepth--\n if (braceDepth === 0) {\n classBodyEnd = i\n break\n }\n }\n }\n const classBody = sourceWithoutComments.slice(classBodyStart, classBodyEnd)\n\n // Find the first constructor's params\n const ctorRegex = /constructor\\s*\\(([^)]*)\\)/\n const ctorMatch = ctorRegex.exec(classBody)\n if (!ctorMatch) continue\n\n const ctorParamsStr = ctorMatch[1]\n const ctorParamExamples = extractParamExamples(ctorParamsStr)\n if (ctorParamsStr.trim() && ctorParamExamples.length === 0) continue\n\n let ctorArgs: unknown[]\n try {\n ctorArgs = ctorParamExamples.map((p) => new Function(`return ${p}`)())\n } catch {\n continue\n }\n\n // Find methods with return type markers inside the class body\n const methodRegex = /(async\\s+)?(\\w+)\\s*\\(([^)]*)\\)\\s*(:[?!]?)\\s*/g\n let methodMatch\n while ((methodMatch = methodRegex.exec(classBody)) !== null) {\n const methodName = methodMatch[2]\n // Skip constructors and special names\n if (methodName === 'constructor') continue\n\n const isAsync = !!methodMatch[1]\n const paramsStr = methodMatch[3]\n const returnMarker = methodMatch[4]\n\n if (returnMarker === ':!') continue\n\n // Calculate line number from position in original source\n const methodPosInSource = classBodyStart + methodMatch.index\n const lineNumber = sourceWithoutComments\n .slice(0, methodPosInSource)\n .split('\\n').length\n\n const afterMarker = classBody.slice(\n methodMatch.index + methodMatch[0].length\n )\n const returnExample = extractReturnExampleFromSource(afterMarker)\n if (!returnExample) continue\n\n const paramExamples = extractParamExamples(paramsStr)\n if (paramsStr.trim() && paramExamples.length === 0) continue\n\n try {\n const parsed = parseReturnExample(returnExample)\n if (!parsed) continue\n\n const args = paramExamples.map((p) => new Function(`return ${p}`)())\n\n infos.push({\n funcName: methodName,\n args,\n expected: parsed.pattern,\n defaults:\n Object.keys(parsed.defaults).length > 0\n ? parsed.defaults\n : undefined,\n line: lineNumber,\n isAsync,\n className,\n constructorArgs: ctorArgs,\n })\n } catch {\n // Skip if parsing fails\n }\n }\n }\n\n return infos\n}\n\n/**\n * Run all tests (explicit blocks + signature tests) in a single execution context\n * This executes the module only once, then runs all tests against that context\n */\nexport function runAllTests(\n tests: ExtractedTest[],\n mocks: ExtractedMock[],\n sigTestInfos: SignatureTestInfo[],\n transpiledCode: string,\n resolvedImports: Record<string, string> = {},\n extensions: Map<string, Set<string>> = new Map()\n): TestResult[] {\n const results: TestResult[] = []\n\n // If no tests at all, return empty\n if (tests.length === 0 && sigTestInfos.length === 0) {\n return results\n }\n\n // Detect unresolved imports \u2014 imports in source that aren't in resolvedImports\n const importSpecifiers =\n transpiledCode.match(/^import\\s+.*?from\\s+['\"]([^'\"]+)['\"];?\\s*$/gm) || []\n const hasUnresolvedImports =\n importSpecifiers.length > 0 &&\n importSpecifiers.some((imp) => {\n const match = imp.match(/from\\s+['\"]([^'\"]+)['\"]/)\n return match && !(match[1] in resolvedImports)\n })\n\n // Strip import/export for test execution (can't use modules in new Function)\n const executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n // Real runtime installed via installRuntime() \u2014 preamble finds it via globalThis.__tjs\n\n // Build resolved imports code - inject imported module code into execution context\n const importedCode = buildResolvedImportsCode(resolvedImports)\n\n // Build mock setup\n const mockSetup = mocks.map((m) => m.body).join('\\n')\n\n // Test bodies may reference Is/IsNot/Eq/NotEq/TypeOf \u2014 these come from the\n // == / != / typeof source-level transforms applied to test bodies in js.ts.\n // The module's own destructuring may not include them (if the module never\n // uses ==), so each test block re-destructures into its own block scope.\n const testRuntimeImports = `const { Is, IsNot, Eq, NotEq, TypeOf } = globalThis.__tjs ?? {};`\n\n // Build test execution code that runs all tests in sequence\n const testBodies = tests\n .map((t, i) => {\n // Apply extension call rewriting to test body if extensions exist\n const body =\n extensions.size > 0\n ? transformExtensionCalls(t.body, extensions)\n : t.body\n return `\n // Test ${i}: ${t.description}\n try {\n ${testRuntimeImports}\n ${body}\n __testResults.push({ idx: ${i}, passed: true });\n } catch (e) {\n __testResults.push({ idx: ${i}, passed: false, error: e.message || String(e) });\n }\n `\n })\n .join('\\n')\n\n // Filter out async functions \u2014 can't be tested synchronously at transpile time\n // Users should test async functions with explicit test blocks instead\n const syncSigTestInfos = sigTestInfos.filter((info) => !info.isAsync)\n const asyncSigTestInfos = sigTestInfos.filter((info) => info.isAsync)\n\n // Build signature test execution code\n const sigTestBodies = syncSigTestInfos\n .map((info, i) => {\n const testLabel = info.className\n ? `${info.className}.${info.funcName}`\n : info.funcName\n const callExpr = info.className\n ? `new ${info.className}(${(info.constructorArgs || [])\n .map((a) => JSON.stringify(a))\n .join(', ')}).${info.funcName}(${info.args\n .map((a) => JSON.stringify(a))\n .join(', ')})`\n : `${info.funcName}(${info.args\n .map((a) => JSON.stringify(a))\n .join(', ')})`\n return `\n // Signature test ${i}: ${testLabel}\n try {\n let __actual = ${callExpr};\n const __expected = ${JSON.stringify(info.expected)};${\n info.defaults\n ? `\n const __defaults = ${JSON.stringify(info.defaults)};\n if (typeof __actual === 'object' && __actual !== null) __actual = Object.assign({}, __defaults, __actual);`\n : ''\n }\n if (__deepEqual(__actual, __expected)) {\n __sigTestResults.push({ idx: ${i}, passed: true });\n } else {\n __sigTestResults.push({ idx: ${i}, passed: false, error: 'Expected ' + __format(__expected) + ' at \\\\'${testLabel}\\\\', got ' + __format(__actual) });\n }\n } catch (e) {\n __sigTestResults.push({ idx: ${i}, passed: false, error: e.message || String(e) });\n }\n `\n })\n .join('\\n')\n\n // Install real TJS runtime for test execution\n installRuntime()\n\n const tjsStub = `\n const __saved_tjs = globalThis.__tjs;\n `\n const tjsRestore = `globalThis.__tjs = __saved_tjs;`\n\n // Combined test code - execute module ONCE, then run all tests\n const testCode = `\n ${tjsStub}\n const __testResults = [];\n const __sigTestResults = [];\n try {\n // Test assertions\n function assert(condition, message) {\n if (!condition) throw new Error(message || 'Assertion failed')\n }\n\n function expect(actual) {\n return {\n toBe(expected) {\n if (!__deepEqual(actual, expected)) {\n throw new Error('Expected ' + __format(expected) + ' but got ' + __format(actual))\n }\n },\n toEqual(expected) {\n if (!__deepEqual(actual, expected)) {\n throw new Error('Expected ' + __format(expected) + ' but got ' + __format(actual))\n }\n },\n toContain(item) {\n if (!Array.isArray(actual) || !actual.some(function(v) { return __deepEqual(v, item) })) {\n throw new Error('Expected ' + __format(actual) + ' to contain ' + __format(item))\n }\n },\n toBeTruthy() {\n if (!actual) {\n throw new Error('Expected ' + __format(actual) + ' to be truthy')\n }\n },\n toBeFalsy() {\n if (actual) {\n throw new Error('Expected ' + __format(actual) + ' to be falsy')\n }\n },\n toBeNull() {\n if (actual !== null) {\n throw new Error('Expected null but got ' + __format(actual))\n }\n },\n toBeUndefined() {\n if (actual !== undefined) {\n throw new Error('Expected undefined but got ' + __format(actual))\n }\n },\n toBeGreaterThan(n) {\n if (!(actual > n)) {\n throw new Error('Expected ' + __format(actual) + ' to be greater than ' + n)\n }\n },\n toBeLessThan(n) {\n if (!(actual < n)) {\n throw new Error('Expected ' + __format(actual) + ' to be less than ' + n)\n }\n },\n toBeNaN() {\n if (typeof actual !== 'number' || !Number.isNaN(actual)) {\n throw new Error('Expected NaN but got ' + __format(actual))\n }\n }\n }\n }\n\n // Inject resolved imports first (they may be dependencies)\n ${importedCode}\n\n // Execute the module code ONCE\n ${executableCode}\n ${mockSetup}\n\n // Run explicit test blocks\n ${testBodies}\n\n // Run signature tests\n ${sigTestBodies}\n\n } finally {\n ${tjsRestore}\n }\n return { testResults: __testResults, sigTestResults: __sigTestResults };\n `\n\n try {\n // Execute all tests\n const fn = new Function(\n '__deepEqual',\n '__format',\n '__typeMatches',\n testCode\n )\n const { testResults: blockResults, sigTestResults } = fn(\n deepEqual,\n formatValue,\n typeMatches\n )\n\n // Map block test results\n for (const r of blockResults) {\n const test = tests[r.idx]\n // Skip block tests that fail due to unresolved imports\n const isImportError =\n hasUnresolvedImports &&\n !r.passed &&\n r.error &&\n /is not defined$/.test(r.error)\n results.push({\n description: test.description,\n passed: isImportError ? true : r.passed,\n error: isImportError ? undefined : r.error,\n line: test.line,\n })\n }\n\n // Map signature test results\n for (const r of sigTestResults) {\n const info = syncSigTestInfos[r.idx]\n // Skip signature tests that fail due to unresolved imports\n const isImportError =\n hasUnresolvedImports &&\n !r.passed &&\n r.error &&\n /is not defined$/.test(r.error)\n const label = info.className\n ? `${info.className}.${info.funcName}`\n : info.funcName\n results.push({\n description: `${label} signature example`,\n passed: isImportError ? true : r.passed,\n error: isImportError ? undefined : r.error,\n isSignatureTest: true,\n line: info.line,\n })\n }\n } catch (e: any) {\n // If module fails due to unresolved imports (ReferenceError from stripped imports),\n // skip tests gracefully rather than marking them as failures\n const isUnresolvedRef = hasUnresolvedImports && e instanceof ReferenceError\n\n // The error came from module-level code (e.g. an undefined identifier\n // in `console.log(... x ...)`), NOT from the function/test under test.\n // Don't attribute a line \u2014 otherwise the editor would mark the function\n // declaration's line as the error site, misleading the user about where\n // the actual problem is. The test still appears as failed in the test\n // list with the explanatory message; the user finds the real error\n // through the runtime console.\n for (const test of tests) {\n results.push({\n description: test.description,\n passed: isUnresolvedRef,\n error: isUnresolvedRef\n ? undefined\n : `Module execution failed: ${e.message}`,\n })\n }\n for (const info of syncSigTestInfos) {\n const label = info.className\n ? `${info.className}.${info.funcName}`\n : info.funcName\n results.push({\n description: `${label} signature example`,\n passed: isUnresolvedRef,\n error: isUnresolvedRef\n ? undefined\n : `Module execution failed: ${e.message}`,\n isSignatureTest: true,\n })\n }\n }\n\n // Add skipped results for async signature tests\n for (const info of asyncSigTestInfos) {\n const label = info.className\n ? `${info.className}.${info.funcName}`\n : info.funcName\n results.push({\n description: `${label} signature example`,\n passed: true,\n isSignatureTest: true,\n line: info.line,\n })\n }\n\n return results\n}\n\n/**\n * Run extracted test blocks at transpile time\n * @deprecated Use runAllTests instead for single execution context\n */\nfunction runTestBlocks(\n tests: ExtractedTest[],\n mocks: ExtractedMock[],\n transpiledCode: string,\n resolvedImports: Record<string, string> = {}\n): TestResult[] {\n const results: TestResult[] = []\n\n // Strip import/export for test execution (can't use modules in new Function)\n const executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n // Real runtime installed via installRuntime() \u2014 preamble finds it via globalThis.__tjs\n\n // Build resolved imports code - inject imported module code into execution context\n const importedCode = buildResolvedImportsCode(resolvedImports)\n\n // Build execution context with the transpiled function\n const mockSetup = mocks.map((m) => m.body).join('\\n')\n\n for (const test of tests) {\n try {\n // Create a function that runs the test\n // Always provide a clean __tjs stub for isolated test execution\n // Save and restore globalThis.__tjs to prevent pollution\n const tjsStub = `\n const __saved_tjs = globalThis.__tjs;\n class __MonadicError extends Error { constructor(m,p,e,a,c){super(m);this.name='MonadicError';this.path=p;this.expected=e;this.actual=a;this.callStack=c;} }\n const __stub_tjs = { version: '0.0.0', MonadicError: __MonadicError, pushStack: () => {}, popStack: () => {}, getStack: () => [], typeError: (path, expected, value) => new __MonadicError(\\`Type error at \\${path}: expected \\${expected}\\`, path, expected, typeof value), toBool: (v) => (v instanceof Boolean || v instanceof Number || v instanceof String) ? Boolean(v.valueOf()) : Boolean(v), createRuntime: function() { return this; } };\n globalThis.__tjs = __stub_tjs;\n `\n const tjsRestore = `globalThis.__tjs = __saved_tjs;`\n const testCode = `\n ${tjsStub}\n try {\n // Inject resolved imports first (they may be dependencies)\n ${importedCode}\n ${executableCode}\n ${mockSetup}\n\n // Test assertions\n function assert(condition, message) {\n if (!condition) throw new Error(message || 'Assertion failed')\n }\n\n function expect(actual) {\n return {\n toBe(expected) {\n if (!__deepEqual(actual, expected)) {\n throw new Error('Expected ' + __format(expected) + ' but got ' + __format(actual))\n }\n },\n toEqual(expected) {\n if (!__deepEqual(actual, expected)) {\n throw new Error('Expected ' + __format(expected) + ' but got ' + __format(actual))\n }\n },\n toContain(item) {\n if (!Array.isArray(actual) || !actual.some(function(v) { return __deepEqual(v, item) })) {\n throw new Error('Expected ' + __format(actual) + ' to contain ' + __format(item))\n }\n },\n toBeTruthy() {\n if (!actual) {\n throw new Error('Expected ' + __format(actual) + ' to be truthy')\n }\n },\n toBeFalsy() {\n if (actual) {\n throw new Error('Expected ' + __format(actual) + ' to be falsy')\n }\n },\n toBeNull() {\n if (actual !== null) {\n throw new Error('Expected null but got ' + __format(actual))\n }\n },\n toBeUndefined() {\n if (actual !== undefined) {\n throw new Error('Expected undefined but got ' + __format(actual))\n }\n },\n toBeGreaterThan(n) {\n if (!(actual > n)) {\n throw new Error('Expected ' + __format(actual) + ' to be greater than ' + n)\n }\n },\n toBeLessThan(n) {\n if (!(actual < n)) {\n throw new Error('Expected ' + __format(actual) + ' to be less than ' + n)\n }\n },\n toBeNaN() {\n if (typeof actual !== 'number' || !Number.isNaN(actual)) {\n throw new Error('Expected NaN but got ' + __format(actual))\n }\n }\n }\n }\n\n // Run the test body\n ${test.body}\n } finally {\n ${tjsRestore}\n }\n `\n\n // Execute the test\n const fn = new Function('__deepEqual', '__format', testCode)\n fn(deepEqual, formatValue)\n\n results.push({\n description: test.description,\n passed: true,\n line: test.line,\n })\n } catch (e: any) {\n results.push({\n description: test.description,\n passed: false,\n error: e.message || String(e),\n line: test.line,\n })\n }\n }\n\n return results\n}\n\n/**\n * Evaluate an ObjectExpression AST node to a plain object\n */\nfunction evalObjectExpression(node: any): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const prop of node.properties) {\n if (prop.type === 'Property' && prop.key) {\n const key =\n prop.key.type === 'Identifier' ? prop.key.name : prop.key.value\n if (prop.value.type === 'Literal') {\n result[key] = prop.value.value\n } else if (prop.value.type === 'ObjectExpression') {\n result[key] = evalObjectExpression(prop.value)\n } else if (prop.value.type === 'ArrayExpression') {\n result[key] = evalArrayExpression(prop.value)\n } else {\n throw new Error('Unsupported value type')\n }\n }\n }\n return result\n}\n\n/**\n * Evaluate an ArrayExpression AST node to an array\n */\nfunction evalArrayExpression(node: any): unknown[] {\n const result: unknown[] = []\n for (const elem of node.elements) {\n if (elem.type === 'Literal') {\n result.push(elem.value)\n } else if (elem.type === 'ObjectExpression') {\n result.push(evalObjectExpression(elem))\n } else if (elem.type === 'ArrayExpression') {\n result.push(evalArrayExpression(elem))\n } else {\n throw new Error('Unsupported element type')\n }\n }\n return result\n}\n\n/**\n * Extract and run signature tests for ALL functions with return type annotations\n * Parses the original source to find function signatures\n *\n * Current limitations (future work):\n * - Only tests top-level `function` declarations (not arrow functions yet)\n * - Nested functions (inside other functions/blocks) are not excluded yet\n * and will fail if tested since they're not in global scope\n * - Arrow functions like `Foo = (x: 5): 10 => {}` not yet supported\n */\nfunction runAllSignatureTests(\n originalSource: string,\n transpiledCode: string,\n resolvedImports: Record<string, string> = {}\n): TestResult[] {\n const results: TestResult[] = []\n\n // Strip comments to avoid matching functions inside doc comments/code examples\n const sourceWithoutComments = stripComments(originalSource)\n\n // Match function declarations with return type marker (: or :?)\n // Skip :! which means \"don't test\"\n // Pattern: function name(params): returnExample {\n const funcRegex = /function\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*(:[?!]?)\\s*/g\n\n let match\n while ((match = funcRegex.exec(sourceWithoutComments)) !== null) {\n const funcName = match[1]\n const paramsStr = match[2]\n const returnMarker = match[3]\n\n // Calculate line number from match position in stripped source\n const lineNumber = sourceWithoutComments\n .slice(0, match.index)\n .split('\\n').length\n\n // :! means skip test\n if (returnMarker === ':!') continue\n\n // Extract return example - handle nested braces/brackets\n // Use stripped source since match.index is from that\n const afterMarker = sourceWithoutComments.slice(\n match.index + match[0].length\n )\n const returnExample = extractReturnExampleFromSource(afterMarker)\n if (!returnExample) continue\n\n // Extract parameter examples\n const paramExamples = extractParamExamples(paramsStr)\n if (paramsStr.trim() && paramExamples.length === 0) continue\n\n // Run the signature test\n try {\n // Parse expected value (with optional default keys)\n const parsed = parseReturnExample(returnExample)\n if (!parsed) continue\n\n // Parse args\n const args = paramExamples.map((p) => new Function(`return ${p}`)())\n\n const result = runSignatureTest(\n funcName,\n transpiledCode,\n args,\n parsed.pattern,\n resolvedImports,\n Object.keys(parsed.defaults).length > 0 ? parsed.defaults : undefined\n )\n result.line = lineNumber\n results.push(result)\n } catch (e: any) {\n results.push({\n description: `${funcName} signature example`,\n passed: false,\n error: `Failed to parse signature: ${e.message}`,\n isSignatureTest: true,\n line: lineNumber,\n })\n }\n }\n\n return results\n}\n\n/**\n * Extract return type example from source, handling nested braces\n */\nexport function extractReturnExampleFromSource(source: string): string | null {\n let result = ''\n let depth = 0\n let hasContent = false\n\n for (let i = 0; i < source.length; i++) {\n const char = source[i]\n\n if (char === '{' || char === '[' || char === '(') {\n if (char === '{' && depth === 0 && hasContent) {\n // Found the function body opening brace\n break\n }\n depth++\n result += char\n hasContent = true\n } else if (char === '}' || char === ']' || char === ')') {\n depth--\n result += char\n } else if (!/\\s/.test(char)) {\n result += char\n hasContent = true\n } else {\n result += char\n }\n }\n\n const trimmed = result.trim()\n return trimmed || null\n}\n\n/**\n * Extract parameter example values from params string\n */\nfunction extractParamExamples(paramsStr: string): string[] {\n if (!paramsStr.trim()) return []\n\n const examples: string[] = []\n const params = splitParams(paramsStr)\n\n for (const param of params) {\n const trimmed = param.trim()\n\n // Rest parameter: ...name: [examples] \u2014 spread the array elements as individual args\n const restMatch = trimmed.match(/^\\.\\.\\.(\\w+)\\s*[:=]\\s*(\\[.+\\])$/)\n if (restMatch) {\n try {\n const arr = new Function(`return ${restMatch[2]}`)()\n if (Array.isArray(arr)) {\n for (const el of arr) {\n examples.push(JSON.stringify(el))\n }\n }\n } catch {\n // Can't parse \u2014 skip rest param examples\n }\n continue\n }\n\n // Bare rest param without type: ...name \u2014 skip (no example to use)\n if (trimmed.startsWith('...')) continue\n\n // Match: name: example or name = example (with optional safety markers)\n // Handle: (? name: example) or (! name: example)\n const match = trimmed.match(/(?:\\(\\s*[?!]\\s*)?(\\w+)\\s*[:=]\\s*(.+?)(?:\\))?$/)\n if (match) {\n examples.push(match[2].trim())\n } else {\n // No example value - can't run signature test\n return []\n }\n }\n\n return examples\n}\n\n/**\n * Split parameter string on commas, respecting nested structures\n */\nfunction splitParams(paramsStr: string): string[] {\n const params: string[] = []\n let current = ''\n let depth = 0\n\n for (const char of paramsStr) {\n if (char === '(' || char === '[' || char === '{') depth++\n else if (char === ')' || char === ']' || char === '}') depth--\n else if (char === ',' && depth === 0) {\n params.push(current.trim())\n current = ''\n continue\n }\n current += char\n }\n\n if (current.trim()) params.push(current.trim())\n return params\n}\n\n/**\n * Run signature example test\n */\nfunction runSignatureTest(\n funcName: string,\n transpiledCode: string,\n args: unknown[],\n expected: unknown,\n resolvedImports: Record<string, string> = {},\n defaults?: Record<string, unknown>\n): TestResult {\n const description = `${funcName} signature example`\n\n // Strip import/export for test execution (can't use modules in new Function)\n const executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n // Real runtime installed via installRuntime() \u2014 preamble finds it via globalThis.__tjs\n\n // Build resolved imports code - inject imported module code into execution context\n const importedCode = buildResolvedImportsCode(resolvedImports)\n\n try {\n // Execute the function with example args\n // Provide a minimal __tjs stub for pushStack/typeError (used by inline validation)\n // Only define if not already in the transpiled code\n // Always provide a clean __tjs stub for isolated test execution\n // Save and restore globalThis.__tjs to prevent pollution\n const tjsStub = `\n const __saved_tjs = globalThis.__tjs;\n class __MonadicError extends Error { constructor(m,p,e,a,c){super(m);this.name='MonadicError';this.path=p;this.expected=e;this.actual=a;this.callStack=c;} }\n const __stub_tjs = { version: '0.0.0', MonadicError: __MonadicError, pushStack: () => {}, popStack: () => {}, getStack: () => [], typeError: (path, expected, value) => new __MonadicError(\\`Type error at \\${path}: expected \\${expected}\\`, path, expected, typeof value), toBool: (v) => (v instanceof Boolean || v instanceof Number || v instanceof String) ? Boolean(v.valueOf()) : Boolean(v), createRuntime: function() { return this; } };\n globalThis.__tjs = __stub_tjs;\n `\n const tjsRestore = `globalThis.__tjs = __saved_tjs;`\n const testCode = `\n ${tjsStub}\n try {\n // Inject resolved imports first (they may be dependencies)\n ${importedCode}\n ${executableCode}\n return ${funcName}(${args.map((a) => JSON.stringify(a)).join(', ')})\n } finally {\n ${tjsRestore}\n }\n `\n const fn = new Function(testCode)\n let actual = fn()\n\n // Merge defaults for optional keys before type checking\n if (defaults && typeof actual === 'object' && actual !== null) {\n actual = Object.assign({}, defaults, actual)\n }\n\n // Signature tests check exact values \u2014 the example is a test case\n if (!deepEqual(actual, expected)) {\n return {\n description,\n passed: false,\n error: `Expected ${formatValue(\n expected\n )} at '${funcName}', got ${formatValue(actual)}`,\n isSignatureTest: true,\n }\n }\n\n return { description, passed: true, isSignatureTest: true }\n } catch (e: any) {\n return {\n description,\n passed: false,\n error: e.message || String(e),\n isSignatureTest: true,\n }\n }\n}\n\n/**\n * Compile WASM blocks and generate bootstrap code that embeds the compiled bytes\n * and instantiates them on load.\n */\n", "/**\n * TJS to WebAssembly Compiler\n *\n * Compiles a subset of TJS to WebAssembly for performance-critical code.\n *\n * Supported features:\n * - Numeric operations (+, -, *, /, %)\n * - Typed arrays (Float32Array, Float64Array, Int32Array, Uint8Array)\n * - For loops with numeric bounds\n * - Math functions (sin, cos, sqrt, abs, floor, ceil, min, max)\n * - Basic conditionals (if/else)\n * - Variable declarations (let)\n *\n * The goal is to enable real-world WASM acceleration for hot paths like\n * audio processing, image manipulation, and physics simulations.\n */\n\nimport * as acorn from 'acorn'\nimport type { WasmBlock } from './parser'\n\n// ============================================================================\n// WASM Binary Encoding Constants\n// ============================================================================\n\n/** WASM value type codes */\nconst Type = {\n i32: 0x7f,\n i64: 0x7e,\n f32: 0x7d,\n f64: 0x7c,\n v128: 0x7b,\n funcref: 0x70,\n externref: 0x6f,\n void: 0x40, // empty block type\n} as const\n\n/** WASM section codes */\nconst Section = {\n custom: 0,\n type: 1,\n import: 2,\n function: 3,\n table: 4,\n memory: 5,\n global: 6,\n export: 7,\n start: 8,\n element: 9,\n code: 10,\n data: 11,\n} as const\n\n/** WASM opcodes */\nconst Op = {\n // Control flow\n unreachable: 0x00,\n nop: 0x01,\n block: 0x02,\n loop: 0x03,\n if: 0x04,\n else: 0x05,\n end: 0x0b,\n br: 0x0c,\n br_if: 0x0d,\n br_table: 0x0e,\n return: 0x0f,\n call: 0x10,\n call_indirect: 0x11,\n\n // Parametric\n drop: 0x1a,\n select: 0x1b,\n\n // Variable access\n local_get: 0x20,\n local_set: 0x21,\n local_tee: 0x22,\n global_get: 0x23,\n global_set: 0x24,\n\n // Memory operations\n i32_load: 0x28,\n i64_load: 0x29,\n f32_load: 0x2a,\n f64_load: 0x2b,\n i32_load8_s: 0x2c,\n i32_load8_u: 0x2d,\n i32_load16_s: 0x2e,\n i32_load16_u: 0x2f,\n i32_store: 0x36,\n i64_store: 0x37,\n f32_store: 0x38,\n f64_store: 0x39,\n i32_store8: 0x3a,\n i32_store16: 0x3b,\n memory_size: 0x3f,\n memory_grow: 0x40,\n\n // Constants\n i32_const: 0x41,\n i64_const: 0x42,\n f32_const: 0x43,\n f64_const: 0x44,\n\n // i32 comparison\n i32_eqz: 0x45,\n i32_eq: 0x46,\n i32_ne: 0x47,\n i32_lt_s: 0x48,\n i32_lt_u: 0x49,\n i32_gt_s: 0x4a,\n i32_gt_u: 0x4b,\n i32_le_s: 0x4c,\n i32_le_u: 0x4d,\n i32_ge_s: 0x4e,\n i32_ge_u: 0x4f,\n\n // i64 comparison\n i64_eqz: 0x50,\n i64_eq: 0x51,\n i64_ne: 0x52,\n i64_lt_s: 0x53,\n i64_lt_u: 0x54,\n i64_gt_s: 0x55,\n i64_gt_u: 0x56,\n i64_le_s: 0x57,\n i64_le_u: 0x58,\n i64_ge_s: 0x59,\n i64_ge_u: 0x5a,\n\n // f32 comparison\n f32_eq: 0x5b,\n f32_ne: 0x5c,\n f32_lt: 0x5d,\n f32_gt: 0x5e,\n f32_le: 0x5f,\n f32_ge: 0x60,\n\n // f64 comparison\n f64_eq: 0x61,\n f64_ne: 0x62,\n f64_lt: 0x63,\n f64_gt: 0x64,\n f64_le: 0x65,\n f64_ge: 0x66,\n\n // i32 arithmetic\n i32_clz: 0x67,\n i32_ctz: 0x68,\n i32_popcnt: 0x69,\n i32_add: 0x6a,\n i32_sub: 0x6b,\n i32_mul: 0x6c,\n i32_div_s: 0x6d,\n i32_div_u: 0x6e,\n i32_rem_s: 0x6f,\n i32_rem_u: 0x70,\n i32_and: 0x71,\n i32_or: 0x72,\n i32_xor: 0x73,\n i32_shl: 0x74,\n i32_shr_s: 0x75,\n i32_shr_u: 0x76,\n i32_rotl: 0x77,\n i32_rotr: 0x78,\n\n // i64 arithmetic\n i64_add: 0x7c,\n i64_sub: 0x7d,\n i64_mul: 0x7e,\n i64_div_s: 0x7f,\n\n // f32 arithmetic\n f32_abs: 0x8b,\n f32_neg: 0x8c,\n f32_ceil: 0x8d,\n f32_floor: 0x8e,\n f32_trunc: 0x8f,\n f32_nearest: 0x90,\n f32_sqrt: 0x91,\n f32_add: 0x92,\n f32_sub: 0x93,\n f32_mul: 0x94,\n f32_div: 0x95,\n f32_min: 0x96,\n f32_max: 0x97,\n f32_copysign: 0x98,\n\n // f64 arithmetic\n f64_abs: 0x99,\n f64_neg: 0x9a,\n f64_ceil: 0x9b,\n f64_floor: 0x9c,\n f64_trunc: 0x9d,\n f64_nearest: 0x9e,\n f64_sqrt: 0x9f,\n f64_add: 0xa0,\n f64_sub: 0xa1,\n f64_mul: 0xa2,\n f64_div: 0xa3,\n f64_min: 0xa4,\n f64_max: 0xa5,\n f64_copysign: 0xa6,\n\n // Conversions\n i32_wrap_i64: 0xa7,\n i32_trunc_f32_s: 0xa8,\n i32_trunc_f32_u: 0xa9,\n i32_trunc_f64_s: 0xaa,\n i32_trunc_f64_u: 0xab,\n i64_extend_i32_s: 0xac,\n i64_extend_i32_u: 0xad,\n f32_convert_i32_s: 0xb2,\n f32_convert_i32_u: 0xb3,\n f32_convert_i64_s: 0xb4,\n f32_demote_f64: 0xb6,\n f64_convert_i32_s: 0xb7,\n f64_convert_i32_u: 0xb8,\n f64_convert_i64_s: 0xb9,\n f64_promote_f32: 0xbb,\n i32_reinterpret_f32: 0xbc,\n f32_reinterpret_i32: 0xbe,\n f64_reinterpret_i64: 0xbf,\n\n // Sign extension\n i32_extend8_s: 0xc0,\n i32_extend16_s: 0xc1,\n} as const\n\n/** Reverse lookup: opcode byte -> instruction name */\nconst OpName: Record<number, string> = Object.fromEntries(\n Object.entries(Op).map(([name, code]) => [code, name.replace(/_/g, '.')])\n)\n\n// ============================================================================\n// SIMD (v128/f32x4) Constants\n// ============================================================================\n\n/** WASM SIMD prefix byte \u2014 all SIMD instructions start with this */\nconst SIMD_PREFIX = 0xfd\n\n/** SIMD sub-opcodes (follow the 0xfd prefix, LEB128-encoded) */\nconst SimdOp = {\n // Memory\n v128_load: 0x00,\n v128_store: 0x0b,\n\n // Constants\n v128_const: 0x0c,\n\n // Splat (scalar \u2192 all 4 lanes)\n f32x4_splat: 0x13,\n\n // Lane access\n f32x4_extract_lane: 0x1f,\n f32x4_replace_lane: 0x20,\n\n // f32x4 arithmetic\n f32x4_neg: 0xe1,\n f32x4_sqrt: 0xe3,\n f32x4_add: 0xe4,\n f32x4_sub: 0xe5,\n f32x4_mul: 0xe6,\n f32x4_div: 0xe7,\n} as const\n\n/** Reverse lookup for SIMD opcodes */\nconst SimdOpName: Record<number, string> = Object.fromEntries(\n Object.entries(SimdOp).map(([name, code]) => [code, name.replace(/_/g, '.')])\n)\n\n/** Encode a SIMD instruction (0xfd prefix + LEB128 sub-opcode) */\nfunction encodeSIMD(subOp: number): number[] {\n return [SIMD_PREFIX, ...encodeULEB128(subOp)]\n}\n\n/** Encode a SIMD instruction with memarg (align + offset) */\nfunction encodeSIMDMemarg(\n subOp: number,\n align: number,\n offset: number\n): number[] {\n return [\n SIMD_PREFIX,\n ...encodeULEB128(subOp),\n ...encodeULEB128(align),\n ...encodeULEB128(offset),\n ]\n}\n\n/** Emit WAT instruction to context */\nfunction wat(ctx: CompileContext, instruction: string): void {\n ctx.wat.push(' '.repeat(ctx.watIndent) + instruction)\n}\n\n// ============================================================================\n// LEB128 Encoding\n// ============================================================================\n\nfunction encodeULEB128(value: number): number[] {\n const result: number[] = []\n do {\n let byte = value & 0x7f\n value >>>= 7\n if (value !== 0) byte |= 0x80\n result.push(byte)\n } while (value !== 0)\n return result\n}\n\nfunction encodeSLEB128(value: number): number[] {\n const result: number[] = []\n let more = true\n while (more) {\n let byte = value & 0x7f\n value >>= 7\n if (\n (value === 0 && (byte & 0x40) === 0) ||\n (value === -1 && (byte & 0x40) !== 0)\n ) {\n more = false\n } else {\n byte |= 0x80\n }\n result.push(byte)\n }\n return result\n}\n\nfunction encodeF32(value: number): number[] {\n const buffer = new ArrayBuffer(4)\n new Float32Array(buffer)[0] = value\n return [...new Uint8Array(buffer)]\n}\n\nfunction encodeF64(value: number): number[] {\n const buffer = new ArrayBuffer(8)\n new Float64Array(buffer)[0] = value\n return [...new Uint8Array(buffer)]\n}\n\nfunction encodeString(s: string): number[] {\n const bytes = new TextEncoder().encode(s)\n return [...encodeULEB128(bytes.length), ...bytes]\n}\n\nfunction encodeSection(id: number, contents: number[]): number[] {\n return [id, ...encodeULEB128(contents.length), ...contents]\n}\n\nfunction encodeVector(items: number[][]): number[] {\n return [...encodeULEB128(items.length), ...items.flat()]\n}\n\n// ============================================================================\n// Disassembly (for debugging)\n// ============================================================================\n\n/** Decode ULEB128 from bytes, return [value, bytesConsumed] */\nfunction decodeULEB128(bytes: number[], offset: number): [number, number] {\n let result = 0\n let shift = 0\n let i = offset\n while (i < bytes.length) {\n const byte = bytes[i]\n result |= (byte & 0x7f) << shift\n i++\n if ((byte & 0x80) === 0) break\n shift += 7\n }\n return [result, i - offset]\n}\n\n/** Decode f64 from 8 bytes */\nfunction decodeF64(bytes: number[], offset: number): number {\n const buffer = new ArrayBuffer(8)\n const view = new Uint8Array(buffer)\n for (let i = 0; i < 8; i++) view[i] = bytes[offset + i]\n return new Float64Array(buffer)[0]\n}\n\n/** Disassemble function body bytes to WAT-like text */\nfunction disassemble(\n code: number[],\n params: TypedParam[],\n localTypes: WasmValueType[]\n): string {\n const lines: string[] = []\n let indent = 1\n const ind = () => ' '.repeat(indent)\n\n // Function signature\n const paramStr = params\n .map((p, i) => `(param $${p.name} ${p.type})`)\n .join(' ')\n const localStr = localTypes\n .map((t, i) => `(local $L${params.length + i} ${t})`)\n .join(' ')\n lines.push(`(func (export \"compute\") ${paramStr} (result f64)`)\n if (localStr) lines.push(` ${localStr}`)\n\n let i = 0\n while (i < code.length) {\n const op = code[i]\n const name = OpName[op] || `unknown(0x${op.toString(16)})`\n i++\n\n // Handle instructions with immediates\n if (op === Op.local_get || op === Op.local_set || op === Op.local_tee) {\n const [idx, len] = decodeULEB128(code, i)\n i += len\n const paramName =\n idx < params.length ? `$${params[idx].name}` : `$L${idx}`\n lines.push(`${ind()}${name} ${paramName}`)\n } else if (op === Op.br || op === Op.br_if) {\n const [depth, len] = decodeULEB128(code, i)\n i += len\n lines.push(`${ind()}${name} ${depth}`)\n } else if (op === Op.i32_const) {\n const [val, len] = decodeULEB128(code, i)\n i += len\n lines.push(`${ind()}i32.const ${val}`)\n } else if (op === Op.f32_const) {\n const buffer = new ArrayBuffer(4)\n const view = new Uint8Array(buffer)\n for (let j = 0; j < 4; j++) view[j] = code[i + j]\n const val = new Float32Array(buffer)[0]\n i += 4\n lines.push(`${ind()}f32.const ${val}`)\n } else if (op === Op.f64_const) {\n const val = decodeF64(code, i)\n i += 8\n lines.push(`${ind()}f64.const ${val}`)\n } else if (op === Op.block || op === Op.loop) {\n const blockType = code[i]\n i++\n lines.push(\n `${ind()}${name}${\n blockType === Type.void\n ? ''\n : ` (result ${blockType === Type.f64 ? 'f64' : 'i32'})`\n }`\n )\n indent++\n } else if (op === Op.if) {\n const blockType = code[i]\n i++\n lines.push(\n `${ind()}if${\n blockType === Type.void\n ? ''\n : ` (result ${blockType === Type.f64 ? 'f64' : 'i32'})`\n }`\n )\n indent++\n } else if (op === Op.else) {\n indent--\n lines.push(`${ind()}else`)\n indent++\n } else if (op === Op.end) {\n indent = Math.max(1, indent - 1)\n lines.push(`${ind()}end`)\n } else if (\n op === Op.f64_load ||\n op === Op.f64_store ||\n op === Op.f32_load ||\n op === Op.f32_store ||\n op === Op.i32_load ||\n op === Op.i32_store\n ) {\n const [align, len1] = decodeULEB128(code, i)\n i += len1\n const [offset, len2] = decodeULEB128(code, i)\n i += len2\n lines.push(`${ind()}${name}${offset ? ` offset=${offset}` : ''}`)\n } else if (op === SIMD_PREFIX) {\n // SIMD instruction: 0xfd + LEB128 sub-opcode\n const [subOp, subLen] = decodeULEB128(code, i)\n i += subLen\n const simdName =\n SimdOpName[subOp] || `simd.unknown(0x${subOp.toString(16)})`\n if (subOp === SimdOp.v128_load || subOp === SimdOp.v128_store) {\n const [_align, len1] = decodeULEB128(code, i)\n i += len1\n const [offset, len2] = decodeULEB128(code, i)\n i += len2\n lines.push(`${ind()}${simdName}${offset ? ` offset=${offset}` : ''}`)\n } else if (subOp === SimdOp.v128_const) {\n const bytes = code.slice(i, i + 16)\n i += 16\n lines.push(\n `${ind()}v128.const ${bytes\n .map((b) => '0x' + b.toString(16).padStart(2, '0'))\n .join(' ')}`\n )\n } else if (\n subOp === SimdOp.f32x4_extract_lane ||\n subOp === SimdOp.f32x4_replace_lane\n ) {\n const lane = code[i]\n i++\n lines.push(`${ind()}${simdName} ${lane}`)\n } else {\n lines.push(`${ind()}${simdName}`)\n }\n } else {\n lines.push(`${ind()}${name}`)\n }\n }\n\n lines.push(')')\n return lines.join('\\n')\n}\n\n// ============================================================================\n// Type System\n// ============================================================================\n\n/** TJS type that maps to WASM */\ntype WasmValueType = 'i32' | 'i64' | 'f32' | 'f64' | 'v128'\n\n/** Typed array info */\ninterface TypedArrayInfo {\n elementType: WasmValueType\n bytesPerElement: number\n loadOp: number\n storeOp: number\n}\n\nconst TYPED_ARRAYS: Record<string, TypedArrayInfo> = {\n Int8Array: {\n elementType: 'i32',\n bytesPerElement: 1,\n loadOp: Op.i32_load8_s,\n storeOp: Op.i32_store8,\n },\n Uint8Array: {\n elementType: 'i32',\n bytesPerElement: 1,\n loadOp: Op.i32_load8_u,\n storeOp: Op.i32_store8,\n },\n Uint8ClampedArray: {\n elementType: 'i32',\n bytesPerElement: 1,\n loadOp: Op.i32_load8_u,\n storeOp: Op.i32_store8,\n },\n Int16Array: {\n elementType: 'i32',\n bytesPerElement: 2,\n loadOp: Op.i32_load16_s,\n storeOp: Op.i32_store16,\n },\n Uint16Array: {\n elementType: 'i32',\n bytesPerElement: 2,\n loadOp: Op.i32_load16_u,\n storeOp: Op.i32_store16,\n },\n Int32Array: {\n elementType: 'i32',\n bytesPerElement: 4,\n loadOp: Op.i32_load,\n storeOp: Op.i32_store,\n },\n Uint32Array: {\n elementType: 'i32',\n bytesPerElement: 4,\n loadOp: Op.i32_load,\n storeOp: Op.i32_store,\n },\n Float32Array: {\n elementType: 'f32',\n bytesPerElement: 4,\n loadOp: Op.f32_load,\n storeOp: Op.f32_store,\n },\n Float64Array: {\n elementType: 'f64',\n bytesPerElement: 8,\n loadOp: Op.f64_load,\n storeOp: Op.f64_store,\n },\n}\n\n/** Parameter with type annotation */\ninterface TypedParam {\n name: string\n type: WasmValueType\n isArray?: boolean\n arrayType?: string // e.g., \"Float32Array\"\n}\n\n// ============================================================================\n// Compilation Context\n// ============================================================================\n\ninterface CompileContext {\n /** Parameter definitions */\n params: TypedParam[]\n /** Local variable definitions (name -> local index, type) */\n locals: Map<string, { index: number; type: WasmValueType }>\n /** Next available local index */\n nextLocalIndex: number\n /** Local types for the locals section */\n localTypes: WasmValueType[]\n /** Warnings collected during compilation */\n warnings: string[]\n /** Errors collected during compilation */\n errors: string[]\n /** Current loop depth (for break/continue) */\n loopDepth: number\n /** Whether we need to import Math functions */\n needsMathImports: Set<string>\n /** Whether we need memory */\n needsMemory: boolean\n /** Whether the function has a return statement */\n hasReturn: boolean\n /** WAT text representation lines (for debugging) */\n wat: string[]\n /** Current indentation level for WAT */\n watIndent: number\n}\n\nfunction createContext(params: TypedParam[]): CompileContext {\n const ctx: CompileContext = {\n params,\n locals: new Map(),\n nextLocalIndex: params.length,\n localTypes: [],\n warnings: [],\n errors: [],\n loopDepth: 0,\n needsMathImports: new Set(),\n needsMemory: false,\n hasReturn: false,\n wat: [],\n watIndent: 1,\n }\n\n // Add params to locals map\n params.forEach((p, i) => {\n ctx.locals.set(p.name, { index: i, type: p.type })\n })\n\n return ctx\n}\n\nfunction declareLocal(\n ctx: CompileContext,\n name: string,\n type: WasmValueType\n): number {\n if (ctx.locals.has(name)) {\n ctx.errors.push(`Duplicate local declaration: ${name}`)\n return ctx.locals.get(name)!.index\n }\n const index = ctx.nextLocalIndex++\n ctx.locals.set(name, { index, type })\n ctx.localTypes.push(type)\n return index\n}\n\nfunction getLocal(\n ctx: CompileContext,\n name: string\n): { index: number; type: WasmValueType } | undefined {\n return ctx.locals.get(name)\n}\n\n// ============================================================================\n// AST Compilation\n// ============================================================================\n\n/** Compile a statement, return WASM instructions */\nfunction compileStatement(\n node: acorn.Statement,\n ctx: CompileContext\n): number[] {\n switch (node.type) {\n case 'ExpressionStatement': {\n // Expression statement - compile and drop result\n const expr = (node as acorn.ExpressionStatement).expression\n const exprCode = compileExpression(expr, ctx)\n // Drop the result since this is a statement (value not used)\n return [...exprCode, Op.drop]\n }\n\n case 'ReturnStatement': {\n const ret = node as acorn.ReturnStatement\n ctx.hasReturn = true\n if (!ret.argument) {\n // Void return - just return without a value\n return [Op.return]\n }\n const code = compileExpression(ret.argument as acorn.Expression, ctx)\n // Ensure return value is f64 (function always returns f64 if it returns a value)\n const retType = inferExprType(ret.argument as acorn.Expression, ctx)\n if (retType === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (retType === 'f32') {\n code.push(Op.f64_promote_f32)\n }\n code.push(Op.return)\n return code\n }\n\n case 'VariableDeclaration': {\n const decl = node as acorn.VariableDeclaration\n const code: number[] = []\n for (const declarator of decl.declarations) {\n if (declarator.id.type !== 'Identifier') {\n ctx.errors.push('Destructuring not supported in WASM blocks')\n continue\n }\n const name = (declarator.id as acorn.Identifier).name\n // Infer type from initializer or default to f64\n let type: WasmValueType = 'f64'\n if (declarator.init) {\n type = inferExprType(declarator.init as acorn.Expression, ctx)\n }\n const index = declareLocal(ctx, name, type)\n if (declarator.init) {\n code.push(\n ...compileExpression(declarator.init as acorn.Expression, ctx)\n )\n code.push(Op.local_set, ...encodeULEB128(index))\n }\n }\n return code\n }\n\n case 'ForStatement': {\n const forStmt = node as acorn.ForStatement\n return compileForLoop(forStmt, ctx)\n }\n\n case 'IfStatement': {\n const ifStmt = node as acorn.IfStatement\n return compileIf(ifStmt, ctx)\n }\n\n case 'BlockStatement': {\n const block = node as acorn.BlockStatement\n const code: number[] = []\n for (const stmt of block.body) {\n code.push(...compileStatement(stmt, ctx))\n }\n return code\n }\n\n default:\n ctx.errors.push(`Unsupported statement type: ${node.type}`)\n return []\n }\n}\n\n/** Compile a for loop */\nfunction compileForLoop(\n node: acorn.ForStatement,\n ctx: CompileContext\n): number[] {\n const code: number[] = []\n\n // Compile init\n if (node.init) {\n if (node.init.type === 'VariableDeclaration') {\n code.push(...compileStatement(node.init, ctx))\n } else {\n code.push(...compileExpression(node.init as acorn.Expression, ctx))\n }\n }\n\n // block $break\n // loop $continue\n // br_if $break (condition is false)\n // body\n // update\n // br $continue\n // end\n // end\n\n code.push(Op.block, Type.void) // $break block\n code.push(Op.loop, Type.void) // $continue loop\n\n // Test condition - break if false\n if (node.test) {\n code.push(...compileExpression(node.test, ctx))\n code.push(Op.i32_eqz) // invert: break if condition is false\n code.push(Op.br_if, 1) // br to $break (depth 1)\n }\n\n // Body\n ctx.loopDepth++\n if (node.body) {\n code.push(...compileStatement(node.body, ctx))\n }\n ctx.loopDepth--\n\n // Update\n if (node.update) {\n code.push(...compileExpression(node.update, ctx))\n code.push(Op.drop) // discard update expression result\n }\n\n // Continue loop\n code.push(Op.br, 0) // br to $continue (depth 0)\n\n code.push(Op.end) // end loop\n code.push(Op.end) // end block\n\n return code\n}\n\n/** Compile an if statement */\nfunction compileIf(node: acorn.IfStatement, ctx: CompileContext): number[] {\n const code: number[] = []\n\n // Compile condition\n code.push(...compileExpression(node.test, ctx))\n\n // if (result type void since we're not returning a value from if)\n code.push(Op.if, Type.void)\n\n // Consequent\n code.push(...compileStatement(node.consequent, ctx))\n\n // Alternate\n if (node.alternate) {\n code.push(Op.else)\n code.push(...compileStatement(node.alternate, ctx))\n }\n\n code.push(Op.end)\n\n return code\n}\n\n/** Infer the WASM type of an expression */\nfunction inferExprType(\n node: acorn.Expression,\n ctx: CompileContext\n): WasmValueType {\n switch (node.type) {\n case 'Literal': {\n const lit = node as acorn.Literal\n if (typeof lit.value === 'number') {\n // Check if the raw source contains a decimal point (e.g., \"0.0\")\n // This indicates the user wants a float even if the value is an integer\n if (lit.raw && (lit.raw.includes('.') || lit.raw.includes('e'))) {\n return 'f64'\n }\n // Check if it's an integer that fits in i32\n if (\n Number.isInteger(lit.value) &&\n lit.value >= -2147483648 &&\n lit.value <= 2147483647\n ) {\n return 'i32'\n }\n return 'f64'\n }\n return 'f64'\n }\n\n case 'Identifier': {\n const local = getLocal(ctx, (node as acorn.Identifier).name)\n return local?.type ?? 'f64'\n }\n\n case 'BinaryExpression':\n case 'AssignmentExpression': {\n const binExpr = node as acorn.BinaryExpression\n // Comparison operators return i32\n if (\n ['<', '>', '<=', '>=', '==', '!=', '===', '!=='].includes(\n binExpr.operator\n )\n ) {\n return 'i32'\n }\n // Bitwise operators are i32\n if (['|', '&', '^', '<<', '>>', '>>>'].includes(binExpr.operator)) {\n return 'i32'\n }\n // Otherwise infer from operands\n const leftType = inferExprType(binExpr.left as acorn.Expression, ctx)\n const rightType = inferExprType(binExpr.right as acorn.Expression, ctx)\n // v128 operations stay v128\n if (leftType === 'v128' || rightType === 'v128') return 'v128'\n // If either is f64 or f32, result is floating point\n if (leftType === 'f64' || rightType === 'f64') return 'f64'\n if (leftType === 'f32' || rightType === 'f32') return 'f32'\n return 'i32'\n }\n\n case 'UnaryExpression': {\n const unary = node as acorn.UnaryExpression\n if (unary.operator === '!') {\n return 'i32' // boolean result\n }\n // For negation and bitwise not, result type matches argument type\n return inferExprType(unary.argument as acorn.Expression, ctx)\n }\n\n case 'MemberExpression': {\n // Array access - check array type\n const member = node as acorn.MemberExpression\n if (member.object.type === 'Identifier') {\n const local = getLocal(ctx, (member.object as acorn.Identifier).name)\n if (local) {\n const param = ctx.params.find(\n (p) => p.name === (member.object as acorn.Identifier).name\n )\n if (param?.arrayType) {\n const arrayInfo = TYPED_ARRAYS[param.arrayType]\n if (arrayInfo) return arrayInfo.elementType\n }\n }\n }\n return 'f64'\n }\n\n case 'CallExpression': {\n const call = node as acorn.CallExpression\n if (call.callee.type === 'MemberExpression') {\n const callee = call.callee as acorn.MemberExpression\n if (\n callee.object.type === 'Identifier' &&\n (callee.object as acorn.Identifier).name === 'Math'\n ) {\n // Math functions return f64\n return 'f64'\n }\n }\n // SIMD intrinsics\n if (call.callee.type === 'Identifier') {\n const name = (call.callee as acorn.Identifier).name\n if (name === 'f32x4_extract_lane') return 'f32'\n if (name.startsWith('f32x4_') || name === 'v128_load') return 'v128'\n }\n return 'f64'\n }\n\n default:\n return 'f64'\n }\n}\n\n/** Compile an expression, return WASM instructions */\nfunction compileExpression(\n node: acorn.Expression,\n ctx: CompileContext\n): number[] {\n switch (node.type) {\n case 'Literal': {\n const lit = node as acorn.Literal\n if (typeof lit.value === 'number') {\n const type = inferExprType(node, ctx)\n if (type === 'i32') {\n return [Op.i32_const, ...encodeSLEB128(lit.value | 0)]\n } else if (type === 'f32') {\n return [Op.f32_const, ...encodeF32(lit.value)]\n } else {\n return [Op.f64_const, ...encodeF64(lit.value)]\n }\n }\n ctx.errors.push(`Unsupported literal type: ${typeof lit.value}`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n\n case 'Identifier': {\n const name = (node as acorn.Identifier).name\n const local = getLocal(ctx, name)\n if (local) {\n return [Op.local_get, ...encodeULEB128(local.index)]\n }\n ctx.errors.push(`Unknown identifier: ${name}`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n\n case 'BinaryExpression': {\n const bin = node as acorn.BinaryExpression\n return compileBinaryExpr(bin, ctx)\n }\n\n case 'UnaryExpression': {\n const unary = node as acorn.UnaryExpression\n return compileUnaryExpr(unary, ctx)\n }\n\n case 'AssignmentExpression': {\n const assign = node as acorn.AssignmentExpression\n return compileAssignment(assign, ctx)\n }\n\n case 'UpdateExpression': {\n const update = node as acorn.UpdateExpression\n return compileUpdate(update, ctx)\n }\n\n case 'MemberExpression': {\n const member = node as acorn.MemberExpression\n return compileArrayAccess(member, ctx)\n }\n\n case 'CallExpression': {\n const call = node as acorn.CallExpression\n return compileCall(call, ctx)\n }\n\n case 'SequenceExpression': {\n const seq = node as acorn.SequenceExpression\n const code: number[] = []\n for (let i = 0; i < seq.expressions.length; i++) {\n code.push(...compileExpression(seq.expressions[i], ctx))\n // Drop all but last value\n if (i < seq.expressions.length - 1) {\n code.push(Op.drop)\n }\n }\n return code\n }\n\n default:\n ctx.errors.push(`Unsupported expression type: ${node.type}`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n}\n\n/** Compile a binary expression */\nfunction compileBinaryExpr(\n node: acorn.BinaryExpression,\n ctx: CompileContext\n): number[] {\n const left = compileExpression(node.left as acorn.Expression, ctx)\n const right = compileExpression(node.right as acorn.Expression, ctx)\n const resultType = inferExprType(node, ctx)\n\n // Type coercion if needed\n const leftType = inferExprType(node.left as acorn.Expression, ctx)\n const rightType = inferExprType(node.right as acorn.Expression, ctx)\n\n // Determine operand type for the operation\n const isComparison = [\n '<',\n '>',\n '<=',\n '>=',\n '==',\n '===',\n '!=',\n '!==',\n ].includes(node.operator)\n\n // For comparisons and arithmetic, we need operands to match\n // Promote to the \"wider\" type\n let opType: WasmValueType\n if (leftType === 'f64' || rightType === 'f64') {\n opType = 'f64'\n } else if (leftType === 'f32' || rightType === 'f32') {\n opType = 'f32'\n } else {\n opType = 'i32'\n }\n\n // For non-comparison ops, use result type if it's wider\n if (!isComparison && resultType === 'f64') {\n opType = 'f64'\n }\n\n let leftCode = left\n let rightCode = right\n\n // Coerce operands to opType\n if (opType === 'f64') {\n if (leftType === 'i32') {\n leftCode = [...left, Op.f64_convert_i32_s]\n } else if (leftType === 'f32') {\n leftCode = [...left, Op.f64_promote_f32]\n }\n if (rightType === 'i32') {\n rightCode = [...right, Op.f64_convert_i32_s]\n } else if (rightType === 'f32') {\n rightCode = [...right, Op.f64_promote_f32]\n }\n } else if (opType === 'f32') {\n if (leftType === 'i32') {\n leftCode = [...left, Op.f32_convert_i32_s]\n }\n if (rightType === 'i32') {\n rightCode = [...right, Op.f32_convert_i32_s]\n }\n }\n\n const opMap: Record<string, Record<string, number>> = {\n '+': { i32: Op.i32_add, f32: Op.f32_add, f64: Op.f64_add },\n '-': { i32: Op.i32_sub, f32: Op.f32_sub, f64: Op.f64_sub },\n '*': { i32: Op.i32_mul, f32: Op.f32_mul, f64: Op.f64_mul },\n '/': { i32: Op.i32_div_s, f32: Op.f32_div, f64: Op.f64_div },\n '%': { i32: Op.i32_rem_s },\n '<': { i32: Op.i32_lt_s, f32: Op.f32_lt, f64: Op.f64_lt },\n '>': { i32: Op.i32_gt_s, f32: Op.f32_gt, f64: Op.f64_gt },\n '<=': { i32: Op.i32_le_s, f32: Op.f32_le, f64: Op.f64_le },\n '>=': { i32: Op.i32_ge_s, f32: Op.f32_ge, f64: Op.f64_ge },\n '==': { i32: Op.i32_eq, f32: Op.f32_eq, f64: Op.f64_eq },\n '===': { i32: Op.i32_eq, f32: Op.f32_eq, f64: Op.f64_eq },\n '!=': { i32: Op.i32_ne, f32: Op.f32_ne, f64: Op.f64_ne },\n '!==': { i32: Op.i32_ne, f32: Op.f32_ne, f64: Op.f64_ne },\n '|': { i32: Op.i32_or },\n '&': { i32: Op.i32_and },\n '^': { i32: Op.i32_xor },\n '<<': { i32: Op.i32_shl },\n '>>': { i32: Op.i32_shr_s },\n '>>>': { i32: Op.i32_shr_u },\n }\n\n const ops = opMap[node.operator]\n if (!ops) {\n ctx.errors.push(`Unsupported operator: ${node.operator}`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n\n const opcode = ops[opType] ?? ops.f64 ?? ops.i32\n if (opcode === undefined) {\n ctx.errors.push(\n `Operator ${node.operator} not supported for type ${opType}`\n )\n return [Op.f64_const, ...encodeF64(0)]\n }\n\n return [...leftCode, ...rightCode, opcode]\n}\n\n/** Compile a unary expression */\nfunction compileUnaryExpr(\n node: acorn.UnaryExpression,\n ctx: CompileContext\n): number[] {\n const arg = compileExpression(node.argument as acorn.Expression, ctx)\n const type = inferExprType(node.argument as acorn.Expression, ctx)\n\n switch (node.operator) {\n case '-':\n if (type === 'i32') {\n // 0 - x\n return [Op.i32_const, 0, ...arg, Op.i32_sub]\n } else if (type === 'f32') {\n return [...arg, Op.f32_neg]\n } else {\n return [...arg, Op.f64_neg]\n }\n\n case '!':\n // Boolean not: x == 0\n return [...arg, Op.i32_eqz]\n\n case '~':\n // Bitwise not: x ^ -1\n return [...arg, Op.i32_const, ...encodeSLEB128(-1), Op.i32_xor]\n\n default:\n ctx.errors.push(`Unsupported unary operator: ${node.operator}`)\n return arg\n }\n}\n\n/** Compile an assignment expression */\nfunction compileAssignment(\n node: acorn.AssignmentExpression,\n ctx: CompileContext\n): number[] {\n // Handle array element assignment: arr[i] = value\n if (node.left.type === 'MemberExpression') {\n return compileArrayStore(\n node.left as acorn.MemberExpression,\n node.right as acorn.Expression,\n node.operator,\n ctx\n )\n }\n\n // Handle simple variable assignment\n if (node.left.type !== 'Identifier') {\n ctx.errors.push('Assignment target must be identifier or array element')\n return []\n }\n\n const name = (node.left as acorn.Identifier).name\n const local = getLocal(ctx, name)\n if (!local) {\n ctx.errors.push(`Unknown variable: ${name}`)\n return []\n }\n\n const code: number[] = []\n\n if (node.operator === '=') {\n code.push(...compileExpression(node.right as acorn.Expression, ctx))\n // Type coercion if needed\n const valType = inferExprType(node.right as acorn.Expression, ctx)\n if (local.type === 'f64' && valType === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (local.type === 'f64' && valType === 'f32') {\n code.push(Op.f64_promote_f32)\n } else if (local.type === 'i32' && valType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n } else if (local.type === 'i32' && valType === 'f32') {\n code.push(Op.i32_trunc_f32_s)\n } else if (local.type === 'f32' && valType === 'i32') {\n code.push(Op.f32_convert_i32_s)\n } else if (local.type === 'f32' && valType === 'f64') {\n code.push(Op.f32_demote_f64)\n }\n } else {\n // Compound assignment: +=, -=, etc.\n const valType = inferExprType(node.right as acorn.Expression, ctx)\n\n // Determine operation type - promote to wider type for the operation\n let opType: WasmValueType = local.type\n if (valType === 'f64' || local.type === 'f64') {\n opType = 'f64'\n } else if (valType === 'f32' || local.type === 'f32') {\n opType = 'f32'\n }\n\n // Get left operand and convert to opType if needed\n code.push(Op.local_get, ...encodeULEB128(local.index))\n if (opType === 'f64' && local.type === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (opType === 'f64' && local.type === 'f32') {\n code.push(Op.f64_promote_f32)\n } else if (opType === 'f32' && local.type === 'i32') {\n code.push(Op.f32_convert_i32_s)\n }\n\n // Get right operand and convert to opType if needed\n code.push(...compileExpression(node.right as acorn.Expression, ctx))\n if (opType === 'f64' && valType === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (opType === 'f64' && valType === 'f32') {\n code.push(Op.f64_promote_f32)\n } else if (opType === 'f32' && valType === 'i32') {\n code.push(Op.f32_convert_i32_s)\n }\n\n // Perform operation in opType\n const op = node.operator.slice(0, -1) // Remove '='\n const opMap: Record<string, Record<string, number>> = {\n '+': { i32: Op.i32_add, f32: Op.f32_add, f64: Op.f64_add },\n '-': { i32: Op.i32_sub, f32: Op.f32_sub, f64: Op.f64_sub },\n '*': { i32: Op.i32_mul, f32: Op.f32_mul, f64: Op.f64_mul },\n '/': { i32: Op.i32_div_s, f32: Op.f32_div, f64: Op.f64_div },\n }\n const opcode = opMap[op]?.[opType]\n if (!opcode) {\n ctx.errors.push(`Unsupported compound assignment: ${node.operator}`)\n return []\n }\n code.push(opcode)\n\n // Convert result back to local type if needed\n if (local.type === 'i32' && opType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n } else if (local.type === 'i32' && opType === 'f32') {\n code.push(Op.i32_trunc_f32_s)\n } else if (local.type === 'f32' && opType === 'f64') {\n code.push(Op.f32_demote_f64)\n }\n }\n\n code.push(Op.local_tee, ...encodeULEB128(local.index)) // tee returns the value\n\n return code\n}\n\n/** Compile an update expression (++, --) */\nfunction compileUpdate(\n node: acorn.UpdateExpression,\n ctx: CompileContext\n): number[] {\n if (node.argument.type !== 'Identifier') {\n ctx.errors.push('Update expression argument must be identifier')\n return []\n }\n\n const name = (node.argument as acorn.Identifier).name\n const local = getLocal(ctx, name)\n if (!local) {\n ctx.errors.push(`Unknown variable: ${name}`)\n return []\n }\n\n const code: number[] = []\n const isI32 = local.type === 'i32'\n\n if (node.prefix) {\n // ++x or --x: modify then return new value\n code.push(Op.local_get, ...encodeULEB128(local.index))\n if (isI32) {\n code.push(Op.i32_const, 1)\n code.push(node.operator === '++' ? Op.i32_add : Op.i32_sub)\n } else {\n code.push(Op.f64_const, ...encodeF64(1))\n code.push(node.operator === '++' ? Op.f64_add : Op.f64_sub)\n }\n code.push(Op.local_tee, ...encodeULEB128(local.index))\n } else {\n // x++ or x--: return old value, then modify\n code.push(Op.local_get, ...encodeULEB128(local.index))\n // Store incremented value\n code.push(Op.local_get, ...encodeULEB128(local.index))\n if (isI32) {\n code.push(Op.i32_const, 1)\n code.push(node.operator === '++' ? Op.i32_add : Op.i32_sub)\n } else {\n code.push(Op.f64_const, ...encodeF64(1))\n code.push(node.operator === '++' ? Op.f64_add : Op.f64_sub)\n }\n code.push(Op.local_set, ...encodeULEB128(local.index))\n }\n\n return code\n}\n\n/** Compile array element access: arr[i] */\nfunction compileArrayAccess(\n node: acorn.MemberExpression,\n ctx: CompileContext\n): number[] {\n if (node.object.type !== 'Identifier') {\n ctx.errors.push('Array access requires identifier')\n return []\n }\n\n const name = (node.object as acorn.Identifier).name\n const param = ctx.params.find((p) => p.name === name)\n\n if (!param?.isArray || !param.arrayType) {\n ctx.errors.push(`${name} is not a typed array parameter`)\n return []\n }\n\n const arrayInfo = TYPED_ARRAYS[param.arrayType]\n if (!arrayInfo) {\n ctx.errors.push(`Unknown array type: ${param.arrayType}`)\n return []\n }\n\n ctx.needsMemory = true\n\n const code: number[] = []\n\n // Get base address (array pointer param)\n const local = getLocal(ctx, name)\n if (!local) {\n ctx.errors.push(`Unknown array: ${name}`)\n return []\n }\n code.push(Op.local_get, ...encodeULEB128(local.index))\n\n // Compute offset: index * bytesPerElement\n if (!node.computed || !node.property) {\n ctx.errors.push('Array access requires computed index')\n return []\n }\n\n const indexCode = compileExpression(node.property as acorn.Expression, ctx)\n const indexType = inferExprType(node.property as acorn.Expression, ctx)\n\n code.push(...indexCode)\n\n // Convert index to i32 if needed\n if (indexType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n }\n\n // Multiply by bytes per element\n if (arrayInfo.bytesPerElement > 1) {\n code.push(Op.i32_const, ...encodeSLEB128(arrayInfo.bytesPerElement))\n code.push(Op.i32_mul)\n }\n\n // Add base address\n code.push(Op.i32_add)\n\n // Load value (align=0, offset=0)\n code.push(arrayInfo.loadOp, 0, 0)\n\n return code\n}\n\n/** Compile array element store: arr[i] = value */\nfunction compileArrayStore(\n target: acorn.MemberExpression,\n value: acorn.Expression,\n operator: string,\n ctx: CompileContext\n): number[] {\n if (target.object.type !== 'Identifier') {\n ctx.errors.push('Array store requires identifier')\n return []\n }\n\n const name = (target.object as acorn.Identifier).name\n const param = ctx.params.find((p) => p.name === name)\n\n if (!param?.isArray || !param.arrayType) {\n ctx.errors.push(`${name} is not a typed array parameter`)\n return []\n }\n\n const arrayInfo = TYPED_ARRAYS[param.arrayType]\n if (!arrayInfo) {\n ctx.errors.push(`Unknown array type: ${param.arrayType}`)\n return []\n }\n\n ctx.needsMemory = true\n\n const code: number[] = []\n\n // Get local for array pointer\n const local = getLocal(ctx, name)\n if (!local) return []\n\n if (!target.computed || !target.property) {\n ctx.errors.push('Array store requires computed index')\n return []\n }\n\n const indexCode = compileExpression(target.property as acorn.Expression, ctx)\n const indexType = inferExprType(target.property as acorn.Expression, ctx)\n\n // Helper to generate address computation code\n const computeAddress = (): number[] => {\n const addr: number[] = []\n addr.push(Op.local_get, ...encodeULEB128(local.index))\n addr.push(...indexCode)\n if (indexType === 'f64') {\n addr.push(Op.i32_trunc_f64_s)\n }\n if (arrayInfo.bytesPerElement > 1) {\n addr.push(Op.i32_const, ...encodeSLEB128(arrayInfo.bytesPerElement))\n addr.push(Op.i32_mul)\n }\n addr.push(Op.i32_add)\n return addr\n }\n\n // Compile value\n if (operator === '=') {\n code.push(...compileExpression(value, ctx))\n } else {\n // Compound assignment - load current value, compute, store\n // Use a temp local to store address for reuse\n const addrLocal = declareLocal(ctx, `__addr_${ctx.nextLocalIndex}`, 'i32')\n\n // Compute address and save it\n code.push(...computeAddress())\n code.push(Op.local_tee, ...encodeULEB128(addrLocal))\n code.push(arrayInfo.loadOp, 0, 0)\n\n // Compile right side and convert to match array element type\n code.push(...compileExpression(value, ctx))\n const rhsType = inferExprType(value, ctx)\n if (arrayInfo.elementType === 'f32' && rhsType === 'f64') {\n code.push(Op.f32_demote_f64)\n } else if (arrayInfo.elementType === 'f64' && rhsType === 'f32') {\n code.push(Op.f64_promote_f32)\n } else if (arrayInfo.elementType === 'f32' && rhsType === 'i32') {\n code.push(Op.f32_convert_i32_s)\n } else if (arrayInfo.elementType === 'f64' && rhsType === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (arrayInfo.elementType === 'i32' && rhsType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n } else if (arrayInfo.elementType === 'i32' && rhsType === 'f32') {\n code.push(Op.i32_trunc_f32_s)\n }\n\n const op = operator.slice(0, -1)\n const opMap: Record<string, number> = {\n '+':\n arrayInfo.elementType === 'i32'\n ? Op.i32_add\n : arrayInfo.elementType === 'f32'\n ? Op.f32_add\n : Op.f64_add,\n '-':\n arrayInfo.elementType === 'i32'\n ? Op.i32_sub\n : arrayInfo.elementType === 'f32'\n ? Op.f32_sub\n : Op.f64_sub,\n '*':\n arrayInfo.elementType === 'i32'\n ? Op.i32_mul\n : arrayInfo.elementType === 'f32'\n ? Op.f32_mul\n : Op.f64_mul,\n }\n code.push(opMap[op] ?? Op.f64_add)\n\n // Store: need address then value\n // Swap: store value in temp, get address, get value back\n const valLocal = declareLocal(\n ctx,\n `__val_${ctx.nextLocalIndex}`,\n arrayInfo.elementType\n )\n code.push(Op.local_set, ...encodeULEB128(valLocal))\n code.push(Op.local_get, ...encodeULEB128(addrLocal))\n code.push(Op.local_get, ...encodeULEB128(valLocal))\n code.push(arrayInfo.storeOp, 0, 0)\n\n // Return the stored value\n code.push(Op.local_get, ...encodeULEB128(valLocal))\n return code\n }\n\n // Convert value type if needed\n const valType = inferExprType(value, ctx)\n if (arrayInfo.elementType === 'f32' && valType === 'f64') {\n code.push(Op.f32_demote_f64)\n } else if (arrayInfo.elementType === 'f64' && valType === 'f32') {\n code.push(Op.f64_promote_f32)\n } else if (arrayInfo.elementType === 'i32' && valType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n }\n\n // Store needs address then value - we have value on top\n // Swap using temp local\n const tempLocal = declareLocal(\n ctx,\n `__tmp_${ctx.nextLocalIndex}`,\n arrayInfo.elementType\n )\n code.push(Op.local_set, ...encodeULEB128(tempLocal))\n\n // Recompute address (simpler than complex stack manipulation)\n code.push(Op.local_get, ...encodeULEB128(local.index))\n code.push(...indexCode)\n if (indexType === 'f64') {\n code.push(Op.i32_trunc_f64_s)\n }\n if (arrayInfo.bytesPerElement > 1) {\n code.push(Op.i32_const, ...encodeSLEB128(arrayInfo.bytesPerElement))\n code.push(Op.i32_mul)\n }\n code.push(Op.i32_add)\n\n code.push(Op.local_get, ...encodeULEB128(tempLocal))\n code.push(arrayInfo.storeOp, 0, 0)\n\n // Return stored value\n code.push(Op.local_get, ...encodeULEB128(tempLocal))\n\n return code\n}\n\n/** Compile a function call */\nfunction compileCall(\n node: acorn.CallExpression,\n ctx: CompileContext\n): number[] {\n // Handle Math.xxx calls\n if (node.callee.type === 'MemberExpression') {\n const callee = node.callee as acorn.MemberExpression\n if (\n callee.object.type === 'Identifier' &&\n (callee.object as acorn.Identifier).name === 'Math' &&\n callee.property.type === 'Identifier'\n ) {\n const method = (callee.property as acorn.Identifier).name\n return compileMathCall(method, node.arguments as acorn.Expression[], ctx)\n }\n }\n\n // Handle SIMD intrinsics: f32x4_xxx(...), v128_load(...)\n if (node.callee.type === 'Identifier') {\n const name = (node.callee as acorn.Identifier).name\n if (name.startsWith('f32x4_') || name.startsWith('v128_')) {\n return compileSIMDCall(name, node.arguments as acorn.Expression[], ctx)\n }\n }\n\n ctx.errors.push(`Unsupported function call: ${node.callee.type}`)\n return [Op.f64_const, ...encodeF64(0)]\n}\n\n/** Compile SIMD intrinsic calls */\nfunction compileSIMDCall(\n name: string,\n args: acorn.Expression[],\n ctx: CompileContext\n): number[] {\n ctx.needsMemory = true\n const code: number[] = []\n\n switch (name) {\n case 'v128_load':\n case 'f32x4_load': {\n // f32x4_load(arrayPtr, byteOffset) \u2192 v128\n code.push(...compileExpression(args[0], ctx))\n const ptrType = inferExprType(args[0], ctx)\n if (ptrType === 'f64') code.push(Op.i32_trunc_f64_s)\n code.push(...compileExpression(args[1], ctx))\n const offType = inferExprType(args[1], ctx)\n if (offType === 'f64') code.push(Op.i32_trunc_f64_s)\n else if (offType === 'f32') code.push(Op.i32_trunc_f32_s)\n code.push(Op.i32_add)\n // v128.load align=2 (2^2=4, f32 natural alignment), offset=0\n code.push(...encodeSIMDMemarg(SimdOp.v128_load, 2, 0))\n return code\n }\n\n case 'v128_store':\n case 'f32x4_store': {\n // f32x4_store(arrayPtr, byteOffset, v128value) \u2192 void (push dummy for drop)\n code.push(...compileExpression(args[0], ctx))\n const ptrType = inferExprType(args[0], ctx)\n if (ptrType === 'f64') code.push(Op.i32_trunc_f64_s)\n code.push(...compileExpression(args[1], ctx))\n const offType = inferExprType(args[1], ctx)\n if (offType === 'f64') code.push(Op.i32_trunc_f64_s)\n else if (offType === 'f32') code.push(Op.i32_trunc_f32_s)\n code.push(Op.i32_add)\n code.push(...compileExpression(args[2], ctx))\n code.push(...encodeSIMDMemarg(SimdOp.v128_store, 2, 0))\n // v128.store doesn't push a value; push dummy i32 0 so ExpressionStatement's drop works\n code.push(Op.i32_const, 0)\n return code\n }\n\n case 'f32x4_splat': {\n // f32x4_splat(scalar) \u2192 v128\n code.push(...compileExpression(args[0], ctx))\n const argType = inferExprType(args[0], ctx)\n if (argType === 'i32') code.push(Op.f32_convert_i32_s)\n else if (argType === 'f64') code.push(Op.f32_demote_f64)\n code.push(...encodeSIMD(SimdOp.f32x4_splat))\n return code\n }\n\n case 'f32x4_extract_lane': {\n // f32x4_extract_lane(vec, laneIndex) \u2192 f32\n code.push(...compileExpression(args[0], ctx))\n const lane = (args[1] as acorn.Literal).value as number\n if (!Number.isInteger(lane) || lane < 0 || lane > 3) {\n ctx.errors.push(`f32x4_extract_lane: lane must be 0-3, got ${lane}`)\n return [Op.f32_const, ...encodeF32(0)]\n }\n code.push(SIMD_PREFIX, ...encodeULEB128(SimdOp.f32x4_extract_lane), lane)\n return code\n }\n\n case 'f32x4_replace_lane': {\n // f32x4_replace_lane(vec, laneIndex, scalar) \u2192 v128\n code.push(...compileExpression(args[0], ctx))\n const lane = (args[1] as acorn.Literal).value as number\n if (!Number.isInteger(lane) || lane < 0 || lane > 3) {\n ctx.errors.push(`f32x4_replace_lane: lane must be 0-3, got ${lane}`)\n return [Op.f32_const, ...encodeF32(0)]\n }\n code.push(...compileExpression(args[2], ctx))\n const valType = inferExprType(args[2], ctx)\n if (valType === 'i32') code.push(Op.f32_convert_i32_s)\n else if (valType === 'f64') code.push(Op.f32_demote_f64)\n code.push(SIMD_PREFIX, ...encodeULEB128(SimdOp.f32x4_replace_lane), lane)\n return code\n }\n\n case 'f32x4_add':\n case 'f32x4_sub':\n case 'f32x4_mul':\n case 'f32x4_div': {\n // Binary v128 op: f32x4_add(a, b) \u2192 v128\n code.push(...compileExpression(args[0], ctx))\n code.push(...compileExpression(args[1], ctx))\n const opMap: Record<string, number> = {\n f32x4_add: SimdOp.f32x4_add,\n f32x4_sub: SimdOp.f32x4_sub,\n f32x4_mul: SimdOp.f32x4_mul,\n f32x4_div: SimdOp.f32x4_div,\n }\n code.push(...encodeSIMD(opMap[name]))\n return code\n }\n\n case 'f32x4_neg':\n case 'f32x4_sqrt': {\n // Unary v128 op: f32x4_neg(a) \u2192 v128\n code.push(...compileExpression(args[0], ctx))\n const unaryMap: Record<string, number> = {\n f32x4_neg: SimdOp.f32x4_neg,\n f32x4_sqrt: SimdOp.f32x4_sqrt,\n }\n code.push(...encodeSIMD(unaryMap[name]))\n return code\n }\n\n default:\n ctx.errors.push(`Unknown SIMD intrinsic: ${name}`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n}\n\n/** Compile Math.xxx calls */\nfunction compileMathCall(\n method: string,\n args: acorn.Expression[],\n ctx: CompileContext\n): number[] {\n const code: number[] = []\n\n // Compile arguments\n for (const arg of args) {\n code.push(...compileExpression(arg, ctx))\n // Ensure f64 for math functions\n const type = inferExprType(arg, ctx)\n if (type === 'i32') {\n code.push(Op.f64_convert_i32_s)\n } else if (type === 'f32') {\n code.push(Op.f64_promote_f32)\n }\n }\n\n // Map to WASM ops or imports\n const builtins: Record<string, number> = {\n abs: Op.f64_abs,\n ceil: Op.f64_ceil,\n floor: Op.f64_floor,\n trunc: Op.f64_trunc,\n sqrt: Op.f64_sqrt,\n min: Op.f64_min,\n max: Op.f64_max,\n }\n\n const opcode = builtins[method]\n if (opcode !== undefined) {\n code.push(opcode)\n return code\n }\n\n // Functions that need imports (sin, cos, etc.)\n const needsImport = [\n 'sin',\n 'cos',\n 'tan',\n 'asin',\n 'acos',\n 'atan',\n 'atan2',\n 'exp',\n 'log',\n 'pow',\n ]\n if (needsImport.includes(method)) {\n ctx.needsMathImports.add(method)\n // Will be handled by import section\n // For now, error\n ctx.errors.push(`Math.${method} requires JS import (not yet implemented)`)\n return [Op.f64_const, ...encodeF64(0)]\n }\n\n ctx.errors.push(`Unknown Math method: ${method}`)\n return [Op.f64_const, ...encodeF64(0)]\n}\n\n// ============================================================================\n// Module Building\n// ============================================================================\n\n/** Parse type annotation from capture string like \"arr: Float32Array\" */\nfunction parseTypeAnnotation(capture: string): TypedParam {\n const parts = capture.split(':').map((s) => s.trim())\n const name = parts[0]\n\n if (parts.length === 1) {\n // No annotation - default to f64\n return { name, type: 'f64' }\n }\n\n const typeStr = parts[1]\n\n // Check for typed arrays\n if (TYPED_ARRAYS[typeStr]) {\n return { name, type: 'i32', isArray: true, arrayType: typeStr }\n }\n\n // Check for primitives\n const typeMap: Record<string, WasmValueType> = {\n i32: 'i32',\n i64: 'i64',\n f32: 'f32',\n f64: 'f64',\n number: 'f64',\n int: 'i32',\n }\n\n return { name, type: typeMap[typeStr] ?? 'f64' }\n}\n\n/** Build a complete WASM module */\nfunction buildModule(\n params: TypedParam[],\n bodyCode: number[],\n localTypes: WasmValueType[],\n needsMemory: boolean,\n hasReturn: boolean\n): number[] {\n // Magic number and version\n const header = [0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]\n\n // Type section: function signature\n const paramWasmTypes = params.map((p) => Type[p.type])\n const returnSpec = hasReturn ? [0x01, Type.f64] : [0x00] // one f64 return OR void\n const typeSection = encodeSection(Section.type, [\n 0x01, // one type\n 0x60, // func type\n ...encodeULEB128(params.length),\n ...paramWasmTypes,\n ...returnSpec,\n ])\n\n // Memory section (if needed)\n const memorySection: number[] = []\n if (needsMemory) {\n // Import memory from JS instead of declaring it\n // This lets us share memory with typed arrays\n }\n\n // Import section for memory\n let importSection: number[] = []\n if (needsMemory) {\n importSection = encodeSection(Section.import, [\n 0x01, // one import\n ...encodeString('env'),\n ...encodeString('memory'),\n 0x02, // memory\n 0x00, // flags: no max\n 0x01, // initial: 1 page (64KB)\n ])\n }\n\n // Function section: function 0 has type 0\n const funcSection = encodeSection(Section.function, [\n 0x01, // one function\n 0x00, // type index 0\n ])\n\n // Export section: export function as \"compute\"\n const exportSection = encodeSection(Section.export, [\n 0x01, // one export\n ...encodeString('compute'),\n 0x00, // export kind: function\n 0x00, // function index 0\n ])\n\n // Code section\n // Encode locals: group by type\n const localGroups: number[][] = []\n if (localTypes.length > 0) {\n let currentType = localTypes[0]\n let count = 1\n for (let i = 1; i < localTypes.length; i++) {\n if (localTypes[i] === currentType) {\n count++\n } else {\n localGroups.push([...encodeULEB128(count), Type[currentType]])\n currentType = localTypes[i]\n count = 1\n }\n }\n localGroups.push([...encodeULEB128(count), Type[currentType]])\n }\n\n const localsEncoded = [\n ...encodeULEB128(localGroups.length),\n ...localGroups.flat(),\n ]\n\n const funcBody = [...localsEncoded, ...bodyCode, Op.end]\n\n const codeSection = encodeSection(Section.code, [\n 0x01, // one function\n ...encodeULEB128(funcBody.length),\n ...funcBody,\n ])\n\n // Assemble module\n const sections = [...header, ...typeSection]\n\n if (importSection.length > 0) {\n sections.push(...importSection)\n }\n\n sections.push(...funcSection, ...exportSection, ...codeSection)\n\n return sections\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/** Compile result */\nexport interface WasmCompileResult {\n /** The compiled WebAssembly module bytes */\n bytes: Uint8Array\n /** Any warnings during compilation */\n warnings: string[]\n /** Whether compilation succeeded */\n success: boolean\n /** Error message if compilation failed */\n error?: string\n /** Whether the module needs imported memory */\n needsMemory?: boolean\n /** WAT text representation (for debugging) */\n wat?: string\n}\n\n/**\n * Compile a WASM block to WebAssembly\n */\nexport function compileToWasm(block: WasmBlock): WasmCompileResult {\n try {\n // Parse type annotations from captures\n const params = block.captures.map(parseTypeAnnotation)\n\n // Parse the body as JavaScript\n let ast: acorn.Program\n try {\n // Wrap in function to allow return statements\n const wrapped = `function __wasm__(${params\n .map((p) => p.name)\n .join(', ')}) { ${block.body} }`\n ast = acorn.parse(wrapped, { ecmaVersion: 2022 }) as acorn.Program\n } catch (e: any) {\n return {\n bytes: new Uint8Array(),\n warnings: [],\n success: false,\n error: `Parse error: ${e.message}`,\n }\n }\n\n // Get the function body\n const funcDecl = ast.body[0] as acorn.FunctionDeclaration\n const body = funcDecl.body.body\n\n // Create compilation context\n const ctx = createContext(params)\n\n // Compile statements\n const code: number[] = []\n for (const stmt of body) {\n code.push(...compileStatement(stmt, ctx))\n }\n\n // Check for errors\n if (ctx.errors.length > 0) {\n return {\n bytes: new Uint8Array(),\n warnings: ctx.warnings,\n success: false,\n error: ctx.errors.join('; '),\n }\n }\n\n // Build the module\n const moduleBytes = buildModule(\n params,\n code,\n ctx.localTypes,\n ctx.needsMemory,\n ctx.hasReturn\n )\n\n // Generate WAT disassembly for debugging\n const watText = disassemble(code, params, ctx.localTypes)\n\n return {\n bytes: new Uint8Array(moduleBytes),\n warnings: ctx.warnings,\n success: true,\n needsMemory: ctx.needsMemory,\n wat: watText,\n }\n } catch (e: any) {\n return {\n bytes: new Uint8Array(),\n warnings: [],\n success: false,\n error: e.message,\n }\n }\n}\n\n/**\n * Instantiate a compiled WASM module\n */\nexport async function instantiateWasm(\n bytes: Uint8Array,\n memory?: WebAssembly.Memory\n): Promise<WebAssembly.Instance> {\n const imports: WebAssembly.Imports = {}\n\n if (memory) {\n imports.env = { memory }\n }\n\n const module = await WebAssembly.compile(bytes)\n return WebAssembly.instantiate(module, imports)\n}\n\n/**\n * Create a callable function from a WASM block with typed array support\n */\nexport async function createWasmFunction(block: WasmBlock): Promise<{\n fn: (...args: any[]) => any\n memory?: WebAssembly.Memory\n success: boolean\n error?: string\n}> {\n const result = compileToWasm(block)\n\n if (!result.success) {\n return { fn: () => 0, success: false, error: result.error }\n }\n\n try {\n let memory: WebAssembly.Memory | undefined\n\n if (result.needsMemory) {\n // Create shared memory for typed arrays (256 pages = 16MB)\n memory = new WebAssembly.Memory({ initial: 256 })\n }\n\n const instance = await instantiateWasm(result.bytes, memory)\n const compute = instance.exports.compute as (...args: number[]) => number\n\n // Wrap to handle typed array arguments\n const params = block.captures.map(parseTypeAnnotation)\n const hasArrays = params.some((p) => p.isArray)\n\n if (!hasArrays) {\n return { fn: compute, memory, success: true }\n }\n\n // Create wrapper that copies typed arrays to/from WASM memory\n const wrappedFn = (...args: any[]) => {\n if (!memory) throw new Error('Memory not initialized')\n\n const memoryView = new Uint8Array(memory.buffer)\n let offset = 0\n const pointers: number[] = []\n\n // Copy input arrays to memory\n for (let i = 0; i < params.length; i++) {\n const param = params[i]\n const arg = args[i]\n\n if (param.isArray && arg instanceof Object && 'buffer' in arg) {\n const typedArray = arg as\n | Float32Array\n | Float64Array\n | Int32Array\n | Uint8Array\n const bytes = new Uint8Array(\n typedArray.buffer,\n typedArray.byteOffset,\n typedArray.byteLength\n )\n memoryView.set(bytes, offset)\n pointers.push(offset)\n offset += bytes.length\n // Align to 8 bytes\n offset = (offset + 15) & ~15\n } else {\n pointers.push(arg as number)\n }\n }\n\n // Call WASM function\n const resultVal = compute(...pointers)\n\n // Copy output arrays back (they're modified in place)\n offset = 0\n for (let i = 0; i < params.length; i++) {\n const param = params[i]\n const arg = args[i]\n\n if (param.isArray && arg instanceof Object && 'buffer' in arg) {\n const typedArray = arg as\n | Float32Array\n | Float64Array\n | Int32Array\n | Uint8Array\n const bytes = new Uint8Array(\n typedArray.buffer,\n typedArray.byteOffset,\n typedArray.byteLength\n )\n bytes.set(memoryView.slice(offset, offset + bytes.length))\n offset += bytes.length\n offset = (offset + 15) & ~15\n }\n }\n\n return resultVal\n }\n\n return { fn: wrappedFn, memory, success: true }\n } catch (e: any) {\n return { fn: () => 0, success: false, error: e.message }\n }\n}\n\n/**\n * Compile and register a WASM block globally\n */\nexport async function registerWasmBlock(block: WasmBlock): Promise<boolean> {\n const result = await createWasmFunction(block)\n\n if (!result.success) {\n console.warn(`WASM compilation failed for ${block.id}:`, result.error)\n return false\n }\n\n // Register globally\n ;(globalThis as any)[block.id] = result.fn\n\n return true\n}\n\n/**\n * Compile all WASM blocks from a preprocessed source\n */\nexport async function compileWasmBlocks(blocks: WasmBlock[]): Promise<{\n compiled: number\n failed: number\n errors: string[]\n}> {\n let compiled = 0\n let failed = 0\n const errors: string[] = []\n\n for (const block of blocks) {\n const success = await registerWasmBlock(block)\n if (success) {\n compiled++\n } else {\n failed++\n errors.push(`Failed to compile ${block.id}`)\n }\n }\n\n return { compiled, failed, errors }\n}\n\n/**\n * Compiled WASM data that can be serialized and passed to an iframe\n */\nexport interface CompiledWasmData {\n id: string\n bytes: number[] // Uint8Array as plain array for JSON serialization\n captures: string[]\n needsMemory: boolean\n}\n\n/**\n * Compile WASM blocks and return serializable data for iframe instantiation\n */\nexport async function compileWasmBlocksForIframe(blocks: WasmBlock[]): Promise<{\n compiled: CompiledWasmData[]\n failed: number\n errors: string[]\n}> {\n const compiled: CompiledWasmData[] = []\n let failed = 0\n const errors: string[] = []\n\n for (const block of blocks) {\n const result = compileToWasm(block)\n if (result.success) {\n compiled.push({\n id: block.id,\n bytes: Array.from(result.bytes),\n captures: block.captures,\n needsMemory: result.needsMemory ?? false,\n })\n } else {\n failed++\n errors.push(`Failed to compile ${block.id}: ${result.error}`)\n }\n }\n\n return { compiled, failed, errors }\n}\n\n/**\n * Generate JavaScript code that instantiates compiled WASM in an iframe\n * This code should be injected into the iframe's script\n */\nexport function generateWasmInstantiationCode(\n compiledBlocks: CompiledWasmData[]\n): string {\n if (compiledBlocks.length === 0) return ''\n\n // Helper function to parse type annotations (same as parseTypeAnnotation)\n const parseTypeCode = `\nfunction __parseWasmType(capture) {\n const match = capture.match(/^(\\\\w+)\\\\s*:\\\\s*(\\\\w+)$/);\n if (!match) return { name: capture, type: 'f64', isArray: false };\n const [, name, typeStr] = match;\n const arrayTypes = { Float32Array: 'f32', Float64Array: 'f64', Int32Array: 'i32', Uint8Array: 'i32' };\n if (arrayTypes[typeStr]) {\n return { name, type: 'i32', isArray: true, arrayType: typeStr };\n }\n const typeMap = { i32: 'i32', i64: 'i64', f32: 'f32', f64: 'f64', number: 'f64', int: 'i32' };\n return { name, type: typeMap[typeStr] || 'f64', isArray: false };\n}\n`\n\n // Helper to create wrapped function\n const wrapperCode = `\nasync function __instantiateWasm(id, bytes, captures, needsMemory) {\n const params = captures.map(__parseWasmType);\n const hasArrays = params.some(p => p.isArray);\n\n let memory;\n if (needsMemory) {\n memory = new WebAssembly.Memory({ initial: 256 });\n }\n\n const importObject = memory ? { env: { memory } } : {};\n const module = await WebAssembly.compile(new Uint8Array(bytes));\n const instance = await WebAssembly.instantiate(module, importObject);\n const compute = instance.exports.compute;\n\n if (!hasArrays) {\n globalThis[id] = compute;\n return;\n }\n\n // Create wrapper that copies typed arrays to/from WASM memory\n globalThis[id] = function(...args) {\n const memoryView = new Uint8Array(memory.buffer);\n let offset = 0;\n const pointers = [];\n\n // Copy input arrays to memory\n for (let i = 0; i < params.length; i++) {\n const param = params[i];\n const arg = args[i];\n\n if (param.isArray && arg && arg.buffer) {\n const bytes = new Uint8Array(arg.buffer, arg.byteOffset, arg.byteLength);\n memoryView.set(bytes, offset);\n pointers.push(offset);\n offset += bytes.length;\n offset = (offset + 15) & ~15; // Align to 16 bytes (SIMD)\n } else {\n pointers.push(arg);\n }\n }\n\n // Call WASM function\n const result = compute(...pointers);\n\n // Copy output arrays back\n offset = 0;\n for (let i = 0; i < params.length; i++) {\n const param = params[i];\n const arg = args[i];\n\n if (param.isArray && arg && arg.buffer) {\n const bytes = new Uint8Array(arg.buffer, arg.byteOffset, arg.byteLength);\n bytes.set(memoryView.slice(offset, offset + bytes.length));\n offset += bytes.length;\n offset = (offset + 15) & ~15;\n }\n }\n\n return result;\n };\n}\n`\n\n // Generate instantiation calls for each block\n const instantiationCalls = compiledBlocks\n .map(\n (block) =>\n `__instantiateWasm(${JSON.stringify(block.id)}, ${JSON.stringify(\n block.bytes\n )}, ${JSON.stringify(block.captures)}, ${block.needsMemory})`\n )\n .join(',\\n ')\n\n return `\n // WASM instantiation helpers\n ${parseTypeCode}\n ${wrapperCode}\n\n // Instantiate all WASM blocks\n await Promise.all([\n ${instantiationCalls}\n ]);\n `\n}\n", "/**\n * TJS WASM Bootstrap Generation\n *\n * Compiles inline WASM blocks and generates JavaScript bootstrap code.\n */\n\nimport { compileToWasm } from '../wasm'\nimport type { WasmBlock } from '../parser'\n\nexport function generateWasmBootstrap(blocks: WasmBlock[]): {\n code: string\n results: {\n id: string\n success: boolean\n error?: string\n byteLength?: number\n }[]\n} {\n const results: {\n id: string\n success: boolean\n error?: string\n byteLength?: number\n }[] = []\n const compiledBlocks: {\n id: string\n base64: string\n captures: string[]\n needsMemory: boolean\n wat: string\n }[] = []\n\n for (const block of blocks) {\n const result = compileToWasm(block)\n if (result.success) {\n // Convert bytes to base64 for embedding\n const base64 = btoa(String.fromCharCode(...result.bytes))\n compiledBlocks.push({\n id: block.id,\n base64,\n captures: block.captures,\n needsMemory: result.needsMemory ?? false,\n wat: result.wat ?? '',\n })\n results.push({\n id: block.id,\n success: true,\n byteLength: result.bytes.length,\n })\n } else {\n results.push({\n id: block.id,\n success: false,\n error: result.error,\n })\n }\n }\n\n if (compiledBlocks.length === 0) {\n return { code: '', results }\n }\n\n // Generate WAT comments for each block\n const watComments = compiledBlocks\n .map((b) => {\n const watLines = b.wat.split('\\n').map((line) => ` * ${line}`)\n return `/**\\n * WASM: ${b.id}\\n${watLines.join('\\n')}\\n */`\n })\n .join('\\n')\n\n // Generate self-contained bootstrap code\n // This runs immediately and sets up globalThis.__tjs_wasm_N functions\n const blockData = compiledBlocks\n .map(\n (b) =>\n `{id:${JSON.stringify(b.id)},b64:${JSON.stringify(\n b.base64\n )},c:${JSON.stringify(b.captures)},m:${b.needsMemory}}`\n )\n .join(',')\n\n // Check if any block needs memory (shared across all blocks)\n const anyNeedsMemory = compiledBlocks.some((b) => b.needsMemory)\n\n const code = `${watComments}\n;(async()=>{\nconst __wasmBlocks=[${blockData}];\nconst __b64ToBytes=s=>{const b=atob(s),a=new Uint8Array(b.length);for(let i=0;i<b.length;i++)a[i]=b.charCodeAt(i);return a};\nconst __parseType=c=>{const m=c.match(/^(\\\\w+)\\\\s*:\\\\s*(\\\\w+)$/);if(!m)return{n:c,t:'f64',a:false};const[,n,ts]=m;const at={Float32Array:'f32',Float64Array:'f64',Int32Array:'i32',Uint8Array:'i32'};if(at[ts])return{n,t:'i32',a:true,at:ts};return{n,t:'f64',a:false}};\n${\n anyNeedsMemory\n ? `const __wasmMem=new WebAssembly.Memory({initial:1024});\nlet __woff=0;\nglobalThis.wasmBuffer=function(Ctor,len){const bytes=len*Ctor.BYTES_PER_ELEMENT;const align=Math.max(Ctor.BYTES_PER_ELEMENT,16);__woff=(__woff+align-1)&~(align-1);const arr=new Ctor(__wasmMem.buffer,__woff,len);__woff+=bytes;return arr};`\n : ''\n}\nfor(const{id,b64,c,m}of __wasmBlocks){\n const bytes=__b64ToBytes(b64);\n const params=c.map(__parseType);\n const hasArrays=params.some(p=>p.a);\n const mem=m?__wasmMem:null;\n const imp=mem?{env:{memory:mem}}:{};\n const inst=await WebAssembly.instantiate(await WebAssembly.compile(bytes),imp);\n const compute=inst.exports.compute;\n if(!hasArrays){globalThis[id]=compute;continue}\n globalThis[id]=function(...args){\n const mv=new Uint8Array(mem.buffer);let off=__woff;const ptrs=[];\n for(let i=0;i<params.length;i++){const p=params[i],a=args[i];\n if(p.a&&a?.buffer){\n if(a.buffer===mem.buffer){ptrs.push(a.byteOffset)}\n else{const ab=new Uint8Array(a.buffer,a.byteOffset,a.byteLength);off=(off+15)&~15;mv.set(ab,off);ptrs.push(off);off+=ab.length}\n } else ptrs.push(a)}\n const r=compute(...ptrs);off=__woff;\n for(let i=0;i<params.length;i++){const p=params[i],a=args[i];\n if(p.a&&a?.buffer){\n if(a.buffer===mem.buffer) continue;\n const ab=new Uint8Array(a.buffer,a.byteOffset,a.byteLength);off=(off+15)&~15;ab.set(mv.slice(off,off+ab.length));off+=ab.length}}\n return r};\n}})();\n`.trim()\n\n return { code, results }\n}\n", "/**\n * Boolean coercion rewriter.\n *\n * Fixes the JS footgun `Boolean(new Boolean(false)) === true` (and friends)\n * by rewriting every truthiness context to call `__tjs.toBool(x)`, which\n * unwraps boxed primitives before coercing.\n *\n * Contexts rewritten:\n * if (cond) \u2192 if (__tjs.toBool(cond))\n * while (cond) \u2192 while (__tjs.toBool(cond))\n * do {} while (cond) \u2192 do {} while (__tjs.toBool(cond))\n * for (_; cond; _) \u2192 for (_; __tjs.toBool(cond); _)\n * !x \u2192 !__tjs.toBool(x)\n * a && b \u2192 ((__tjs__t)=>__tjs.toBool(__tjs__t)?(b):__tjs__t)(a)\n * a || b \u2192 ((__tjs__t)=>__tjs.toBool(__tjs__t)?__tjs__t:(b))(a)\n * a ? b : c \u2192 __tjs.toBool(a)?(b):(c)\n * Boolean(x) \u2192 __tjs.toBool(x) (call form, not `new`)\n *\n * `??` (nullish coalescing) is intentionally NOT rewritten \u2014 its semantics\n * are about null/undefined specifically, not truthiness, so boxed primitives\n * behave correctly already.\n *\n * `===` / `!==` (identity) are also not touched \u2014 that's a separate\n * footgun handled by the `Is` / `Eq` operators under TjsEquals.\n *\n * Always-on under TjsStandard.\n */\n\nimport * as acorn from 'acorn'\nimport type { Program, Node } from 'acorn'\n\nexport interface BoolCoercionPatch {\n start: number\n end: number\n newText: string\n}\n\n/**\n * Walk the AST and emit replacement patches for every truthiness context.\n * Patches are pre-deduped: nested coercions inside an outer patch are\n * folded into the outer patch's newText, so returned patches don't overlap.\n */\nexport function rewriteBoolCoercion(\n ast: Program,\n source: string\n): BoolCoercionPatch[] {\n const candidates: BoolCoercionPatch[] = []\n\n function emitTestWrap(test: Node): void {\n candidates.push({\n start: test.start,\n end: test.end,\n newText: `__tjs.toBool(${rewriteExpr(test, source)})`,\n })\n }\n\n function visit(node: Node): void {\n if (!node || typeof node !== 'object' || !('type' in node)) return\n\n switch ((node as any).type) {\n case 'IfStatement':\n case 'WhileStatement':\n case 'DoWhileStatement': {\n const n = node as any\n emitTestWrap(n.test)\n // Visit the body / consequent / alternate normally\n if (n.consequent) visit(n.consequent)\n if (n.alternate) visit(n.alternate)\n if (n.body) visit(n.body)\n return\n }\n case 'ForStatement': {\n const n = node as any\n if (n.init) visit(n.init)\n if (n.test) emitTestWrap(n.test)\n if (n.update) visit(n.update)\n if (n.body) visit(n.body)\n return\n }\n case 'ConditionalExpression': {\n const n = node as any\n candidates.push({\n start: n.start,\n end: n.end,\n newText:\n `__tjs.toBool(${rewriteExpr(n.test, source)})` +\n `?(${rewriteExpr(n.consequent, source)})` +\n `:(${rewriteExpr(n.alternate, source)})`,\n })\n return\n }\n case 'LogicalExpression': {\n const n = node as any\n if (n.operator === '&&' || n.operator === '||') {\n candidates.push({\n start: n.start,\n end: n.end,\n newText: rewriteExpr(node, source),\n })\n return\n }\n // ?? unchanged \u2014 descend in case nested coercions live in the operands\n break\n }\n case 'UnaryExpression': {\n const n = node as any\n if (n.operator === '!') {\n candidates.push({\n start: n.start,\n end: n.end,\n newText: `!__tjs.toBool(${rewriteExpr(n.argument, source)})`,\n })\n return\n }\n break\n }\n case 'CallExpression': {\n const n = node as any\n if (\n n.callee &&\n n.callee.type === 'Identifier' &&\n n.callee.name === 'Boolean' &&\n n.arguments.length === 1 &&\n n.arguments[0].type !== 'SpreadElement'\n ) {\n // Boolean(x) \u2192 __tjs.toBool(x). Rare in practice but eliminates\n // the inconsistency with the rewritten `if (x)` cases.\n candidates.push({\n start: n.start,\n end: n.end,\n newText: `__tjs.toBool(${rewriteExpr(n.arguments[0], source)})`,\n })\n return\n }\n break\n }\n }\n\n // Default: walk children\n walkChildren(node, visit)\n }\n\n visit(ast)\n\n return dedupeNested(candidates)\n}\n\n/**\n * Recursive partial codegen: returns the rewritten source for an expression\n * subtree. For uninteresting nodes, returns the original source slice with\n * any nested coercions rewritten in place.\n */\nfunction rewriteExpr(node: Node | null | undefined, source: string): string {\n if (!node) return ''\n switch ((node as any).type) {\n case 'LogicalExpression': {\n const n = node as any\n const left = rewriteExpr(n.left, source)\n const right = rewriteExpr(n.right, source)\n if (n.operator === '&&') {\n return `((__tjs__t)=>__tjs.toBool(__tjs__t)?(${right}):__tjs__t)(${left})`\n }\n if (n.operator === '||') {\n return `((__tjs__t)=>__tjs.toBool(__tjs__t)?__tjs__t:(${right}))(${left})`\n }\n // ??\n return `(${left})??(${right})`\n }\n case 'ConditionalExpression': {\n const n = node as any\n return (\n `__tjs.toBool(${rewriteExpr(n.test, source)})` +\n `?(${rewriteExpr(n.consequent, source)})` +\n `:(${rewriteExpr(n.alternate, source)})`\n )\n }\n case 'UnaryExpression': {\n const n = node as any\n if (n.operator === '!') {\n return `!__tjs.toBool(${rewriteExpr(n.argument, source)})`\n }\n return rewriteOther(node, source)\n }\n case 'CallExpression': {\n const n = node as any\n if (\n n.callee &&\n n.callee.type === 'Identifier' &&\n n.callee.name === 'Boolean' &&\n n.arguments.length === 1 &&\n n.arguments[0].type !== 'SpreadElement'\n ) {\n return `__tjs.toBool(${rewriteExpr(n.arguments[0], source)})`\n }\n return rewriteOther(node, source)\n }\n }\n return rewriteOther(node, source)\n}\n\n/**\n * Generic structural recursion: walk all child nodes in source order, splice\n * rewritten children into the original source between gaps. This preserves\n * arbitrary syntax (template literals, destructuring, JSX, etc.) without\n * needing a full code generator \u2014 we only customize the nodes we actually\n * rewrite.\n */\nfunction rewriteOther(node: Node, source: string): string {\n const start = (node as any).start\n const end = (node as any).end\n if (typeof start !== 'number' || typeof end !== 'number') return ''\n\n const children = collectChildren(node)\n if (children.length === 0) return source.slice(start, end)\n\n // Sort by start position (defensive \u2014 should already be in order)\n children.sort((a, b) => a.start - b.start)\n\n let out = ''\n let cursor = start\n for (const child of children) {\n if (child.start < cursor) continue // overlapping; skip\n if (child.start > cursor) out += source.slice(cursor, child.start)\n out += rewriteExpr(child, source)\n cursor = child.end\n }\n if (cursor < end) out += source.slice(cursor, end)\n return out\n}\n\n/** Iterate the children of `cb` for any node, generic shape. */\nfunction walkChildren(node: Node, cb: (n: Node) => void): void {\n for (const child of collectChildren(node)) cb(child)\n}\n\nfunction collectChildren(node: Node): Node[] {\n const out: Node[] = []\n for (const key in node) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'loc') {\n continue\n }\n const v = (node as any)[key]\n if (Array.isArray(v)) {\n for (const item of v) {\n if (item && typeof item === 'object' && typeof item.type === 'string') {\n out.push(item)\n }\n }\n } else if (v && typeof v === 'object' && typeof v.type === 'string') {\n out.push(v)\n }\n }\n return out\n}\n\n/**\n * Drop patches whose range is fully contained in another patch's range.\n * The outer patch's newText already includes the inner rewrites via the\n * recursive partial codegen, so the inner patch is redundant.\n *\n * Equal-range patches: keep the first one encountered (insertion order\n * mirrors AST traversal order, where the parent is visited first).\n */\nfunction dedupeNested(patches: BoolCoercionPatch[]): BoolCoercionPatch[] {\n // Sort by start asc, end desc (outermost first for equal starts)\n const sorted = [...patches].sort((a, b) => a.start - b.start || b.end - a.end)\n const kept: BoolCoercionPatch[] = []\n let lastEnd = -1\n for (const p of sorted) {\n if (p.start >= lastEnd) {\n kept.push(p)\n lastEnd = p.end\n }\n // else: contained inside the last kept patch \u2014 drop\n }\n return kept\n}\n\n/**\n * Source-text wrapper: parse, rewrite, re-emit. Used for code that's\n * extracted before the main parse (test/mock bodies) but still needs the\n * coercion rewrite to behave consistently with the rest of the module.\n *\n * Wraps the body in a function so top-level statements like `expect(...)`\n * parse as a Program. Returns the original source unchanged if parsing\n * fails (rather than throwing \u2014 a bad test body would already have been\n * caught by the main parse).\n */\nexport function rewriteBoolCoercionInSource(source: string): string {\n let ast: Program\n try {\n ast = acorn.parse(`function __wrap__(){${source}}`, {\n ecmaVersion: 2022,\n sourceType: 'module',\n locations: false,\n }) as Program\n } catch {\n return source\n }\n const wrapped = `function __wrap__(){${source}}`\n const patches = rewriteBoolCoercion(ast, wrapped)\n if (patches.length === 0) return source\n\n // Apply patches right-to-left\n patches.sort((a, b) => b.start - a.start)\n let out = wrapped\n for (const p of patches) {\n out = out.slice(0, p.start) + p.newText + out.slice(p.end)\n }\n // Strip the wrapper\n const prefix = 'function __wrap__(){'\n const suffix = '}'\n return out.slice(prefix.length, out.length - suffix.length)\n}\n", "/**\n * TJS Core - Essential transpiler functions without TypeScript dependency\n *\n * This module provides the core AJS transpilation functions.\n * Import from here (not ./index) to avoid pulling in the TS compiler.\n */\n\nimport type { SeqNode } from '../builder'\nimport type {\n TranspileOptions,\n TranspileResult,\n FunctionSignature,\n TypeDescriptor,\n} from './types'\nimport { parse, validateSingleFunction } from './parser'\nimport { transformFunction } from './emitters/ast'\nimport {\n transpileToJS,\n type TJSTranspileResult,\n type TJSTranspileOptions,\n} from './emitters/js'\n\nexport * from './types'\nexport {\n parse,\n preprocess,\n extractTDoc,\n validateSingleFunction,\n} from './parser'\nexport { transformFunction } from './emitters/ast'\n\n/**\n * Transpile JavaScript source code to Agent99 AST\n */\nexport function transpile(\n source: string,\n options: TranspileOptions = {}\n): TranspileResult {\n const {\n ast: program,\n returnType,\n originalSource,\n requiredParams,\n } = parse(source, {\n filename: options.filename,\n colonShorthand: true,\n vmTarget: true,\n })\n\n const func = validateSingleFunction(program, options.filename)\n\n const { ast, signature, warnings } = transformFunction(\n func,\n originalSource,\n returnType,\n options,\n requiredParams\n )\n\n return {\n ast: ast as SeqNode,\n signature,\n warnings,\n }\n}\n\n/**\n * Transpile AsyncJS source and return just the AST\n */\nexport function ajs(strings: TemplateStringsArray, ...values: any[]): SeqNode\nexport function ajs(source: string): SeqNode\nexport function ajs(\n sourceOrStrings: string | TemplateStringsArray,\n ...values: any[]\n): SeqNode {\n if (typeof sourceOrStrings === 'string') {\n return transpile(sourceOrStrings).ast\n }\n const source = sourceOrStrings.reduce(\n (acc, str, i) =>\n acc + str + (values[i] !== undefined ? String(values[i]) : ''),\n ''\n )\n return transpile(source).ast\n}\n\n/**\n * Create a function with attached signature for introspection\n */\nexport function createAgent(\n source: string,\n vm: { run: (ast: any, args: any, options?: any) => Promise<any> },\n runOptions?: { fuel?: number; capabilities?: any }\n): ((args: Record<string, any>) => Promise<any>) & {\n signature: FunctionSignature\n ast: SeqNode\n} {\n const { ast, signature } = transpile(source)\n\n const agent = async (args: Record<string, any>) => {\n const result = await vm.run(ast, args, runOptions)\n return result.result\n }\n\n ;(agent as any).signature = signature\n ;(agent as any).ast = ast\n\n return agent as any\n}\n\n/**\n * Convert TypeDescriptor to JSON Schema\n */\nfunction typeDescriptorToJsonSchema(type: TypeDescriptor): any {\n switch (type.kind) {\n case 'string':\n return { type: 'string' }\n case 'number':\n return { type: 'number' }\n case 'boolean':\n return { type: 'boolean' }\n case 'null':\n return { type: 'null' }\n case 'array':\n return {\n type: 'array',\n items: type.items ? typeDescriptorToJsonSchema(type.items) : {},\n }\n case 'object':\n if (!type.shape) {\n return { type: 'object' }\n }\n return {\n type: 'object',\n properties: Object.fromEntries(\n Object.entries(type.shape).map(([k, v]) => [\n k,\n typeDescriptorToJsonSchema(v),\n ])\n ),\n }\n case 'union':\n if (!type.members) {\n return {}\n }\n return {\n anyOf: type.members.map(typeDescriptorToJsonSchema),\n }\n case 'any':\n default:\n return {}\n }\n}\n\n/**\n * Get tool definitions from a set of agent functions\n */\nexport function getToolDefinitions(\n agents: Record<string, { signature: FunctionSignature }>\n): Array<{\n type: 'function'\n function: {\n name: string\n description?: string\n parameters: {\n type: 'object'\n properties: Record<string, any>\n required: string[]\n }\n }\n}> {\n return Object.entries(agents).map(([name, agent]) => {\n const sig = agent.signature\n\n const properties: Record<string, any> = {}\n const required: string[] = []\n\n for (const [paramName, param] of Object.entries(sig.parameters)) {\n properties[paramName] = typeDescriptorToJsonSchema(param.type)\n if (param.description) {\n properties[paramName].description = param.description\n }\n if (param.required) {\n required.push(paramName)\n }\n }\n\n return {\n type: 'function' as const,\n function: {\n name,\n description: sig.description,\n parameters: {\n type: 'object' as const,\n properties,\n required,\n },\n },\n }\n })\n}\n\n/**\n * Transpile TJS source to JavaScript with type metadata.\n * Works as both a function and a tagged template literal.\n */\nexport function tjs(\n strings: TemplateStringsArray,\n ...values: any[]\n): TJSTranspileResult\nexport function tjs(\n source: string,\n options?: TJSTranspileOptions\n): TJSTranspileResult\nexport function tjs(\n sourceOrStrings: string | TemplateStringsArray,\n optionsOrFirstValue?: TJSTranspileOptions | any,\n ...restValues: any[]\n): TJSTranspileResult {\n if (typeof sourceOrStrings === 'string') {\n return transpileToJS(\n sourceOrStrings,\n optionsOrFirstValue as TJSTranspileOptions\n )\n }\n // Tagged template literal\n const values =\n optionsOrFirstValue !== undefined\n ? [optionsOrFirstValue, ...restValues]\n : restValues\n const source = sourceOrStrings.reduce(\n (acc, str, i) =>\n acc + str + (values[i] !== undefined ? String(values[i]) : ''),\n ''\n )\n return transpileToJS(source)\n}\n", "/**\n * TJS Schema - Runtime type system for Typed JavaScript\n *\n * Builds on tosijs-schema to provide:\n * - Schema(x) callable for inference by example\n * - Schema.type(x) for \"fixed typeof\" (null returns 'null', not 'object')\n * - All tosijs-schema methods (string, number, object, array, etc.)\n *\n * Usage:\n * Schema('hello') // Schema matching string\n * Schema(42) // Schema matching number (integer)\n * Schema(null) // Schema matching null\n * Schema(undefined) // Schema matching undefined\n * Schema([1, 2, 3]) // Schema matching array of integers\n * Schema({name: 'Anne'}) // Schema matching object with name: string\n *\n * Schema.type(null) // 'null' (not 'object' like typeof)\n * Schema.type(undefined) // 'undefined'\n * Schema.type([]) // 'array' (not 'object' like typeof)\n *\n * Schema.null.validate(x) // true if x is null\n * Schema.undefined.validate(x) // true if x is undefined\n */\n\nimport { s, type Base } from 'tosijs-schema'\n\n/**\n * Get the \"fixed\" type of a value - unlike typeof, correctly handles null and arrays\n */\nfunction getType(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (Array.isArray(value)) return 'array'\n return typeof value\n}\n\n/**\n * Infer a schema from an example value\n * This wraps tosijs-schema's s.infer() for consistency\n */\nfunction infer(value: unknown): Base<unknown> {\n return s.infer(value)\n}\n\n// The base callable function\nfunction schemaCallable(value: unknown): Base<unknown> {\n return infer(value)\n}\n\n// Add our custom methods\nschemaCallable.type = getType\nschemaCallable.infer = infer\n\n// Create the Schema callable that proxies to s for all other properties\ntype SchemaCallable = {\n (value: unknown): Base<unknown>\n type: (value: unknown) => string\n infer: (value: unknown) => Base<unknown>\n} & typeof s\n\n/**\n * Schema - callable for inference, with all tosijs-schema methods attached\n * Uses a Proxy to delegate property access to tosijs-schema's s object\n */\nexport const Schema: SchemaCallable = new Proxy(schemaCallable as any, {\n get(target, prop) {\n // Our custom methods take precedence\n if (prop === 'type') return getType\n if (prop === 'infer') return infer\n // Delegate everything else to tosijs-schema's s\n return (s as any)[prop]\n },\n apply(target, thisArg, args) {\n // Make it callable - Schema(value) infers schema\n return infer(args[0])\n },\n})\n\n// Re-export useful types from tosijs-schema\nexport type { Base, Infer } from 'tosijs-schema'\n", "// AST walker module for ESTree compatible trees\n\n// A simple walk is one where you simply specify callbacks to be\n// called on specific nodes. The last two arguments are optional. A\n// simple use would be\n//\n// walk.simple(myTree, {\n// Expression: function(node) { ... }\n// });\n//\n// to do something with all expressions. All ESTree node types\n// can be used to identify node types, as well as Expression and\n// Statement, which denote categories of nodes.\n//\n// The base argument can be used to pass a custom (recursive)\n// walker, and state can be used to give this walked an initial\n// state.\n\nfunction simple(node, visitors, baseVisitor, state, override) {\n if (!baseVisitor) { baseVisitor = base\n ; }(function c(node, st, override) {\n var type = override || node.type;\n baseVisitor[type](node, st, c);\n if (visitors[type]) { visitors[type](node, st); }\n })(node, state, override);\n}\n\n// An ancestor walk keeps an array of ancestor nodes (including the\n// current node) and passes them to the callback as third parameter\n// (and also as state parameter when no other state is present).\nfunction ancestor(node, visitors, baseVisitor, state, override) {\n var ancestors = [];\n if (!baseVisitor) { baseVisitor = base\n ; }(function c(node, st, override) {\n var type = override || node.type;\n var isNew = node !== ancestors[ancestors.length - 1];\n if (isNew) { ancestors.push(node); }\n baseVisitor[type](node, st, c);\n if (visitors[type]) { visitors[type](node, st || ancestors, ancestors); }\n if (isNew) { ancestors.pop(); }\n })(node, state, override);\n}\n\n// A recursive walk is one where your functions override the default\n// walkers. They can modify and replace the state parameter that's\n// threaded through the walk, and can opt how and whether to walk\n// their child nodes (by calling their third argument on these\n// nodes).\nfunction recursive(node, state, funcs, baseVisitor, override) {\n var visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor\n ;(function c(node, st, override) {\n visitor[override || node.type](node, st, c);\n })(node, state, override);\n}\n\nfunction makeTest(test) {\n if (typeof test === \"string\")\n { return function (type) { return type === test; } }\n else if (!test)\n { return function () { return true; } }\n else\n { return test }\n}\n\nvar Found = function Found(node, state) { this.node = node; this.state = state; };\n\n// A full walk triggers the callback on each node\nfunction full(node, callback, baseVisitor, state, override) {\n if (!baseVisitor) { baseVisitor = base; }\n var last\n ;(function c(node, st, override) {\n var type = override || node.type;\n baseVisitor[type](node, st, c);\n if (last !== node) {\n callback(node, st, type);\n last = node;\n }\n })(node, state, override);\n}\n\n// An fullAncestor walk is like an ancestor walk, but triggers\n// the callback on each node\nfunction fullAncestor(node, callback, baseVisitor, state) {\n if (!baseVisitor) { baseVisitor = base; }\n var ancestors = [], last\n ;(function c(node, st, override) {\n var type = override || node.type;\n var isNew = node !== ancestors[ancestors.length - 1];\n if (isNew) { ancestors.push(node); }\n baseVisitor[type](node, st, c);\n if (last !== node) {\n callback(node, st || ancestors, ancestors, type);\n last = node;\n }\n if (isNew) { ancestors.pop(); }\n })(node, state);\n}\n\n// Find a node with a given start, end, and type (all are optional,\n// null can be used as wildcard). Returns a {node, state} object, or\n// undefined when it doesn't find a matching node.\nfunction findNodeAt(node, start, end, test, baseVisitor, state) {\n if (!baseVisitor) { baseVisitor = base; }\n test = makeTest(test);\n try {\n (function c(node, st, override) {\n var type = override || node.type;\n if ((start == null || node.start <= start) &&\n (end == null || node.end >= end))\n { baseVisitor[type](node, st, c); }\n if ((start == null || node.start === start) &&\n (end == null || node.end === end) &&\n test(type, node))\n { throw new Found(node, st) }\n })(node, state);\n } catch (e) {\n if (e instanceof Found) { return e }\n throw e\n }\n}\n\n// Find the innermost node of a given type that contains the given\n// position. Interface similar to findNodeAt.\nfunction findNodeAround(node, pos, test, baseVisitor, state) {\n test = makeTest(test);\n if (!baseVisitor) { baseVisitor = base; }\n try {\n (function c(node, st, override) {\n var type = override || node.type;\n if (node.start > pos || node.end < pos) { return }\n baseVisitor[type](node, st, c);\n if (test(type, node)) { throw new Found(node, st) }\n })(node, state);\n } catch (e) {\n if (e instanceof Found) { return e }\n throw e\n }\n}\n\n// Find the outermost matching node after a given position.\nfunction findNodeAfter(node, pos, test, baseVisitor, state) {\n test = makeTest(test);\n if (!baseVisitor) { baseVisitor = base; }\n try {\n (function c(node, st, override) {\n if (node.end < pos) { return }\n var type = override || node.type;\n if (node.start >= pos && test(type, node)) { throw new Found(node, st) }\n baseVisitor[type](node, st, c);\n })(node, state);\n } catch (e) {\n if (e instanceof Found) { return e }\n throw e\n }\n}\n\n// Find the outermost matching node before a given position.\nfunction findNodeBefore(node, pos, test, baseVisitor, state) {\n test = makeTest(test);\n if (!baseVisitor) { baseVisitor = base; }\n var max\n ;(function c(node, st, override) {\n if (node.start > pos) { return }\n var type = override || node.type;\n if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node))\n { max = new Found(node, st); }\n baseVisitor[type](node, st, c);\n })(node, state);\n return max\n}\n\n// Used to create a custom walker. Will fill in all missing node\n// type properties with the defaults.\nfunction make(funcs, baseVisitor) {\n var visitor = Object.create(baseVisitor || base);\n for (var type in funcs) { visitor[type] = funcs[type]; }\n return visitor\n}\n\nfunction skipThrough(node, st, c) { c(node, st); }\nfunction ignore(_node, _st, _c) {}\n\n// Node walkers.\n\nvar base = {};\n\nbase.Program = base.BlockStatement = base.StaticBlock = function (node, st, c) {\n for (var i = 0, list = node.body; i < list.length; i += 1)\n {\n var stmt = list[i];\n\n c(stmt, st, \"Statement\");\n }\n};\nbase.Statement = skipThrough;\nbase.EmptyStatement = ignore;\nbase.ExpressionStatement = base.ParenthesizedExpression = base.ChainExpression =\n function (node, st, c) { return c(node.expression, st, \"Expression\"); };\nbase.IfStatement = function (node, st, c) {\n c(node.test, st, \"Expression\");\n c(node.consequent, st, \"Statement\");\n if (node.alternate) { c(node.alternate, st, \"Statement\"); }\n};\nbase.LabeledStatement = function (node, st, c) { return c(node.body, st, \"Statement\"); };\nbase.BreakStatement = base.ContinueStatement = ignore;\nbase.WithStatement = function (node, st, c) {\n c(node.object, st, \"Expression\");\n c(node.body, st, \"Statement\");\n};\nbase.SwitchStatement = function (node, st, c) {\n c(node.discriminant, st, \"Expression\");\n for (var i = 0, list = node.cases; i < list.length; i += 1) {\n var cs = list[i];\n\n c(cs, st);\n }\n};\nbase.SwitchCase = function (node, st, c) {\n if (node.test) { c(node.test, st, \"Expression\"); }\n for (var i = 0, list = node.consequent; i < list.length; i += 1)\n {\n var cons = list[i];\n\n c(cons, st, \"Statement\");\n }\n};\nbase.ReturnStatement = base.YieldExpression = base.AwaitExpression = function (node, st, c) {\n if (node.argument) { c(node.argument, st, \"Expression\"); }\n};\nbase.ThrowStatement = base.SpreadElement =\n function (node, st, c) { return c(node.argument, st, \"Expression\"); };\nbase.TryStatement = function (node, st, c) {\n c(node.block, st, \"Statement\");\n if (node.handler) { c(node.handler, st); }\n if (node.finalizer) { c(node.finalizer, st, \"Statement\"); }\n};\nbase.CatchClause = function (node, st, c) {\n if (node.param) { c(node.param, st, \"Pattern\"); }\n c(node.body, st, \"Statement\");\n};\nbase.WhileStatement = base.DoWhileStatement = function (node, st, c) {\n c(node.test, st, \"Expression\");\n c(node.body, st, \"Statement\");\n};\nbase.ForStatement = function (node, st, c) {\n if (node.init) { c(node.init, st, \"ForInit\"); }\n if (node.test) { c(node.test, st, \"Expression\"); }\n if (node.update) { c(node.update, st, \"Expression\"); }\n c(node.body, st, \"Statement\");\n};\nbase.ForInStatement = base.ForOfStatement = function (node, st, c) {\n c(node.left, st, \"ForInit\");\n c(node.right, st, \"Expression\");\n c(node.body, st, \"Statement\");\n};\nbase.ForInit = function (node, st, c) {\n if (node.type === \"VariableDeclaration\") { c(node, st); }\n else { c(node, st, \"Expression\"); }\n};\nbase.DebuggerStatement = ignore;\n\nbase.FunctionDeclaration = function (node, st, c) { return c(node, st, \"Function\"); };\nbase.VariableDeclaration = function (node, st, c) {\n for (var i = 0, list = node.declarations; i < list.length; i += 1)\n {\n var decl = list[i];\n\n c(decl, st);\n }\n};\nbase.VariableDeclarator = function (node, st, c) {\n c(node.id, st, \"Pattern\");\n if (node.init) { c(node.init, st, \"Expression\"); }\n};\n\nbase.Function = function (node, st, c) {\n if (node.id) { c(node.id, st, \"Pattern\"); }\n for (var i = 0, list = node.params; i < list.length; i += 1)\n {\n var param = list[i];\n\n c(param, st, \"Pattern\");\n }\n c(node.body, st, node.expression ? \"Expression\" : \"Statement\");\n};\n\nbase.Pattern = function (node, st, c) {\n if (node.type === \"Identifier\")\n { c(node, st, \"VariablePattern\"); }\n else if (node.type === \"MemberExpression\")\n { c(node, st, \"MemberPattern\"); }\n else\n { c(node, st); }\n};\nbase.VariablePattern = ignore;\nbase.MemberPattern = skipThrough;\nbase.RestElement = function (node, st, c) { return c(node.argument, st, \"Pattern\"); };\nbase.ArrayPattern = function (node, st, c) {\n for (var i = 0, list = node.elements; i < list.length; i += 1) {\n var elt = list[i];\n\n if (elt) { c(elt, st, \"Pattern\"); }\n }\n};\nbase.ObjectPattern = function (node, st, c) {\n for (var i = 0, list = node.properties; i < list.length; i += 1) {\n var prop = list[i];\n\n if (prop.type === \"Property\") {\n if (prop.computed) { c(prop.key, st, \"Expression\"); }\n c(prop.value, st, \"Pattern\");\n } else if (prop.type === \"RestElement\") {\n c(prop.argument, st, \"Pattern\");\n }\n }\n};\n\nbase.Expression = skipThrough;\nbase.ThisExpression = base.Super = base.MetaProperty = ignore;\nbase.ArrayExpression = function (node, st, c) {\n for (var i = 0, list = node.elements; i < list.length; i += 1) {\n var elt = list[i];\n\n if (elt) { c(elt, st, \"Expression\"); }\n }\n};\nbase.ObjectExpression = function (node, st, c) {\n for (var i = 0, list = node.properties; i < list.length; i += 1)\n {\n var prop = list[i];\n\n c(prop, st);\n }\n};\nbase.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration;\nbase.SequenceExpression = function (node, st, c) {\n for (var i = 0, list = node.expressions; i < list.length; i += 1)\n {\n var expr = list[i];\n\n c(expr, st, \"Expression\");\n }\n};\nbase.TemplateLiteral = function (node, st, c) {\n for (var i = 0, list = node.quasis; i < list.length; i += 1)\n {\n var quasi = list[i];\n\n c(quasi, st);\n }\n\n for (var i$1 = 0, list$1 = node.expressions; i$1 < list$1.length; i$1 += 1)\n {\n var expr = list$1[i$1];\n\n c(expr, st, \"Expression\");\n }\n};\nbase.TemplateElement = ignore;\nbase.UnaryExpression = base.UpdateExpression = function (node, st, c) {\n c(node.argument, st, \"Expression\");\n};\nbase.BinaryExpression = base.LogicalExpression = function (node, st, c) {\n c(node.left, st, \"Expression\");\n c(node.right, st, \"Expression\");\n};\nbase.AssignmentExpression = base.AssignmentPattern = function (node, st, c) {\n c(node.left, st, \"Pattern\");\n c(node.right, st, \"Expression\");\n};\nbase.ConditionalExpression = function (node, st, c) {\n c(node.test, st, \"Expression\");\n c(node.consequent, st, \"Expression\");\n c(node.alternate, st, \"Expression\");\n};\nbase.NewExpression = base.CallExpression = function (node, st, c) {\n c(node.callee, st, \"Expression\");\n if (node.arguments)\n { for (var i = 0, list = node.arguments; i < list.length; i += 1)\n {\n var arg = list[i];\n\n c(arg, st, \"Expression\");\n } }\n};\nbase.MemberExpression = function (node, st, c) {\n c(node.object, st, \"Expression\");\n if (node.computed) { c(node.property, st, \"Expression\"); }\n};\nbase.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) {\n if (node.declaration)\n { c(node.declaration, st, node.type === \"ExportNamedDeclaration\" || node.declaration.id ? \"Statement\" : \"Expression\"); }\n if (node.source) { c(node.source, st, \"Expression\"); }\n};\nbase.ExportAllDeclaration = function (node, st, c) {\n if (node.exported)\n { c(node.exported, st); }\n c(node.source, st, \"Expression\");\n};\nbase.ImportDeclaration = function (node, st, c) {\n for (var i = 0, list = node.specifiers; i < list.length; i += 1)\n {\n var spec = list[i];\n\n c(spec, st);\n }\n c(node.source, st, \"Expression\");\n};\nbase.ImportExpression = function (node, st, c) {\n c(node.source, st, \"Expression\");\n};\nbase.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.PrivateIdentifier = base.Literal = ignore;\n\nbase.TaggedTemplateExpression = function (node, st, c) {\n c(node.tag, st, \"Expression\");\n c(node.quasi, st, \"Expression\");\n};\nbase.ClassDeclaration = base.ClassExpression = function (node, st, c) { return c(node, st, \"Class\"); };\nbase.Class = function (node, st, c) {\n if (node.id) { c(node.id, st, \"Pattern\"); }\n if (node.superClass) { c(node.superClass, st, \"Expression\"); }\n c(node.body, st);\n};\nbase.ClassBody = function (node, st, c) {\n for (var i = 0, list = node.body; i < list.length; i += 1)\n {\n var elt = list[i];\n\n c(elt, st);\n }\n};\nbase.MethodDefinition = base.PropertyDefinition = base.Property = function (node, st, c) {\n if (node.computed) { c(node.key, st, \"Expression\"); }\n if (node.value) { c(node.value, st, \"Expression\"); }\n};\n\nexport { ancestor, base, findNodeAfter, findNodeAround, findNodeAt, findNodeBefore, full, fullAncestor, make, recursive, simple };\n", "/**\n * TJS Linter\n *\n * Static analysis for TJS code:\n * - Unused variables\n * - Undefined variables\n * - Type mismatches (when __tjs metadata available)\n * - Unreachable code\n *\n * POC: Focus on variable usage first, then type checking.\n */\n\nimport type {\n Program,\n Node,\n Identifier,\n VariableDeclaration,\n AssignmentExpression,\n Expression,\n} from 'acorn'\nimport { parse } from './parser'\nimport * as walk from 'acorn-walk'\n\nexport interface LintDiagnostic {\n severity: 'error' | 'warning' | 'info'\n message: string\n line?: number\n column?: number\n rule: string\n}\n\nexport interface LintResult {\n diagnostics: LintDiagnostic[]\n valid: boolean\n}\n\nexport interface LintOptions {\n /** Check for unused variables */\n unusedVariables?: boolean\n /** Check for undefined variables */\n undefinedVariables?: boolean\n /** Check for unreachable code */\n unreachableCode?: boolean\n /** Warn about explicit `new` keyword usage (TJS makes classes callable without new) */\n noExplicitNew?: boolean\n /**\n * Check `let` declarations for missing type information and forbid literal\n * undefined/null assignments to typed lets. If undefined, the parser's\n * `TjsSafeAssign` mode controls whether the rule runs.\n */\n safeAssign?: boolean\n /** Filename for error messages */\n filename?: string\n /** Treat safeAssign violations as errors instead of warnings (TjsStrict semantics) */\n strict?: boolean\n}\n\nconst DEFAULT_OPTIONS: LintOptions = {\n unusedVariables: true,\n undefinedVariables: true,\n unreachableCode: true,\n noExplicitNew: true,\n}\n\n/**\n * Lint TJS source code\n */\nexport function lint(source: string, options: LintOptions = {}): LintResult {\n const opts = { ...DEFAULT_OPTIONS, ...options }\n const diagnostics: LintDiagnostic[] = []\n\n // Parse the source\n let program: Program\n let letAnnotations: Map<string, string> = new Map()\n let safeAssignMode = false\n try {\n const result = parse(source, {\n filename: opts.filename,\n colonShorthand: true,\n })\n program = result.ast\n letAnnotations = result.letAnnotations\n safeAssignMode = result.tjsModes.tjsSafeAssign\n } catch (error: any) {\n return {\n diagnostics: [\n {\n severity: 'error',\n message: error.message,\n line: error.loc?.line,\n column: error.loc?.column,\n rule: 'parse-error',\n },\n ],\n valid: false,\n }\n }\n const safeAssignEnabled =\n opts.safeAssign !== undefined ? opts.safeAssign : safeAssignMode\n const safeAssignSeverity: LintDiagnostic['severity'] = opts.strict\n ? 'error'\n : 'warning'\n\n // Track variable declarations and usages per scope\n const scopes: Scope[] = [createScope()] // Global scope\n\n // First pass: collect all declarations\n walk.ancestor(program, {\n FunctionDeclaration(node: any, _state: any, _ancestors: any) {\n // Function creates new scope\n const scope = createScope()\n scopes.push(scope)\n\n // Add parameters to scope\n for (const param of node.params) {\n addDeclaration(scope, param, 'parameter')\n }\n\n // Function name is in parent scope\n if (node.id) {\n const parentScope = scopes[scopes.length - 2] || scopes[0]\n parentScope.declarations.set(node.id.name, {\n node: node.id,\n kind: 'function',\n used: false,\n })\n }\n },\n\n VariableDeclaration(node: VariableDeclaration) {\n const scope = scopes[scopes.length - 1]\n for (const decl of node.declarations) {\n if (decl.id.type === 'Identifier') {\n scope.declarations.set(decl.id.name, {\n node: decl.id,\n kind: node.kind as 'let' | 'const' | 'var',\n used: false,\n })\n }\n // TODO: handle destructuring patterns\n }\n },\n })\n\n // Second pass: check usages\n walk.simple(program, {\n Identifier(node: Identifier) {\n // Skip declaration sites (handled above)\n // This is a simplified check - just mark as used\n for (let i = scopes.length - 1; i >= 0; i--) {\n const decl = scopes[i].declarations.get(node.name)\n if (decl) {\n decl.used = true\n break\n }\n }\n },\n })\n\n // Report unused variables\n if (opts.unusedVariables) {\n for (const scope of scopes) {\n for (const [name, decl] of scope.declarations) {\n // Skip parameters starting with _ (intentionally unused)\n if (name.startsWith('_')) continue\n\n if (!decl.used && decl.kind !== 'function') {\n diagnostics.push({\n severity: 'warning',\n message: `'${name}' is declared but never used`,\n line: (decl.node as any).loc?.start?.line,\n column: (decl.node as any).loc?.start?.column,\n rule: 'no-unused-vars',\n })\n }\n }\n }\n }\n\n // Check for unreachable code\n if (opts.unreachableCode) {\n walk.simple(program, {\n BlockStatement(node: any) {\n let foundReturn = false\n for (const stmt of node.body) {\n if (foundReturn) {\n diagnostics.push({\n severity: 'warning',\n message: 'Unreachable code after return statement',\n line: stmt.loc?.start?.line,\n column: stmt.loc?.start?.column,\n rule: 'no-unreachable',\n })\n break // Only report once per block\n }\n if (stmt.type === 'ReturnStatement') {\n foundReturn = true\n }\n }\n },\n })\n }\n\n // TjsSafeAssign: lets need an initializer or `: <example>` annotation, and\n // typed lets must not be (re)assigned literal undefined/null/void 0.\n if (safeAssignEnabled) {\n // First pass: track which lets are \"typed\" (annotated OR have a non-nullish initializer)\n const typedLets = new Set<string>()\n walk.simple(program, {\n VariableDeclaration(node: VariableDeclaration) {\n if (node.kind !== 'let') return\n for (const d of node.declarations) {\n if (d.id.type !== 'Identifier') continue\n const name = d.id.name\n const annotated = letAnnotations.has(name)\n const init = d.init\n if (annotated) {\n typedLets.add(name)\n } else if (init && !isLiteralNullish(init)) {\n typedLets.add(name)\n }\n }\n },\n })\n\n // Declaration-site rule: missing type information\n walk.simple(program, {\n VariableDeclaration(node: VariableDeclaration) {\n if (node.kind !== 'let') return\n for (const d of node.declarations) {\n if (d.id.type !== 'Identifier') continue\n const name = d.id.name\n if (letAnnotations.has(name)) continue\n if (!d.init) {\n diagnostics.push({\n severity: safeAssignSeverity,\n message: `'let ${name}' has no initializer or type annotation. Add an initializer (let ${name} = ...) or annotate (let ${name}: <example>).`,\n line: (d as any).loc?.start?.line,\n column: (d as any).loc?.start?.column,\n rule: 'safe-assign-let-needs-type',\n })\n } else if (isLiteralNullish(d.init)) {\n diagnostics.push({\n severity: safeAssignSeverity,\n message: `'let ${name}' is initialized to ${describeNullish(\n d.init\n )} with no type annotation. Annotate (let ${name}: <example>) to record the intended type.`,\n line: (d as any).loc?.start?.line,\n column: (d as any).loc?.start?.column,\n rule: 'safe-assign-let-needs-type',\n })\n }\n }\n },\n })\n\n // Use-site rule: literal undefined/null assigned to a typed let\n walk.simple(program, {\n AssignmentExpression(node: AssignmentExpression) {\n if (node.operator !== '=') return\n if (node.left.type !== 'Identifier') return\n const name = (node.left as Identifier).name\n if (!typedLets.has(name)) return\n if (!isLiteralNullish(node.right)) return\n diagnostics.push({\n severity: safeAssignSeverity,\n message: `Cannot assign ${describeNullish(\n node.right\n )} to typed let '${name}'.`,\n line: (node as any).loc?.start?.line,\n column: (node as any).loc?.start?.column,\n rule: 'safe-assign-no-nullish',\n })\n },\n })\n }\n\n // Check for explicit `new` keyword usage\n // In TJS, classes are callable without `new`, so using `new` is unnecessary\n if (opts.noExplicitNew) {\n walk.simple(program, {\n NewExpression(node: any) {\n // Get the callee name\n let calleeName = 'class'\n if (node.callee.type === 'Identifier') {\n calleeName = node.callee.name\n } else if (node.callee.type === 'MemberExpression') {\n // e.g., new foo.Bar()\n if (node.callee.property.type === 'Identifier') {\n calleeName = node.callee.property.name\n }\n }\n\n diagnostics.push({\n severity: 'warning',\n message: `Unnecessary 'new' keyword. In TJS, classes are callable without 'new': ${calleeName}(...) instead of new ${calleeName}(...)`,\n line: node.loc?.start?.line,\n column: node.loc?.start?.column,\n rule: 'no-explicit-new',\n })\n },\n })\n }\n\n return {\n diagnostics,\n valid: diagnostics.filter((d) => d.severity === 'error').length === 0,\n }\n}\n\n// --- Internal types and helpers ---\n\ninterface Scope {\n declarations: Map<string, Declaration>\n}\n\ninterface Declaration {\n node: Node\n kind: 'let' | 'const' | 'var' | 'parameter' | 'function'\n used: boolean\n}\n\nfunction createScope(): Scope {\n return { declarations: new Map() }\n}\n\n/**\n * Is the given expression a literal that evaluates to undefined or null?\n * Catches: `undefined`, `null`, `void 0`, `void <any-literal>`.\n */\nfunction isLiteralNullish(node: Expression | null | undefined): boolean {\n if (!node) return false\n if (node.type === 'Identifier' && (node as Identifier).name === 'undefined') {\n return true\n }\n if (node.type === 'Literal' && (node as any).value === null) return true\n if (node.type === 'UnaryExpression' && (node as any).operator === 'void') {\n return true\n }\n return false\n}\n\nfunction describeNullish(node: Expression): string {\n if (node.type === 'Identifier') return 'undefined'\n if (node.type === 'Literal' && (node as any).value === null) return 'null'\n if (node.type === 'UnaryExpression' && (node as any).operator === 'void') {\n return 'void <expr> (undefined)'\n }\n return 'a nullish value'\n}\n\nfunction addDeclaration(scope: Scope, node: Node, kind: Declaration['kind']) {\n if (node.type === 'Identifier') {\n scope.declarations.set((node as Identifier).name, {\n node,\n kind,\n used: false,\n })\n } else if (\n node.type === 'AssignmentPattern' &&\n (node as any).left.type === 'Identifier'\n ) {\n scope.declarations.set((node as any).left.name, {\n node: (node as any).left,\n kind,\n used: false,\n })\n }\n // TODO: handle destructuring\n}\n\n/**\n * Questions/Notes for future:\n *\n * Q1: Should we integrate with __tjs metadata for cross-file type checking?\n * - Would need to load metadata from imported modules\n * - Could check function call arguments against declared parameter types\n *\n * Q2: How strict should undefined variable checking be?\n * - Currently relies on JS globals being available\n * - Could have a whitelist of known globals (console, Math, etc.)\n *\n * Q3: Should linting be incremental / cacheable?\n * - For large projects, re-linting everything is slow\n * - Could hash files and skip unchanged ones\n */\n"],
5
+ "mappings": "+DAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,CAAAA,GAAA,SACE,KAAQ,WACR,QAAW,QACX,YAAe,kMACf,SAAY,CACV,aACA,aACA,qBACA,cACA,UACA,kBACA,mBACA,YACA,MACA,gBACA,WACA,gBACA,mBACA,WACA,gBACF,EACA,QAAW,aACX,KAAQ,kBACR,MAAS,wBACT,QAAW,CACT,IAAK,CACH,IAAO,iBACP,MAAS,wBACT,QAAW,iBACb,EACA,SAAU,CACR,IAAO,qBACP,MAAS,4BACT,QAAW,oBACb,EACA,SAAU,CACR,IAAO,2BACP,MAAS,kCACT,QAAW,oBACb,EACA,iBAAkB,CAChB,IAAO,iCACP,MAAS,wCACT,QAAW,uBACb,EACA,OAAQ,CACN,IAAO,oBACP,MAAS,2BACT,QAAW,kBACb,EACA,cAAe,CACb,IAAO,2BACP,MAAS,kCACT,QAAW,yBACb,EACA,QAAS,iBACT,mBAAoB,kCACpB,uBAAwB,uCACxB,gBAAiB,2BACnB,EACA,IAAO,CACL,IAAO,mBACP,KAAQ,oBACR,iBAAkB,0BAClB,iBAAkB,0BAClB,qBAAsB,0BACtB,qBAAsB,yBACxB,EACA,KAAQ,SACR,MAAS,CACP,OACA,MACA,OACA,UACA,MACA,OACA,eACA,aACA,YACA,UACF,EACA,YAAe,GACf,WAAc,CACZ,KAAQ,MACR,IAAO,8CACT,EACA,gBAAmB,CACjB,uBAAwB,SACxB,wBAAyB,UACzB,8BAA+B,SAC/B,4BAA6B,SAC7B,oBAAqB,SACrB,6BAA8B,SAC9B,mBAAoB,UACpB,gCAAiC,UACjC,aAAc,SACd,eAAgB,UAChB,mCAAoC,UACpC,4BAA6B,UAC7B,aAAc,SACd,SAAY,SACZ,WAAc,SACd,QAAW,UACX,OAAU,UACV,SAAY,WACZ,iBAAkB,UAClB,qBAAsB,SACtB,OAAU,SACV,SAAY,SACZ,OAAU,SACV,YAAa,SACb,WAAc,SACd,QAAW,UACX,OAAU,QACZ,EACA,QAAW,CACT,OAAU,iDACV,KAAQ,aACR,iBAAkB,gCAClB,YAAa,8CACb,WAAY,oDACZ,MAAS,wBACT,KAAQ,4GACR,gBAAiB,uBACjB,UAAa,eACb,OAAU,qCACV,KAAQ,mBACR,IAAO,qBACP,aAAc,4BACd,YAAa,mHACb,kBAAmB,gCACnB,mBAAoB,iCACpB,kBAAmB,gCACnB,iBAAkB,iCAClB,OAAU,mFACV,MAAS,mCACX,EACA,aAAgB,CACd,MAAS,UACT,aAAc,SACd,gBAAiB,QACnB,CACF,ICvIA,UAAYC,OAAW,QCyGhB,IAAMC,EAAN,cAA6B,KAAM,CACxC,KACA,OACA,OACA,SAEA,YACEC,EACAC,EACAC,EACAC,EACA,CACA,IAAMC,EAAM,GAAGD,GAAY,UAAU,IAAIF,EAAS,IAAI,IAAIA,EAAS,MAAM,GACzE,MAAM,GAAGD,CAAO,OAAOI,CAAG,EAAE,EAC5B,KAAK,KAAO,iBACZ,KAAK,KAAOH,EAAS,KACrB,KAAK,OAASA,EAAS,OACvB,KAAK,OAASC,EACd,KAAK,SAAWC,CAClB,CACF,EAGaE,EAAN,cAA0BN,CAAe,CAC9C,YACEC,EACAC,EACAC,EACAC,EACA,CACA,MAAMH,EAASC,EAAUC,EAAQC,CAAQ,EACzC,KAAK,KAAO,aACd,CAMA,kBAAkBG,EAAe,EAAW,CAC1C,GAAI,CAAC,KAAK,OAAQ,OAAO,KAAK,QAE9B,IAAMC,EAAQ,KAAK,OAAO,MAAM;AAAA,CAAI,EAC9BC,EAAY,KAAK,KAAO,EACxBC,EAAY,KAAK,IAAI,EAAGD,EAAYF,CAAY,EAChDI,EAAU,KAAK,IAAIH,EAAM,OAAS,EAAGC,EAAYF,CAAY,EAE7DK,EAAmB,CAAC,EACpBC,EAAe,OAAOF,EAAU,CAAC,EAAE,OAGzC,QAASG,EAAIJ,EAAWI,GAAKH,EAASG,IAAK,CACzC,IAAMC,EAAU,OAAOD,EAAI,CAAC,EAAE,SAASD,CAAY,EAC7CG,EAASF,IAAML,EAAY,IAAM,IAIvC,GAHAG,EAAO,KAAK,GAAGI,CAAM,IAAID,CAAO,MAAMP,EAAMM,CAAC,CAAC,EAAE,EAG5CA,IAAML,EAAW,CACnB,IAAMQ,EAAe,IAAI,OAAOJ,EAAe,EAAI,KAAK,MAAM,EAC9DD,EAAO,KAAK,GAAGK,CAAY,KAAK,KAAK,QAAQ,MAAM,MAAM,EAAE,CAAC,CAAC,EAAE,CACjE,CACF,CAEA,OAAOL,EAAO,KAAK;AAAA,CAAI,CACzB,CACF,EAsDO,SAASM,GAAmBC,EAA4C,CAC7E,MAAO,CACL,MAAOA,EAAO,MAAQ,EACtB,OAAQ,IAAI,IACZ,OAAAA,EACA,WAAYA,EAAO,WACnB,MAAOA,EAAO,MACd,SAAUA,EAAO,SACjB,OAAQA,EAAO,OACf,SAAUA,EAAO,SACjB,QAASA,EAAO,OAClB,CACF,CA2BO,SAASC,EAAYC,EAA8C,CACxE,OAAIA,EAAK,IACA,CAAE,KAAMA,EAAK,IAAI,MAAM,KAAM,OAAQA,EAAK,IAAI,MAAM,MAAO,EAE7D,CAAE,KAAM,EAAG,OAAQ,CAAE,CAC9B,CCpQA,SAASC,GACPC,EACAC,EACyB,CACzB,IAAMC,EAAIF,EAAO,MAAMC,CAAO,EAC9B,GAAI,CAACC,EAAG,OAAO,KAEf,IAAMC,EAAaD,EAAE,MAASA,EAAE,CAAC,EAAE,OAAS,EACxCE,EAAQ,EACRC,EAAIF,EAAa,EACrB,KAAOE,EAAIL,EAAO,QAAUI,EAAQ,GAC9BJ,EAAOK,CAAC,IAAM,IAAKD,IACdJ,EAAOK,CAAC,IAAM,KAAKD,IAC5BC,IAEF,GAAID,IAAU,EAAG,OAAO,KAExB,IAAME,EAAWN,EAAO,MAAMG,EAAYE,CAAC,EACrCE,EAAS,CAACL,EAAE,CAAC,EAAE,MAAM,EAAG,EAAE,EAAII,EAAUA,CAAQ,EACtD,OAAAC,EAAO,MAAQL,EAAE,MACVK,CACT,CAUO,SAASC,GAAyBR,EAAwB,CAC/D,IAAIO,EAAS,GACTE,EAAI,EAER,KAAOA,EAAIT,EAAO,QAAQ,CAExB,IAAMU,EAAWV,EAAO,MAAMS,CAAC,EAAE,MAAM,aAAa,EACpD,GAAIC,EAAU,CAGZ,IAAMC,EADaF,EAAIC,EAAS,CAAC,EAAE,OAAS,EACb,EAC3BN,EAAQ,EACRC,EAAIM,EAER,KAAON,EAAIL,EAAO,QAAUI,EAAQ,GAAG,CACrC,IAAMQ,EAAOZ,EAAOK,CAAC,EACjBO,IAAS,IAAKR,IACTQ,IAAS,KAAKR,IACvBC,GACF,CAEA,GAAID,IAAU,EAAG,CAEfG,GAAUP,EAAOS,CAAC,EAClBA,IACA,QACF,CAKA,GAFiBT,EAAO,MAAMK,CAAC,EAAE,MAAM,uBAAuB,EAI5DE,GAAUP,EAAO,MAAMS,EAAGJ,CAAC,EAC3BI,EAAIJ,MACC,CAGL,IAAMQ,EAAOb,EAAO,MAAMW,EAAWN,EAAI,CAAC,EAC1CE,GAAU,QAAQM,CAAI,+JACtBJ,EAAIJ,CACN,CACF,MACEE,GAAUP,EAAOS,CAAC,EAClBA,GAEJ,CAEA,OAAOF,CACT,CAwBO,SAASO,GAAkBd,EAGhC,CACA,IAAMe,EAAsB,CAAC,EACzBR,EAAS,GACTE,EAAI,EACJO,EAAU,EAEd,KAAOP,EAAIT,EAAO,QAAQ,CAExB,IAAMiB,EAAYjB,EAAO,MAAMS,CAAC,EAAE,MAAM,cAAc,EACtD,GAAIQ,EAAW,CACb,IAAMC,EAAaT,EAGbE,EAAYF,EAAIQ,EAAU,CAAC,EAAE,OAC/BE,EAAa,EACbd,EAAIM,EAER,KAAON,EAAIL,EAAO,QAAUmB,EAAa,GAAG,CAC1C,IAAMP,EAAOZ,EAAOK,CAAC,EACjBO,IAAS,IAAKO,IACTP,IAAS,KAAKO,IACvBd,GACF,CAEA,GAAIc,IAAe,EAAG,CACpBZ,GAAUP,EAAOS,CAAC,EAClBA,IACA,QACF,CAEA,IAAMI,EAAOb,EAAO,MAAMW,EAAWN,EAAI,CAAC,EACtCe,EACAC,EAAWhB,EAGTiB,EAAgBtB,EAAO,MAAMK,CAAC,EAAE,MAAM,mBAAmB,EAC/D,GAAIiB,EAAe,CACjB,IAAMC,EAAgBlB,EAAIiB,EAAc,CAAC,EAAE,OAC3CH,EAAa,EACb,IAAIK,EAAID,EAER,KAAOC,EAAIxB,EAAO,QAAUmB,EAAa,GAAG,CAC1C,IAAMP,EAAOZ,EAAOwB,CAAC,EACjBZ,IAAS,IAAKO,IACTP,IAAS,KAAKO,IACvBK,GACF,CAEIL,IAAe,IACjBC,EAAepB,EAAO,MAAMuB,EAAeC,EAAI,CAAC,EAChDH,EAAWG,EAEf,CAOA,IAAMC,EAJeC,GAAeb,CAAI,EAIV,IAAKc,GAAS,CAC1C,IAAMC,EAAiBC,GAAkB7B,EAAQkB,EAAYS,CAAI,EACjE,OAAOC,EAAiB,GAAGD,CAAI,KAAKC,CAAc,GAAKD,CACzD,CAAC,EAGKG,EAAmB,CACvB,GAAI,cAAcd,CAAO,GACzB,KAAAH,EACA,SAAUO,EACV,SAAAK,EACA,MAAOP,EACP,IAAKG,CACP,EACAN,EAAO,KAAKe,CAAK,EAIjB,IAAMC,EAAeX,GAAgBP,EAE/BmB,EAAkBP,EAAS,IAAKQ,GAAMA,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,EAC5DC,EACJF,EAAgB,OAAS,EAAIA,EAAgB,KAAK,IAAI,EAAI,GAItDG,EACJH,EAAgB,OAAS,EACrB,cAAcF,EAAM,EAAE,IAAII,CAAW,IACrC,cAAcJ,EAAM,EAAE,KAEtBM,EAAW,eAAeN,EAAM,EAAE,MAAMK,CAAQ,cAAcJ,CAAY,QAEhFxB,GAAU6B,EACV3B,EAAIY,EACJL,GACF,MACET,GAAUP,EAAOS,CAAC,EAClBA,GAEJ,CAEA,MAAO,CAAE,OAAQF,EAAQ,OAAAQ,CAAO,CAClC,CAGA,SAASsB,GAAgBV,EAAuB,CAC9C,OAAOA,EAAK,WAAW,QAAQ,GAAKA,EAAK,WAAW,OAAO,CAC7D,CAWA,SAASD,GAAeb,EAAwB,CAE9C,IAAMyB,EAAsBzB,EACzB,QAAQ,cAAe,EAAE,EACzB,QAAQ,oBAAqB,EAAE,EAG5B0B,EAAe,IAAI,IACnBC,EAAc,kCAChBC,EACJ,MAAQA,EAAQD,EAAY,KAAKF,CAAmB,KAAO,MACzDC,EAAa,IAAIE,EAAM,CAAC,CAAC,EAI3B,IAAMC,EAAoB,yCACpBC,EAAiB,IAAI,IAC3B,MAAQF,EAAQC,EAAkB,KAAKJ,CAAmB,KAAO,MAC/DK,EAAe,IAAIF,EAAM,CAAC,CAAC,EAI7B,QAAWG,KAAQL,EAAc,CAC/B,GAAI,CAACI,EAAe,IAAIC,CAAI,EAAG,SAE/B,IAAMC,EAAoB,IAAI,OAAO,cAAcD,CAAI,MAAO,GAAG,EAC3DE,EAAa,IAAI,OAAO,MAAMF,CAAI,MAAO,GAAG,EAC5CG,EACJT,EAAoB,MAAMO,CAAiB,GAAG,QAAU,EACpDG,EAAaV,EAAoB,MAAMQ,CAAU,GAAG,QAAU,EAEhEC,GAAqBC,GACvBL,EAAe,OAAOC,CAAI,CAE9B,CAGA,IAAMK,EAAW,IAAI,IAGfC,EAAc,oDACpB,MAAQT,EAAQS,EAAY,KAAKZ,CAAmB,KAAO,MACzDW,EAAS,IAAIR,EAAM,CAAC,CAAC,EAIvB,IAAMU,EACJ,+DACF,MAAQV,EAAQU,EAAW,KAAKb,CAAmB,KAAO,MACxDW,EAAS,IAAIR,EAAM,CAAC,CAAC,EAMvB,IAAMW,EAAW,IAAI,IAAI,CACvB,KACA,OACA,MACA,QACA,KACA,SACA,OACA,QACA,WACA,SACA,WACA,MACA,QACA,MACA,MACA,OACA,OACA,QACA,OACA,YACA,SACA,aACA,KACA,KACA,MACA,QACA,UACA,QACA,QACA,QACA,QACA,UACA,QACA,SACA,SACA,UACA,OACA,KACA,SACA,MACA,MACA,QAEA,UACA,OACA,QACA,SACA,SACA,SACA,UACA,OACA,OACA,UACA,MACA,MACA,UACA,UACA,eACA,eACA,YACA,aACA,aACA,aACA,cACA,cACA,gBACA,iBACA,cACA,WACA,QACA,YACA,aACA,SACA,OACA,MACA,QACA,UACA,QACA,SACA,MACA,SACA,SACA,UACA,OACA,YACA,UACA,WACA,aACA,SACA,WACA,WACA,MACA,QACA,WACA,WACA,aACA,YACA,YACA,OACA,YACF,CAAC,EAGK3B,EAAqB,CAAC,EAC5B,QAAW4B,KAAMV,EACX,CAACM,EAAS,IAAII,CAAE,GAAK,CAACD,EAAS,IAAIC,CAAE,GAAK,CAAChB,GAAgBgB,CAAE,GAC/D5B,EAAS,KAAK4B,CAAE,EAIpB,OAAO5B,EAAS,KAAK,CACvB,CAYA,SAASI,GACP7B,EACAsD,EACAC,EACoB,CAGpB,IAAMC,EAAcxD,EAAO,MAAM,EAAGsD,CAAc,EAI5CG,EAAc,uDACdhB,EAAQe,EAAY,MAAMC,CAAW,EAE3C,GAAI,CAAChB,EAAO,CAEV,IAAMiB,EACJ,kFACIC,EAAaH,EAAY,MAAME,CAAY,EACjD,OAAKC,EACEC,GAAsBD,EAAW,CAAC,EAAGJ,CAAS,EADpC,MAEnB,CAEA,OAAOK,GAAsBnB,EAAM,CAAC,EAA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",
6
+ "names": ["require_package", "__commonJSMin", "exports", "module", "acorn", "TranspileError", "message", "location", "source", "filename", "loc", "SyntaxError", "contextLines", "lines", "errorLine", "startLine", "endLine", "output", "lineNumWidth", "i", "lineNum", "marker", "caretPadding", "createChildContext", "parent", "getLocation", "node", "extractBalancedValue", "source", "startRe", "m", "braceStart", "depth", "j", "balanced", "result", "transformTryWithoutCatch", "i", "tryMatch", "bodyStart", "char", "body", "extractWasmBlocks", "blocks", "blockId", "wasmMatch", "matchStart", "braceDepth", "fallbackBody", "matchEnd", "fallbackMatch", "fallbackStart", "k", "captures", "detectCaptures", "name", "typeAnnotation", "findParameterType", "block", "fallbackCode", "captureArgNames", "c", "captureArgs", "wasmCall", "dispatch", "isWasmIntrinsic", "bodyWithoutComments", "propertyOnly", "propPattern", "match", "identifierPattern", "allIdentifiers", "prop", "standalonePattern", "dotPattern", "standaloneMatches", "dotMatches", "declared", "declPattern", "forPattern", "reserved", "id", "wasmBlockStart", "paramName", "beforeBlock", "funcPattern", "arrowPattern", "arrowMatch", "extractTypeFromParams", "paramsStr", "params", "p", "param", "colonMatch", "equalsMatch", "transformIsOperators", "exprPat", "isNotRegex", "isRegex", "insertAsiProtection", "continuationStarts", "expectsContinuation", "continueKeywords", "lines", "inBlockComment", "line", "prevLine", "commentOpen", "commentClose", "prevNoComment", "indent", "rest", "transformTypeofKeyword", "matches", "state", "templateStack", "nextChar", "beforeChar", "operandStart", "transformEqualityToStructural", "equalityOps", "pos", "op", "funcName", "leftBoundary", "findLeftOperandBoundary", "rightBoundary", "findRightOperandBoundary", "leftExpr", "rightExpr", "before", "after", "spacer", "opPos", "inString", "stringChar", "prevChar", "wordEnd", "wordStart", "word", "beforeWord", "startAfterOp", "transformTypeDeclarations", "typeMatch", "typeName", "description", "descriptionWasExplicit", "descStringMatch", "afterString", "isEndOfStatement", "value", "trailingWs", "defaultValue", "posAfterDefault", "valueMatch", "wsMatch", "blockBody", "blockEnd", "descInsideMatch", "example", "exampleKeyword", "valueStart", "extracted", "extractJSValue", "predicateMatch", "defaultArg", "transformFunctionPredicateDeclarations", "fpMatch", "fpName", "typeParamsStr", "paramsMatch", "returnsMatch", "contractMatch", "descMatch", "spec", "desc", "typeParams", "parts", "s", "defaultVal", "paramNames", "args", "commaIdx", "fnRef", "transformGenericDeclarations", "genericMatch", "genericName", "parsedBody", "declIdx", "declBraceStart", "dDepth", "dj", "valueParam", "typeParamNames", "typeCheckParams", "idx", "transformUnionDeclarations", "unionMatch", "unionName", "values", "parseUnionValues", "lineEnd", "inlineValues", "input", "part", "transformEnumDeclarations", "enumMatch", "enumName", "membersStr", "parseEnumMembers", "key", "members", "currentNumericValue", "l", "explicitValue", "numVal", "transformExtendDeclarations", "extensions", "remaining", "extendMatch", "afterWS", "blockStart", "findFunctionBodyEnd", "methods", "bodySource", "methodMatch", "methodIndent", "isAsync", "methodName", "parenStart", "parenDepth", "afterParams", "loc", "locAt", "SyntaxError", "methodBodyEnd", "fullMethodText", "transformedParams", "asyncPrefix", "methodBody", "isFirstForType", "extSet", "methodEntries", "replacement", "transformExtensionCalls", "methodToTypes", "method", "typeNames", "singleQuotePattern", "_", "str", "meth", "closeParen", "doubleQuotePattern", "templatePattern", "methodDot", "searchFrom", "bracketDepth", "inStr", "ch", "arrayLiteral", "numPattern", "num", "column", "typeCheckForDefault", "argExpr", "dv", "typeSignatureForDefault", "parseParamList", "paramStr", "requiredParams", "current", "parseOneParam", "trimmed", "eqIdx", "openBracePos", "inLineComment", "next", "transformPolymorphicFunctions", "polymorphicNames", "declarations", "allMatches", "exported", "fullMatchStart", "funcKeywordStart", "funcIdx", "nameCounts", "polyNames", "count", "afterFunc", "bodyEnd", "realStart", "variants", "asyncCount", "v", "a", "b", "allSame", "sigA", "sigB", "allVariants", "variant", "renamed", "isExported", "exportPrefix", "sorted", "specA", "specB", "sig", "branches", "checks", "check", "dispatcher", "transformBareAssignments", "extractAndRunTests", "skipTests", "tests", "errors", "testMatch", "start", "escaped", "nl", "end", "err", "newlines", "transformPolymorphicConstructors", "polyCtorClasses", "classRegex", "classMatch", "classInfos", "className", "extendsClause", "ci", "ctorPattern", "ctorMatch", "ctorPositions", "ctors", "ctorBodyEnd", "bodyText", "newBody", "afterLastCtor", "cleanBody", "ctor", "factories", "dispatchBranches", "insertPos", "wrapClassDeclarations", "lastIndex", "classStart", "classEnd", "classBody", "validateNoDate", "datePatterns", "pattern", "message", "transformConstBang", "immutableNames", "constBangRe", "stripped", "mutatingMethods", "validateNoVar", "validateNoEval", "transformBangAccess", "templateDepth", "exprEnd", "exprStart", "findExprStartBackward", "expr", "text", "findMatchingOpen", "open", "close", "transformLetTypeAnnotations", "annotations", "replacements", "nameStart", "nameEnd", "varName", "exStart", "exEnd", "scanExampleEnd", "r", "parens", "braces", "brackets", "transformParenExpressions", "source", "ctx", "result", "i", "firstReturnType", "firstReturnSafety", "state", "templateStack", "contextStack", "braceDepth", "_currentContext", "isInClassBody", "frame", "char", "nextChar", "before", "classMatch", "classHeader", "funcMatch", "funcName", "matchLen", "afterParen", "safetyMarker", "paramStart", "paramsResult", "extractBalancedContent", "params", "endPos", "processedParams", "processParamString", "j", "colonMarker", "safety", "typeResult", "extractReturnTypeValue", "arrowCheck", "SyntaxError", "locAt", "methodMatch", "prevNonWs", "k", "isMethodDecl", "skipLen", "methodPart", "fullParamsResult", "fullContent", "arrowReturnType", "trimmedContent", "transformed", "start", "open", "close", "depth", "inString", "stringChar", "extractJSValue", "valueStart", "firstChar", "keywordMatch", "normalizeUnionSyntax", "type", "sawContent", "makeResult", "typeEnd", "splitParameters", "current", "inLineComment", "inBlockComment", "trackRequired", "withArrows", "paramList", "sawOptional", "seenNames", "checkDuplicate", "name", "param", "trimmed", "inner", "processDestructuredObjectParams", "restColonPos", "findTopLevelColon", "optionalMatch", "hasColonNotEquals", "eqMatch", "colonPos", "part", "nestedObjectMatch", "objectLiteral", "processedLiteral", "processObjectLiteralValue", "nestedArrayMatch", "arrayLiteral", "processArrayLiteralValue", "colonMatch", "value", "literal", "nestedObjColonMatch", "key", "nested", "nestedObjEqualsMatch", "nestedArrColonMatch", "nestedArrEqualsMatch", "equalsMatch", "hasColon", "hasEquals", "stripLineComments", "source", "result", "i", "ch", "quote", "end", "slice", "nl", "preprocess", "options", "originalSource", "moduleSafety", "requiredParams", "unsafeFunctions", "safeFunctions", "isCompat", "tjsModes", "safetyMatch", "directivePattern", "match", "directive", "insertAsiProtection", "transformConstBang", "transformBangAccess", "letAnnoResult", "transformLetTypeAnnotations", "letAnnotations", "transformIsOperators", "transformEqualityToStructural", "transformTypeDeclarations", "transformGenericDeclarations", "transformFunctionPredicateDeclarations", "transformUnionDeclarations", "transformEnumDeclarations", "transformBareAssignments", "transformedSource", "returnType", "returnSafety", "transformParenExpressions", "extResult", "transformExtendDeclarations", "transformTryWithoutCatch", "polyResult", "transformPolymorphicFunctions", "wasmBlocks", "extractWasmBlocks", "testResult", "extractAndRunTests", "polyCtorResult", "transformPolymorphicConstructors", "cls", "wrapClassDeclarations", "validateNoDate", "validateNoEval", "validateNoVar", "transformExtensionCalls", "parse", "filename", "colonShorthand", "vmTarget", "processedSource", "tests", "testErrors", "e", "loc", "SyntaxError", "validateSingleFunction", "ast", "node", "functions", "second", "extractTDoc", "func", "beforeFunc", "allDocBlocks", "lastBlock", "afterBlock", "content", "lines", "minIndent", "line", "min", "indent", "jsdocMatch", "jsdoc", "descMatch", "paramRegex", "parseExpressionAt", "inferTypeFromValue", "node", "value", "raw", "elements", "itemTypes", "el", "seen", "t", "key", "unique", "properties", "shape", "prop", "operator", "left", "right", "leftType", "rightType", "fn", "params", "p", "paramShape", "returns", "op", "arg", "parseParameter", "param", "requiredParams", "TranspileError", "getLocation", "name", "isRequired", "type", "exampleValue", "extractLiteralValue", "destructuredParams", "innerParam", "result", "parseReturnType", "typeExpr", "ast", "parseExpressionAt", "typeToString", "items", "props", "k", "v", "typeToJsonSchema", "type", "properties", "key", "propType", "parametersToJsonSchema", "parameters", "required", "name", "param", "transformFunction", "func", "source", "returnTypeAnnotation", "options", "requiredParamsFromPreprocess", "tdoc", "extractTDoc", "parsed", "parseParameter", "paramDesc", "returnType", "parseReturnType", "ctx", "bodySteps", "transformBlock", "steps", "requiredParams", "optionalParams", "defaultValue", "signatureParams", "signature", "inputSchema", "block", "stmt", "transformed", "transformStatement", "transformVariableDeclaration", "transformExpressionStatement", "transformIfStatement", "transformWhileStatement", "transformForOfStatement", "transformTryStatement", "transformReturnStatement", "TranspileError", "getLocation", "createChildContext", "decl", "isConst", "opName", "declarator", "step", "resultVar", "transformExpressionToStep", "inferTypeFromValue", "expr", "transformAssignment", "condition", "expressionToExprNode", "thenSteps", "elseSteps", "body", "varName", "items", "expressionToValue", "childCtx", "trySteps", "catchSteps", "catchParam", "catchCtx", "BUILTIN_OBJECTS", "BUILTIN_GLOBALS", "UNSUPPORTED_BUILTINS", "INSTANCE_METHODS", "isBuiltinCall", "member", "objName", "methodName", "isBuiltinMemberAccess", "UNSUPPORTED_BUILTIN_MESSAGES", "getUnsupportedBuiltinError", "getNewExpressionSuggestion", "constructorName", "varOp", "newExpr", "suggestion", "unsupportedError", "exprNode", "transformCallExpression", "transformTemplateLiteral", "funcName", "isMethodCall", "receiver", "transformMethodCall", "args", "extractCallArguments", "method", "callback", "paramName", "exprResult", "accParam", "itemParam", "accName", "itemName", "initial", "a", "tmpl", "vars", "mem", "obj", "isOptional", "prop", "propName", "bin", "log", "un", "cond", "el", "call", "arg", "objValue", "result", "parseExpressionAt", "isInsideComment", "source", "pos", "lineStart", "i", "inBlockComment", "extractEmbeddedTests", "tests", "embeddedRegex", "match", "desc", "body", "getLineNumber", "extractTests", "mocks", "embeddedTests", "testRegex", "mockRegex", "cleanCode", "testMatches", "start", "bodyStart", "end", "findMatchingBrace", "mockMatches", "allMatches", "a", "b", "m", "testRunner", "generateTestRunner", "depth", "inString", "escaped", "char", "mockSetup", "t", "assertFunction", "expectFunction", "testUtils", "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", "metaParamCount", "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", "reason", "typeError", "value", "stack", "config", "getStack", "msg", "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", "toBool", "Eq", "NotEq", "isError", "error", "details", "currentStack", "fullStack", "composeErrors", "funcName", "paramNames", "e", "parts", "typeOf", "t", "constructorName", "isNativeType", "typeName", "proto", "checkType", "checkFnShape", "fn", "expectedParamKinds", "expectedReturnKind", "meta", "actualEntries", "expectedKind", "actualKind", "actualReturnKind", "validateArgs", "args", "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", "checkFnShape", "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", "toBool", "tjsEquals", "runtime", "typeError", "configure", "getConfig", "getStack", "errors", "clearErrors", "getErrorCount", "resetRuntime", "enterUnsafe", "exitUnsafe", "isUnsafeMode", "Timestamp", "LegalDate", "installRuntime", "g", "existingVersion", "comparison", "emitRuntimeWrapper", "fuzzyEqual", "a", "b", "epsilon", "diff", "maxAbs", "deepEqual", "v", "i", "keysA", "keysB", "k", "typeMatches", "actual", "pattern", "path", "typeOf", "elementPattern", "result", "key", "keyPath", "formatValue", "indent", "x", "entries", "formatKey", "val", "pad", "closePad", "formatted", "suffix", "stripComments", "code", "match", "newlines", "stripModuleSyntax", "buildResolvedImportsCode", "resolvedImports", "lines", "specifier", "moduleCode", "cleanCode", "stripModuleSyntax", "parseReturnExample", "str", "defaults", "trimmed", "transformed", "depth", "i", "ch", "quote", "keyMatch", "j", "valStr", "valDepth", "vc", "extractSignatureTestInfos", "originalSource", "infos", "sourceWithoutComments", "stripComments", "funcRegex", "match", "isAsync", "funcName", "paramsStr", "returnMarker", "lineNumber", "afterMarker", "returnExample", "extractReturnExampleFromSource", "paramExamples", "extractParamExamples", "parsed", "args", "p", "classRegex", "classMatch", "className", "classBodyStart", "braceDepth", "classBodyEnd", "classBody", "ctorMatch", "ctorParamsStr", "ctorParamExamples", "ctorArgs", "methodRegex", "methodMatch", "methodName", "methodPosInSource", "runAllTests", "tests", "mocks", "sigTestInfos", "transpiledCode", "extensions", "results", "importSpecifiers", "hasUnresolvedImports", "imp", "executableCode", "importedCode", "mockSetup", "m", "testRuntimeImports", "testBodies", "t", "body", "transformExtensionCalls", "syncSigTestInfos", "info", "asyncSigTestInfos", "sigTestBodies", "testLabel", "callExpr", "a", "installRuntime", "testCode", "fn", "blockResults", "sigTestResults", "deepEqual", "formatValue", "typeMatches", "r", "test", "isImportError", "label", "e", "isUnresolvedRef", "extractReturnExampleFromSource", "source", "result", "depth", "hasContent", "i", "char", "extractParamExamples", "paramsStr", "examples", "params", "splitParams", "param", "trimmed", "restMatch", "arr", "el", "match", "current", "acorn", "Type", "Section", "Op", "OpName", "name", "code", "SIMD_PREFIX", "SimdOp", "SimdOpName", "encodeSIMD", "subOp", "encodeULEB128", "encodeSIMDMemarg", "align", "offset", "encodeULEB128", "value", "result", "byte", "encodeSLEB128", "more", "encodeF32", "buffer", "encodeF64", "encodeString", "s", "bytes", "encodeSection", "id", "contents", "decodeULEB128", "bytes", "offset", "result", "shift", "i", "byte", "decodeF64", "buffer", "view", "disassemble", "code", "params", "localTypes", "lines", "indent", "ind", "paramStr", "p", "localStr", "t", "op", "name", "OpName", "Op", "idx", "len", "paramName", "depth", "val", "j", "blockType", "Type", "align", "len1", "len2", "SIMD_PREFIX", "subOp", "subLen", "simdName", "SimdOpName", "SimdOp", "_align", "b", "lane", "TYPED_ARRAYS", "createContext", "ctx", "declareLocal", "type", "index", "getLocal", "compileStatement", "node", "expr", "compileExpression", "ret", "retType", "inferExprType", "decl", "declarator", "encodeULEB128", "compileForLoop", "compileIf", "block", "stmt", "lit", "binExpr", "leftType", "rightType", "unary", "member", "param", "arrayInfo", "call", "callee", "encodeSLEB128", "encodeF32", "encodeF64", "local", "compileBinaryExpr", "compileUnaryExpr", "compileAssignment", "compileUpdate", "compileArrayAccess", "compileCall", "seq", "left", "right", "resultType", "isComparison", "opType", "leftCode", "rightCode", "ops", "opcode", "arg", "compileArrayStore", "valType", "isI32", "indexCode", "indexType", "target", "value", "operator", "computeAddress", "addr", "addrLocal", "rhsType", "opMap", "valLocal", "tempLocal", "method", "compileMathCall", "compileSIMDCall", "args", "offType", "encodeSIMDMemarg", "argType", "encodeSIMD", "unaryMap", "parseTypeAnnotation", "capture", "parts", "s", "typeStr", "buildModule", "bodyCode", "needsMemory", "hasReturn", "header", "paramWasmTypes", "returnSpec", "typeSection", "encodeSection", "Section", "memorySection", "importSection", "encodeString", "funcSection", "exportSection", "localGroups", "currentType", "count", "funcBody", "codeSection", "sections", "compileToWasm", "ast", "wrapped", "e", "body", "moduleBytes", "watText", "generateWasmBootstrap", "blocks", "results", "compiledBlocks", "block", "result", "compileToWasm", "base64", "watComments", "b", "watLines", "line", "blockData", "anyNeedsMemory", "acorn", "rewriteBoolCoercion", "ast", "source", "candidates", "emitTestWrap", "test", "rewriteExpr", "visit", "node", "n", "walkChildren", "dedupeNested", "left", "right", "rewriteOther", "start", "end", "children", "collectChildren", "b", "out", "cursor", "child", "cb", "key", "v", "item", "patches", "sorted", "a", "kept", "lastEnd", "p", "rewriteBoolCoercionInSource", "wrapped", "isParamRequiredInSource", "source", "funcName", "paramName", "funcPattern", "match", "extractFunctionTypeInfo", "func", "originalSource", "requiredParams", "returnTypeStr", "inputSource", "warnings", "tdoc", "extractTDoc", "params", "isDestructuredParam", "destructuredShape", "destructuredRequired", "param", "objectPattern", "paramInfo", "parseParameter", "key", "descriptor", "isRequired", "restName", "restTypeMatch", "typeExpr", "parseExpressionAt", "restItemType", "inferTypeFromValue", "returns", "parsableReturnStr", "transformReturnDefaults", "returnExpr", "generateInlineValidationCode", "types", "lines", "pathPrefix", "stackEntry", "shape", "requiredFields", "fieldNames", "fieldName", "fieldType", "path", "typeCheck", "generateTypeCheckExpr", "expectedType", "m", "shapeCheck", "generateFunctionShapeCheck", "str", "result", "depth", "i", "ch", "extractFunctionReturnType", "afterMarker", "extractReturnExampleFromSource", "extractFunctionReturnSafety", "marker", "extractSourceFileAnnotation", "extractLineAnnotation", "regex", "transpileToJS", "options", "filename", "runTests", "debug", "resolvedImports", "stripLineComments", "effectiveFilename", "cleanSource", "tests", "mocks", "testRunner", "extractTests", "program", "unsafeFunctions", "parse", "functions", "findAllFunctions", "preprocessed", "preprocess", "t", "transformIsOperators", "transformEqualityToStructural", "rewriteBoolCoercionInSource", "allTypes", "insertions", "deletions", "returnDefaults", "defaultsMatch", "transformed", "parsed", "defaults", "funcWarnings", "localName", "refName", "refInfo", "fnParams", "n", "p", "fnReturns", "right", "isUnsafe", "isSafe", "returnSafety", "annotatedLine", "funcLoc", "safetyOptions", "isPolymorphicDispatcher", "typeMetadata", "variantNames", "f", "fn", "metadata", "generateTypeMetadata", "sourceStr", "validation", "boolPatches", "rewriteBoolCoercion", "a", "b", "code", "start", "end", "ins", "shift", "del", "position", "text", "needsTypeError", "needsStack", "needsIs", "needsIsNot", "needsEq", "needsNotEq", "needsTypeOf", "needsType", "needsGeneric", "needsFunctionPredicate", "needsEnum", "needsUnion", "needsBang", "needsToBool", "needsCheckFnShape", "needsSafeEval", "inlineParts", "inlineBlock", "fallbackEntries", "fallbackObj", "testResults", "sigTestInfos", "extractSignatureTestInfos", "runAllTests", "failures", "r", "errorLines", "loc", "wasmCompiled", "wasmBootstrap", "generateWasmBootstrap", "node", "serializeType", "k", "v", "safety", "debugOpts", "paramsObj", "name", "file", "line", "generateTypeCheckExpr", "fieldPath", "type", "check", "itemCheck", "checks", "m", "c", "SIMPLE_KINDS", "generateFunctionShapeCheck", "paramName", "type", "path", "fnParams", "fnReturns", "paramKinds", "p", "allSimple", "k", "hasUsefulCheck", "paramTypesJson", "transpile", "source", "options", "program", "returnType", "originalSource", "requiredParams", "parse", "func", "validateSingleFunction", "ast", "signature", "warnings", "transformFunction", "ajs", "sourceOrStrings", "values", "acc", "str", "i", "createAgent", "vm", "runOptions", "agent", "args", "typeDescriptorToJsonSchema", "type", "k", "v", "getToolDefinitions", "agents", "name", "sig", "properties", "required", "paramName", "param", "tjs", "optionsOrFirstValue", "restValues", "transpileToJS", "s", "getType", "value", "infer", "schemaCallable", "Schema", "target", "prop", "thisArg", "args", "simple", "node", "visitors", "baseVisitor", "state", "override", "base", "c", "st", "type", "ancestor", "ancestors", "isNew", "skipThrough", "node", "st", "c", "ignore", "_node", "_st", "_c", "base", "i", "list", "stmt", "cs", "cons", "decl", "param", "elt", "prop", "expr", "quasi", "i$1", "list$1", "arg", "spec", "DEFAULT_OPTIONS", "lint", "source", "options", "opts", "diagnostics", "program", "letAnnotations", "safeAssignMode", "result", "parse", "error", "safeAssignEnabled", "safeAssignSeverity", "scopes", "createScope", "ancestor", "node", "_state", "_ancestors", "scope", "param", "addDeclaration", "decl", "simple", "i", "name", "foundReturn", "stmt", "typedLets", "d", "annotated", "init", "isLiteralNullish", "describeNullish", "calleeName", "kind"]
7
7
  }