tjs-lang 0.6.13 → 0.6.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +40 -17
- package/demo/docs.json +1 -1
- package/dist/index.js +119 -116
- package/dist/index.js.map +8 -8
- package/dist/src/lang/parser-transforms.d.ts +15 -0
- package/dist/src/lang/runtime.d.ts +4 -2
- package/dist/src/types/Type.d.ts +41 -0
- package/dist/src/types/index.d.ts +1 -1
- package/dist/tjs-full.js +119 -116
- package/dist/tjs-full.js.map +8 -8
- package/dist/tjs-vm.js +37 -37
- package/dist/tjs-vm.js.map +4 -4
- package/docs/function-predicate-design.md +180 -0
- package/package.json +1 -1
- package/src/cli/tjs.ts +1 -1
- package/src/lang/emitters/dts.test.ts +58 -0
- package/src/lang/emitters/dts.ts +84 -0
- package/src/lang/emitters/from-ts.ts +217 -6
- package/src/lang/function-predicate.test.ts +188 -0
- package/src/lang/parser-transforms.ts +103 -0
- package/src/lang/parser.ts +2 -0
- package/src/lang/runtime.ts +4 -0
- package/src/lang/typescript-syntax.test.ts +154 -5
- package/src/types/Type.ts +148 -0
- package/src/types/index.ts +5 -0
package/dist/index.js.map
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"sources": ["node:path", "../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/emitters/js-tests.ts", "../src/lang/wasm.ts", "../src/lang/emitters/js-wasm.ts", "../src/lang/emitters/dts.ts", "../src/lang/emitters/from-ts.ts", "../src/lang/runtime.ts", "../src/types/Type.ts", "../src/lang/schema.ts", "../src/lang/metadata-cache.ts", "../node_modules/acorn-walk/dist/walk.mjs", "../src/lang/linter.ts", "../src/lang/docs.ts", "../src/vm/runtime.ts", "../src/builder.ts", "../src/vm/vm.ts", "../src/lang/core.ts", "../src/lang/eval.ts", "../src/lang/index.ts", "../src/vm/atoms/batteries.ts", "../src/vm/atoms/index.ts", "../src/batteries/store.ts", "../src/batteries/llm.ts", "../src/batteries/audit.ts", "../src/batteries/models.ts", "../src/batteries/index.ts", "../src/types/Timestamp.ts", "../src/types/LegalDate.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"function assertPath(path){if(typeof path!==\"string\")throw TypeError(\"Path must be a string. Received \"+JSON.stringify(path))}function normalizeStringPosix(path,allowAboveRoot){var res=\"\",lastSegmentLength=0,lastSlash=-1,dots=0,code;for(var i=0;i<=path.length;++i){if(i<path.length)code=path.charCodeAt(i);else if(code===47)break;else code=47;if(code===47){if(lastSlash===i-1||dots===1);else if(lastSlash!==i-1&&dots===2){if(res.length<2||lastSegmentLength!==2||res.charCodeAt(res.length-1)!==46||res.charCodeAt(res.length-2)!==46){if(res.length>2){var lastSlashIndex=res.lastIndexOf(\"/\");if(lastSlashIndex!==res.length-1){if(lastSlashIndex===-1)res=\"\",lastSegmentLength=0;else res=res.slice(0,lastSlashIndex),lastSegmentLength=res.length-1-res.lastIndexOf(\"/\");lastSlash=i,dots=0;continue}}else if(res.length===2||res.length===1){res=\"\",lastSegmentLength=0,lastSlash=i,dots=0;continue}}if(allowAboveRoot){if(res.length>0)res+=\"/..\";else res=\"..\";lastSegmentLength=2}}else{if(res.length>0)res+=\"/\"+path.slice(lastSlash+1,i);else res=path.slice(lastSlash+1,i);lastSegmentLength=i-lastSlash-1}lastSlash=i,dots=0}else if(code===46&&dots!==-1)++dots;else dots=-1}return res}function _format(sep,pathObject){var dir=pathObject.dir||pathObject.root,base=pathObject.base||(pathObject.name||\"\")+(pathObject.ext||\"\");if(!dir)return base;if(dir===pathObject.root)return dir+base;return dir+sep+base}function resolve(){var resolvedPath=\"\",resolvedAbsolute=!1,cwd;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path;if(i>=0)path=arguments[i];else{if(cwd===void 0)cwd=process.cwd();path=cwd}if(assertPath(path),path.length===0)continue;resolvedPath=path+\"/\"+resolvedPath,resolvedAbsolute=path.charCodeAt(0)===47}if(resolvedPath=normalizeStringPosix(resolvedPath,!resolvedAbsolute),resolvedAbsolute)if(resolvedPath.length>0)return\"/\"+resolvedPath;else return\"/\";else if(resolvedPath.length>0)return resolvedPath;else return\".\"}function normalize(path){if(assertPath(path),path.length===0)return\".\";var isAbsolute=path.charCodeAt(0)===47,trailingSeparator=path.charCodeAt(path.length-1)===47;if(path=normalizeStringPosix(path,!isAbsolute),path.length===0&&!isAbsolute)path=\".\";if(path.length>0&&trailingSeparator)path+=\"/\";if(isAbsolute)return\"/\"+path;return path}function isAbsolute(path){return assertPath(path),path.length>0&&path.charCodeAt(0)===47}function join(){if(arguments.length===0)return\".\";var joined;for(var i=0;i<arguments.length;++i){var arg=arguments[i];if(assertPath(arg),arg.length>0)if(joined===void 0)joined=arg;else joined+=\"/\"+arg}if(joined===void 0)return\".\";return normalize(joined)}function relative(from,to){if(assertPath(from),assertPath(to),from===to)return\"\";if(from=resolve(from),to=resolve(to),from===to)return\"\";var fromStart=1;for(;fromStart<from.length;++fromStart)if(from.charCodeAt(fromStart)!==47)break;var fromEnd=from.length,fromLen=fromEnd-fromStart,toStart=1;for(;toStart<to.length;++toStart)if(to.charCodeAt(toStart)!==47)break;var toEnd=to.length,toLen=toEnd-toStart,length=fromLen<toLen?fromLen:toLen,lastCommonSep=-1,i=0;for(;i<=length;++i){if(i===length){if(toLen>length){if(to.charCodeAt(toStart+i)===47)return to.slice(toStart+i+1);else if(i===0)return to.slice(toStart+i)}else if(fromLen>length){if(from.charCodeAt(fromStart+i)===47)lastCommonSep=i;else if(i===0)lastCommonSep=0}break}var fromCode=from.charCodeAt(fromStart+i),toCode=to.charCodeAt(toStart+i);if(fromCode!==toCode)break;else if(fromCode===47)lastCommonSep=i}var out=\"\";for(i=fromStart+lastCommonSep+1;i<=fromEnd;++i)if(i===fromEnd||from.charCodeAt(i)===47)if(out.length===0)out+=\"..\";else out+=\"/..\";if(out.length>0)return out+to.slice(toStart+lastCommonSep);else{if(toStart+=lastCommonSep,to.charCodeAt(toStart)===47)++toStart;return to.slice(toStart)}}function _makeLong(path){return path}function dirname(path){if(assertPath(path),path.length===0)return\".\";var code=path.charCodeAt(0),hasRoot=code===47,end=-1,matchedSlash=!0;for(var i=path.length-1;i>=1;--i)if(code=path.charCodeAt(i),code===47){if(!matchedSlash){end=i;break}}else matchedSlash=!1;if(end===-1)return hasRoot?\"/\":\".\";if(hasRoot&&end===1)return\"//\";return path.slice(0,end)}function basename(path,ext){if(ext!==void 0&&typeof ext!==\"string\")throw TypeError('\"ext\" argument must be a string');assertPath(path);var start=0,end=-1,matchedSlash=!0,i;if(ext!==void 0&&ext.length>0&&ext.length<=path.length){if(ext.length===path.length&&ext===path)return\"\";var extIdx=ext.length-1,firstNonSlashEnd=-1;for(i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){start=i+1;break}}else{if(firstNonSlashEnd===-1)matchedSlash=!1,firstNonSlashEnd=i+1;if(extIdx>=0)if(code===ext.charCodeAt(extIdx)){if(--extIdx===-1)end=i}else extIdx=-1,end=firstNonSlashEnd}}if(start===end)end=firstNonSlashEnd;else if(end===-1)end=path.length;return path.slice(start,end)}else{for(i=path.length-1;i>=0;--i)if(path.charCodeAt(i)===47){if(!matchedSlash){start=i+1;break}}else if(end===-1)matchedSlash=!1,end=i+1;if(end===-1)return\"\";return path.slice(start,end)}}function extname(path){assertPath(path);var startDot=-1,startPart=0,end=-1,matchedSlash=!0,preDotState=0;for(var i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1)matchedSlash=!1,end=i+1;if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1)preDotState=-1}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1)return\"\";return path.slice(startDot,end)}function format(pathObject){if(pathObject===null||typeof pathObject!==\"object\")throw TypeError('The \"pathObject\" argument must be of type Object. Received type '+typeof pathObject);return _format(\"/\",pathObject)}function parse(path){assertPath(path);var ret={root:\"\",dir:\"\",base:\"\",ext:\"\",name:\"\"};if(path.length===0)return ret;var code=path.charCodeAt(0),isAbsolute2=code===47,start;if(isAbsolute2)ret.root=\"/\",start=1;else start=0;var startDot=-1,startPart=0,end=-1,matchedSlash=!0,i=path.length-1,preDotState=0;for(;i>=start;--i){if(code=path.charCodeAt(i),code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1)matchedSlash=!1,end=i+1;if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1)preDotState=-1}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1){if(end!==-1)if(startPart===0&&isAbsolute2)ret.base=ret.name=path.slice(1,end);else ret.base=ret.name=path.slice(startPart,end)}else{if(startPart===0&&isAbsolute2)ret.name=path.slice(1,startDot),ret.base=path.slice(1,end);else ret.name=path.slice(startPart,startDot),ret.base=path.slice(startPart,end);ret.ext=path.slice(startDot,end)}if(startPart>0)ret.dir=path.slice(0,startPart-1);else if(isAbsolute2)ret.dir=\"/\";return ret}var sep=\"/\",delimiter=\":\",posix=((p)=>(p.posix=p,p))({resolve,normalize,isAbsolute,join,relative,_makeLong,dirname,basename,extname,format,parse,sep,delimiter,win32:null,posix:null});var path_default=posix;export{sep,resolve,relative,posix,parse,normalize,join,isAbsolute,format,extname,dirname,delimiter,path_default as default,basename,_makeLong};",
|
|
6
|
-
"/**\n * TJS Parser — 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 transformUnionDeclarations,\n transformEnumDeclarations,\n transformExtendDeclarations,\n transformPolymorphicFunctions,\n transformPolymorphicConstructors,\n wrapClassDeclarations,\n transformBareAssignments,\n extractAndRunTests,\n validateNoDate,\n validateNoEval,\n transformExtensionCalls,\n} from './parser-transforms'\n\n// Re-export transformExtensionCalls for js.ts\nexport { transformExtensionCalls } from './parser-transforms'\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 // TJS modes - all default to false (JS-compatible by default)\n const tjsModes: TjsModes = {\n tjsEquals: false,\n tjsClass: false,\n tjsDate: false,\n tjsNoeval: false,\n tjsStandard: false,\n tjsSafeEval: false,\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 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\n // Individual modes: TjsEquals, TjsClass, TjsDate, TjsNoeval, TjsStandard, TjsSafeEval\n const directivePattern =\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*(TjsStrict|TjsEquals|TjsClass|TjsDate|TjsNoeval|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.tjsStandard = true\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 === '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 // 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 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 = 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 // 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",
|
|
6
|
+
"/**\n * TJS Parser — 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 transformExtensionCalls,\n} from './parser-transforms'\n\n// Re-export transformExtensionCalls for js.ts\nexport { transformExtensionCalls } from './parser-transforms'\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 // TJS modes - all default to false (JS-compatible by default)\n const tjsModes: TjsModes = {\n tjsEquals: false,\n tjsClass: false,\n tjsDate: false,\n tjsNoeval: false,\n tjsStandard: false,\n tjsSafeEval: false,\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 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\n // Individual modes: TjsEquals, TjsClass, TjsDate, TjsNoeval, TjsStandard, TjsSafeEval\n const directivePattern =\n /^(\\s*(?:\\/\\/[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*)\\s*(TjsStrict|TjsEquals|TjsClass|TjsDate|TjsNoeval|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.tjsStandard = true\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 === '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 // 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 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 // 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",
|
|
7
7
|
"/**\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",
|
|
8
8
|
"/**\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: whitespace then -> or -? or -! (return type)\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n const returnArrow = source.slice(j, j + 2)\n if (\n returnArrow === '->' ||\n returnArrow === '-?' ||\n returnArrow === '-!'\n ) {\n // Extract return type\n j += 2\n // Skip whitespace after arrow\n while (j < source.length && /\\s/.test(source[j])) j++\n\n const typeResult = extractReturnTypeValue(source, j)\n if (typeResult) {\n const { type, endPos: typeEnd } = typeResult\n // Record first return type for metadata\n if (firstReturnType === undefined) {\n firstReturnType = type\n if (returnArrow === '-?') {\n firstReturnSafety = 'safe'\n } else if (returnArrow === '-!') {\n firstReturnSafety = 'unsafe'\n }\n }\n i = typeEnd\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 const methodMatch = source\n .slice(i)\n .match(/^(constructor|(?:get|set)\\s+\\w+|async\\s+\\w+|\\w+)\\s*\\(/)\n if (methodMatch && isInClassBody()) {\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, ): type\n let j = i\n while (j < source.length && /\\s/.test(source[j])) j++\n\n // Handle ->, -!, -? return type (TJS style)\n const returnArrow = source.slice(j, j + 2)\n if (\n returnArrow === '->' ||\n returnArrow === '-!' ||\n returnArrow === '-?'\n ) {\n j += 2\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 // Handle : return type (TS style) - just strip it\n else if (source[j] === ':') {\n j++\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 const returnArrow = source.slice(j, j + 2)\n if (\n returnArrow === '->' ||\n returnArrow === '-?' ||\n returnArrow === '-!'\n ) {\n j += 2\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 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 — warn but allow.\n // TypeScript permits this, and the TS→TJS 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 — 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",
|
|
9
|
-
"/**\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'\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 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\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const prevLine = i > 0 ? lines[i - 1] : ''\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 * 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 // 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 === '==' ? 'Is' : 'IsNot'\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 (reversed since we're going backwards)\n if (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\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 === ';' || char === '{' || 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 'new',\n ].includes(word)\n ) {\n return wordEnd\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 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 — 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 — 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) — 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 — 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 → 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 — 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 — 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 — 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 — 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 — 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\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 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 — 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 — 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 */\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",
|
|
9
|
+
"/**\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'\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 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\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const prevLine = i > 0 ? lines[i - 1] : ''\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 * 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 // 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 === '==' ? 'Is' : 'IsNot'\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 (reversed since we're going backwards)\n if (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\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 === ';' || char === '{' || 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 'new',\n ].includes(word)\n ) {\n return wordEnd\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 * → const Callback = FunctionPredicate('Callback', { params: { x: 0, y: '' }, returns: false })\n *\n * Function form:\n * FunctionPredicate Handler(existingFn, 'description')\n * → 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*/)\n if (fpMatch) {\n const fpName = fpMatch[1]\n const j = i + fpMatch[0].length\n\n // Check for block form: FunctionPredicate Name { ... }\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: { ... }\n const paramsMatch = blockBody.match(/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 result += `const ${fpName} = FunctionPredicate('${desc}', { ${spec.join(\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 — 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 — 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) — 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 — 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 → 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 — 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 — 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 — 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 — 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 — 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\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 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 — 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 — 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 */\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",
|
|
10
10
|
"/**\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 — 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 — 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 — 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",
|
|
11
11
|
"/**\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",
|
|
12
12
|
"/**\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} from '../parser'\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 — 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 // Push stack first, then validate — callStack includes current function\n // finally block ensures popStack on all exit paths\n lines.unshift(`__tjs.pushStack('${stackEntry}');`)\n lines.unshift(`try {`)\n\n return {\n preamble: lines.join('\\n '),\n suffix: '} finally { __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 // Push stack first, then validate — callStack includes current function\n // finally block ensures popStack on all exit paths\n lines.unshift(`__tjs.pushStack('${stackEntry}');`)\n lines.unshift(`try {`)\n\n return {\n preamble: lines.join('\\n '),\n suffix: '} finally { __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 == — 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 // Match: function funcName(params) -X where X is >, ?, or !\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: /★ tjs <- path/to/file.ts ★/ at the start (★ = *)\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: /★ line N ★/ 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 // 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 // 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→equals transform, `x: false | undefined` becomes\n // `x = false | undefined` in the parsed source.\n // - For required params (`:` syntax), strip the entire `= value` — 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 — 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 — 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 // Insert suffix (popStack) right before the closing brace\n insertions.push({\n position: func.body.end - 1,\n text: `\\n ${validation.suffix}\\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 needsSafeEval = preprocessed.tjsModes.tjsSafeEval\n\n if (needsTypeError || needsStack || needsIs || needsIsNot || needsSafeEval) {\n // Create isolated runtime instance for this module\n // Falls back to shared global if createRuntime not available\n let preamble =\n 'const __tjs = globalThis.__tjs?.createRuntime?.() ?? globalThis.__tjs;\\n'\n\n // Add destructured imports for Is/IsNot if used\n if (needsIs || needsIsNot) {\n const imports = [needsIs && 'Is', needsIsNot && 'IsNot']\n .filter(Boolean)\n .join(', ')\n preamble += `const { ${imports} } = __tjs ?? {};\\n`\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 switch (type.kind) {\n case 'string':\n return `typeof ${fieldPath} !== 'string'`\n case 'number':\n return `typeof ${fieldPath} !== 'number'`\n case 'integer':\n return `(typeof ${fieldPath} !== 'number' || !Number.isInteger(${fieldPath}))`\n case 'non-negative-integer':\n return `(typeof ${fieldPath} !== 'number' || !Number.isInteger(${fieldPath}) || ${fieldPath} < 0)`\n case 'boolean':\n return `typeof ${fieldPath} !== 'boolean'`\n case 'null':\n return `${fieldPath} !== null`\n case 'undefined':\n return `${fieldPath} !== undefined`\n case 'array':\n return `!Array.isArray(${fieldPath})`\n case 'object':\n // For nested objects, just check it's an object (deep validation is separate)\n return `(typeof ${fieldPath} !== 'object' || ${fieldPath} === null || Array.isArray(${fieldPath}))`\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 return `(${checks.join(' && ')})`\n }\n case 'any':\n return null // No check needed\n default:\n return null\n }\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",
|
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
"/**\n * TJS Test Execution\n *\n * Handles transpile-time test execution, signature validation, and test utilities.\n */\n\nimport { transformExtensionCalls } from '../parser'\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) — 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 } = __tjs ?? {};\n let result = code.replace(\n /^const __tjs = globalThis\\.__tjs\\?\\.createRuntime\\?\\.\\(\\) \\?\\? globalThis\\.__tjs;\\n?/m,\n ''\n )\n result = result.replace(\n /^const \\{ (?:Is|IsNot|Is, IsNot) \\} = __tjs \\?\\? \\{\\};\\n?/m,\n ''\n )\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 let cleanCode = stripModuleSyntax(moduleCode)\n // Strip __tjs preamble to avoid duplicate declarations\n // (test execution context provides its own __tjs stub)\n cleanCode = stripTjsPreamble(cleanCode)\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` — 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}\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 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 — 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 let executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n executableCode = stripTjsPreamble(executableCode)\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 // 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 ${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 — 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(\n (info, i) => `\n // Signature test ${i}: ${info.funcName}\n try {\n let __actual = ${info.funcName}(${info.args\n .map((a) => JSON.stringify(a))\n .join(', ')});\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 \\\\'${\n info.funcName\n }\\\\', 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 // TJS stub setup/restore\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\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 results.push({\n description: `${info.funcName} 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 results.push({\n description: `${info.funcName} 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 results.push({\n description: `${info.funcName} 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 let executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n executableCode = stripTjsPreamble(executableCode)\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 types\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] — 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 — skip rest param examples\n }\n continue\n }\n\n // Bare rest param without type: ...name — 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 let executableCode = stripModuleSyntax(transpiledCode)\n // Strip __tjs preamble - test context provides its own stub\n executableCode = stripTjsPreamble(executableCode)\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 — 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",
|
|
15
15
|
"/**\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 — 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 → 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) → 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) → 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) → 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) → 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) → 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) → 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) → 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",
|
|
16
16
|
"/**\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",
|
|
17
|
-
"/**\n * TJS to .d.ts Emitter\n *\n * Generates TypeScript declaration files from TJS transpilation results.\n * Allows TypeScript consumers to use TJS-authored libraries with full\n * type information for functions, and helpful `any`-based stubs for\n * classes, generics, and predicate types.\n *\n * Design principle: emit enough structure for autocomplete/tooltips\n * (parameter names, object shapes) but lean on `any` where TJS types\n * can't be faithfully expressed in TS (predicate types, generics,\n * class instances). This gives developers IDE hints without false\n * lint errors from types that don't fully match.\n *\n * Handles:\n * - Exported functions → full param/return types from TJSTypeInfo\n * - Exported classes → callable function stub with constructor params, returns any\n * - Exported Type declarations → type guard function stubs\n * - Exported Generic declarations → factory function stubs\n * - Re-exports via `export { Name }` syntax\n */\n\nimport type { TypeDescriptor } from '../types'\nimport type { TJSTranspileResult, TJSTypeInfo } from './js'\n\n/**\n * Convert a TypeDescriptor to a TypeScript type string.\n *\n * Maps TJS's example-inferred types to the closest TS equivalents:\n * integer / non-negative-integer → number (TS has no integer type)\n * string / number / boolean / null / undefined / any → themselves\n * array + items → T[]\n * object + shape → { key: Type; ... }\n * union + members → T1 | T2\n * nullable → T | null\n */\nexport function typeDescriptorToTS(td: TypeDescriptor): string {\n let base: string\n\n switch (td.kind) {\n case 'string':\n base = 'string'\n break\n case 'number':\n case 'integer':\n case 'non-negative-integer':\n base = 'number'\n break\n case 'boolean':\n base = 'boolean'\n break\n case 'null':\n return 'null'\n case 'undefined':\n return 'undefined'\n case 'any':\n base = 'any'\n break\n case 'array':\n if (td.items) {\n const inner = typeDescriptorToTS(td.items)\n // Wrap union types in parens for array: (A | B)[]\n base = inner.includes('|') ? `(${inner})[]` : `${inner}[]`\n } else {\n base = 'any[]'\n }\n break\n case 'object':\n if (td.shape && Object.keys(td.shape).length > 0) {\n const fields = Object.entries(td.shape)\n .map(([k, v]) => `${k}: ${typeDescriptorToTS(v)}`)\n .join('; ')\n base = `{ ${fields} }`\n } else {\n base = 'Record<string, any>'\n }\n break\n case 'union':\n if (td.members && td.members.length > 0) {\n return td.members.map(typeDescriptorToTS).join(' | ')\n }\n base = 'any'\n break\n default:\n base = 'any'\n }\n\n if (td.nullable) {\n return `${base} | null`\n }\n return base\n}\n\n/**\n * Generate a function declaration line for .d.ts\n */\nfunction functionDeclToTS(\n name: string,\n info: TJSTypeInfo,\n exported: boolean,\n isDefault: boolean\n): string {\n const params = Object.entries(info.params)\n .map(([pName, p]) => {\n const optional = !p.required\n const tsType = typeDescriptorToTS(p.type)\n return optional ? `${pName}?: ${tsType}` : `${pName}: ${tsType}`\n })\n .join(', ')\n\n const returnType = info.returns ? typeDescriptorToTS(info.returns) : 'any'\n const prefix = exported\n ? isDefault\n ? 'export default function'\n : 'export declare function'\n : 'declare function'\n\n return `${prefix} ${name}(${params}): ${returnType};`\n}\n\nexport interface GenerateDTSOptions {\n /** Module name for ambient declarations (omit for module-mode .d.ts) */\n moduleName?: string\n}\n\n/** Info about a name detected as exported */\ninterface ExportInfo {\n exported: boolean\n isDefault: boolean\n}\n\n/**\n * Detect which top-level names are exported in the source.\n *\n * Returns a map of name → { exported, isDefault }.\n * Scans the original TJS source for export keywords.\n */\nfunction detectExports(source: string): Map<string, ExportInfo> {\n const result = new Map<string, ExportInfo>()\n let m\n\n // export function name / export default function name\n const funcRe = /^[ \\t]*export\\s+(default\\s+)?function\\s+(\\w+)/gm\n while ((m = funcRe.exec(source)) !== null) {\n result.set(m[2], { exported: true, isDefault: !!m[1] })\n }\n\n // export class name / export default class name\n const classRe = /^[ \\t]*export\\s+(default\\s+)?class\\s+(\\w+)/gm\n while ((m = classRe.exec(source)) !== null) {\n result.set(m[2], { exported: true, isDefault: !!m[1] })\n }\n\n // export const/let/var name\n const varRe = /^[ \\t]*export\\s+(default\\s+)?(?:const|let|var)\\s+(\\w+)/gm\n while ((m = varRe.exec(source)) !== null) {\n result.set(m[2], { exported: true, isDefault: !!m[1] })\n }\n\n // export Type Name\n const typeRe = /^[ \\t]*export\\s+Type\\s+(\\w+)/gm\n while ((m = typeRe.exec(source)) !== null) {\n result.set(m[1], { exported: true, isDefault: false })\n }\n\n // export Generic Name<...>\n const genericRe = /^[ \\t]*export\\s+Generic\\s+(\\w+)/gm\n while ((m = genericRe.exec(source)) !== null) {\n result.set(m[1], { exported: true, isDefault: false })\n }\n\n // export { Name, Name2, ... } — re-export form\n const reExportRe = /^[ \\t]*export\\s*\\{([^}]+)\\}/gm\n while ((m = reExportRe.exec(source)) !== null) {\n const names = m[1].split(',').map((s) => s.trim().split(/\\s+as\\s+/))\n for (const parts of names) {\n const exportedName = parts.length > 1 ? parts[1] : parts[0]\n if (exportedName && /^\\w+$/.test(exportedName)) {\n result.set(exportedName, { exported: true, isDefault: false })\n }\n }\n }\n\n return result\n}\n\n/** Info about a class extracted from source */\ninterface ClassInfo {\n name: string\n constructorParams: string // raw param string, e.g. \"x: 0.0, y: 0.0\"\n methods: { name: string; params: string; returnType: string | null }[]\n}\n\n/**\n * Detect class declarations and extract constructor param names/types.\n * Scans original TJS source (before preprocessing).\n */\nfunction detectClasses(source: string): Map<string, ClassInfo> {\n const result = new Map<string, ClassInfo>()\n\n // Find class declarations\n const classRe =\n /^[ \\t]*(?:export\\s+(?:default\\s+)?)?class\\s+(\\w+)(?:\\s+extends\\s+\\w+)?\\s*\\{/gm\n let m\n while ((m = classRe.exec(source)) !== null) {\n const className = m[1]\n const classBodyStart = m.index + m[0].length - 1\n\n // Find matching closing brace\n let depth = 1\n let i = classBodyStart + 1\n while (i < source.length && depth > 0) {\n if (source[i] === '{') depth++\n else if (source[i] === '}') depth--\n i++\n }\n const classBody = source.slice(classBodyStart + 1, i - 1)\n\n // Extract constructor params (handle nested parens/braces in param types)\n const ctorStart = classBody.indexOf('constructor')\n let ctorParams = ''\n if (ctorStart !== -1) {\n const parenStart = classBody.indexOf('(', ctorStart)\n if (parenStart !== -1) {\n let depth = 1\n let j = parenStart + 1\n while (j < classBody.length && depth > 0) {\n if (classBody[j] === '(') depth++\n else if (classBody[j] === ')') depth--\n j++\n }\n ctorParams = classBody.slice(parenStart + 1, j - 1).trim()\n }\n }\n\n // Extract methods (name followed by parens, not constructor/get/set)\n const methods: ClassInfo['methods'] = []\n const methodStartRe = /^\\s+(\\w+)\\s*\\(/gm\n let mm\n while ((mm = methodStartRe.exec(classBody)) !== null) {\n const name = mm[1]\n if (name === 'constructor' || name === 'get' || name === 'set') continue\n\n // Find matching close paren (handles nested braces in params)\n const parenStart = mm.index + mm[0].length - 1\n let depth = 1\n let j = parenStart + 1\n while (j < classBody.length && depth > 0) {\n if (classBody[j] === '(') depth++\n else if (classBody[j] === ')') depth--\n j++\n }\n const params = classBody.slice(parenStart + 1, j - 1).trim()\n\n // Check for return type annotation: -> Type\n const afterParen = classBody.slice(j).match(/^\\s*->\\s*(.+?)\\s*\\{/)\n const returnType = afterParen ? afterParen[1].trim() : null\n\n methods.push({ name, params, returnType })\n }\n\n result.set(className, {\n name: className,\n constructorParams: ctorParams,\n methods,\n })\n }\n\n return result\n}\n\n/**\n * Split a param string on commas, respecting nested braces/brackets.\n * \"x: 0.0, y: { a: 1, b: 2 }\" → [\"x: 0.0\", \"y: { a: 1, b: 2 }\"]\n */\nfunction splitParams(paramStr: string): string[] {\n const result: string[] = []\n let depth = 0\n let current = ''\n for (const ch of paramStr) {\n if (ch === '{' || ch === '[' || ch === '(') depth++\n else if (ch === '}' || ch === ']' || ch === ')') depth--\n\n if (ch === ',' && depth === 0) {\n result.push(current.trim())\n current = ''\n } else {\n current += ch\n }\n }\n if (current.trim()) result.push(current.trim())\n return result\n}\n\n/**\n * Parse a TJS constructor/method param string into TS param declarations.\n * Input: \"x: 0.0, y: 0.0\" or \"name: '', age: 0\"\n * Output: \"x: number, y: number\" or \"name: string, age: number\"\n *\n * Uses `any` for anything we can't confidently parse.\n */\nfunction tjsParamsToTS(paramStr: string): string {\n if (!paramStr.trim()) return ''\n\n return splitParams(paramStr)\n .map((trimmed) => {\n // name: value (required) or name = value (optional)\n const colonMatch = trimmed.match(/^(\\w+)\\s*:\\s*(.+)$/)\n if (colonMatch) {\n const name = colonMatch[1]\n const tsType = inferTSTypeFromExample(colonMatch[2].trim())\n return `${name}: ${tsType}`\n }\n const eqMatch = trimmed.match(/^(\\w+)\\s*=\\s*(.+)$/)\n if (eqMatch) {\n const name = eqMatch[1]\n const tsType = inferTSTypeFromExample(eqMatch[2].trim())\n return `${name}?: ${tsType}`\n }\n // Destructured or complex — fall back to any\n if (trimmed.startsWith('{')) return `options: any`\n return `${trimmed}: any`\n })\n .join(', ')\n}\n\n/** Detect Type declarations and their example values */\nfunction detectTypeDeclarations(source: string): Map<string, string> {\n const result = new Map<string, string>()\n let m\n\n // Type Name = <value> (assignment form)\n const assignRe = /^[ \\t]*(?:export\\s+)?Type\\s+(\\w+)\\s*=\\s*(.+)$/gm\n while ((m = assignRe.exec(source)) !== null) {\n result.set(m[1], m[2].trim())\n }\n\n // Type Name <value> (simple form, not block)\n const simpleRe = /^[ \\t]*(?:export\\s+)?Type\\s+(\\w+)\\s+([^{=].*)$/gm\n while ((m = simpleRe.exec(source)) !== null) {\n if (!result.has(m[1])) {\n result.set(m[1], m[2].trim())\n }\n }\n\n // Block: Type Name { ... example: <value> ... }\n const blockRe =\n /^[ \\t]*(?:export\\s+)?Type\\s+(\\w+)\\s*\\{[^}]*example\\s*:\\s*(.+?)(?:\\n|\\s*[,}])/gm\n while ((m = blockRe.exec(source)) !== null) {\n result.set(m[1], m[2].trim())\n }\n\n return result\n}\n\n/** Info about a Generic declaration */\ninterface GenericInfo {\n typeParams: string[]\n /** Raw TypeScript content from `declaration { ... }` block, if present */\n declaration?: string\n}\n\n/** Detect Generic declarations, their type params, and optional declaration blocks */\nfunction detectGenerics(source: string): Map<string, GenericInfo> {\n const result = new Map<string, GenericInfo>()\n const re = /^[ \\t]*(?:export\\s+)?Generic\\s+(\\w+)\\s*<([^>]+)>\\s*\\{/gm\n let m\n while ((m = re.exec(source)) !== null) {\n const name = m[1]\n const typeParams = m[2].split(',').map((tp) => {\n return tp.trim().split(/\\s*=/)[0].trim()\n })\n\n // Find the full Generic block body via brace matching\n const blockStart = m.index + m[0].length - 1\n let depth = 1\n let i = blockStart + 1\n while (i < source.length && depth > 0) {\n if (source[i] === '{') depth++\n else if (source[i] === '}') depth--\n i++\n }\n const blockBody = source.slice(blockStart + 1, i - 1)\n\n // Look for declaration { ... } within the block body\n let declaration: string | undefined\n const declMatch = blockBody.match(/\\bdeclaration\\s*\\{/)\n if (declMatch && declMatch.index !== undefined) {\n const declStart = declMatch.index + declMatch[0].length - 1\n let dDepth = 1\n let j = declStart + 1\n while (j < blockBody.length && dDepth > 0) {\n if (blockBody[j] === '{') dDepth++\n else if (blockBody[j] === '}') dDepth--\n j++\n }\n declaration = blockBody.slice(declStart + 1, j - 1).trim()\n }\n\n result.set(name, { typeParams, declaration })\n }\n return result\n}\n\n/**\n * Generate a .d.ts string from TJS transpilation output.\n *\n * @param result - The TJSTranspileResult from tjs()\n * @param source - The original TJS source (needed to detect exports)\n * @param options - Generation options\n * @returns The .d.ts file content as a string\n */\nexport function generateDTS(\n result: TJSTranspileResult,\n source: string,\n options: GenerateDTSOptions = {}\n): string {\n const lines: string[] = []\n const exports = detectExports(source)\n const typeDecls = detectTypeDeclarations(source)\n const classes = detectClasses(source)\n const generics = detectGenerics(source)\n\n // If no exports detected, treat all top-level declarations as exported\n // (CommonJS / script-mode files)\n const hasAnyExport = exports.size > 0\n\n // Track names we've already emitted\n const emitted = new Set<string>()\n\n // Emit function declarations (from transpiler metadata — best type info)\n for (const [name, info] of Object.entries(result.types)) {\n // Skip polymorphic variants (name$0, name$1, etc.)\n if (name.includes('$')) continue\n\n const exportInfo = exports.get(name)\n const isExported = hasAnyExport ? !!exportInfo?.exported : true\n const isDefault = exportInfo?.isDefault ?? false\n\n if (!isExported) continue\n\n if (info.description) {\n lines.push(`/** ${info.description} */`)\n }\n\n lines.push(functionDeclToTS(name, info, true, isDefault))\n emitted.add(name)\n }\n\n // Emit class declarations as callable functions returning any.\n // TJS wraps classes to be callable without `new`, so this matches\n // the actual runtime API. Returning `any` means TS won't fight\n // the developer on instance property access.\n for (const [name, classInfo] of classes) {\n if (emitted.has(name)) continue\n\n const exportInfo = exports.get(name)\n const isExported = hasAnyExport ? !!exportInfo?.exported : true\n if (!isExported) continue\n\n const tsParams = classInfo.constructorParams\n ? tjsParamsToTS(classInfo.constructorParams)\n : ''\n\n // Emit as callable function (matches TJS wrapClass behavior)\n lines.push(`export declare function ${name}(${tsParams}): any;`)\n\n // Also emit as a class with `new` for the rare case someone uses it\n if (tsParams || classInfo.methods.length > 0) {\n lines.push(`export declare class ${name} {`)\n if (classInfo.constructorParams) {\n lines.push(` constructor(${tsParams});`)\n }\n for (const method of classInfo.methods) {\n const mParams = method.params ? tjsParamsToTS(method.params) : ''\n lines.push(` ${method.name}(${mParams}): any;`)\n }\n lines.push(`}`)\n }\n\n emitted.add(name)\n }\n\n // Emit Type declarations as type guard functions.\n // Type('Name', example) returns an object with .check(), .default, etc.\n // For TS consumers, the useful thing is knowing it's a callable type guard.\n for (const [name, exampleStr] of typeDecls) {\n if (emitted.has(name)) continue\n\n const exportInfo = exports.get(name)\n const isExported = hasAnyExport ? !!exportInfo?.exported : true\n if (!isExported) continue\n\n const tsType = inferTSTypeFromExample(exampleStr)\n lines.push(\n `export declare const ${name}: {` +\n ` check(value: any): boolean;` +\n ` default: ${tsType};` +\n ` (value: any): boolean;` +\n ` };`\n )\n emitted.add(name)\n }\n\n // Emit Generic declarations.\n // If a declaration block is present, emit a proper TS interface.\n // Otherwise, emit an any-based factory stub.\n for (const [name, info] of generics) {\n if (emitted.has(name)) continue\n\n const exportInfo = exports.get(name)\n const isExported = hasAnyExport ? !!exportInfo?.exported : true\n if (!isExported) continue\n\n const typeParamStr =\n info.typeParams.length > 0 ? `<${info.typeParams.join(', ')}>` : ''\n\n if (info.declaration) {\n // Emit a proper TypeScript interface from the declaration block\n const declLines = info.declaration\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .map((l) => ` ${l}`)\n .join('\\n')\n lines.push(`export interface ${name}${typeParamStr} {\\n${declLines}\\n}`)\n } else {\n // No declaration block — emit any-based factory stub\n lines.push(\n `export declare function ${name}(` +\n `...args: any[]` +\n `): { check(value: any): boolean; (value: any): boolean; };`\n )\n }\n emitted.add(name)\n }\n\n if (options.moduleName) {\n const indented = lines.map((l) => ` ${l}`).join('\\n')\n return `declare module '${options.moduleName}' {\\n${indented}\\n}\\n`\n }\n\n return lines.join('\\n') + '\\n'\n}\n\n/**\n * Best-effort TS type inference from an example value string.\n * Used for Type declarations and constructor params where we only\n * have the raw source text, not a parsed TypeDescriptor.\n */\nfunction inferTSTypeFromExample(example: string): string {\n const s = example.trim()\n\n // Unions first: \"'' | 0 | null\" → \"string | number | null\"\n // Only split on | that's outside quotes/braces/brackets\n if (hasTopLevelPipe(s)) {\n const members = splitOnPipe(s).map((m) => inferTSTypeFromExample(m.trim()))\n return [...new Set(members)].join(' | ')\n }\n\n // String literals\n if (/^['\"]/.test(s)) return 'string'\n\n // Boolean\n if (s === 'true' || s === 'false') return 'boolean'\n\n // Null / undefined\n if (s === 'null') return 'null'\n if (s === 'undefined') return 'undefined'\n\n // Numbers\n if (/^[+-]?\\d+\\.\\d+$/.test(s)) return 'number'\n if (/^[+-]?\\d+$/.test(s)) return 'number'\n\n // Arrays\n if (s.startsWith('[')) return 'any[]'\n\n // Objects\n if (s.startsWith('{')) return 'Record<string, any>'\n\n return 'any'\n}\n\n/** Check if a string has a top-level | (not inside quotes/braces) */\nfunction hasTopLevelPipe(s: string): boolean {\n let depth = 0\n let inStr: string | null = null\n for (const ch of s) {\n if (inStr) {\n if (ch === inStr) inStr = null\n continue\n }\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n inStr = ch\n continue\n }\n if (ch === '{' || ch === '[' || ch === '(') depth++\n else if (ch === '}' || ch === ']' || ch === ')') depth--\n else if (ch === '|' && depth === 0) return true\n }\n return false\n}\n\n/** Split on top-level | characters */\nfunction splitOnPipe(s: string): string[] {\n const result: string[] = []\n let depth = 0\n let inStr: string | null = null\n let current = ''\n for (const ch of s) {\n if (inStr) {\n current += ch\n if (ch === inStr) inStr = null\n continue\n }\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n inStr = ch\n current += ch\n continue\n }\n if (ch === '{' || ch === '[' || ch === '(') depth++\n else if (ch === '}' || ch === ']' || ch === ')') depth--\n\n if (ch === '|' && depth === 0) {\n result.push(current)\n current = ''\n } else {\n current += ch\n }\n }\n if (current) result.push(current)\n return result\n}\n",
|
|
18
|
-
"/**\n * TypeScript to TJS Transpiler\n *\n * Converts TypeScript source to TJS (or directly to JS + metadata).\n *\n * Two modes:\n * 1. TS → TJS (for inspection/migration)\n * 2. TS → JS + __tjs metadata (for production)\n *\n * @example\n * ```typescript\n * // Input TypeScript:\n * function greet(name: string, age?: number): string {\n * return `Hello, ${name}!`\n * }\n *\n * // Output TJS:\n * function greet(name: '', age = 0) -> '' {\n * return `Hello, ${name}!`\n * }\n *\n * // Output JS + metadata:\n * function greet(name, age) {\n * return `Hello, ${name}!`\n * }\n * greet.__tjs = {\n * params: { name: { type: 'string', required: true }, age: { type: 'number', required: false } },\n * returns: { type: 'string' }\n * }\n * ```\n */\n\nimport ts from 'typescript'\nimport { emitClassWrapper } from '../runtime'\n\nexport interface FromTSOptions {\n /** Emit TJS intermediate instead of JS + metadata */\n emitTJS?: boolean\n /** Include sourcemap */\n sourceMap?: boolean\n /** Filename for error messages */\n filename?: string\n}\n\nexport interface FromTSResult {\n /** The transpiled code (TJS or JS depending on options) */\n code: string\n /** Function type metadata (only when emitting JS) */\n types?: Record<string, FunctionTypeInfo>\n /** Class type metadata (only when emitting JS) */\n classes?: Record<string, ClassTypeInfo>\n /** Any warnings during transpilation */\n warnings?: string[]\n}\n\nexport interface TypeParamInfo {\n /** Constraint schema (from `extends`) - example-based */\n constraint?: string | Record<string, any>\n /** Default schema (from `= Type`) - example-based */\n default?: string | Record<string, any>\n}\n\nexport interface FunctionTypeInfo {\n name: string\n params: Record<string, ParamTypeInfo>\n returns?: TypeInfo\n description?: string\n /** Generic type parameters with constraints/defaults */\n typeParams?: Record<string, TypeParamInfo>\n /** Overload signatures (when function has TS overloads) */\n overloads?: FunctionTypeInfo[]\n}\n\nexport interface ClassTypeInfo {\n name: string\n /** Constructor parameters - also serves as the type shape */\n constructor?: {\n params: Record<string, ParamTypeInfo>\n }\n /** Instance methods */\n methods: Record<string, FunctionTypeInfo>\n /** Static methods */\n staticMethods: Record<string, FunctionTypeInfo>\n /** Generic type parameters */\n typeParams?: Record<string, TypeParamInfo>\n}\n\nexport interface ParamTypeInfo {\n type: TypeInfo\n required: boolean\n default?: any\n description?: string\n}\n\nexport interface TypeInfo {\n kind:\n | 'string'\n | 'number'\n | 'boolean'\n | 'null'\n | 'undefined'\n | 'array'\n | 'tuple'\n | 'object'\n | 'union'\n | 'any'\n items?: TypeInfo\n /** For tuples: element types in order */\n elements?: TypeInfo[]\n shape?: Record<string, TypeInfo>\n members?: TypeInfo[]\n nullable?: boolean\n}\n\n/** Context for type resolution */\ninterface TypeResolutionContext {\n typeAliases?: Map<string, ts.TypeNode>\n interfaces?: Map<string, ts.InterfaceDeclaration>\n sourceFile?: ts.SourceFile\n warnings?: string[]\n /** Track visited types to prevent infinite recursion */\n visited?: Set<string>\n /** Type parameter constraints and defaults from enclosing generic function/class */\n typeParams?: Map<string, { constraint?: ts.TypeNode; default?: ts.TypeNode }>\n}\n\n/**\n * Convert a TypeScript type node to a TJS example value string\n *\n * @param warnings - Optional array to collect warnings about generic types\n */\nfunction typeToExample(\n type: ts.TypeNode | undefined,\n checker?: ts.TypeChecker,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): string {\n if (!type) return 'undefined'\n\n switch (type.kind) {\n case ts.SyntaxKind.StringKeyword:\n return \"''\"\n case ts.SyntaxKind.NumberKeyword:\n return '0.0'\n case ts.SyntaxKind.BooleanKeyword:\n return 'false'\n case ts.SyntaxKind.NullKeyword:\n return 'null'\n case ts.SyntaxKind.UndefinedKeyword:\n return 'undefined'\n case ts.SyntaxKind.VoidKeyword:\n return 'undefined'\n case ts.SyntaxKind.AnyKeyword:\n // For function params we use 'any', for object props we use 'null'\n return 'any'\n case ts.SyntaxKind.UnknownKeyword:\n return 'any'\n case ts.SyntaxKind.NeverKeyword:\n return 'null'\n case ts.SyntaxKind.SymbolKeyword:\n return \"Symbol('example')\"\n case ts.SyntaxKind.BigIntKeyword:\n return '0n'\n case ts.SyntaxKind.ObjectKeyword:\n return '{}'\n\n case ts.SyntaxKind.ArrayType: {\n const arrayType = type as ts.ArrayTypeNode\n let itemExample = typeToExample(arrayType.elementType, checker)\n // 'any' is not a valid literal value - use null for array items\n if (itemExample === 'any') itemExample = 'null'\n return `[${itemExample}]`\n }\n\n case ts.SyntaxKind.TypeReference: {\n const typeRef = type as ts.TypeReferenceNode\n const typeName = typeRef.typeName.getText()\n\n // Handle common generic types\n if (typeName === 'Array' && typeRef.typeArguments?.length) {\n const itemExample = typeToExample(\n typeRef.typeArguments[0],\n checker,\n warnings,\n ctx\n )\n return `[${itemExample}]`\n }\n if (typeName === 'Promise') {\n // Unwrap Promise type\n if (typeRef.typeArguments?.length) {\n return typeToExample(typeRef.typeArguments[0], checker, warnings, ctx)\n }\n return 'undefined'\n }\n if (\n typeName === 'Generator' ||\n typeName === 'AsyncGenerator' ||\n typeName === 'IterableIterator' ||\n typeName === 'AsyncIterableIterator'\n ) {\n // Unwrap to yield type (first type argument)\n if (typeRef.typeArguments?.length) {\n return typeToExample(typeRef.typeArguments[0], checker, warnings, ctx)\n }\n return 'undefined'\n }\n if (typeName === 'Record') {\n return '{}'\n }\n\n // Built-in constructible types — valid JS expressions as examples\n const builtinExamples: Record<string, string> = {\n // Collections\n Map: 'new Map()',\n Set: 'new Set()',\n WeakMap: 'new WeakMap()',\n WeakSet: 'new WeakSet()',\n WeakRef: 'new WeakRef({})',\n // Errors\n Error: \"new Error('example')\",\n TypeError: \"new TypeError('example')\",\n RangeError: \"new RangeError('example')\",\n // Date/Regex\n Date: 'new Date()',\n RegExp: '/example/',\n // Binary / WASM\n ArrayBuffer: 'new ArrayBuffer(0)',\n SharedArrayBuffer: 'new SharedArrayBuffer(0)',\n DataView: 'new DataView(new ArrayBuffer(0))',\n Float32Array: 'new Float32Array(0)',\n Float64Array: 'new Float64Array(0)',\n Int8Array: 'new Int8Array(0)',\n Int16Array: 'new Int16Array(0)',\n Int32Array: 'new Int32Array(0)',\n Uint8Array: 'new Uint8Array(0)',\n Uint16Array: 'new Uint16Array(0)',\n Uint32Array: 'new Uint32Array(0)',\n Uint8ClampedArray: 'new Uint8ClampedArray(0)',\n BigInt64Array: 'new BigInt64Array(0)',\n BigUint64Array: 'new BigUint64Array(0)',\n // Web/DOM\n URL: \"new URL('https://example.com')\",\n URLSearchParams: 'new URLSearchParams()',\n Headers: 'new Headers()',\n FormData: 'new FormData()',\n Blob: 'new Blob()',\n File: \"new File([], 'example')\",\n Response: 'new Response()',\n Request: \"new Request('https://example.com')\",\n AbortController: 'new AbortController()',\n // Streams\n ReadableStream: 'new ReadableStream()',\n WritableStream: 'new WritableStream()',\n TransformStream: 'new TransformStream()',\n // Structured data\n TextEncoder: 'new TextEncoder()',\n TextDecoder: 'new TextDecoder()',\n }\n\n if (typeName in builtinExamples) {\n return builtinExamples[typeName]\n }\n\n // Resolve type aliases\n if (ctx?.typeAliases?.has(typeName)) {\n // Prevent infinite recursion\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n warnings?.push(`Circular type reference '${typeName}' - using 'any'`)\n return 'any'\n }\n visited.add(typeName)\n const resolvedType = ctx.typeAliases.get(typeName)!\n return typeToExample(resolvedType, checker, warnings, {\n ...ctx,\n visited,\n })\n }\n\n // Resolve interfaces\n if (ctx?.interfaces?.has(typeName)) {\n // Prevent infinite recursion\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n warnings?.push(`Circular type reference '${typeName}' - using 'any'`)\n return 'any'\n }\n visited.add(typeName)\n const iface = ctx.interfaces.get(typeName)!\n // Build example object from interface members\n const props: string[] = []\n for (const member of iface.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(ctx.sourceFile)\n const propExample = typeToExample(member.type, checker, warnings, {\n ...ctx,\n visited,\n })\n // Always use : for object shape properties — = is only valid\n // in destructuring patterns, not in object literal examples\n props.push(`${propName}: ${propExample}`)\n }\n }\n return `{ ${props.join(', ')} }`\n }\n\n // Type parameters (generics like T, K, V)\n // Check if we have constraint or default info from enclosing context\n if (ctx?.typeParams?.has(typeName)) {\n const tp = ctx.typeParams.get(typeName)!\n if (tp.constraint) {\n return typeToExample(tp.constraint, checker, warnings, ctx)\n }\n if (tp.default) {\n return typeToExample(tp.default, checker, warnings, ctx)\n }\n // No constraint or default — fall through to 'any'\n }\n\n // Single uppercase letter or common generic names — treat as any\n if (\n /^[A-Z]$/.test(typeName) ||\n ['T', 'K', 'V', 'U', 'TKey', 'TValue', 'TItem', 'TResult'].includes(\n typeName\n )\n ) {\n warnings?.push(\n `Generic type parameter '${typeName}' converted to 'any' - consider specializing`\n )\n return 'any'\n }\n // Unknown type reference - treat as any\n warnings?.push(\n `Unknown type '${typeName}' converted to 'any' - may need manual review`\n )\n return 'any'\n }\n\n case ts.SyntaxKind.TypeLiteral: {\n const typeLiteral = type as ts.TypeLiteralNode\n const props: string[] = []\n for (const member of typeLiteral.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText()\n let propType = typeToExample(member.type, checker)\n // 'any' is not a valid literal value - use null for object properties\n if (propType === 'any') propType = 'null'\n // In object literals, always use : syntax (= is for function params only)\n props.push(`${propName}: ${propType}`)\n }\n }\n return `{ ${props.join(', ')} }`\n }\n\n case ts.SyntaxKind.UnionType: {\n const unionType = type as ts.UnionTypeNode\n\n // Helper to check if a type is null or undefined\n const isNullType = (t: ts.TypeNode) =>\n t.kind === ts.SyntaxKind.NullKeyword ||\n (ts.isLiteralTypeNode(t) &&\n t.literal.kind === ts.SyntaxKind.NullKeyword)\n const isUndefinedType = (t: ts.TypeNode) =>\n t.kind === ts.SyntaxKind.UndefinedKeyword ||\n (ts.isLiteralTypeNode(t) &&\n t.literal.kind === ts.SyntaxKind.UndefinedKeyword)\n\n // Check for nullable: T | null or T | undefined\n const nonNullTypes = unionType.types.filter(\n (t) => !isNullType(t) && !isUndefinedType(t)\n )\n const hasNull = unionType.types.some(isNullType)\n const hasUndefined = unionType.types.some(isUndefinedType)\n\n // All null/undefined — just return the simplest form\n if (nonNullTypes.length === 0) {\n if (hasNull) return 'null'\n return 'undefined'\n }\n\n if (nonNullTypes.length === 1 && (hasNull || hasUndefined)) {\n // Nullable type: T | null -> T | null\n const baseExample = typeToExample(nonNullTypes[0], checker)\n if (hasNull) return `${baseExample} | null`\n if (hasUndefined) return `${baseExample} | undefined`\n }\n\n // General union: deduplicate and use first non-any type\n const examples = unionType.types\n .map((t) => typeToExample(t, checker))\n .filter((e, i, arr) => arr.indexOf(e) === i) // deduplicate\n if (examples.length === 1) return examples[0]\n if (examples.length > 0) return examples[0]\n return 'undefined'\n }\n\n case ts.SyntaxKind.LiteralType: {\n const literalType = type as ts.LiteralTypeNode\n if (ts.isStringLiteral(literalType.literal)) {\n return `'${literalType.literal.text}'`\n }\n if (ts.isNumericLiteral(literalType.literal)) {\n return literalType.literal.text\n }\n if (literalType.literal.kind === ts.SyntaxKind.TrueKeyword) {\n return 'true'\n }\n if (literalType.literal.kind === ts.SyntaxKind.FalseKeyword) {\n return 'false'\n }\n if (literalType.literal.kind === ts.SyntaxKind.NullKeyword) {\n return 'null'\n }\n return 'undefined'\n }\n\n case ts.SyntaxKind.ParenthesizedType: {\n const parenType = type as ts.ParenthesizedTypeNode\n return typeToExample(parenType.type, checker)\n }\n\n case ts.SyntaxKind.FunctionType:\n // Functions become undefined (can't really express as example)\n return 'undefined'\n\n case ts.SyntaxKind.TupleType: {\n const tupleType = type as ts.TupleTypeNode\n const elements = tupleType.elements.map((e) => {\n const example = ts.isNamedTupleMember(e)\n ? typeToExample(e.type, checker)\n : typeToExample(e as ts.TypeNode, checker)\n // 'any' is not a valid literal value\n return example === 'any' ? 'null' : example\n })\n return `[${elements.join(', ')}]`\n }\n\n default:\n return 'undefined'\n }\n}\n\n/**\n * Convert TypeScript type to TypeInfo for metadata\n */\nfunction typeToInfo(\n type: ts.TypeNode | undefined,\n ctx?: TypeResolutionContext\n): TypeInfo {\n if (!type) return { kind: 'any' }\n\n switch (type.kind) {\n case ts.SyntaxKind.StringKeyword:\n return { kind: 'string' }\n case ts.SyntaxKind.NumberKeyword:\n return { kind: 'number' }\n case ts.SyntaxKind.BooleanKeyword:\n return { kind: 'boolean' }\n case ts.SyntaxKind.NullKeyword:\n return { kind: 'null' }\n case ts.SyntaxKind.UndefinedKeyword:\n case ts.SyntaxKind.VoidKeyword:\n return { kind: 'undefined' }\n\n case ts.SyntaxKind.ArrayType: {\n const arrayType = type as ts.ArrayTypeNode\n return { kind: 'array', items: typeToInfo(arrayType.elementType, ctx) }\n }\n\n case ts.SyntaxKind.TypeLiteral: {\n const typeLiteral = type as ts.TypeLiteralNode\n const shape: Record<string, TypeInfo> = {}\n for (const member of typeLiteral.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText()\n shape[propName] = typeToInfo(member.type, ctx)\n }\n }\n return { kind: 'object', shape }\n }\n\n case ts.SyntaxKind.UnionType: {\n const unionType = type as ts.UnionTypeNode\n const nonNullTypes = unionType.types.filter(\n (t) =>\n t.kind !== ts.SyntaxKind.NullKeyword &&\n t.kind !== ts.SyntaxKind.UndefinedKeyword\n )\n const hasNull = unionType.types.some(\n (t) => t.kind === ts.SyntaxKind.NullKeyword\n )\n\n if (nonNullTypes.length === 1 && hasNull) {\n return { ...typeToInfo(nonNullTypes[0], ctx), nullable: true }\n }\n\n return {\n kind: 'union',\n members: unionType.types.map((t) => typeToInfo(t, ctx)),\n }\n }\n\n case ts.SyntaxKind.IntersectionType: {\n const intersectionType = type as ts.IntersectionTypeNode\n // Flatten intersection into merged object shape\n const mergedShape: Record<string, TypeInfo> = {}\n for (const member of intersectionType.types) {\n const memberInfo = typeToInfo(member, ctx)\n if (memberInfo.kind === 'object' && memberInfo.shape) {\n Object.assign(mergedShape, memberInfo.shape)\n }\n }\n if (Object.keys(mergedShape).length > 0) {\n return { kind: 'object', shape: mergedShape }\n }\n // If no object shapes found, treat as any\n return { kind: 'any' }\n }\n\n case ts.SyntaxKind.TupleType: {\n const tupleType = type as ts.TupleTypeNode\n const elements: TypeInfo[] = []\n for (const element of tupleType.elements) {\n // Handle named tuple members: [x: number, y: string]\n if (ts.isNamedTupleMember(element)) {\n elements.push(typeToInfo(element.type, ctx))\n } else {\n elements.push(typeToInfo(element as ts.TypeNode, ctx))\n }\n }\n return { kind: 'tuple', elements }\n }\n\n case ts.SyntaxKind.TypeReference: {\n const typeRef = type as ts.TypeReferenceNode\n const typeName = typeRef.typeName.getText()\n if (typeName === 'Array' && typeRef.typeArguments?.length) {\n return {\n kind: 'array',\n items: typeToInfo(typeRef.typeArguments[0], ctx),\n }\n }\n if (typeName === 'Promise' && typeRef.typeArguments?.length) {\n return typeToInfo(typeRef.typeArguments[0], ctx)\n }\n if (\n (typeName === 'Generator' ||\n typeName === 'AsyncGenerator' ||\n typeName === 'IterableIterator' ||\n typeName === 'AsyncIterableIterator') &&\n typeRef.typeArguments?.length\n ) {\n return typeToInfo(typeRef.typeArguments[0], ctx)\n }\n\n // Handle utility types\n if (typeRef.typeArguments?.length) {\n const innerType = typeToInfo(typeRef.typeArguments[0], ctx)\n\n // Partial<T> - all properties become optional (we just return the shape)\n if (typeName === 'Partial') {\n return innerType\n }\n\n // Required<T> - all properties become required (we just return the shape)\n if (typeName === 'Required') {\n return innerType\n }\n\n // Readonly<T> - same shape, readonly is a compile-time concept\n if (typeName === 'Readonly') {\n return innerType\n }\n\n // Record<K, V> - object with string keys and V values\n if (typeName === 'Record' && typeRef.typeArguments.length >= 2) {\n const valueType = typeToInfo(typeRef.typeArguments[1], ctx)\n // Record is essentially an object with dynamic keys\n return { kind: 'object', shape: { '[key]': valueType } }\n }\n\n // Pick<T, K> and Omit<T, K> - just return the base type for now\n // Full implementation would need to filter properties\n if (typeName === 'Pick' || typeName === 'Omit') {\n return innerType\n }\n\n // NonNullable<T> - remove null/undefined\n if (typeName === 'NonNullable') {\n if (innerType.nullable) {\n return { ...innerType, nullable: false }\n }\n return innerType\n }\n\n // ReturnType<T>, Parameters<T>, etc. - complex, return any\n if (\n ['ReturnType', 'Parameters', 'ConstructorParameters'].includes(\n typeName\n )\n ) {\n return { kind: 'any' }\n }\n }\n\n // Resolve type aliases\n if (ctx?.typeAliases?.has(typeName)) {\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n return { kind: 'any' } // Circular reference\n }\n visited.add(typeName)\n const resolvedType = ctx.typeAliases.get(typeName)!\n return typeToInfo(resolvedType, { ...ctx, visited })\n }\n\n // Resolve interfaces\n if (ctx?.interfaces?.has(typeName)) {\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n return { kind: 'any' } // Circular reference\n }\n visited.add(typeName)\n const iface = ctx.interfaces.get(typeName)!\n const shape: Record<string, TypeInfo> = {}\n\n // Handle extends clauses - merge in base interface properties\n if (iface.heritageClauses) {\n for (const clause of iface.heritageClauses) {\n if (clause.token === ts.SyntaxKind.ExtendsKeyword) {\n for (const baseType of clause.types) {\n const baseName = baseType.expression.getText(ctx.sourceFile)\n // Look up the base interface and recursively resolve it\n if (ctx.interfaces?.has(baseName) && !visited.has(baseName)) {\n // Create a synthetic type reference node to look up the base\n const syntheticRef = {\n kind: ts.SyntaxKind.TypeReference,\n typeName: { getText: () => baseName },\n } as unknown as ts.TypeReferenceNode\n const baseInfo = typeToInfo(syntheticRef, { ...ctx, visited })\n if (baseInfo.kind === 'object' && baseInfo.shape) {\n Object.assign(shape, baseInfo.shape)\n }\n }\n }\n }\n }\n }\n\n // Add own members (may override base)\n for (const member of iface.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(ctx.sourceFile)\n shape[propName] = typeToInfo(member.type, { ...ctx, visited })\n }\n }\n return { kind: 'object', shape }\n }\n\n // Check type parameter constraints/defaults from enclosing context\n if (ctx?.typeParams?.has(typeName)) {\n const tp = ctx.typeParams.get(typeName)!\n if (tp.constraint) {\n return typeToInfo(tp.constraint, ctx)\n }\n if (tp.default) {\n return typeToInfo(tp.default, ctx)\n }\n }\n\n // Generics and unknown types become 'any'\n return { kind: 'any' }\n }\n\n default:\n return { kind: 'any' }\n }\n}\n\n/**\n * Extract type parameter info (generics) from a function\n */\nfunction extractTypeParams(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n warnings?: string[]\n): Record<string, TypeParamInfo> | undefined {\n if (!node.typeParameters || node.typeParameters.length === 0) {\n return undefined\n }\n\n const typeParams: Record<string, TypeParamInfo> = {}\n\n for (const param of node.typeParameters) {\n const name = param.name.getText()\n const info: TypeParamInfo = {}\n\n // Extract constraint: T extends Foo\n if (param.constraint) {\n const constraintExample = typeToExample(\n param.constraint,\n undefined,\n warnings\n )\n // Try to parse as object/value for richer schema\n if (constraintExample.startsWith('{')) {\n try {\n // This is a rough parse - in production we'd use proper AST\n info.constraint = constraintExample\n } catch {\n info.constraint = constraintExample\n }\n } else {\n info.constraint = constraintExample\n }\n }\n\n // Extract default: T = Foo\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n info.default = defaultExample\n }\n\n typeParams[name] = info\n }\n\n return Object.keys(typeParams).length > 0 ? typeParams : undefined\n}\n\n/**\n * Transform a TypeScript function to TJS syntax\n */\n/**\n * Transform a TypeScript interface to TJS Type declaration\n *\n * interface User { name: string; age: number }\n * ->\n * Type User { example: { name: '', age: 0 } }\n */\nfunction transformInterfaceToType(\n node: ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string | null {\n const typeName = node.name.getText(sourceFile)\n\n // Check for generics\n if (node.typeParameters && node.typeParameters.length > 0) {\n return transformGenericInterfaceToGeneric(node, sourceFile, warnings)\n }\n\n // Build example object from members\n const props: string[] = []\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n let propExample = typeToExample(member.type, undefined, warnings)\n // 'any' is not a valid literal value - use null for object properties\n if (propExample === 'any') propExample = 'null'\n props.push(`${propName}: ${propExample}`)\n }\n }\n\n if (props.length === 0) {\n return `Type ${typeName} {}`\n }\n\n return `Type ${typeName} {\n example: { ${props.join(', ')} }\n}`\n}\n\n/**\n * Transform a generic TypeScript interface to TJS Generic declaration\n *\n * interface Box<T> { value: T }\n * ->\n * Generic Box<T> {\n * description: 'Box'\n * predicate(x, T) { return typeof x === 'object' && x !== null && 'value' in x && T(x.value) }\n * }\n */\nfunction transformGenericInterfaceToGeneric(\n node: ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string {\n const typeName = node.name.getText(sourceFile)\n const typeParams: string[] = []\n\n // Extract type parameters with constraints/defaults\n for (const param of node.typeParameters || []) {\n const paramName = param.name.getText(sourceFile)\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n typeParams.push(`${paramName} = ${defaultExample}`)\n } else {\n typeParams.push(paramName)\n }\n }\n\n // Build predicate checks for each property that uses a type parameter\n const typeParamNames = (node.typeParameters || []).map((p) =>\n p.name.getText(sourceFile)\n )\n const checks: string[] = [\"typeof x === 'object'\", 'x !== null']\n\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n\n // Computed property names: [SYMBOL] → use bracket access\n const isComputed = propName.startsWith('[') && propName.endsWith(']')\n const symbolName = isComputed ? propName.slice(1, -1) : null\n\n if (isComputed) {\n checks.push(`${symbolName} in x`)\n } else {\n checks.push(`'${propName}' in x`)\n }\n\n // If property type is a type parameter, add check\n if (member.type && ts.isTypeReferenceNode(member.type)) {\n const refName = member.type.typeName.getText(sourceFile)\n if (typeParamNames.includes(refName)) {\n if (isComputed) {\n checks.push(`${refName}(x[${symbolName}])`)\n } else {\n checks.push(`${refName}(x.${propName})`)\n }\n }\n }\n }\n }\n\n const predicateParams = ['x', ...typeParamNames].join(', ')\n\n return `Generic ${typeName}<${typeParams.join(', ')}> {\n description: '${typeName}'\n predicate(${predicateParams}) { return ${checks.join(' && ')} }\n}`\n}\n\n/**\n * Check if a TypeScript union type is a literal union (e.g., 'up' | 'down' | 'left')\n * Returns the literal values if it is, null otherwise\n */\nfunction extractLiteralUnionValues(\n type: ts.TypeNode,\n _sourceFile: ts.SourceFile\n): string[] | null {\n if (!ts.isUnionTypeNode(type)) return null\n\n const values: string[] = []\n for (const member of type.types) {\n if (ts.isLiteralTypeNode(member)) {\n if (ts.isStringLiteral(member.literal)) {\n values.push(`'${member.literal.text}'`)\n } else if (ts.isNumericLiteral(member.literal)) {\n values.push(member.literal.text)\n } else if (member.literal.kind === ts.SyntaxKind.TrueKeyword) {\n values.push('true')\n } else if (member.literal.kind === ts.SyntaxKind.FalseKeyword) {\n values.push('false')\n } else if (member.literal.kind === ts.SyntaxKind.NullKeyword) {\n values.push('null')\n } else {\n // Not a literal we can handle\n return null\n }\n } else if (member.kind === ts.SyntaxKind.NullKeyword) {\n values.push('null')\n } else if (member.kind === ts.SyntaxKind.UndefinedKeyword) {\n values.push('undefined')\n } else {\n // Not a literal union (has complex types)\n return null\n }\n }\n\n return values.length > 0 ? values : null\n}\n\n/**\n * Transform a TypeScript enum to TJS Enum declaration\n *\n * enum Status { Pending, Active, Done }\n * ->\n * Enum Status 'Status' {\n * Pending\n * Active\n * Done\n * }\n *\n * enum Color { Red = 'red', Green = 'green', Blue = 'blue' }\n * ->\n * Enum Color 'Color' {\n * Red = 'red'\n * Green = 'green'\n * Blue = 'blue'\n * }\n */\nfunction transformEnumToTJS(\n node: ts.EnumDeclaration,\n sourceFile: ts.SourceFile,\n _warnings?: string[]\n): string | null {\n const enumName = node.name.getText(sourceFile)\n const members: string[] = []\n\n let nextValue = 0\n for (const member of node.members) {\n const memberName = member.name.getText(sourceFile)\n\n if (member.initializer) {\n // Has explicit value\n if (ts.isStringLiteral(member.initializer)) {\n members.push(` ${memberName} = '${member.initializer.text}'`)\n } else if (ts.isNumericLiteral(member.initializer)) {\n const numValue = parseInt(member.initializer.text, 10)\n members.push(` ${memberName} = ${numValue}`)\n nextValue = numValue + 1\n } else if (\n ts.isPrefixUnaryExpression(member.initializer) &&\n member.initializer.operator === ts.SyntaxKind.MinusToken\n ) {\n // Negative number\n const operand = member.initializer.operand\n if (ts.isNumericLiteral(operand)) {\n const numValue = -parseInt(operand.text, 10)\n members.push(` ${memberName} = ${numValue}`)\n nextValue = numValue + 1\n }\n } else {\n // Expression or other complex initializer - use the text directly\n members.push(\n ` ${memberName} = ${member.initializer.getText(sourceFile)}`\n )\n }\n } else {\n // Auto-increment numeric value\n members.push(` ${memberName} = ${nextValue}`)\n nextValue++\n }\n }\n\n return `Enum ${enumName} '${enumName}' {\n${members.join('\\n')}\n}`\n}\n\n/**\n * Transform a TypeScript type alias to TJS Type declaration\n *\n * type User = { name: string; age: number }\n * ->\n * Type User { example: { name: '', age: 0 } }\n *\n * type Direction = 'up' | 'down' | 'left' | 'right'\n * ->\n * Union Direction 'Direction' 'up' | 'down' | 'left' | 'right'\n */\nfunction transformTypeAliasToType(\n node: ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string | null {\n const typeName = node.name.getText(sourceFile)\n\n // Check for generics\n if (node.typeParameters && node.typeParameters.length > 0) {\n return transformGenericTypeAliasToGeneric(node, sourceFile, warnings)\n }\n\n // Check for literal union type → emit Union syntax\n const literalValues = extractLiteralUnionValues(node.type, sourceFile)\n if (literalValues) {\n return `Union ${typeName} '${typeName}' ${literalValues.join(' | ')}`\n }\n\n const example = typeToExample(node.type, undefined, warnings)\n\n // 'any' and 'undefined' — skip declaration (undeclared = any in TJS)\n if (example === 'any' || example === 'undefined') {\n return `Type ${typeName} {}`\n }\n\n // For simple primitive types, use short form\n if (\n example === \"''\" ||\n example === '0' ||\n example === 'true' ||\n example === 'null'\n ) {\n return `Type ${typeName} ${example}`\n }\n\n return `Type ${typeName} {\n example: ${example}\n}`\n}\n\n/**\n * Transform a generic type alias to TJS Generic declaration\n */\nfunction transformGenericTypeAliasToGeneric(\n node: ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string {\n const typeName = node.name.getText(sourceFile)\n const typeParams: string[] = []\n\n // Extract type parameters\n for (const param of node.typeParameters || []) {\n const paramName = param.name.getText(sourceFile)\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n typeParams.push(`${paramName} = ${defaultExample}`)\n } else {\n typeParams.push(paramName)\n }\n }\n\n const typeParamNames = (node.typeParameters || []).map((p) =>\n p.name.getText(sourceFile)\n )\n const predicateParams = ['x', ...typeParamNames].join(', ')\n\n // Include original TS source as a block comment for manual enhancement\n // Use /* */ to avoid confusing the Generic block preprocessor\n const originalSource = node.getText(sourceFile).trim()\n const comment = `/* Original TS:\\n${originalSource}\\n*/`\n\n return `${comment}\nGeneric ${typeName}<${typeParams.join(', ')}> {\n description: '${typeName}'\n predicate(${predicateParams}) { return true }\n}`\n}\n\nfunction transformFunctionToTJS(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n sourceFile: ts.SourceFile,\n explicitName?: string,\n warnings?: string[],\n includeLineNumber?: boolean,\n ctx?: TypeResolutionContext\n): string {\n // Build type parameter map from generic params (constraint/default)\n let typeParamMap:\n | Map<string, { constraint?: ts.TypeNode; default?: ts.TypeNode }>\n | undefined\n if (node.typeParameters && node.typeParameters.length > 0) {\n typeParamMap = new Map()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n }\n\n // Merge type params into ctx for resolution in typeToExample\n const resolveCtx: TypeResolutionContext | undefined =\n typeParamMap || ctx\n ? { ...ctx, typeParams: typeParamMap ?? ctx?.typeParams }\n : ctx\n\n const degraded: string[] = []\n const params = transformParams(\n node.parameters,\n sourceFile,\n warnings,\n degraded,\n resolveCtx\n )\n\n // Get line number (1-indexed) for source mapping\n const { line } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile)\n )\n const lineComment = includeLineNumber ? `/* line ${line + 1} */\\n` : ''\n\n const funcName =\n explicitName ||\n (ts.isFunctionDeclaration(node) && node.name\n ? node.name.getText(sourceFile)\n : '')\n const returnExample = node.type\n ? typeToExample(node.type, undefined, warnings, resolveCtx)\n : ''\n // Use -! to skip signature tests - TS types are compile-time only,\n // the example values won't necessarily match runtime behavior\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any' &&\n !returnExample.startsWith('new ') // new Set(), new Map() etc. aren't valid TJS literals\n ? ` -! ${returnExample}`\n : ''\n\n // Track degraded return type\n if (node.type && (returnExample === 'any' || returnExample === 'undefined')) {\n const originalReturn = node.type.getText(sourceFile)\n if (\n originalReturn !== 'any' &&\n originalReturn !== 'unknown' &&\n originalReturn !== 'void'\n ) {\n degraded.push(`return: ${originalReturn}`)\n }\n }\n\n // Get function body and strip TypeScript syntax using ts.transpileModule\n let body = ''\n if (node.body) {\n const bodyText = ts.isBlock(node.body)\n ? node.body.getText(sourceFile)\n : `{ return ${node.body.getText(sourceFile)} }`\n\n // Use TypeScript's transpiler to strip all type syntax\n const transpiled = ts.transpileModule(bodyText, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = transpiled.outputText.trim()\n } else {\n body = '{ }'\n }\n\n // Check for export, async, and generator modifiers\n const isExported = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n const isAsync = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n const isGenerator = !!(node as ts.FunctionDeclaration).asteriskToken\n const exportPrefix = isExported ? 'export ' : ''\n const asyncPrefix = isAsync ? 'async ' : ''\n const funcKeyword = isGenerator ? 'function* ' : 'function '\n\n // Emit migration comment if any types were degraded\n const degradedComment =\n degraded.length > 0\n ? `/* TODO: TS types degraded — ${degraded.join(', ')} */\\n`\n : ''\n\n return `${lineComment}${degradedComment}${exportPrefix}${asyncPrefix}${funcKeyword}${funcName}(${params.join(\n ', '\n )})${returnAnnotation} ${body}`\n}\n\n/**\n * Emit a full TJS overload group: the implementation (renamed) + wrapper signatures.\n * Each overload signature becomes a TJS function that delegates to the implementation.\n * TJS polymorphic dispatch merges the wrappers into a dispatcher automatically.\n */\nfunction emitOverloadGroup(\n signatures: ts.FunctionDeclaration[],\n implementation: ts.FunctionDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string[] {\n const funcName = implementation.name?.getText(sourceFile) || ''\n const implName = `_${funcName}_impl`\n const results: string[] = []\n\n // Emit the implementation as a renamed private function\n const implParams = transformParams(\n implementation.parameters,\n sourceFile,\n warnings\n )\n let implBody = '{ }'\n if (implementation.body) {\n const bodyText = implementation.body.getText(sourceFile)\n const transpiled = ts.transpileModule(bodyText, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n implBody = transpiled.outputText.trim()\n }\n const isAsync = implementation.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n const isGenerator = !!implementation.asteriskToken\n const asyncPrefix = isAsync ? 'async ' : ''\n const funcKeyword = isGenerator ? 'function* ' : 'function '\n\n results.push(\n `${asyncPrefix}${funcKeyword}${implName}(${implParams.join(\n ', '\n )}) ${implBody}`\n )\n\n // Emit each overload signature as a wrapper that delegates to the implementation\n for (const sig of signatures) {\n const params = transformParams(sig.parameters, sourceFile, warnings)\n const paramNames = sig.parameters.map((p) => p.name.getText(sourceFile))\n const returnExample = sig.type\n ? typeToExample(sig.type, undefined, warnings)\n : ''\n const returnAnnotation =\n returnExample && returnExample !== 'undefined' && returnExample !== 'any'\n ? ` -! ${returnExample}`\n : ''\n\n const { line } = sourceFile.getLineAndCharacterOfPosition(\n sig.getStart(sourceFile)\n )\n const lineComment = `/* line ${line + 1} */\\n`\n const returnKw = isGenerator ? 'yield* ' : 'return '\n\n results.push(\n `${lineComment}${asyncPrefix}${funcKeyword}${funcName}(${params.join(\n ', '\n )})${returnAnnotation} { ${returnKw}${implName}(${paramNames.join(\n ', '\n )}) }`\n )\n }\n\n return results\n}\n\n/**\n * Transform TypeScript class to TJS class\n * Converts TS type annotations to TJS example-based annotations\n */\nfunction transformClassToTJS(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): string {\n // Build type parameter map from class-level generics\n let resolveCtx = ctx\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParamMap = new Map<\n string,\n { constraint?: ts.TypeNode; default?: ts.TypeNode }\n >()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n resolveCtx = { ...ctx, typeParams: typeParamMap }\n }\n\n const className = node.name?.getText(sourceFile) || 'Anonymous'\n // Get base class name, stripping type arguments (e.g. Component<T> → Component)\n const extendsType = node.heritageClauses?.find(\n (h) => h.token === ts.SyntaxKind.ExtendsKeyword\n )?.types[0]\n const extendsClause = extendsType?.expression?.getText(sourceFile)\n\n // First pass: collect private field mappings (TS private -> JS #)\n const privateFieldMap = new Map<string, string>()\n for (const member of node.members) {\n if (ts.isPropertyDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const isPrivate = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.PrivateKeyword\n )\n if (isPrivate && !propName.startsWith('#')) {\n privateFieldMap.set(propName, `#${propName}`)\n }\n }\n }\n\n // Helper to replace private field references in transpiled code\n // Handles: this.prop, ClassName.prop (static), varName.prop (instance via variable)\n const replacePrivateRefs = (code: string): string => {\n let result = code\n for (const [tsName, jsName] of privateFieldMap) {\n // Match property access on any identifier: word.propName or this.propName\n // This covers this.prop, ClassName.prop, and varName.prop\n result = result.replace(\n new RegExp(`(\\\\b\\\\w+)\\\\.${tsName}\\\\b`, 'g'),\n `$1.${jsName}`\n )\n }\n return result\n }\n\n const members: string[] = []\n\n for (const member of node.members) {\n // Constructor\n if (ts.isConstructorDeclaration(member)) {\n const params = transformParams(member.parameters, sourceFile, warnings)\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n members.push(` constructor(${params.join(', ')}) ${body}`)\n }\n\n // Regular methods\n if (ts.isMethodDeclaration(member) && member.name) {\n const methodName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n const isAsync = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n\n const params = transformParams(\n member.parameters,\n sourceFile,\n warnings,\n undefined,\n resolveCtx\n )\n const returnExample = member.type\n ? typeToExample(member.type, undefined, warnings, resolveCtx)\n : ''\n // Use -! to skip signature tests for TS-transpiled code\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any'\n ? ` -! ${returnExample}`\n : ''\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n const isGenerator = !!member.asteriskToken\n const staticPrefix = isStatic ? 'static ' : ''\n const asyncPrefix = isAsync ? 'async ' : ''\n const generatorStar = isGenerator ? '*' : ''\n members.push(\n ` ${staticPrefix}${asyncPrefix}${generatorStar}${methodName}(${params.join(\n ', '\n )})${returnAnnotation} ${body}`\n )\n }\n\n // Getters\n if (ts.isGetAccessorDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const returnExample = member.type\n ? typeToExample(member.type, undefined, warnings, resolveCtx)\n : ''\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any' &&\n !returnExample.startsWith('new ')\n ? ` -> ${returnExample}`\n : ''\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n members.push(` get ${propName}()${returnAnnotation} ${body}`)\n }\n\n // Setters\n if (ts.isSetAccessorDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const params = transformParams(member.parameters, sourceFile, warnings)\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n members.push(` set ${propName}(${params.join(', ')}) ${body}`)\n }\n\n // Properties with initializers (private fields, regular properties)\n if (ts.isPropertyDeclaration(member) && member.name) {\n const origName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n const staticPrefix = isStatic ? 'static ' : ''\n\n // Use mapped name (# for private) or original\n const propName = privateFieldMap.get(origName) || origName\n\n if (member.initializer) {\n // Wrap in parens so TS treats { ... } as an object expression,\n // not a block with labels (which mangles property colons)\n const initText = member.initializer.getText(sourceFile)\n const wrapped = initText.trimStart().startsWith('{')\n ? `(${initText})`\n : initText\n const transpiled = ts.transpileModule(wrapped, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n let output = transpiled.outputText.trim()\n // Strip the wrapping parens and trailing semicolon\n if (wrapped !== initText) {\n output = output.replace(/^\\(/, '').replace(/\\);?\\s*$/, '')\n }\n members.push(` ${staticPrefix}${propName} = ${output}`)\n } else {\n // Property without initializer - just declare it\n members.push(` ${staticPrefix}${propName}`)\n }\n }\n }\n\n const isExported = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n const exportPrefix = isExported ? 'export ' : ''\n const extendsStr = extendsClause ? ` extends ${extendsClause}` : ''\n return `${exportPrefix}class ${className}${extendsStr} {\\n${members.join(\n '\\n'\n )}\\n}`\n}\n\n/**\n * Helper to transform parameters to TJS format\n */\nfunction transformParams(\n parameters: ts.NodeArray<ts.ParameterDeclaration>,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n degraded?: string[],\n ctx?: TypeResolutionContext\n): string[] {\n const params: string[] = []\n\n for (const param of parameters) {\n const name = param.name.getText(sourceFile)\n // Skip TypeScript's `this` pseudo-parameter (declares `this` context type)\n if (name === 'this') continue\n const isOptional = !!param.questionToken || !!param.initializer\n const typeExample = typeToExample(param.type, undefined, warnings, ctx)\n\n if (param.initializer) {\n // Has default value - use it directly\n const defaultText = param.initializer.getText(sourceFile)\n params.push(`${name} = ${defaultText}`)\n } else if (typeExample === 'any' || typeExample === 'undefined') {\n // any/undefined type - no annotation in TJS (bare name means any)\n params.push(name)\n // Record original TS type for migration comments\n if (degraded && param.type) {\n const originalType = param.type.getText(sourceFile)\n if (originalType !== 'any' && originalType !== 'unknown') {\n degraded.push(`${name}: ${originalType}`)\n }\n }\n } else if (isOptional) {\n // Optional without default - use union with undefined to preserve\n // three-state semantics (e.g. TS `flag?: boolean` can be true/false/undefined)\n params.push(`${name}: ${typeExample} | undefined`)\n } else {\n // Required - use : for required\n params.push(`${name}: ${typeExample}`)\n }\n }\n\n return params\n}\n\n/**\n * Extract type metadata from a TypeScript function\n */\nfunction extractFunctionMetadata(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): FunctionTypeInfo {\n // Build type parameter map from generic params\n let resolveCtx = ctx\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParamMap = new Map<\n string,\n { constraint?: ts.TypeNode; default?: ts.TypeNode }\n >()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n resolveCtx = { ...ctx, typeParams: typeParamMap }\n }\n\n const name =\n ts.isFunctionDeclaration(node) && node.name\n ? node.name.getText(sourceFile)\n : 'anonymous'\n const params: Record<string, ParamTypeInfo> = {}\n\n for (const param of node.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n // Try to extract literal default value\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, resolveCtx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n\n const result: FunctionTypeInfo = {\n name,\n params,\n returns: node.type ? typeToInfo(node.type, resolveCtx) : undefined,\n }\n\n // Extract generic type parameters\n const typeParams = extractTypeParams(node, warnings)\n if (typeParams) {\n result.typeParams = typeParams\n }\n\n return result\n}\n\n/**\n * Extract type metadata from a TypeScript class\n */\nfunction extractClassMetadata(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): ClassTypeInfo {\n // Build type parameter map from class-level generics\n let resolveCtx = ctx\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParamMap = new Map<\n string,\n { constraint?: ts.TypeNode; default?: ts.TypeNode }\n >()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n resolveCtx = { ...ctx, typeParams: typeParamMap }\n }\n\n const name = node.name?.getText(sourceFile) || 'anonymous'\n const methods: Record<string, FunctionTypeInfo> = {}\n const staticMethods: Record<string, FunctionTypeInfo> = {}\n let constructorInfo: { params: Record<string, ParamTypeInfo> } | undefined\n\n for (const member of node.members) {\n // Constructor\n if (ts.isConstructorDeclaration(member)) {\n const params: Record<string, ParamTypeInfo> = {}\n for (const param of member.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, resolveCtx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n constructorInfo = { params }\n }\n\n // Methods (instance and static)\n if (ts.isMethodDeclaration(member) && member.name) {\n const methodName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n\n const params: Record<string, ParamTypeInfo> = {}\n for (const param of member.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, resolveCtx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n\n const methodInfo: FunctionTypeInfo = {\n name: methodName,\n params,\n returns: member.type ? typeToInfo(member.type, resolveCtx) : undefined,\n }\n\n if (isStatic) {\n staticMethods[methodName] = methodInfo\n } else {\n methods[methodName] = methodInfo\n }\n }\n }\n\n const result: ClassTypeInfo = {\n name,\n methods,\n staticMethods,\n constructor: constructorInfo,\n }\n\n // Extract class-level generic type parameters\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParams: Record<string, TypeParamInfo> = {}\n for (const param of node.typeParameters) {\n const paramName = param.name.getText(sourceFile)\n const info: TypeParamInfo = {}\n if (param.constraint) {\n info.constraint = typeToExample(\n param.constraint,\n undefined,\n warnings,\n ctx\n )\n }\n if (param.default) {\n info.default = typeToExample(param.default, undefined, warnings, ctx)\n }\n typeParams[paramName] = info\n }\n result.typeParams = typeParams\n }\n\n return result\n}\n\n/**\n * Transpile TypeScript source to TJS or JS + metadata\n */\n/**\n * Extract embedded test comments from source\n * These use syntax: /*test 'description' { ... }* / (without space before /)\n * They survive TS compilation and should be preserved in TJS output\n */\nfunction extractEmbeddedTestComments(source: string): string[] {\n const tests: string[] = []\n // Match: /*test 'description' { ... }*/ or /*test { ... }*/\n const embeddedRegex =\n /\\/\\*test\\s+(['\"`])([^'\"`]*)\\1\\s*\\{[\\s\\S]*?\\}\\s*\\*\\/|\\/\\*test\\s*\\{[\\s\\S]*?\\}\\s*\\*\\//g\n\n let match\n while ((match = embeddedRegex.exec(source)) !== null) {\n tests.push(match[0])\n }\n return tests\n}\n\n/**\n * Extract top-level TJS doc comments (/*# ... *\\/) from source with position info.\n * These need to be preserved in TJS output in their original positions.\n * Comments inside function bodies are already preserved by the TS transpiler.\n */\nfunction extractDocComments(\n source: string\n): Array<{ content: string; index: number }> {\n const comments: Array<{ content: string; index: number }> = []\n const docRegex = /\\/\\*#[\\s\\S]*?\\*\\//g\n\n // Track brace depth to identify top-level comments\n let braceDepth = 0\n let inString: string | null = null\n\n // Scan source to find brace depths at each position\n const braceDepthAt: number[] = []\n for (let i = 0; i < source.length; i++) {\n const ch = source[i]\n const prev = i > 0 ? source[i - 1] : ''\n\n // Handle string literals\n if (!inString && (ch === '\"' || ch === \"'\" || ch === '`')) {\n inString = ch\n } else if (inString && ch === inString && prev !== '\\\\') {\n inString = null\n }\n\n // Track braces only outside strings\n if (!inString) {\n if (ch === '{') braceDepth++\n if (ch === '}') braceDepth--\n }\n\n braceDepthAt[i] = braceDepth\n }\n\n let match\n while ((match = docRegex.exec(source)) !== null) {\n // Only include comments at top level (brace depth 0)\n if (braceDepthAt[match.index] === 0) {\n comments.push({\n content: match[0],\n index: match.index,\n })\n }\n }\n return comments\n}\n\nexport function fromTS(\n source: string,\n options: FromTSOptions = {}\n): FromTSResult {\n const { emitTJS = false, filename = 'input.ts' } = options\n const warnings: string[] = []\n\n // Extract embedded test comments before TS parsing (they need to be preserved)\n const embeddedTests = extractEmbeddedTestComments(source)\n\n // Extract doc comments (/*# ... */) with position info for TJS output\n const docComments = emitTJS ? extractDocComments(source) : []\n\n // Parse TypeScript\n const sourceFile = ts.createSourceFile(\n filename,\n source,\n ts.ScriptTarget.Latest,\n true\n )\n\n const tjsFunctions: string[] = []\n const seenTypeNames = new Set<string>() // Track emitted type names to avoid duplicates\n const metadata: Record<string, FunctionTypeInfo> = {}\n const classMetadata: Record<string, ClassTypeInfo> = {}\n\n // Track which doc comments have been emitted (by index in docComments array)\n const emittedDocComments = new Set<number>()\n\n // Helper: emit any doc comments that appear before a given source position\n const emitDocCommentsBefore = (pos: number) => {\n for (let i = 0; i < docComments.length; i++) {\n const doc = docComments[i]\n if (!emittedDocComments.has(i) && doc.index < pos) {\n tjsFunctions.push(doc.content)\n emittedDocComments.add(i)\n }\n }\n }\n\n // Build type alias and interface maps first (first pass)\n const typeAliases = new Map<string, ts.TypeNode>()\n const interfaces = new Map<string, ts.InterfaceDeclaration>()\n\n function collectTypes(node: ts.Node) {\n if (ts.isTypeAliasDeclaration(node)) {\n typeAliases.set(node.name.getText(sourceFile), node.type)\n }\n if (ts.isInterfaceDeclaration(node)) {\n const name = node.name.getText(sourceFile)\n const existing = interfaces.get(name)\n if (existing) {\n // Merge members (TS interface merging)\n const merged = ts.factory.updateInterfaceDeclaration(\n existing,\n existing.modifiers,\n existing.name,\n existing.typeParameters,\n existing.heritageClauses,\n [...existing.members, ...node.members]\n )\n interfaces.set(name, merged)\n } else {\n interfaces.set(name, node)\n }\n }\n ts.forEachChild(node, collectTypes)\n }\n collectTypes(sourceFile)\n\n // Create resolution context\n const resolutionCtx: TypeResolutionContext = {\n typeAliases,\n interfaces,\n sourceFile,\n warnings,\n }\n\n // Pre-scan: detect function overload groups\n // In TS, overloads are N bodyless signatures + 1 implementation with body\n const overloadGroups = new Map<\n string,\n {\n signatures: ts.FunctionDeclaration[] // body === undefined\n implementation: ts.FunctionDeclaration | null // has body\n }\n >()\n for (const stmt of sourceFile.statements) {\n if (ts.isFunctionDeclaration(stmt) && stmt.name) {\n const name = stmt.name.getText(sourceFile)\n if (!overloadGroups.has(name)) {\n overloadGroups.set(name, { signatures: [], implementation: null })\n }\n const group = overloadGroups.get(name)!\n if (stmt.body) {\n group.implementation = stmt\n } else {\n group.signatures.push(stmt)\n }\n }\n }\n // Only keep groups that actually have overloads (signatures + implementation)\n for (const [name, group] of overloadGroups) {\n if (group.signatures.length === 0 || !group.implementation) {\n overloadGroups.delete(name)\n }\n }\n\n // Walk top-level statements only (don't recurse into function bodies)\n for (const statement of sourceFile.statements) {\n let handled = false\n\n // Emit any doc comments before this statement\n if (emitTJS) {\n emitDocCommentsBefore(statement.getStart(sourceFile))\n }\n\n // Handle: function foo() {}\n if (ts.isFunctionDeclaration(statement) && statement.name) {\n const funcName = statement.name.getText(sourceFile)\n handled = true\n\n const overloadGroup = overloadGroups.get(funcName)\n\n if (overloadGroup) {\n // This function is part of an overload group\n if (!statement.body) {\n // Skip bodyless signatures — handled when we encounter the implementation\n } else {\n // Implementation: emit the entire overload group\n if (emitTJS) {\n tjsFunctions.push(\n ...emitOverloadGroup(\n overloadGroup.signatures,\n statement,\n sourceFile,\n warnings\n )\n )\n } else {\n const overloads: FunctionTypeInfo[] = []\n for (const sig of overloadGroup.signatures) {\n overloads.push(\n extractFunctionMetadata(\n sig,\n sourceFile,\n warnings,\n resolutionCtx\n )\n )\n }\n const implInfo = extractFunctionMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n implInfo.overloads = overloads\n metadata[funcName] = implInfo\n }\n }\n } else {\n // Normal (non-overloaded) function\n if (emitTJS) {\n tjsFunctions.push(\n transformFunctionToTJS(\n statement,\n sourceFile,\n undefined,\n warnings,\n true,\n resolutionCtx\n )\n )\n } else {\n metadata[funcName] = extractFunctionMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n }\n }\n }\n\n // Handle: const foo = () => {} or const foo = function() {}\n // Also handle: const x = ..., let x = ..., var x = ... (non-function)\n if (ts.isVariableStatement(statement)) {\n let hasFunctionDecl = false\n\n // Check if the variable statement itself is exported\n const varIsExported = statement.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n\n for (const decl of statement.declarationList.declarations) {\n if (\n ts.isIdentifier(decl.name) &&\n decl.initializer &&\n (ts.isArrowFunction(decl.initializer) ||\n ts.isFunctionExpression(decl.initializer))\n ) {\n hasFunctionDecl = true\n const funcName = decl.name.getText(sourceFile)\n const funcNode = decl.initializer\n\n if (emitTJS) {\n let tjsFunc = transformFunctionToTJS(\n funcNode,\n sourceFile,\n funcName,\n warnings,\n true,\n resolutionCtx\n )\n // Arrow/const functions: export is on the VariableStatement\n // Insert after any line comment or degraded comment\n if (varIsExported && !tjsFunc.includes('export ')) {\n const firstFuncLine = tjsFunc.search(/^(async\\s+)?function[\\s*]/m)\n if (firstFuncLine > 0) {\n tjsFunc =\n tjsFunc.slice(0, firstFuncLine) +\n 'export ' +\n tjsFunc.slice(firstFuncLine)\n } else {\n tjsFunc = 'export ' + tjsFunc\n }\n }\n tjsFunctions.push(tjsFunc)\n } else {\n const info = extractFunctionMetadata(\n funcNode,\n sourceFile,\n warnings,\n resolutionCtx\n )\n info.name = funcName\n metadata[funcName] = info\n }\n }\n }\n\n // If this variable statement doesn't contain function declarations,\n // transpile and preserve it (strips type annotations)\n if (!hasFunctionDecl && emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n tjsFunctions.push(transpiled.outputText.trim())\n }\n\n handled = true\n }\n\n // Handle: interface Foo { ... }\n if (ts.isInterfaceDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const typeName = statement.name.getText(sourceFile)\n if (!seenTypeNames.has(typeName)) {\n seenTypeNames.add(typeName)\n // Use merged interface (handles declaration merging)\n const merged = interfaces.get(typeName) || statement\n const typeDecl = transformInterfaceToType(\n merged,\n sourceFile,\n warnings\n )\n if (typeDecl) {\n const isExported = statement.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n tjsFunctions.push(isExported ? `export ${typeDecl}` : typeDecl)\n }\n }\n }\n }\n\n // Handle: type Foo = { ... }\n if (ts.isTypeAliasDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const typeName = statement.name.getText(sourceFile)\n if (!seenTypeNames.has(typeName)) {\n seenTypeNames.add(typeName)\n const typeDecl = transformTypeAliasToType(\n statement,\n sourceFile,\n warnings\n )\n if (typeDecl) {\n const isExported = statement.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n tjsFunctions.push(isExported ? `export ${typeDecl}` : typeDecl)\n }\n }\n }\n }\n\n // Handle: enum Status { Pending, Active, Done }\n if (ts.isEnumDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const enumName = statement.name.getText(sourceFile)\n if (!seenTypeNames.has(enumName)) {\n seenTypeNames.add(enumName)\n const enumDecl = transformEnumToTJS(statement, sourceFile, warnings)\n if (enumDecl) {\n tjsFunctions.push(enumDecl)\n }\n }\n }\n }\n\n // Handle: class Foo { ... }\n if (ts.isClassDeclaration(statement) && statement.name) {\n const className = statement.name.getText(sourceFile)\n handled = true\n if (emitTJS) {\n const classDecl = transformClassToTJS(statement, sourceFile, warnings)\n tjsFunctions.push(classDecl)\n } else {\n classMetadata[className] = extractClassMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n }\n }\n\n // Handle: import statements (strip type-only imports, keep value imports)\n if (ts.isImportDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n // Check if it's a type-only import\n const isTypeOnly =\n statement.importClause?.isTypeOnly ||\n (statement.importClause?.namedBindings &&\n ts.isNamedImports(statement.importClause.namedBindings) &&\n statement.importClause.namedBindings.elements.every(\n (e) => e.isTypeOnly\n ))\n\n if (!isTypeOnly) {\n // Emit import directly — don't use ts.transpileModule which\n // strips \"unused\" imports in isolation. Filter out type-only\n // specifiers manually.\n if (\n statement.importClause?.namedBindings &&\n ts.isNamedImports(statement.importClause.namedBindings)\n ) {\n const valueSpecs = statement.importClause.namedBindings.elements\n .filter((e) => !e.isTypeOnly)\n .map((e) => {\n const name = e.name.getText(sourceFile)\n const propName = e.propertyName?.getText(sourceFile)\n return propName ? `${propName} as ${name}` : name\n })\n if (valueSpecs.length > 0) {\n const modSpec = (statement.moduleSpecifier as ts.StringLiteral)\n .text\n tjsFunctions.push(\n `import { ${valueSpecs.join(', ')} } from '${modSpec}'`\n )\n }\n } else {\n // Default import, namespace import, or side-effect import\n // Emit as-is (strip types via getText which preserves structure)\n const importText = statement.getText(sourceFile)\n // Remove type annotations by running through TS\n const cleaned = importText\n .replace(/\\btype\\s+/g, '')\n .replace(/\\s*:\\s*\\w+/g, '')\n tjsFunctions.push(cleaned)\n }\n }\n }\n }\n\n // Handle: export statements\n if (ts.isExportDeclaration(statement) || ts.isExportAssignment(statement)) {\n handled = true\n if (emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n const trimmed = transpiled.outputText.trim()\n if (trimmed) {\n tjsFunctions.push(trimmed)\n }\n }\n }\n\n // Handle: expression statements (console.log(...), foo(), etc.)\n // and any other unhandled statements\n if (!handled && emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n const trimmed = transpiled.outputText.trim()\n if (trimmed) {\n tjsFunctions.push(trimmed)\n }\n }\n }\n\n if (emitTJS) {\n // Emit any remaining doc comments (after all statements)\n emitDocCommentsBefore(Infinity)\n\n // Include source file annotation for error reporting\n const sourceFileName = filename || 'unknown'\n const header = `/* tjs <- ${sourceFileName} */\\n\\n`\n\n // Append embedded test comments (they were extracted from original source)\n const testsSection =\n embeddedTests.length > 0 ? '\\n\\n' + embeddedTests.join('\\n\\n') : ''\n\n return {\n code: header + tjsFunctions.join('\\n\\n') + testsSection,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n }\n\n // For JS output, strip types and add metadata\n const jsOutput = ts.transpileModule(source, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n\n // Append __tjs metadata for each function\n let code = jsOutput.outputText\n for (const [funcName, info] of Object.entries(metadata)) {\n const metadataObj: Record<string, any> = {\n params: Object.fromEntries(\n Object.entries(info.params).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required, default: v.default },\n ])\n ),\n returns: info.returns ? { type: info.returns.kind } : undefined,\n }\n\n // Include type parameters (generics) if present\n if (info.typeParams) {\n metadataObj.typeParams = info.typeParams\n }\n\n const metadataStr = JSON.stringify(metadataObj, null, 2)\n code += `\\n${funcName}.__tjs = ${metadataStr};\\n`\n }\n\n // Append __tjs metadata for each class\n for (const [className, info] of Object.entries(classMetadata)) {\n const metadataObj: Record<string, any> = {\n constructor: info.constructor\n ? {\n params: Object.fromEntries(\n Object.entries(info.constructor.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required, default: v.default },\n ])\n ),\n }\n : undefined,\n methods: Object.fromEntries(\n Object.entries(info.methods ?? {}).map(([name, m]) => [\n name,\n {\n params: Object.fromEntries(\n Object.entries(m.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required },\n ])\n ),\n returns: m.returns ? { type: m.returns.kind } : undefined,\n },\n ])\n ),\n staticMethods: Object.fromEntries(\n Object.entries(info.staticMethods ?? {}).map(([name, m]) => [\n name,\n {\n params: Object.fromEntries(\n Object.entries(m.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required },\n ])\n ),\n returns: m.returns ? { type: m.returns.kind } : undefined,\n },\n ])\n ),\n }\n\n if (info.typeParams) {\n metadataObj.typeParams = info.typeParams\n }\n\n const metadataStr = JSON.stringify(metadataObj, null, 2)\n code += `\\n${className}.__tjs = ${metadataStr};\\n`\n\n // Wrap class to make it callable without `new`\n code += `\\n${emitClassWrapper(className)}\\n`\n }\n\n return {\n code,\n types: metadata,\n classes: Object.keys(classMetadata).length > 0 ? classMetadata : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n}\n",
|
|
19
|
-
"/**\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 {\n Type,\n isRuntimeType,\n Union,\n Generic,\n Enum,\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 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 → .Equals method → structural comparison\n */\nexport const tjsEquals: unique symbol = Symbol.for('tjs.equals')\n\n/**\n * Parse semver version string into components\n */\nfunction parseVersion(version: string): {\n major: number\n minor: number\n patch: number\n} {\n const [major = 0, minor = 0, patch = 0] = version.split('.').map(Number)\n return { major, minor, patch }\n}\n\n/**\n * Compare two version strings\n * Returns: -1 if a < b, 0 if equal, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): -1 | 0 | 1 {\n const va = parseVersion(a)\n const vb = parseVersion(b)\n\n if (va.major !== vb.major) return va.major < vb.major ? -1 : 1\n if (va.minor !== vb.minor) return va.minor < vb.minor ? -1 : 1\n if (va.patch !== vb.patch) return va.patch < vb.patch ? -1 : 1\n return 0\n}\n\n/**\n * Check if two versions are compatible (same major version)\n */\nexport function versionsCompatible(a: string, b: string): boolean {\n const va = parseVersion(a)\n const vb = parseVersion(b)\n return va.major === vb.major\n}\n\n/**\n * MonadicError - Internal error type for monadic error propagation\n *\n * This extends Error so:\n * 1. It's a real Error with proper stack traces\n * 2. User code can't accidentally process it as data (unlike { $error: true })\n * 3. It flows through function calls via instanceof checks\n *\n * NOT exported to user code - they just see Error instances.\n */\nexport class MonadicError extends Error {\n /** Path where the error occurred, e.g., \"src/file.ts:42:greet.name\" */\n readonly path: string\n /** Expected type */\n readonly expected?: string\n /** Actual type received */\n readonly actual?: string\n /** TJS call stack (only in debug mode) - shows source locations */\n readonly callStack?: string[]\n\n constructor(\n message: string,\n path: string,\n expected?: string,\n actual?: string,\n callStack?: string[]\n ) {\n super(message)\n this.name = 'MonadicError'\n this.path = path\n this.expected = expected\n this.actual = actual\n this.callStack = callStack\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, MonadicError)\n }\n }\n}\n\n/**\n * Create a type error for inline validation\n *\n * Called ONLY when a type check fails - no overhead on happy path.\n * Returns a MonadicError that propagates through the call chain.\n * In debug mode, captures the TJS call stack with source locations.\n *\n * @param path - Location of the error, e.g., \"src/file.ts:42:greet.name\"\n * @param expected - Expected type, e.g., \"string\"\n * @param value - The actual value that failed the check\n */\nexport function typeError(\n path: string,\n expected: string,\n value: unknown\n): MonadicError {\n const actual = value === null ? 'null' : typeof value\n // Capture call stack in debug mode (getStack returns [] if not in debug mode)\n const stack = config.debug ? getStack() : undefined\n return new MonadicError(\n `Expected ${expected} for '${path}', got ${actual}`,\n path,\n expected,\n actual,\n stack\n )\n}\n\n/**\n * Check if a value is a MonadicError (for internal use)\n */\nexport function isMonadicError(value: unknown): value is MonadicError {\n return value instanceof MonadicError\n}\n\n/**\n * Error marker - identifies TJS error objects\n * @deprecated Use MonadicError instead. This interface is kept for backward compatibility.\n */\nexport interface TJSError {\n $error: true\n message: string\n /** Failure location - e.g., \"greet.name\" */\n path?: string\n /** Call stack in debug mode - e.g., [\"main\", \"processUser\", \"greet.name\"] */\n stack?: string[]\n expected?: string\n actual?: string\n cause?: Error | TJSError\n /** Source location for error reporting */\n loc?: { start: number; end: number }\n /** Multiple errors (when composing parameter errors) */\n errors?: TJSError[]\n}\n\n/**\n * Safety levels for runtime validation\n * - 'none': No validation unless explicitly forced with (?) or -?\n * - 'inputs': Validate inputs only (default) - outputs only with explicit -> or -?\n * - 'all': Validate both inputs and outputs unless explicitly skipped with (!) or -!\n */\nexport type SafetyLevel = 'none' | 'inputs' | 'all'\n\n/**\n * Runtime configuration\n */\nexport interface TJSConfig {\n /** Enable debug mode - captures call stacks in errors */\n debug?: boolean\n /** Safety level for validation (default: 'inputs') */\n safety?: SafetyLevel\n /** Require explicit return types (error if -> not specified) */\n requireReturnTypes?: boolean\n /** Maximum call stack size to prevent memory issues (default: 100) */\n maxStackSize?: number\n}\n\n/** Default configuration values */\nconst DEFAULT_CONFIG: TJSConfig = {\n debug: false,\n safety: 'inputs',\n requireReturnTypes: false,\n maxStackSize: 100,\n}\n\n/** Current runtime configuration */\nlet config: TJSConfig = { ...DEFAULT_CONFIG }\n\n/** Current call stack (only tracked in debug mode) */\nconst callStack: string[] = []\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 (debug mode only)\n * Respects maxStackSize to prevent unbounded memory growth\n */\nexport function pushStack(name: string): void {\n if (config.debug && name) {\n callStack.push(name)\n // Enforce max stack size by removing oldest entries\n const maxSize = config.maxStackSize ?? 100\n while (callStack.length > maxSize) {\n callStack.shift()\n }\n }\n}\n\n/**\n * Pop a function from the call stack (debug mode only)\n */\nexport function popStack(): void {\n if (config.debug) {\n callStack.pop()\n }\n}\n\n/**\n * Get current call stack snapshot\n */\nexport function getStack(): string[] {\n return [...callStack]\n}\n\n/**\n * Reset runtime state to defaults\n *\n * Resets: config, callStack, unsafeDepth\n * Use this in test teardown to prevent state leaking between tests.\n */\nexport function resetRuntime(): void {\n config = { ...DEFAULT_CONFIG }\n callStack.length = 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 // Identical references or primitives\n if (a === b) return true\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 // 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 * 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 // In debug mode, capture the call stack\n if (config.debug && callStack.length > 0) {\n // Add the path to the stack if it exists\n const fullStack = details?.path\n ? [...callStack, details.path]\n : [...callStack]\n err.stack = fullStack\n }\n\n return err\n}\n\n/**\n * Compose multiple errors into a single error\n * Used when multiple parameters have errors\n */\nexport function composeErrors(errors: TJSError[], funcName?: string): TJSError {\n if (errors.length === 0) {\n return error('Unknown error')\n }\n if (errors.length === 1) {\n return errors[0]\n }\n\n // Build a message listing all failed parameters\n const paramNames = errors\n .map((e) => {\n // Extract param name from path (e.g., \"func.paramName\" -> \"paramName\")\n if (e.path) {\n const parts = e.path.split('.')\n return parts[parts.length - 1]\n }\n return 'unknown'\n })\n .join(', ')\n\n const message = `Multiple parameter errors in ${\n funcName || 'function'\n }: ${paramNames}`\n\n return error(message, {\n path: funcName,\n errors,\n })\n}\n\n/**\n * Get the type of a value\n *\n * Enhanced typeof that handles:\n * - null (returns 'null' not 'object')\n * - undefined (returns 'undefined')\n * - arrays (returns 'array' not 'object')\n * - native/platform types (returns constructor name for objects)\n *\n * For objects, returns the constructor name which enables pragmatic\n * native type checking (e.g., 'HTMLElement', 'Buffer', 'Event')\n */\nexport function typeOf(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (Array.isArray(value)) return 'array'\n\n const t = typeof value\n if (t !== 'object') return t\n\n // For objects, return constructor name for pragmatic native type checking\n // This enables checking for HTMLElement, Buffer, Event, etc.\n const constructorName = (value as object).constructor?.name\n if (constructorName && constructorName !== 'Object') {\n return constructorName\n }\n\n return 'object'\n}\n\n/**\n * Check if a value is an instance of a native/platform type by constructor name\n *\n * This enables pragmatic native type checking without shipping type definitions:\n * - isNativeType(el, 'HTMLElement') - DOM element check\n * - isNativeType(buf, 'Buffer') - Node.js Buffer check\n * - isNativeType(evt, 'Event') - DOM Event check\n * - isNativeType(map, 'Map') - Map instance check\n *\n * @param value - The value to check\n * @param typeName - The constructor name to match (e.g., 'HTMLElement', 'Buffer')\n * @returns true if value's constructor.name matches or is in prototype chain\n */\nexport function isNativeType(value: unknown, typeName: string): boolean {\n if (value === null || value === undefined) return false\n if (typeof value !== 'object' && typeof value !== 'function') return false\n\n // Check constructor name\n let proto = value\n while (proto !== null) {\n const constructorName = (proto as object).constructor?.name\n if (constructorName === typeName) return true\n proto = Object.getPrototypeOf(proto)\n }\n\n return false\n}\n\n/**\n * Check if a value matches an expected type\n *\n * @param value - The value to check\n * @param expected - Either a string type name ('string', 'number', etc.)\n * or a RuntimeType instance with .check() method\n * @param path - Optional path for error messages\n */\nexport function checkType(\n value: unknown,\n expected: string | { check: (v: unknown) => boolean; description: string },\n path?: string\n): TJSError | null {\n // If value is already an error, propagate it\n if (isError(value)) return value\n\n // Handle RuntimeType instances (Type() results)\n if (\n typeof expected === 'object' &&\n expected !== null &&\n 'check' in expected\n ) {\n if (expected.check(value)) return null\n return error(`Expected ${expected.description} but got ${typeOf(value)}`, {\n path,\n expected: expected.description,\n actual: typeOf(value),\n })\n }\n\n const actual = typeOf(value)\n\n // Handle special cases\n if (expected === 'any') return null\n if (expected === actual) return null\n\n // Number accepts both number types\n if (expected === 'number' && actual === 'number') return null\n if (expected === 'integer' && actual === 'number' && Number.isInteger(value))\n return null\n if (\n expected === 'non-negative-integer' &&\n actual === 'number' &&\n Number.isInteger(value) &&\n (value as number) >= 0\n )\n return null\n\n // Object matching (basic)\n if (expected === 'object' && actual === 'object') return null\n\n return error(`Expected ${expected} but got ${actual}`, {\n path,\n expected,\n actual,\n })\n}\n\n/** Type specifier - either a string name or a RuntimeType */\ntype TypeSpec = string | { check: (v: unknown) => boolean; description: string }\n\n/** Parameter metadata with optional location */\ninterface ParamMeta {\n type: TypeSpec\n required: boolean\n default?: unknown\n loc?: { start: number; end: number }\n}\n\n/**\n * Validate function arguments against __tjs metadata\n * Returns first error found, or null if all valid\n */\nexport function validateArgs(\n args: Record<string, unknown>,\n meta: {\n params: Record<string, ParamMeta>\n },\n funcName?: string\n): TJSError | null {\n for (const [name, param] of Object.entries(meta.params)) {\n const value = args[name]\n\n // Check if any arg is already an error - propagate first one\n if (isError(value)) return value\n\n // Check required\n if (param.required && value === undefined) {\n const expectedDesc =\n typeof param.type === 'string' ? param.type : param.type.description\n return error(`Missing required parameter '${name}'`, {\n path: funcName ? `${funcName}.${name}` : name,\n expected: expectedDesc,\n actual: 'undefined',\n loc: param.loc,\n })\n }\n\n // Skip type check for undefined optional params\n if (value === undefined) continue\n\n // Type check\n const typeError = checkType(\n value,\n param.type,\n funcName ? `${funcName}.${name}` : name\n )\n if (typeError) {\n // Add location info if available\n if (param.loc) {\n typeError.loc = param.loc\n }\n return typeError\n }\n }\n\n return null\n}\n\n/**\n * Function metadata with safety flags\n */\nexport interface FunctionMeta {\n params: Record<string, any>\n returns?: { type: any; safe?: boolean; defaults?: Record<string, unknown> }\n /** Function marked with (!) - never validate inputs */\n unsafe?: boolean\n /** Function marked with (?) - always validate inputs */\n safe?: boolean\n /** Return type marked with -! - never validate output */\n unsafeReturn?: boolean\n /** Return type marked with -? - always validate output */\n safeReturn?: boolean\n /** Explicit function name for stack tracking (used when fn.name is empty) */\n name?: string\n /** Polymorphic dispatcher — 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\n // Determine if we need a wrapper at all\n // Polymorphic dispatchers handle their own routing — 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 — 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 // Push onto call stack in debug mode\n 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 popStack()\n return returnError as ReturnType<T>\n }\n }\n\n popStack()\n return result\n } catch (e) {\n 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\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 instanceCallStack: string[] = []\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.debug && name) {\n instanceCallStack.push(name)\n const maxSize = instanceConfig.maxStackSize ?? 100\n while (instanceCallStack.length > maxSize) {\n instanceCallStack.shift()\n }\n }\n }\n\n function instancePopStack(): void {\n if (instanceConfig.debug) {\n instanceCallStack.pop()\n }\n }\n\n function instanceGetStack(): string[] {\n return [...instanceCallStack]\n }\n\n function instanceResetRuntime(): void {\n instanceConfig = { ...DEFAULT_CONFIG }\n instanceCallStack.length = 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 = instanceConfig.debug ? instanceGetStack() : undefined\n return new MonadicError(\n `Expected ${expected} for '${path}', got ${actual}`,\n path,\n expected,\n actual,\n stack\n )\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 (instanceConfig.debug && instanceCallStack.length > 0) {\n const fullStack = details?.path\n ? [...instanceCallStack, details.path]\n : [...instanceCallStack]\n err.stack = fullStack\n }\n return err\n }\n\n return {\n version: TJS_VERSION,\n // Monadic error handling\n MonadicError,\n typeError: instanceTypeError,\n isMonadicError,\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 // Debug mode (instance-specific)\n configure: instanceConfigure,\n getConfig: instanceGetConfig,\n pushStack: instancePushStack,\n popStack: instancePopStack,\n getStack: instanceGetStack,\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 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 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 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 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 == and != in TJS)\n Is,\n IsNot,\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} → ${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",
|
|
20
|
-
"/**\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, s, type Base } from 'tosijs-schema'\n\n/** JSON Schema object type (simplified) */\ntype JSONSchema = {\n type?: string\n properties?: Record<string, JSONSchema>\n items?: JSONSchema\n required?: string[]\n [key: string]: unknown\n}\n\n/** Schema can be a tosijs-schema builder or a raw JSON Schema object */\ntype Schema = Base<any> | JSONSchema\n\n/** A runtime type with description and validation */\nexport interface RuntimeType<T = unknown> {\n /** Human-readable description of the type */\n readonly description: string\n /** Check if a value matches this type */\n check(value: unknown): value is T\n /** The underlying schema (if schema-based) */\n readonly schema?: Schema\n /** The predicate function (if predicate-based) */\n readonly predicate?: (value: unknown) => boolean\n /** Example value (for documentation and signature testing) */\n readonly example?: T\n /** Multiple example values (from schema metadata, for autocomplete hints) */\n readonly examples?: T[]\n /** Default value (for instantiation) */\n readonly default?: T\n /** Brand for type identification */\n readonly __runtimeType: true\n}\n\n/** Check if a value is a RuntimeType */\nexport function isRuntimeType(value: unknown): value is RuntimeType {\n return (\n value !== null &&\n typeof value === 'object' &&\n '__runtimeType' in value &&\n (value as any).__runtimeType === true\n )\n}\n\n/**\n * Create a runtime type with description and validation\n *\n * @overload Type(description, predicate) - custom validation function\n * @overload Type(description, schema) - schema-based validation\n * @overload Type(schema) - schema only\n */\n/**\n * Check if a value is a tosijs-schema builder (has .schema property)\n */\nfunction isSchemaBuilder(value: unknown): value is Base<any> {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'schema' in value &&\n typeof (value as any).schema === 'object'\n )\n}\n\n/**\n * Check if a value looks like a raw JSON Schema object\n */\nfunction isJSONSchema(value: unknown): value is JSONSchema {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'type' in value &&\n typeof (value as any).type === 'string'\n )\n}\n\nexport function Type<T = unknown>(\n descriptionOrSchema: string | Schema,\n predicateOrSchemaOrExample?:\n | ((value: unknown) => boolean)\n | Schema\n | T\n | undefined,\n exampleArg?: T,\n defaultArg?: T\n): RuntimeType<T> {\n // Parse arguments\n let description: string\n let predicate: ((value: unknown) => boolean) | undefined\n let schema: Schema | undefined\n let example: T | undefined = exampleArg\n let defaultValue: T | undefined = defaultArg\n\n if (typeof descriptionOrSchema === 'string') {\n // Form: Type(description, predicate/schema/example, example?, default?)\n description = descriptionOrSchema\n\n if (typeof predicateOrSchemaOrExample === 'function') {\n // Type(description, predicate, example?, default?)\n predicate = predicateOrSchemaOrExample as (value: unknown) => boolean\n // If we have example, infer schema from it for the type guard in predicate\n if (example !== undefined) {\n schema = s.infer(example)\n }\n } else if (\n predicateOrSchemaOrExample === undefined &&\n example !== undefined\n ) {\n // Type(description, undefined, example, default?) - example provides schema\n schema = s.infer(example)\n } else if (isSchemaBuilder(predicateOrSchemaOrExample)) {\n // Type(description, schemaBuilder)\n schema = predicateOrSchemaOrExample\n } else if (isJSONSchema(predicateOrSchemaOrExample)) {\n // Type(description, jsonSchema)\n schema = predicateOrSchemaOrExample\n } else if (predicateOrSchemaOrExample !== undefined) {\n // Type(description, example) - second arg is the example/default, infer schema\n // This is the simple form: Type('Name', 'Alice')\n example = predicateOrSchemaOrExample as T\n defaultValue = example // In simple form, example IS the default\n schema = s.infer(example)\n } else {\n throw new Error(\n 'Type(description) requires a predicate, schema, or example'\n )\n }\n } else {\n // Form: Type(schema) or Type(schemaBuilder)\n if (isSchemaBuilder(descriptionOrSchema)) {\n schema = descriptionOrSchema\n } else {\n schema = descriptionOrSchema as Schema\n }\n description = schemaToDescription(schema)\n }\n\n // Extract examples from schema metadata (if any)\n let examples: T[] | undefined\n if (schema) {\n const jsonSchema = (schema as any)?.schema ?? schema\n if (\n jsonSchema &&\n typeof jsonSchema === 'object' &&\n Array.isArray((jsonSchema as any).examples)\n ) {\n examples = (jsonSchema as any).examples as T[]\n }\n }\n\n // If no explicit example was provided, use first schema example for autocomplete\n if (example === undefined && examples && examples.length > 0) {\n example = examples[0]\n }\n\n // Build the check function\n const check = (value: unknown): value is T => {\n if (predicate) {\n return predicate(value)\n }\n if (schema) {\n return validate(value, schema)\n }\n return false\n }\n\n return {\n description,\n check,\n schema,\n predicate,\n example,\n examples,\n default: defaultValue,\n __runtimeType: true as const,\n }\n}\n\n/**\n * Generate a description from a schema\n */\nfunction schemaToDescription(schema: Schema): string {\n // tosijs-schema wraps JSON schema in .schema property\n const jsonSchema = (schema as any)?.schema ?? schema\n\n // Handle schema objects with type property\n if (jsonSchema && typeof jsonSchema === 'object' && 'type' in jsonSchema) {\n const s = jsonSchema as any\n switch (s.type) {\n case 'string':\n if (s.format) return `string (${s.format})`\n if (s.pattern) return `string matching ${s.pattern}`\n if (s.minLength !== undefined && s.maxLength !== undefined)\n return `string (${s.minLength}-${s.maxLength} chars)`\n return 'string'\n case 'number':\n case 'integer':\n if (s.minimum !== undefined && s.maximum !== undefined)\n return `${s.type} (${s.minimum}-${s.maximum})`\n if (s.minimum !== undefined) return `${s.type} >= ${s.minimum}`\n if (s.maximum !== undefined) return `${s.type} <= ${s.maximum}`\n return s.type\n case 'boolean':\n return 'boolean'\n case 'array':\n return 'array'\n case 'object':\n return 'object'\n case 'null':\n return 'null'\n }\n }\n\n // Fallback\n return 'value'\n}\n\n// ============================================================================\n// Built-in Types\n// ============================================================================\n\n/** String type */\nexport const TString = Type<string>(\n 'string',\n (v: unknown) => typeof v === 'string'\n)\n\n/** Number type */\nexport const TNumber = Type<number>(\n 'number',\n (v: unknown) => typeof v === 'number'\n)\n\n/** Boolean type */\nexport const TBoolean = Type<boolean>(\n 'boolean',\n (v: unknown) => typeof v === 'boolean'\n)\n\n/** Integer type */\nexport const TInteger = Type<number>(\n 'integer',\n (v: unknown) => typeof v === 'number' && Number.isInteger(v)\n)\n\n/** Positive integer type */\nexport const TPositiveInt = Type<number>(\n 'positive integer',\n (v: unknown) => typeof v === 'number' && Number.isInteger(v) && v > 0\n)\n\n/** Non-empty string type */\nexport const TNonEmptyString = Type<string>(\n 'non-empty string',\n (v: unknown) => typeof v === 'string' && v.length > 0\n)\n\n/** Email type (basic validation) */\nexport const TEmail = Type<string>(\n 'email address',\n (v: unknown) => typeof v === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v)\n)\n\n/**\n * Check if a string is a valid URL (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidUrl = (v: string): boolean => {\n try {\n new URL(v)\n return true\n } catch {\n return false\n }\n}\n\n/** URL type */\nexport const TUrl = Type<string>(\n 'URL',\n (v: unknown) => typeof v === 'string' && isValidUrl(v)\n)\n\n/** UUID type */\nexport const TUuid = Type<string>(\n 'UUID',\n (v: unknown) =>\n typeof v === 'string' &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v)\n)\n\n/**\n * Check if a string is a valid ISO 8601 timestamp (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidTimestamp = (v: string): boolean => {\n const d = new Date(v)\n return !isNaN(d.getTime()) && v.includes('T')\n}\n\n/**\n * Check if a string is a valid YYYY-MM-DD date (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidLegalDate = (v: string): boolean => {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false\n const d = new Date(v + 'T00:00:00Z')\n return !isNaN(d.getTime())\n}\n\n/** ISO 8601 timestamp string (e.g., \"2024-01-15T10:30:00Z\") */\nexport const Timestamp = Type<string>(\n 'ISO 8601 timestamp',\n (v: unknown) => typeof v === 'string' && isValidTimestamp(v)\n)\n\n/** Legal date string in YYYY-MM-DD format */\nexport const LegalDate = Type<string>(\n 'date (YYYY-MM-DD)',\n (v: unknown) => typeof v === 'string' && isValidLegalDate(v)\n)\n\n// ============================================================================\n// Type Combinators\n// ============================================================================\n\n/** Create a nullable version of a type */\nexport function Nullable<T>(type: RuntimeType<T>): RuntimeType<T | null> {\n return Type<T | null>(\n `${type.description} or null`,\n (v: unknown) => v === null || type.check(v)\n )\n}\n\n/** Create an optional version of a type (nullable + undefined) */\nexport function Optional<T>(\n type: RuntimeType<T>\n): RuntimeType<T | null | undefined> {\n return Type<T | null | undefined>(\n `${type.description} (optional)`,\n (v: unknown) => v === null || v === undefined || type.check(v)\n )\n}\n\n/**\n * Create a union type\n *\n * Two forms:\n * Union(...types: RuntimeType[]) - combine existing types\n * Union(description, values) - create literal union from values\n *\n * @example\n * // From RuntimeTypes\n * const StringOrNumber = Union(TString, TNumber)\n *\n * // From literal values (used by TJS syntax)\n * const Direction = Union('cardinal direction', ['up', 'down', 'left', 'right'])\n */\nexport function Union<T extends unknown[]>(\n descriptionOrType: string | RuntimeType,\n valuesOrType?: T | RuntimeType,\n ...restTypes: RuntimeType[]\n): RuntimeType {\n // New form: Union(description, values[])\n if (typeof descriptionOrType === 'string' && Array.isArray(valuesOrType)) {\n const description = descriptionOrType\n const values = valuesOrType as unknown[]\n const valueSet = new Set(values)\n\n const result: RuntimeType & { values: unknown[] } = {\n description,\n check: (v: unknown): v is T[number] => valueSet.has(v),\n __runtimeType: true as const,\n values, // Expose values for introspection\n }\n return result\n }\n\n // Old form: Union(...types: RuntimeType[])\n const types: RuntimeType[] = []\n if (isRuntimeType(descriptionOrType)) {\n types.push(descriptionOrType)\n }\n if (isRuntimeType(valuesOrType)) {\n types.push(valuesOrType as RuntimeType)\n }\n types.push(...restTypes)\n\n const description = types.map((t) => t.description).join(' | ')\n return Type(description, (v: unknown) => types.some((t) => t.check(v)))\n}\n\n/** Create an array type */\nexport function TArray<T>(itemType: RuntimeType<T>): RuntimeType<T[]> {\n return Type<T[]>(\n `array of ${itemType.description}`,\n (v: unknown) => Array.isArray(v) && v.every((item) => itemType.check(item))\n )\n}\n\n// ============================================================================\n// Generic Types\n// ============================================================================\n\n/** Type parameter - can be a RuntimeType, schema, or example value */\nexport type TypeParam = RuntimeType | Base<any> | JSONSchema | unknown\n\n/** Generic type factory */\nexport interface GenericType<TParams extends string[] = string[]> {\n /** Instantiate the generic with concrete type arguments */\n (...typeArgs: TypeParam[]): RuntimeType\n /** The type parameter names */\n readonly params: TParams\n /** Description template */\n readonly description: string\n}\n\n/**\n * Convert a type param to a check function\n */\nfunction typeParamToCheck(param: TypeParam): (value: unknown) => boolean {\n if (isRuntimeType(param)) {\n return (v) => param.check(v)\n }\n // Check if it's a schema builder (has .schema property)\n if (param && typeof param === 'object' && 'schema' in param) {\n return (v) => validate(v, param as Base<any>)\n }\n // It's an example value - infer schema using s.infer\n const schema = s.infer(param)\n return (v) => validate(v, schema)\n}\n\n/**\n * Create a generic (parameterized) type factory\n *\n * @param params Array of type parameter names, with optional defaults: ['T', ['U', defaultSchema]]\n * @param predicate Function receiving (value, ...typeChecks) where typeChecks are validation functions\n * @param description Human-readable description template (type params will be substituted)\n *\n * @example\n * // Pair<T, U>\n * const Pair = Generic(\n * ['T', 'U'],\n * (x, checkT, checkU) =>\n * Array.isArray(x) && x.length === 2 && checkT(x[0]) && checkU(x[1]),\n * 'Pair<T, U>'\n * )\n *\n * // Usage: Pair(TString, TNumber) creates a type for [string, number]\n * // Or with examples: Pair('', 0)\n */\nexport function Generic<TParams extends string[]>(\n params: (string | [string, TypeParam])[],\n predicate: (\n value: unknown,\n ...typeChecks: Array<(v: unknown) => boolean>\n ) => boolean,\n description: string\n): GenericType<TParams> {\n // Extract param names and defaults\n const paramNames: string[] = []\n const defaults: (TypeParam | undefined)[] = []\n\n for (const p of params) {\n if (typeof p === 'string') {\n paramNames.push(p)\n defaults.push(undefined)\n } else {\n paramNames.push(p[0])\n defaults.push(p[1])\n }\n }\n\n // The factory function\n const factory = (...typeArgs: TypeParam[]): RuntimeType => {\n // Resolve type arguments, using defaults where not provided\n const checks = paramNames.map((_, i) => {\n const arg = i < typeArgs.length ? typeArgs[i] : defaults[i]\n if (arg === undefined) {\n // No arg and no default - accept anything\n return () => true\n }\n return typeParamToCheck(arg)\n })\n\n // Build description with substituted types\n let desc = description\n paramNames.forEach((name, i) => {\n const arg = i < typeArgs.length ? typeArgs[i] : defaults[i]\n let typeStr = 'any'\n if (isRuntimeType(arg)) {\n typeStr = arg.description\n } else if (arg !== undefined) {\n typeStr = typeof arg === 'string' ? 'string' : JSON.stringify(arg)\n }\n desc = desc.replace(new RegExp(`\\\\b${name}\\\\b`, 'g'), typeStr)\n })\n\n return Type(desc, (value: unknown) => predicate(value, ...checks))\n }\n\n ;(factory as any).params = paramNames as TParams\n ;(factory as any).description = description\n\n return factory as GenericType<TParams>\n}\n\n// ============================================================================\n// Built-in Generic Types\n// ============================================================================\n\n/** Pair<T, U> - 2-element tuple */\nexport const TPair = Generic(\n ['T', 'U'],\n (x, checkT, checkU) =>\n Array.isArray(x) && x.length === 2 && checkT(x[0]) && checkU(x[1]),\n 'Pair<T, U>'\n)\n\n/** Record<V> - object with string keys and values of type V */\nexport const TRecord = Generic(\n ['V'],\n (x, checkV) =>\n typeof x === 'object' &&\n x !== null &&\n !Array.isArray(x) &&\n Object.values(x).every(checkV),\n 'Record<string, V>'\n)\n\n// ============================================================================\n// Enum Types\n// ============================================================================\n\n/** Enum type with bidirectional lookup */\nexport interface EnumType<\n T extends Record<string, string | number> = Record<string, string | number>\n> extends RuntimeType<T[keyof T]> {\n /** The enum members as { Name: value } */\n readonly members: T\n /** Reverse lookup: value -> name */\n readonly names: Record<string | number, string>\n /** Get all valid values */\n readonly values: Array<T[keyof T]>\n /** Get all member names */\n readonly keys: Array<keyof T>\n}\n\n/**\n * Create an enum type with bidirectional lookup\n *\n * @param description Human-readable description\n * @param members Object mapping names to values { Pending: 0, Active: 1 }\n *\n * @example\n * const Status = Enum('task status', { Pending: 0, Active: 1, Done: 2 })\n * Status.check(0) // true\n * Status.check('done') // false\n * Status.members.Pending // 0\n * Status.names[0] // 'Pending'\n * Status.values // [0, 1, 2]\n * Status.keys // ['Pending', 'Active', 'Done']\n *\n * const Color = Enum('CSS color', { Red: 'red', Green: 'green', Blue: 'blue' })\n * Color.check('red') // true\n * Color.members.Red // 'red'\n */\nexport function Enum<T extends Record<string, string | number>>(\n description: string,\n members: T\n): EnumType<T> {\n const values = Object.values(members) as Array<T[keyof T]>\n const valueSet = new Set(values)\n const keys = Object.keys(members) as Array<keyof T>\n\n // Build reverse lookup\n const names: Record<string | number, string> = {}\n for (const [key, value] of Object.entries(members)) {\n names[value] = key\n }\n\n const enumType: EnumType<T> = {\n description,\n check: (v: unknown): v is T[keyof T] => valueSet.has(v as T[keyof T]),\n __runtimeType: true as const,\n members,\n names,\n values,\n keys,\n }\n\n return enumType\n}\n",
|
|
17
|
+
"/**\n * TJS to .d.ts Emitter\n *\n * Generates TypeScript declaration files from TJS transpilation results.\n * Allows TypeScript consumers to use TJS-authored libraries with full\n * type information for functions, and helpful `any`-based stubs for\n * classes, generics, and predicate types.\n *\n * Design principle: emit enough structure for autocomplete/tooltips\n * (parameter names, object shapes) but lean on `any` where TJS types\n * can't be faithfully expressed in TS (predicate types, generics,\n * class instances). This gives developers IDE hints without false\n * lint errors from types that don't fully match.\n *\n * Handles:\n * - Exported functions → full param/return types from TJSTypeInfo\n * - Exported classes → callable function stub with constructor params, returns any\n * - Exported Type declarations → type guard function stubs\n * - Exported Generic declarations → factory function stubs\n * - Re-exports via `export { Name }` syntax\n */\n\nimport type { TypeDescriptor } from '../types'\nimport type { TJSTranspileResult, TJSTypeInfo } from './js'\n\n/**\n * Convert a TypeDescriptor to a TypeScript type string.\n *\n * Maps TJS's example-inferred types to the closest TS equivalents:\n * integer / non-negative-integer → number (TS has no integer type)\n * string / number / boolean / null / undefined / any → themselves\n * array + items → T[]\n * object + shape → { key: Type; ... }\n * union + members → T1 | T2\n * nullable → T | null\n */\nexport function typeDescriptorToTS(td: TypeDescriptor): string {\n let base: string\n\n switch (td.kind) {\n case 'string':\n base = 'string'\n break\n case 'number':\n case 'integer':\n case 'non-negative-integer':\n base = 'number'\n break\n case 'boolean':\n base = 'boolean'\n break\n case 'null':\n return 'null'\n case 'undefined':\n return 'undefined'\n case 'any':\n base = 'any'\n break\n case 'array':\n if (td.items) {\n const inner = typeDescriptorToTS(td.items)\n // Wrap union types in parens for array: (A | B)[]\n base = inner.includes('|') ? `(${inner})[]` : `${inner}[]`\n } else {\n base = 'any[]'\n }\n break\n case 'object':\n if (td.shape && Object.keys(td.shape).length > 0) {\n const fields = Object.entries(td.shape)\n .map(([k, v]) => `${k}: ${typeDescriptorToTS(v)}`)\n .join('; ')\n base = `{ ${fields} }`\n } else {\n base = 'Record<string, any>'\n }\n break\n case 'union':\n if (td.members && td.members.length > 0) {\n return td.members.map(typeDescriptorToTS).join(' | ')\n }\n base = 'any'\n break\n default:\n base = 'any'\n }\n\n if (td.nullable) {\n return `${base} | null`\n }\n return base\n}\n\n/**\n * Generate a function declaration line for .d.ts\n */\nfunction functionDeclToTS(\n name: string,\n info: TJSTypeInfo,\n exported: boolean,\n isDefault: boolean\n): string {\n const params = Object.entries(info.params)\n .map(([pName, p]) => {\n const optional = !p.required\n const tsType = typeDescriptorToTS(p.type)\n return optional ? `${pName}?: ${tsType}` : `${pName}: ${tsType}`\n })\n .join(', ')\n\n const returnType = info.returns ? typeDescriptorToTS(info.returns) : 'any'\n const prefix = exported\n ? isDefault\n ? 'export default function'\n : 'export declare function'\n : 'declare function'\n\n return `${prefix} ${name}(${params}): ${returnType};`\n}\n\nexport interface GenerateDTSOptions {\n /** Module name for ambient declarations (omit for module-mode .d.ts) */\n moduleName?: string\n}\n\n/** Info about a name detected as exported */\ninterface ExportInfo {\n exported: boolean\n isDefault: boolean\n}\n\n/**\n * Detect which top-level names are exported in the source.\n *\n * Returns a map of name → { exported, isDefault }.\n * Scans the original TJS source for export keywords.\n */\nfunction detectExports(source: string): Map<string, ExportInfo> {\n const result = new Map<string, ExportInfo>()\n let m\n\n // export function name / export default function name\n const funcRe = /^[ \\t]*export\\s+(default\\s+)?function\\s+(\\w+)/gm\n while ((m = funcRe.exec(source)) !== null) {\n result.set(m[2], { exported: true, isDefault: !!m[1] })\n }\n\n // export class name / export default class name\n const classRe = /^[ \\t]*export\\s+(default\\s+)?class\\s+(\\w+)/gm\n while ((m = classRe.exec(source)) !== null) {\n result.set(m[2], { exported: true, isDefault: !!m[1] })\n }\n\n // export const/let/var name\n const varRe = /^[ \\t]*export\\s+(default\\s+)?(?:const|let|var)\\s+(\\w+)/gm\n while ((m = varRe.exec(source)) !== null) {\n result.set(m[2], { exported: true, isDefault: !!m[1] })\n }\n\n // export Type Name\n const typeRe = /^[ \\t]*export\\s+Type\\s+(\\w+)/gm\n while ((m = typeRe.exec(source)) !== null) {\n result.set(m[1], { exported: true, isDefault: false })\n }\n\n // export Generic Name<...>\n const genericRe = /^[ \\t]*export\\s+Generic\\s+(\\w+)/gm\n while ((m = genericRe.exec(source)) !== null) {\n result.set(m[1], { exported: true, isDefault: false })\n }\n\n // export FunctionPredicate Name\n const fpRe = /^[ \\t]*export\\s+FunctionPredicate\\s+(\\w+)/gm\n while ((m = fpRe.exec(source)) !== null) {\n result.set(m[1], { exported: true, isDefault: false })\n }\n\n // export { Name, Name2, ... } — re-export form\n const reExportRe = /^[ \\t]*export\\s*\\{([^}]+)\\}/gm\n while ((m = reExportRe.exec(source)) !== null) {\n const names = m[1].split(',').map((s) => s.trim().split(/\\s+as\\s+/))\n for (const parts of names) {\n const exportedName = parts.length > 1 ? parts[1] : parts[0]\n if (exportedName && /^\\w+$/.test(exportedName)) {\n result.set(exportedName, { exported: true, isDefault: false })\n }\n }\n }\n\n return result\n}\n\n/** Info about a FunctionPredicate declaration */\ninterface FunctionPredicateInfo {\n params: { name: string; example: string }[]\n returns?: string\n}\n\n/** Detect FunctionPredicate declarations and extract their param/return specs */\nfunction detectFunctionPredicates(\n source: string\n): Map<string, FunctionPredicateInfo> {\n const result = new Map<string, FunctionPredicateInfo>()\n\n // Block form: FunctionPredicate Name { params: { ... } returns: ... }\n const blockRe = /^[ \\t]*(?:export\\s+)?FunctionPredicate\\s+(\\w+)\\s*\\{/gm\n let m\n while ((m = blockRe.exec(source)) !== null) {\n const name = m[1]\n const blockStart = m.index + m[0].length - 1\n\n // Find matching closing brace\n let depth = 1\n let i = blockStart + 1\n while (i < source.length && depth > 0) {\n if (source[i] === '{') depth++\n else if (source[i] === '}') depth--\n i++\n }\n const body = source.slice(blockStart + 1, i - 1)\n\n // Extract params object: params: { key: value, ... }\n const params: FunctionPredicateInfo['params'] = []\n const paramsMatch = body.match(/params\\s*:\\s*\\{([^}]*)\\}/)\n if (paramsMatch) {\n const paramsStr = paramsMatch[1]\n const paramEntries = splitParams(paramsStr)\n for (const entry of paramEntries) {\n const kv = entry.match(/^(\\w+)\\s*:\\s*(.+)$/)\n if (kv) {\n params.push({ name: kv[1], example: kv[2].trim() })\n }\n }\n }\n\n // Extract returns value\n let returns: string | undefined\n const returnsMatch = body.match(/returns\\s*:\\s*(.+?)(?:\\n|$)/)\n if (returnsMatch) {\n returns = returnsMatch[1].trim()\n }\n\n result.set(name, { params, returns })\n }\n\n return result\n}\n\n/** Info about a class extracted from source */\ninterface ClassInfo {\n name: string\n constructorParams: string // raw param string, e.g. \"x: 0.0, y: 0.0\"\n methods: { name: string; params: string; returnType: string | null }[]\n}\n\n/**\n * Detect class declarations and extract constructor param names/types.\n * Scans original TJS source (before preprocessing).\n */\nfunction detectClasses(source: string): Map<string, ClassInfo> {\n const result = new Map<string, ClassInfo>()\n\n // Find class declarations\n const classRe =\n /^[ \\t]*(?:export\\s+(?:default\\s+)?)?class\\s+(\\w+)(?:\\s+extends\\s+\\w+)?\\s*\\{/gm\n let m\n while ((m = classRe.exec(source)) !== null) {\n const className = m[1]\n const classBodyStart = m.index + m[0].length - 1\n\n // Find matching closing brace\n let depth = 1\n let i = classBodyStart + 1\n while (i < source.length && depth > 0) {\n if (source[i] === '{') depth++\n else if (source[i] === '}') depth--\n i++\n }\n const classBody = source.slice(classBodyStart + 1, i - 1)\n\n // Extract constructor params (handle nested parens/braces in param types)\n const ctorStart = classBody.indexOf('constructor')\n let ctorParams = ''\n if (ctorStart !== -1) {\n const parenStart = classBody.indexOf('(', ctorStart)\n if (parenStart !== -1) {\n let depth = 1\n let j = parenStart + 1\n while (j < classBody.length && depth > 0) {\n if (classBody[j] === '(') depth++\n else if (classBody[j] === ')') depth--\n j++\n }\n ctorParams = classBody.slice(parenStart + 1, j - 1).trim()\n }\n }\n\n // Extract methods (name followed by parens, not constructor/get/set)\n const methods: ClassInfo['methods'] = []\n const methodStartRe = /^\\s+(\\w+)\\s*\\(/gm\n let mm\n while ((mm = methodStartRe.exec(classBody)) !== null) {\n const name = mm[1]\n if (name === 'constructor' || name === 'get' || name === 'set') continue\n\n // Find matching close paren (handles nested braces in params)\n const parenStart = mm.index + mm[0].length - 1\n let depth = 1\n let j = parenStart + 1\n while (j < classBody.length && depth > 0) {\n if (classBody[j] === '(') depth++\n else if (classBody[j] === ')') depth--\n j++\n }\n const params = classBody.slice(parenStart + 1, j - 1).trim()\n\n // Check for return type annotation: -> Type\n const afterParen = classBody.slice(j).match(/^\\s*->\\s*(.+?)\\s*\\{/)\n const returnType = afterParen ? afterParen[1].trim() : null\n\n methods.push({ name, params, returnType })\n }\n\n result.set(className, {\n name: className,\n constructorParams: ctorParams,\n methods,\n })\n }\n\n return result\n}\n\n/**\n * Split a param string on commas, respecting nested braces/brackets.\n * \"x: 0.0, y: { a: 1, b: 2 }\" → [\"x: 0.0\", \"y: { a: 1, b: 2 }\"]\n */\nfunction splitParams(paramStr: string): string[] {\n const result: string[] = []\n let depth = 0\n let current = ''\n for (const ch of paramStr) {\n if (ch === '{' || ch === '[' || ch === '(') depth++\n else if (ch === '}' || ch === ']' || ch === ')') depth--\n\n if (ch === ',' && depth === 0) {\n result.push(current.trim())\n current = ''\n } else {\n current += ch\n }\n }\n if (current.trim()) result.push(current.trim())\n return result\n}\n\n/**\n * Parse a TJS constructor/method param string into TS param declarations.\n * Input: \"x: 0.0, y: 0.0\" or \"name: '', age: 0\"\n * Output: \"x: number, y: number\" or \"name: string, age: number\"\n *\n * Uses `any` for anything we can't confidently parse.\n */\nfunction tjsParamsToTS(paramStr: string): string {\n if (!paramStr.trim()) return ''\n\n return splitParams(paramStr)\n .map((trimmed) => {\n // name: value (required) or name = value (optional)\n const colonMatch = trimmed.match(/^(\\w+)\\s*:\\s*(.+)$/)\n if (colonMatch) {\n const name = colonMatch[1]\n const tsType = inferTSTypeFromExample(colonMatch[2].trim())\n return `${name}: ${tsType}`\n }\n const eqMatch = trimmed.match(/^(\\w+)\\s*=\\s*(.+)$/)\n if (eqMatch) {\n const name = eqMatch[1]\n const tsType = inferTSTypeFromExample(eqMatch[2].trim())\n return `${name}?: ${tsType}`\n }\n // Destructured or complex — fall back to any\n if (trimmed.startsWith('{')) return `options: any`\n return `${trimmed}: any`\n })\n .join(', ')\n}\n\n/** Detect Type declarations and their example values */\nfunction detectTypeDeclarations(source: string): Map<string, string> {\n const result = new Map<string, string>()\n let m\n\n // Type Name = <value> (assignment form)\n const assignRe = /^[ \\t]*(?:export\\s+)?Type\\s+(\\w+)\\s*=\\s*(.+)$/gm\n while ((m = assignRe.exec(source)) !== null) {\n result.set(m[1], m[2].trim())\n }\n\n // Type Name <value> (simple form, not block)\n const simpleRe = /^[ \\t]*(?:export\\s+)?Type\\s+(\\w+)\\s+([^{=].*)$/gm\n while ((m = simpleRe.exec(source)) !== null) {\n if (!result.has(m[1])) {\n result.set(m[1], m[2].trim())\n }\n }\n\n // Block: Type Name { ... example: <value> ... }\n const blockRe =\n /^[ \\t]*(?:export\\s+)?Type\\s+(\\w+)\\s*\\{[^}]*example\\s*:\\s*(.+?)(?:\\n|\\s*[,}])/gm\n while ((m = blockRe.exec(source)) !== null) {\n result.set(m[1], m[2].trim())\n }\n\n return result\n}\n\n/** Info about a Generic declaration */\ninterface GenericInfo {\n typeParams: string[]\n /** Raw TypeScript content from `declaration { ... }` block, if present */\n declaration?: string\n}\n\n/** Detect Generic declarations, their type params, and optional declaration blocks */\nfunction detectGenerics(source: string): Map<string, GenericInfo> {\n const result = new Map<string, GenericInfo>()\n const re = /^[ \\t]*(?:export\\s+)?Generic\\s+(\\w+)\\s*<([^>]+)>\\s*\\{/gm\n let m\n while ((m = re.exec(source)) !== null) {\n const name = m[1]\n const typeParams = m[2].split(',').map((tp) => {\n return tp.trim().split(/\\s*=/)[0].trim()\n })\n\n // Find the full Generic block body via brace matching\n const blockStart = m.index + m[0].length - 1\n let depth = 1\n let i = blockStart + 1\n while (i < source.length && depth > 0) {\n if (source[i] === '{') depth++\n else if (source[i] === '}') depth--\n i++\n }\n const blockBody = source.slice(blockStart + 1, i - 1)\n\n // Look for declaration { ... } within the block body\n let declaration: string | undefined\n const declMatch = blockBody.match(/\\bdeclaration\\s*\\{/)\n if (declMatch && declMatch.index !== undefined) {\n const declStart = declMatch.index + declMatch[0].length - 1\n let dDepth = 1\n let j = declStart + 1\n while (j < blockBody.length && dDepth > 0) {\n if (blockBody[j] === '{') dDepth++\n else if (blockBody[j] === '}') dDepth--\n j++\n }\n declaration = blockBody.slice(declStart + 1, j - 1).trim()\n }\n\n result.set(name, { typeParams, declaration })\n }\n return result\n}\n\n/**\n * Generate a .d.ts string from TJS transpilation output.\n *\n * @param result - The TJSTranspileResult from tjs()\n * @param source - The original TJS source (needed to detect exports)\n * @param options - Generation options\n * @returns The .d.ts file content as a string\n */\nexport function generateDTS(\n result: TJSTranspileResult,\n source: string,\n options: GenerateDTSOptions = {}\n): string {\n const lines: string[] = []\n const exports = detectExports(source)\n const typeDecls = detectTypeDeclarations(source)\n const classes = detectClasses(source)\n const generics = detectGenerics(source)\n\n // If no exports detected, treat all top-level declarations as exported\n // (CommonJS / script-mode files)\n const hasAnyExport = exports.size > 0\n\n // Track names we've already emitted\n const emitted = new Set<string>()\n\n // Emit function declarations (from transpiler metadata — best type info)\n for (const [name, info] of Object.entries(result.types)) {\n // Skip polymorphic variants (name$0, name$1, etc.)\n if (name.includes('$')) continue\n\n const exportInfo = exports.get(name)\n const isExported = hasAnyExport ? !!exportInfo?.exported : true\n const isDefault = exportInfo?.isDefault ?? false\n\n if (!isExported) continue\n\n if (info.description) {\n lines.push(`/** ${info.description} */`)\n }\n\n lines.push(functionDeclToTS(name, info, true, isDefault))\n emitted.add(name)\n }\n\n // Emit class declarations as callable functions returning any.\n // TJS wraps classes to be callable without `new`, so this matches\n // the actual runtime API. Returning `any` means TS won't fight\n // the developer on instance property access.\n for (const [name, classInfo] of classes) {\n if (emitted.has(name)) continue\n\n const exportInfo = exports.get(name)\n const isExported = hasAnyExport ? !!exportInfo?.exported : true\n if (!isExported) continue\n\n const tsParams = classInfo.constructorParams\n ? tjsParamsToTS(classInfo.constructorParams)\n : ''\n\n // Emit as callable function (matches TJS wrapClass behavior)\n lines.push(`export declare function ${name}(${tsParams}): any;`)\n\n // Also emit as a class with `new` for the rare case someone uses it\n if (tsParams || classInfo.methods.length > 0) {\n lines.push(`export declare class ${name} {`)\n if (classInfo.constructorParams) {\n lines.push(` constructor(${tsParams});`)\n }\n for (const method of classInfo.methods) {\n const mParams = method.params ? tjsParamsToTS(method.params) : ''\n lines.push(` ${method.name}(${mParams}): any;`)\n }\n lines.push(`}`)\n }\n\n emitted.add(name)\n }\n\n // Emit Type declarations as type guard functions.\n // Type('Name', example) returns an object with .check(), .default, etc.\n // For TS consumers, the useful thing is knowing it's a callable type guard.\n for (const [name, exampleStr] of typeDecls) {\n if (emitted.has(name)) continue\n\n const exportInfo = exports.get(name)\n const isExported = hasAnyExport ? !!exportInfo?.exported : true\n if (!isExported) continue\n\n const tsType = inferTSTypeFromExample(exampleStr)\n lines.push(\n `export declare const ${name}: {` +\n ` check(value: any): boolean;` +\n ` default: ${tsType};` +\n ` (value: any): boolean;` +\n ` };`\n )\n emitted.add(name)\n }\n\n // Emit Generic declarations.\n // If a declaration block is present, emit a proper TS interface.\n // Otherwise, emit an any-based factory stub.\n for (const [name, info] of generics) {\n if (emitted.has(name)) continue\n\n const exportInfo = exports.get(name)\n const isExported = hasAnyExport ? !!exportInfo?.exported : true\n if (!isExported) continue\n\n const typeParamStr =\n info.typeParams.length > 0 ? `<${info.typeParams.join(', ')}>` : ''\n\n if (info.declaration) {\n // Emit a proper TypeScript interface from the declaration block\n const declLines = info.declaration\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .map((l) => ` ${l}`)\n .join('\\n')\n lines.push(`export interface ${name}${typeParamStr} {\\n${declLines}\\n}`)\n } else {\n // No declaration block — emit any-based factory stub\n lines.push(\n `export declare function ${name}(` +\n `...args: any[]` +\n `): { check(value: any): boolean; (value: any): boolean; };`\n )\n }\n emitted.add(name)\n }\n\n // Emit FunctionPredicate declarations as TS function types.\n // FunctionPredicate Callback { params: { x: 0 } returns: '' }\n // → export type Callback = (x: number) => string;\n const funcPreds = detectFunctionPredicates(source)\n for (const [name, fpInfo] of funcPreds) {\n if (emitted.has(name)) continue\n\n const exportInfo = exports.get(name)\n const isExported = hasAnyExport ? !!exportInfo?.exported : true\n if (!isExported) continue\n\n const tsParams = fpInfo.params\n .map((p) => `${p.name}: ${inferTSTypeFromExample(p.example)}`)\n .join(', ')\n const tsReturn =\n fpInfo.returns !== undefined\n ? inferTSTypeFromExample(fpInfo.returns)\n : 'void'\n lines.push(`export type ${name} = (${tsParams}) => ${tsReturn};`)\n emitted.add(name)\n }\n\n if (options.moduleName) {\n const indented = lines.map((l) => ` ${l}`).join('\\n')\n return `declare module '${options.moduleName}' {\\n${indented}\\n}\\n`\n }\n\n return lines.join('\\n') + '\\n'\n}\n\n/**\n * Best-effort TS type inference from an example value string.\n * Used for Type declarations and constructor params where we only\n * have the raw source text, not a parsed TypeDescriptor.\n */\nfunction inferTSTypeFromExample(example: string): string {\n const s = example.trim()\n\n // Unions first: \"'' | 0 | null\" → \"string | number | null\"\n // Only split on | that's outside quotes/braces/brackets\n if (hasTopLevelPipe(s)) {\n const members = splitOnPipe(s).map((m) => inferTSTypeFromExample(m.trim()))\n return [...new Set(members)].join(' | ')\n }\n\n // String literals\n if (/^['\"]/.test(s)) return 'string'\n\n // Boolean\n if (s === 'true' || s === 'false') return 'boolean'\n\n // Null / undefined\n if (s === 'null') return 'null'\n if (s === 'undefined') return 'undefined'\n\n // Numbers\n if (/^[+-]?\\d+\\.\\d+$/.test(s)) return 'number'\n if (/^[+-]?\\d+$/.test(s)) return 'number'\n\n // Arrays\n if (s.startsWith('[')) return 'any[]'\n\n // Objects\n if (s.startsWith('{')) return 'Record<string, any>'\n\n return 'any'\n}\n\n/** Check if a string has a top-level | (not inside quotes/braces) */\nfunction hasTopLevelPipe(s: string): boolean {\n let depth = 0\n let inStr: string | null = null\n for (const ch of s) {\n if (inStr) {\n if (ch === inStr) inStr = null\n continue\n }\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n inStr = ch\n continue\n }\n if (ch === '{' || ch === '[' || ch === '(') depth++\n else if (ch === '}' || ch === ']' || ch === ')') depth--\n else if (ch === '|' && depth === 0) return true\n }\n return false\n}\n\n/** Split on top-level | characters */\nfunction splitOnPipe(s: string): string[] {\n const result: string[] = []\n let depth = 0\n let inStr: string | null = null\n let current = ''\n for (const ch of s) {\n if (inStr) {\n current += ch\n if (ch === inStr) inStr = null\n continue\n }\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n inStr = ch\n current += ch\n continue\n }\n if (ch === '{' || ch === '[' || ch === '(') depth++\n else if (ch === '}' || ch === ']' || ch === ')') depth--\n\n if (ch === '|' && depth === 0) {\n result.push(current)\n current = ''\n } else {\n current += ch\n }\n }\n if (current) result.push(current)\n return result\n}\n",
|
|
18
|
+
"/**\n * TypeScript to TJS Transpiler\n *\n * Converts TypeScript source to TJS (or directly to JS + metadata).\n *\n * Two modes:\n * 1. TS → TJS (for inspection/migration)\n * 2. TS → JS + __tjs metadata (for production)\n *\n * @example\n * ```typescript\n * // Input TypeScript:\n * function greet(name: string, age?: number): string {\n * return `Hello, ${name}!`\n * }\n *\n * // Output TJS:\n * function greet(name: '', age = 0) -> '' {\n * return `Hello, ${name}!`\n * }\n *\n * // Output JS + metadata:\n * function greet(name, age) {\n * return `Hello, ${name}!`\n * }\n * greet.__tjs = {\n * params: { name: { type: 'string', required: true }, age: { type: 'number', required: false } },\n * returns: { type: 'string' }\n * }\n * ```\n */\n\nimport ts from 'typescript'\nimport { emitClassWrapper } from '../runtime'\n\nexport interface FromTSOptions {\n /** Emit TJS intermediate instead of JS + metadata */\n emitTJS?: boolean\n /** Include sourcemap */\n sourceMap?: boolean\n /** Filename for error messages */\n filename?: string\n}\n\nexport interface FromTSResult {\n /** The transpiled code (TJS or JS depending on options) */\n code: string\n /** Function type metadata (only when emitting JS) */\n types?: Record<string, FunctionTypeInfo>\n /** Class type metadata (only when emitting JS) */\n classes?: Record<string, ClassTypeInfo>\n /** Any warnings during transpilation */\n warnings?: string[]\n}\n\nexport interface TypeParamInfo {\n /** Constraint schema (from `extends`) - example-based */\n constraint?: string | Record<string, any>\n /** Default schema (from `= Type`) - example-based */\n default?: string | Record<string, any>\n}\n\nexport interface FunctionTypeInfo {\n name: string\n params: Record<string, ParamTypeInfo>\n returns?: TypeInfo\n description?: string\n /** Generic type parameters with constraints/defaults */\n typeParams?: Record<string, TypeParamInfo>\n /** Overload signatures (when function has TS overloads) */\n overloads?: FunctionTypeInfo[]\n}\n\nexport interface ClassTypeInfo {\n name: string\n /** Constructor parameters - also serves as the type shape */\n constructor?: {\n params: Record<string, ParamTypeInfo>\n }\n /** Instance methods */\n methods: Record<string, FunctionTypeInfo>\n /** Static methods */\n staticMethods: Record<string, FunctionTypeInfo>\n /** Generic type parameters */\n typeParams?: Record<string, TypeParamInfo>\n}\n\nexport interface ParamTypeInfo {\n type: TypeInfo\n required: boolean\n default?: any\n description?: string\n}\n\nexport interface TypeInfo {\n kind:\n | 'string'\n | 'number'\n | 'boolean'\n | 'null'\n | 'undefined'\n | 'array'\n | 'tuple'\n | 'object'\n | 'union'\n | 'any'\n items?: TypeInfo\n /** For tuples: element types in order */\n elements?: TypeInfo[]\n shape?: Record<string, TypeInfo>\n members?: TypeInfo[]\n nullable?: boolean\n}\n\n/** Context for type resolution */\ninterface TypeResolutionContext {\n typeAliases?: Map<string, ts.TypeNode>\n interfaces?: Map<string, ts.InterfaceDeclaration>\n sourceFile?: ts.SourceFile\n warnings?: string[]\n /** Track visited types to prevent infinite recursion */\n visited?: Set<string>\n /** Type parameter constraints and defaults from enclosing generic function/class */\n typeParams?: Map<string, { constraint?: ts.TypeNode; default?: ts.TypeNode }>\n}\n\n/**\n * DOM interface types — not constructible but common in TS signatures.\n * Map to {} (opaque object) so params stay annotated and required\n * rather than degrading to bare names.\n */\nconst domInterfaceTypes = new Set([\n // Events\n 'Event',\n 'CustomEvent',\n 'MouseEvent',\n 'KeyboardEvent',\n 'PointerEvent',\n 'TouchEvent',\n 'FocusEvent',\n 'InputEvent',\n 'CompositionEvent',\n 'WheelEvent',\n 'DragEvent',\n 'AnimationEvent',\n 'TransitionEvent',\n 'ClipboardEvent',\n 'UIEvent',\n 'ProgressEvent',\n 'ErrorEvent',\n 'MessageEvent',\n 'PopStateEvent',\n 'HashChangeEvent',\n 'PageTransitionEvent',\n 'StorageEvent',\n 'BeforeUnloadEvent',\n 'SubmitEvent',\n // Event targets / misc\n 'EventTarget',\n 'EventListener',\n // Nodes\n 'Node',\n 'Element',\n 'HTMLElement',\n 'SVGElement',\n 'Document',\n 'DocumentFragment',\n 'ShadowRoot',\n 'Text',\n 'Comment',\n 'Attr',\n // Specific HTML elements\n 'HTMLInputElement',\n 'HTMLTextAreaElement',\n 'HTMLSelectElement',\n 'HTMLButtonElement',\n 'HTMLFormElement',\n 'HTMLAnchorElement',\n 'HTMLImageElement',\n 'HTMLVideoElement',\n 'HTMLAudioElement',\n 'HTMLCanvasElement',\n 'HTMLDivElement',\n 'HTMLSpanElement',\n 'HTMLParagraphElement',\n 'HTMLTableElement',\n 'HTMLTemplateElement',\n 'HTMLSlotElement',\n 'HTMLDialogElement',\n 'HTMLDetailsElement',\n 'HTMLLabelElement',\n 'HTMLOptionElement',\n 'HTMLIFrameElement',\n 'HTMLScriptElement',\n 'HTMLStyleElement',\n 'HTMLLinkElement',\n 'HTMLMetaElement',\n 'HTMLHeadElement',\n 'HTMLBodyElement',\n 'HTMLMediaElement',\n // SVG elements\n 'SVGSVGElement',\n 'SVGPathElement',\n 'SVGGElement',\n 'SVGCircleElement',\n 'SVGRectElement',\n 'SVGTextElement',\n 'SVGLineElement',\n 'SVGPolygonElement',\n // Collections / lists\n 'NodeList',\n 'HTMLCollection',\n 'NamedNodeMap',\n 'DOMTokenList',\n 'DOMStringMap',\n 'CSSStyleDeclaration',\n 'DOMRect',\n 'DOMRectReadOnly',\n 'DOMPoint',\n 'DOMMatrix',\n // Ranges / selection\n 'Range',\n 'Selection',\n 'StaticRange',\n // Observers\n 'MutationObserver',\n 'MutationRecord',\n 'IntersectionObserver',\n 'IntersectionObserverEntry',\n 'ResizeObserver',\n 'ResizeObserverEntry',\n 'PerformanceObserver',\n 'PerformanceEntry',\n // Window / global\n 'Window',\n 'Location',\n 'History',\n 'Navigator',\n 'Screen',\n 'Storage',\n // Canvas / media\n 'CanvasRenderingContext2D',\n 'WebGLRenderingContext',\n 'WebGL2RenderingContext',\n 'OffscreenCanvas',\n 'ImageData',\n 'ImageBitmap',\n 'MediaStream',\n 'MediaRecorder',\n 'AudioContext',\n 'AudioNode',\n 'AudioBuffer',\n // Workers / messaging\n 'Worker',\n 'SharedWorker',\n 'ServiceWorker',\n 'ServiceWorkerRegistration',\n 'BroadcastChannel',\n 'MessageChannel',\n 'MessagePort',\n // Other Web APIs\n 'WebSocket',\n 'XMLHttpRequest',\n 'FileReader',\n 'FileList',\n 'DataTransfer',\n 'Crypto',\n 'SubtleCrypto',\n 'CryptoKey',\n 'Geolocation',\n 'Notification',\n 'PermissionStatus',\n 'MediaQueryList',\n 'TreeWalker',\n 'NodeIterator',\n 'ClipboardItem',\n])\n\n/**\n * Convert a TypeScript type node to a TJS example value string\n *\n * @param warnings - Optional array to collect warnings about generic types\n */\nfunction typeToExample(\n type: ts.TypeNode | undefined,\n checker?: ts.TypeChecker,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): string {\n if (!type) return 'undefined'\n\n switch (type.kind) {\n case ts.SyntaxKind.StringKeyword:\n return \"''\"\n case ts.SyntaxKind.NumberKeyword:\n return '0.0'\n case ts.SyntaxKind.BooleanKeyword:\n return 'false'\n case ts.SyntaxKind.NullKeyword:\n return 'null'\n case ts.SyntaxKind.UndefinedKeyword:\n return 'undefined'\n case ts.SyntaxKind.VoidKeyword:\n return 'undefined'\n case ts.SyntaxKind.AnyKeyword:\n // For function params we use 'any', for object props we use 'null'\n return 'any'\n case ts.SyntaxKind.UnknownKeyword:\n return 'any'\n case ts.SyntaxKind.NeverKeyword:\n return 'null'\n case ts.SyntaxKind.SymbolKeyword:\n return \"Symbol('example')\"\n case ts.SyntaxKind.BigIntKeyword:\n return '0n'\n case ts.SyntaxKind.ObjectKeyword:\n return '{}'\n\n case ts.SyntaxKind.ArrayType: {\n const arrayType = type as ts.ArrayTypeNode\n let itemExample = typeToExample(arrayType.elementType, checker)\n // 'any' is not a valid literal value - use null for array items\n if (itemExample === 'any') itemExample = 'null'\n return `[${itemExample}]`\n }\n\n case ts.SyntaxKind.TypeReference: {\n const typeRef = type as ts.TypeReferenceNode\n const typeName = typeRef.typeName.getText()\n\n // Handle common generic types\n if (typeName === 'Array' && typeRef.typeArguments?.length) {\n const itemExample = typeToExample(\n typeRef.typeArguments[0],\n checker,\n warnings,\n ctx\n )\n return `[${itemExample}]`\n }\n if (typeName === 'Promise') {\n // Unwrap Promise type\n if (typeRef.typeArguments?.length) {\n return typeToExample(typeRef.typeArguments[0], checker, warnings, ctx)\n }\n return 'undefined'\n }\n if (\n typeName === 'Generator' ||\n typeName === 'AsyncGenerator' ||\n typeName === 'IterableIterator' ||\n typeName === 'AsyncIterableIterator'\n ) {\n // Unwrap to yield type (first type argument)\n if (typeRef.typeArguments?.length) {\n return typeToExample(typeRef.typeArguments[0], checker, warnings, ctx)\n }\n return 'undefined'\n }\n if (typeName === 'Record') {\n return '{}'\n }\n\n // Built-in constructible types — valid JS expressions as examples\n const builtinExamples: Record<string, string> = {\n // Collections\n Map: 'new Map()',\n Set: 'new Set()',\n WeakMap: 'new WeakMap()',\n WeakSet: 'new WeakSet()',\n WeakRef: 'new WeakRef({})',\n // Errors\n Error: \"new Error('example')\",\n TypeError: \"new TypeError('example')\",\n RangeError: \"new RangeError('example')\",\n SyntaxError: \"new SyntaxError('example')\",\n ReferenceError: \"new ReferenceError('example')\",\n URIError: \"new URIError('example')\",\n EvalError: \"new EvalError('example')\",\n // Date/Regex\n Date: 'new Date()',\n RegExp: '/example/',\n // Binary / WASM\n ArrayBuffer: 'new ArrayBuffer(0)',\n SharedArrayBuffer: 'new SharedArrayBuffer(0)',\n DataView: 'new DataView(new ArrayBuffer(0))',\n Float32Array: 'new Float32Array(0)',\n Float64Array: 'new Float64Array(0)',\n Int8Array: 'new Int8Array(0)',\n Int16Array: 'new Int16Array(0)',\n Int32Array: 'new Int32Array(0)',\n Uint8Array: 'new Uint8Array(0)',\n Uint16Array: 'new Uint16Array(0)',\n Uint32Array: 'new Uint32Array(0)',\n Uint8ClampedArray: 'new Uint8ClampedArray(0)',\n BigInt64Array: 'new BigInt64Array(0)',\n BigUint64Array: 'new BigUint64Array(0)',\n // Web APIs (constructible)\n URL: \"new URL('https://example.com')\",\n URLSearchParams: 'new URLSearchParams()',\n Headers: 'new Headers()',\n FormData: 'new FormData()',\n Blob: 'new Blob()',\n File: \"new File([], 'example')\",\n Response: 'new Response()',\n Request: \"new Request('https://example.com')\",\n AbortController: 'new AbortController()',\n AbortSignal: 'AbortSignal.abort()',\n // Streams\n ReadableStream: 'new ReadableStream()',\n WritableStream: 'new WritableStream()',\n TransformStream: 'new TransformStream()',\n // Structured data\n TextEncoder: 'new TextEncoder()',\n TextDecoder: 'new TextDecoder()',\n // Promises\n Promise: 'Promise.resolve(null)',\n }\n\n if (typeName in builtinExamples) {\n return builtinExamples[typeName]\n }\n\n // Resolve type aliases\n if (ctx?.typeAliases?.has(typeName)) {\n // Prevent infinite recursion\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n warnings?.push(`Circular type reference '${typeName}' - using 'any'`)\n return 'any'\n }\n visited.add(typeName)\n const resolvedType = ctx.typeAliases.get(typeName)!\n return typeToExample(resolvedType, checker, warnings, {\n ...ctx,\n visited,\n })\n }\n\n // Resolve interfaces\n if (ctx?.interfaces?.has(typeName)) {\n // Prevent infinite recursion\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n warnings?.push(`Circular type reference '${typeName}' - using 'any'`)\n return 'any'\n }\n visited.add(typeName)\n const iface = ctx.interfaces.get(typeName)!\n // Build example object from interface members\n const props: string[] = []\n for (const member of iface.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(ctx.sourceFile)\n const propExample = typeToExample(member.type, checker, warnings, {\n ...ctx,\n visited,\n })\n // Always use : for object shape properties — = is only valid\n // in destructuring patterns, not in object literal examples\n props.push(`${propName}: ${propExample}`)\n }\n }\n return `{ ${props.join(', ')} }`\n }\n\n // Type parameters (generics like T, K, V)\n // Check if we have constraint or default info from enclosing context\n if (ctx?.typeParams?.has(typeName)) {\n const tp = ctx.typeParams.get(typeName)!\n if (tp.constraint) {\n return typeToExample(tp.constraint, checker, warnings, ctx)\n }\n if (tp.default) {\n return typeToExample(tp.default, checker, warnings, ctx)\n }\n // No constraint or default — fall through to 'any'\n }\n\n // DOM interface types — opaque objects, keep params annotated\n if (domInterfaceTypes.has(typeName)) {\n return '{}'\n }\n\n // Single uppercase letter or common generic names — treat as any\n if (\n /^[A-Z]$/.test(typeName) ||\n ['T', 'K', 'V', 'U', 'TKey', 'TValue', 'TItem', 'TResult'].includes(\n typeName\n )\n ) {\n warnings?.push(\n `Generic type parameter '${typeName}' converted to 'any' - consider specializing`\n )\n return 'any'\n }\n // Unknown type reference - treat as any\n warnings?.push(\n `Unknown type '${typeName}' converted to 'any' - may need manual review`\n )\n return 'any'\n }\n\n case ts.SyntaxKind.TypeLiteral: {\n const typeLiteral = type as ts.TypeLiteralNode\n const props: string[] = []\n for (const member of typeLiteral.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText()\n let propType = typeToExample(member.type, checker)\n // 'any' is not a valid literal value - use null for object properties\n if (propType === 'any') propType = 'null'\n // In object literals, always use : syntax (= is for function params only)\n props.push(`${propName}: ${propType}`)\n }\n }\n return `{ ${props.join(', ')} }`\n }\n\n case ts.SyntaxKind.UnionType: {\n const unionType = type as ts.UnionTypeNode\n\n // Helper to check if a type is null or undefined\n const isNullType = (t: ts.TypeNode) =>\n t.kind === ts.SyntaxKind.NullKeyword ||\n (ts.isLiteralTypeNode(t) &&\n t.literal.kind === ts.SyntaxKind.NullKeyword)\n const isUndefinedType = (t: ts.TypeNode) =>\n t.kind === ts.SyntaxKind.UndefinedKeyword ||\n (ts.isLiteralTypeNode(t) &&\n t.literal.kind === ts.SyntaxKind.UndefinedKeyword)\n\n // Check for nullable: T | null or T | undefined\n const nonNullTypes = unionType.types.filter(\n (t) => !isNullType(t) && !isUndefinedType(t)\n )\n const hasNull = unionType.types.some(isNullType)\n const hasUndefined = unionType.types.some(isUndefinedType)\n\n // All null/undefined — just return the simplest form\n if (nonNullTypes.length === 0) {\n if (hasNull) return 'null'\n return 'undefined'\n }\n\n if (nonNullTypes.length === 1 && (hasNull || hasUndefined)) {\n // Nullable type: T | null -> T | null\n const baseExample = typeToExample(nonNullTypes[0], checker)\n if (hasNull) return `${baseExample} | null`\n if (hasUndefined) return `${baseExample} | undefined`\n }\n\n // General union: deduplicate and use first non-any type\n const examples = unionType.types\n .map((t) => typeToExample(t, checker))\n .filter((e, i, arr) => arr.indexOf(e) === i) // deduplicate\n if (examples.length === 1) return examples[0]\n if (examples.length > 0) return examples[0]\n return 'undefined'\n }\n\n case ts.SyntaxKind.LiteralType: {\n const literalType = type as ts.LiteralTypeNode\n if (ts.isStringLiteral(literalType.literal)) {\n return `'${literalType.literal.text}'`\n }\n if (ts.isNumericLiteral(literalType.literal)) {\n return literalType.literal.text\n }\n if (literalType.literal.kind === ts.SyntaxKind.TrueKeyword) {\n return 'true'\n }\n if (literalType.literal.kind === ts.SyntaxKind.FalseKeyword) {\n return 'false'\n }\n if (literalType.literal.kind === ts.SyntaxKind.NullKeyword) {\n return 'null'\n }\n return 'undefined'\n }\n\n case ts.SyntaxKind.ParenthesizedType: {\n const parenType = type as ts.ParenthesizedTypeNode\n return typeToExample(parenType.type, checker)\n }\n\n case ts.SyntaxKind.FunctionType: {\n // Convert to inline FunctionPredicate expression\n const funcType = type as ts.FunctionTypeNode\n const fpParams: string[] = []\n for (const param of funcType.parameters) {\n const name = param.name?.getText() || '_'\n if (name === 'this') continue\n let paramExample = typeToExample(param.type, checker, warnings, ctx)\n if (paramExample === 'any') paramExample = 'null'\n fpParams.push(`${name}: ${paramExample}`)\n }\n let fpReturn = typeToExample(funcType.type, checker, warnings, ctx)\n if (fpReturn === 'any') fpReturn = 'null'\n const spec: string[] = []\n if (fpParams.length > 0) spec.push(`params: { ${fpParams.join(', ')} }`)\n if (fpReturn !== 'undefined') spec.push(`returns: ${fpReturn}`)\n return `FunctionPredicate('function', { ${spec.join(', ')} })`\n }\n\n case ts.SyntaxKind.TupleType: {\n const tupleType = type as ts.TupleTypeNode\n const elements = tupleType.elements.map((e) => {\n const example = ts.isNamedTupleMember(e)\n ? typeToExample(e.type, checker)\n : typeToExample(e as ts.TypeNode, checker)\n // 'any' is not a valid literal value\n return example === 'any' ? 'null' : example\n })\n return `[${elements.join(', ')}]`\n }\n\n default:\n return 'undefined'\n }\n}\n\n/**\n * Convert TypeScript type to TypeInfo for metadata\n */\nfunction typeToInfo(\n type: ts.TypeNode | undefined,\n ctx?: TypeResolutionContext\n): TypeInfo {\n if (!type) return { kind: 'any' }\n\n switch (type.kind) {\n case ts.SyntaxKind.StringKeyword:\n return { kind: 'string' }\n case ts.SyntaxKind.NumberKeyword:\n return { kind: 'number' }\n case ts.SyntaxKind.BooleanKeyword:\n return { kind: 'boolean' }\n case ts.SyntaxKind.NullKeyword:\n return { kind: 'null' }\n case ts.SyntaxKind.UndefinedKeyword:\n case ts.SyntaxKind.VoidKeyword:\n return { kind: 'undefined' }\n\n case ts.SyntaxKind.ArrayType: {\n const arrayType = type as ts.ArrayTypeNode\n return { kind: 'array', items: typeToInfo(arrayType.elementType, ctx) }\n }\n\n case ts.SyntaxKind.TypeLiteral: {\n const typeLiteral = type as ts.TypeLiteralNode\n const shape: Record<string, TypeInfo> = {}\n for (const member of typeLiteral.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText()\n shape[propName] = typeToInfo(member.type, ctx)\n }\n }\n return { kind: 'object', shape }\n }\n\n case ts.SyntaxKind.UnionType: {\n const unionType = type as ts.UnionTypeNode\n const nonNullTypes = unionType.types.filter(\n (t) =>\n t.kind !== ts.SyntaxKind.NullKeyword &&\n t.kind !== ts.SyntaxKind.UndefinedKeyword\n )\n const hasNull = unionType.types.some(\n (t) => t.kind === ts.SyntaxKind.NullKeyword\n )\n\n if (nonNullTypes.length === 1 && hasNull) {\n return { ...typeToInfo(nonNullTypes[0], ctx), nullable: true }\n }\n\n return {\n kind: 'union',\n members: unionType.types.map((t) => typeToInfo(t, ctx)),\n }\n }\n\n case ts.SyntaxKind.IntersectionType: {\n const intersectionType = type as ts.IntersectionTypeNode\n // Flatten intersection into merged object shape\n const mergedShape: Record<string, TypeInfo> = {}\n for (const member of intersectionType.types) {\n const memberInfo = typeToInfo(member, ctx)\n if (memberInfo.kind === 'object' && memberInfo.shape) {\n Object.assign(mergedShape, memberInfo.shape)\n }\n }\n if (Object.keys(mergedShape).length > 0) {\n return { kind: 'object', shape: mergedShape }\n }\n // If no object shapes found, treat as any\n return { kind: 'any' }\n }\n\n case ts.SyntaxKind.TupleType: {\n const tupleType = type as ts.TupleTypeNode\n const elements: TypeInfo[] = []\n for (const element of tupleType.elements) {\n // Handle named tuple members: [x: number, y: string]\n if (ts.isNamedTupleMember(element)) {\n elements.push(typeToInfo(element.type, ctx))\n } else {\n elements.push(typeToInfo(element as ts.TypeNode, ctx))\n }\n }\n return { kind: 'tuple', elements }\n }\n\n case ts.SyntaxKind.TypeReference: {\n const typeRef = type as ts.TypeReferenceNode\n const typeName = typeRef.typeName.getText()\n if (typeName === 'Array' && typeRef.typeArguments?.length) {\n return {\n kind: 'array',\n items: typeToInfo(typeRef.typeArguments[0], ctx),\n }\n }\n if (typeName === 'Promise' && typeRef.typeArguments?.length) {\n return typeToInfo(typeRef.typeArguments[0], ctx)\n }\n if (\n (typeName === 'Generator' ||\n typeName === 'AsyncGenerator' ||\n typeName === 'IterableIterator' ||\n typeName === 'AsyncIterableIterator') &&\n typeRef.typeArguments?.length\n ) {\n return typeToInfo(typeRef.typeArguments[0], ctx)\n }\n\n // Handle utility types\n if (typeRef.typeArguments?.length) {\n const innerType = typeToInfo(typeRef.typeArguments[0], ctx)\n\n // Partial<T> - all properties become optional (we just return the shape)\n if (typeName === 'Partial') {\n return innerType\n }\n\n // Required<T> - all properties become required (we just return the shape)\n if (typeName === 'Required') {\n return innerType\n }\n\n // Readonly<T> - same shape, readonly is a compile-time concept\n if (typeName === 'Readonly') {\n return innerType\n }\n\n // Record<K, V> - object with string keys and V values\n if (typeName === 'Record' && typeRef.typeArguments.length >= 2) {\n const valueType = typeToInfo(typeRef.typeArguments[1], ctx)\n // Record is essentially an object with dynamic keys\n return { kind: 'object', shape: { '[key]': valueType } }\n }\n\n // Pick<T, K> and Omit<T, K> - just return the base type for now\n // Full implementation would need to filter properties\n if (typeName === 'Pick' || typeName === 'Omit') {\n return innerType\n }\n\n // NonNullable<T> - remove null/undefined\n if (typeName === 'NonNullable') {\n if (innerType.nullable) {\n return { ...innerType, nullable: false }\n }\n return innerType\n }\n\n // ReturnType<T>, Parameters<T>, etc. - complex, return any\n if (\n ['ReturnType', 'Parameters', 'ConstructorParameters'].includes(\n typeName\n )\n ) {\n return { kind: 'any' }\n }\n }\n\n // Resolve type aliases\n if (ctx?.typeAliases?.has(typeName)) {\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n return { kind: 'any' } // Circular reference\n }\n visited.add(typeName)\n const resolvedType = ctx.typeAliases.get(typeName)!\n return typeToInfo(resolvedType, { ...ctx, visited })\n }\n\n // Resolve interfaces\n if (ctx?.interfaces?.has(typeName)) {\n const visited = ctx.visited ?? new Set<string>()\n if (visited.has(typeName)) {\n return { kind: 'any' } // Circular reference\n }\n visited.add(typeName)\n const iface = ctx.interfaces.get(typeName)!\n const shape: Record<string, TypeInfo> = {}\n\n // Handle extends clauses - merge in base interface properties\n if (iface.heritageClauses) {\n for (const clause of iface.heritageClauses) {\n if (clause.token === ts.SyntaxKind.ExtendsKeyword) {\n for (const baseType of clause.types) {\n const baseName = baseType.expression.getText(ctx.sourceFile)\n // Look up the base interface and recursively resolve it\n if (ctx.interfaces?.has(baseName) && !visited.has(baseName)) {\n // Create a synthetic type reference node to look up the base\n const syntheticRef = {\n kind: ts.SyntaxKind.TypeReference,\n typeName: { getText: () => baseName },\n } as unknown as ts.TypeReferenceNode\n const baseInfo = typeToInfo(syntheticRef, { ...ctx, visited })\n if (baseInfo.kind === 'object' && baseInfo.shape) {\n Object.assign(shape, baseInfo.shape)\n }\n }\n }\n }\n }\n }\n\n // Add own members (may override base)\n for (const member of iface.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(ctx.sourceFile)\n shape[propName] = typeToInfo(member.type, { ...ctx, visited })\n }\n }\n return { kind: 'object', shape }\n }\n\n // Check type parameter constraints/defaults from enclosing context\n if (ctx?.typeParams?.has(typeName)) {\n const tp = ctx.typeParams.get(typeName)!\n if (tp.constraint) {\n return typeToInfo(tp.constraint, ctx)\n }\n if (tp.default) {\n return typeToInfo(tp.default, ctx)\n }\n }\n\n // DOM interface types — opaque objects\n if (domInterfaceTypes.has(typeName)) {\n return { kind: 'object' }\n }\n\n // Generics and unknown types become 'any'\n return { kind: 'any' }\n }\n\n default:\n return { kind: 'any' }\n }\n}\n\n/**\n * Extract type parameter info (generics) from a function\n */\nfunction extractTypeParams(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n warnings?: string[]\n): Record<string, TypeParamInfo> | undefined {\n if (!node.typeParameters || node.typeParameters.length === 0) {\n return undefined\n }\n\n const typeParams: Record<string, TypeParamInfo> = {}\n\n for (const param of node.typeParameters) {\n const name = param.name.getText()\n const info: TypeParamInfo = {}\n\n // Extract constraint: T extends Foo\n if (param.constraint) {\n const constraintExample = typeToExample(\n param.constraint,\n undefined,\n warnings\n )\n // Try to parse as object/value for richer schema\n if (constraintExample.startsWith('{')) {\n try {\n // This is a rough parse - in production we'd use proper AST\n info.constraint = constraintExample\n } catch {\n info.constraint = constraintExample\n }\n } else {\n info.constraint = constraintExample\n }\n }\n\n // Extract default: T = Foo\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n info.default = defaultExample\n }\n\n typeParams[name] = info\n }\n\n return Object.keys(typeParams).length > 0 ? typeParams : undefined\n}\n\n/**\n * Transform a TypeScript function to TJS syntax\n */\n/**\n * Transform a TypeScript interface to TJS Type declaration\n *\n * interface User { name: string; age: number }\n * ->\n * Type User { example: { name: '', age: 0 } }\n */\nfunction transformInterfaceToType(\n node: ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string | null {\n const typeName = node.name.getText(sourceFile)\n\n // Check for generics\n if (node.typeParameters && node.typeParameters.length > 0) {\n return transformGenericInterfaceToGeneric(node, sourceFile, warnings)\n }\n\n // Build example object from members\n const props: string[] = []\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n let propExample = typeToExample(member.type, undefined, warnings)\n // 'any' is not a valid literal value - use null for object properties\n if (propExample === 'any') propExample = 'null'\n props.push(`${propName}: ${propExample}`)\n }\n }\n\n if (props.length === 0) {\n return `Type ${typeName} {}`\n }\n\n return `Type ${typeName} {\n example: { ${props.join(', ')} }\n}`\n}\n\n/**\n * Transform a generic TypeScript interface to TJS Generic declaration\n *\n * interface Box<T> { value: T }\n * ->\n * Generic Box<T> {\n * description: 'Box'\n * predicate(x, T) { return typeof x === 'object' && x !== null && 'value' in x && T(x.value) }\n * }\n */\nfunction transformGenericInterfaceToGeneric(\n node: ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string {\n const typeName = node.name.getText(sourceFile)\n const typeParams: string[] = []\n\n // Extract type parameters with constraints/defaults\n for (const param of node.typeParameters || []) {\n const paramName = param.name.getText(sourceFile)\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n typeParams.push(`${paramName} = ${defaultExample}`)\n } else {\n typeParams.push(paramName)\n }\n }\n\n // Build predicate checks for each property that uses a type parameter\n const typeParamNames = (node.typeParameters || []).map((p) =>\n p.name.getText(sourceFile)\n )\n const checks: string[] = [\"typeof x === 'object'\", 'x !== null']\n\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n\n // Computed property names: [SYMBOL] → use bracket access\n const isComputed = propName.startsWith('[') && propName.endsWith(']')\n const symbolName = isComputed ? propName.slice(1, -1) : null\n\n if (isComputed) {\n checks.push(`${symbolName} in x`)\n } else {\n checks.push(`'${propName}' in x`)\n }\n\n // If property type is a type parameter, add check\n if (member.type && ts.isTypeReferenceNode(member.type)) {\n const refName = member.type.typeName.getText(sourceFile)\n if (typeParamNames.includes(refName)) {\n if (isComputed) {\n checks.push(`${refName}(x[${symbolName}])`)\n } else {\n checks.push(`${refName}(x.${propName})`)\n }\n }\n }\n }\n }\n\n const predicateParams = ['x', ...typeParamNames].join(', ')\n\n return `Generic ${typeName}<${typeParams.join(', ')}> {\n description: '${typeName}'\n predicate(${predicateParams}) { return ${checks.join(' && ')} }\n}`\n}\n\n/**\n * Check if a TypeScript union type is a literal union (e.g., 'up' | 'down' | 'left')\n * Returns the literal values if it is, null otherwise\n */\nfunction extractLiteralUnionValues(\n type: ts.TypeNode,\n _sourceFile: ts.SourceFile\n): string[] | null {\n if (!ts.isUnionTypeNode(type)) return null\n\n const values: string[] = []\n for (const member of type.types) {\n if (ts.isLiteralTypeNode(member)) {\n if (ts.isStringLiteral(member.literal)) {\n values.push(`'${member.literal.text}'`)\n } else if (ts.isNumericLiteral(member.literal)) {\n values.push(member.literal.text)\n } else if (member.literal.kind === ts.SyntaxKind.TrueKeyword) {\n values.push('true')\n } else if (member.literal.kind === ts.SyntaxKind.FalseKeyword) {\n values.push('false')\n } else if (member.literal.kind === ts.SyntaxKind.NullKeyword) {\n values.push('null')\n } else {\n // Not a literal we can handle\n return null\n }\n } else if (member.kind === ts.SyntaxKind.NullKeyword) {\n values.push('null')\n } else if (member.kind === ts.SyntaxKind.UndefinedKeyword) {\n values.push('undefined')\n } else {\n // Not a literal union (has complex types)\n return null\n }\n }\n\n return values.length > 0 ? values : null\n}\n\n/**\n * Transform a TypeScript enum to TJS Enum declaration\n *\n * enum Status { Pending, Active, Done }\n * ->\n * Enum Status 'Status' {\n * Pending\n * Active\n * Done\n * }\n *\n * enum Color { Red = 'red', Green = 'green', Blue = 'blue' }\n * ->\n * Enum Color 'Color' {\n * Red = 'red'\n * Green = 'green'\n * Blue = 'blue'\n * }\n */\nfunction transformEnumToTJS(\n node: ts.EnumDeclaration,\n sourceFile: ts.SourceFile,\n _warnings?: string[]\n): string | null {\n const enumName = node.name.getText(sourceFile)\n const members: string[] = []\n\n let nextValue = 0\n for (const member of node.members) {\n const memberName = member.name.getText(sourceFile)\n\n if (member.initializer) {\n // Has explicit value\n if (ts.isStringLiteral(member.initializer)) {\n members.push(` ${memberName} = '${member.initializer.text}'`)\n } else if (ts.isNumericLiteral(member.initializer)) {\n const numValue = parseInt(member.initializer.text, 10)\n members.push(` ${memberName} = ${numValue}`)\n nextValue = numValue + 1\n } else if (\n ts.isPrefixUnaryExpression(member.initializer) &&\n member.initializer.operator === ts.SyntaxKind.MinusToken\n ) {\n // Negative number\n const operand = member.initializer.operand\n if (ts.isNumericLiteral(operand)) {\n const numValue = -parseInt(operand.text, 10)\n members.push(` ${memberName} = ${numValue}`)\n nextValue = numValue + 1\n }\n } else {\n // Expression or other complex initializer - use the text directly\n members.push(\n ` ${memberName} = ${member.initializer.getText(sourceFile)}`\n )\n }\n } else {\n // Auto-increment numeric value\n members.push(` ${memberName} = ${nextValue}`)\n nextValue++\n }\n }\n\n return `Enum ${enumName} '${enumName}' {\n${members.join('\\n')}\n}`\n}\n\n/**\n * Transform a TypeScript type alias to TJS Type declaration\n *\n * type User = { name: string; age: number }\n * ->\n * Type User { example: { name: '', age: 0 } }\n *\n * type Direction = 'up' | 'down' | 'left' | 'right'\n * ->\n * Union Direction 'Direction' 'up' | 'down' | 'left' | 'right'\n */\nfunction transformTypeAliasToType(\n node: ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string | null {\n const typeName = node.name.getText(sourceFile)\n\n // Check for generics\n if (node.typeParameters && node.typeParameters.length > 0) {\n return transformGenericTypeAliasToGeneric(node, sourceFile, warnings)\n }\n\n // Check for literal union type → emit Union syntax\n const literalValues = extractLiteralUnionValues(node.type, sourceFile)\n if (literalValues) {\n return `Union ${typeName} '${typeName}' ${literalValues.join(' | ')}`\n }\n\n // Function types → FunctionPredicate declaration\n if (node.type.kind === ts.SyntaxKind.FunctionType) {\n const funcType = node.type as ts.FunctionTypeNode\n const fpParams: string[] = []\n for (const param of funcType.parameters) {\n const name = param.name?.getText(sourceFile) || '_'\n if (name === 'this') continue\n let paramExample = typeToExample(param.type, undefined, warnings)\n if (paramExample === 'any') paramExample = 'null'\n fpParams.push(`${name}: ${paramExample}`)\n }\n let fpReturn = typeToExample(funcType.type, undefined, warnings)\n if (fpReturn === 'any') fpReturn = 'null'\n const spec: string[] = []\n if (fpParams.length > 0) spec.push(`params: { ${fpParams.join(', ')} }`)\n if (fpReturn !== 'undefined') spec.push(`returns: ${fpReturn}`)\n return `FunctionPredicate ${typeName} {\\n ${spec.join('\\n ')}\\n}`\n }\n\n const example = typeToExample(node.type, undefined, warnings)\n\n // 'any' and 'undefined' — skip declaration (undeclared = any in TJS)\n if (example === 'any' || example === 'undefined') {\n return `Type ${typeName} {}`\n }\n\n // For simple primitive types, use short form\n if (\n example === \"''\" ||\n example === '0' ||\n example === 'true' ||\n example === 'null'\n ) {\n return `Type ${typeName} ${example}`\n }\n\n return `Type ${typeName} {\n example: ${example}\n}`\n}\n\n/**\n * Transform a generic type alias to TJS Generic declaration\n */\nfunction transformGenericTypeAliasToGeneric(\n node: ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string {\n const typeName = node.name.getText(sourceFile)\n const typeParams: string[] = []\n\n // Extract type parameters\n for (const param of node.typeParameters || []) {\n const paramName = param.name.getText(sourceFile)\n if (param.default) {\n const defaultExample = typeToExample(param.default, undefined, warnings)\n typeParams.push(`${paramName} = ${defaultExample}`)\n } else {\n typeParams.push(paramName)\n }\n }\n\n const typeParamNames = (node.typeParameters || []).map((p) =>\n p.name.getText(sourceFile)\n )\n const predicateParams = ['x', ...typeParamNames].join(', ')\n\n // Include original TS source as a block comment for manual enhancement\n // Use /* */ to avoid confusing the Generic block preprocessor\n const originalSource = node.getText(sourceFile).trim()\n const comment = `/* Original TS:\\n${originalSource}\\n*/`\n\n return `${comment}\nGeneric ${typeName}<${typeParams.join(', ')}> {\n description: '${typeName}'\n predicate(${predicateParams}) { return true }\n}`\n}\n\nfunction transformFunctionToTJS(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n sourceFile: ts.SourceFile,\n explicitName?: string,\n warnings?: string[],\n includeLineNumber?: boolean,\n ctx?: TypeResolutionContext\n): string {\n // Build type parameter map from generic params (constraint/default)\n let typeParamMap:\n | Map<string, { constraint?: ts.TypeNode; default?: ts.TypeNode }>\n | undefined\n if (node.typeParameters && node.typeParameters.length > 0) {\n typeParamMap = new Map()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n }\n\n // Merge type params into ctx for resolution in typeToExample\n const resolveCtx: TypeResolutionContext | undefined =\n typeParamMap || ctx\n ? { ...ctx, typeParams: typeParamMap ?? ctx?.typeParams }\n : ctx\n\n const degraded: string[] = []\n const params = transformParams(\n node.parameters,\n sourceFile,\n warnings,\n degraded,\n resolveCtx\n )\n\n // Get line number (1-indexed) for source mapping\n const { line } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile)\n )\n const lineComment = includeLineNumber ? `/* line ${line + 1} */\\n` : ''\n\n const funcName =\n explicitName ||\n (ts.isFunctionDeclaration(node) && node.name\n ? node.name.getText(sourceFile)\n : '')\n const returnExample = node.type\n ? typeToExample(node.type, undefined, warnings, resolveCtx)\n : ''\n // Use -! to skip signature tests - TS types are compile-time only,\n // the example values won't necessarily match runtime behavior\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any' &&\n !returnExample.startsWith('new ') // new Set(), new Map() etc. aren't valid TJS literals\n ? ` -! ${returnExample}`\n : ''\n\n // Track degraded return type\n if (node.type && (returnExample === 'any' || returnExample === 'undefined')) {\n const originalReturn = node.type.getText(sourceFile)\n if (\n originalReturn !== 'any' &&\n originalReturn !== 'unknown' &&\n originalReturn !== 'void'\n ) {\n degraded.push(`return: ${originalReturn}`)\n }\n }\n\n // Get function body and strip TypeScript syntax using ts.transpileModule\n let body = ''\n if (node.body) {\n const bodyText = ts.isBlock(node.body)\n ? node.body.getText(sourceFile)\n : `{ return ${node.body.getText(sourceFile)} }`\n\n // Use TypeScript's transpiler to strip all type syntax\n const transpiled = ts.transpileModule(bodyText, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = transpiled.outputText.trim()\n } else {\n body = '{ }'\n }\n\n // Check for export, async, and generator modifiers\n const isExported = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n const isAsync = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n const isGenerator = !!(node as ts.FunctionDeclaration).asteriskToken\n const exportPrefix = isExported ? 'export ' : ''\n const asyncPrefix = isAsync ? 'async ' : ''\n const funcKeyword = isGenerator ? 'function* ' : 'function '\n\n // Emit migration comment if any types were degraded\n const degradedComment =\n degraded.length > 0\n ? `/* TODO: TS types degraded — ${degraded.join(', ')} */\\n`\n : ''\n\n return `${lineComment}${degradedComment}${exportPrefix}${asyncPrefix}${funcKeyword}${funcName}(${params.join(\n ', '\n )})${returnAnnotation} ${body}`\n}\n\n/**\n * Emit a full TJS overload group: the implementation (renamed) + wrapper signatures.\n * Each overload signature becomes a TJS function that delegates to the implementation.\n * TJS polymorphic dispatch merges the wrappers into a dispatcher automatically.\n */\nfunction emitOverloadGroup(\n signatures: ts.FunctionDeclaration[],\n implementation: ts.FunctionDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[]\n): string[] {\n const funcName = implementation.name?.getText(sourceFile) || ''\n const implName = `_${funcName}_impl`\n const results: string[] = []\n\n // Emit the implementation as a renamed private function\n const implParams = transformParams(\n implementation.parameters,\n sourceFile,\n warnings\n )\n let implBody = '{ }'\n if (implementation.body) {\n const bodyText = implementation.body.getText(sourceFile)\n const transpiled = ts.transpileModule(bodyText, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n implBody = transpiled.outputText.trim()\n }\n const isAsync = implementation.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n const isGenerator = !!implementation.asteriskToken\n const asyncPrefix = isAsync ? 'async ' : ''\n const funcKeyword = isGenerator ? 'function* ' : 'function '\n\n results.push(\n `${asyncPrefix}${funcKeyword}${implName}(${implParams.join(\n ', '\n )}) ${implBody}`\n )\n\n // Emit each overload signature as a wrapper that delegates to the implementation\n for (const sig of signatures) {\n const params = transformParams(sig.parameters, sourceFile, warnings)\n const paramNames = sig.parameters.map((p) => p.name.getText(sourceFile))\n const returnExample = sig.type\n ? typeToExample(sig.type, undefined, warnings)\n : ''\n const returnAnnotation =\n returnExample && returnExample !== 'undefined' && returnExample !== 'any'\n ? ` -! ${returnExample}`\n : ''\n\n const { line } = sourceFile.getLineAndCharacterOfPosition(\n sig.getStart(sourceFile)\n )\n const lineComment = `/* line ${line + 1} */\\n`\n const returnKw = isGenerator ? 'yield* ' : 'return '\n\n results.push(\n `${lineComment}${asyncPrefix}${funcKeyword}${funcName}(${params.join(\n ', '\n )})${returnAnnotation} { ${returnKw}${implName}(${paramNames.join(\n ', '\n )}) }`\n )\n }\n\n return results\n}\n\n/**\n * Transform TypeScript class to TJS class\n * Converts TS type annotations to TJS example-based annotations\n */\nfunction transformClassToTJS(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): string {\n // Build type parameter map from class-level generics\n let resolveCtx = ctx\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParamMap = new Map<\n string,\n { constraint?: ts.TypeNode; default?: ts.TypeNode }\n >()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n resolveCtx = { ...ctx, typeParams: typeParamMap }\n }\n\n const className = node.name?.getText(sourceFile) || 'Anonymous'\n // Get base class name, stripping type arguments (e.g. Component<T> → Component)\n const extendsType = node.heritageClauses?.find(\n (h) => h.token === ts.SyntaxKind.ExtendsKeyword\n )?.types[0]\n const extendsClause = extendsType?.expression?.getText(sourceFile)\n\n // First pass: collect private field mappings (TS private -> JS #)\n const privateFieldMap = new Map<string, string>()\n for (const member of node.members) {\n if (ts.isPropertyDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const isPrivate = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.PrivateKeyword\n )\n if (isPrivate && !propName.startsWith('#')) {\n privateFieldMap.set(propName, `#${propName}`)\n }\n }\n }\n\n // Helper to replace private field references in transpiled code\n // Handles: this.prop, ClassName.prop (static), varName.prop (instance via variable)\n const replacePrivateRefs = (code: string): string => {\n let result = code\n for (const [tsName, jsName] of privateFieldMap) {\n // Match property access on any identifier: word.propName or this.propName\n // This covers this.prop, ClassName.prop, and varName.prop\n result = result.replace(\n new RegExp(`(\\\\b\\\\w+)\\\\.${tsName}\\\\b`, 'g'),\n `$1.${jsName}`\n )\n }\n return result\n }\n\n const members: string[] = []\n\n for (const member of node.members) {\n // Constructor\n if (ts.isConstructorDeclaration(member)) {\n const params = transformParams(member.parameters, sourceFile, warnings)\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n members.push(` constructor(${params.join(', ')}) ${body}`)\n }\n\n // Regular methods\n if (ts.isMethodDeclaration(member) && member.name) {\n const methodName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n const isAsync = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.AsyncKeyword\n )\n\n const params = transformParams(\n member.parameters,\n sourceFile,\n warnings,\n undefined,\n resolveCtx\n )\n const returnExample = member.type\n ? typeToExample(member.type, undefined, warnings, resolveCtx)\n : ''\n // Use -! to skip signature tests for TS-transpiled code\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any'\n ? ` -! ${returnExample}`\n : ''\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n const isGenerator = !!member.asteriskToken\n const staticPrefix = isStatic ? 'static ' : ''\n const asyncPrefix = isAsync ? 'async ' : ''\n const generatorStar = isGenerator ? '*' : ''\n members.push(\n ` ${staticPrefix}${asyncPrefix}${generatorStar}${methodName}(${params.join(\n ', '\n )})${returnAnnotation} ${body}`\n )\n }\n\n // Getters\n if (ts.isGetAccessorDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const returnExample = member.type\n ? typeToExample(member.type, undefined, warnings, resolveCtx)\n : ''\n const returnAnnotation =\n returnExample &&\n returnExample !== 'undefined' &&\n returnExample !== 'any' &&\n !returnExample.startsWith('new ')\n ? ` -> ${returnExample}`\n : ''\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n members.push(` get ${propName}()${returnAnnotation} ${body}`)\n }\n\n // Setters\n if (ts.isSetAccessorDeclaration(member) && member.name) {\n const propName = member.name.getText(sourceFile)\n const params = transformParams(member.parameters, sourceFile, warnings)\n\n let body = '{ }'\n if (member.body) {\n const transpiled = ts.transpileModule(member.body.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n body = replacePrivateRefs(transpiled.outputText.trim())\n }\n\n members.push(` set ${propName}(${params.join(', ')}) ${body}`)\n }\n\n // Properties with initializers (private fields, regular properties)\n if (ts.isPropertyDeclaration(member) && member.name) {\n const origName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n const staticPrefix = isStatic ? 'static ' : ''\n\n // Use mapped name (# for private) or original\n const propName = privateFieldMap.get(origName) || origName\n\n if (member.initializer) {\n // Wrap in parens so TS treats { ... } as an object expression,\n // not a block with labels (which mangles property colons)\n const initText = member.initializer.getText(sourceFile)\n const wrapped = initText.trimStart().startsWith('{')\n ? `(${initText})`\n : initText\n const transpiled = ts.transpileModule(wrapped, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n let output = transpiled.outputText.trim()\n // Strip the wrapping parens and trailing semicolon\n if (wrapped !== initText) {\n output = output.replace(/^\\(/, '').replace(/\\);?\\s*$/, '')\n }\n members.push(` ${staticPrefix}${propName} = ${output}`)\n } else {\n // Property without initializer - just declare it\n members.push(` ${staticPrefix}${propName}`)\n }\n }\n }\n\n const isExported = node.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n const exportPrefix = isExported ? 'export ' : ''\n const extendsStr = extendsClause ? ` extends ${extendsClause}` : ''\n return `${exportPrefix}class ${className}${extendsStr} {\\n${members.join(\n '\\n'\n )}\\n}`\n}\n\n/**\n * Helper to transform parameters to TJS format\n */\nfunction transformParams(\n parameters: ts.NodeArray<ts.ParameterDeclaration>,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n degraded?: string[],\n ctx?: TypeResolutionContext\n): string[] {\n const params: string[] = []\n\n for (const param of parameters) {\n const name = param.name.getText(sourceFile)\n // Skip TypeScript's `this` pseudo-parameter (declares `this` context type)\n if (name === 'this') continue\n const isOptional = !!param.questionToken || !!param.initializer\n const typeExample = typeToExample(param.type, undefined, warnings, ctx)\n\n if (param.initializer) {\n // Has default value - use it directly\n const defaultText = param.initializer.getText(sourceFile)\n params.push(`${name} = ${defaultText}`)\n } else if (typeExample === 'any' || typeExample === 'undefined') {\n // any/undefined type - no annotation in TJS (bare name means any)\n params.push(name)\n // Record original TS type for migration comments\n if (degraded && param.type) {\n const originalType = param.type.getText(sourceFile)\n if (originalType !== 'any' && originalType !== 'unknown') {\n degraded.push(`${name}: ${originalType}`)\n }\n }\n } else if (isOptional) {\n // Optional without default - use union with undefined to preserve\n // three-state semantics (e.g. TS `flag?: boolean` can be true/false/undefined)\n params.push(`${name}: ${typeExample} | undefined`)\n } else {\n // Required - use : for required\n params.push(`${name}: ${typeExample}`)\n }\n }\n\n return params\n}\n\n/**\n * Extract type metadata from a TypeScript function\n */\nfunction extractFunctionMetadata(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): FunctionTypeInfo {\n // Build type parameter map from generic params\n let resolveCtx = ctx\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParamMap = new Map<\n string,\n { constraint?: ts.TypeNode; default?: ts.TypeNode }\n >()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n resolveCtx = { ...ctx, typeParams: typeParamMap }\n }\n\n const name =\n ts.isFunctionDeclaration(node) && node.name\n ? node.name.getText(sourceFile)\n : 'anonymous'\n const params: Record<string, ParamTypeInfo> = {}\n\n for (const param of node.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n // Try to extract literal default value\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, resolveCtx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n\n const result: FunctionTypeInfo = {\n name,\n params,\n returns: node.type ? typeToInfo(node.type, resolveCtx) : undefined,\n }\n\n // Extract generic type parameters\n const typeParams = extractTypeParams(node, warnings)\n if (typeParams) {\n result.typeParams = typeParams\n }\n\n return result\n}\n\n/**\n * Extract type metadata from a TypeScript class\n */\nfunction extractClassMetadata(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n warnings?: string[],\n ctx?: TypeResolutionContext\n): ClassTypeInfo {\n // Build type parameter map from class-level generics\n let resolveCtx = ctx\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParamMap = new Map<\n string,\n { constraint?: ts.TypeNode; default?: ts.TypeNode }\n >()\n for (const tp of node.typeParameters) {\n typeParamMap.set(tp.name.getText(sourceFile), {\n constraint: tp.constraint,\n default: tp.default,\n })\n }\n resolveCtx = { ...ctx, typeParams: typeParamMap }\n }\n\n const name = node.name?.getText(sourceFile) || 'anonymous'\n const methods: Record<string, FunctionTypeInfo> = {}\n const staticMethods: Record<string, FunctionTypeInfo> = {}\n let constructorInfo: { params: Record<string, ParamTypeInfo> } | undefined\n\n for (const member of node.members) {\n // Constructor\n if (ts.isConstructorDeclaration(member)) {\n const params: Record<string, ParamTypeInfo> = {}\n for (const param of member.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, resolveCtx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n constructorInfo = { params }\n }\n\n // Methods (instance and static)\n if (ts.isMethodDeclaration(member) && member.name) {\n const methodName = member.name.getText(sourceFile)\n const isStatic = member.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.StaticKeyword\n )\n\n const params: Record<string, ParamTypeInfo> = {}\n for (const param of member.parameters) {\n const paramName = param.name.getText(sourceFile)\n const isOptional = !!param.questionToken || !!param.initializer\n\n let defaultValue: any = undefined\n if (param.initializer) {\n const initText = param.initializer.getText(sourceFile)\n try {\n defaultValue = JSON.parse(initText)\n } catch {\n defaultValue = initText\n }\n }\n\n params[paramName] = {\n type: typeToInfo(param.type, resolveCtx),\n required: !isOptional,\n default: defaultValue,\n }\n }\n\n const methodInfo: FunctionTypeInfo = {\n name: methodName,\n params,\n returns: member.type ? typeToInfo(member.type, resolveCtx) : undefined,\n }\n\n if (isStatic) {\n staticMethods[methodName] = methodInfo\n } else {\n methods[methodName] = methodInfo\n }\n }\n }\n\n const result: ClassTypeInfo = {\n name,\n methods,\n staticMethods,\n constructor: constructorInfo,\n }\n\n // Extract class-level generic type parameters\n if (node.typeParameters && node.typeParameters.length > 0) {\n const typeParams: Record<string, TypeParamInfo> = {}\n for (const param of node.typeParameters) {\n const paramName = param.name.getText(sourceFile)\n const info: TypeParamInfo = {}\n if (param.constraint) {\n info.constraint = typeToExample(\n param.constraint,\n undefined,\n warnings,\n ctx\n )\n }\n if (param.default) {\n info.default = typeToExample(param.default, undefined, warnings, ctx)\n }\n typeParams[paramName] = info\n }\n result.typeParams = typeParams\n }\n\n return result\n}\n\n/**\n * Transpile TypeScript source to TJS or JS + metadata\n */\n/**\n * Extract embedded test comments from source\n * These use syntax: /*test 'description' { ... }* / (without space before /)\n * They survive TS compilation and should be preserved in TJS output\n */\nfunction extractEmbeddedTestComments(source: string): string[] {\n const tests: string[] = []\n // Match: /*test 'description' { ... }*/ or /*test { ... }*/\n const embeddedRegex =\n /\\/\\*test\\s+(['\"`])([^'\"`]*)\\1\\s*\\{[\\s\\S]*?\\}\\s*\\*\\/|\\/\\*test\\s*\\{[\\s\\S]*?\\}\\s*\\*\\//g\n\n let match\n while ((match = embeddedRegex.exec(source)) !== null) {\n tests.push(match[0])\n }\n return tests\n}\n\n/**\n * Extract top-level TJS doc comments (/*# ... *\\/) from source with position info.\n * These need to be preserved in TJS output in their original positions.\n * Comments inside function bodies are already preserved by the TS transpiler.\n */\nfunction extractDocComments(\n source: string\n): Array<{ content: string; index: number }> {\n const comments: Array<{ content: string; index: number }> = []\n const docRegex = /\\/\\*#[\\s\\S]*?\\*\\//g\n\n // Track brace depth to identify top-level comments\n let braceDepth = 0\n let inString: string | null = null\n\n // Scan source to find brace depths at each position\n const braceDepthAt: number[] = []\n for (let i = 0; i < source.length; i++) {\n const ch = source[i]\n const prev = i > 0 ? source[i - 1] : ''\n\n // Handle string literals\n if (!inString && (ch === '\"' || ch === \"'\" || ch === '`')) {\n inString = ch\n } else if (inString && ch === inString && prev !== '\\\\') {\n inString = null\n }\n\n // Track braces only outside strings\n if (!inString) {\n if (ch === '{') braceDepth++\n if (ch === '}') braceDepth--\n }\n\n braceDepthAt[i] = braceDepth\n }\n\n let match\n while ((match = docRegex.exec(source)) !== null) {\n // Only include comments at top level (brace depth 0)\n if (braceDepthAt[match.index] === 0) {\n comments.push({\n content: match[0],\n index: match.index,\n })\n }\n }\n return comments\n}\n\nexport function fromTS(\n source: string,\n options: FromTSOptions = {}\n): FromTSResult {\n const { emitTJS = false, filename = 'input.ts' } = options\n const warnings: string[] = []\n\n // Extract embedded test comments before TS parsing (they need to be preserved)\n const embeddedTests = extractEmbeddedTestComments(source)\n\n // Extract doc comments (/*# ... */) with position info for TJS output\n const docComments = emitTJS ? extractDocComments(source) : []\n\n // Parse TypeScript\n const sourceFile = ts.createSourceFile(\n filename,\n source,\n ts.ScriptTarget.Latest,\n true\n )\n\n const tjsFunctions: string[] = []\n const seenTypeNames = new Set<string>() // Track emitted type names to avoid duplicates\n const metadata: Record<string, FunctionTypeInfo> = {}\n const classMetadata: Record<string, ClassTypeInfo> = {}\n\n // Track which doc comments have been emitted (by index in docComments array)\n const emittedDocComments = new Set<number>()\n\n // Helper: emit any doc comments that appear before a given source position\n const emitDocCommentsBefore = (pos: number) => {\n for (let i = 0; i < docComments.length; i++) {\n const doc = docComments[i]\n if (!emittedDocComments.has(i) && doc.index < pos) {\n tjsFunctions.push(doc.content)\n emittedDocComments.add(i)\n }\n }\n }\n\n // Build type alias and interface maps first (first pass)\n const typeAliases = new Map<string, ts.TypeNode>()\n const interfaces = new Map<string, ts.InterfaceDeclaration>()\n\n function collectTypes(node: ts.Node) {\n if (ts.isTypeAliasDeclaration(node)) {\n typeAliases.set(node.name.getText(sourceFile), node.type)\n }\n if (ts.isInterfaceDeclaration(node)) {\n const name = node.name.getText(sourceFile)\n const existing = interfaces.get(name)\n if (existing) {\n // Merge members (TS interface merging)\n const merged = ts.factory.updateInterfaceDeclaration(\n existing,\n existing.modifiers,\n existing.name,\n existing.typeParameters,\n existing.heritageClauses,\n [...existing.members, ...node.members]\n )\n interfaces.set(name, merged)\n } else {\n interfaces.set(name, node)\n }\n }\n ts.forEachChild(node, collectTypes)\n }\n collectTypes(sourceFile)\n\n // Create resolution context\n const resolutionCtx: TypeResolutionContext = {\n typeAliases,\n interfaces,\n sourceFile,\n warnings,\n }\n\n // Pre-scan: detect function overload groups\n // In TS, overloads are N bodyless signatures + 1 implementation with body\n const overloadGroups = new Map<\n string,\n {\n signatures: ts.FunctionDeclaration[] // body === undefined\n implementation: ts.FunctionDeclaration | null // has body\n }\n >()\n for (const stmt of sourceFile.statements) {\n if (ts.isFunctionDeclaration(stmt) && stmt.name) {\n const name = stmt.name.getText(sourceFile)\n if (!overloadGroups.has(name)) {\n overloadGroups.set(name, { signatures: [], implementation: null })\n }\n const group = overloadGroups.get(name)!\n if (stmt.body) {\n group.implementation = stmt\n } else {\n group.signatures.push(stmt)\n }\n }\n }\n // Only keep groups that actually have overloads (signatures + implementation)\n for (const [name, group] of overloadGroups) {\n if (group.signatures.length === 0 || !group.implementation) {\n overloadGroups.delete(name)\n }\n }\n\n // Walk top-level statements only (don't recurse into function bodies)\n for (const statement of sourceFile.statements) {\n let handled = false\n\n // Emit any doc comments before this statement\n if (emitTJS) {\n emitDocCommentsBefore(statement.getStart(sourceFile))\n }\n\n // Handle: function foo() {}\n if (ts.isFunctionDeclaration(statement) && statement.name) {\n const funcName = statement.name.getText(sourceFile)\n handled = true\n\n const overloadGroup = overloadGroups.get(funcName)\n\n if (overloadGroup) {\n // This function is part of an overload group\n if (!statement.body) {\n // Skip bodyless signatures — handled when we encounter the implementation\n } else {\n // Implementation: emit the entire overload group\n if (emitTJS) {\n tjsFunctions.push(\n ...emitOverloadGroup(\n overloadGroup.signatures,\n statement,\n sourceFile,\n warnings\n )\n )\n } else {\n const overloads: FunctionTypeInfo[] = []\n for (const sig of overloadGroup.signatures) {\n overloads.push(\n extractFunctionMetadata(\n sig,\n sourceFile,\n warnings,\n resolutionCtx\n )\n )\n }\n const implInfo = extractFunctionMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n implInfo.overloads = overloads\n metadata[funcName] = implInfo\n }\n }\n } else {\n // Normal (non-overloaded) function\n if (emitTJS) {\n tjsFunctions.push(\n transformFunctionToTJS(\n statement,\n sourceFile,\n undefined,\n warnings,\n true,\n resolutionCtx\n )\n )\n } else {\n metadata[funcName] = extractFunctionMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n }\n }\n }\n\n // Handle: const foo = () => {} or const foo = function() {}\n // Also handle: const x = ..., let x = ..., var x = ... (non-function)\n if (ts.isVariableStatement(statement)) {\n let hasFunctionDecl = false\n\n // Check if the variable statement itself is exported\n const varIsExported = statement.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n\n for (const decl of statement.declarationList.declarations) {\n if (\n ts.isIdentifier(decl.name) &&\n decl.initializer &&\n (ts.isArrowFunction(decl.initializer) ||\n ts.isFunctionExpression(decl.initializer))\n ) {\n hasFunctionDecl = true\n const funcName = decl.name.getText(sourceFile)\n const funcNode = decl.initializer\n\n if (emitTJS) {\n let tjsFunc = transformFunctionToTJS(\n funcNode,\n sourceFile,\n funcName,\n warnings,\n true,\n resolutionCtx\n )\n // Arrow/const functions: export is on the VariableStatement\n // Insert after any line comment or degraded comment\n if (varIsExported && !tjsFunc.includes('export ')) {\n const firstFuncLine = tjsFunc.search(/^(async\\s+)?function[\\s*]/m)\n if (firstFuncLine > 0) {\n tjsFunc =\n tjsFunc.slice(0, firstFuncLine) +\n 'export ' +\n tjsFunc.slice(firstFuncLine)\n } else {\n tjsFunc = 'export ' + tjsFunc\n }\n }\n tjsFunctions.push(tjsFunc)\n } else {\n const info = extractFunctionMetadata(\n funcNode,\n sourceFile,\n warnings,\n resolutionCtx\n )\n info.name = funcName\n metadata[funcName] = info\n }\n }\n }\n\n // If this variable statement doesn't contain function declarations,\n // transpile and preserve it (strips type annotations)\n if (!hasFunctionDecl && emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n tjsFunctions.push(transpiled.outputText.trim())\n }\n\n handled = true\n }\n\n // Handle: interface Foo { ... }\n if (ts.isInterfaceDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const typeName = statement.name.getText(sourceFile)\n if (!seenTypeNames.has(typeName)) {\n seenTypeNames.add(typeName)\n // Use merged interface (handles declaration merging)\n const merged = interfaces.get(typeName) || statement\n const typeDecl = transformInterfaceToType(\n merged,\n sourceFile,\n warnings\n )\n if (typeDecl) {\n const isExported = statement.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n tjsFunctions.push(\n isExported\n ? typeDecl.replace(/^(\\/\\*[\\s\\S]*?\\*\\/\\s*)?/, '$1export ')\n : typeDecl\n )\n }\n }\n }\n }\n\n // Handle: type Foo = { ... }\n if (ts.isTypeAliasDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const typeName = statement.name.getText(sourceFile)\n if (!seenTypeNames.has(typeName)) {\n seenTypeNames.add(typeName)\n const typeDecl = transformTypeAliasToType(\n statement,\n sourceFile,\n warnings\n )\n if (typeDecl) {\n const isExported = statement.modifiers?.some(\n (m) => m.kind === ts.SyntaxKind.ExportKeyword\n )\n tjsFunctions.push(\n isExported\n ? typeDecl.replace(/^(\\/\\*[\\s\\S]*?\\*\\/\\s*)?/, '$1export ')\n : typeDecl\n )\n }\n }\n }\n }\n\n // Handle: enum Status { Pending, Active, Done }\n if (ts.isEnumDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n const enumName = statement.name.getText(sourceFile)\n if (!seenTypeNames.has(enumName)) {\n seenTypeNames.add(enumName)\n const enumDecl = transformEnumToTJS(statement, sourceFile, warnings)\n if (enumDecl) {\n tjsFunctions.push(enumDecl)\n }\n }\n }\n }\n\n // Handle: class Foo { ... }\n if (ts.isClassDeclaration(statement) && statement.name) {\n const className = statement.name.getText(sourceFile)\n handled = true\n if (emitTJS) {\n const classDecl = transformClassToTJS(statement, sourceFile, warnings)\n tjsFunctions.push(classDecl)\n } else {\n classMetadata[className] = extractClassMetadata(\n statement,\n sourceFile,\n warnings,\n resolutionCtx\n )\n }\n }\n\n // Handle: import statements (strip type-only imports, keep value imports)\n if (ts.isImportDeclaration(statement)) {\n handled = true\n if (emitTJS) {\n // Check if it's a type-only import\n const isTypeOnly =\n statement.importClause?.isTypeOnly ||\n (statement.importClause?.namedBindings &&\n ts.isNamedImports(statement.importClause.namedBindings) &&\n statement.importClause.namedBindings.elements.every(\n (e) => e.isTypeOnly\n ))\n\n if (!isTypeOnly) {\n // Emit import directly — don't use ts.transpileModule which\n // strips \"unused\" imports in isolation. Filter out type-only\n // specifiers manually.\n if (\n statement.importClause?.namedBindings &&\n ts.isNamedImports(statement.importClause.namedBindings)\n ) {\n const valueSpecs = statement.importClause.namedBindings.elements\n .filter((e) => !e.isTypeOnly)\n .map((e) => {\n const name = e.name.getText(sourceFile)\n const propName = e.propertyName?.getText(sourceFile)\n return propName ? `${propName} as ${name}` : name\n })\n if (valueSpecs.length > 0) {\n const modSpec = (statement.moduleSpecifier as ts.StringLiteral)\n .text\n tjsFunctions.push(\n `import { ${valueSpecs.join(', ')} } from '${modSpec}'`\n )\n }\n } else {\n // Default import, namespace import, or side-effect import\n // Emit as-is (strip types via getText which preserves structure)\n const importText = statement.getText(sourceFile)\n // Remove type annotations by running through TS\n const cleaned = importText\n .replace(/\\btype\\s+/g, '')\n .replace(/\\s*:\\s*\\w+/g, '')\n tjsFunctions.push(cleaned)\n }\n }\n }\n }\n\n // Handle: export statements\n if (ts.isExportDeclaration(statement) || ts.isExportAssignment(statement)) {\n handled = true\n if (emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n const trimmed = transpiled.outputText.trim()\n if (trimmed) {\n tjsFunctions.push(trimmed)\n }\n }\n }\n\n // Handle: expression statements (console.log(...), foo(), etc.)\n // and any other unhandled statements\n if (!handled && emitTJS) {\n const transpiled = ts.transpileModule(statement.getText(sourceFile), {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n const trimmed = transpiled.outputText.trim()\n if (trimmed) {\n tjsFunctions.push(trimmed)\n }\n }\n }\n\n if (emitTJS) {\n // Emit any remaining doc comments (after all statements)\n emitDocCommentsBefore(Infinity)\n\n // Include source file annotation for error reporting\n const sourceFileName = filename || 'unknown'\n const header = `/* tjs <- ${sourceFileName} */\\n\\n`\n\n // Append embedded test comments (they were extracted from original source)\n const testsSection =\n embeddedTests.length > 0 ? '\\n\\n' + embeddedTests.join('\\n\\n') : ''\n\n return {\n code: header + tjsFunctions.join('\\n\\n') + testsSection,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n }\n\n // For JS output, strip types and add metadata\n const jsOutput = ts.transpileModule(source, {\n compilerOptions: {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n removeComments: false,\n },\n })\n\n // Append __tjs metadata for each function\n let code = jsOutput.outputText\n for (const [funcName, info] of Object.entries(metadata)) {\n const metadataObj: Record<string, any> = {\n params: Object.fromEntries(\n Object.entries(info.params).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required, default: v.default },\n ])\n ),\n returns: info.returns ? { type: info.returns.kind } : undefined,\n }\n\n // Include type parameters (generics) if present\n if (info.typeParams) {\n metadataObj.typeParams = info.typeParams\n }\n\n const metadataStr = JSON.stringify(metadataObj, null, 2)\n code += `\\n${funcName}.__tjs = ${metadataStr};\\n`\n }\n\n // Append __tjs metadata for each class\n for (const [className, info] of Object.entries(classMetadata)) {\n const metadataObj: Record<string, any> = {\n constructor: info.constructor\n ? {\n params: Object.fromEntries(\n Object.entries(info.constructor.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required, default: v.default },\n ])\n ),\n }\n : undefined,\n methods: Object.fromEntries(\n Object.entries(info.methods ?? {}).map(([name, m]) => [\n name,\n {\n params: Object.fromEntries(\n Object.entries(m.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required },\n ])\n ),\n returns: m.returns ? { type: m.returns.kind } : undefined,\n },\n ])\n ),\n staticMethods: Object.fromEntries(\n Object.entries(info.staticMethods ?? {}).map(([name, m]) => [\n name,\n {\n params: Object.fromEntries(\n Object.entries(m.params ?? {}).map(([k, v]) => [\n k,\n { type: v.type.kind, required: v.required },\n ])\n ),\n returns: m.returns ? { type: m.returns.kind } : undefined,\n },\n ])\n ),\n }\n\n if (info.typeParams) {\n metadataObj.typeParams = info.typeParams\n }\n\n const metadataStr = JSON.stringify(metadataObj, null, 2)\n code += `\\n${className}.__tjs = ${metadataStr};\\n`\n\n // Wrap class to make it callable without `new`\n code += `\\n${emitClassWrapper(className)}\\n`\n }\n\n return {\n code,\n types: metadata,\n classes: Object.keys(classMetadata).length > 0 ? classMetadata : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n}\n",
|
|
19
|
+
"/**\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 {\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 → .Equals method → structural comparison\n */\nexport const tjsEquals: unique symbol = Symbol.for('tjs.equals')\n\n/**\n * Parse semver version string into components\n */\nfunction parseVersion(version: string): {\n major: number\n minor: number\n patch: number\n} {\n const [major = 0, minor = 0, patch = 0] = version.split('.').map(Number)\n return { major, minor, patch }\n}\n\n/**\n * Compare two version strings\n * Returns: -1 if a < b, 0 if equal, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): -1 | 0 | 1 {\n const va = parseVersion(a)\n const vb = parseVersion(b)\n\n if (va.major !== vb.major) return va.major < vb.major ? -1 : 1\n if (va.minor !== vb.minor) return va.minor < vb.minor ? -1 : 1\n if (va.patch !== vb.patch) return va.patch < vb.patch ? -1 : 1\n return 0\n}\n\n/**\n * Check if two versions are compatible (same major version)\n */\nexport function versionsCompatible(a: string, b: string): boolean {\n const va = parseVersion(a)\n const vb = parseVersion(b)\n return va.major === vb.major\n}\n\n/**\n * MonadicError - Internal error type for monadic error propagation\n *\n * This extends Error so:\n * 1. It's a real Error with proper stack traces\n * 2. User code can't accidentally process it as data (unlike { $error: true })\n * 3. It flows through function calls via instanceof checks\n *\n * NOT exported to user code - they just see Error instances.\n */\nexport class MonadicError extends Error {\n /** Path where the error occurred, e.g., \"src/file.ts:42:greet.name\" */\n readonly path: string\n /** Expected type */\n readonly expected?: string\n /** Actual type received */\n readonly actual?: string\n /** TJS call stack (only in debug mode) - shows source locations */\n readonly callStack?: string[]\n\n constructor(\n message: string,\n path: string,\n expected?: string,\n actual?: string,\n callStack?: string[]\n ) {\n super(message)\n this.name = 'MonadicError'\n this.path = path\n this.expected = expected\n this.actual = actual\n this.callStack = callStack\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, MonadicError)\n }\n }\n}\n\n/**\n * Create a type error for inline validation\n *\n * Called ONLY when a type check fails - no overhead on happy path.\n * Returns a MonadicError that propagates through the call chain.\n * In debug mode, captures the TJS call stack with source locations.\n *\n * @param path - Location of the error, e.g., \"src/file.ts:42:greet.name\"\n * @param expected - Expected type, e.g., \"string\"\n * @param value - The actual value that failed the check\n */\nexport function typeError(\n path: string,\n expected: string,\n value: unknown\n): MonadicError {\n const actual = value === null ? 'null' : typeof value\n // Capture call stack in debug mode (getStack returns [] if not in debug mode)\n const stack = config.debug ? getStack() : undefined\n return new MonadicError(\n `Expected ${expected} for '${path}', got ${actual}`,\n path,\n expected,\n actual,\n stack\n )\n}\n\n/**\n * Check if a value is a MonadicError (for internal use)\n */\nexport function isMonadicError(value: unknown): value is MonadicError {\n return value instanceof MonadicError\n}\n\n/**\n * Error marker - identifies TJS error objects\n * @deprecated Use MonadicError instead. This interface is kept for backward compatibility.\n */\nexport interface TJSError {\n $error: true\n message: string\n /** Failure location - e.g., \"greet.name\" */\n path?: string\n /** Call stack in debug mode - e.g., [\"main\", \"processUser\", \"greet.name\"] */\n stack?: string[]\n expected?: string\n actual?: string\n cause?: Error | TJSError\n /** Source location for error reporting */\n loc?: { start: number; end: number }\n /** Multiple errors (when composing parameter errors) */\n errors?: TJSError[]\n}\n\n/**\n * Safety levels for runtime validation\n * - 'none': No validation unless explicitly forced with (?) or -?\n * - 'inputs': Validate inputs only (default) - outputs only with explicit -> or -?\n * - 'all': Validate both inputs and outputs unless explicitly skipped with (!) or -!\n */\nexport type SafetyLevel = 'none' | 'inputs' | 'all'\n\n/**\n * Runtime configuration\n */\nexport interface TJSConfig {\n /** Enable debug mode - captures call stacks in errors */\n debug?: boolean\n /** Safety level for validation (default: 'inputs') */\n safety?: SafetyLevel\n /** Require explicit return types (error if -> not specified) */\n requireReturnTypes?: boolean\n /** Maximum call stack size to prevent memory issues (default: 100) */\n maxStackSize?: number\n}\n\n/** Default configuration values */\nconst DEFAULT_CONFIG: TJSConfig = {\n debug: false,\n safety: 'inputs',\n requireReturnTypes: false,\n maxStackSize: 100,\n}\n\n/** Current runtime configuration */\nlet config: TJSConfig = { ...DEFAULT_CONFIG }\n\n/** Current call stack (only tracked in debug mode) */\nconst callStack: string[] = []\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 (debug mode only)\n * Respects maxStackSize to prevent unbounded memory growth\n */\nexport function pushStack(name: string): void {\n if (config.debug && name) {\n callStack.push(name)\n // Enforce max stack size by removing oldest entries\n const maxSize = config.maxStackSize ?? 100\n while (callStack.length > maxSize) {\n callStack.shift()\n }\n }\n}\n\n/**\n * Pop a function from the call stack (debug mode only)\n */\nexport function popStack(): void {\n if (config.debug) {\n callStack.pop()\n }\n}\n\n/**\n * Get current call stack snapshot\n */\nexport function getStack(): string[] {\n return [...callStack]\n}\n\n/**\n * Reset runtime state to defaults\n *\n * Resets: config, callStack, unsafeDepth\n * Use this in test teardown to prevent state leaking between tests.\n */\nexport function resetRuntime(): void {\n config = { ...DEFAULT_CONFIG }\n callStack.length = 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 // Identical references or primitives\n if (a === b) return true\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 // 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 * 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 // In debug mode, capture the call stack\n if (config.debug && callStack.length > 0) {\n // Add the path to the stack if it exists\n const fullStack = details?.path\n ? [...callStack, details.path]\n : [...callStack]\n err.stack = fullStack\n }\n\n return err\n}\n\n/**\n * Compose multiple errors into a single error\n * Used when multiple parameters have errors\n */\nexport function composeErrors(errors: TJSError[], funcName?: string): TJSError {\n if (errors.length === 0) {\n return error('Unknown error')\n }\n if (errors.length === 1) {\n return errors[0]\n }\n\n // Build a message listing all failed parameters\n const paramNames = errors\n .map((e) => {\n // Extract param name from path (e.g., \"func.paramName\" -> \"paramName\")\n if (e.path) {\n const parts = e.path.split('.')\n return parts[parts.length - 1]\n }\n return 'unknown'\n })\n .join(', ')\n\n const message = `Multiple parameter errors in ${\n funcName || 'function'\n }: ${paramNames}`\n\n return error(message, {\n path: funcName,\n errors,\n })\n}\n\n/**\n * Get the type of a value\n *\n * Enhanced typeof that handles:\n * - null (returns 'null' not 'object')\n * - undefined (returns 'undefined')\n * - arrays (returns 'array' not 'object')\n * - native/platform types (returns constructor name for objects)\n *\n * For objects, returns the constructor name which enables pragmatic\n * native type checking (e.g., 'HTMLElement', 'Buffer', 'Event')\n */\nexport function typeOf(value: unknown): string {\n if (value === null) return 'null'\n if (value === undefined) return 'undefined'\n if (Array.isArray(value)) return 'array'\n\n const t = typeof value\n if (t !== 'object') return t\n\n // For objects, return constructor name for pragmatic native type checking\n // This enables checking for HTMLElement, Buffer, Event, etc.\n const constructorName = (value as object).constructor?.name\n if (constructorName && constructorName !== 'Object') {\n return constructorName\n }\n\n return 'object'\n}\n\n/**\n * Check if a value is an instance of a native/platform type by constructor name\n *\n * This enables pragmatic native type checking without shipping type definitions:\n * - isNativeType(el, 'HTMLElement') - DOM element check\n * - isNativeType(buf, 'Buffer') - Node.js Buffer check\n * - isNativeType(evt, 'Event') - DOM Event check\n * - isNativeType(map, 'Map') - Map instance check\n *\n * @param value - The value to check\n * @param typeName - The constructor name to match (e.g., 'HTMLElement', 'Buffer')\n * @returns true if value's constructor.name matches or is in prototype chain\n */\nexport function isNativeType(value: unknown, typeName: string): boolean {\n if (value === null || value === undefined) return false\n if (typeof value !== 'object' && typeof value !== 'function') return false\n\n // Check constructor name\n let proto = value\n while (proto !== null) {\n const constructorName = (proto as object).constructor?.name\n if (constructorName === typeName) return true\n proto = Object.getPrototypeOf(proto)\n }\n\n return false\n}\n\n/**\n * Check if a value matches an expected type\n *\n * @param value - The value to check\n * @param expected - Either a string type name ('string', 'number', etc.)\n * or a RuntimeType instance with .check() method\n * @param path - Optional path for error messages\n */\nexport function checkType(\n value: unknown,\n expected: string | { check: (v: unknown) => boolean; description: string },\n path?: string\n): TJSError | null {\n // If value is already an error, propagate it\n if (isError(value)) return value\n\n // Handle RuntimeType instances (Type() results)\n if (\n typeof expected === 'object' &&\n expected !== null &&\n 'check' in expected\n ) {\n if (expected.check(value)) return null\n return error(`Expected ${expected.description} but got ${typeOf(value)}`, {\n path,\n expected: expected.description,\n actual: typeOf(value),\n })\n }\n\n const actual = typeOf(value)\n\n // Handle special cases\n if (expected === 'any') return null\n if (expected === actual) return null\n\n // Number accepts both number types\n if (expected === 'number' && actual === 'number') return null\n if (expected === 'integer' && actual === 'number' && Number.isInteger(value))\n return null\n if (\n expected === 'non-negative-integer' &&\n actual === 'number' &&\n Number.isInteger(value) &&\n (value as number) >= 0\n )\n return null\n\n // Object matching (basic)\n if (expected === 'object' && actual === 'object') return null\n\n return error(`Expected ${expected} but got ${actual}`, {\n path,\n expected,\n actual,\n })\n}\n\n/** Type specifier - either a string name or a RuntimeType */\ntype TypeSpec = string | { check: (v: unknown) => boolean; description: string }\n\n/** Parameter metadata with optional location */\ninterface ParamMeta {\n type: TypeSpec\n required: boolean\n default?: unknown\n loc?: { start: number; end: number }\n}\n\n/**\n * Validate function arguments against __tjs metadata\n * Returns first error found, or null if all valid\n */\nexport function validateArgs(\n args: Record<string, unknown>,\n meta: {\n params: Record<string, ParamMeta>\n },\n funcName?: string\n): TJSError | null {\n for (const [name, param] of Object.entries(meta.params)) {\n const value = args[name]\n\n // Check if any arg is already an error - propagate first one\n if (isError(value)) return value\n\n // Check required\n if (param.required && value === undefined) {\n const expectedDesc =\n typeof param.type === 'string' ? param.type : param.type.description\n return error(`Missing required parameter '${name}'`, {\n path: funcName ? `${funcName}.${name}` : name,\n expected: expectedDesc,\n actual: 'undefined',\n loc: param.loc,\n })\n }\n\n // Skip type check for undefined optional params\n if (value === undefined) continue\n\n // Type check\n const typeError = checkType(\n value,\n param.type,\n funcName ? `${funcName}.${name}` : name\n )\n if (typeError) {\n // Add location info if available\n if (param.loc) {\n typeError.loc = param.loc\n }\n return typeError\n }\n }\n\n return null\n}\n\n/**\n * Function metadata with safety flags\n */\nexport interface FunctionMeta {\n params: Record<string, any>\n returns?: { type: any; safe?: boolean; defaults?: Record<string, unknown> }\n /** Function marked with (!) - never validate inputs */\n unsafe?: boolean\n /** Function marked with (?) - always validate inputs */\n safe?: boolean\n /** Return type marked with -! - never validate output */\n unsafeReturn?: boolean\n /** Return type marked with -? - always validate output */\n safeReturn?: boolean\n /** Explicit function name for stack tracking (used when fn.name is empty) */\n name?: string\n /** Polymorphic dispatcher — 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\n // Determine if we need a wrapper at all\n // Polymorphic dispatchers handle their own routing — 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 — 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 // Push onto call stack in debug mode\n 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 popStack()\n return returnError as ReturnType<T>\n }\n }\n\n popStack()\n return result\n } catch (e) {\n 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\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 instanceCallStack: string[] = []\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.debug && name) {\n instanceCallStack.push(name)\n const maxSize = instanceConfig.maxStackSize ?? 100\n while (instanceCallStack.length > maxSize) {\n instanceCallStack.shift()\n }\n }\n }\n\n function instancePopStack(): void {\n if (instanceConfig.debug) {\n instanceCallStack.pop()\n }\n }\n\n function instanceGetStack(): string[] {\n return [...instanceCallStack]\n }\n\n function instanceResetRuntime(): void {\n instanceConfig = { ...DEFAULT_CONFIG }\n instanceCallStack.length = 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 = instanceConfig.debug ? instanceGetStack() : undefined\n return new MonadicError(\n `Expected ${expected} for '${path}', got ${actual}`,\n path,\n expected,\n actual,\n stack\n )\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 (instanceConfig.debug && instanceCallStack.length > 0) {\n const fullStack = details?.path\n ? [...instanceCallStack, details.path]\n : [...instanceCallStack]\n err.stack = fullStack\n }\n return err\n }\n\n return {\n version: TJS_VERSION,\n // Monadic error handling\n MonadicError,\n typeError: instanceTypeError,\n isMonadicError,\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 // Debug mode (instance-specific)\n configure: instanceConfigure,\n getConfig: instanceGetConfig,\n pushStack: instancePushStack,\n popStack: instancePopStack,\n getStack: instanceGetStack,\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 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 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 == and != in TJS)\n Is,\n IsNot,\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} → ${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",
|
|
20
|
+
"/**\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, s, type Base } from 'tosijs-schema'\n\n/** JSON Schema object type (simplified) */\ntype JSONSchema = {\n type?: string\n properties?: Record<string, JSONSchema>\n items?: JSONSchema\n required?: string[]\n [key: string]: unknown\n}\n\n/** Schema can be a tosijs-schema builder or a raw JSON Schema object */\ntype Schema = Base<any> | JSONSchema\n\n/** A runtime type with description and validation */\nexport interface RuntimeType<T = unknown> {\n /** Human-readable description of the type */\n readonly description: string\n /** Check if a value matches this type */\n check(value: unknown): value is T\n /** The underlying schema (if schema-based) */\n readonly schema?: Schema\n /** The predicate function (if predicate-based) */\n readonly predicate?: (value: unknown) => boolean\n /** Example value (for documentation and signature testing) */\n readonly example?: T\n /** Multiple example values (from schema metadata, for autocomplete hints) */\n readonly examples?: T[]\n /** Default value (for instantiation) */\n readonly default?: T\n /** Brand for type identification */\n readonly __runtimeType: true\n}\n\n/** Check if a value is a RuntimeType */\nexport function isRuntimeType(value: unknown): value is RuntimeType {\n return (\n value !== null &&\n typeof value === 'object' &&\n '__runtimeType' in value &&\n (value as any).__runtimeType === true\n )\n}\n\n/**\n * Create a runtime type with description and validation\n *\n * @overload Type(description, predicate) - custom validation function\n * @overload Type(description, schema) - schema-based validation\n * @overload Type(schema) - schema only\n */\n/**\n * Check if a value is a tosijs-schema builder (has .schema property)\n */\nfunction isSchemaBuilder(value: unknown): value is Base<any> {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'schema' in value &&\n typeof (value as any).schema === 'object'\n )\n}\n\n/**\n * Check if a value looks like a raw JSON Schema object\n */\nfunction isJSONSchema(value: unknown): value is JSONSchema {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'type' in value &&\n typeof (value as any).type === 'string'\n )\n}\n\nexport function Type<T = unknown>(\n descriptionOrSchema: string | Schema,\n predicateOrSchemaOrExample?:\n | ((value: unknown) => boolean)\n | Schema\n | T\n | undefined,\n exampleArg?: T,\n defaultArg?: T\n): RuntimeType<T> {\n // Parse arguments\n let description: string\n let predicate: ((value: unknown) => boolean) | undefined\n let schema: Schema | undefined\n let example: T | undefined = exampleArg\n let defaultValue: T | undefined = defaultArg\n\n if (typeof descriptionOrSchema === 'string') {\n // Form: Type(description, predicate/schema/example, example?, default?)\n description = descriptionOrSchema\n\n if (typeof predicateOrSchemaOrExample === 'function') {\n // Type(description, predicate, example?, default?)\n predicate = predicateOrSchemaOrExample as (value: unknown) => boolean\n // If we have example, infer schema from it for the type guard in predicate\n if (example !== undefined) {\n schema = s.infer(example)\n }\n } else if (\n predicateOrSchemaOrExample === undefined &&\n example !== undefined\n ) {\n // Type(description, undefined, example, default?) - example provides schema\n schema = s.infer(example)\n } else if (isSchemaBuilder(predicateOrSchemaOrExample)) {\n // Type(description, schemaBuilder)\n schema = predicateOrSchemaOrExample\n } else if (isJSONSchema(predicateOrSchemaOrExample)) {\n // Type(description, jsonSchema)\n schema = predicateOrSchemaOrExample\n } else if (predicateOrSchemaOrExample !== undefined) {\n // Type(description, example) - second arg is the example/default, infer schema\n // This is the simple form: Type('Name', 'Alice')\n example = predicateOrSchemaOrExample as T\n defaultValue = example // In simple form, example IS the default\n schema = s.infer(example)\n } else {\n throw new Error(\n 'Type(description) requires a predicate, schema, or example'\n )\n }\n } else {\n // Form: Type(schema) or Type(schemaBuilder)\n if (isSchemaBuilder(descriptionOrSchema)) {\n schema = descriptionOrSchema\n } else {\n schema = descriptionOrSchema as Schema\n }\n description = schemaToDescription(schema)\n }\n\n // Extract examples from schema metadata (if any)\n let examples: T[] | undefined\n if (schema) {\n const jsonSchema = (schema as any)?.schema ?? schema\n if (\n jsonSchema &&\n typeof jsonSchema === 'object' &&\n Array.isArray((jsonSchema as any).examples)\n ) {\n examples = (jsonSchema as any).examples as T[]\n }\n }\n\n // If no explicit example was provided, use first schema example for autocomplete\n if (example === undefined && examples && examples.length > 0) {\n example = examples[0]\n }\n\n // Build the check function\n const check = (value: unknown): value is T => {\n if (predicate) {\n return predicate(value)\n }\n if (schema) {\n return validate(value, schema)\n }\n return false\n }\n\n return {\n description,\n check,\n schema,\n predicate,\n example,\n examples,\n default: defaultValue,\n __runtimeType: true as const,\n }\n}\n\n/**\n * Generate a description from a schema\n */\nfunction schemaToDescription(schema: Schema): string {\n // tosijs-schema wraps JSON schema in .schema property\n const jsonSchema = (schema as any)?.schema ?? schema\n\n // Handle schema objects with type property\n if (jsonSchema && typeof jsonSchema === 'object' && 'type' in jsonSchema) {\n const s = jsonSchema as any\n switch (s.type) {\n case 'string':\n if (s.format) return `string (${s.format})`\n if (s.pattern) return `string matching ${s.pattern}`\n if (s.minLength !== undefined && s.maxLength !== undefined)\n return `string (${s.minLength}-${s.maxLength} chars)`\n return 'string'\n case 'number':\n case 'integer':\n if (s.minimum !== undefined && s.maximum !== undefined)\n return `${s.type} (${s.minimum}-${s.maximum})`\n if (s.minimum !== undefined) return `${s.type} >= ${s.minimum}`\n if (s.maximum !== undefined) return `${s.type} <= ${s.maximum}`\n return s.type\n case 'boolean':\n return 'boolean'\n case 'array':\n return 'array'\n case 'object':\n return 'object'\n case 'null':\n return 'null'\n }\n }\n\n // Fallback\n return 'value'\n}\n\n// ============================================================================\n// Built-in Types\n// ============================================================================\n\n/** String type */\nexport const TString = Type<string>(\n 'string',\n (v: unknown) => typeof v === 'string'\n)\n\n/** Number type */\nexport const TNumber = Type<number>(\n 'number',\n (v: unknown) => typeof v === 'number'\n)\n\n/** Boolean type */\nexport const TBoolean = Type<boolean>(\n 'boolean',\n (v: unknown) => typeof v === 'boolean'\n)\n\n/** Integer type */\nexport const TInteger = Type<number>(\n 'integer',\n (v: unknown) => typeof v === 'number' && Number.isInteger(v)\n)\n\n/** Positive integer type */\nexport const TPositiveInt = Type<number>(\n 'positive integer',\n (v: unknown) => typeof v === 'number' && Number.isInteger(v) && v > 0\n)\n\n/** Non-empty string type */\nexport const TNonEmptyString = Type<string>(\n 'non-empty string',\n (v: unknown) => typeof v === 'string' && v.length > 0\n)\n\n/** Email type (basic validation) */\nexport const TEmail = Type<string>(\n 'email address',\n (v: unknown) => typeof v === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v)\n)\n\n/**\n * Check if a string is a valid URL (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidUrl = (v: string): boolean => {\n try {\n new URL(v)\n return true\n } catch {\n return false\n }\n}\n\n/** URL type */\nexport const TUrl = Type<string>(\n 'URL',\n (v: unknown) => typeof v === 'string' && isValidUrl(v)\n)\n\n/** UUID type */\nexport const TUuid = Type<string>(\n 'UUID',\n (v: unknown) =>\n typeof v === 'string' &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v)\n)\n\n/**\n * Check if a string is a valid ISO 8601 timestamp (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidTimestamp = (v: string): boolean => {\n const d = new Date(v)\n return !isNaN(d.getTime()) && v.includes('T')\n}\n\n/**\n * Check if a string is a valid YYYY-MM-DD date (portable helper for predicates)\n * This will become an AJS builtin\n */\nexport const isValidLegalDate = (v: string): boolean => {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false\n const d = new Date(v + 'T00:00:00Z')\n return !isNaN(d.getTime())\n}\n\n/** ISO 8601 timestamp string (e.g., \"2024-01-15T10:30:00Z\") */\nexport const Timestamp = Type<string>(\n 'ISO 8601 timestamp',\n (v: unknown) => typeof v === 'string' && isValidTimestamp(v)\n)\n\n/** Legal date string in YYYY-MM-DD format */\nexport const LegalDate = Type<string>(\n 'date (YYYY-MM-DD)',\n (v: unknown) => typeof v === 'string' && isValidLegalDate(v)\n)\n\n// ============================================================================\n// Type Combinators\n// ============================================================================\n\n/** Create a nullable version of a type */\nexport function Nullable<T>(type: RuntimeType<T>): RuntimeType<T | null> {\n return Type<T | null>(\n `${type.description} or null`,\n (v: unknown) => v === null || type.check(v)\n )\n}\n\n/** Create an optional version of a type (nullable + undefined) */\nexport function Optional<T>(\n type: RuntimeType<T>\n): RuntimeType<T | null | undefined> {\n return Type<T | null | undefined>(\n `${type.description} (optional)`,\n (v: unknown) => v === null || v === undefined || type.check(v)\n )\n}\n\n/**\n * Create a union type\n *\n * Two forms:\n * Union(...types: RuntimeType[]) - combine existing types\n * Union(description, values) - create literal union from values\n *\n * @example\n * // From RuntimeTypes\n * const StringOrNumber = Union(TString, TNumber)\n *\n * // From literal values (used by TJS syntax)\n * const Direction = Union('cardinal direction', ['up', 'down', 'left', 'right'])\n */\nexport function Union<T extends unknown[]>(\n descriptionOrType: string | RuntimeType,\n valuesOrType?: T | RuntimeType,\n ...restTypes: RuntimeType[]\n): RuntimeType {\n // New form: Union(description, values[])\n if (typeof descriptionOrType === 'string' && Array.isArray(valuesOrType)) {\n const description = descriptionOrType\n const values = valuesOrType as unknown[]\n const valueSet = new Set(values)\n\n const result: RuntimeType & { values: unknown[] } = {\n description,\n check: (v: unknown): v is T[number] => valueSet.has(v),\n __runtimeType: true as const,\n values, // Expose values for introspection\n }\n return result\n }\n\n // Old form: Union(...types: RuntimeType[])\n const types: RuntimeType[] = []\n if (isRuntimeType(descriptionOrType)) {\n types.push(descriptionOrType)\n }\n if (isRuntimeType(valuesOrType)) {\n types.push(valuesOrType as RuntimeType)\n }\n types.push(...restTypes)\n\n const description = types.map((t) => t.description).join(' | ')\n return Type(description, (v: unknown) => types.some((t) => t.check(v)))\n}\n\n/** Create an array type */\nexport function TArray<T>(itemType: RuntimeType<T>): RuntimeType<T[]> {\n return Type<T[]>(\n `array of ${itemType.description}`,\n (v: unknown) => Array.isArray(v) && v.every((item) => itemType.check(item))\n )\n}\n\n// ============================================================================\n// Generic Types\n// ============================================================================\n\n/** Type parameter - can be a RuntimeType, schema, or example value */\nexport type TypeParam = RuntimeType | Base<any> | JSONSchema | unknown\n\n/** Generic type factory */\nexport interface GenericType<TParams extends string[] = string[]> {\n /** Instantiate the generic with concrete type arguments */\n (...typeArgs: TypeParam[]): RuntimeType\n /** The type parameter names */\n readonly params: TParams\n /** Description template */\n readonly description: string\n}\n\n/**\n * Convert a type param to a check function\n */\nfunction typeParamToCheck(param: TypeParam): (value: unknown) => boolean {\n if (isRuntimeType(param)) {\n return (v) => param.check(v)\n }\n // Check if it's a schema builder (has .schema property)\n if (param && typeof param === 'object' && 'schema' in param) {\n return (v) => validate(v, param as Base<any>)\n }\n // It's an example value - infer schema using s.infer\n const schema = s.infer(param)\n return (v) => validate(v, schema)\n}\n\n/**\n * Create a generic (parameterized) type factory\n *\n * @param params Array of type parameter names, with optional defaults: ['T', ['U', defaultSchema]]\n * @param predicate Function receiving (value, ...typeChecks) where typeChecks are validation functions\n * @param description Human-readable description template (type params will be substituted)\n *\n * @example\n * // Pair<T, U>\n * const Pair = Generic(\n * ['T', 'U'],\n * (x, checkT, checkU) =>\n * Array.isArray(x) && x.length === 2 && checkT(x[0]) && checkU(x[1]),\n * 'Pair<T, U>'\n * )\n *\n * // Usage: Pair(TString, TNumber) creates a type for [string, number]\n * // Or with examples: Pair('', 0)\n */\nexport function Generic<TParams extends string[]>(\n params: (string | [string, TypeParam])[],\n predicate: (\n value: unknown,\n ...typeChecks: Array<(v: unknown) => boolean>\n ) => boolean,\n description: string\n): GenericType<TParams> {\n // Extract param names and defaults\n const paramNames: string[] = []\n const defaults: (TypeParam | undefined)[] = []\n\n for (const p of params) {\n if (typeof p === 'string') {\n paramNames.push(p)\n defaults.push(undefined)\n } else {\n paramNames.push(p[0])\n defaults.push(p[1])\n }\n }\n\n // The factory function\n const factory = (...typeArgs: TypeParam[]): RuntimeType => {\n // Resolve type arguments, using defaults where not provided\n const checks = paramNames.map((_, i) => {\n const arg = i < typeArgs.length ? typeArgs[i] : defaults[i]\n if (arg === undefined) {\n // No arg and no default - accept anything\n return () => true\n }\n return typeParamToCheck(arg)\n })\n\n // Build description with substituted types\n let desc = description\n paramNames.forEach((name, i) => {\n const arg = i < typeArgs.length ? typeArgs[i] : defaults[i]\n let typeStr = 'any'\n if (isRuntimeType(arg)) {\n typeStr = arg.description\n } else if (arg !== undefined) {\n typeStr = typeof arg === 'string' ? 'string' : JSON.stringify(arg)\n }\n desc = desc.replace(new RegExp(`\\\\b${name}\\\\b`, 'g'), typeStr)\n })\n\n return Type(desc, (value: unknown) => predicate(value, ...checks))\n }\n\n ;(factory as any).params = paramNames as TParams\n ;(factory as any).description = description\n\n return factory as GenericType<TParams>\n}\n\n// ============================================================================\n// Built-in Generic Types\n// ============================================================================\n\n/** Pair<T, U> - 2-element tuple */\nexport const TPair = Generic(\n ['T', 'U'],\n (x, checkT, checkU) =>\n Array.isArray(x) && x.length === 2 && checkT(x[0]) && checkU(x[1]),\n 'Pair<T, U>'\n)\n\n/** Record<V> - object with string keys and values of type V */\nexport const TRecord = Generic(\n ['V'],\n (x, checkV) =>\n typeof x === 'object' &&\n x !== null &&\n !Array.isArray(x) &&\n Object.values(x).every(checkV),\n 'Record<string, V>'\n)\n\n// ============================================================================\n// Enum Types\n// ============================================================================\n\n/** Enum type with bidirectional lookup */\nexport interface EnumType<\n T extends Record<string, string | number> = Record<string, string | number>\n> extends RuntimeType<T[keyof T]> {\n /** The enum members as { Name: value } */\n readonly members: T\n /** Reverse lookup: value -> name */\n readonly names: Record<string | number, string>\n /** Get all valid values */\n readonly values: Array<T[keyof T]>\n /** Get all member names */\n readonly keys: Array<keyof T>\n}\n\n/**\n * Create an enum type with bidirectional lookup\n *\n * @param description Human-readable description\n * @param members Object mapping names to values { Pending: 0, Active: 1 }\n *\n * @example\n * const Status = Enum('task status', { Pending: 0, Active: 1, Done: 2 })\n * Status.check(0) // true\n * Status.check('done') // false\n * Status.members.Pending // 0\n * Status.names[0] // 'Pending'\n * Status.values // [0, 1, 2]\n * Status.keys // ['Pending', 'Active', 'Done']\n *\n * const Color = Enum('CSS color', { Red: 'red', Green: 'green', Blue: 'blue' })\n * Color.check('red') // true\n * Color.members.Red // 'red'\n */\nexport function Enum<T extends Record<string, string | number>>(\n description: string,\n members: T\n): EnumType<T> {\n const values = Object.values(members) as Array<T[keyof T]>\n const valueSet = new Set(values)\n const keys = Object.keys(members) as Array<keyof T>\n\n // Build reverse lookup\n const names: Record<string | number, string> = {}\n for (const [key, value] of Object.entries(members)) {\n names[value] = key\n }\n\n const enumType: EnumType<T> = {\n description,\n check: (v: unknown): v is T[keyof T] => valueSet.has(v as T[keyof T]),\n __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/** 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 */\nexport function FunctionPredicate(\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 // eslint-disable-next-line @typescript-eslint/ban-types\n check: (value: unknown): value is Function => {\n if (typeof value !== 'function') return false\n\n // Structural validation: check arity and __tjs metadata\n const expectedArity = Object.keys(params).length\n if (expectedArity > 0) {\n // Check function.length (number of params before first default)\n // eslint-disable-next-line @typescript-eslint/ban-types\n const fn = value as Function\n const meta = (fn as any).__tjs\n if (meta?.params) {\n // Has TJS metadata — check param count matches\n const metaParamCount = Object.keys(meta.params).length\n if (metaParamCount !== expectedArity) return false\n\n // Check param type kinds match where both sides have type info\n const expectedKeys = Object.keys(params)\n const metaKeys = Object.keys(meta.params)\n for (let i = 0; i < expectedKeys.length; i++) {\n const metaInfo = meta.params[metaKeys[i]]\n const expectedExample = params[expectedKeys[i]]\n if (metaInfo?.type?.kind && expectedExample !== undefined) {\n const expectedKind = kindOfExample(expectedExample)\n if (\n expectedKind &&\n metaInfo.type.kind !== expectedKind &&\n metaInfo.type.kind !== 'any'\n )\n return false\n }\n }\n }\n }\n\n return true\n },\n __runtimeType: true as const,\n }\n\n return fpType\n}\n",
|
|
21
21
|
"/**\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",
|
|
22
22
|
"/**\n * IndexedDB-based cache for module metadata\n *\n * Caches transpilation results (AST, signatures, type info) to avoid\n * re-parsing unchanged source code. Particularly useful for:\n * - Playground editors (instant feedback on unchanged code)\n * - Autocomplete metadata retrieval\n * - Development workflows with rapid iteration\n *\n * @example\n * ```typescript\n * const cache = new MetadataCache()\n * await cache.open()\n *\n * // Check cache before transpiling\n * const cached = await cache.get(source)\n * if (cached) {\n * return cached // Skip transpilation\n * }\n *\n * // Transpile and cache\n * const result = transpile(source)\n * await cache.set(source, result)\n * ```\n */\n\nimport type { SeqNode } from '../builder'\nimport type { FunctionSignature, TranspileWarning } from './types'\nimport type { TJSTypeInfo } from './emitters/js'\nimport { TJS_VERSION } from './runtime'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Cached entry for AsyncJS transpilation (ajs/transpile) */\nexport interface CachedTranspileResult {\n ast: SeqNode\n signature: FunctionSignature\n warnings: TranspileWarning[]\n}\n\n/** Cached entry for TJS transpilation (tjs/transpileToJS) */\nexport interface CachedTJSResult {\n code: string\n types: Record<string, TJSTypeInfo>\n testRunner?: string\n testCount?: number\n warnings?: string[]\n}\n\n/** Full cache entry stored in IndexedDB */\nexport interface CacheEntry {\n /** SHA-256 hash of source + version */\n hash: string\n /** TJS version used during transpilation */\n version: string\n /** Timestamp when cached */\n timestamp: number\n /** AsyncJS transpilation result */\n transpile?: CachedTranspileResult\n /** TJS transpilation result */\n tjs?: CachedTJSResult\n}\n\n/** Cache statistics */\nexport interface CacheStats {\n /** Number of entries in cache */\n entries: number\n /** Total bytes used (approximate) */\n bytes: number\n /** Cache hit count this session */\n hits: number\n /** Cache miss count this session */\n misses: number\n /** Hit rate (hits / (hits + misses)) */\n hitRate: number\n}\n\n// ============================================================================\n// Hash utilities\n// ============================================================================\n\n/**\n * Compute SHA-256 hash of source code + version\n * Falls back to simple hash if crypto.subtle unavailable\n */\nexport async function hashSource(source: string): Promise<string> {\n const input = `${TJS_VERSION}:${source}`\n\n // Try crypto.subtle (available in browsers and Node 15+)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const encoder = new TextEncoder()\n const data = encoder.encode(input)\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n // Fallback: simple djb2 hash (good enough for cache keys)\n let hash = 5381\n for (let i = 0; i < input.length; i++) {\n hash = ((hash << 5) + hash + input.charCodeAt(i)) >>> 0\n }\n return hash.toString(16)\n}\n\n/**\n * Synchronous hash for environments without async support\n * Uses djb2 algorithm\n */\nexport function hashSourceSync(source: string): string {\n const input = `${TJS_VERSION}:${source}`\n let hash = 5381\n for (let i = 0; i < input.length; i++) {\n hash = ((hash << 5) + hash + input.charCodeAt(i)) >>> 0\n }\n return hash.toString(16)\n}\n\n// ============================================================================\n// MetadataCache class\n// ============================================================================\n\nconst DB_NAME = 'tjs-metadata-cache'\nconst DB_VERSION = 1\nconst STORE_NAME = 'modules'\n\n/**\n * IndexedDB-based metadata cache\n *\n * Thread-safe and persistent across browser sessions.\n * Automatically handles versioning - entries from old TJS versions\n * are ignored (stale data won't cause issues).\n */\nexport class MetadataCache {\n private db: IDBDatabase | null = null\n private stats = { hits: 0, misses: 0 }\n private pendingOpen: Promise<void> | null = null\n\n /**\n * Open the cache database\n * Safe to call multiple times - will reuse existing connection\n */\n async open(): Promise<void> {\n if (this.db) return\n\n // Prevent multiple simultaneous opens\n if (this.pendingOpen) {\n return this.pendingOpen\n }\n\n this.pendingOpen = this._open()\n await this.pendingOpen\n this.pendingOpen = null\n }\n\n private async _open(): Promise<void> {\n return new Promise((resolve, _reject) => {\n if (typeof indexedDB === 'undefined') {\n // IndexedDB not available (Node.js without polyfill, etc.)\n resolve()\n return\n }\n\n const request = indexedDB.open(DB_NAME, DB_VERSION)\n\n request.onerror = () => {\n // Don't fail hard - cache is optional\n console.warn('MetadataCache: Failed to open IndexedDB', request.error)\n resolve()\n }\n\n request.onsuccess = () => {\n this.db = request.result\n resolve()\n }\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n\n // Create modules store with hash as key\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: 'hash' })\n store.createIndex('timestamp', 'timestamp')\n store.createIndex('version', 'version')\n }\n }\n })\n }\n\n /**\n * Get cached entry by source code\n * Returns undefined if not cached or version mismatch\n */\n async get(source: string): Promise<CacheEntry | undefined> {\n if (!this.db) {\n this.stats.misses++\n return undefined\n }\n\n const hash = await hashSource(source)\n\n return new Promise((resolve) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.get(hash)\n\n request.onerror = () => {\n this.stats.misses++\n resolve(undefined)\n }\n\n request.onsuccess = () => {\n const entry = request.result as CacheEntry | undefined\n\n // Validate version\n if (entry && entry.version !== TJS_VERSION) {\n this.stats.misses++\n resolve(undefined)\n return\n }\n\n if (entry) {\n this.stats.hits++\n } else {\n this.stats.misses++\n }\n resolve(entry)\n }\n })\n }\n\n /**\n * Get cached transpile result (AsyncJS -> AST)\n */\n async getTranspile(\n source: string\n ): Promise<CachedTranspileResult | undefined> {\n const entry = await this.get(source)\n return entry?.transpile\n }\n\n /**\n * Get cached TJS result (TJS -> JS)\n */\n async getTJS(source: string): Promise<CachedTJSResult | undefined> {\n const entry = await this.get(source)\n return entry?.tjs\n }\n\n /**\n * Store transpile result\n */\n async setTranspile(\n source: string,\n result: CachedTranspileResult\n ): Promise<void> {\n await this._set(source, { transpile: result })\n }\n\n /**\n * Store TJS result\n */\n async setTJS(source: string, result: CachedTJSResult): Promise<void> {\n await this._set(source, { tjs: result })\n }\n\n /**\n * Store or update cache entry\n */\n private async _set(\n source: string,\n data: { transpile?: CachedTranspileResult; tjs?: CachedTJSResult }\n ): Promise<void> {\n if (!this.db) return\n\n const hash = await hashSource(source)\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n\n // Get existing entry to merge\n const getRequest = store.get(hash)\n\n getRequest.onsuccess = () => {\n const existing = getRequest.result as CacheEntry | undefined\n\n const entry: CacheEntry = {\n hash,\n version: TJS_VERSION,\n timestamp: Date.now(),\n transpile: data.transpile ?? existing?.transpile,\n tjs: data.tjs ?? existing?.tjs,\n }\n\n const putRequest = store.put(entry)\n putRequest.onerror = () => reject(putRequest.error)\n putRequest.onsuccess = () => resolve()\n }\n\n getRequest.onerror = () => reject(getRequest.error)\n })\n }\n\n /**\n * Delete a specific entry\n */\n async delete(source: string): Promise<void> {\n if (!this.db) return\n\n const hash = await hashSource(source)\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.delete(hash)\n\n request.onerror = () => reject(request.error)\n request.onsuccess = () => resolve()\n })\n }\n\n /**\n * Clear all cached entries\n */\n async clear(): Promise<void> {\n if (!this.db) return\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.clear()\n\n request.onerror = () => reject(request.error)\n request.onsuccess = () => {\n this.stats = { hits: 0, misses: 0 }\n resolve()\n }\n })\n }\n\n /**\n * Remove entries older than maxAge milliseconds\n * Returns count of entries removed\n */\n async prune(maxAge: number): Promise<number> {\n if (!this.db) return 0\n\n const cutoff = Date.now() - maxAge\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n const index = store.index('timestamp')\n const range = IDBKeyRange.upperBound(cutoff)\n\n let count = 0\n const request = index.openCursor(range)\n\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n cursor.delete()\n count++\n cursor.continue()\n } else {\n resolve(count)\n }\n }\n\n request.onerror = () => reject(request.error)\n })\n }\n\n /**\n * Remove entries from old TJS versions\n * Returns count of entries removed\n */\n async pruneOldVersions(): Promise<number> {\n if (!this.db) return 0\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readwrite')\n const store = transaction.objectStore(STORE_NAME)\n\n let count = 0\n const request = store.openCursor()\n\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n const entry = cursor.value as CacheEntry\n if (entry.version !== TJS_VERSION) {\n cursor.delete()\n count++\n }\n cursor.continue()\n } else {\n resolve(count)\n }\n }\n\n request.onerror = () => reject(request.error)\n })\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<CacheStats> {\n const entries = await this.count()\n const bytes = await this.estimateSize()\n\n const total = this.stats.hits + this.stats.misses\n const hitRate = total > 0 ? this.stats.hits / total : 0\n\n return {\n entries,\n bytes,\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate,\n }\n }\n\n /**\n * Count entries in cache\n */\n async count(): Promise<number> {\n if (!this.db) return 0\n\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n const request = store.count()\n\n request.onerror = () => reject(request.error)\n request.onsuccess = () => resolve(request.result)\n })\n }\n\n /**\n * Estimate storage size in bytes\n */\n async estimateSize(): Promise<number> {\n if (!this.db) return 0\n\n // Use Storage API if available\n if (typeof navigator !== 'undefined' && navigator.storage?.estimate) {\n try {\n const estimate = await navigator.storage.estimate()\n return estimate.usage ?? 0\n } catch {\n // Fall through to manual estimation\n }\n }\n\n // Manual estimation by iterating entries\n return new Promise((resolve, reject) => {\n const transaction = this.db!.transaction(STORE_NAME, 'readonly')\n const store = transaction.objectStore(STORE_NAME)\n\n let totalSize = 0\n const request = store.openCursor()\n\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n // Rough estimate: JSON string length * 2 (UTF-16)\n totalSize += JSON.stringify(cursor.value).length * 2\n cursor.continue()\n } else {\n resolve(totalSize)\n }\n }\n\n request.onerror = () => reject(request.error)\n })\n }\n\n /**\n * Close the database connection\n */\n close(): void {\n if (this.db) {\n this.db.close()\n this.db = null\n }\n }\n\n /**\n * Check if cache is available (IndexedDB accessible)\n */\n isAvailable(): boolean {\n return this.db !== null\n }\n\n /**\n * Reset session statistics\n */\n resetStats(): void {\n this.stats = { hits: 0, misses: 0 }\n }\n}\n\n// ============================================================================\n// Global cache instance\n// ============================================================================\n\nlet globalCache: MetadataCache | null = null\n\n/**\n * Get or create the global cache instance\n * Automatically opens the database on first call\n */\nexport async function getGlobalCache(): Promise<MetadataCache> {\n if (!globalCache) {\n globalCache = new MetadataCache()\n await globalCache.open()\n }\n return globalCache\n}\n\n/**\n * Set a custom global cache instance (for testing)\n */\nexport function setGlobalCache(cache: MetadataCache | null): void {\n globalCache = cache\n}\n",
|
|
23
23
|
"// 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",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"/**\n * Timestamp - Pure functions for ISO 8601 timestamp strings\n *\n * No Date warts:\n * - Months are 1-based (January = 1)\n * - All functions are pure (string in, string out)\n * - No mutable objects\n * - UTC by default, explicit timezone for display\n */\n\n/**\n * ISO 8601 timestamp string type\n * e.g., \"2024-01-15T10:30:00.000Z\"\n */\nexport type TimestampString = string\n\n/**\n * Validate that a string is a valid ISO 8601 timestamp\n */\nexport function isValid(ts: string): ts is TimestampString {\n if (typeof ts !== 'string') return false\n const d = new Date(ts)\n return !isNaN(d.getTime()) && ts.includes('T')\n}\n\n/**\n * Get the current timestamp as ISO string\n */\nexport function now(): TimestampString {\n return new Date().toISOString()\n}\n\n/**\n * Create a timestamp from components\n * IMPORTANT: month is 1-based (1 = January, 12 = December)\n */\nexport function from(\n year: number,\n month: number,\n day: number,\n hour = 0,\n minute = 0,\n second = 0,\n ms = 0\n): TimestampString {\n // Convert 1-based month to 0-based for Date\n const d = new Date(Date.UTC(year, month - 1, day, hour, minute, second, ms))\n return d.toISOString()\n}\n\n/**\n * Parse a flexible date string into ISO timestamp\n * Handles various formats and normalizes to UTC\n */\nexport function parse(input: string): TimestampString {\n const d = new Date(input)\n if (isNaN(d.getTime())) {\n throw new Error(`Invalid date string: ${input}`)\n }\n return d.toISOString()\n}\n\n/**\n * Try to parse a date string, returning null on failure\n */\nexport function tryParse(input: string): TimestampString | null {\n try {\n return parse(input)\n } catch {\n return null\n }\n}\n\n// ============================================================================\n// Arithmetic\n// ============================================================================\n\n/**\n * Add milliseconds to a timestamp\n */\nexport function addMilliseconds(\n ts: TimestampString,\n ms: number\n): TimestampString {\n const d = new Date(ts)\n d.setTime(d.getTime() + ms)\n return d.toISOString()\n}\n\n/**\n * Add seconds to a timestamp\n */\nexport function addSeconds(\n ts: TimestampString,\n seconds: number\n): TimestampString {\n return addMilliseconds(ts, seconds * 1000)\n}\n\n/**\n * Add minutes to a timestamp\n */\nexport function addMinutes(\n ts: TimestampString,\n minutes: number\n): TimestampString {\n return addMilliseconds(ts, minutes * 60 * 1000)\n}\n\n/**\n * Add hours to a timestamp\n */\nexport function addHours(ts: TimestampString, hours: number): TimestampString {\n return addMilliseconds(ts, hours * 60 * 60 * 1000)\n}\n\n/**\n * Add days to a timestamp\n */\nexport function addDays(ts: TimestampString, days: number): TimestampString {\n return addMilliseconds(ts, days * 24 * 60 * 60 * 1000)\n}\n\n/**\n * Add weeks to a timestamp\n */\nexport function addWeeks(ts: TimestampString, weeks: number): TimestampString {\n return addDays(ts, weeks * 7)\n}\n\n/**\n * Add months to a timestamp\n * Handles month overflow correctly (e.g., Jan 31 + 1 month = Feb 28/29)\n */\nexport function addMonths(\n ts: TimestampString,\n months: number\n): TimestampString {\n const d = new Date(ts)\n const targetMonth = d.getUTCMonth() + months\n d.setUTCMonth(targetMonth)\n\n // Handle overflow (e.g., Jan 31 + 1 month shouldn't become Mar 3)\n // If the day changed, we overflowed - go back to last day of target month\n if (d.getUTCMonth() !== ((targetMonth % 12) + 12) % 12) {\n d.setUTCDate(0) // Last day of previous month\n }\n\n return d.toISOString()\n}\n\n/**\n * Add years to a timestamp\n * Handles leap years correctly (Feb 29 + 1 year = Feb 28)\n */\nexport function addYears(ts: TimestampString, years: number): TimestampString {\n const d = new Date(ts)\n const originalDay = d.getUTCDate()\n d.setUTCFullYear(d.getUTCFullYear() + years)\n\n // Handle Feb 29 -> Feb 28 in non-leap years\n if (d.getUTCDate() !== originalDay) {\n d.setUTCDate(0) // Last day of previous month\n }\n\n return d.toISOString()\n}\n\n// ============================================================================\n// Difference\n// ============================================================================\n\n/**\n * Get the difference between two timestamps in milliseconds\n * Returns a - b (positive if a is after b)\n */\nexport function diff(a: TimestampString, b: TimestampString): number {\n return new Date(a).getTime() - new Date(b).getTime()\n}\n\n/**\n * Get the difference in seconds\n */\nexport function diffSeconds(a: TimestampString, b: TimestampString): number {\n return Math.floor(diff(a, b) / 1000)\n}\n\n/**\n * Get the difference in minutes\n */\nexport function diffMinutes(a: TimestampString, b: TimestampString): number {\n return Math.floor(diff(a, b) / (60 * 1000))\n}\n\n/**\n * Get the difference in hours\n */\nexport function diffHours(a: TimestampString, b: TimestampString): number {\n return Math.floor(diff(a, b) / (60 * 60 * 1000))\n}\n\n/**\n * Get the difference in days\n */\nexport function diffDays(a: TimestampString, b: TimestampString): number {\n return Math.floor(diff(a, b) / (24 * 60 * 60 * 1000))\n}\n\n// ============================================================================\n// Extractors (all return 1-based month)\n// ============================================================================\n\n/**\n * Get the year component\n */\nexport function year(ts: TimestampString): number {\n return new Date(ts).getUTCFullYear()\n}\n\n/**\n * Get the month component (1-based: 1 = January, 12 = December)\n */\nexport function month(ts: TimestampString): number {\n return new Date(ts).getUTCMonth() + 1\n}\n\n/**\n * Get the day of month component (1-31)\n */\nexport function day(ts: TimestampString): number {\n return new Date(ts).getUTCDate()\n}\n\n/**\n * Get the hour component (0-23)\n */\nexport function hour(ts: TimestampString): number {\n return new Date(ts).getUTCHours()\n}\n\n/**\n * Get the minute component (0-59)\n */\nexport function minute(ts: TimestampString): number {\n return new Date(ts).getUTCMinutes()\n}\n\n/**\n * Get the second component (0-59)\n */\nexport function second(ts: TimestampString): number {\n return new Date(ts).getUTCSeconds()\n}\n\n/**\n * Get the millisecond component (0-999)\n */\nexport function millisecond(ts: TimestampString): number {\n return new Date(ts).getUTCMilliseconds()\n}\n\n/**\n * Get the day of week (1 = Monday, 7 = Sunday) - ISO 8601 convention\n */\nexport function dayOfWeek(ts: TimestampString): number {\n const d = new Date(ts).getUTCDay()\n return d === 0 ? 7 : d // Convert Sunday from 0 to 7\n}\n\n// ============================================================================\n// Formatting\n// ============================================================================\n\n/**\n * Format a timestamp for local display\n * Uses Intl.DateTimeFormat for timezone-aware formatting\n */\nexport function toLocal(\n ts: TimestampString,\n timezone?: string,\n options?: Intl.DateTimeFormatOptions\n): string {\n const d = new Date(ts)\n const formatOptions: Intl.DateTimeFormatOptions = {\n timeZone: timezone,\n ...options,\n }\n return new Intl.DateTimeFormat(undefined, formatOptions).format(d)\n}\n\n/**\n * Format as a readable date/time string\n */\nexport function format(ts: TimestampString, timezone?: string): string {\n return toLocal(ts, timezone, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n}\n\n/**\n * Format as date only (no time)\n */\nexport function formatDate(ts: TimestampString, timezone?: string): string {\n return toLocal(ts, timezone, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })\n}\n\n/**\n * Format as time only (no date)\n */\nexport function formatTime(ts: TimestampString, timezone?: string): string {\n return toLocal(ts, timezone, {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n}\n\n/**\n * Extract just the date portion as YYYY-MM-DD (LegalDate format)\n */\nexport function toDate(ts: TimestampString): string {\n return ts.slice(0, 10)\n}\n\n// ============================================================================\n// Comparison\n// ============================================================================\n\n/**\n * Check if a is before b\n */\nexport function isBefore(a: TimestampString, b: TimestampString): boolean {\n return diff(a, b) < 0\n}\n\n/**\n * Check if a is after b\n */\nexport function isAfter(a: TimestampString, b: TimestampString): boolean {\n return diff(a, b) > 0\n}\n\n/**\n * Check if two timestamps are equal\n */\nexport function isEqual(a: TimestampString, b: TimestampString): boolean {\n return diff(a, b) === 0\n}\n\n/**\n * Get the earlier of two timestamps\n */\nexport function min(a: TimestampString, b: TimestampString): TimestampString {\n return isBefore(a, b) ? a : b\n}\n\n/**\n * Get the later of two timestamps\n */\nexport function max(a: TimestampString, b: TimestampString): TimestampString {\n return isAfter(a, b) ? a : b\n}\n\n// ============================================================================\n// Boundaries\n// ============================================================================\n\n/**\n * Get the start of the day (00:00:00.000 UTC)\n */\nexport function startOfDay(ts: TimestampString): TimestampString {\n return from(year(ts), month(ts), day(ts))\n}\n\n/**\n * Get the end of the day (23:59:59.999 UTC)\n */\nexport function endOfDay(ts: TimestampString): TimestampString {\n return from(year(ts), month(ts), day(ts), 23, 59, 59, 999)\n}\n\n/**\n * Get the start of the month\n */\nexport function startOfMonth(ts: TimestampString): TimestampString {\n return from(year(ts), month(ts), 1)\n}\n\n/**\n * Get the end of the month\n */\nexport function endOfMonth(ts: TimestampString): TimestampString {\n const d = new Date(ts)\n d.setUTCMonth(d.getUTCMonth() + 1, 0) // Day 0 of next month = last day of this month\n d.setUTCHours(23, 59, 59, 999)\n return d.toISOString()\n}\n\n/**\n * Get the start of the year\n */\nexport function startOfYear(ts: TimestampString): TimestampString {\n return from(year(ts), 1, 1)\n}\n\n/**\n * Get the end of the year\n */\nexport function endOfYear(ts: TimestampString): TimestampString {\n return from(year(ts), 12, 31, 23, 59, 59, 999)\n}\n\n// ============================================================================\n// Default export as namespace\n// ============================================================================\n\nexport const Timestamp = {\n isValid,\n now,\n from,\n parse,\n tryParse,\n // Arithmetic\n addMilliseconds,\n addSeconds,\n addMinutes,\n addHours,\n addDays,\n addWeeks,\n addMonths,\n addYears,\n // Difference\n diff,\n diffSeconds,\n diffMinutes,\n diffHours,\n diffDays,\n // Extractors\n year,\n month,\n day,\n hour,\n minute,\n second,\n millisecond,\n dayOfWeek,\n // Formatting\n toLocal,\n format,\n formatDate,\n formatTime,\n toDate,\n // Comparison\n isBefore,\n isAfter,\n isEqual,\n min,\n max,\n // Boundaries\n startOfDay,\n endOfDay,\n startOfMonth,\n endOfMonth,\n startOfYear,\n endOfYear,\n}\n\nexport default Timestamp\n",
|
|
40
40
|
"/**\n * LegalDate - Pure functions for YYYY-MM-DD date strings\n *\n * A \"legal date\" is a calendar date without time - the kind you see on\n * contracts, birth certificates, and legal documents. It represents a\n * civil date, not a point in time.\n *\n * No Date warts:\n * - Months are 1-based (January = 1)\n * - All functions are pure (string in, string out)\n * - No mutable objects\n * - No timezone confusion (it's just a date)\n */\n\nimport { Timestamp } from './Timestamp'\n\n/**\n * Legal date string type: YYYY-MM-DD\n * e.g., \"2024-01-15\"\n */\nexport type LegalDateString = string\n\n/**\n * Validate that a string is a valid YYYY-MM-DD date\n */\nexport function isValid(date: string): date is LegalDateString {\n if (typeof date !== 'string') return false\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) return false\n\n // Parse components\n const y = parseInt(date.slice(0, 4), 10)\n const m = parseInt(date.slice(5, 7), 10)\n const d = parseInt(date.slice(8, 10), 10)\n\n // Validate ranges\n if (m < 1 || m > 12) return false\n if (d < 1) return false\n\n // Check day against actual days in month\n const daysInM = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n const maxDay =\n m === 2 && ((y % 4 === 0 && y % 100 !== 0) || y % 400 === 0)\n ? 29\n : daysInM[m - 1]\n\n return d <= maxDay\n}\n\n/**\n * Get today's date as YYYY-MM-DD (in UTC)\n */\nexport function today(): LegalDateString {\n return Timestamp.toDate(Timestamp.now())\n}\n\n/**\n * Get today's date in a specific timezone\n */\nexport function todayIn(timezone: string): LegalDateString {\n const now = new Date()\n const formatter = new Intl.DateTimeFormat('en-CA', {\n timeZone: timezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n })\n return formatter.format(now)\n}\n\n/**\n * Create a date from components\n * IMPORTANT: month is 1-based (1 = January, 12 = December)\n */\nexport function from(\n year: number,\n month: number,\n day: number\n): LegalDateString {\n const y = String(year).padStart(4, '0')\n const m = String(month).padStart(2, '0')\n const d = String(day).padStart(2, '0')\n const result = `${y}-${m}-${d}`\n\n // Validate it's a real date\n if (!isValid(result)) {\n throw new Error(`Invalid date: ${year}-${month}-${day}`)\n }\n\n return result\n}\n\n/**\n * Parse a flexible date string into YYYY-MM-DD format\n */\nexport function parse(input: string): LegalDateString {\n // If already in correct format, validate and return\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(input)) {\n if (!isValid(input)) {\n throw new Error(`Invalid date: ${input}`)\n }\n return input\n }\n\n // Otherwise, try to parse it\n const d = new Date(input)\n if (isNaN(d.getTime())) {\n throw new Error(`Invalid date string: ${input}`)\n }\n\n // Extract date components in UTC\n const year = d.getUTCFullYear()\n const month = d.getUTCMonth() + 1\n const day = d.getUTCDate()\n\n return from(year, month, day)\n}\n\n/**\n * Try to parse a date string, returning null on failure\n */\nexport function tryParse(input: string): LegalDateString | null {\n try {\n return parse(input)\n } catch {\n return null\n }\n}\n\n// ============================================================================\n// Arithmetic\n// ============================================================================\n\n/**\n * Add days to a date\n */\nexport function addDays(date: LegalDateString, days: number): LegalDateString {\n const ts = toTimestamp(date)\n return Timestamp.toDate(Timestamp.addDays(ts, days))\n}\n\n/**\n * Add weeks to a date\n */\nexport function addWeeks(\n date: LegalDateString,\n weeks: number\n): LegalDateString {\n return addDays(date, weeks * 7)\n}\n\n/**\n * Add months to a date\n * Handles month overflow correctly (e.g., Jan 31 + 1 month = Feb 28/29)\n */\nexport function addMonths(\n date: LegalDateString,\n months: number\n): LegalDateString {\n const y = year(date)\n const m = month(date)\n const d = day(date)\n\n // Calculate target month\n const totalMonths = y * 12 + (m - 1) + months\n const targetYear = Math.floor(totalMonths / 12)\n const targetMonth = (totalMonths % 12) + 1\n\n // Get last day of target month\n const lastDay = daysInMonth(targetYear, targetMonth)\n const targetDay = Math.min(d, lastDay)\n\n return from(targetYear, targetMonth, targetDay)\n}\n\n/**\n * Add years to a date\n * Handles leap years correctly (Feb 29 + 1 year = Feb 28)\n */\nexport function addYears(\n date: LegalDateString,\n years: number\n): LegalDateString {\n const y = year(date)\n const m = month(date)\n const d = day(date)\n\n const targetYear = y + years\n const lastDay = daysInMonth(targetYear, m)\n const targetDay = Math.min(d, lastDay)\n\n return from(targetYear, m, targetDay)\n}\n\n// ============================================================================\n// Difference\n// ============================================================================\n\n/**\n * Get the difference between two dates in days\n * Returns a - b (positive if a is after b)\n */\nexport function diff(a: LegalDateString, b: LegalDateString): number {\n const msPerDay = 24 * 60 * 60 * 1000\n const aMs = new Date(a + 'T00:00:00Z').getTime()\n const bMs = new Date(b + 'T00:00:00Z').getTime()\n return Math.round((aMs - bMs) / msPerDay)\n}\n\n/**\n * Get the difference in complete months\n */\nexport function diffMonths(a: LegalDateString, b: LegalDateString): number {\n const aYear = year(a)\n const aMonth = month(a)\n const bYear = year(b)\n const bMonth = month(b)\n\n return (aYear - bYear) * 12 + (aMonth - bMonth)\n}\n\n/**\n * Get the difference in complete years\n */\nexport function diffYears(a: LegalDateString, b: LegalDateString): number {\n return year(a) - year(b)\n}\n\n// ============================================================================\n// Extractors (all return 1-based month)\n// ============================================================================\n\n/**\n * Get the year component\n */\nexport function year(date: LegalDateString): number {\n return parseInt(date.slice(0, 4), 10)\n}\n\n/**\n * Get the month component (1-based: 1 = January, 12 = December)\n */\nexport function month(date: LegalDateString): number {\n return parseInt(date.slice(5, 7), 10)\n}\n\n/**\n * Get the day of month component (1-31)\n */\nexport function day(date: LegalDateString): number {\n return parseInt(date.slice(8, 10), 10)\n}\n\n/**\n * Get the day of week (1 = Monday, 7 = Sunday) - ISO 8601 convention\n */\nexport function dayOfWeek(date: LegalDateString): number {\n const d = new Date(date + 'T00:00:00Z').getUTCDay()\n return d === 0 ? 7 : d // Convert Sunday from 0 to 7\n}\n\n/**\n * Get the ISO week number (1-53)\n */\nexport function weekOfYear(date: LegalDateString): number {\n const d = new Date(date + 'T00:00:00Z')\n const dayNum = d.getUTCDay() || 7\n d.setUTCDate(d.getUTCDate() + 4 - dayNum)\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1))\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7)\n}\n\n/**\n * Get the day of year (1-366)\n */\nexport function dayOfYear(date: LegalDateString): number {\n const start = from(year(date), 1, 1)\n return diff(date, start) + 1\n}\n\n/**\n * Get the quarter (1-4)\n */\nexport function quarter(date: LegalDateString): number {\n return Math.ceil(month(date) / 3)\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Check if a year is a leap year\n */\nexport function isLeapYear(y: number): boolean {\n return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0\n}\n\n/**\n * Get the number of days in a month\n * Month is 1-based (1 = January)\n */\nexport function daysInMonth(y: number, m: number): number {\n const days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n if (m === 2 && isLeapYear(y)) return 29\n return days[m - 1]\n}\n\n/**\n * Get the number of days in a year\n */\nexport function daysInYear(y: number): number {\n return isLeapYear(y) ? 366 : 365\n}\n\n// ============================================================================\n// Conversion\n// ============================================================================\n\n/**\n * Convert to ISO timestamp (midnight UTC)\n */\nexport function toTimestamp(date: LegalDateString): string {\n return date + 'T00:00:00.000Z'\n}\n\n/**\n * Convert to Unix timestamp (seconds since epoch, midnight UTC)\n */\nexport function toUnix(date: LegalDateString): number {\n return Math.floor(new Date(date + 'T00:00:00Z').getTime() / 1000)\n}\n\n/**\n * Create from Unix timestamp (seconds since epoch)\n */\nexport function fromUnix(unix: number): LegalDateString {\n const d = new Date(unix * 1000)\n return from(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate())\n}\n\n// ============================================================================\n// Formatting\n// ============================================================================\n\n/**\n * Format a date for display\n */\nexport function format(\n date: LegalDateString,\n options?: Intl.DateTimeFormatOptions\n): string {\n const d = new Date(date + 'T00:00:00Z')\n const formatOptions: Intl.DateTimeFormatOptions = {\n timeZone: 'UTC',\n ...options,\n }\n return new Intl.DateTimeFormat(undefined, formatOptions).format(d)\n}\n\n/**\n * Format as a readable date string\n */\nexport function formatLong(date: LegalDateString): string {\n return format(date, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })\n}\n\n/**\n * Format as a short date string\n */\nexport function formatShort(date: LegalDateString): string {\n return format(date, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })\n}\n\n// ============================================================================\n// Comparison\n// ============================================================================\n\n/**\n * Check if a is before b\n */\nexport function isBefore(a: LegalDateString, b: LegalDateString): boolean {\n return a < b\n}\n\n/**\n * Check if a is after b\n */\nexport function isAfter(a: LegalDateString, b: LegalDateString): boolean {\n return a > b\n}\n\n/**\n * Check if two dates are equal\n */\nexport function isEqual(a: LegalDateString, b: LegalDateString): boolean {\n return a === b\n}\n\n/**\n * Get the earlier of two dates\n */\nexport function min(a: LegalDateString, b: LegalDateString): LegalDateString {\n return a < b ? a : b\n}\n\n/**\n * Get the later of two dates\n */\nexport function max(a: LegalDateString, b: LegalDateString): LegalDateString {\n return a > b ? a : b\n}\n\n/**\n * Check if a date is between two other dates (inclusive)\n */\nexport function isBetween(\n date: LegalDateString,\n start: LegalDateString,\n end: LegalDateString\n): boolean {\n return date >= start && date <= end\n}\n\n// ============================================================================\n// Boundaries\n// ============================================================================\n\n/**\n * Get the first day of the month\n */\nexport function startOfMonth(date: LegalDateString): LegalDateString {\n return from(year(date), month(date), 1)\n}\n\n/**\n * Get the last day of the month\n */\nexport function endOfMonth(date: LegalDateString): LegalDateString {\n const y = year(date)\n const m = month(date)\n return from(y, m, daysInMonth(y, m))\n}\n\n/**\n * Get the first day of the quarter\n */\nexport function startOfQuarter(date: LegalDateString): LegalDateString {\n const q = quarter(date)\n const m = (q - 1) * 3 + 1\n return from(year(date), m, 1)\n}\n\n/**\n * Get the last day of the quarter\n */\nexport function endOfQuarter(date: LegalDateString): LegalDateString {\n const q = quarter(date)\n const m = q * 3\n return from(year(date), m, daysInMonth(year(date), m))\n}\n\n/**\n * Get the first day of the year\n */\nexport function startOfYear(date: LegalDateString): LegalDateString {\n return from(year(date), 1, 1)\n}\n\n/**\n * Get the last day of the year\n */\nexport function endOfYear(date: LegalDateString): LegalDateString {\n return from(year(date), 12, 31)\n}\n\n/**\n * Get the first day of the week (Monday)\n */\nexport function startOfWeek(date: LegalDateString): LegalDateString {\n const dow = dayOfWeek(date)\n return addDays(date, -(dow - 1))\n}\n\n/**\n * Get the last day of the week (Sunday)\n */\nexport function endOfWeek(date: LegalDateString): LegalDateString {\n const dow = dayOfWeek(date)\n return addDays(date, 7 - dow)\n}\n\n// ============================================================================\n// Default export as namespace\n// ============================================================================\n\nexport const LegalDate = {\n isValid,\n today,\n todayIn,\n from,\n parse,\n tryParse,\n // Arithmetic\n addDays,\n addWeeks,\n addMonths,\n addYears,\n // Difference\n diff,\n diffMonths,\n diffYears,\n // Extractors\n year,\n month,\n day,\n dayOfWeek,\n weekOfYear,\n dayOfYear,\n quarter,\n // Utilities\n isLeapYear,\n daysInMonth,\n daysInYear,\n // Conversion\n toTimestamp,\n toUnix,\n fromUnix,\n // Formatting\n format,\n formatLong,\n formatShort,\n // Comparison\n isBefore,\n isAfter,\n isEqual,\n min,\n max,\n isBetween,\n // Boundaries\n startOfMonth,\n endOfMonth,\n startOfQuarter,\n endOfQuarter,\n startOfYear,\n endOfYear,\n startOfWeek,\n endOfWeek,\n}\n\nexport default LegalDate\n"
|
|
41
41
|
],
|
|
42
|
-
"mappings": "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ACzD,EAAS,IAAI,EAAM,EAAE,EAIvB,IAAM,EACJ,+DACF,OAAQ,EAAQ,EAAW,KAAK,CAAmB,KAAO,KACxD,EAAS,IAAI,EAAM,EAAE,EAMvB,IAAM,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,EAGK,EAAqB,CAAC,EAC5B,QAAW,KAAM,EACf,GAAI,CAAC,EAAS,IAAI,CAAE,GAAK,CAAC,EAAS,IAAI,CAAE,GAAK,CAAC,GAAgB,CAAE,EAC/D,EAAS,KAAK,CAAE,EAIpB,OAAO,EAAS,KAAK,EAavB,SAAS,EAAiB,CACxB,EACA,EACA,EACoB,CAGpB,IAAM,EAAc,EAAO,MAAM,EAAG,CAAc,EAI5C,EAAc,uDACd,EAAQ,EAAY,MAAM,CAAW,EAE3C,GAAI,CAAC,EAAO,CAEV,IAAM,EACJ,kFACI,EAAa,EAAY,MAAM,CAAY,EACjD,GAAI,CAAC,EAAY,OACjB,OAAO,GAAsB,EAAW,GAAI,CAAS,EAGvD,OAAO,GAAsB,EAAM,GAAI,CAAS,EAMlD,SAAS,EAAqB,CAC5B,EACA,EACoB,CAEpB,IAAM,EAAS,EAAU,MAAM,GAAG,EAAE,IAAI,CAAC,IAAM,EAAE,KAAK,CAAC,EAEvD,QAAW,KAAS,EAAQ,CAK1B,IAAM,EAAa,EAAM,MACvB,IAAI,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",
|
|
43
|
-
"debugId": "
|
|
42
|
+
"mappings": "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ACzD,EAAS,IAAI,EAAM,EAAE,EAIvB,IAAM,EACJ,+DACF,OAAQ,EAAQ,EAAW,KAAK,CAAmB,KAAO,KACxD,EAAS,IAAI,EAAM,EAAE,EAMvB,IAAM,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,EAGK,EAAqB,CAAC,EAC5B,QAAW,KAAM,EACf,GAAI,CAAC,EAAS,IAAI,CAAE,GAAK,CAAC,EAAS,IAAI,CAAE,GAAK,CAAC,GAAgB,CAAE,EAC/D,EAAS,KAAK,CAAE,EAIpB,OAAO,EAAS,KAAK,EAavB,SAAS,EAAiB,CACxB,EACA,EACA,EACoB,CAGpB,IAAM,EAAc,EAAO,MAAM,EAAG,CAAc,EAI5C,EAAc,uDACd,EAAQ,EAAY,MAAM,CAAW,EAE3C,GAAI,CAAC,EAAO,CAEV,IAAM,EACJ,kFACI,EAAa,EAAY,MAAM,CAAY,EACjD,GAAI,CAAC,EAAY,OACjB,OAAO,GAAsB,EAAW,GAAI,CAAS,EAGvD,OAAO,GAAsB,EAAM,GAAI,CAAS,EAMlD,SAAS,EAAqB,CAC5B,EACA,EACoB,CAEpB,IAAM,EAAS,EAAU,MAAM,GAAG,EAAE,IAAI,CAAC,IAAM,EAAE,KAAK,CAAC,EAEvD,QAAW,KAAS,EAAQ,CAK1B,IAAM,EAAa,EAAM,MACvB,IAAI,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",
|
|
43
|
+
"debugId": "8D31A5B7E8ADBDBD64756E2164756E21",
|
|
44
44
|
"names": []
|
|
45
45
|
}
|