@devscholar/vbs-engine-js 0.0.2 → 0.0.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"vbs-engine.js","sources":["../src/lexer/token.ts","../src/lexer/keywords.ts","../src/lexer/lexer.ts","../src/parser/parser-state.ts","../src/parser/location.ts","../src/parser/expression-parser.ts","../src/parser/declarations.ts","../src/parser/procedures.ts","../src/parser/control-flow.ts","../src/parser/statements.ts","../src/parser/statement-parser.ts","../src/parser/parser.ts","../src/parser/parser-cache.ts","../src/runtime/values.ts","../src/runtime/scope.ts","../src/runtime/function-registry.ts","../src/runtime/class-registry.ts","../src/runtime/vb-array.ts","../src/runtime/errors.ts","../src/runtime/context.ts","../src/runtime/value-pool.ts","../src/interpreter/expression-evaluator.ts","../src/interpreter/statement-executor.ts","../src/builtins/locale.ts","../src/builtins/string.ts","../src/builtins/math.ts","../src/builtins/date.ts","../src/builtins/conversion.ts","../src/builtins/array.ts","../src/builtins/msgbox.ts","../src/builtins/inputbox.ts","../src/builtins/regexp.ts","../src/builtins/index.ts","../src/interpreter/interpreter.ts","../src/core/conversion.ts","../src/browser/timer-override.ts","../src/browser/eval-override.ts","../src/browser/protocol-handler.ts","../src/browser/activex.ts","../src/browser/script-parser.ts","../src/browser/event-handlers.ts","../src/browser/dom-observer.ts","../src/browser/browser-runtime.ts","../src/core/index.ts"],"sourcesContent":["export enum TokenType {\n EOF = 'EOF',\n Newline = 'Newline',\n WhiteSpace = 'WhiteSpace',\n \n Identifier = 'Identifier',\n Unknown = 'Unknown',\n \n StringLiteral = 'StringLiteral',\n NumberLiteral = 'NumberLiteral',\n DateLiteral = 'DateLiteral',\n BooleanLiteral = 'BooleanLiteral',\n NothingLiteral = 'NothingLiteral',\n NullLiteral = 'NullLiteral',\n EmptyLiteral = 'EmptyLiteral',\n \n Plus = 'Plus',\n Minus = 'Minus',\n Asterisk = 'Asterisk',\n Slash = 'Slash',\n Backslash = 'Backslash',\n Caret = 'Caret',\n Mod = 'Mod',\n \n Ampersand = 'Ampersand',\n \n Eq = 'Eq',\n Lt = 'Lt',\n Gt = 'Gt',\n Le = 'Le',\n Ge = 'Ge',\n Ne = 'Ne',\n Is = 'Is',\n \n And = 'And',\n Or = 'Or',\n Not = 'Not',\n Xor = 'Xor',\n Eqv = 'Eqv',\n Imp = 'Imp',\n \n LParen = 'LParen',\n RParen = 'RParen',\n LBrace = 'LBrace',\n RBrace = 'RBrace',\n LBracket = 'LBracket',\n RBracket = 'RBracket',\n \n Comma = 'Comma',\n Colon = 'Colon',\n Dot = 'Dot',\n Bang = 'Bang',\n \n Dim = 'Dim',\n ReDim = 'ReDim',\n Preserve = 'Preserve',\n \n Public = 'Public',\n Private = 'Private',\n \n Sub = 'Sub',\n Function = 'Function',\n End = 'End',\n Exit = 'Exit',\n \n Call = 'Call',\n Set = 'Set',\n Let = 'Let',\n Get = 'Get',\n \n If = 'If',\n Then = 'Then',\n Else = 'Else',\n ElseIf = 'ElseIf',\n \n For = 'For',\n To = 'To',\n Step = 'Step',\n Next = 'Next',\n Each = 'Each',\n In = 'In',\n \n Do = 'Do',\n Loop = 'Loop',\n While = 'While',\n Until = 'Until',\n \n Select = 'Select',\n Case = 'Case',\n \n On = 'On',\n Error = 'Error',\n Resume = 'Resume',\n Goto = 'Goto',\n \n With = 'With',\n \n Class = 'Class',\n Property = 'Property',\n New = 'New',\n \n Const = 'Const',\n \n Option = 'Option',\n Explicit = 'Explicit',\n \n ByRef = 'ByRef',\n ByVal = 'ByVal',\n Optional = 'Optional',\n ParamArray = 'ParamArray',\n \n Rem = 'Rem',\n \n Erase = 'Erase',\n \n As = 'As',\n \n Integer = 'Integer',\n Long = 'Long',\n Single = 'Single',\n Double = 'Double',\n Currency = 'Currency',\n String = 'String',\n Boolean = 'Boolean',\n Date = 'Date',\n Object = 'Object',\n Variant = 'Variant',\n Byte = 'Byte',\n}\n\nexport interface TokenLocation {\n line: number;\n column: number;\n offset: number;\n}\n\nexport interface Token {\n type: TokenType;\n value: string;\n loc: {\n start: TokenLocation;\n end: TokenLocation;\n };\n raw?: string | undefined;\n}\n","import { TokenType } from './token.ts';\n\nexport const KEYWORDS: Record<string, TokenType> = {\n 'dim': TokenType.Dim,\n 'redim': TokenType.ReDim,\n 'preserve': TokenType.Preserve,\n 'public': TokenType.Public,\n 'private': TokenType.Private,\n 'sub': TokenType.Sub,\n 'function': TokenType.Function,\n 'end': TokenType.End,\n 'exit': TokenType.Exit,\n 'call': TokenType.Call,\n 'set': TokenType.Set,\n 'let': TokenType.Let,\n 'get': TokenType.Get,\n 'if': TokenType.If,\n 'then': TokenType.Then,\n 'else': TokenType.Else,\n 'elseif': TokenType.ElseIf,\n 'for': TokenType.For,\n 'to': TokenType.To,\n 'step': TokenType.Step,\n 'next': TokenType.Next,\n 'each': TokenType.Each,\n 'in': TokenType.In,\n 'do': TokenType.Do,\n 'loop': TokenType.Loop,\n 'while': TokenType.While,\n 'until': TokenType.Until,\n 'select': TokenType.Select,\n 'case': TokenType.Case,\n 'on': TokenType.On,\n 'error': TokenType.Error,\n 'resume': TokenType.Resume,\n 'goto': TokenType.Goto,\n 'with': TokenType.With,\n 'class': TokenType.Class,\n 'property': TokenType.Property,\n 'new': TokenType.New,\n 'const': TokenType.Const,\n 'option': TokenType.Option,\n 'explicit': TokenType.Explicit,\n 'byref': TokenType.ByRef,\n 'byval': TokenType.ByVal,\n 'optional': TokenType.Optional,\n 'paramarray': TokenType.ParamArray,\n 'rem': TokenType.Rem,\n 'erase': TokenType.Erase,\n 'as': TokenType.As,\n 'and': TokenType.And,\n 'or': TokenType.Or,\n 'not': TokenType.Not,\n 'xor': TokenType.Xor,\n 'eqv': TokenType.Eqv,\n 'imp': TokenType.Imp,\n 'is': TokenType.Is,\n 'mod': TokenType.Mod,\n 'integer': TokenType.Integer,\n 'long': TokenType.Long,\n 'single': TokenType.Single,\n 'double': TokenType.Double,\n 'currency': TokenType.Currency,\n 'string': TokenType.String,\n 'boolean': TokenType.Boolean,\n 'date': TokenType.Date,\n 'object': TokenType.Object,\n 'variant': TokenType.Variant,\n 'byte': TokenType.Byte,\n 'true': TokenType.BooleanLiteral,\n 'false': TokenType.BooleanLiteral,\n 'nothing': TokenType.NothingLiteral,\n 'null': TokenType.NullLiteral,\n 'empty': TokenType.EmptyLiteral,\n};\n","import { Token, TokenType, TokenLocation } from './token.ts';\nimport { KEYWORDS } from './keywords.ts';\n\nexport interface LexerOptions {\n skipWhitespace?: boolean;\n skipNewlines?: boolean;\n}\n\nexport class Lexer {\n private source: string;\n private pos: number = 0;\n private line: number = 1;\n private column: number = 1;\n private options: LexerOptions;\n\n constructor(source: string, options: LexerOptions = {}) {\n this.source = source;\n this.options = {\n skipWhitespace: true,\n skipNewlines: false,\n ...options,\n };\n }\n\n private get current(): string {\n return this.source[this.pos] ?? '';\n }\n\n private get peek(): string {\n return this.source[this.pos + 1] ?? '';\n }\n\n private get isEOF(): boolean {\n return this.pos >= this.source.length;\n }\n\n private getLoc(): TokenLocation {\n return {\n line: this.line,\n column: this.column,\n offset: this.pos,\n };\n }\n\n private advance(): string {\n const char = this.current;\n this.pos++;\n if (char === '\\n') {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n return char;\n }\n\n private createToken(type: TokenType, value: string, start: TokenLocation, raw?: string): Token {\n return {\n type,\n value,\n loc: {\n start,\n end: this.getLoc(),\n },\n raw,\n };\n }\n\n private skipWhitespaceAndLineContinuation(): void {\n while (true) {\n while (this.current === ' ' || this.current === '\\t' || this.current === '\\r') {\n this.advance();\n }\n \n if (this.current === '_' && (this.peek === '\\n' || this.peek === '\\r')) {\n this.advance();\n if (this.peek === '\\r') {\n this.advance();\n }\n if (this.peek === '\\n') {\n this.advance();\n }\n if ((this.current as string) === '\\n') {\n this.advance();\n }\n continue;\n }\n \n break;\n }\n }\n\n private readString(quote: string): Token {\n const start = this.getLoc();\n this.advance();\n \n let value = '';\n while (!this.isEOF) {\n if (this.current === quote) {\n if (this.peek === quote) {\n value += quote;\n this.advance();\n this.advance();\n } else {\n break;\n }\n } else if (this.current === '\\n') {\n break;\n } else {\n value += this.advance();\n }\n }\n \n if (this.current === quote) {\n this.advance();\n }\n \n return this.createToken(TokenType.StringLiteral, value, start, quote + value + quote);\n }\n\n private readNumber(): Token {\n const start = this.getLoc();\n let value = '';\n let isFloat = false;\n let isExponent = false;\n \n if (this.current === '&' && (this.peek === 'h' || this.peek === 'H')) {\n this.advance();\n this.advance();\n while (/[0-9a-fA-F]/.test(this.current)) {\n value += this.advance();\n }\n const num = parseInt(value, 16);\n return this.createToken(TokenType.NumberLiteral, String(num), start, '&' + (this.source[start.offset + 1] === 'H' ? 'H' : 'h') + value);\n }\n \n if (this.current === '&' && (this.peek === 'o' || this.peek === 'O')) {\n this.advance();\n this.advance();\n while (/[0-7]/.test(this.current)) {\n value += this.advance();\n }\n const num = parseInt(value, 8);\n return this.createToken(TokenType.NumberLiteral, String(num), start, '&' + (this.source[start.offset + 1] === 'O' ? 'O' : 'o') + value);\n }\n \n while (/[0-9]/.test(this.current)) {\n value += this.advance();\n }\n \n if (this.current === '.' && /[0-9]/.test(this.peek)) {\n isFloat = true;\n value += this.advance();\n while (/[0-9]/.test(this.current)) {\n value += this.advance();\n }\n }\n \n const currentChar = this.current;\n if (currentChar === 'e' || currentChar === 'E') {\n isExponent = true;\n value += this.advance();\n const signChar = this.current;\n if (signChar === '+' || signChar === '-') {\n value += this.advance();\n }\n while (/[0-9]/.test(this.current)) {\n value += this.advance();\n }\n }\n \n if (this.current === '#' && !isFloat && !isExponent) {\n return this.readDate(start, value);\n }\n \n return this.createToken(TokenType.NumberLiteral, value, start, value);\n }\n\n private readDate(start: TokenLocation, prefix?: string): Token {\n let value = prefix ?? '';\n if (this.current === '#') {\n this.advance();\n }\n \n while (!this.isEOF && this.current !== '#') {\n if (this.current === '\\n') break;\n value += this.advance();\n }\n \n if (this.current === '#') {\n this.advance();\n }\n \n return this.createToken(TokenType.DateLiteral, value.trim(), start, '#' + value + '#');\n }\n\n private readIdentifier(): Token {\n const start = this.getLoc();\n let value = '';\n \n while (/[a-zA-Z0-9_]/.test(this.current)) {\n value += this.advance();\n }\n \n const upperValue = value.toLowerCase();\n const keywordType = KEYWORDS[upperValue];\n \n if (keywordType) {\n if (keywordType === TokenType.BooleanLiteral) {\n return this.createToken(TokenType.BooleanLiteral, upperValue, start, value);\n }\n if (keywordType === TokenType.NothingLiteral) {\n return this.createToken(TokenType.NothingLiteral, 'nothing', start, value);\n }\n if (keywordType === TokenType.NullLiteral) {\n return this.createToken(TokenType.NullLiteral, 'null', start, value);\n }\n if (keywordType === TokenType.EmptyLiteral) {\n return this.createToken(TokenType.EmptyLiteral, 'empty', start, value);\n }\n return this.createToken(keywordType, upperValue, start, value);\n }\n \n return this.createToken(TokenType.Identifier, value, start, value);\n }\n\n private readRemComment(): Token {\n const start = this.getLoc();\n let value = '';\n \n while (!this.isEOF && this.current !== '\\n') {\n value += this.advance();\n }\n \n return this.createToken(TokenType.Rem, value, start, value);\n }\n\n private readSingleLineComment(): void {\n while (!this.isEOF && this.current !== '\\n') {\n this.advance();\n }\n }\n\n nextToken(): Token {\n while (!this.isEOF) {\n if (this.options.skipWhitespace) {\n this.skipWhitespaceAndLineContinuation();\n }\n \n if (this.isEOF) {\n return this.createToken(TokenType.EOF, '', this.getLoc());\n }\n \n if (this.current === '\\n') {\n const start = this.getLoc();\n this.advance();\n if (this.options.skipNewlines) {\n continue;\n }\n return this.createToken(TokenType.Newline, '\\n', start, '\\n');\n }\n \n if (this.current === \"'\" && this.options.skipWhitespace) {\n this.readSingleLineComment();\n continue;\n }\n \n if (this.current === '\"' || this.current === \"'\") {\n return this.readString(this.current);\n }\n \n if (this.current === '#') {\n const start = this.getLoc();\n return this.readDate(start);\n }\n \n if (this.current === '&' && (this.peek === 'h' || this.peek === 'H' || this.peek === 'o' || this.peek === 'O')) {\n return this.readNumber();\n }\n \n if (/[0-9]/.test(this.current)) {\n return this.readNumber();\n }\n \n if (this.current === '.' && /[0-9]/.test(this.peek)) {\n return this.readNumber();\n }\n \n if (/[a-zA-Z_]/.test(this.current)) {\n const token = this.readIdentifier();\n if (token.type === TokenType.Rem) {\n if (this.options.skipWhitespace) {\n this.readRemComment();\n continue;\n }\n return token;\n }\n return token;\n }\n \n const start = this.getLoc();\n const char = this.current;\n \n switch (char) {\n case '+':\n this.advance();\n return this.createToken(TokenType.Plus, '+', start);\n case '-':\n this.advance();\n return this.createToken(TokenType.Minus, '-', start);\n case '*':\n this.advance();\n return this.createToken(TokenType.Asterisk, '*', start);\n case '/':\n this.advance();\n return this.createToken(TokenType.Slash, '/', start);\n case '\\\\':\n this.advance();\n return this.createToken(TokenType.Backslash, '\\\\', start);\n case '^':\n this.advance();\n return this.createToken(TokenType.Caret, '^', start);\n case '&':\n this.advance();\n return this.createToken(TokenType.Ampersand, '&', start);\n case '(':\n this.advance();\n return this.createToken(TokenType.LParen, '(', start);\n case ')':\n this.advance();\n return this.createToken(TokenType.RParen, ')', start);\n case '{':\n this.advance();\n return this.createToken(TokenType.LBrace, '{', start);\n case '}':\n this.advance();\n return this.createToken(TokenType.RBrace, '}', start);\n case '[':\n this.advance();\n return this.createToken(TokenType.LBracket, '[', start);\n case ']':\n this.advance();\n return this.createToken(TokenType.RBracket, ']', start);\n case ',':\n this.advance();\n return this.createToken(TokenType.Comma, ',', start);\n case ':':\n this.advance();\n return this.createToken(TokenType.Colon, ':', start);\n case '.':\n this.advance();\n return this.createToken(TokenType.Dot, '.', start);\n case '!':\n this.advance();\n return this.createToken(TokenType.Bang, '!', start);\n case '=':\n this.advance();\n return this.createToken(TokenType.Eq, '=', start);\n case '<':\n this.advance();\n if (this.current === '>') {\n this.advance();\n return this.createToken(TokenType.Ne, '<>', start);\n }\n if (this.current === '=') {\n this.advance();\n return this.createToken(TokenType.Le, '<=', start);\n }\n return this.createToken(TokenType.Lt, '<', start);\n case '>':\n this.advance();\n if (this.current === '=') {\n this.advance();\n return this.createToken(TokenType.Ge, '>=', start);\n }\n return this.createToken(TokenType.Gt, '>', start);\n default:\n this.advance();\n return this.createToken(TokenType.Unknown, char, start);\n }\n }\n \n return this.createToken(TokenType.EOF, '', this.getLoc());\n }\n\n tokenize(): Token[] {\n const tokens: Token[] = [];\n \n while (true) {\n const token = this.nextToken();\n tokens.push(token);\n \n if (token.type === TokenType.EOF) {\n break;\n }\n }\n \n return tokens;\n }\n}\n\nexport function tokenize(source: string, options?: LexerOptions): Token[] {\n const lexer = new Lexer(source, options);\n return lexer.tokenize();\n}\n","import type { Token, TokenType } from '../lexer/index.ts';\n\nexport class ParseError extends Error {\n public token: Token;\n public expected?: TokenType | TokenType[];\n\n constructor(message: string, token: Token, expected?: TokenType | TokenType[]) {\n super(message);\n this.name = 'ParseError';\n this.token = token;\n if (expected !== undefined) {\n this.expected = expected;\n }\n }\n}\n\nexport class ParserState {\n private tokens: Token[];\n private pos: number = 0;\n\n constructor(tokens: Token[]) {\n if (tokens.length === 0) {\n throw new Error('ParserState requires at least one token');\n }\n this.tokens = tokens;\n }\n\n get current(): Token {\n return this.tokens[this.pos] ?? this.tokens[0]!;\n }\n\n get previous(): Token {\n return this.tokens[this.pos - 1] ?? this.tokens[0]!;\n }\n\n get isEOF(): boolean {\n return this.current.type === 'EOF' as TokenType;\n }\n\n save(): number {\n return this.pos;\n }\n\n restore(pos: number): void {\n this.pos = pos;\n }\n\n advance(): Token {\n if (!this.isEOF) {\n this.pos++;\n }\n return this.previous;\n }\n\n peek(offset: number = 0): Token {\n return this.tokens[this.pos + offset] ?? this.tokens[0]!;\n }\n\n check(type: TokenType): boolean {\n return this.current.type === type;\n }\n\n checkIdentifier(): boolean {\n return this.current.type === 'Identifier' as TokenType;\n }\n\n checkAny(...types: TokenType[]): boolean {\n return types.includes(this.current.type);\n }\n\n checkNewline(): boolean {\n return this.current.type === 'Newline' as TokenType;\n }\n\n match(type: TokenType): Token | null {\n if (this.check(type)) {\n return this.advance();\n }\n return null;\n }\n\n matchAny(...types: TokenType[]): Token | null {\n if (this.checkAny(...types)) {\n return this.advance();\n }\n return null;\n }\n\n expect(type: TokenType, message?: string): Token {\n if (this.check(type)) {\n return this.advance();\n }\n throw new ParseError(\n message ?? `Expected ${type}, got ${this.current.type}`,\n this.current,\n type\n );\n }\n\n expectAny(types: TokenType[], message?: string): Token {\n if (this.checkAny(...types)) {\n return this.advance();\n }\n throw new ParseError(\n message ?? `Expected one of ${types.join(', ')}, got ${this.current.type}`,\n this.current,\n types\n );\n }\n\n skipNewlines(): void {\n while (this.match('Newline' as TokenType)) {}\n }\n\n skipOptionalNewlines(): void {\n this.skipNewlines();\n }\n\n skipStatementSeparators(): void {\n while (this.matchAny('Newline' as TokenType, 'Colon' as TokenType)) {}\n }\n}\n","import type { Position, SourceLocation } from '../ast/base.ts';\nimport type { Token } from '../lexer/index.ts';\n\nexport function tokenToPosition(token: Token): Position {\n return {\n line: token.loc.start.line,\n column: token.loc.start.column,\n };\n}\n\nexport function tokenToEndPosition(token: Token): Position {\n return {\n line: token.loc.end.line,\n column: token.loc.end.column,\n };\n}\n\nexport function createLocation(start: Token, end: Token): SourceLocation {\n return {\n start: tokenToPosition(start),\n end: tokenToEndPosition(end),\n };\n}\n\nexport function mergeLocations(start: SourceLocation, end: SourceLocation): SourceLocation {\n return {\n start: start.start,\n end: end.end,\n };\n}\n","import type {\n Expression,\n Identifier,\n Literal,\n VbEmptyLiteral,\n VbNewExpression,\n MemberExpression,\n CallExpression,\n BinaryExpression,\n LogicalExpression,\n AssignmentExpression,\n} from '../ast/index.ts';\nimport type { Token, TokenType } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { createLocation } from './location.ts';\n\nexport class ExpressionParser {\n private state: ParserState;\n\n constructor(state: ParserState) {\n this.state = state;\n }\n\n parseExpression(): Expression {\n return this.parseAssignment();\n }\n\n parseStatementExpression(): Expression {\n return this.parseStatementAssignment();\n }\n\n parseCallExpression(): Expression {\n return this.parseCall();\n }\n\n parseMemberExpression(): Expression {\n let expr = this.parseIdentifierOnly();\n\n while (true) {\n if (this.state.check('Dot' as TokenType)) {\n this.state.advance();\n const property = this.parsePropertyName();\n expr = {\n type: 'MemberExpression',\n object: expr,\n property,\n computed: false,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n { loc: property.loc! } as Token\n ),\n } as MemberExpression;\n } else if (this.state.check('Bang' as TokenType)) {\n this.state.advance();\n const property = this.parsePropertyName();\n expr = {\n type: 'MemberExpression',\n object: expr,\n property,\n computed: true,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n { loc: property.loc! } as Token\n ),\n } as MemberExpression;\n } else if (this.state.check('LBracket' as TokenType)) {\n this.state.advance();\n const index = this.parseExpression();\n const rbracket = this.state.expect('RBracket' as TokenType);\n expr = {\n type: 'MemberExpression',\n object: expr,\n property: index,\n computed: true,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n rbracket\n ),\n } as MemberExpression;\n } else {\n break;\n }\n }\n\n return expr;\n }\n\n private parseIdentifierOnly(): Expression {\n if (this.state.check('Dot' as TokenType)) {\n return this.parseWithMemberExpression();\n }\n\n const token = this.state.expect('Identifier' as TokenType);\n return {\n type: 'Identifier',\n name: token.value,\n loc: token.loc,\n };\n }\n\n private parseStatementAssignment(): Expression {\n if (this.state.check('Identifier' as TokenType) || this.state.check('Dot' as TokenType)) {\n const savedState = this.state.save();\n const left = this.parseCall();\n \n if (left.type === 'CallExpression') {\n return this.continueStringConcat(left);\n }\n \n if (this.state.check('Eq' as TokenType)) {\n if (left.type === 'Identifier' || left.type === 'MemberExpression') {\n const op = this.state.advance();\n const right = this.parseStatementAssignment();\n return this.createAssignmentExpression(left, '=', right, op);\n }\n }\n \n if ((left.type === 'Identifier' || left.type === 'MemberExpression') &&\n this.isStatementCallArgumentStart()) {\n const args = this.parseStatementCallArguments();\n const callExpr: CallExpression = {\n type: 'CallExpression',\n callee: left,\n arguments: args,\n optional: false,\n loc: createLocation({ loc: left.loc! } as Token, this.state.previous),\n } as CallExpression;\n return this.continueStringConcat(callExpr);\n }\n \n this.state.restore(savedState);\n }\n\n return this.parseStringConcat();\n }\n\n private continueStringConcat(left: Expression): Expression {\n while (this.state.check('Ampersand' as TokenType)) {\n this.state.advance();\n const right = this.parseLogicalOr();\n left = {\n type: 'BinaryExpression',\n operator: '&',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n } as BinaryExpression;\n }\n return left;\n }\n\n private isStatementCallArgumentStart(): boolean {\n return this.state.checkAny(\n 'StringLiteral' as TokenType,\n 'NumberLiteral' as TokenType,\n 'DateLiteral' as TokenType,\n 'BooleanLiteral' as TokenType,\n 'NothingLiteral' as TokenType,\n 'NullLiteral' as TokenType,\n 'EmptyLiteral' as TokenType,\n 'Identifier' as TokenType,\n 'LParen' as TokenType,\n 'New' as TokenType,\n );\n }\n\n private parseStatementCallArguments(): Expression[] {\n const args: Expression[] = [];\n\n while (!this.state.checkAny('Newline' as TokenType, 'Colon' as TokenType, 'EOF' as TokenType)) {\n args.push(this.parseExpression());\n if (!this.state.match('Comma' as TokenType)) {\n break;\n }\n }\n\n return args;\n }\n\n private parseAssignment(): Expression {\n const expr = this.parseStringConcat();\n\n if (this.state.checkAny('Eq' as TokenType)) {\n const op = this.state.advance();\n const right = this.parseAssignment();\n return this.createAssignmentExpression(expr, '=', right, op);\n }\n\n return expr;\n }\n\n private createAssignmentExpression(\n left: Expression,\n operator: string,\n right: Expression,\n token: Token\n ): AssignmentExpression {\n return {\n type: 'AssignmentExpression',\n operator: operator as AssignmentExpression['operator'],\n left: left as AssignmentExpression['left'],\n right,\n loc: createLocation(\n { loc: { start: left.loc!.start, end: left.loc!.end } } as Token,\n token\n ),\n };\n }\n\n private parseStringConcat(): Expression {\n let left = this.parseLogicalOr();\n\n while (this.state.check('Ampersand' as TokenType)) {\n this.state.advance();\n const right = this.parseLogicalOr();\n left = {\n type: 'BinaryExpression',\n operator: '&',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n } as BinaryExpression;\n }\n\n return left;\n }\n\n private parseLogicalOr(): Expression {\n let left = this.parseLogicalAnd();\n\n while (this.state.check('Or' as TokenType)) {\n this.state.advance();\n const right = this.parseLogicalAnd();\n left = {\n type: 'LogicalExpression',\n operator: '||',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseLogicalAnd(): Expression {\n let left = this.parseLogicalNot();\n\n while (this.state.check('And' as TokenType)) {\n this.state.advance();\n const right = this.parseLogicalNot();\n left = {\n type: 'LogicalExpression',\n operator: '&&',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseLogicalNot(): Expression {\n let left = this.parseComparison();\n\n while (this.state.checkAny('Xor' as TokenType, 'Eqv' as TokenType, 'Imp' as TokenType)) {\n const op = this.state.advance();\n const right = this.parseComparison();\n const operator = op.value.toLowerCase() === 'xor' ? 'xor' : \n op.value.toLowerCase() === 'eqv' ? 'eqv' : 'imp';\n left = {\n type: 'LogicalExpression',\n operator: operator as LogicalExpression['operator'],\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseComparison(): Expression {\n let left = this.parseIs();\n\n while (\n this.state.checkAny(\n 'Eq' as TokenType,\n 'Lt' as TokenType,\n 'Gt' as TokenType,\n 'Le' as TokenType,\n 'Ge' as TokenType,\n 'Ne' as TokenType\n )\n ) {\n const op = this.state.advance();\n const right = this.parseIs();\n const operator = this.getComparisonOperator(op);\n left = {\n type: 'BinaryExpression',\n operator,\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private getComparisonOperator(token: Token): BinaryExpression['operator'] {\n switch (token.type) {\n case 'Eq':\n return '==';\n case 'Lt':\n return '<';\n case 'Gt':\n return '>';\n case 'Le':\n return '<=';\n case 'Ge':\n return '>=';\n case 'Ne':\n return '!=';\n default:\n return '==';\n }\n }\n\n private parseIs(): Expression {\n const left = this.parseConcatenation();\n\n if (this.state.check('Is' as TokenType)) {\n this.state.advance();\n const right = this.parseConcatenation();\n return {\n type: 'BinaryExpression',\n operator: 'Is',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n } as BinaryExpression;\n }\n\n return left;\n }\n\n private parseConcatenation(): Expression {\n return this.parseAdditive();\n }\n\n private parseAdditive(): Expression {\n let left = this.parseMultiplicative();\n\n while (this.state.checkAny('Plus' as TokenType, 'Minus' as TokenType)) {\n const op = this.state.advance();\n const right = this.parseMultiplicative();\n left = {\n type: 'BinaryExpression',\n operator: op.type === 'Plus' ? '+' : '-',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseMultiplicative(): Expression {\n let left = this.parseIntegerDivision();\n\n while (\n this.state.checkAny('Asterisk' as TokenType, 'Slash' as TokenType)\n ) {\n const op = this.state.advance();\n const right = this.parseIntegerDivision();\n left = {\n type: 'BinaryExpression',\n operator: op.type === 'Asterisk' ? '*' : '/',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseIntegerDivision(): Expression {\n let left = this.parseMod();\n\n while (this.state.check('Backslash' as TokenType)) {\n this.state.advance();\n const right = this.parseMod();\n left = {\n type: 'BinaryExpression',\n operator: '\\\\' as BinaryExpression['operator'],\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseMod(): Expression {\n let left = this.parsePower();\n\n while (this.state.check('Mod' as TokenType)) {\n this.state.advance();\n const right = this.parsePower();\n left = {\n type: 'BinaryExpression',\n operator: '%' as BinaryExpression['operator'],\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parsePower(): Expression {\n let left = this.parseUnary();\n\n while (this.state.check('Caret' as TokenType)) {\n this.state.advance();\n const right = this.parseUnary();\n left = {\n type: 'BinaryExpression',\n operator: '**' as BinaryExpression['operator'],\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseUnary(): Expression {\n if (this.state.check('Not' as TokenType)) {\n const op = this.state.advance();\n const argument = this.parseUnary();\n return {\n type: 'UnaryExpression',\n operator: '!',\n prefix: true,\n argument,\n loc: createLocation(op, { loc: argument.loc! } as Token),\n };\n }\n\n if (this.state.check('Minus' as TokenType)) {\n const op = this.state.advance();\n const argument = this.parseUnary();\n return {\n type: 'UnaryExpression',\n operator: '-',\n prefix: true,\n argument,\n loc: createLocation(op, { loc: argument.loc! } as Token),\n };\n }\n\n if (this.state.check('Plus' as TokenType)) {\n const op = this.state.advance();\n const argument = this.parseUnary();\n return {\n type: 'UnaryExpression',\n operator: '+',\n prefix: true,\n argument,\n loc: createLocation(op, { loc: argument.loc! } as Token),\n };\n }\n\n return this.parsePostfix();\n }\n\n private parsePostfix(): Expression {\n return this.parseCall();\n }\n\n private parseCall(): Expression {\n let expr = this.parsePrimary();\n\n while (true) {\n if (this.state.check('Dot' as TokenType)) {\n this.state.advance();\n const property = this.parsePropertyName();\n expr = {\n type: 'MemberExpression',\n object: expr,\n property,\n computed: false,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n { loc: property.loc! } as Token\n ),\n } as MemberExpression;\n } else if (this.state.check('Bang' as TokenType)) {\n this.state.advance();\n const property = this.parsePropertyName();\n expr = {\n type: 'MemberExpression',\n object: expr,\n property,\n computed: true,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n { loc: property.loc! } as Token\n ),\n } as MemberExpression;\n } else if (this.state.check('LParen' as TokenType)) {\n this.state.advance();\n const args = this.parseArguments();\n const rparen = this.state.expect('RParen' as TokenType);\n expr = {\n type: 'CallExpression',\n callee: expr,\n arguments: args,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n rparen\n ),\n } as CallExpression;\n } else if (this.state.check('LBracket' as TokenType)) {\n this.state.advance();\n const index = this.parseExpression();\n const rbracket = this.state.expect('RBracket' as TokenType);\n expr = {\n type: 'MemberExpression',\n object: expr,\n property: index,\n computed: true,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n rbracket\n ),\n } as MemberExpression;\n } else {\n break;\n }\n }\n\n return expr;\n }\n\n private parseArguments(): Expression[] {\n const args: Expression[] = [];\n\n if (!this.state.check('RParen' as TokenType)) {\n while (true) {\n this.state.skipOptionalNewlines();\n \n if (this.state.check('RParen' as TokenType)) {\n break;\n }\n \n // Handle empty arguments (consecutive commas)\n if (this.state.check('Comma' as TokenType)) {\n // Empty argument - push Empty literal\n args.push({\n type: 'VbEmptyLiteral',\n value: undefined,\n raw: '',\n loc: this.state.current.loc,\n });\n } else {\n args.push(this.parseExpression());\n }\n \n this.state.skipOptionalNewlines();\n \n if (this.state.check('Comma' as TokenType)) {\n this.state.advance();\n } else {\n break;\n }\n }\n }\n\n return args;\n }\n\n parsePrimary(): Expression {\n if (this.state.check('LParen' as TokenType)) {\n return this.parseParenExpression();\n }\n\n if (this.state.check('StringLiteral' as TokenType)) {\n return this.parseStringLiteral();\n }\n\n if (this.state.check('NumberLiteral' as TokenType)) {\n return this.parseNumberLiteral();\n }\n\n if (this.state.check('DateLiteral' as TokenType)) {\n return this.parseDateLiteral();\n }\n\n if (this.state.check('BooleanLiteral' as TokenType)) {\n return this.parseBooleanLiteral();\n }\n\n if (this.state.check('NothingLiteral' as TokenType)) {\n return this.parseNothingLiteral();\n }\n\n if (this.state.check('NullLiteral' as TokenType)) {\n return this.parseNullLiteral();\n }\n\n if (this.state.check('EmptyLiteral' as TokenType)) {\n return this.parseEmptyLiteral();\n }\n\n if (this.state.check('New' as TokenType)) {\n return this.parseNewExpression();\n }\n\n if (this.state.check('Dot' as TokenType)) {\n return this.parseWithMemberExpression();\n }\n\n if (this.state.check('Identifier' as TokenType)) {\n return this.parseIdentifierOrCall();\n }\n\n throw new Error(`Unexpected token: ${this.state.current.type}`);\n }\n\n private parseWithMemberExpression(): MemberExpression {\n const dotToken = this.state.advance();\n const property = this.parsePropertyName();\n return {\n type: 'MemberExpression',\n object: { type: 'VbWithObject', loc: dotToken.loc } as Expression,\n property,\n computed: false,\n optional: false,\n loc: createLocation(dotToken, { loc: property.loc! } as Token),\n } as MemberExpression;\n }\n\n private parseParenExpression(): Expression {\n this.state.advance();\n this.state.skipOptionalNewlines();\n const expr = this.parseExpression();\n this.state.skipOptionalNewlines();\n this.state.expect('RParen' as TokenType);\n return expr;\n }\n\n private parseStringLiteral(): Literal {\n const token = this.state.advance();\n return {\n type: 'Literal',\n value: token.value,\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseNumberLiteral(): Literal {\n const token = this.state.advance();\n const value = token.value.includes('.') || token.value.includes('e') || token.value.includes('E')\n ? parseFloat(token.value)\n : parseInt(token.value, 10);\n return {\n type: 'Literal',\n value,\n raw: token.raw ?? token.value,\n loc: token.loc,\n };\n }\n\n private parseDateLiteral(): Literal {\n const token = this.state.advance();\n return {\n type: 'Literal',\n value: new Date(token.value),\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseBooleanLiteral(): Literal {\n const token = this.state.advance();\n return {\n type: 'Literal',\n value: token.value.toLowerCase() === 'true',\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseNothingLiteral(): Literal {\n const token = this.state.advance();\n return {\n type: 'Literal',\n value: Symbol.for('Nothing'),\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseNullLiteral(): Literal {\n const token = this.state.advance();\n return {\n type: 'Literal',\n value: null,\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseEmptyLiteral(): VbEmptyLiteral {\n const token = this.state.advance();\n return {\n type: 'VbEmptyLiteral',\n value: undefined,\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseNewExpression(): VbNewExpression {\n const newToken = this.state.advance();\n const callee = this.parseIdentifier();\n\n let args: Expression[] = [];\n if (this.state.check('LParen' as TokenType)) {\n this.state.advance();\n args = this.parseArguments();\n this.state.expect('RParen' as TokenType);\n }\n\n return {\n type: 'VbNewExpression',\n callee,\n arguments: args,\n loc: createLocation(newToken, this.state.previous),\n };\n }\n\n private parseIdentifierOrCall(): Expression {\n const id = this.parseIdentifier();\n\n if (this.state.check('LParen' as TokenType)) {\n this.state.advance();\n const args = this.parseArguments();\n const rparen = this.state.expect('RParen' as TokenType);\n return {\n type: 'CallExpression',\n callee: id,\n arguments: args,\n optional: false,\n loc: createLocation({ loc: id.loc! } as Token, rparen),\n } as CallExpression;\n }\n\n return id;\n }\n\n parseIdentifier(): Identifier {\n const token = this.state.expect('Identifier' as TokenType);\n return {\n type: 'Identifier',\n name: token.value,\n loc: token.loc,\n };\n }\n\n private parsePropertyName(): Identifier {\n const token = this.state.current;\n if (token.type === 'Identifier' as TokenType || \n (token.type !== 'EOF' as TokenType && \n token.type !== 'Newline' as TokenType && \n token.type !== 'LParen' as TokenType &&\n token.type !== 'RParen' as TokenType &&\n token.type !== 'Comma' as TokenType &&\n token.type !== 'Colon' as TokenType)) {\n this.state.advance();\n return {\n type: 'Identifier',\n name: token.value,\n loc: token.loc,\n };\n }\n throw new Error(`Expected property name, got ${token.type}`);\n }\n}\n","import type {\n Expression,\n VbDimStatement,\n VbVariableDeclarator,\n VbReDimStatement,\n VbEraseStatement,\n VbConstStatement,\n VbConstDeclarator,\n VbTypeAnnotation,\n} from '../ast/index.ts';\nimport type { Token } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { ExpressionParser } from './expression-parser.ts';\nimport { createLocation } from './location.ts';\n\nexport class DeclarationParser {\n constructor(\n private state: ParserState,\n private exprParser: ExpressionParser\n ) {}\n\n parseDimStatement(): VbDimStatement {\n const dimToken = this.state.advance();\n const declarations = this.parseVariableDeclarations();\n\n return {\n type: 'VbDimStatement',\n declarations,\n visibility: 'dim',\n loc: createLocation(dimToken, this.state.previous),\n };\n }\n\n parsePublicDimStatement(): VbDimStatement {\n const visibilityToken = this.state.advance();\n this.state.expect('Dim' as any);\n const declarations = this.parseVariableDeclarations();\n\n return {\n type: 'VbDimStatement',\n declarations,\n visibility: 'public',\n loc: createLocation(visibilityToken, this.state.previous),\n };\n }\n\n parsePrivateDimStatement(): VbDimStatement {\n const visibilityToken = this.state.advance();\n this.state.expect('Dim' as any);\n const declarations = this.parseVariableDeclarations();\n\n return {\n type: 'VbDimStatement',\n declarations,\n visibility: 'private',\n loc: createLocation(visibilityToken, this.state.previous),\n };\n }\n\n parseReDimStatement(): VbReDimStatement {\n const redimToken = this.state.advance();\n const preserve = this.state.match('Preserve' as any) !== null;\n const declarations = this.parseVariableDeclarations();\n\n return {\n type: 'VbReDimStatement',\n declarations,\n preserve,\n loc: createLocation(redimToken, this.state.previous),\n };\n }\n\n parseEraseStatement(): VbEraseStatement {\n const eraseToken = this.state.advance();\n const arrayName = this.exprParser.parseIdentifier();\n\n return {\n type: 'VbEraseStatement',\n arrayName,\n loc: createLocation(eraseToken, this.state.previous),\n };\n }\n\n parseConstStatement(): VbConstStatement {\n const constToken = this.state.advance();\n const declarations = this.parseConstDeclarators();\n\n return {\n type: 'VbConstStatement',\n declarations,\n visibility: 'private',\n loc: createLocation(constToken, this.state.previous),\n };\n }\n\n parsePublicConstStatement(): VbConstStatement {\n const visibilityToken = this.state.advance();\n this.state.expect('Const' as any);\n const declarations = this.parseConstDeclarators();\n\n return {\n type: 'VbConstStatement',\n declarations,\n visibility: 'public',\n loc: createLocation(visibilityToken, this.state.previous),\n };\n }\n\n parsePrivateConstStatement(): VbConstStatement {\n const visibilityToken = this.state.advance();\n this.state.expect('Const' as any);\n const declarations = this.parseConstDeclarators();\n\n return {\n type: 'VbConstStatement',\n declarations,\n visibility: 'private',\n loc: createLocation(visibilityToken, this.state.previous),\n };\n }\n\n parseVariableDeclarations(): VbVariableDeclarator[] {\n const declarations: VbVariableDeclarator[] = [];\n\n do {\n const decl = this.parseVariableDeclarator();\n declarations.push(decl);\n } while (this.state.match('Comma' as any));\n\n return declarations;\n }\n\n private parseVariableDeclarator(): VbVariableDeclarator {\n const id = this.exprParser.parseIdentifier();\n let init: Expression | null = null;\n let isArray = false;\n let arrayBounds: Expression[] = [];\n\n if (this.state.check('LParen' as any)) {\n this.state.advance();\n isArray = true;\n arrayBounds = this.parseArrayBounds();\n this.state.expect('RParen' as any);\n }\n\n if (this.state.match('Eq' as any)) {\n init = this.exprParser.parseExpression();\n }\n\n let typeAnnotation: VbTypeAnnotation | undefined;\n if (this.state.check('As' as any)) {\n typeAnnotation = this.parseTypeAnnotation();\n }\n\n return {\n type: 'VbVariableDeclarator',\n id,\n init,\n isArray,\n arrayBounds: arrayBounds.length > 0 ? arrayBounds : undefined,\n typeAnnotation,\n loc: createLocation({ loc: id.loc! } as Token, this.state.previous),\n };\n }\n\n private parseArrayBounds(): Expression[] {\n const bounds: Expression[] = [];\n\n do {\n this.state.skipOptionalNewlines();\n bounds.push(this.exprParser.parseExpression());\n this.state.skipOptionalNewlines();\n } while (this.state.match('Comma' as any));\n\n return bounds;\n }\n\n private parseTypeAnnotation(): VbTypeAnnotation {\n this.state.expect('As' as any);\n const typeToken = this.state.current;\n let typeName = '';\n let isArray = false;\n\n if (this.state.checkAny(\n 'Integer' as any,\n 'Long' as any,\n 'Single' as any,\n 'Double' as any,\n 'Currency' as any,\n 'String' as any,\n 'Boolean' as any,\n 'Date' as any,\n 'Object' as any,\n 'Variant' as any,\n 'Byte' as any,\n 'Identifier' as any\n )) {\n typeName = this.state.advance().value;\n }\n\n if (this.state.check('LParen' as any)) {\n this.state.advance();\n isArray = true;\n this.state.expect('RParen' as any);\n }\n\n return {\n type: 'VbTypeAnnotation',\n typeName,\n isArray,\n loc: createLocation(typeToken, this.state.previous),\n };\n }\n\n private parseConstDeclarators(): VbConstDeclarator[] {\n const declarations: VbConstDeclarator[] = [];\n\n do {\n const decl = this.parseConstDeclarator();\n declarations.push(decl);\n } while (this.state.match('Comma' as any));\n\n return declarations;\n }\n\n private parseConstDeclarator(): VbConstDeclarator {\n const id = this.exprParser.parseIdentifier();\n this.state.expect('Eq' as any);\n const init = this.exprParser.parseExpression();\n\n let typeAnnotation: VbTypeAnnotation | undefined;\n if (this.state.check('As' as any)) {\n typeAnnotation = this.parseTypeAnnotation();\n }\n\n return {\n type: 'VbConstDeclarator',\n id,\n init,\n typeAnnotation,\n loc: createLocation({ loc: id.loc! } as Token, this.state.previous),\n };\n }\n}\n","import type {\n Statement,\n BlockStatement,\n VbSubStatement,\n VbFunctionStatement,\n VbClassStatement,\n VbClassElement,\n VbParameter,\n VbPropertyGetStatement,\n VbPropertyLetStatement,\n VbPropertySetStatement,\n} from '../ast/index.ts';\nimport type { Token } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { ExpressionParser } from './expression-parser.ts';\nimport { createLocation } from './location.ts';\n\nfunction isVbClassElement(stmt: Statement): stmt is VbClassElement {\n const elementTypes = [\n 'VbSubStatement',\n 'VbFunctionStatement',\n 'VbPropertyGetStatement',\n 'VbPropertyLetStatement',\n 'VbPropertySetStatement',\n 'VbDimStatement',\n 'VbConstStatement',\n ];\n return elementTypes.includes(stmt.type);\n}\n\nexport class ProcedureParser {\n constructor(\n private state: ParserState,\n private exprParser: ExpressionParser,\n private parseStatement: () => Statement\n ) {}\n\n parseSubStatement(visibility?: string): VbSubStatement {\n const startToken = this.state.current;\n this.state.expect('Sub' as any);\n const name = this.exprParser.parseIdentifier();\n const params = this.parseParameters();\n this.state.skipNewlines();\n const body = this.parseBlock('End');\n this.state.expect('End' as any);\n this.state.expect('Sub' as any);\n\n return {\n type: 'VbSubStatement',\n name,\n params,\n body,\n visibility: (visibility ?? 'public') as 'public' | 'private',\n loc: createLocation(startToken, this.state.previous),\n };\n }\n\n parseFunctionStatement(visibility?: string): VbFunctionStatement {\n const startToken = this.state.current;\n this.state.expect('Function' as any);\n const name = this.exprParser.parseIdentifier();\n const params = this.parseParameters();\n this.state.skipNewlines();\n const body = this.parseBlock('End');\n this.state.expect('End' as any);\n this.state.expect('Function' as any);\n\n return {\n type: 'VbFunctionStatement',\n name,\n params,\n body,\n visibility: (visibility ?? 'public') as 'public' | 'private',\n loc: createLocation(startToken, this.state.previous),\n };\n }\n\n parseClassStatement(): VbClassStatement {\n const classToken = this.state.advance();\n const name = this.exprParser.parseIdentifier();\n this.state.skipNewlines();\n\n const body = this.parseClassBody();\n\n this.state.expect('End' as any);\n this.state.expect('Class' as any);\n\n return {\n type: 'VbClassStatement',\n name,\n body,\n loc: createLocation(classToken, this.state.previous),\n };\n }\n\n parsePropertyStatement(visibility?: string): Statement {\n this.state.expect('Property' as any);\n const propVisibility = visibility ?? 'public';\n\n if (this.state.check('Get' as any)) {\n return this.parsePropertyGet(propVisibility);\n }\n if (this.state.check('Let' as any)) {\n return this.parsePropertyLet(propVisibility);\n }\n if (this.state.check('Set' as any)) {\n return this.parsePropertySet(propVisibility);\n }\n\n throw new Error('Expected Get, Let, or Set after Property');\n }\n\n private parsePropertyGet(visibility: string): VbPropertyGetStatement {\n this.state.expect('Get' as any);\n const name = this.exprParser.parseIdentifier();\n const params = this.parseParameters();\n this.state.skipNewlines();\n const body = this.parseBlock('End');\n this.state.expect('End' as any);\n this.state.expect('Property' as any);\n\n return {\n type: 'VbPropertyGetStatement',\n name,\n params,\n body,\n visibility: visibility as 'public' | 'private',\n loc: createLocation(this.state.previous, this.state.previous),\n };\n }\n\n private parsePropertyLet(visibility: string): VbPropertyLetStatement {\n this.state.expect('Let' as any);\n const name = this.exprParser.parseIdentifier();\n const params = this.parseParameters();\n this.state.skipNewlines();\n const body = this.parseBlock('End');\n this.state.expect('End' as any);\n this.state.expect('Property' as any);\n\n return {\n type: 'VbPropertyLetStatement',\n name,\n params,\n body,\n visibility: visibility as 'public' | 'private',\n loc: createLocation(this.state.previous, this.state.previous),\n };\n }\n\n private parsePropertySet(visibility: string): VbPropertySetStatement {\n this.state.expect('Set' as any);\n const name = this.exprParser.parseIdentifier();\n const params = this.parseParameters();\n this.state.skipNewlines();\n const body = this.parseBlock('End');\n this.state.expect('End' as any);\n this.state.expect('Property' as any);\n\n return {\n type: 'VbPropertySetStatement',\n name,\n params,\n body,\n visibility: visibility as 'public' | 'private',\n loc: createLocation(this.state.previous, this.state.previous),\n };\n }\n\n parseParameters(): VbParameter[] {\n const params: VbParameter[] = [];\n\n if (!this.state.check('LParen' as any)) {\n return params;\n }\n\n this.state.advance();\n\n if (!this.state.check('RParen' as any)) {\n do {\n this.state.skipOptionalNewlines();\n const param = this.parseParameter();\n params.push(param);\n this.state.skipOptionalNewlines();\n } while (this.state.match('Comma' as any));\n }\n\n this.state.expect('RParen' as any);\n return params;\n }\n\n private parseParameter(): VbParameter {\n let byRef = true;\n let isOptional = false;\n let isParamArray = false;\n\n if (this.state.check('Optional' as any)) {\n this.state.advance();\n isOptional = true;\n }\n\n if (this.state.check('ParamArray' as any)) {\n this.state.advance();\n isParamArray = true;\n }\n\n if (this.state.check('ByRef' as any)) {\n this.state.advance();\n byRef = true;\n } else if (this.state.check('ByVal' as any)) {\n this.state.advance();\n byRef = false;\n }\n\n const name = this.exprParser.parseIdentifier();\n let isArray = false;\n let defaultValue: any;\n\n if (this.state.check('LParen' as any)) {\n this.state.advance();\n isArray = true;\n this.state.expect('RParen' as any);\n }\n\n if (this.state.match('Eq' as any)) {\n defaultValue = this.exprParser.parseExpression();\n }\n\n return {\n type: 'VbParameter',\n name,\n byRef,\n isArray,\n defaultValue,\n isOptional,\n isParamArray,\n loc: createLocation({ loc: name.loc! } as Token, this.state.previous),\n };\n }\n\n parseBlock(endKeyword?: string): BlockStatement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (endKeyword && this.state.check(endKeyword as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseClassBody(): VbClassElement[] {\n const body: VbClassElement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('End' as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n if (isVbClassElement(stmt)) {\n body.push(stmt);\n }\n }\n\n return body;\n }\n}\n","import type {\n Statement,\n BlockStatement,\n Expression,\n IfStatement,\n VbForToStatement,\n VbForEachStatement,\n VbDoLoopStatement,\n VbSelectCaseStatement,\n VbCaseClause,\n} from '../ast/index.ts';\nimport type { Token } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { ExpressionParser } from './expression-parser.ts';\nimport { createLocation } from './location.ts';\n\nexport class ControlFlowParser {\n constructor(\n private state: ParserState,\n private exprParser: ExpressionParser,\n private parseStatement: () => Statement\n ) {}\n\n parseIfStatement(): IfStatement {\n const ifToken = this.state.advance();\n const test = this.exprParser.parseExpression();\n this.state.skipOptionalNewlines();\n this.state.expect('Then' as any);\n\n const hasNewlineAfterThen = this.state.checkNewline();\n this.state.skipOptionalNewlines();\n \n if (hasNewlineAfterThen) {\n return this.parseMultiLineIf(ifToken, test);\n }\n\n const consequent = this.parseSingleLineIfBody();\n let alternate: Statement | null = null;\n\n if (this.state.check('Else' as any)) {\n this.state.advance();\n alternate = this.parseSingleLineIfBody();\n }\n\n if (this.state.check('End' as any)) {\n this.state.advance();\n this.state.expect('If' as any);\n }\n\n return {\n type: 'IfStatement',\n test,\n consequent,\n alternate,\n loc: createLocation(ifToken, this.state.previous),\n };\n }\n\n private parseMultiLineIf(ifToken: Token, test: Expression): IfStatement {\n this.state.skipNewlines();\n\n const consequent = this.parseIfBlock();\n let alternate: Statement | null = null;\n\n if (this.state.check('ElseIf' as any)) {\n alternate = this.parseElseIfStatement();\n } else if (this.state.check('Else' as any)) {\n this.state.advance();\n this.state.skipNewlines();\n alternate = this.parseIfBlock();\n }\n\n this.state.expect('End' as any);\n this.state.expect('If' as any);\n\n return {\n type: 'IfStatement',\n test,\n consequent,\n alternate,\n loc: createLocation(ifToken, this.state.previous),\n };\n }\n\n parseForStatement(): Statement {\n const forToken = this.state.advance();\n\n if (this.state.check('Each' as any)) {\n return this.parseForEachStatement(forToken);\n }\n\n return this.parseForToStatement(forToken);\n }\n\n parseDoStatement(): VbDoLoopStatement {\n const doToken = this.state.advance();\n let test: Expression | null = null;\n let testPosition: VbDoLoopStatement['testPosition'] = null;\n\n if (this.state.check('While' as any)) {\n this.state.advance();\n test = this.exprParser.parseExpression();\n testPosition = 'while-do';\n } else if (this.state.check('Until' as any)) {\n this.state.advance();\n test = this.exprParser.parseExpression();\n testPosition = 'until-do';\n }\n\n this.state.skipNewlines();\n const body = this.parseDoBody();\n\n if (this.state.check('While' as any)) {\n this.state.advance();\n test = this.exprParser.parseExpression();\n testPosition = 'do-while';\n } else if (this.state.check('Until' as any)) {\n this.state.advance();\n test = this.exprParser.parseExpression();\n testPosition = 'do-until';\n }\n\n this.state.expect('Loop' as any);\n\n return {\n type: 'VbDoLoopStatement',\n body,\n test,\n testPosition,\n loc: createLocation(doToken, this.state.previous),\n };\n }\n\n parseWhileStatement(): Statement {\n const whileToken = this.state.advance();\n const test = this.exprParser.parseExpression();\n this.state.skipNewlines();\n const body = this.parseWhileBody();\n\n return {\n type: 'WhileStatement',\n test,\n body,\n loc: createLocation(whileToken, this.state.previous),\n };\n }\n\n parseSelectStatement(): VbSelectCaseStatement {\n const selectToken = this.state.advance();\n this.state.expect('Case' as any);\n const discriminant = this.exprParser.parseExpression();\n this.state.skipNewlines();\n\n const cases = this.parseCaseClauses();\n\n this.state.expect('End' as any);\n this.state.expect('Select' as any);\n\n return {\n type: 'VbSelectCaseStatement',\n discriminant,\n cases,\n loc: createLocation(selectToken, this.state.previous),\n };\n }\n\n private parseSingleLineIfBody(): BlockStatement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n if (this.state.checkNewline()) {\n break;\n }\n \n if (this.state.check('Else' as any) || this.state.check('ElseIf' as any)) {\n break;\n }\n\n if (this.state.check('End' as any)) {\n break;\n }\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseIfBlock(): BlockStatement {\n const body: Statement[] = [];\n let nestedIfDepth = 0;\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('If' as any)) {\n const savedPos = this.state.save();\n this.state.advance();\n while (!this.state.isEOF && !this.state.check('Then' as any)) {\n this.state.advance();\n }\n if (this.state.check('Then' as any)) {\n this.state.advance();\n const isSingleLine = !this.state.checkNewline();\n if (isSingleLine) {\n this.state.restore(savedPos);\n const stmt = this.parseStatement();\n body.push(stmt);\n continue;\n } else {\n this.state.restore(savedPos);\n this.state.advance();\n while (!this.state.isEOF && !this.state.check('Then' as any)) {\n this.state.advance();\n }\n this.state.advance();\n nestedIfDepth++;\n continue;\n }\n }\n this.state.restore(savedPos);\n }\n\n if (this.state.check('End' as any)) {\n const savedPos = this.state.save();\n this.state.advance();\n if (this.state.check('If' as any)) {\n if (nestedIfDepth > 0) {\n nestedIfDepth--;\n this.state.restore(savedPos);\n const stmt = this.parseStatement();\n body.push(stmt);\n continue;\n }\n this.state.restore(savedPos);\n break;\n }\n this.state.restore(savedPos);\n }\n\n if (this.state.checkAny('Else' as any, 'ElseIf' as any)) {\n if (nestedIfDepth > 0) {\n const stmt = this.parseStatement();\n body.push(stmt);\n continue;\n }\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseElseIfStatement(): Statement {\n this.state.advance();\n const test = this.exprParser.parseExpression();\n this.state.skipOptionalNewlines();\n this.state.expect('Then' as any);\n this.state.skipNewlines();\n\n const consequent = this.parseIfBlock();\n let alternate: Statement | null = null;\n\n if (this.state.check('ElseIf' as any)) {\n alternate = this.parseElseIfStatement();\n } else if (this.state.check('Else' as any)) {\n this.state.advance();\n this.state.skipNewlines();\n alternate = this.parseIfBlock();\n }\n\n return {\n type: 'IfStatement',\n test,\n consequent,\n alternate,\n loc: createLocation(this.state.previous, this.state.previous),\n };\n }\n\n private parseForToStatement(forToken: Token): VbForToStatement {\n const left = this.exprParser.parseIdentifier();\n this.state.expect('Eq' as any);\n const init = this.exprParser.parseExpression();\n this.state.expect('To' as any);\n const to = this.exprParser.parseExpression();\n\n let step: Expression | null = null;\n if (this.state.match('Step' as any)) {\n step = this.exprParser.parseExpression();\n }\n\n this.state.skipNewlines();\n const body = this.parseForBody();\n\n return {\n type: 'VbForToStatement',\n left,\n init,\n to,\n step,\n body,\n loc: createLocation(forToken, this.state.previous),\n };\n }\n\n private parseForEachStatement(forToken: Token): VbForEachStatement {\n this.state.expect('Each' as any);\n const left = this.exprParser.parseIdentifier();\n this.state.expect('In' as any);\n const right = this.exprParser.parseExpression();\n this.state.skipNewlines();\n const body = this.parseForBody();\n\n return {\n type: 'VbForEachStatement',\n left,\n right,\n body,\n loc: createLocation(forToken, this.state.previous),\n };\n }\n\n private parseForBody(): Statement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('Next' as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n this.state.expect('Next' as any);\n if (this.state.check('Identifier' as any)) {\n this.state.advance();\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseDoBody(): Statement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.checkAny('Loop' as any, 'While' as any, 'Until' as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseWhileBody(): Statement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('Wend' as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n this.state.expect('Wend' as any);\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseCaseClauses(): VbCaseClause[] {\n const cases: VbCaseClause[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('End' as any)) {\n break;\n }\n\n if (this.state.check('Case' as any)) {\n const caseClause = this.parseCaseClause();\n cases.push(caseClause);\n } else {\n break;\n }\n }\n\n return cases;\n }\n\n private parseCaseClause(): VbCaseClause {\n const caseToken = this.state.advance();\n let test: Expression | Expression[] | null = null;\n let isElse = false;\n\n if (this.state.check('Else' as any)) {\n this.state.advance();\n isElse = true;\n } else {\n test = this.parseCaseExpressions();\n }\n\n this.state.skipNewlines();\n const consequent = this.parseCaseBody();\n\n return {\n type: 'VbCaseClause',\n test,\n consequent,\n isElse,\n loc: createLocation(caseToken, this.state.previous),\n };\n }\n\n private parseCaseExpressions(): Expression | Expression[] {\n const expressions: Expression[] = [];\n\n do {\n if (this.state.check('Is' as any)) {\n this.state.advance();\n const op = this.state.advance();\n const value = this.exprParser.parseExpression();\n expressions.push({\n type: 'BinaryExpression',\n operator: this.getComparisonOperator(op),\n left: { type: 'Identifier', name: '__select_expr__' },\n right: value,\n } as Expression);\n } else {\n expressions.push(this.exprParser.parseExpression());\n }\n } while (this.state.match('Comma' as any));\n\n return expressions.length === 1 ? expressions[0] : expressions;\n }\n\n private getComparisonOperator(token: Token): string {\n const opMap: Record<string, string> = {\n 'Eq': '==',\n 'Lt': '<',\n 'Gt': '>',\n 'Le': '<=',\n 'Ge': '>=',\n 'Ne': '!=',\n };\n return opMap[token.type] ?? '==';\n }\n\n private parseCaseBody(): Statement[] {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('Case' as any) || this.state.check('End' as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return body;\n }\n}\n","import type {\n Statement,\n Expression,\n VbWithStatement,\n VbExitStatement,\n VbOptionExplicitStatement,\n} from '../ast/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { ExpressionParser } from './expression-parser.ts';\nimport { createLocation } from './location.ts';\n\nexport class StatementsParser {\n constructor(\n private state: ParserState,\n private exprParser: ExpressionParser,\n private parseStatement: () => Statement\n ) {}\n\n parseWithStatement(): VbWithStatement {\n const withToken = this.state.advance();\n const object = this.exprParser.parseExpression();\n this.state.skipNewlines();\n const body = this.parseWithBody();\n\n this.state.expect('End' as any);\n this.state.expect('With' as any);\n\n return {\n type: 'VbWithStatement',\n object,\n body,\n loc: createLocation(withToken, this.state.previous),\n };\n }\n\n parseExitStatement(): VbExitStatement {\n const exitToken = this.state.advance();\n\n const targetTypes: Record<string, VbExitStatement['target']> = {\n 'Sub': 'Sub',\n 'Function': 'Function',\n 'Property': 'Property',\n 'Do': 'Do',\n 'For': 'For',\n 'Select': 'Select',\n };\n\n const targetToken = this.state.current;\n const target = targetTypes[targetToken.type as string];\n\n if (target) {\n this.state.advance();\n }\n\n return {\n type: 'VbExitStatement',\n target: target ?? 'Sub',\n loc: createLocation(exitToken, this.state.previous),\n };\n }\n\n parseOptionStatement(): VbOptionExplicitStatement {\n const optionToken = this.state.advance();\n this.state.expect('Explicit' as any);\n\n return {\n type: 'VbOptionExplicitStatement',\n loc: createLocation(optionToken, this.state.previous),\n };\n }\n\n parseCallStatement(): Statement {\n const callToken = this.state.advance();\n const callee = this.exprParser.parseMemberExpression();\n\n let args: Expression[] = [];\n if (this.state.check('LParen' as any)) {\n this.state.advance();\n args = this.parseCallArguments();\n this.state.expect('RParen' as any);\n } else if (!this.state.checkAny('Newline' as any, 'Colon' as any, 'EOF' as any)) {\n args = this.parseCallArgumentsNoParens();\n }\n\n return {\n type: 'VbCallStatement',\n callee,\n arguments: args,\n loc: createLocation(callToken, this.state.previous),\n };\n }\n\n parseSetStatement(): Statement {\n const setToken = this.state.advance();\n const left = this.exprParser.parseCallExpression();\n this.state.expect('Eq' as any);\n const right = this.exprParser.parseExpression();\n\n const assignment = {\n type: 'AssignmentExpression',\n operator: '=',\n left: left as Expression,\n right,\n isSet: true,\n loc: createLocation(setToken, this.state.previous),\n } as Expression;\n\n return {\n type: 'ExpressionStatement',\n expression: assignment,\n loc: createLocation(setToken, this.state.previous),\n };\n }\n\n parseOnStatement(): Statement {\n const onToken = this.state.advance();\n this.state.expect('Error' as any);\n\n if (this.state.match('Resume' as any)) {\n this.state.expect('Next' as any);\n return {\n type: 'VbOnErrorHandlerStatement',\n action: 'resume_next',\n loc: createLocation(onToken, this.state.previous),\n };\n }\n\n if (this.state.match('Goto' as any)) {\n if (this.state.check('NumberLiteral' as any)) {\n const numToken = this.state.advance();\n if (String(numToken.value) === '0') {\n return {\n type: 'VbOnErrorHandlerStatement',\n action: 'goto_0',\n loc: createLocation(onToken, this.state.previous),\n };\n }\n }\n const label = this.exprParser.parseIdentifier();\n return {\n type: 'VbOnErrorHandlerStatement',\n action: 'goto_label',\n label,\n loc: createLocation(onToken, this.state.previous),\n };\n }\n\n throw new Error('Expected Resume Next or Goto after On Error');\n }\n\n parseResumeStatement(): Statement {\n const resumeToken = this.state.advance();\n\n if (this.state.match('Next' as any)) {\n return {\n type: 'VbResumeStatement',\n target: 'next',\n loc: createLocation(resumeToken, this.state.previous),\n };\n }\n\n return {\n type: 'VbResumeStatement',\n target: null,\n loc: createLocation(resumeToken, this.state.previous),\n };\n }\n\n parseExpressionStatement(): Statement {\n const expr = this.exprParser.parseStatementExpression();\n\n return {\n type: 'ExpressionStatement',\n expression: expr,\n loc: expr.loc,\n };\n }\n\n private parseWithBody(): Statement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('End' as any) && this.state.peek(1).type === 'With' as any) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseCallArguments(): Expression[] {\n const args: Expression[] = [];\n\n if (!this.state.check('RParen' as any)) {\n while (true) {\n this.state.skipOptionalNewlines();\n \n if (this.state.check('RParen' as any)) {\n break;\n }\n \n // Handle empty arguments (consecutive commas)\n if (this.state.check('Comma' as any)) {\n args.push({\n type: 'VbEmptyLiteral',\n value: undefined,\n raw: '',\n loc: this.state.current.loc,\n });\n } else {\n args.push(this.exprParser.parseExpression());\n }\n \n this.state.skipOptionalNewlines();\n \n if (this.state.check('Comma' as any)) {\n this.state.advance();\n } else {\n break;\n }\n }\n }\n\n return args;\n }\n\n private parseCallArgumentsNoParens(): Expression[] {\n const args: Expression[] = [];\n\n while (!this.state.checkAny('Newline' as any, 'Colon' as any, 'EOF' as any)) {\n args.push(this.exprParser.parseExpression());\n if (!this.state.match('Comma' as any)) {\n break;\n }\n }\n\n return args;\n }\n}\n","import type { Statement, VbGotoStatement, VbLabelStatement } from '../ast/index.ts';\nimport type { TokenType } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { ExpressionParser } from './expression-parser.ts';\nimport { DeclarationParser } from './declarations.ts';\nimport { ProcedureParser } from './procedures.ts';\nimport { ControlFlowParser } from './control-flow.ts';\nimport { StatementsParser } from './statements.ts';\nimport { createLocation } from './location.ts';\n\nexport class StatementParser {\n private state: ParserState;\n private exprParser: ExpressionParser;\n private declarationParser: DeclarationParser;\n private procedureParser: ProcedureParser;\n private controlFlowParser: ControlFlowParser;\n private statementsParser: StatementsParser;\n\n constructor(state: ParserState) {\n this.state = state;\n this.exprParser = new ExpressionParser(state);\n \n this.declarationParser = new DeclarationParser(state, this.exprParser);\n this.procedureParser = new ProcedureParser(state, this.exprParser, () => this.parseStatement());\n this.controlFlowParser = new ControlFlowParser(state, this.exprParser, () => this.parseStatement());\n this.statementsParser = new StatementsParser(state, this.exprParser, () => this.parseStatement());\n }\n\n parseStatement(): Statement {\n this.state.skipNewlines();\n\n const token = this.state.current;\n\n switch (token.type) {\n case 'Dim' as TokenType:\n return this.declarationParser.parseDimStatement();\n case 'ReDim' as TokenType:\n return this.declarationParser.parseReDimStatement();\n case 'Erase' as TokenType:\n return this.declarationParser.parseEraseStatement();\n case 'Const' as TokenType:\n return this.declarationParser.parseConstStatement();\n case 'Public' as TokenType:\n return this.parseVisibilityStatement();\n case 'Private' as TokenType:\n return this.parseVisibilityStatement();\n case 'Sub' as TokenType:\n return this.procedureParser.parseSubStatement();\n case 'Function' as TokenType:\n return this.procedureParser.parseFunctionStatement();\n case 'Class' as TokenType:\n return this.procedureParser.parseClassStatement();\n case 'Property' as TokenType:\n return this.procedureParser.parsePropertyStatement();\n case 'If' as TokenType:\n return this.controlFlowParser.parseIfStatement();\n case 'For' as TokenType:\n return this.controlFlowParser.parseForStatement();\n case 'Do' as TokenType:\n return this.controlFlowParser.parseDoStatement();\n case 'While' as TokenType:\n return this.controlFlowParser.parseWhileStatement();\n case 'Select' as TokenType:\n return this.controlFlowParser.parseSelectStatement();\n case 'With' as TokenType:\n return this.statementsParser.parseWithStatement();\n case 'Exit' as TokenType:\n return this.statementsParser.parseExitStatement();\n case 'Option' as TokenType:\n return this.statementsParser.parseOptionStatement();\n case 'Call' as TokenType:\n return this.statementsParser.parseCallStatement();\n case 'Set' as TokenType:\n return this.statementsParser.parseSetStatement();\n case 'On' as TokenType:\n return this.statementsParser.parseOnStatement();\n case 'Resume' as TokenType:\n return this.statementsParser.parseResumeStatement();\n case 'Goto' as TokenType:\n return this.parseGotoStatement();\n case 'Colon' as TokenType:\n this.state.advance();\n return this.parseStatement();\n default:\n if (this.state.checkIdentifier() && this.state.peek(1).type === 'Colon' as TokenType) {\n return this.parseLabelStatement();\n }\n return this.statementsParser.parseExpressionStatement();\n }\n }\n\n private parseGotoStatement(): VbGotoStatement {\n const gotoToken = this.state.advance();\n const label = this.exprParser.parseIdentifier();\n \n return {\n type: 'VbGotoStatement',\n label,\n loc: createLocation(gotoToken, this.state.previous),\n };\n }\n\n private parseLabelStatement(): VbLabelStatement {\n const labelToken = this.state.advance();\n this.state.expect('Colon' as TokenType);\n \n return {\n type: 'VbLabelStatement',\n label: {\n type: 'Identifier',\n name: labelToken.value,\n loc: labelToken.loc,\n },\n loc: createLocation(labelToken, this.state.previous),\n };\n }\n\n private parseVisibilityStatement(): Statement {\n const visibilityToken = this.state.advance();\n const visibility = visibilityToken.type === 'Public' ? 'public' : 'private';\n\n if (this.state.check('Dim' as TokenType)) {\n return this.declarationParser.parsePublicDimStatement();\n }\n\n if (this.state.check('Const' as TokenType)) {\n return visibility === 'public' \n ? this.declarationParser.parsePublicConstStatement()\n : this.declarationParser.parsePrivateConstStatement();\n }\n\n if (this.state.check('Sub' as TokenType)) {\n return this.procedureParser.parseSubStatement(visibility);\n }\n\n if (this.state.check('Function' as TokenType)) {\n return this.procedureParser.parseFunctionStatement(visibility);\n }\n\n if (this.state.check('Property' as TokenType)) {\n return this.procedureParser.parsePropertyStatement(visibility);\n }\n\n if (this.state.checkIdentifier()) {\n const declarations = this.declarationParser.parseVariableDeclarations();\n return {\n type: 'VbDimStatement',\n declarations,\n visibility: visibility as 'public' | 'private',\n loc: { start: visibilityToken.loc.start, end: this.state.previous.loc.end },\n };\n }\n\n throw new Error(`Expected Dim, Const, Sub, Function, or Property after ${visibility}`);\n }\n}\n","import type { Program } from '../ast/index.ts';\nimport type { Token } from '../lexer/index.ts';\nimport { Lexer } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { StatementParser } from './statement-parser.ts';\n\nexport interface ParserOptions {\n source?: string;\n}\n\nexport class Parser {\n private state: ParserState;\n private stmtParser: StatementParser;\n\n constructor(tokens: Token[]) {\n this.state = new ParserState(tokens);\n this.stmtParser = new StatementParser(this.state);\n }\n\n parse(): Program {\n const body = [];\n\n while (!this.state.isEOF) {\n this.state.skipNewlines();\n if (this.state.isEOF) break;\n\n const stmt = this.stmtParser.parseStatement();\n body.push(stmt);\n }\n\n const lastToken = this.state.current;\n\n return {\n type: 'Program',\n body,\n sourceType: 'script',\n loc: {\n start: { line: 1, column: 0 },\n end: lastToken.loc.end,\n },\n };\n }\n}\n\nexport function parse(source: string, _options?: ParserOptions): Program {\n const lexer = new Lexer(source);\n const tokens = lexer.tokenize();\n const parser = new Parser(tokens);\n return parser.parse();\n}\n","/**\n * Parser Cache - LRU Cache for Parsed AST\n * \n * Performance improvements:\n * 1. Avoid re-parsing the same code multiple times\n * 2. LRU eviction policy to limit memory usage\n * 3. Hash-based cache key for fast lookup\n */\n\nimport type { Program } from '../ast/index.ts';\n\ninterface CacheEntry {\n ast: Program;\n lastAccessed: number;\n accessCount: number;\n}\n\nexport class ParserCache {\n private cache: Map<string, CacheEntry> = new Map();\n private maxSize: number;\n private defaultTTL: number; // Time to live in milliseconds\n\n constructor(maxSize: number = 100, defaultTTL: number = 5 * 60 * 1000) {\n this.maxSize = maxSize;\n this.defaultTTL = defaultTTL;\n }\n\n /**\n * Generate a simple hash for the source code.\n * Uses a fast djb2-like hash algorithm.\n */\n private hashSource(source: string): string {\n let hash = 5381;\n for (let i = 0; i < source.length; i++) {\n hash = ((hash << 5) + hash) + source.charCodeAt(i)!;\n }\n return hash.toString(36);\n }\n\n /**\n * Get cached AST for a source code string.\n * Returns undefined if not found or expired.\n */\n get(source: string): Program | undefined {\n const key = this.hashSource(source);\n const entry = this.cache.get(key);\n \n if (!entry) {\n return undefined;\n }\n\n // Check if expired\n const now = Date.now();\n if (now - entry.lastAccessed > this.defaultTTL) {\n this.cache.delete(key);\n return undefined;\n }\n\n // Update access stats\n entry.lastAccessed = now;\n entry.accessCount++;\n \n return entry.ast;\n }\n\n /**\n * Store parsed AST in cache.\n */\n set(source: string, ast: Program): void {\n // Evict oldest entries if cache is full\n if (this.cache.size >= this.maxSize) {\n this.evictLRU();\n }\n\n const key = this.hashSource(source);\n const now = Date.now();\n \n this.cache.set(key, {\n ast,\n lastAccessed: now,\n accessCount: 1,\n });\n }\n\n /**\n * Check if source code is in cache.\n */\n has(source: string): boolean {\n const key = this.hashSource(source);\n const entry = this.cache.get(key);\n \n if (!entry) {\n return false;\n }\n\n // Check if expired\n const now = Date.now();\n if (now - entry.lastAccessed > this.defaultTTL) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Evict least recently used entries.\n */\n private evictLRU(): void {\n let oldestKey: string | null = null;\n let oldestTime = Infinity;\n\n for (const [key, entry] of this.cache) {\n if (entry.lastAccessed < oldestTime) {\n oldestTime = entry.lastAccessed;\n oldestKey = key;\n }\n }\n\n if (oldestKey) {\n this.cache.delete(oldestKey);\n }\n }\n\n /**\n * Clear all cached entries.\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics.\n */\n getStats(): {\n size: number;\n maxSize: number;\n totalAccessCount: number;\n averageAccessCount: number;\n } {\n let totalAccessCount = 0;\n for (const entry of this.cache.values()) {\n totalAccessCount += entry.accessCount;\n }\n\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n totalAccessCount,\n averageAccessCount: this.cache.size > 0 ? totalAccessCount / this.cache.size : 0,\n };\n }\n\n /**\n * Clean up expired entries.\n */\n cleanup(): number {\n const now = Date.now();\n let removed = 0;\n\n for (const [key, entry] of this.cache) {\n if (now - entry.lastAccessed > this.defaultTTL) {\n this.cache.delete(key);\n removed++;\n }\n }\n\n return removed;\n }\n}\n\n// Global parser cache instance\nexport const globalParserCache = new ParserCache();\n\n/**\n * Cached parse function that wraps the original parser.\n * Use this instead of the original parse() for better performance.\n */\nexport function parseWithCache(\n source: string,\n parseFn: (source: string) => Program\n): Program {\n // Try to get from cache\n const cached = globalParserCache.get(source);\n if (cached) {\n return cached;\n }\n\n // Parse and cache\n const ast = parseFn(source);\n globalParserCache.set(source, ast);\n return ast;\n}\n","/**\n * Represents all possible VBScript value types.\n * These correspond to the Variant subtypes in VBScript.\n */\nexport type VbValueType =\n | 'Empty'\n | 'Null'\n | 'Boolean'\n | 'Integer'\n | 'Long'\n | 'Single'\n | 'Double'\n | 'Currency'\n | 'Date'\n | 'String'\n | 'Object'\n | 'Error'\n | 'Variant'\n | 'Byte'\n | 'Array';\n\n/** Represents an uninitialized variable in VBScript */\nexport interface VbEmptyValue {\n type: 'Empty';\n value: undefined;\n}\n\n/** Represents a Null value in VBScript (no valid data) */\nexport interface VbNullValue {\n type: 'Null';\n value: null;\n}\n\n/** Represents a Boolean value (True or False) */\nexport interface VbBooleanValue {\n type: 'Boolean';\n value: boolean;\n}\n\n/** Represents a 16-bit signed integer (-32,768 to 32,767) */\nexport interface VbIntegerValue {\n type: 'Integer';\n value: number;\n}\n\n/** Represents a 32-bit signed integer (-2,147,483,648 to 2,147,483,647) */\nexport interface VbLongValue {\n type: 'Long';\n value: number;\n}\n\n/** Represents a single-precision floating-point number */\nexport interface VbSingleValue {\n type: 'Single';\n value: number;\n}\n\n/** Represents a double-precision floating-point number */\nexport interface VbDoubleValue {\n type: 'Double';\n value: number;\n}\n\n/** Represents a currency value (64-bit scaled integer) */\nexport interface VbCurrencyValue {\n type: 'Currency';\n value: number;\n}\n\n/** Represents a date/time value */\nexport interface VbDateValue {\n type: 'Date';\n value: Date;\n}\n\n/** Represents a string value */\nexport interface VbStringValue {\n type: 'String';\n value: string;\n}\n\n/** Represents an unsigned 8-bit integer (0 to 255) */\nexport interface VbByteValue {\n type: 'Byte';\n value: number;\n}\n\nexport interface VbArrayValue {\n type: 'Array';\n value: unknown;\n}\n\n/** Represents an object reference */\nexport interface VbObjectValue {\n type: 'Object';\n value: unknown;\n}\n\n/** Represents an error value */\nexport interface VbErrorValue {\n type: 'Error';\n value: number;\n}\n\n/** Represents a Variant that can hold any type */\nexport interface VbVariantValue {\n type: 'Variant';\n value: unknown;\n}\n\n/**\n * A discriminated union of all VBScript value types.\n * Use the `type` property to determine the actual value type.\n */\nexport type VbValue =\n | VbEmptyValue\n | VbNullValue\n | VbBooleanValue\n | VbIntegerValue\n | VbLongValue\n | VbSingleValue\n | VbDoubleValue\n | VbCurrencyValue\n | VbDateValue\n | VbStringValue\n | VbByteValue\n | VbArrayValue\n | VbObjectValue\n | VbErrorValue\n | VbVariantValue;\n\n/**\n * Represents the data stored in a VBScript object.\n * This can be a class instance, a COM object wrapper, or a JavaScript object proxy.\n */\nexport interface VbObjectValueData {\n type?: string;\n classInfo?: { name: string };\n properties?: Map<string, VbValue>;\n getProperty?: (name: string) => VbValue;\n setProperty?: (name: string, value: VbValue, isSet?: boolean) => void;\n hasMethod?: (name: string) => boolean;\n getMethod?: (name: string) => { func: (...args: VbValue[]) => VbValue };\n call?: (...args: VbValue[]) => VbValue;\n [key: string]: unknown;\n}\n\n/** A singleton representing an Empty value in VBScript */\nexport const VbEmpty: VbEmptyValue = { type: 'Empty', value: undefined };\n\n/** A singleton representing a Null value in VBScript */\nexport const VbNull: VbNullValue = { type: 'Null', value: null };\n\n/** A singleton representing a Nothing object reference in VBScript */\nexport const VbNothing: VbObjectValue = { type: 'Object', value: null };\n\n/**\n * Creates a VbValue from a JavaScript value.\n * Automatically determines the appropriate VBScript type based on the input.\n *\n * @param value - The JavaScript value to convert\n * @returns A VbValue representation\n */\nexport function createVbValue(value: unknown): VbValue {\n if (value === undefined) return VbEmpty;\n if (value === null) return VbNull;\n if (value === Symbol.for('Nothing')) return VbNothing;\n if (typeof value === 'boolean') return { type: 'Boolean', value };\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n if (value >= -32768 && value <= 32767) {\n return { type: 'Integer', value };\n }\n return { type: 'Long', value };\n }\n return { type: 'Double', value };\n }\n if (typeof value === 'string') return { type: 'String', value };\n if (value instanceof Date) return { type: 'Date', value };\n if (Array.isArray(value)) return { type: 'Array', value };\n if (typeof value === 'object') return { type: 'Object', value: value as VbObjectValueData };\n return { type: 'Variant', value };\n}\n\n/**\n * Converts a VbValue to a JavaScript boolean.\n * Follows VBScript type coercion rules.\n *\n * @param value - The VbValue to convert\n * @returns The boolean representation\n * @throws Error if the value cannot be converted (e.g., Null)\n */\nexport function toBoolean(value: VbValue): boolean {\n if (value.type === 'Boolean') return value.value;\n if (value.type === 'Empty') return false;\n if (value.type === 'Null') throw new Error('Type mismatch: Null cannot be converted to Boolean');\n if (value.type === 'String') {\n const str = value.value;\n if (str === '') return false;\n const num = parseFloat(str);\n if (!isNaN(num)) return num !== 0;\n return str.toLowerCase() !== 'false';\n }\n if (\n value.type === 'Integer' ||\n value.type === 'Long' ||\n value.type === 'Double' ||\n value.type === 'Single' ||\n value.type === 'Byte'\n ) {\n return value.value !== 0;\n }\n return true;\n}\n\n/**\n * Converts a VbValue to a JavaScript number.\n * Follows VBScript type coercion rules.\n *\n * @param value - The VbValue to convert\n * @returns The number representation\n * @throws Error if the value cannot be converted\n */\nexport function toNumber(value: VbValue): number {\n if (value.type === 'Empty') return 0;\n if (value.type === 'Null') throw new Error('Type mismatch: Null cannot be converted to Number');\n if (value.type === 'Boolean') return value.value ? -1 : 0;\n if (\n value.type === 'Integer' ||\n value.type === 'Long' ||\n value.type === 'Double' ||\n value.type === 'Single' ||\n value.type === 'Byte' ||\n value.type === 'Currency'\n ) {\n return value.value;\n }\n if (value.type === 'String') {\n const str = value.value.trim();\n if (str === '') return 0;\n const num = parseFloat(str);\n if (isNaN(num)) throw new Error(`Type mismatch: \"${str}\" cannot be converted to Number`);\n return num;\n }\n if (value.type === 'Date') {\n return value.value.getTime();\n }\n throw new Error(`Type mismatch: ${value.type} cannot be converted to Number`);\n}\n\n/**\n * Converts a VbValue to a JavaScript string.\n * Follows VBScript type coercion rules.\n *\n * @param value - The VbValue to convert\n * @returns The string representation\n */\nexport function toString(value: VbValue): string {\n if (value.type === 'Empty') return '';\n if (value.type === 'Null') return 'Null';\n if (value.type === 'Boolean') return value.value ? 'True' : 'False';\n if (value.type === 'String') return value.value;\n if (value.type === 'Integer' || value.type === 'Long' || value.type === 'Byte') {\n return String(Math.floor(value.value));\n }\n if (value.type === 'Double' || value.type === 'Single' || value.type === 'Currency') {\n return String(value.value);\n }\n if (value.type === 'Date') {\n return value.value.toLocaleString();\n }\n if (value.type === 'Object') {\n return value.value === null ? 'Nothing' : '[object]';\n }\n if (value.type === 'Array') {\n return '[array]';\n }\n return String(value.value);\n}\n\n/**\n * Converts a VbValue to a JavaScript Date object.\n * Handles VBScript date serial numbers and string date formats.\n *\n * @param value - The VbValue to convert\n * @returns The Date representation\n * @throws Error if the value cannot be converted to a date\n */\nexport function toVbDate(value: VbValue): Date {\n if (value.type === 'Date') return value.value;\n if (value.type === 'String') {\n const str = value.value;\n const date = new Date(str);\n if (isNaN(date.getTime())) {\n throw new Error(`Type mismatch: \"${str}\" cannot be converted to Date`);\n }\n return date;\n }\n if (value.type === 'Double' || value.type === 'Single') {\n const serial = value.value;\n const baseDate = new Date(1899, 11, 30);\n return new Date(baseDate.getTime() + serial * 86400000);\n }\n throw new Error(`Type mismatch: ${value.type} cannot be converted to Date`);\n}\n\n/**\n * Checks if a VbValue can be interpreted as a numeric value.\n * Equivalent to VBScript's IsNumeric function.\n *\n * @param value - The VbValue to check\n * @returns True if the value is numeric or can be converted to a number\n */\nexport function isNumeric(value: VbValue): boolean {\n if (\n value.type === 'Integer' ||\n value.type === 'Long' ||\n value.type === 'Double' ||\n value.type === 'Single' ||\n value.type === 'Currency' ||\n value.type === 'Byte'\n ) {\n return true;\n }\n if (value.type === 'String') {\n const str = value.value.trim();\n if (str === '') return false;\n return !isNaN(parseFloat(str));\n }\n if (value.type === 'Boolean') return true;\n if (value.type === 'Empty') return true;\n return false;\n}\n\n/** Checks if a VbValue is Empty (uninitialized) */\nexport function isEmpty(value: VbValue): boolean {\n return value.type === 'Empty';\n}\n\n/** Checks if a VbValue is Null */\nexport function isNull(value: VbValue): boolean {\n return value.type === 'Null';\n}\n\n/** Checks if a VbValue is an Object */\nexport function isObject(value: VbValue): boolean {\n return value.type === 'Object';\n}\n\n/** Checks if a VbValue is an Array */\nexport function isArray(value: VbValue): boolean {\n return value.type === 'Array';\n}\n\n/**\n * Gets the numeric value from a VbValue, converting if necessary.\n * @param value - The VbValue to get the numeric value from\n * @returns The numeric value\n */\nexport function getNumericValue(value: VbValue): number {\n switch (value.type) {\n case 'Integer':\n case 'Long':\n case 'Double':\n case 'Single':\n case 'Byte':\n case 'Currency':\n return value.value;\n default:\n return toNumber(value);\n }\n}\n\n/**\n * Gets the string value from a VbValue, converting if necessary.\n * @param value - The VbValue to get the string value from\n * @returns The string value\n */\nexport function getStringValue(value: VbValue): string {\n if (value.type === 'String') return value.value;\n return toString(value);\n}\n\n/**\n * Gets the boolean value from a VbValue, converting if necessary.\n * @param value - The VbValue to get the boolean value from\n * @returns The boolean value\n */\nexport function getBooleanValue(value: VbValue): boolean {\n if (value.type === 'Boolean') return value.value;\n return toBoolean(value);\n}\n","import type { VbValue } from './values.ts';\n\nexport class VbVariable {\n constructor(\n public name: string,\n public value: VbValue,\n public isByRef: boolean = false,\n public isArray: boolean = false,\n public isConst: boolean = false\n ) {}\n}\n\nexport class Vbscope {\n private variables: Map<string, VbVariable> = new Map();\n public parent: Vbscope | null;\n\n constructor(parent: Vbscope | null = null) {\n this.parent = parent;\n }\n\n declare(name: string, value: VbValue, options: Partial<VbVariable> = {}): VbVariable {\n const variable = new VbVariable(\n name,\n value,\n options.isByRef ?? false,\n options.isArray ?? false,\n options.isConst ?? false\n );\n this.variables.set(name.toLowerCase(), variable);\n return variable;\n }\n\n get(name: string): VbVariable | undefined {\n const lowerName = name.toLowerCase();\n const variable = this.variables.get(lowerName);\n if (variable) return variable;\n if (this.parent) return this.parent.get(name);\n return undefined;\n }\n\n set(name: string, value: VbValue): void {\n const lowerName = name.toLowerCase();\n const variable = this.variables.get(lowerName);\n if (variable) {\n if (variable.isConst) {\n throw new Error(`Cannot assign to constant '${name}'`);\n }\n variable.value = value;\n return;\n }\n if (this.parent) {\n this.parent.set(name, value);\n return;\n }\n this.declare(name, value);\n }\n\n has(name: string): boolean {\n const lowerName = name.toLowerCase();\n if (this.variables.has(lowerName)) return true;\n if (this.parent) return this.parent.has(name);\n return false;\n }\n\n getParent(): Vbscope | null {\n return this.parent;\n }\n\n getAllVariables(): Map<string, VbVariable> {\n const all = new Map<string, VbVariable>();\n if (this.parent) {\n const parentVars = this.parent.getAllVariables();\n parentVars.forEach((v, k) => all.set(k, v));\n }\n this.variables.forEach((v, k) => all.set(k, v));\n return all;\n }\n}\n","import type { VbValue } from './values.ts';\nimport { VbEmpty } from './values.ts';\n\nexport type VbFunction = (...args: VbValue[]) => VbValue;\nexport type VbSub = (...args: VbValue[]) => void;\nexport type VbUserFunction = (args: VbValue[]) => VbValue;\n\nexport interface VbParameterInfo {\n name: string;\n byRef: boolean;\n isArray: boolean;\n}\n\nexport interface VbFunctionInfo {\n name: string;\n func: VbFunction | VbSub | VbUserFunction;\n isSub: boolean;\n minArgs: number;\n maxArgs: number;\n params: VbParameterInfo[];\n isUserDefined: boolean;\n}\n\nexport interface VbArgumentRef {\n value: VbValue;\n variableName?: string;\n setValue?: (value: VbValue) => void;\n}\n\nexport class VbFunctionRegistry {\n private functions: Map<string, VbFunctionInfo> = new Map();\n\n register(name: string, func: VbFunction | VbSub | VbUserFunction, options: Partial<VbFunctionInfo> = {}): void {\n const lowerName = name.toLowerCase();\n this.functions.set(lowerName, {\n name,\n func,\n isSub: options.isSub ?? false,\n minArgs: options.minArgs ?? 0,\n maxArgs: options.maxArgs ?? Infinity,\n params: options.params ?? [],\n isUserDefined: options.isUserDefined ?? false,\n });\n }\n\n get(name: string): VbFunctionInfo | undefined {\n return this.functions.get(name.toLowerCase());\n }\n\n has(name: string): boolean {\n return this.functions.has(name.toLowerCase());\n }\n\n call(name: string, args: VbValue[]): VbValue {\n const info = this.functions.get(name.toLowerCase());\n if (!info) {\n throw new Error(`Undefined function or sub: ${name}`);\n }\n\n if (args.length < info.minArgs) {\n throw new Error(`${name} requires at least ${info.minArgs} argument(s)`);\n }\n\n if (args.length > info.maxArgs) {\n throw new Error(`${name} accepts at most ${info.maxArgs} argument(s)`);\n }\n\n let result: VbValue;\n if (info.isUserDefined) {\n result = (info.func as VbUserFunction)(args);\n } else {\n result = (info.func as VbFunction)(...args);\n }\n \n if (info.isSub) {\n return VbEmpty;\n }\n\n return result ?? VbEmpty;\n }\n\n callWithRefs(name: string, args: VbArgumentRef[]): VbValue {\n const info = this.functions.get(name.toLowerCase());\n if (!info) {\n throw new Error(`Undefined function or sub: ${name}`);\n }\n\n if (args.length < info.minArgs) {\n throw new Error(`${name} requires at least ${info.minArgs} argument(s)`);\n }\n\n if (args.length > info.maxArgs) {\n throw new Error(`${name} accepts at most ${info.maxArgs} argument(s)`);\n }\n\n const values = args.map(arg => arg.value);\n \n let result: VbValue;\n if (info.isUserDefined) {\n result = (info.func as VbUserFunction)(values);\n } else {\n result = (info.func as VbFunction)(...values);\n }\n \n for (let i = 0; i < args.length && i < info.params.length; i++) {\n const param = info.params[i];\n const arg = args[i];\n if (param && arg && param.byRef && arg.setValue && values[i] !== arg.value) {\n arg.setValue(values[i]!);\n }\n }\n \n if (info.isSub) {\n return VbEmpty;\n }\n\n return result ?? VbEmpty;\n }\n\n getAll(): IterableIterator<[string, VbFunctionInfo]> {\n return this.functions.entries();\n }\n\n getUserDefinedFunctions(): Map<string, VbFunctionInfo> {\n const result = new Map<string, VbFunctionInfo>();\n for (const [name, info] of this.functions.entries()) {\n if (info.isUserDefined) {\n result.set(name, info);\n }\n }\n return result;\n }\n}\n","import type { VbValue } from './values.ts';\nimport { VbEmpty } from './values.ts';\n\nexport type VbPropertyGetter = () => VbValue;\nexport type VbPropertySetter = (value: VbValue) => void;\n\nexport interface VbProperty {\n name: string;\n get?: VbPropertyGetter;\n let?: VbPropertySetter;\n set?: VbPropertySetter;\n}\n\nexport interface VbMethodInfo {\n name: string;\n func: (...args: VbValue[]) => VbValue;\n isSub: boolean;\n}\n\nexport class VbClass {\n constructor(\n public name: string,\n public properties: Map<string, VbProperty> = new Map(),\n public methods: Map<string, VbMethodInfo> = new Map(),\n public initializer?: (instance: VbObjectInstance) => void\n ) {}\n}\n\nexport class VbObjectInstance {\n private properties: Map<string, VbValue> = new Map();\n private propertyAccessors: Map<string, VbProperty> = new Map();\n\n constructor(\n public classInfo: VbClass,\n public prototype: VbObjectInstance | null = null\n ) {\n if (classInfo.initializer) {\n classInfo.initializer(this);\n }\n classInfo.properties.forEach((prop, name) => {\n this.propertyAccessors.set(name.toLowerCase(), prop);\n if (!prop.get && !prop.let && !prop.set) {\n this.properties.set(name.toLowerCase(), VbEmpty);\n }\n });\n }\n\n getProperty(name: string): VbValue {\n const lowerName = name.toLowerCase();\n const accessor = this.propertyAccessors.get(lowerName);\n if (accessor?.get) {\n return accessor.get.call(this);\n }\n if (accessor && !accessor.get && !accessor.let && !accessor.set) {\n const value = this.properties.get(lowerName);\n if (value !== undefined) {\n return value;\n }\n }\n const value = this.properties.get(lowerName);\n if (value !== undefined) {\n return value;\n }\n if (this.prototype) {\n return this.prototype.getProperty(name);\n }\n return VbEmpty;\n }\n\n setProperty(name: string, value: VbValue, isSet: boolean = false): void {\n const lowerName = name.toLowerCase();\n const accessor = this.propertyAccessors.get(lowerName);\n if (accessor) {\n if (isSet && accessor.set) {\n accessor.set.call(this, value);\n return;\n }\n if (!isSet && accessor.let) {\n accessor.let.call(this, value);\n return;\n }\n if (!accessor.get && !accessor.let && !accessor.set) {\n this.properties.set(lowerName, value);\n return;\n }\n }\n this.properties.set(lowerName, value);\n }\n\n hasProperty(name: string): boolean {\n const lowerName = name.toLowerCase();\n const has = this.properties.has(lowerName) || \n this.propertyAccessors.has(lowerName) ||\n (this.prototype?.hasProperty(name) ?? false);\n return has;\n }\n\n getMethod(name: string): VbMethodInfo | undefined {\n return this.classInfo.methods.get(name.toLowerCase());\n }\n\n hasMethod(name: string): boolean {\n return this.classInfo.methods.has(name.toLowerCase());\n }\n\n setPropertiesFromObject(obj: Record<string, unknown>): void {\n for (const [k, v] of Object.entries(obj)) {\n this.properties.set(k.toLowerCase(), v as VbValue);\n }\n }\n}\n\nexport class VbClassRegistry {\n private classes: Map<string, VbClass> = new Map();\n\n register(cls: VbClass): void {\n this.classes.set(cls.name.toLowerCase(), cls);\n }\n\n registerClass(name: string, creator: () => VbValue): void {\n const cls = new VbClass(name);\n cls.initializer = (instance: VbObjectInstance) => {\n const value = creator();\n if (value.type === 'Object' && value.value) {\n const obj = value.value as Record<string, unknown>;\n instance.setPropertiesFromObject(obj);\n }\n };\n this.classes.set(name.toLowerCase(), cls);\n }\n\n get(name: string): VbClass | undefined {\n return this.classes.get(name.toLowerCase());\n }\n\n has(name: string): boolean {\n return this.classes.has(name.toLowerCase());\n }\n\n createInstance(name: string, _args: VbValue[]): VbObjectInstance {\n const cls = this.classes.get(name.toLowerCase());\n if (!cls) {\n throw new Error(`Undefined class: ${name}`);\n }\n\n const instance = new VbObjectInstance(cls);\n\n const initMethod = cls.methods.get('class_initialize');\n if (initMethod) {\n initMethod.func.call(instance);\n }\n\n const initProperty = cls.properties.get('class_initialize');\n if (initProperty && initProperty.get) {\n initProperty.get.call(instance);\n }\n\n return instance;\n }\n}\n","import type { VbValue } from './values.ts';\nimport { VbEmpty } from './values.ts';\n\nexport class VbArray {\n private data: VbValue[];\n private dimensions: number[];\n private lowerBounds: number[];\n\n constructor(dimensions: number[], lowerBounds?: number[]) {\n this.dimensions = dimensions;\n this.lowerBounds = lowerBounds ?? dimensions.map(() => 0);\n \n const totalSize = dimensions.reduce((a, b) => a * b, 1);\n this.data = new Array(totalSize).fill(VbEmpty);\n }\n\n private getIndex(indices: number[]): number {\n if (indices.length !== this.dimensions.length) {\n throw new Error(`Array has ${this.dimensions.length} dimension(s), but ${indices.length} index(es) provided`);\n }\n\n let index = 0;\n let multiplier = 1;\n\n for (let i = this.dimensions.length - 1; i >= 0; i--) {\n const lowerBound = this.lowerBounds[i]!;\n const dimension = this.dimensions[i]!;\n const idx = indices[i]! - lowerBound;\n if (idx < 0 || idx >= dimension) {\n throw new Error('Subscript out of range');\n }\n index += idx * multiplier;\n multiplier *= dimension;\n }\n\n return index;\n }\n\n get(indices: number[]): VbValue {\n return this.data[this.getIndex(indices)] ?? VbEmpty;\n }\n\n set(indices: number[], value: VbValue): void {\n this.data[this.getIndex(indices)] = value;\n }\n\n getDimensions(): number {\n return this.dimensions.length;\n }\n\n getBounds(dimension: number): { lower: number; upper: number } {\n if (dimension < 1 || dimension > this.dimensions.length) {\n throw new Error('Invalid dimension');\n }\n const idx = dimension - 1;\n const lower = this.lowerBounds[idx]!;\n const dim = this.dimensions[idx]!;\n return {\n lower,\n upper: lower + dim - 1,\n };\n }\n\n redim(dimensions: number[], preserve: boolean): void {\n const newData = new Array(dimensions.reduce((a, b) => a * b, 1)).fill(VbEmpty);\n \n if (preserve) {\n const minSize = Math.min(this.data.length, newData.length);\n for (let i = 0; i < minSize; i++) {\n newData[i] = this.data[i];\n }\n }\n\n this.dimensions = dimensions;\n this.data = newData;\n }\n\n toArray(): VbValue[] {\n return [...this.data];\n }\n\n /**\n * Erase the array - reset all elements to Empty\n * For fixed-size arrays: clears all elements but keeps dimensions\n * For dynamic arrays: would normally deallocate, but we just clear\n */\n erase(): void {\n this.data.fill(VbEmpty);\n }\n}\n\nexport function createVbArray(bounds: number[]): VbArray {\n const dimensions = bounds.map(b => b + 1);\n return new VbArray(dimensions);\n}\n\nexport function createVbArrayFromValues(values: VbValue[]): VbArray {\n const arr = new VbArray([values.length]);\n values.forEach((v, i) => arr.set([i], v));\n return arr;\n}\n","export class VbError extends Error {\n public number: number;\n public source: string;\n public description: string;\n public helpFile?: string;\n public helpContext?: number;\n\n constructor(number: number, description: string, source: string = '') {\n super(description);\n this.name = 'VbError';\n this.number = number;\n this.source = source;\n this.description = description;\n }\n\n static fromError(error: Error): VbError {\n if (error instanceof VbError) {\n return error;\n }\n return new VbError(440, error.message, 'Vbscript');\n }\n}\n\nexport const VbErrorCodes = {\n TypeMismatch: 13,\n SubscriptOutOfRange: 9,\n OutOfMemory: 7,\n DivisionByZero: 11,\n Overflow: 6,\n InvalidProcedureCall: 5,\n ObjectRequired: 424,\n ObjectDoesntSupportPropertyOrMethod: 438,\n VariableNotDefined: 500,\n InvalidQualifier: 450,\n PermissionDenied: 70,\n FileNotFound: 53,\n PathNotFound: 76,\n DeviceIOError: 57,\n FileAlreadyExists: 58,\n DiskFull: 61,\n BadFileNameOrNumber: 52,\n TooManyFiles: 67,\n DeviceUnavailable: 68,\n};\n\nexport function createVbError(code: number, description: string, source?: string): VbError {\n return new VbError(code, description, source);\n}\n","import type { VbValue, VbObjectValueData } from './values.ts';\nimport { VbEmpty } from './values.ts';\nimport { Vbscope } from './scope.ts';\nimport { VbFunctionRegistry } from './function-registry.ts';\nimport { VbClassRegistry, VbObjectInstance } from './class-registry.ts';\nimport { VbError } from './errors.ts';\n\nfunction jsToVb(value: unknown, thisArg?: unknown): VbValue {\n if (value === undefined) return { type: 'Empty', value: undefined };\n if (value === null) return { type: 'Null', value: null };\n if (typeof value === 'boolean') return { type: 'Boolean', value };\n if (typeof value === 'number') {\n if (Number.isInteger(value) && value >= -2147483648 && value <= 2147483647) {\n return { type: 'Long', value };\n }\n return { type: 'Double', value };\n }\n if (typeof value === 'string') return { type: 'String', value };\n if (value instanceof Date) return { type: 'Date', value };\n if (Array.isArray(value)) {\n return { type: 'Array', value };\n }\n if (typeof value === 'function') {\n return { type: 'Object', value: { type: 'jsfunction', func: value as (...args: unknown[]) => unknown, thisArg: thisArg ?? null } };\n }\n if (typeof value === 'object') {\n return { type: 'Object', value: value as VbObjectValueData };\n }\n return { type: 'String', value: String(value) };\n}\n\nexport class VbContext {\n public globalScope: Vbscope;\n public currentScope: Vbscope;\n public functionRegistry: VbFunctionRegistry;\n public classRegistry: VbClassRegistry;\n public optionExplicit: boolean = false;\n public onErrorResumeNext: boolean = false;\n public lastError: VbError | null = null;\n public err: { number: number; description: string; source: string } = {\n number: 0,\n description: '',\n source: '',\n };\n public currentInstance: VbObjectInstance | null = null;\n public inPropertyGet: boolean = false;\n public propertyGetName: string = '';\n public evaluate: ((code: string) => VbValue) | null = null;\n public checkTimeout: (() => void) | null = null;\n public execute: ((code: string) => VbValue) | null = null;\n public executeGlobal: ((code: string) => VbValue) | null = null;\n\n private withStack: VbValue[] = [];\n private callStack: string[] = [];\n private exitFlag: 'none' | 'sub' | 'function' | 'property' | 'do' | 'for' | 'select' = 'none';\n\n constructor() {\n this.globalScope = new Vbscope();\n this.currentScope = this.globalScope;\n this.functionRegistry = new VbFunctionRegistry();\n this.classRegistry = new VbClassRegistry();\n }\n\n pushScope(): Vbscope {\n const scope = new Vbscope(this.currentScope);\n this.currentScope = scope;\n return scope;\n }\n\n popScope(): void {\n if (this.currentScope.parent) {\n this.currentScope = this.currentScope.parent;\n }\n }\n\n pushWith(obj: VbValue): void {\n this.withStack.push(obj);\n }\n\n popWith(): void {\n this.withStack.pop();\n }\n\n getCurrentWith(): VbValue | undefined {\n return this.withStack[this.withStack.length - 1];\n }\n\n pushCall(name: string): void {\n this.callStack.push(name);\n }\n\n popCall(): void {\n this.callStack.pop();\n }\n\n getCurrentCall(): string | undefined {\n return this.callStack[this.callStack.length - 1];\n }\n\n setExitFlag(flag: typeof this.exitFlag): void {\n this.exitFlag = flag;\n }\n\n getExitFlag(): typeof this.exitFlag {\n return this.exitFlag;\n }\n\n clearExitFlag(): void {\n this.exitFlag = 'none';\n }\n\n setError(error: VbError): void {\n this.lastError = error;\n this.err.number = error.number;\n this.err.description = error.description;\n this.err.source = error.source;\n }\n\n clearError(): void {\n this.lastError = null;\n this.err.number = 0;\n this.err.description = '';\n this.err.source = '';\n }\n\n declareVariable(name: string, value: VbValue = VbEmpty): void {\n this.currentScope.declare(name, value);\n }\n\n getVariable(name: string): VbValue {\n if (this.currentInstance) {\n if (this.currentInstance.hasProperty(name)) {\n return this.currentInstance.getProperty(name);\n }\n }\n \n const variable = this.currentScope.get(name);\n if (variable) {\n return variable.value;\n }\n\n const lowerName = name.toLowerCase();\n for (const key of Object.keys(globalThis)) {\n if (key.toLowerCase() === lowerName) {\n const value = (globalThis as Record<string, unknown>)[key];\n return jsToVb(value, globalThis);\n }\n }\n\n const globalKeys = ['eval', 'parseInt', 'parseFloat', 'isNaN', 'isFinite', 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape'];\n for (const key of globalKeys) {\n if (key.toLowerCase() === lowerName && key in globalThis) {\n const value = (globalThis as Record<string, unknown>)[key];\n return jsToVb(value, globalThis);\n }\n }\n \n if (this.optionExplicit) {\n throw new VbError(500, `Variable is undefined: '${name}'`, 'Vbscript');\n }\n return VbEmpty;\n }\n\n setVariable(name: string, value: VbValue): void {\n if (this.inPropertyGet && name.toLowerCase() === this.propertyGetName) {\n this.currentScope.set(name, value);\n return;\n }\n \n if (this.currentInstance && this.currentInstance.hasProperty(name)) {\n this.currentInstance.setProperty(name, value);\n return;\n }\n \n if (this.optionExplicit && !this.currentScope.has(name)) {\n const lowerName = name.toLowerCase();\n if (!(lowerName in globalThis)) {\n throw new VbError(500, `Variable is undefined: '${name}'`, 'Vbscript');\n }\n }\n \n this.currentScope.set(name, value);\n }\n\n hasVariable(name: string): boolean {\n if (this.currentScope.has(name)) return true;\n const lowerName = name.toLowerCase();\n return lowerName in globalThis;\n }\n}\n","/**\n * Value Pool - Flyweight Pattern for Common VBScript Values\n * \n * Caches frequently used VbValue objects to avoid repeated allocations.\n * This significantly reduces GC pressure for common values like:\n * - Small integers (-128 to 127)\n * - Empty, Null, Nothing\n * - Common booleans\n * - Empty string\n */\n\nimport type { VbValue, VbLongValue, VbBooleanValue, VbStringValue } from './values.ts';\nimport { VbEmpty, VbNull, VbNothing } from './values.ts';\n\n// Cache for small integers (common loop counters, indices)\nconst SMALL_INT_MIN = -128;\nconst SMALL_INT_MAX = 127;\nconst smallIntCache: VbLongValue[] = [];\n\n// Initialize small integer cache\nfor (let i = SMALL_INT_MIN; i <= SMALL_INT_MAX; i++) {\n smallIntCache[i - SMALL_INT_MIN] = { type: 'Long', value: i };\n}\n\n// Common boolean values\nconst VbTrue: VbBooleanValue = { type: 'Boolean', value: true };\nconst VbFalse: VbBooleanValue = { type: 'Boolean', value: false };\n\n// Empty string\nconst VbEmptyString: VbStringValue = { type: 'String', value: '' };\n\n// Common string cache (frequently used strings)\nconst commonStringCache: Map<string, VbStringValue> = new Map();\n\n/**\n * Get a cached VbValue for small integers.\n * Returns cached value if in range, otherwise creates new value.\n */\nexport function getCachedLong(value: number): VbLongValue {\n if (value >= SMALL_INT_MIN && value <= SMALL_INT_MAX && Number.isInteger(value)) {\n return smallIntCache[value - SMALL_INT_MIN]!;\n }\n return { type: 'Long', value };\n}\n\n/**\n * Get a cached boolean value.\n */\nexport function getCachedBoolean(value: boolean): VbBooleanValue {\n return value ? VbTrue : VbFalse;\n}\n\n/**\n * Get a cached string value.\n * Empty string is always cached, other strings may be cached if commonly used.\n */\nexport function getCachedString(value: string): VbStringValue {\n if (value === '') {\n return VbEmptyString;\n }\n \n // Check common string cache\n const cached = commonStringCache.get(value);\n if (cached) {\n return cached;\n }\n \n // For short strings (likely identifiers), cache them\n if (value.length <= 32) {\n const newValue: VbStringValue = { type: 'String', value };\n commonStringCache.set(value, newValue);\n return newValue;\n }\n \n return { type: 'String', value };\n}\n\n/**\n * Pre-cache common strings (keywords, common variable names, etc.)\n */\nexport function preCacheCommonStrings(strings: string[]): void {\n for (const str of strings) {\n if (!commonStringCache.has(str)) {\n commonStringCache.set(str, { type: 'String', value: str });\n }\n }\n}\n\n/**\n * Create a VbValue with caching for common types.\n * This is a drop-in replacement for createVbValue that uses caching.\n */\nexport function createCachedVbValue(value: unknown): VbValue {\n if (value === undefined) return VbEmpty;\n if (value === null) return VbNull;\n if (value === Symbol.for('Nothing')) return VbNothing;\n if (typeof value === 'boolean') return getCachedBoolean(value);\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n if (value >= -32768 && value <= 32767) {\n // Use Long type for integers in VBScript Integer range\n if (value >= SMALL_INT_MIN && value <= SMALL_INT_MAX) {\n return getCachedLong(value);\n }\n return { type: 'Integer', value };\n }\n // Use cached Long for small integers, new Long for larger\n return getCachedLong(value);\n }\n return { type: 'Double', value };\n }\n if (typeof value === 'string') return getCachedString(value);\n if (value instanceof Date) return { type: 'Date', value };\n if (Array.isArray(value)) return { type: 'Array', value };\n if (typeof value === 'object') return { type: 'Object', value };\n return { type: 'Variant', value };\n}\n\n// Pre-cache common VBScript keywords and identifiers\nconst COMMON_VBSCRIPT_STRINGS = [\n 'true', 'false', 'empty', 'null', 'nothing',\n 'dim', 'redim', 'const', 'public', 'private',\n 'sub', 'function', 'class', 'end', 'exit',\n 'if', 'then', 'else', 'elseif',\n 'for', 'next', 'to', 'step', 'each', 'in',\n 'do', 'loop', 'while', 'until', 'wend',\n 'select', 'case', 'default',\n 'and', 'or', 'not', 'xor', 'eqv', 'imp',\n 'new', 'set', 'call', 'byval', 'byref',\n 'option', 'explicit', 'on', 'error', 'resume',\n 'with', 'property', 'get', 'let',\n 'msgbox', 'inputbox',\n 'i', 'j', 'k', 'n', 'x', 'y', 'z',\n 'count', 'index', 'item', 'key', 'value',\n 'name', 'text', 'data', 'result',\n 'obj', 'arr', 'str', 'num', 'val',\n 'document', 'window', 'console',\n];\n\n// Initialize common strings cache\npreCacheCommonStrings(COMMON_VBSCRIPT_STRINGS);\n\nexport { VbEmpty, VbNull, VbNothing, VbTrue, VbFalse, VbEmptyString };\n","import type {\n Expression,\n Program,\n Identifier,\n Literal,\n MemberExpression,\n BinaryExpression,\n UnaryExpression,\n LogicalExpression,\n AssignmentExpression,\n ConditionalExpression,\n ThisExpression,\n VbNewExpression,\n VbWithObjectExpression,\n} from '../ast/index.ts';\nimport type {\n VbValue,\n VbObjectValue,\n VbObjectValueData,\n VbArrayValue,\n VbBooleanValue,\n VbLongValue,\n} from '../runtime/index.ts';\nimport { VbContext, VbObjectInstance } from '../runtime/index.ts';\nimport { createVbValue, VbEmpty, VbNull, toBoolean, toNumber, toString, createVbError, VbErrorCodes } from '../runtime/index.ts';\n\ninterface VbMethodObject {\n type: 'method';\n object: VbObjectValueData & { getMethod: (name: string) => { func: (...args: VbValue[]) => VbValue } };\n method: string;\n}\n\ninterface VbJsFunctionObject {\n type: 'jsfunction';\n func: (...args: unknown[]) => unknown;\n thisArg: unknown;\n}\n\nfunction isVbMethodObject(obj: VbObjectValueData): obj is VbObjectValueData & VbMethodObject {\n return obj.type === 'method' && 'object' in obj && 'method' in obj;\n}\n\nfunction isVbJsFunctionObject(obj: VbObjectValueData): obj is VbObjectValueData & VbJsFunctionObject {\n return obj.type === 'jsfunction' && 'func' in obj;\n}\n\nexport class ExpressionEvaluator {\n constructor(private context: VbContext) {}\n\n evaluateProgram(program: Program): VbValue {\n let result: VbValue = VbEmpty;\n for (const stmt of program.body) {\n if (stmt.type === 'ExpressionStatement') {\n result = this.evaluate((stmt as { expression: Expression }).expression);\n } else {\n result = this.evaluate(stmt as unknown as Expression);\n }\n }\n return result;\n }\n\n evaluate(node: Expression): VbValue {\n switch (node.type) {\n case 'Identifier':\n return this.evaluateIdentifier(node);\n case 'Literal':\n return this.evaluateLiteral(node);\n case 'VbEmptyLiteral':\n return VbEmpty;\n case 'VbNewExpression':\n return this.evaluateNew(node);\n case 'ThisExpression':\n return this.evaluateMe(node);\n case 'VbWithObject':\n return this.evaluateWithObject(node);\n case 'MemberExpression':\n return this.evaluateMember(node);\n case 'CallExpression':\n return this.evaluateCallInternal(node.callee as Expression, node.arguments);\n case 'BinaryExpression':\n return this.evaluateBinary(node);\n case 'UnaryExpression':\n return this.evaluateUnary(node);\n case 'LogicalExpression':\n return this.evaluateLogical(node);\n case 'AssignmentExpression':\n return this.evaluateAssignment(node);\n case 'ConditionalExpression':\n return this.evaluateConditional(node);\n default:\n return VbEmpty;\n }\n }\n\n evaluateCall(callee: Expression, args: Expression[]): VbValue {\n return this.evaluateCallInternal(callee, args);\n }\n\n private evaluateIdentifier(node: Identifier): VbValue {\n const name = node.name;\n\n if (this.context.functionRegistry.has(name)) {\n return this.context.functionRegistry.call(name, []);\n }\n\n return this.context.getVariable(name);\n }\n\n private evaluateLiteral(node: Literal): VbValue {\n return createVbValue(node.value);\n }\n\n private evaluateNew(node: VbNewExpression): VbObjectValue {\n const className = node.callee.name;\n const args = node.arguments.map(arg => this.evaluate(arg));\n const instance = this.context.classRegistry.createInstance(className, args);\n return { type: 'Object', value: instance };\n }\n\n private evaluateMe(_node: ThisExpression): VbObjectValue {\n if (this.context.currentInstance) {\n return { type: 'Object', value: this.context.currentInstance };\n }\n throw new Error('Me keyword not supported outside of class context');\n }\n\n private evaluateWithObject(_node: VbWithObjectExpression): VbValue {\n const withObject = this.context.getCurrentWith();\n if (!withObject) {\n throw new Error('With object not available - must be inside a With statement');\n }\n return withObject;\n }\n\n private evaluateMember(node: MemberExpression): VbValue {\n let object = this.evaluate(node.object as Expression);\n\n if (node.object.type === 'VbWithObject') {\n object = this.evaluateWithObject(node.object as VbWithObjectExpression);\n }\n\n let propertyName: string;\n if (node.computed) {\n const propValue = this.evaluate(node.property as Expression);\n propertyName = toString(propValue);\n } else {\n propertyName = (node.property as Identifier).name;\n }\n\n if (object.type === 'Array') {\n return this.getArrayElement(object, node.property as Expression);\n }\n\n if (object.type === 'Object') {\n return this.getObjectProperty(object, propertyName);\n }\n\n throw createVbError(VbErrorCodes.ObjectRequired, 'Object required', 'Vbscript');\n }\n\n private getArrayElement(array: VbArrayValue, indexExpr: Expression): VbValue {\n const arr = array.value as unknown as { get: (indices: number[]) => VbValue };\n const index = toNumber(this.evaluate(indexExpr));\n return arr.get([Math.floor(index)]);\n }\n\n private getObjectProperty(objValue: VbObjectValue, propertyName: string): VbValue {\n const obj = objValue.value as VbObjectValueData | null;\n\n if (obj === null) {\n throw createVbError(VbErrorCodes.ObjectRequired, 'Object required', 'Vbscript');\n }\n\n if (typeof obj.getProperty === 'function') {\n if (obj.hasMethod?.(propertyName)) {\n return { type: 'Object', value: { type: 'method', object: obj, method: propertyName } };\n }\n return obj.getProperty(propertyName);\n }\n\n const jsValue = obj[propertyName];\n if (jsValue === undefined) {\n return { type: 'Empty', value: undefined };\n }\n if (typeof jsValue === 'function') {\n return { type: 'Object', value: { type: 'jsfunction', func: jsValue as (...args: unknown[]) => unknown, thisArg: obj } };\n }\n return this.jsToVb(jsValue);\n }\n\n private jsToVb(value: unknown): VbValue {\n if (value === undefined) return { type: 'Empty', value: undefined };\n if (value === null) return { type: 'Null', value: null };\n if (typeof value === 'boolean') return { type: 'Boolean', value };\n if (typeof value === 'number') {\n if (Number.isInteger(value) && value >= -2147483648 && value <= 2147483647) {\n return { type: 'Long', value };\n }\n return { type: 'Double', value };\n }\n if (typeof value === 'string') return { type: 'String', value };\n if (value instanceof Date) return { type: 'Date', value };\n if (Array.isArray(value)) {\n return { type: 'Array', value };\n }\n if (typeof value === 'object') {\n return { type: 'Object', value: value as VbObjectValueData };\n }\n return { type: 'String', value: String(value) };\n }\n\n private evaluateCallInternal(calleeExpr: Expression, callArgs: Expression[]): VbValue {\n if (calleeExpr.type === 'Identifier') {\n const name = calleeExpr.name;\n\n if (this.context.functionRegistry.has(name)) {\n const funcInfo = this.context.functionRegistry.get(name)!;\n const hasByRefParams = funcInfo.params.some(p => p.byRef);\n \n if (hasByRefParams) {\n const argRefs = callArgs.map(arg => {\n if (arg.type === 'Identifier') {\n const varName = arg.name;\n const variable = this.context.currentScope.get(varName);\n return {\n value: variable ? variable.value : this.context.getVariable(varName),\n variableName: varName,\n setValue: (val: VbValue) => {\n if (this.context.currentScope.has(varName)) {\n this.context.currentScope.set(varName, val);\n } else {\n this.context.setVariable(varName, val);\n }\n }\n };\n }\n return { value: this.evaluate(arg) };\n });\n return this.context.functionRegistry.callWithRefs(name, argRefs);\n }\n \n const args = callArgs.map(arg => this.evaluate(arg));\n return this.context.functionRegistry.call(name, args);\n }\n\n const variable = this.context.currentScope.get(name);\n if (variable) {\n if (variable.value.type === 'Array') {\n const indices = callArgs.map(arg => Math.floor(toNumber(this.evaluate(arg))));\n const arr = variable.value.value as unknown as { get: (indices: number[]) => VbValue };\n return arr.get(indices);\n }\n if (variable.value.type === 'Object' && variable.value.value !== null) {\n const val = variable.value.value as VbObjectValueData;\n if (val.hasMethod?.('default') && val.getMethod) {\n const method = val.getMethod('default');\n const args = callArgs.map(arg => this.evaluate(arg));\n return method.func(...args);\n }\n }\n }\n\n const callee = this.context.getVariable(name);\n if (callee.type === 'Object' && callee.value !== null) {\n return this.callObjectMethod(callee, callArgs);\n }\n throw createVbError(VbErrorCodes.InvalidProcedureCall, 'Invalid procedure call', 'Vbscript');\n }\n\n if (calleeExpr.type === 'MemberExpression') {\n const memberResult = this.evaluateMember(calleeExpr);\n\n if (memberResult.type === 'Object' && memberResult.value !== null) {\n return this.callObjectMethod(memberResult, callArgs);\n }\n throw createVbError(VbErrorCodes.InvalidProcedureCall, 'Invalid procedure call', 'Vbscript');\n }\n\n const callee = this.evaluate(calleeExpr);\n if (callee.type === 'Object' && callee.value !== null) {\n return this.callObjectMethod(callee, callArgs);\n }\n throw createVbError(VbErrorCodes.InvalidProcedureCall, 'Invalid procedure call', 'Vbscript');\n }\n\n private callObjectMethod(objValue: VbObjectValue, callArgs: Expression[]): VbValue {\n const obj = objValue.value as VbObjectValueData | null;\n if (obj === null) {\n throw createVbError(VbErrorCodes.ObjectRequired, 'Object required', 'Vbscript');\n }\n\n if (isVbMethodObject(obj)) {\n const args = callArgs.map(arg => this.evaluate(arg));\n return obj.object.getMethod(obj.method).func.call(obj.object, ...args);\n }\n\n if (isVbJsFunctionObject(obj)) {\n const args = callArgs.map(arg => {\n const vbVal = this.evaluate(arg);\n return this.vbToJs(vbVal);\n });\n const result = obj.func.call(obj.thisArg, ...args);\n return this.jsToVb(result);\n }\n\n if (typeof obj.call === 'function') {\n const args = callArgs.map(arg => this.evaluate(arg));\n return obj.call(...args);\n }\n\n throw createVbError(VbErrorCodes.InvalidProcedureCall, 'Invalid procedure call', 'Vbscript');\n }\n\n private vbToJs(value: VbValue): unknown {\n switch (value.type) {\n case 'Empty':\n return undefined;\n case 'Null':\n return null;\n case 'Boolean':\n case 'Long':\n case 'Double':\n case 'Integer':\n case 'String':\n return value.value;\n case 'Date':\n return value.value instanceof Date ? value.value : new Date(value.value);\n case 'Array':\n return value.value;\n case 'Object':\n const obj = value.value as VbObjectValueData | null;\n if (obj && typeof obj === 'object' && (obj as Record<string, unknown>).type === 'vbref') {\n return (obj as Record<string, unknown>).func;\n }\n return value.value;\n default:\n return value.value;\n }\n }\n\n private evaluateBinary(node: BinaryExpression): VbValue {\n const left = this.evaluate(node.left);\n const right = this.evaluate(node.right);\n\n switch (node.operator) {\n case '+':\n return this.add(left, right);\n case '-':\n return this.subtract(left, right);\n case '*':\n return this.multiply(left, right);\n case '/':\n return this.divide(left, right);\n case '\\\\':\n return this.integerDivide(left, right);\n case '%':\n case 'Mod':\n return this.modulo(left, right);\n case '**':\n case '^':\n return this.power(left, right);\n case '==':\n case '=':\n return this.equals(left, right);\n case '!=':\n case '<>':\n return this.notEquals(left, right);\n case '<':\n return this.lessThan(left, right);\n case '<=':\n return this.lessThanOrEqual(left, right);\n case '>':\n return this.greaterThan(left, right);\n case '>=':\n return this.greaterThanOrEqual(left, right);\n case '&':\n return { type: 'String', value: toString(left) + toString(right) };\n case 'Is':\n return { type: 'Boolean', value: left.type === 'Object' && right.type === 'Object' && left.value === right.value };\n default:\n return VbEmpty;\n }\n }\n\n private add(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'String', value: toString(left) + toString(right) };\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n return createVbValue(leftNum + rightNum);\n }\n\n private subtract(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n return createVbValue(leftNum - rightNum);\n }\n\n private multiply(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n return createVbValue(leftNum * rightNum);\n }\n\n private divide(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n if (rightNum === 0) {\n throw createVbError(VbErrorCodes.DivisionByZero, 'Division by zero', 'Vbscript');\n }\n return { type: 'Double', value: leftNum / rightNum };\n }\n\n private integerDivide(left: VbValue, right: VbValue): VbLongValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull as unknown as VbLongValue;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n if (rightNum === 0) {\n throw createVbError(VbErrorCodes.DivisionByZero, 'Division by zero', 'Vbscript');\n }\n return { type: 'Long', value: Math.floor(leftNum / rightNum) };\n }\n\n private modulo(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n if (rightNum === 0) {\n throw createVbError(VbErrorCodes.DivisionByZero, 'Division by zero', 'Vbscript');\n }\n return createVbValue(leftNum % rightNum);\n }\n\n private power(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n return { type: 'Double', value: Math.pow(leftNum, rightNum) };\n }\n\n private equals(left: VbValue, right: VbValue): VbBooleanValue {\n if (left.type === 'Empty' && right.type === 'Empty') {\n return { type: 'Boolean', value: true };\n }\n if (left.type === 'Null' || right.type === 'Null') {\n return { type: 'Boolean', value: false };\n }\n if (left.type === 'Object' && right.type === 'Object') {\n return { type: 'Boolean', value: left.value === right.value };\n }\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'Boolean', value: toString(left).toLowerCase() === toString(right).toLowerCase() };\n }\n return { type: 'Boolean', value: toNumber(left) === toNumber(right) };\n }\n\n private notEquals(left: VbValue, right: VbValue): VbBooleanValue {\n const eq = this.equals(left, right);\n return { type: 'Boolean', value: !eq.value };\n }\n\n private lessThan(left: VbValue, right: VbValue): VbBooleanValue {\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'Boolean', value: toString(left) < toString(right) };\n }\n return { type: 'Boolean', value: toNumber(left) < toNumber(right) };\n }\n\n private lessThanOrEqual(left: VbValue, right: VbValue): VbBooleanValue {\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'Boolean', value: toString(left) <= toString(right) };\n }\n return { type: 'Boolean', value: toNumber(left) <= toNumber(right) };\n }\n\n private greaterThan(left: VbValue, right: VbValue): VbBooleanValue {\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'Boolean', value: toString(left) > toString(right) };\n }\n return { type: 'Boolean', value: toNumber(left) > toNumber(right) };\n }\n\n private greaterThanOrEqual(left: VbValue, right: VbValue): VbBooleanValue {\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'Boolean', value: toString(left) >= toString(right) };\n }\n return { type: 'Boolean', value: toNumber(left) >= toNumber(right) };\n }\n\n private evaluateUnary(node: UnaryExpression): VbValue {\n const argument = this.evaluate(node.argument);\n\n switch (node.operator) {\n case '-':\n return createVbValue(-toNumber(argument));\n case '+':\n return createVbValue(toNumber(argument));\n case '!':\n case 'Not':\n return { type: 'Boolean', value: !toBoolean(argument) };\n default:\n return VbEmpty;\n }\n }\n\n private evaluateLogical(node: LogicalExpression): VbValue {\n switch (node.operator) {\n case '&&':\n case 'And': {\n const left = this.evaluate(node.left);\n if (!toBoolean(left)) return left;\n return this.evaluate(node.right);\n }\n case '||':\n case 'Or': {\n const left = this.evaluate(node.left);\n if (toBoolean(left)) return left;\n return this.evaluate(node.right);\n }\n case 'Xor': {\n const left = this.evaluate(node.left);\n const right = this.evaluate(node.right);\n return { type: 'Boolean', value: toBoolean(left) !== toBoolean(right) };\n }\n case 'Eqv': {\n const left = this.evaluate(node.left);\n const right = this.evaluate(node.right);\n return { type: 'Boolean', value: toBoolean(left) === toBoolean(right) };\n }\n case 'Imp': {\n const left = this.evaluate(node.left);\n const right = this.evaluate(node.right);\n return { type: 'Boolean', value: !toBoolean(left) || toBoolean(right) };\n }\n default:\n return VbEmpty;\n }\n }\n\n private evaluateAssignment(node: AssignmentExpression): VbValue {\n const value = this.evaluate(node.right);\n const isSet = node.isSet ?? false;\n\n if (node.left.type === 'Identifier') {\n if (isSet) {\n const oldValue = this.context.getVariable(node.left.name);\n this.callTerminateIfNeeded(oldValue, value);\n }\n this.context.setVariable(node.left.name, value);\n return value;\n }\n\n if (node.left.type === 'MemberExpression') {\n this.assignToMember(node.left, value, isSet);\n return value;\n }\n\n throw new Error(`Invalid assignment target: ${node.left.type}`);\n }\n\n private callTerminateIfNeeded(oldValue: VbValue, newValue: VbValue): void {\n if (oldValue.type === 'Object' && oldValue.value instanceof VbObjectInstance) {\n if (newValue.type !== 'Object' || newValue.value !== oldValue.value) {\n const instance = oldValue.value as VbObjectInstance;\n const terminateProp = instance.classInfo.properties.get('class_terminate');\n if (terminateProp && terminateProp.get) {\n terminateProp.get.call(instance);\n }\n }\n }\n }\n\n private assignToMember(node: MemberExpression, value: VbValue, isSet: boolean): void {\n let object = this.evaluate(node.object as Expression);\n\n if (node.object.type === 'VbWithObject') {\n object = this.evaluateWithObject(node.object as VbWithObjectExpression);\n }\n\n let propertyName: string;\n if (node.computed) {\n const propValue = this.evaluate(node.property as Expression);\n propertyName = toString(propValue);\n } else {\n propertyName = (node.property as Identifier).name;\n }\n\n if (object.type === 'Array') {\n const arr = object.value as unknown as { set: (indices: number[], v: VbValue) => void };\n const index = toNumber(this.evaluate(node.property as Expression));\n arr.set([Math.floor(index)], value);\n } else if (object.type === 'Object') {\n const obj = object.value as VbObjectValueData | null;\n if (obj === null || typeof obj !== 'object') {\n throw createVbError(VbErrorCodes.ObjectRequired, 'Object required', 'Vbscript');\n }\n\n if (typeof obj.setProperty === 'function') {\n obj.setProperty(propertyName, value, isSet);\n } else {\n const jsValue = this.vbToJs(value);\n obj[propertyName] = jsValue;\n }\n } else {\n throw createVbError(VbErrorCodes.ObjectRequired, 'Object required', 'Vbscript');\n }\n }\n\n private evaluateConditional(node: ConditionalExpression): VbValue {\n const test = this.evaluate(node.test);\n if (toBoolean(test)) {\n return this.evaluate(node.consequent);\n }\n return this.evaluate(node.alternate);\n }\n}\n","import type { Statement, BlockStatement, ExpressionStatement, IfStatement, VbDimStatement, VbReDimStatement, VbEraseStatement, VbConstStatement, VbForToStatement, VbForEachStatement, VbDoLoopStatement, VbSelectCaseStatement, VbWithStatement, VbExitStatement, VbOptionExplicitStatement, VbSubStatement, VbFunctionStatement, VbClassStatement, VbOnErrorHandlerStatement, VbCallStatement, Expression, VbGotoStatement } from '../ast/index.ts';\nimport type { VbValue } from '../runtime/index.ts';\nimport { VbContext, VbEmpty, createVbValue, toBoolean, toNumber, VbError, VbErrorCodes, createVbError, VbArray, createVbArray, VbObjectInstance, VbClass, VbProperty } from '../runtime/index.ts';\nimport { ExpressionEvaluator } from './expression-evaluator.ts';\n\nexport class ControlFlowSignal extends Error {\n constructor(public type: 'exit' | 'return' | 'continue' | 'break' | 'goto', public value?: VbValue) {\n super(type);\n }\n}\n\nexport class GotoSignal extends ControlFlowSignal {\n constructor(public labelName: string) {\n super('goto');\n }\n}\n\nexport class StatementExecutor {\n private exprEvaluator: ExpressionEvaluator;\n\n constructor(private context: VbContext) {\n this.exprEvaluator = new ExpressionEvaluator(context);\n }\n\n execute(node: Statement): VbValue {\n try {\n switch (node.type) {\n case 'ExpressionStatement':\n return this.executeExpressionStatement(node);\n case 'BlockStatement':\n return this.executeBlockStatement(node);\n case 'IfStatement':\n return this.executeIfStatement(node);\n case 'VbDimStatement':\n return this.executeDimStatement(node);\n case 'VbReDimStatement':\n return this.executeReDimStatement(node);\n case 'VbEraseStatement':\n return this.executeEraseStatement(node);\n case 'VbConstStatement':\n return this.executeConstStatement(node);\n case 'VbForToStatement':\n return this.executeForToStatement(node);\n case 'VbForEachStatement':\n return this.executeForEachStatement(node);\n case 'VbDoLoopStatement':\n return this.executeDoLoopStatement(node);\n case 'VbSelectCaseStatement':\n return this.executeSelectCaseStatement(node);\n case 'VbWithStatement':\n return this.executeWithStatement(node);\n case 'VbExitStatement':\n return this.executeExitStatement(node);\n case 'VbOptionExplicitStatement':\n return this.executeOptionExplicitStatement(node);\n case 'VbSubStatement':\n return this.executeSubStatement(node);\n case 'VbFunctionStatement':\n return this.executeFunctionStatement(node);\n case 'VbClassStatement':\n return this.executeClassStatement(node);\n case 'VbPropertyGetStatement':\n case 'VbPropertyLetStatement':\n case 'VbPropertySetStatement':\n return this.executePropertyStatement(node);\n case 'VbOnErrorHandlerStatement':\n return this.executeOnErrorHandlerStatement(node);\n case 'VbCallStatement':\n return this.executeCallStatement(node);\n case 'VbGotoStatement':\n return this.executeGotoStatement(node);\n case 'VbLabelStatement':\n return VbEmpty;\n case 'ReturnStatement':\n throw new ControlFlowSignal('return');\n default:\n throw new Error(`Unknown statement type: ${(node as Statement).type}`);\n }\n } catch (error) {\n if (error instanceof ControlFlowSignal) {\n throw error;\n }\n if (error instanceof VbError) {\n this.context.setError(error);\n if (this.context.onErrorResumeNext) {\n return VbEmpty;\n }\n throw error;\n }\n const vbError = VbError.fromError(error as Error);\n this.context.setError(vbError);\n if (this.context.onErrorResumeNext) {\n return VbEmpty;\n }\n throw vbError;\n }\n }\n\n private executeExpressionStatement(node: ExpressionStatement): VbValue {\n return this.exprEvaluator.evaluate(node.expression);\n }\n\n private executeCallStatement(node: VbCallStatement): VbValue {\n return this.exprEvaluator.evaluateCall(node.callee, node.arguments);\n }\n\n private executeBlockStatement(node: BlockStatement): VbValue {\n let result: VbValue = VbEmpty;\n for (const stmt of node.body) {\n result = this.execute(stmt);\n }\n return result;\n }\n\n private executeIfStatement(node: IfStatement): VbValue {\n const test = this.exprEvaluator.evaluate(node.test);\n \n if (toBoolean(test)) {\n return this.execute(node.consequent);\n } else if (node.alternate) {\n return this.execute(node.alternate);\n }\n \n return VbEmpty;\n }\n\n private executeDimStatement(node: VbDimStatement): VbValue {\n for (const decl of node.declarations) {\n let value: VbValue = VbEmpty;\n \n if (decl.isArray && decl.arrayBounds) {\n const bounds = decl.arrayBounds.map(b => {\n const boundValue = this.exprEvaluator.evaluate(b);\n return toNumber(boundValue);\n });\n const arr = createVbArray(bounds);\n value = { type: 'Array', value: arr };\n } else if (decl.init) {\n value = this.exprEvaluator.evaluate(decl.init);\n }\n \n this.context.declareVariable(decl.id.name, value);\n }\n \n return VbEmpty;\n }\n\n private executeReDimStatement(node: VbReDimStatement): VbValue {\n for (const decl of node.declarations) {\n if (!decl.isArray || !decl.arrayBounds) continue;\n \n const bounds = decl.arrayBounds.map(b => {\n const boundValue = this.exprEvaluator.evaluate(b);\n return toNumber(boundValue);\n });\n \n const existingVar = this.context.currentScope.get(decl.id.name);\n \n if (existingVar && existingVar.value.type === 'Array') {\n const arr = existingVar.value.value as VbArray;\n arr.redim(bounds, node.preserve);\n } else {\n const arr = createVbArray(bounds);\n this.context.setVariable(decl.id.name, { type: 'Array', value: arr });\n }\n }\n \n return VbEmpty;\n }\n\n private executeEraseStatement(node: VbEraseStatement): VbValue {\n const arrayName = node.arrayName.name;\n const variable = this.context.currentScope.get(arrayName);\n \n if (!variable) {\n throw new Error(`Variable '${arrayName}' not defined`);\n }\n \n if (variable.value.type !== 'Array') {\n throw new Error(`Type mismatch: '${arrayName}' is not an array`);\n }\n \n const arr = variable.value.value as VbArray;\n arr.erase();\n \n return VbEmpty;\n }\n\n private executeConstStatement(node: VbConstStatement): VbValue {\n for (const decl of node.declarations) {\n const value = this.exprEvaluator.evaluate(decl.init);\n this.context.currentScope.declare(decl.id.name, value, { isConst: true });\n }\n \n return VbEmpty;\n }\n\n private executeForToStatement(node: VbForToStatement): VbValue {\n const init = this.exprEvaluator.evaluate(node.init);\n const to = this.exprEvaluator.evaluate(node.to);\n const step = node.step ? this.exprEvaluator.evaluate(node.step) : createVbValue(1);\n \n const startValue = toNumber(init);\n const endValue = toNumber(to);\n const stepValue = toNumber(step);\n \n this.context.declareVariable(node.left.name, createVbValue(startValue));\n \n const shouldContinue = stepValue > 0 \n ? () => toNumber(this.context.getVariable(node.left.name)) <= endValue\n : () => toNumber(this.context.getVariable(node.left.name)) >= endValue;\n \n while (shouldContinue()) {\n if (this.context.checkTimeout) this.context.checkTimeout();\n \n try {\n this.execute(node.body);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal) {\n if (signal.type === 'exit' && this.context.getExitFlag() === 'for') {\n this.context.clearExitFlag();\n break;\n }\n if (signal.type === 'return') {\n throw signal;\n }\n }\n throw signal;\n }\n \n const currentValue = toNumber(this.context.getVariable(node.left.name));\n this.context.setVariable(node.left.name, createVbValue(currentValue + stepValue));\n }\n \n return VbEmpty;\n }\n\n private executeForEachStatement(node: VbForEachStatement): VbValue {\n const collection = this.exprEvaluator.evaluate(node.right);\n \n if (collection.type !== 'Array' && collection.type !== 'Object') {\n throw createVbError(VbErrorCodes.TypeMismatch, 'Type mismatch: expected array or collection', 'Vbscript');\n }\n \n let items: VbValue[];\n if (collection.type === 'Array') {\n const arr = collection.value as VbArray;\n items = arr.toArray();\n } else {\n const obj = collection.value as VbObjectInstance;\n const count = obj.getProperty('Count');\n const countNum = toNumber(count);\n items = [];\n for (let i = 0; i < countNum; i++) {\n items.push(obj.getProperty(String(i)));\n }\n }\n \n this.context.declareVariable(node.left.name, VbEmpty);\n \n for (const item of items) {\n this.context.setVariable(node.left.name, item);\n \n try {\n this.execute(node.body);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal) {\n if (signal.type === 'exit' && this.context.getExitFlag() === 'for') {\n this.context.clearExitFlag();\n break;\n }\n if (signal.type === 'return') {\n throw signal;\n }\n }\n throw signal;\n }\n }\n \n return VbEmpty;\n }\n\n private executeDoLoopStatement(node: VbDoLoopStatement): VbValue {\n const checkCondition = (): boolean => {\n if (!node.test) return true;\n const testValue = this.exprEvaluator.evaluate(node.test!);\n return toBoolean(testValue);\n };\n \n const isWhile = node.testPosition === 'while-do' || node.testPosition === 'do-while';\n const isPreTest = node.testPosition === 'while-do' || node.testPosition === 'until-do';\n \n while (true) {\n if (this.context.checkTimeout) this.context.checkTimeout();\n \n if (isPreTest) {\n const cond = isWhile ? checkCondition() : !checkCondition();\n if (!cond) break;\n }\n \n try {\n this.execute(node.body);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal) {\n if (signal.type === 'exit' && this.context.getExitFlag() === 'do') {\n this.context.clearExitFlag();\n break;\n }\n if (signal.type === 'return') {\n throw signal;\n }\n }\n throw signal;\n }\n \n if (!isPreTest) {\n const cond = isWhile ? checkCondition() : !checkCondition();\n if (!cond) break;\n }\n }\n \n return VbEmpty;\n }\n\n private executeSelectCaseStatement(node: VbSelectCaseStatement): VbValue {\n const discriminant = this.exprEvaluator.evaluate(node.discriminant);\n \n for (const caseClause of node.cases) {\n if (caseClause.isElse) {\n for (const stmt of caseClause.consequent) {\n this.execute(stmt);\n }\n return VbEmpty;\n }\n \n const matches = this.matchCase(caseClause.test, discriminant);\n \n if (matches) {\n for (const stmt of caseClause.consequent) {\n this.execute(stmt);\n }\n return VbEmpty;\n }\n }\n \n return VbEmpty;\n }\n\n private matchCase(test: Expression | Expression[] | null, discriminant: VbValue): boolean {\n if (!test) return false;\n \n const tests = Array.isArray(test) ? test : [test];\n \n for (const t of tests) {\n if (t.type === 'BinaryExpression' && 'left' in t && (t.left as Expression).type === 'Identifier' && ((t.left as Expression) as { name: string }).name === '__select_expr__') {\n const right = this.exprEvaluator.evaluate(t.right as Expression);\n const operator = t.operator;\n \n switch (operator) {\n case '==':\n if (toBoolean(this.equals(discriminant, right))) return true;\n break;\n case '<':\n if (toNumber(discriminant) < toNumber(right)) return true;\n break;\n case '>':\n if (toNumber(discriminant) > toNumber(right)) return true;\n break;\n case '<=':\n if (toNumber(discriminant) <= toNumber(right)) return true;\n break;\n case '>=':\n if (toNumber(discriminant) >= toNumber(right)) return true;\n break;\n case '!=':\n if (!toBoolean(this.equals(discriminant, right))) return true;\n break;\n }\n } else {\n const testValue = this.exprEvaluator.evaluate(t);\n if (toBoolean(this.equals(discriminant, testValue))) {\n return true;\n }\n }\n }\n \n return false;\n }\n\n private equals(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Empty' && right.type === 'Empty') {\n return { type: 'Boolean', value: true };\n }\n if (left.type === 'Null' || right.type === 'Null') {\n return { type: 'Boolean', value: false };\n }\n if (left.type === 'String' || right.type === 'String') {\n const leftStr = left.type === 'String' ? left.value as string : String(toNumber(left));\n const rightStr = right.type === 'String' ? right.value as string : String(toNumber(right));\n return { type: 'Boolean', value: leftStr.toLowerCase() === rightStr.toLowerCase() };\n }\n return { type: 'Boolean', value: toNumber(left) === toNumber(right) };\n }\n\n private executeWithStatement(node: VbWithStatement): VbValue {\n const object = this.exprEvaluator.evaluate(node.object);\n this.context.pushWith(object);\n \n try {\n this.execute(node.body);\n } finally {\n this.context.popWith();\n }\n \n return VbEmpty;\n }\n\n private executeExitStatement(node: VbExitStatement): VbValue {\n this.context.setExitFlag(node.target.toLowerCase() as 'sub' | 'function' | 'property' | 'do' | 'for' | 'select');\n throw new ControlFlowSignal('exit');\n }\n\n private executeOptionExplicitStatement(_node: VbOptionExplicitStatement): VbValue {\n this.context.optionExplicit = true;\n return VbEmpty;\n }\n\n private executeSubStatement(node: VbSubStatement): VbValue {\n const subName = node.name.name;\n const self = this;\n \n const subFunc = function(args: VbValue[]): VbValue {\n self.context.pushScope();\n self.context.pushCall(subName);\n \n try {\n self.bindParameters(node.params, args);\n \n self.executeBlockStatement(node.body);\n \n self.updateByRefArgs(node.params, args);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal && signal.type === 'return') {\n self.updateByRefArgs(node.params, args);\n } else {\n throw signal;\n }\n } finally {\n self.context.popCall();\n self.context.popScope();\n }\n \n return VbEmpty;\n };\n \n const params = node.params.map(p => ({\n name: p.name.name,\n byRef: p.byRef,\n isArray: p.isArray,\n isOptional: p.isOptional,\n isParamArray: p.isParamArray,\n }));\n \n this.context.functionRegistry.register(subName, subFunc, { isSub: true, params, isUserDefined: true });\n return VbEmpty;\n }\n\n private executeFunctionStatement(node: VbFunctionStatement): VbValue {\n const funcName = node.name.name;\n const self = this;\n \n const func = function(args: VbValue[]): VbValue {\n self.context.pushScope();\n self.context.pushCall(funcName);\n \n self.context.declareVariable(funcName, VbEmpty);\n \n let result: VbValue = VbEmpty;\n \n try {\n self.bindParameters(node.params, args);\n \n self.executeBlockStatement(node.body);\n \n self.updateByRefArgs(node.params, args);\n \n result = self.context.getVariable(funcName);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal && signal.type === 'return') {\n self.updateByRefArgs(node.params, args);\n result = self.context.getVariable(funcName);\n } else {\n throw signal;\n }\n } finally {\n self.context.popCall();\n self.context.popScope();\n }\n \n return result;\n };\n \n const params = node.params.map(p => ({\n name: p.name.name,\n byRef: p.byRef,\n isArray: p.isArray,\n isOptional: p.isOptional,\n isParamArray: p.isParamArray,\n }));\n \n this.context.functionRegistry.register(funcName, func, { params, isUserDefined: true });\n return VbEmpty;\n }\n\n private bindParameters(params: import('../ast/index.ts').VbParameter[], args: VbValue[]): void {\n let argIndex = 0;\n \n for (const param of params) {\n if (param.isParamArray) {\n const restArgs: VbValue[] = [];\n while (argIndex < args.length) {\n restArgs.push(args[argIndex++]!);\n }\n const arr = createVbArray([restArgs.length]);\n restArgs.forEach((v, idx) => arr.set([idx], v));\n this.context.declareVariable(param.name.name, { type: 'Array', value: arr });\n } else {\n let argValue: VbValue;\n \n if (argIndex < args.length) {\n argValue = args[argIndex++]!;\n } else if (param.defaultValue) {\n argValue = this.exprEvaluator.evaluate(param.defaultValue);\n } else if (param.isOptional) {\n argValue = VbEmpty;\n } else {\n argValue = VbEmpty;\n }\n \n this.context.declareVariable(param.name.name, argValue);\n }\n }\n }\n\n private updateByRefArgs(params: import('../ast/index.ts').VbParameter[], args: VbValue[]): void {\n let argIndex = 0;\n \n for (const param of params) {\n if (param.isParamArray) {\n break;\n }\n \n if (argIndex < args.length && param.byRef) {\n args[argIndex] = this.context.getVariable(param.name.name);\n }\n argIndex++;\n }\n }\n\n private executeClassStatement(node: VbClassStatement): VbValue {\n const className = node.name.name;\n const cls = new VbClass(className);\n const self = this;\n let initializeFunc: VbProperty | undefined;\n let terminateFunc: VbProperty | undefined;\n \n for (const member of node.body) {\n if (member.type === 'VbDimStatement') {\n for (const decl of member.declarations) {\n cls.properties.set(decl.id.name.toLowerCase(), {\n name: decl.id.name,\n });\n }\n } else if (member.type === 'VbSubStatement') {\n const memberNode = member;\n const memberName = member.name.name.toLowerCase();\n \n if (memberName === 'class_initialize') {\n initializeFunc = {\n name: 'Class_Initialize',\n get: function(this: VbObjectInstance): VbValue {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n try {\n self.executeBlockStatement(memberNode.body);\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n return VbEmpty;\n },\n };\n continue;\n }\n \n if (memberName === 'class_terminate') {\n terminateFunc = {\n name: 'Class_Terminate',\n get: function(this: VbObjectInstance): VbValue {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n try {\n self.executeBlockStatement(memberNode.body);\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n return VbEmpty;\n },\n };\n continue;\n }\n \n cls.methods.set(memberName, {\n name: member.name.name,\n func: function(this: VbObjectInstance, ...args: VbValue[]): VbValue {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n try {\n self.bindParameters(memberNode.params, args);\n self.executeBlockStatement(memberNode.body);\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n return VbEmpty;\n },\n isSub: true,\n });\n } else if (member.type === 'VbFunctionStatement') {\n const memberNode = member;\n cls.methods.set(member.name.name.toLowerCase(), {\n name: member.name.name,\n func: function(this: VbObjectInstance, ...args: VbValue[]): VbValue {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n self.context.declareVariable(memberNode.name.name, VbEmpty);\n self.bindParameters(memberNode.params, args);\n let result: VbValue = VbEmpty;\n try {\n self.executeBlockStatement(memberNode.body);\n result = self.context.getVariable(memberNode.name.name);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal && signal.type === 'return') {\n result = self.context.getVariable(memberNode.name.name);\n } else {\n throw signal;\n }\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n return result;\n },\n isSub: false,\n });\n } else if (member.type === 'VbPropertyGetStatement') {\n const memberNode = member;\n const propName = member.name.name.toLowerCase();\n const existing = cls.properties.get(propName) || { name: member.name.name };\n existing.get = function(this: VbObjectInstance): VbValue {\n const prevInstance = self.context.currentInstance;\n const prevInPropertyGet = self.context.inPropertyGet;\n const prevPropertyGetName = self.context.propertyGetName;\n self.context.currentInstance = this;\n self.context.inPropertyGet = true;\n self.context.propertyGetName = memberNode.name.name.toLowerCase();\n self.context.pushScope();\n self.context.declareVariable(memberNode.name.name, VbEmpty);\n try {\n self.executeBlockStatement(memberNode.body);\n return self.context.currentScope.get(memberNode.name.name)?.value ?? VbEmpty;\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n self.context.inPropertyGet = prevInPropertyGet;\n self.context.propertyGetName = prevPropertyGetName;\n }\n };\n cls.properties.set(propName, existing);\n } else if (member.type === 'VbPropertyLetStatement') {\n const memberNode = member;\n const propName = member.name.name.toLowerCase();\n const existing = cls.properties.get(propName) || { name: member.name.name };\n existing.let = function(this: VbObjectInstance, value: VbValue): void {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n self.context.declareVariable(memberNode.name.name, VbEmpty);\n const param = memberNode.params[0];\n if (param) {\n self.context.declareVariable(param.name.name, value);\n }\n try {\n self.executeBlockStatement(memberNode.body);\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n };\n cls.properties.set(propName, existing);\n } else if (member.type === 'VbPropertySetStatement') {\n const memberNode = member;\n const propName = member.name.name.toLowerCase();\n const existing = cls.properties.get(propName) || { name: member.name.name };\n existing.set = function(this: VbObjectInstance, value: VbValue): void {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n self.context.declareVariable(memberNode.name.name, VbEmpty);\n const param = memberNode.params[0];\n if (param) {\n self.context.declareVariable(param.name.name, value);\n }\n try {\n self.executeBlockStatement(memberNode.body);\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n };\n cls.properties.set(propName, existing);\n }\n }\n \n if (initializeFunc) {\n cls.properties.set('class_initialize', initializeFunc);\n }\n if (terminateFunc) {\n cls.properties.set('class_terminate', terminateFunc);\n }\n \n this.context.classRegistry.register(cls);\n return VbEmpty;\n }\n\n private executePropertyStatement(_node: Statement): VbValue {\n return VbEmpty;\n }\n\n private executeOnErrorHandlerStatement(node: VbOnErrorHandlerStatement): VbValue {\n if (node.action === 'resume_next') {\n this.context.onErrorResumeNext = true;\n } else if (node.action === 'goto_0') {\n this.context.onErrorResumeNext = false;\n this.context.clearError();\n }\n return VbEmpty;\n }\n\n private executeGotoStatement(node: VbGotoStatement): VbValue {\n throw new GotoSignal(node.label.name.toLowerCase());\n }\n}\n","import type { VbValue } from '../runtime/index.ts';\n\nconst localeToLcid: Map<string, number> = new Map([\n ['af', 1078],\n ['sq', 1052],\n ['ar-ae', 14337],\n ['ar-bh', 15361],\n ['ar-dz', 5121],\n ['ar-eg', 3073],\n ['ar-iq', 2049],\n ['ar-jo', 11265],\n ['ar-kw', 13313],\n ['ar-lb', 12289],\n ['ar-ly', 4097],\n ['ar-ma', 6145],\n ['ar-om', 8193],\n ['ar-qa', 16385],\n ['ar-sa', 1025],\n ['ar-sy', 10241],\n ['ar-tn', 7169],\n ['ar-ye', 9217],\n ['hy', 1067],\n ['az', 1068],\n ['az-Latn', 1068],\n ['az-Cyrl', 2092],\n ['eu', 1069],\n ['be', 1059],\n ['bg', 1026],\n ['ca', 1027],\n ['zh-cn', 2052],\n ['zh-hk', 3076],\n ['zh-mo', 5124],\n ['zh-sg', 4100],\n ['zh-tw', 1028],\n ['zh', 2052],\n ['hr', 1050],\n ['cs', 1029],\n ['da', 1030],\n ['nl-nl', 1043],\n ['nl-be', 2067],\n ['nl', 1043],\n ['en-au', 3081],\n ['en-bz', 10249],\n ['en-ca', 4105],\n ['en-cb', 9225],\n ['en-ie', 6153],\n ['en-jm', 8201],\n ['en-nz', 5129],\n ['en-ph', 13321],\n ['en-za', 7177],\n ['en-tt', 11273],\n ['en-gb', 2057],\n ['en-us', 1033],\n ['en', 1033],\n ['et', 1061],\n ['fa', 1065],\n ['fi', 1035],\n ['fo', 1080],\n ['fr-fr', 1036],\n ['fr-be', 2060],\n ['fr-ca', 3084],\n ['fr-lu', 5132],\n ['fr-ch', 4108],\n ['fr', 1036],\n ['gd-ie', 2108],\n ['gd', 1084],\n ['de-de', 1031],\n ['de-at', 3079],\n ['de-li', 5127],\n ['de-lu', 4103],\n ['de-ch', 2055],\n ['de', 1031],\n ['el', 1032],\n ['he', 1037],\n ['hi', 1081],\n ['hu', 1038],\n ['is', 1039],\n ['id', 1057],\n ['it-it', 1040],\n ['it-ch', 2064],\n ['it', 1040],\n ['ja', 1041],\n ['ko', 1042],\n ['lv', 1062],\n ['lt', 1063],\n ['mk', 1071],\n ['ms-my', 1086],\n ['ms-bn', 2110],\n ['ms', 1086],\n ['mt', 1082],\n ['mr', 1102],\n ['no', 1044],\n ['nb', 1044],\n ['nn', 2068],\n ['pl', 1045],\n ['pt-pt', 2070],\n ['pt-br', 1046],\n ['pt', 1046],\n ['rm', 1047],\n ['ro', 1048],\n ['ro-md', 2072],\n ['ru', 1049],\n ['ru-md', 2073],\n ['sa', 1103],\n ['sr-Cyrl', 3098],\n ['sr-Latn', 2074],\n ['sr', 3098],\n ['tn', 1074],\n ['sl', 1060],\n ['sk', 1051],\n ['sb', 1070],\n ['es-es', 1034],\n ['es-ar', 11274],\n ['es-bo', 16394],\n ['es-cl', 13322],\n ['es-co', 9226],\n ['es-cr', 5130],\n ['es-do', 7178],\n ['es-ec', 12298],\n ['es-gt', 4106],\n ['es-hn', 18442],\n ['es-mx', 2058],\n ['es-ni', 19466],\n ['es-pa', 6154],\n ['es-pe', 10250],\n ['es-pr', 20490],\n ['es-py', 15370],\n ['es-sv', 17418],\n ['es-uy', 14346],\n ['es-ve', 8202],\n ['es', 1034],\n ['sx', 1072],\n ['sw', 1089],\n ['sv-se', 1053],\n ['sv-fi', 2077],\n ['sv', 1053],\n ['ta', 1097],\n ['tt', 1092],\n ['th', 1054],\n ['tr', 1055],\n ['ts', 1073],\n ['uk', 1058],\n ['ur', 1056],\n ['uz-Cyrl', 2115],\n ['uz-Latn', 1091],\n ['uz', 1091],\n ['vi', 1066],\n ['xh', 1076],\n ['yi', 1085],\n ['zu', 1077],\n]);\n\nconst lcidToLocale: Map<number, string> = new Map();\nlocaleToLcid.forEach((lcid, locale) => {\n lcidToLocale.set(lcid, locale);\n});\n\nlet currentLocale: string | null = null;\n\nfunction normalizeLocale(locale: string): string {\n return locale.toLowerCase().replace(/_/g, '-');\n}\n\nfunction findLocaleKey(normalized: string): string | undefined {\n for (const key of localeToLcid.keys()) {\n if (key.toLowerCase() === normalized) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction getBrowserLocale(): string {\n if (currentLocale) {\n return currentLocale;\n }\n\n const browserLocale = Intl.DateTimeFormat().resolvedOptions().locale || 'en-US';\n const normalized = normalizeLocale(browserLocale);\n\n const exactKey = findLocaleKey(normalized);\n if (exactKey) {\n return exactKey;\n }\n\n const baseLocale = normalized.split('-')[0] ?? 'en';\n const baseKey = findLocaleKey(baseLocale);\n if (baseKey) {\n return baseKey;\n }\n\n return 'en';\n}\n\nexport function getLocale(): VbValue {\n const locale = getBrowserLocale();\n const lcid = localeToLcid.get(locale) ?? 1033;\n return { type: 'Long', value: lcid };\n}\n\nexport function setLocale(lcid: VbValue): VbValue {\n const lcidValue = typeof lcid.value === 'number' ? lcid.value : parseInt(String(lcid.value), 10);\n\n if (isNaN(lcidValue)) {\n const localeStr = String(lcid.value).toLowerCase();\n const key = findLocaleKey(localeStr);\n if (key) {\n currentLocale = key;\n return { type: 'Long', value: localeToLcid.get(key) ?? 1033 };\n }\n return getLocale();\n }\n\n const locale = lcidToLocale.get(lcidValue);\n if (locale) {\n currentLocale = locale;\n return { type: 'Long', value: lcidValue };\n }\n\n return getLocale();\n}\n\nexport function getCurrentLocaleTag(): string {\n const locale = getBrowserLocale();\n const parts = locale.replace(/-/g, '_').split('_');\n return parts[0] + (locale.includes('-') ? '-' + (parts[1]?.toUpperCase() ?? '') : '');\n}\n\nexport function getCurrentBCP47Locale(): string {\n return getBrowserLocale();\n}\n\nconst localeToCurrency: Map<string, string> = new Map([\n ['en-us', 'USD'],\n ['en-gb', 'GBP'],\n ['en-au', 'AUD'],\n ['en-ca', 'CAD'],\n ['en-nz', 'NZD'],\n ['en-za', 'ZAR'],\n ['de-de', 'EUR'],\n ['de-at', 'EUR'],\n ['de-ch', 'CHF'],\n ['fr-fr', 'EUR'],\n ['fr-be', 'EUR'],\n ['fr-ca', 'CAD'],\n ['fr-ch', 'CHF'],\n ['ja', 'JPY'],\n ['zh-cn', 'CNY'],\n ['zh-tw', 'TWD'],\n ['zh-hk', 'HKD'],\n ['ko', 'KRW'],\n ['it', 'EUR'],\n ['es', 'EUR'],\n ['es-mx', 'MXN'],\n ['pt-br', 'BRL'],\n ['pt-pt', 'EUR'],\n ['ru', 'RUB'],\n ['pl', 'PLN'],\n ['nl', 'EUR'],\n ['sv', 'SEK'],\n ['da', 'DKK'],\n ['no', 'NOK'],\n ['fi', 'EUR'],\n ['cs', 'CZK'],\n ['hu', 'HUF'],\n ['tr', 'TRY'],\n ['th', 'THB'],\n ['id', 'IDR'],\n ['ms', 'MYR'],\n ['vi', 'VND'],\n ['in', 'INR'],\n ['hi', 'INR'],\n ['ar-sa', 'SAR'],\n ['ar-eg', 'EGP'],\n ['ar-ae', 'AED'],\n ['he', 'ILS'],\n ['en-ie', 'EUR'],\n ['en-ph', 'PHP'],\n ['en-in', 'INR'],\n]);\n\nexport function getCurrentCurrency(): string {\n const locale = getBrowserLocale();\n const currency = localeToCurrency.get(locale);\n if (currency) return currency;\n \n const baseLocale = locale.split('-')[0] ?? 'en';\n const baseCurrency = localeToCurrency.get(baseLocale);\n if (baseCurrency) return baseCurrency;\n \n return 'USD';\n}\n\nexport const localeFunctions = {\n GetLocale: getLocale,\n SetLocale: setLocale,\n};\n","import type { VbValue } from '../runtime/index.ts';\nimport { toNumber, toString, createVbArrayFromValues } from '../runtime/index.ts';\nimport { getCurrentBCP47Locale } from './locale.ts';\n\nfunction formatDate(value: Date, format: string): string {\n const result: string[] = [];\n let i = 0;\n \n while (i < format.length) {\n const char = format[i]!.toLowerCase();\n let count = 1;\n while (i + count < format.length && format[i + count]!.toLowerCase() === char) {\n count++;\n }\n \n switch (char) {\n case 'y':\n if (count >= 4) {\n result.push(value.getFullYear().toString());\n } else if (count === 3) {\n result.push(value.getFullYear().toString());\n } else if (count === 2) {\n result.push(value.getFullYear().toString().slice(-2));\n } else {\n result.push(value.getFullYear().toString().slice(-2));\n }\n break;\n case 'm':\n if (count >= 4) {\n const months: string[] = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n result.push(months[value.getMonth()]!);\n } else if (count === 3) {\n const months: string[] = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n result.push(months[value.getMonth()]!);\n } else if (count === 2) {\n result.push((value.getMonth() + 1).toString().padStart(2, '0'));\n } else {\n result.push((value.getMonth() + 1).toString());\n }\n break;\n case 'd':\n if (count >= 4) {\n const days: string[] = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n result.push(days[value.getDay()]!);\n } else if (count === 3) {\n const days: string[] = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n result.push(days[value.getDay()]!);\n } else if (count === 2) {\n result.push(value.getDate().toString().padStart(2, '0'));\n } else {\n result.push(value.getDate().toString());\n }\n break;\n case 'h':\n if (count >= 2) {\n result.push((value.getHours() % 12 || 12).toString().padStart(2, '0'));\n } else {\n result.push((value.getHours() % 12 || 12).toString());\n }\n break;\n case 'n':\n if (count >= 2) {\n result.push(value.getMinutes().toString().padStart(2, '0'));\n } else {\n result.push(value.getMinutes().toString());\n }\n break;\n case 's':\n if (count >= 2) {\n result.push(value.getSeconds().toString().padStart(2, '0'));\n } else {\n result.push(value.getSeconds().toString());\n }\n break;\n case 'q':\n result.push(Math.floor(value.getMonth() / 3 + 1).toString());\n break;\n case 'w':\n result.push((value.getDay() + 1).toString());\n break;\n case 'a':\n if (count >= 2) {\n result.push(value.getHours() >= 12 ? 'PM' : 'AM');\n } else {\n result.push(value.getHours() >= 12 ? 'P' : 'A');\n }\n break;\n default:\n result.push(format.substring(i, i + count));\n }\n i += count;\n }\n \n return result.join('');\n}\n\nfunction formatNumber(value: number, format: string): string {\n let positiveFormat = format;\n let negativeFormat = '';\n let zeroFormat = '';\n \n const semicolonIndex = format.indexOf(';');\n if (semicolonIndex !== -1) {\n positiveFormat = format.substring(0, semicolonIndex);\n const remaining = format.substring(semicolonIndex + 1);\n const secondSemicolon = remaining.indexOf(';');\n if (secondSemicolon !== -1) {\n negativeFormat = remaining.substring(0, secondSemicolon);\n zeroFormat = remaining.substring(secondSemicolon + 1);\n } else {\n negativeFormat = remaining;\n }\n }\n \n if (value === 0 && zeroFormat) {\n return formatNumberInternal(0, zeroFormat);\n }\n \n if (value < 0 && negativeFormat) {\n return formatNumberInternal(Math.abs(value), negativeFormat);\n }\n \n if (value < 0) {\n return '-' + formatNumberInternal(Math.abs(value), positiveFormat);\n }\n \n return formatNumberInternal(value, positiveFormat);\n}\n\nfunction formatNumberInternal(value: number, format: string): string {\n let hasPercent = format.includes('%');\n if (hasPercent) {\n value *= 100;\n }\n \n const formatLower = format.toLowerCase();\n let decimalPos = formatLower.indexOf('.');\n let decimalDigits = 0;\n \n if (decimalPos !== -1) {\n let i = decimalPos + 1;\n while (i < format.length && (format[i] === '0' || format[i] === '#')) {\n decimalDigits++;\n i++;\n }\n }\n \n let intPart = Math.floor(Math.abs(value));\n let decPart = decimalDigits > 0 ? Math.round((Math.abs(value) - intPart) * Math.pow(10, decimalDigits)) : 0;\n \n if (decPart >= Math.pow(10, decimalDigits)) {\n intPart++;\n decPart = 0;\n }\n \n let intStr = intPart.toString();\n \n const commaPos = formatLower.indexOf(',');\n if (commaPos !== -1) {\n intStr = intStr.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n }\n \n let result = intStr;\n \n if (decimalDigits > 0) {\n const decStr = decPart.toString().padStart(decimalDigits, '0');\n result += '.' + decStr;\n }\n \n if (hasPercent) {\n result += '%';\n }\n \n return result;\n}\n\nfunction formatString(value: string, format: string): string {\n if (format === '>' || format.toLowerCase() === '>') {\n return value.toUpperCase();\n }\n if (format === '<' || format.toLowerCase() === '<') {\n return value.toLowerCase();\n }\n return value;\n}\n\nexport const stringFunctions = {\n Len: (str: VbValue): VbValue => {\n const s = toString(str);\n return { type: 'Long', value: s.length };\n },\n\n Left: (str: VbValue, length: VbValue): VbValue => {\n const s = toString(str);\n const len = Math.max(0, Math.floor(toNumber(length)));\n return { type: 'String', value: s.substring(0, len) };\n },\n\n Right: (str: VbValue, length: VbValue): VbValue => {\n const s = toString(str);\n const len = Math.max(0, Math.floor(toNumber(length)));\n return { type: 'String', value: s.substring(s.length - len) };\n },\n\n Mid: (str: VbValue, start: VbValue, length?: VbValue): VbValue => {\n const s = toString(str);\n const startPos = Math.max(1, Math.floor(toNumber(start))) - 1;\n if (length) {\n const len = Math.floor(toNumber(length));\n return { type: 'String', value: s.substring(startPos, startPos + len) };\n }\n return { type: 'String', value: s.substring(startPos) };\n },\n\n InStr: (startOrStr: VbValue, str1OrStr2?: VbValue, str2OrCompare?: VbValue, compare?: VbValue): VbValue => {\n let start = 1;\n let str1: string;\n let str2: string;\n let compareMode = 0;\n \n if (str1OrStr2 === undefined) {\n str1 = '';\n str2 = toString(startOrStr);\n } else if (str2OrCompare === undefined) {\n str1 = toString(startOrStr);\n str2 = toString(str1OrStr2);\n } else {\n start = Math.max(1, Math.floor(toNumber(startOrStr)));\n str1 = toString(str1OrStr2);\n str2 = toString(str2OrCompare);\n if (compare) {\n compareMode = Math.floor(toNumber(compare));\n }\n }\n \n let index: number;\n if (compareMode === 0) {\n index = str1.indexOf(str2, start - 1);\n } else {\n index = str1.toLowerCase().indexOf(str2.toLowerCase(), start - 1);\n }\n return { type: 'Long', value: index + 1 };\n },\n\n InStrRev: (str1: VbValue, str2: VbValue, start?: VbValue, compare?: VbValue): VbValue => {\n const s1 = toString(str1);\n const s2 = toString(str2);\n const startPos = start ? Math.floor(toNumber(start)) : s1.length;\n const compareMode = compare ? Math.floor(toNumber(compare)) : 0;\n \n let index: number;\n if (compareMode === 0) {\n index = s1.lastIndexOf(s2, startPos - 1);\n } else {\n index = s1.toLowerCase().lastIndexOf(s2.toLowerCase(), startPos - 1);\n }\n return { type: 'Long', value: index + 1 };\n },\n\n LCase: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).toLowerCase() };\n },\n\n UCase: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).toUpperCase() };\n },\n\n LTrim: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).replace(/^\\s+/, '') };\n },\n\n RTrim: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).replace(/\\s+$/, '') };\n },\n\n Trim: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).trim() };\n },\n\n Replace: (str: VbValue, find: VbValue, replace: VbValue, start?: VbValue, count?: VbValue, compare?: VbValue): VbValue => {\n const s = toString(str);\n const findStr = toString(find);\n const replaceStr = toString(replace);\n const startPos = start ? Math.max(1, Math.floor(toNumber(start))) - 1 : 0;\n const maxCount = count ? Math.floor(toNumber(count)) : -1;\n const compareMode = compare ? Math.floor(toNumber(compare)) : 0;\n \n let result = '';\n let replaced = 0;\n let i = startPos;\n const searchStr = compareMode === 0 ? s : s.toLowerCase();\n const searchFind = compareMode === 0 ? findStr : findStr.toLowerCase();\n \n while (i < s.length) {\n if (maxCount !== -1 && replaced >= maxCount) {\n result += s.substring(i);\n break;\n }\n if (searchStr.substring(i, i + findStr.length) === searchFind) {\n result += replaceStr;\n i += findStr.length;\n replaced++;\n } else {\n result += s[i];\n i++;\n }\n }\n \n return { type: 'String', value: result };\n },\n\n StrReverse: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).split('').reverse().join('') };\n },\n\n Space: (number: VbValue): VbValue => {\n const count = Math.max(0, Math.floor(toNumber(number)));\n return { type: 'String', value: ' '.repeat(count) };\n },\n\n String: (number: VbValue, character: VbValue): VbValue => {\n const count = Math.max(0, Math.floor(toNumber(number)));\n const char = toString(character);\n const charCode = char.length > 0 ? char[0]! : ' ';\n return { type: 'String', value: charCode.repeat(count) };\n },\n\n Asc: (str: VbValue): VbValue => {\n const s = toString(str);\n return { type: 'Integer', value: s.length > 0 ? s.charCodeAt(0) : 0 };\n },\n\n AscW: (str: VbValue): VbValue => {\n const s = toString(str);\n return { type: 'Integer', value: s.length > 0 ? s.charCodeAt(0) : 0 };\n },\n\n Chr: (charCode: VbValue): VbValue => {\n const code = Math.floor(toNumber(charCode));\n return { type: 'String', value: String.fromCharCode(code) };\n },\n\n ChrW: (charCode: VbValue): VbValue => {\n const code = Math.floor(toNumber(charCode));\n return { type: 'String', value: String.fromCharCode(code) };\n },\n\n StrComp: (str1: VbValue, str2: VbValue, compare?: VbValue): VbValue => {\n const s1 = toString(str1);\n const s2 = toString(str2);\n const compareMode = compare ? Math.floor(toNumber(compare)) : 0;\n \n let result: number;\n if (compareMode === 1) {\n result = s1.toLowerCase().localeCompare(s2.toLowerCase());\n } else if (compareMode === 2) {\n const locale = getCurrentBCP47Locale();\n result = s1.localeCompare(s2, locale, { sensitivity: 'base' });\n } else {\n result = s1.localeCompare(s2);\n }\n return { type: 'Integer', value: result };\n },\n\n Split: (str: VbValue, delimiter?: VbValue, count?: VbValue, _compare?: VbValue): VbValue => {\n const s = toString(str);\n const delim = delimiter ? toString(delimiter) : ' ';\n const maxCount = count ? Math.floor(toNumber(count)) : -1;\n \n const parts = s.split(delim);\n let resultParts: string[];\n if (maxCount > 0 && parts.length > maxCount) {\n resultParts = parts.slice(0, maxCount - 1);\n resultParts.push(parts.slice(maxCount - 1).join(delim));\n } else {\n resultParts = parts;\n }\n \n const vbArray = createVbArrayFromValues(resultParts.map(p => ({ type: 'String', value: p } as VbValue)));\n return { type: 'Array', value: vbArray };\n },\n\n Join: (list: VbValue, delimiter?: VbValue): VbValue => {\n const delim = delimiter ? toString(delimiter) : ' ';\n if (list.type === 'Array') {\n const arr = list.value;\n if (typeof arr === 'object' && arr !== null && 'toArray' in arr) {\n const vbArray = arr as { toArray: () => VbValue[] };\n return { type: 'String', value: vbArray.toArray().map(v => toString(v)).join(delim) };\n }\n const plainArr = arr as VbValue[];\n return { type: 'String', value: plainArr.map(v => toString(v)).join(delim) };\n }\n return { type: 'String', value: '' };\n },\n\n Format: (expression: VbValue, format?: VbValue): VbValue => {\n if (expression.type === 'Empty' || expression.type === 'Null') {\n return { type: 'String', value: '' };\n }\n \n const formatStr = format ? toString(format) : '';\n \n if (!formatStr) {\n return { type: 'String', value: toString(expression) };\n }\n \n if (expression.type === 'Date' && expression.value instanceof Date) {\n return { type: 'String', value: formatDate(expression.value, formatStr) };\n }\n \n if (expression.type === 'Boolean') {\n return { type: 'String', value: expression.value ? 'True' : 'False' };\n }\n \n if (['Integer', 'Long', 'Single', 'Double', 'Currency', 'Byte'].includes(expression.type)) {\n return { type: 'String', value: formatNumber(toNumber(expression), formatStr) };\n }\n \n if (expression.type === 'String') {\n return { type: 'String', value: formatString(toString(expression), formatStr) };\n }\n \n return { type: 'String', value: toString(expression) };\n },\n\n LSet: (string: VbValue, length: VbValue): VbValue => {\n const str = toString(string);\n const len = Math.max(0, Math.floor(toNumber(length)));\n \n if (str.length >= len) {\n return { type: 'String', value: str.substring(0, len) };\n }\n \n return { type: 'String', value: str.padEnd(len, ' ') };\n },\n\n RSet: (string: VbValue, length: VbValue): VbValue => {\n const str = toString(string);\n const len = Math.max(0, Math.floor(toNumber(length)));\n \n if (str.length >= len) {\n return { type: 'String', value: str.substring(0, len) };\n }\n \n return { type: 'String', value: str.padStart(len, ' ') };\n },\n};\n","import type { VbValue } from '../runtime/index.ts';\nimport { createVbValue, toNumber, VbEmpty } from '../runtime/index.ts';\n\nexport const mathFunctions = {\n Abs: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return createVbValue(Math.abs(num));\n },\n\n Sgn: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Integer', value: num > 0 ? 1 : num < 0 ? -1 : 0 };\n },\n\n Sqr: (number: VbValue): VbValue => {\n const num = toNumber(number);\n if (num < 0) {\n throw new Error('Invalid procedure call or argument: Sqr');\n }\n return { type: 'Double', value: Math.sqrt(num) };\n },\n\n Int: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Long', value: Math.floor(num) };\n },\n\n Fix: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Long', value: num >= 0 ? Math.floor(num) : Math.ceil(num) };\n },\n\n Round: (number: VbValue, numDecimalPlaces?: VbValue): VbValue => {\n const num = toNumber(number);\n const decimals = numDecimalPlaces ? Math.floor(toNumber(numDecimalPlaces)) : 0;\n const factor = Math.pow(10, decimals);\n return { type: 'Double', value: Math.round(num * factor) / factor };\n },\n\n Atn: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Double', value: Math.atan(num) };\n },\n\n Cos: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Double', value: Math.cos(num) };\n },\n\n Sin: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Double', value: Math.sin(num) };\n },\n\n Tan: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Double', value: Math.tan(num) };\n },\n\n Exp: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Double', value: Math.exp(num) };\n },\n\n Log: (number: VbValue): VbValue => {\n const num = toNumber(number);\n if (num <= 0) {\n throw new Error('Invalid procedure call or argument: Log');\n }\n return { type: 'Double', value: Math.log(num) };\n },\n\n Rnd: (_number?: VbValue): VbValue => {\n return { type: 'Single', value: Math.random() };\n },\n\n Randomize: (_number?: VbValue): VbValue => {\n return VbEmpty;\n },\n\n Oct: (number: VbValue): VbValue => {\n const num = Math.floor(toNumber(number));\n return { type: 'String', value: num.toString(8) };\n },\n\n Hex: (number: VbValue): VbValue => {\n const num = Math.floor(toNumber(number));\n return { type: 'String', value: num.toString(16).toUpperCase() };\n },\n};\n\nexport const constants: Record<string, VbValue> = {\n vbCr: { type: 'String', value: '\\r' },\n vbCrLf: { type: 'String', value: '\\r\\n' },\n vbFormFeed: { type: 'String', value: '\\f' },\n vbLf: { type: 'String', value: '\\n' },\n vbNewLine: { type: 'String', value: '\\r\\n' },\n vbNullChar: { type: 'String', value: '\\0' },\n vbTab: { type: 'String', value: '\\t' },\n vbVerticalTab: { type: 'String', value: '\\v' },\n vbNullString: { type: 'String', value: '' },\n vbObjectError: { type: 'Long', value: -2147221504 },\n \n vbSunday: { type: 'Integer', value: 1 },\n vbMonday: { type: 'Integer', value: 2 },\n vbTuesday: { type: 'Integer', value: 3 },\n vbWednesday: { type: 'Integer', value: 4 },\n vbThursday: { type: 'Integer', value: 5 },\n vbFriday: { type: 'Integer', value: 6 },\n vbSaturday: { type: 'Integer', value: 7 },\n \n vbUseSystemDayOfWeek: { type: 'Integer', value: 0 },\n vbFirstJan1: { type: 'Integer', value: 1 },\n vbFirstFourDays: { type: 'Integer', value: 2 },\n vbFirstFullWeek: { type: 'Integer', value: 3 },\n \n vbBinaryCompare: { type: 'Integer', value: 0 },\n vbTextCompare: { type: 'Integer', value: 1 },\n vbDatabaseCompare: { type: 'Integer', value: 2 },\n \n vbGeneralDate: { type: 'Integer', value: 0 },\n vbLongDate: { type: 'Integer', value: 1 },\n vbShortDate: { type: 'Integer', value: 2 },\n vbLongTime: { type: 'Integer', value: 3 },\n vbShortTime: { type: 'Integer', value: 4 },\n \n vbEmpty: { type: 'Integer', value: 0 },\n vbNull: { type: 'Integer', value: 1 },\n vbInteger: { type: 'Integer', value: 2 },\n vbLong: { type: 'Integer', value: 3 },\n vbSingle: { type: 'Integer', value: 4 },\n vbDouble: { type: 'Integer', value: 5 },\n vbCurrency: { type: 'Integer', value: 6 },\n vbDate: { type: 'Integer', value: 7 },\n vbString: { type: 'Integer', value: 8 },\n vbObject: { type: 'Integer', value: 9 },\n vbError: { type: 'Integer', value: 10 },\n vbBoolean: { type: 'Integer', value: 11 },\n vbVariant: { type: 'Integer', value: 12 },\n vbDataObject: { type: 'Integer', value: 13 },\n vbDecimal: { type: 'Integer', value: 14 },\n vbByte: { type: 'Integer', value: 17 },\n vbArray: { type: 'Integer', value: 8192 },\n\n vbOKOnly: { type: 'Integer', value: 0 },\n vbOKCancel: { type: 'Integer', value: 1 },\n vbAbortRetryIgnore: { type: 'Integer', value: 2 },\n vbYesNoCancel: { type: 'Integer', value: 3 },\n vbYesNo: { type: 'Integer', value: 4 },\n vbRetryCancel: { type: 'Integer', value: 5 },\n\n vbCritical: { type: 'Integer', value: 16 },\n vbQuestion: { type: 'Integer', value: 32 },\n vbExclamation: { type: 'Integer', value: 48 },\n vbInformation: { type: 'Integer', value: 64 },\n\n vbDefaultButton1: { type: 'Integer', value: 0 },\n vbDefaultButton2: { type: 'Integer', value: 256 },\n vbDefaultButton3: { type: 'Integer', value: 512 },\n\n vbOK: { type: 'Integer', value: 1 },\n vbCancel: { type: 'Integer', value: 2 },\n vbAbort: { type: 'Integer', value: 3 },\n vbRetry: { type: 'Integer', value: 4 },\n vbIgnore: { type: 'Integer', value: 5 },\n vbYes: { type: 'Integer', value: 6 },\n vbNo: { type: 'Integer', value: 7 },\n};\n","import type { VbValue } from '../runtime/index.ts';\nimport { toNumber, toString } from '../runtime/index.ts';\n\nfunction serialToDate(serial: number): Date {\n const baseDate = new Date(1899, 11, 30);\n return new Date(baseDate.getTime() + serial * 86400000);\n}\n\nexport const dateFunctions = {\n Now: (): VbValue => {\n return { type: 'Date', value: new Date() };\n },\n\n Date: (): VbValue => {\n const now = new Date();\n return { type: 'Date', value: new Date(now.getFullYear(), now.getMonth(), now.getDate()) };\n },\n\n Time: (): VbValue => {\n const now = new Date();\n return { type: 'Date', value: new Date(0, 0, 0, now.getHours(), now.getMinutes(), now.getSeconds()) };\n },\n\n Year: (date: VbValue): VbValue => {\n const d = date.type === 'Date' ? (date.value as Date) : serialToDate(toNumber(date));\n return { type: 'Integer', value: d.getFullYear() };\n },\n\n Month: (date: VbValue): VbValue => {\n const d = date.type === 'Date' ? (date.value as Date) : serialToDate(toNumber(date));\n return { type: 'Integer', value: d.getMonth() + 1 };\n },\n\n Day: (date: VbValue): VbValue => {\n const d = date.type === 'Date' ? (date.value as Date) : serialToDate(toNumber(date));\n return { type: 'Integer', value: d.getDate() };\n },\n\n Weekday: (date: VbValue, firstDayOfWeek?: VbValue): VbValue => {\n const d = date.type === 'Date' ? (date.value as Date) : serialToDate(toNumber(date));\n const firstDay = firstDayOfWeek ? Math.floor(toNumber(firstDayOfWeek)) : 1;\n let day = d.getDay() + 1;\n day = day - firstDay + 1;\n if (day < 1) day += 7;\n return { type: 'Integer', value: day };\n },\n\n Hour: (time: VbValue): VbValue => {\n const d = time.type === 'Date' ? (time.value as Date) : serialToDate(toNumber(time));\n return { type: 'Integer', value: d.getHours() };\n },\n\n Minute: (time: VbValue): VbValue => {\n const d = time.type === 'Date' ? (time.value as Date) : serialToDate(toNumber(time));\n return { type: 'Integer', value: d.getMinutes() };\n },\n\n Second: (time: VbValue): VbValue => {\n const d = time.type === 'Date' ? (time.value as Date) : serialToDate(toNumber(time));\n return { type: 'Integer', value: d.getSeconds() };\n },\n\n DateAdd: (interval: VbValue, number: VbValue, date: VbValue): VbValue => {\n const intv = toString(interval).toLowerCase();\n const num = toNumber(number);\n const d = date.type === 'Date' ? new Date(date.value as Date) : serialToDate(toNumber(date));\n \n switch (intv) {\n case 'yyyy':\n d.setFullYear(d.getFullYear() + num);\n break;\n case 'q':\n d.setMonth(d.getMonth() + num * 3);\n break;\n case 'm':\n d.setMonth(d.getMonth() + num);\n break;\n case 'y':\n case 'd':\n case 'w':\n d.setDate(d.getDate() + num);\n break;\n case 'ww':\n d.setDate(d.getDate() + num * 7);\n break;\n case 'h':\n d.setHours(d.getHours() + num);\n break;\n case 'n':\n d.setMinutes(d.getMinutes() + num);\n break;\n case 's':\n d.setSeconds(d.getSeconds() + num);\n break;\n }\n \n return { type: 'Date', value: d };\n },\n\n DateDiff: (interval: VbValue, date1: VbValue, date2: VbValue, _firstDayOfWeek?: VbValue, _firstWeekOfYear?: VbValue): VbValue => {\n const intv = toString(interval).toLowerCase();\n const d1 = date1.type === 'Date' ? (date1.value as Date) : serialToDate(toNumber(date1));\n const d2 = date2.type === 'Date' ? (date2.value as Date) : serialToDate(toNumber(date2));\n const diff = d2.getTime() - d1.getTime();\n \n let result: number;\n switch (intv) {\n case 'yyyy':\n result = d2.getFullYear() - d1.getFullYear();\n break;\n case 'q':\n result = Math.floor((d2.getFullYear() - d1.getFullYear()) * 4 + (d2.getMonth() - d1.getMonth()) / 3);\n break;\n case 'm':\n result = (d2.getFullYear() - d1.getFullYear()) * 12 + (d2.getMonth() - d1.getMonth());\n break;\n case 'y':\n case 'd':\n result = Math.floor(diff / 86400000);\n break;\n case 'w':\n result = Math.floor(diff / 86400000);\n break;\n case 'ww':\n result = Math.floor(diff / (86400000 * 7));\n break;\n case 'h':\n result = Math.floor(diff / 3600000);\n break;\n case 'n':\n result = Math.floor(diff / 60000);\n break;\n case 's':\n result = Math.floor(diff / 1000);\n break;\n default:\n result = 0;\n }\n \n return { type: 'Long', value: result };\n },\n\n DatePart: (interval: VbValue, date: VbValue, _firstDayOfWeek?: VbValue, _firstWeekOfYear?: VbValue): VbValue => {\n const intv = toString(interval).toLowerCase();\n const d = date.type === 'Date' ? (date.value as Date) : serialToDate(toNumber(date));\n \n let result: number;\n switch (intv) {\n case 'yyyy':\n result = d.getFullYear();\n break;\n case 'q':\n result = Math.floor(d.getMonth() / 3) + 1;\n break;\n case 'm':\n result = d.getMonth() + 1;\n break;\n case 'y':\n const startOfYear = new Date(d.getFullYear(), 0, 1);\n result = Math.floor((d.getTime() - startOfYear.getTime()) / 86400000) + 1;\n break;\n case 'd':\n result = d.getDate();\n break;\n case 'w':\n result = d.getDay() + 1;\n break;\n case 'ww':\n const startOfYear2 = new Date(d.getFullYear(), 0, 1);\n result = Math.floor((d.getTime() - startOfYear2.getTime()) / (86400000 * 7)) + 1;\n break;\n case 'h':\n result = d.getHours();\n break;\n case 'n':\n result = d.getMinutes();\n break;\n case 's':\n result = d.getSeconds();\n break;\n default:\n result = 0;\n }\n \n return { type: 'Integer', value: result };\n },\n\n DateSerial: (year: VbValue, month: VbValue, day: VbValue): VbValue => {\n const y = Math.floor(toNumber(year));\n const m = Math.floor(toNumber(month));\n const d = Math.floor(toNumber(day));\n return { type: 'Date', value: new Date(y, m - 1, d) };\n },\n\n TimeSerial: (hour: VbValue, minute: VbValue, second: VbValue): VbValue => {\n const h = Math.floor(toNumber(hour));\n const m = Math.floor(toNumber(minute));\n const s = Math.floor(toNumber(second));\n return { type: 'Date', value: new Date(0, 0, 0, h, m, s) };\n },\n\n DateValue: (date: VbValue): VbValue => {\n const d = new Date(toString(date));\n if (isNaN(d.getTime())) {\n throw new Error('Type mismatch: DateValue');\n }\n return { type: 'Date', value: new Date(d.getFullYear(), d.getMonth(), d.getDate()) };\n },\n\n TimeValue: (time: VbValue): VbValue => {\n const d = new Date(toString(time));\n if (isNaN(d.getTime())) {\n throw new Error('Type mismatch: TimeValue');\n }\n return { type: 'Date', value: new Date(0, 0, 0, d.getHours(), d.getMinutes(), d.getSeconds()) };\n },\n\n MonthName: (month: VbValue, abbreviate?: VbValue): VbValue => {\n const m = Math.floor(toNumber(month));\n const names = ['January', 'February', 'March', 'April', 'May', 'June', \n 'July', 'August', 'September', 'October', 'November', 'December'];\n const abbrev = abbreviate ? toNumber(abbreviate) !== 0 : false;\n const name = names[m - 1] || '';\n return { type: 'String', value: abbrev ? name.substring(0, 3) : name };\n },\n\n WeekdayName: (weekday: VbValue, abbreviate?: VbValue, _firstDayOfWeek?: VbValue): VbValue => {\n const w = Math.floor(toNumber(weekday));\n const names = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n const abbrev = abbreviate ? toNumber(abbreviate) !== 0 : false;\n const name = names[w - 1] || '';\n return { type: 'String', value: abbrev ? name.substring(0, 3) : name };\n },\n\n Timer: (): VbValue => {\n const now = new Date();\n return { type: 'Single', value: now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds() + now.getMilliseconds() / 1000 };\n },\n};\n","import type { VbValue } from '../runtime/index.ts';\nimport { toNumber, toString, toBoolean, isEmpty, isNull, isNumeric } from '../runtime/index.ts';\nimport { getCurrentCurrency, getCurrentBCP47Locale } from './locale.ts';\n\nexport const conversionFunctions = {\n CBool: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: toBoolean(expression) };\n },\n\n CByte: (expression: VbValue): VbValue => {\n const num = Math.floor(toNumber(expression));\n if (num < 0 || num > 255) {\n throw new Error('Overflow: CByte');\n }\n return { type: 'Byte', value: num };\n },\n\n CCur: (expression: VbValue): VbValue => {\n return { type: 'Currency', value: toNumber(expression) };\n },\n\n CDate: (expression: VbValue): VbValue => {\n if (expression.type === 'Date') {\n return expression;\n }\n const str = toString(expression);\n const d = new Date(str);\n if (isNaN(d.getTime())) {\n throw new Error('Type mismatch: CDate');\n }\n return { type: 'Date', value: d };\n },\n\n CDbl: (expression: VbValue): VbValue => {\n return { type: 'Double', value: toNumber(expression) };\n },\n\n CInt: (expression: VbValue): VbValue => {\n const num = Math.round(toNumber(expression));\n if (num < -32768 || num > 32767) {\n throw new Error('Overflow: CInt');\n }\n return { type: 'Integer', value: num };\n },\n\n CLng: (expression: VbValue): VbValue => {\n const num = Math.round(toNumber(expression));\n return { type: 'Long', value: num };\n },\n\n CSng: (expression: VbValue): VbValue => {\n return { type: 'Single', value: toNumber(expression) };\n },\n\n CStr: (expression: VbValue): VbValue => {\n return { type: 'String', value: toString(expression) };\n },\n\n CVar: (expression: VbValue): VbValue => {\n return expression;\n },\n\n CVErr: (errorNumber: VbValue): VbValue => {\n return { type: 'Error', value: toNumber(errorNumber) };\n },\n\n Val: (string: VbValue): VbValue => {\n const str = toString(string).trim();\n const match = str.match(/^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?/);\n if (match) {\n return { type: 'Double', value: parseFloat(match[0]) };\n }\n return { type: 'Double', value: 0 };\n },\n\n Str: (number: VbValue): VbValue => {\n const num = toNumber(number);\n const str = String(num);\n if (num >= 0) {\n return { type: 'String', value: ' ' + str };\n }\n return { type: 'String', value: str };\n },\n\n FormatNumber: (expression: VbValue, numDigitsAfterDecimal?: VbValue, includeLeadingDigit?: VbValue, _useParensForNegativeNumbers?: VbValue, groupDigits?: VbValue): VbValue => {\n const num = toNumber(expression);\n const decimals = numDigitsAfterDecimal ? Math.floor(toNumber(numDigitsAfterDecimal)) : -1;\n const leadingDigit = includeLeadingDigit ? toNumber(includeLeadingDigit) : -2;\n const grouping = groupDigits ? toNumber(groupDigits) : -2;\n \n const options: Intl.NumberFormatOptions = {\n minimumFractionDigits: decimals >= 0 ? decimals : undefined,\n maximumFractionDigits: decimals >= 0 ? decimals : undefined,\n useGrouping: grouping === 0 ? false : grouping === -1 ? true : undefined,\n };\n \n if (leadingDigit === -1) {\n options.minimumIntegerDigits = 1;\n } else if (leadingDigit === 0) {\n options.minimumIntegerDigits = 2;\n }\n \n const locale = getCurrentBCP47Locale();\n return { type: 'String', value: num.toLocaleString(locale, options) };\n },\n\n FormatCurrency: (expression: VbValue, numDigitsAfterDecimal?: VbValue, includeLeadingDigit?: VbValue, _useParensForNegativeNumbers?: VbValue, groupDigits?: VbValue): VbValue => {\n const num = toNumber(expression);\n const decimals = numDigitsAfterDecimal ? Math.floor(toNumber(numDigitsAfterDecimal)) : -1;\n const leadingDigit = includeLeadingDigit ? toNumber(includeLeadingDigit) : -2;\n const grouping = groupDigits ? toNumber(groupDigits) : -2;\n \n const options: Intl.NumberFormatOptions = {\n style: 'currency',\n currency: getCurrentCurrency(),\n minimumFractionDigits: decimals >= 0 ? decimals : 2,\n maximumFractionDigits: decimals >= 0 ? decimals : 2,\n useGrouping: grouping === 0 ? false : grouping === -1 ? true : undefined,\n };\n \n if (leadingDigit === -1) {\n options.minimumIntegerDigits = 1;\n } else if (leadingDigit === 0) {\n options.minimumIntegerDigits = 2;\n }\n \n const locale = getCurrentBCP47Locale();\n return { type: 'String', value: num.toLocaleString(locale, options) };\n },\n\n FormatPercent: (expression: VbValue, numDigitsAfterDecimal?: VbValue, includeLeadingDigit?: VbValue, _useParensForNegativeNumbers?: VbValue, groupDigits?: VbValue): VbValue => {\n const num = toNumber(expression);\n const decimals = numDigitsAfterDecimal ? Math.floor(toNumber(numDigitsAfterDecimal)) : -1;\n const leadingDigit = includeLeadingDigit ? toNumber(includeLeadingDigit) : -2;\n const grouping = groupDigits ? toNumber(groupDigits) : -2;\n \n const options: Intl.NumberFormatOptions = {\n style: 'percent',\n minimumFractionDigits: decimals >= 0 ? decimals : undefined,\n maximumFractionDigits: decimals >= 0 ? decimals : undefined,\n useGrouping: grouping === 0 ? false : grouping === -1 ? true : undefined,\n };\n \n if (leadingDigit === -1) {\n options.minimumIntegerDigits = 1;\n } else if (leadingDigit === 0) {\n options.minimumIntegerDigits = 2;\n }\n \n const locale = getCurrentBCP47Locale();\n return { type: 'String', value: num.toLocaleString(locale, options) };\n },\n\n FormatDateTime: (date: VbValue, namedFormat?: VbValue): VbValue => {\n const d = date.type === 'Date' ? (date.value as Date) : new Date(toString(date));\n const format = namedFormat ? Math.floor(toNumber(namedFormat)) : 0;\n const locale = getCurrentBCP47Locale();\n \n let result: string;\n switch (format) {\n case 0:\n result = d.toLocaleString(locale);\n break;\n case 1:\n result = d.toLocaleDateString(locale, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\n break;\n case 2:\n result = d.toLocaleDateString(locale);\n break;\n case 3:\n result = d.toLocaleTimeString(locale);\n break;\n case 4:\n result = d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' });\n break;\n default:\n result = d.toLocaleString();\n }\n \n return { type: 'String', value: result };\n },\n\n Hex: (number: VbValue): VbValue => {\n const num = Math.floor(toNumber(number));\n return { type: 'String', value: num.toString(16).toUpperCase() };\n },\n\n Oct: (number: VbValue): VbValue => {\n const num = Math.floor(toNumber(number));\n return { type: 'String', value: num.toString(8) };\n },\n};\n\nexport const inspectionFunctions = {\n IsArray: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Array' };\n },\n\n IsDate: (expression: VbValue): VbValue => {\n if (expression.type === 'Date') {\n return { type: 'Boolean', value: true };\n }\n if (expression.type === 'String') {\n const d = new Date(expression.value as string);\n return { type: 'Boolean', value: !isNaN(d.getTime()) };\n }\n return { type: 'Boolean', value: false };\n },\n\n IsEmpty: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: isEmpty(expression) };\n },\n\n IsNull: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: isNull(expression) };\n },\n\n IsNumeric: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: isNumeric(expression) };\n },\n\n IsObject: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Object' };\n },\n\n VarType: (expression: VbValue): VbValue => {\n const typeMap: Record<string, number> = {\n 'Empty': 0,\n 'Null': 1,\n 'Integer': 2,\n 'Long': 3,\n 'Single': 4,\n 'Double': 5,\n 'Currency': 6,\n 'Date': 7,\n 'String': 8,\n 'Object': 9,\n 'Error': 10,\n 'Boolean': 11,\n 'Variant': 12,\n 'Byte': 17,\n 'Array': 8192,\n };\n return { type: 'Integer', value: typeMap[expression.type] ?? 12 };\n },\n\n TypeName: (expression: VbValue): VbValue => {\n const typeNames: Record<string, string> = {\n 'Empty': 'Empty',\n 'Null': 'Null',\n 'Integer': 'Integer',\n 'Long': 'Long',\n 'Single': 'Single',\n 'Double': 'Double',\n 'Currency': 'Currency',\n 'Date': 'Date',\n 'String': 'String',\n 'Object': 'Object',\n 'Error': 'Error',\n 'Boolean': 'Boolean',\n 'Variant': 'Variant',\n 'Byte': 'Byte',\n 'Array': 'Variant()',\n };\n return { type: 'String', value: typeNames[expression.type] ?? 'Variant' };\n },\n};\n","import type { VbValue } from '../runtime/index.ts';\r\nimport { toNumber, VbArray, createVbArrayFromValues } from '../runtime/index.ts';\r\n\r\nexport const arrayFunctions = {\r\n Array: (...args: VbValue[]): VbValue => {\r\n const arr = createVbArrayFromValues(args);\r\n return { type: 'Array', value: arr };\r\n },\r\n\r\n LBound: (arrayname: VbValue, dimension?: VbValue): VbValue => {\r\n if (arrayname.type !== 'Array') {\r\n throw new Error('Type mismatch: LBound');\r\n }\r\n const arr = arrayname.value as VbArray;\r\n const dim = dimension ? Math.floor(toNumber(dimension)) : 1;\r\n const bounds = arr.getBounds(dim);\r\n return { type: 'Long', value: bounds.lower };\r\n },\r\n\r\n UBound: (arrayname: VbValue, dimension?: VbValue): VbValue => {\r\n if (arrayname.type !== 'Array') {\r\n throw new Error('Type mismatch: UBound');\r\n }\r\n const arr = arrayname.value as VbArray;\r\n const dim = dimension ? Math.floor(toNumber(dimension)) : 1;\r\n const bounds = arr.getBounds(dim);\r\n return { type: 'Long', value: bounds.upper };\r\n },\r\n\r\n IsArray: (expression: VbValue): VbValue => {\r\n return { type: 'Boolean', value: expression.type === 'Array' };\r\n },\r\n\r\n Filter: (inputStrings: VbValue, value: VbValue, include?: VbValue, _compare?: VbValue): VbValue => {\r\n if (inputStrings.type !== 'Array') {\r\n throw new Error('Type mismatch: Filter');\r\n }\r\n const arr = (inputStrings.value as VbArray).toArray();\r\n const searchValue = (value.value as string).toLowerCase();\r\n const shouldInclude = include ? toNumber(include) !== 0 : true;\r\n \r\n const filtered = arr.filter(item => {\r\n const str = (item.value as string).toLowerCase();\r\n const found = str.includes(searchValue);\r\n return shouldInclude ? found : !found;\r\n });\r\n \r\n const result = createVbArrayFromValues(filtered);\r\n return { type: 'Array', value: result };\r\n },\r\n};\r\n\r\nexport function registerArrayFunctions(context: { functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue, options?: { isSub: boolean }) => void } }): void {\r\n Object.entries(arrayFunctions).forEach(([name, func]) => {\r\n context.functionRegistry.register(name, func as (...args: VbValue[]) => VbValue);\r\n });\r\n}\r\n","import type { VbValue } from '../runtime/index.ts';\n\nexport const MsgBoxConstants = {\n vbOKOnly: 0,\n vbOKCancel: 1,\n vbAbortRetryIgnore: 2,\n vbYesNoCancel: 3,\n vbYesNo: 4,\n vbRetryCancel: 5,\n\n vbCritical: 16,\n vbQuestion: 32,\n vbExclamation: 48,\n vbInformation: 64,\n\n vbDefaultButton1: 0,\n vbDefaultButton2: 256,\n vbDefaultButton3: 512,\n\n vbOK: 1,\n vbCancel: 2,\n vbAbort: 3,\n vbRetry: 4,\n vbIgnore: 5,\n vbYes: 6,\n vbNo: 7,\n};\n\nexport type MsgBoxButtonType = 'OK' | 'OKCancel' | 'AbortRetryIgnore' | 'YesNoCancel' | 'YesNo' | 'RetryCancel';\nexport type MsgBoxIconType = 'Critical' | 'Question' | 'Exclamation' | 'Information' | null;\n\nexport interface MsgBoxResult {\n value: number;\n button: string;\n}\n\nfunction parseButtons(buttons: number | undefined): {\n buttonType: MsgBoxButtonType;\n iconType: MsgBoxIconType;\n defaultButton: number;\n} {\n const b = buttons ?? 0;\n const buttonTypeValue = b & 0x7;\n const iconValue = b & 0xF0;\n const defaultButton = b & 0x300;\n\n let buttonType: MsgBoxButtonType;\n switch (buttonTypeValue) {\n case 0: buttonType = 'OK'; break;\n case 1: buttonType = 'OKCancel'; break;\n case 2: buttonType = 'AbortRetryIgnore'; break;\n case 3: buttonType = 'YesNoCancel'; break;\n case 4: buttonType = 'YesNo'; break;\n case 5: buttonType = 'RetryCancel'; break;\n default: buttonType = 'OK';\n }\n\n let iconType: MsgBoxIconType = null;\n switch (iconValue) {\n case 16: iconType = 'Critical'; break;\n case 32: iconType = 'Question'; break;\n case 48: iconType = 'Exclamation'; break;\n case 64: iconType = 'Information'; break;\n }\n\n return { buttonType, iconType, defaultButton };\n}\n\nfunction getIconPrefix(iconType: MsgBoxIconType): string {\n switch (iconType) {\n case 'Critical': return '[X] ';\n case 'Question': return '[?] ';\n case 'Exclamation': return '[!] ';\n case 'Information': return '[i] ';\n default: return '';\n }\n}\n\nfunction buildPrompt(title: string | null, iconType: MsgBoxIconType, message: string): string {\n let prompt = getIconPrefix(iconType) + message;\n if (title) {\n prompt = `[${title}]\\n` + prompt;\n }\n return prompt;\n}\n\nfunction mapButtonToResult(button: string, buttonType: MsgBoxButtonType): number {\n const b = button.toLowerCase();\n switch (buttonType) {\n case 'OK':\n case 'OKCancel':\n return b === 'ok' || b === 'confirm' ? MsgBoxConstants.vbOK : MsgBoxConstants.vbCancel;\n case 'YesNo':\n case 'YesNoCancel':\n if (b === 'yes' || b === 'y') return MsgBoxConstants.vbYes;\n if (b === 'no' || b === 'n') return MsgBoxConstants.vbNo;\n return MsgBoxConstants.vbCancel;\n case 'RetryCancel':\n if (b === 'retry' || b === 'r') return MsgBoxConstants.vbRetry;\n return MsgBoxConstants.vbCancel;\n case 'AbortRetryIgnore':\n if (b === 'abort' || b === 'a') return MsgBoxConstants.vbAbort;\n if (b === 'retry' || b === 'r') return MsgBoxConstants.vbRetry;\n if (b === 'ignore' || b === 'i') return MsgBoxConstants.vbIgnore;\n return MsgBoxConstants.vbCancel;\n default:\n return MsgBoxConstants.vbCancel;\n }\n}\n\nfunction getButtonOptions(buttonType: MsgBoxButtonType, defaultButton: number): string[] {\n const options: string[] = [];\n switch (buttonType) {\n case 'OK':\n options.push('OK');\n break;\n case 'OKCancel':\n options.push(defaultButton === 256 ? 'OK (default), Cancel' : 'OK, Cancel (default)');\n break;\n case 'YesNo':\n options.push(defaultButton === 256 ? 'Yes (default), No' : 'Yes, No (default)');\n break;\n case 'YesNoCancel':\n if (defaultButton === 512) {\n options.push('Yes, No, Cancel (default)');\n } else if (defaultButton === 256) {\n options.push('Yes (default), No, Cancel');\n } else {\n options.push('Yes, No (default), Cancel');\n }\n break;\n case 'RetryCancel':\n options.push(defaultButton === 256 ? 'Retry (default), Cancel' : 'Retry, Cancel (default)');\n break;\n case 'AbortRetryIgnore':\n if (defaultButton === 512) {\n options.push('Abort, Retry, Ignore (default)');\n } else if (defaultButton === 256) {\n options.push('Abort, Retry (default), Ignore');\n } else {\n options.push('Abort (default), Retry, Ignore');\n }\n break;\n }\n return options;\n}\n\nfunction _getInputPrompt(buttonType: MsgBoxButtonType, _defaultButton: number): string {\n let prompt = '';\n switch (buttonType) {\n case 'OK':\n prompt = '[OK]';\n break;\n case 'OKCancel':\n prompt = '[O]K / [C]ancel';\n break;\n case 'YesNo':\n prompt = '[Y]es / [N]o';\n break;\n case 'YesNoCancel':\n prompt = '[Y]es / [N]o / [C]ancel';\n break;\n case 'RetryCancel':\n prompt = '[R]etry / [C]ancel';\n break;\n case 'AbortRetryIgnore':\n prompt = '[A]bort / [R]etry / [I]gnore';\n break;\n }\n return prompt;\n}\n\nfunction _readFromConsole(): Promise<string | null> {\n return new Promise((resolve) => {\n // @ts-ignore - Node.js specific\n const readline = require('readline');\n const rl = readline.createInterface({\n // @ts-ignore - Node.js specific\n input: process.stdin,\n // @ts-ignore - Node.js specific\n output: process.stdout\n });\n rl.question('', (answer: string) => {\n rl.close();\n resolve(answer || null);\n });\n });\n}\n\nfunction _syncReadFromConsole(): string | null {\n try {\n // @ts-ignore - Node.js specific\n const readline = require('readline');\n const rl = readline.createInterface({\n // @ts-ignore - Node.js specific\n input: process.stdin,\n // @ts-ignore - Node.js specific\n output: process.stdout\n });\n rl.question('', () => {});\n } catch (e) {\n return null;\n }\n return null;\n}\n\nexport interface MsgBoxOptions {\n alert?: (message: string) => void;\n confirm?: (message: string) => boolean | undefined;\n prompt?: (message: string, defaultValue: string) => string | null;\n console?: (message: string) => void;\n readline?: () => Promise<string | null>;\n}\n\nexport function createMsgBox(options?: MsgBoxOptions) {\n return function(\n _context: { functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue, options?: { isSub: boolean }) => void } },\n promptVal: VbValue,\n buttons?: VbValue,\n title?: VbValue\n ): VbValue {\n const message = String(promptVal.value ?? promptVal);\n const buttonsVal = buttons ? Number(buttons.value ?? buttons) : 0;\n const titleStr = title ? String(title.value ?? title) : null;\n\n const { buttonType, iconType, defaultButton } = parseButtons(buttonsVal);\n const fullPrompt = buildPrompt(titleStr, iconType, message);\n const buttonOptions = getButtonOptions(buttonType, defaultButton);\n\n const finalPrompt = fullPrompt + '\\n' + buttonOptions.join(' ');\n\n if (options?.alert && buttonType === 'OK') {\n options.alert(finalPrompt);\n return { type: 'Integer', value: MsgBoxConstants.vbOK };\n }\n\n if (options?.confirm) {\n const isYesNoType = buttonType === 'YesNo' || buttonType === 'YesNoCancel' || buttonType === 'OKCancel';\n if (isYesNoType) {\n const confirmResult = options.confirm(finalPrompt);\n if (confirmResult === undefined) {\n } else if (confirmResult) {\n return { type: 'Integer', value: buttonType === 'OKCancel' ? MsgBoxConstants.vbOK : MsgBoxConstants.vbYes };\n } else {\n return { type: 'Integer', value: buttonType === 'OKCancel' ? MsgBoxConstants.vbCancel : MsgBoxConstants.vbNo };\n }\n }\n }\n\n if (options?.console) {\n options.console(finalPrompt);\n } else {\n console.log(finalPrompt);\n }\n\n if (options?.readline) {\n return options.readline().then((input: string | null) => {\n if (input === null) {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n const result = mapButtonToResult(input, buttonType);\n return { type: 'Integer', value: result };\n }) as unknown as VbValue;\n }\n\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n };\n}\n\nexport function createBrowserMsgBox() {\n return function(prompt: VbValue, buttons?: VbValue, title?: VbValue): VbValue {\n const message = String(prompt.value ?? prompt);\n const buttonsVal = buttons ? Number(buttons.value ?? buttons) : 0;\n const titleStr = title ? String(title.value ?? title) : 'VBScript';\n\n const { buttonType, iconType } = parseButtons(buttonsVal);\n const fullPrompt = buildPrompt(titleStr, iconType, message);\n\n if (buttonType === 'OK') {\n alert(fullPrompt);\n return { type: 'Integer', value: MsgBoxConstants.vbOK };\n }\n\n if (buttonType === 'OKCancel') {\n const confirmed = confirm(fullPrompt);\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbOK : MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'YesNo') {\n const confirmed = confirm(fullPrompt + '\\n[OK]=Yes / [Cancel]=No');\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbYes : MsgBoxConstants.vbNo };\n }\n\n if (buttonType === 'YesNoCancel') {\n const input = window.prompt(fullPrompt + '\\n\\nEnter: Y (Yes) / N (No) / C (Cancel) or invalid value for cancel', '');\n if (input === null) {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n const normalized = input.trim().toUpperCase();\n if (normalized === 'Y' || normalized === 'YES') {\n return { type: 'Integer', value: MsgBoxConstants.vbYes };\n }\n if (normalized === 'N' || normalized === 'NO') {\n return { type: 'Integer', value: MsgBoxConstants.vbNo };\n }\n if (normalized === 'C' || normalized === 'CANCEL' || normalized === '') {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'RetryCancel') {\n const confirmed = confirm(fullPrompt + '\\n[OK]=Retry / [Cancel]=Cancel');\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbRetry : MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'AbortRetryIgnore') {\n const input = window.prompt(fullPrompt + '\\n\\nEnter: A (Abort) / R (Retry) / I (Ignore)', '');\n if (input === null) {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n const normalized = input.trim().toUpperCase();\n if (normalized === 'A' || normalized === 'ABORT') {\n return { type: 'Integer', value: MsgBoxConstants.vbAbort };\n }\n if (normalized === 'R' || normalized === 'RETRY') {\n return { type: 'Integer', value: MsgBoxConstants.vbRetry };\n }\n if (normalized === 'I' || normalized === 'IGNORE' || normalized === '') {\n return { type: 'Integer', value: MsgBoxConstants.vbIgnore };\n }\n return { type: 'Integer', value: MsgBoxConstants.vbIgnore };\n }\n\n alert(fullPrompt);\n return { type: 'Integer', value: MsgBoxConstants.vbOK };\n };\n}\n\nexport function registerMsgBox(context: { functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue, options?: { isSub: boolean }) => void } }): void {\n context.functionRegistry.register('MsgBox', (promptVal: VbValue, buttons?: VbValue, title?: VbValue): VbValue => {\n const message = String(promptVal.value ?? promptVal);\n const buttonsVal = buttons ? Number(buttons.value ?? buttons) : 0;\n const titleStr = title ? String(title.value ?? title) : null;\n\n const { buttonType, iconType, defaultButton } = parseButtons(buttonsVal);\n const fullPrompt = buildPrompt(titleStr, iconType, message);\n\n if (buttonType === 'OK') {\n if (typeof alert !== 'undefined') {\n alert(fullPrompt);\n } else {\n console.log(fullPrompt);\n }\n return { type: 'Integer', value: MsgBoxConstants.vbOK };\n }\n\n if (typeof window !== 'undefined' && typeof window.confirm === 'function') {\n if (buttonType === 'OKCancel') {\n const confirmed = confirm(fullPrompt);\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbOK : MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'YesNo') {\n const confirmed = confirm(fullPrompt + '\\n[OK]=Yes / [Cancel]=No');\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbYes : MsgBoxConstants.vbNo };\n }\n\n if (buttonType === 'YesNoCancel' && typeof window.prompt === 'function') {\n const input = window.prompt(fullPrompt + '\\n\\nEnter: Y (Yes) / N (No) / C (Cancel) or invalid value for cancel', '');\n if (input === null) {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n const normalized = input.trim().toUpperCase();\n if (normalized === 'Y' || normalized === 'YES') {\n return { type: 'Integer', value: MsgBoxConstants.vbYes };\n }\n if (normalized === 'N' || normalized === 'NO') {\n return { type: 'Integer', value: MsgBoxConstants.vbNo };\n }\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'RetryCancel') {\n const confirmed = confirm(fullPrompt + '\\n[OK]=Retry / [Cancel]=Cancel');\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbRetry : MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'AbortRetryIgnore' && typeof window.prompt === 'function') {\n const input = window.prompt(fullPrompt + '\\n\\nEnter: A (Abort) / R (Retry) / I (Ignore)', '');\n if (input === null) {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n const normalized = input.trim().toUpperCase();\n if (normalized === 'A' || normalized === 'ABORT') {\n return { type: 'Integer', value: MsgBoxConstants.vbAbort };\n }\n if (normalized === 'R' || normalized === 'RETRY') {\n return { type: 'Integer', value: MsgBoxConstants.vbRetry };\n }\n if (normalized === 'I' || normalized === 'IGNORE' || normalized === '') {\n return { type: 'Integer', value: MsgBoxConstants.vbIgnore };\n }\n return { type: 'Integer', value: MsgBoxConstants.vbIgnore };\n }\n }\n\n console.log(fullPrompt + '\\n' + getButtonOptions(buttonType, defaultButton).join(' '));\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }, { isSub: false });\n}\n","import type { VbValue } from '../runtime/index.ts';\n\nexport interface InputBoxOptions {\n prompt?: (message: string, defaultValue: string) => string | null;\n console?: (message: string) => void;\n readline?: () => Promise<string | null>;\n}\n\nexport function createInputBox(options?: InputBoxOptions) {\n return function(\n _context: { functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue) => void } },\n promptVal: VbValue,\n title?: VbValue,\n defaultText?: VbValue,\n _xPos?: VbValue,\n _yPos?: VbValue,\n _helpFile?: VbValue,\n _contextVal?: VbValue\n ): VbValue {\n const message = String(promptVal.value ?? promptVal);\n const titleStr = title ? String(title.value ?? title) : 'Input';\n const defaultVal = defaultText ? String(defaultText.value ?? defaultText) : '';\n\n if (options?.prompt) {\n const result = options.prompt(message, defaultVal);\n return { type: 'String', value: result ?? '' };\n }\n\n if (options?.console) {\n options.console(`[${titleStr}]\\n${message}\\nDefault: ${defaultVal}\\nPress Enter to confirm or Esc to cancel`);\n } else {\n console.log(`[${titleStr}]\\n${message}\\nDefault: ${defaultVal}\\nPress Enter to confirm or Esc to cancel`);\n }\n\n if (options?.readline) {\n return options.readline().then((input: string | null) => {\n if (input === null) {\n return { type: 'String', value: '' };\n }\n return { type: 'String', value: input || defaultVal };\n }) as unknown as VbValue;\n }\n\n return { type: 'String', value: '' };\n };\n}\n\nexport function createBrowserInputBox() {\n return function(\n prompt: VbValue,\n title?: VbValue,\n defaultVal?: VbValue,\n _xPos?: VbValue,\n _yPos?: VbValue,\n _helpFile?: VbValue,\n _contextVal?: VbValue\n ): VbValue {\n const message = String(prompt.value ?? prompt);\n const titleStr = title ? String(title.value ?? title) : 'Input';\n const def = defaultVal ? String(defaultVal.value ?? defaultVal) : '';\n const result = window.prompt(`[${titleStr}]\\n${message}`, def);\n return { type: 'String', value: result ?? '' };\n };\n}\n\nexport function registerInputBox(context: { functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue) => void } }): void {\n context.functionRegistry.register('InputBox', (promptVal: VbValue, title?: VbValue, defaultText?: VbValue, _xPos?: VbValue, _yPos?: VbValue, _helpFile?: VbValue, _contextVal?: VbValue): VbValue => {\n const message = String(promptVal.value ?? promptVal);\n const titleStr = title ? String(title.value ?? title) : 'Input';\n const defaultVal = defaultText ? String(defaultText.value ?? defaultText) : '';\n\n if (typeof window !== 'undefined' && typeof window.prompt === 'function') {\n const result = window.prompt(`[${titleStr}]\\n${message}`, defaultVal);\n return { type: 'String', value: result ?? '' };\n }\n\n console.log(`[${titleStr}]\\n${message}\\nDefault: ${defaultVal}`);\n return { type: 'String', value: '' };\n });\n}\n","import type { VbValue } from '../runtime/index.ts';\n\ninterface VbMatch {\n firstIndex: number;\n length: number;\n value: string;\n subMatches: string[];\n}\n\ninterface VbRegExpState {\n pattern: string;\n global: boolean;\n ignoreCase: boolean;\n multiline: boolean;\n}\n\nfunction createMatchObject(match: VbMatch): VbValue {\n return {\n type: 'Object',\n value: {\n classInfo: { name: 'Match' },\n getProperty: (name: string): VbValue => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'firstindex') {\n return { type: 'Long', value: match.firstIndex };\n }\n if (lowerName === 'length') {\n return { type: 'Long', value: match.length };\n }\n if (lowerName === 'value') {\n return { type: 'String', value: match.value };\n }\n return { type: 'Empty', value: undefined };\n },\n hasProperty: (name: string): boolean => {\n const lowerName = name.toLowerCase();\n return ['firstindex', 'length', 'value'].includes(lowerName);\n },\n getPropertyNames: (): string[] => ['FirstIndex', 'Length', 'Value'],\n },\n };\n}\n\nfunction createSubMatchesObject(subMatches: string[]): VbValue {\n return {\n type: 'Object',\n value: {\n classInfo: { name: 'SubMatches' },\n getProperty: (name: string): VbValue => {\n const index = parseInt(name, 10);\n if (!isNaN(index) && index >= 0 && index < subMatches.length) {\n return { type: 'String', value: subMatches[index] ?? '' };\n }\n return { type: 'Empty', value: undefined };\n },\n hasProperty: (name: string): boolean => {\n const index = parseInt(name, 10);\n return !isNaN(index) && index >= 0 && index < subMatches.length;\n },\n hasMethod: (name: string): boolean => {\n return name.toLowerCase() === 'count';\n },\n getMethod: (name: string): { func: (...args: VbValue[]) => VbValue } => {\n if (name.toLowerCase() === 'count') {\n return { func: () => ({ type: 'Long', value: subMatches.length }) };\n }\n throw new Error(`Unknown SubMatches method: ${name}`);\n },\n },\n };\n}\n\nfunction createMatchesCollection(matches: VbMatch[]): VbValue {\n const matchObjects = matches.map(createMatchObject);\n \n return {\n type: 'Object',\n value: {\n classInfo: { name: 'Matches' },\n getProperty: (name: string): VbValue => {\n const index = parseInt(name, 10);\n if (!isNaN(index) && index >= 0 && index < matchObjects.length) {\n return matchObjects[index] ?? { type: 'Empty', value: undefined };\n }\n return { type: 'Empty', value: undefined };\n },\n hasProperty: (name: string): boolean => {\n const index = parseInt(name, 10);\n return !isNaN(index) && index >= 0 && index < matchObjects.length;\n },\n hasMethod: (name: string): boolean => {\n return name.toLowerCase() === 'count' || name.toLowerCase() === 'item';\n },\n getMethod: (name: string): { func: (...args: VbValue[]) => VbValue } => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'count') {\n return { func: () => ({ type: 'Long', value: matches.length }) };\n }\n if (lowerName === 'item') {\n return {\n func: (index: VbValue): VbValue => {\n const idx = Math.floor(Number(index.value ?? 0));\n if (idx >= 0 && idx < matchObjects.length) {\n return matchObjects[idx] ?? { type: 'Empty', value: undefined };\n }\n return { type: 'Empty', value: undefined };\n },\n };\n }\n throw new Error(`Unknown Matches method: ${name}`);\n },\n },\n };\n}\n\nfunction createRegExpObject(state: VbRegExpState): VbValue {\n return {\n type: 'Object',\n value: {\n classInfo: { name: 'RegExp' },\n regexpState: state,\n getProperty: (name: string): VbValue => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'pattern') {\n return { type: 'String', value: state.pattern };\n }\n if (lowerName === 'global') {\n return { type: 'Boolean', value: state.global };\n }\n if (lowerName === 'ignorecase') {\n return { type: 'Boolean', value: state.ignoreCase };\n }\n if (lowerName === 'multiline') {\n return { type: 'Boolean', value: state.multiline };\n }\n return { type: 'Empty', value: undefined };\n },\n setProperty: (name: string, value: VbValue): void => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'pattern') {\n state.pattern = String(value.value ?? '');\n } else if (lowerName === 'global') {\n state.global = Boolean(value.value);\n } else if (lowerName === 'ignorecase') {\n state.ignoreCase = Boolean(value.value);\n } else if (lowerName === 'multiline') {\n state.multiline = Boolean(value.value);\n }\n },\n hasProperty: (name: string): boolean => {\n const lowerName = name.toLowerCase();\n return ['pattern', 'global', 'ignorecase', 'multiline'].includes(lowerName);\n },\n hasMethod: (name: string): boolean => {\n return ['execute', 'test', 'replace'].includes(name.toLowerCase());\n },\n getMethod: (name: string): { func: (...args: VbValue[]) => VbValue } => {\n const lowerName = name.toLowerCase();\n \n if (lowerName === 'test') {\n return {\n func: (sourceString: VbValue): VbValue => {\n const source = String(sourceString.value ?? '');\n if (!state.pattern) {\n return { type: 'Boolean', value: false };\n }\n try {\n const flags = (state.ignoreCase ? 'i' : '') + (state.multiline ? 'm' : '');\n const regex = new RegExp(state.pattern, flags);\n const result = regex.test(source);\n return { type: 'Boolean', value: result };\n } catch {\n return { type: 'Boolean', value: false };\n }\n },\n };\n }\n \n if (lowerName === 'execute') {\n return {\n func: (sourceString: VbValue): VbValue => {\n const source = String(sourceString.value ?? '');\n if (!state.pattern) {\n return createMatchesCollection([]);\n }\n try {\n const flags = (state.ignoreCase ? 'i' : '') + (state.multiline ? 'm' : '') + (state.global ? 'g' : '');\n const regex = new RegExp(state.pattern, flags);\n const matches: VbMatch[] = [];\n let match;\n \n while ((match = regex.exec(source)) !== null) {\n matches.push({\n firstIndex: match.index,\n length: match[0].length,\n value: match[0],\n subMatches: match.slice(1).map(m => m ?? ''),\n });\n \n if (!state.global) {\n break;\n }\n }\n \n return createMatchesCollection(matches);\n } catch {\n return createMatchesCollection([]);\n }\n },\n };\n }\n \n if (lowerName === 'replace') {\n return {\n func: (sourceString: VbValue, replaceString: VbValue): VbValue => {\n const source = String(sourceString.value ?? '');\n const replace = String(replaceString.value ?? '');\n if (!state.pattern) {\n return { type: 'String', value: source };\n }\n try {\n const flags = (state.ignoreCase ? 'i' : '') + (state.multiline ? 'm' : '') + (state.global ? 'g' : '');\n const regex = new RegExp(state.pattern, flags);\n const result = source.replace(regex, replace);\n return { type: 'String', value: result };\n } catch {\n return { type: 'String', value: source };\n }\n },\n };\n }\n \n throw new Error(`Unknown RegExp method: ${name}`);\n },\n },\n };\n}\n\nexport function registerRegExp(context: { \n functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue) => void };\n classRegistry: { registerClass: (name: string, creator: () => VbValue) => void };\n}): void {\n context.classRegistry.registerClass('RegExp', () => {\n return createRegExpObject({\n pattern: '',\n global: false,\n ignoreCase: false,\n multiline: false,\n });\n });\n \n context.functionRegistry.register('RegExp', (): VbValue => {\n return createRegExpObject({\n pattern: '',\n global: false,\n ignoreCase: false,\n multiline: false,\n });\n });\n}\n","import type { VbContext, VbValue } from '../runtime/index.ts';\nimport { stringFunctions } from './string.ts';\nimport { mathFunctions, constants } from './math.ts';\nimport { dateFunctions } from './date.ts';\nimport { conversionFunctions, inspectionFunctions } from './conversion.ts';\nimport { arrayFunctions } from './array.ts';\nimport { registerMsgBox } from './msgbox.ts';\nimport { registerInputBox } from './inputbox.ts';\nimport { registerRegExp } from './regexp.ts';\nimport { localeFunctions } from './locale.ts';\n\nexport function registerBuiltins(context: VbContext): void {\n Object.entries(stringFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(mathFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(dateFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(conversionFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(inspectionFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(arrayFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(constants).forEach(([name, value]) => {\n context.globalScope.declare(name, value);\n });\n\n registerMsgBox(context);\n registerInputBox(context);\n registerRegExp(context);\n\n Object.entries(localeFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n context.functionRegistry.register('ScriptEngine', (): VbValue => {\n return { type: 'String', value: 'VBScript' };\n });\n\n context.functionRegistry.register('ScriptEngineMajorVersion', (): VbValue => {\n return { type: 'Integer', value: 10 };\n });\n\n context.functionRegistry.register('ScriptEngineMinorVersion', (): VbValue => {\n return { type: 'Integer', value: 8 };\n });\n\n context.functionRegistry.register('ScriptEngineBuildVersion', (): VbValue => {\n return { type: 'Long', value: 16384 };\n });\n\n context.functionRegistry.register('Eval', (expression: VbValue): VbValue => {\n const code = String(expression.value ?? expression);\n const result = context.evaluate?.(code);\n return result ?? { type: 'Empty', value: undefined };\n });\n\n context.functionRegistry.register('Execute', (expression: VbValue): VbValue => {\n const code = String(expression.value ?? expression);\n const result = context.execute?.(code);\n return result ?? { type: 'Empty', value: undefined };\n }, { isSub: true });\n\n context.functionRegistry.register('ExecuteGlobal', (expression: VbValue): VbValue => {\n const code = String(expression.value ?? expression);\n const result = context.executeGlobal?.(code);\n return result ?? { type: 'Empty', value: undefined };\n }, { isSub: true });\n\n context.functionRegistry.register('Print', (...args: VbValue[]): VbValue => {\n console.log(...args.map(a => a.value ?? a));\n return { type: 'Empty', value: undefined };\n }, { isSub: true });\n\n context.functionRegistry.register('GetRef', (procname: VbValue): VbValue => {\n const name = String(procname.value ?? procname);\n const funcRegistry = context.functionRegistry;\n return {\n type: 'Object',\n value: {\n type: 'vbref',\n name,\n getProperty: (propName: string): VbValue => {\n if (propName.toLowerCase() === 'name') {\n return { type: 'String', value: name };\n }\n return { type: 'Empty', value: undefined };\n },\n hasProperty: (propName: string): boolean => {\n return propName.toLowerCase() === 'name';\n },\n call: (...args: VbValue[]): VbValue => {\n return funcRegistry.call(name, args);\n },\n },\n };\n });\n\n context.functionRegistry.register('TypeName', (expression: VbValue): VbValue => {\n if (expression.type === 'Object' && expression.value && typeof expression.value === 'object') {\n const obj = expression.value as { classInfo?: { name: string } };\n if (obj.classInfo && obj.classInfo.name) {\n return { type: 'String', value: obj.classInfo.name };\n }\n }\n const typeNames: Record<string, string> = {\n 'Empty': 'Empty',\n 'Null': 'Null',\n 'Integer': 'Integer',\n 'Long': 'Long',\n 'Single': 'Single',\n 'Double': 'Double',\n 'Currency': 'Currency',\n 'Date': 'Date',\n 'String': 'String',\n 'Object': 'Object',\n 'Error': 'Error',\n 'Boolean': 'Boolean',\n 'Variant': 'Variant',\n 'Byte': 'Byte',\n 'Array': 'Variant()',\n };\n return { type: 'String', value: typeNames[expression.type] ?? 'Variant' };\n });\n\n context.functionRegistry.register('VarType', (expression: VbValue): VbValue => {\n const typeMap: Record<string, number> = {\n 'Empty': 0,\n 'Null': 1,\n 'Integer': 2,\n 'Long': 3,\n 'Single': 4,\n 'Double': 5,\n 'Currency': 6,\n 'Date': 7,\n 'String': 8,\n 'Object': 9,\n 'Error': 10,\n 'Boolean': 11,\n 'Variant': 12,\n 'Byte': 17,\n 'Array': 8192,\n };\n return { type: 'Integer', value: typeMap[expression.type] ?? 12 };\n });\n\n context.functionRegistry.register('IsEmpty', (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Empty' };\n });\n\n context.functionRegistry.register('IsNull', (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Null' };\n });\n\n context.functionRegistry.register('IsNumeric', (expression: VbValue): VbValue => {\n const numericTypes = ['Integer', 'Long', 'Single', 'Double', 'Currency', 'Byte'];\n if (numericTypes.includes(expression.type)) {\n return { type: 'Boolean', value: true };\n }\n if (expression.type === 'String') {\n const num = Number(expression.value);\n return { type: 'Boolean', value: !isNaN(num) };\n }\n return { type: 'Boolean', value: false };\n });\n\n context.functionRegistry.register('IsDate', (expression: VbValue): VbValue => {\n if (expression.type === 'Date') {\n return { type: 'Boolean', value: true };\n }\n if (expression.type === 'String') {\n const d = new Date(expression.value as string);\n return { type: 'Boolean', value: !isNaN(d.getTime()) };\n }\n return { type: 'Boolean', value: false };\n });\n\n context.functionRegistry.register('IsObject', (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Object' };\n });\n\n context.functionRegistry.register('IsArray', (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Array' };\n });\n\n context.functionRegistry.register('Erase', (_arrayname: VbValue): VbValue => {\n return { type: 'Empty', value: undefined };\n }, { isSub: true });\n\n context.functionRegistry.register('GetObject', (_pathname?: VbValue, _cls?: VbValue): VbValue => {\n return { type: 'Object', value: null };\n });\n\n context.functionRegistry.register('CreateObject', (cls: VbValue, _servername?: VbValue): VbValue => {\n const className = String(cls.value ?? cls);\n return { type: 'Object', value: { className, properties: new Map() } };\n });\n\n context.functionRegistry.register('LoadPicture', (picturename: VbValue): VbValue => {\n const path = String(picturename.value ?? picturename);\n const imageObj = {\n classInfo: { name: 'IPictureDisp' },\n getProperty: (name: string): VbValue => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'handle') {\n return { type: 'Long', value: 0 };\n }\n if (lowerName === 'width') {\n return { type: 'Long', value: 0 };\n }\n if (lowerName === 'height') {\n return { type: 'Long', value: 0 };\n }\n if (lowerName === 'type') {\n return { type: 'Long', value: 1 };\n }\n return { type: 'Empty', value: undefined };\n },\n hasProperty: (name: string): boolean => {\n const lowerName = name.toLowerCase();\n return ['handle', 'width', 'height', 'type'].includes(lowerName);\n },\n _path: path,\n };\n return { type: 'Object', value: imageObj };\n });\n\n context.functionRegistry.register('RGB', (red: VbValue, green: VbValue, blue: VbValue): VbValue => {\n const r = Math.max(0, Math.min(255, Math.floor(Number(red.value ?? 0))));\n const g = Math.max(0, Math.min(255, Math.floor(Number(green.value ?? 0))));\n const b = Math.max(0, Math.min(255, Math.floor(Number(blue.value ?? 0))));\n const rgbValue = r + (g * 256) + (b * 65536);\n return { type: 'Long', value: rgbValue };\n });\n\n context.functionRegistry.register('QBColor', (color: VbValue): VbValue => {\n const colorIndex = Math.floor(Number(color.value ?? 0));\n const colors = [\n 0x000000, 0x800000, 0x008000, 0x808000,\n 0x000080, 0x800080, 0x008080, 0xC0C0C0,\n 0x808080, 0xFF0000, 0x00FF00, 0xFFFF00,\n 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF\n ];\n const rgbValue = colors[colorIndex] ?? 0;\n return { type: 'Long', value: rgbValue };\n });\n\n const errObject = {\n getProperty: (name: string): VbValue => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'number') {\n return { type: 'Long', value: context.err.number };\n }\n if (lowerName === 'description') {\n return { type: 'String', value: context.err.description };\n }\n if (lowerName === 'source') {\n return { type: 'String', value: context.err.source };\n }\n return { type: 'Empty', value: undefined };\n },\n setProperty: (name: string, value: VbValue): void => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'number') {\n context.err.number = Number(value.value) || 0;\n } else if (lowerName === 'description') {\n context.err.description = String(value.value ?? '');\n } else if (lowerName === 'source') {\n context.err.source = String(value.value ?? '');\n }\n },\n hasMethod: (name: string): boolean => {\n return name.toLowerCase() === 'clear' || name.toLowerCase() === 'raise';\n },\n getMethod: (name: string): { func: (...args: VbValue[]) => VbValue } => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'clear') {\n return {\n func: (): VbValue => {\n context.clearError();\n return { type: 'Empty', value: undefined };\n }\n };\n }\n if (lowerName === 'raise') {\n return {\n func: (number: VbValue, source?: VbValue, description?: VbValue): VbValue => {\n context.err.number = Number(number.value) || 0;\n context.err.source = source ? String(source.value ?? '') : '';\n context.err.description = description ? String(description.value ?? '') : '';\n return { type: 'Empty', value: undefined };\n }\n };\n }\n throw new Error(`Unknown Err method: ${name}`);\n }\n };\n \n context.globalScope.declare('Err', { type: 'Object', value: errObject });\n}\n\nexport { stringFunctions } from './string.ts';\nexport { mathFunctions, constants } from './math.ts';\nexport { dateFunctions } from './date.ts';\nexport { conversionFunctions, inspectionFunctions } from './conversion.ts';\nexport { arrayFunctions } from './array.ts';\n","import type { Program, Statement, VbLabelStatement } from '../ast/index.ts';\nimport type { VbValue } from '../runtime/index.ts';\nimport { VbContext, VbEmpty } from '../runtime/index.ts';\nimport { StatementExecutor, GotoSignal, ControlFlowSignal } from './statement-executor.ts';\nimport { ExpressionEvaluator } from './expression-evaluator.ts';\nimport { registerBuiltins } from '../builtins/index.ts';\nimport { parse } from '../parser/index.ts';\n\ninterface LabelInfo {\n index: number;\n statement: VbLabelStatement;\n}\n\nexport class Interpreter {\n private context: VbContext;\n private executor: StatementExecutor;\n private maxExecutionTime: number = -1;\n private startTime: number = 0;\n\n constructor() {\n this.context = new VbContext();\n this.executor = new StatementExecutor(this.context);\n registerBuiltins(this.context);\n }\n\n setMaxExecutionTime(ms: number): void {\n this.maxExecutionTime = ms;\n }\n\n checkTimeout(): void {\n if (this.maxExecutionTime > 0) {\n const elapsed = Date.now() - this.startTime;\n if (elapsed > this.maxExecutionTime) {\n throw new Error(`Script execution timed out after ${this.maxExecutionTime}ms`);\n }\n }\n }\n\n private collectLabels(statements: Statement[]): Map<string, LabelInfo> {\n const labels = new Map<string, LabelInfo>();\n for (let i = 0; i < statements.length; i++) {\n const stmt = statements[i]!;\n if (stmt.type === 'VbLabelStatement') {\n const labelStmt = stmt as VbLabelStatement;\n labels.set(labelStmt.label.name.toLowerCase(), { index: i, statement: labelStmt });\n }\n }\n return labels;\n }\n\n run(program: Program): VbValue {\n this.startTime = Date.now();\n let result: VbValue = VbEmpty;\n const statements = program.body;\n const labels = this.collectLabels(statements);\n let i = 0;\n const maxIterations = statements.length * 10000;\n let iterations = 0;\n\n while (i < statements.length) {\n if (iterations++ > maxIterations) {\n throw new Error('Possible infinite loop detected (too many goto jumps)');\n }\n \n this.checkTimeout();\n const stmt = statements[i]!;\n \n try {\n result = this.executor.execute(stmt);\n i++;\n } catch (error) {\n if (error instanceof GotoSignal) {\n const labelInfo = labels.get(error.labelName);\n if (labelInfo) {\n i = labelInfo.index + 1;\n continue;\n }\n throw new Error(`Label not found: ${error.labelName}`);\n }\n if (error instanceof ControlFlowSignal) {\n throw error;\n }\n throw error;\n }\n }\n\n return result;\n }\n\n getVariable(name: string): VbValue {\n return this.context.getVariable(name);\n }\n\n setVariable(name: string, value: VbValue): void {\n this.context.setVariable(name, value);\n }\n\n registerFunction(name: string, func: (...args: VbValue[]) => VbValue): void {\n this.context.functionRegistry.register(name, func);\n }\n\n evaluate(code: string): VbValue {\n try {\n const ast = parse(code);\n const evaluator = new ExpressionEvaluator(this.context);\n const result = evaluator.evaluateProgram(ast);\n return result;\n } catch (e) {\n console.error('Eval error:', e);\n return { type: 'Empty', value: undefined };\n }\n }\n\n getContext(): VbContext {\n return this.context;\n }\n\n executeStatements(statements: Statement[]): VbValue {\n const labels = this.collectLabels(statements);\n let result: VbValue = VbEmpty;\n let i = 0;\n const maxIterations = statements.length * 10000;\n let iterations = 0;\n\n while (i < statements.length) {\n if (iterations++ > maxIterations) {\n throw new Error('Possible infinite loop detected (too many goto jumps)');\n }\n \n this.checkTimeout();\n const stmt = statements[i]!;\n \n try {\n result = this.executor.execute(stmt);\n i++;\n } catch (error) {\n if (error instanceof GotoSignal) {\n const labelInfo = labels.get(error.labelName);\n if (labelInfo) {\n i = labelInfo.index + 1;\n continue;\n }\n throw new Error(`Label not found: ${error.labelName}`);\n }\n if (error instanceof ControlFlowSignal) {\n throw error;\n }\n throw error;\n }\n }\n\n return result;\n }\n\n executeInCurrentScope(code: string): VbValue {\n const ast = parse(code);\n return this.executeStatements(ast.body);\n }\n\n executeInGlobalScope(code: string): VbValue {\n const savedScope = this.context.currentScope;\n this.context.currentScope = this.context.globalScope;\n try {\n const ast = parse(code);\n return this.executeStatements(ast.body);\n } finally {\n this.context.currentScope = savedScope;\n }\n }\n}\n\nexport function interpret(program: Program): VbValue {\n const interpreter = new Interpreter();\n return interpreter.run(program);\n}\n","import type { VbValue } from '../runtime/index.ts';\n\n/**\n * Converts a VbValue to its JavaScript equivalent.\n *\n * @param value - The VbValue to convert\n * @returns The JavaScript value (undefined, null, boolean, number, string, Date, array, or object)\n *\n * @example\n * ```typescript\n * const vbString = { type: 'String', value: 'hello' };\n * const jsString = vbToJs(vbString); // 'hello'\n * ```\n */\nexport function vbToJs(value: VbValue): unknown {\n switch (value.type) {\n case 'Empty':\n return undefined;\n case 'Null':\n return null;\n case 'Boolean':\n case 'Long':\n case 'Double':\n case 'Integer':\n case 'String':\n case 'Date':\n return value.value;\n case 'Array': {\n const arr = value.value as { toArray(): VbValue[] };\n return arr.toArray().map(vbToJs);\n }\n case 'Object':\n return value.value;\n default:\n return value.value;\n }\n}\n\n/**\n * Converts a JavaScript value to a VbValue.\n * Automatically determines the appropriate VBScript type based on the input.\n *\n * @param value - The JavaScript value to convert\n * @param thisArg - Optional this context for function bindings\n * @returns A VbValue representation\n *\n * @example\n * ```typescript\n * const vbNum = jsToVb(42); // { type: 'Long', value: 42 }\n * const vbStr = jsToVb('hello'); // { type: 'String', value: 'hello' }\n * ```\n */\nexport function jsToVb(value: unknown, thisArg?: unknown): VbValue {\n if (value === undefined) return { type: 'Empty', value: undefined };\n if (value === null) return { type: 'Null', value: null };\n if (typeof value === 'boolean') return { type: 'Boolean', value };\n if (typeof value === 'number') {\n if (Number.isInteger(value) && value >= -2147483648 && value <= 2147483647) {\n return { type: 'Long', value };\n }\n return { type: 'Double', value };\n }\n if (typeof value === 'string') return { type: 'String', value };\n if (value instanceof Date) return { type: 'Date', value };\n if (Array.isArray(value)) {\n return { type: 'Array', value };\n }\n if (typeof value === 'function') {\n return { type: 'Object', value: { type: 'jsfunction', func: value as (...args: unknown[]) => unknown, thisArg: thisArg ?? null } };\n }\n if (typeof value === 'object') {\n return { type: 'Object', value };\n }\n return { type: 'String', value: String(value) };\n}\n","import type { VbsEngine } from '../core/index.ts';\nimport type { OriginalSetTimeout, OriginalSetInterval, TimerOverrideState } from './types.ts';\n\nexport function overrideTimers(engine: VbsEngine): TimerOverrideState {\n if (typeof window === 'undefined') {\n return { originalSetTimeout: null, originalSetInterval: null };\n }\n\n const originalSetTimeout = window.setTimeout;\n const originalSetInterval = window.setInterval;\n\n (window as unknown as Record<string, unknown>).setTimeout = function(\n handler: unknown,\n delay?: unknown,\n languageOrArg?: unknown,\n ...args: unknown[]\n ): number {\n if (typeof handler === 'string') {\n const language = typeof languageOrArg === 'string' ? languageOrArg.toLowerCase() : null;\n const actualDelay = typeof delay === 'number' ? delay : 0;\n\n if (language === 'vbscript' || language === 'vbs') {\n return originalSetTimeout.call(window, () => {\n const funcRegistry = engine._getContext()?.functionRegistry;\n if (funcRegistry?.has(handler)) {\n engine.run(handler);\n } else {\n engine.executeStatement(handler);\n }\n }, actualDelay);\n }\n\n return originalSetTimeout.call(window, () => {\n const funcRegistry = engine._getContext()?.functionRegistry;\n if (funcRegistry?.has(handler)) {\n engine.run(handler);\n } else {\n engine.executeStatement(handler);\n }\n }, actualDelay);\n }\n\n return originalSetTimeout.call(window, handler as TimerHandler, delay as number | undefined, ...[languageOrArg, ...args].filter(a => a !== undefined));\n };\n\n (window as unknown as Record<string, unknown>).setInterval = function(\n handler: unknown,\n delay?: unknown,\n languageOrArg?: unknown,\n ...args: unknown[]\n ): number {\n if (typeof handler === 'string') {\n const language = typeof languageOrArg === 'string' ? languageOrArg.toLowerCase() : null;\n const actualDelay = typeof delay === 'number' ? delay : 0;\n\n if (language === 'vbscript' || language === 'vbs') {\n return originalSetInterval.call(window, () => {\n const funcRegistry = engine._getContext()?.functionRegistry;\n if (funcRegistry?.has(handler)) {\n engine.run(handler);\n } else {\n engine.executeStatement(handler);\n }\n }, actualDelay);\n }\n\n return originalSetInterval.call(window, () => {\n const funcRegistry = engine._getContext()?.functionRegistry;\n if (funcRegistry?.has(handler)) {\n engine.run(handler);\n } else {\n engine.executeStatement(handler);\n }\n }, actualDelay);\n }\n\n return originalSetInterval.call(window, handler as TimerHandler, delay as number | undefined, ...[languageOrArg, ...args].filter(a => a !== undefined));\n };\n\n return { originalSetTimeout, originalSetInterval };\n}\n\nexport function restoreTimers(state: TimerOverrideState): void {\n if (typeof window === 'undefined') return;\n\n if (state.originalSetTimeout) {\n (window as unknown as Record<string, unknown>).setTimeout = state.originalSetTimeout;\n }\n if (state.originalSetInterval) {\n (window as unknown as Record<string, unknown>).setInterval = state.originalSetInterval;\n }\n}\n","import type { VbsEngine } from '../core/index.ts';\nimport type { OriginalEval, EvalOverrideState } from './types.ts';\n\nexport function overrideEval(engine: VbsEngine): EvalOverrideState {\n if (typeof window === 'undefined') {\n return { originalEval: null };\n }\n\n const originalEval = window.eval;\n\n (window as unknown as Record<string, unknown>).vbsEval = function(code: unknown): unknown {\n return engine.eval(String(code));\n };\n\n (window as unknown as Record<string, unknown>).eval = function(code: unknown, language?: unknown): unknown {\n if (typeof language === 'string') {\n const lang = language.toLowerCase();\n if (lang === 'vbscript' || lang === 'vbs') {\n return engine.eval(String(code));\n }\n }\n return originalEval.call(window, String(code));\n };\n\n return { originalEval };\n}\n\nexport function restoreEval(state: EvalOverrideState): void {\n if (typeof window === 'undefined') return;\n\n if (state.originalEval) {\n (window as unknown as Record<string, unknown>).eval = state.originalEval;\n }\n delete (window as unknown as Record<string, unknown>).vbsEval;\n}\n","import type { VbsEngine } from '../core/index.ts';\n\nexport interface ProtocolHandlerResult {\n navigateHandler: ((event: Event) => void) | null;\n clickHandler: ((event: MouseEvent) => void) | null;\n}\n\nexport function setupVbscriptProtocol(engine: VbsEngine): ProtocolHandlerResult {\n if (typeof window === 'undefined') {\n return { navigateHandler: null, clickHandler: null };\n }\n\n let navigateHandler: ((event: Event) => void) | null = null;\n let clickHandler: ((event: MouseEvent) => void) | null = null;\n\n if ('navigation' in window && window.navigation) {\n navigateHandler = (event: Event): void => {\n const navEvent = event as { destination?: { url?: string } };\n const url = navEvent.destination?.url;\n if (url && url.toLowerCase().startsWith('vbscript:')) {\n event.preventDefault();\n const code = url.substring(9);\n try {\n engine.executeStatement(code);\n } catch (error) {\n console.error('VBScript protocol error:', error);\n }\n }\n };\n\n (window.navigation as EventTarget).addEventListener('navigate', navigateHandler);\n } else {\n clickHandler = (event: MouseEvent): void => {\n const target = event.target as HTMLElement;\n\n if (target.tagName === 'A' || target.tagName === 'AREA') {\n const href = target.getAttribute('href');\n if (href && href.toLowerCase().startsWith('vbscript:')) {\n event.preventDefault();\n const code = href.substring(9);\n try {\n engine.executeStatement(code);\n } catch (error) {\n console.error('VBScript protocol error:', error);\n }\n }\n }\n };\n\n document.addEventListener('click', clickHandler, true);\n }\n\n return { navigateHandler, clickHandler };\n}\n\nexport function cleanupVbscriptProtocol(result: ProtocolHandlerResult): void {\n if (typeof window === 'undefined') return;\n\n if (result.navigateHandler && 'navigation' in window && window.navigation) {\n (window.navigation as EventTarget).removeEventListener('navigate', result.navigateHandler);\n }\n\n if (result.clickHandler) {\n document.removeEventListener('click', result.clickHandler, true);\n }\n}\n","import type { VbValue } from '../runtime/index.ts';\n\nexport function createObject(cls: VbValue, _servername?: VbValue): VbValue {\n const className = String(cls.value ?? cls);\n\n const axConstructor = (window as unknown as { ActiveXObject?: new (cls: string) => unknown }).ActiveXObject;\n if (axConstructor) {\n try {\n const ax = new axConstructor(className);\n return { type: 'Object', value: {\n type: 'activex',\n object: ax,\n className\n }};\n } catch (e) {\n throw new Error(`ActiveX component can't create object: '${className}'`);\n }\n }\n\n throw new Error(`ActiveXObject is not supported in this browser environment. Cannot create: '${className}'`);\n}\n\nexport function getObject(pathname?: VbValue, cls?: VbValue): VbValue {\n const axConstructor = (window as unknown as { ActiveXObject?: new (cls: string) => unknown }).ActiveXObject;\n if (axConstructor) {\n const path = pathname ? String(pathname.value ?? pathname) : '';\n const className = cls ? String(cls.value ?? cls) : '';\n\n try {\n if (path) {\n const ax = new axConstructor(className || 'Scripting.FileSystemObject');\n return { type: 'Object', value: {\n type: 'activex',\n object: ax,\n className\n }};\n }\n } catch (e) {\n throw new Error(`ActiveX component can't create object: '${className || path}'`);\n }\n }\n\n const className = cls ? String(cls.value ?? cls) : '';\n throw new Error(`ActiveXObject is not supported in this browser environment. Cannot get: '${className}'`);\n}\n","import type { VbsEngine } from '../core/index.ts';\n\nexport function isVbscriptElement(element: Element): boolean {\n const language = element.getAttribute('language');\n const type = element.getAttribute('type');\n\n if (language?.toLowerCase() === 'vbscript') return true;\n if (type?.toLowerCase() === 'text/vbscript') return true;\n if (type?.toLowerCase() === 'application/x-vbscript') return true;\n\n return false;\n}\n\nexport function parseScriptElement(\n engine: VbsEngine,\n script: Element,\n onScriptRun?: () => void\n): void {\n if (!isVbscriptElement(script)) return;\n\n const code = script.textContent ?? '';\n const forAttr = script.getAttribute('for');\n const eventAttr = script.getAttribute('event');\n\n if (forAttr && eventAttr) {\n setupForEventScript(engine, forAttr, eventAttr, code);\n } else {\n try {\n engine.addCode(code);\n onScriptRun?.();\n } catch (error) {\n console.error('Vbscript error:', error);\n }\n }\n}\n\nexport function setupForEventScript(\n engine: VbsEngine,\n targetId: string,\n eventName: string,\n code: string\n): void {\n const eventType = eventName.toLowerCase().replace(/^on/, '');\n\n const bindHandler = (): boolean => {\n const target = document.getElementById(targetId);\n if (target) {\n const handler = (): void => {\n try {\n engine.addCode(code);\n } catch (error) {\n console.error('VBScript event handler error:', error);\n }\n };\n target.addEventListener(eventType, handler);\n return true;\n }\n return false;\n };\n\n if (!bindHandler()) {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n bindHandler();\n });\n } else {\n setTimeout(bindHandler, 0);\n }\n }\n}\n\nexport function autoRunScripts(engine: VbsEngine, onScriptRun?: () => void): void {\n if (typeof document === 'undefined') return;\n\n const scripts = document.querySelectorAll('script');\n scripts.forEach(script => {\n parseScriptElement(engine, script, onScriptRun);\n });\n}\n","import type { VbsEngine } from '../core/index.ts';\n\nexport interface BoundNamedHandler {\n target: EventTarget;\n handler: EventListener;\n}\n\nexport function setupElementInlineEvents(engine: VbsEngine, element: Element): void {\n const attrs = element.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const attr = attrs[i];\n if (!attr) continue;\n const attrName = attr.name.toLowerCase();\n\n if (attrName.startsWith('on') && attrName.length > 2) {\n const value = attr.value.trim();\n if (value.toLowerCase().startsWith('vbscript:')) {\n const code = value.substring(9).trim();\n\n (element as unknown as Record<string, unknown>)[attrName] = (): void => {\n try {\n engine.executeStatement(code);\n } catch (error) {\n console.error('VBScript event handler error:', error);\n }\n };\n }\n }\n }\n}\n\nexport function setupInlineEventHandlers(engine: VbsEngine): void {\n if (typeof document === 'undefined') return;\n\n const allElements = document.querySelectorAll('*');\n allElements.forEach(element => {\n setupElementInlineEvents(engine, element);\n });\n}\n\nexport function resolveEventTarget(objectName: string): EventTarget | null {\n if (objectName in globalThis) {\n const obj = (globalThis as Record<string, unknown>)[objectName];\n if (obj && typeof (obj as EventTarget).addEventListener === 'function') {\n return obj as EventTarget;\n }\n }\n\n const lowerName = objectName.toLowerCase();\n for (const key of Object.keys(globalThis)) {\n if (key.toLowerCase() === lowerName) {\n const obj = (globalThis as Record<string, unknown>)[key];\n if (obj && typeof (obj as EventTarget).addEventListener === 'function') {\n return obj as EventTarget;\n }\n }\n }\n\n if (typeof document !== 'undefined') {\n const element = document.getElementById(objectName);\n if (element) return element;\n\n const allElements = document.querySelectorAll('[id]');\n for (let i = 0; i < allElements.length; i++) {\n const el = allElements[i];\n if (el && el.id.toLowerCase() === lowerName) {\n return el;\n }\n }\n }\n\n return null;\n}\n\nexport function setupNamedEventHandlers(\n engine: VbsEngine,\n boundNamedHandlers: Map<string, BoundNamedHandler>\n): void {\n if (typeof window === 'undefined') return;\n\n const funcRegistry = engine._getContext()?.functionRegistry;\n if (!funcRegistry) return;\n\n const userFuncs = funcRegistry.getUserDefinedFunctions?.();\n if (!userFuncs) return;\n\n for (const [funcName] of userFuncs) {\n const onIndex = funcName.toLowerCase().indexOf('_on');\n if (onIndex > 0) {\n const objectName = funcName.substring(0, onIndex);\n const eventName = funcName.substring(onIndex + 3);\n\n const target = resolveEventTarget(objectName);\n\n if (target) {\n const eventType = eventName.toLowerCase();\n\n if (boundNamedHandlers.has(funcName)) {\n const existing = boundNamedHandlers.get(funcName)!;\n existing.target.removeEventListener(eventType, existing.handler);\n }\n\n const handler = (): void => {\n try {\n engine._getContext()?.functionRegistry.call(funcName, []);\n } catch (error) {\n console.error(`VBScript ${funcName} error:`, error);\n }\n };\n\n target.addEventListener(eventType, handler);\n boundNamedHandlers.set(funcName, { target, handler });\n }\n }\n }\n}\n\nexport function cleanupNamedEventHandlers(boundNamedHandlers: Map<string, BoundNamedHandler>): void {\n boundNamedHandlers.forEach(({ target, handler }, funcName) => {\n const onIndex = funcName.toLowerCase().indexOf('_on');\n if (onIndex > 0) {\n const eventName = funcName.substring(onIndex + 3).toLowerCase();\n target.removeEventListener(eventName, handler);\n }\n });\n boundNamedHandlers.clear();\n}\n","import type { VbsEngine } from '../core/index.ts';\nimport { isVbscriptElement, setupForEventScript } from './script-parser.ts';\nimport { setupElementInlineEvents, setupNamedEventHandlers } from './event-handlers.ts';\nimport type { BrowserRuntimeOptions } from './types.ts';\nimport type { BoundNamedHandler } from './event-handlers.ts';\n\nexport interface ObserverContext {\n observer: MutationObserver;\n}\n\nexport function startObserver(\n engine: VbsEngine,\n options: Required<BrowserRuntimeOptions>,\n boundNamedHandlers: Map<string, BoundNamedHandler>\n): ObserverContext {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n\n if (options.parseScriptElement && element.tagName.toLowerCase() === 'script' && isVbscriptElement(element)) {\n const code = element.textContent ?? '';\n const forAttr = element.getAttribute('for');\n const eventAttr = element.getAttribute('event');\n\n if (forAttr && eventAttr) {\n setupForEventScript(engine, forAttr, eventAttr, code);\n } else {\n try {\n engine.addCode(code);\n if (options.injectGlobalThis && options.parseEventSubNames) {\n setupNamedEventHandlers(engine, boundNamedHandlers);\n }\n } catch (error) {\n console.error('Vbscript error:', error);\n }\n }\n }\n\n if (options.parseInlineEventAttributes) {\n setupElementInlineEvents(engine, element);\n }\n\n if (options.parseScriptElement) {\n const scripts = element.querySelectorAll('script');\n scripts.forEach(script => {\n if (isVbscriptElement(script)) {\n const code = script.textContent ?? '';\n const forAttr = script.getAttribute('for');\n const eventAttr = script.getAttribute('event');\n\n if (forAttr && eventAttr) {\n setupForEventScript(engine, forAttr, eventAttr, code);\n } else {\n try {\n engine.addCode(code);\n if (options.injectGlobalThis && options.parseEventSubNames) {\n setupNamedEventHandlers(engine, boundNamedHandlers);\n }\n } catch (error) {\n console.error('Vbscript error:', error);\n }\n }\n }\n });\n }\n\n if (options.parseInlineEventAttributes) {\n const childElements = element.querySelectorAll('*');\n childElements.forEach(child => {\n setupElementInlineEvents(engine, child);\n });\n }\n }\n });\n });\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n\n return { observer };\n}\n\nexport function stopObserver(context: ObserverContext): void {\n context.observer.disconnect();\n}\n","import type { VbsEngine, VbsEngineOptions } from '../core/index.ts';\nimport { createBrowserMsgBox } from '../builtins/msgbox.ts';\nimport { createBrowserInputBox } from '../builtins/inputbox.ts';\nimport type { TimerOverrideState, EvalOverrideState } from './types.ts';\nimport type { ProtocolHandlerResult } from './protocol-handler.ts';\nimport { overrideTimers, restoreTimers } from './timer-override.ts';\nimport { overrideEval, restoreEval } from './eval-override.ts';\nimport { setupVbscriptProtocol, cleanupVbscriptProtocol } from './protocol-handler.ts';\nimport { createObject, getObject } from './activex.ts';\nimport { autoRunScripts } from './script-parser.ts';\nimport { setupInlineEventHandlers, setupNamedEventHandlers, cleanupNamedEventHandlers, type BoundNamedHandler } from './event-handlers.ts';\nimport { startObserver, stopObserver, type ObserverContext } from './dom-observer.ts';\n\n/**\n * Initializes the browser mode for a VbsEngine instance.\n * This function sets up all browser-specific features.\n *\n * @param engine - The VbsEngine instance to initialize\n * @param options - Browser-specific options\n * @returns A cleanup function to restore original browser state\n */\nexport function initializeBrowserEngine(\n engine: VbsEngine,\n options: Required<VbsEngineOptions>\n): () => void {\n const timerState: TimerOverrideState = { originalSetTimeout: null, originalSetInterval: null };\n const evalState: EvalOverrideState = { originalEval: null };\n let protocolState: ProtocolHandlerResult = { navigateHandler: null, clickHandler: null };\n let observerContext: ObserverContext | null = null;\n const boundNamedHandlers: Map<string, BoundNamedHandler> = new Map();\n\n // Register browser-specific functions\n engine._registerFunction('MsgBox', createBrowserMsgBox());\n engine._registerFunction('InputBox', createBrowserInputBox());\n engine._registerFunction('CreateObject', createObject);\n engine._registerFunction('GetObject', getObject);\n\n // Override JS functions if requested\n if (options.overrideJsEvalFunctions) {\n timerState.originalSetTimeout = overrideTimers(engine).originalSetTimeout;\n timerState.originalSetInterval = overrideTimers(engine).originalSetInterval;\n evalState.originalEval = overrideEval(engine).originalEval;\n }\n\n // Setup vbscript: protocol handler\n if (options.parseVbsProtocol) {\n protocolState = setupVbscriptProtocol(engine);\n }\n\n // Parse and execute script elements\n if (options.parseScriptElement) {\n autoRunScripts(engine);\n }\n\n // Setup inline event handlers\n if (options.parseInlineEventAttributes) {\n setupInlineEventHandlers(engine);\n }\n\n // Setup named event handlers (Button1_OnClick style)\n if (options.injectGlobalThis && options.parseEventSubNames) {\n setupNamedEventHandlers(engine, boundNamedHandlers);\n }\n\n // Start DOM observer for dynamic content\n if (options.parseScriptElement || options.parseInlineEventAttributes) {\n observerContext = startObserver(engine, options, boundNamedHandlers);\n }\n\n // Handle DOMContentLoaded for late initialization\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n if (options.injectGlobalThis && options.parseEventSubNames) {\n setupNamedEventHandlers(engine, boundNamedHandlers);\n }\n });\n }\n\n // Return cleanup function\n return () => {\n if (observerContext) {\n stopObserver(observerContext);\n }\n cleanupNamedEventHandlers(boundNamedHandlers);\n if (protocolState.navigateHandler || protocolState.clickHandler) {\n cleanupVbscriptProtocol(protocolState);\n }\n if (options.overrideJsEvalFunctions) {\n restoreTimers(timerState);\n restoreEval(evalState);\n }\n };\n}\n","import { Lexer } from '../lexer/index.ts';\nimport { Parser, globalParserCache } from '../parser/index.ts';\nimport { Interpreter } from '../interpreter/index.ts';\nimport type { VbValue } from '../runtime/index.ts';\nimport { jsToVb, vbToJs } from './conversion.ts';\nimport { initializeBrowserEngine } from '../browser/index.ts';\n\nexport { jsToVb, vbToJs } from './conversion.ts';\n\nfunction vbToJsAuto(value: VbValue): unknown {\n switch (value.type) {\n case 'Empty':\n return undefined;\n case 'Null':\n return null;\n case 'Boolean':\n case 'Long':\n case 'Double':\n case 'Integer':\n case 'String':\n case 'Date':\n return value.value;\n case 'Array': {\n const arr = value.value as { toArray(): VbValue[] };\n return arr.toArray().map(vbToJsAuto);\n }\n case 'Object':\n return value.value;\n default:\n return value.value;\n }\n}\n\n/**\n * The mode of operation for the VbsEngine.\n * - 'general': Standard mode for Node.js or custom environments\n * - 'browser': Browser mode with automatic DOM integration, event handling, etc.\n */\nexport type VbsEngineMode = 'general' | 'browser';\n\n/**\n * Browser-specific options for VbsEngine.\n */\nexport interface BrowserEngineOptions {\n /**\n * Automatically parse and execute `<script type=\"text/vbscript\">` elements.\n * @default true\n */\n parseScriptElement?: boolean;\n /**\n * Automatically parse inline event attributes like `onclick=\"vbscript:...\"`.\n * @default true\n */\n parseInlineEventAttributes?: boolean;\n /**\n * Automatically bind event handlers from Sub names like `Button1_OnClick`.\n * Requires `injectGlobalThis` to be true.\n * @default true\n */\n parseEventSubNames?: boolean;\n /**\n * Override JavaScript's eval, setTimeout, and setInterval to support VBScript code.\n * @default true\n */\n overrideJsEvalFunctions?: boolean;\n /**\n * Enable the `vbscript:` protocol handler for links and forms.\n * @default true\n */\n parseVbsProtocol?: boolean;\n}\n\n/**\n * Error information from script execution.\n */\nexport interface VbsError {\n /** Error number/code */\n number: number;\n /** Error description */\n description: string;\n /** Source line number where error occurred */\n line?: number;\n /** Source column where error occurred */\n column?: number;\n /** Source text where error occurred */\n text?: string;\n}\n\n/**\n * Configuration options for the VbsEngine.\n */\nexport interface VbsEngineOptions extends BrowserEngineOptions {\n /**\n * Maximum execution time in milliseconds.\n * Set to -1 for unlimited execution time (default).\n * Useful to prevent infinite loops from hanging the application.\n */\n maxExecutionTime?: number;\n /**\n * When true (default), JavaScript globals from globalThis are automatically\n * shared with VBScript, and VBScript functions/variables are injected\n * into globalThis for bidirectional interoperability.\n * @default true\n */\n injectGlobalThis?: boolean;\n /**\n * The mode of operation for the engine.\n * - 'general': Standard mode for Node.js or custom environments (default)\n * - 'browser': Browser mode with automatic DOM integration\n * @default 'general'\n */\n mode?: VbsEngineMode;\n}\n\n/**\n * A VBScript engine that can parse and execute VBScript code.\n *\n * This API is designed to be compatible with MSScriptControl.ScriptControl:\n * - `addCode(code)` - Add script code (functions, classes)\n * - `executeStatement(statement)` - Execute a single statement\n * - `run(procedureName, ...args)` - Call a script function\n * - `addObject(name, object, addMembers?)` - Expose a JS object to script\n * - `eval(expression)` - Evaluate an expression\n *\n * @example\n * ```typescript\n * // Basic usage\n * const engine = new VbsEngine();\n *\n * // Add code (function definitions)\n * engine.addCode(`\n * Function Add(a, b)\n * Add = a + b\n * End Function\n * `);\n *\n * // Call the function\n * const result = engine.run('Add', 5, 3); // 8\n *\n * // Execute a statement\n * engine.executeStatement('MsgBox \"Hello\"');\n *\n * // Evaluate an expression\n * const value = engine.eval('2 + 3 * 4'); // 14\n *\n * // Expose an object to script\n * engine.addObject('console', console, true);\n * engine.executeStatement('console.log \"Hello from VBScript\"');\n * ```\n */\nexport class VbsEngine {\n private interpreter: Interpreter;\n private options: Required<VbsEngineOptions>;\n private browserCleanup: (() => void) | null = null;\n private lastError: VbsError | null = null;\n\n constructor(options: VbsEngineOptions = {}) {\n this.options = {\n maxExecutionTime: options.maxExecutionTime ?? -1,\n injectGlobalThis: options.injectGlobalThis ?? true,\n mode: options.mode ?? 'general',\n parseScriptElement: options.parseScriptElement ?? true,\n parseInlineEventAttributes: options.parseInlineEventAttributes ?? true,\n parseEventSubNames: options.parseEventSubNames ?? true,\n overrideJsEvalFunctions: options.overrideJsEvalFunctions ?? true,\n parseVbsProtocol: options.parseVbsProtocol ?? true,\n };\n\n this.interpreter = new Interpreter();\n this.interpreter.getContext().evaluate = (code: string) => this.interpreter.evaluate(code);\n this.interpreter.getContext().execute = (code: string) => this.interpreter.executeInCurrentScope(code);\n this.interpreter.getContext().executeGlobal = (code: string) => this.interpreter.executeInGlobalScope(code);\n\n if (this.options.maxExecutionTime > 0) {\n this.setMaxExecutionTime(this.options.maxExecutionTime);\n }\n\n if (this.options.mode === 'browser' && typeof window !== 'undefined') {\n this.initializeBrowserMode();\n }\n }\n\n private initializeBrowserMode(): void {\n this.browserCleanup = initializeBrowserEngine(this, this.options);\n }\n\n private setMaxExecutionTime(ms: number): void {\n this.interpreter.setMaxExecutionTime(ms);\n this.interpreter.getContext().checkTimeout = () => this.interpreter.checkTimeout();\n }\n\n /**\n * Gets the last error that occurred during script execution.\n * Returns null if no error occurred.\n */\n get error(): VbsError | null {\n return this.lastError;\n }\n\n /**\n * Clears the last error.\n */\n clearError(): void {\n this.lastError = null;\n }\n\n /**\n * Adds script code to the engine.\n * Use this to define functions, classes, or variables that can be used later.\n *\n * @param code - The VBScript code to add (function/class definitions)\n *\n * @example\n * ```typescript\n * engine.addCode(`\n * Function Multiply(a, b)\n * Multiply = a * b\n * End Function\n *\n * Class Calculator\n * Public Function Add(x, y)\n * Add = x + y\n * End Function\n * End Class\n * `);\n * ```\n */\n addCode(code: string): void {\n this.clearError();\n try {\n // Try to get from cache first\n let program = globalParserCache.get(code);\n \n if (!program) {\n // Parse and cache\n const lexer = new Lexer(code);\n const tokens = lexer.tokenize();\n const parser = new Parser(tokens);\n program = parser.parse();\n globalParserCache.set(code, program);\n }\n \n this.interpreter.run(program);\n this.syncFunctionsToGlobalThis();\n } catch (err) {\n this.handleError(err);\n }\n }\n\n /**\n * Executes a single VBScript statement.\n *\n * @param statement - The statement to execute\n *\n * @example\n * ```typescript\n * engine.executeStatement('x = 10');\n * engine.executeStatement('MsgBox \"Hello World\"');\n * ```\n */\n executeStatement(statement: string): void {\n this.clearError();\n try {\n // Try to get from cache first\n let program = globalParserCache.get(statement);\n \n if (!program) {\n // Parse and cache\n const lexer = new Lexer(statement);\n const tokens = lexer.tokenize();\n const parser = new Parser(tokens);\n program = parser.parse();\n globalParserCache.set(statement, program);\n }\n \n this.interpreter.run(program);\n } catch (err) {\n this.handleError(err);\n }\n }\n\n /**\n * Calls a function defined in the script and returns the result.\n *\n * @param procedureName - The name of the function or sub to call\n * @param args - Arguments to pass to the function\n * @returns The return value of the function (undefined for Subs)\n *\n * @example\n * ```typescript\n * engine.addCode('Function Add(a, b): Add = a + b: End Function');\n * const result = engine.run('Add', 5, 3); // 8\n * ```\n */\n run(procedureName: string, ...args: unknown[]): unknown {\n this.clearError();\n try {\n const context = this.interpreter.getContext();\n const funcRegistry = context.functionRegistry;\n \n const vbArgs = args.map(arg => jsToVb(arg));\n const result = funcRegistry.call(procedureName, vbArgs);\n \n return vbToJs(result);\n } catch (err) {\n this.handleError(err);\n return undefined;\n }\n }\n\n /**\n * Exposes a JavaScript object to the VBScript context.\n * The object can then be accessed by name in VBScript code.\n *\n * @param name - The name by which the object will be known in VBScript\n * @param object - The JavaScript object to expose\n * @param addMembers - If true, the object's methods/properties can be called directly\n *\n * @example\n * ```typescript\n * // Expose console to VBScript\n * engine.addObject('console', console, true);\n * engine.executeStatement('console.log \"Hello from VBScript\"');\n *\n * // Expose a custom object\n * const myApp = {\n * name: 'MyApp',\n * getVersion: () => '1.0.0',\n * doSomething: (x) => x * 2\n * };\n * engine.addObject('MyApp', myApp, true);\n * engine.executeStatement('result = MyApp.doSomething(5)'); // result = 10\n * ```\n */\n addObject(name: string, object: unknown, addMembers: boolean = true): void {\n this.clearError();\n try {\n const vbValue = jsToVb(object);\n this.interpreter.setVariable(name, vbValue);\n \n if (addMembers && typeof object === 'object' && object !== null) {\n const obj = object as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n const memberName = `${name}.${key}`;\n const member = obj[key];\n if (typeof member === 'function') {\n this.interpreter.registerFunction(memberName, (...args: VbValue[]) => {\n const jsArgs = args.map(vbToJs);\n const result = (member as (...args: unknown[]) => unknown)(...jsArgs);\n return jsToVb(result);\n });\n }\n }\n }\n } catch (err) {\n this.handleError(err);\n }\n }\n\n /**\n * Evaluates a VBScript expression and returns the result.\n *\n * @param expression - The expression to evaluate\n * @returns The result of the expression\n *\n * @example\n * ```typescript\n * const result = engine.eval('2 + 3 * 4'); // 14\n * const greeting = engine.eval('\"Hello\" & \" \" & \"World\"'); // \"Hello World\"\n * ```\n */\n eval(expression: string): unknown {\n this.clearError();\n try {\n const result = this.interpreter.evaluate(expression);\n return vbToJs(result);\n } catch (err) {\n this.handleError(err);\n return undefined;\n }\n }\n\n /**\n * Cleans up resources and restores any overridden browser functions.\n * Call this method when you no longer need the engine.\n */\n destroy(): void {\n if (this.browserCleanup) {\n this.browserCleanup();\n this.browserCleanup = null;\n }\n }\n\n /**\n * @internal Registers a built-in function. Used by browser module.\n */\n _registerFunction(name: string, func: (...args: VbValue[]) => VbValue): void {\n this.interpreter.registerFunction(name, func);\n }\n\n /**\n * @internal Gets the interpreter context. Used by browser module.\n */\n _getContext() {\n return this.interpreter.getContext();\n }\n\n /**\n * @internal Gets a variable value. Used for testing.\n */\n _getVariable(name: string): VbValue {\n return this.interpreter.getVariable(name);\n }\n\n private handleError(err: unknown): void {\n if (err instanceof Error) {\n this.lastError = {\n number: -1,\n description: err.message,\n };\n } else {\n this.lastError = {\n number: -1,\n description: String(err),\n };\n }\n }\n\n private syncFunctionsToGlobalThis(): void {\n if (typeof globalThis === 'undefined') return;\n if (!this.options.injectGlobalThis) return;\n\n const context = this.interpreter.getContext();\n if (!context) return;\n\n const funcRegistry = context.functionRegistry;\n if (!funcRegistry) return;\n\n const userFuncs = funcRegistry.getUserDefinedFunctions?.();\n if (!userFuncs) return;\n\n for (const [, info] of userFuncs) {\n const funcName = info.name;\n if (!(funcName in (globalThis as Record<string, unknown>))) {\n (globalThis as Record<string, unknown>)[funcName] = (...args: unknown[]) => {\n return this.run(funcName, ...args);\n };\n }\n }\n\n if (context.globalScope) {\n const allVars = context.globalScope.getAllVariables();\n for (const [varName, vbVar] of allVars) {\n if (vbVar.value && vbVar.value.type !== 'Empty') {\n if (!(varName in (globalThis as Record<string, unknown>))) {\n (globalThis as Record<string, unknown>)[varName] = vbToJs(vbVar.value);\n }\n }\n }\n }\n }\n}\n\n/**\n * A convenience function to quickly evaluate a VBScript expression.\n * Creates a new VbsEngine instance, evaluates the expression, and returns the result.\n *\n * @param expression - The VBScript expression to evaluate\n * @returns The result of the expression\n *\n * @example\n * ```typescript\n * const result = evalVbscript('2 + 3 * 4'); // 14\n * ```\n */\nexport function evalVbscript(expression: string): unknown {\n const engine = new VbsEngine();\n return engine.eval(expression);\n}\n"],"names":["TokenType","KEYWORDS","Lexer","source","options","char","type","value","start","raw","quote","isFloat","isExponent","num","currentChar","signChar","prefix","upperValue","keywordType","token","tokens","ParseError","message","expected","ParserState","pos","offset","types","tokenToPosition","tokenToEndPosition","createLocation","end","ExpressionParser","state","expr","property","index","rbracket","savedState","left","op","right","args","callExpr","operator","argument","rparen","dotToken","newToken","callee","id","DeclarationParser","exprParser","dimToken","visibilityToken","redimToken","preserve","eraseToken","constToken","declarations","decl","init","isArray","arrayBounds","typeAnnotation","bounds","typeToken","typeName","isVbClassElement","stmt","ProcedureParser","parseStatement","visibility","startToken","name","params","body","classToken","propVisibility","param","byRef","isOptional","isParamArray","defaultValue","endKeyword","ControlFlowParser","ifToken","test","hasNewlineAfterThen","consequent","alternate","forToken","doToken","testPosition","whileToken","selectToken","discriminant","cases","nestedIfDepth","savedPos","to","step","caseClause","caseToken","isElse","expressions","StatementsParser","withToken","object","exitToken","targetTypes","targetToken","target","optionToken","callToken","setToken","onToken","numToken","resumeToken","StatementParser","gotoToken","labelToken","Parser","lastToken","parse","_options","ParserCache","maxSize","defaultTTL","hash","i","key","entry","now","ast","oldestKey","oldestTime","totalAccessCount","removed","globalParserCache","VbEmpty","VbNull","VbNothing","createVbValue","toBoolean","str","toNumber","toString","isNumeric","isEmpty","isNull","VbVariable","isByRef","isConst","Vbscope","parent","variable","lowerName","all","v","k","VbFunctionRegistry","func","info","result","values","arg","VbClass","properties","methods","initializer","VbObjectInstance","classInfo","prototype","prop","accessor","isSet","obj","VbClassRegistry","cls","creator","instance","_args","initMethod","initProperty","VbArray","dimensions","lowerBounds","totalSize","a","b","indices","multiplier","lowerBound","dimension","idx","lower","dim","newData","minSize","createVbArray","createVbArrayFromValues","arr","VbError","number","description","error","VbErrorCodes","createVbError","code","jsToVb","thisArg","VbContext","scope","flag","globalKeys","commonStringCache","preCacheCommonStrings","strings","COMMON_VBSCRIPT_STRINGS","isVbMethodObject","isVbJsFunctionObject","ExpressionEvaluator","context","program","node","className","_node","withObject","propertyName","propValue","array","indexExpr","objValue","jsValue","calleeExpr","callArgs","p","argRefs","varName","val","method","memberResult","vbVal","leftNum","rightNum","oldValue","newValue","terminateProp","ControlFlowSignal","GotoSignal","labelName","StatementExecutor","vbError","boundValue","existingVar","arrayName","startValue","endValue","stepValue","shouldContinue","signal","currentValue","collection","items","count","countNum","item","checkCondition","testValue","isWhile","isPreTest","tests","t","leftStr","rightStr","subName","self","subFunc","funcName","argIndex","restArgs","argValue","initializeFunc","terminateFunc","member","memberNode","memberName","prevInstance","propName","existing","prevInPropertyGet","prevPropertyGetName","localeToLcid","lcidToLocale","lcid","locale","currentLocale","normalizeLocale","findLocaleKey","normalized","getBrowserLocale","browserLocale","exactKey","baseLocale","baseKey","getLocale","setLocale","lcidValue","localeStr","getCurrentBCP47Locale","localeToCurrency","getCurrentCurrency","currency","baseCurrency","localeFunctions","formatDate","format","months","days","formatNumber","positiveFormat","negativeFormat","zeroFormat","semicolonIndex","remaining","secondSemicolon","formatNumberInternal","hasPercent","formatLower","decimalPos","decimalDigits","intPart","decPart","intStr","decStr","formatString","stringFunctions","length","s","len","startPos","startOrStr","str1OrStr2","str2OrCompare","compare","str1","str2","compareMode","s1","s2","find","replace","findStr","replaceStr","maxCount","replaced","searchStr","searchFind","character","charCode","delimiter","_compare","delim","parts","resultParts","list","expression","formatStr","string","mathFunctions","numDecimalPlaces","decimals","factor","_number","constants","serialToDate","serial","baseDate","dateFunctions","date","firstDayOfWeek","d","firstDay","day","time","interval","intv","date1","date2","_firstDayOfWeek","_firstWeekOfYear","d1","d2","diff","startOfYear","startOfYear2","year","month","y","m","hour","minute","second","h","abbreviate","names","abbrev","weekday","w","conversionFunctions","errorNumber","match","numDigitsAfterDecimal","includeLeadingDigit","_useParensForNegativeNumbers","groupDigits","leadingDigit","grouping","namedFormat","inspectionFunctions","arrayFunctions","arrayname","inputStrings","include","searchValue","shouldInclude","filtered","found","MsgBoxConstants","parseButtons","buttons","buttonTypeValue","iconValue","defaultButton","buttonType","iconType","getIconPrefix","buildPrompt","title","prompt","getButtonOptions","createBrowserMsgBox","buttonsVal","titleStr","fullPrompt","input","registerMsgBox","promptVal","createBrowserInputBox","defaultVal","_xPos","_yPos","_helpFile","_contextVal","def","registerInputBox","defaultText","createMatchObject","createMatchesCollection","matches","matchObjects","createRegExpObject","sourceString","flags","regex","replaceString","registerRegExp","registerBuiltins","procname","funcRegistry","_arrayname","_pathname","_cls","_servername","picturename","path","red","green","blue","r","g","color","colorIndex","errObject","Interpreter","ms","statements","labels","labelStmt","maxIterations","iterations","labelInfo","e","savedScope","vbToJs","overrideTimers","engine","originalSetTimeout","originalSetInterval","handler","delay","languageOrArg","language","actualDelay","restoreTimers","overrideEval","originalEval","lang","restoreEval","setupVbscriptProtocol","navigateHandler","clickHandler","event","url","href","cleanupVbscriptProtocol","createObject","axConstructor","getObject","pathname","isVbscriptElement","element","parseScriptElement","script","onScriptRun","forAttr","eventAttr","setupForEventScript","targetId","eventName","eventType","bindHandler","autoRunScripts","setupElementInlineEvents","attrs","attr","attrName","setupInlineEventHandlers","resolveEventTarget","objectName","allElements","el","setupNamedEventHandlers","boundNamedHandlers","userFuncs","onIndex","cleanupNamedEventHandlers","startObserver","observer","mutations","mutation","child","stopObserver","initializeBrowserEngine","timerState","evalState","protocolState","observerContext","VbsEngine","err","statement","procedureName","vbArgs","addMembers","vbValue","jsArgs","allVars","vbVar","evalVbscript"],"mappings":"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EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,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"}
1
+ {"version":3,"file":"vbs-engine.js","sources":["../src/lexer/token.ts","../src/lexer/keywords.ts","../src/lexer/lexer.ts","../src/parser/parser-state.ts","../src/parser/location.ts","../src/parser/expression-parser.ts","../src/parser/declarations.ts","../src/parser/procedures.ts","../src/parser/control-flow.ts","../src/parser/statements.ts","../src/parser/statement-parser.ts","../src/parser/parser.ts","../src/parser/parser-cache.ts","../src/runtime/values.ts","../src/runtime/scope.ts","../src/runtime/function-registry.ts","../src/runtime/class-registry.ts","../src/runtime/vb-array.ts","../src/runtime/errors.ts","../src/runtime/context.ts","../src/runtime/value-pool.ts","../src/interpreter/expression-evaluator.ts","../src/interpreter/statement-executor.ts","../src/builtins/locale.ts","../src/builtins/string.ts","../src/builtins/math.ts","../src/builtins/date.ts","../src/builtins/conversion.ts","../src/builtins/array.ts","../src/builtins/msgbox.ts","../src/builtins/inputbox.ts","../src/builtins/regexp.ts","../src/builtins/index.ts","../src/interpreter/interpreter.ts","../src/core/conversion.ts","../src/browser/timer-override.ts","../src/browser/eval-override.ts","../src/browser/protocol-handler.ts","../src/browser/activex.ts","../src/browser/script-parser.ts","../src/browser/event-handlers.ts","../src/browser/dom-observer.ts","../src/browser/browser-runtime.ts","../src/core/index.ts"],"sourcesContent":["export enum TokenType {\n EOF = 'EOF',\n Newline = 'Newline',\n WhiteSpace = 'WhiteSpace',\n \n Identifier = 'Identifier',\n Unknown = 'Unknown',\n \n StringLiteral = 'StringLiteral',\n NumberLiteral = 'NumberLiteral',\n DateLiteral = 'DateLiteral',\n BooleanLiteral = 'BooleanLiteral',\n NothingLiteral = 'NothingLiteral',\n NullLiteral = 'NullLiteral',\n EmptyLiteral = 'EmptyLiteral',\n \n Plus = 'Plus',\n Minus = 'Minus',\n Asterisk = 'Asterisk',\n Slash = 'Slash',\n Backslash = 'Backslash',\n Caret = 'Caret',\n Mod = 'Mod',\n \n Ampersand = 'Ampersand',\n \n Eq = 'Eq',\n Lt = 'Lt',\n Gt = 'Gt',\n Le = 'Le',\n Ge = 'Ge',\n Ne = 'Ne',\n Is = 'Is',\n \n And = 'And',\n Or = 'Or',\n Not = 'Not',\n Xor = 'Xor',\n Eqv = 'Eqv',\n Imp = 'Imp',\n \n LParen = 'LParen',\n RParen = 'RParen',\n LBrace = 'LBrace',\n RBrace = 'RBrace',\n LBracket = 'LBracket',\n RBracket = 'RBracket',\n \n Comma = 'Comma',\n Colon = 'Colon',\n Dot = 'Dot',\n Bang = 'Bang',\n \n Dim = 'Dim',\n ReDim = 'ReDim',\n Preserve = 'Preserve',\n \n Public = 'Public',\n Private = 'Private',\n \n Sub = 'Sub',\n Function = 'Function',\n End = 'End',\n Exit = 'Exit',\n \n Call = 'Call',\n Set = 'Set',\n Let = 'Let',\n Get = 'Get',\n \n If = 'If',\n Then = 'Then',\n Else = 'Else',\n ElseIf = 'ElseIf',\n \n For = 'For',\n To = 'To',\n Step = 'Step',\n Next = 'Next',\n Each = 'Each',\n In = 'In',\n \n Do = 'Do',\n Loop = 'Loop',\n While = 'While',\n Until = 'Until',\n \n Select = 'Select',\n Case = 'Case',\n \n On = 'On',\n Error = 'Error',\n Resume = 'Resume',\n Goto = 'Goto',\n \n With = 'With',\n \n Class = 'Class',\n Property = 'Property',\n New = 'New',\n \n Const = 'Const',\n \n Option = 'Option',\n Explicit = 'Explicit',\n \n ByRef = 'ByRef',\n ByVal = 'ByVal',\n Optional = 'Optional',\n ParamArray = 'ParamArray',\n \n Rem = 'Rem',\n \n Erase = 'Erase',\n \n As = 'As',\n \n Integer = 'Integer',\n Long = 'Long',\n Single = 'Single',\n Double = 'Double',\n Currency = 'Currency',\n String = 'String',\n Boolean = 'Boolean',\n Date = 'Date',\n Object = 'Object',\n Variant = 'Variant',\n Byte = 'Byte',\n}\n\nexport interface TokenLocation {\n line: number;\n column: number;\n offset: number;\n}\n\nexport interface Token {\n type: TokenType;\n value: string;\n loc: {\n start: TokenLocation;\n end: TokenLocation;\n };\n raw?: string | undefined;\n}\n","import { TokenType } from './token.ts';\n\nexport const KEYWORDS: Record<string, TokenType> = {\n 'dim': TokenType.Dim,\n 'redim': TokenType.ReDim,\n 'preserve': TokenType.Preserve,\n 'public': TokenType.Public,\n 'private': TokenType.Private,\n 'sub': TokenType.Sub,\n 'function': TokenType.Function,\n 'end': TokenType.End,\n 'exit': TokenType.Exit,\n 'call': TokenType.Call,\n 'set': TokenType.Set,\n 'let': TokenType.Let,\n 'get': TokenType.Get,\n 'if': TokenType.If,\n 'then': TokenType.Then,\n 'else': TokenType.Else,\n 'elseif': TokenType.ElseIf,\n 'for': TokenType.For,\n 'to': TokenType.To,\n 'step': TokenType.Step,\n 'next': TokenType.Next,\n 'each': TokenType.Each,\n 'in': TokenType.In,\n 'do': TokenType.Do,\n 'loop': TokenType.Loop,\n 'while': TokenType.While,\n 'until': TokenType.Until,\n 'select': TokenType.Select,\n 'case': TokenType.Case,\n 'on': TokenType.On,\n 'error': TokenType.Error,\n 'resume': TokenType.Resume,\n 'goto': TokenType.Goto,\n 'with': TokenType.With,\n 'class': TokenType.Class,\n 'property': TokenType.Property,\n 'new': TokenType.New,\n 'const': TokenType.Const,\n 'option': TokenType.Option,\n 'explicit': TokenType.Explicit,\n 'byref': TokenType.ByRef,\n 'byval': TokenType.ByVal,\n 'optional': TokenType.Optional,\n 'paramarray': TokenType.ParamArray,\n 'rem': TokenType.Rem,\n 'erase': TokenType.Erase,\n 'as': TokenType.As,\n 'and': TokenType.And,\n 'or': TokenType.Or,\n 'not': TokenType.Not,\n 'xor': TokenType.Xor,\n 'eqv': TokenType.Eqv,\n 'imp': TokenType.Imp,\n 'is': TokenType.Is,\n 'mod': TokenType.Mod,\n 'integer': TokenType.Integer,\n 'long': TokenType.Long,\n 'single': TokenType.Single,\n 'double': TokenType.Double,\n 'currency': TokenType.Currency,\n 'string': TokenType.String,\n 'boolean': TokenType.Boolean,\n 'date': TokenType.Date,\n 'object': TokenType.Object,\n 'variant': TokenType.Variant,\n 'byte': TokenType.Byte,\n 'true': TokenType.BooleanLiteral,\n 'false': TokenType.BooleanLiteral,\n 'nothing': TokenType.NothingLiteral,\n 'null': TokenType.NullLiteral,\n 'empty': TokenType.EmptyLiteral,\n};\n","import { TokenType, type Token, type TokenLocation } from './token.ts';\nimport { KEYWORDS } from './keywords.ts';\n\nexport interface LexerOptions {\n skipWhitespace?: boolean;\n skipNewlines?: boolean;\n}\n\nexport class Lexer {\n private source: string;\n private pos: number = 0;\n private line: number = 1;\n private column: number = 1;\n private options: LexerOptions;\n\n constructor(source: string, options: LexerOptions = {}) {\n this.source = source;\n this.options = {\n skipWhitespace: true,\n skipNewlines: false,\n ...options,\n };\n }\n\n private get current(): string {\n return this.source[this.pos] ?? '';\n }\n\n private get peek(): string {\n return this.source[this.pos + 1] ?? '';\n }\n\n private get isEOF(): boolean {\n return this.pos >= this.source.length;\n }\n\n private getLoc(): TokenLocation {\n return {\n line: this.line,\n column: this.column,\n offset: this.pos,\n };\n }\n\n private advance(): string {\n const char = this.current;\n this.pos++;\n if (char === '\\n') {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n return char;\n }\n\n private createToken(type: TokenType, value: string, start: TokenLocation, raw?: string): Token {\n return {\n type,\n value,\n loc: {\n start,\n end: this.getLoc(),\n },\n raw,\n };\n }\n\n private skipWhitespaceAndLineContinuation(): void {\n while (true) {\n while (this.current === ' ' || this.current === '\\t' || this.current === '\\r') {\n this.advance();\n }\n \n if (this.current === '_' && (this.peek === '\\n' || this.peek === '\\r')) {\n this.advance();\n if (this.peek === '\\r') {\n this.advance();\n }\n if (this.peek === '\\n') {\n this.advance();\n }\n if ((this.current as string) === '\\n') {\n this.advance();\n }\n continue;\n }\n \n break;\n }\n }\n\n private readString(quote: string): Token {\n const start = this.getLoc();\n this.advance();\n \n let value = '';\n while (!this.isEOF) {\n if (this.current === quote) {\n if (this.peek === quote) {\n value += quote;\n this.advance();\n this.advance();\n } else {\n break;\n }\n } else if (this.current === '\\n') {\n break;\n } else {\n value += this.advance();\n }\n }\n \n if (this.current === quote) {\n this.advance();\n }\n \n return this.createToken(TokenType.StringLiteral, value, start, quote + value + quote);\n }\n\n private readNumber(): Token {\n const start = this.getLoc();\n let value = '';\n let isFloat = false;\n let isExponent = false;\n \n if (this.current === '&' && (this.peek === 'h' || this.peek === 'H')) {\n this.advance();\n this.advance();\n while (/[0-9a-fA-F]/.test(this.current)) {\n value += this.advance();\n }\n const num = parseInt(value, 16);\n return this.createToken(TokenType.NumberLiteral, String(num), start, '&' + (this.source[start.offset + 1] === 'H' ? 'H' : 'h') + value);\n }\n \n if (this.current === '&' && (this.peek === 'o' || this.peek === 'O')) {\n this.advance();\n this.advance();\n while (/[0-7]/.test(this.current)) {\n value += this.advance();\n }\n const num = parseInt(value, 8);\n return this.createToken(TokenType.NumberLiteral, String(num), start, '&' + (this.source[start.offset + 1] === 'O' ? 'O' : 'o') + value);\n }\n \n while (/[0-9]/.test(this.current)) {\n value += this.advance();\n }\n \n if (this.current === '.' && /[0-9]/.test(this.peek)) {\n isFloat = true;\n value += this.advance();\n while (/[0-9]/.test(this.current)) {\n value += this.advance();\n }\n }\n \n const currentChar = this.current;\n if (currentChar === 'e' || currentChar === 'E') {\n isExponent = true;\n value += this.advance();\n const signChar = this.current;\n if (signChar === '+' || signChar === '-') {\n value += this.advance();\n }\n while (/[0-9]/.test(this.current)) {\n value += this.advance();\n }\n }\n \n if (this.current === '#' && !isFloat && !isExponent) {\n return this.readDate(start, value);\n }\n \n return this.createToken(TokenType.NumberLiteral, value, start, value);\n }\n\n private readDate(start: TokenLocation, prefix?: string): Token {\n let value = prefix ?? '';\n if (this.current === '#') {\n this.advance();\n }\n \n while (!this.isEOF && this.current !== '#') {\n if (this.current === '\\n') break;\n value += this.advance();\n }\n \n if (this.current === '#') {\n this.advance();\n }\n \n return this.createToken(TokenType.DateLiteral, value.trim(), start, '#' + value + '#');\n }\n\n private readIdentifier(): Token {\n const start = this.getLoc();\n let value = '';\n \n while (/[a-zA-Z0-9_]/.test(this.current)) {\n value += this.advance();\n }\n \n const upperValue = value.toLowerCase();\n const keywordType = KEYWORDS[upperValue];\n \n if (keywordType) {\n if (keywordType === TokenType.BooleanLiteral) {\n return this.createToken(TokenType.BooleanLiteral, upperValue, start, value);\n }\n if (keywordType === TokenType.NothingLiteral) {\n return this.createToken(TokenType.NothingLiteral, 'nothing', start, value);\n }\n if (keywordType === TokenType.NullLiteral) {\n return this.createToken(TokenType.NullLiteral, 'null', start, value);\n }\n if (keywordType === TokenType.EmptyLiteral) {\n return this.createToken(TokenType.EmptyLiteral, 'empty', start, value);\n }\n return this.createToken(keywordType, upperValue, start, value);\n }\n \n return this.createToken(TokenType.Identifier, value, start, value);\n }\n\n private readRemComment(): Token {\n const start = this.getLoc();\n let value = '';\n \n while (!this.isEOF && this.current !== '\\n') {\n value += this.advance();\n }\n \n return this.createToken(TokenType.Rem, value, start, value);\n }\n\n private readSingleLineComment(): void {\n while (!this.isEOF && this.current !== '\\n') {\n this.advance();\n }\n }\n\n nextToken(): Token {\n while (!this.isEOF) {\n if (this.options.skipWhitespace) {\n this.skipWhitespaceAndLineContinuation();\n }\n \n if (this.isEOF) {\n return this.createToken(TokenType.EOF, '', this.getLoc());\n }\n \n if (this.current === '\\n') {\n const start = this.getLoc();\n this.advance();\n if (this.options.skipNewlines) {\n continue;\n }\n return this.createToken(TokenType.Newline, '\\n', start, '\\n');\n }\n \n if (this.current === \"'\" && this.options.skipWhitespace) {\n this.readSingleLineComment();\n continue;\n }\n \n if (this.current === '\"' || this.current === \"'\") {\n return this.readString(this.current);\n }\n \n if (this.current === '#') {\n const start = this.getLoc();\n return this.readDate(start);\n }\n \n if (this.current === '&' && (this.peek === 'h' || this.peek === 'H' || this.peek === 'o' || this.peek === 'O')) {\n return this.readNumber();\n }\n \n if (/[0-9]/.test(this.current)) {\n return this.readNumber();\n }\n \n if (this.current === '.' && /[0-9]/.test(this.peek)) {\n return this.readNumber();\n }\n \n if (/[a-zA-Z_]/.test(this.current)) {\n const token = this.readIdentifier();\n if (token.type === TokenType.Rem) {\n if (this.options.skipWhitespace) {\n this.readRemComment();\n continue;\n }\n return token;\n }\n return token;\n }\n \n const start = this.getLoc();\n const char = this.current;\n \n switch (char) {\n case '+':\n this.advance();\n return this.createToken(TokenType.Plus, '+', start);\n case '-':\n this.advance();\n return this.createToken(TokenType.Minus, '-', start);\n case '*':\n this.advance();\n return this.createToken(TokenType.Asterisk, '*', start);\n case '/':\n this.advance();\n return this.createToken(TokenType.Slash, '/', start);\n case '\\\\':\n this.advance();\n return this.createToken(TokenType.Backslash, '\\\\', start);\n case '^':\n this.advance();\n return this.createToken(TokenType.Caret, '^', start);\n case '&':\n this.advance();\n return this.createToken(TokenType.Ampersand, '&', start);\n case '(':\n this.advance();\n return this.createToken(TokenType.LParen, '(', start);\n case ')':\n this.advance();\n return this.createToken(TokenType.RParen, ')', start);\n case '{':\n this.advance();\n return this.createToken(TokenType.LBrace, '{', start);\n case '}':\n this.advance();\n return this.createToken(TokenType.RBrace, '}', start);\n case '[':\n this.advance();\n return this.createToken(TokenType.LBracket, '[', start);\n case ']':\n this.advance();\n return this.createToken(TokenType.RBracket, ']', start);\n case ',':\n this.advance();\n return this.createToken(TokenType.Comma, ',', start);\n case ':':\n this.advance();\n return this.createToken(TokenType.Colon, ':', start);\n case '.':\n this.advance();\n return this.createToken(TokenType.Dot, '.', start);\n case '!':\n this.advance();\n return this.createToken(TokenType.Bang, '!', start);\n case '=':\n this.advance();\n return this.createToken(TokenType.Eq, '=', start);\n case '<':\n this.advance();\n if (this.current === '>') {\n this.advance();\n return this.createToken(TokenType.Ne, '<>', start);\n }\n if (this.current === '=') {\n this.advance();\n return this.createToken(TokenType.Le, '<=', start);\n }\n return this.createToken(TokenType.Lt, '<', start);\n case '>':\n this.advance();\n if (this.current === '=') {\n this.advance();\n return this.createToken(TokenType.Ge, '>=', start);\n }\n return this.createToken(TokenType.Gt, '>', start);\n default:\n this.advance();\n return this.createToken(TokenType.Unknown, char, start);\n }\n }\n \n return this.createToken(TokenType.EOF, '', this.getLoc());\n }\n\n tokenize(): Token[] {\n const tokens: Token[] = [];\n \n while (true) {\n const token = this.nextToken();\n tokens.push(token);\n \n if (token.type === TokenType.EOF) {\n break;\n }\n }\n \n return tokens;\n }\n}\n\nexport function tokenize(source: string, options?: LexerOptions): Token[] {\n const lexer = new Lexer(source, options);\n return lexer.tokenize();\n}\n","import type { Token, TokenType } from '../lexer/index.ts';\n\nexport class ParseError extends Error {\n public token: Token;\n public expected?: TokenType | TokenType[];\n\n constructor(message: string, token: Token, expected?: TokenType | TokenType[]) {\n super(message);\n this.name = 'ParseError';\n this.token = token;\n if (expected !== undefined) {\n this.expected = expected;\n }\n }\n}\n\nexport class ParserState {\n private tokens: Token[];\n private pos: number = 0;\n\n constructor(tokens: Token[]) {\n if (tokens.length === 0) {\n throw new Error('ParserState requires at least one token');\n }\n this.tokens = tokens;\n }\n\n get current(): Token {\n return this.tokens[this.pos] ?? this.tokens[0]!;\n }\n\n get previous(): Token {\n return this.tokens[this.pos - 1] ?? this.tokens[0]!;\n }\n\n get isEOF(): boolean {\n return this.current.type === 'EOF' as TokenType;\n }\n\n save(): number {\n return this.pos;\n }\n\n restore(pos: number): void {\n this.pos = pos;\n }\n\n advance(): Token {\n if (!this.isEOF) {\n this.pos++;\n }\n return this.previous;\n }\n\n peek(offset: number = 0): Token {\n return this.tokens[this.pos + offset] ?? this.tokens[0]!;\n }\n\n check(type: TokenType): boolean {\n return this.current.type === type;\n }\n\n checkIdentifier(): boolean {\n return this.current.type === 'Identifier' as TokenType;\n }\n\n checkAny(...types: TokenType[]): boolean {\n return types.includes(this.current.type);\n }\n\n checkNewline(): boolean {\n return this.current.type === 'Newline' as TokenType;\n }\n\n match(type: TokenType): Token | null {\n if (this.check(type)) {\n return this.advance();\n }\n return null;\n }\n\n matchAny(...types: TokenType[]): Token | null {\n if (this.checkAny(...types)) {\n return this.advance();\n }\n return null;\n }\n\n expect(type: TokenType, message?: string): Token {\n if (this.check(type)) {\n return this.advance();\n }\n throw new ParseError(\n message ?? `Expected ${type}, got ${this.current.type}`,\n this.current,\n type\n );\n }\n\n expectAny(types: TokenType[], message?: string): Token {\n if (this.checkAny(...types)) {\n return this.advance();\n }\n throw new ParseError(\n message ?? `Expected one of ${types.join(', ')}, got ${this.current.type}`,\n this.current,\n types\n );\n }\n\n skipNewlines(): void {\n while (this.match('Newline' as TokenType)) {}\n }\n\n skipOptionalNewlines(): void {\n this.skipNewlines();\n }\n\n skipStatementSeparators(): void {\n while (this.matchAny('Newline' as TokenType, 'Colon' as TokenType)) {}\n }\n}\n","import type { Position, SourceLocation } from '../ast/base.ts';\nimport type { Token } from '../lexer/index.ts';\n\nexport function tokenToPosition(token: Token): Position {\n return {\n line: token.loc.start.line,\n column: token.loc.start.column,\n };\n}\n\nexport function tokenToEndPosition(token: Token): Position {\n return {\n line: token.loc.end.line,\n column: token.loc.end.column,\n };\n}\n\nexport function createLocation(start: Token, end: Token): SourceLocation {\n return {\n start: tokenToPosition(start),\n end: tokenToEndPosition(end),\n };\n}\n\nexport function mergeLocations(start: SourceLocation, end: SourceLocation): SourceLocation {\n return {\n start: start.start,\n end: end.end,\n };\n}\n","import type {\n Expression,\n Identifier,\n Literal,\n VbEmptyLiteral,\n VbNewExpression,\n MemberExpression,\n CallExpression,\n BinaryExpression,\n LogicalExpression,\n AssignmentExpression,\n} from '../ast/index.ts';\nimport type { Token, TokenType } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { createLocation } from './location.ts';\n\nexport class ExpressionParser {\n private state: ParserState;\n\n constructor(state: ParserState) {\n this.state = state;\n }\n\n parseExpression(): Expression {\n return this.parseAssignment();\n }\n\n parseStatementExpression(): Expression {\n return this.parseStatementAssignment();\n }\n\n parseCallExpression(): Expression {\n return this.parseCall();\n }\n\n parseMemberExpression(): Expression {\n let expr = this.parseIdentifierOnly();\n\n while (true) {\n if (this.state.check('Dot' as TokenType)) {\n this.state.advance();\n const property = this.parsePropertyName();\n expr = {\n type: 'MemberExpression',\n object: expr,\n property,\n computed: false,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n { loc: property.loc! } as Token\n ),\n } as MemberExpression;\n } else if (this.state.check('Bang' as TokenType)) {\n this.state.advance();\n const property = this.parsePropertyName();\n expr = {\n type: 'MemberExpression',\n object: expr,\n property,\n computed: true,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n { loc: property.loc! } as Token\n ),\n } as MemberExpression;\n } else if (this.state.check('LBracket' as TokenType)) {\n this.state.advance();\n const index = this.parseExpression();\n const rbracket = this.state.expect('RBracket' as TokenType);\n expr = {\n type: 'MemberExpression',\n object: expr,\n property: index,\n computed: true,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n rbracket\n ),\n } as MemberExpression;\n } else {\n break;\n }\n }\n\n return expr;\n }\n\n private parseIdentifierOnly(): Expression {\n if (this.state.check('Dot' as TokenType)) {\n return this.parseWithMemberExpression();\n }\n\n const token = this.state.expect('Identifier' as TokenType);\n return {\n type: 'Identifier',\n name: token.value,\n loc: token.loc,\n };\n }\n\n private parseStatementAssignment(): Expression {\n if (this.state.check('Identifier' as TokenType) || this.state.check('Dot' as TokenType)) {\n const savedState = this.state.save();\n const left = this.parseCall();\n \n if (left.type === 'CallExpression') {\n return this.continueStringConcat(left);\n }\n \n if (this.state.check('Eq' as TokenType)) {\n if (left.type === 'Identifier' || left.type === 'MemberExpression') {\n const op = this.state.advance();\n const right = this.parseStatementAssignment();\n return this.createAssignmentExpression(left, '=', right, op);\n }\n }\n \n if ((left.type === 'Identifier' || left.type === 'MemberExpression') &&\n this.isStatementCallArgumentStart()) {\n const args = this.parseStatementCallArguments();\n const callExpr: CallExpression = {\n type: 'CallExpression',\n callee: left,\n arguments: args,\n optional: false,\n loc: createLocation({ loc: left.loc! } as Token, this.state.previous),\n } as CallExpression;\n return this.continueStringConcat(callExpr);\n }\n \n this.state.restore(savedState);\n }\n\n return this.parseStringConcat();\n }\n\n private continueStringConcat(left: Expression): Expression {\n while (this.state.check('Ampersand' as TokenType)) {\n this.state.advance();\n const right = this.parseLogicalOr();\n left = {\n type: 'BinaryExpression',\n operator: '&',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n } as BinaryExpression;\n }\n return left;\n }\n\n private isStatementCallArgumentStart(): boolean {\n return this.state.checkAny(\n 'StringLiteral' as TokenType,\n 'NumberLiteral' as TokenType,\n 'DateLiteral' as TokenType,\n 'BooleanLiteral' as TokenType,\n 'NothingLiteral' as TokenType,\n 'NullLiteral' as TokenType,\n 'EmptyLiteral' as TokenType,\n 'Identifier' as TokenType,\n 'LParen' as TokenType,\n 'New' as TokenType,\n );\n }\n\n private parseStatementCallArguments(): Expression[] {\n const args: Expression[] = [];\n\n while (!this.state.checkAny('Newline' as TokenType, 'Colon' as TokenType, 'EOF' as TokenType)) {\n args.push(this.parseExpression());\n if (!this.state.match('Comma' as TokenType)) {\n break;\n }\n }\n\n return args;\n }\n\n private parseAssignment(): Expression {\n const expr = this.parseStringConcat();\n\n if (this.state.checkAny('Eq' as TokenType)) {\n const op = this.state.advance();\n const right = this.parseAssignment();\n return this.createAssignmentExpression(expr, '=', right, op);\n }\n\n return expr;\n }\n\n private createAssignmentExpression(\n left: Expression,\n operator: string,\n right: Expression,\n token: Token\n ): AssignmentExpression {\n return {\n type: 'AssignmentExpression',\n operator: operator as AssignmentExpression['operator'],\n left: left as AssignmentExpression['left'],\n right,\n loc: createLocation(\n { loc: { start: left.loc!.start, end: left.loc!.end } } as Token,\n token\n ),\n };\n }\n\n private parseStringConcat(): Expression {\n let left = this.parseLogicalOr();\n\n while (this.state.check('Ampersand' as TokenType)) {\n this.state.advance();\n const right = this.parseLogicalOr();\n left = {\n type: 'BinaryExpression',\n operator: '&',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n } as BinaryExpression;\n }\n\n return left;\n }\n\n private parseLogicalOr(): Expression {\n let left = this.parseLogicalAnd();\n\n while (this.state.check('Or' as TokenType)) {\n this.state.advance();\n const right = this.parseLogicalAnd();\n left = {\n type: 'LogicalExpression',\n operator: '||',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseLogicalAnd(): Expression {\n let left = this.parseLogicalNot();\n\n while (this.state.check('And' as TokenType)) {\n this.state.advance();\n const right = this.parseLogicalNot();\n left = {\n type: 'LogicalExpression',\n operator: '&&',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseLogicalNot(): Expression {\n let left = this.parseComparison();\n\n while (this.state.checkAny('Xor' as TokenType, 'Eqv' as TokenType, 'Imp' as TokenType)) {\n const op = this.state.advance();\n const right = this.parseComparison();\n const operator = op.value.toLowerCase() === 'xor' ? 'xor' : \n op.value.toLowerCase() === 'eqv' ? 'eqv' : 'imp';\n left = {\n type: 'LogicalExpression',\n operator: operator as LogicalExpression['operator'],\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseComparison(): Expression {\n let left = this.parseIs();\n\n while (\n this.state.checkAny(\n 'Eq' as TokenType,\n 'Lt' as TokenType,\n 'Gt' as TokenType,\n 'Le' as TokenType,\n 'Ge' as TokenType,\n 'Ne' as TokenType\n )\n ) {\n const op = this.state.advance();\n const right = this.parseIs();\n const operator = this.getComparisonOperator(op);\n left = {\n type: 'BinaryExpression',\n operator,\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private getComparisonOperator(token: Token): BinaryExpression['operator'] {\n switch (token.type) {\n case 'Eq':\n return '==';\n case 'Lt':\n return '<';\n case 'Gt':\n return '>';\n case 'Le':\n return '<=';\n case 'Ge':\n return '>=';\n case 'Ne':\n return '!=';\n default:\n return '==';\n }\n }\n\n private parseIs(): Expression {\n const left = this.parseConcatenation();\n\n if (this.state.check('Is' as TokenType)) {\n this.state.advance();\n const right = this.parseConcatenation();\n return {\n type: 'BinaryExpression',\n operator: 'Is',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n } as BinaryExpression;\n }\n\n return left;\n }\n\n private parseConcatenation(): Expression {\n return this.parseAdditive();\n }\n\n private parseAdditive(): Expression {\n let left = this.parseMultiplicative();\n\n while (this.state.checkAny('Plus' as TokenType, 'Minus' as TokenType)) {\n const op = this.state.advance();\n const right = this.parseMultiplicative();\n left = {\n type: 'BinaryExpression',\n operator: op.type === 'Plus' ? '+' : '-',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseMultiplicative(): Expression {\n let left = this.parseIntegerDivision();\n\n while (\n this.state.checkAny('Asterisk' as TokenType, 'Slash' as TokenType)\n ) {\n const op = this.state.advance();\n const right = this.parseIntegerDivision();\n left = {\n type: 'BinaryExpression',\n operator: op.type === 'Asterisk' ? '*' : '/',\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseIntegerDivision(): Expression {\n let left = this.parseMod();\n\n while (this.state.check('Backslash' as TokenType)) {\n this.state.advance();\n const right = this.parseMod();\n left = {\n type: 'BinaryExpression',\n operator: '\\\\' as BinaryExpression['operator'],\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseMod(): Expression {\n let left = this.parsePower();\n\n while (this.state.check('Mod' as TokenType)) {\n this.state.advance();\n const right = this.parsePower();\n left = {\n type: 'BinaryExpression',\n operator: '%' as BinaryExpression['operator'],\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parsePower(): Expression {\n let left = this.parseUnary();\n\n while (this.state.check('Caret' as TokenType)) {\n this.state.advance();\n const right = this.parseUnary();\n left = {\n type: 'BinaryExpression',\n operator: '**' as BinaryExpression['operator'],\n left,\n right,\n loc: createLocation(\n { loc: left.loc! } as Token,\n { loc: right.loc! } as Token\n ),\n };\n }\n\n return left;\n }\n\n private parseUnary(): Expression {\n if (this.state.check('Not' as TokenType)) {\n const op = this.state.advance();\n const argument = this.parseUnary();\n return {\n type: 'UnaryExpression',\n operator: '!',\n prefix: true,\n argument,\n loc: createLocation(op, { loc: argument.loc! } as Token),\n };\n }\n\n if (this.state.check('Minus' as TokenType)) {\n const op = this.state.advance();\n const argument = this.parseUnary();\n return {\n type: 'UnaryExpression',\n operator: '-',\n prefix: true,\n argument,\n loc: createLocation(op, { loc: argument.loc! } as Token),\n };\n }\n\n if (this.state.check('Plus' as TokenType)) {\n const op = this.state.advance();\n const argument = this.parseUnary();\n return {\n type: 'UnaryExpression',\n operator: '+',\n prefix: true,\n argument,\n loc: createLocation(op, { loc: argument.loc! } as Token),\n };\n }\n\n return this.parsePostfix();\n }\n\n private parsePostfix(): Expression {\n return this.parseCall();\n }\n\n private parseCall(): Expression {\n let expr = this.parsePrimary();\n\n while (true) {\n if (this.state.check('Dot' as TokenType)) {\n this.state.advance();\n const property = this.parsePropertyName();\n expr = {\n type: 'MemberExpression',\n object: expr,\n property,\n computed: false,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n { loc: property.loc! } as Token\n ),\n } as MemberExpression;\n } else if (this.state.check('Bang' as TokenType)) {\n this.state.advance();\n const property = this.parsePropertyName();\n expr = {\n type: 'MemberExpression',\n object: expr,\n property,\n computed: true,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n { loc: property.loc! } as Token\n ),\n } as MemberExpression;\n } else if (this.state.check('LParen' as TokenType)) {\n this.state.advance();\n const args = this.parseArguments();\n const rparen = this.state.expect('RParen' as TokenType);\n expr = {\n type: 'CallExpression',\n callee: expr,\n arguments: args,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n rparen\n ),\n } as CallExpression;\n } else if (this.state.check('LBracket' as TokenType)) {\n this.state.advance();\n const index = this.parseExpression();\n const rbracket = this.state.expect('RBracket' as TokenType);\n expr = {\n type: 'MemberExpression',\n object: expr,\n property: index,\n computed: true,\n optional: false,\n loc: createLocation(\n { loc: expr.loc! } as Token,\n rbracket\n ),\n } as MemberExpression;\n } else {\n break;\n }\n }\n\n return expr;\n }\n\n private parseArguments(): Expression[] {\n const args: Expression[] = [];\n\n if (!this.state.check('RParen' as TokenType)) {\n while (true) {\n this.state.skipOptionalNewlines();\n \n if (this.state.check('RParen' as TokenType)) {\n break;\n }\n \n // Handle empty arguments (consecutive commas)\n if (this.state.check('Comma' as TokenType)) {\n // Empty argument - push Empty literal\n args.push({\n type: 'VbEmptyLiteral',\n value: undefined,\n raw: '',\n loc: this.state.current.loc,\n });\n } else {\n args.push(this.parseExpression());\n }\n \n this.state.skipOptionalNewlines();\n \n if (this.state.check('Comma' as TokenType)) {\n this.state.advance();\n } else {\n break;\n }\n }\n }\n\n return args;\n }\n\n parsePrimary(): Expression {\n if (this.state.check('LParen' as TokenType)) {\n return this.parseParenExpression();\n }\n\n if (this.state.check('StringLiteral' as TokenType)) {\n return this.parseStringLiteral();\n }\n\n if (this.state.check('NumberLiteral' as TokenType)) {\n return this.parseNumberLiteral();\n }\n\n if (this.state.check('DateLiteral' as TokenType)) {\n return this.parseDateLiteral();\n }\n\n if (this.state.check('BooleanLiteral' as TokenType)) {\n return this.parseBooleanLiteral();\n }\n\n if (this.state.check('NothingLiteral' as TokenType)) {\n return this.parseNothingLiteral();\n }\n\n if (this.state.check('NullLiteral' as TokenType)) {\n return this.parseNullLiteral();\n }\n\n if (this.state.check('EmptyLiteral' as TokenType)) {\n return this.parseEmptyLiteral();\n }\n\n if (this.state.check('New' as TokenType)) {\n return this.parseNewExpression();\n }\n\n if (this.state.check('Dot' as TokenType)) {\n return this.parseWithMemberExpression();\n }\n\n if (this.state.check('Identifier' as TokenType)) {\n return this.parseIdentifierOrCall();\n }\n\n throw new Error(`Unexpected token: ${this.state.current.type}`);\n }\n\n private parseWithMemberExpression(): MemberExpression {\n const dotToken = this.state.advance();\n const property = this.parsePropertyName();\n return {\n type: 'MemberExpression',\n object: { type: 'VbWithObject', loc: dotToken.loc } as Expression,\n property,\n computed: false,\n optional: false,\n loc: createLocation(dotToken, { loc: property.loc! } as Token),\n } as MemberExpression;\n }\n\n private parseParenExpression(): Expression {\n this.state.advance();\n this.state.skipOptionalNewlines();\n const expr = this.parseExpression();\n this.state.skipOptionalNewlines();\n this.state.expect('RParen' as TokenType);\n return expr;\n }\n\n private parseStringLiteral(): Literal {\n const token = this.state.advance();\n return {\n type: 'Literal',\n value: token.value,\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseNumberLiteral(): Literal {\n const token = this.state.advance();\n const value = token.value.includes('.') || token.value.includes('e') || token.value.includes('E')\n ? parseFloat(token.value)\n : parseInt(token.value, 10);\n return {\n type: 'Literal',\n value,\n raw: token.raw ?? token.value,\n loc: token.loc,\n };\n }\n\n private parseDateLiteral(): Literal {\n const token = this.state.advance();\n return {\n type: 'Literal',\n value: new Date(token.value),\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseBooleanLiteral(): Literal {\n const token = this.state.advance();\n return {\n type: 'Literal',\n value: token.value.toLowerCase() === 'true',\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseNothingLiteral(): Literal {\n const token = this.state.advance();\n return {\n type: 'Literal',\n value: Symbol.for('Nothing'),\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseNullLiteral(): Literal {\n const token = this.state.advance();\n return {\n type: 'Literal',\n value: null,\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseEmptyLiteral(): VbEmptyLiteral {\n const token = this.state.advance();\n return {\n type: 'VbEmptyLiteral',\n value: undefined,\n raw: token.raw ?? undefined,\n loc: token.loc,\n };\n }\n\n private parseNewExpression(): VbNewExpression {\n const newToken = this.state.advance();\n const callee = this.parseIdentifier();\n\n let args: Expression[] = [];\n if (this.state.check('LParen' as TokenType)) {\n this.state.advance();\n args = this.parseArguments();\n this.state.expect('RParen' as TokenType);\n }\n\n return {\n type: 'VbNewExpression',\n callee,\n arguments: args,\n loc: createLocation(newToken, this.state.previous),\n };\n }\n\n private parseIdentifierOrCall(): Expression {\n const id = this.parseIdentifier();\n\n if (this.state.check('LParen' as TokenType)) {\n this.state.advance();\n const args = this.parseArguments();\n const rparen = this.state.expect('RParen' as TokenType);\n return {\n type: 'CallExpression',\n callee: id,\n arguments: args,\n optional: false,\n loc: createLocation({ loc: id.loc! } as Token, rparen),\n } as CallExpression;\n }\n\n return id;\n }\n\n parseIdentifier(): Identifier {\n const token = this.state.expect('Identifier' as TokenType);\n return {\n type: 'Identifier',\n name: token.value,\n loc: token.loc,\n };\n }\n\n private parsePropertyName(): Identifier {\n const token = this.state.current;\n if (token.type === 'Identifier' as TokenType || \n (token.type !== 'EOF' as TokenType && \n token.type !== 'Newline' as TokenType && \n token.type !== 'LParen' as TokenType &&\n token.type !== 'RParen' as TokenType &&\n token.type !== 'Comma' as TokenType &&\n token.type !== 'Colon' as TokenType)) {\n this.state.advance();\n return {\n type: 'Identifier',\n name: token.value,\n loc: token.loc,\n };\n }\n throw new Error(`Expected property name, got ${token.type}`);\n }\n}\n","import type {\n Expression,\n VbDimStatement,\n VbVariableDeclarator,\n VbReDimStatement,\n VbEraseStatement,\n VbConstStatement,\n VbConstDeclarator,\n VbTypeAnnotation,\n} from '../ast/index.ts';\nimport type { Token } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { ExpressionParser } from './expression-parser.ts';\nimport { createLocation } from './location.ts';\n\nexport class DeclarationParser {\n constructor(\n private state: ParserState,\n private exprParser: ExpressionParser\n ) {}\n\n parseDimStatement(): VbDimStatement {\n const dimToken = this.state.advance();\n const declarations = this.parseVariableDeclarations();\n\n return {\n type: 'VbDimStatement',\n declarations,\n visibility: 'dim',\n loc: createLocation(dimToken, this.state.previous),\n };\n }\n\n parsePublicDimStatement(): VbDimStatement {\n const visibilityToken = this.state.advance();\n this.state.expect('Dim' as any);\n const declarations = this.parseVariableDeclarations();\n\n return {\n type: 'VbDimStatement',\n declarations,\n visibility: 'public',\n loc: createLocation(visibilityToken, this.state.previous),\n };\n }\n\n parsePrivateDimStatement(): VbDimStatement {\n const visibilityToken = this.state.advance();\n this.state.expect('Dim' as any);\n const declarations = this.parseVariableDeclarations();\n\n return {\n type: 'VbDimStatement',\n declarations,\n visibility: 'private',\n loc: createLocation(visibilityToken, this.state.previous),\n };\n }\n\n parseReDimStatement(): VbReDimStatement {\n const redimToken = this.state.advance();\n const preserve = this.state.match('Preserve' as any) !== null;\n const declarations = this.parseVariableDeclarations();\n\n return {\n type: 'VbReDimStatement',\n declarations,\n preserve,\n loc: createLocation(redimToken, this.state.previous),\n };\n }\n\n parseEraseStatement(): VbEraseStatement {\n const eraseToken = this.state.advance();\n const arrayName = this.exprParser.parseIdentifier();\n\n return {\n type: 'VbEraseStatement',\n arrayName,\n loc: createLocation(eraseToken, this.state.previous),\n };\n }\n\n parseConstStatement(): VbConstStatement {\n const constToken = this.state.advance();\n const declarations = this.parseConstDeclarators();\n\n return {\n type: 'VbConstStatement',\n declarations,\n visibility: 'private',\n loc: createLocation(constToken, this.state.previous),\n };\n }\n\n parsePublicConstStatement(): VbConstStatement {\n const visibilityToken = this.state.advance();\n this.state.expect('Const' as any);\n const declarations = this.parseConstDeclarators();\n\n return {\n type: 'VbConstStatement',\n declarations,\n visibility: 'public',\n loc: createLocation(visibilityToken, this.state.previous),\n };\n }\n\n parsePrivateConstStatement(): VbConstStatement {\n const visibilityToken = this.state.advance();\n this.state.expect('Const' as any);\n const declarations = this.parseConstDeclarators();\n\n return {\n type: 'VbConstStatement',\n declarations,\n visibility: 'private',\n loc: createLocation(visibilityToken, this.state.previous),\n };\n }\n\n parseVariableDeclarations(): VbVariableDeclarator[] {\n const declarations: VbVariableDeclarator[] = [];\n\n do {\n const decl = this.parseVariableDeclarator();\n declarations.push(decl);\n } while (this.state.match('Comma' as any));\n\n return declarations;\n }\n\n private parseVariableDeclarator(): VbVariableDeclarator {\n const id = this.exprParser.parseIdentifier();\n let init: Expression | null = null;\n let isArray = false;\n let arrayBounds: Expression[] = [];\n\n if (this.state.check('LParen' as any)) {\n this.state.advance();\n isArray = true;\n arrayBounds = this.parseArrayBounds();\n this.state.expect('RParen' as any);\n }\n\n if (this.state.match('Eq' as any)) {\n init = this.exprParser.parseExpression();\n }\n\n let typeAnnotation: VbTypeAnnotation | undefined;\n if (this.state.check('As' as any)) {\n typeAnnotation = this.parseTypeAnnotation();\n }\n\n return {\n type: 'VbVariableDeclarator',\n id,\n init,\n isArray,\n arrayBounds: arrayBounds.length > 0 ? arrayBounds : undefined,\n typeAnnotation,\n loc: createLocation({ loc: id.loc! } as Token, this.state.previous),\n };\n }\n\n private parseArrayBounds(): Expression[] {\n const bounds: Expression[] = [];\n\n do {\n this.state.skipOptionalNewlines();\n bounds.push(this.exprParser.parseExpression());\n this.state.skipOptionalNewlines();\n } while (this.state.match('Comma' as any));\n\n return bounds;\n }\n\n private parseTypeAnnotation(): VbTypeAnnotation {\n this.state.expect('As' as any);\n const typeToken = this.state.current;\n let typeName = '';\n let isArray = false;\n\n if (this.state.checkAny(\n 'Integer' as any,\n 'Long' as any,\n 'Single' as any,\n 'Double' as any,\n 'Currency' as any,\n 'String' as any,\n 'Boolean' as any,\n 'Date' as any,\n 'Object' as any,\n 'Variant' as any,\n 'Byte' as any,\n 'Identifier' as any\n )) {\n typeName = this.state.advance().value;\n }\n\n if (this.state.check('LParen' as any)) {\n this.state.advance();\n isArray = true;\n this.state.expect('RParen' as any);\n }\n\n return {\n type: 'VbTypeAnnotation',\n typeName,\n isArray,\n loc: createLocation(typeToken, this.state.previous),\n };\n }\n\n private parseConstDeclarators(): VbConstDeclarator[] {\n const declarations: VbConstDeclarator[] = [];\n\n do {\n const decl = this.parseConstDeclarator();\n declarations.push(decl);\n } while (this.state.match('Comma' as any));\n\n return declarations;\n }\n\n private parseConstDeclarator(): VbConstDeclarator {\n const id = this.exprParser.parseIdentifier();\n this.state.expect('Eq' as any);\n const init = this.exprParser.parseExpression();\n\n let typeAnnotation: VbTypeAnnotation | undefined;\n if (this.state.check('As' as any)) {\n typeAnnotation = this.parseTypeAnnotation();\n }\n\n return {\n type: 'VbConstDeclarator',\n id,\n init,\n typeAnnotation,\n loc: createLocation({ loc: id.loc! } as Token, this.state.previous),\n };\n }\n}\n","import type {\n Statement,\n BlockStatement,\n VbSubStatement,\n VbFunctionStatement,\n VbClassStatement,\n VbClassElement,\n VbParameter,\n VbPropertyGetStatement,\n VbPropertyLetStatement,\n VbPropertySetStatement,\n} from '../ast/index.ts';\nimport type { Token } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { ExpressionParser } from './expression-parser.ts';\nimport { createLocation } from './location.ts';\n\nfunction isVbClassElement(stmt: Statement): stmt is VbClassElement {\n const elementTypes = [\n 'VbSubStatement',\n 'VbFunctionStatement',\n 'VbPropertyGetStatement',\n 'VbPropertyLetStatement',\n 'VbPropertySetStatement',\n 'VbDimStatement',\n 'VbConstStatement',\n ];\n return elementTypes.includes(stmt.type);\n}\n\nexport class ProcedureParser {\n constructor(\n private state: ParserState,\n private exprParser: ExpressionParser,\n private parseStatement: () => Statement\n ) {}\n\n parseSubStatement(visibility?: string): VbSubStatement {\n const startToken = this.state.current;\n this.state.expect('Sub' as any);\n const name = this.exprParser.parseIdentifier();\n const params = this.parseParameters();\n this.state.skipNewlines();\n const body = this.parseBlock('End');\n this.state.expect('End' as any);\n this.state.expect('Sub' as any);\n\n return {\n type: 'VbSubStatement',\n name,\n params,\n body,\n visibility: (visibility ?? 'public') as 'public' | 'private',\n loc: createLocation(startToken, this.state.previous),\n };\n }\n\n parseFunctionStatement(visibility?: string): VbFunctionStatement {\n const startToken = this.state.current;\n this.state.expect('Function' as any);\n const name = this.exprParser.parseIdentifier();\n const params = this.parseParameters();\n this.state.skipNewlines();\n const body = this.parseBlock('End');\n this.state.expect('End' as any);\n this.state.expect('Function' as any);\n\n return {\n type: 'VbFunctionStatement',\n name,\n params,\n body,\n visibility: (visibility ?? 'public') as 'public' | 'private',\n loc: createLocation(startToken, this.state.previous),\n };\n }\n\n parseClassStatement(): VbClassStatement {\n const classToken = this.state.advance();\n const name = this.exprParser.parseIdentifier();\n this.state.skipNewlines();\n\n const body = this.parseClassBody();\n\n this.state.expect('End' as any);\n this.state.expect('Class' as any);\n\n return {\n type: 'VbClassStatement',\n name,\n body,\n loc: createLocation(classToken, this.state.previous),\n };\n }\n\n parsePropertyStatement(visibility?: string): Statement {\n this.state.expect('Property' as any);\n const propVisibility = visibility ?? 'public';\n\n if (this.state.check('Get' as any)) {\n return this.parsePropertyGet(propVisibility);\n }\n if (this.state.check('Let' as any)) {\n return this.parsePropertyLet(propVisibility);\n }\n if (this.state.check('Set' as any)) {\n return this.parsePropertySet(propVisibility);\n }\n\n throw new Error('Expected Get, Let, or Set after Property');\n }\n\n private parsePropertyGet(visibility: string): VbPropertyGetStatement {\n this.state.expect('Get' as any);\n const name = this.exprParser.parseIdentifier();\n const params = this.parseParameters();\n this.state.skipNewlines();\n const body = this.parseBlock('End');\n this.state.expect('End' as any);\n this.state.expect('Property' as any);\n\n return {\n type: 'VbPropertyGetStatement',\n name,\n params,\n body,\n visibility: visibility as 'public' | 'private',\n loc: createLocation(this.state.previous, this.state.previous),\n };\n }\n\n private parsePropertyLet(visibility: string): VbPropertyLetStatement {\n this.state.expect('Let' as any);\n const name = this.exprParser.parseIdentifier();\n const params = this.parseParameters();\n this.state.skipNewlines();\n const body = this.parseBlock('End');\n this.state.expect('End' as any);\n this.state.expect('Property' as any);\n\n return {\n type: 'VbPropertyLetStatement',\n name,\n params,\n body,\n visibility: visibility as 'public' | 'private',\n loc: createLocation(this.state.previous, this.state.previous),\n };\n }\n\n private parsePropertySet(visibility: string): VbPropertySetStatement {\n this.state.expect('Set' as any);\n const name = this.exprParser.parseIdentifier();\n const params = this.parseParameters();\n this.state.skipNewlines();\n const body = this.parseBlock('End');\n this.state.expect('End' as any);\n this.state.expect('Property' as any);\n\n return {\n type: 'VbPropertySetStatement',\n name,\n params,\n body,\n visibility: visibility as 'public' | 'private',\n loc: createLocation(this.state.previous, this.state.previous),\n };\n }\n\n parseParameters(): VbParameter[] {\n const params: VbParameter[] = [];\n\n if (!this.state.check('LParen' as any)) {\n return params;\n }\n\n this.state.advance();\n\n if (!this.state.check('RParen' as any)) {\n do {\n this.state.skipOptionalNewlines();\n const param = this.parseParameter();\n params.push(param);\n this.state.skipOptionalNewlines();\n } while (this.state.match('Comma' as any));\n }\n\n this.state.expect('RParen' as any);\n return params;\n }\n\n private parseParameter(): VbParameter {\n let byRef = true;\n let isOptional = false;\n let isParamArray = false;\n\n if (this.state.check('Optional' as any)) {\n this.state.advance();\n isOptional = true;\n }\n\n if (this.state.check('ParamArray' as any)) {\n this.state.advance();\n isParamArray = true;\n }\n\n if (this.state.check('ByRef' as any)) {\n this.state.advance();\n byRef = true;\n } else if (this.state.check('ByVal' as any)) {\n this.state.advance();\n byRef = false;\n }\n\n const name = this.exprParser.parseIdentifier();\n let isArray = false;\n let defaultValue: any;\n\n if (this.state.check('LParen' as any)) {\n this.state.advance();\n isArray = true;\n this.state.expect('RParen' as any);\n }\n\n if (this.state.match('Eq' as any)) {\n defaultValue = this.exprParser.parseExpression();\n }\n\n return {\n type: 'VbParameter',\n name,\n byRef,\n isArray,\n defaultValue,\n isOptional,\n isParamArray,\n loc: createLocation({ loc: name.loc! } as Token, this.state.previous),\n };\n }\n\n parseBlock(endKeyword?: string): BlockStatement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (endKeyword && this.state.check(endKeyword as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseClassBody(): VbClassElement[] {\n const body: VbClassElement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('End' as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n if (isVbClassElement(stmt)) {\n body.push(stmt);\n }\n }\n\n return body;\n }\n}\n","import type {\n Statement,\n BlockStatement,\n Expression,\n IfStatement,\n VbForToStatement,\n VbForEachStatement,\n VbDoLoopStatement,\n VbSelectCaseStatement,\n VbCaseClause,\n} from '../ast/index.ts';\nimport type { Token } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { ExpressionParser } from './expression-parser.ts';\nimport { createLocation } from './location.ts';\n\nexport class ControlFlowParser {\n constructor(\n private state: ParserState,\n private exprParser: ExpressionParser,\n private parseStatement: () => Statement\n ) {}\n\n parseIfStatement(): IfStatement {\n const ifToken = this.state.advance();\n const test = this.exprParser.parseExpression();\n this.state.skipOptionalNewlines();\n this.state.expect('Then' as any);\n\n const hasNewlineAfterThen = this.state.checkNewline();\n this.state.skipOptionalNewlines();\n \n if (hasNewlineAfterThen) {\n return this.parseMultiLineIf(ifToken, test);\n }\n\n const consequent = this.parseSingleLineIfBody();\n let alternate: Statement | null = null;\n\n if (this.state.check('Else' as any)) {\n this.state.advance();\n alternate = this.parseSingleLineIfBody();\n }\n\n if (this.state.check('End' as any)) {\n this.state.advance();\n this.state.expect('If' as any);\n }\n\n return {\n type: 'IfStatement',\n test,\n consequent,\n alternate,\n loc: createLocation(ifToken, this.state.previous),\n };\n }\n\n private parseMultiLineIf(ifToken: Token, test: Expression): IfStatement {\n this.state.skipNewlines();\n\n const consequent = this.parseIfBlock();\n let alternate: Statement | null = null;\n\n if (this.state.check('ElseIf' as any)) {\n alternate = this.parseElseIfStatement();\n } else if (this.state.check('Else' as any)) {\n this.state.advance();\n this.state.skipNewlines();\n alternate = this.parseIfBlock();\n }\n\n this.state.expect('End' as any);\n this.state.expect('If' as any);\n\n return {\n type: 'IfStatement',\n test,\n consequent,\n alternate,\n loc: createLocation(ifToken, this.state.previous),\n };\n }\n\n parseForStatement(): Statement {\n const forToken = this.state.advance();\n\n if (this.state.check('Each' as any)) {\n return this.parseForEachStatement(forToken);\n }\n\n return this.parseForToStatement(forToken);\n }\n\n parseDoStatement(): VbDoLoopStatement {\n const doToken = this.state.advance();\n let test: Expression | null = null;\n let testPosition: VbDoLoopStatement['testPosition'] = null;\n\n if (this.state.check('While' as any)) {\n this.state.advance();\n test = this.exprParser.parseExpression();\n testPosition = 'while-do';\n } else if (this.state.check('Until' as any)) {\n this.state.advance();\n test = this.exprParser.parseExpression();\n testPosition = 'until-do';\n }\n\n this.state.skipNewlines();\n const body = this.parseDoBody();\n\n if (this.state.check('While' as any)) {\n this.state.advance();\n test = this.exprParser.parseExpression();\n testPosition = 'do-while';\n } else if (this.state.check('Until' as any)) {\n this.state.advance();\n test = this.exprParser.parseExpression();\n testPosition = 'do-until';\n }\n\n this.state.expect('Loop' as any);\n\n return {\n type: 'VbDoLoopStatement',\n body,\n test,\n testPosition,\n loc: createLocation(doToken, this.state.previous),\n };\n }\n\n parseWhileStatement(): Statement {\n const whileToken = this.state.advance();\n const test = this.exprParser.parseExpression();\n this.state.skipNewlines();\n const body = this.parseWhileBody();\n\n return {\n type: 'WhileStatement',\n test,\n body,\n loc: createLocation(whileToken, this.state.previous),\n };\n }\n\n parseSelectStatement(): VbSelectCaseStatement {\n const selectToken = this.state.advance();\n this.state.expect('Case' as any);\n const discriminant = this.exprParser.parseExpression();\n this.state.skipNewlines();\n\n const cases = this.parseCaseClauses();\n\n this.state.expect('End' as any);\n this.state.expect('Select' as any);\n\n return {\n type: 'VbSelectCaseStatement',\n discriminant,\n cases,\n loc: createLocation(selectToken, this.state.previous),\n };\n }\n\n private parseSingleLineIfBody(): BlockStatement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n if (this.state.checkNewline()) {\n break;\n }\n \n if (this.state.check('Else' as any) || this.state.check('ElseIf' as any)) {\n break;\n }\n\n if (this.state.check('End' as any)) {\n break;\n }\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseIfBlock(): BlockStatement {\n const body: Statement[] = [];\n let nestedIfDepth = 0;\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('If' as any)) {\n const savedPos = this.state.save();\n this.state.advance();\n while (!this.state.isEOF && !this.state.check('Then' as any)) {\n this.state.advance();\n }\n if (this.state.check('Then' as any)) {\n this.state.advance();\n const isSingleLine = !this.state.checkNewline();\n if (isSingleLine) {\n this.state.restore(savedPos);\n const stmt = this.parseStatement();\n body.push(stmt);\n continue;\n } else {\n this.state.restore(savedPos);\n this.state.advance();\n while (!this.state.isEOF && !this.state.check('Then' as any)) {\n this.state.advance();\n }\n this.state.advance();\n nestedIfDepth++;\n continue;\n }\n }\n this.state.restore(savedPos);\n }\n\n if (this.state.check('End' as any)) {\n const savedPos = this.state.save();\n this.state.advance();\n if (this.state.check('If' as any)) {\n if (nestedIfDepth > 0) {\n nestedIfDepth--;\n this.state.restore(savedPos);\n const stmt = this.parseStatement();\n body.push(stmt);\n continue;\n }\n this.state.restore(savedPos);\n break;\n }\n this.state.restore(savedPos);\n }\n\n if (this.state.checkAny('Else' as any, 'ElseIf' as any)) {\n if (nestedIfDepth > 0) {\n const stmt = this.parseStatement();\n body.push(stmt);\n continue;\n }\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseElseIfStatement(): Statement {\n this.state.advance();\n const test = this.exprParser.parseExpression();\n this.state.skipOptionalNewlines();\n this.state.expect('Then' as any);\n this.state.skipNewlines();\n\n const consequent = this.parseIfBlock();\n let alternate: Statement | null = null;\n\n if (this.state.check('ElseIf' as any)) {\n alternate = this.parseElseIfStatement();\n } else if (this.state.check('Else' as any)) {\n this.state.advance();\n this.state.skipNewlines();\n alternate = this.parseIfBlock();\n }\n\n return {\n type: 'IfStatement',\n test,\n consequent,\n alternate,\n loc: createLocation(this.state.previous, this.state.previous),\n };\n }\n\n private parseForToStatement(forToken: Token): VbForToStatement {\n const left = this.exprParser.parseIdentifier();\n this.state.expect('Eq' as any);\n const init = this.exprParser.parseExpression();\n this.state.expect('To' as any);\n const to = this.exprParser.parseExpression();\n\n let step: Expression | null = null;\n if (this.state.match('Step' as any)) {\n step = this.exprParser.parseExpression();\n }\n\n this.state.skipNewlines();\n const body = this.parseForBody();\n\n return {\n type: 'VbForToStatement',\n left,\n init,\n to,\n step,\n body,\n loc: createLocation(forToken, this.state.previous),\n };\n }\n\n private parseForEachStatement(forToken: Token): VbForEachStatement {\n this.state.expect('Each' as any);\n const left = this.exprParser.parseIdentifier();\n this.state.expect('In' as any);\n const right = this.exprParser.parseExpression();\n this.state.skipNewlines();\n const body = this.parseForBody();\n\n return {\n type: 'VbForEachStatement',\n left,\n right,\n body,\n loc: createLocation(forToken, this.state.previous),\n };\n }\n\n private parseForBody(): Statement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('Next' as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n this.state.expect('Next' as any);\n if (this.state.check('Identifier' as any)) {\n this.state.advance();\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseDoBody(): Statement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.checkAny('Loop' as any, 'While' as any, 'Until' as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseWhileBody(): Statement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('Wend' as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n this.state.expect('Wend' as any);\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseCaseClauses(): VbCaseClause[] {\n const cases: VbCaseClause[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('End' as any)) {\n break;\n }\n\n if (this.state.check('Case' as any)) {\n const caseClause = this.parseCaseClause();\n cases.push(caseClause);\n } else {\n break;\n }\n }\n\n return cases;\n }\n\n private parseCaseClause(): VbCaseClause {\n const caseToken = this.state.advance();\n let test: Expression | Expression[] | null = null;\n let isElse = false;\n\n if (this.state.check('Else' as any)) {\n this.state.advance();\n isElse = true;\n } else {\n test = this.parseCaseExpressions();\n }\n\n this.state.skipNewlines();\n const consequent = this.parseCaseBody();\n\n return {\n type: 'VbCaseClause',\n test,\n consequent,\n isElse,\n loc: createLocation(caseToken, this.state.previous),\n };\n }\n\n private parseCaseExpressions(): Expression | Expression[] {\n const expressions: Expression[] = [];\n\n do {\n if (this.state.check('Is' as any)) {\n this.state.advance();\n const op = this.state.advance();\n const value = this.exprParser.parseExpression();\n expressions.push({\n type: 'BinaryExpression',\n operator: this.getComparisonOperator(op),\n left: { type: 'Identifier', name: '__select_expr__' },\n right: value,\n } as Expression);\n } else {\n expressions.push(this.exprParser.parseExpression());\n }\n } while (this.state.match('Comma' as any));\n\n return expressions.length === 1 ? expressions[0] : expressions;\n }\n\n private getComparisonOperator(token: Token): string {\n const opMap: Record<string, string> = {\n 'Eq': '==',\n 'Lt': '<',\n 'Gt': '>',\n 'Le': '<=',\n 'Ge': '>=',\n 'Ne': '!=',\n };\n return opMap[token.type] ?? '==';\n }\n\n private parseCaseBody(): Statement[] {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('Case' as any) || this.state.check('End' as any)) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return body;\n }\n}\n","import type {\n Statement,\n Expression,\n VbWithStatement,\n VbExitStatement,\n VbOptionExplicitStatement,\n} from '../ast/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { ExpressionParser } from './expression-parser.ts';\nimport { createLocation } from './location.ts';\n\nexport class StatementsParser {\n constructor(\n private state: ParserState,\n private exprParser: ExpressionParser,\n private parseStatement: () => Statement\n ) {}\n\n parseWithStatement(): VbWithStatement {\n const withToken = this.state.advance();\n const object = this.exprParser.parseExpression();\n this.state.skipNewlines();\n const body = this.parseWithBody();\n\n this.state.expect('End' as any);\n this.state.expect('With' as any);\n\n return {\n type: 'VbWithStatement',\n object,\n body,\n loc: createLocation(withToken, this.state.previous),\n };\n }\n\n parseExitStatement(): VbExitStatement {\n const exitToken = this.state.advance();\n\n const targetTypes: Record<string, VbExitStatement['target']> = {\n 'Sub': 'Sub',\n 'Function': 'Function',\n 'Property': 'Property',\n 'Do': 'Do',\n 'For': 'For',\n 'Select': 'Select',\n };\n\n const targetToken = this.state.current;\n const target = targetTypes[targetToken.type as string];\n\n if (target) {\n this.state.advance();\n }\n\n return {\n type: 'VbExitStatement',\n target: target ?? 'Sub',\n loc: createLocation(exitToken, this.state.previous),\n };\n }\n\n parseOptionStatement(): VbOptionExplicitStatement {\n const optionToken = this.state.advance();\n this.state.expect('Explicit' as any);\n\n return {\n type: 'VbOptionExplicitStatement',\n loc: createLocation(optionToken, this.state.previous),\n };\n }\n\n parseCallStatement(): Statement {\n const callToken = this.state.advance();\n const callee = this.exprParser.parseMemberExpression();\n\n let args: Expression[] = [];\n if (this.state.check('LParen' as any)) {\n this.state.advance();\n args = this.parseCallArguments();\n this.state.expect('RParen' as any);\n } else if (!this.state.checkAny('Newline' as any, 'Colon' as any, 'EOF' as any)) {\n args = this.parseCallArgumentsNoParens();\n }\n\n return {\n type: 'VbCallStatement',\n callee,\n arguments: args,\n loc: createLocation(callToken, this.state.previous),\n };\n }\n\n parseSetStatement(): Statement {\n const setToken = this.state.advance();\n const left = this.exprParser.parseCallExpression();\n this.state.expect('Eq' as any);\n const right = this.exprParser.parseExpression();\n\n const assignment = {\n type: 'AssignmentExpression',\n operator: '=',\n left: left as Expression,\n right,\n isSet: true,\n loc: createLocation(setToken, this.state.previous),\n } as Expression;\n\n return {\n type: 'ExpressionStatement',\n expression: assignment,\n loc: createLocation(setToken, this.state.previous),\n };\n }\n\n parseOnStatement(): Statement {\n const onToken = this.state.advance();\n this.state.expect('Error' as any);\n\n if (this.state.match('Resume' as any)) {\n this.state.expect('Next' as any);\n return {\n type: 'VbOnErrorHandlerStatement',\n action: 'resume_next',\n loc: createLocation(onToken, this.state.previous),\n };\n }\n\n if (this.state.match('Goto' as any)) {\n if (this.state.check('NumberLiteral' as any)) {\n const numToken = this.state.advance();\n if (String(numToken.value) === '0') {\n return {\n type: 'VbOnErrorHandlerStatement',\n action: 'goto_0',\n loc: createLocation(onToken, this.state.previous),\n };\n }\n }\n const label = this.exprParser.parseIdentifier();\n return {\n type: 'VbOnErrorHandlerStatement',\n action: 'goto_label',\n label,\n loc: createLocation(onToken, this.state.previous),\n };\n }\n\n throw new Error('Expected Resume Next or Goto after On Error');\n }\n\n parseResumeStatement(): Statement {\n const resumeToken = this.state.advance();\n\n if (this.state.match('Next' as any)) {\n return {\n type: 'VbResumeStatement',\n target: 'next',\n loc: createLocation(resumeToken, this.state.previous),\n };\n }\n\n return {\n type: 'VbResumeStatement',\n target: null,\n loc: createLocation(resumeToken, this.state.previous),\n };\n }\n\n parseExpressionStatement(): Statement {\n const expr = this.exprParser.parseStatementExpression();\n\n return {\n type: 'ExpressionStatement',\n expression: expr,\n loc: expr.loc,\n };\n }\n\n private parseWithBody(): Statement {\n const body: Statement[] = [];\n\n while (!this.state.isEOF) {\n this.state.skipStatementSeparators();\n\n if (this.state.check('End' as any) && this.state.peek(1).type === 'With' as any) {\n break;\n }\n\n if (this.state.isEOF) break;\n\n const stmt = this.parseStatement();\n body.push(stmt);\n }\n\n return {\n type: 'BlockStatement',\n body,\n };\n }\n\n private parseCallArguments(): Expression[] {\n const args: Expression[] = [];\n\n if (!this.state.check('RParen' as any)) {\n while (true) {\n this.state.skipOptionalNewlines();\n \n if (this.state.check('RParen' as any)) {\n break;\n }\n \n // Handle empty arguments (consecutive commas)\n if (this.state.check('Comma' as any)) {\n args.push({\n type: 'VbEmptyLiteral',\n value: undefined,\n raw: '',\n loc: this.state.current.loc,\n });\n } else {\n args.push(this.exprParser.parseExpression());\n }\n \n this.state.skipOptionalNewlines();\n \n if (this.state.check('Comma' as any)) {\n this.state.advance();\n } else {\n break;\n }\n }\n }\n\n return args;\n }\n\n private parseCallArgumentsNoParens(): Expression[] {\n const args: Expression[] = [];\n\n while (!this.state.checkAny('Newline' as any, 'Colon' as any, 'EOF' as any)) {\n args.push(this.exprParser.parseExpression());\n if (!this.state.match('Comma' as any)) {\n break;\n }\n }\n\n return args;\n }\n}\n","import type { Statement, VbGotoStatement, VbLabelStatement } from '../ast/index.ts';\nimport type { TokenType } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { ExpressionParser } from './expression-parser.ts';\nimport { DeclarationParser } from './declarations.ts';\nimport { ProcedureParser } from './procedures.ts';\nimport { ControlFlowParser } from './control-flow.ts';\nimport { StatementsParser } from './statements.ts';\nimport { createLocation } from './location.ts';\n\nexport class StatementParser {\n private state: ParserState;\n private exprParser: ExpressionParser;\n private declarationParser: DeclarationParser;\n private procedureParser: ProcedureParser;\n private controlFlowParser: ControlFlowParser;\n private statementsParser: StatementsParser;\n\n constructor(state: ParserState) {\n this.state = state;\n this.exprParser = new ExpressionParser(state);\n \n this.declarationParser = new DeclarationParser(state, this.exprParser);\n this.procedureParser = new ProcedureParser(state, this.exprParser, () => this.parseStatement());\n this.controlFlowParser = new ControlFlowParser(state, this.exprParser, () => this.parseStatement());\n this.statementsParser = new StatementsParser(state, this.exprParser, () => this.parseStatement());\n }\n\n parseStatement(): Statement {\n this.state.skipNewlines();\n\n const token = this.state.current;\n\n switch (token.type) {\n case 'Dim' as TokenType:\n return this.declarationParser.parseDimStatement();\n case 'ReDim' as TokenType:\n return this.declarationParser.parseReDimStatement();\n case 'Erase' as TokenType:\n return this.declarationParser.parseEraseStatement();\n case 'Const' as TokenType:\n return this.declarationParser.parseConstStatement();\n case 'Public' as TokenType:\n return this.parseVisibilityStatement();\n case 'Private' as TokenType:\n return this.parseVisibilityStatement();\n case 'Sub' as TokenType:\n return this.procedureParser.parseSubStatement();\n case 'Function' as TokenType:\n return this.procedureParser.parseFunctionStatement();\n case 'Class' as TokenType:\n return this.procedureParser.parseClassStatement();\n case 'Property' as TokenType:\n return this.procedureParser.parsePropertyStatement();\n case 'If' as TokenType:\n return this.controlFlowParser.parseIfStatement();\n case 'For' as TokenType:\n return this.controlFlowParser.parseForStatement();\n case 'Do' as TokenType:\n return this.controlFlowParser.parseDoStatement();\n case 'While' as TokenType:\n return this.controlFlowParser.parseWhileStatement();\n case 'Select' as TokenType:\n return this.controlFlowParser.parseSelectStatement();\n case 'With' as TokenType:\n return this.statementsParser.parseWithStatement();\n case 'Exit' as TokenType:\n return this.statementsParser.parseExitStatement();\n case 'Option' as TokenType:\n return this.statementsParser.parseOptionStatement();\n case 'Call' as TokenType:\n return this.statementsParser.parseCallStatement();\n case 'Set' as TokenType:\n return this.statementsParser.parseSetStatement();\n case 'On' as TokenType:\n return this.statementsParser.parseOnStatement();\n case 'Resume' as TokenType:\n return this.statementsParser.parseResumeStatement();\n case 'Goto' as TokenType:\n return this.parseGotoStatement();\n case 'Colon' as TokenType:\n this.state.advance();\n return this.parseStatement();\n default:\n if (this.state.checkIdentifier() && this.state.peek(1).type === 'Colon' as TokenType) {\n return this.parseLabelStatement();\n }\n return this.statementsParser.parseExpressionStatement();\n }\n }\n\n private parseGotoStatement(): VbGotoStatement {\n const gotoToken = this.state.advance();\n const label = this.exprParser.parseIdentifier();\n \n return {\n type: 'VbGotoStatement',\n label,\n loc: createLocation(gotoToken, this.state.previous),\n };\n }\n\n private parseLabelStatement(): VbLabelStatement {\n const labelToken = this.state.advance();\n this.state.expect('Colon' as TokenType);\n \n return {\n type: 'VbLabelStatement',\n label: {\n type: 'Identifier',\n name: labelToken.value,\n loc: labelToken.loc,\n },\n loc: createLocation(labelToken, this.state.previous),\n };\n }\n\n private parseVisibilityStatement(): Statement {\n const visibilityToken = this.state.advance();\n const visibility = visibilityToken.type === 'Public' ? 'public' : 'private';\n\n if (this.state.check('Dim' as TokenType)) {\n return this.declarationParser.parsePublicDimStatement();\n }\n\n if (this.state.check('Const' as TokenType)) {\n return visibility === 'public' \n ? this.declarationParser.parsePublicConstStatement()\n : this.declarationParser.parsePrivateConstStatement();\n }\n\n if (this.state.check('Sub' as TokenType)) {\n return this.procedureParser.parseSubStatement(visibility);\n }\n\n if (this.state.check('Function' as TokenType)) {\n return this.procedureParser.parseFunctionStatement(visibility);\n }\n\n if (this.state.check('Property' as TokenType)) {\n return this.procedureParser.parsePropertyStatement(visibility);\n }\n\n if (this.state.checkIdentifier()) {\n const declarations = this.declarationParser.parseVariableDeclarations();\n return {\n type: 'VbDimStatement',\n declarations,\n visibility: visibility as 'public' | 'private',\n loc: { start: visibilityToken.loc.start, end: this.state.previous.loc.end },\n };\n }\n\n throw new Error(`Expected Dim, Const, Sub, Function, or Property after ${visibility}`);\n }\n}\n","import type { Program } from '../ast/index.ts';\nimport type { Token } from '../lexer/index.ts';\nimport { Lexer } from '../lexer/index.ts';\nimport { ParserState } from './parser-state.ts';\nimport { StatementParser } from './statement-parser.ts';\n\nexport interface ParserOptions {\n source?: string;\n}\n\nexport class Parser {\n private state: ParserState;\n private stmtParser: StatementParser;\n\n constructor(tokens: Token[]) {\n this.state = new ParserState(tokens);\n this.stmtParser = new StatementParser(this.state);\n }\n\n parse(): Program {\n const body = [];\n\n while (!this.state.isEOF) {\n this.state.skipNewlines();\n if (this.state.isEOF) break;\n\n const stmt = this.stmtParser.parseStatement();\n body.push(stmt);\n }\n\n const lastToken = this.state.current;\n\n return {\n type: 'Program',\n body,\n sourceType: 'script',\n loc: {\n start: { line: 1, column: 0 },\n end: lastToken.loc.end,\n },\n };\n }\n}\n\nexport function parse(source: string, _options?: ParserOptions): Program {\n const lexer = new Lexer(source);\n const tokens = lexer.tokenize();\n const parser = new Parser(tokens);\n return parser.parse();\n}\n","/**\n * Parser Cache - LRU Cache for Parsed AST\n * \n * Performance improvements:\n * 1. Avoid re-parsing the same code multiple times\n * 2. LRU eviction policy to limit memory usage\n * 3. Hash-based cache key for fast lookup\n */\n\nimport type { Program } from '../ast/index.ts';\n\ninterface CacheEntry {\n ast: Program;\n lastAccessed: number;\n accessCount: number;\n}\n\nexport class ParserCache {\n private cache: Map<string, CacheEntry> = new Map();\n private maxSize: number;\n private defaultTTL: number; // Time to live in milliseconds\n\n constructor(maxSize: number = 100, defaultTTL: number = 5 * 60 * 1000) {\n this.maxSize = maxSize;\n this.defaultTTL = defaultTTL;\n }\n\n /**\n * Generate a simple hash for the source code.\n * Uses a fast djb2-like hash algorithm.\n */\n private hashSource(source: string): string {\n let hash = 5381;\n for (let i = 0; i < source.length; i++) {\n hash = ((hash << 5) + hash) + source.charCodeAt(i)!;\n }\n return hash.toString(36);\n }\n\n /**\n * Get cached AST for a source code string.\n * Returns undefined if not found or expired.\n */\n get(source: string): Program | undefined {\n const key = this.hashSource(source);\n const entry = this.cache.get(key);\n \n if (!entry) {\n return undefined;\n }\n\n // Check if expired\n const now = Date.now();\n if (now - entry.lastAccessed > this.defaultTTL) {\n this.cache.delete(key);\n return undefined;\n }\n\n // Update access stats\n entry.lastAccessed = now;\n entry.accessCount++;\n \n return entry.ast;\n }\n\n /**\n * Store parsed AST in cache.\n */\n set(source: string, ast: Program): void {\n // Evict oldest entries if cache is full\n if (this.cache.size >= this.maxSize) {\n this.evictLRU();\n }\n\n const key = this.hashSource(source);\n const now = Date.now();\n \n this.cache.set(key, {\n ast,\n lastAccessed: now,\n accessCount: 1,\n });\n }\n\n /**\n * Check if source code is in cache.\n */\n has(source: string): boolean {\n const key = this.hashSource(source);\n const entry = this.cache.get(key);\n \n if (!entry) {\n return false;\n }\n\n // Check if expired\n const now = Date.now();\n if (now - entry.lastAccessed > this.defaultTTL) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Evict least recently used entries.\n */\n private evictLRU(): void {\n let oldestKey: string | null = null;\n let oldestTime = Infinity;\n\n for (const [key, entry] of this.cache) {\n if (entry.lastAccessed < oldestTime) {\n oldestTime = entry.lastAccessed;\n oldestKey = key;\n }\n }\n\n if (oldestKey) {\n this.cache.delete(oldestKey);\n }\n }\n\n /**\n * Clear all cached entries.\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics.\n */\n getStats(): {\n size: number;\n maxSize: number;\n totalAccessCount: number;\n averageAccessCount: number;\n } {\n let totalAccessCount = 0;\n for (const entry of this.cache.values()) {\n totalAccessCount += entry.accessCount;\n }\n\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n totalAccessCount,\n averageAccessCount: this.cache.size > 0 ? totalAccessCount / this.cache.size : 0,\n };\n }\n\n /**\n * Clean up expired entries.\n */\n cleanup(): number {\n const now = Date.now();\n let removed = 0;\n\n for (const [key, entry] of this.cache) {\n if (now - entry.lastAccessed > this.defaultTTL) {\n this.cache.delete(key);\n removed++;\n }\n }\n\n return removed;\n }\n}\n\n// Global parser cache instance\nexport const globalParserCache = new ParserCache();\n\n/**\n * Cached parse function that wraps the original parser.\n * Use this instead of the original parse() for better performance.\n */\nexport function parseWithCache(\n source: string,\n parseFn: (source: string) => Program\n): Program {\n // Try to get from cache\n const cached = globalParserCache.get(source);\n if (cached) {\n return cached;\n }\n\n // Parse and cache\n const ast = parseFn(source);\n globalParserCache.set(source, ast);\n return ast;\n}\n","/**\n * Represents all possible VBScript value types.\n * These correspond to the Variant subtypes in VBScript.\n */\nexport type VbValueType =\n | 'Empty'\n | 'Null'\n | 'Boolean'\n | 'Integer'\n | 'Long'\n | 'Single'\n | 'Double'\n | 'Currency'\n | 'Date'\n | 'String'\n | 'Object'\n | 'Error'\n | 'Variant'\n | 'Byte'\n | 'Array';\n\n/** Represents an uninitialized variable in VBScript */\nexport interface VbEmptyValue {\n type: 'Empty';\n value: undefined;\n}\n\n/** Represents a Null value in VBScript (no valid data) */\nexport interface VbNullValue {\n type: 'Null';\n value: null;\n}\n\n/** Represents a Boolean value (True or False) */\nexport interface VbBooleanValue {\n type: 'Boolean';\n value: boolean;\n}\n\n/** Represents a 16-bit signed integer (-32,768 to 32,767) */\nexport interface VbIntegerValue {\n type: 'Integer';\n value: number;\n}\n\n/** Represents a 32-bit signed integer (-2,147,483,648 to 2,147,483,647) */\nexport interface VbLongValue {\n type: 'Long';\n value: number;\n}\n\n/** Represents a single-precision floating-point number */\nexport interface VbSingleValue {\n type: 'Single';\n value: number;\n}\n\n/** Represents a double-precision floating-point number */\nexport interface VbDoubleValue {\n type: 'Double';\n value: number;\n}\n\n/** Represents a currency value (64-bit scaled integer) */\nexport interface VbCurrencyValue {\n type: 'Currency';\n value: number;\n}\n\n/** Represents a date/time value */\nexport interface VbDateValue {\n type: 'Date';\n value: Date;\n}\n\n/** Represents a string value */\nexport interface VbStringValue {\n type: 'String';\n value: string;\n}\n\n/** Represents an unsigned 8-bit integer (0 to 255) */\nexport interface VbByteValue {\n type: 'Byte';\n value: number;\n}\n\nexport interface VbArrayValue {\n type: 'Array';\n value: unknown;\n}\n\n/** Represents an object reference */\nexport interface VbObjectValue {\n type: 'Object';\n value: unknown;\n}\n\n/** Represents an error value */\nexport interface VbErrorValue {\n type: 'Error';\n value: number;\n}\n\n/** Represents a Variant that can hold any type */\nexport interface VbVariantValue {\n type: 'Variant';\n value: unknown;\n}\n\n/**\n * A discriminated union of all VBScript value types.\n * Use the `type` property to determine the actual value type.\n */\nexport type VbValue =\n | VbEmptyValue\n | VbNullValue\n | VbBooleanValue\n | VbIntegerValue\n | VbLongValue\n | VbSingleValue\n | VbDoubleValue\n | VbCurrencyValue\n | VbDateValue\n | VbStringValue\n | VbByteValue\n | VbArrayValue\n | VbObjectValue\n | VbErrorValue\n | VbVariantValue;\n\n/**\n * Represents the data stored in a VBScript object.\n * This can be a class instance, a COM object wrapper, or a JavaScript object proxy.\n */\nexport interface VbObjectValueData {\n type?: string;\n classInfo?: { name: string };\n properties?: Map<string, VbValue>;\n getProperty?: (name: string) => VbValue;\n setProperty?: (name: string, value: VbValue, isSet?: boolean) => void;\n hasMethod?: (name: string) => boolean;\n getMethod?: (name: string) => { func: (...args: VbValue[]) => VbValue };\n call?: (...args: VbValue[]) => VbValue;\n [key: string]: unknown;\n}\n\n/** A singleton representing an Empty value in VBScript */\nexport const VbEmpty: VbEmptyValue = { type: 'Empty', value: undefined };\n\n/** A singleton representing a Null value in VBScript */\nexport const VbNull: VbNullValue = { type: 'Null', value: null };\n\n/** A singleton representing a Nothing object reference in VBScript */\nexport const VbNothing: VbObjectValue = { type: 'Object', value: null };\n\n/**\n * Creates a VbValue from a JavaScript value.\n * Automatically determines the appropriate VBScript type based on the input.\n *\n * @param value - The JavaScript value to convert\n * @returns A VbValue representation\n */\nexport function createVbValue(value: unknown): VbValue {\n if (value === undefined) return VbEmpty;\n if (value === null) return VbNull;\n if (value === Symbol.for('Nothing')) return VbNothing;\n if (typeof value === 'boolean') return { type: 'Boolean', value };\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n if (value >= -32768 && value <= 32767) {\n return { type: 'Integer', value };\n }\n return { type: 'Long', value };\n }\n return { type: 'Double', value };\n }\n if (typeof value === 'string') return { type: 'String', value };\n if (value instanceof Date) return { type: 'Date', value };\n if (Array.isArray(value)) return { type: 'Array', value };\n if (typeof value === 'object') return { type: 'Object', value: value as VbObjectValueData };\n return { type: 'Variant', value };\n}\n\n/**\n * Converts a VbValue to a JavaScript boolean.\n * Follows VBScript type coercion rules.\n *\n * @param value - The VbValue to convert\n * @returns The boolean representation\n * @throws Error if the value cannot be converted (e.g., Null)\n */\nexport function toBoolean(value: VbValue): boolean {\n if (value.type === 'Boolean') return value.value;\n if (value.type === 'Empty') return false;\n if (value.type === 'Null') throw new Error('Type mismatch: Null cannot be converted to Boolean');\n if (value.type === 'String') {\n const str = value.value;\n if (str === '') return false;\n const num = parseFloat(str);\n if (!isNaN(num)) return num !== 0;\n return str.toLowerCase() !== 'false';\n }\n if (\n value.type === 'Integer' ||\n value.type === 'Long' ||\n value.type === 'Double' ||\n value.type === 'Single' ||\n value.type === 'Byte'\n ) {\n return value.value !== 0;\n }\n return true;\n}\n\n/**\n * Converts a VbValue to a JavaScript number.\n * Follows VBScript type coercion rules.\n *\n * @param value - The VbValue to convert\n * @returns The number representation\n * @throws Error if the value cannot be converted\n */\nexport function toNumber(value: VbValue): number {\n if (value.type === 'Empty') return 0;\n if (value.type === 'Null') throw new Error('Type mismatch: Null cannot be converted to Number');\n if (value.type === 'Boolean') return value.value ? -1 : 0;\n if (\n value.type === 'Integer' ||\n value.type === 'Long' ||\n value.type === 'Double' ||\n value.type === 'Single' ||\n value.type === 'Byte' ||\n value.type === 'Currency'\n ) {\n return value.value;\n }\n if (value.type === 'String') {\n const str = value.value.trim();\n if (str === '') return 0;\n const num = parseFloat(str);\n if (isNaN(num)) throw new Error(`Type mismatch: \"${str}\" cannot be converted to Number`);\n return num;\n }\n if (value.type === 'Date') {\n return value.value.getTime();\n }\n throw new Error(`Type mismatch: ${value.type} cannot be converted to Number`);\n}\n\n/**\n * Converts a VbValue to a JavaScript string.\n * Follows VBScript type coercion rules.\n *\n * @param value - The VbValue to convert\n * @returns The string representation\n */\nexport function toString(value: VbValue): string {\n if (value.type === 'Empty') return '';\n if (value.type === 'Null') return 'Null';\n if (value.type === 'Boolean') return value.value ? 'True' : 'False';\n if (value.type === 'String') return value.value;\n if (value.type === 'Integer' || value.type === 'Long' || value.type === 'Byte') {\n return String(Math.floor(value.value));\n }\n if (value.type === 'Double' || value.type === 'Single' || value.type === 'Currency') {\n return String(value.value);\n }\n if (value.type === 'Date') {\n return value.value.toLocaleString();\n }\n if (value.type === 'Object') {\n return value.value === null ? 'Nothing' : '[object]';\n }\n if (value.type === 'Array') {\n return '[array]';\n }\n return String(value.value);\n}\n\n/**\n * Converts a VbValue to a JavaScript Date object.\n * Handles VBScript date serial numbers and string date formats.\n *\n * @param value - The VbValue to convert\n * @returns The Date representation\n * @throws Error if the value cannot be converted to a date\n */\nexport function toVbDate(value: VbValue): Date {\n if (value.type === 'Date') return value.value;\n if (value.type === 'String') {\n const str = value.value;\n const date = new Date(str);\n if (isNaN(date.getTime())) {\n throw new Error(`Type mismatch: \"${str}\" cannot be converted to Date`);\n }\n return date;\n }\n if (value.type === 'Double' || value.type === 'Single') {\n const serial = value.value;\n const baseDate = new Date(1899, 11, 30);\n return new Date(baseDate.getTime() + serial * 86400000);\n }\n throw new Error(`Type mismatch: ${value.type} cannot be converted to Date`);\n}\n\n/**\n * Checks if a VbValue can be interpreted as a numeric value.\n * Equivalent to VBScript's IsNumeric function.\n *\n * @param value - The VbValue to check\n * @returns True if the value is numeric or can be converted to a number\n */\nexport function isNumeric(value: VbValue): boolean {\n if (\n value.type === 'Integer' ||\n value.type === 'Long' ||\n value.type === 'Double' ||\n value.type === 'Single' ||\n value.type === 'Currency' ||\n value.type === 'Byte'\n ) {\n return true;\n }\n if (value.type === 'String') {\n const str = value.value.trim();\n if (str === '') return false;\n return !isNaN(parseFloat(str));\n }\n if (value.type === 'Boolean') return true;\n if (value.type === 'Empty') return true;\n return false;\n}\n\n/** Checks if a VbValue is Empty (uninitialized) */\nexport function isEmpty(value: VbValue): boolean {\n return value.type === 'Empty';\n}\n\n/** Checks if a VbValue is Null */\nexport function isNull(value: VbValue): boolean {\n return value.type === 'Null';\n}\n\n/** Checks if a VbValue is an Object */\nexport function isObject(value: VbValue): boolean {\n return value.type === 'Object';\n}\n\n/** Checks if a VbValue is an Array */\nexport function isArray(value: VbValue): boolean {\n return value.type === 'Array';\n}\n\n/**\n * Gets the numeric value from a VbValue, converting if necessary.\n * @param value - The VbValue to get the numeric value from\n * @returns The numeric value\n */\nexport function getNumericValue(value: VbValue): number {\n switch (value.type) {\n case 'Integer':\n case 'Long':\n case 'Double':\n case 'Single':\n case 'Byte':\n case 'Currency':\n return value.value;\n default:\n return toNumber(value);\n }\n}\n\n/**\n * Gets the string value from a VbValue, converting if necessary.\n * @param value - The VbValue to get the string value from\n * @returns The string value\n */\nexport function getStringValue(value: VbValue): string {\n if (value.type === 'String') return value.value;\n return toString(value);\n}\n\n/**\n * Gets the boolean value from a VbValue, converting if necessary.\n * @param value - The VbValue to get the boolean value from\n * @returns The boolean value\n */\nexport function getBooleanValue(value: VbValue): boolean {\n if (value.type === 'Boolean') return value.value;\n return toBoolean(value);\n}\n","import type { VbValue } from './values.ts';\n\nexport class VbVariable {\n constructor(\n public name: string,\n public value: VbValue,\n public isByRef: boolean = false,\n public isArray: boolean = false,\n public isConst: boolean = false\n ) {}\n}\n\nexport class Vbscope {\n private variables: Map<string, VbVariable> = new Map();\n public parent: Vbscope | null;\n\n constructor(parent: Vbscope | null = null) {\n this.parent = parent;\n }\n\n declare(name: string, value: VbValue, options: Partial<VbVariable> = {}): VbVariable {\n const variable = new VbVariable(\n name,\n value,\n options.isByRef ?? false,\n options.isArray ?? false,\n options.isConst ?? false\n );\n this.variables.set(name.toLowerCase(), variable);\n return variable;\n }\n\n get(name: string): VbVariable | undefined {\n const lowerName = name.toLowerCase();\n const variable = this.variables.get(lowerName);\n if (variable) return variable;\n if (this.parent) return this.parent.get(name);\n return undefined;\n }\n\n set(name: string, value: VbValue): void {\n const lowerName = name.toLowerCase();\n const variable = this.variables.get(lowerName);\n if (variable) {\n if (variable.isConst) {\n throw new Error(`Cannot assign to constant '${name}'`);\n }\n variable.value = value;\n return;\n }\n if (this.parent) {\n this.parent.set(name, value);\n return;\n }\n this.declare(name, value);\n }\n\n has(name: string): boolean {\n const lowerName = name.toLowerCase();\n if (this.variables.has(lowerName)) return true;\n if (this.parent) return this.parent.has(name);\n return false;\n }\n\n getParent(): Vbscope | null {\n return this.parent;\n }\n\n getAllVariables(): Map<string, VbVariable> {\n const all = new Map<string, VbVariable>();\n if (this.parent) {\n const parentVars = this.parent.getAllVariables();\n parentVars.forEach((v, k) => all.set(k, v));\n }\n this.variables.forEach((v, k) => all.set(k, v));\n return all;\n }\n}\n","import type { VbValue } from './values.ts';\nimport { VbEmpty } from './values.ts';\n\nexport type VbFunction = (...args: VbValue[]) => VbValue;\nexport type VbSub = (...args: VbValue[]) => void;\nexport type VbUserFunction = (args: VbValue[]) => VbValue;\n\nexport interface VbParameterInfo {\n name: string;\n byRef: boolean;\n isArray: boolean;\n}\n\nexport interface VbFunctionInfo {\n name: string;\n func: VbFunction | VbSub | VbUserFunction;\n isSub: boolean;\n minArgs: number;\n maxArgs: number;\n params: VbParameterInfo[];\n isUserDefined: boolean;\n}\n\nexport interface VbArgumentRef {\n value: VbValue;\n variableName?: string;\n setValue?: (value: VbValue) => void;\n}\n\nexport class VbFunctionRegistry {\n private functions: Map<string, VbFunctionInfo> = new Map();\n\n register(name: string, func: VbFunction | VbSub | VbUserFunction, options: Partial<VbFunctionInfo> = {}): void {\n const lowerName = name.toLowerCase();\n this.functions.set(lowerName, {\n name,\n func,\n isSub: options.isSub ?? false,\n minArgs: options.minArgs ?? 0,\n maxArgs: options.maxArgs ?? Infinity,\n params: options.params ?? [],\n isUserDefined: options.isUserDefined ?? false,\n });\n }\n\n get(name: string): VbFunctionInfo | undefined {\n return this.functions.get(name.toLowerCase());\n }\n\n has(name: string): boolean {\n return this.functions.has(name.toLowerCase());\n }\n\n call(name: string, args: VbValue[]): VbValue {\n const info = this.functions.get(name.toLowerCase());\n if (!info) {\n throw new Error(`Undefined function or sub: ${name}`);\n }\n\n if (args.length < info.minArgs) {\n throw new Error(`${name} requires at least ${info.minArgs} argument(s)`);\n }\n\n if (args.length > info.maxArgs) {\n throw new Error(`${name} accepts at most ${info.maxArgs} argument(s)`);\n }\n\n let result: VbValue;\n if (info.isUserDefined) {\n result = (info.func as VbUserFunction)(args);\n } else {\n result = (info.func as VbFunction)(...args);\n }\n \n if (info.isSub) {\n return VbEmpty;\n }\n\n return result ?? VbEmpty;\n }\n\n callWithRefs(name: string, args: VbArgumentRef[]): VbValue {\n const info = this.functions.get(name.toLowerCase());\n if (!info) {\n throw new Error(`Undefined function or sub: ${name}`);\n }\n\n if (args.length < info.minArgs) {\n throw new Error(`${name} requires at least ${info.minArgs} argument(s)`);\n }\n\n if (args.length > info.maxArgs) {\n throw new Error(`${name} accepts at most ${info.maxArgs} argument(s)`);\n }\n\n const values = args.map(arg => arg.value);\n \n let result: VbValue;\n if (info.isUserDefined) {\n result = (info.func as VbUserFunction)(values);\n } else {\n result = (info.func as VbFunction)(...values);\n }\n \n for (let i = 0; i < args.length && i < info.params.length; i++) {\n const param = info.params[i];\n const arg = args[i];\n if (param && arg && param.byRef && arg.setValue && values[i] !== arg.value) {\n arg.setValue(values[i]!);\n }\n }\n \n if (info.isSub) {\n return VbEmpty;\n }\n\n return result ?? VbEmpty;\n }\n\n getAll(): IterableIterator<[string, VbFunctionInfo]> {\n return this.functions.entries();\n }\n\n getUserDefinedFunctions(): Map<string, VbFunctionInfo> {\n const result = new Map<string, VbFunctionInfo>();\n for (const [name, info] of this.functions.entries()) {\n if (info.isUserDefined) {\n result.set(name, info);\n }\n }\n return result;\n }\n}\n","import type { VbValue } from './values.ts';\nimport { VbEmpty } from './values.ts';\n\nexport type VbPropertyGetter = () => VbValue;\nexport type VbPropertySetter = (value: VbValue) => void;\n\nexport interface VbProperty {\n name: string;\n get?: VbPropertyGetter;\n let?: VbPropertySetter;\n set?: VbPropertySetter;\n}\n\nexport interface VbMethodInfo {\n name: string;\n func: (...args: VbValue[]) => VbValue;\n isSub: boolean;\n}\n\nexport class VbClass {\n constructor(\n public name: string,\n public properties: Map<string, VbProperty> = new Map(),\n public methods: Map<string, VbMethodInfo> = new Map(),\n public initializer?: (instance: VbObjectInstance) => void\n ) {}\n}\n\nexport class VbObjectInstance {\n private properties: Map<string, VbValue> = new Map();\n private propertyAccessors: Map<string, VbProperty> = new Map();\n\n constructor(\n public classInfo: VbClass,\n public prototype: VbObjectInstance | null = null\n ) {\n if (classInfo.initializer) {\n classInfo.initializer(this);\n }\n classInfo.properties.forEach((prop, name) => {\n this.propertyAccessors.set(name.toLowerCase(), prop);\n if (!prop.get && !prop.let && !prop.set) {\n this.properties.set(name.toLowerCase(), VbEmpty);\n }\n });\n }\n\n getProperty(name: string): VbValue {\n const lowerName = name.toLowerCase();\n const accessor = this.propertyAccessors.get(lowerName);\n if (accessor?.get) {\n return accessor.get.call(this);\n }\n if (accessor && !accessor.get && !accessor.let && !accessor.set) {\n const value = this.properties.get(lowerName);\n if (value !== undefined) {\n return value;\n }\n }\n const value = this.properties.get(lowerName);\n if (value !== undefined) {\n return value;\n }\n if (this.prototype) {\n return this.prototype.getProperty(name);\n }\n return VbEmpty;\n }\n\n setProperty(name: string, value: VbValue, isSet: boolean = false): void {\n const lowerName = name.toLowerCase();\n const accessor = this.propertyAccessors.get(lowerName);\n if (accessor) {\n if (isSet && accessor.set) {\n accessor.set.call(this, value);\n return;\n }\n if (!isSet && accessor.let) {\n accessor.let.call(this, value);\n return;\n }\n if (!accessor.get && !accessor.let && !accessor.set) {\n this.properties.set(lowerName, value);\n return;\n }\n }\n this.properties.set(lowerName, value);\n }\n\n hasProperty(name: string): boolean {\n const lowerName = name.toLowerCase();\n const has = this.properties.has(lowerName) || \n this.propertyAccessors.has(lowerName) ||\n (this.prototype?.hasProperty(name) ?? false);\n return has;\n }\n\n getMethod(name: string): VbMethodInfo | undefined {\n return this.classInfo.methods.get(name.toLowerCase());\n }\n\n hasMethod(name: string): boolean {\n return this.classInfo.methods.has(name.toLowerCase());\n }\n\n setPropertiesFromObject(obj: Record<string, unknown>): void {\n for (const [k, v] of Object.entries(obj)) {\n this.properties.set(k.toLowerCase(), v as VbValue);\n }\n }\n}\n\nexport class VbClassRegistry {\n private classes: Map<string, VbClass> = new Map();\n\n register(cls: VbClass): void {\n this.classes.set(cls.name.toLowerCase(), cls);\n }\n\n registerClass(name: string, creator: () => VbValue): void {\n const cls = new VbClass(name);\n cls.initializer = (instance: VbObjectInstance) => {\n const value = creator();\n if (value.type === 'Object' && value.value) {\n const obj = value.value as Record<string, unknown>;\n instance.setPropertiesFromObject(obj);\n }\n };\n this.classes.set(name.toLowerCase(), cls);\n }\n\n get(name: string): VbClass | undefined {\n return this.classes.get(name.toLowerCase());\n }\n\n has(name: string): boolean {\n return this.classes.has(name.toLowerCase());\n }\n\n createInstance(name: string, _args: VbValue[]): VbObjectInstance {\n const cls = this.classes.get(name.toLowerCase());\n if (!cls) {\n throw new Error(`Undefined class: ${name}`);\n }\n\n const instance = new VbObjectInstance(cls);\n\n const initMethod = cls.methods.get('class_initialize');\n if (initMethod) {\n initMethod.func.call(instance);\n }\n\n const initProperty = cls.properties.get('class_initialize');\n if (initProperty && initProperty.get) {\n initProperty.get.call(instance);\n }\n\n return instance;\n }\n}\n","import type { VbValue } from './values.ts';\nimport { VbEmpty } from './values.ts';\n\nexport class VbArray {\n private data: VbValue[];\n private dimensions: number[];\n private lowerBounds: number[];\n\n constructor(dimensions: number[], lowerBounds?: number[]) {\n this.dimensions = dimensions;\n this.lowerBounds = lowerBounds ?? dimensions.map(() => 0);\n \n const totalSize = dimensions.reduce((a, b) => a * b, 1);\n this.data = new Array(totalSize).fill(VbEmpty);\n }\n\n private getIndex(indices: number[]): number {\n if (indices.length !== this.dimensions.length) {\n throw new Error(`Array has ${this.dimensions.length} dimension(s), but ${indices.length} index(es) provided`);\n }\n\n let index = 0;\n let multiplier = 1;\n\n for (let i = this.dimensions.length - 1; i >= 0; i--) {\n const lowerBound = this.lowerBounds[i]!;\n const dimension = this.dimensions[i]!;\n const idx = indices[i]! - lowerBound;\n if (idx < 0 || idx >= dimension) {\n throw new Error('Subscript out of range');\n }\n index += idx * multiplier;\n multiplier *= dimension;\n }\n\n return index;\n }\n\n get(indices: number[]): VbValue {\n return this.data[this.getIndex(indices)] ?? VbEmpty;\n }\n\n set(indices: number[], value: VbValue): void {\n this.data[this.getIndex(indices)] = value;\n }\n\n getDimensions(): number {\n return this.dimensions.length;\n }\n\n getBounds(dimension: number): { lower: number; upper: number } {\n if (dimension < 1 || dimension > this.dimensions.length) {\n throw new Error('Invalid dimension');\n }\n const idx = dimension - 1;\n const lower = this.lowerBounds[idx]!;\n const dim = this.dimensions[idx]!;\n return {\n lower,\n upper: lower + dim - 1,\n };\n }\n\n redim(dimensions: number[], preserve: boolean): void {\n const newData = new Array(dimensions.reduce((a, b) => a * b, 1)).fill(VbEmpty);\n \n if (preserve) {\n const minSize = Math.min(this.data.length, newData.length);\n for (let i = 0; i < minSize; i++) {\n newData[i] = this.data[i];\n }\n }\n\n this.dimensions = dimensions;\n this.data = newData;\n }\n\n toArray(): VbValue[] {\n return [...this.data];\n }\n\n /**\n * Erase the array - reset all elements to Empty\n * For fixed-size arrays: clears all elements but keeps dimensions\n * For dynamic arrays: would normally deallocate, but we just clear\n */\n erase(): void {\n this.data.fill(VbEmpty);\n }\n}\n\nexport function createVbArray(bounds: number[]): VbArray {\n const dimensions = bounds.map(b => b + 1);\n return new VbArray(dimensions);\n}\n\nexport function createVbArrayFromValues(values: VbValue[]): VbArray {\n const arr = new VbArray([values.length]);\n values.forEach((v, i) => arr.set([i], v));\n return arr;\n}\n","export class VbError extends Error {\n public number: number;\n public source: string;\n public description: string;\n public helpFile?: string;\n public helpContext?: number;\n\n constructor(number: number, description: string, source: string = '') {\n super(description);\n this.name = 'VbError';\n this.number = number;\n this.source = source;\n this.description = description;\n }\n\n static fromError(error: Error): VbError {\n if (error instanceof VbError) {\n return error;\n }\n return new VbError(440, error.message, 'Vbscript');\n }\n}\n\nexport const VbErrorCodes = {\n TypeMismatch: 13,\n SubscriptOutOfRange: 9,\n OutOfMemory: 7,\n DivisionByZero: 11,\n Overflow: 6,\n InvalidProcedureCall: 5,\n ObjectRequired: 424,\n ObjectDoesntSupportPropertyOrMethod: 438,\n VariableNotDefined: 500,\n InvalidQualifier: 450,\n PermissionDenied: 70,\n FileNotFound: 53,\n PathNotFound: 76,\n DeviceIOError: 57,\n FileAlreadyExists: 58,\n DiskFull: 61,\n BadFileNameOrNumber: 52,\n TooManyFiles: 67,\n DeviceUnavailable: 68,\n};\n\nexport function createVbError(code: number, description: string, source?: string): VbError {\n return new VbError(code, description, source);\n}\n","import type { VbValue, VbObjectValueData } from './values.ts';\nimport { VbEmpty } from './values.ts';\nimport { Vbscope } from './scope.ts';\nimport { VbFunctionRegistry } from './function-registry.ts';\nimport { VbClassRegistry, VbObjectInstance } from './class-registry.ts';\nimport { VbError } from './errors.ts';\n\nfunction jsToVb(value: unknown, thisArg?: unknown): VbValue {\n if (value === undefined) return { type: 'Empty', value: undefined };\n if (value === null) return { type: 'Null', value: null };\n if (typeof value === 'boolean') return { type: 'Boolean', value };\n if (typeof value === 'number') {\n if (Number.isInteger(value) && value >= -2147483648 && value <= 2147483647) {\n return { type: 'Long', value };\n }\n return { type: 'Double', value };\n }\n if (typeof value === 'string') return { type: 'String', value };\n if (value instanceof Date) return { type: 'Date', value };\n if (Array.isArray(value)) {\n return { type: 'Array', value };\n }\n if (typeof value === 'function') {\n return { type: 'Object', value: { type: 'jsfunction', func: value as (...args: unknown[]) => unknown, thisArg: thisArg ?? null } };\n }\n if (typeof value === 'object') {\n return { type: 'Object', value: value as VbObjectValueData };\n }\n return { type: 'String', value: String(value) };\n}\n\nexport class VbContext {\n public globalScope: Vbscope;\n public currentScope: Vbscope;\n public functionRegistry: VbFunctionRegistry;\n public classRegistry: VbClassRegistry;\n public optionExplicit: boolean = false;\n public onErrorResumeNext: boolean = false;\n public lastError: VbError | null = null;\n public err: { number: number; description: string; source: string } = {\n number: 0,\n description: '',\n source: '',\n };\n public currentInstance: VbObjectInstance | null = null;\n public inPropertyGet: boolean = false;\n public propertyGetName: string = '';\n public evaluate: ((code: string) => VbValue) | null = null;\n public checkTimeout: (() => void) | null = null;\n public execute: ((code: string) => VbValue) | null = null;\n public executeGlobal: ((code: string) => VbValue) | null = null;\n\n private withStack: VbValue[] = [];\n private callStack: string[] = [];\n private exitFlag: 'none' | 'sub' | 'function' | 'property' | 'do' | 'for' | 'select' = 'none';\n\n constructor() {\n this.globalScope = new Vbscope();\n this.currentScope = this.globalScope;\n this.functionRegistry = new VbFunctionRegistry();\n this.classRegistry = new VbClassRegistry();\n }\n\n pushScope(): Vbscope {\n const scope = new Vbscope(this.currentScope);\n this.currentScope = scope;\n return scope;\n }\n\n popScope(): void {\n if (this.currentScope.parent) {\n this.currentScope = this.currentScope.parent;\n }\n }\n\n pushWith(obj: VbValue): void {\n this.withStack.push(obj);\n }\n\n popWith(): void {\n this.withStack.pop();\n }\n\n getCurrentWith(): VbValue | undefined {\n return this.withStack[this.withStack.length - 1];\n }\n\n pushCall(name: string): void {\n this.callStack.push(name);\n }\n\n popCall(): void {\n this.callStack.pop();\n }\n\n getCurrentCall(): string | undefined {\n return this.callStack[this.callStack.length - 1];\n }\n\n setExitFlag(flag: typeof this.exitFlag): void {\n this.exitFlag = flag;\n }\n\n getExitFlag(): typeof this.exitFlag {\n return this.exitFlag;\n }\n\n clearExitFlag(): void {\n this.exitFlag = 'none';\n }\n\n setError(error: VbError): void {\n this.lastError = error;\n this.err.number = error.number;\n this.err.description = error.description;\n this.err.source = error.source;\n }\n\n clearError(): void {\n this.lastError = null;\n this.err.number = 0;\n this.err.description = '';\n this.err.source = '';\n }\n\n declareVariable(name: string, value: VbValue = VbEmpty): void {\n this.currentScope.declare(name, value);\n }\n\n getVariable(name: string): VbValue {\n if (this.currentInstance) {\n if (this.currentInstance.hasProperty(name)) {\n return this.currentInstance.getProperty(name);\n }\n }\n \n const variable = this.currentScope.get(name);\n if (variable) {\n return variable.value;\n }\n\n const lowerName = name.toLowerCase();\n for (const key of Object.keys(globalThis)) {\n if (key.toLowerCase() === lowerName) {\n const value = (globalThis as Record<string, unknown>)[key];\n return jsToVb(value, globalThis);\n }\n }\n\n const globalKeys = ['eval', 'parseInt', 'parseFloat', 'isNaN', 'isFinite', 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape'];\n for (const key of globalKeys) {\n if (key.toLowerCase() === lowerName && key in globalThis) {\n const value = (globalThis as Record<string, unknown>)[key];\n return jsToVb(value, globalThis);\n }\n }\n \n if (this.optionExplicit) {\n throw new VbError(500, `Variable is undefined: '${name}'`, 'Vbscript');\n }\n return VbEmpty;\n }\n\n setVariable(name: string, value: VbValue): void {\n if (this.inPropertyGet && name.toLowerCase() === this.propertyGetName) {\n this.currentScope.set(name, value);\n return;\n }\n \n if (this.currentInstance && this.currentInstance.hasProperty(name)) {\n this.currentInstance.setProperty(name, value);\n return;\n }\n \n if (this.optionExplicit && !this.currentScope.has(name)) {\n const lowerName = name.toLowerCase();\n if (!(lowerName in globalThis)) {\n throw new VbError(500, `Variable is undefined: '${name}'`, 'Vbscript');\n }\n }\n \n this.currentScope.set(name, value);\n }\n\n hasVariable(name: string): boolean {\n if (this.currentScope.has(name)) return true;\n const lowerName = name.toLowerCase();\n return lowerName in globalThis;\n }\n}\n","/**\n * Value Pool - Flyweight Pattern for Common VBScript Values\n * \n * Caches frequently used VbValue objects to avoid repeated allocations.\n * This significantly reduces GC pressure for common values like:\n * - Small integers (-128 to 127)\n * - Empty, Null, Nothing\n * - Common booleans\n * - Empty string\n */\n\nimport type { VbValue, VbLongValue, VbBooleanValue, VbStringValue } from './values.ts';\nimport { VbEmpty, VbNull, VbNothing } from './values.ts';\n\n// Cache for small integers (common loop counters, indices)\nconst SMALL_INT_MIN = -128;\nconst SMALL_INT_MAX = 127;\nconst smallIntCache: VbLongValue[] = [];\n\n// Initialize small integer cache\nfor (let i = SMALL_INT_MIN; i <= SMALL_INT_MAX; i++) {\n smallIntCache[i - SMALL_INT_MIN] = { type: 'Long', value: i };\n}\n\n// Common boolean values\nconst VbTrue: VbBooleanValue = { type: 'Boolean', value: true };\nconst VbFalse: VbBooleanValue = { type: 'Boolean', value: false };\n\n// Empty string\nconst VbEmptyString: VbStringValue = { type: 'String', value: '' };\n\n// Common string cache (frequently used strings)\nconst commonStringCache: Map<string, VbStringValue> = new Map();\n\n/**\n * Get a cached VbValue for small integers.\n * Returns cached value if in range, otherwise creates new value.\n */\nexport function getCachedLong(value: number): VbLongValue {\n if (value >= SMALL_INT_MIN && value <= SMALL_INT_MAX && Number.isInteger(value)) {\n return smallIntCache[value - SMALL_INT_MIN]!;\n }\n return { type: 'Long', value };\n}\n\n/**\n * Get a cached boolean value.\n */\nexport function getCachedBoolean(value: boolean): VbBooleanValue {\n return value ? VbTrue : VbFalse;\n}\n\n/**\n * Get a cached string value.\n * Empty string is always cached, other strings may be cached if commonly used.\n */\nexport function getCachedString(value: string): VbStringValue {\n if (value === '') {\n return VbEmptyString;\n }\n \n // Check common string cache\n const cached = commonStringCache.get(value);\n if (cached) {\n return cached;\n }\n \n // For short strings (likely identifiers), cache them\n if (value.length <= 32) {\n const newValue: VbStringValue = { type: 'String', value };\n commonStringCache.set(value, newValue);\n return newValue;\n }\n \n return { type: 'String', value };\n}\n\n/**\n * Pre-cache common strings (keywords, common variable names, etc.)\n */\nexport function preCacheCommonStrings(strings: string[]): void {\n for (const str of strings) {\n if (!commonStringCache.has(str)) {\n commonStringCache.set(str, { type: 'String', value: str });\n }\n }\n}\n\n/**\n * Create a VbValue with caching for common types.\n * This is a drop-in replacement for createVbValue that uses caching.\n */\nexport function createCachedVbValue(value: unknown): VbValue {\n if (value === undefined) return VbEmpty;\n if (value === null) return VbNull;\n if (value === Symbol.for('Nothing')) return VbNothing;\n if (typeof value === 'boolean') return getCachedBoolean(value);\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n if (value >= -32768 && value <= 32767) {\n // Use Long type for integers in VBScript Integer range\n if (value >= SMALL_INT_MIN && value <= SMALL_INT_MAX) {\n return getCachedLong(value);\n }\n return { type: 'Integer', value };\n }\n // Use cached Long for small integers, new Long for larger\n return getCachedLong(value);\n }\n return { type: 'Double', value };\n }\n if (typeof value === 'string') return getCachedString(value);\n if (value instanceof Date) return { type: 'Date', value };\n if (Array.isArray(value)) return { type: 'Array', value };\n if (typeof value === 'object') return { type: 'Object', value };\n return { type: 'Variant', value };\n}\n\n// Pre-cache common VBScript keywords and identifiers\nconst COMMON_VBSCRIPT_STRINGS = [\n 'true', 'false', 'empty', 'null', 'nothing',\n 'dim', 'redim', 'const', 'public', 'private',\n 'sub', 'function', 'class', 'end', 'exit',\n 'if', 'then', 'else', 'elseif',\n 'for', 'next', 'to', 'step', 'each', 'in',\n 'do', 'loop', 'while', 'until', 'wend',\n 'select', 'case', 'default',\n 'and', 'or', 'not', 'xor', 'eqv', 'imp',\n 'new', 'set', 'call', 'byval', 'byref',\n 'option', 'explicit', 'on', 'error', 'resume',\n 'with', 'property', 'get', 'let',\n 'msgbox', 'inputbox',\n 'i', 'j', 'k', 'n', 'x', 'y', 'z',\n 'count', 'index', 'item', 'key', 'value',\n 'name', 'text', 'data', 'result',\n 'obj', 'arr', 'str', 'num', 'val',\n 'document', 'window', 'console',\n];\n\n// Initialize common strings cache\npreCacheCommonStrings(COMMON_VBSCRIPT_STRINGS);\n\nexport { VbEmpty, VbNull, VbNothing, VbTrue, VbFalse, VbEmptyString };\n","import type {\n Expression,\n Program,\n Identifier,\n Literal,\n MemberExpression,\n BinaryExpression,\n UnaryExpression,\n LogicalExpression,\n AssignmentExpression,\n ConditionalExpression,\n ThisExpression,\n VbNewExpression,\n VbWithObjectExpression,\n} from '../ast/index.ts';\nimport type {\n VbValue,\n VbObjectValue,\n VbObjectValueData,\n VbArrayValue,\n VbBooleanValue,\n VbLongValue,\n} from '../runtime/index.ts';\nimport { VbContext, VbObjectInstance } from '../runtime/index.ts';\nimport { createVbValue, VbEmpty, VbNull, toBoolean, toNumber, toString, createVbError, VbErrorCodes } from '../runtime/index.ts';\n\ninterface VbMethodObject {\n type: 'method';\n object: VbObjectValueData & { getMethod: (name: string) => { func: (...args: VbValue[]) => VbValue } };\n method: string;\n}\n\ninterface VbJsFunctionObject {\n type: 'jsfunction';\n func: (...args: unknown[]) => unknown;\n thisArg: unknown;\n}\n\nfunction isVbMethodObject(obj: VbObjectValueData): obj is VbObjectValueData & VbMethodObject {\n return obj.type === 'method' && 'object' in obj && 'method' in obj;\n}\n\nfunction isVbJsFunctionObject(obj: VbObjectValueData): obj is VbObjectValueData & VbJsFunctionObject {\n return obj.type === 'jsfunction' && 'func' in obj;\n}\n\nexport class ExpressionEvaluator {\n constructor(private context: VbContext) {}\n\n evaluateProgram(program: Program): VbValue {\n let result: VbValue = VbEmpty;\n for (const stmt of program.body) {\n if (stmt.type === 'ExpressionStatement') {\n result = this.evaluate((stmt as { expression: Expression }).expression);\n } else {\n result = this.evaluate(stmt as unknown as Expression);\n }\n }\n return result;\n }\n\n evaluate(node: Expression): VbValue {\n switch (node.type) {\n case 'Identifier':\n return this.evaluateIdentifier(node);\n case 'Literal':\n return this.evaluateLiteral(node);\n case 'VbEmptyLiteral':\n return VbEmpty;\n case 'VbNewExpression':\n return this.evaluateNew(node);\n case 'ThisExpression':\n return this.evaluateMe(node);\n case 'VbWithObject':\n return this.evaluateWithObject(node);\n case 'MemberExpression':\n return this.evaluateMember(node);\n case 'CallExpression':\n return this.evaluateCallInternal(node.callee as Expression, node.arguments);\n case 'BinaryExpression':\n return this.evaluateBinary(node);\n case 'UnaryExpression':\n return this.evaluateUnary(node);\n case 'LogicalExpression':\n return this.evaluateLogical(node);\n case 'AssignmentExpression':\n return this.evaluateAssignment(node);\n case 'ConditionalExpression':\n return this.evaluateConditional(node);\n default:\n return VbEmpty;\n }\n }\n\n evaluateCall(callee: Expression, args: Expression[]): VbValue {\n return this.evaluateCallInternal(callee, args);\n }\n\n private evaluateIdentifier(node: Identifier): VbValue {\n const name = node.name;\n\n if (this.context.functionRegistry.has(name)) {\n return this.context.functionRegistry.call(name, []);\n }\n\n return this.context.getVariable(name);\n }\n\n private evaluateLiteral(node: Literal): VbValue {\n return createVbValue(node.value);\n }\n\n private evaluateNew(node: VbNewExpression): VbObjectValue {\n const className = node.callee.name;\n const args = node.arguments.map(arg => this.evaluate(arg));\n const instance = this.context.classRegistry.createInstance(className, args);\n return { type: 'Object', value: instance };\n }\n\n private evaluateMe(_node: ThisExpression): VbObjectValue {\n if (this.context.currentInstance) {\n return { type: 'Object', value: this.context.currentInstance };\n }\n throw new Error('Me keyword not supported outside of class context');\n }\n\n private evaluateWithObject(_node: VbWithObjectExpression): VbValue {\n const withObject = this.context.getCurrentWith();\n if (!withObject) {\n throw new Error('With object not available - must be inside a With statement');\n }\n return withObject;\n }\n\n private evaluateMember(node: MemberExpression): VbValue {\n let object = this.evaluate(node.object as Expression);\n\n if (node.object.type === 'VbWithObject') {\n object = this.evaluateWithObject(node.object as VbWithObjectExpression);\n }\n\n let propertyName: string;\n if (node.computed) {\n const propValue = this.evaluate(node.property as Expression);\n propertyName = toString(propValue);\n } else {\n propertyName = (node.property as Identifier).name;\n }\n\n if (object.type === 'Array') {\n return this.getArrayElement(object, node.property as Expression);\n }\n\n if (object.type === 'Object') {\n return this.getObjectProperty(object, propertyName);\n }\n\n throw createVbError(VbErrorCodes.ObjectRequired, 'Object required', 'Vbscript');\n }\n\n private getArrayElement(array: VbArrayValue, indexExpr: Expression): VbValue {\n const arr = array.value as unknown as { get: (indices: number[]) => VbValue };\n const index = toNumber(this.evaluate(indexExpr));\n return arr.get([Math.floor(index)]);\n }\n\n private getObjectProperty(objValue: VbObjectValue, propertyName: string): VbValue {\n const obj = objValue.value as VbObjectValueData | null;\n\n if (obj === null) {\n throw createVbError(VbErrorCodes.ObjectRequired, 'Object required', 'Vbscript');\n }\n\n if (typeof obj.getProperty === 'function') {\n if (obj.hasMethod?.(propertyName)) {\n return { type: 'Object', value: { type: 'method', object: obj, method: propertyName } };\n }\n return obj.getProperty(propertyName);\n }\n\n const jsValue = obj[propertyName];\n if (jsValue === undefined) {\n return { type: 'Empty', value: undefined };\n }\n if (typeof jsValue === 'function') {\n return { type: 'Object', value: { type: 'jsfunction', func: jsValue as (...args: unknown[]) => unknown, thisArg: obj } };\n }\n return this.jsToVb(jsValue);\n }\n\n private jsToVb(value: unknown): VbValue {\n if (value === undefined) return { type: 'Empty', value: undefined };\n if (value === null) return { type: 'Null', value: null };\n if (typeof value === 'boolean') return { type: 'Boolean', value };\n if (typeof value === 'number') {\n if (Number.isInteger(value) && value >= -2147483648 && value <= 2147483647) {\n return { type: 'Long', value };\n }\n return { type: 'Double', value };\n }\n if (typeof value === 'string') return { type: 'String', value };\n if (value instanceof Date) return { type: 'Date', value };\n if (Array.isArray(value)) {\n return { type: 'Array', value };\n }\n if (typeof value === 'object') {\n return { type: 'Object', value: value as VbObjectValueData };\n }\n return { type: 'String', value: String(value) };\n }\n\n private evaluateCallInternal(calleeExpr: Expression, callArgs: Expression[]): VbValue {\n if (calleeExpr.type === 'Identifier') {\n const name = calleeExpr.name;\n\n if (this.context.functionRegistry.has(name)) {\n const funcInfo = this.context.functionRegistry.get(name)!;\n const hasByRefParams = funcInfo.params.some(p => p.byRef);\n \n if (hasByRefParams) {\n const argRefs = callArgs.map(arg => {\n if (arg.type === 'Identifier') {\n const varName = arg.name;\n const variable = this.context.currentScope.get(varName);\n return {\n value: variable ? variable.value : this.context.getVariable(varName),\n variableName: varName,\n setValue: (val: VbValue) => {\n if (this.context.currentScope.has(varName)) {\n this.context.currentScope.set(varName, val);\n } else {\n this.context.setVariable(varName, val);\n }\n }\n };\n }\n return { value: this.evaluate(arg) };\n });\n return this.context.functionRegistry.callWithRefs(name, argRefs);\n }\n \n const args = callArgs.map(arg => this.evaluate(arg));\n return this.context.functionRegistry.call(name, args);\n }\n\n const variable = this.context.currentScope.get(name);\n if (variable) {\n if (variable.value.type === 'Array') {\n const indices = callArgs.map(arg => Math.floor(toNumber(this.evaluate(arg))));\n const arr = variable.value.value as unknown as { get: (indices: number[]) => VbValue };\n return arr.get(indices);\n }\n if (variable.value.type === 'Object' && variable.value.value !== null) {\n const val = variable.value.value as VbObjectValueData;\n if (val.hasMethod?.('default') && val.getMethod) {\n const method = val.getMethod('default');\n const args = callArgs.map(arg => this.evaluate(arg));\n return method.func(...args);\n }\n }\n }\n\n const callee = this.context.getVariable(name);\n if (callee.type === 'Object' && callee.value !== null) {\n return this.callObjectMethod(callee, callArgs);\n }\n throw createVbError(VbErrorCodes.InvalidProcedureCall, 'Invalid procedure call', 'Vbscript');\n }\n\n if (calleeExpr.type === 'MemberExpression') {\n const memberResult = this.evaluateMember(calleeExpr);\n\n if (memberResult.type === 'Object' && memberResult.value !== null) {\n return this.callObjectMethod(memberResult, callArgs);\n }\n throw createVbError(VbErrorCodes.InvalidProcedureCall, 'Invalid procedure call', 'Vbscript');\n }\n\n const callee = this.evaluate(calleeExpr);\n if (callee.type === 'Object' && callee.value !== null) {\n return this.callObjectMethod(callee, callArgs);\n }\n throw createVbError(VbErrorCodes.InvalidProcedureCall, 'Invalid procedure call', 'Vbscript');\n }\n\n private callObjectMethod(objValue: VbObjectValue, callArgs: Expression[]): VbValue {\n const obj = objValue.value as VbObjectValueData | null;\n if (obj === null) {\n throw createVbError(VbErrorCodes.ObjectRequired, 'Object required', 'Vbscript');\n }\n\n if (isVbMethodObject(obj)) {\n const args = callArgs.map(arg => this.evaluate(arg));\n return obj.object.getMethod(obj.method).func.call(obj.object, ...args);\n }\n\n if (isVbJsFunctionObject(obj)) {\n const args = callArgs.map(arg => {\n const vbVal = this.evaluate(arg);\n return this.vbToJs(vbVal);\n });\n const result = obj.func.call(obj.thisArg, ...args);\n return this.jsToVb(result);\n }\n\n if (typeof obj.call === 'function') {\n const args = callArgs.map(arg => this.evaluate(arg));\n return obj.call(...args);\n }\n\n throw createVbError(VbErrorCodes.InvalidProcedureCall, 'Invalid procedure call', 'Vbscript');\n }\n\n private vbToJs(value: VbValue): unknown {\n switch (value.type) {\n case 'Empty':\n return undefined;\n case 'Null':\n return null;\n case 'Boolean':\n case 'Long':\n case 'Double':\n case 'Integer':\n case 'String':\n return value.value;\n case 'Date':\n return value.value instanceof Date ? value.value : new Date(value.value);\n case 'Array':\n return value.value;\n case 'Object':\n const obj = value.value as VbObjectValueData | null;\n if (obj && typeof obj === 'object' && (obj as Record<string, unknown>).type === 'vbref') {\n return (obj as Record<string, unknown>).func;\n }\n return value.value;\n default:\n return value.value;\n }\n }\n\n private evaluateBinary(node: BinaryExpression): VbValue {\n const left = this.evaluate(node.left);\n const right = this.evaluate(node.right);\n\n switch (node.operator) {\n case '+':\n return this.add(left, right);\n case '-':\n return this.subtract(left, right);\n case '*':\n return this.multiply(left, right);\n case '/':\n return this.divide(left, right);\n case '\\\\':\n return this.integerDivide(left, right);\n case '%':\n case 'Mod':\n return this.modulo(left, right);\n case '**':\n case '^':\n return this.power(left, right);\n case '==':\n case '=':\n return this.equals(left, right);\n case '!=':\n case '<>':\n return this.notEquals(left, right);\n case '<':\n return this.lessThan(left, right);\n case '<=':\n return this.lessThanOrEqual(left, right);\n case '>':\n return this.greaterThan(left, right);\n case '>=':\n return this.greaterThanOrEqual(left, right);\n case '&':\n return { type: 'String', value: toString(left) + toString(right) };\n case 'Is':\n return { type: 'Boolean', value: left.type === 'Object' && right.type === 'Object' && left.value === right.value };\n default:\n return VbEmpty;\n }\n }\n\n private add(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'String', value: toString(left) + toString(right) };\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n return createVbValue(leftNum + rightNum);\n }\n\n private subtract(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n return createVbValue(leftNum - rightNum);\n }\n\n private multiply(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n return createVbValue(leftNum * rightNum);\n }\n\n private divide(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n if (rightNum === 0) {\n throw createVbError(VbErrorCodes.DivisionByZero, 'Division by zero', 'Vbscript');\n }\n return { type: 'Double', value: leftNum / rightNum };\n }\n\n private integerDivide(left: VbValue, right: VbValue): VbLongValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull as unknown as VbLongValue;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n if (rightNum === 0) {\n throw createVbError(VbErrorCodes.DivisionByZero, 'Division by zero', 'Vbscript');\n }\n return { type: 'Long', value: Math.floor(leftNum / rightNum) };\n }\n\n private modulo(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n if (rightNum === 0) {\n throw createVbError(VbErrorCodes.DivisionByZero, 'Division by zero', 'Vbscript');\n }\n return createVbValue(leftNum % rightNum);\n }\n\n private power(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Null' || right.type === 'Null') {\n return VbNull;\n }\n const leftNum = toNumber(left);\n const rightNum = toNumber(right);\n return { type: 'Double', value: Math.pow(leftNum, rightNum) };\n }\n\n private equals(left: VbValue, right: VbValue): VbBooleanValue {\n if (left.type === 'Empty' && right.type === 'Empty') {\n return { type: 'Boolean', value: true };\n }\n if (left.type === 'Null' || right.type === 'Null') {\n return { type: 'Boolean', value: false };\n }\n if (left.type === 'Object' && right.type === 'Object') {\n return { type: 'Boolean', value: left.value === right.value };\n }\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'Boolean', value: toString(left).toLowerCase() === toString(right).toLowerCase() };\n }\n return { type: 'Boolean', value: toNumber(left) === toNumber(right) };\n }\n\n private notEquals(left: VbValue, right: VbValue): VbBooleanValue {\n const eq = this.equals(left, right);\n return { type: 'Boolean', value: !eq.value };\n }\n\n private lessThan(left: VbValue, right: VbValue): VbBooleanValue {\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'Boolean', value: toString(left) < toString(right) };\n }\n return { type: 'Boolean', value: toNumber(left) < toNumber(right) };\n }\n\n private lessThanOrEqual(left: VbValue, right: VbValue): VbBooleanValue {\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'Boolean', value: toString(left) <= toString(right) };\n }\n return { type: 'Boolean', value: toNumber(left) <= toNumber(right) };\n }\n\n private greaterThan(left: VbValue, right: VbValue): VbBooleanValue {\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'Boolean', value: toString(left) > toString(right) };\n }\n return { type: 'Boolean', value: toNumber(left) > toNumber(right) };\n }\n\n private greaterThanOrEqual(left: VbValue, right: VbValue): VbBooleanValue {\n if (left.type === 'String' || right.type === 'String') {\n return { type: 'Boolean', value: toString(left) >= toString(right) };\n }\n return { type: 'Boolean', value: toNumber(left) >= toNumber(right) };\n }\n\n private evaluateUnary(node: UnaryExpression): VbValue {\n const argument = this.evaluate(node.argument);\n\n switch (node.operator) {\n case '-':\n return createVbValue(-toNumber(argument));\n case '+':\n return createVbValue(toNumber(argument));\n case '!':\n case 'Not':\n return { type: 'Boolean', value: !toBoolean(argument) };\n default:\n return VbEmpty;\n }\n }\n\n private evaluateLogical(node: LogicalExpression): VbValue {\n switch (node.operator) {\n case '&&':\n case 'And': {\n const left = this.evaluate(node.left);\n if (!toBoolean(left)) return left;\n return this.evaluate(node.right);\n }\n case '||':\n case 'Or': {\n const left = this.evaluate(node.left);\n if (toBoolean(left)) return left;\n return this.evaluate(node.right);\n }\n case 'Xor': {\n const left = this.evaluate(node.left);\n const right = this.evaluate(node.right);\n return { type: 'Boolean', value: toBoolean(left) !== toBoolean(right) };\n }\n case 'Eqv': {\n const left = this.evaluate(node.left);\n const right = this.evaluate(node.right);\n return { type: 'Boolean', value: toBoolean(left) === toBoolean(right) };\n }\n case 'Imp': {\n const left = this.evaluate(node.left);\n const right = this.evaluate(node.right);\n return { type: 'Boolean', value: !toBoolean(left) || toBoolean(right) };\n }\n default:\n return VbEmpty;\n }\n }\n\n private evaluateAssignment(node: AssignmentExpression): VbValue {\n const value = this.evaluate(node.right);\n const isSet = node.isSet ?? false;\n\n if (node.left.type === 'Identifier') {\n if (isSet) {\n const oldValue = this.context.getVariable(node.left.name);\n this.callTerminateIfNeeded(oldValue, value);\n }\n this.context.setVariable(node.left.name, value);\n return value;\n }\n\n if (node.left.type === 'MemberExpression') {\n this.assignToMember(node.left, value, isSet);\n return value;\n }\n\n throw new Error(`Invalid assignment target: ${node.left.type}`);\n }\n\n private callTerminateIfNeeded(oldValue: VbValue, newValue: VbValue): void {\n if (oldValue.type === 'Object' && oldValue.value instanceof VbObjectInstance) {\n if (newValue.type !== 'Object' || newValue.value !== oldValue.value) {\n const instance = oldValue.value as VbObjectInstance;\n const terminateProp = instance.classInfo.properties.get('class_terminate');\n if (terminateProp && terminateProp.get) {\n terminateProp.get.call(instance);\n }\n }\n }\n }\n\n private assignToMember(node: MemberExpression, value: VbValue, isSet: boolean): void {\n let object = this.evaluate(node.object as Expression);\n\n if (node.object.type === 'VbWithObject') {\n object = this.evaluateWithObject(node.object as VbWithObjectExpression);\n }\n\n let propertyName: string;\n if (node.computed) {\n const propValue = this.evaluate(node.property as Expression);\n propertyName = toString(propValue);\n } else {\n propertyName = (node.property as Identifier).name;\n }\n\n if (object.type === 'Array') {\n const arr = object.value as unknown as { set: (indices: number[], v: VbValue) => void };\n const index = toNumber(this.evaluate(node.property as Expression));\n arr.set([Math.floor(index)], value);\n } else if (object.type === 'Object') {\n const obj = object.value as VbObjectValueData | null;\n if (obj === null || typeof obj !== 'object') {\n throw createVbError(VbErrorCodes.ObjectRequired, 'Object required', 'Vbscript');\n }\n\n if (typeof obj.setProperty === 'function') {\n obj.setProperty(propertyName, value, isSet);\n } else {\n const jsValue = this.vbToJs(value);\n obj[propertyName] = jsValue;\n }\n } else {\n throw createVbError(VbErrorCodes.ObjectRequired, 'Object required', 'Vbscript');\n }\n }\n\n private evaluateConditional(node: ConditionalExpression): VbValue {\n const test = this.evaluate(node.test);\n if (toBoolean(test)) {\n return this.evaluate(node.consequent);\n }\n return this.evaluate(node.alternate);\n }\n}\n","import type { Statement, BlockStatement, ExpressionStatement, IfStatement, VbDimStatement, VbReDimStatement, VbEraseStatement, VbConstStatement, VbForToStatement, VbForEachStatement, VbDoLoopStatement, VbSelectCaseStatement, VbWithStatement, VbExitStatement, VbOptionExplicitStatement, VbSubStatement, VbFunctionStatement, VbClassStatement, VbOnErrorHandlerStatement, VbCallStatement, Expression, VbGotoStatement } from '../ast/index.ts';\nimport type { VbValue } from '../runtime/index.ts';\nimport { VbContext, VbEmpty, createVbValue, toBoolean, toNumber, VbError, VbErrorCodes, createVbError, VbArray, createVbArray, VbObjectInstance, VbClass, type VbProperty } from '../runtime/index.ts';\nimport { ExpressionEvaluator } from './expression-evaluator.ts';\n\nexport class ControlFlowSignal extends Error {\n constructor(public type: 'exit' | 'return' | 'continue' | 'break' | 'goto', public value?: VbValue) {\n super(type);\n }\n}\n\nexport class GotoSignal extends ControlFlowSignal {\n constructor(public labelName: string) {\n super('goto');\n }\n}\n\nexport class StatementExecutor {\n private exprEvaluator: ExpressionEvaluator;\n\n constructor(private context: VbContext) {\n this.exprEvaluator = new ExpressionEvaluator(context);\n }\n\n execute(node: Statement): VbValue {\n try {\n switch (node.type) {\n case 'ExpressionStatement':\n return this.executeExpressionStatement(node);\n case 'BlockStatement':\n return this.executeBlockStatement(node);\n case 'IfStatement':\n return this.executeIfStatement(node);\n case 'VbDimStatement':\n return this.executeDimStatement(node);\n case 'VbReDimStatement':\n return this.executeReDimStatement(node);\n case 'VbEraseStatement':\n return this.executeEraseStatement(node);\n case 'VbConstStatement':\n return this.executeConstStatement(node);\n case 'VbForToStatement':\n return this.executeForToStatement(node);\n case 'VbForEachStatement':\n return this.executeForEachStatement(node);\n case 'VbDoLoopStatement':\n return this.executeDoLoopStatement(node);\n case 'VbSelectCaseStatement':\n return this.executeSelectCaseStatement(node);\n case 'VbWithStatement':\n return this.executeWithStatement(node);\n case 'VbExitStatement':\n return this.executeExitStatement(node);\n case 'VbOptionExplicitStatement':\n return this.executeOptionExplicitStatement(node);\n case 'VbSubStatement':\n return this.executeSubStatement(node);\n case 'VbFunctionStatement':\n return this.executeFunctionStatement(node);\n case 'VbClassStatement':\n return this.executeClassStatement(node);\n case 'VbPropertyGetStatement':\n case 'VbPropertyLetStatement':\n case 'VbPropertySetStatement':\n return this.executePropertyStatement(node);\n case 'VbOnErrorHandlerStatement':\n return this.executeOnErrorHandlerStatement(node);\n case 'VbCallStatement':\n return this.executeCallStatement(node);\n case 'VbGotoStatement':\n return this.executeGotoStatement(node);\n case 'VbLabelStatement':\n return VbEmpty;\n case 'ReturnStatement':\n throw new ControlFlowSignal('return');\n default:\n throw new Error(`Unknown statement type: ${(node as Statement).type}`);\n }\n } catch (error) {\n if (error instanceof ControlFlowSignal) {\n throw error;\n }\n if (error instanceof VbError) {\n this.context.setError(error);\n if (this.context.onErrorResumeNext) {\n return VbEmpty;\n }\n throw error;\n }\n const vbError = VbError.fromError(error as Error);\n this.context.setError(vbError);\n if (this.context.onErrorResumeNext) {\n return VbEmpty;\n }\n throw vbError;\n }\n }\n\n private executeExpressionStatement(node: ExpressionStatement): VbValue {\n return this.exprEvaluator.evaluate(node.expression);\n }\n\n private executeCallStatement(node: VbCallStatement): VbValue {\n return this.exprEvaluator.evaluateCall(node.callee, node.arguments);\n }\n\n private executeBlockStatement(node: BlockStatement): VbValue {\n let result: VbValue = VbEmpty;\n for (const stmt of node.body) {\n result = this.execute(stmt);\n }\n return result;\n }\n\n private executeIfStatement(node: IfStatement): VbValue {\n const test = this.exprEvaluator.evaluate(node.test);\n \n if (toBoolean(test)) {\n return this.execute(node.consequent);\n } else if (node.alternate) {\n return this.execute(node.alternate);\n }\n \n return VbEmpty;\n }\n\n private executeDimStatement(node: VbDimStatement): VbValue {\n for (const decl of node.declarations) {\n let value: VbValue = VbEmpty;\n \n if (decl.isArray && decl.arrayBounds) {\n const bounds = decl.arrayBounds.map(b => {\n const boundValue = this.exprEvaluator.evaluate(b);\n return toNumber(boundValue);\n });\n const arr = createVbArray(bounds);\n value = { type: 'Array', value: arr };\n } else if (decl.init) {\n value = this.exprEvaluator.evaluate(decl.init);\n }\n \n this.context.declareVariable(decl.id.name, value);\n }\n \n return VbEmpty;\n }\n\n private executeReDimStatement(node: VbReDimStatement): VbValue {\n for (const decl of node.declarations) {\n if (!decl.isArray || !decl.arrayBounds) continue;\n \n const bounds = decl.arrayBounds.map(b => {\n const boundValue = this.exprEvaluator.evaluate(b);\n return toNumber(boundValue);\n });\n \n const existingVar = this.context.currentScope.get(decl.id.name);\n \n if (existingVar && existingVar.value.type === 'Array') {\n const arr = existingVar.value.value as VbArray;\n arr.redim(bounds, node.preserve);\n } else {\n const arr = createVbArray(bounds);\n this.context.setVariable(decl.id.name, { type: 'Array', value: arr });\n }\n }\n \n return VbEmpty;\n }\n\n private executeEraseStatement(node: VbEraseStatement): VbValue {\n const arrayName = node.arrayName.name;\n const variable = this.context.currentScope.get(arrayName);\n \n if (!variable) {\n throw new Error(`Variable '${arrayName}' not defined`);\n }\n \n if (variable.value.type !== 'Array') {\n throw new Error(`Type mismatch: '${arrayName}' is not an array`);\n }\n \n const arr = variable.value.value as VbArray;\n arr.erase();\n \n return VbEmpty;\n }\n\n private executeConstStatement(node: VbConstStatement): VbValue {\n for (const decl of node.declarations) {\n const value = this.exprEvaluator.evaluate(decl.init);\n this.context.currentScope.declare(decl.id.name, value, { isConst: true });\n }\n \n return VbEmpty;\n }\n\n private executeForToStatement(node: VbForToStatement): VbValue {\n const init = this.exprEvaluator.evaluate(node.init);\n const to = this.exprEvaluator.evaluate(node.to);\n const step = node.step ? this.exprEvaluator.evaluate(node.step) : createVbValue(1);\n \n const startValue = toNumber(init);\n const endValue = toNumber(to);\n const stepValue = toNumber(step);\n \n this.context.declareVariable(node.left.name, createVbValue(startValue));\n \n const shouldContinue = stepValue > 0 \n ? () => toNumber(this.context.getVariable(node.left.name)) <= endValue\n : () => toNumber(this.context.getVariable(node.left.name)) >= endValue;\n \n while (shouldContinue()) {\n if (this.context.checkTimeout) this.context.checkTimeout();\n \n try {\n this.execute(node.body);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal) {\n if (signal.type === 'exit' && this.context.getExitFlag() === 'for') {\n this.context.clearExitFlag();\n break;\n }\n if (signal.type === 'return') {\n throw signal;\n }\n }\n throw signal;\n }\n \n const currentValue = toNumber(this.context.getVariable(node.left.name));\n this.context.setVariable(node.left.name, createVbValue(currentValue + stepValue));\n }\n \n return VbEmpty;\n }\n\n private executeForEachStatement(node: VbForEachStatement): VbValue {\n const collection = this.exprEvaluator.evaluate(node.right);\n \n if (collection.type !== 'Array' && collection.type !== 'Object') {\n throw createVbError(VbErrorCodes.TypeMismatch, 'Type mismatch: expected array or collection', 'Vbscript');\n }\n \n let items: VbValue[];\n if (collection.type === 'Array') {\n const arr = collection.value as VbArray;\n items = arr.toArray();\n } else {\n const obj = collection.value as VbObjectInstance;\n const count = obj.getProperty('Count');\n const countNum = toNumber(count);\n items = [];\n for (let i = 0; i < countNum; i++) {\n items.push(obj.getProperty(String(i)));\n }\n }\n \n this.context.declareVariable(node.left.name, VbEmpty);\n \n for (const item of items) {\n this.context.setVariable(node.left.name, item);\n \n try {\n this.execute(node.body);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal) {\n if (signal.type === 'exit' && this.context.getExitFlag() === 'for') {\n this.context.clearExitFlag();\n break;\n }\n if (signal.type === 'return') {\n throw signal;\n }\n }\n throw signal;\n }\n }\n \n return VbEmpty;\n }\n\n private executeDoLoopStatement(node: VbDoLoopStatement): VbValue {\n const checkCondition = (): boolean => {\n if (!node.test) return true;\n const testValue = this.exprEvaluator.evaluate(node.test!);\n return toBoolean(testValue);\n };\n \n const isWhile = node.testPosition === 'while-do' || node.testPosition === 'do-while';\n const isPreTest = node.testPosition === 'while-do' || node.testPosition === 'until-do';\n \n while (true) {\n if (this.context.checkTimeout) this.context.checkTimeout();\n \n if (isPreTest) {\n const cond = isWhile ? checkCondition() : !checkCondition();\n if (!cond) break;\n }\n \n try {\n this.execute(node.body);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal) {\n if (signal.type === 'exit' && this.context.getExitFlag() === 'do') {\n this.context.clearExitFlag();\n break;\n }\n if (signal.type === 'return') {\n throw signal;\n }\n }\n throw signal;\n }\n \n if (!isPreTest) {\n const cond = isWhile ? checkCondition() : !checkCondition();\n if (!cond) break;\n }\n }\n \n return VbEmpty;\n }\n\n private executeSelectCaseStatement(node: VbSelectCaseStatement): VbValue {\n const discriminant = this.exprEvaluator.evaluate(node.discriminant);\n \n for (const caseClause of node.cases) {\n if (caseClause.isElse) {\n for (const stmt of caseClause.consequent) {\n this.execute(stmt);\n }\n return VbEmpty;\n }\n \n const matches = this.matchCase(caseClause.test, discriminant);\n \n if (matches) {\n for (const stmt of caseClause.consequent) {\n this.execute(stmt);\n }\n return VbEmpty;\n }\n }\n \n return VbEmpty;\n }\n\n private matchCase(test: Expression | Expression[] | null, discriminant: VbValue): boolean {\n if (!test) return false;\n \n const tests = Array.isArray(test) ? test : [test];\n \n for (const t of tests) {\n if (t.type === 'BinaryExpression' && 'left' in t && (t.left as Expression).type === 'Identifier' && ((t.left as Expression) as { name: string }).name === '__select_expr__') {\n const right = this.exprEvaluator.evaluate(t.right as Expression);\n const operator = t.operator;\n \n switch (operator) {\n case '==':\n if (toBoolean(this.equals(discriminant, right))) return true;\n break;\n case '<':\n if (toNumber(discriminant) < toNumber(right)) return true;\n break;\n case '>':\n if (toNumber(discriminant) > toNumber(right)) return true;\n break;\n case '<=':\n if (toNumber(discriminant) <= toNumber(right)) return true;\n break;\n case '>=':\n if (toNumber(discriminant) >= toNumber(right)) return true;\n break;\n case '!=':\n if (!toBoolean(this.equals(discriminant, right))) return true;\n break;\n }\n } else {\n const testValue = this.exprEvaluator.evaluate(t);\n if (toBoolean(this.equals(discriminant, testValue))) {\n return true;\n }\n }\n }\n \n return false;\n }\n\n private equals(left: VbValue, right: VbValue): VbValue {\n if (left.type === 'Empty' && right.type === 'Empty') {\n return { type: 'Boolean', value: true };\n }\n if (left.type === 'Null' || right.type === 'Null') {\n return { type: 'Boolean', value: false };\n }\n if (left.type === 'String' || right.type === 'String') {\n const leftStr = left.type === 'String' ? left.value as string : String(toNumber(left));\n const rightStr = right.type === 'String' ? right.value as string : String(toNumber(right));\n return { type: 'Boolean', value: leftStr.toLowerCase() === rightStr.toLowerCase() };\n }\n return { type: 'Boolean', value: toNumber(left) === toNumber(right) };\n }\n\n private executeWithStatement(node: VbWithStatement): VbValue {\n const object = this.exprEvaluator.evaluate(node.object);\n this.context.pushWith(object);\n \n try {\n this.execute(node.body);\n } finally {\n this.context.popWith();\n }\n \n return VbEmpty;\n }\n\n private executeExitStatement(node: VbExitStatement): VbValue {\n this.context.setExitFlag(node.target.toLowerCase() as 'sub' | 'function' | 'property' | 'do' | 'for' | 'select');\n throw new ControlFlowSignal('exit');\n }\n\n private executeOptionExplicitStatement(_node: VbOptionExplicitStatement): VbValue {\n this.context.optionExplicit = true;\n return VbEmpty;\n }\n\n private executeSubStatement(node: VbSubStatement): VbValue {\n const subName = node.name.name;\n const self = this;\n \n const subFunc = function(args: VbValue[]): VbValue {\n self.context.pushScope();\n self.context.pushCall(subName);\n \n try {\n self.bindParameters(node.params, args);\n \n self.executeBlockStatement(node.body);\n \n self.updateByRefArgs(node.params, args);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal && signal.type === 'return') {\n self.updateByRefArgs(node.params, args);\n } else {\n throw signal;\n }\n } finally {\n self.context.popCall();\n self.context.popScope();\n }\n \n return VbEmpty;\n };\n \n const params = node.params.map(p => ({\n name: p.name.name,\n byRef: p.byRef,\n isArray: p.isArray,\n isOptional: p.isOptional,\n isParamArray: p.isParamArray,\n }));\n \n this.context.functionRegistry.register(subName, subFunc, { isSub: true, params, isUserDefined: true });\n return VbEmpty;\n }\n\n private executeFunctionStatement(node: VbFunctionStatement): VbValue {\n const funcName = node.name.name;\n const self = this;\n \n const func = function(args: VbValue[]): VbValue {\n self.context.pushScope();\n self.context.pushCall(funcName);\n \n self.context.declareVariable(funcName, VbEmpty);\n \n let result: VbValue = VbEmpty;\n \n try {\n self.bindParameters(node.params, args);\n \n self.executeBlockStatement(node.body);\n \n self.updateByRefArgs(node.params, args);\n \n result = self.context.getVariable(funcName);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal && signal.type === 'return') {\n self.updateByRefArgs(node.params, args);\n result = self.context.getVariable(funcName);\n } else {\n throw signal;\n }\n } finally {\n self.context.popCall();\n self.context.popScope();\n }\n \n return result;\n };\n \n const params = node.params.map(p => ({\n name: p.name.name,\n byRef: p.byRef,\n isArray: p.isArray,\n isOptional: p.isOptional,\n isParamArray: p.isParamArray,\n }));\n \n this.context.functionRegistry.register(funcName, func, { params, isUserDefined: true });\n return VbEmpty;\n }\n\n private bindParameters(params: import('../ast/index.ts').VbParameter[], args: VbValue[]): void {\n let argIndex = 0;\n \n for (const param of params) {\n if (param.isParamArray) {\n const restArgs: VbValue[] = [];\n while (argIndex < args.length) {\n restArgs.push(args[argIndex++]!);\n }\n const arr = createVbArray([restArgs.length]);\n restArgs.forEach((v, idx) => arr.set([idx], v));\n this.context.declareVariable(param.name.name, { type: 'Array', value: arr });\n } else {\n let argValue: VbValue;\n \n if (argIndex < args.length) {\n argValue = args[argIndex++]!;\n } else if (param.defaultValue) {\n argValue = this.exprEvaluator.evaluate(param.defaultValue);\n } else if (param.isOptional) {\n argValue = VbEmpty;\n } else {\n argValue = VbEmpty;\n }\n \n this.context.declareVariable(param.name.name, argValue);\n }\n }\n }\n\n private updateByRefArgs(params: import('../ast/index.ts').VbParameter[], args: VbValue[]): void {\n let argIndex = 0;\n \n for (const param of params) {\n if (param.isParamArray) {\n break;\n }\n \n if (argIndex < args.length && param.byRef) {\n args[argIndex] = this.context.getVariable(param.name.name);\n }\n argIndex++;\n }\n }\n\n private executeClassStatement(node: VbClassStatement): VbValue {\n const className = node.name.name;\n const cls = new VbClass(className);\n const self = this;\n let initializeFunc: VbProperty | undefined;\n let terminateFunc: VbProperty | undefined;\n \n for (const member of node.body) {\n if (member.type === 'VbDimStatement') {\n for (const decl of member.declarations) {\n cls.properties.set(decl.id.name.toLowerCase(), {\n name: decl.id.name,\n });\n }\n } else if (member.type === 'VbSubStatement') {\n const memberNode = member;\n const memberName = member.name.name.toLowerCase();\n \n if (memberName === 'class_initialize') {\n initializeFunc = {\n name: 'Class_Initialize',\n get: function(this: VbObjectInstance): VbValue {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n try {\n self.executeBlockStatement(memberNode.body);\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n return VbEmpty;\n },\n };\n continue;\n }\n \n if (memberName === 'class_terminate') {\n terminateFunc = {\n name: 'Class_Terminate',\n get: function(this: VbObjectInstance): VbValue {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n try {\n self.executeBlockStatement(memberNode.body);\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n return VbEmpty;\n },\n };\n continue;\n }\n \n cls.methods.set(memberName, {\n name: member.name.name,\n func: function(this: VbObjectInstance, ...args: VbValue[]): VbValue {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n try {\n self.bindParameters(memberNode.params, args);\n self.executeBlockStatement(memberNode.body);\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n return VbEmpty;\n },\n isSub: true,\n });\n } else if (member.type === 'VbFunctionStatement') {\n const memberNode = member;\n cls.methods.set(member.name.name.toLowerCase(), {\n name: member.name.name,\n func: function(this: VbObjectInstance, ...args: VbValue[]): VbValue {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n self.context.declareVariable(memberNode.name.name, VbEmpty);\n self.bindParameters(memberNode.params, args);\n let result: VbValue = VbEmpty;\n try {\n self.executeBlockStatement(memberNode.body);\n result = self.context.getVariable(memberNode.name.name);\n } catch (signal) {\n if (signal instanceof ControlFlowSignal && signal.type === 'return') {\n result = self.context.getVariable(memberNode.name.name);\n } else {\n throw signal;\n }\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n return result;\n },\n isSub: false,\n });\n } else if (member.type === 'VbPropertyGetStatement') {\n const memberNode = member;\n const propName = member.name.name.toLowerCase();\n const existing = cls.properties.get(propName) || { name: member.name.name };\n existing.get = function(this: VbObjectInstance): VbValue {\n const prevInstance = self.context.currentInstance;\n const prevInPropertyGet = self.context.inPropertyGet;\n const prevPropertyGetName = self.context.propertyGetName;\n self.context.currentInstance = this;\n self.context.inPropertyGet = true;\n self.context.propertyGetName = memberNode.name.name.toLowerCase();\n self.context.pushScope();\n self.context.declareVariable(memberNode.name.name, VbEmpty);\n try {\n self.executeBlockStatement(memberNode.body);\n return self.context.currentScope.get(memberNode.name.name)?.value ?? VbEmpty;\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n self.context.inPropertyGet = prevInPropertyGet;\n self.context.propertyGetName = prevPropertyGetName;\n }\n };\n cls.properties.set(propName, existing);\n } else if (member.type === 'VbPropertyLetStatement') {\n const memberNode = member;\n const propName = member.name.name.toLowerCase();\n const existing = cls.properties.get(propName) || { name: member.name.name };\n existing.let = function(this: VbObjectInstance, value: VbValue): void {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n self.context.declareVariable(memberNode.name.name, VbEmpty);\n const param = memberNode.params[0];\n if (param) {\n self.context.declareVariable(param.name.name, value);\n }\n try {\n self.executeBlockStatement(memberNode.body);\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n };\n cls.properties.set(propName, existing);\n } else if (member.type === 'VbPropertySetStatement') {\n const memberNode = member;\n const propName = member.name.name.toLowerCase();\n const existing = cls.properties.get(propName) || { name: member.name.name };\n existing.set = function(this: VbObjectInstance, value: VbValue): void {\n const prevInstance = self.context.currentInstance;\n self.context.currentInstance = this;\n self.context.pushScope();\n self.context.declareVariable(memberNode.name.name, VbEmpty);\n const param = memberNode.params[0];\n if (param) {\n self.context.declareVariable(param.name.name, value);\n }\n try {\n self.executeBlockStatement(memberNode.body);\n } finally {\n self.context.popScope();\n self.context.currentInstance = prevInstance;\n }\n };\n cls.properties.set(propName, existing);\n }\n }\n \n if (initializeFunc) {\n cls.properties.set('class_initialize', initializeFunc);\n }\n if (terminateFunc) {\n cls.properties.set('class_terminate', terminateFunc);\n }\n \n this.context.classRegistry.register(cls);\n return VbEmpty;\n }\n\n private executePropertyStatement(_node: Statement): VbValue {\n return VbEmpty;\n }\n\n private executeOnErrorHandlerStatement(node: VbOnErrorHandlerStatement): VbValue {\n if (node.action === 'resume_next') {\n this.context.onErrorResumeNext = true;\n } else if (node.action === 'goto_0') {\n this.context.onErrorResumeNext = false;\n this.context.clearError();\n }\n return VbEmpty;\n }\n\n private executeGotoStatement(node: VbGotoStatement): VbValue {\n throw new GotoSignal(node.label.name.toLowerCase());\n }\n}\n","import type { VbValue } from '../runtime/index.ts';\n\nconst localeToLcid: Map<string, number> = new Map([\n ['af', 1078],\n ['sq', 1052],\n ['ar-ae', 14337],\n ['ar-bh', 15361],\n ['ar-dz', 5121],\n ['ar-eg', 3073],\n ['ar-iq', 2049],\n ['ar-jo', 11265],\n ['ar-kw', 13313],\n ['ar-lb', 12289],\n ['ar-ly', 4097],\n ['ar-ma', 6145],\n ['ar-om', 8193],\n ['ar-qa', 16385],\n ['ar-sa', 1025],\n ['ar-sy', 10241],\n ['ar-tn', 7169],\n ['ar-ye', 9217],\n ['hy', 1067],\n ['az', 1068],\n ['az-Latn', 1068],\n ['az-Cyrl', 2092],\n ['eu', 1069],\n ['be', 1059],\n ['bg', 1026],\n ['ca', 1027],\n ['zh-cn', 2052],\n ['zh-hk', 3076],\n ['zh-mo', 5124],\n ['zh-sg', 4100],\n ['zh-tw', 1028],\n ['zh', 2052],\n ['hr', 1050],\n ['cs', 1029],\n ['da', 1030],\n ['nl-nl', 1043],\n ['nl-be', 2067],\n ['nl', 1043],\n ['en-au', 3081],\n ['en-bz', 10249],\n ['en-ca', 4105],\n ['en-cb', 9225],\n ['en-ie', 6153],\n ['en-jm', 8201],\n ['en-nz', 5129],\n ['en-ph', 13321],\n ['en-za', 7177],\n ['en-tt', 11273],\n ['en-gb', 2057],\n ['en-us', 1033],\n ['en', 1033],\n ['et', 1061],\n ['fa', 1065],\n ['fi', 1035],\n ['fo', 1080],\n ['fr-fr', 1036],\n ['fr-be', 2060],\n ['fr-ca', 3084],\n ['fr-lu', 5132],\n ['fr-ch', 4108],\n ['fr', 1036],\n ['gd-ie', 2108],\n ['gd', 1084],\n ['de-de', 1031],\n ['de-at', 3079],\n ['de-li', 5127],\n ['de-lu', 4103],\n ['de-ch', 2055],\n ['de', 1031],\n ['el', 1032],\n ['he', 1037],\n ['hi', 1081],\n ['hu', 1038],\n ['is', 1039],\n ['id', 1057],\n ['it-it', 1040],\n ['it-ch', 2064],\n ['it', 1040],\n ['ja', 1041],\n ['ko', 1042],\n ['lv', 1062],\n ['lt', 1063],\n ['mk', 1071],\n ['ms-my', 1086],\n ['ms-bn', 2110],\n ['ms', 1086],\n ['mt', 1082],\n ['mr', 1102],\n ['no', 1044],\n ['nb', 1044],\n ['nn', 2068],\n ['pl', 1045],\n ['pt-pt', 2070],\n ['pt-br', 1046],\n ['pt', 1046],\n ['rm', 1047],\n ['ro', 1048],\n ['ro-md', 2072],\n ['ru', 1049],\n ['ru-md', 2073],\n ['sa', 1103],\n ['sr-Cyrl', 3098],\n ['sr-Latn', 2074],\n ['sr', 3098],\n ['tn', 1074],\n ['sl', 1060],\n ['sk', 1051],\n ['sb', 1070],\n ['es-es', 1034],\n ['es-ar', 11274],\n ['es-bo', 16394],\n ['es-cl', 13322],\n ['es-co', 9226],\n ['es-cr', 5130],\n ['es-do', 7178],\n ['es-ec', 12298],\n ['es-gt', 4106],\n ['es-hn', 18442],\n ['es-mx', 2058],\n ['es-ni', 19466],\n ['es-pa', 6154],\n ['es-pe', 10250],\n ['es-pr', 20490],\n ['es-py', 15370],\n ['es-sv', 17418],\n ['es-uy', 14346],\n ['es-ve', 8202],\n ['es', 1034],\n ['sx', 1072],\n ['sw', 1089],\n ['sv-se', 1053],\n ['sv-fi', 2077],\n ['sv', 1053],\n ['ta', 1097],\n ['tt', 1092],\n ['th', 1054],\n ['tr', 1055],\n ['ts', 1073],\n ['uk', 1058],\n ['ur', 1056],\n ['uz-Cyrl', 2115],\n ['uz-Latn', 1091],\n ['uz', 1091],\n ['vi', 1066],\n ['xh', 1076],\n ['yi', 1085],\n ['zu', 1077],\n]);\n\nconst lcidToLocale: Map<number, string> = new Map();\nlocaleToLcid.forEach((lcid, locale) => {\n lcidToLocale.set(lcid, locale);\n});\n\nlet currentLocale: string | null = null;\n\nfunction normalizeLocale(locale: string): string {\n return locale.toLowerCase().replace(/_/g, '-');\n}\n\nfunction findLocaleKey(normalized: string): string | undefined {\n for (const key of localeToLcid.keys()) {\n if (key.toLowerCase() === normalized) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction getBrowserLocale(): string {\n if (currentLocale) {\n return currentLocale;\n }\n\n const browserLocale = Intl.DateTimeFormat().resolvedOptions().locale || 'en-US';\n const normalized = normalizeLocale(browserLocale);\n\n const exactKey = findLocaleKey(normalized);\n if (exactKey) {\n return exactKey;\n }\n\n const baseLocale = normalized.split('-')[0] ?? 'en';\n const baseKey = findLocaleKey(baseLocale);\n if (baseKey) {\n return baseKey;\n }\n\n return 'en';\n}\n\nexport function getLocale(): VbValue {\n const locale = getBrowserLocale();\n const lcid = localeToLcid.get(locale) ?? 1033;\n return { type: 'Long', value: lcid };\n}\n\nexport function setLocale(lcid: VbValue): VbValue {\n const lcidValue = typeof lcid.value === 'number' ? lcid.value : parseInt(String(lcid.value), 10);\n\n if (isNaN(lcidValue)) {\n const localeStr = String(lcid.value).toLowerCase();\n const key = findLocaleKey(localeStr);\n if (key) {\n currentLocale = key;\n return { type: 'Long', value: localeToLcid.get(key) ?? 1033 };\n }\n return getLocale();\n }\n\n const locale = lcidToLocale.get(lcidValue);\n if (locale) {\n currentLocale = locale;\n return { type: 'Long', value: lcidValue };\n }\n\n return getLocale();\n}\n\nexport function getCurrentLocaleTag(): string {\n const locale = getBrowserLocale();\n const parts = locale.replace(/-/g, '_').split('_');\n return parts[0] + (locale.includes('-') ? '-' + (parts[1]?.toUpperCase() ?? '') : '');\n}\n\nexport function getCurrentBCP47Locale(): string {\n return getBrowserLocale();\n}\n\nconst localeToCurrency: Map<string, string> = new Map([\n ['en-us', 'USD'],\n ['en-gb', 'GBP'],\n ['en-au', 'AUD'],\n ['en-ca', 'CAD'],\n ['en-nz', 'NZD'],\n ['en-za', 'ZAR'],\n ['de-de', 'EUR'],\n ['de-at', 'EUR'],\n ['de-ch', 'CHF'],\n ['fr-fr', 'EUR'],\n ['fr-be', 'EUR'],\n ['fr-ca', 'CAD'],\n ['fr-ch', 'CHF'],\n ['ja', 'JPY'],\n ['zh-cn', 'CNY'],\n ['zh-tw', 'TWD'],\n ['zh-hk', 'HKD'],\n ['ko', 'KRW'],\n ['it', 'EUR'],\n ['es', 'EUR'],\n ['es-mx', 'MXN'],\n ['pt-br', 'BRL'],\n ['pt-pt', 'EUR'],\n ['ru', 'RUB'],\n ['pl', 'PLN'],\n ['nl', 'EUR'],\n ['sv', 'SEK'],\n ['da', 'DKK'],\n ['no', 'NOK'],\n ['fi', 'EUR'],\n ['cs', 'CZK'],\n ['hu', 'HUF'],\n ['tr', 'TRY'],\n ['th', 'THB'],\n ['id', 'IDR'],\n ['ms', 'MYR'],\n ['vi', 'VND'],\n ['in', 'INR'],\n ['hi', 'INR'],\n ['ar-sa', 'SAR'],\n ['ar-eg', 'EGP'],\n ['ar-ae', 'AED'],\n ['he', 'ILS'],\n ['en-ie', 'EUR'],\n ['en-ph', 'PHP'],\n ['en-in', 'INR'],\n]);\n\nexport function getCurrentCurrency(): string {\n const locale = getBrowserLocale();\n const currency = localeToCurrency.get(locale);\n if (currency) return currency;\n \n const baseLocale = locale.split('-')[0] ?? 'en';\n const baseCurrency = localeToCurrency.get(baseLocale);\n if (baseCurrency) return baseCurrency;\n \n return 'USD';\n}\n\nexport const localeFunctions = {\n GetLocale: getLocale,\n SetLocale: setLocale,\n};\n","import type { VbValue } from '../runtime/index.ts';\nimport { toNumber, toString, createVbArrayFromValues } from '../runtime/index.ts';\nimport { getCurrentBCP47Locale } from './locale.ts';\n\nfunction formatDate(value: Date, format: string): string {\n const result: string[] = [];\n let i = 0;\n \n while (i < format.length) {\n const char = format[i]!.toLowerCase();\n let count = 1;\n while (i + count < format.length && format[i + count]!.toLowerCase() === char) {\n count++;\n }\n \n switch (char) {\n case 'y':\n if (count >= 4) {\n result.push(value.getFullYear().toString());\n } else if (count === 3) {\n result.push(value.getFullYear().toString());\n } else if (count === 2) {\n result.push(value.getFullYear().toString().slice(-2));\n } else {\n result.push(value.getFullYear().toString().slice(-2));\n }\n break;\n case 'm':\n if (count >= 4) {\n const months: string[] = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n result.push(months[value.getMonth()]!);\n } else if (count === 3) {\n const months: string[] = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n result.push(months[value.getMonth()]!);\n } else if (count === 2) {\n result.push((value.getMonth() + 1).toString().padStart(2, '0'));\n } else {\n result.push((value.getMonth() + 1).toString());\n }\n break;\n case 'd':\n if (count >= 4) {\n const days: string[] = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n result.push(days[value.getDay()]!);\n } else if (count === 3) {\n const days: string[] = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n result.push(days[value.getDay()]!);\n } else if (count === 2) {\n result.push(value.getDate().toString().padStart(2, '0'));\n } else {\n result.push(value.getDate().toString());\n }\n break;\n case 'h':\n if (count >= 2) {\n result.push((value.getHours() % 12 || 12).toString().padStart(2, '0'));\n } else {\n result.push((value.getHours() % 12 || 12).toString());\n }\n break;\n case 'n':\n if (count >= 2) {\n result.push(value.getMinutes().toString().padStart(2, '0'));\n } else {\n result.push(value.getMinutes().toString());\n }\n break;\n case 's':\n if (count >= 2) {\n result.push(value.getSeconds().toString().padStart(2, '0'));\n } else {\n result.push(value.getSeconds().toString());\n }\n break;\n case 'q':\n result.push(Math.floor(value.getMonth() / 3 + 1).toString());\n break;\n case 'w':\n result.push((value.getDay() + 1).toString());\n break;\n case 'a':\n if (count >= 2) {\n result.push(value.getHours() >= 12 ? 'PM' : 'AM');\n } else {\n result.push(value.getHours() >= 12 ? 'P' : 'A');\n }\n break;\n default:\n result.push(format.substring(i, i + count));\n }\n i += count;\n }\n \n return result.join('');\n}\n\nfunction formatNumber(value: number, format: string): string {\n let positiveFormat = format;\n let negativeFormat = '';\n let zeroFormat = '';\n \n const semicolonIndex = format.indexOf(';');\n if (semicolonIndex !== -1) {\n positiveFormat = format.substring(0, semicolonIndex);\n const remaining = format.substring(semicolonIndex + 1);\n const secondSemicolon = remaining.indexOf(';');\n if (secondSemicolon !== -1) {\n negativeFormat = remaining.substring(0, secondSemicolon);\n zeroFormat = remaining.substring(secondSemicolon + 1);\n } else {\n negativeFormat = remaining;\n }\n }\n \n if (value === 0 && zeroFormat) {\n return formatNumberInternal(0, zeroFormat);\n }\n \n if (value < 0 && negativeFormat) {\n return formatNumberInternal(Math.abs(value), negativeFormat);\n }\n \n if (value < 0) {\n return '-' + formatNumberInternal(Math.abs(value), positiveFormat);\n }\n \n return formatNumberInternal(value, positiveFormat);\n}\n\nfunction formatNumberInternal(value: number, format: string): string {\n let hasPercent = format.includes('%');\n if (hasPercent) {\n value *= 100;\n }\n \n const formatLower = format.toLowerCase();\n let decimalPos = formatLower.indexOf('.');\n let decimalDigits = 0;\n \n if (decimalPos !== -1) {\n let i = decimalPos + 1;\n while (i < format.length && (format[i] === '0' || format[i] === '#')) {\n decimalDigits++;\n i++;\n }\n }\n \n let intPart = Math.floor(Math.abs(value));\n let decPart = decimalDigits > 0 ? Math.round((Math.abs(value) - intPart) * Math.pow(10, decimalDigits)) : 0;\n \n if (decPart >= Math.pow(10, decimalDigits)) {\n intPart++;\n decPart = 0;\n }\n \n let intStr = intPart.toString();\n \n const commaPos = formatLower.indexOf(',');\n if (commaPos !== -1) {\n intStr = intStr.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n }\n \n let result = intStr;\n \n if (decimalDigits > 0) {\n const decStr = decPart.toString().padStart(decimalDigits, '0');\n result += '.' + decStr;\n }\n \n if (hasPercent) {\n result += '%';\n }\n \n return result;\n}\n\nfunction formatString(value: string, format: string): string {\n if (format === '>' || format.toLowerCase() === '>') {\n return value.toUpperCase();\n }\n if (format === '<' || format.toLowerCase() === '<') {\n return value.toLowerCase();\n }\n return value;\n}\n\nexport const stringFunctions = {\n Len: (str: VbValue): VbValue => {\n const s = toString(str);\n return { type: 'Long', value: s.length };\n },\n\n Left: (str: VbValue, length: VbValue): VbValue => {\n const s = toString(str);\n const len = Math.max(0, Math.floor(toNumber(length)));\n return { type: 'String', value: s.substring(0, len) };\n },\n\n Right: (str: VbValue, length: VbValue): VbValue => {\n const s = toString(str);\n const len = Math.max(0, Math.floor(toNumber(length)));\n return { type: 'String', value: s.substring(s.length - len) };\n },\n\n Mid: (str: VbValue, start: VbValue, length?: VbValue): VbValue => {\n const s = toString(str);\n const startPos = Math.max(1, Math.floor(toNumber(start))) - 1;\n if (length) {\n const len = Math.floor(toNumber(length));\n return { type: 'String', value: s.substring(startPos, startPos + len) };\n }\n return { type: 'String', value: s.substring(startPos) };\n },\n\n InStr: (startOrStr: VbValue, str1OrStr2?: VbValue, str2OrCompare?: VbValue, compare?: VbValue): VbValue => {\n let start = 1;\n let str1: string;\n let str2: string;\n let compareMode = 0;\n \n if (str1OrStr2 === undefined) {\n str1 = '';\n str2 = toString(startOrStr);\n } else if (str2OrCompare === undefined) {\n str1 = toString(startOrStr);\n str2 = toString(str1OrStr2);\n } else {\n start = Math.max(1, Math.floor(toNumber(startOrStr)));\n str1 = toString(str1OrStr2);\n str2 = toString(str2OrCompare);\n if (compare) {\n compareMode = Math.floor(toNumber(compare));\n }\n }\n \n let index: number;\n if (compareMode === 0) {\n index = str1.indexOf(str2, start - 1);\n } else {\n index = str1.toLowerCase().indexOf(str2.toLowerCase(), start - 1);\n }\n return { type: 'Long', value: index + 1 };\n },\n\n InStrRev: (str1: VbValue, str2: VbValue, start?: VbValue, compare?: VbValue): VbValue => {\n const s1 = toString(str1);\n const s2 = toString(str2);\n const startPos = start ? Math.floor(toNumber(start)) : s1.length;\n const compareMode = compare ? Math.floor(toNumber(compare)) : 0;\n \n let index: number;\n if (compareMode === 0) {\n index = s1.lastIndexOf(s2, startPos - 1);\n } else {\n index = s1.toLowerCase().lastIndexOf(s2.toLowerCase(), startPos - 1);\n }\n return { type: 'Long', value: index + 1 };\n },\n\n LCase: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).toLowerCase() };\n },\n\n UCase: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).toUpperCase() };\n },\n\n LTrim: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).replace(/^\\s+/, '') };\n },\n\n RTrim: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).replace(/\\s+$/, '') };\n },\n\n Trim: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).trim() };\n },\n\n Replace: (str: VbValue, find: VbValue, replace: VbValue, start?: VbValue, count?: VbValue, compare?: VbValue): VbValue => {\n const s = toString(str);\n const findStr = toString(find);\n const replaceStr = toString(replace);\n const startPos = start ? Math.max(1, Math.floor(toNumber(start))) - 1 : 0;\n const maxCount = count ? Math.floor(toNumber(count)) : -1;\n const compareMode = compare ? Math.floor(toNumber(compare)) : 0;\n \n let result = '';\n let replaced = 0;\n let i = startPos;\n const searchStr = compareMode === 0 ? s : s.toLowerCase();\n const searchFind = compareMode === 0 ? findStr : findStr.toLowerCase();\n \n while (i < s.length) {\n if (maxCount !== -1 && replaced >= maxCount) {\n result += s.substring(i);\n break;\n }\n if (searchStr.substring(i, i + findStr.length) === searchFind) {\n result += replaceStr;\n i += findStr.length;\n replaced++;\n } else {\n result += s[i];\n i++;\n }\n }\n \n return { type: 'String', value: result };\n },\n\n StrReverse: (str: VbValue): VbValue => {\n return { type: 'String', value: toString(str).split('').reverse().join('') };\n },\n\n Space: (number: VbValue): VbValue => {\n const count = Math.max(0, Math.floor(toNumber(number)));\n return { type: 'String', value: ' '.repeat(count) };\n },\n\n String: (number: VbValue, character: VbValue): VbValue => {\n const count = Math.max(0, Math.floor(toNumber(number)));\n const char = toString(character);\n const charCode = char.length > 0 ? char[0]! : ' ';\n return { type: 'String', value: charCode.repeat(count) };\n },\n\n Asc: (str: VbValue): VbValue => {\n const s = toString(str);\n return { type: 'Integer', value: s.length > 0 ? s.charCodeAt(0) : 0 };\n },\n\n AscW: (str: VbValue): VbValue => {\n const s = toString(str);\n return { type: 'Integer', value: s.length > 0 ? s.charCodeAt(0) : 0 };\n },\n\n Chr: (charCode: VbValue): VbValue => {\n const code = Math.floor(toNumber(charCode));\n return { type: 'String', value: String.fromCharCode(code) };\n },\n\n ChrW: (charCode: VbValue): VbValue => {\n const code = Math.floor(toNumber(charCode));\n return { type: 'String', value: String.fromCharCode(code) };\n },\n\n StrComp: (str1: VbValue, str2: VbValue, compare?: VbValue): VbValue => {\n const s1 = toString(str1);\n const s2 = toString(str2);\n const compareMode = compare ? Math.floor(toNumber(compare)) : 0;\n \n let result: number;\n if (compareMode === 1) {\n result = s1.toLowerCase().localeCompare(s2.toLowerCase());\n } else if (compareMode === 2) {\n const locale = getCurrentBCP47Locale();\n result = s1.localeCompare(s2, locale, { sensitivity: 'base' });\n } else {\n result = s1.localeCompare(s2);\n }\n return { type: 'Integer', value: result };\n },\n\n Split: (str: VbValue, delimiter?: VbValue, count?: VbValue, _compare?: VbValue): VbValue => {\n const s = toString(str);\n const delim = delimiter ? toString(delimiter) : ' ';\n const maxCount = count ? Math.floor(toNumber(count)) : -1;\n \n const parts = s.split(delim);\n let resultParts: string[];\n if (maxCount > 0 && parts.length > maxCount) {\n resultParts = parts.slice(0, maxCount - 1);\n resultParts.push(parts.slice(maxCount - 1).join(delim));\n } else {\n resultParts = parts;\n }\n \n const vbArray = createVbArrayFromValues(resultParts.map(p => ({ type: 'String', value: p } as VbValue)));\n return { type: 'Array', value: vbArray };\n },\n\n Join: (list: VbValue, delimiter?: VbValue): VbValue => {\n const delim = delimiter ? toString(delimiter) : ' ';\n if (list.type === 'Array') {\n const arr = list.value;\n if (typeof arr === 'object' && arr !== null && 'toArray' in arr) {\n const vbArray = arr as { toArray: () => VbValue[] };\n return { type: 'String', value: vbArray.toArray().map(v => toString(v)).join(delim) };\n }\n const plainArr = arr as VbValue[];\n return { type: 'String', value: plainArr.map(v => toString(v)).join(delim) };\n }\n return { type: 'String', value: '' };\n },\n\n Format: (expression: VbValue, format?: VbValue): VbValue => {\n if (expression.type === 'Empty' || expression.type === 'Null') {\n return { type: 'String', value: '' };\n }\n \n const formatStr = format ? toString(format) : '';\n \n if (!formatStr) {\n return { type: 'String', value: toString(expression) };\n }\n \n if (expression.type === 'Date' && expression.value instanceof Date) {\n return { type: 'String', value: formatDate(expression.value, formatStr) };\n }\n \n if (expression.type === 'Boolean') {\n return { type: 'String', value: expression.value ? 'True' : 'False' };\n }\n \n if (['Integer', 'Long', 'Single', 'Double', 'Currency', 'Byte'].includes(expression.type)) {\n return { type: 'String', value: formatNumber(toNumber(expression), formatStr) };\n }\n \n if (expression.type === 'String') {\n return { type: 'String', value: formatString(toString(expression), formatStr) };\n }\n \n return { type: 'String', value: toString(expression) };\n },\n\n LSet: (string: VbValue, length: VbValue): VbValue => {\n const str = toString(string);\n const len = Math.max(0, Math.floor(toNumber(length)));\n \n if (str.length >= len) {\n return { type: 'String', value: str.substring(0, len) };\n }\n \n return { type: 'String', value: str.padEnd(len, ' ') };\n },\n\n RSet: (string: VbValue, length: VbValue): VbValue => {\n const str = toString(string);\n const len = Math.max(0, Math.floor(toNumber(length)));\n \n if (str.length >= len) {\n return { type: 'String', value: str.substring(0, len) };\n }\n \n return { type: 'String', value: str.padStart(len, ' ') };\n },\n};\n","import type { VbValue } from '../runtime/index.ts';\nimport { createVbValue, toNumber, VbEmpty } from '../runtime/index.ts';\n\nexport const mathFunctions = {\n Abs: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return createVbValue(Math.abs(num));\n },\n\n Sgn: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Integer', value: num > 0 ? 1 : num < 0 ? -1 : 0 };\n },\n\n Sqr: (number: VbValue): VbValue => {\n const num = toNumber(number);\n if (num < 0) {\n throw new Error('Invalid procedure call or argument: Sqr');\n }\n return { type: 'Double', value: Math.sqrt(num) };\n },\n\n Int: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Long', value: Math.floor(num) };\n },\n\n Fix: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Long', value: num >= 0 ? Math.floor(num) : Math.ceil(num) };\n },\n\n Round: (number: VbValue, numDecimalPlaces?: VbValue): VbValue => {\n const num = toNumber(number);\n const decimals = numDecimalPlaces ? Math.floor(toNumber(numDecimalPlaces)) : 0;\n const factor = Math.pow(10, decimals);\n return { type: 'Double', value: Math.round(num * factor) / factor };\n },\n\n Atn: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Double', value: Math.atan(num) };\n },\n\n Cos: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Double', value: Math.cos(num) };\n },\n\n Sin: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Double', value: Math.sin(num) };\n },\n\n Tan: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Double', value: Math.tan(num) };\n },\n\n Exp: (number: VbValue): VbValue => {\n const num = toNumber(number);\n return { type: 'Double', value: Math.exp(num) };\n },\n\n Log: (number: VbValue): VbValue => {\n const num = toNumber(number);\n if (num <= 0) {\n throw new Error('Invalid procedure call or argument: Log');\n }\n return { type: 'Double', value: Math.log(num) };\n },\n\n Rnd: (_number?: VbValue): VbValue => {\n return { type: 'Single', value: Math.random() };\n },\n\n Randomize: (_number?: VbValue): VbValue => {\n return VbEmpty;\n },\n\n Oct: (number: VbValue): VbValue => {\n const num = Math.floor(toNumber(number));\n return { type: 'String', value: num.toString(8) };\n },\n\n Hex: (number: VbValue): VbValue => {\n const num = Math.floor(toNumber(number));\n return { type: 'String', value: num.toString(16).toUpperCase() };\n },\n};\n\nexport const constants: Record<string, VbValue> = {\n vbCr: { type: 'String', value: '\\r' },\n vbCrLf: { type: 'String', value: '\\r\\n' },\n vbFormFeed: { type: 'String', value: '\\f' },\n vbLf: { type: 'String', value: '\\n' },\n vbNewLine: { type: 'String', value: '\\r\\n' },\n vbNullChar: { type: 'String', value: '\\0' },\n vbTab: { type: 'String', value: '\\t' },\n vbVerticalTab: { type: 'String', value: '\\v' },\n vbNullString: { type: 'String', value: '' },\n vbObjectError: { type: 'Long', value: -2147221504 },\n \n vbSunday: { type: 'Integer', value: 1 },\n vbMonday: { type: 'Integer', value: 2 },\n vbTuesday: { type: 'Integer', value: 3 },\n vbWednesday: { type: 'Integer', value: 4 },\n vbThursday: { type: 'Integer', value: 5 },\n vbFriday: { type: 'Integer', value: 6 },\n vbSaturday: { type: 'Integer', value: 7 },\n \n vbUseSystemDayOfWeek: { type: 'Integer', value: 0 },\n vbFirstJan1: { type: 'Integer', value: 1 },\n vbFirstFourDays: { type: 'Integer', value: 2 },\n vbFirstFullWeek: { type: 'Integer', value: 3 },\n \n vbBinaryCompare: { type: 'Integer', value: 0 },\n vbTextCompare: { type: 'Integer', value: 1 },\n vbDatabaseCompare: { type: 'Integer', value: 2 },\n \n vbGeneralDate: { type: 'Integer', value: 0 },\n vbLongDate: { type: 'Integer', value: 1 },\n vbShortDate: { type: 'Integer', value: 2 },\n vbLongTime: { type: 'Integer', value: 3 },\n vbShortTime: { type: 'Integer', value: 4 },\n \n vbEmpty: { type: 'Integer', value: 0 },\n vbNull: { type: 'Integer', value: 1 },\n vbInteger: { type: 'Integer', value: 2 },\n vbLong: { type: 'Integer', value: 3 },\n vbSingle: { type: 'Integer', value: 4 },\n vbDouble: { type: 'Integer', value: 5 },\n vbCurrency: { type: 'Integer', value: 6 },\n vbDate: { type: 'Integer', value: 7 },\n vbString: { type: 'Integer', value: 8 },\n vbObject: { type: 'Integer', value: 9 },\n vbError: { type: 'Integer', value: 10 },\n vbBoolean: { type: 'Integer', value: 11 },\n vbVariant: { type: 'Integer', value: 12 },\n vbDataObject: { type: 'Integer', value: 13 },\n vbDecimal: { type: 'Integer', value: 14 },\n vbByte: { type: 'Integer', value: 17 },\n vbArray: { type: 'Integer', value: 8192 },\n\n vbOKOnly: { type: 'Integer', value: 0 },\n vbOKCancel: { type: 'Integer', value: 1 },\n vbAbortRetryIgnore: { type: 'Integer', value: 2 },\n vbYesNoCancel: { type: 'Integer', value: 3 },\n vbYesNo: { type: 'Integer', value: 4 },\n vbRetryCancel: { type: 'Integer', value: 5 },\n\n vbCritical: { type: 'Integer', value: 16 },\n vbQuestion: { type: 'Integer', value: 32 },\n vbExclamation: { type: 'Integer', value: 48 },\n vbInformation: { type: 'Integer', value: 64 },\n\n vbDefaultButton1: { type: 'Integer', value: 0 },\n vbDefaultButton2: { type: 'Integer', value: 256 },\n vbDefaultButton3: { type: 'Integer', value: 512 },\n\n vbOK: { type: 'Integer', value: 1 },\n vbCancel: { type: 'Integer', value: 2 },\n vbAbort: { type: 'Integer', value: 3 },\n vbRetry: { type: 'Integer', value: 4 },\n vbIgnore: { type: 'Integer', value: 5 },\n vbYes: { type: 'Integer', value: 6 },\n vbNo: { type: 'Integer', value: 7 },\n};\n","import type { VbValue } from '../runtime/index.ts';\nimport { toNumber, toString } from '../runtime/index.ts';\n\nfunction serialToDate(serial: number): Date {\n const baseDate = new Date(1899, 11, 30);\n return new Date(baseDate.getTime() + serial * 86400000);\n}\n\nexport const dateFunctions = {\n Now: (): VbValue => {\n return { type: 'Date', value: new Date() };\n },\n\n Date: (): VbValue => {\n const now = new Date();\n return { type: 'Date', value: new Date(now.getFullYear(), now.getMonth(), now.getDate()) };\n },\n\n Time: (): VbValue => {\n const now = new Date();\n return { type: 'Date', value: new Date(0, 0, 0, now.getHours(), now.getMinutes(), now.getSeconds()) };\n },\n\n Year: (date: VbValue): VbValue => {\n const d = date.type === 'Date' ? (date.value as Date) : serialToDate(toNumber(date));\n return { type: 'Integer', value: d.getFullYear() };\n },\n\n Month: (date: VbValue): VbValue => {\n const d = date.type === 'Date' ? (date.value as Date) : serialToDate(toNumber(date));\n return { type: 'Integer', value: d.getMonth() + 1 };\n },\n\n Day: (date: VbValue): VbValue => {\n const d = date.type === 'Date' ? (date.value as Date) : serialToDate(toNumber(date));\n return { type: 'Integer', value: d.getDate() };\n },\n\n Weekday: (date: VbValue, firstDayOfWeek?: VbValue): VbValue => {\n const d = date.type === 'Date' ? (date.value as Date) : serialToDate(toNumber(date));\n const firstDay = firstDayOfWeek ? Math.floor(toNumber(firstDayOfWeek)) : 1;\n let day = d.getDay() + 1;\n day = day - firstDay + 1;\n if (day < 1) day += 7;\n return { type: 'Integer', value: day };\n },\n\n Hour: (time: VbValue): VbValue => {\n const d = time.type === 'Date' ? (time.value as Date) : serialToDate(toNumber(time));\n return { type: 'Integer', value: d.getHours() };\n },\n\n Minute: (time: VbValue): VbValue => {\n const d = time.type === 'Date' ? (time.value as Date) : serialToDate(toNumber(time));\n return { type: 'Integer', value: d.getMinutes() };\n },\n\n Second: (time: VbValue): VbValue => {\n const d = time.type === 'Date' ? (time.value as Date) : serialToDate(toNumber(time));\n return { type: 'Integer', value: d.getSeconds() };\n },\n\n DateAdd: (interval: VbValue, number: VbValue, date: VbValue): VbValue => {\n const intv = toString(interval).toLowerCase();\n const num = toNumber(number);\n const d = date.type === 'Date' ? new Date(date.value as Date) : serialToDate(toNumber(date));\n \n switch (intv) {\n case 'yyyy':\n d.setFullYear(d.getFullYear() + num);\n break;\n case 'q':\n d.setMonth(d.getMonth() + num * 3);\n break;\n case 'm':\n d.setMonth(d.getMonth() + num);\n break;\n case 'y':\n case 'd':\n case 'w':\n d.setDate(d.getDate() + num);\n break;\n case 'ww':\n d.setDate(d.getDate() + num * 7);\n break;\n case 'h':\n d.setHours(d.getHours() + num);\n break;\n case 'n':\n d.setMinutes(d.getMinutes() + num);\n break;\n case 's':\n d.setSeconds(d.getSeconds() + num);\n break;\n }\n \n return { type: 'Date', value: d };\n },\n\n DateDiff: (interval: VbValue, date1: VbValue, date2: VbValue, _firstDayOfWeek?: VbValue, _firstWeekOfYear?: VbValue): VbValue => {\n const intv = toString(interval).toLowerCase();\n const d1 = date1.type === 'Date' ? (date1.value as Date) : serialToDate(toNumber(date1));\n const d2 = date2.type === 'Date' ? (date2.value as Date) : serialToDate(toNumber(date2));\n const diff = d2.getTime() - d1.getTime();\n \n let result: number;\n switch (intv) {\n case 'yyyy':\n result = d2.getFullYear() - d1.getFullYear();\n break;\n case 'q':\n result = Math.floor((d2.getFullYear() - d1.getFullYear()) * 4 + (d2.getMonth() - d1.getMonth()) / 3);\n break;\n case 'm':\n result = (d2.getFullYear() - d1.getFullYear()) * 12 + (d2.getMonth() - d1.getMonth());\n break;\n case 'y':\n case 'd':\n result = Math.floor(diff / 86400000);\n break;\n case 'w':\n result = Math.floor(diff / 86400000);\n break;\n case 'ww':\n result = Math.floor(diff / (86400000 * 7));\n break;\n case 'h':\n result = Math.floor(diff / 3600000);\n break;\n case 'n':\n result = Math.floor(diff / 60000);\n break;\n case 's':\n result = Math.floor(diff / 1000);\n break;\n default:\n result = 0;\n }\n \n return { type: 'Long', value: result };\n },\n\n DatePart: (interval: VbValue, date: VbValue, _firstDayOfWeek?: VbValue, _firstWeekOfYear?: VbValue): VbValue => {\n const intv = toString(interval).toLowerCase();\n const d = date.type === 'Date' ? (date.value as Date) : serialToDate(toNumber(date));\n \n let result: number;\n switch (intv) {\n case 'yyyy':\n result = d.getFullYear();\n break;\n case 'q':\n result = Math.floor(d.getMonth() / 3) + 1;\n break;\n case 'm':\n result = d.getMonth() + 1;\n break;\n case 'y':\n const startOfYear = new Date(d.getFullYear(), 0, 1);\n result = Math.floor((d.getTime() - startOfYear.getTime()) / 86400000) + 1;\n break;\n case 'd':\n result = d.getDate();\n break;\n case 'w':\n result = d.getDay() + 1;\n break;\n case 'ww':\n const startOfYear2 = new Date(d.getFullYear(), 0, 1);\n result = Math.floor((d.getTime() - startOfYear2.getTime()) / (86400000 * 7)) + 1;\n break;\n case 'h':\n result = d.getHours();\n break;\n case 'n':\n result = d.getMinutes();\n break;\n case 's':\n result = d.getSeconds();\n break;\n default:\n result = 0;\n }\n \n return { type: 'Integer', value: result };\n },\n\n DateSerial: (year: VbValue, month: VbValue, day: VbValue): VbValue => {\n const y = Math.floor(toNumber(year));\n const m = Math.floor(toNumber(month));\n const d = Math.floor(toNumber(day));\n return { type: 'Date', value: new Date(y, m - 1, d) };\n },\n\n TimeSerial: (hour: VbValue, minute: VbValue, second: VbValue): VbValue => {\n const h = Math.floor(toNumber(hour));\n const m = Math.floor(toNumber(minute));\n const s = Math.floor(toNumber(second));\n return { type: 'Date', value: new Date(0, 0, 0, h, m, s) };\n },\n\n DateValue: (date: VbValue): VbValue => {\n const d = new Date(toString(date));\n if (isNaN(d.getTime())) {\n throw new Error('Type mismatch: DateValue');\n }\n return { type: 'Date', value: new Date(d.getFullYear(), d.getMonth(), d.getDate()) };\n },\n\n TimeValue: (time: VbValue): VbValue => {\n const d = new Date(toString(time));\n if (isNaN(d.getTime())) {\n throw new Error('Type mismatch: TimeValue');\n }\n return { type: 'Date', value: new Date(0, 0, 0, d.getHours(), d.getMinutes(), d.getSeconds()) };\n },\n\n MonthName: (month: VbValue, abbreviate?: VbValue): VbValue => {\n const m = Math.floor(toNumber(month));\n const names = ['January', 'February', 'March', 'April', 'May', 'June', \n 'July', 'August', 'September', 'October', 'November', 'December'];\n const abbrev = abbreviate ? toNumber(abbreviate) !== 0 : false;\n const name = names[m - 1] || '';\n return { type: 'String', value: abbrev ? name.substring(0, 3) : name };\n },\n\n WeekdayName: (weekday: VbValue, abbreviate?: VbValue, _firstDayOfWeek?: VbValue): VbValue => {\n const w = Math.floor(toNumber(weekday));\n const names = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n const abbrev = abbreviate ? toNumber(abbreviate) !== 0 : false;\n const name = names[w - 1] || '';\n return { type: 'String', value: abbrev ? name.substring(0, 3) : name };\n },\n\n Timer: (): VbValue => {\n const now = new Date();\n return { type: 'Single', value: now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds() + now.getMilliseconds() / 1000 };\n },\n};\n","import type { VbValue } from '../runtime/index.ts';\nimport { toNumber, toString, toBoolean, isEmpty, isNull, isNumeric } from '../runtime/index.ts';\nimport { getCurrentCurrency, getCurrentBCP47Locale } from './locale.ts';\n\nexport const conversionFunctions = {\n CBool: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: toBoolean(expression) };\n },\n\n CByte: (expression: VbValue): VbValue => {\n const num = Math.floor(toNumber(expression));\n if (num < 0 || num > 255) {\n throw new Error('Overflow: CByte');\n }\n return { type: 'Byte', value: num };\n },\n\n CCur: (expression: VbValue): VbValue => {\n return { type: 'Currency', value: toNumber(expression) };\n },\n\n CDate: (expression: VbValue): VbValue => {\n if (expression.type === 'Date') {\n return expression;\n }\n const str = toString(expression);\n const d = new Date(str);\n if (isNaN(d.getTime())) {\n throw new Error('Type mismatch: CDate');\n }\n return { type: 'Date', value: d };\n },\n\n CDbl: (expression: VbValue): VbValue => {\n return { type: 'Double', value: toNumber(expression) };\n },\n\n CInt: (expression: VbValue): VbValue => {\n const num = Math.round(toNumber(expression));\n if (num < -32768 || num > 32767) {\n throw new Error('Overflow: CInt');\n }\n return { type: 'Integer', value: num };\n },\n\n CLng: (expression: VbValue): VbValue => {\n const num = Math.round(toNumber(expression));\n return { type: 'Long', value: num };\n },\n\n CSng: (expression: VbValue): VbValue => {\n return { type: 'Single', value: toNumber(expression) };\n },\n\n CStr: (expression: VbValue): VbValue => {\n return { type: 'String', value: toString(expression) };\n },\n\n CVar: (expression: VbValue): VbValue => {\n return expression;\n },\n\n CVErr: (errorNumber: VbValue): VbValue => {\n return { type: 'Error', value: toNumber(errorNumber) };\n },\n\n Val: (string: VbValue): VbValue => {\n const str = toString(string).trim();\n const match = str.match(/^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?/);\n if (match) {\n return { type: 'Double', value: parseFloat(match[0]) };\n }\n return { type: 'Double', value: 0 };\n },\n\n Str: (number: VbValue): VbValue => {\n const num = toNumber(number);\n const str = String(num);\n if (num >= 0) {\n return { type: 'String', value: ' ' + str };\n }\n return { type: 'String', value: str };\n },\n\n FormatNumber: (expression: VbValue, numDigitsAfterDecimal?: VbValue, includeLeadingDigit?: VbValue, _useParensForNegativeNumbers?: VbValue, groupDigits?: VbValue): VbValue => {\n const num = toNumber(expression);\n const decimals = numDigitsAfterDecimal ? Math.floor(toNumber(numDigitsAfterDecimal)) : -1;\n const leadingDigit = includeLeadingDigit ? toNumber(includeLeadingDigit) : -2;\n const grouping = groupDigits ? toNumber(groupDigits) : -2;\n \n const options: Intl.NumberFormatOptions = {\n minimumFractionDigits: decimals >= 0 ? decimals : undefined,\n maximumFractionDigits: decimals >= 0 ? decimals : undefined,\n useGrouping: grouping === 0 ? false : grouping === -1 ? true : undefined,\n };\n \n if (leadingDigit === -1) {\n options.minimumIntegerDigits = 1;\n } else if (leadingDigit === 0) {\n options.minimumIntegerDigits = 2;\n }\n \n const locale = getCurrentBCP47Locale();\n return { type: 'String', value: num.toLocaleString(locale, options) };\n },\n\n FormatCurrency: (expression: VbValue, numDigitsAfterDecimal?: VbValue, includeLeadingDigit?: VbValue, _useParensForNegativeNumbers?: VbValue, groupDigits?: VbValue): VbValue => {\n const num = toNumber(expression);\n const decimals = numDigitsAfterDecimal ? Math.floor(toNumber(numDigitsAfterDecimal)) : -1;\n const leadingDigit = includeLeadingDigit ? toNumber(includeLeadingDigit) : -2;\n const grouping = groupDigits ? toNumber(groupDigits) : -2;\n \n const options: Intl.NumberFormatOptions = {\n style: 'currency',\n currency: getCurrentCurrency(),\n minimumFractionDigits: decimals >= 0 ? decimals : 2,\n maximumFractionDigits: decimals >= 0 ? decimals : 2,\n useGrouping: grouping === 0 ? false : grouping === -1 ? true : undefined,\n };\n \n if (leadingDigit === -1) {\n options.minimumIntegerDigits = 1;\n } else if (leadingDigit === 0) {\n options.minimumIntegerDigits = 2;\n }\n \n const locale = getCurrentBCP47Locale();\n return { type: 'String', value: num.toLocaleString(locale, options) };\n },\n\n FormatPercent: (expression: VbValue, numDigitsAfterDecimal?: VbValue, includeLeadingDigit?: VbValue, _useParensForNegativeNumbers?: VbValue, groupDigits?: VbValue): VbValue => {\n const num = toNumber(expression);\n const decimals = numDigitsAfterDecimal ? Math.floor(toNumber(numDigitsAfterDecimal)) : -1;\n const leadingDigit = includeLeadingDigit ? toNumber(includeLeadingDigit) : -2;\n const grouping = groupDigits ? toNumber(groupDigits) : -2;\n \n const options: Intl.NumberFormatOptions = {\n style: 'percent',\n minimumFractionDigits: decimals >= 0 ? decimals : undefined,\n maximumFractionDigits: decimals >= 0 ? decimals : undefined,\n useGrouping: grouping === 0 ? false : grouping === -1 ? true : undefined,\n };\n \n if (leadingDigit === -1) {\n options.minimumIntegerDigits = 1;\n } else if (leadingDigit === 0) {\n options.minimumIntegerDigits = 2;\n }\n \n const locale = getCurrentBCP47Locale();\n return { type: 'String', value: num.toLocaleString(locale, options) };\n },\n\n FormatDateTime: (date: VbValue, namedFormat?: VbValue): VbValue => {\n const d = date.type === 'Date' ? (date.value as Date) : new Date(toString(date));\n const format = namedFormat ? Math.floor(toNumber(namedFormat)) : 0;\n const locale = getCurrentBCP47Locale();\n \n let result: string;\n switch (format) {\n case 0:\n result = d.toLocaleString(locale);\n break;\n case 1:\n result = d.toLocaleDateString(locale, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\n break;\n case 2:\n result = d.toLocaleDateString(locale);\n break;\n case 3:\n result = d.toLocaleTimeString(locale);\n break;\n case 4:\n result = d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' });\n break;\n default:\n result = d.toLocaleString();\n }\n \n return { type: 'String', value: result };\n },\n\n Hex: (number: VbValue): VbValue => {\n const num = Math.floor(toNumber(number));\n return { type: 'String', value: num.toString(16).toUpperCase() };\n },\n\n Oct: (number: VbValue): VbValue => {\n const num = Math.floor(toNumber(number));\n return { type: 'String', value: num.toString(8) };\n },\n};\n\nexport const inspectionFunctions = {\n IsArray: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Array' };\n },\n\n IsDate: (expression: VbValue): VbValue => {\n if (expression.type === 'Date') {\n return { type: 'Boolean', value: true };\n }\n if (expression.type === 'String') {\n const d = new Date(expression.value as string);\n return { type: 'Boolean', value: !isNaN(d.getTime()) };\n }\n return { type: 'Boolean', value: false };\n },\n\n IsEmpty: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: isEmpty(expression) };\n },\n\n IsNull: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: isNull(expression) };\n },\n\n IsNumeric: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: isNumeric(expression) };\n },\n\n IsObject: (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Object' };\n },\n\n VarType: (expression: VbValue): VbValue => {\n const typeMap: Record<string, number> = {\n 'Empty': 0,\n 'Null': 1,\n 'Integer': 2,\n 'Long': 3,\n 'Single': 4,\n 'Double': 5,\n 'Currency': 6,\n 'Date': 7,\n 'String': 8,\n 'Object': 9,\n 'Error': 10,\n 'Boolean': 11,\n 'Variant': 12,\n 'Byte': 17,\n 'Array': 8192,\n };\n return { type: 'Integer', value: typeMap[expression.type] ?? 12 };\n },\n\n TypeName: (expression: VbValue): VbValue => {\n const typeNames: Record<string, string> = {\n 'Empty': 'Empty',\n 'Null': 'Null',\n 'Integer': 'Integer',\n 'Long': 'Long',\n 'Single': 'Single',\n 'Double': 'Double',\n 'Currency': 'Currency',\n 'Date': 'Date',\n 'String': 'String',\n 'Object': 'Object',\n 'Error': 'Error',\n 'Boolean': 'Boolean',\n 'Variant': 'Variant',\n 'Byte': 'Byte',\n 'Array': 'Variant()',\n };\n return { type: 'String', value: typeNames[expression.type] ?? 'Variant' };\n },\n};\n","import type { VbValue } from '../runtime/index.ts';\r\nimport { toNumber, VbArray, createVbArrayFromValues } from '../runtime/index.ts';\r\n\r\nexport const arrayFunctions = {\r\n Array: (...args: VbValue[]): VbValue => {\r\n const arr = createVbArrayFromValues(args);\r\n return { type: 'Array', value: arr };\r\n },\r\n\r\n LBound: (arrayname: VbValue, dimension?: VbValue): VbValue => {\r\n if (arrayname.type !== 'Array') {\r\n throw new Error('Type mismatch: LBound');\r\n }\r\n const arr = arrayname.value as VbArray;\r\n const dim = dimension ? Math.floor(toNumber(dimension)) : 1;\r\n const bounds = arr.getBounds(dim);\r\n return { type: 'Long', value: bounds.lower };\r\n },\r\n\r\n UBound: (arrayname: VbValue, dimension?: VbValue): VbValue => {\r\n if (arrayname.type !== 'Array') {\r\n throw new Error('Type mismatch: UBound');\r\n }\r\n const arr = arrayname.value as VbArray;\r\n const dim = dimension ? Math.floor(toNumber(dimension)) : 1;\r\n const bounds = arr.getBounds(dim);\r\n return { type: 'Long', value: bounds.upper };\r\n },\r\n\r\n IsArray: (expression: VbValue): VbValue => {\r\n return { type: 'Boolean', value: expression.type === 'Array' };\r\n },\r\n\r\n Filter: (inputStrings: VbValue, value: VbValue, include?: VbValue, _compare?: VbValue): VbValue => {\r\n if (inputStrings.type !== 'Array') {\r\n throw new Error('Type mismatch: Filter');\r\n }\r\n const arr = (inputStrings.value as VbArray).toArray();\r\n const searchValue = (value.value as string).toLowerCase();\r\n const shouldInclude = include ? toNumber(include) !== 0 : true;\r\n \r\n const filtered = arr.filter(item => {\r\n const str = (item.value as string).toLowerCase();\r\n const found = str.includes(searchValue);\r\n return shouldInclude ? found : !found;\r\n });\r\n \r\n const result = createVbArrayFromValues(filtered);\r\n return { type: 'Array', value: result };\r\n },\r\n};\r\n\r\nexport function registerArrayFunctions(context: { functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue, options?: { isSub: boolean }) => void } }): void {\r\n Object.entries(arrayFunctions).forEach(([name, func]) => {\r\n context.functionRegistry.register(name, func as (...args: VbValue[]) => VbValue);\r\n });\r\n}\r\n","import type { VbValue } from '../runtime/index.ts';\n\nexport const MsgBoxConstants = {\n vbOKOnly: 0,\n vbOKCancel: 1,\n vbAbortRetryIgnore: 2,\n vbYesNoCancel: 3,\n vbYesNo: 4,\n vbRetryCancel: 5,\n\n vbCritical: 16,\n vbQuestion: 32,\n vbExclamation: 48,\n vbInformation: 64,\n\n vbDefaultButton1: 0,\n vbDefaultButton2: 256,\n vbDefaultButton3: 512,\n\n vbOK: 1,\n vbCancel: 2,\n vbAbort: 3,\n vbRetry: 4,\n vbIgnore: 5,\n vbYes: 6,\n vbNo: 7,\n};\n\nexport type MsgBoxButtonType = 'OK' | 'OKCancel' | 'AbortRetryIgnore' | 'YesNoCancel' | 'YesNo' | 'RetryCancel';\nexport type MsgBoxIconType = 'Critical' | 'Question' | 'Exclamation' | 'Information' | null;\n\nexport interface MsgBoxResult {\n value: number;\n button: string;\n}\n\nfunction parseButtons(buttons: number | undefined): {\n buttonType: MsgBoxButtonType;\n iconType: MsgBoxIconType;\n defaultButton: number;\n} {\n const b = buttons ?? 0;\n const buttonTypeValue = b & 0x7;\n const iconValue = b & 0xF0;\n const defaultButton = b & 0x300;\n\n let buttonType: MsgBoxButtonType;\n switch (buttonTypeValue) {\n case 0: buttonType = 'OK'; break;\n case 1: buttonType = 'OKCancel'; break;\n case 2: buttonType = 'AbortRetryIgnore'; break;\n case 3: buttonType = 'YesNoCancel'; break;\n case 4: buttonType = 'YesNo'; break;\n case 5: buttonType = 'RetryCancel'; break;\n default: buttonType = 'OK';\n }\n\n let iconType: MsgBoxIconType = null;\n switch (iconValue) {\n case 16: iconType = 'Critical'; break;\n case 32: iconType = 'Question'; break;\n case 48: iconType = 'Exclamation'; break;\n case 64: iconType = 'Information'; break;\n }\n\n return { buttonType, iconType, defaultButton };\n}\n\nfunction getIconPrefix(iconType: MsgBoxIconType): string {\n switch (iconType) {\n case 'Critical': return '[X] ';\n case 'Question': return '[?] ';\n case 'Exclamation': return '[!] ';\n case 'Information': return '[i] ';\n default: return '';\n }\n}\n\nfunction buildPrompt(title: string | null, iconType: MsgBoxIconType, message: string): string {\n let prompt = getIconPrefix(iconType) + message;\n if (title) {\n prompt = `[${title}]\\n` + prompt;\n }\n return prompt;\n}\n\nfunction mapButtonToResult(button: string, buttonType: MsgBoxButtonType): number {\n const b = button.toLowerCase();\n switch (buttonType) {\n case 'OK':\n case 'OKCancel':\n return b === 'ok' || b === 'confirm' ? MsgBoxConstants.vbOK : MsgBoxConstants.vbCancel;\n case 'YesNo':\n case 'YesNoCancel':\n if (b === 'yes' || b === 'y') return MsgBoxConstants.vbYes;\n if (b === 'no' || b === 'n') return MsgBoxConstants.vbNo;\n return MsgBoxConstants.vbCancel;\n case 'RetryCancel':\n if (b === 'retry' || b === 'r') return MsgBoxConstants.vbRetry;\n return MsgBoxConstants.vbCancel;\n case 'AbortRetryIgnore':\n if (b === 'abort' || b === 'a') return MsgBoxConstants.vbAbort;\n if (b === 'retry' || b === 'r') return MsgBoxConstants.vbRetry;\n if (b === 'ignore' || b === 'i') return MsgBoxConstants.vbIgnore;\n return MsgBoxConstants.vbCancel;\n default:\n return MsgBoxConstants.vbCancel;\n }\n}\n\nfunction getButtonOptions(buttonType: MsgBoxButtonType, defaultButton: number): string[] {\n const options: string[] = [];\n switch (buttonType) {\n case 'OK':\n options.push('OK');\n break;\n case 'OKCancel':\n options.push(defaultButton === 256 ? 'OK (default), Cancel' : 'OK, Cancel (default)');\n break;\n case 'YesNo':\n options.push(defaultButton === 256 ? 'Yes (default), No' : 'Yes, No (default)');\n break;\n case 'YesNoCancel':\n if (defaultButton === 512) {\n options.push('Yes, No, Cancel (default)');\n } else if (defaultButton === 256) {\n options.push('Yes (default), No, Cancel');\n } else {\n options.push('Yes, No (default), Cancel');\n }\n break;\n case 'RetryCancel':\n options.push(defaultButton === 256 ? 'Retry (default), Cancel' : 'Retry, Cancel (default)');\n break;\n case 'AbortRetryIgnore':\n if (defaultButton === 512) {\n options.push('Abort, Retry, Ignore (default)');\n } else if (defaultButton === 256) {\n options.push('Abort, Retry (default), Ignore');\n } else {\n options.push('Abort (default), Retry, Ignore');\n }\n break;\n }\n return options;\n}\n\nfunction _getInputPrompt(buttonType: MsgBoxButtonType, _defaultButton: number): string {\n let prompt = '';\n switch (buttonType) {\n case 'OK':\n prompt = '[OK]';\n break;\n case 'OKCancel':\n prompt = '[O]K / [C]ancel';\n break;\n case 'YesNo':\n prompt = '[Y]es / [N]o';\n break;\n case 'YesNoCancel':\n prompt = '[Y]es / [N]o / [C]ancel';\n break;\n case 'RetryCancel':\n prompt = '[R]etry / [C]ancel';\n break;\n case 'AbortRetryIgnore':\n prompt = '[A]bort / [R]etry / [I]gnore';\n break;\n }\n return prompt;\n}\n\nfunction _readFromConsole(): Promise<string | null> {\n return new Promise((resolve) => {\n // @ts-ignore - Node.js specific\n const readline = require('readline');\n const rl = readline.createInterface({\n // @ts-ignore - Node.js specific\n input: process.stdin,\n // @ts-ignore - Node.js specific\n output: process.stdout\n });\n rl.question('', (answer: string) => {\n rl.close();\n resolve(answer || null);\n });\n });\n}\n\nfunction _syncReadFromConsole(): string | null {\n try {\n // @ts-ignore - Node.js specific\n const readline = require('readline');\n const rl = readline.createInterface({\n // @ts-ignore - Node.js specific\n input: process.stdin,\n // @ts-ignore - Node.js specific\n output: process.stdout\n });\n rl.question('', () => {});\n } catch (e) {\n return null;\n }\n return null;\n}\n\nexport interface MsgBoxOptions {\n alert?: (message: string) => void;\n confirm?: (message: string) => boolean | undefined;\n prompt?: (message: string, defaultValue: string) => string | null;\n console?: (message: string) => void;\n readline?: () => Promise<string | null>;\n}\n\nexport function createMsgBox(options?: MsgBoxOptions) {\n return function(\n _context: { functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue, options?: { isSub: boolean }) => void } },\n promptVal: VbValue,\n buttons?: VbValue,\n title?: VbValue\n ): VbValue {\n const message = String(promptVal.value ?? promptVal);\n const buttonsVal = buttons ? Number(buttons.value ?? buttons) : 0;\n const titleStr = title ? String(title.value ?? title) : null;\n\n const { buttonType, iconType, defaultButton } = parseButtons(buttonsVal);\n const fullPrompt = buildPrompt(titleStr, iconType, message);\n const buttonOptions = getButtonOptions(buttonType, defaultButton);\n\n const finalPrompt = fullPrompt + '\\n' + buttonOptions.join(' ');\n\n if (options?.alert && buttonType === 'OK') {\n options.alert(finalPrompt);\n return { type: 'Integer', value: MsgBoxConstants.vbOK };\n }\n\n if (options?.confirm) {\n const isYesNoType = buttonType === 'YesNo' || buttonType === 'YesNoCancel' || buttonType === 'OKCancel';\n if (isYesNoType) {\n const confirmResult = options.confirm(finalPrompt);\n if (confirmResult === undefined) {\n } else if (confirmResult) {\n return { type: 'Integer', value: buttonType === 'OKCancel' ? MsgBoxConstants.vbOK : MsgBoxConstants.vbYes };\n } else {\n return { type: 'Integer', value: buttonType === 'OKCancel' ? MsgBoxConstants.vbCancel : MsgBoxConstants.vbNo };\n }\n }\n }\n\n if (options?.console) {\n options.console(finalPrompt);\n } else {\n console.log(finalPrompt);\n }\n\n if (options?.readline) {\n return options.readline().then((input: string | null) => {\n if (input === null) {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n const result = mapButtonToResult(input, buttonType);\n return { type: 'Integer', value: result };\n }) as unknown as VbValue;\n }\n\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n };\n}\n\nexport function createBrowserMsgBox() {\n return function(prompt: VbValue, buttons?: VbValue, title?: VbValue): VbValue {\n const message = String(prompt.value ?? prompt);\n const buttonsVal = buttons ? Number(buttons.value ?? buttons) : 0;\n const titleStr = title ? String(title.value ?? title) : 'VBScript';\n\n const { buttonType, iconType } = parseButtons(buttonsVal);\n const fullPrompt = buildPrompt(titleStr, iconType, message);\n\n if (buttonType === 'OK') {\n alert(fullPrompt);\n return { type: 'Integer', value: MsgBoxConstants.vbOK };\n }\n\n if (buttonType === 'OKCancel') {\n const confirmed = confirm(fullPrompt);\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbOK : MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'YesNo') {\n const confirmed = confirm(fullPrompt + '\\n[OK]=Yes / [Cancel]=No');\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbYes : MsgBoxConstants.vbNo };\n }\n\n if (buttonType === 'YesNoCancel') {\n const input = window.prompt(fullPrompt + '\\n\\nEnter: Y (Yes) / N (No) / C (Cancel) or invalid value for cancel', '');\n if (input === null) {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n const normalized = input.trim().toUpperCase();\n if (normalized === 'Y' || normalized === 'YES') {\n return { type: 'Integer', value: MsgBoxConstants.vbYes };\n }\n if (normalized === 'N' || normalized === 'NO') {\n return { type: 'Integer', value: MsgBoxConstants.vbNo };\n }\n if (normalized === 'C' || normalized === 'CANCEL' || normalized === '') {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'RetryCancel') {\n const confirmed = confirm(fullPrompt + '\\n[OK]=Retry / [Cancel]=Cancel');\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbRetry : MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'AbortRetryIgnore') {\n const input = window.prompt(fullPrompt + '\\n\\nEnter: A (Abort) / R (Retry) / I (Ignore)', '');\n if (input === null) {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n const normalized = input.trim().toUpperCase();\n if (normalized === 'A' || normalized === 'ABORT') {\n return { type: 'Integer', value: MsgBoxConstants.vbAbort };\n }\n if (normalized === 'R' || normalized === 'RETRY') {\n return { type: 'Integer', value: MsgBoxConstants.vbRetry };\n }\n if (normalized === 'I' || normalized === 'IGNORE' || normalized === '') {\n return { type: 'Integer', value: MsgBoxConstants.vbIgnore };\n }\n return { type: 'Integer', value: MsgBoxConstants.vbIgnore };\n }\n\n alert(fullPrompt);\n return { type: 'Integer', value: MsgBoxConstants.vbOK };\n };\n}\n\nexport function registerMsgBox(context: { functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue, options?: { isSub: boolean }) => void } }): void {\n context.functionRegistry.register('MsgBox', (promptVal: VbValue, buttons?: VbValue, title?: VbValue): VbValue => {\n const message = String(promptVal.value ?? promptVal);\n const buttonsVal = buttons ? Number(buttons.value ?? buttons) : 0;\n const titleStr = title ? String(title.value ?? title) : null;\n\n const { buttonType, iconType, defaultButton } = parseButtons(buttonsVal);\n const fullPrompt = buildPrompt(titleStr, iconType, message);\n\n if (buttonType === 'OK') {\n if (typeof alert !== 'undefined') {\n alert(fullPrompt);\n } else {\n console.log(fullPrompt);\n }\n return { type: 'Integer', value: MsgBoxConstants.vbOK };\n }\n\n if (typeof window !== 'undefined' && typeof window.confirm === 'function') {\n if (buttonType === 'OKCancel') {\n const confirmed = confirm(fullPrompt);\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbOK : MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'YesNo') {\n const confirmed = confirm(fullPrompt + '\\n[OK]=Yes / [Cancel]=No');\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbYes : MsgBoxConstants.vbNo };\n }\n\n if (buttonType === 'YesNoCancel' && typeof window.prompt === 'function') {\n const input = window.prompt(fullPrompt + '\\n\\nEnter: Y (Yes) / N (No) / C (Cancel) or invalid value for cancel', '');\n if (input === null) {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n const normalized = input.trim().toUpperCase();\n if (normalized === 'Y' || normalized === 'YES') {\n return { type: 'Integer', value: MsgBoxConstants.vbYes };\n }\n if (normalized === 'N' || normalized === 'NO') {\n return { type: 'Integer', value: MsgBoxConstants.vbNo };\n }\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'RetryCancel') {\n const confirmed = confirm(fullPrompt + '\\n[OK]=Retry / [Cancel]=Cancel');\n return { type: 'Integer', value: confirmed ? MsgBoxConstants.vbRetry : MsgBoxConstants.vbCancel };\n }\n\n if (buttonType === 'AbortRetryIgnore' && typeof window.prompt === 'function') {\n const input = window.prompt(fullPrompt + '\\n\\nEnter: A (Abort) / R (Retry) / I (Ignore)', '');\n if (input === null) {\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }\n const normalized = input.trim().toUpperCase();\n if (normalized === 'A' || normalized === 'ABORT') {\n return { type: 'Integer', value: MsgBoxConstants.vbAbort };\n }\n if (normalized === 'R' || normalized === 'RETRY') {\n return { type: 'Integer', value: MsgBoxConstants.vbRetry };\n }\n if (normalized === 'I' || normalized === 'IGNORE' || normalized === '') {\n return { type: 'Integer', value: MsgBoxConstants.vbIgnore };\n }\n return { type: 'Integer', value: MsgBoxConstants.vbIgnore };\n }\n }\n\n console.log(fullPrompt + '\\n' + getButtonOptions(buttonType, defaultButton).join(' '));\n return { type: 'Integer', value: MsgBoxConstants.vbCancel };\n }, { isSub: false });\n}\n","import type { VbValue } from '../runtime/index.ts';\n\nexport interface InputBoxOptions {\n prompt?: (message: string, defaultValue: string) => string | null;\n console?: (message: string) => void;\n readline?: () => Promise<string | null>;\n}\n\nexport function createInputBox(options?: InputBoxOptions) {\n return function(\n _context: { functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue) => void } },\n promptVal: VbValue,\n title?: VbValue,\n defaultText?: VbValue,\n _xPos?: VbValue,\n _yPos?: VbValue,\n _helpFile?: VbValue,\n _contextVal?: VbValue\n ): VbValue {\n const message = String(promptVal.value ?? promptVal);\n const titleStr = title ? String(title.value ?? title) : 'Input';\n const defaultVal = defaultText ? String(defaultText.value ?? defaultText) : '';\n\n if (options?.prompt) {\n const result = options.prompt(message, defaultVal);\n return { type: 'String', value: result ?? '' };\n }\n\n if (options?.console) {\n options.console(`[${titleStr}]\\n${message}\\nDefault: ${defaultVal}\\nPress Enter to confirm or Esc to cancel`);\n } else {\n console.log(`[${titleStr}]\\n${message}\\nDefault: ${defaultVal}\\nPress Enter to confirm or Esc to cancel`);\n }\n\n if (options?.readline) {\n return options.readline().then((input: string | null) => {\n if (input === null) {\n return { type: 'String', value: '' };\n }\n return { type: 'String', value: input || defaultVal };\n }) as unknown as VbValue;\n }\n\n return { type: 'String', value: '' };\n };\n}\n\nexport function createBrowserInputBox() {\n return function(\n prompt: VbValue,\n title?: VbValue,\n defaultVal?: VbValue,\n _xPos?: VbValue,\n _yPos?: VbValue,\n _helpFile?: VbValue,\n _contextVal?: VbValue\n ): VbValue {\n const message = String(prompt.value ?? prompt);\n const titleStr = title ? String(title.value ?? title) : 'Input';\n const def = defaultVal ? String(defaultVal.value ?? defaultVal) : '';\n const result = window.prompt(`[${titleStr}]\\n${message}`, def);\n return { type: 'String', value: result ?? '' };\n };\n}\n\nexport function registerInputBox(context: { functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue) => void } }): void {\n context.functionRegistry.register('InputBox', (promptVal: VbValue, title?: VbValue, defaultText?: VbValue, _xPos?: VbValue, _yPos?: VbValue, _helpFile?: VbValue, _contextVal?: VbValue): VbValue => {\n const message = String(promptVal.value ?? promptVal);\n const titleStr = title ? String(title.value ?? title) : 'Input';\n const defaultVal = defaultText ? String(defaultText.value ?? defaultText) : '';\n\n if (typeof window !== 'undefined' && typeof window.prompt === 'function') {\n const result = window.prompt(`[${titleStr}]\\n${message}`, defaultVal);\n return { type: 'String', value: result ?? '' };\n }\n\n console.log(`[${titleStr}]\\n${message}\\nDefault: ${defaultVal}`);\n return { type: 'String', value: '' };\n });\n}\n","import type { VbValue } from '../runtime/index.ts';\n\ninterface VbMatch {\n firstIndex: number;\n length: number;\n value: string;\n subMatches: string[];\n}\n\ninterface VbRegExpState {\n pattern: string;\n global: boolean;\n ignoreCase: boolean;\n multiline: boolean;\n}\n\nfunction createMatchObject(match: VbMatch): VbValue {\n return {\n type: 'Object',\n value: {\n classInfo: { name: 'Match' },\n getProperty: (name: string): VbValue => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'firstindex') {\n return { type: 'Long', value: match.firstIndex };\n }\n if (lowerName === 'length') {\n return { type: 'Long', value: match.length };\n }\n if (lowerName === 'value') {\n return { type: 'String', value: match.value };\n }\n return { type: 'Empty', value: undefined };\n },\n hasProperty: (name: string): boolean => {\n const lowerName = name.toLowerCase();\n return ['firstindex', 'length', 'value'].includes(lowerName);\n },\n getPropertyNames: (): string[] => ['FirstIndex', 'Length', 'Value'],\n },\n };\n}\n\nfunction createSubMatchesObject(subMatches: string[]): VbValue {\n return {\n type: 'Object',\n value: {\n classInfo: { name: 'SubMatches' },\n getProperty: (name: string): VbValue => {\n const index = parseInt(name, 10);\n if (!isNaN(index) && index >= 0 && index < subMatches.length) {\n return { type: 'String', value: subMatches[index] ?? '' };\n }\n return { type: 'Empty', value: undefined };\n },\n hasProperty: (name: string): boolean => {\n const index = parseInt(name, 10);\n return !isNaN(index) && index >= 0 && index < subMatches.length;\n },\n hasMethod: (name: string): boolean => {\n return name.toLowerCase() === 'count';\n },\n getMethod: (name: string): { func: (...args: VbValue[]) => VbValue } => {\n if (name.toLowerCase() === 'count') {\n return { func: () => ({ type: 'Long', value: subMatches.length }) };\n }\n throw new Error(`Unknown SubMatches method: ${name}`);\n },\n },\n };\n}\n\nfunction createMatchesCollection(matches: VbMatch[]): VbValue {\n const matchObjects = matches.map(createMatchObject);\n \n return {\n type: 'Object',\n value: {\n classInfo: { name: 'Matches' },\n getProperty: (name: string): VbValue => {\n const index = parseInt(name, 10);\n if (!isNaN(index) && index >= 0 && index < matchObjects.length) {\n return matchObjects[index] ?? { type: 'Empty', value: undefined };\n }\n return { type: 'Empty', value: undefined };\n },\n hasProperty: (name: string): boolean => {\n const index = parseInt(name, 10);\n return !isNaN(index) && index >= 0 && index < matchObjects.length;\n },\n hasMethod: (name: string): boolean => {\n return name.toLowerCase() === 'count' || name.toLowerCase() === 'item';\n },\n getMethod: (name: string): { func: (...args: VbValue[]) => VbValue } => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'count') {\n return { func: () => ({ type: 'Long', value: matches.length }) };\n }\n if (lowerName === 'item') {\n return {\n func: (index: VbValue): VbValue => {\n const idx = Math.floor(Number(index.value ?? 0));\n if (idx >= 0 && idx < matchObjects.length) {\n return matchObjects[idx] ?? { type: 'Empty', value: undefined };\n }\n return { type: 'Empty', value: undefined };\n },\n };\n }\n throw new Error(`Unknown Matches method: ${name}`);\n },\n },\n };\n}\n\nfunction createRegExpObject(state: VbRegExpState): VbValue {\n return {\n type: 'Object',\n value: {\n classInfo: { name: 'RegExp' },\n regexpState: state,\n getProperty: (name: string): VbValue => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'pattern') {\n return { type: 'String', value: state.pattern };\n }\n if (lowerName === 'global') {\n return { type: 'Boolean', value: state.global };\n }\n if (lowerName === 'ignorecase') {\n return { type: 'Boolean', value: state.ignoreCase };\n }\n if (lowerName === 'multiline') {\n return { type: 'Boolean', value: state.multiline };\n }\n return { type: 'Empty', value: undefined };\n },\n setProperty: (name: string, value: VbValue): void => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'pattern') {\n state.pattern = String(value.value ?? '');\n } else if (lowerName === 'global') {\n state.global = Boolean(value.value);\n } else if (lowerName === 'ignorecase') {\n state.ignoreCase = Boolean(value.value);\n } else if (lowerName === 'multiline') {\n state.multiline = Boolean(value.value);\n }\n },\n hasProperty: (name: string): boolean => {\n const lowerName = name.toLowerCase();\n return ['pattern', 'global', 'ignorecase', 'multiline'].includes(lowerName);\n },\n hasMethod: (name: string): boolean => {\n return ['execute', 'test', 'replace'].includes(name.toLowerCase());\n },\n getMethod: (name: string): { func: (...args: VbValue[]) => VbValue } => {\n const lowerName = name.toLowerCase();\n \n if (lowerName === 'test') {\n return {\n func: (sourceString: VbValue): VbValue => {\n const source = String(sourceString.value ?? '');\n if (!state.pattern) {\n return { type: 'Boolean', value: false };\n }\n try {\n const flags = (state.ignoreCase ? 'i' : '') + (state.multiline ? 'm' : '');\n const regex = new RegExp(state.pattern, flags);\n const result = regex.test(source);\n return { type: 'Boolean', value: result };\n } catch {\n return { type: 'Boolean', value: false };\n }\n },\n };\n }\n \n if (lowerName === 'execute') {\n return {\n func: (sourceString: VbValue): VbValue => {\n const source = String(sourceString.value ?? '');\n if (!state.pattern) {\n return createMatchesCollection([]);\n }\n try {\n const flags = (state.ignoreCase ? 'i' : '') + (state.multiline ? 'm' : '') + (state.global ? 'g' : '');\n const regex = new RegExp(state.pattern, flags);\n const matches: VbMatch[] = [];\n let match;\n \n while ((match = regex.exec(source)) !== null) {\n matches.push({\n firstIndex: match.index,\n length: match[0].length,\n value: match[0],\n subMatches: match.slice(1).map(m => m ?? ''),\n });\n \n if (!state.global) {\n break;\n }\n }\n \n return createMatchesCollection(matches);\n } catch {\n return createMatchesCollection([]);\n }\n },\n };\n }\n \n if (lowerName === 'replace') {\n return {\n func: (sourceString: VbValue, replaceString: VbValue): VbValue => {\n const source = String(sourceString.value ?? '');\n const replace = String(replaceString.value ?? '');\n if (!state.pattern) {\n return { type: 'String', value: source };\n }\n try {\n const flags = (state.ignoreCase ? 'i' : '') + (state.multiline ? 'm' : '') + (state.global ? 'g' : '');\n const regex = new RegExp(state.pattern, flags);\n const result = source.replace(regex, replace);\n return { type: 'String', value: result };\n } catch {\n return { type: 'String', value: source };\n }\n },\n };\n }\n \n throw new Error(`Unknown RegExp method: ${name}`);\n },\n },\n };\n}\n\nexport function registerRegExp(context: { \n functionRegistry: { register: (name: string, func: (...args: VbValue[]) => VbValue) => void };\n classRegistry: { registerClass: (name: string, creator: () => VbValue) => void };\n}): void {\n context.classRegistry.registerClass('RegExp', () => {\n return createRegExpObject({\n pattern: '',\n global: false,\n ignoreCase: false,\n multiline: false,\n });\n });\n \n context.functionRegistry.register('RegExp', (): VbValue => {\n return createRegExpObject({\n pattern: '',\n global: false,\n ignoreCase: false,\n multiline: false,\n });\n });\n}\n","import type { VbContext, VbValue } from '../runtime/index.ts';\nimport { stringFunctions } from './string.ts';\nimport { mathFunctions, constants } from './math.ts';\nimport { dateFunctions } from './date.ts';\nimport { conversionFunctions, inspectionFunctions } from './conversion.ts';\nimport { arrayFunctions } from './array.ts';\nimport { registerMsgBox } from './msgbox.ts';\nimport { registerInputBox } from './inputbox.ts';\nimport { registerRegExp } from './regexp.ts';\nimport { localeFunctions } from './locale.ts';\n\nexport function registerBuiltins(context: VbContext): void {\n Object.entries(stringFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(mathFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(dateFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(conversionFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(inspectionFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(arrayFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n Object.entries(constants).forEach(([name, value]) => {\n context.globalScope.declare(name, value);\n });\n\n registerMsgBox(context);\n registerInputBox(context);\n registerRegExp(context);\n\n Object.entries(localeFunctions).forEach(([name, func]) => {\n context.functionRegistry.register(name, func);\n });\n\n context.functionRegistry.register('ScriptEngine', (): VbValue => {\n return { type: 'String', value: 'VBScript' };\n });\n\n context.functionRegistry.register('ScriptEngineMajorVersion', (): VbValue => {\n return { type: 'Integer', value: 10 };\n });\n\n context.functionRegistry.register('ScriptEngineMinorVersion', (): VbValue => {\n return { type: 'Integer', value: 8 };\n });\n\n context.functionRegistry.register('ScriptEngineBuildVersion', (): VbValue => {\n return { type: 'Long', value: 16384 };\n });\n\n context.functionRegistry.register('Eval', (expression: VbValue): VbValue => {\n const code = String(expression.value ?? expression);\n const result = context.evaluate?.(code);\n return result ?? { type: 'Empty', value: undefined };\n });\n\n context.functionRegistry.register('Execute', (expression: VbValue): VbValue => {\n const code = String(expression.value ?? expression);\n const result = context.execute?.(code);\n return result ?? { type: 'Empty', value: undefined };\n }, { isSub: true });\n\n context.functionRegistry.register('ExecuteGlobal', (expression: VbValue): VbValue => {\n const code = String(expression.value ?? expression);\n const result = context.executeGlobal?.(code);\n return result ?? { type: 'Empty', value: undefined };\n }, { isSub: true });\n\n context.functionRegistry.register('Print', (...args: VbValue[]): VbValue => {\n console.log(...args.map(a => a.value ?? a));\n return { type: 'Empty', value: undefined };\n }, { isSub: true });\n\n context.functionRegistry.register('GetRef', (procname: VbValue): VbValue => {\n const name = String(procname.value ?? procname);\n const funcRegistry = context.functionRegistry;\n return {\n type: 'Object',\n value: {\n type: 'vbref',\n name,\n getProperty: (propName: string): VbValue => {\n if (propName.toLowerCase() === 'name') {\n return { type: 'String', value: name };\n }\n return { type: 'Empty', value: undefined };\n },\n hasProperty: (propName: string): boolean => {\n return propName.toLowerCase() === 'name';\n },\n call: (...args: VbValue[]): VbValue => {\n return funcRegistry.call(name, args);\n },\n },\n };\n });\n\n context.functionRegistry.register('TypeName', (expression: VbValue): VbValue => {\n if (expression.type === 'Object' && expression.value && typeof expression.value === 'object') {\n const obj = expression.value as { classInfo?: { name: string } };\n if (obj.classInfo && obj.classInfo.name) {\n return { type: 'String', value: obj.classInfo.name };\n }\n }\n const typeNames: Record<string, string> = {\n 'Empty': 'Empty',\n 'Null': 'Null',\n 'Integer': 'Integer',\n 'Long': 'Long',\n 'Single': 'Single',\n 'Double': 'Double',\n 'Currency': 'Currency',\n 'Date': 'Date',\n 'String': 'String',\n 'Object': 'Object',\n 'Error': 'Error',\n 'Boolean': 'Boolean',\n 'Variant': 'Variant',\n 'Byte': 'Byte',\n 'Array': 'Variant()',\n };\n return { type: 'String', value: typeNames[expression.type] ?? 'Variant' };\n });\n\n context.functionRegistry.register('VarType', (expression: VbValue): VbValue => {\n const typeMap: Record<string, number> = {\n 'Empty': 0,\n 'Null': 1,\n 'Integer': 2,\n 'Long': 3,\n 'Single': 4,\n 'Double': 5,\n 'Currency': 6,\n 'Date': 7,\n 'String': 8,\n 'Object': 9,\n 'Error': 10,\n 'Boolean': 11,\n 'Variant': 12,\n 'Byte': 17,\n 'Array': 8192,\n };\n return { type: 'Integer', value: typeMap[expression.type] ?? 12 };\n });\n\n context.functionRegistry.register('IsEmpty', (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Empty' };\n });\n\n context.functionRegistry.register('IsNull', (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Null' };\n });\n\n context.functionRegistry.register('IsNumeric', (expression: VbValue): VbValue => {\n const numericTypes = ['Integer', 'Long', 'Single', 'Double', 'Currency', 'Byte'];\n if (numericTypes.includes(expression.type)) {\n return { type: 'Boolean', value: true };\n }\n if (expression.type === 'String') {\n const num = Number(expression.value);\n return { type: 'Boolean', value: !isNaN(num) };\n }\n return { type: 'Boolean', value: false };\n });\n\n context.functionRegistry.register('IsDate', (expression: VbValue): VbValue => {\n if (expression.type === 'Date') {\n return { type: 'Boolean', value: true };\n }\n if (expression.type === 'String') {\n const d = new Date(expression.value as string);\n return { type: 'Boolean', value: !isNaN(d.getTime()) };\n }\n return { type: 'Boolean', value: false };\n });\n\n context.functionRegistry.register('IsObject', (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Object' };\n });\n\n context.functionRegistry.register('IsArray', (expression: VbValue): VbValue => {\n return { type: 'Boolean', value: expression.type === 'Array' };\n });\n\n context.functionRegistry.register('Erase', (_arrayname: VbValue): VbValue => {\n return { type: 'Empty', value: undefined };\n }, { isSub: true });\n\n context.functionRegistry.register('GetObject', (_pathname?: VbValue, _cls?: VbValue): VbValue => {\n return { type: 'Object', value: null };\n });\n\n context.functionRegistry.register('CreateObject', (cls: VbValue, _servername?: VbValue): VbValue => {\n const className = String(cls.value ?? cls);\n return { type: 'Object', value: { className, properties: new Map() } };\n });\n\n context.functionRegistry.register('LoadPicture', (picturename: VbValue): VbValue => {\n const path = String(picturename.value ?? picturename);\n const imageObj = {\n classInfo: { name: 'IPictureDisp' },\n getProperty: (name: string): VbValue => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'handle') {\n return { type: 'Long', value: 0 };\n }\n if (lowerName === 'width') {\n return { type: 'Long', value: 0 };\n }\n if (lowerName === 'height') {\n return { type: 'Long', value: 0 };\n }\n if (lowerName === 'type') {\n return { type: 'Long', value: 1 };\n }\n return { type: 'Empty', value: undefined };\n },\n hasProperty: (name: string): boolean => {\n const lowerName = name.toLowerCase();\n return ['handle', 'width', 'height', 'type'].includes(lowerName);\n },\n _path: path,\n };\n return { type: 'Object', value: imageObj };\n });\n\n context.functionRegistry.register('RGB', (red: VbValue, green: VbValue, blue: VbValue): VbValue => {\n const r = Math.max(0, Math.min(255, Math.floor(Number(red.value ?? 0))));\n const g = Math.max(0, Math.min(255, Math.floor(Number(green.value ?? 0))));\n const b = Math.max(0, Math.min(255, Math.floor(Number(blue.value ?? 0))));\n const rgbValue = r + (g * 256) + (b * 65536);\n return { type: 'Long', value: rgbValue };\n });\n\n context.functionRegistry.register('QBColor', (color: VbValue): VbValue => {\n const colorIndex = Math.floor(Number(color.value ?? 0));\n const colors = [\n 0x000000, 0x800000, 0x008000, 0x808000,\n 0x000080, 0x800080, 0x008080, 0xC0C0C0,\n 0x808080, 0xFF0000, 0x00FF00, 0xFFFF00,\n 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF\n ];\n const rgbValue = colors[colorIndex] ?? 0;\n return { type: 'Long', value: rgbValue };\n });\n\n const errObject = {\n getProperty: (name: string): VbValue => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'number') {\n return { type: 'Long', value: context.err.number };\n }\n if (lowerName === 'description') {\n return { type: 'String', value: context.err.description };\n }\n if (lowerName === 'source') {\n return { type: 'String', value: context.err.source };\n }\n return { type: 'Empty', value: undefined };\n },\n setProperty: (name: string, value: VbValue): void => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'number') {\n context.err.number = Number(value.value) || 0;\n } else if (lowerName === 'description') {\n context.err.description = String(value.value ?? '');\n } else if (lowerName === 'source') {\n context.err.source = String(value.value ?? '');\n }\n },\n hasMethod: (name: string): boolean => {\n return name.toLowerCase() === 'clear' || name.toLowerCase() === 'raise';\n },\n getMethod: (name: string): { func: (...args: VbValue[]) => VbValue } => {\n const lowerName = name.toLowerCase();\n if (lowerName === 'clear') {\n return {\n func: (): VbValue => {\n context.clearError();\n return { type: 'Empty', value: undefined };\n }\n };\n }\n if (lowerName === 'raise') {\n return {\n func: (number: VbValue, source?: VbValue, description?: VbValue): VbValue => {\n context.err.number = Number(number.value) || 0;\n context.err.source = source ? String(source.value ?? '') : '';\n context.err.description = description ? String(description.value ?? '') : '';\n return { type: 'Empty', value: undefined };\n }\n };\n }\n throw new Error(`Unknown Err method: ${name}`);\n }\n };\n \n context.globalScope.declare('Err', { type: 'Object', value: errObject });\n}\n\nexport { stringFunctions } from './string.ts';\nexport { mathFunctions, constants } from './math.ts';\nexport { dateFunctions } from './date.ts';\nexport { conversionFunctions, inspectionFunctions } from './conversion.ts';\nexport { arrayFunctions } from './array.ts';\n","import type { Program, Statement, VbLabelStatement } from '../ast/index.ts';\nimport type { VbValue } from '../runtime/index.ts';\nimport { VbContext, VbEmpty } from '../runtime/index.ts';\nimport { StatementExecutor, GotoSignal, ControlFlowSignal } from './statement-executor.ts';\nimport { ExpressionEvaluator } from './expression-evaluator.ts';\nimport { registerBuiltins } from '../builtins/index.ts';\nimport { parse } from '../parser/index.ts';\n\ninterface LabelInfo {\n index: number;\n statement: VbLabelStatement;\n}\n\nexport class Interpreter {\n private context: VbContext;\n private executor: StatementExecutor;\n private maxExecutionTime: number = -1;\n private startTime: number = 0;\n\n constructor() {\n this.context = new VbContext();\n this.executor = new StatementExecutor(this.context);\n registerBuiltins(this.context);\n }\n\n setMaxExecutionTime(ms: number): void {\n this.maxExecutionTime = ms;\n }\n\n checkTimeout(): void {\n if (this.maxExecutionTime > 0) {\n const elapsed = Date.now() - this.startTime;\n if (elapsed > this.maxExecutionTime) {\n throw new Error(`Script execution timed out after ${this.maxExecutionTime}ms`);\n }\n }\n }\n\n private collectLabels(statements: Statement[]): Map<string, LabelInfo> {\n const labels = new Map<string, LabelInfo>();\n for (let i = 0; i < statements.length; i++) {\n const stmt = statements[i]!;\n if (stmt.type === 'VbLabelStatement') {\n const labelStmt = stmt as VbLabelStatement;\n labels.set(labelStmt.label.name.toLowerCase(), { index: i, statement: labelStmt });\n }\n }\n return labels;\n }\n\n run(program: Program): VbValue {\n this.startTime = Date.now();\n let result: VbValue = VbEmpty;\n const statements = program.body;\n const labels = this.collectLabels(statements);\n let i = 0;\n const maxIterations = statements.length * 10000;\n let iterations = 0;\n\n while (i < statements.length) {\n if (iterations++ > maxIterations) {\n throw new Error('Possible infinite loop detected (too many goto jumps)');\n }\n \n this.checkTimeout();\n const stmt = statements[i]!;\n \n try {\n result = this.executor.execute(stmt);\n i++;\n } catch (error) {\n if (error instanceof GotoSignal) {\n const labelInfo = labels.get(error.labelName);\n if (labelInfo) {\n i = labelInfo.index + 1;\n continue;\n }\n throw new Error(`Label not found: ${error.labelName}`);\n }\n if (error instanceof ControlFlowSignal) {\n throw error;\n }\n throw error;\n }\n }\n\n return result;\n }\n\n getVariable(name: string): VbValue {\n return this.context.getVariable(name);\n }\n\n setVariable(name: string, value: VbValue): void {\n this.context.setVariable(name, value);\n }\n\n registerFunction(name: string, func: (...args: VbValue[]) => VbValue): void {\n this.context.functionRegistry.register(name, func);\n }\n\n evaluate(code: string): VbValue {\n try {\n const ast = parse(code);\n const evaluator = new ExpressionEvaluator(this.context);\n const result = evaluator.evaluateProgram(ast);\n return result;\n } catch (e) {\n console.error('Eval error:', e);\n return { type: 'Empty', value: undefined };\n }\n }\n\n getContext(): VbContext {\n return this.context;\n }\n\n executeStatements(statements: Statement[]): VbValue {\n const labels = this.collectLabels(statements);\n let result: VbValue = VbEmpty;\n let i = 0;\n const maxIterations = statements.length * 10000;\n let iterations = 0;\n\n while (i < statements.length) {\n if (iterations++ > maxIterations) {\n throw new Error('Possible infinite loop detected (too many goto jumps)');\n }\n \n this.checkTimeout();\n const stmt = statements[i]!;\n \n try {\n result = this.executor.execute(stmt);\n i++;\n } catch (error) {\n if (error instanceof GotoSignal) {\n const labelInfo = labels.get(error.labelName);\n if (labelInfo) {\n i = labelInfo.index + 1;\n continue;\n }\n throw new Error(`Label not found: ${error.labelName}`);\n }\n if (error instanceof ControlFlowSignal) {\n throw error;\n }\n throw error;\n }\n }\n\n return result;\n }\n\n executeInCurrentScope(code: string): VbValue {\n const ast = parse(code);\n return this.executeStatements(ast.body);\n }\n\n executeInGlobalScope(code: string): VbValue {\n const savedScope = this.context.currentScope;\n this.context.currentScope = this.context.globalScope;\n try {\n const ast = parse(code);\n return this.executeStatements(ast.body);\n } finally {\n this.context.currentScope = savedScope;\n }\n }\n}\n\nexport function interpret(program: Program): VbValue {\n const interpreter = new Interpreter();\n return interpreter.run(program);\n}\n","import type { VbValue } from '../runtime/index.ts';\n\n/**\n * Converts a VbValue to its JavaScript equivalent.\n *\n * @param value - The VbValue to convert\n * @returns The JavaScript value (undefined, null, boolean, number, string, Date, array, or object)\n *\n * @example\n * ```typescript\n * const vbString = { type: 'String', value: 'hello' };\n * const jsString = vbToJs(vbString); // 'hello'\n * ```\n */\nexport function vbToJs(value: VbValue): unknown {\n switch (value.type) {\n case 'Empty':\n return undefined;\n case 'Null':\n return null;\n case 'Boolean':\n case 'Long':\n case 'Double':\n case 'Integer':\n case 'String':\n case 'Date':\n return value.value;\n case 'Array': {\n const arr = value.value as { toArray(): VbValue[] };\n return arr.toArray().map(vbToJs);\n }\n case 'Object':\n return value.value;\n default:\n return value.value;\n }\n}\n\n/**\n * Converts a JavaScript value to a VbValue.\n * Automatically determines the appropriate VBScript type based on the input.\n *\n * @param value - The JavaScript value to convert\n * @param thisArg - Optional this context for function bindings\n * @returns A VbValue representation\n *\n * @example\n * ```typescript\n * const vbNum = jsToVb(42); // { type: 'Long', value: 42 }\n * const vbStr = jsToVb('hello'); // { type: 'String', value: 'hello' }\n * ```\n */\nexport function jsToVb(value: unknown, thisArg?: unknown): VbValue {\n if (value === undefined) return { type: 'Empty', value: undefined };\n if (value === null) return { type: 'Null', value: null };\n if (typeof value === 'boolean') return { type: 'Boolean', value };\n if (typeof value === 'number') {\n if (Number.isInteger(value) && value >= -2147483648 && value <= 2147483647) {\n return { type: 'Long', value };\n }\n return { type: 'Double', value };\n }\n if (typeof value === 'string') return { type: 'String', value };\n if (value instanceof Date) return { type: 'Date', value };\n if (Array.isArray(value)) {\n return { type: 'Array', value };\n }\n if (typeof value === 'function') {\n return { type: 'Object', value: { type: 'jsfunction', func: value as (...args: unknown[]) => unknown, thisArg: thisArg ?? null } };\n }\n if (typeof value === 'object') {\n return { type: 'Object', value };\n }\n return { type: 'String', value: String(value) };\n}\n","import type { VbsEngine } from '../core/index.ts';\nimport type { OriginalSetTimeout, OriginalSetInterval, TimerOverrideState } from './types.ts';\n\nexport function overrideTimers(engine: VbsEngine): TimerOverrideState {\n if (typeof window === 'undefined') {\n return { originalSetTimeout: null, originalSetInterval: null };\n }\n\n const originalSetTimeout = window.setTimeout;\n const originalSetInterval = window.setInterval;\n\n (window as unknown as Record<string, unknown>).setTimeout = function(\n handler: unknown,\n delay?: unknown,\n languageOrArg?: unknown,\n ...args: unknown[]\n ): number {\n if (typeof handler === 'string') {\n const language = typeof languageOrArg === 'string' ? languageOrArg.toLowerCase() : null;\n const actualDelay = typeof delay === 'number' ? delay : 0;\n\n if (language === 'vbscript' || language === 'vbs') {\n return originalSetTimeout.call(window, () => {\n const funcRegistry = engine._getContext()?.functionRegistry;\n if (funcRegistry?.has(handler)) {\n engine.run(handler);\n } else {\n engine.executeStatement(handler);\n }\n }, actualDelay);\n }\n\n return originalSetTimeout.call(window, () => {\n const funcRegistry = engine._getContext()?.functionRegistry;\n if (funcRegistry?.has(handler)) {\n engine.run(handler);\n } else {\n engine.executeStatement(handler);\n }\n }, actualDelay);\n }\n\n return originalSetTimeout.call(window, handler as TimerHandler, delay as number | undefined, ...[languageOrArg, ...args].filter(a => a !== undefined));\n };\n\n (window as unknown as Record<string, unknown>).setInterval = function(\n handler: unknown,\n delay?: unknown,\n languageOrArg?: unknown,\n ...args: unknown[]\n ): number {\n if (typeof handler === 'string') {\n const language = typeof languageOrArg === 'string' ? languageOrArg.toLowerCase() : null;\n const actualDelay = typeof delay === 'number' ? delay : 0;\n\n if (language === 'vbscript' || language === 'vbs') {\n return originalSetInterval.call(window, () => {\n const funcRegistry = engine._getContext()?.functionRegistry;\n if (funcRegistry?.has(handler)) {\n engine.run(handler);\n } else {\n engine.executeStatement(handler);\n }\n }, actualDelay);\n }\n\n return originalSetInterval.call(window, () => {\n const funcRegistry = engine._getContext()?.functionRegistry;\n if (funcRegistry?.has(handler)) {\n engine.run(handler);\n } else {\n engine.executeStatement(handler);\n }\n }, actualDelay);\n }\n\n return originalSetInterval.call(window, handler as TimerHandler, delay as number | undefined, ...[languageOrArg, ...args].filter(a => a !== undefined));\n };\n\n return { originalSetTimeout, originalSetInterval };\n}\n\nexport function restoreTimers(state: TimerOverrideState): void {\n if (typeof window === 'undefined') return;\n\n if (state.originalSetTimeout) {\n (window as unknown as Record<string, unknown>).setTimeout = state.originalSetTimeout;\n }\n if (state.originalSetInterval) {\n (window as unknown as Record<string, unknown>).setInterval = state.originalSetInterval;\n }\n}\n","import type { VbsEngine } from '../core/index.ts';\nimport type { OriginalEval, EvalOverrideState } from './types.ts';\n\nexport function overrideEval(engine: VbsEngine): EvalOverrideState {\n if (typeof window === 'undefined') {\n return { originalEval: null };\n }\n\n const originalEval = window.eval;\n\n (window as unknown as Record<string, unknown>).vbsEval = function(code: unknown): unknown {\n return engine.eval(String(code));\n };\n\n (window as unknown as Record<string, unknown>).eval = function(code: unknown, language?: unknown): unknown {\n if (typeof language === 'string') {\n const lang = language.toLowerCase();\n if (lang === 'vbscript' || lang === 'vbs') {\n return engine.eval(String(code));\n }\n }\n return originalEval.call(window, String(code));\n };\n\n return { originalEval };\n}\n\nexport function restoreEval(state: EvalOverrideState): void {\n if (typeof window === 'undefined') return;\n\n if (state.originalEval) {\n (window as unknown as Record<string, unknown>).eval = state.originalEval;\n }\n delete (window as unknown as Record<string, unknown>).vbsEval;\n}\n","import type { VbsEngine } from '../core/index.ts';\n\nexport interface ProtocolHandlerResult {\n navigateHandler: ((event: Event) => void) | null;\n clickHandler: ((event: MouseEvent) => void) | null;\n}\n\nexport function setupVbscriptProtocol(engine: VbsEngine): ProtocolHandlerResult {\n if (typeof window === 'undefined') {\n return { navigateHandler: null, clickHandler: null };\n }\n\n let navigateHandler: ((event: Event) => void) | null = null;\n let clickHandler: ((event: MouseEvent) => void) | null = null;\n\n if ('navigation' in window && window.navigation) {\n navigateHandler = (event: Event): void => {\n const navEvent = event as { destination?: { url?: string } };\n const url = navEvent.destination?.url;\n if (url && url.toLowerCase().startsWith('vbscript:')) {\n event.preventDefault();\n const code = url.substring(9);\n try {\n engine.executeStatement(code);\n } catch (error) {\n console.error('VBScript protocol error:', error);\n }\n }\n };\n\n (window.navigation as EventTarget).addEventListener('navigate', navigateHandler);\n } else {\n clickHandler = (event: MouseEvent): void => {\n const target = event.target as HTMLElement;\n\n if (target.tagName === 'A' || target.tagName === 'AREA') {\n const href = target.getAttribute('href');\n if (href && href.toLowerCase().startsWith('vbscript:')) {\n event.preventDefault();\n const code = href.substring(9);\n try {\n engine.executeStatement(code);\n } catch (error) {\n console.error('VBScript protocol error:', error);\n }\n }\n }\n };\n\n document.addEventListener('click', clickHandler, true);\n }\n\n return { navigateHandler, clickHandler };\n}\n\nexport function cleanupVbscriptProtocol(result: ProtocolHandlerResult): void {\n if (typeof window === 'undefined') return;\n\n if (result.navigateHandler && 'navigation' in window && window.navigation) {\n (window.navigation as EventTarget).removeEventListener('navigate', result.navigateHandler);\n }\n\n if (result.clickHandler) {\n document.removeEventListener('click', result.clickHandler, true);\n }\n}\n","import type { VbValue } from '../runtime/index.ts';\n\nexport function createObject(cls: VbValue, _servername?: VbValue): VbValue {\n const className = String(cls.value ?? cls);\n\n const axConstructor = (window as unknown as { ActiveXObject?: new (cls: string) => unknown }).ActiveXObject;\n if (axConstructor) {\n try {\n const ax = new axConstructor(className);\n return { type: 'Object', value: {\n type: 'activex',\n object: ax,\n className\n }};\n } catch (e) {\n throw new Error(`ActiveX component can't create object: '${className}'`);\n }\n }\n\n throw new Error(`ActiveXObject is not supported in this browser environment. Cannot create: '${className}'`);\n}\n\nexport function getObject(pathname?: VbValue, cls?: VbValue): VbValue {\n const axConstructor = (window as unknown as { ActiveXObject?: new (cls: string) => unknown }).ActiveXObject;\n if (axConstructor) {\n const path = pathname ? String(pathname.value ?? pathname) : '';\n const className = cls ? String(cls.value ?? cls) : '';\n\n try {\n if (path) {\n const ax = new axConstructor(className || 'Scripting.FileSystemObject');\n return { type: 'Object', value: {\n type: 'activex',\n object: ax,\n className\n }};\n }\n } catch (e) {\n throw new Error(`ActiveX component can't create object: '${className || path}'`);\n }\n }\n\n const className = cls ? String(cls.value ?? cls) : '';\n throw new Error(`ActiveXObject is not supported in this browser environment. Cannot get: '${className}'`);\n}\n","import type { VbsEngine } from '../core/index.ts';\n\nexport function isVbscriptElement(element: Element): boolean {\n const language = element.getAttribute('language');\n const type = element.getAttribute('type');\n\n if (language?.toLowerCase() === 'vbscript') return true;\n if (type?.toLowerCase() === 'text/vbscript') return true;\n if (type?.toLowerCase() === 'text/vbs') return true;\n if (type?.toLowerCase() === 'application/x-vbscript') return true;\n\n return false;\n}\n\n/**\n * Extract VBScript code from script element, handling HTML comment wrapping\n * Supports the legacy pattern: <!-- ... //-->\n */\nfunction extractVbscriptCode(script: Element): string {\n let code = script.textContent ?? '';\n\n // Trim whitespace\n code = code.trim();\n\n // Handle HTML comment wrapping: <!-- ... //-->\n // This was used in old browsers (1998 era) to hide scripts from browsers that didn't support <script>\n if (code.startsWith('<!--')) {\n // Find the end of the comment\n // Support both //--> and -->\n const endIndex = code.indexOf('//-->');\n if (endIndex !== -1) {\n code = code.substring(4, endIndex).trim();\n } else if (code.endsWith('-->')) {\n code = code.substring(4, code.length - 3).trim();\n }\n }\n\n return code;\n}\n\nexport function parseScriptElement(\n engine: VbsEngine,\n script: Element,\n onScriptRun?: () => void\n): void {\n if (!isVbscriptElement(script)) return;\n\n const code = extractVbscriptCode(script);\n const forAttr = script.getAttribute('for');\n const eventAttr = script.getAttribute('event');\n\n if (forAttr && eventAttr) {\n setupForEventScript(engine, forAttr, eventAttr, code);\n } else {\n try {\n engine.addCode(code);\n onScriptRun?.();\n } catch (error) {\n console.error('Vbscript error:', error);\n }\n }\n}\n\nexport function setupForEventScript(\n engine: VbsEngine,\n targetId: string,\n eventName: string,\n code: string\n): void {\n const eventType = eventName.toLowerCase().replace(/^on/, '');\n\n const bindHandler = (): boolean => {\n const target = document.getElementById(targetId);\n if (target) {\n const handler = (): void => {\n try {\n engine.addCode(code);\n } catch (error) {\n console.error('VBScript event handler error:', error);\n }\n };\n target.addEventListener(eventType, handler);\n return true;\n }\n return false;\n };\n\n if (!bindHandler()) {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n bindHandler();\n });\n } else {\n setTimeout(bindHandler, 0);\n }\n }\n}\n\nexport function autoRunScripts(engine: VbsEngine, onScriptRun?: () => void): void {\n if (typeof document === 'undefined') return;\n\n const scripts = document.querySelectorAll('script');\n scripts.forEach(script => {\n parseScriptElement(engine, script, onScriptRun);\n });\n}\n","import type { VbsEngine } from '../core/index.ts';\n\nexport interface BoundNamedHandler {\n target: EventTarget;\n handler: EventListener;\n}\n\nexport function setupElementInlineEvents(engine: VbsEngine, element: Element): void {\n const attrs = element.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const attr = attrs[i];\n if (!attr) continue;\n const attrName = attr.name.toLowerCase();\n\n if (attrName.startsWith('on') && attrName.length > 2) {\n const value = attr.value.trim();\n if (value.toLowerCase().startsWith('vbscript:')) {\n const code = value.substring(9).trim();\n\n (element as unknown as Record<string, unknown>)[attrName] = (): void => {\n try {\n engine.executeStatement(code);\n } catch (error) {\n console.error('VBScript event handler error:', error);\n }\n };\n }\n }\n }\n}\n\nexport function setupInlineEventHandlers(engine: VbsEngine): void {\n if (typeof document === 'undefined') return;\n\n const allElements = document.querySelectorAll('*');\n allElements.forEach(element => {\n setupElementInlineEvents(engine, element);\n });\n}\n\nexport function resolveEventTarget(objectName: string): EventTarget | null {\n if (objectName in globalThis) {\n const obj = (globalThis as Record<string, unknown>)[objectName];\n if (obj && typeof (obj as EventTarget).addEventListener === 'function') {\n return obj as EventTarget;\n }\n }\n\n const lowerName = objectName.toLowerCase();\n for (const key of Object.keys(globalThis)) {\n if (key.toLowerCase() === lowerName) {\n const obj = (globalThis as Record<string, unknown>)[key];\n if (obj && typeof (obj as EventTarget).addEventListener === 'function') {\n return obj as EventTarget;\n }\n }\n }\n\n if (typeof document !== 'undefined') {\n const element = document.getElementById(objectName);\n if (element) return element;\n\n const allElements = document.querySelectorAll('[id]');\n for (let i = 0; i < allElements.length; i++) {\n const el = allElements[i];\n if (el && el.id.toLowerCase() === lowerName) {\n return el;\n }\n }\n }\n\n return null;\n}\n\nexport function setupNamedEventHandlers(\n engine: VbsEngine,\n boundNamedHandlers: Map<string, BoundNamedHandler>\n): void {\n if (typeof window === 'undefined') return;\n\n const funcRegistry = engine._getContext()?.functionRegistry;\n if (!funcRegistry) return;\n\n const userFuncs = funcRegistry.getUserDefinedFunctions?.();\n if (!userFuncs) return;\n\n for (const [funcName] of userFuncs) {\n const onIndex = funcName.toLowerCase().indexOf('_on');\n if (onIndex > 0) {\n const objectName = funcName.substring(0, onIndex);\n const eventName = funcName.substring(onIndex + 3);\n\n const target = resolveEventTarget(objectName);\n\n if (target) {\n const eventType = eventName.toLowerCase();\n\n if (boundNamedHandlers.has(funcName)) {\n const existing = boundNamedHandlers.get(funcName)!;\n existing.target.removeEventListener(eventType, existing.handler);\n }\n\n const handler = (): void => {\n try {\n engine._getContext()?.functionRegistry.call(funcName, []);\n } catch (error) {\n console.error(`VBScript ${funcName} error:`, error);\n }\n };\n\n target.addEventListener(eventType, handler);\n boundNamedHandlers.set(funcName, { target, handler });\n }\n }\n }\n}\n\nexport function cleanupNamedEventHandlers(boundNamedHandlers: Map<string, BoundNamedHandler>): void {\n boundNamedHandlers.forEach(({ target, handler }, funcName) => {\n const onIndex = funcName.toLowerCase().indexOf('_on');\n if (onIndex > 0) {\n const eventName = funcName.substring(onIndex + 3).toLowerCase();\n target.removeEventListener(eventName, handler);\n }\n });\n boundNamedHandlers.clear();\n}\n","import type { VbsEngine } from '../core/index.ts';\nimport { isVbscriptElement, setupForEventScript } from './script-parser.ts';\nimport { setupElementInlineEvents, setupNamedEventHandlers } from './event-handlers.ts';\nimport type { BrowserRuntimeOptions } from './types.ts';\nimport type { BoundNamedHandler } from './event-handlers.ts';\n\nexport interface ObserverContext {\n observer: MutationObserver;\n}\n\nexport function startObserver(\n engine: VbsEngine,\n options: Required<BrowserRuntimeOptions>,\n boundNamedHandlers: Map<string, BoundNamedHandler>\n): ObserverContext {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n\n if (options.parseScriptElement && element.tagName.toLowerCase() === 'script' && isVbscriptElement(element)) {\n const code = element.textContent ?? '';\n const forAttr = element.getAttribute('for');\n const eventAttr = element.getAttribute('event');\n\n if (forAttr && eventAttr) {\n setupForEventScript(engine, forAttr, eventAttr, code);\n } else {\n try {\n engine.addCode(code);\n if (options.injectGlobalThis && options.parseEventSubNames) {\n setupNamedEventHandlers(engine, boundNamedHandlers);\n }\n } catch (error) {\n console.error('Vbscript error:', error);\n }\n }\n }\n\n if (options.parseInlineEventAttributes) {\n setupElementInlineEvents(engine, element);\n }\n\n if (options.parseScriptElement) {\n const scripts = element.querySelectorAll('script');\n scripts.forEach(script => {\n if (isVbscriptElement(script)) {\n const code = script.textContent ?? '';\n const forAttr = script.getAttribute('for');\n const eventAttr = script.getAttribute('event');\n\n if (forAttr && eventAttr) {\n setupForEventScript(engine, forAttr, eventAttr, code);\n } else {\n try {\n engine.addCode(code);\n if (options.injectGlobalThis && options.parseEventSubNames) {\n setupNamedEventHandlers(engine, boundNamedHandlers);\n }\n } catch (error) {\n console.error('Vbscript error:', error);\n }\n }\n }\n });\n }\n\n if (options.parseInlineEventAttributes) {\n const childElements = element.querySelectorAll('*');\n childElements.forEach(child => {\n setupElementInlineEvents(engine, child);\n });\n }\n }\n });\n });\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n\n return { observer };\n}\n\nexport function stopObserver(context: ObserverContext): void {\n context.observer.disconnect();\n}\n","import type { VbsEngine, VbsEngineOptions } from '../core/index.ts';\nimport { createBrowserMsgBox } from '../builtins/msgbox.ts';\nimport { createBrowserInputBox } from '../builtins/inputbox.ts';\nimport type { TimerOverrideState, EvalOverrideState } from './types.ts';\nimport type { ProtocolHandlerResult } from './protocol-handler.ts';\nimport { overrideTimers, restoreTimers } from './timer-override.ts';\nimport { overrideEval, restoreEval } from './eval-override.ts';\nimport { setupVbscriptProtocol, cleanupVbscriptProtocol } from './protocol-handler.ts';\nimport { createObject, getObject } from './activex.ts';\nimport { autoRunScripts } from './script-parser.ts';\nimport { setupInlineEventHandlers, setupNamedEventHandlers, cleanupNamedEventHandlers, type BoundNamedHandler } from './event-handlers.ts';\nimport { startObserver, stopObserver, type ObserverContext } from './dom-observer.ts';\n\n/**\n * Initializes the browser mode for a VbsEngine instance.\n * This function sets up all browser-specific features.\n *\n * @param engine - The VbsEngine instance to initialize\n * @param options - Browser-specific options\n * @returns A cleanup function to restore original browser state\n */\nexport function initializeBrowserEngine(\n engine: VbsEngine,\n options: Required<VbsEngineOptions>\n): () => void {\n const timerState: TimerOverrideState = { originalSetTimeout: null, originalSetInterval: null };\n const evalState: EvalOverrideState = { originalEval: null };\n let protocolState: ProtocolHandlerResult = { navigateHandler: null, clickHandler: null };\n let observerContext: ObserverContext | null = null;\n const boundNamedHandlers: Map<string, BoundNamedHandler> = new Map();\n\n // Register browser-specific functions\n engine._registerFunction('MsgBox', createBrowserMsgBox());\n engine._registerFunction('InputBox', createBrowserInputBox());\n engine._registerFunction('CreateObject', createObject);\n engine._registerFunction('GetObject', getObject);\n\n // Override JS functions if requested\n if (options.overrideJsEvalFunctions) {\n timerState.originalSetTimeout = overrideTimers(engine).originalSetTimeout;\n timerState.originalSetInterval = overrideTimers(engine).originalSetInterval;\n evalState.originalEval = overrideEval(engine).originalEval;\n }\n\n // Setup vbscript: protocol handler\n if (options.parseVbsProtocol) {\n protocolState = setupVbscriptProtocol(engine);\n }\n\n // Parse and execute script elements\n if (options.parseScriptElement) {\n autoRunScripts(engine);\n }\n\n // Setup inline event handlers\n if (options.parseInlineEventAttributes) {\n setupInlineEventHandlers(engine);\n }\n\n // Setup named event handlers (Button1_OnClick style)\n if (options.injectGlobalThis && options.parseEventSubNames) {\n setupNamedEventHandlers(engine, boundNamedHandlers);\n }\n\n // Start DOM observer for dynamic content\n if (options.parseScriptElement || options.parseInlineEventAttributes) {\n observerContext = startObserver(engine, options, boundNamedHandlers);\n }\n\n // Handle DOMContentLoaded for late initialization\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n if (options.injectGlobalThis && options.parseEventSubNames) {\n setupNamedEventHandlers(engine, boundNamedHandlers);\n }\n });\n }\n\n // Return cleanup function\n return () => {\n if (observerContext) {\n stopObserver(observerContext);\n }\n cleanupNamedEventHandlers(boundNamedHandlers);\n if (protocolState.navigateHandler || protocolState.clickHandler) {\n cleanupVbscriptProtocol(protocolState);\n }\n if (options.overrideJsEvalFunctions) {\n restoreTimers(timerState);\n restoreEval(evalState);\n }\n };\n}\n","import { Lexer } from '../lexer/index.ts';\nimport { Parser, globalParserCache } from '../parser/index.ts';\nimport { Interpreter } from '../interpreter/index.ts';\nimport type { VbValue } from '../runtime/index.ts';\nimport { jsToVb, vbToJs } from './conversion.ts';\nimport { initializeBrowserEngine } from '../browser/index.ts';\n\nexport { jsToVb, vbToJs } from './conversion.ts';\n\nfunction vbToJsAuto(value: VbValue): unknown {\n switch (value.type) {\n case 'Empty':\n return undefined;\n case 'Null':\n return null;\n case 'Boolean':\n case 'Long':\n case 'Double':\n case 'Integer':\n case 'String':\n case 'Date':\n return value.value;\n case 'Array': {\n const arr = value.value as { toArray(): VbValue[] };\n return arr.toArray().map(vbToJsAuto);\n }\n case 'Object':\n return value.value;\n default:\n return value.value;\n }\n}\n\n/**\n * The mode of operation for the VbsEngine.\n * - 'general': Standard mode for Node.js or custom environments\n * - 'browser': Browser mode with automatic DOM integration, event handling, etc.\n */\nexport type VbsEngineMode = 'general' | 'browser';\n\n/**\n * Browser-specific options for VbsEngine.\n */\nexport interface BrowserEngineOptions {\n /**\n * Automatically parse and execute `<script type=\"text/vbscript\">` elements.\n * @default true\n */\n parseScriptElement?: boolean;\n /**\n * Automatically parse inline event attributes like `onclick=\"vbscript:...\"`.\n * @default true\n */\n parseInlineEventAttributes?: boolean;\n /**\n * Automatically bind event handlers from Sub names like `Button1_OnClick`.\n * Requires `injectGlobalThis` to be true.\n * @default true\n */\n parseEventSubNames?: boolean;\n /**\n * Override JavaScript's eval, setTimeout, and setInterval to support VBScript code.\n * @default true\n */\n overrideJsEvalFunctions?: boolean;\n /**\n * Enable the `vbscript:` protocol handler for links and forms.\n * @default true\n */\n parseVbsProtocol?: boolean;\n}\n\n/**\n * Error information from script execution.\n */\nexport interface VbsError {\n /** Error number/code */\n number: number;\n /** Error description */\n description: string;\n /** Source line number where error occurred */\n line?: number;\n /** Source column where error occurred */\n column?: number;\n /** Source text where error occurred */\n text?: string;\n}\n\n/**\n * Configuration options for the VbsEngine.\n */\nexport interface VbsEngineOptions extends BrowserEngineOptions {\n /**\n * Maximum execution time in milliseconds.\n * Set to -1 for unlimited execution time (default).\n * Useful to prevent infinite loops from hanging the application.\n */\n maxExecutionTime?: number;\n /**\n * When true (default), JavaScript globals from globalThis are automatically\n * shared with VBScript, and VBScript functions/variables are injected\n * into globalThis for bidirectional interoperability.\n * @default true\n */\n injectGlobalThis?: boolean;\n /**\n * The mode of operation for the engine.\n * - 'general': Standard mode for Node.js or custom environments (default)\n * - 'browser': Browser mode with automatic DOM integration\n * @default 'general'\n */\n mode?: VbsEngineMode;\n}\n\n/**\n * A VBScript engine that can parse and execute VBScript code.\n *\n * This API is designed to be compatible with MSScriptControl.ScriptControl:\n * - `addCode(code)` - Add script code (functions, classes)\n * - `executeStatement(statement)` - Execute a single statement\n * - `run(procedureName, ...args)` - Call a script function\n * - `addObject(name, object, addMembers?)` - Expose a JS object to script\n * - `eval(expression)` - Evaluate an expression\n *\n * @example\n * ```typescript\n * // Basic usage\n * const engine = new VbsEngine();\n *\n * // Add code (function definitions)\n * engine.addCode(`\n * Function Add(a, b)\n * Add = a + b\n * End Function\n * `);\n *\n * // Call the function\n * const result = engine.run('Add', 5, 3); // 8\n *\n * // Execute a statement\n * engine.executeStatement('MsgBox \"Hello\"');\n *\n * // Evaluate an expression\n * const value = engine.eval('2 + 3 * 4'); // 14\n *\n * // Expose an object to script\n * engine.addObject('console', console, true);\n * engine.executeStatement('console.log \"Hello from VBScript\"');\n * ```\n */\nexport class VbsEngine {\n private interpreter: Interpreter;\n private options: Required<VbsEngineOptions>;\n private browserCleanup: (() => void) | null = null;\n private lastError: VbsError | null = null;\n\n constructor(options: VbsEngineOptions = {}) {\n this.options = {\n maxExecutionTime: options.maxExecutionTime ?? -1,\n injectGlobalThis: options.injectGlobalThis ?? true,\n mode: options.mode ?? 'general',\n parseScriptElement: options.parseScriptElement ?? true,\n parseInlineEventAttributes: options.parseInlineEventAttributes ?? true,\n parseEventSubNames: options.parseEventSubNames ?? true,\n overrideJsEvalFunctions: options.overrideJsEvalFunctions ?? true,\n parseVbsProtocol: options.parseVbsProtocol ?? true,\n };\n\n this.interpreter = new Interpreter();\n this.interpreter.getContext().evaluate = (code: string) => this.interpreter.evaluate(code);\n this.interpreter.getContext().execute = (code: string) => this.interpreter.executeInCurrentScope(code);\n this.interpreter.getContext().executeGlobal = (code: string) => this.interpreter.executeInGlobalScope(code);\n\n if (this.options.maxExecutionTime > 0) {\n this.setMaxExecutionTime(this.options.maxExecutionTime);\n }\n\n if (this.options.mode === 'browser' && typeof window !== 'undefined') {\n this.initializeBrowserMode();\n }\n }\n\n private initializeBrowserMode(): void {\n this.browserCleanup = initializeBrowserEngine(this, this.options);\n }\n\n private setMaxExecutionTime(ms: number): void {\n this.interpreter.setMaxExecutionTime(ms);\n this.interpreter.getContext().checkTimeout = () => this.interpreter.checkTimeout();\n }\n\n /**\n * Gets the last error that occurred during script execution.\n * Returns null if no error occurred.\n */\n get error(): VbsError | null {\n return this.lastError;\n }\n\n /**\n * Clears the last error.\n */\n clearError(): void {\n this.lastError = null;\n }\n\n /**\n * Adds script code to the engine.\n * Use this to define functions, classes, or variables that can be used later.\n *\n * @param code - The VBScript code to add (function/class definitions)\n *\n * @example\n * ```typescript\n * engine.addCode(`\n * Function Multiply(a, b)\n * Multiply = a * b\n * End Function\n *\n * Class Calculator\n * Public Function Add(x, y)\n * Add = x + y\n * End Function\n * End Class\n * `);\n * ```\n */\n addCode(code: string): void {\n this.clearError();\n try {\n // Try to get from cache first\n let program = globalParserCache.get(code);\n \n if (!program) {\n // Parse and cache\n const lexer = new Lexer(code);\n const tokens = lexer.tokenize();\n const parser = new Parser(tokens);\n program = parser.parse();\n globalParserCache.set(code, program);\n }\n \n this.interpreter.run(program);\n this.syncFunctionsToGlobalThis();\n } catch (err) {\n this.handleError(err);\n }\n }\n\n /**\n * Executes a single VBScript statement.\n *\n * @param statement - The statement to execute\n *\n * @example\n * ```typescript\n * engine.executeStatement('x = 10');\n * engine.executeStatement('MsgBox \"Hello World\"');\n * ```\n */\n executeStatement(statement: string): void {\n this.clearError();\n try {\n // Try to get from cache first\n let program = globalParserCache.get(statement);\n \n if (!program) {\n // Parse and cache\n const lexer = new Lexer(statement);\n const tokens = lexer.tokenize();\n const parser = new Parser(tokens);\n program = parser.parse();\n globalParserCache.set(statement, program);\n }\n \n this.interpreter.run(program);\n } catch (err) {\n this.handleError(err);\n }\n }\n\n /**\n * Calls a function defined in the script and returns the result.\n *\n * @param procedureName - The name of the function or sub to call\n * @param args - Arguments to pass to the function\n * @returns The return value of the function (undefined for Subs)\n *\n * @example\n * ```typescript\n * engine.addCode('Function Add(a, b): Add = a + b: End Function');\n * const result = engine.run('Add', 5, 3); // 8\n * ```\n */\n run(procedureName: string, ...args: unknown[]): unknown {\n this.clearError();\n try {\n const context = this.interpreter.getContext();\n const funcRegistry = context.functionRegistry;\n \n const vbArgs = args.map(arg => jsToVb(arg));\n const result = funcRegistry.call(procedureName, vbArgs);\n \n return vbToJs(result);\n } catch (err) {\n this.handleError(err);\n return undefined;\n }\n }\n\n /**\n * Exposes a JavaScript object to the VBScript context.\n * The object can then be accessed by name in VBScript code.\n *\n * @param name - The name by which the object will be known in VBScript\n * @param object - The JavaScript object to expose\n * @param addMembers - If true, the object's methods/properties can be called directly\n *\n * @example\n * ```typescript\n * // Expose console to VBScript\n * engine.addObject('console', console, true);\n * engine.executeStatement('console.log \"Hello from VBScript\"');\n *\n * // Expose a custom object\n * const myApp = {\n * name: 'MyApp',\n * getVersion: () => '1.0.0',\n * doSomething: (x) => x * 2\n * };\n * engine.addObject('MyApp', myApp, true);\n * engine.executeStatement('result = MyApp.doSomething(5)'); // result = 10\n * ```\n */\n addObject(name: string, object: unknown, addMembers: boolean = true): void {\n this.clearError();\n try {\n const vbValue = jsToVb(object);\n this.interpreter.setVariable(name, vbValue);\n \n if (addMembers && typeof object === 'object' && object !== null) {\n const obj = object as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n const memberName = `${name}.${key}`;\n const member = obj[key];\n if (typeof member === 'function') {\n this.interpreter.registerFunction(memberName, (...args: VbValue[]) => {\n const jsArgs = args.map(vbToJs);\n const result = (member as (...args: unknown[]) => unknown)(...jsArgs);\n return jsToVb(result);\n });\n }\n }\n }\n } catch (err) {\n this.handleError(err);\n }\n }\n\n /**\n * Evaluates a VBScript expression and returns the result.\n *\n * @param expression - The expression to evaluate\n * @returns The result of the expression\n *\n * @example\n * ```typescript\n * const result = engine.eval('2 + 3 * 4'); // 14\n * const greeting = engine.eval('\"Hello\" & \" \" & \"World\"'); // \"Hello World\"\n * ```\n */\n eval(expression: string): unknown {\n this.clearError();\n try {\n const result = this.interpreter.evaluate(expression);\n return vbToJs(result);\n } catch (err) {\n this.handleError(err);\n return undefined;\n }\n }\n\n /**\n * Cleans up resources and restores any overridden browser functions.\n * Call this method when you no longer need the engine.\n */\n destroy(): void {\n if (this.browserCleanup) {\n this.browserCleanup();\n this.browserCleanup = null;\n }\n }\n\n /**\n * @internal Registers a built-in function. Used by browser module.\n */\n _registerFunction(name: string, func: (...args: VbValue[]) => VbValue): void {\n this.interpreter.registerFunction(name, func);\n }\n\n /**\n * @internal Gets the interpreter context. Used by browser module.\n */\n _getContext() {\n return this.interpreter.getContext();\n }\n\n /**\n * @internal Gets a variable value. Used for testing.\n */\n _getVariable(name: string): VbValue {\n return this.interpreter.getVariable(name);\n }\n\n private handleError(err: unknown): void {\n if (err instanceof Error) {\n this.lastError = {\n number: -1,\n description: err.message,\n };\n } else {\n this.lastError = {\n number: -1,\n description: String(err),\n };\n }\n }\n\n private syncFunctionsToGlobalThis(): void {\n if (typeof globalThis === 'undefined') return;\n if (!this.options.injectGlobalThis) return;\n\n const context = this.interpreter.getContext();\n if (!context) return;\n\n const funcRegistry = context.functionRegistry;\n if (!funcRegistry) return;\n\n const userFuncs = funcRegistry.getUserDefinedFunctions?.();\n if (!userFuncs) return;\n\n for (const [, info] of userFuncs) {\n const funcName = info.name;\n if (!(funcName in (globalThis as Record<string, unknown>))) {\n (globalThis as Record<string, unknown>)[funcName] = (...args: unknown[]) => {\n return this.run(funcName, ...args);\n };\n }\n }\n\n if (context.globalScope) {\n const allVars = context.globalScope.getAllVariables();\n for (const [varName, vbVar] of allVars) {\n if (vbVar.value && vbVar.value.type !== 'Empty') {\n if (!(varName in (globalThis as Record<string, unknown>))) {\n (globalThis as Record<string, unknown>)[varName] = vbToJs(vbVar.value);\n }\n }\n }\n }\n }\n}\n\n/**\n * A convenience function to quickly evaluate a VBScript expression.\n * Creates a new VbsEngine instance, evaluates the expression, and returns the result.\n *\n * @param expression - The VBScript expression to evaluate\n * @returns The result of the expression\n *\n * @example\n * ```typescript\n * const result = evalVbscript('2 + 3 * 4'); // 14\n * ```\n */\nexport function evalVbscript(expression: string): unknown {\n const engine = new VbsEngine();\n return engine.eval(expression);\n}\n"],"names":["TokenType","KEYWORDS","Lexer","source","options","char","type","value","start","raw","quote","isFloat","isExponent","num","currentChar","signChar","prefix","upperValue","keywordType","token","tokens","ParseError","message","expected","ParserState","pos","offset","types","tokenToPosition","tokenToEndPosition","createLocation","end","ExpressionParser","state","expr","property","index","rbracket","savedState","left","op","right","args","callExpr","operator","argument","rparen","dotToken","newToken","callee","id","DeclarationParser","exprParser","dimToken","visibilityToken","redimToken","preserve","eraseToken","constToken","declarations","decl","init","isArray","arrayBounds","typeAnnotation","bounds","typeToken","typeName","isVbClassElement","stmt","ProcedureParser","parseStatement","visibility","startToken","name","params","body","classToken","propVisibility","param","byRef","isOptional","isParamArray","defaultValue","endKeyword","ControlFlowParser","ifToken","test","hasNewlineAfterThen","consequent","alternate","forToken","doToken","testPosition","whileToken","selectToken","discriminant","cases","nestedIfDepth","savedPos","to","step","caseClause","caseToken","isElse","expressions","StatementsParser","withToken","object","exitToken","targetTypes","targetToken","target","optionToken","callToken","setToken","onToken","numToken","resumeToken","StatementParser","gotoToken","labelToken","Parser","lastToken","parse","_options","ParserCache","maxSize","defaultTTL","hash","i","key","entry","now","ast","oldestKey","oldestTime","totalAccessCount","removed","globalParserCache","VbEmpty","VbNull","VbNothing","createVbValue","toBoolean","str","toNumber","toString","isNumeric","isEmpty","isNull","VbVariable","isByRef","isConst","Vbscope","parent","variable","lowerName","all","v","k","VbFunctionRegistry","func","info","result","values","arg","VbClass","properties","methods","initializer","VbObjectInstance","classInfo","prototype","prop","accessor","isSet","obj","VbClassRegistry","cls","creator","instance","_args","initMethod","initProperty","VbArray","dimensions","lowerBounds","totalSize","a","b","indices","multiplier","lowerBound","dimension","idx","lower","dim","newData","minSize","createVbArray","createVbArrayFromValues","arr","VbError","number","description","error","VbErrorCodes","createVbError","code","jsToVb","thisArg","VbContext","scope","flag","globalKeys","commonStringCache","preCacheCommonStrings","strings","COMMON_VBSCRIPT_STRINGS","isVbMethodObject","isVbJsFunctionObject","ExpressionEvaluator","context","program","node","className","_node","withObject","propertyName","propValue","array","indexExpr","objValue","jsValue","calleeExpr","callArgs","p","argRefs","varName","val","method","memberResult","vbVal","leftNum","rightNum","oldValue","newValue","terminateProp","ControlFlowSignal","GotoSignal","labelName","StatementExecutor","vbError","boundValue","existingVar","arrayName","startValue","endValue","stepValue","shouldContinue","signal","currentValue","collection","items","count","countNum","item","checkCondition","testValue","isWhile","isPreTest","tests","t","leftStr","rightStr","subName","self","subFunc","funcName","argIndex","restArgs","argValue","initializeFunc","terminateFunc","member","memberNode","memberName","prevInstance","propName","existing","prevInPropertyGet","prevPropertyGetName","localeToLcid","lcidToLocale","lcid","locale","currentLocale","normalizeLocale","findLocaleKey","normalized","getBrowserLocale","browserLocale","exactKey","baseLocale","baseKey","getLocale","setLocale","lcidValue","localeStr","getCurrentBCP47Locale","localeToCurrency","getCurrentCurrency","currency","baseCurrency","localeFunctions","formatDate","format","months","days","formatNumber","positiveFormat","negativeFormat","zeroFormat","semicolonIndex","remaining","secondSemicolon","formatNumberInternal","hasPercent","formatLower","decimalPos","decimalDigits","intPart","decPart","intStr","decStr","formatString","stringFunctions","length","s","len","startPos","startOrStr","str1OrStr2","str2OrCompare","compare","str1","str2","compareMode","s1","s2","find","replace","findStr","replaceStr","maxCount","replaced","searchStr","searchFind","character","charCode","delimiter","_compare","delim","parts","resultParts","list","expression","formatStr","string","mathFunctions","numDecimalPlaces","decimals","factor","_number","constants","serialToDate","serial","baseDate","dateFunctions","date","firstDayOfWeek","d","firstDay","day","time","interval","intv","date1","date2","_firstDayOfWeek","_firstWeekOfYear","d1","d2","diff","startOfYear","startOfYear2","year","month","y","m","hour","minute","second","h","abbreviate","names","abbrev","weekday","w","conversionFunctions","errorNumber","match","numDigitsAfterDecimal","includeLeadingDigit","_useParensForNegativeNumbers","groupDigits","leadingDigit","grouping","namedFormat","inspectionFunctions","arrayFunctions","arrayname","inputStrings","include","searchValue","shouldInclude","filtered","found","MsgBoxConstants","parseButtons","buttons","buttonTypeValue","iconValue","defaultButton","buttonType","iconType","getIconPrefix","buildPrompt","title","prompt","getButtonOptions","createBrowserMsgBox","buttonsVal","titleStr","fullPrompt","input","registerMsgBox","promptVal","createBrowserInputBox","defaultVal","_xPos","_yPos","_helpFile","_contextVal","def","registerInputBox","defaultText","createMatchObject","createMatchesCollection","matches","matchObjects","createRegExpObject","sourceString","flags","regex","replaceString","registerRegExp","registerBuiltins","procname","funcRegistry","_arrayname","_pathname","_cls","_servername","picturename","path","red","green","blue","r","g","color","colorIndex","errObject","Interpreter","ms","statements","labels","labelStmt","maxIterations","iterations","labelInfo","e","savedScope","vbToJs","overrideTimers","engine","originalSetTimeout","originalSetInterval","handler","delay","languageOrArg","language","actualDelay","restoreTimers","overrideEval","originalEval","lang","restoreEval","setupVbscriptProtocol","navigateHandler","clickHandler","event","url","href","cleanupVbscriptProtocol","createObject","axConstructor","getObject","pathname","isVbscriptElement","element","extractVbscriptCode","script","endIndex","parseScriptElement","onScriptRun","forAttr","eventAttr","setupForEventScript","targetId","eventName","eventType","bindHandler","autoRunScripts","setupElementInlineEvents","attrs","attr","attrName","setupInlineEventHandlers","resolveEventTarget","objectName","allElements","el","setupNamedEventHandlers","boundNamedHandlers","userFuncs","onIndex","cleanupNamedEventHandlers","startObserver","observer","mutations","mutation","child","stopObserver","initializeBrowserEngine","timerState","evalState","protocolState","observerContext","VbsEngine","err","statement","procedureName","vbArgs","addMembers","vbValue","jsArgs","allVars","vbVar","evalVbscript"],"mappings":"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EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,SAAS,IAAI;AAAA,EACd,CAAC,MAAM,IAAI;AAAA,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"}