@simahfud/pine-to-kline 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"pine-to-kline.umd.js","sources":["../src/lexer/Token.ts","../src/lexer/TokenType.ts","../src/utils/errors.ts","../src/lexer/Lexer.ts","../src/parser/Parser.ts","../src/runtime/BarContext.ts","../src/runtime/VarPersistence.ts","../src/builtins/ta/moving-averages.ts","../src/builtins/ta/momentum.ts","../src/builtins/ta/volatility.ts","../src/builtins/ta/crossover.ts","../src/builtins/ta/utility.ts","../src/builtins/ta/index.ts","../src/builtins/math/functions.ts","../src/builtins/color/constants.ts","../src/builtins/color/functions.ts","../src/builtins/input/functions.ts","../src/builtins/index.ts","../src/runtime/PineRuntime.ts","../src/adapter/FigureMapper.ts","../src/adapter/StyleMapper.ts","../src/adapter/KlineAdapter.ts","../src/PineInterpreter.ts","../src/plugin/KlineChartProPlugin.ts","../src/runtime/SeriesEmulator.ts"],"sourcesContent":["/**\n * pine-to-kline — Token\n * @license Apache-2.0\n */\n\nimport { TokenType } from './TokenType'\n\nexport class Token {\n constructor(\n public readonly type: TokenType,\n public readonly value: string,\n public readonly line: number,\n public readonly column: number\n ) {}\n\n is(type: TokenType): boolean {\n return this.type === type\n }\n\n isAny(...types: TokenType[]): boolean {\n return types.includes(this.type)\n }\n\n toString(): string {\n return `Token(${this.type}, ${JSON.stringify(this.value)}, ${this.line}:${this.column})`\n }\n}\n","/**\n * pine-to-kline — Token Types\n * All PineScript v5/v6 token categories\n * @license Apache-2.0\n */\n\nexport enum TokenType {\n // ─── Literals ───────────────────────────\n NUMBER = 'NUMBER',\n STRING = 'STRING',\n COLOR_LITERAL = 'COLOR_LITERAL', // #RRGGBB or #RRGGBBAA\n\n // ─── Identifiers ───────────────────────\n IDENTIFIER = 'IDENTIFIER',\n\n // ─── Keywords ───────────────────────────\n IF = 'IF',\n ELSE = 'ELSE',\n FOR = 'FOR',\n TO = 'TO',\n BY = 'BY',\n IN = 'IN',\n WHILE = 'WHILE',\n SWITCH = 'SWITCH',\n VAR = 'VAR',\n VARIP = 'VARIP',\n TRUE = 'TRUE',\n FALSE = 'FALSE',\n NA = 'NA',\n AND = 'AND',\n OR = 'OR',\n NOT = 'NOT',\n IMPORT = 'IMPORT',\n EXPORT = 'EXPORT',\n TYPE = 'TYPE',\n METHOD = 'METHOD',\n BREAK = 'BREAK',\n CONTINUE = 'CONTINUE',\n RETURN = 'RETURN',\n\n // ─── Pine-specific Keywords ─────────────\n INDICATOR = 'INDICATOR',\n STRATEGY = 'STRATEGY',\n LIBRARY = 'LIBRARY',\n\n // ─── Arithmetic Operators ───────────────\n PLUS = 'PLUS', // +\n MINUS = 'MINUS', // -\n STAR = 'STAR', // *\n SLASH = 'SLASH', // /\n PERCENT = 'PERCENT', // %\n POWER = 'POWER', // ** (NEW in Pine — not ^)\n\n // ─── Comparison Operators ───────────────\n EQ = 'EQ', // ==\n NEQ = 'NEQ', // !=\n LT = 'LT', // <\n GT = 'GT', // >\n LTE = 'LTE', // <=\n GTE = 'GTE', // >=\n\n // ─── Assignment Operators ───────────────\n ASSIGN = 'ASSIGN', // =\n REASSIGN = 'REASSIGN', // :=\n PLUS_ASSIGN = 'PLUS_ASSIGN', // +=\n MINUS_ASSIGN = 'MINUS_ASSIGN', // -=\n STAR_ASSIGN = 'STAR_ASSIGN', // *=\n SLASH_ASSIGN = 'SLASH_ASSIGN', // /=\n PERCENT_ASSIGN = 'PERCENT_ASSIGN', // %=\n\n // ─── Delimiters ─────────────────────────\n LPAREN = 'LPAREN', // (\n RPAREN = 'RPAREN', // )\n LBRACKET = 'LBRACKET', // [\n RBRACKET = 'RBRACKET', // ]\n COMMA = 'COMMA', // ,\n DOT = 'DOT', // .\n COLON = 'COLON', // :\n QUESTION = 'QUESTION', // ?\n ARROW = 'ARROW', // =>\n\n // ─── Whitespace / Structure ─────────────\n NEWLINE = 'NEWLINE',\n INDENT = 'INDENT',\n DEDENT = 'DEDENT',\n EOF = 'EOF',\n\n // ─── Comments & Annotations ─────────────\n COMMENT = 'COMMENT',\n COMPILER_ANNOTATION = 'COMPILER_ANNOTATION', // //@version=5\n}\n\n/** Keywords map for fast lookup */\nexport const KEYWORDS: Record<string, TokenType> = {\n 'if': TokenType.IF,\n 'else': TokenType.ELSE,\n 'for': TokenType.FOR,\n 'to': TokenType.TO,\n 'by': TokenType.BY,\n 'in': TokenType.IN,\n 'while': TokenType.WHILE,\n 'switch': TokenType.SWITCH,\n 'var': TokenType.VAR,\n 'varip': TokenType.VARIP,\n 'true': TokenType.TRUE,\n 'false': TokenType.FALSE,\n 'na': TokenType.NA,\n 'and': TokenType.AND,\n 'or': TokenType.OR,\n 'not': TokenType.NOT,\n 'import': TokenType.IMPORT,\n 'export': TokenType.EXPORT,\n 'type': TokenType.TYPE,\n 'method': TokenType.METHOD,\n 'break': TokenType.BREAK,\n 'continue': TokenType.CONTINUE,\n 'return': TokenType.RETURN,\n // Pine type keywords are treated as identifiers, not reserved\n // (int, float, bool, string, color, etc.)\n}\n","/**\n * pine-to-kline — Error Classes\n * @license Apache-2.0\n */\n\nexport class PineError extends Error {\n constructor(\n message: string,\n public readonly line?: number,\n public readonly column?: number,\n public readonly source?: string\n ) {\n super(message)\n this.name = 'PineError'\n }\n\n toString(): string {\n const loc = this.line != null ? ` at line ${this.line}` : ''\n const col = this.column != null ? `:${this.column}` : ''\n return `${this.name}: ${this.message}${loc}${col}`\n }\n}\n\nexport class LexerError extends PineError {\n constructor(message: string, line?: number, column?: number) {\n super(message, line, column)\n this.name = 'LexerError'\n }\n}\n\nexport class ParseError extends PineError {\n constructor(message: string, line?: number, column?: number) {\n super(message, line, column)\n this.name = 'ParseError'\n }\n}\n\nexport class RuntimeError extends PineError {\n constructor(message: string, line?: number, column?: number) {\n super(message, line, column)\n this.name = 'RuntimeError'\n }\n}\n\nexport class AdapterError extends PineError {\n constructor(message: string) {\n super(message)\n this.name = 'AdapterError'\n }\n}\n","/**\n * pine-to-kline — Lexer (Tokenizer)\n * Converts PineScript source code into a stream of tokens.\n * Handles indentation-significant syntax (INDENT/DEDENT).\n * @license Apache-2.0\n */\n\nimport { Token } from './Token'\nimport { TokenType, KEYWORDS } from './TokenType'\nimport { LexerError } from '../utils/errors'\n\nexport class Lexer {\n private source: string\n private tokens: Token[] = []\n private pos = 0\n private line = 1\n private column = 1\n private indentStack: number[] = [0]\n private atLineStart = true\n\n constructor(source: string) {\n // Normalize line endings\n this.source = source.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n }\n\n tokenize(): Token[] {\n this.tokens = []\n this.pos = 0\n this.line = 1\n this.column = 1\n this.indentStack = [0]\n this.atLineStart = true\n\n while (this.pos < this.source.length) {\n if (this.atLineStart) {\n this.handleIndentation()\n this.atLineStart = false\n }\n\n const ch = this.current()\n if (ch === undefined) break\n\n // Skip spaces/tabs mid-line\n if (ch === ' ' || ch === '\\t') {\n this.advance()\n continue\n }\n\n // Newlines\n if (ch === '\\n') {\n this.emitNewline()\n continue\n }\n\n // Comments and compiler annotations\n if (ch === '/' && this.peek() === '/') {\n this.readComment()\n continue\n }\n\n // Numbers\n if (this.isDigit(ch) || (ch === '.' && this.peek() !== undefined && this.isDigit(this.peek()!))) {\n this.readNumber()\n continue\n }\n\n // Strings\n if (ch === '\"' || ch === \"'\") {\n this.readString(ch)\n continue\n }\n\n // Color literals: #RRGGBB or #RRGGBBAA\n if (ch === '#' && this.isHexDigit(this.peek())) {\n this.readColor()\n continue\n }\n\n // Identifiers and keywords\n if (this.isAlpha(ch) || ch === '_') {\n this.readIdentifier()\n continue\n }\n\n // Operators and delimiters\n if (this.readOperator()) {\n continue\n }\n\n throw new LexerError(`Unexpected character: '${ch}'`, this.line, this.column)\n }\n\n // Emit remaining DEDENTs\n while (this.indentStack.length > 1) {\n this.indentStack.pop()\n this.tokens.push(new Token(TokenType.DEDENT, '', this.line, this.column))\n }\n\n this.tokens.push(new Token(TokenType.EOF, '', this.line, this.column))\n return this.filterTokens(this.tokens)\n }\n\n // ─── Indentation ────────────────────────────────────────────\n\n private handleIndentation(): void {\n let indent = 0\n while (this.pos < this.source.length) {\n const ch = this.source[this.pos]\n if (ch === ' ') {\n indent++\n this.pos++\n this.column++\n } else if (ch === '\\t') {\n indent += 4 // Tab = 4 spaces\n this.pos++\n this.column++\n } else {\n break\n }\n }\n\n // Skip blank lines\n if (this.pos < this.source.length && this.source[this.pos] === '\\n') {\n return\n }\n // Skip comment-only lines (don't affect indentation)\n if (this.pos < this.source.length && this.source[this.pos] === '/' && this.pos + 1 < this.source.length && this.source[this.pos + 1] === '/') {\n return\n }\n\n const currentIndent = this.indentStack[this.indentStack.length - 1]\n\n if (indent > currentIndent) {\n this.indentStack.push(indent)\n this.tokens.push(new Token(TokenType.INDENT, '', this.line, 1))\n } else if (indent < currentIndent) {\n while (this.indentStack.length > 1 && this.indentStack[this.indentStack.length - 1] > indent) {\n this.indentStack.pop()\n this.tokens.push(new Token(TokenType.DEDENT, '', this.line, 1))\n }\n }\n }\n\n // ─── Newlines ───────────────────────────────────────────────\n\n private emitNewline(): void {\n // Don't emit consecutive newlines\n const lastToken = this.tokens[this.tokens.length - 1]\n if (!lastToken || (lastToken.type !== TokenType.NEWLINE && lastToken.type !== TokenType.INDENT)) {\n this.tokens.push(new Token(TokenType.NEWLINE, '\\n', this.line, this.column))\n }\n this.advance() // consume \\n\n this.line++\n this.column = 1\n this.atLineStart = true\n }\n\n // ─── Comments ───────────────────────────────────────────────\n\n private readComment(): void {\n const startCol = this.column\n let value = ''\n this.advance() // first /\n this.advance() // second /\n\n // Check for compiler annotation: //@version=5\n if (this.current() === '@') {\n value = '//@'\n this.advance() // @\n while (this.pos < this.source.length && this.current() !== '\\n') {\n value += this.current()!\n this.advance()\n }\n this.tokens.push(new Token(TokenType.COMPILER_ANNOTATION, value.trim(), this.line, startCol))\n return\n }\n\n // Regular comment — skip until end of line\n while (this.pos < this.source.length && this.current() !== '\\n') {\n value += this.current()!\n this.advance()\n }\n // Comments are skipped (not emitted as tokens)\n }\n\n // ─── Numbers ────────────────────────────────────────────────\n\n private readNumber(): void {\n const startCol = this.column\n let value = ''\n\n // Integer or float\n while (this.pos < this.source.length && (this.isDigit(this.current()!) || this.current() === '.')) {\n value += this.current()!\n this.advance()\n }\n\n // Scientific notation: 1e5, 1.5e-3\n if (this.current() === 'e' || this.current() === 'E') {\n value += this.current()!\n this.advance()\n if (this.current() === '+' || this.current() === '-') {\n value += this.current()!\n this.advance()\n }\n while (this.pos < this.source.length && this.isDigit(this.current()!)) {\n value += this.current()!\n this.advance()\n }\n }\n\n this.tokens.push(new Token(TokenType.NUMBER, value, this.line, startCol))\n }\n\n // ─── Strings ────────────────────────────────────────────────\n\n private readString(quote: string): void {\n const startCol = this.column\n const startLine = this.line\n let value = ''\n this.advance() // opening quote\n\n while (this.pos < this.source.length) {\n const ch = this.current()!\n\n if (ch === '\\\\') {\n this.advance()\n const esc = this.current()\n if (esc === 'n') value += '\\n'\n else if (esc === 't') value += '\\t'\n else if (esc === '\\\\') value += '\\\\'\n else if (esc === quote) value += quote\n else value += '\\\\' + (esc ?? '')\n this.advance()\n continue\n }\n\n if (ch === quote) {\n this.advance() // closing quote\n this.tokens.push(new Token(TokenType.STRING, value, startLine, startCol))\n return\n }\n\n if (ch === '\\n') {\n throw new LexerError('Unterminated string literal', startLine, startCol)\n }\n\n value += ch\n this.advance()\n }\n\n throw new LexerError('Unterminated string literal', startLine, startCol)\n }\n\n // ─── Color Literals ─────────────────────────────────────────\n\n private readColor(): void {\n const startCol = this.column\n let value = '#'\n this.advance() // #\n\n while (this.pos < this.source.length && this.isHexDigit(this.current()!)) {\n value += this.current()!\n this.advance()\n }\n\n if (value.length !== 7 && value.length !== 9) {\n throw new LexerError(`Invalid color literal: ${value}`, this.line, startCol)\n }\n\n this.tokens.push(new Token(TokenType.COLOR_LITERAL, value, this.line, startCol))\n }\n\n // ─── Identifiers & Keywords ─────────────────────────────────\n\n private readIdentifier(): void {\n const startCol = this.column\n let value = ''\n\n while (this.pos < this.source.length && (this.isAlphaNumeric(this.current()!) || this.current() === '_')) {\n value += this.current()!\n this.advance()\n }\n\n // Check for keyword\n const keyword = KEYWORDS[value]\n if (keyword) {\n this.tokens.push(new Token(keyword, value, this.line, startCol))\n } else {\n this.tokens.push(new Token(TokenType.IDENTIFIER, value, this.line, startCol))\n }\n }\n\n // ─── Operators & Delimiters ─────────────────────────────────\n\n private readOperator(): boolean {\n const ch = this.current()!\n const next = this.peek()\n const startCol = this.column\n\n // Two-character operators\n if (next !== undefined) {\n const two = ch + next\n const twoCharOps: Record<string, TokenType> = {\n '==': TokenType.EQ,\n '!=': TokenType.NEQ,\n '<=': TokenType.LTE,\n '>=': TokenType.GTE,\n ':=': TokenType.REASSIGN,\n '+=': TokenType.PLUS_ASSIGN,\n '-=': TokenType.MINUS_ASSIGN,\n '*=': TokenType.STAR_ASSIGN,\n '/=': TokenType.SLASH_ASSIGN,\n '%=': TokenType.PERCENT_ASSIGN,\n '=>': TokenType.ARROW,\n '**': TokenType.POWER,\n }\n if (twoCharOps[two]) {\n this.advance()\n this.advance()\n this.tokens.push(new Token(twoCharOps[two], two, this.line, startCol))\n return true\n }\n }\n\n // Single-character operators\n const singleCharOps: Record<string, TokenType> = {\n '+': TokenType.PLUS,\n '-': TokenType.MINUS,\n '*': TokenType.STAR,\n '/': TokenType.SLASH,\n '%': TokenType.PERCENT,\n '<': TokenType.LT,\n '>': TokenType.GT,\n '=': TokenType.ASSIGN,\n '(': TokenType.LPAREN,\n ')': TokenType.RPAREN,\n '[': TokenType.LBRACKET,\n ']': TokenType.RBRACKET,\n ',': TokenType.COMMA,\n '.': TokenType.DOT,\n ':': TokenType.COLON,\n '?': TokenType.QUESTION,\n }\n\n if (singleCharOps[ch]) {\n this.advance()\n this.tokens.push(new Token(singleCharOps[ch], ch, this.line, startCol))\n return true\n }\n\n return false\n }\n\n // ─── Post-Processing ───────────────────────────────────────\n\n /**\n * Filter out meaningless tokens and handle line continuation.\n * Pine uses implicit line continuation after certain tokens:\n * binary operators, commas, opening brackets/parens.\n */\n private filterTokens(tokens: Token[]): Token[] {\n const result: Token[] = []\n const continuationTokens = new Set([\n TokenType.PLUS, TokenType.MINUS, TokenType.STAR, TokenType.SLASH,\n TokenType.PERCENT, TokenType.POWER, TokenType.EQ, TokenType.NEQ,\n TokenType.LT, TokenType.GT, TokenType.LTE, TokenType.GTE,\n TokenType.AND, TokenType.OR, TokenType.COMMA, TokenType.ASSIGN,\n TokenType.REASSIGN, TokenType.PLUS_ASSIGN, TokenType.MINUS_ASSIGN,\n TokenType.STAR_ASSIGN, TokenType.SLASH_ASSIGN, TokenType.PERCENT_ASSIGN,\n TokenType.QUESTION, TokenType.COLON, TokenType.ARROW,\n TokenType.LPAREN, TokenType.LBRACKET,\n ])\n\n let parenDepth = 0\n let bracketDepth = 0\n\n for (let i = 0; i < tokens.length; i++) {\n const tok = tokens[i]\n\n if (tok.type === TokenType.LPAREN) parenDepth++\n if (tok.type === TokenType.RPAREN) parenDepth--\n if (tok.type === TokenType.LBRACKET) bracketDepth++\n if (tok.type === TokenType.RBRACKET) bracketDepth--\n\n // Skip newlines inside parentheses/brackets (implicit continuation)\n if (tok.type === TokenType.NEWLINE && (parenDepth > 0 || bracketDepth > 0)) {\n continue\n }\n\n // Skip newlines after continuation tokens\n if (tok.type === TokenType.NEWLINE) {\n const prev = result[result.length - 1]\n if (prev && continuationTokens.has(prev.type)) {\n continue\n }\n }\n\n // Skip INDENT/DEDENT inside parens/brackets\n if ((tok.type === TokenType.INDENT || tok.type === TokenType.DEDENT) && (parenDepth > 0 || bracketDepth > 0)) {\n continue\n }\n\n result.push(tok)\n }\n\n return result\n }\n\n // ─── Helpers ────────────────────────────────────────────────\n\n private current(): string | undefined {\n return this.source[this.pos]\n }\n\n private peek(offset = 1): string | undefined {\n return this.source[this.pos + offset]\n }\n\n private advance(): void {\n this.pos++\n this.column++\n }\n\n private isDigit(ch: string): boolean {\n return ch >= '0' && ch <= '9'\n }\n\n private isAlpha(ch: string): boolean {\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_'\n }\n\n private isAlphaNumeric(ch: string): boolean {\n return this.isAlpha(ch) || this.isDigit(ch)\n }\n\n private isHexDigit(ch: string | undefined): boolean {\n if (!ch) return false\n return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')\n }\n}\n","/**\n * pine-to-kline — Parser\n * Recursive descent parser: Token[] → AST (ProgramNode)\n * @license Apache-2.0\n */\n\nimport { Token } from '../lexer/Token'\nimport { TokenType } from '../lexer/TokenType'\nimport { ParseError } from '../utils/errors'\nimport type {\n ProgramNode, ASTNode, ExprNode, AnnotationNode,\n IndicatorNode, VarDeclNode, AssignNode, IfNode, ForNode, ForInNode,\n WhileNode, SwitchNode, FunctionDefNode, PlotCallNode, HlineCallNode,\n ExpressionStatement, NumberLiteral, StringLiteral, BoolLiteral,\n ColorLiteral, NaLiteral, Identifier, BinaryExpr, UnaryExpr,\n TernaryExpr, FunctionCallExpr, SeriesAccessExpr, ReturnNode,\n BreakNode, ContinueNode\n} from './nodes/index'\n\nconst PLOT_FUNCTIONS = new Set(['plot', 'plotshape', 'plotarrow', 'plotbar', 'plotcandle', 'plotchar', 'bgcolor', 'fill'])\nconst PINE_TYPES = new Set(['int', 'float', 'bool', 'string', 'color', 'label', 'line', 'box', 'table', 'series', 'simple'])\n\nexport class Parser {\n private tokens: Token[]\n private pos = 0\n\n constructor(tokens: Token[]) {\n this.tokens = tokens\n }\n\n parse(): ProgramNode {\n const body: ASTNode[] = []\n const annotations: AnnotationNode[] = []\n\n this.skipNewlines()\n\n while (!this.isAtEnd()) {\n this.skipNewlines()\n if (this.isAtEnd()) break\n\n if (this.check(TokenType.COMPILER_ANNOTATION)) {\n annotations.push({ type: 'Annotation', value: this.advance().value, line: this.previous().line })\n this.skipNewlines()\n continue\n }\n\n const stmt = this.parseStatement()\n if (stmt) body.push(stmt)\n this.skipNewlines()\n }\n\n return { type: 'Program', body, annotations }\n }\n\n // ─── Statement Parsing ──────────────────────────────────────\n\n private parseStatement(): ASTNode | null {\n // var / varip declarations\n if (this.check(TokenType.VAR) || this.check(TokenType.VARIP)) {\n return this.parseVarDecl()\n }\n\n // if statement\n if (this.check(TokenType.IF)) return this.parseIf()\n\n // for loop\n if (this.check(TokenType.FOR)) return this.parseFor()\n\n // while loop\n if (this.check(TokenType.WHILE)) return this.parseWhile()\n\n // switch statement\n if (this.check(TokenType.SWITCH)) return this.parseSwitch()\n\n // break / continue / return\n if (this.check(TokenType.BREAK)) { this.advance(); return { type: 'Break', line: this.previous().line } as BreakNode }\n if (this.check(TokenType.CONTINUE)) { this.advance(); return { type: 'Continue', line: this.previous().line } as ContinueNode }\n if (this.check(TokenType.RETURN)) return this.parseReturn()\n\n // Try identifier-led statements\n if (this.check(TokenType.IDENTIFIER)) {\n return this.parseIdentifierStatement()\n }\n\n // Tuple destructuring: [a, b, c] = expr\n if (this.check(TokenType.LBRACKET)) {\n return this.parseTupleAssign()\n }\n\n // Expression statement (fallback)\n const expr = this.parseExpression()\n return { type: 'ExpressionStatement', expression: expr, line: expr.line } as ExpressionStatement\n }\n\n private parseIdentifierStatement(): ASTNode {\n const id = this.peek()\n\n // Check for: indicator(\"name\", ...) / strategy / library\n if (id.value === 'indicator' || id.value === 'strategy' || id.value === 'library') {\n if (this.peekAt(1)?.type === TokenType.LPAREN) {\n return this.parseIndicator()\n }\n }\n\n // Check for plot/hline calls\n if (PLOT_FUNCTIONS.has(id.value) && this.peekAt(1)?.type === TokenType.LPAREN) {\n return this.parsePlotCall()\n }\n if (id.value === 'hline' && this.peekAt(1)?.type === TokenType.LPAREN) {\n return this.parseHlineCall()\n }\n\n // Check for function definition: name(params) =>\n if (this.peekAt(1)?.type === TokenType.LPAREN && this.isFunctionDef()) {\n return this.parseFunctionDef()\n }\n\n // Check for type annotation: float x = ...\n if (PINE_TYPES.has(id.value) && this.peekAt(1)?.type === TokenType.IDENTIFIER) {\n return this.parseTypedDecl()\n }\n\n // Check for assignment: x = expr, x := expr, x += expr\n if (this.peekAt(1)?.isAny(TokenType.ASSIGN, TokenType.REASSIGN, TokenType.PLUS_ASSIGN, TokenType.MINUS_ASSIGN, TokenType.STAR_ASSIGN, TokenType.SLASH_ASSIGN, TokenType.PERCENT_ASSIGN)) {\n return this.parseAssignment()\n }\n\n // Expression statement\n const expr = this.parseExpression()\n return { type: 'ExpressionStatement', expression: expr, line: expr.line } as ExpressionStatement\n }\n\n // ─── Indicator / Strategy ───────────────────────────────────\n\n private parseIndicator(): IndicatorNode {\n const tok = this.advance() // indicator/strategy/library\n this.expect(TokenType.LPAREN)\n const args = this.parseCallArgs()\n this.expect(TokenType.RPAREN)\n const nameArg = args.positional[0]\n return {\n type: 'Indicator',\n name: nameArg ?? { type: 'StringLiteral', value: 'Untitled', line: tok.line } as StringLiteral,\n args: args.named,\n line: tok.line\n }\n }\n\n // ─── Variable Declarations ─────────────────────────────────\n\n private parseVarDecl(): VarDeclNode {\n const persistent = this.check(TokenType.VAR)\n const persistentTick = this.check(TokenType.VARIP)\n this.advance() // var or varip\n\n let typeAnnotation: string | null = null\n if (this.check(TokenType.IDENTIFIER) && PINE_TYPES.has(this.peek().value)) {\n typeAnnotation = this.advance().value\n }\n\n const name = this.expect(TokenType.IDENTIFIER).value\n this.expect(TokenType.ASSIGN)\n const value = this.parseExpression()\n\n return { type: 'VarDecl', persistent, persistentTick, name, typeAnnotation, value, line: value.line }\n }\n\n private parseTypedDecl(): VarDeclNode {\n const typeAnnotation = this.advance().value\n const name = this.expect(TokenType.IDENTIFIER).value\n this.expect(TokenType.ASSIGN)\n const value = this.parseExpression()\n return { type: 'VarDecl', persistent: false, persistentTick: false, name, typeAnnotation, value, line: value.line }\n }\n\n private parseAssignment(): AssignNode {\n const target = this.advance().value\n const op = this.advance()\n const value = this.parseExpression()\n return { type: 'Assign', target, operator: op.value as any, value, line: op.line }\n }\n\n private parseTupleAssign(): VarDeclNode {\n this.expect(TokenType.LBRACKET)\n const names: string[] = []\n names.push(this.expect(TokenType.IDENTIFIER).value)\n while (this.match(TokenType.COMMA)) {\n names.push(this.expect(TokenType.IDENTIFIER).value)\n }\n this.expect(TokenType.RBRACKET)\n this.expect(TokenType.ASSIGN)\n const value = this.parseExpression()\n return { type: 'VarDecl', persistent: false, persistentTick: false, name: names, typeAnnotation: null, value, line: value.line }\n }\n\n // ─── Control Flow ──────────────────────────────────────────\n\n private parseIf(): IfNode {\n const line = this.advance().line // if\n const condition = this.parseExpression()\n this.skipNewlines()\n const body = this.parseBlock()\n\n const elseIf: { condition: ExprNode; body: ASTNode[] }[] = []\n let elseBody: ASTNode[] | null = null\n\n while (this.check(TokenType.ELSE)) {\n this.advance() // else\n if (this.check(TokenType.IF)) {\n this.advance() // if\n const cond = this.parseExpression()\n this.skipNewlines()\n const b = this.parseBlock()\n elseIf.push({ condition: cond, body: b })\n } else {\n this.skipNewlines()\n elseBody = this.parseBlock()\n break\n }\n }\n\n return { type: 'If', condition, body, elseIf, elseBody, line }\n }\n\n private parseFor(): ForNode | ForInNode {\n const line = this.advance().line // for\n const variable = this.expect(TokenType.IDENTIFIER).value\n\n if (this.check(TokenType.IN)) {\n this.advance()\n const iterable = this.parseExpression()\n this.skipNewlines()\n const body = this.parseBlock()\n return { type: 'ForIn', variable, iterable, body, line }\n }\n\n this.expect(TokenType.ASSIGN)\n const start = this.parseExpression()\n this.expect(TokenType.TO)\n const end = this.parseExpression()\n let step: ExprNode | null = null\n if (this.check(TokenType.BY)) {\n this.advance()\n step = this.parseExpression()\n }\n this.skipNewlines()\n const body = this.parseBlock()\n return { type: 'For', variable, start, end, step, body, line }\n }\n\n private parseWhile(): ASTNode {\n const line = this.advance().line\n const condition = this.parseExpression()\n this.skipNewlines()\n const body = this.parseBlock()\n return { type: 'While', condition, body, line }\n }\n\n private parseSwitch(): SwitchNode {\n const line = this.advance().line\n let expression: ExprNode | null = null\n if (!this.check(TokenType.NEWLINE) && !this.check(TokenType.INDENT)) {\n expression = this.parseExpression()\n }\n this.skipNewlines()\n const cases: { condition: ExprNode | null; body: ASTNode[] }[] = []\n let defaultBody: ASTNode[] | null = null\n\n if (this.match(TokenType.INDENT)) {\n while (!this.check(TokenType.DEDENT) && !this.isAtEnd()) {\n this.skipNewlines()\n if (this.check(TokenType.DEDENT)) break\n if (this.check(TokenType.ARROW)) {\n this.advance()\n this.skipNewlines()\n defaultBody = this.parseBlock()\n } else {\n const cond = this.parseExpression()\n this.expect(TokenType.ARROW)\n this.skipNewlines()\n const body = this.parseBlockOrExpr()\n cases.push({ condition: cond, body })\n }\n this.skipNewlines()\n }\n if (this.check(TokenType.DEDENT)) this.advance()\n }\n\n return { type: 'Switch', expression, cases, defaultBody, line }\n }\n\n private parseReturn(): ReturnNode {\n const line = this.advance().line\n let value: ExprNode | null = null\n if (!this.check(TokenType.NEWLINE) && !this.check(TokenType.DEDENT) && !this.isAtEnd()) {\n value = this.parseExpression()\n }\n return { type: 'Return', value, line }\n }\n\n // ─── Function Definition ───────────────────────────────────\n\n private isFunctionDef(): boolean {\n let depth = 0\n let i = this.pos + 1\n while (i < this.tokens.length) {\n if (this.tokens[i].type === TokenType.LPAREN) depth++\n if (this.tokens[i].type === TokenType.RPAREN) { depth--; if (depth === 0) { return this.tokens[i + 1]?.type === TokenType.ARROW } }\n if (this.tokens[i].type === TokenType.NEWLINE || this.tokens[i].type === TokenType.EOF) return false\n i++\n }\n return false\n }\n\n private parseFunctionDef(): FunctionDefNode {\n const name = this.advance().value\n this.expect(TokenType.LPAREN)\n const params: { name: string; defaultValue: ExprNode | null }[] = []\n if (!this.check(TokenType.RPAREN)) {\n do {\n const pName = this.expect(TokenType.IDENTIFIER).value\n let defaultValue: ExprNode | null = null\n if (this.match(TokenType.ASSIGN)) {\n defaultValue = this.parseExpression()\n }\n params.push({ name: pName, defaultValue })\n } while (this.match(TokenType.COMMA))\n }\n this.expect(TokenType.RPAREN)\n this.expect(TokenType.ARROW)\n this.skipNewlines()\n const body = this.parseBlock()\n return { type: 'FunctionDef', name, params, body, line: this.previous().line }\n }\n\n // ─── Plot / Hline ──────────────────────────────────────────\n\n private parsePlotCall(): PlotCallNode {\n const fn = this.advance().value\n this.expect(TokenType.LPAREN)\n const { positional, named } = this.parseCallArgs()\n this.expect(TokenType.RPAREN)\n return { type: 'PlotCall', function: fn, args: positional, kwargs: named, line: this.previous().line }\n }\n\n private parseHlineCall(): HlineCallNode {\n this.advance() // hline\n this.expect(TokenType.LPAREN)\n const { positional, named } = this.parseCallArgs()\n this.expect(TokenType.RPAREN)\n return { type: 'HlineCall', price: positional[0], args: positional.slice(1), kwargs: named, line: this.previous().line }\n }\n\n // ─── Expressions (Precedence Climbing) ─────────────────────\n\n private parseExpression(): ExprNode {\n return this.parseTernary()\n }\n\n private parseTernary(): ExprNode {\n let expr = this.parseOr()\n if (this.match(TokenType.QUESTION)) {\n const consequent = this.parseExpression()\n this.expect(TokenType.COLON)\n const alternate = this.parseExpression()\n expr = { type: 'TernaryExpr', condition: expr, consequent, alternate, line: expr.line } as TernaryExpr\n }\n return expr\n }\n\n private parseOr(): ExprNode {\n let left = this.parseAnd()\n while (this.match(TokenType.OR)) {\n const right = this.parseAnd()\n left = { type: 'BinaryExpr', operator: 'or', left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parseAnd(): ExprNode {\n let left = this.parseComparison()\n while (this.match(TokenType.AND)) {\n const right = this.parseComparison()\n left = { type: 'BinaryExpr', operator: 'and', left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parseComparison(): ExprNode {\n let left = this.parseAddition()\n while (this.checkAny(TokenType.EQ, TokenType.NEQ, TokenType.LT, TokenType.GT, TokenType.LTE, TokenType.GTE)) {\n const op = this.advance().value\n const right = this.parseAddition()\n left = { type: 'BinaryExpr', operator: op, left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parseAddition(): ExprNode {\n let left = this.parseMultiplication()\n while (this.checkAny(TokenType.PLUS, TokenType.MINUS)) {\n const op = this.advance().value\n const right = this.parseMultiplication()\n left = { type: 'BinaryExpr', operator: op, left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parseMultiplication(): ExprNode {\n let left = this.parsePower()\n while (this.checkAny(TokenType.STAR, TokenType.SLASH, TokenType.PERCENT)) {\n const op = this.advance().value\n const right = this.parsePower()\n left = { type: 'BinaryExpr', operator: op, left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parsePower(): ExprNode {\n let left = this.parseUnary()\n if (this.match(TokenType.POWER)) {\n const right = this.parseUnary()\n left = { type: 'BinaryExpr', operator: '**', left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parseUnary(): ExprNode {\n if (this.match(TokenType.MINUS)) {\n const operand = this.parseUnary()\n return { type: 'UnaryExpr', operator: '-', operand, line: operand.line } as UnaryExpr\n }\n if (this.match(TokenType.NOT)) {\n const operand = this.parseUnary()\n return { type: 'UnaryExpr', operator: 'not', operand, line: operand.line } as UnaryExpr\n }\n return this.parsePostfix()\n }\n\n private parsePostfix(): ExprNode {\n let expr = this.parsePrimary()\n\n while (true) {\n // Series access: expr[n]\n if (this.match(TokenType.LBRACKET)) {\n const offset = this.parseExpression()\n this.expect(TokenType.RBRACKET)\n expr = { type: 'SeriesAccess', series: expr, offset, line: expr.line } as SeriesAccessExpr\n }\n // Member access: expr.member\n else if (this.match(TokenType.DOT)) {\n const prop = this.expect(TokenType.IDENTIFIER).value\n // Check if this is a method/function call: obj.method(args)\n if (this.check(TokenType.LPAREN)) {\n const callee = this.buildCalleeName(expr) + '.' + prop\n this.advance() // (\n const { positional, named } = this.parseCallArgs()\n this.expect(TokenType.RPAREN)\n expr = { type: 'FunctionCall', callee, args: positional, kwargs: named, line: expr.line } as FunctionCallExpr\n } else {\n expr = { type: 'MemberExpr', object: expr, property: prop, line: expr.line }\n }\n }\n // Function call: expr(args)\n else if (this.check(TokenType.LPAREN) && expr.type === 'Identifier') {\n const callee = (expr as Identifier).name\n this.advance() // (\n const { positional, named } = this.parseCallArgs()\n this.expect(TokenType.RPAREN)\n expr = { type: 'FunctionCall', callee, args: positional, kwargs: named, line: expr.line } as FunctionCallExpr\n }\n else break\n }\n\n return expr\n }\n\n private parsePrimary(): ExprNode {\n const tok = this.peek()\n\n // Number\n if (this.check(TokenType.NUMBER)) {\n this.advance()\n return { type: 'NumberLiteral', value: parseFloat(tok.value), line: tok.line } as NumberLiteral\n }\n\n // String\n if (this.check(TokenType.STRING)) {\n this.advance()\n return { type: 'StringLiteral', value: tok.value, line: tok.line } as StringLiteral\n }\n\n // Bool\n if (this.check(TokenType.TRUE)) { this.advance(); return { type: 'BoolLiteral', value: true, line: tok.line } as BoolLiteral }\n if (this.check(TokenType.FALSE)) { this.advance(); return { type: 'BoolLiteral', value: false, line: tok.line } as BoolLiteral }\n\n // na\n if (this.check(TokenType.NA)) { this.advance(); return { type: 'NaLiteral', line: tok.line } as NaLiteral }\n\n // Color literal\n if (this.check(TokenType.COLOR_LITERAL)) {\n this.advance()\n return { type: 'ColorLiteral', value: tok.value, line: tok.line } as ColorLiteral\n }\n\n // Parenthesized expression\n if (this.match(TokenType.LPAREN)) {\n const expr = this.parseExpression()\n this.expect(TokenType.RPAREN)\n return expr\n }\n\n // Identifier\n if (this.check(TokenType.IDENTIFIER)) {\n this.advance()\n return { type: 'Identifier', name: tok.value, line: tok.line } as Identifier\n }\n\n // If expression (Pine allows if as expression)\n if (this.check(TokenType.IF)) {\n const ifNode = this.parseIf()\n // Wrap as expression — the runtime will handle value extraction\n return { type: 'Identifier', name: '__if_expr__', line: ifNode.line, _ifNode: ifNode } as any\n }\n\n throw new ParseError(`Unexpected token: ${tok.type} (${tok.value})`, tok.line, tok.column)\n }\n\n // ─── Call Arguments ────────────────────────────────────────\n\n private parseCallArgs(): { positional: ExprNode[]; named: { key: string; value: ExprNode }[] } {\n const positional: ExprNode[] = []\n const named: { key: string; value: ExprNode }[] = []\n\n if (this.check(TokenType.RPAREN)) return { positional, named }\n\n do {\n this.skipNewlines()\n if (this.check(TokenType.RPAREN)) break\n\n // Check for named argument: key=value\n if (this.check(TokenType.IDENTIFIER) && this.peekAt(1)?.type === TokenType.ASSIGN) {\n const key = this.advance().value\n this.advance() // =\n const value = this.parseExpression()\n named.push({ key, value })\n } else {\n positional.push(this.parseExpression())\n }\n this.skipNewlines()\n } while (this.match(TokenType.COMMA))\n\n return { positional, named }\n }\n\n // ─── Block Parsing ─────────────────────────────────────────\n\n private parseBlock(): ASTNode[] {\n const stmts: ASTNode[] = []\n\n if (this.match(TokenType.INDENT)) {\n while (!this.check(TokenType.DEDENT) && !this.isAtEnd()) {\n this.skipNewlines()\n if (this.check(TokenType.DEDENT)) break\n const stmt = this.parseStatement()\n if (stmt) stmts.push(stmt)\n this.skipNewlines()\n }\n if (this.check(TokenType.DEDENT)) this.advance()\n } else {\n // Single-line block\n const stmt = this.parseStatement()\n if (stmt) stmts.push(stmt)\n }\n\n return stmts\n }\n\n private parseBlockOrExpr(): ASTNode[] {\n if (this.check(TokenType.INDENT)) return this.parseBlock()\n const expr = this.parseExpression()\n return [{ type: 'ExpressionStatement', expression: expr, line: expr.line } as ExpressionStatement]\n }\n\n // ─── Helpers ───────────────────────────────────────────────\n\n private buildCalleeName(expr: ExprNode): string {\n if (expr.type === 'Identifier') return (expr as Identifier).name\n if (expr.type === 'MemberExpr') return this.buildCalleeName((expr as any).object) + '.' + (expr as any).property\n return '__unknown__'\n }\n\n private peek(): Token { return this.tokens[this.pos] }\n private peekAt(offset: number): Token | undefined { return this.tokens[this.pos + offset] }\n private previous(): Token { return this.tokens[this.pos - 1] }\n private isAtEnd(): boolean { return this.pos >= this.tokens.length || this.tokens[this.pos].type === TokenType.EOF }\n\n private advance(): Token {\n if (!this.isAtEnd()) this.pos++\n return this.previous()\n }\n\n private check(type: TokenType): boolean {\n return !this.isAtEnd() && this.peek().type === type\n }\n\n private checkAny(...types: TokenType[]): boolean {\n return !this.isAtEnd() && types.includes(this.peek().type)\n }\n\n private match(type: TokenType): boolean {\n if (this.check(type)) { this.advance(); return true }\n return false\n }\n\n private expect(type: TokenType): Token {\n if (this.check(type)) return this.advance()\n const tok = this.peek()\n throw new ParseError(`Expected ${type} but got ${tok?.type} (${tok?.value})`, tok?.line, tok?.column)\n }\n\n private skipNewlines(): void {\n while (this.check(TokenType.NEWLINE)) this.advance()\n }\n}\n","/**\n * pine-to-kline — Bar Context\n * Provides per-bar OHLCV data as series for the runtime\n * @license Apache-2.0\n */\n\nimport type { KlineData } from '../types'\n\nexport class BarContext {\n readonly dataList: KlineData[]\n readonly open: number[]\n readonly high: number[]\n readonly low: number[]\n readonly close: number[]\n readonly volume: number[]\n readonly hl2: number[]\n readonly hlc3: number[]\n readonly ohlc4: number[]\n readonly time: number[]\n readonly barCount: number\n\n constructor(dataList: KlineData[]) {\n this.dataList = dataList\n this.barCount = dataList.length\n this.open = dataList.map(d => d.open)\n this.high = dataList.map(d => d.high)\n this.low = dataList.map(d => d.low)\n this.close = dataList.map(d => d.close)\n this.volume = dataList.map(d => d.volume ?? 0)\n this.hl2 = dataList.map(d => (d.high + d.low) / 2)\n this.hlc3 = dataList.map(d => (d.high + d.low + d.close) / 3)\n this.ohlc4 = dataList.map(d => (d.open + d.high + d.low + d.close) / 4)\n this.time = dataList.map(d => d.timestamp)\n }\n\n /** Resolve a Pine source name to the data array */\n resolveSource(name: string): number[] {\n const map: Record<string, number[]> = {\n open: this.open, high: this.high, low: this.low, close: this.close,\n volume: this.volume, hl2: this.hl2, hlc3: this.hlc3, ohlc4: this.ohlc4,\n time: this.time,\n }\n return map[name] ?? this.close\n }\n}\n","/**\n * pine-to-kline — Variable Persistence\n * Emulates Pine's `var` and `varip` semantics\n * @license Apache-2.0\n */\n\nexport class VarPersistence {\n private vars = new Map<string, any>()\n private varips = new Map<string, any>()\n\n /** Initialize a `var` variable (set once, persists across bars) */\n initVar(name: string, value: any): void {\n if (!this.vars.has(name)) {\n this.vars.set(name, value)\n }\n }\n\n /** Initialize a `varip` variable */\n initVarip(name: string, value: any): void {\n if (!this.varips.has(name)) {\n this.varips.set(name, value)\n }\n }\n\n getVar(name: string): any { return this.vars.get(name) }\n setVar(name: string, value: any): void { this.vars.set(name, value) }\n hasVar(name: string): boolean { return this.vars.has(name) }\n\n getVarip(name: string): any { return this.varips.get(name) }\n setVarip(name: string, value: any): void { this.varips.set(name, value) }\n\n reset(): void { this.vars.clear(); this.varips.clear() }\n}\n","/**\n * pine-to-kline — Moving Average Functions\n * Implements: sma, ema, rma, wma, hma, vwma, swma, dema, tema\n * @license Apache-2.0\n */\n\n/** ta.sma() — Simple Moving Average */\nexport function sma(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let sum = 0\n for (let j = i - length + 1; j <= i; j++) sum += source[j]\n return sum / length\n })\n}\n\n/** ta.ema() — Exponential Moving Average */\nexport function ema(source: number[], length: number): number[] {\n const k = 2 / (length + 1)\n const out: number[] = []\n for (let i = 0; i < source.length; i++) {\n if (i === 0) { out.push(source[i]); continue }\n out.push(source[i] * k + out[i - 1] * (1 - k))\n }\n return out\n}\n\n/** ta.rma() — Wilder's Running Moving Average (used in RSI, ATR) */\nexport function rma(source: number[], length: number): number[] {\n const alpha = 1 / length\n const out: number[] = []\n for (let i = 0; i < source.length; i++) {\n if (i < length - 1) { out.push(NaN); continue }\n if (i === length - 1) {\n let sum = 0\n for (let j = 0; j < length; j++) sum += source[j]\n out.push(sum / length)\n } else {\n out.push(alpha * source[i] + (1 - alpha) * out[i - 1])\n }\n }\n return out\n}\n\n/** ta.wma() — Weighted Moving Average */\nexport function wma(source: number[], length: number): number[] {\n const denom = (length * (length + 1)) / 2\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let sum = 0\n for (let j = 0; j < length; j++) {\n sum += source[i - j] * (length - j)\n }\n return sum / denom\n })\n}\n\n/** ta.hma() — Hull Moving Average */\nexport function hma(source: number[], length: number): number[] {\n const halfLen = Math.floor(length / 2)\n const sqrtLen = Math.round(Math.sqrt(length))\n const wma1 = wma(source, halfLen)\n const wma2 = wma(source, length)\n const diff = wma1.map((v, i) => 2 * v - wma2[i])\n return wma(diff, sqrtLen)\n}\n\n/** ta.vwma() — Volume Weighted Moving Average */\nexport function vwma(source: number[], volume: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let sumPV = 0, sumV = 0\n for (let j = i - length + 1; j <= i; j++) {\n sumPV += source[j] * volume[j]\n sumV += volume[j]\n }\n return sumV === 0 ? NaN : sumPV / sumV\n })\n}\n\n/** ta.swma() — Symmetrically Weighted Moving Average (fixed length=4) */\nexport function swma(source: number[]): number[] {\n return source.map((_, i) => {\n if (i < 3) return NaN\n return source[i] * (1 / 6) + source[i - 1] * (2 / 6) +\n source[i - 2] * (2 / 6) + source[i - 3] * (1 / 6)\n })\n}\n\n/** ta.dema() — Double Exponential Moving Average */\nexport function dema(source: number[], length: number): number[] {\n const ema1 = ema(source, length)\n const ema2 = ema(ema1, length)\n return ema1.map((v, i) => 2 * v - ema2[i])\n}\n\n/** ta.tema() — Triple Exponential Moving Average */\nexport function tema(source: number[], length: number): number[] {\n const ema1 = ema(source, length)\n const ema2 = ema(ema1, length)\n const ema3 = ema(ema2, length)\n return ema1.map((v, i) => 3 * v - 3 * ema2[i] + ema3[i])\n}\n","/**\n * pine-to-kline — Momentum Indicators\n * Implements: rsi, macd, stoch, cci, mom, roc\n * @license Apache-2.0\n */\n\nimport { rma, ema, sma } from './moving-averages'\n\n/** ta.rsi() — Relative Strength Index (Wilder's method) */\nexport function rsi(source: number[], length: number): number[] {\n const gains: number[] = [0]\n const losses: number[] = [0]\n for (let i = 1; i < source.length; i++) {\n const diff = source[i] - source[i - 1]\n gains.push(diff > 0 ? diff : 0)\n losses.push(diff < 0 ? Math.abs(diff) : 0)\n }\n const avgGains = rma(gains, length)\n const avgLoss = rma(losses, length)\n return source.map((_, i) => {\n if (isNaN(avgGains[i]) || isNaN(avgLoss[i])) return NaN\n if (avgLoss[i] === 0) return 100\n return 100 - (100 / (1 + avgGains[i] / avgLoss[i]))\n })\n}\n\n/** ta.macd() — MACD with signal and histogram */\nexport function macd(\n source: number[],\n fastLen = 12,\n slowLen = 26,\n signalLen = 9\n): { macd: number[]; signal: number[]; hist: number[] } {\n const fast = ema(source, fastLen)\n const slow = ema(source, slowLen)\n const macdLine = fast.map((v, i) => v - slow[i])\n const signalLine = ema(macdLine, signalLen)\n const hist = macdLine.map((v, i) => v - signalLine[i])\n return { macd: macdLine, signal: signalLine, hist }\n}\n\n/** ta.stoch() — Stochastic %K */\nexport function stoch(\n close: number[],\n high: number[],\n low: number[],\n length: number\n): number[] {\n return close.map((_, i) => {\n if (i < length - 1) return NaN\n let highest = -Infinity, lowest = Infinity\n for (let j = i - length + 1; j <= i; j++) {\n if (high[j] > highest) highest = high[j]\n if (low[j] < lowest) lowest = low[j]\n }\n if (highest === lowest) return 0\n return ((close[i] - lowest) / (highest - lowest)) * 100\n })\n}\n\n/** ta.cci() — Commodity Channel Index */\nexport function cci(source: number[], length: number): number[] {\n const smaVals = sma(source, length)\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let meanDev = 0\n for (let j = i - length + 1; j <= i; j++) {\n meanDev += Math.abs(source[j] - smaVals[i])\n }\n meanDev /= length\n if (meanDev === 0) return 0\n return (source[i] - smaVals[i]) / (0.015 * meanDev)\n })\n}\n\n/** ta.mom() — Momentum */\nexport function mom(source: number[], length: number): number[] {\n return source.map((v, i) => i < length ? NaN : v - source[i - length])\n}\n\n/** ta.roc() — Rate of Change */\nexport function roc(source: number[], length: number): number[] {\n return source.map((v, i) => {\n if (i < length) return NaN\n const prev = source[i - length]\n return prev === 0 ? 0 : ((v - prev) / prev) * 100\n })\n}\n","/**\n * pine-to-kline — Volatility Indicators\n * Implements: atr, bb, kc, donchian\n * @license Apache-2.0\n */\n\nimport { rma, ema, sma } from './moving-averages'\n\n/** ta.atr() — Average True Range */\nexport function atr(\n high: number[],\n low: number[],\n close: number[],\n length: number\n): number[] {\n const tr = high.map((h, i) => {\n if (i === 0) return h - low[i]\n return Math.max(\n h - low[i],\n Math.abs(h - close[i - 1]),\n Math.abs(low[i] - close[i - 1])\n )\n })\n return rma(tr, length)\n}\n\nexport interface BandsResult {\n upper: number\n basis: number\n lower: number\n}\n\n/** ta.bb() — Bollinger Bands */\nexport function bb(\n source: number[],\n length: number,\n mult = 2.0\n): BandsResult[] {\n const mid = sma(source, length)\n return source.map((_, i) => {\n if (i < length - 1) return { upper: NaN, basis: NaN, lower: NaN }\n let sumSq = 0\n for (let j = i - length + 1; j <= i; j++) {\n sumSq += Math.pow(source[j] - mid[i], 2)\n }\n const std = Math.sqrt(sumSq / length)\n return {\n upper: mid[i] + mult * std,\n basis: mid[i],\n lower: mid[i] - mult * std\n }\n })\n}\n\n/** ta.kc() — Keltner Channels */\nexport function kc(\n source: number[],\n high: number[],\n low: number[],\n close: number[],\n length: number,\n mult = 1.5\n): BandsResult[] {\n const mid = ema(source, length)\n const atrVals = atr(high, low, close, length)\n return source.map((_, i) => ({\n upper: mid[i] + mult * atrVals[i],\n basis: mid[i],\n lower: mid[i] - mult * atrVals[i]\n }))\n}\n\n/** ta.donchian() — Donchian Channels */\nexport function donchian(\n high: number[],\n low: number[],\n length: number\n): BandsResult[] {\n return high.map((_, i) => {\n if (i < length - 1) return { upper: NaN, basis: NaN, lower: NaN }\n let highest = -Infinity, lowest = Infinity\n for (let j = i - length + 1; j <= i; j++) {\n if (high[j] > highest) highest = high[j]\n if (low[j] < lowest) lowest = low[j]\n }\n return {\n upper: highest,\n basis: (highest + lowest) / 2,\n lower: lowest\n }\n })\n}\n\n/** ta.tr() — True Range (single series) */\nexport function tr(\n high: number[],\n low: number[],\n close: number[]\n): number[] {\n return high.map((h, i) => {\n if (i === 0) return h - low[i]\n return Math.max(\n h - low[i],\n Math.abs(h - close[i - 1]),\n Math.abs(low[i] - close[i - 1])\n )\n })\n}\n","/**\n * pine-to-kline — Crossover Functions\n * Implements: crossover, crossunder, cross\n * @license Apache-2.0\n */\n\n/** ta.crossover(a, b) — a crosses above b */\nexport function crossover(a: number[], b: number[]): boolean[] {\n return a.map((v, i) => {\n if (i === 0) return false\n return a[i - 1] <= b[i - 1] && v > b[i]\n })\n}\n\n/** ta.crossunder(a, b) — a crosses below b */\nexport function crossunder(a: number[], b: number[]): boolean[] {\n return a.map((v, i) => {\n if (i === 0) return false\n return a[i - 1] >= b[i - 1] && v < b[i]\n })\n}\n\n/** ta.cross(a, b) — either crossover or crossunder */\nexport function cross(a: number[], b: number[]): boolean[] {\n return a.map((_, i) => {\n if (i === 0) return false\n return (a[i - 1] <= b[i - 1] && a[i] > b[i]) ||\n (a[i - 1] >= b[i - 1] && a[i] < b[i])\n })\n}\n\n/** ta.change() — difference from previous bar */\nexport function change(source: number[], length = 1): number[] {\n return source.map((v, i) => i < length ? NaN : v - source[i - length])\n}\n\n/** ta.rising() — true if source has been rising for `length` bars */\nexport function rising(source: number[], length: number): boolean[] {\n return source.map((_, i) => {\n if (i < length) return false\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] <= source[j - 1]) return false\n }\n return true\n })\n}\n\n/** ta.falling() — true if source has been falling for `length` bars */\nexport function falling(source: number[], length: number): boolean[] {\n return source.map((_, i) => {\n if (i < length) return false\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] >= source[j - 1]) return false\n }\n return true\n })\n}\n","/**\n * pine-to-kline — TA Utility Functions\n * Implements: highest, lowest, highestbars, lowestbars, barssince, valuewhen, pivothigh, pivotlow\n * @license Apache-2.0\n */\n\n/** ta.highest() — highest value in last `length` bars */\nexport function highest(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let max = -Infinity\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] > max) max = source[j]\n }\n return max\n })\n}\n\n/** ta.lowest() — lowest value in last `length` bars */\nexport function lowest(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let min = Infinity\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] < min) min = source[j]\n }\n return min\n })\n}\n\n/** ta.highestbars() — number of bars since highest value */\nexport function highestbars(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let maxVal = -Infinity\n let maxIdx = i\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] >= maxVal) { maxVal = source[j]; maxIdx = j }\n }\n return -(i - maxIdx)\n })\n}\n\n/** ta.lowestbars() — number of bars since lowest value */\nexport function lowestbars(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let minVal = Infinity\n let minIdx = i\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] <= minVal) { minVal = source[j]; minIdx = j }\n }\n return -(i - minIdx)\n })\n}\n\n/** ta.barssince(condition) — bars since condition was last true */\nexport function barssince(condition: boolean[]): number[] {\n let count = NaN\n return condition.map((c) => {\n if (c) { count = 0 } else if (!isNaN(count)) { count++ }\n return count\n })\n}\n\n/** ta.valuewhen(condition, source, occurrence) */\nexport function valuewhen(\n condition: boolean[],\n source: number[],\n occurrence = 0\n): number[] {\n const result: number[] = []\n const occurrences: number[] = []\n for (let i = 0; i < source.length; i++) {\n if (condition[i]) occurrences.unshift(source[i])\n result.push(occurrences[occurrence] ?? NaN)\n }\n return result\n}\n\n/** ta.pivothigh() — pivot high detection */\nexport function pivothigh(\n source: number[],\n leftBars: number,\n rightBars: number\n): number[] {\n return source.map((v, i) => {\n if (i < leftBars || i + rightBars >= source.length) return NaN\n for (let j = i - leftBars; j < i; j++) {\n if (source[j] > v) return NaN\n }\n for (let j = i + 1; j <= i + rightBars; j++) {\n if (source[j] > v) return NaN\n }\n return v\n })\n}\n\n/** ta.pivotlow() — pivot low detection */\nexport function pivotlow(\n source: number[],\n leftBars: number,\n rightBars: number\n): number[] {\n return source.map((v, i) => {\n if (i < leftBars || i + rightBars >= source.length) return NaN\n for (let j = i - leftBars; j < i; j++) {\n if (source[j] < v) return NaN\n }\n for (let j = i + 1; j <= i + rightBars; j++) {\n if (source[j] < v) return NaN\n }\n return v\n })\n}\n\n/** ta.cum() — cumulative sum */\nexport function cum(source: number[]): number[] {\n let sum = 0\n return source.map(v => {\n sum += v\n return sum\n })\n}\n\n/** ta.stdev() — standard deviation */\nexport function stdev(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let sum = 0\n for (let j = i - length + 1; j <= i; j++) sum += source[j]\n const mean = sum / length\n let sumSq = 0\n for (let j = i - length + 1; j <= i; j++) sumSq += Math.pow(source[j] - mean, 2)\n return Math.sqrt(sumSq / length)\n })\n}\n\n/** ta.percentrank() — percent rank */\nexport function percentrank(source: number[], length: number): number[] {\n return source.map((v, i) => {\n if (i < length) return NaN\n let count = 0\n for (let j = i - length; j < i; j++) {\n if (source[j] <= v) count++\n }\n return (count / length) * 100\n })\n}\n","/**\n * pine-to-kline — TA Namespace Barrel Export\n * @license Apache-2.0\n */\n\nexport * as ma from './moving-averages'\nexport * as momentum from './momentum'\nexport * as volatility from './volatility'\nexport * as crossover from './crossover'\nexport * as utility from './utility'\n\n// Re-export flat for runtime resolution\nimport * as _ma from './moving-averages'\nimport * as _mom from './momentum'\nimport * as _vol from './volatility'\nimport * as _cross from './crossover'\nimport * as _util from './utility'\n\n/** Registry map: 'ta.sma' → implementation function */\nexport const TA_REGISTRY: Record<string, Function> = {\n // Moving averages\n 'ta.sma': _ma.sma,\n 'ta.ema': _ma.ema,\n 'ta.rma': _ma.rma,\n 'ta.wma': _ma.wma,\n 'ta.hma': _ma.hma,\n 'ta.vwma': _ma.vwma,\n 'ta.swma': _ma.swma,\n 'ta.dema': _ma.dema,\n 'ta.tema': _ma.tema,\n\n // Momentum\n 'ta.rsi': _mom.rsi,\n 'ta.macd': _mom.macd,\n 'ta.stoch': _mom.stoch,\n 'ta.cci': _mom.cci,\n 'ta.mom': _mom.mom,\n 'ta.roc': _mom.roc,\n\n // Volatility\n 'ta.atr': _vol.atr,\n 'ta.bb': _vol.bb,\n 'ta.kc': _vol.kc,\n 'ta.donchian': _vol.donchian,\n 'ta.tr': _vol.tr,\n\n // Crossover\n 'ta.crossover': _cross.crossover,\n 'ta.crossunder': _cross.crossunder,\n 'ta.cross': _cross.cross,\n 'ta.change': _cross.change,\n 'ta.rising': _cross.rising,\n 'ta.falling': _cross.falling,\n\n // Utility\n 'ta.highest': _util.highest,\n 'ta.lowest': _util.lowest,\n 'ta.highestbars': _util.highestbars,\n 'ta.lowestbars': _util.lowestbars,\n 'ta.barssince': _util.barssince,\n 'ta.valuewhen': _util.valuewhen,\n 'ta.pivothigh': _util.pivothigh,\n 'ta.pivotlow': _util.pivotlow,\n 'ta.cum': _util.cum,\n 'ta.stdev': _util.stdev,\n 'ta.percentrank': _util.percentrank,\n}\n","/**\n * pine-to-kline — Math Namespace Functions\n * Wraps JavaScript Math.* to match Pine's math.* namespace\n * @license Apache-2.0\n */\n\n/** Math function registry for runtime resolution */\nexport const MATH_REGISTRY: Record<string, Function> = {\n 'math.abs': (x: number) => Math.abs(x),\n 'math.ceil': (x: number) => Math.ceil(x),\n 'math.floor': (x: number) => Math.floor(x),\n 'math.round': (x: number, precision?: number) => {\n if (precision === undefined) return Math.round(x)\n const factor = Math.pow(10, precision)\n return Math.round(x * factor) / factor\n },\n 'math.log': (x: number) => Math.log(x),\n 'math.log10': (x: number) => Math.log10(x),\n 'math.pow': (base: number, exp: number) => Math.pow(base, exp),\n 'math.sqrt': (x: number) => Math.sqrt(x),\n 'math.exp': (x: number) => Math.exp(x),\n 'math.max': (...args: number[]) => Math.max(...args),\n 'math.min': (...args: number[]) => Math.min(...args),\n 'math.sign': (x: number) => Math.sign(x),\n 'math.avg': (...args: number[]) => args.reduce((a, b) => a + b, 0) / args.length,\n 'math.sum': (source: number[], length: number) => {\n const result: number[] = []\n for (let i = 0; i < source.length; i++) {\n if (i < length - 1) { result.push(NaN); continue }\n let sum = 0\n for (let j = i - length + 1; j <= i; j++) sum += source[j]\n result.push(sum)\n }\n return result\n },\n 'math.sin': (x: number) => Math.sin(x),\n 'math.cos': (x: number) => Math.cos(x),\n 'math.tan': (x: number) => Math.tan(x),\n 'math.asin': (x: number) => Math.asin(x),\n 'math.acos': (x: number) => Math.acos(x),\n 'math.atan': (x: number) => Math.atan(x),\n 'math.random': () => Math.random(),\n 'math.todegrees': (rad: number) => rad * (180 / Math.PI),\n 'math.toradians': (deg: number) => deg * (Math.PI / 180),\n}\n\n// Also export Pine math constants\nexport const MATH_CONSTANTS: Record<string, number> = {\n 'math.pi': Math.PI,\n 'math.e': Math.E,\n 'math.phi': 1.618033988749895,\n 'math.rphi': 0.618033988749895,\n}\n","/**\n * pine-to-kline — Color Constants\n * All Pine color.* constants → hex values\n * @license Apache-2.0\n */\n\nexport const COLOR_MAP: Record<string, string> = {\n 'color.aqua': '#00BCD4',\n 'color.black': '#000000',\n 'color.blue': '#2196F3',\n 'color.fuchsia': '#E040FB',\n 'color.gray': '#9E9E9E',\n 'color.green': '#4CAF50',\n 'color.lime': '#00E676',\n 'color.maroon': '#880E4F',\n 'color.navy': '#0D47A1',\n 'color.olive': '#808000',\n 'color.orange': '#FF9800',\n 'color.purple': '#9C27B0',\n 'color.red': '#F44336',\n 'color.silver': '#B0BEC5',\n 'color.teal': '#009688',\n 'color.white': '#FFFFFF',\n 'color.yellow': '#FFEB3B',\n}\n","/**\n * pine-to-kline — Color Functions\n * Implements: color.new(), color.rgb(), color.from_gradient()\n * @license Apache-2.0\n */\n\n/**\n * color.new(baseColor, transp) — create color with transparency\n * transp: 0 = opaque, 100 = fully transparent\n */\nexport function colorNew(baseColor: string, transp: number): string {\n const alpha = Math.round((1 - transp / 100) * 255)\n const hex = baseColor.startsWith('#') ? baseColor : '#000000'\n const base = hex.length === 9 ? hex.slice(0, 7) : hex\n return base + alpha.toString(16).padStart(2, '0')\n}\n\n/**\n * color.rgb(red, green, blue, transp?) — create RGBA color\n */\nexport function colorRgb(r: number, g: number, b: number, transp = 0): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)))\n const alpha = Math.round((1 - transp / 100) * 255)\n return '#' +\n clamp(r).toString(16).padStart(2, '0') +\n clamp(g).toString(16).padStart(2, '0') +\n clamp(b).toString(16).padStart(2, '0') +\n (alpha < 255 ? alpha.toString(16).padStart(2, '0') : '')\n}\n\n/**\n * color.from_gradient(value, bottom, top, bottomColor, topColor)\n * Linear interpolation between two colors\n */\nexport function colorFromGradient(\n value: number,\n bottom: number,\n top: number,\n bottomColor: string,\n topColor: string\n): string {\n const t = Math.max(0, Math.min(1, (value - bottom) / (top - bottom)))\n const parseHex = (hex: string) => {\n const h = hex.replace('#', '')\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n }\n }\n const c1 = parseHex(bottomColor)\n const c2 = parseHex(topColor)\n const lerp = (a: number, b: number) => Math.round(a + (b - a) * t)\n return colorRgb(lerp(c1.r, c2.r), lerp(c1.g, c2.g), lerp(c1.b, c2.b))\n}\n\nexport const COLOR_FUNCTIONS: Record<string, Function> = {\n 'color.new': colorNew,\n 'color.rgb': colorRgb,\n 'color.from_gradient': colorFromGradient,\n}\n","/**\n * pine-to-kline — Input Functions\n * Handles input.int(), input.float(), input.bool(), etc.\n * These extract metadata for KlineChart calcParams.\n * @license Apache-2.0\n */\n\nimport type { PineInput } from '../../types'\n\nexport interface InputCallResult {\n meta: PineInput\n value: any\n}\n\nlet inputCounter = 0\n\nexport function resetInputCounter(): void {\n inputCounter = 0\n}\n\n/** input.int(defval, title?, ...) */\nexport function inputInt(defval: number, title?: string, options?: Record<string, any>): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'int',\n title: title ?? null,\n defaultValue: defval,\n minval: options?.minval,\n maxval: options?.maxval,\n step: options?.step ?? 1,\n },\n value: defval\n }\n}\n\n/** input.float(defval, title?, ...) */\nexport function inputFloat(defval: number, title?: string, options?: Record<string, any>): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'float',\n title: title ?? null,\n defaultValue: defval,\n minval: options?.minval,\n maxval: options?.maxval,\n step: options?.step ?? 0.1,\n },\n value: defval\n }\n}\n\n/** input.bool(defval, title?) */\nexport function inputBool(defval: boolean, title?: string): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'bool',\n title: title ?? null,\n defaultValue: defval,\n },\n value: defval\n }\n}\n\n/** input.string(defval, title?, options?) */\nexport function inputString(defval: string, title?: string, options?: string[]): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'string',\n title: title ?? null,\n defaultValue: defval,\n options,\n },\n value: defval\n }\n}\n\n/** input.color(defval, title?) */\nexport function inputColor(defval: string, title?: string): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'color',\n title: title ?? null,\n defaultValue: defval,\n },\n value: defval\n }\n}\n\n/** input.source(defval, title?) — typically resolves to 'close' */\nexport function inputSource(defval: string, title?: string): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'source',\n title: title ?? null,\n defaultValue: defval,\n },\n value: defval\n }\n}\n\n/** input() — generic input (Pine v5 legacy) */\nexport function inputGeneric(defval: any, title?: string): InputCallResult {\n const type = typeof defval === 'number'\n ? (Number.isInteger(defval) ? 'int' : 'float')\n : typeof defval === 'boolean' ? 'bool' : 'string'\n\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: type as any,\n title: title ?? null,\n defaultValue: defval,\n },\n value: defval\n }\n}\n\nexport const INPUT_REGISTRY: Record<string, Function> = {\n 'input': inputGeneric,\n 'input.int': inputInt,\n 'input.float': inputFloat,\n 'input.bool': inputBool,\n 'input.string': inputString,\n 'input.color': inputColor,\n 'input.source': inputSource,\n}\n","/**\n * pine-to-kline — Builtins Master Index\n * Central registry of all built-in functions and constants\n * @license Apache-2.0\n */\n\nexport { TA_REGISTRY } from './ta/index'\nexport { MATH_REGISTRY, MATH_CONSTANTS } from './math/functions'\nexport { COLOR_MAP } from './color/constants'\nexport { COLOR_FUNCTIONS } from './color/functions'\nexport { INPUT_REGISTRY, resetInputCounter } from './input/functions'\n\nimport { TA_REGISTRY } from './ta/index'\nimport { MATH_REGISTRY, MATH_CONSTANTS } from './math/functions'\nimport { COLOR_MAP } from './color/constants'\nimport { COLOR_FUNCTIONS } from './color/functions'\nimport { INPUT_REGISTRY } from './input/functions'\n\n/** Combined registry of ALL built-in functions */\nexport const ALL_BUILTINS: Record<string, Function> = {\n ...TA_REGISTRY,\n ...MATH_REGISTRY,\n ...COLOR_FUNCTIONS,\n ...INPUT_REGISTRY,\n}\n\n/** Combined registry of ALL built-in constants */\nexport const ALL_CONSTANTS: Record<string, any> = {\n ...MATH_CONSTANTS,\n ...COLOR_MAP,\n // Pine special constants\n 'na': NaN,\n 'true': true,\n 'false': false,\n}\n","/**\n * pine-to-kline — Pine Runtime\n * Walks the AST and executes PineScript logic against bar data.\n * Produces arrays of computed values for each plot.\n * @license Apache-2.0\n */\n\nimport type { KlineData, PineInput, PinePlot, PineHline, PineMeta, PineIR } from '../types'\nimport type { ProgramNode, ASTNode, ExprNode, Identifier, FunctionCallExpr } from '../parser/nodes/index'\nimport { BarContext } from './BarContext'\nimport { VarPersistence } from './VarPersistence'\nimport { ALL_BUILTINS, ALL_CONSTANTS, resetInputCounter } from '../builtins/index'\nimport { COLOR_MAP } from '../builtins/color/constants'\nimport { RuntimeError } from '../utils/errors'\n\nexport interface RuntimeResult {\n meta: PineMeta\n inputs: PineInput[]\n plots: PinePlot[]\n hlines: PineHline[]\n calcFn: (dataList: KlineData[], params: any[]) => Record<string, any>[]\n warnings: string[]\n errors: Error[]\n}\n\nexport class PineRuntime {\n private ctx!: BarContext\n private vars = new VarPersistence()\n private scope: Map<string, any> = new Map()\n private functions: Map<string, { params: { name: string; defaultValue: any }[]; body: ASTNode[] }> = new Map()\n private meta: PineMeta = { name: 'Untitled', shortName: null, overlay: false, format: null, precision: null, scale: null, max_bars_back: null }\n private inputs: PineInput[] = []\n private plots: PinePlot[] = []\n private hlines: PineHline[] = []\n private plotResults: Map<string, number[]> = new Map()\n private warnings: string[] = []\n private inputIndex = 0\n\n execute(ast: ProgramNode, dataList: KlineData[], params?: any[]): RuntimeResult {\n resetInputCounter()\n this.inputs = []\n this.plots = []\n this.hlines = []\n this.plotResults = new Map()\n this.warnings = []\n this.functions = new Map()\n this.inputIndex = 0\n\n this.ctx = new BarContext(dataList)\n const errors: Error[] = []\n\n // First pass: extract metadata, inputs, function defs (dry run on first bar)\n this.scope = new Map()\n this.vars.reset()\n this.firstPass(ast, params)\n\n // Build the calc function\n const calcFn = (dl: KlineData[], p: any[]) => this.runCalc(ast, dl, p)\n\n return {\n meta: this.meta,\n inputs: this.inputs,\n plots: this.plots,\n hlines: this.hlines,\n calcFn,\n warnings: this.warnings,\n errors,\n }\n }\n\n private firstPass(ast: ProgramNode, params?: any[]): void {\n for (const node of ast.body) {\n if (node.type === 'Indicator') this.evalIndicator(node)\n else if (node.type === 'FunctionDef') {\n this.functions.set(node.name, { params: node.params.map(p => ({ name: p.name, defaultValue: p.defaultValue ? this.evalExpr(p.defaultValue) : null })), body: node.body })\n }\n }\n // Dry-run to collect inputs and plots\n this.runOnce(ast, this.ctx.dataList, params ?? [])\n }\n\n private runCalc(ast: ProgramNode, dataList: KlineData[], params: any[]): Record<string, any>[] {\n return this.runOnce(ast, dataList, params)\n }\n\n private runOnce(ast: ProgramNode, dataList: KlineData[], params: any[]): Record<string, any>[] {\n this.ctx = new BarContext(dataList)\n this.scope = new Map()\n this.vars.reset()\n this.plotResults = new Map()\n this.inputIndex = 0\n const collectedInputs: PineInput[] = []\n const collectedPlots: PinePlot[] = []\n const collectedHlines: PineHline[] = []\n\n // Set up built-in source variables\n const sources: Record<string, number[]> = {\n open: this.ctx.open, high: this.ctx.high, low: this.ctx.low,\n close: this.ctx.close, volume: this.ctx.volume,\n hl2: this.ctx.hl2, hlc3: this.ctx.hlc3, ohlc4: this.ctx.ohlc4,\n }\n\n // Register user-defined functions\n for (const node of ast.body) {\n if (node.type === 'FunctionDef') {\n this.functions.set(node.name, { params: node.params.map(p => ({ name: p.name, defaultValue: p.defaultValue ? this.evalExpr(p.defaultValue) : null })), body: node.body })\n }\n }\n\n // Execute body\n for (const node of ast.body) {\n if (node.type === 'Indicator' || node.type === 'FunctionDef') continue\n try {\n this.evalNode(node, sources, params, collectedInputs, collectedPlots, collectedHlines)\n } catch (e: any) {\n this.warnings.push(`Runtime warning at line ${(node as any).line}: ${e.message}`)\n }\n }\n\n if (collectedInputs.length > 0) this.inputs = collectedInputs\n if (collectedPlots.length > 0) this.plots = collectedPlots\n if (collectedHlines.length > 0) this.hlines = collectedHlines\n\n // Build result array from plot results\n const n = dataList.length\n const result: Record<string, any>[] = []\n for (let i = 0; i < n; i++) {\n const row: Record<string, any> = {}\n for (const [key, arr] of this.plotResults) {\n row[key] = arr[i] ?? NaN\n }\n result.push(row)\n }\n return result\n }\n\n // ─── Node Evaluation ──────────────────────────────────────\n\n private evalNode(\n node: ASTNode,\n sources: Record<string, number[]>,\n params: any[],\n inputs: PineInput[],\n plots: PinePlot[],\n hlines: PineHline[]\n ): any {\n switch (node.type) {\n case 'VarDecl': return this.evalVarDecl(node, sources, params, inputs)\n case 'Assign': return this.evalAssign(node, sources, params, inputs)\n case 'If': return this.evalIf(node, sources, params, inputs, plots, hlines)\n case 'For': return this.evalFor(node, sources, params, inputs, plots, hlines)\n case 'While': return this.evalWhile(node, sources, params, inputs, plots, hlines)\n case 'PlotCall': return this.evalPlot(node, sources, params, inputs, plots)\n case 'HlineCall': return this.evalHline(node, hlines)\n case 'ExpressionStatement': return this.evalExpr((node as any).expression, sources, params, inputs)\n case 'Return': return (node as any).value ? this.evalExpr((node as any).value, sources, params, inputs) : undefined\n default: return undefined\n }\n }\n\n private evalIndicator(node: any): void {\n if (node.name?.type === 'StringLiteral') {\n this.meta.name = node.name.value\n }\n for (const arg of node.args) {\n if (arg.key === 'overlay' && arg.value?.type === 'BoolLiteral') this.meta.overlay = arg.value.value\n if (arg.key === 'shorttitle' && arg.value?.type === 'StringLiteral') this.meta.shortName = arg.value.value\n if (arg.key === 'format' && arg.value?.type === 'StringLiteral') this.meta.format = arg.value.value\n if (arg.key === 'precision' && arg.value?.type === 'NumberLiteral') this.meta.precision = arg.value.value\n }\n }\n\n private evalVarDecl(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[]): void {\n const value = this.evalExpr(node.value, sources, params, inputs)\n\n if (Array.isArray(node.name)) {\n // Tuple destructuring\n const names = node.name as string[]\n if (value && typeof value === 'object') {\n const vals = Object.values(value)\n names.forEach((n, i) => this.scope.set(n, vals[i]))\n }\n } else {\n if (node.persistent) {\n this.vars.initVar(node.name, value)\n this.scope.set(node.name, this.vars.getVar(node.name))\n } else if (node.persistentTick) {\n this.vars.initVarip(node.name, value)\n this.scope.set(node.name, this.vars.getVarip(node.name))\n } else {\n this.scope.set(node.name, value)\n }\n }\n }\n\n private evalAssign(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[]): void {\n const value = this.evalExpr(node.value, sources, params, inputs)\n const current = this.scope.get(node.target)\n switch (node.operator) {\n case ':=': case '=': this.scope.set(node.target, value); break\n case '+=': this.scope.set(node.target, (current ?? 0) + value); break\n case '-=': this.scope.set(node.target, (current ?? 0) - value); break\n case '*=': this.scope.set(node.target, (current ?? 0) * value); break\n case '/=': this.scope.set(node.target, (current ?? 0) / value); break\n case '%=': this.scope.set(node.target, (current ?? 0) % value); break\n }\n if (this.vars.hasVar(node.target)) this.vars.setVar(node.target, this.scope.get(node.target))\n }\n\n private evalIf(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[], plots: PinePlot[], hlines: PineHline[]): any {\n const cond = this.evalExpr(node.condition, sources, params, inputs)\n if (cond) {\n for (const stmt of node.body) this.evalNode(stmt, sources, params, inputs, plots, hlines)\n } else {\n let handled = false\n for (const ei of node.elseIf) {\n if (this.evalExpr(ei.condition, sources, params, inputs)) {\n for (const stmt of ei.body) this.evalNode(stmt, sources, params, inputs, plots, hlines)\n handled = true; break\n }\n }\n if (!handled && node.elseBody) {\n for (const stmt of node.elseBody) this.evalNode(stmt, sources, params, inputs, plots, hlines)\n }\n }\n }\n\n private evalFor(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[], plots: PinePlot[], hlines: PineHline[]): void {\n const start = this.evalExpr(node.start, sources, params, inputs)\n const end = this.evalExpr(node.end, sources, params, inputs)\n const step = node.step ? this.evalExpr(node.step, sources, params, inputs) : 1\n for (let i = start; step > 0 ? i <= end : i >= end; i += step) {\n this.scope.set(node.variable, i)\n for (const stmt of node.body) this.evalNode(stmt, sources, params, inputs, plots, hlines)\n }\n }\n\n private evalWhile(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[], plots: PinePlot[], hlines: PineHline[]): void {\n let guard = 0\n while (this.evalExpr(node.condition, sources, params, inputs) && guard++ < 10000) {\n for (const stmt of node.body) this.evalNode(stmt, sources, params, inputs, plots, hlines)\n }\n }\n\n private evalPlot(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[], plots: PinePlot[]): void {\n const series = this.evalExpr(node.args[0], sources, params, inputs)\n const kwargs = Object.fromEntries(node.kwargs.map((k: any) => [k.key, this.evalExpr(k.value, sources, params, inputs)]))\n\n const plotId = kwargs.title ?? `plot_${plots.length}`\n const plotKey = plotId.toString().toLowerCase().replace(/\\s+/g, '_')\n\n plots.push({\n id: plotKey,\n title: kwargs.title ?? null,\n color: this.resolveColor(kwargs.color),\n linewidth: kwargs.linewidth ?? 1,\n style: kwargs.style ?? null,\n })\n\n // Store the computed series\n if (Array.isArray(series)) {\n this.plotResults.set(plotKey, series)\n } else if (typeof series === 'number') {\n this.plotResults.set(plotKey, new Array(this.ctx.barCount).fill(series))\n }\n }\n\n private evalHline(node: any, hlines: PineHline[]): void {\n const price = this.evalExpr(node.price)\n const kwargs = Object.fromEntries(node.kwargs.map((k: any) => [k.key, this.evalExpr(k.value)]))\n hlines.push({\n price: typeof price === 'number' ? price : NaN,\n title: kwargs.title ?? null,\n color: this.resolveColor(kwargs.color),\n linestyle: kwargs.linestyle ?? null,\n linewidth: kwargs.linewidth ?? 1,\n })\n }\n\n // ─── Expression Evaluation ────────────────────────────────\n\n evalExpr(node: ExprNode, sources?: Record<string, number[]>, params?: any[], inputs?: PineInput[]): any {\n if (!node) return undefined\n\n switch (node.type) {\n case 'NumberLiteral': return (node as any).value\n case 'StringLiteral': return (node as any).value\n case 'BoolLiteral': return (node as any).value\n case 'ColorLiteral': return (node as any).value\n case 'NaLiteral': return NaN\n\n case 'Identifier': {\n const name = (node as Identifier).name\n if (this.scope.has(name)) return this.scope.get(name)\n if (sources && name in sources) return sources[name]\n if (ALL_CONSTANTS[name] !== undefined) return ALL_CONSTANTS[name]\n if (COLOR_MAP[name]) return COLOR_MAP[name]\n // barstate, bar_index etc\n if (name === 'bar_index') return Array.from({ length: this.ctx.barCount }, (_, i) => i)\n return undefined\n }\n\n case 'BinaryExpr': {\n const left = this.evalExpr((node as any).left, sources, params, inputs)\n const right = this.evalExpr((node as any).right, sources, params, inputs)\n return this.evalBinary((node as any).operator, left, right)\n }\n\n case 'UnaryExpr': {\n const operand = this.evalExpr((node as any).operand, sources, params, inputs)\n if ((node as any).operator === '-') return Array.isArray(operand) ? operand.map((v: number) => -v) : -operand\n if ((node as any).operator === 'not') return Array.isArray(operand) ? operand.map((v: any) => !v) : !operand\n return operand\n }\n\n case 'TernaryExpr': {\n const cond = this.evalExpr((node as any).condition, sources, params, inputs)\n if (Array.isArray(cond)) {\n const cons = this.evalExpr((node as any).consequent, sources, params, inputs)\n const alt = this.evalExpr((node as any).alternate, sources, params, inputs)\n return cond.map((c: any, i: number) => c ? (Array.isArray(cons) ? cons[i] : cons) : (Array.isArray(alt) ? alt[i] : alt))\n }\n return cond ? this.evalExpr((node as any).consequent, sources, params, inputs) : this.evalExpr((node as any).alternate, sources, params, inputs)\n }\n\n case 'FunctionCall': return this.evalFunctionCall(node as FunctionCallExpr, sources, params, inputs)\n\n case 'SeriesAccess': {\n const series = this.evalExpr((node as any).series, sources, params, inputs)\n const offset = this.evalExpr((node as any).offset, sources, params, inputs)\n if (Array.isArray(series) && typeof offset === 'number') {\n // Shift array by offset\n return series.map((_: any, i: number) => i - offset >= 0 ? series[i - offset] : NaN)\n }\n return NaN\n }\n\n case 'MemberExpr': {\n const fullName = this.buildMemberName(node)\n if (ALL_CONSTANTS[fullName] !== undefined) return ALL_CONSTANTS[fullName]\n if (COLOR_MAP[fullName]) return COLOR_MAP[fullName]\n if (sources && fullName in sources) return sources[fullName]\n return fullName // Return as string for later resolution\n }\n\n default: return undefined\n }\n }\n\n private evalFunctionCall(node: FunctionCallExpr, sources?: Record<string, number[]>, params?: any[], inputs?: PineInput[]): any {\n const args = node.args.map(a => this.evalExpr(a, sources, params, inputs))\n const kwargs = Object.fromEntries(node.kwargs.map(k => [k.key, this.evalExpr(k.value, sources, params, inputs)]))\n const callee = node.callee\n\n // Input functions → extract metadata + return value from params\n if (callee.startsWith('input')) {\n const inputFn = ALL_BUILTINS[callee]\n if (inputFn) {\n const result = inputFn(args[0], kwargs.title ?? args[1], kwargs)\n if (inputs) inputs.push(result.meta)\n const paramIdx = this.inputIndex++\n const paramValue = params && params[paramIdx] !== undefined ? params[paramIdx] : result.value\n // If source input, resolve to actual data array\n if (result.meta.type === 'source' && sources) {\n return sources[paramValue] ?? sources['close']\n }\n return paramValue\n }\n }\n\n // Built-in TA/math functions\n if (ALL_BUILTINS[callee]) {\n return ALL_BUILTINS[callee](...args)\n }\n\n // User-defined functions\n if (this.functions.has(callee)) {\n return this.callUserFunction(callee, args, sources, params, inputs)\n }\n\n // nz() — replace NaN with default\n if (callee === 'nz') {\n const val = args[0]\n const def = args[1] ?? 0\n if (Array.isArray(val)) return val.map((v: any) => (v === undefined || isNaN(v)) ? def : v)\n return (val === undefined || (typeof val === 'number' && isNaN(val))) ? def : val\n }\n\n // na() — check if NaN\n if (callee === 'na') {\n const val = args[0]\n if (Array.isArray(val)) return val.map((v: any) => v === undefined || (typeof v === 'number' && isNaN(v)))\n return val === undefined || (typeof val === 'number' && isNaN(val))\n }\n\n // fixnan() — replace NaN with last non-NaN\n if (callee === 'fixnan') {\n const val = args[0]\n if (Array.isArray(val)) {\n let last = NaN\n return val.map((v: number) => { if (!isNaN(v)) last = v; return last })\n }\n return val\n }\n\n // str.tostring\n if (callee === 'str.tostring') return String(args[0])\n\n this.warnings.push(`Unknown function: ${callee}`)\n return NaN\n }\n\n private callUserFunction(name: string, args: any[], sources?: Record<string, number[]>, params?: any[], inputs?: PineInput[]): any {\n const fn = this.functions.get(name)!\n const prevScope = new Map(this.scope)\n\n // Bind params\n fn.params.forEach((p, i) => {\n this.scope.set(p.name, args[i] ?? p.defaultValue)\n })\n\n let result: any\n for (const stmt of fn.body) {\n if (stmt.type === 'Return') {\n result = (stmt as any).value ? this.evalExpr((stmt as any).value, sources, params, inputs) : undefined\n break\n }\n if (stmt.type === 'ExpressionStatement') {\n result = this.evalExpr((stmt as any).expression, sources, params, inputs)\n } else {\n this.evalNode(stmt, sources ?? {}, params ?? [], inputs ?? [], [], [])\n }\n }\n\n this.scope = prevScope\n return result\n }\n\n // ─── Binary Operations ────────────────────────────────────\n\n private evalBinary(op: string, left: any, right: any): any {\n // Array-aware operations\n const isLA = Array.isArray(left), isRA = Array.isArray(right)\n if (isLA || isRA) {\n const len = isLA ? left.length : (right as any[]).length\n return Array.from({ length: len }, (_, i) => {\n const l = isLA ? left[i] : left\n const r = isRA ? right[i] : right\n return this.scalarBinary(op, l, r)\n })\n }\n return this.scalarBinary(op, left, right)\n }\n\n private scalarBinary(op: string, left: any, right: any): any {\n switch (op) {\n case '+': return left + right\n case '-': return left - right\n case '*': return left * right\n case '/': return right === 0 ? NaN : left / right\n case '%': return left % right\n case '**': return Math.pow(left, right)\n case '==': return left === right\n case '!=': return left !== right\n case '<': return left < right\n case '>': return left > right\n case '<=': return left <= right\n case '>=': return left >= right\n case 'and': return left && right\n case 'or': return left || right\n default: return NaN\n }\n }\n\n // ─── Helpers ──────────────────────────────────────────────\n\n private resolveColor(value: any): string | null {\n if (!value) return null\n if (typeof value === 'string') {\n if (value.startsWith('#')) return value\n if (COLOR_MAP[value]) return COLOR_MAP[value]\n return value\n }\n return null\n }\n\n private buildMemberName(node: any): string {\n if (node.type === 'Identifier') return node.name\n if (node.type === 'MemberExpr') return this.buildMemberName(node.object) + '.' + node.property\n return ''\n }\n}\n","/**\n * pine-to-kline — Figure Mapper\n * Maps Pine plot styles to KlineChart figure types\n * @license Apache-2.0\n */\n\nexport type KlineFigureType = 'line' | 'bar' | 'circle'\n\nconst STYLE_MAP: Record<string, KlineFigureType> = {\n 'plot.style_line': 'line',\n 'plot.style_linebr': 'line',\n 'plot.style_stepline': 'line',\n 'plot.style_area': 'line',\n 'plot.style_areabr': 'line',\n 'plot.style_columns': 'bar',\n 'plot.style_histogram': 'bar',\n 'plot.style_circles': 'circle',\n 'plot.style_cross': 'circle',\n}\n\nexport function mapPlotStyle(style: string | null): KlineFigureType {\n if (!style) return 'line'\n return STYLE_MAP[style] ?? 'line'\n}\n","/**\n * pine-to-kline — Style Mapper\n * Converts Pine style values to KlineChart-compatible CSS\n * @license Apache-2.0\n */\n\nimport { COLOR_MAP } from '../builtins/color/constants'\n\n/** Resolve a Pine color reference to a hex string */\nexport function resolveColor(value: any): string {\n if (!value) return '#2196F3'\n if (typeof value === 'string') {\n if (value.startsWith('#')) return value\n if (COLOR_MAP[value]) return COLOR_MAP[value]\n }\n return '#2196F3'\n}\n\n/** Map Pine linestyle to KlineChart dash array */\nexport function mapLinestyle(style: string | null): number[] {\n switch (style) {\n case 'hline.style_dashed': return [6, 3]\n case 'hline.style_dotted': return [2, 2]\n case 'hline.style_solid':\n default: return []\n }\n}\n","/**\n * pine-to-kline — KlineChart Adapter\n * Converts PineRuntime IR → KlineChart IndicatorTemplate\n * @license Apache-2.0\n */\n\nimport type { IndicatorConfig, PineIR, PinePlot, PineHline, KlineData } from '../types'\nimport { mapPlotStyle } from './FigureMapper'\nimport { resolveColor, mapLinestyle } from './StyleMapper'\n\nexport class KlineAdapter {\n toIndicatorTemplate(ir: PineIR): IndicatorConfig {\n const { meta, inputs, plots, hlines, calcFn } = ir\n\n const name = meta.name.toUpperCase().replace(/[^A-Z0-9_]/g, '_')\n\n return {\n name,\n shortName: meta.shortName ?? meta.name,\n series: meta.overlay ? 'price' : 'normal',\n calcParams: inputs.map(i => i.defaultValue),\n extendData: {\n pineInputs: inputs.map(i => i.title || i.id || 'Param')\n },\n figures: this.mapFigures(plots),\n\n regenerateFigures: inputs.length > 0\n ? (_params: any[]) => this.mapFigures(plots)\n : undefined,\n\n calc: (dataList: KlineData[], indicator: any) => {\n const params = indicator.calcParams ?? inputs.map(i => i.defaultValue)\n return calcFn(dataList, params)\n },\n\n // hline() → custom draw callback\n ...(hlines.length > 0 && {\n draw: (params: any) => {\n const { ctx, bounding, indicator, yAxis } = params\n if (!ctx || !yAxis) return false\n\n for (const h of hlines) {\n const y = yAxis.convertToPixel(h.price)\n if (y < bounding.top || y > bounding.top + bounding.height) continue\n\n ctx.save()\n ctx.strokeStyle = resolveColor(h.color)\n ctx.lineWidth = h.linewidth ?? 1\n const dash = mapLinestyle(h.linestyle)\n if (dash.length) ctx.setLineDash(dash)\n\n ctx.beginPath()\n ctx.moveTo(bounding.left, y)\n ctx.lineTo(bounding.left + bounding.width, y)\n ctx.stroke()\n\n // Draw label\n if (h.title) {\n ctx.fillStyle = resolveColor(h.color)\n ctx.font = '10px sans-serif'\n ctx.textAlign = 'right'\n ctx.fillText(h.title, bounding.left + bounding.width - 4, y - 4)\n }\n\n ctx.restore()\n }\n return false // don't skip default figure rendering\n }\n }),\n\n createTooltipDataSource: (params: any) => {\n const { indicator } = params\n const result = indicator?.result ?? []\n const lastRow = result[result.length - 1]\n\n return {\n name: meta.name,\n calcParamsText: inputs.length > 0\n ? `(${(indicator?.calcParams ?? []).join(', ')})`\n : '',\n values: plots.map(p => ({\n title: `${p.title ?? p.id}: `,\n value: lastRow?.[p.id] ?? '--'\n }))\n }\n }\n }\n }\n\n private mapFigures(plots: PinePlot[]) {\n return plots.map(plot => ({\n key: plot.id,\n title: `${plot.title ?? plot.id}: `,\n type: mapPlotStyle(plot.style),\n styles: (_data: any, _indicator: any, _defaultStyles: any) => ({\n color: resolveColor(plot.color)\n })\n }))\n }\n}\n","/**\n * pine-to-kline — PineInterpreter\n * Main entry point class for the library\n * @license Apache-2.0\n */\n\nimport type { PineInterpreterOptions, CompileResult, ValidationResult, IndicatorConfig, KlineData } from './types'\nimport { Lexer } from './lexer/Lexer'\nimport { Parser } from './parser/Parser'\nimport { PineRuntime } from './runtime/PineRuntime'\nimport { KlineAdapter } from './adapter/KlineAdapter'\n\nconst DEFAULT_OPTIONS: Required<PineInterpreterOptions> = {\n version: 'v5',\n strict: false,\n sandbox: true,\n onWarning: console.warn,\n onError: console.error,\n}\n\nexport class PineInterpreter {\n private options: Required<PineInterpreterOptions>\n\n constructor(options: PineInterpreterOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options }\n }\n\n /** Full compile: PineScript source → IndicatorConfig (IndicatorTemplate) */\n compile(source: string): CompileResult {\n try {\n const tokens = new Lexer(source).tokenize()\n const ast = new Parser(tokens).parse()\n const runtime = new PineRuntime()\n\n // Execute with empty data to extract metadata\n const dummyData: KlineData[] = [{ timestamp: 0, open: 0, high: 0, low: 0, close: 0 }]\n const ir = runtime.execute(ast, dummyData)\n\n // Build the real calc function that re-executes for actual data\n const realIR = {\n ...ir,\n calcFn: (dataList: KlineData[], params: any[]) => {\n const rt = new PineRuntime()\n return rt.execute(ast, dataList, params).calcFn(dataList, params)\n }\n }\n\n const adapter = new KlineAdapter()\n const config = adapter.toIndicatorTemplate(realIR)\n\n return {\n success: true,\n indicatorConfig: config,\n name: config.name,\n warnings: ir.warnings,\n errors: [],\n }\n } catch (e: any) {\n this.options.onError(e)\n return {\n success: false,\n indicatorConfig: {} as IndicatorConfig,\n name: '',\n warnings: [],\n errors: [e],\n }\n }\n }\n\n /** Validate syntax only (no execution) */\n validate(source: string): ValidationResult {\n try {\n const tokens = new Lexer(source).tokenize()\n new Parser(tokens).parse()\n return { valid: true, errors: [] }\n } catch (e: any) {\n return { valid: false, errors: [e] }\n }\n }\n\n /** Compile + register to KlineChart (global or instance) */\n register(source: string, registerFn?: (config: any) => void): string {\n const result = this.compile(source)\n if (!result.success) throw result.errors[0]\n\n if (registerFn) {\n registerFn(result.indicatorConfig)\n }\n\n return result.name\n }\n\n /** Execute directly with data (for testing/preview) */\n execute(source: string, dataList: KlineData[], params?: any[]): Record<string, any>[] {\n const result = this.compile(source)\n if (!result.success) throw result.errors[0]\n return result.indicatorConfig.calc(dataList, { calcParams: params ?? result.indicatorConfig.calcParams })\n }\n}\n","/**\n * pine-to-kline — KlineChartPro Plugin\n * Plugin adapter for @simahfud/klinecharts-pro integration\n * @license Apache-2.0\n */\n\nimport { PineInterpreter } from '../PineInterpreter'\nimport type { PineInterpreterOptions, CompileResult, ValidationResult } from '../types'\n\nexport interface PinePluginOptions extends PineInterpreterOptions {\n /** Persist Pine scripts in layout JSON */\n persistToLayout?: boolean\n}\n\nexport interface PineAPI {\n /** Compile + register + return indicator name */\n run: (pineCode: string) => string\n /** Validate syntax only */\n validate: (pineCode: string) => ValidationResult\n /** Compile without adding to chart */\n compile: (pineCode: string) => CompileResult\n}\n\n/**\n * Create a Pine interpreter plugin for KlineChartPro.\n *\n * @example\n * ```ts\n * import { createPinePlugin } from 'pine-to-kline/plugin'\n * import { registerCustomIndicator } from '@simahfud/klinecharts-pro'\n *\n * const pine = createPinePlugin()\n *\n * // Compile and register a Pine indicator\n * const name = pine.run(`\n * //@version=5\n * indicator(\"RSI\", overlay=false)\n * length = input.int(14, \"Length\")\n * plot(ta.rsi(close, length), \"RSI\", color=color.purple)\n * hline(70, \"OB\", color=color.red)\n * hline(30, \"OS\", color=color.green)\n * `)\n *\n * // The indicator is now registered and can be added to a chart\n * ```\n */\nexport function createPinePlugin(options: PinePluginOptions = {}): PineAPI {\n const interpreter = new PineInterpreter(options)\n\n return {\n run: (pineCode: string) => {\n const result = interpreter.compile(pineCode)\n if (!result.success) throw result.errors[0]\n // User should call registerCustomIndicator externally\n return result.name\n },\n\n validate: (pineCode: string) => interpreter.validate(pineCode),\n\n compile: (pineCode: string) => interpreter.compile(pineCode),\n }\n}\n","/**\n * pine-to-kline — Series Emulator\n * Emulates Pine's bar-by-bar series model using cursor-indexed arrays\n * @license Apache-2.0\n */\n\nexport class SeriesEmulator<T = number> {\n private _data: T[]\n private _cursor = 0\n\n constructor(data: T[]) {\n this._data = data\n }\n\n setCursor(index: number): void {\n this._cursor = index\n }\n\n /** Access value with lookback: series[0] = current, series[1] = previous */\n get(lookback = 0): T {\n const idx = this._cursor - lookback\n if (idx < 0) return NaN as unknown as T\n return this._data[idx]\n }\n\n /** Set value at current cursor */\n set(value: T): void {\n this._data[this._cursor] = value\n }\n\n get length(): number { return this._data.length }\n get current(): T { return this.get(0) }\n get all(): T[] { return this._data }\n\n /** Get the full underlying array */\n toArray(): T[] { return [...this._data] }\n}\n"],"names":["Token","type","value","line","column","types","TokenType","KEYWORDS","PineError","message","source","loc","col","LexerError","ParseError","RuntimeError","AdapterError","Lexer","__publicField","ch","indent","currentIndent","lastToken","startCol","quote","startLine","esc","keyword","next","two","twoCharOps","singleCharOps","tokens","result","continuationTokens","parenDepth","bracketDepth","i","tok","prev","offset","PLOT_FUNCTIONS","PINE_TYPES","Parser","body","annotations","stmt","expr","id","_a","_b","_c","_d","_e","_f","args","persistent","persistentTick","typeAnnotation","name","target","op","names","condition","elseIf","elseBody","cond","b","variable","iterable","start","end","step","expression","cases","defaultBody","depth","params","pName","defaultValue","fn","positional","named","consequent","alternate","left","right","operand","prop","callee","ifNode","key","stmts","BarContext","dataList","d","VarPersistence","sma","length","_","sum","j","ema","k","out","rma","alpha","wma","denom","hma","halfLen","sqrtLen","wma1","wma2","diff","v","vwma","volume","sumPV","sumV","swma","dema","ema1","ema2","tema","ema3","rsi","gains","losses","avgGains","avgLoss","macd","fastLen","slowLen","signalLen","fast","slow","macdLine","signalLine","hist","stoch","close","high","low","highest","lowest","cci","smaVals","meanDev","mom","roc","atr","tr","h","bb","mult","mid","sumSq","std","kc","atrVals","donchian","crossover","a","crossunder","cross","change","rising","falling","max","min","highestbars","maxVal","maxIdx","lowestbars","minVal","minIdx","barssince","count","c","valuewhen","occurrence","occurrences","pivothigh","leftBars","rightBars","pivotlow","cum","stdev","mean","percentrank","TA_REGISTRY","_ma.sma","_ma.ema","_ma.rma","_ma.wma","_ma.hma","_ma.vwma","_ma.swma","_ma.dema","_ma.tema","_mom.rsi","_mom.macd","_mom.stoch","_mom.cci","_mom.mom","_mom.roc","_vol.atr","_vol.bb","_vol.kc","_vol.donchian","_vol.tr","_cross.crossover","_cross.crossunder","_cross.cross","_cross.change","_cross.rising","_cross.falling","_util.highest","_util.lowest","_util.highestbars","_util.lowestbars","_util.barssince","_util.valuewhen","_util.pivothigh","_util.pivotlow","_util.cum","_util.stdev","_util.percentrank","MATH_REGISTRY","x","precision","factor","base","exp","rad","deg","MATH_CONSTANTS","COLOR_MAP","colorNew","baseColor","transp","hex","colorRgb","r","g","clamp","colorFromGradient","bottom","top","bottomColor","topColor","t","parseHex","c1","c2","lerp","COLOR_FUNCTIONS","inputCounter","resetInputCounter","inputInt","defval","title","options","inputFloat","inputBool","inputString","inputColor","inputSource","inputGeneric","INPUT_REGISTRY","ALL_BUILTINS","ALL_CONSTANTS","PineRuntime","ast","errors","calcFn","dl","p","node","collectedInputs","collectedPlots","collectedHlines","sources","e","n","row","arr","inputs","plots","hlines","arg","vals","current","handled","ei","guard","series","kwargs","plotKey","price","cons","alt","fullName","inputFn","paramIdx","paramValue","val","def","last","prevScope","isLA","isRA","len","l","STYLE_MAP","mapPlotStyle","style","resolveColor","mapLinestyle","KlineAdapter","ir","meta","_params","indicator","ctx","bounding","yAxis","y","dash","lastRow","plot","_data","_indicator","_defaultStyles","DEFAULT_OPTIONS","PineInterpreter","runtime","dummyData","realIR","config","registerFn","createPinePlugin","interpreter","pineCode","SeriesEmulator","data","index","lookback","idx"],"mappings":"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"}
1
+ {"version":3,"file":"pine-to-kline.umd.js","sources":["../src/lexer/Token.ts","../src/lexer/TokenType.ts","../src/utils/errors.ts","../src/lexer/Lexer.ts","../src/parser/Parser.ts","../src/runtime/BarContext.ts","../src/runtime/VarPersistence.ts","../src/builtins/ta/moving-averages.ts","../src/builtins/ta/momentum.ts","../src/builtins/ta/volatility.ts","../src/builtins/ta/crossover.ts","../src/builtins/ta/utility.ts","../src/builtins/ta/index.ts","../src/builtins/math/functions.ts","../src/builtins/color/constants.ts","../src/builtins/color/functions.ts","../src/builtins/input/functions.ts","../src/builtins/index.ts","../src/runtime/PineRuntime.ts","../src/adapter/FigureMapper.ts","../src/adapter/StyleMapper.ts","../src/adapter/KlineAdapter.ts","../src/PineInterpreter.ts","../src/plugin/KlineChartProPlugin.ts","../src/runtime/SeriesEmulator.ts"],"sourcesContent":["/**\n * pine-to-kline — Token\n * @license Apache-2.0\n */\n\nimport { TokenType } from './TokenType'\n\nexport class Token {\n constructor(\n public readonly type: TokenType,\n public readonly value: string,\n public readonly line: number,\n public readonly column: number\n ) {}\n\n is(type: TokenType): boolean {\n return this.type === type\n }\n\n isAny(...types: TokenType[]): boolean {\n return types.includes(this.type)\n }\n\n toString(): string {\n return `Token(${this.type}, ${JSON.stringify(this.value)}, ${this.line}:${this.column})`\n }\n}\n","/**\n * pine-to-kline — Token Types\n * All PineScript v5/v6 token categories\n * @license Apache-2.0\n */\n\nexport enum TokenType {\n // ─── Literals ───────────────────────────\n NUMBER = 'NUMBER',\n STRING = 'STRING',\n COLOR_LITERAL = 'COLOR_LITERAL', // #RRGGBB or #RRGGBBAA\n\n // ─── Identifiers ───────────────────────\n IDENTIFIER = 'IDENTIFIER',\n\n // ─── Keywords ───────────────────────────\n IF = 'IF',\n ELSE = 'ELSE',\n FOR = 'FOR',\n TO = 'TO',\n BY = 'BY',\n IN = 'IN',\n WHILE = 'WHILE',\n SWITCH = 'SWITCH',\n VAR = 'VAR',\n VARIP = 'VARIP',\n TRUE = 'TRUE',\n FALSE = 'FALSE',\n NA = 'NA',\n AND = 'AND',\n OR = 'OR',\n NOT = 'NOT',\n IMPORT = 'IMPORT',\n EXPORT = 'EXPORT',\n TYPE = 'TYPE',\n METHOD = 'METHOD',\n BREAK = 'BREAK',\n CONTINUE = 'CONTINUE',\n RETURN = 'RETURN',\n\n // ─── Pine-specific Keywords ─────────────\n INDICATOR = 'INDICATOR',\n STRATEGY = 'STRATEGY',\n LIBRARY = 'LIBRARY',\n\n // ─── Arithmetic Operators ───────────────\n PLUS = 'PLUS', // +\n MINUS = 'MINUS', // -\n STAR = 'STAR', // *\n SLASH = 'SLASH', // /\n PERCENT = 'PERCENT', // %\n POWER = 'POWER', // ** (NEW in Pine — not ^)\n\n // ─── Comparison Operators ───────────────\n EQ = 'EQ', // ==\n NEQ = 'NEQ', // !=\n LT = 'LT', // <\n GT = 'GT', // >\n LTE = 'LTE', // <=\n GTE = 'GTE', // >=\n\n // ─── Assignment Operators ───────────────\n ASSIGN = 'ASSIGN', // =\n REASSIGN = 'REASSIGN', // :=\n PLUS_ASSIGN = 'PLUS_ASSIGN', // +=\n MINUS_ASSIGN = 'MINUS_ASSIGN', // -=\n STAR_ASSIGN = 'STAR_ASSIGN', // *=\n SLASH_ASSIGN = 'SLASH_ASSIGN', // /=\n PERCENT_ASSIGN = 'PERCENT_ASSIGN', // %=\n\n // ─── Delimiters ─────────────────────────\n LPAREN = 'LPAREN', // (\n RPAREN = 'RPAREN', // )\n LBRACKET = 'LBRACKET', // [\n RBRACKET = 'RBRACKET', // ]\n COMMA = 'COMMA', // ,\n DOT = 'DOT', // .\n COLON = 'COLON', // :\n QUESTION = 'QUESTION', // ?\n ARROW = 'ARROW', // =>\n\n // ─── Whitespace / Structure ─────────────\n NEWLINE = 'NEWLINE',\n INDENT = 'INDENT',\n DEDENT = 'DEDENT',\n EOF = 'EOF',\n\n // ─── Comments & Annotations ─────────────\n COMMENT = 'COMMENT',\n COMPILER_ANNOTATION = 'COMPILER_ANNOTATION', // //@version=5\n}\n\n/** Keywords map for fast lookup */\nexport const KEYWORDS: Record<string, TokenType> = {\n 'if': TokenType.IF,\n 'else': TokenType.ELSE,\n 'for': TokenType.FOR,\n 'to': TokenType.TO,\n 'by': TokenType.BY,\n 'in': TokenType.IN,\n 'while': TokenType.WHILE,\n 'switch': TokenType.SWITCH,\n 'var': TokenType.VAR,\n 'varip': TokenType.VARIP,\n 'true': TokenType.TRUE,\n 'false': TokenType.FALSE,\n 'na': TokenType.NA,\n 'and': TokenType.AND,\n 'or': TokenType.OR,\n 'not': TokenType.NOT,\n 'import': TokenType.IMPORT,\n 'export': TokenType.EXPORT,\n 'type': TokenType.TYPE,\n 'method': TokenType.METHOD,\n 'break': TokenType.BREAK,\n 'continue': TokenType.CONTINUE,\n 'return': TokenType.RETURN,\n // Pine type keywords are treated as identifiers, not reserved\n // (int, float, bool, string, color, etc.)\n}\n","/**\n * pine-to-kline — Error Classes\n * @license Apache-2.0\n */\n\nexport class PineError extends Error {\n constructor(\n message: string,\n public readonly line?: number,\n public readonly column?: number,\n public readonly source?: string\n ) {\n super(message)\n this.name = 'PineError'\n }\n\n toString(): string {\n const loc = this.line != null ? ` at line ${this.line}` : ''\n const col = this.column != null ? `:${this.column}` : ''\n return `${this.name}: ${this.message}${loc}${col}`\n }\n}\n\nexport class LexerError extends PineError {\n constructor(message: string, line?: number, column?: number) {\n super(message, line, column)\n this.name = 'LexerError'\n }\n}\n\nexport class ParseError extends PineError {\n constructor(message: string, line?: number, column?: number) {\n super(message, line, column)\n this.name = 'ParseError'\n }\n}\n\nexport class RuntimeError extends PineError {\n constructor(message: string, line?: number, column?: number) {\n super(message, line, column)\n this.name = 'RuntimeError'\n }\n}\n\nexport class AdapterError extends PineError {\n constructor(message: string) {\n super(message)\n this.name = 'AdapterError'\n }\n}\n","/**\n * pine-to-kline — Lexer (Tokenizer)\n * Converts PineScript source code into a stream of tokens.\n * Handles indentation-significant syntax (INDENT/DEDENT).\n * @license Apache-2.0\n */\n\nimport { Token } from './Token'\nimport { TokenType, KEYWORDS } from './TokenType'\nimport { LexerError } from '../utils/errors'\n\nexport class Lexer {\n private source: string\n private tokens: Token[] = []\n private pos = 0\n private line = 1\n private column = 1\n private indentStack: number[] = [0]\n private atLineStart = true\n\n constructor(source: string) {\n // Normalize line endings\n this.source = source.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n }\n\n tokenize(): Token[] {\n this.tokens = []\n this.pos = 0\n this.line = 1\n this.column = 1\n this.indentStack = [0]\n this.atLineStart = true\n\n while (this.pos < this.source.length) {\n if (this.atLineStart) {\n this.handleIndentation()\n this.atLineStart = false\n }\n\n const ch = this.current()\n if (ch === undefined) break\n\n // Skip spaces/tabs mid-line\n if (ch === ' ' || ch === '\\t') {\n this.advance()\n continue\n }\n\n // Newlines\n if (ch === '\\n') {\n this.emitNewline()\n continue\n }\n\n // Comments and compiler annotations\n if (ch === '/' && this.peek() === '/') {\n this.readComment()\n continue\n }\n\n // Numbers\n if (this.isDigit(ch) || (ch === '.' && this.peek() !== undefined && this.isDigit(this.peek()!))) {\n this.readNumber()\n continue\n }\n\n // Strings\n if (ch === '\"' || ch === \"'\") {\n this.readString(ch)\n continue\n }\n\n // Color literals: #RRGGBB or #RRGGBBAA\n if (ch === '#' && this.isHexDigit(this.peek())) {\n this.readColor()\n continue\n }\n\n // Identifiers and keywords\n if (this.isAlpha(ch) || ch === '_') {\n this.readIdentifier()\n continue\n }\n\n // Operators and delimiters\n if (this.readOperator()) {\n continue\n }\n\n throw new LexerError(`Unexpected character: '${ch}'`, this.line, this.column)\n }\n\n // Emit remaining DEDENTs\n while (this.indentStack.length > 1) {\n this.indentStack.pop()\n this.tokens.push(new Token(TokenType.DEDENT, '', this.line, this.column))\n }\n\n this.tokens.push(new Token(TokenType.EOF, '', this.line, this.column))\n return this.filterTokens(this.tokens)\n }\n\n // ─── Indentation ────────────────────────────────────────────\n\n private handleIndentation(): void {\n let indent = 0\n while (this.pos < this.source.length) {\n const ch = this.source[this.pos]\n if (ch === ' ') {\n indent++\n this.pos++\n this.column++\n } else if (ch === '\\t') {\n indent += 4 // Tab = 4 spaces\n this.pos++\n this.column++\n } else {\n break\n }\n }\n\n // Skip blank lines\n if (this.pos < this.source.length && this.source[this.pos] === '\\n') {\n return\n }\n // Skip comment-only lines (don't affect indentation)\n if (this.pos < this.source.length && this.source[this.pos] === '/' && this.pos + 1 < this.source.length && this.source[this.pos + 1] === '/') {\n return\n }\n\n const currentIndent = this.indentStack[this.indentStack.length - 1]\n\n if (indent > currentIndent) {\n this.indentStack.push(indent)\n this.tokens.push(new Token(TokenType.INDENT, '', this.line, 1))\n } else if (indent < currentIndent) {\n while (this.indentStack.length > 1 && this.indentStack[this.indentStack.length - 1] > indent) {\n this.indentStack.pop()\n this.tokens.push(new Token(TokenType.DEDENT, '', this.line, 1))\n }\n }\n }\n\n // ─── Newlines ───────────────────────────────────────────────\n\n private emitNewline(): void {\n // Don't emit consecutive newlines\n const lastToken = this.tokens[this.tokens.length - 1]\n if (!lastToken || (lastToken.type !== TokenType.NEWLINE && lastToken.type !== TokenType.INDENT)) {\n this.tokens.push(new Token(TokenType.NEWLINE, '\\n', this.line, this.column))\n }\n this.advance() // consume \\n\n this.line++\n this.column = 1\n this.atLineStart = true\n }\n\n // ─── Comments ───────────────────────────────────────────────\n\n private readComment(): void {\n const startCol = this.column\n let value = ''\n this.advance() // first /\n this.advance() // second /\n\n // Check for compiler annotation: //@version=5\n if (this.current() === '@') {\n value = '//@'\n this.advance() // @\n while (this.pos < this.source.length && this.current() !== '\\n') {\n value += this.current()!\n this.advance()\n }\n this.tokens.push(new Token(TokenType.COMPILER_ANNOTATION, value.trim(), this.line, startCol))\n return\n }\n\n // Regular comment — skip until end of line\n while (this.pos < this.source.length && this.current() !== '\\n') {\n value += this.current()!\n this.advance()\n }\n // Comments are skipped (not emitted as tokens)\n }\n\n // ─── Numbers ────────────────────────────────────────────────\n\n private readNumber(): void {\n const startCol = this.column\n let value = ''\n\n // Integer or float\n while (this.pos < this.source.length && (this.isDigit(this.current()!) || this.current() === '.')) {\n value += this.current()!\n this.advance()\n }\n\n // Scientific notation: 1e5, 1.5e-3\n if (this.current() === 'e' || this.current() === 'E') {\n value += this.current()!\n this.advance()\n if (this.current() === '+' || this.current() === '-') {\n value += this.current()!\n this.advance()\n }\n while (this.pos < this.source.length && this.isDigit(this.current()!)) {\n value += this.current()!\n this.advance()\n }\n }\n\n this.tokens.push(new Token(TokenType.NUMBER, value, this.line, startCol))\n }\n\n // ─── Strings ────────────────────────────────────────────────\n\n private readString(quote: string): void {\n const startCol = this.column\n const startLine = this.line\n let value = ''\n this.advance() // opening quote\n\n while (this.pos < this.source.length) {\n const ch = this.current()!\n\n if (ch === '\\\\') {\n this.advance()\n const esc = this.current()\n if (esc === 'n') value += '\\n'\n else if (esc === 't') value += '\\t'\n else if (esc === '\\\\') value += '\\\\'\n else if (esc === quote) value += quote\n else value += '\\\\' + (esc ?? '')\n this.advance()\n continue\n }\n\n if (ch === quote) {\n this.advance() // closing quote\n this.tokens.push(new Token(TokenType.STRING, value, startLine, startCol))\n return\n }\n\n if (ch === '\\n') {\n throw new LexerError('Unterminated string literal', startLine, startCol)\n }\n\n value += ch\n this.advance()\n }\n\n throw new LexerError('Unterminated string literal', startLine, startCol)\n }\n\n // ─── Color Literals ─────────────────────────────────────────\n\n private readColor(): void {\n const startCol = this.column\n let value = '#'\n this.advance() // #\n\n while (this.pos < this.source.length && this.isHexDigit(this.current()!)) {\n value += this.current()!\n this.advance()\n }\n\n if (value.length !== 7 && value.length !== 9) {\n throw new LexerError(`Invalid color literal: ${value}`, this.line, startCol)\n }\n\n this.tokens.push(new Token(TokenType.COLOR_LITERAL, value, this.line, startCol))\n }\n\n // ─── Identifiers & Keywords ─────────────────────────────────\n\n private readIdentifier(): void {\n const startCol = this.column\n let value = ''\n\n while (this.pos < this.source.length && (this.isAlphaNumeric(this.current()!) || this.current() === '_')) {\n value += this.current()!\n this.advance()\n }\n\n // Check for keyword\n const keyword = KEYWORDS[value]\n if (keyword) {\n this.tokens.push(new Token(keyword, value, this.line, startCol))\n } else {\n this.tokens.push(new Token(TokenType.IDENTIFIER, value, this.line, startCol))\n }\n }\n\n // ─── Operators & Delimiters ─────────────────────────────────\n\n private readOperator(): boolean {\n const ch = this.current()!\n const next = this.peek()\n const startCol = this.column\n\n // Two-character operators\n if (next !== undefined) {\n const two = ch + next\n const twoCharOps: Record<string, TokenType> = {\n '==': TokenType.EQ,\n '!=': TokenType.NEQ,\n '<=': TokenType.LTE,\n '>=': TokenType.GTE,\n ':=': TokenType.REASSIGN,\n '+=': TokenType.PLUS_ASSIGN,\n '-=': TokenType.MINUS_ASSIGN,\n '*=': TokenType.STAR_ASSIGN,\n '/=': TokenType.SLASH_ASSIGN,\n '%=': TokenType.PERCENT_ASSIGN,\n '=>': TokenType.ARROW,\n '**': TokenType.POWER,\n }\n if (twoCharOps[two]) {\n this.advance()\n this.advance()\n this.tokens.push(new Token(twoCharOps[two], two, this.line, startCol))\n return true\n }\n }\n\n // Single-character operators\n const singleCharOps: Record<string, TokenType> = {\n '+': TokenType.PLUS,\n '-': TokenType.MINUS,\n '*': TokenType.STAR,\n '/': TokenType.SLASH,\n '%': TokenType.PERCENT,\n '<': TokenType.LT,\n '>': TokenType.GT,\n '=': TokenType.ASSIGN,\n '(': TokenType.LPAREN,\n ')': TokenType.RPAREN,\n '[': TokenType.LBRACKET,\n ']': TokenType.RBRACKET,\n ',': TokenType.COMMA,\n '.': TokenType.DOT,\n ':': TokenType.COLON,\n '?': TokenType.QUESTION,\n }\n\n if (singleCharOps[ch]) {\n this.advance()\n this.tokens.push(new Token(singleCharOps[ch], ch, this.line, startCol))\n return true\n }\n\n return false\n }\n\n // ─── Post-Processing ───────────────────────────────────────\n\n /**\n * Filter out meaningless tokens and handle line continuation.\n * Pine uses implicit line continuation after certain tokens:\n * binary operators, commas, opening brackets/parens.\n */\n private filterTokens(tokens: Token[]): Token[] {\n const result: Token[] = []\n const continuationTokens = new Set([\n TokenType.PLUS, TokenType.MINUS, TokenType.STAR, TokenType.SLASH,\n TokenType.PERCENT, TokenType.POWER, TokenType.EQ, TokenType.NEQ,\n TokenType.LT, TokenType.GT, TokenType.LTE, TokenType.GTE,\n TokenType.AND, TokenType.OR, TokenType.COMMA, TokenType.ASSIGN,\n TokenType.REASSIGN, TokenType.PLUS_ASSIGN, TokenType.MINUS_ASSIGN,\n TokenType.STAR_ASSIGN, TokenType.SLASH_ASSIGN, TokenType.PERCENT_ASSIGN,\n TokenType.QUESTION, TokenType.COLON, TokenType.ARROW,\n TokenType.LPAREN, TokenType.LBRACKET,\n ])\n\n let parenDepth = 0\n let bracketDepth = 0\n\n for (let i = 0; i < tokens.length; i++) {\n const tok = tokens[i]\n\n if (tok.type === TokenType.LPAREN) parenDepth++\n if (tok.type === TokenType.RPAREN) parenDepth--\n if (tok.type === TokenType.LBRACKET) bracketDepth++\n if (tok.type === TokenType.RBRACKET) bracketDepth--\n\n // Skip newlines inside parentheses/brackets (implicit continuation)\n if (tok.type === TokenType.NEWLINE && (parenDepth > 0 || bracketDepth > 0)) {\n continue\n }\n\n // Skip newlines after continuation tokens\n if (tok.type === TokenType.NEWLINE) {\n const prev = result[result.length - 1]\n if (prev && continuationTokens.has(prev.type)) {\n continue\n }\n }\n\n // Skip INDENT/DEDENT inside parens/brackets\n if ((tok.type === TokenType.INDENT || tok.type === TokenType.DEDENT) && (parenDepth > 0 || bracketDepth > 0)) {\n continue\n }\n\n result.push(tok)\n }\n\n return result\n }\n\n // ─── Helpers ────────────────────────────────────────────────\n\n private current(): string | undefined {\n return this.source[this.pos]\n }\n\n private peek(offset = 1): string | undefined {\n return this.source[this.pos + offset]\n }\n\n private advance(): void {\n this.pos++\n this.column++\n }\n\n private isDigit(ch: string): boolean {\n return ch >= '0' && ch <= '9'\n }\n\n private isAlpha(ch: string): boolean {\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_'\n }\n\n private isAlphaNumeric(ch: string): boolean {\n return this.isAlpha(ch) || this.isDigit(ch)\n }\n\n private isHexDigit(ch: string | undefined): boolean {\n if (!ch) return false\n return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')\n }\n}\n","/**\n * pine-to-kline — Parser\n * Recursive descent parser: Token[] → AST (ProgramNode)\n * @license Apache-2.0\n */\n\nimport { Token } from '../lexer/Token'\nimport { TokenType } from '../lexer/TokenType'\nimport { ParseError } from '../utils/errors'\nimport type {\n ProgramNode, ASTNode, ExprNode, AnnotationNode,\n IndicatorNode, VarDeclNode, AssignNode, IfNode, ForNode, ForInNode,\n WhileNode, SwitchNode, FunctionDefNode, TypeDefNode, MethodDefNode,\n ImportNode, ExportNode, PlotCallNode, HlineCallNode,\n ExpressionStatement, NumberLiteral, StringLiteral, BoolLiteral,\n ColorLiteral, NaLiteral, Identifier, BinaryExpr, UnaryExpr,\n TernaryExpr, FunctionCallExpr, SeriesAccessExpr, ReturnNode,\n BreakNode, ContinueNode, ArrayLiteral\n} from './nodes/index'\n\nconst PLOT_FUNCTIONS = new Set(['plot', 'plotshape', 'plotarrow', 'plotbar', 'plotcandle', 'plotchar', 'bgcolor', 'fill'])\nconst PINE_TYPES = new Set(['int', 'float', 'bool', 'string', 'color', 'label', 'line', 'box', 'table', 'series', 'simple'])\n\nexport class Parser {\n private tokens: Token[]\n private pos = 0\n\n constructor(tokens: Token[]) {\n this.tokens = tokens\n }\n\n parse(): ProgramNode {\n const body: ASTNode[] = []\n const annotations: AnnotationNode[] = []\n\n this.skipNewlines()\n\n while (!this.isAtEnd()) {\n this.skipNewlines()\n if (this.isAtEnd()) break\n\n if (this.check(TokenType.COMPILER_ANNOTATION)) {\n annotations.push({ type: 'Annotation', value: this.advance().value, line: this.previous().line })\n this.skipNewlines()\n continue\n }\n\n const stmt = this.parseStatement()\n if (stmt) body.push(stmt)\n this.skipNewlines()\n }\n\n return { type: 'Program', body, annotations }\n }\n\n // ─── Statement Parsing ──────────────────────────────────────\n\n private parseStatement(): ASTNode | null {\n // var / varip declarations\n if (this.check(TokenType.VAR) || this.check(TokenType.VARIP)) {\n return this.parseVarDecl()\n }\n\n // if statement\n if (this.check(TokenType.IF)) return this.parseIf()\n\n // for loop\n if (this.check(TokenType.FOR)) return this.parseFor()\n\n // while loop\n if (this.check(TokenType.WHILE)) return this.parseWhile()\n\n // switch statement\n if (this.check(TokenType.SWITCH)) return this.parseSwitch()\n\n // break / continue / return\n if (this.check(TokenType.BREAK)) { this.advance(); return { type: 'Break', line: this.previous().line } as BreakNode }\n if (this.check(TokenType.CONTINUE)) { this.advance(); return { type: 'Continue', line: this.previous().line } as ContinueNode }\n if (this.check(TokenType.RETURN)) return this.parseReturn()\n\n // import / export\n if (this.check(TokenType.IMPORT)) return this.parseImport()\n if (this.check(TokenType.EXPORT)) return this.parseExport()\n\n // type / method\n if (this.check(TokenType.TYPE)) return this.parseTypeDef()\n if (this.check(TokenType.METHOD)) return this.parseMethodDef()\n\n // Try identifier-led statements\n if (this.check(TokenType.IDENTIFIER)) {\n return this.parseIdentifierStatement()\n }\n\n // Tuple destructuring: [a, b, c] = expr\n if (this.check(TokenType.LBRACKET)) {\n return this.parseTupleAssign()\n }\n\n // Expression statement (fallback)\n const expr = this.parseExpression()\n return { type: 'ExpressionStatement', expression: expr, line: expr.line } as ExpressionStatement\n }\n\n private parseIdentifierStatement(): ASTNode {\n const id = this.peek()\n\n // Check for: indicator(\"name\", ...) / strategy / library\n if (id.value === 'indicator' || id.value === 'strategy' || id.value === 'library') {\n if (this.peekAt(1)?.type === TokenType.LPAREN) {\n return this.parseIndicator()\n }\n }\n\n // Check for plot/hline calls\n if (PLOT_FUNCTIONS.has(id.value) && this.peekAt(1)?.type === TokenType.LPAREN) {\n return this.parsePlotCall()\n }\n if (id.value === 'hline' && this.peekAt(1)?.type === TokenType.LPAREN) {\n return this.parseHlineCall()\n }\n\n // Check for function definition: name(params) =>\n if (this.peekAt(1)?.type === TokenType.LPAREN && this.isFunctionDef()) {\n return this.parseFunctionDef()\n }\n\n // Check for type annotation: float x = ..., box[] quads = ...\n // A type annotation is an identifier (e.g. 'float', 'Zone') followed by optional '[]' then an identifier (the variable name).\n if (this.isTypeAnnotation()) {\n return this.parseTypedDecl()\n }\n\n // Check for assignment: x = expr, x := expr, x += expr\n if (this.peekAt(1)?.isAny(TokenType.ASSIGN, TokenType.REASSIGN, TokenType.PLUS_ASSIGN, TokenType.MINUS_ASSIGN, TokenType.STAR_ASSIGN, TokenType.SLASH_ASSIGN, TokenType.PERCENT_ASSIGN)) {\n return this.parseAssignment()\n }\n\n // Expression statement\n const expr = this.parseExpression()\n return { type: 'ExpressionStatement', expression: expr, line: expr.line } as ExpressionStatement\n }\n\n // ─── Indicator / Strategy ───────────────────────────────────\n\n private parseIndicator(): IndicatorNode {\n const tok = this.advance() // indicator/strategy/library\n this.expect(TokenType.LPAREN)\n const args = this.parseCallArgs()\n this.expect(TokenType.RPAREN)\n const nameArg = args.positional[0]\n return {\n type: 'Indicator',\n name: nameArg ?? { type: 'StringLiteral', value: 'Untitled', line: tok.line } as StringLiteral,\n args: args.named,\n line: tok.line\n }\n }\n\n // ─── Variable Declarations ─────────────────────────────────\n\n private parseVarDecl(): VarDeclNode {\n const persistent = this.check(TokenType.VAR)\n const persistentTick = this.check(TokenType.VARIP)\n this.advance() // var or varip\n\n let typeAnnotation: string | null = null\n if (this.isTypeAnnotation()) {\n typeAnnotation = this.parseTypeAnnotationString()\n }\n\n const name = this.expect(TokenType.IDENTIFIER).value\n this.expect(TokenType.ASSIGN)\n const value = this.parseExpression()\n\n return { type: 'VarDecl', persistent, persistentTick, name, typeAnnotation, value, line: value.line }\n }\n\n private parseTypedDecl(): VarDeclNode {\n const typeAnnotation = this.parseTypeAnnotationString()\n const name = this.expect(TokenType.IDENTIFIER).value\n this.expect(TokenType.ASSIGN)\n const value = this.parseExpression()\n return { type: 'VarDecl', persistent: false, persistentTick: false, name, typeAnnotation, value, line: value.line }\n }\n\n private parseAssignment(): AssignNode {\n const target = this.advance().value\n const op = this.advance()\n const value = this.parseExpression()\n return { type: 'Assign', target, operator: op.value as any, value, line: op.line }\n }\n\n private parseTupleAssign(): VarDeclNode {\n this.expect(TokenType.LBRACKET)\n const names: string[] = []\n names.push(this.expect(TokenType.IDENTIFIER).value)\n while (this.match(TokenType.COMMA)) {\n names.push(this.expect(TokenType.IDENTIFIER).value)\n }\n this.expect(TokenType.RBRACKET)\n this.expect(TokenType.ASSIGN)\n const value = this.parseExpression()\n return { type: 'VarDecl', persistent: false, persistentTick: false, name: names, typeAnnotation: null, value, line: value.line }\n }\n\n // ─── Control Flow ──────────────────────────────────────────\n\n private parseIf(): IfNode {\n const line = this.advance().line // if\n const condition = this.parseExpression()\n this.skipNewlines()\n const body = this.parseBlock()\n\n const elseIf: { condition: ExprNode; body: ASTNode[] }[] = []\n let elseBody: ASTNode[] | null = null\n\n while (this.check(TokenType.ELSE)) {\n this.advance() // else\n if (this.check(TokenType.IF)) {\n this.advance() // if\n const cond = this.parseExpression()\n this.skipNewlines()\n const b = this.parseBlock()\n elseIf.push({ condition: cond, body: b })\n } else {\n this.skipNewlines()\n elseBody = this.parseBlock()\n break\n }\n }\n\n return { type: 'If', condition, body, elseIf, elseBody, line }\n }\n\n private parseFor(): ForNode | ForInNode {\n const line = this.advance().line // for\n const variable = this.expect(TokenType.IDENTIFIER).value\n\n if (this.check(TokenType.IN)) {\n this.advance()\n const iterable = this.parseExpression()\n this.skipNewlines()\n const body = this.parseBlock()\n return { type: 'ForIn', variable, iterable, body, line }\n }\n\n this.expect(TokenType.ASSIGN)\n const start = this.parseExpression()\n this.expect(TokenType.TO)\n const end = this.parseExpression()\n let step: ExprNode | null = null\n if (this.check(TokenType.BY)) {\n this.advance()\n step = this.parseExpression()\n }\n this.skipNewlines()\n const body = this.parseBlock()\n return { type: 'For', variable, start, end, step, body, line }\n }\n\n private parseWhile(): ASTNode {\n const line = this.advance().line\n const condition = this.parseExpression()\n this.skipNewlines()\n const body = this.parseBlock()\n return { type: 'While', condition, body, line }\n }\n\n private parseSwitch(): SwitchNode {\n const line = this.advance().line\n let expression: ExprNode | null = null\n if (!this.check(TokenType.NEWLINE) && !this.check(TokenType.INDENT)) {\n expression = this.parseExpression()\n }\n this.skipNewlines()\n const cases: { condition: ExprNode | null; body: ASTNode[] }[] = []\n let defaultBody: ASTNode[] | null = null\n\n if (this.match(TokenType.INDENT)) {\n while (!this.check(TokenType.DEDENT) && !this.isAtEnd()) {\n this.skipNewlines()\n if (this.check(TokenType.DEDENT)) break\n if (this.check(TokenType.ARROW)) {\n this.advance()\n this.skipNewlines()\n defaultBody = this.parseBlock()\n } else {\n const cond = this.parseExpression()\n this.expect(TokenType.ARROW)\n this.skipNewlines()\n const body = this.parseBlockOrExpr()\n cases.push({ condition: cond, body })\n }\n this.skipNewlines()\n }\n if (this.check(TokenType.DEDENT)) this.advance()\n }\n\n return { type: 'Switch', expression, cases, defaultBody, line }\n }\n\n private parseReturn(): ReturnNode {\n const line = this.advance().line\n let value: ExprNode | null = null\n if (!this.check(TokenType.NEWLINE) && !this.check(TokenType.DEDENT) && !this.isAtEnd()) {\n value = this.parseExpression()\n }\n return { type: 'Return', value, line }\n }\n\n // ─── Import / Export ───────────────────────────────────────\n\n private parseImport(): ImportNode {\n const line = this.advance().line // import\n const pathParts: string[] = []\n \n // Path looks like username/repo/1\n pathParts.push(this.expect(TokenType.IDENTIFIER).value)\n while (this.match(TokenType.SLASH)) {\n if (this.check(TokenType.IDENTIFIER) || this.check(TokenType.NUMBER)) {\n pathParts.push(this.advance().value)\n }\n }\n const path = pathParts.join('/')\n \n let alias: string | null = null\n // In pine, the `as` keyword is used, which might be tokenized as an IDENTIFIER 'as'\n if (this.check(TokenType.IDENTIFIER) && this.peek().value === 'as') {\n this.advance() // as\n alias = this.expect(TokenType.IDENTIFIER).value\n }\n return { type: 'Import', path, alias, line }\n }\n\n private parseExport(): ExportNode {\n const line = this.advance().line // export\n const decl = this.parseStatement()\n if (!decl) throw new ParseError('Expected declaration after export', line, 0)\n return { type: 'Export', declaration: decl, line }\n }\n\n // ─── Type / Method / Function Definition ───────────────────\n\n private parseTypeDef(): TypeDefNode {\n const line = this.advance().line // type\n const name = this.expect(TokenType.IDENTIFIER).value\n this.skipNewlines()\n const fields: { name: string; typeAnnotation: string | null; defaultValue: ExprNode | null }[] = []\n \n if (this.match(TokenType.INDENT)) {\n while (!this.check(TokenType.DEDENT) && !this.isAtEnd()) {\n this.skipNewlines()\n if (this.check(TokenType.DEDENT)) break\n \n let typeAnn: string | null = null\n if (this.isTypeAnnotation()) {\n typeAnn = this.parseTypeAnnotationString()\n } else {\n // If no type annotation, default to whatever IDENTIFIER is first\n // Actually in Pine structs, type is required: `float top`\n typeAnn = this.advance().value\n }\n \n const fName = this.expect(TokenType.IDENTIFIER).value\n let defVal: ExprNode | null = null\n if (this.match(TokenType.ASSIGN)) {\n defVal = this.parseExpression()\n }\n fields.push({ name: fName, typeAnnotation: typeAnn, defaultValue: defVal })\n this.skipNewlines()\n }\n if (this.check(TokenType.DEDENT)) this.advance()\n }\n return { type: 'TypeDef', name, fields, line }\n }\n\n private parseMethodDef(): MethodDefNode {\n const line = this.advance().line // method\n const name = this.expect(TokenType.IDENTIFIER).value\n this.expect(TokenType.LPAREN)\n \n const params: { name: string; typeAnnotation: string | null; defaultValue: ExprNode | null }[] = []\n if (!this.check(TokenType.RPAREN)) {\n do {\n let typeAnn: string | null = null\n if (this.isTypeAnnotation()) {\n typeAnn = this.parseTypeAnnotationString()\n } else if (PINE_TYPES.has(this.peek().value)) {\n typeAnn = this.advance().value\n }\n const pName = this.expect(TokenType.IDENTIFIER).value\n let defVal: ExprNode | null = null\n if (this.match(TokenType.ASSIGN)) {\n defVal = this.parseExpression()\n }\n params.push({ name: pName, typeAnnotation: typeAnn, defaultValue: defVal })\n } while (this.match(TokenType.COMMA))\n }\n this.expect(TokenType.RPAREN)\n this.expect(TokenType.ARROW)\n this.skipNewlines()\n const body = this.parseBlock()\n return { type: 'MethodDef', name, params, body, line }\n }\n\n private isFunctionDef(): boolean {\n let depth = 0\n let i = this.pos + 1\n while (i < this.tokens.length) {\n if (this.tokens[i].type === TokenType.LPAREN) depth++\n if (this.tokens[i].type === TokenType.RPAREN) { depth--; if (depth === 0) { return this.tokens[i + 1]?.type === TokenType.ARROW } }\n if (this.tokens[i].type === TokenType.NEWLINE || this.tokens[i].type === TokenType.EOF) return false\n i++\n }\n return false\n }\n\n private parseFunctionDef(): FunctionDefNode {\n const name = this.advance().value\n this.expect(TokenType.LPAREN)\n const params: { name: string; defaultValue: ExprNode | null }[] = []\n if (!this.check(TokenType.RPAREN)) {\n do {\n const pName = this.expect(TokenType.IDENTIFIER).value\n let defaultValue: ExprNode | null = null\n if (this.match(TokenType.ASSIGN)) {\n defaultValue = this.parseExpression()\n }\n params.push({ name: pName, defaultValue })\n } while (this.match(TokenType.COMMA))\n }\n this.expect(TokenType.RPAREN)\n this.expect(TokenType.ARROW)\n this.skipNewlines()\n const body = this.parseBlock()\n return { type: 'FunctionDef', name, params, body, line: this.previous().line }\n }\n\n // ─── Plot / Hline ──────────────────────────────────────────\n\n private parsePlotCall(): PlotCallNode {\n const fn = this.advance().value\n this.expect(TokenType.LPAREN)\n const { positional, named } = this.parseCallArgs()\n this.expect(TokenType.RPAREN)\n return { type: 'PlotCall', function: fn, args: positional, kwargs: named, line: this.previous().line }\n }\n\n private parseHlineCall(): HlineCallNode {\n this.advance() // hline\n this.expect(TokenType.LPAREN)\n const { positional, named } = this.parseCallArgs()\n this.expect(TokenType.RPAREN)\n return { type: 'HlineCall', price: positional[0], args: positional.slice(1), kwargs: named, line: this.previous().line }\n }\n\n // ─── Expressions (Precedence Climbing) ─────────────────────\n\n private parseExpression(): ExprNode {\n return this.parseTernary()\n }\n\n private parseTernary(): ExprNode {\n let expr = this.parseOr()\n if (this.match(TokenType.QUESTION)) {\n const consequent = this.parseExpression()\n this.expect(TokenType.COLON)\n const alternate = this.parseExpression()\n expr = { type: 'TernaryExpr', condition: expr, consequent, alternate, line: expr.line } as TernaryExpr\n }\n return expr\n }\n\n private parseOr(): ExprNode {\n let left = this.parseAnd()\n while (this.match(TokenType.OR)) {\n const right = this.parseAnd()\n left = { type: 'BinaryExpr', operator: 'or', left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parseAnd(): ExprNode {\n let left = this.parseComparison()\n while (this.match(TokenType.AND)) {\n const right = this.parseComparison()\n left = { type: 'BinaryExpr', operator: 'and', left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parseComparison(): ExprNode {\n let left = this.parseAddition()\n while (this.checkAny(TokenType.EQ, TokenType.NEQ, TokenType.LT, TokenType.GT, TokenType.LTE, TokenType.GTE)) {\n const op = this.advance().value\n const right = this.parseAddition()\n left = { type: 'BinaryExpr', operator: op, left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parseAddition(): ExprNode {\n let left = this.parseMultiplication()\n while (this.checkAny(TokenType.PLUS, TokenType.MINUS)) {\n const op = this.advance().value\n const right = this.parseMultiplication()\n left = { type: 'BinaryExpr', operator: op, left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parseMultiplication(): ExprNode {\n let left = this.parsePower()\n while (this.checkAny(TokenType.STAR, TokenType.SLASH, TokenType.PERCENT)) {\n const op = this.advance().value\n const right = this.parsePower()\n left = { type: 'BinaryExpr', operator: op, left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parsePower(): ExprNode {\n let left = this.parseUnary()\n if (this.match(TokenType.POWER)) {\n const right = this.parseUnary()\n left = { type: 'BinaryExpr', operator: '**', left, right, line: left.line } as BinaryExpr\n }\n return left\n }\n\n private parseUnary(): ExprNode {\n if (this.match(TokenType.MINUS)) {\n const operand = this.parseUnary()\n return { type: 'UnaryExpr', operator: '-', operand, line: operand.line } as UnaryExpr\n }\n if (this.match(TokenType.NOT)) {\n const operand = this.parseUnary()\n return { type: 'UnaryExpr', operator: 'not', operand, line: operand.line } as UnaryExpr\n }\n return this.parsePostfix()\n }\n\n private parsePostfix(): ExprNode {\n let expr = this.parsePrimary()\n\n while (true) {\n // Series access: expr[n]\n if (this.match(TokenType.LBRACKET)) {\n const offset = this.parseExpression()\n this.expect(TokenType.RBRACKET)\n expr = { type: 'SeriesAccess', series: expr, offset, line: expr.line } as SeriesAccessExpr\n }\n // Member access: expr.member\n else if (this.match(TokenType.DOT)) {\n const prop = this.expect(TokenType.IDENTIFIER).value\n // Check if this is a method/function call: obj.method(args) or obj.method<Type>(args)\n let isMethodCall = false\n if (this.check(TokenType.LPAREN)) isMethodCall = true\n else if (this.check(TokenType.LT) && this.peekAt(1)?.type === TokenType.IDENTIFIER && this.peekAt(2)?.type === TokenType.GT && this.peekAt(3)?.type === TokenType.LPAREN) isMethodCall = true\n\n if (isMethodCall) {\n const callee = this.buildCalleeName(expr) + '.' + prop\n if (this.check(TokenType.LT)) {\n this.advance() // <\n this.advance() // type param\n this.advance() // >\n }\n this.advance() // (\n const { positional, named } = this.parseCallArgs()\n this.expect(TokenType.RPAREN)\n expr = { type: 'FunctionCall', callee, args: positional, kwargs: named, line: expr.line } as FunctionCallExpr\n } else {\n expr = { type: 'MemberExpr', object: expr, property: prop, line: expr.line }\n }\n }\n // Function call: expr(args) or expr<Type>(args)\n else if ((this.check(TokenType.LPAREN) || this.check(TokenType.LT)) && expr.type === 'Identifier') {\n const callee = (expr as Identifier).name\n \n // Handle generic type arguments: array.new<Zone>()\n if (this.check(TokenType.LT)) {\n // We might have a generic type arg. Check if it's `<` IDENTIFIER `>` `(`\n if (this.peekAt(1)?.type === TokenType.IDENTIFIER && this.peekAt(2)?.type === TokenType.GT && this.peekAt(3)?.type === TokenType.LPAREN) {\n this.advance() // <\n this.advance() // type param\n this.advance() // >\n } else {\n break // Not a generic type arg, break to let Comparison parser handle LT\n }\n }\n \n if (this.check(TokenType.LPAREN)) {\n this.advance() // (\n const { positional, named } = this.parseCallArgs()\n this.expect(TokenType.RPAREN)\n expr = { type: 'FunctionCall', callee, args: positional, kwargs: named, line: expr.line } as FunctionCallExpr\n } else {\n break // not a function call\n }\n }\n else break\n }\n\n return expr\n }\n\n private parsePrimary(): ExprNode {\n const tok = this.peek()\n\n // Number\n if (this.check(TokenType.NUMBER)) {\n this.advance()\n return { type: 'NumberLiteral', value: parseFloat(tok.value), line: tok.line } as NumberLiteral\n }\n\n // String\n if (this.check(TokenType.STRING)) {\n this.advance()\n return { type: 'StringLiteral', value: tok.value, line: tok.line } as StringLiteral\n }\n\n // Bool\n if (this.check(TokenType.TRUE)) { this.advance(); return { type: 'BoolLiteral', value: true, line: tok.line } as BoolLiteral }\n if (this.check(TokenType.FALSE)) { this.advance(); return { type: 'BoolLiteral', value: false, line: tok.line } as BoolLiteral }\n\n // na\n if (this.check(TokenType.NA)) { this.advance(); return { type: 'NaLiteral', line: tok.line } as NaLiteral }\n\n // Color literal\n if (this.check(TokenType.COLOR_LITERAL)) {\n this.advance()\n return { type: 'ColorLiteral', value: tok.value, line: tok.line } as ColorLiteral\n }\n\n // Array / Tuple literal\n if (this.match(TokenType.LBRACKET)) {\n const elements: ExprNode[] = []\n if (!this.check(TokenType.RBRACKET)) {\n do {\n elements.push(this.parseExpression())\n } while (this.match(TokenType.COMMA))\n }\n this.expect(TokenType.RBRACKET)\n return { type: 'ArrayLiteral', elements, line: tok.line } as ArrayLiteral\n }\n\n // Parenthesized expression\n if (this.match(TokenType.LPAREN)) {\n const expr = this.parseExpression()\n this.expect(TokenType.RPAREN)\n return expr\n }\n\n // Identifier\n if (this.check(TokenType.IDENTIFIER)) {\n this.advance()\n return { type: 'Identifier', name: tok.value, line: tok.line } as Identifier\n }\n\n // If expression (Pine allows if as expression)\n if (this.check(TokenType.IF)) {\n const ifNode = this.parseIf()\n // Wrap as expression — the runtime will handle value extraction\n return { type: 'Identifier', name: '__if_expr__', line: ifNode.line, _ifNode: ifNode } as any\n }\n\n // Switch expression\n if (this.check(TokenType.SWITCH)) {\n const switchNode = this.parseSwitch()\n return { type: 'Identifier', name: '__switch_expr__', line: switchNode.line, _switchNode: switchNode } as any\n }\n\n throw new ParseError(`Unexpected token: ${tok.type} (${tok.value})`, tok.line, tok.column)\n }\n\n // ─── Call Arguments ────────────────────────────────────────\n\n private parseCallArgs(): { positional: ExprNode[]; named: { key: string; value: ExprNode }[] } {\n const positional: ExprNode[] = []\n const named: { key: string; value: ExprNode }[] = []\n\n if (this.check(TokenType.RPAREN)) return { positional, named }\n\n do {\n this.skipNewlines()\n if (this.check(TokenType.RPAREN)) break\n\n // Check for named argument: key=value\n if (this.check(TokenType.IDENTIFIER) && this.peekAt(1)?.type === TokenType.ASSIGN) {\n const key = this.advance().value\n this.advance() // =\n const value = this.parseExpression()\n named.push({ key, value })\n } else {\n positional.push(this.parseExpression())\n }\n this.skipNewlines()\n } while (this.match(TokenType.COMMA))\n\n return { positional, named }\n }\n\n // ─── Block Parsing ─────────────────────────────────────────\n\n private parseBlock(): ASTNode[] {\n const stmts: ASTNode[] = []\n\n if (this.match(TokenType.INDENT)) {\n while (!this.check(TokenType.DEDENT) && !this.isAtEnd()) {\n this.skipNewlines()\n if (this.check(TokenType.DEDENT)) break\n const stmt = this.parseStatement()\n if (stmt) stmts.push(stmt)\n this.skipNewlines()\n }\n if (this.check(TokenType.DEDENT)) this.advance()\n } else {\n // Single-line block\n const stmt = this.parseStatement()\n if (stmt) stmts.push(stmt)\n }\n\n return stmts\n }\n\n private parseBlockOrExpr(): ASTNode[] {\n if (this.check(TokenType.INDENT)) return this.parseBlock()\n const expr = this.parseExpression()\n return [{ type: 'ExpressionStatement', expression: expr, line: expr.line } as ExpressionStatement]\n }\n\n // ─── Helpers ───────────────────────────────────────────────\n\n private isTypeAnnotation(): boolean {\n if (!this.check(TokenType.IDENTIFIER)) return false\n // Format 1: `float x`\n if (this.peekAt(1)?.type === TokenType.IDENTIFIER) return true\n // Format 2: `box[] quads`\n if (this.peekAt(1)?.type === TokenType.LBRACKET && this.peekAt(2)?.type === TokenType.RBRACKET && this.peekAt(3)?.type === TokenType.IDENTIFIER) return true\n return false\n }\n\n private parseTypeAnnotationString(): string {\n let typeAnn = this.advance().value\n if (this.match(TokenType.LBRACKET)) {\n this.expect(TokenType.RBRACKET)\n typeAnn += '[]'\n }\n return typeAnn\n }\n\n private buildCalleeName(expr: ExprNode): string {\n if (expr.type === 'Identifier') return (expr as Identifier).name\n if (expr.type === 'MemberExpr') return this.buildCalleeName((expr as any).object) + '.' + (expr as any).property\n return '__unknown__'\n }\n\n private peek(): Token { return this.tokens[this.pos] }\n private peekAt(offset: number): Token | undefined { return this.tokens[this.pos + offset] }\n private previous(): Token { return this.tokens[this.pos - 1] }\n private isAtEnd(): boolean { return this.pos >= this.tokens.length || this.tokens[this.pos].type === TokenType.EOF }\n\n private advance(): Token {\n if (!this.isAtEnd()) this.pos++\n return this.previous()\n }\n\n private check(type: TokenType): boolean {\n return !this.isAtEnd() && this.peek().type === type\n }\n\n private checkAny(...types: TokenType[]): boolean {\n return !this.isAtEnd() && types.includes(this.peek().type)\n }\n\n private match(type: TokenType): boolean {\n if (this.check(type)) { this.advance(); return true }\n return false\n }\n\n private expect(type: TokenType): Token {\n if (this.check(type)) return this.advance()\n const tok = this.peek()\n throw new ParseError(`Expected ${type} but got ${tok?.type} (${tok?.value})`, tok?.line, tok?.column)\n }\n\n private skipNewlines(): void {\n while (this.check(TokenType.NEWLINE)) this.advance()\n }\n}\n","/**\n * pine-to-kline — Bar Context\n * Provides per-bar OHLCV data as series for the runtime\n * @license Apache-2.0\n */\n\nimport type { KlineData } from '../types'\n\nexport class BarContext {\n readonly dataList: KlineData[]\n readonly open: number[]\n readonly high: number[]\n readonly low: number[]\n readonly close: number[]\n readonly volume: number[]\n readonly hl2: number[]\n readonly hlc3: number[]\n readonly ohlc4: number[]\n readonly time: number[]\n readonly barCount: number\n\n constructor(dataList: KlineData[]) {\n this.dataList = dataList\n this.barCount = dataList.length\n this.open = dataList.map(d => d.open)\n this.high = dataList.map(d => d.high)\n this.low = dataList.map(d => d.low)\n this.close = dataList.map(d => d.close)\n this.volume = dataList.map(d => d.volume ?? 0)\n this.hl2 = dataList.map(d => (d.high + d.low) / 2)\n this.hlc3 = dataList.map(d => (d.high + d.low + d.close) / 3)\n this.ohlc4 = dataList.map(d => (d.open + d.high + d.low + d.close) / 4)\n this.time = dataList.map(d => d.timestamp)\n }\n\n /** Resolve a Pine source name to the data array */\n resolveSource(name: string): number[] {\n const map: Record<string, number[]> = {\n open: this.open, high: this.high, low: this.low, close: this.close,\n volume: this.volume, hl2: this.hl2, hlc3: this.hlc3, ohlc4: this.ohlc4,\n time: this.time,\n }\n return map[name] ?? this.close\n }\n}\n","/**\n * pine-to-kline — Variable Persistence\n * Emulates Pine's `var` and `varip` semantics\n * @license Apache-2.0\n */\n\nexport class VarPersistence {\n private vars = new Map<string, any>()\n private varips = new Map<string, any>()\n\n /** Initialize a `var` variable (set once, persists across bars) */\n initVar(name: string, value: any): void {\n if (!this.vars.has(name)) {\n this.vars.set(name, value)\n }\n }\n\n /** Initialize a `varip` variable */\n initVarip(name: string, value: any): void {\n if (!this.varips.has(name)) {\n this.varips.set(name, value)\n }\n }\n\n getVar(name: string): any { return this.vars.get(name) }\n setVar(name: string, value: any): void { this.vars.set(name, value) }\n hasVar(name: string): boolean { return this.vars.has(name) }\n\n getVarip(name: string): any { return this.varips.get(name) }\n setVarip(name: string, value: any): void { this.varips.set(name, value) }\n\n reset(): void { this.vars.clear(); this.varips.clear() }\n}\n","/**\n * pine-to-kline — Moving Average Functions\n * Implements: sma, ema, rma, wma, hma, vwma, swma, dema, tema\n * @license Apache-2.0\n */\n\n/** ta.sma() — Simple Moving Average */\nexport function sma(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let sum = 0\n for (let j = i - length + 1; j <= i; j++) sum += source[j]\n return sum / length\n })\n}\n\n/** ta.ema() — Exponential Moving Average */\nexport function ema(source: number[], length: number): number[] {\n const k = 2 / (length + 1)\n const out: number[] = []\n for (let i = 0; i < source.length; i++) {\n if (i === 0) { out.push(source[i]); continue }\n out.push(source[i] * k + out[i - 1] * (1 - k))\n }\n return out\n}\n\n/** ta.rma() — Wilder's Running Moving Average (used in RSI, ATR) */\nexport function rma(source: number[], length: number): number[] {\n const alpha = 1 / length\n const out: number[] = []\n for (let i = 0; i < source.length; i++) {\n if (i < length - 1) { out.push(NaN); continue }\n if (i === length - 1) {\n let sum = 0\n for (let j = 0; j < length; j++) sum += source[j]\n out.push(sum / length)\n } else {\n out.push(alpha * source[i] + (1 - alpha) * out[i - 1])\n }\n }\n return out\n}\n\n/** ta.wma() — Weighted Moving Average */\nexport function wma(source: number[], length: number): number[] {\n const denom = (length * (length + 1)) / 2\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let sum = 0\n for (let j = 0; j < length; j++) {\n sum += source[i - j] * (length - j)\n }\n return sum / denom\n })\n}\n\n/** ta.hma() — Hull Moving Average */\nexport function hma(source: number[], length: number): number[] {\n const halfLen = Math.floor(length / 2)\n const sqrtLen = Math.round(Math.sqrt(length))\n const wma1 = wma(source, halfLen)\n const wma2 = wma(source, length)\n const diff = wma1.map((v, i) => 2 * v - wma2[i])\n return wma(diff, sqrtLen)\n}\n\n/** ta.vwma() — Volume Weighted Moving Average */\nexport function vwma(source: number[], volume: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let sumPV = 0, sumV = 0\n for (let j = i - length + 1; j <= i; j++) {\n sumPV += source[j] * volume[j]\n sumV += volume[j]\n }\n return sumV === 0 ? NaN : sumPV / sumV\n })\n}\n\n/** ta.swma() — Symmetrically Weighted Moving Average (fixed length=4) */\nexport function swma(source: number[]): number[] {\n return source.map((_, i) => {\n if (i < 3) return NaN\n return source[i] * (1 / 6) + source[i - 1] * (2 / 6) +\n source[i - 2] * (2 / 6) + source[i - 3] * (1 / 6)\n })\n}\n\n/** ta.dema() — Double Exponential Moving Average */\nexport function dema(source: number[], length: number): number[] {\n const ema1 = ema(source, length)\n const ema2 = ema(ema1, length)\n return ema1.map((v, i) => 2 * v - ema2[i])\n}\n\n/** ta.tema() — Triple Exponential Moving Average */\nexport function tema(source: number[], length: number): number[] {\n const ema1 = ema(source, length)\n const ema2 = ema(ema1, length)\n const ema3 = ema(ema2, length)\n return ema1.map((v, i) => 3 * v - 3 * ema2[i] + ema3[i])\n}\n","/**\n * pine-to-kline — Momentum Indicators\n * Implements: rsi, macd, stoch, cci, mom, roc\n * @license Apache-2.0\n */\n\nimport { rma, ema, sma } from './moving-averages'\n\n/** ta.rsi() — Relative Strength Index (Wilder's method) */\nexport function rsi(source: number[], length: number): number[] {\n const gains: number[] = [0]\n const losses: number[] = [0]\n for (let i = 1; i < source.length; i++) {\n const diff = source[i] - source[i - 1]\n gains.push(diff > 0 ? diff : 0)\n losses.push(diff < 0 ? Math.abs(diff) : 0)\n }\n const avgGains = rma(gains, length)\n const avgLoss = rma(losses, length)\n return source.map((_, i) => {\n if (isNaN(avgGains[i]) || isNaN(avgLoss[i])) return NaN\n if (avgLoss[i] === 0) return 100\n return 100 - (100 / (1 + avgGains[i] / avgLoss[i]))\n })\n}\n\n/** ta.macd() — MACD with signal and histogram */\nexport function macd(\n source: number[],\n fastLen = 12,\n slowLen = 26,\n signalLen = 9\n): { macd: number[]; signal: number[]; hist: number[] } {\n const fast = ema(source, fastLen)\n const slow = ema(source, slowLen)\n const macdLine = fast.map((v, i) => v - slow[i])\n const signalLine = ema(macdLine, signalLen)\n const hist = macdLine.map((v, i) => v - signalLine[i])\n return { macd: macdLine, signal: signalLine, hist }\n}\n\n/** ta.stoch() — Stochastic %K */\nexport function stoch(\n close: number[],\n high: number[],\n low: number[],\n length: number\n): number[] {\n return close.map((_, i) => {\n if (i < length - 1) return NaN\n let highest = -Infinity, lowest = Infinity\n for (let j = i - length + 1; j <= i; j++) {\n if (high[j] > highest) highest = high[j]\n if (low[j] < lowest) lowest = low[j]\n }\n if (highest === lowest) return 0\n return ((close[i] - lowest) / (highest - lowest)) * 100\n })\n}\n\n/** ta.cci() — Commodity Channel Index */\nexport function cci(source: number[], length: number): number[] {\n const smaVals = sma(source, length)\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let meanDev = 0\n for (let j = i - length + 1; j <= i; j++) {\n meanDev += Math.abs(source[j] - smaVals[i])\n }\n meanDev /= length\n if (meanDev === 0) return 0\n return (source[i] - smaVals[i]) / (0.015 * meanDev)\n })\n}\n\n/** ta.mom() — Momentum */\nexport function mom(source: number[], length: number): number[] {\n return source.map((v, i) => i < length ? NaN : v - source[i - length])\n}\n\n/** ta.roc() — Rate of Change */\nexport function roc(source: number[], length: number): number[] {\n return source.map((v, i) => {\n if (i < length) return NaN\n const prev = source[i - length]\n return prev === 0 ? 0 : ((v - prev) / prev) * 100\n })\n}\n","/**\n * pine-to-kline — Volatility Indicators\n * Implements: atr, bb, kc, donchian\n * @license Apache-2.0\n */\n\nimport { rma, ema, sma } from './moving-averages'\n\n/** ta.atr() — Average True Range */\nexport function atr(\n high: number[],\n low: number[],\n close: number[],\n length: number\n): number[] {\n const tr = high.map((h, i) => {\n if (i === 0) return h - low[i]\n return Math.max(\n h - low[i],\n Math.abs(h - close[i - 1]),\n Math.abs(low[i] - close[i - 1])\n )\n })\n return rma(tr, length)\n}\n\nexport interface BandsResult {\n upper: number\n basis: number\n lower: number\n}\n\n/** ta.bb() — Bollinger Bands */\nexport function bb(\n source: number[],\n length: number,\n mult = 2.0\n): BandsResult[] {\n const mid = sma(source, length)\n return source.map((_, i) => {\n if (i < length - 1) return { upper: NaN, basis: NaN, lower: NaN }\n let sumSq = 0\n for (let j = i - length + 1; j <= i; j++) {\n sumSq += Math.pow(source[j] - mid[i], 2)\n }\n const std = Math.sqrt(sumSq / length)\n return {\n upper: mid[i] + mult * std,\n basis: mid[i],\n lower: mid[i] - mult * std\n }\n })\n}\n\n/** ta.kc() — Keltner Channels */\nexport function kc(\n source: number[],\n high: number[],\n low: number[],\n close: number[],\n length: number,\n mult = 1.5\n): BandsResult[] {\n const mid = ema(source, length)\n const atrVals = atr(high, low, close, length)\n return source.map((_, i) => ({\n upper: mid[i] + mult * atrVals[i],\n basis: mid[i],\n lower: mid[i] - mult * atrVals[i]\n }))\n}\n\n/** ta.donchian() — Donchian Channels */\nexport function donchian(\n high: number[],\n low: number[],\n length: number\n): BandsResult[] {\n return high.map((_, i) => {\n if (i < length - 1) return { upper: NaN, basis: NaN, lower: NaN }\n let highest = -Infinity, lowest = Infinity\n for (let j = i - length + 1; j <= i; j++) {\n if (high[j] > highest) highest = high[j]\n if (low[j] < lowest) lowest = low[j]\n }\n return {\n upper: highest,\n basis: (highest + lowest) / 2,\n lower: lowest\n }\n })\n}\n\n/** ta.tr() — True Range (single series) */\nexport function tr(\n high: number[],\n low: number[],\n close: number[]\n): number[] {\n return high.map((h, i) => {\n if (i === 0) return h - low[i]\n return Math.max(\n h - low[i],\n Math.abs(h - close[i - 1]),\n Math.abs(low[i] - close[i - 1])\n )\n })\n}\n","/**\n * pine-to-kline — Crossover Functions\n * Implements: crossover, crossunder, cross\n * @license Apache-2.0\n */\n\n/** ta.crossover(a, b) — a crosses above b */\nexport function crossover(a: number[], b: number[]): boolean[] {\n return a.map((v, i) => {\n if (i === 0) return false\n return a[i - 1] <= b[i - 1] && v > b[i]\n })\n}\n\n/** ta.crossunder(a, b) — a crosses below b */\nexport function crossunder(a: number[], b: number[]): boolean[] {\n return a.map((v, i) => {\n if (i === 0) return false\n return a[i - 1] >= b[i - 1] && v < b[i]\n })\n}\n\n/** ta.cross(a, b) — either crossover or crossunder */\nexport function cross(a: number[], b: number[]): boolean[] {\n return a.map((_, i) => {\n if (i === 0) return false\n return (a[i - 1] <= b[i - 1] && a[i] > b[i]) ||\n (a[i - 1] >= b[i - 1] && a[i] < b[i])\n })\n}\n\n/** ta.change() — difference from previous bar */\nexport function change(source: number[], length = 1): number[] {\n return source.map((v, i) => i < length ? NaN : v - source[i - length])\n}\n\n/** ta.rising() — true if source has been rising for `length` bars */\nexport function rising(source: number[], length: number): boolean[] {\n return source.map((_, i) => {\n if (i < length) return false\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] <= source[j - 1]) return false\n }\n return true\n })\n}\n\n/** ta.falling() — true if source has been falling for `length` bars */\nexport function falling(source: number[], length: number): boolean[] {\n return source.map((_, i) => {\n if (i < length) return false\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] >= source[j - 1]) return false\n }\n return true\n })\n}\n","/**\n * pine-to-kline — TA Utility Functions\n * Implements: highest, lowest, highestbars, lowestbars, barssince, valuewhen, pivothigh, pivotlow\n * @license Apache-2.0\n */\n\n/** ta.highest() — highest value in last `length` bars */\nexport function highest(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let max = -Infinity\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] > max) max = source[j]\n }\n return max\n })\n}\n\n/** ta.lowest() — lowest value in last `length` bars */\nexport function lowest(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let min = Infinity\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] < min) min = source[j]\n }\n return min\n })\n}\n\n/** ta.highestbars() — number of bars since highest value */\nexport function highestbars(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let maxVal = -Infinity\n let maxIdx = i\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] >= maxVal) { maxVal = source[j]; maxIdx = j }\n }\n return -(i - maxIdx)\n })\n}\n\n/** ta.lowestbars() — number of bars since lowest value */\nexport function lowestbars(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let minVal = Infinity\n let minIdx = i\n for (let j = i - length + 1; j <= i; j++) {\n if (source[j] <= minVal) { minVal = source[j]; minIdx = j }\n }\n return -(i - minIdx)\n })\n}\n\n/** ta.barssince(condition) — bars since condition was last true */\nexport function barssince(condition: boolean[]): number[] {\n let count = NaN\n return condition.map((c) => {\n if (c) { count = 0 } else if (!isNaN(count)) { count++ }\n return count\n })\n}\n\n/** ta.valuewhen(condition, source, occurrence) */\nexport function valuewhen(\n condition: boolean[],\n source: number[],\n occurrence = 0\n): number[] {\n const result: number[] = []\n const occurrences: number[] = []\n for (let i = 0; i < source.length; i++) {\n if (condition[i]) occurrences.unshift(source[i])\n result.push(occurrences[occurrence] ?? NaN)\n }\n return result\n}\n\n/** ta.pivothigh() — pivot high detection */\nexport function pivothigh(\n source: number[],\n leftBars: number,\n rightBars: number\n): number[] {\n return source.map((v, i) => {\n if (i < leftBars || i + rightBars >= source.length) return NaN\n for (let j = i - leftBars; j < i; j++) {\n if (source[j] > v) return NaN\n }\n for (let j = i + 1; j <= i + rightBars; j++) {\n if (source[j] > v) return NaN\n }\n return v\n })\n}\n\n/** ta.pivotlow() — pivot low detection */\nexport function pivotlow(\n source: number[],\n leftBars: number,\n rightBars: number\n): number[] {\n return source.map((v, i) => {\n if (i < leftBars || i + rightBars >= source.length) return NaN\n for (let j = i - leftBars; j < i; j++) {\n if (source[j] < v) return NaN\n }\n for (let j = i + 1; j <= i + rightBars; j++) {\n if (source[j] < v) return NaN\n }\n return v\n })\n}\n\n/** ta.cum() — cumulative sum */\nexport function cum(source: number[]): number[] {\n let sum = 0\n return source.map(v => {\n sum += v\n return sum\n })\n}\n\n/** ta.stdev() — standard deviation */\nexport function stdev(source: number[], length: number): number[] {\n return source.map((_, i) => {\n if (i < length - 1) return NaN\n let sum = 0\n for (let j = i - length + 1; j <= i; j++) sum += source[j]\n const mean = sum / length\n let sumSq = 0\n for (let j = i - length + 1; j <= i; j++) sumSq += Math.pow(source[j] - mean, 2)\n return Math.sqrt(sumSq / length)\n })\n}\n\n/** ta.percentrank() — percent rank */\nexport function percentrank(source: number[], length: number): number[] {\n return source.map((v, i) => {\n if (i < length) return NaN\n let count = 0\n for (let j = i - length; j < i; j++) {\n if (source[j] <= v) count++\n }\n return (count / length) * 100\n })\n}\n","/**\n * pine-to-kline — TA Namespace Barrel Export\n * @license Apache-2.0\n */\n\nexport * as ma from './moving-averages'\nexport * as momentum from './momentum'\nexport * as volatility from './volatility'\nexport * as crossover from './crossover'\nexport * as utility from './utility'\n\n// Re-export flat for runtime resolution\nimport * as _ma from './moving-averages'\nimport * as _mom from './momentum'\nimport * as _vol from './volatility'\nimport * as _cross from './crossover'\nimport * as _util from './utility'\n\n/** Registry map: 'ta.sma' → implementation function */\nexport const TA_REGISTRY: Record<string, Function> = {\n // Moving averages\n 'ta.sma': _ma.sma,\n 'ta.ema': _ma.ema,\n 'ta.rma': _ma.rma,\n 'ta.wma': _ma.wma,\n 'ta.hma': _ma.hma,\n 'ta.vwma': _ma.vwma,\n 'ta.swma': _ma.swma,\n 'ta.dema': _ma.dema,\n 'ta.tema': _ma.tema,\n\n // Momentum\n 'ta.rsi': _mom.rsi,\n 'ta.macd': _mom.macd,\n 'ta.stoch': _mom.stoch,\n 'ta.cci': _mom.cci,\n 'ta.mom': _mom.mom,\n 'ta.roc': _mom.roc,\n\n // Volatility\n 'ta.atr': _vol.atr,\n 'ta.bb': _vol.bb,\n 'ta.kc': _vol.kc,\n 'ta.donchian': _vol.donchian,\n 'ta.tr': _vol.tr,\n\n // Crossover\n 'ta.crossover': _cross.crossover,\n 'ta.crossunder': _cross.crossunder,\n 'ta.cross': _cross.cross,\n 'ta.change': _cross.change,\n 'ta.rising': _cross.rising,\n 'ta.falling': _cross.falling,\n\n // Utility\n 'ta.highest': _util.highest,\n 'ta.lowest': _util.lowest,\n 'ta.highestbars': _util.highestbars,\n 'ta.lowestbars': _util.lowestbars,\n 'ta.barssince': _util.barssince,\n 'ta.valuewhen': _util.valuewhen,\n 'ta.pivothigh': _util.pivothigh,\n 'ta.pivotlow': _util.pivotlow,\n 'ta.cum': _util.cum,\n 'ta.stdev': _util.stdev,\n 'ta.percentrank': _util.percentrank,\n}\n","/**\n * pine-to-kline — Math Namespace Functions\n * Wraps JavaScript Math.* to match Pine's math.* namespace\n * @license Apache-2.0\n */\n\n/** Math function registry for runtime resolution */\nexport const MATH_REGISTRY: Record<string, Function> = {\n 'math.abs': (x: number) => Math.abs(x),\n 'math.ceil': (x: number) => Math.ceil(x),\n 'math.floor': (x: number) => Math.floor(x),\n 'math.round': (x: number, precision?: number) => {\n if (precision === undefined) return Math.round(x)\n const factor = Math.pow(10, precision)\n return Math.round(x * factor) / factor\n },\n 'math.log': (x: number) => Math.log(x),\n 'math.log10': (x: number) => Math.log10(x),\n 'math.pow': (base: number, exp: number) => Math.pow(base, exp),\n 'math.sqrt': (x: number) => Math.sqrt(x),\n 'math.exp': (x: number) => Math.exp(x),\n 'math.max': (...args: number[]) => Math.max(...args),\n 'math.min': (...args: number[]) => Math.min(...args),\n 'math.sign': (x: number) => Math.sign(x),\n 'math.avg': (...args: number[]) => args.reduce((a, b) => a + b, 0) / args.length,\n 'math.sum': (source: number[], length: number) => {\n const result: number[] = []\n for (let i = 0; i < source.length; i++) {\n if (i < length - 1) { result.push(NaN); continue }\n let sum = 0\n for (let j = i - length + 1; j <= i; j++) sum += source[j]\n result.push(sum)\n }\n return result\n },\n 'math.sin': (x: number) => Math.sin(x),\n 'math.cos': (x: number) => Math.cos(x),\n 'math.tan': (x: number) => Math.tan(x),\n 'math.asin': (x: number) => Math.asin(x),\n 'math.acos': (x: number) => Math.acos(x),\n 'math.atan': (x: number) => Math.atan(x),\n 'math.random': () => Math.random(),\n 'math.todegrees': (rad: number) => rad * (180 / Math.PI),\n 'math.toradians': (deg: number) => deg * (Math.PI / 180),\n}\n\n// Also export Pine math constants\nexport const MATH_CONSTANTS: Record<string, number> = {\n 'math.pi': Math.PI,\n 'math.e': Math.E,\n 'math.phi': 1.618033988749895,\n 'math.rphi': 0.618033988749895,\n}\n","/**\n * pine-to-kline — Color Constants\n * All Pine color.* constants → hex values\n * @license Apache-2.0\n */\n\nexport const COLOR_MAP: Record<string, string> = {\n 'color.aqua': '#00BCD4',\n 'color.black': '#000000',\n 'color.blue': '#2196F3',\n 'color.fuchsia': '#E040FB',\n 'color.gray': '#9E9E9E',\n 'color.green': '#4CAF50',\n 'color.lime': '#00E676',\n 'color.maroon': '#880E4F',\n 'color.navy': '#0D47A1',\n 'color.olive': '#808000',\n 'color.orange': '#FF9800',\n 'color.purple': '#9C27B0',\n 'color.red': '#F44336',\n 'color.silver': '#B0BEC5',\n 'color.teal': '#009688',\n 'color.white': '#FFFFFF',\n 'color.yellow': '#FFEB3B',\n}\n","/**\n * pine-to-kline — Color Functions\n * Implements: color.new(), color.rgb(), color.from_gradient()\n * @license Apache-2.0\n */\n\n/**\n * color.new(baseColor, transp) — create color with transparency\n * transp: 0 = opaque, 100 = fully transparent\n */\nexport function colorNew(baseColor: string, transp: number): string {\n const alpha = Math.round((1 - transp / 100) * 255)\n const hex = baseColor.startsWith('#') ? baseColor : '#000000'\n const base = hex.length === 9 ? hex.slice(0, 7) : hex\n return base + alpha.toString(16).padStart(2, '0')\n}\n\n/**\n * color.rgb(red, green, blue, transp?) — create RGBA color\n */\nexport function colorRgb(r: number, g: number, b: number, transp = 0): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)))\n const alpha = Math.round((1 - transp / 100) * 255)\n return '#' +\n clamp(r).toString(16).padStart(2, '0') +\n clamp(g).toString(16).padStart(2, '0') +\n clamp(b).toString(16).padStart(2, '0') +\n (alpha < 255 ? alpha.toString(16).padStart(2, '0') : '')\n}\n\n/**\n * color.from_gradient(value, bottom, top, bottomColor, topColor)\n * Linear interpolation between two colors\n */\nexport function colorFromGradient(\n value: number,\n bottom: number,\n top: number,\n bottomColor: string,\n topColor: string\n): string {\n const t = Math.max(0, Math.min(1, (value - bottom) / (top - bottom)))\n const parseHex = (hex: string) => {\n const h = hex.replace('#', '')\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n }\n }\n const c1 = parseHex(bottomColor)\n const c2 = parseHex(topColor)\n const lerp = (a: number, b: number) => Math.round(a + (b - a) * t)\n return colorRgb(lerp(c1.r, c2.r), lerp(c1.g, c2.g), lerp(c1.b, c2.b))\n}\n\nexport const COLOR_FUNCTIONS: Record<string, Function> = {\n 'color.new': colorNew,\n 'color.rgb': colorRgb,\n 'color.from_gradient': colorFromGradient,\n}\n","/**\n * pine-to-kline — Input Functions\n * Handles input.int(), input.float(), input.bool(), etc.\n * These extract metadata for KlineChart calcParams.\n * @license Apache-2.0\n */\n\nimport type { PineInput } from '../../types'\n\nexport interface InputCallResult {\n meta: PineInput\n value: any\n}\n\nlet inputCounter = 0\n\nexport function resetInputCounter(): void {\n inputCounter = 0\n}\n\n/** input.int(defval, title?, ...) */\nexport function inputInt(defval: number, title?: string, options?: Record<string, any>): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'int',\n title: title ?? null,\n defaultValue: defval,\n minval: options?.minval,\n maxval: options?.maxval,\n step: options?.step ?? 1,\n },\n value: defval\n }\n}\n\n/** input.float(defval, title?, ...) */\nexport function inputFloat(defval: number, title?: string, options?: Record<string, any>): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'float',\n title: title ?? null,\n defaultValue: defval,\n minval: options?.minval,\n maxval: options?.maxval,\n step: options?.step ?? 0.1,\n },\n value: defval\n }\n}\n\n/** input.bool(defval, title?) */\nexport function inputBool(defval: boolean, title?: string): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'bool',\n title: title ?? null,\n defaultValue: defval,\n },\n value: defval\n }\n}\n\n/** input.string(defval, title?, options?) */\nexport function inputString(defval: string, title?: string, options?: string[]): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'string',\n title: title ?? null,\n defaultValue: defval,\n options,\n },\n value: defval\n }\n}\n\n/** input.color(defval, title?) */\nexport function inputColor(defval: string, title?: string): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'color',\n title: title ?? null,\n defaultValue: defval,\n },\n value: defval\n }\n}\n\n/** input.source(defval, title?) — typically resolves to 'close' */\nexport function inputSource(defval: string, title?: string): InputCallResult {\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: 'source',\n title: title ?? null,\n defaultValue: defval,\n },\n value: defval\n }\n}\n\n/** input() — generic input (Pine v5 legacy) */\nexport function inputGeneric(defval: any, title?: string): InputCallResult {\n const type = typeof defval === 'number'\n ? (Number.isInteger(defval) ? 'int' : 'float')\n : typeof defval === 'boolean' ? 'bool' : 'string'\n\n return {\n meta: {\n id: `input_${inputCounter++}`,\n type: type as any,\n title: title ?? null,\n defaultValue: defval,\n },\n value: defval\n }\n}\n\nexport const INPUT_REGISTRY: Record<string, Function> = {\n 'input': inputGeneric,\n 'input.int': inputInt,\n 'input.float': inputFloat,\n 'input.bool': inputBool,\n 'input.string': inputString,\n 'input.color': inputColor,\n 'input.source': inputSource,\n}\n","/**\n * pine-to-kline — Builtins Master Index\n * Central registry of all built-in functions and constants\n * @license Apache-2.0\n */\n\nexport { TA_REGISTRY } from './ta/index'\nexport { MATH_REGISTRY, MATH_CONSTANTS } from './math/functions'\nexport { COLOR_MAP } from './color/constants'\nexport { COLOR_FUNCTIONS } from './color/functions'\nexport { INPUT_REGISTRY, resetInputCounter } from './input/functions'\n\nimport { TA_REGISTRY } from './ta/index'\nimport { MATH_REGISTRY, MATH_CONSTANTS } from './math/functions'\nimport { COLOR_MAP } from './color/constants'\nimport { COLOR_FUNCTIONS } from './color/functions'\nimport { INPUT_REGISTRY } from './input/functions'\n\n/** Combined registry of ALL built-in functions */\nexport const ALL_BUILTINS: Record<string, Function> = {\n ...TA_REGISTRY,\n ...MATH_REGISTRY,\n ...COLOR_FUNCTIONS,\n ...INPUT_REGISTRY,\n}\n\n/** Combined registry of ALL built-in constants */\nexport const ALL_CONSTANTS: Record<string, any> = {\n ...MATH_CONSTANTS,\n ...COLOR_MAP,\n // Pine special constants\n 'na': NaN,\n 'true': true,\n 'false': false,\n}\n","/**\n * pine-to-kline — Pine Runtime\n * Walks the AST and executes PineScript logic against bar data.\n * Produces arrays of computed values for each plot.\n * @license Apache-2.0\n */\n\nimport type { KlineData, PineInput, PinePlot, PineHline, PineMeta, PineIR } from '../types'\nimport type { ProgramNode, ASTNode, ExprNode, Identifier, FunctionCallExpr } from '../parser/nodes/index'\nimport { BarContext } from './BarContext'\nimport { VarPersistence } from './VarPersistence'\nimport { ALL_BUILTINS, ALL_CONSTANTS, resetInputCounter } from '../builtins/index'\nimport { COLOR_MAP } from '../builtins/color/constants'\nimport { RuntimeError } from '../utils/errors'\n\nexport interface RuntimeResult {\n meta: PineMeta\n inputs: PineInput[]\n plots: PinePlot[]\n hlines: PineHline[]\n calcFn: (dataList: KlineData[], params: any[]) => Record<string, any>[]\n warnings: string[]\n errors: Error[]\n}\n\nexport class PineRuntime {\n private ctx!: BarContext\n private vars = new VarPersistence()\n private scope: Map<string, any> = new Map()\n private functions: Map<string, { params: { name: string; defaultValue: any }[]; body: ASTNode[] }> = new Map()\n private meta: PineMeta = { name: 'Untitled', shortName: null, overlay: false, format: null, precision: null, scale: null, max_bars_back: null }\n private inputs: PineInput[] = []\n private plots: PinePlot[] = []\n private hlines: PineHline[] = []\n private plotResults: Map<string, number[]> = new Map()\n private warnings: string[] = []\n private inputIndex = 0\n\n execute(ast: ProgramNode, dataList: KlineData[], params?: any[]): RuntimeResult {\n resetInputCounter()\n this.inputs = []\n this.plots = []\n this.hlines = []\n this.plotResults = new Map()\n this.warnings = []\n this.functions = new Map()\n this.inputIndex = 0\n\n this.ctx = new BarContext(dataList)\n const errors: Error[] = []\n\n // First pass: extract metadata, inputs, function defs (dry run on first bar)\n this.scope = new Map()\n this.vars.reset()\n this.firstPass(ast, params)\n\n // Build the calc function\n const calcFn = (dl: KlineData[], p: any[]) => this.runCalc(ast, dl, p)\n\n return {\n meta: this.meta,\n inputs: this.inputs,\n plots: this.plots,\n hlines: this.hlines,\n calcFn,\n warnings: this.warnings,\n errors,\n }\n }\n\n private firstPass(ast: ProgramNode, params?: any[]): void {\n for (const node of ast.body) {\n if (node.type === 'Indicator') this.evalIndicator(node)\n else if (node.type === 'FunctionDef') {\n this.functions.set(node.name, { params: node.params.map(p => ({ name: p.name, defaultValue: p.defaultValue ? this.evalExpr(p.defaultValue) : null })), body: node.body })\n }\n }\n // Dry-run to collect inputs and plots\n this.runOnce(ast, this.ctx.dataList, params ?? [])\n }\n\n private runCalc(ast: ProgramNode, dataList: KlineData[], params: any[]): Record<string, any>[] {\n return this.runOnce(ast, dataList, params)\n }\n\n private runOnce(ast: ProgramNode, dataList: KlineData[], params: any[]): Record<string, any>[] {\n this.ctx = new BarContext(dataList)\n this.scope = new Map()\n this.vars.reset()\n this.plotResults = new Map()\n this.inputIndex = 0\n const collectedInputs: PineInput[] = []\n const collectedPlots: PinePlot[] = []\n const collectedHlines: PineHline[] = []\n\n // Set up built-in source variables\n const sources: Record<string, number[]> = {\n open: this.ctx.open, high: this.ctx.high, low: this.ctx.low,\n close: this.ctx.close, volume: this.ctx.volume,\n hl2: this.ctx.hl2, hlc3: this.ctx.hlc3, ohlc4: this.ctx.ohlc4,\n }\n\n // Register user-defined functions\n for (const node of ast.body) {\n if (node.type === 'FunctionDef') {\n this.functions.set(node.name, { params: node.params.map(p => ({ name: p.name, defaultValue: p.defaultValue ? this.evalExpr(p.defaultValue) : null })), body: node.body })\n }\n }\n\n // Execute body\n for (const node of ast.body) {\n if (node.type === 'Indicator' || node.type === 'FunctionDef') continue\n try {\n this.evalNode(node, sources, params, collectedInputs, collectedPlots, collectedHlines)\n } catch (e: any) {\n this.warnings.push(`Runtime warning at line ${(node as any).line}: ${e.message}`)\n }\n }\n\n if (collectedInputs.length > 0) this.inputs = collectedInputs\n if (collectedPlots.length > 0) this.plots = collectedPlots\n if (collectedHlines.length > 0) this.hlines = collectedHlines\n\n // Build result array from plot results\n const n = dataList.length\n const result: Record<string, any>[] = []\n for (let i = 0; i < n; i++) {\n const row: Record<string, any> = {}\n for (const [key, arr] of this.plotResults) {\n row[key] = arr[i] ?? NaN\n }\n result.push(row)\n }\n return result\n }\n\n // ─── Node Evaluation ──────────────────────────────────────\n\n private evalNode(\n node: ASTNode,\n sources: Record<string, number[]>,\n params: any[],\n inputs: PineInput[],\n plots: PinePlot[],\n hlines: PineHline[]\n ): any {\n switch (node.type) {\n case 'VarDecl': return this.evalVarDecl(node, sources, params, inputs)\n case 'Assign': return this.evalAssign(node, sources, params, inputs)\n case 'If': return this.evalIf(node, sources, params, inputs, plots, hlines)\n case 'For': return this.evalFor(node, sources, params, inputs, plots, hlines)\n case 'While': return this.evalWhile(node, sources, params, inputs, plots, hlines)\n case 'PlotCall': return this.evalPlot(node, sources, params, inputs, plots)\n case 'HlineCall': return this.evalHline(node, hlines)\n case 'ExpressionStatement': return this.evalExpr((node as any).expression, sources, params, inputs)\n case 'Return': return (node as any).value ? this.evalExpr((node as any).value, sources, params, inputs) : undefined\n default: return undefined\n }\n }\n\n private evalIndicator(node: any): void {\n if (node.name?.type === 'StringLiteral') {\n this.meta.name = node.name.value\n }\n for (const arg of node.args) {\n if (arg.key === 'overlay' && arg.value?.type === 'BoolLiteral') this.meta.overlay = arg.value.value\n if (arg.key === 'shorttitle' && arg.value?.type === 'StringLiteral') this.meta.shortName = arg.value.value\n if (arg.key === 'format' && arg.value?.type === 'StringLiteral') this.meta.format = arg.value.value\n if (arg.key === 'precision' && arg.value?.type === 'NumberLiteral') this.meta.precision = arg.value.value\n }\n }\n\n private evalVarDecl(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[]): void {\n const value = this.evalExpr(node.value, sources, params, inputs)\n\n if (Array.isArray(node.name)) {\n // Tuple destructuring\n const names = node.name as string[]\n if (value && typeof value === 'object') {\n const vals = Object.values(value)\n names.forEach((n, i) => this.scope.set(n, vals[i]))\n }\n } else {\n if (node.persistent) {\n this.vars.initVar(node.name, value)\n this.scope.set(node.name, this.vars.getVar(node.name))\n } else if (node.persistentTick) {\n this.vars.initVarip(node.name, value)\n this.scope.set(node.name, this.vars.getVarip(node.name))\n } else {\n this.scope.set(node.name, value)\n }\n }\n }\n\n private evalAssign(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[]): void {\n const value = this.evalExpr(node.value, sources, params, inputs)\n const current = this.scope.get(node.target)\n switch (node.operator) {\n case ':=': case '=': this.scope.set(node.target, value); break\n case '+=': this.scope.set(node.target, (current ?? 0) + value); break\n case '-=': this.scope.set(node.target, (current ?? 0) - value); break\n case '*=': this.scope.set(node.target, (current ?? 0) * value); break\n case '/=': this.scope.set(node.target, (current ?? 0) / value); break\n case '%=': this.scope.set(node.target, (current ?? 0) % value); break\n }\n if (this.vars.hasVar(node.target)) this.vars.setVar(node.target, this.scope.get(node.target))\n }\n\n private evalIf(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[], plots: PinePlot[], hlines: PineHline[]): any {\n const cond = this.evalExpr(node.condition, sources, params, inputs)\n if (cond) {\n for (const stmt of node.body) this.evalNode(stmt, sources, params, inputs, plots, hlines)\n } else {\n let handled = false\n for (const ei of node.elseIf) {\n if (this.evalExpr(ei.condition, sources, params, inputs)) {\n for (const stmt of ei.body) this.evalNode(stmt, sources, params, inputs, plots, hlines)\n handled = true; break\n }\n }\n if (!handled && node.elseBody) {\n for (const stmt of node.elseBody) this.evalNode(stmt, sources, params, inputs, plots, hlines)\n }\n }\n }\n\n private evalFor(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[], plots: PinePlot[], hlines: PineHline[]): void {\n const start = this.evalExpr(node.start, sources, params, inputs)\n const end = this.evalExpr(node.end, sources, params, inputs)\n const step = node.step ? this.evalExpr(node.step, sources, params, inputs) : 1\n for (let i = start; step > 0 ? i <= end : i >= end; i += step) {\n this.scope.set(node.variable, i)\n for (const stmt of node.body) this.evalNode(stmt, sources, params, inputs, plots, hlines)\n }\n }\n\n private evalWhile(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[], plots: PinePlot[], hlines: PineHline[]): void {\n let guard = 0\n while (this.evalExpr(node.condition, sources, params, inputs) && guard++ < 10000) {\n for (const stmt of node.body) this.evalNode(stmt, sources, params, inputs, plots, hlines)\n }\n }\n\n private evalPlot(node: any, sources: Record<string, number[]>, params: any[], inputs: PineInput[], plots: PinePlot[]): void {\n const series = this.evalExpr(node.args[0], sources, params, inputs)\n const kwargs = Object.fromEntries(node.kwargs.map((k: any) => [k.key, this.evalExpr(k.value, sources, params, inputs)]))\n\n const plotId = kwargs.title ?? `plot_${plots.length}`\n const plotKey = plotId.toString().toLowerCase().replace(/\\s+/g, '_')\n\n plots.push({\n id: plotKey,\n title: kwargs.title ?? null,\n color: this.resolveColor(kwargs.color),\n linewidth: kwargs.linewidth ?? 1,\n style: kwargs.style ?? null,\n })\n\n // Store the computed series\n if (Array.isArray(series)) {\n this.plotResults.set(plotKey, series)\n } else if (typeof series === 'number') {\n this.plotResults.set(plotKey, new Array(this.ctx.barCount).fill(series))\n }\n }\n\n private evalHline(node: any, hlines: PineHline[]): void {\n const price = this.evalExpr(node.price)\n const kwargs = Object.fromEntries(node.kwargs.map((k: any) => [k.key, this.evalExpr(k.value)]))\n hlines.push({\n price: typeof price === 'number' ? price : NaN,\n title: kwargs.title ?? null,\n color: this.resolveColor(kwargs.color),\n linestyle: kwargs.linestyle ?? null,\n linewidth: kwargs.linewidth ?? 1,\n })\n }\n\n // ─── Expression Evaluation ────────────────────────────────\n\n evalExpr(node: ExprNode, sources?: Record<string, number[]>, params?: any[], inputs?: PineInput[]): any {\n if (!node) return undefined\n\n switch (node.type) {\n case 'NumberLiteral': return (node as any).value\n case 'StringLiteral': return (node as any).value\n case 'BoolLiteral': return (node as any).value\n case 'ColorLiteral': return (node as any).value\n case 'NaLiteral': return NaN\n\n case 'Identifier': {\n const name = (node as Identifier).name\n if (this.scope.has(name)) return this.scope.get(name)\n if (sources && name in sources) return sources[name]\n if (ALL_CONSTANTS[name] !== undefined) return ALL_CONSTANTS[name]\n if (COLOR_MAP[name]) return COLOR_MAP[name]\n // barstate, bar_index etc\n if (name === 'bar_index') return Array.from({ length: this.ctx.barCount }, (_, i) => i)\n return undefined\n }\n\n case 'BinaryExpr': {\n const left = this.evalExpr((node as any).left, sources, params, inputs)\n const right = this.evalExpr((node as any).right, sources, params, inputs)\n return this.evalBinary((node as any).operator, left, right)\n }\n\n case 'UnaryExpr': {\n const operand = this.evalExpr((node as any).operand, sources, params, inputs)\n if ((node as any).operator === '-') return Array.isArray(operand) ? operand.map((v: number) => -v) : -operand\n if ((node as any).operator === 'not') return Array.isArray(operand) ? operand.map((v: any) => !v) : !operand\n return operand\n }\n\n case 'TernaryExpr': {\n const cond = this.evalExpr((node as any).condition, sources, params, inputs)\n if (Array.isArray(cond)) {\n const cons = this.evalExpr((node as any).consequent, sources, params, inputs)\n const alt = this.evalExpr((node as any).alternate, sources, params, inputs)\n return cond.map((c: any, i: number) => c ? (Array.isArray(cons) ? cons[i] : cons) : (Array.isArray(alt) ? alt[i] : alt))\n }\n return cond ? this.evalExpr((node as any).consequent, sources, params, inputs) : this.evalExpr((node as any).alternate, sources, params, inputs)\n }\n\n case 'FunctionCall': return this.evalFunctionCall(node as FunctionCallExpr, sources, params, inputs)\n\n case 'SeriesAccess': {\n const series = this.evalExpr((node as any).series, sources, params, inputs)\n const offset = this.evalExpr((node as any).offset, sources, params, inputs)\n if (Array.isArray(series) && typeof offset === 'number') {\n // Shift array by offset\n return series.map((_: any, i: number) => i - offset >= 0 ? series[i - offset] : NaN)\n }\n return NaN\n }\n\n case 'MemberExpr': {\n const fullName = this.buildMemberName(node)\n if (ALL_CONSTANTS[fullName] !== undefined) return ALL_CONSTANTS[fullName]\n if (COLOR_MAP[fullName]) return COLOR_MAP[fullName]\n if (sources && fullName in sources) return sources[fullName]\n return fullName // Return as string for later resolution\n }\n\n default: return undefined\n }\n }\n\n private evalFunctionCall(node: FunctionCallExpr, sources?: Record<string, number[]>, params?: any[], inputs?: PineInput[]): any {\n const args = node.args.map(a => this.evalExpr(a, sources, params, inputs))\n const kwargs = Object.fromEntries(node.kwargs.map(k => [k.key, this.evalExpr(k.value, sources, params, inputs)]))\n const callee = node.callee\n\n // Input functions → extract metadata + return value from params\n if (callee.startsWith('input')) {\n const inputFn = ALL_BUILTINS[callee]\n if (inputFn) {\n const result = inputFn(args[0], kwargs.title ?? args[1], kwargs)\n if (inputs) inputs.push(result.meta)\n const paramIdx = this.inputIndex++\n const paramValue = params && params[paramIdx] !== undefined ? params[paramIdx] : result.value\n // If source input, resolve to actual data array\n if (result.meta.type === 'source' && sources) {\n return sources[paramValue] ?? sources['close']\n }\n return paramValue\n }\n }\n\n // Built-in TA/math functions\n if (ALL_BUILTINS[callee]) {\n return ALL_BUILTINS[callee](...args)\n }\n\n // User-defined functions\n if (this.functions.has(callee)) {\n return this.callUserFunction(callee, args, sources, params, inputs)\n }\n\n // nz() — replace NaN with default\n if (callee === 'nz') {\n const val = args[0]\n const def = args[1] ?? 0\n if (Array.isArray(val)) return val.map((v: any) => (v === undefined || isNaN(v)) ? def : v)\n return (val === undefined || (typeof val === 'number' && isNaN(val))) ? def : val\n }\n\n // na() — check if NaN\n if (callee === 'na') {\n const val = args[0]\n if (Array.isArray(val)) return val.map((v: any) => v === undefined || (typeof v === 'number' && isNaN(v)))\n return val === undefined || (typeof val === 'number' && isNaN(val))\n }\n\n // fixnan() — replace NaN with last non-NaN\n if (callee === 'fixnan') {\n const val = args[0]\n if (Array.isArray(val)) {\n let last = NaN\n return val.map((v: number) => { if (!isNaN(v)) last = v; return last })\n }\n return val\n }\n\n // str.tostring\n if (callee === 'str.tostring') return String(args[0])\n\n this.warnings.push(`Unknown function: ${callee}`)\n return NaN\n }\n\n private callUserFunction(name: string, args: any[], sources?: Record<string, number[]>, params?: any[], inputs?: PineInput[]): any {\n const fn = this.functions.get(name)!\n const prevScope = new Map(this.scope)\n\n // Bind params\n fn.params.forEach((p, i) => {\n this.scope.set(p.name, args[i] ?? p.defaultValue)\n })\n\n let result: any\n for (const stmt of fn.body) {\n if (stmt.type === 'Return') {\n result = (stmt as any).value ? this.evalExpr((stmt as any).value, sources, params, inputs) : undefined\n break\n }\n if (stmt.type === 'ExpressionStatement') {\n result = this.evalExpr((stmt as any).expression, sources, params, inputs)\n } else {\n this.evalNode(stmt, sources ?? {}, params ?? [], inputs ?? [], [], [])\n }\n }\n\n this.scope = prevScope\n return result\n }\n\n // ─── Binary Operations ────────────────────────────────────\n\n private evalBinary(op: string, left: any, right: any): any {\n // Array-aware operations\n const isLA = Array.isArray(left), isRA = Array.isArray(right)\n if (isLA || isRA) {\n const len = isLA ? left.length : (right as any[]).length\n return Array.from({ length: len }, (_, i) => {\n const l = isLA ? left[i] : left\n const r = isRA ? right[i] : right\n return this.scalarBinary(op, l, r)\n })\n }\n return this.scalarBinary(op, left, right)\n }\n\n private scalarBinary(op: string, left: any, right: any): any {\n switch (op) {\n case '+': return left + right\n case '-': return left - right\n case '*': return left * right\n case '/': return right === 0 ? NaN : left / right\n case '%': return left % right\n case '**': return Math.pow(left, right)\n case '==': return left === right\n case '!=': return left !== right\n case '<': return left < right\n case '>': return left > right\n case '<=': return left <= right\n case '>=': return left >= right\n case 'and': return left && right\n case 'or': return left || right\n default: return NaN\n }\n }\n\n // ─── Helpers ──────────────────────────────────────────────\n\n private resolveColor(value: any): string | null {\n if (!value) return null\n if (typeof value === 'string') {\n if (value.startsWith('#')) return value\n if (COLOR_MAP[value]) return COLOR_MAP[value]\n return value\n }\n return null\n }\n\n private buildMemberName(node: any): string {\n if (node.type === 'Identifier') return node.name\n if (node.type === 'MemberExpr') return this.buildMemberName(node.object) + '.' + node.property\n return ''\n }\n}\n","/**\n * pine-to-kline — Figure Mapper\n * Maps Pine plot styles to KlineChart figure types\n * @license Apache-2.0\n */\n\nexport type KlineFigureType = 'line' | 'bar' | 'circle'\n\nconst STYLE_MAP: Record<string, KlineFigureType> = {\n 'plot.style_line': 'line',\n 'plot.style_linebr': 'line',\n 'plot.style_stepline': 'line',\n 'plot.style_area': 'line',\n 'plot.style_areabr': 'line',\n 'plot.style_columns': 'bar',\n 'plot.style_histogram': 'bar',\n 'plot.style_circles': 'circle',\n 'plot.style_cross': 'circle',\n}\n\nexport function mapPlotStyle(style: string | null): KlineFigureType {\n if (!style) return 'line'\n return STYLE_MAP[style] ?? 'line'\n}\n","/**\n * pine-to-kline — Style Mapper\n * Converts Pine style values to KlineChart-compatible CSS\n * @license Apache-2.0\n */\n\nimport { COLOR_MAP } from '../builtins/color/constants'\n\n/** Resolve a Pine color reference to a hex string */\nexport function resolveColor(value: any): string {\n if (!value) return '#2196F3'\n if (typeof value === 'string') {\n if (value.startsWith('#')) return value\n if (COLOR_MAP[value]) return COLOR_MAP[value]\n }\n return '#2196F3'\n}\n\n/** Map Pine linestyle to KlineChart dash array */\nexport function mapLinestyle(style: string | null): number[] {\n switch (style) {\n case 'hline.style_dashed': return [6, 3]\n case 'hline.style_dotted': return [2, 2]\n case 'hline.style_solid':\n default: return []\n }\n}\n","/**\n * pine-to-kline — KlineChart Adapter\n * Converts PineRuntime IR → KlineChart IndicatorTemplate\n * @license Apache-2.0\n */\n\nimport type { IndicatorConfig, PineIR, PinePlot, PineHline, KlineData } from '../types'\nimport { mapPlotStyle } from './FigureMapper'\nimport { resolveColor, mapLinestyle } from './StyleMapper'\n\nexport class KlineAdapter {\n toIndicatorTemplate(ir: PineIR): IndicatorConfig {\n const { meta, inputs, plots, hlines, calcFn } = ir\n\n const name = meta.name.toUpperCase().replace(/[^A-Z0-9_]/g, '_')\n\n return {\n name,\n shortName: meta.shortName ?? meta.name,\n series: meta.overlay ? 'price' : 'normal',\n calcParams: inputs.map(i => i.defaultValue),\n extendData: {\n pineInputs: inputs.map(i => i.title || i.id || 'Param')\n },\n figures: this.mapFigures(plots),\n\n regenerateFigures: inputs.length > 0\n ? (_params: any[]) => this.mapFigures(plots)\n : undefined,\n\n calc: (dataList: KlineData[], indicator: any) => {\n const params = indicator.calcParams ?? inputs.map(i => i.defaultValue)\n return calcFn(dataList, params)\n },\n\n // hline() → custom draw callback\n ...(hlines.length > 0 && {\n draw: (params: any) => {\n const { ctx, bounding, indicator, yAxis } = params\n if (!ctx || !yAxis) return false\n\n for (const h of hlines) {\n const y = yAxis.convertToPixel(h.price)\n if (y < bounding.top || y > bounding.top + bounding.height) continue\n\n ctx.save()\n ctx.strokeStyle = resolveColor(h.color)\n ctx.lineWidth = h.linewidth ?? 1\n const dash = mapLinestyle(h.linestyle)\n if (dash.length) ctx.setLineDash(dash)\n\n ctx.beginPath()\n ctx.moveTo(bounding.left, y)\n ctx.lineTo(bounding.left + bounding.width, y)\n ctx.stroke()\n\n // Draw label\n if (h.title) {\n ctx.fillStyle = resolveColor(h.color)\n ctx.font = '10px sans-serif'\n ctx.textAlign = 'right'\n ctx.fillText(h.title, bounding.left + bounding.width - 4, y - 4)\n }\n\n ctx.restore()\n }\n return false // don't skip default figure rendering\n }\n }),\n\n createTooltipDataSource: (params: any) => {\n const { indicator } = params\n const result = indicator?.result ?? []\n const lastRow = result[result.length - 1]\n\n return {\n name: meta.name,\n calcParamsText: inputs.length > 0\n ? `(${(indicator?.calcParams ?? []).join(', ')})`\n : '',\n values: plots.map(p => ({\n title: `${p.title ?? p.id}: `,\n value: lastRow?.[p.id] ?? '--'\n }))\n }\n }\n }\n }\n\n private mapFigures(plots: PinePlot[]) {\n return plots.map(plot => ({\n key: plot.id,\n title: `${plot.title ?? plot.id}: `,\n type: mapPlotStyle(plot.style),\n styles: (_data: any, _indicator: any, _defaultStyles: any) => ({\n color: resolveColor(plot.color)\n })\n }))\n }\n}\n","/**\n * pine-to-kline — PineInterpreter\n * Main entry point class for the library\n * @license Apache-2.0\n */\n\nimport type { PineInterpreterOptions, CompileResult, ValidationResult, IndicatorConfig, KlineData } from './types'\nimport { Lexer } from './lexer/Lexer'\nimport { Parser } from './parser/Parser'\nimport { PineRuntime } from './runtime/PineRuntime'\nimport { KlineAdapter } from './adapter/KlineAdapter'\n\nconst DEFAULT_OPTIONS: Required<PineInterpreterOptions> = {\n version: 'v5',\n strict: false,\n sandbox: true,\n onWarning: console.warn,\n onError: console.error,\n}\n\nexport class PineInterpreter {\n private options: Required<PineInterpreterOptions>\n\n constructor(options: PineInterpreterOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options }\n }\n\n /** Full compile: PineScript source → IndicatorConfig (IndicatorTemplate) */\n compile(source: string): CompileResult {\n try {\n const tokens = new Lexer(source).tokenize()\n const ast = new Parser(tokens).parse()\n const runtime = new PineRuntime()\n\n // Execute with empty data to extract metadata\n const dummyData: KlineData[] = [{ timestamp: 0, open: 0, high: 0, low: 0, close: 0 }]\n const ir = runtime.execute(ast, dummyData)\n\n // Build the real calc function that re-executes for actual data\n const realIR = {\n ...ir,\n calcFn: (dataList: KlineData[], params: any[]) => {\n const rt = new PineRuntime()\n return rt.execute(ast, dataList, params).calcFn(dataList, params)\n }\n }\n\n const adapter = new KlineAdapter()\n const config = adapter.toIndicatorTemplate(realIR)\n\n return {\n success: true,\n indicatorConfig: config,\n name: config.name,\n warnings: ir.warnings,\n errors: [],\n }\n } catch (e: any) {\n this.options.onError(e)\n return {\n success: false,\n indicatorConfig: {} as IndicatorConfig,\n name: '',\n warnings: [],\n errors: [e],\n }\n }\n }\n\n /** Validate syntax only (no execution) */\n validate(source: string): ValidationResult {\n try {\n const tokens = new Lexer(source).tokenize()\n new Parser(tokens).parse()\n return { valid: true, errors: [] }\n } catch (e: any) {\n return { valid: false, errors: [e] }\n }\n }\n\n /** Compile + register to KlineChart (global or instance) */\n register(source: string, registerFn?: (config: any) => void): string {\n const result = this.compile(source)\n if (!result.success) throw result.errors[0]\n\n if (registerFn) {\n registerFn(result.indicatorConfig)\n }\n\n return result.name\n }\n\n /** Execute directly with data (for testing/preview) */\n execute(source: string, dataList: KlineData[], params?: any[]): Record<string, any>[] {\n const result = this.compile(source)\n if (!result.success) throw result.errors[0]\n return result.indicatorConfig.calc(dataList, { calcParams: params ?? result.indicatorConfig.calcParams })\n }\n}\n","/**\n * pine-to-kline — KlineChartPro Plugin\n * Plugin adapter for @simahfud/klinecharts-pro integration\n * @license Apache-2.0\n */\n\nimport { PineInterpreter } from '../PineInterpreter'\nimport type { PineInterpreterOptions, CompileResult, ValidationResult } from '../types'\n\nexport interface PinePluginOptions extends PineInterpreterOptions {\n /** Persist Pine scripts in layout JSON */\n persistToLayout?: boolean\n}\n\nexport interface PineAPI {\n /** Compile + register + return indicator name */\n run: (pineCode: string) => string\n /** Validate syntax only */\n validate: (pineCode: string) => ValidationResult\n /** Compile without adding to chart */\n compile: (pineCode: string) => CompileResult\n}\n\n/**\n * Create a Pine interpreter plugin for KlineChartPro.\n *\n * @example\n * ```ts\n * import { createPinePlugin } from 'pine-to-kline/plugin'\n * import { registerCustomIndicator } from '@simahfud/klinecharts-pro'\n *\n * const pine = createPinePlugin()\n *\n * // Compile and register a Pine indicator\n * const name = pine.run(`\n * //@version=5\n * indicator(\"RSI\", overlay=false)\n * length = input.int(14, \"Length\")\n * plot(ta.rsi(close, length), \"RSI\", color=color.purple)\n * hline(70, \"OB\", color=color.red)\n * hline(30, \"OS\", color=color.green)\n * `)\n *\n * // The indicator is now registered and can be added to a chart\n * ```\n */\nexport function createPinePlugin(options: PinePluginOptions = {}): PineAPI {\n const interpreter = new PineInterpreter(options)\n\n return {\n run: (pineCode: string) => {\n const result = interpreter.compile(pineCode)\n if (!result.success) throw result.errors[0]\n // User should call registerCustomIndicator externally\n return result.name\n },\n\n validate: (pineCode: string) => interpreter.validate(pineCode),\n\n compile: (pineCode: string) => interpreter.compile(pineCode),\n }\n}\n","/**\n * pine-to-kline — Series Emulator\n * Emulates Pine's bar-by-bar series model using cursor-indexed arrays\n * @license Apache-2.0\n */\n\nexport class SeriesEmulator<T = number> {\n private _data: T[]\n private _cursor = 0\n\n constructor(data: T[]) {\n this._data = data\n }\n\n setCursor(index: number): void {\n this._cursor = index\n }\n\n /** Access value with lookback: series[0] = current, series[1] = previous */\n get(lookback = 0): T {\n const idx = this._cursor - lookback\n if (idx < 0) return NaN as unknown as T\n return this._data[idx]\n }\n\n /** Set value at current cursor */\n set(value: T): void {\n this._data[this._cursor] = value\n }\n\n get length(): number { return this._data.length }\n get current(): T { return this.get(0) }\n get all(): T[] { return this._data }\n\n /** Get the full underlying array */\n toArray(): T[] { return [...this._data] }\n}\n"],"names":["Token","type","value","line","column","types","TokenType","KEYWORDS","PineError","message","source","loc","col","LexerError","ParseError","RuntimeError","AdapterError","Lexer","__publicField","ch","indent","currentIndent","lastToken","startCol","quote","startLine","esc","keyword","next","two","twoCharOps","singleCharOps","tokens","result","continuationTokens","parenDepth","bracketDepth","i","tok","prev","offset","PLOT_FUNCTIONS","PINE_TYPES","Parser","body","annotations","stmt","expr","id","_a","_b","_c","_d","_e","args","persistent","persistentTick","typeAnnotation","name","target","op","names","condition","elseIf","elseBody","cond","b","variable","iterable","start","end","step","expression","cases","defaultBody","pathParts","path","alias","decl","fields","typeAnn","fName","defVal","params","pName","depth","defaultValue","fn","positional","named","consequent","alternate","left","right","operand","prop","isMethodCall","callee","_f","elements","ifNode","switchNode","key","stmts","BarContext","dataList","d","VarPersistence","sma","length","_","sum","j","ema","k","out","rma","alpha","wma","denom","hma","halfLen","sqrtLen","wma1","wma2","diff","v","vwma","volume","sumPV","sumV","swma","dema","ema1","ema2","tema","ema3","rsi","gains","losses","avgGains","avgLoss","macd","fastLen","slowLen","signalLen","fast","slow","macdLine","signalLine","hist","stoch","close","high","low","highest","lowest","cci","smaVals","meanDev","mom","roc","atr","tr","h","bb","mult","mid","sumSq","std","kc","atrVals","donchian","crossover","a","crossunder","cross","change","rising","falling","max","min","highestbars","maxVal","maxIdx","lowestbars","minVal","minIdx","barssince","count","c","valuewhen","occurrence","occurrences","pivothigh","leftBars","rightBars","pivotlow","cum","stdev","mean","percentrank","TA_REGISTRY","_ma.sma","_ma.ema","_ma.rma","_ma.wma","_ma.hma","_ma.vwma","_ma.swma","_ma.dema","_ma.tema","_mom.rsi","_mom.macd","_mom.stoch","_mom.cci","_mom.mom","_mom.roc","_vol.atr","_vol.bb","_vol.kc","_vol.donchian","_vol.tr","_cross.crossover","_cross.crossunder","_cross.cross","_cross.change","_cross.rising","_cross.falling","_util.highest","_util.lowest","_util.highestbars","_util.lowestbars","_util.barssince","_util.valuewhen","_util.pivothigh","_util.pivotlow","_util.cum","_util.stdev","_util.percentrank","MATH_REGISTRY","x","precision","factor","base","exp","rad","deg","MATH_CONSTANTS","COLOR_MAP","colorNew","baseColor","transp","hex","colorRgb","r","g","clamp","colorFromGradient","bottom","top","bottomColor","topColor","t","parseHex","c1","c2","lerp","COLOR_FUNCTIONS","inputCounter","resetInputCounter","inputInt","defval","title","options","inputFloat","inputBool","inputString","inputColor","inputSource","inputGeneric","INPUT_REGISTRY","ALL_BUILTINS","ALL_CONSTANTS","PineRuntime","ast","errors","calcFn","dl","p","node","collectedInputs","collectedPlots","collectedHlines","sources","e","n","row","arr","inputs","plots","hlines","arg","vals","current","handled","ei","guard","series","kwargs","plotKey","price","cons","alt","fullName","inputFn","paramIdx","paramValue","val","def","last","prevScope","isLA","isRA","len","l","STYLE_MAP","mapPlotStyle","style","resolveColor","mapLinestyle","KlineAdapter","ir","meta","_params","indicator","ctx","bounding","yAxis","y","dash","lastRow","plot","_data","_indicator","_defaultStyles","DEFAULT_OPTIONS","PineInterpreter","runtime","dummyData","realIR","config","registerFn","createPinePlugin","interpreter","pineCode","SeriesEmulator","data","index","lookback","idx"],"mappings":"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"}