@simahfud/pine-to-kline 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/PineInterpreter.d.ts +19 -0
  2. package/dist/PineInterpreter.d.ts.map +1 -0
  3. package/dist/PineInterpreter.js +89 -0
  4. package/dist/PineInterpreter.js.map +1 -0
  5. package/dist/adapter/FigureMapper.d.ts +8 -0
  6. package/dist/adapter/FigureMapper.d.ts.map +1 -0
  7. package/dist/adapter/FigureMapper.js +22 -0
  8. package/dist/adapter/FigureMapper.js.map +1 -0
  9. package/dist/adapter/KlineAdapter.d.ts +11 -0
  10. package/dist/adapter/KlineAdapter.d.ts.map +1 -0
  11. package/dist/adapter/KlineAdapter.js +88 -0
  12. package/dist/adapter/KlineAdapter.js.map +1 -0
  13. package/dist/adapter/StyleMapper.d.ts +10 -0
  14. package/dist/adapter/StyleMapper.d.ts.map +1 -0
  15. package/dist/adapter/StyleMapper.js +28 -0
  16. package/dist/adapter/StyleMapper.js.map +1 -0
  17. package/dist/builtins/color/constants.d.ts +7 -0
  18. package/dist/builtins/color/constants.d.ts.map +1 -0
  19. package/dist/builtins/color/constants.js +25 -0
  20. package/dist/builtins/color/constants.js.map +1 -0
  21. package/dist/builtins/color/functions.d.ts +21 -0
  22. package/dist/builtins/color/functions.d.ts.map +1 -0
  23. package/dist/builtins/color/functions.js +52 -0
  24. package/dist/builtins/color/functions.js.map +1 -0
  25. package/dist/builtins/index.d.ts +15 -0
  26. package/dist/builtins/index.d.ts.map +1 -0
  27. package/dist/builtins/index.js +32 -0
  28. package/dist/builtins/index.js.map +1 -0
  29. package/dist/builtins/input/functions.d.ts +28 -0
  30. package/dist/builtins/input/functions.d.ts.map +1 -0
  31. package/dist/builtins/input/functions.js +114 -0
  32. package/dist/builtins/input/functions.js.map +1 -0
  33. package/dist/builtins/math/functions.d.ts +9 -0
  34. package/dist/builtins/math/functions.d.ts.map +1 -0
  35. package/dist/builtins/math/functions.js +57 -0
  36. package/dist/builtins/math/functions.js.map +1 -0
  37. package/dist/builtins/ta/crossover.d.ts +18 -0
  38. package/dist/builtins/ta/crossover.d.ts.map +1 -0
  39. package/dist/builtins/ta/crossover.js +59 -0
  40. package/dist/builtins/ta/crossover.js.map +1 -0
  41. package/dist/builtins/ta/index.d.ts +12 -0
  42. package/dist/builtins/ta/index.d.ts.map +1 -0
  43. package/dist/builtins/ta/index.js +61 -0
  44. package/dist/builtins/ta/index.js.map +1 -0
  45. package/dist/builtins/ta/momentum.d.ts +22 -0
  46. package/dist/builtins/ta/momentum.d.ts.map +1 -0
  47. package/dist/builtins/ta/momentum.js +81 -0
  48. package/dist/builtins/ta/momentum.js.map +1 -0
  49. package/dist/builtins/ta/moving-averages.d.ts +24 -0
  50. package/dist/builtins/ta/moving-averages.d.ts.map +1 -0
  51. package/dist/builtins/ta/moving-averages.js +108 -0
  52. package/dist/builtins/ta/moving-averages.js.map +1 -0
  53. package/dist/builtins/ta/utility.d.ts +28 -0
  54. package/dist/builtins/ta/utility.d.ts.map +1 -0
  55. package/dist/builtins/ta/utility.js +156 -0
  56. package/dist/builtins/ta/utility.js.map +1 -0
  57. package/dist/builtins/ta/volatility.d.ts +21 -0
  58. package/dist/builtins/ta/volatility.d.ts.map +1 -0
  59. package/dist/builtins/ta/volatility.js +71 -0
  60. package/dist/builtins/ta/volatility.js.map +1 -0
  61. package/dist/index.d.ts +21 -695
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +24 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/lexer/Lexer.d.ts +40 -0
  66. package/dist/lexer/Lexer.d.ts.map +1 -0
  67. package/dist/lexer/Lexer.js +383 -0
  68. package/dist/lexer/Lexer.js.map +1 -0
  69. package/dist/lexer/Token.d.ts +16 -0
  70. package/dist/lexer/Token.d.ts.map +1 -0
  71. package/dist/lexer/Token.js +26 -0
  72. package/dist/lexer/Token.js.map +1 -0
  73. package/dist/lexer/TokenType.d.ts +74 -0
  74. package/dist/lexer/TokenType.d.ts.map +1 -0
  75. package/dist/lexer/TokenType.js +111 -0
  76. package/dist/lexer/TokenType.js.map +1 -0
  77. package/dist/parser/Parser.d.ts +55 -0
  78. package/dist/parser/Parser.d.ts.map +1 -0
  79. package/dist/parser/Parser.js +569 -0
  80. package/dist/parser/Parser.js.map +1 -0
  81. package/dist/parser/nodes/index.d.ts +215 -0
  82. package/dist/parser/nodes/index.d.ts.map +1 -0
  83. package/dist/parser/nodes/index.js +7 -0
  84. package/dist/parser/nodes/index.js.map +1 -0
  85. package/dist/plugin/KlineChartProPlugin.d.ts +43 -0
  86. package/dist/plugin/KlineChartProPlugin.d.ts.map +1 -0
  87. package/dist/plugin/KlineChartProPlugin.js +44 -0
  88. package/dist/plugin/KlineChartProPlugin.js.map +1 -0
  89. package/dist/runtime/BarContext.d.ts +23 -0
  90. package/dist/runtime/BarContext.d.ts.map +1 -0
  91. package/dist/runtime/BarContext.js +41 -0
  92. package/dist/runtime/BarContext.js.map +1 -0
  93. package/dist/runtime/PineRuntime.d.ts +51 -0
  94. package/dist/runtime/PineRuntime.d.ts.map +1 -0
  95. package/dist/runtime/PineRuntime.js +471 -0
  96. package/dist/runtime/PineRuntime.js.map +1 -0
  97. package/dist/runtime/SeriesEmulator.d.ts +21 -0
  98. package/dist/runtime/SeriesEmulator.d.ts.map +1 -0
  99. package/dist/runtime/SeriesEmulator.js +32 -0
  100. package/dist/runtime/SeriesEmulator.js.map +1 -0
  101. package/dist/runtime/VarPersistence.d.ts +20 -0
  102. package/dist/runtime/VarPersistence.d.ts.map +1 -0
  103. package/dist/runtime/VarPersistence.js +28 -0
  104. package/dist/runtime/VarPersistence.js.map +1 -0
  105. package/dist/types.d.ts +97 -0
  106. package/dist/types.d.ts.map +1 -0
  107. package/dist/types.js +6 -0
  108. package/dist/types.js.map +1 -0
  109. package/dist/utils/errors.d.ts +24 -0
  110. package/dist/utils/errors.d.ts.map +1 -0
  111. package/dist/utils/errors.js +46 -0
  112. package/dist/utils/errors.js.map +1 -0
  113. package/package.json +1 -1
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * pine-to-kline — Public API
3
+ * PineScript v5/v6 interpreter for KlineChart registerIndicator
4
+ * @license Apache-2.0
5
+ */
6
+ // ─── Main Class ─────────────────────────────────────────────
7
+ export { PineInterpreter } from './PineInterpreter';
8
+ // ─── Plugin ─────────────────────────────────────────────────
9
+ export { createPinePlugin } from './plugin/KlineChartProPlugin';
10
+ // ─── Pipeline Components (for advanced usage) ───────────────
11
+ export { Lexer } from './lexer/Lexer';
12
+ export { Token } from './lexer/Token';
13
+ export { TokenType } from './lexer/TokenType';
14
+ export { Parser } from './parser/Parser';
15
+ export { PineRuntime } from './runtime/PineRuntime';
16
+ export { KlineAdapter } from './adapter/KlineAdapter';
17
+ export { SeriesEmulator } from './runtime/SeriesEmulator';
18
+ export { BarContext } from './runtime/BarContext';
19
+ // ─── Built-in Registries (for extending) ────────────────────
20
+ export { TA_REGISTRY } from './builtins/ta/index';
21
+ export { ALL_BUILTINS, ALL_CONSTANTS } from './builtins/index';
22
+ // ─── Errors ─────────────────────────────────────────────────
23
+ export { PineError, LexerError, ParseError, RuntimeError, AdapterError } from './utils/errors';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,+DAA+D;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,+DAA+D;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAG/D,+DAA+D;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,+DAA+D;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAiB9D,+DAA+D;AAC/D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * pine-to-kline — Lexer (Tokenizer)
3
+ * Converts PineScript source code into a stream of tokens.
4
+ * Handles indentation-significant syntax (INDENT/DEDENT).
5
+ * @license Apache-2.0
6
+ */
7
+ import { Token } from './Token';
8
+ export declare class Lexer {
9
+ private source;
10
+ private tokens;
11
+ private pos;
12
+ private line;
13
+ private column;
14
+ private indentStack;
15
+ private atLineStart;
16
+ constructor(source: string);
17
+ tokenize(): Token[];
18
+ private handleIndentation;
19
+ private emitNewline;
20
+ private readComment;
21
+ private readNumber;
22
+ private readString;
23
+ private readColor;
24
+ private readIdentifier;
25
+ private readOperator;
26
+ /**
27
+ * Filter out meaningless tokens and handle line continuation.
28
+ * Pine uses implicit line continuation after certain tokens:
29
+ * binary operators, commas, opening brackets/parens.
30
+ */
31
+ private filterTokens;
32
+ private current;
33
+ private peek;
34
+ private advance;
35
+ private isDigit;
36
+ private isAlpha;
37
+ private isAlphaNumeric;
38
+ private isHexDigit;
39
+ }
40
+ //# sourceMappingURL=Lexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lexer.d.ts","sourceRoot":"","sources":["../../src/lexer/Lexer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAI/B,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,GAAG,CAAI;IACf,OAAO,CAAC,IAAI,CAAI;IAChB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAO;gBAEd,MAAM,EAAE,MAAM;IAK1B,QAAQ,IAAI,KAAK,EAAE;IA+EnB,OAAO,CAAC,iBAAiB;IAyCzB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,UAAU;IA6BlB,OAAO,CAAC,UAAU;IAwClB,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,YAAY;IA6DpB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAkDpB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,UAAU;CAInB"}
@@ -0,0 +1,383 @@
1
+ /**
2
+ * pine-to-kline — Lexer (Tokenizer)
3
+ * Converts PineScript source code into a stream of tokens.
4
+ * Handles indentation-significant syntax (INDENT/DEDENT).
5
+ * @license Apache-2.0
6
+ */
7
+ import { Token } from './Token';
8
+ import { TokenType, KEYWORDS } from './TokenType';
9
+ import { LexerError } from '../utils/errors';
10
+ export class Lexer {
11
+ source;
12
+ tokens = [];
13
+ pos = 0;
14
+ line = 1;
15
+ column = 1;
16
+ indentStack = [0];
17
+ atLineStart = true;
18
+ constructor(source) {
19
+ // Normalize line endings
20
+ this.source = source.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
21
+ }
22
+ tokenize() {
23
+ this.tokens = [];
24
+ this.pos = 0;
25
+ this.line = 1;
26
+ this.column = 1;
27
+ this.indentStack = [0];
28
+ this.atLineStart = true;
29
+ while (this.pos < this.source.length) {
30
+ if (this.atLineStart) {
31
+ this.handleIndentation();
32
+ this.atLineStart = false;
33
+ }
34
+ const ch = this.current();
35
+ if (ch === undefined)
36
+ break;
37
+ // Skip spaces/tabs mid-line
38
+ if (ch === ' ' || ch === '\t') {
39
+ this.advance();
40
+ continue;
41
+ }
42
+ // Newlines
43
+ if (ch === '\n') {
44
+ this.emitNewline();
45
+ continue;
46
+ }
47
+ // Comments and compiler annotations
48
+ if (ch === '/' && this.peek() === '/') {
49
+ this.readComment();
50
+ continue;
51
+ }
52
+ // Numbers
53
+ if (this.isDigit(ch) || (ch === '.' && this.peek() !== undefined && this.isDigit(this.peek()))) {
54
+ this.readNumber();
55
+ continue;
56
+ }
57
+ // Strings
58
+ if (ch === '"' || ch === "'") {
59
+ this.readString(ch);
60
+ continue;
61
+ }
62
+ // Color literals: #RRGGBB or #RRGGBBAA
63
+ if (ch === '#' && this.isHexDigit(this.peek())) {
64
+ this.readColor();
65
+ continue;
66
+ }
67
+ // Identifiers and keywords
68
+ if (this.isAlpha(ch) || ch === '_') {
69
+ this.readIdentifier();
70
+ continue;
71
+ }
72
+ // Operators and delimiters
73
+ if (this.readOperator()) {
74
+ continue;
75
+ }
76
+ throw new LexerError(`Unexpected character: '${ch}'`, this.line, this.column);
77
+ }
78
+ // Emit remaining DEDENTs
79
+ while (this.indentStack.length > 1) {
80
+ this.indentStack.pop();
81
+ this.tokens.push(new Token(TokenType.DEDENT, '', this.line, this.column));
82
+ }
83
+ this.tokens.push(new Token(TokenType.EOF, '', this.line, this.column));
84
+ return this.filterTokens(this.tokens);
85
+ }
86
+ // ─── Indentation ────────────────────────────────────────────
87
+ handleIndentation() {
88
+ let indent = 0;
89
+ while (this.pos < this.source.length) {
90
+ const ch = this.source[this.pos];
91
+ if (ch === ' ') {
92
+ indent++;
93
+ this.pos++;
94
+ this.column++;
95
+ }
96
+ else if (ch === '\t') {
97
+ indent += 4; // Tab = 4 spaces
98
+ this.pos++;
99
+ this.column++;
100
+ }
101
+ else {
102
+ break;
103
+ }
104
+ }
105
+ // Skip blank lines
106
+ if (this.pos < this.source.length && this.source[this.pos] === '\n') {
107
+ return;
108
+ }
109
+ // Skip comment-only lines (don't affect indentation)
110
+ if (this.pos < this.source.length && this.source[this.pos] === '/' && this.pos + 1 < this.source.length && this.source[this.pos + 1] === '/') {
111
+ return;
112
+ }
113
+ const currentIndent = this.indentStack[this.indentStack.length - 1];
114
+ if (indent > currentIndent) {
115
+ this.indentStack.push(indent);
116
+ this.tokens.push(new Token(TokenType.INDENT, '', this.line, 1));
117
+ }
118
+ else if (indent < currentIndent) {
119
+ while (this.indentStack.length > 1 && this.indentStack[this.indentStack.length - 1] > indent) {
120
+ this.indentStack.pop();
121
+ this.tokens.push(new Token(TokenType.DEDENT, '', this.line, 1));
122
+ }
123
+ }
124
+ }
125
+ // ─── Newlines ───────────────────────────────────────────────
126
+ emitNewline() {
127
+ // Don't emit consecutive newlines
128
+ const lastToken = this.tokens[this.tokens.length - 1];
129
+ if (!lastToken || (lastToken.type !== TokenType.NEWLINE && lastToken.type !== TokenType.INDENT)) {
130
+ this.tokens.push(new Token(TokenType.NEWLINE, '\n', this.line, this.column));
131
+ }
132
+ this.advance(); // consume \n
133
+ this.line++;
134
+ this.column = 1;
135
+ this.atLineStart = true;
136
+ }
137
+ // ─── Comments ───────────────────────────────────────────────
138
+ readComment() {
139
+ const startCol = this.column;
140
+ let value = '';
141
+ this.advance(); // first /
142
+ this.advance(); // second /
143
+ // Check for compiler annotation: //@version=5
144
+ if (this.current() === '@') {
145
+ value = '//@';
146
+ this.advance(); // @
147
+ while (this.pos < this.source.length && this.current() !== '\n') {
148
+ value += this.current();
149
+ this.advance();
150
+ }
151
+ this.tokens.push(new Token(TokenType.COMPILER_ANNOTATION, value.trim(), this.line, startCol));
152
+ return;
153
+ }
154
+ // Regular comment — skip until end of line
155
+ while (this.pos < this.source.length && this.current() !== '\n') {
156
+ value += this.current();
157
+ this.advance();
158
+ }
159
+ // Comments are skipped (not emitted as tokens)
160
+ }
161
+ // ─── Numbers ────────────────────────────────────────────────
162
+ readNumber() {
163
+ const startCol = this.column;
164
+ let value = '';
165
+ // Integer or float
166
+ while (this.pos < this.source.length && (this.isDigit(this.current()) || this.current() === '.')) {
167
+ value += this.current();
168
+ this.advance();
169
+ }
170
+ // Scientific notation: 1e5, 1.5e-3
171
+ if (this.current() === 'e' || this.current() === 'E') {
172
+ value += this.current();
173
+ this.advance();
174
+ if (this.current() === '+' || this.current() === '-') {
175
+ value += this.current();
176
+ this.advance();
177
+ }
178
+ while (this.pos < this.source.length && this.isDigit(this.current())) {
179
+ value += this.current();
180
+ this.advance();
181
+ }
182
+ }
183
+ this.tokens.push(new Token(TokenType.NUMBER, value, this.line, startCol));
184
+ }
185
+ // ─── Strings ────────────────────────────────────────────────
186
+ readString(quote) {
187
+ const startCol = this.column;
188
+ const startLine = this.line;
189
+ let value = '';
190
+ this.advance(); // opening quote
191
+ while (this.pos < this.source.length) {
192
+ const ch = this.current();
193
+ if (ch === '\\') {
194
+ this.advance();
195
+ const esc = this.current();
196
+ if (esc === 'n')
197
+ value += '\n';
198
+ else if (esc === 't')
199
+ value += '\t';
200
+ else if (esc === '\\')
201
+ value += '\\';
202
+ else if (esc === quote)
203
+ value += quote;
204
+ else
205
+ value += '\\' + (esc ?? '');
206
+ this.advance();
207
+ continue;
208
+ }
209
+ if (ch === quote) {
210
+ this.advance(); // closing quote
211
+ this.tokens.push(new Token(TokenType.STRING, value, startLine, startCol));
212
+ return;
213
+ }
214
+ if (ch === '\n') {
215
+ throw new LexerError('Unterminated string literal', startLine, startCol);
216
+ }
217
+ value += ch;
218
+ this.advance();
219
+ }
220
+ throw new LexerError('Unterminated string literal', startLine, startCol);
221
+ }
222
+ // ─── Color Literals ─────────────────────────────────────────
223
+ readColor() {
224
+ const startCol = this.column;
225
+ let value = '#';
226
+ this.advance(); // #
227
+ while (this.pos < this.source.length && this.isHexDigit(this.current())) {
228
+ value += this.current();
229
+ this.advance();
230
+ }
231
+ if (value.length !== 7 && value.length !== 9) {
232
+ throw new LexerError(`Invalid color literal: ${value}`, this.line, startCol);
233
+ }
234
+ this.tokens.push(new Token(TokenType.COLOR_LITERAL, value, this.line, startCol));
235
+ }
236
+ // ─── Identifiers & Keywords ─────────────────────────────────
237
+ readIdentifier() {
238
+ const startCol = this.column;
239
+ let value = '';
240
+ while (this.pos < this.source.length && (this.isAlphaNumeric(this.current()) || this.current() === '_')) {
241
+ value += this.current();
242
+ this.advance();
243
+ }
244
+ // Check for keyword
245
+ const keyword = KEYWORDS[value];
246
+ if (keyword) {
247
+ this.tokens.push(new Token(keyword, value, this.line, startCol));
248
+ }
249
+ else {
250
+ this.tokens.push(new Token(TokenType.IDENTIFIER, value, this.line, startCol));
251
+ }
252
+ }
253
+ // ─── Operators & Delimiters ─────────────────────────────────
254
+ readOperator() {
255
+ const ch = this.current();
256
+ const next = this.peek();
257
+ const startCol = this.column;
258
+ // Two-character operators
259
+ if (next !== undefined) {
260
+ const two = ch + next;
261
+ const twoCharOps = {
262
+ '==': TokenType.EQ,
263
+ '!=': TokenType.NEQ,
264
+ '<=': TokenType.LTE,
265
+ '>=': TokenType.GTE,
266
+ ':=': TokenType.REASSIGN,
267
+ '+=': TokenType.PLUS_ASSIGN,
268
+ '-=': TokenType.MINUS_ASSIGN,
269
+ '*=': TokenType.STAR_ASSIGN,
270
+ '/=': TokenType.SLASH_ASSIGN,
271
+ '%=': TokenType.PERCENT_ASSIGN,
272
+ '=>': TokenType.ARROW,
273
+ '**': TokenType.POWER,
274
+ };
275
+ if (twoCharOps[two]) {
276
+ this.advance();
277
+ this.advance();
278
+ this.tokens.push(new Token(twoCharOps[two], two, this.line, startCol));
279
+ return true;
280
+ }
281
+ }
282
+ // Single-character operators
283
+ const singleCharOps = {
284
+ '+': TokenType.PLUS,
285
+ '-': TokenType.MINUS,
286
+ '*': TokenType.STAR,
287
+ '/': TokenType.SLASH,
288
+ '%': TokenType.PERCENT,
289
+ '<': TokenType.LT,
290
+ '>': TokenType.GT,
291
+ '=': TokenType.ASSIGN,
292
+ '(': TokenType.LPAREN,
293
+ ')': TokenType.RPAREN,
294
+ '[': TokenType.LBRACKET,
295
+ ']': TokenType.RBRACKET,
296
+ ',': TokenType.COMMA,
297
+ '.': TokenType.DOT,
298
+ ':': TokenType.COLON,
299
+ '?': TokenType.QUESTION,
300
+ };
301
+ if (singleCharOps[ch]) {
302
+ this.advance();
303
+ this.tokens.push(new Token(singleCharOps[ch], ch, this.line, startCol));
304
+ return true;
305
+ }
306
+ return false;
307
+ }
308
+ // ─── Post-Processing ───────────────────────────────────────
309
+ /**
310
+ * Filter out meaningless tokens and handle line continuation.
311
+ * Pine uses implicit line continuation after certain tokens:
312
+ * binary operators, commas, opening brackets/parens.
313
+ */
314
+ filterTokens(tokens) {
315
+ const result = [];
316
+ const continuationTokens = new Set([
317
+ TokenType.PLUS, TokenType.MINUS, TokenType.STAR, TokenType.SLASH,
318
+ TokenType.PERCENT, TokenType.POWER, TokenType.EQ, TokenType.NEQ,
319
+ TokenType.LT, TokenType.GT, TokenType.LTE, TokenType.GTE,
320
+ TokenType.AND, TokenType.OR, TokenType.COMMA, TokenType.ASSIGN,
321
+ TokenType.REASSIGN, TokenType.PLUS_ASSIGN, TokenType.MINUS_ASSIGN,
322
+ TokenType.STAR_ASSIGN, TokenType.SLASH_ASSIGN, TokenType.PERCENT_ASSIGN,
323
+ TokenType.QUESTION, TokenType.COLON, TokenType.ARROW,
324
+ TokenType.LPAREN, TokenType.LBRACKET,
325
+ ]);
326
+ let parenDepth = 0;
327
+ let bracketDepth = 0;
328
+ for (let i = 0; i < tokens.length; i++) {
329
+ const tok = tokens[i];
330
+ if (tok.type === TokenType.LPAREN)
331
+ parenDepth++;
332
+ if (tok.type === TokenType.RPAREN)
333
+ parenDepth--;
334
+ if (tok.type === TokenType.LBRACKET)
335
+ bracketDepth++;
336
+ if (tok.type === TokenType.RBRACKET)
337
+ bracketDepth--;
338
+ // Skip newlines inside parentheses/brackets (implicit continuation)
339
+ if (tok.type === TokenType.NEWLINE && (parenDepth > 0 || bracketDepth > 0)) {
340
+ continue;
341
+ }
342
+ // Skip newlines after continuation tokens
343
+ if (tok.type === TokenType.NEWLINE) {
344
+ const prev = result[result.length - 1];
345
+ if (prev && continuationTokens.has(prev.type)) {
346
+ continue;
347
+ }
348
+ }
349
+ // Skip INDENT/DEDENT inside parens/brackets
350
+ if ((tok.type === TokenType.INDENT || tok.type === TokenType.DEDENT) && (parenDepth > 0 || bracketDepth > 0)) {
351
+ continue;
352
+ }
353
+ result.push(tok);
354
+ }
355
+ return result;
356
+ }
357
+ // ─── Helpers ────────────────────────────────────────────────
358
+ current() {
359
+ return this.source[this.pos];
360
+ }
361
+ peek(offset = 1) {
362
+ return this.source[this.pos + offset];
363
+ }
364
+ advance() {
365
+ this.pos++;
366
+ this.column++;
367
+ }
368
+ isDigit(ch) {
369
+ return ch >= '0' && ch <= '9';
370
+ }
371
+ isAlpha(ch) {
372
+ return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_';
373
+ }
374
+ isAlphaNumeric(ch) {
375
+ return this.isAlpha(ch) || this.isDigit(ch);
376
+ }
377
+ isHexDigit(ch) {
378
+ if (!ch)
379
+ return false;
380
+ return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F');
381
+ }
382
+ }
383
+ //# sourceMappingURL=Lexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lexer.js","sourceRoot":"","sources":["../../src/lexer/Lexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * pine-to-kline — Token
3
+ * @license Apache-2.0
4
+ */
5
+ import { TokenType } from './TokenType';
6
+ export declare class Token {
7
+ readonly type: TokenType;
8
+ readonly value: string;
9
+ readonly line: number;
10
+ readonly column: number;
11
+ constructor(type: TokenType, value: string, line: number, column: number);
12
+ is(type: TokenType): boolean;
13
+ isAny(...types: TokenType[]): boolean;
14
+ toString(): string;
15
+ }
16
+ //# sourceMappingURL=Token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Token.d.ts","sourceRoot":"","sources":["../../src/lexer/Token.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,qBAAa,KAAK;aAEE,IAAI,EAAE,SAAS;aACf,KAAK,EAAE,MAAM;aACb,IAAI,EAAE,MAAM;aACZ,MAAM,EAAE,MAAM;gBAHd,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM;IAGhC,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;IAI5B,KAAK,CAAC,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO;IAIrC,QAAQ,IAAI,MAAM;CAGnB"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * pine-to-kline — Token
3
+ * @license Apache-2.0
4
+ */
5
+ export class Token {
6
+ type;
7
+ value;
8
+ line;
9
+ column;
10
+ constructor(type, value, line, column) {
11
+ this.type = type;
12
+ this.value = value;
13
+ this.line = line;
14
+ this.column = column;
15
+ }
16
+ is(type) {
17
+ return this.type === type;
18
+ }
19
+ isAny(...types) {
20
+ return types.includes(this.type);
21
+ }
22
+ toString() {
23
+ return `Token(${this.type}, ${JSON.stringify(this.value)}, ${this.line}:${this.column})`;
24
+ }
25
+ }
26
+ //# sourceMappingURL=Token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Token.js","sourceRoot":"","sources":["../../src/lexer/Token.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,OAAO,KAAK;IAEE;IACA;IACA;IACA;IAJlB,YACkB,IAAe,EACf,KAAa,EACb,IAAY,EACZ,MAAc;QAHd,SAAI,GAAJ,IAAI,CAAW;QACf,UAAK,GAAL,KAAK,CAAQ;QACb,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAQ;IAC7B,CAAC;IAEJ,EAAE,CAAC,IAAe;QAChB,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,GAAG,KAAkB;QACzB,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAED,QAAQ;QACN,OAAO,SAAS,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAA;IAC1F,CAAC;CACF"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * pine-to-kline — Token Types
3
+ * All PineScript v5/v6 token categories
4
+ * @license Apache-2.0
5
+ */
6
+ export declare enum TokenType {
7
+ NUMBER = "NUMBER",
8
+ STRING = "STRING",
9
+ COLOR_LITERAL = "COLOR_LITERAL",// #RRGGBB or #RRGGBBAA
10
+ IDENTIFIER = "IDENTIFIER",
11
+ IF = "IF",
12
+ ELSE = "ELSE",
13
+ FOR = "FOR",
14
+ TO = "TO",
15
+ BY = "BY",
16
+ IN = "IN",
17
+ WHILE = "WHILE",
18
+ SWITCH = "SWITCH",
19
+ VAR = "VAR",
20
+ VARIP = "VARIP",
21
+ TRUE = "TRUE",
22
+ FALSE = "FALSE",
23
+ NA = "NA",
24
+ AND = "AND",
25
+ OR = "OR",
26
+ NOT = "NOT",
27
+ IMPORT = "IMPORT",
28
+ EXPORT = "EXPORT",
29
+ TYPE = "TYPE",
30
+ METHOD = "METHOD",
31
+ BREAK = "BREAK",
32
+ CONTINUE = "CONTINUE",
33
+ RETURN = "RETURN",
34
+ INDICATOR = "INDICATOR",
35
+ STRATEGY = "STRATEGY",
36
+ LIBRARY = "LIBRARY",
37
+ PLUS = "PLUS",// +
38
+ MINUS = "MINUS",// -
39
+ STAR = "STAR",// *
40
+ SLASH = "SLASH",// /
41
+ PERCENT = "PERCENT",// %
42
+ POWER = "POWER",// ** (NEW in Pine — not ^)
43
+ EQ = "EQ",// ==
44
+ NEQ = "NEQ",// !=
45
+ LT = "LT",// <
46
+ GT = "GT",// >
47
+ LTE = "LTE",// <=
48
+ GTE = "GTE",// >=
49
+ ASSIGN = "ASSIGN",// =
50
+ REASSIGN = "REASSIGN",// :=
51
+ PLUS_ASSIGN = "PLUS_ASSIGN",// +=
52
+ MINUS_ASSIGN = "MINUS_ASSIGN",// -=
53
+ STAR_ASSIGN = "STAR_ASSIGN",// *=
54
+ SLASH_ASSIGN = "SLASH_ASSIGN",// /=
55
+ PERCENT_ASSIGN = "PERCENT_ASSIGN",// %=
56
+ LPAREN = "LPAREN",// (
57
+ RPAREN = "RPAREN",// )
58
+ LBRACKET = "LBRACKET",// [
59
+ RBRACKET = "RBRACKET",// ]
60
+ COMMA = "COMMA",// ,
61
+ DOT = "DOT",// .
62
+ COLON = "COLON",// :
63
+ QUESTION = "QUESTION",// ?
64
+ ARROW = "ARROW",// =>
65
+ NEWLINE = "NEWLINE",
66
+ INDENT = "INDENT",
67
+ DEDENT = "DEDENT",
68
+ EOF = "EOF",
69
+ COMMENT = "COMMENT",
70
+ COMPILER_ANNOTATION = "COMPILER_ANNOTATION"
71
+ }
72
+ /** Keywords map for fast lookup */
73
+ export declare const KEYWORDS: Record<string, TokenType>;
74
+ //# sourceMappingURL=TokenType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenType.d.ts","sourceRoot":"","sources":["../../src/lexer/TokenType.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,oBAAY,SAAS;IAEnB,MAAM,WAAoB;IAC1B,MAAM,WAAoB;IAC1B,aAAa,kBAAoB,CAAK,uBAAuB;IAG7D,UAAU,eAAoB;IAG9B,EAAE,OAAoB;IACtB,IAAI,SAAoB;IACxB,GAAG,QAAoB;IACvB,EAAE,OAAoB;IACtB,EAAE,OAAoB;IACtB,EAAE,OAAoB;IACtB,KAAK,UAAoB;IACzB,MAAM,WAAoB;IAC1B,GAAG,QAAoB;IACvB,KAAK,UAAoB;IACzB,IAAI,SAAoB;IACxB,KAAK,UAAoB;IACzB,EAAE,OAAoB;IACtB,GAAG,QAAoB;IACvB,EAAE,OAAoB;IACtB,GAAG,QAAoB;IACvB,MAAM,WAAoB;IAC1B,MAAM,WAAoB;IAC1B,IAAI,SAAoB;IACxB,MAAM,WAAoB;IAC1B,KAAK,UAAoB;IACzB,QAAQ,aAAoB;IAC5B,MAAM,WAAoB;IAG1B,SAAS,cAAoB;IAC7B,QAAQ,aAAoB;IAC5B,OAAO,YAAoB;IAG3B,IAAI,SAAoB,CAAW,IAAI;IACvC,KAAK,UAAoB,CAAU,IAAI;IACvC,IAAI,SAAoB,CAAW,IAAI;IACvC,KAAK,UAAoB,CAAU,IAAI;IACvC,OAAO,YAAoB,CAAQ,IAAI;IACvC,KAAK,UAAoB,CAAU,4BAA4B;IAG/D,EAAE,OAAoB,CAAa,KAAK;IACxC,GAAG,QAAoB,CAAY,KAAK;IACxC,EAAE,OAAoB,CAAY,IAAI;IACtC,EAAE,OAAoB,CAAY,IAAI;IACtC,GAAG,QAAoB,CAAW,KAAK;IACvC,GAAG,QAAoB,CAAW,KAAK;IAGvC,MAAM,WAAoB,CAAQ,IAAI;IACtC,QAAQ,aAAoB,CAAM,KAAK;IACvC,WAAW,gBAAoB,CAAG,KAAK;IACvC,YAAY,iBAAoB,CAAE,KAAK;IACvC,WAAW,gBAAoB,CAAG,KAAK;IACvC,YAAY,iBAAoB,CAAE,KAAK;IACvC,cAAc,mBAAoB,CAAE,KAAK;IAGzC,MAAM,WAAoB,CAAQ,IAAI;IACtC,MAAM,WAAoB,CAAQ,IAAI;IACtC,QAAQ,aAAoB,CAAM,IAAI;IACtC,QAAQ,aAAoB,CAAM,IAAI;IACtC,KAAK,UAAoB,CAAS,IAAI;IACtC,GAAG,QAAoB,CAAW,IAAI;IACtC,KAAK,UAAoB,CAAS,IAAI;IACtC,QAAQ,aAAoB,CAAM,IAAI;IACtC,KAAK,UAAoB,CAAS,KAAK;IAGvC,OAAO,YAAoB;IAC3B,MAAM,WAAoB;IAC1B,MAAM,WAAoB;IAC1B,GAAG,QAAoB;IAGvB,OAAO,YAAoB;IAC3B,mBAAmB,wBAAwB;CAC5C;AAED,mCAAmC;AACnC,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA0B9C,CAAA"}