oakscriptjs 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +53 -0
- package/README.md +1 -1
- package/bin/oakscript.mjs +5 -0
- package/dist/cjs/check/checks.d.ts +78 -0
- package/dist/cjs/check/checks.d.ts.map +1 -0
- package/dist/cjs/check/checks.js +109 -0
- package/dist/cjs/check/checks.js.map +7 -0
- package/dist/cjs/check/format.d.ts +26 -0
- package/dist/cjs/check/format.d.ts.map +1 -0
- package/dist/cjs/check/format.js +106 -0
- package/dist/cjs/check/format.js.map +7 -0
- package/dist/cjs/check/harness.d.ts +94 -0
- package/dist/cjs/check/harness.d.ts.map +1 -0
- package/dist/cjs/check/harness.js +302 -0
- package/dist/cjs/check/harness.js.map +7 -0
- package/dist/cjs/check/index.d.ts +253 -0
- package/dist/cjs/check/index.d.ts.map +1 -0
- package/dist/cjs/check/index.js +466 -0
- package/dist/cjs/check/index.js.map +7 -0
- package/dist/cjs/check/node.d.ts +53 -0
- package/dist/cjs/check/node.d.ts.map +1 -0
- package/dist/cjs/check/node.js +318 -0
- package/dist/cjs/check/node.js.map +7 -0
- package/dist/cjs/check/spec.d.ts +44 -0
- package/dist/cjs/check/spec.d.ts.map +1 -0
- package/dist/cjs/check/spec.js +199 -0
- package/dist/cjs/check/spec.js.map +7 -0
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/runtime/series.d.ts +6 -0
- package/dist/cjs/runtime/series.d.ts.map +1 -1
- package/dist/cjs/runtime/series.js +15 -0
- package/dist/cjs/runtime/series.js.map +2 -2
- package/dist/cjs/script/constants.d.ts +200 -0
- package/dist/cjs/script/constants.d.ts.map +1 -0
- package/dist/cjs/script/constants.js +217 -0
- package/dist/cjs/script/constants.js.map +7 -0
- package/dist/cjs/script/drawing-args.d.ts +25 -0
- package/dist/cjs/script/drawing-args.d.ts.map +1 -0
- package/dist/cjs/script/drawing-args.js +203 -0
- package/dist/cjs/script/drawing-args.js.map +7 -0
- package/dist/cjs/script/globals.d.ts +127 -0
- package/dist/cjs/script/globals.d.ts.map +1 -0
- package/dist/cjs/script/globals.js +17 -0
- package/dist/cjs/script/globals.js.map +7 -0
- package/dist/cjs/script/index.d.ts +499 -166
- package/dist/cjs/script/index.d.ts.map +1 -1
- package/dist/cjs/script/index.js +236 -96
- package/dist/cjs/script/index.js.map +3 -3
- package/dist/esm/check/checks.d.ts +78 -0
- package/dist/esm/check/checks.d.ts.map +1 -0
- package/dist/esm/check/checks.js +95 -0
- package/dist/esm/check/checks.js.map +1 -0
- package/dist/esm/check/format.d.ts +26 -0
- package/dist/esm/check/format.d.ts.map +1 -0
- package/dist/esm/check/format.js +105 -0
- package/dist/esm/check/format.js.map +1 -0
- package/dist/esm/check/harness.d.ts +94 -0
- package/dist/esm/check/harness.d.ts.map +1 -0
- package/dist/esm/check/harness.js +317 -0
- package/dist/esm/check/harness.js.map +1 -0
- package/dist/esm/check/index.d.ts +253 -0
- package/dist/esm/check/index.d.ts.map +1 -0
- package/dist/esm/check/index.js +470 -0
- package/dist/esm/check/index.js.map +1 -0
- package/dist/esm/check/node.d.ts +53 -0
- package/dist/esm/check/node.d.ts.map +1 -0
- package/dist/esm/check/node.js +347 -0
- package/dist/esm/check/node.js.map +1 -0
- package/dist/esm/check/spec.d.ts +44 -0
- package/dist/esm/check/spec.d.ts.map +1 -0
- package/dist/esm/check/spec.js +198 -0
- package/dist/esm/check/spec.js.map +1 -0
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/runtime/series.d.ts +6 -0
- package/dist/esm/runtime/series.d.ts.map +1 -1
- package/dist/esm/runtime/series.js +14 -0
- package/dist/esm/runtime/series.js.map +1 -1
- package/dist/esm/script/constants.d.ts +200 -0
- package/dist/esm/script/constants.d.ts.map +1 -0
- package/dist/esm/script/constants.js +151 -0
- package/dist/esm/script/constants.js.map +1 -0
- package/dist/esm/script/drawing-args.d.ts +25 -0
- package/dist/esm/script/drawing-args.d.ts.map +1 -0
- package/dist/esm/script/drawing-args.js +171 -0
- package/dist/esm/script/drawing-args.js.map +1 -0
- package/dist/esm/script/globals.d.ts +127 -0
- package/dist/esm/script/globals.d.ts.map +1 -0
- package/dist/esm/script/globals.js +28 -0
- package/dist/esm/script/globals.js.map +1 -0
- package/dist/esm/script/index.d.ts +499 -166
- package/dist/esm/script/index.d.ts.map +1 -1
- package/dist/esm/script/index.js +256 -83
- package/dist/esm/script/index.js.map +1 -1
- package/package.json +33 -1
- package/skills/oakscript/SKILL.md +198 -0
- package/skills/oakscript/examples/ma-cross-strategy.js +57 -0
- package/skills/oakscript/examples/ma-cross.js +34 -0
- package/skills/oakscript/examples/macd-oscillator.js +29 -0
- package/skills/oakscript/examples/mtf-trend-filter.js +46 -0
- package/skills/oakscript/reference/check.md +150 -0
- package/skills/oakscript/reference/errors.md +92 -0
- package/skills/oakscript/reference/pine-differences.md +85 -0
- package/skills/oakscript/reference/plotting.md +199 -0
- package/skills/oakscript/reference/script-structure.md +185 -0
- package/skills/oakscript/reference/strategies.md +140 -0
- package/skills/oakscript/reference/timeframes-symbols.md +97 -0
- package/skills/oakscript/spec.schema.json +199 -0
- package/src/check/checks.ts +175 -0
- package/src/check/format.ts +117 -0
- package/src/check/harness.ts +372 -0
- package/src/check/index.ts +708 -0
- package/src/check/node.ts +368 -0
- package/src/check/spec.ts +200 -0
- package/src/index.ts +1 -1
- package/src/runtime/series.ts +19 -0
- package/src/script/constants.ts +169 -0
- package/src/script/drawing-args.ts +179 -0
- package/src/script/globals.ts +129 -0
- package/src/script/index.ts +457 -81
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/check/spec.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * @fileoverview The spec of a check (what the user asked for), described once: {@link validateSpec} rejects unknown\n * keys and wrong values (a misspelt key would otherwise be skipped and the check would pass without checking it), and\n * {@link specJsonSchema} gives the JSON Schema of a spec file (`skills/oakscript/spec.schema.json`).\n *\n * @module check/spec\n */\n\ntype Field =\n | { kind: 'string' | 'number' | 'boolean' | 'any' | 'string[]'; doc: string }\n | { kind: 'enum'; values: readonly string[]; doc: string }\n | { kind: 'object'; fields: Record<string, Field>; doc: string; required?: readonly string[] }\n | { kind: 'map'; of: Field; doc: string }\n | { kind: 'outputs'; doc: string };\n\nconst num = (doc: string): Field => ({ kind: 'number', doc });\n\nexport const INPUT_TYPES = ['int', 'float', 'bool', 'string', 'text_area', 'source', 'color', 'timeframe', 'session', 'time', 'symbol'] as const;\nexport const OUTPUT_KINDS = ['plot', 'shape', 'char', 'arrow', 'candle', 'bar', 'hline', 'bgcolor', 'barcolor', 'alertcondition'] as const;\n\n/** The keys of a spec checked by checkScript. */\nexport const SPEC_FIELDS: Record<string, Field> = {\n kind: { kind: 'enum', values: ['indicator', 'strategy'], doc: 'indicator() or strategy()' },\n title: { kind: 'string', doc: 'the title of the declaration' },\n overlay: { kind: 'boolean', doc: 'true: price pane, false: own pane' },\n inputs: {\n kind: 'map',\n doc: 'inputs that must exist, by id or title',\n of: {\n kind: 'object',\n doc: 'the expected input',\n fields: {\n type: { kind: 'enum', values: INPUT_TYPES, doc: 'input type' },\n defval: { kind: 'any', doc: 'default value' },\n title: { kind: 'string', doc: 'title' },\n min: num('minval'),\n max: num('maxval'),\n options: { kind: 'string[]', doc: 'the choices of a string input' },\n },\n },\n },\n outputs: { kind: 'outputs', doc: 'outputs that must exist: a title, or { title, kind }' },\n plots: {\n kind: 'map',\n doc: 'value checks per plot, by id or title',\n of: {\n kind: 'object',\n doc: 'the expected values',\n fields: { min: num('every value is at least this'), max: num('every value is at most this'), warmup: num('the first value comes at this bar index or before') },\n },\n },\n signals: {\n kind: 'map',\n doc: 'count checks per signal (shape, char, arrow, alertcondition, bgcolor, barcolor), by id or title',\n of: {\n kind: 'object',\n doc: 'the expected count',\n fields: {\n min: num('at least this many bars'),\n max: num('at most this many bars'),\n minShare: num('at least this share of the bars (0 to 1)'),\n maxShare: num('at most this share of the bars (0 to 1)'),\n },\n },\n },\n trades: { kind: 'object', doc: 'closed trades of a strategy', fields: { min: num('at least'), max: num('at most') } },\n};\n\n/** The keys of a spec file read by the `oakscript check` command (paths relative to the spec file). */\nexport const SPEC_FILE_FIELDS: Record<string, Field> = {\n $schema: { kind: 'string', doc: 'the JSON Schema of the spec (oakscriptjs/skills/oakscript/spec.schema.json)' },\n reference: { kind: 'string', doc: 'CSV of expected values per bar (a time column, one column per plot)' },\n export: { kind: 'string', doc: 'chart export CSV: the bars (time, open, high, low, close, volume) and the expected plot values' },\n tolerance: num('relative tolerance of the reference values (default 1e-10)'),\n checks: { kind: 'string', doc: 'JavaScript file of behaviour checks (the body of a function of `t`)' },\n scenarios: { kind: 'boolean', doc: 'also run on the built-in edge-case bars' },\n};\n\nfunction closest(name: string, names: string[]): string | undefined {\n const dist = (a: string, b: string): number => {\n const row = Array.from({ length: b.length + 1 }, (_, j) => j);\n for (let i = 1; i <= a.length; i++) {\n let diag = row[0]!;\n row[0] = i;\n for (let j = 1; j <= b.length; j++) {\n const up = row[j]!;\n row[j] = Math.min(up + 1, row[j - 1]! + 1, diag + (a[i - 1] === b[j - 1] ? 0 : 1));\n diag = up;\n }\n }\n return row[b.length]!;\n };\n const n = name.toLowerCase();\n const best = names.map((k) => ({ k, d: dist(n, k.toLowerCase()) })).sort((a, b) => a.d - b.d)[0];\n if (!best) return undefined;\n return best.d <= Math.max(2, Math.floor(name.length / 2)) || best.k.toLowerCase().startsWith(n.slice(0, 3)) ? best.k : undefined;\n}\n\nfunction check(value: unknown, field: Field, path: string, errors: string[]): void {\n const fail = (what: string): void => {\n errors.push(`${path}: ${what}`);\n };\n switch (field.kind) {\n case 'any':\n return;\n case 'string':\n case 'number':\n case 'boolean':\n if (typeof value !== field.kind || (field.kind === 'number' && !Number.isFinite(value))) fail(`expected a ${field.kind}, got ${JSON.stringify(value)}`);\n return;\n case 'string[]':\n if (!Array.isArray(value) || value.some((v) => typeof v !== 'string')) fail(`expected an array of strings, got ${JSON.stringify(value)}`);\n return;\n case 'enum':\n if (typeof value !== 'string' || !field.values.includes(value)) fail(`expected one of ${field.values.join(', ')}, got ${JSON.stringify(value)}`);\n return;\n case 'outputs':\n if (!Array.isArray(value)) return fail('expected an array of titles or { title, kind }');\n value.forEach((o, k) => {\n if (typeof o === 'string') return;\n check(o, { kind: 'object', doc: '', required: ['title'], fields: { title: { kind: 'string', doc: '' }, kind: { kind: 'enum', values: OUTPUT_KINDS, doc: '' } } }, `${path}[${k}]`, errors);\n });\n return;\n case 'map':\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return fail('expected an object (name -> checks)');\n for (const [k, v] of Object.entries(value)) check(v, field.of, `${path}.${k}`, errors);\n return;\n case 'object': {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return fail('expected an object');\n const keys = Object.keys(field.fields);\n for (const [k, v] of Object.entries(value)) {\n const f = field.fields[k];\n if (!f) {\n const near = closest(k, keys);\n fail(`unknown key \"${k}\"${near ? ` (did you mean \"${near}\"?)` : ''}; the keys are ${keys.join(', ')}`);\n } else check(v, f, `${path}.${k}`, errors);\n }\n for (const r of field.required ?? []) if (!(r in (value as object))) fail(`\"${r}\" is required`);\n return;\n }\n }\n}\n\n/**\n * The problems of a spec: unknown keys (with the closest key) and wrong values, one message per problem; empty when the\n * spec is valid. `file`: also accept the keys of a spec file (reference, export, tolerance, checks, scenarios).\n */\nexport function validateSpec(spec: unknown, options: { file?: boolean } = {}): string[] {\n const errors: string[] = [];\n const fields = options.file ? { ...SPEC_FIELDS, ...SPEC_FILE_FIELDS } : SPEC_FIELDS;\n check(spec, { kind: 'object', doc: '', fields }, 'spec', errors);\n return errors;\n}\n\nfunction schemaOf(field: Field): Record<string, unknown> {\n const description = field.doc ? { description: field.doc } : {};\n switch (field.kind) {\n case 'any':\n return { ...description };\n case 'string':\n case 'number':\n case 'boolean':\n return { type: field.kind, ...description };\n case 'string[]':\n return { type: 'array', items: { type: 'string' }, ...description };\n case 'enum':\n return { enum: [...field.values], ...description };\n case 'outputs':\n return {\n type: 'array',\n ...description,\n items: {\n oneOf: [\n { type: 'string' },\n { type: 'object', additionalProperties: false, required: ['title'], properties: { title: { type: 'string' }, kind: { enum: [...OUTPUT_KINDS] } } },\n ],\n },\n };\n case 'map':\n return { type: 'object', ...description, additionalProperties: schemaOf(field.of) };\n case 'object':\n return {\n type: 'object',\n ...description,\n additionalProperties: false,\n ...(field.required ? { required: [...field.required] } : {}),\n properties: Object.fromEntries(Object.entries(field.fields).map(([k, f]) => [k, schemaOf(f)])),\n };\n }\n}\n\n/** JSON Schema (draft 2020-12) of a spec file of `oakscript check`. */\nexport function specJsonSchema(): Record<string, unknown> {\n return {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n title: 'oakscript check spec',\n description: 'What the user asked for, checked by `oakscript check --spec`: every given entry is checked, an unknown key is an error.',\n ...schemaOf({ kind: 'object', doc: '', fields: { ...SPEC_FIELDS, ...SPEC_FILE_FIELDS } }),\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -65,7 +65,7 @@ export type * from './strategy/index.js';
|
|
|
65
65
|
export { LightweightChartsAdapter } from './runtime/adapters/LightweightChartsAdapter.js';
|
|
66
66
|
export type { LightweightSeriesDefinitions } from './runtime/adapters/LightweightChartsAdapter.js';
|
|
67
67
|
export { SimpleInputAdapter } from './runtime/adapters/SimpleInputAdapter.js';
|
|
68
|
-
export declare const VERSION = "0.
|
|
68
|
+
export declare const VERSION = "0.14.0";
|
|
69
69
|
/**
|
|
70
70
|
* Library information
|
|
71
71
|
*/
|
package/dist/cjs/index.js
CHANGED
|
@@ -208,7 +208,7 @@ var import_input_active = require("./runtime/input-active.js");
|
|
|
208
208
|
var import_strategy = require("./strategy/index.js");
|
|
209
209
|
var import_LightweightChartsAdapter = require("./runtime/adapters/LightweightChartsAdapter.js");
|
|
210
210
|
var import_SimpleInputAdapter = require("./runtime/adapters/SimpleInputAdapter.js");
|
|
211
|
-
const VERSION = "0.
|
|
211
|
+
const VERSION = "0.14.0";
|
|
212
212
|
const info = {
|
|
213
213
|
name: "OakScriptJS",
|
|
214
214
|
version: VERSION,
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * OakScriptJS - Simplified PineScript-like library for JavaScript\n *\n * This library provides Series-based lazy evaluation and technical analysis functions\n * for building trading indicators. The PineScript-style script API is in `oakscriptjs/script`.\n *\n * Key features:\n * - Series class for lazy evaluation and method chaining\n * - Core TA functions (array-based)\n * - TA-Series wrappers (Series-based)\n *\n * @packageDocumentation\n */\n\n// Export all types\nexport * from './types/index.js';\nexport * from './types/metadata.js';\n\n// Export core namespaces (array-based functions)\nimport * as taCore from './ta/index.js';\nimport * as math from './math/index.js';\nimport * as array from './array/index.js';\nimport * as map from './map/index.js';\nimport * as str from './str/index.js';\nimport * as color from './color/index.js';\nimport * as time from './time/index.js';\nimport * as timeframe from './timeframe/index.js';\nimport * as matrix from './matrix/index.js';\nimport * as line from './line/index.js';\nimport * as box from './box/index.js';\nimport * as label from './label/index.js';\nimport * as linefill from './linefill/index.js';\nimport * as chartPoint from './chartpoint/index.js';\nimport * as polyline from './polyline/index.js';\nimport * as table from './table/index.js';\nimport * as text from './text/index.js';\nimport * as compare from './compare/index.js';\nimport * as callsite from './callsite/index.js';\n\nexport { taCore, math, array, map, str, color, time, timeframe, matrix, line, box, label, linefill, chartPoint, polyline, table, text, compare, callsite };\n\n// Renderable drawings (IndicatorResult labels, lines, boxes, linefills, polylines, tables) and future bar times\nexport { drawingOutputs, type DrawingOutputs } from './drawing/output.js';\nexport { barInterval, barTime } from './drawing/bar-time.js';\n\n// Drawing registry limits (PineScript indicator(max_lines_count / max_labels_count / max_boxes_count / max_polylines_count))\nexport {\n resetDrawings,\n setDrawingLimits,\n setDrawingBar,\n holdDrawing,\n releaseDrawing,\n varDrawing,\n createdDrawingKinds,\n type DrawingKind,\n type DrawingLimits,\n type DrawingVariable,\n} from './drawing/registry.js';\n\n// The session of a chart context without a script run: time(tf, session, timezone), time_close(...), time_tradingday,\n// session.* flags, request.security periods with the session and holidays, and bars after the last bar on the trading\n// calendar\nexport {\n chartSessions,\n sessionPeriods,\n periodTime,\n periodClose,\n tradingDayTime,\n chartSessionFlags,\n resampleSession,\n barTimeAfter,\n barsUntil,\n type SessionContext,\n type ChartSessions,\n type SessionPeriods,\n type SessionResample,\n} from './session/context.js';\nexport { TradingCalendar, type SessionSpec } from './session/calendar.js';\nexport { SessionBars, sessionFlags, type SessionFlags } from './session/bars.js';\n\n// Same-symbol request.security on a higher timeframe (completion and lookahead rules) and ticker.heikinashi\nexport { resample, periodsOf, afterCompletion, mapToChart, heikinAshi, type Resampled } from './security/resample.js';\n// request.security of another symbol: which bar of the other symbol each chart bar shows (#179)\nexport {\n securityOther,\n securityOtherValues,\n securityLowerTf,\n type OtherSymbolChart,\n type OtherSymbolOptions,\n type SymbolCalendar,\n} from './security/other.js';\n\n// Export Series class (self-contained, no context)\nexport { Series, BarData } from './runtime/series.js';\nexport type { SeriesExtractor } from './runtime/series.js';\n\n// Export TA-Series namespace (Series-based wrappers)\nimport * as ta from './ta-series.js';\nexport { ta };\n\n// Export metadata types for indicator return values\nexport type {\n PlotOptions,\n HLineOptions,\n FillOptions,\n InputMetadata,\n PlotMetadata,\n IndicatorMetadata,\n TimeValue,\n PlotData,\n HLineData,\n FillData,\n FillGradient,\n IndicatorResult,\n IndicatorFactory,\n PlotStyle,\n LineStyle,\n PlotDisplay,\n InputType\n} from './types/metadata.js';\n\n// Re-export commonly used functions for convenience\nexport { sma, ema, rsi, macd, bb, stdev, crossover, crossunder, change, tr, atr, cum, vwap } from './ta-series.js';\nexport { abs, ceil, floor, round, max, min, avg, sum, sqrt, pow, exp, log, sin, cos, tan } from './math/index.js';\nexport { rgb, from_hex as color_from_hex, new_color } from './color/index.js';\n\n// Export chart data utilities\nexport { ohlcFromBars, getClose, getHigh, getLow, getOpen, getSource, getSourceSeries, at, div } from './utils/index.js';\nexport { setSourceResolver, externalSource, BUILTIN_SOURCES, type SourceResolver } from './utils/source-resolver.js';\n\n// Export libraries (ZigZag, etc.)\nexport * from './lib/index.js';\n\n// Export helper functions for generated indicators (PineScript compatibility)\nexport {isNA as na, nz, fixnan} from './utils/index.js';\n\n// Export indicator infrastructure\nexport {\n indicator,\n type IndicatorMetadataConfig,\n type InputDefinition,\n type IndicatorContext,\n type IndicatorInstance,\n type IndicatorConstructor,\n} from './indicator.js';\n\nexport {\n input,\n type InputValue,\n type IntInputOptions,\n type FloatInputOptions,\n type SourceInputOptions,\n type BoolInputOptions,\n type StringInputOptions,\n type TimeInputOptions,\n type SourceType,\n} from './input.js';\n\nexport {\n plot as plotHelper,\n createPlot,\n type Time,\n type TimeValuePair,\n type PlotOptions as PlotHelperOptions,\n type PlotResult,\n} from './plot.js';\n\n// Runtime exports - global context runtime (setContext, plot, hline) drawing through a ChartAdapter\nexport {\n setContext,\n clearContext,\n getContext,\n registerCalculate,\n recalculate,\n plot,\n hline,\n clearPlots,\n} from './runtime/runtime.js';\n\nexport {\n input_int,\n input_float,\n input_bool,\n input_string,\n input_text_area,\n input_source,\n input_timeframe,\n input_session,\n input_symbol,\n input_time,\n} from './runtime/inputs.js';\nexport { isInputActive } from './runtime/input-active.js';\n\nexport type {\n OakScriptContext,\n ChartAdapter,\n InputAdapter,\n SeriesHandle,\n SeriesOptions,\n InputConfig,\n InputCondition,\n InputOptions,\n OhlcvData,\n PlotConfig,\n HLineConfig,\n FillConfig,\n ArrowConfig,\n CandleConfig,\n ShapeConfig,\n BarColorConfig,\n} from './runtime/types.js';\n\n// Strategy types and constants (the script API forwards strategy.* calls to a host engine)\nexport {\n STRATEGY_CONSTANTS,\n STRATEGY_DEFAULTS,\n STRATEGY_NUMBER_VARIABLES,\n STRATEGY_TEXT_VARIABLES,\n} from './strategy/index.js';\nexport type * from './strategy/index.js';\n\nexport { LightweightChartsAdapter } from './runtime/adapters/LightweightChartsAdapter.js';\nexport type { LightweightSeriesDefinitions } from './runtime/adapters/LightweightChartsAdapter.js';\nexport { SimpleInputAdapter } from './runtime/adapters/SimpleInputAdapter.js';\n\n// Version\nexport const VERSION = '0.
|
|
4
|
+
"sourcesContent": ["/**\n * OakScriptJS - Simplified PineScript-like library for JavaScript\n *\n * This library provides Series-based lazy evaluation and technical analysis functions\n * for building trading indicators. The PineScript-style script API is in `oakscriptjs/script`.\n *\n * Key features:\n * - Series class for lazy evaluation and method chaining\n * - Core TA functions (array-based)\n * - TA-Series wrappers (Series-based)\n *\n * @packageDocumentation\n */\n\n// Export all types\nexport * from './types/index.js';\nexport * from './types/metadata.js';\n\n// Export core namespaces (array-based functions)\nimport * as taCore from './ta/index.js';\nimport * as math from './math/index.js';\nimport * as array from './array/index.js';\nimport * as map from './map/index.js';\nimport * as str from './str/index.js';\nimport * as color from './color/index.js';\nimport * as time from './time/index.js';\nimport * as timeframe from './timeframe/index.js';\nimport * as matrix from './matrix/index.js';\nimport * as line from './line/index.js';\nimport * as box from './box/index.js';\nimport * as label from './label/index.js';\nimport * as linefill from './linefill/index.js';\nimport * as chartPoint from './chartpoint/index.js';\nimport * as polyline from './polyline/index.js';\nimport * as table from './table/index.js';\nimport * as text from './text/index.js';\nimport * as compare from './compare/index.js';\nimport * as callsite from './callsite/index.js';\n\nexport { taCore, math, array, map, str, color, time, timeframe, matrix, line, box, label, linefill, chartPoint, polyline, table, text, compare, callsite };\n\n// Renderable drawings (IndicatorResult labels, lines, boxes, linefills, polylines, tables) and future bar times\nexport { drawingOutputs, type DrawingOutputs } from './drawing/output.js';\nexport { barInterval, barTime } from './drawing/bar-time.js';\n\n// Drawing registry limits (PineScript indicator(max_lines_count / max_labels_count / max_boxes_count / max_polylines_count))\nexport {\n resetDrawings,\n setDrawingLimits,\n setDrawingBar,\n holdDrawing,\n releaseDrawing,\n varDrawing,\n createdDrawingKinds,\n type DrawingKind,\n type DrawingLimits,\n type DrawingVariable,\n} from './drawing/registry.js';\n\n// The session of a chart context without a script run: time(tf, session, timezone), time_close(...), time_tradingday,\n// session.* flags, request.security periods with the session and holidays, and bars after the last bar on the trading\n// calendar\nexport {\n chartSessions,\n sessionPeriods,\n periodTime,\n periodClose,\n tradingDayTime,\n chartSessionFlags,\n resampleSession,\n barTimeAfter,\n barsUntil,\n type SessionContext,\n type ChartSessions,\n type SessionPeriods,\n type SessionResample,\n} from './session/context.js';\nexport { TradingCalendar, type SessionSpec } from './session/calendar.js';\nexport { SessionBars, sessionFlags, type SessionFlags } from './session/bars.js';\n\n// Same-symbol request.security on a higher timeframe (completion and lookahead rules) and ticker.heikinashi\nexport { resample, periodsOf, afterCompletion, mapToChart, heikinAshi, type Resampled } from './security/resample.js';\n// request.security of another symbol: which bar of the other symbol each chart bar shows (#179)\nexport {\n securityOther,\n securityOtherValues,\n securityLowerTf,\n type OtherSymbolChart,\n type OtherSymbolOptions,\n type SymbolCalendar,\n} from './security/other.js';\n\n// Export Series class (self-contained, no context)\nexport { Series, BarData } from './runtime/series.js';\nexport type { SeriesExtractor } from './runtime/series.js';\n\n// Export TA-Series namespace (Series-based wrappers)\nimport * as ta from './ta-series.js';\nexport { ta };\n\n// Export metadata types for indicator return values\nexport type {\n PlotOptions,\n HLineOptions,\n FillOptions,\n InputMetadata,\n PlotMetadata,\n IndicatorMetadata,\n TimeValue,\n PlotData,\n HLineData,\n FillData,\n FillGradient,\n IndicatorResult,\n IndicatorFactory,\n PlotStyle,\n LineStyle,\n PlotDisplay,\n InputType\n} from './types/metadata.js';\n\n// Re-export commonly used functions for convenience\nexport { sma, ema, rsi, macd, bb, stdev, crossover, crossunder, change, tr, atr, cum, vwap } from './ta-series.js';\nexport { abs, ceil, floor, round, max, min, avg, sum, sqrt, pow, exp, log, sin, cos, tan } from './math/index.js';\nexport { rgb, from_hex as color_from_hex, new_color } from './color/index.js';\n\n// Export chart data utilities\nexport { ohlcFromBars, getClose, getHigh, getLow, getOpen, getSource, getSourceSeries, at, div } from './utils/index.js';\nexport { setSourceResolver, externalSource, BUILTIN_SOURCES, type SourceResolver } from './utils/source-resolver.js';\n\n// Export libraries (ZigZag, etc.)\nexport * from './lib/index.js';\n\n// Export helper functions for generated indicators (PineScript compatibility)\nexport {isNA as na, nz, fixnan} from './utils/index.js';\n\n// Export indicator infrastructure\nexport {\n indicator,\n type IndicatorMetadataConfig,\n type InputDefinition,\n type IndicatorContext,\n type IndicatorInstance,\n type IndicatorConstructor,\n} from './indicator.js';\n\nexport {\n input,\n type InputValue,\n type IntInputOptions,\n type FloatInputOptions,\n type SourceInputOptions,\n type BoolInputOptions,\n type StringInputOptions,\n type TimeInputOptions,\n type SourceType,\n} from './input.js';\n\nexport {\n plot as plotHelper,\n createPlot,\n type Time,\n type TimeValuePair,\n type PlotOptions as PlotHelperOptions,\n type PlotResult,\n} from './plot.js';\n\n// Runtime exports - global context runtime (setContext, plot, hline) drawing through a ChartAdapter\nexport {\n setContext,\n clearContext,\n getContext,\n registerCalculate,\n recalculate,\n plot,\n hline,\n clearPlots,\n} from './runtime/runtime.js';\n\nexport {\n input_int,\n input_float,\n input_bool,\n input_string,\n input_text_area,\n input_source,\n input_timeframe,\n input_session,\n input_symbol,\n input_time,\n} from './runtime/inputs.js';\nexport { isInputActive } from './runtime/input-active.js';\n\nexport type {\n OakScriptContext,\n ChartAdapter,\n InputAdapter,\n SeriesHandle,\n SeriesOptions,\n InputConfig,\n InputCondition,\n InputOptions,\n OhlcvData,\n PlotConfig,\n HLineConfig,\n FillConfig,\n ArrowConfig,\n CandleConfig,\n ShapeConfig,\n BarColorConfig,\n} from './runtime/types.js';\n\n// Strategy types and constants (the script API forwards strategy.* calls to a host engine)\nexport {\n STRATEGY_CONSTANTS,\n STRATEGY_DEFAULTS,\n STRATEGY_NUMBER_VARIABLES,\n STRATEGY_TEXT_VARIABLES,\n} from './strategy/index.js';\nexport type * from './strategy/index.js';\n\nexport { LightweightChartsAdapter } from './runtime/adapters/LightweightChartsAdapter.js';\nexport type { LightweightSeriesDefinitions } from './runtime/adapters/LightweightChartsAdapter.js';\nexport { SimpleInputAdapter } from './runtime/adapters/SimpleInputAdapter.js';\n\n// Version\nexport const VERSION = '0.14.0';\n\n/**\n * Library information\n */\nexport const info = {\n name: 'OakScriptJS',\n version: VERSION,\n description: 'Simplified PineScript-like library - Series + TA functions',\n features: {\n series: 'Lazy evaluation with Series class',\n ta: 'Technical analysis functions (Series and array-based)',\n script: 'PineScript-style script API (oakscriptjs/script): indicator, strategy, inputs, plots, request.security',\n runtime: 'Global context runtime drawing through a ChartAdapter',\n indicator: 'Indicator function with automatic pane management'\n },\n namespaces: {\n core: ['ta', 'math', 'array', 'map', 'str', 'color', 'time', 'timeframe', 'matrix'],\n drawing: ['line', 'box', 'label', 'linefill', 'chartPoint', 'polyline', 'table', 'text'],\n runtime: ['setContext', 'plot', 'hline', 'input_*'],\n indicator: ['indicator', 'input', 'plotHelper', 'createPlot']\n }\n};\n\n// PineScript compatibility stubs - functions that have no runtime effect\n// These are no-ops so that PineScript-style code runs without modification\n\n/**\n * alertcondition() - Stub for PineScript alert configuration\n * In PineScript, this registers an alert condition. In oakscriptjs, it's a no-op\n * since alert configuration is handled by the host application.\n */\nexport function alertcondition(_condition: unknown, _title?: string, _message?: string): void {\n // No-op: Alert conditions are handled by the host application\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA,0BAAc,6BAfd;AAgBA,0BAAc,gCAhBd;AAmBA,aAAwB;AACxB,WAAsB;AACtB,YAAuB;AACvB,UAAqB;AACrB,UAAqB;AACrB,YAAuB;AACvB,WAAsB;AACtB,gBAA2B;AAC3B,aAAwB;AACxB,WAAsB;AACtB,UAAqB;AACrB,YAAuB;AACvB,eAA0B;AAC1B,iBAA4B;AAC5B,eAA0B;AAC1B,YAAuB;AACvB,WAAsB;AACtB,cAAyB;AACzB,eAA0B;AAK1B,oBAAoD;AACpD,sBAAqC;AAGrC,sBAWO;AAKP,qBAcO;AACP,sBAAkD;AAClD,kBAA6D;AAG7D,sBAA6F;AAE7F,mBAOO;AAGP,oBAAgC;AAIhC,SAAoB;AAyBpB,uBAAkG;AAClG,kBAAgG;AAChG,mBAA2D;AAG3D,mBAAsG;AACtG,6BAAwF;AAGxF,0BAAc,2BAnId;AAsIA,IAAAA,gBAAqC;AAGrC,uBAOO;AAEP,mBAUO;AAEP,kBAOO;AAGP,qBASO;AAEP,oBAWO;AACP,0BAA8B;AAsB9B,sBAKO;AAGP,sCAAyC;AAEzC,gCAAmC;AAG5B,MAAM,UAAU;AAKhB,MAAM,OAAO;AAAA,EAClB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,YAAY;AAAA,IACV,MAAM,CAAC,MAAM,QAAQ,SAAS,OAAO,OAAO,SAAS,QAAQ,aAAa,QAAQ;AAAA,IAClF,SAAS,CAAC,QAAQ,OAAO,SAAS,YAAY,cAAc,YAAY,SAAS,MAAM;AAAA,IACvF,SAAS,CAAC,cAAc,QAAQ,SAAS,SAAS;AAAA,IAClD,WAAW,CAAC,aAAa,SAAS,cAAc,YAAY;AAAA,EAC9D;AACF;AAUO,SAAS,eAAe,YAAqB,QAAiB,UAAyB;AAE9F;",
|
|
6
6
|
"names": ["import_utils"]
|
|
7
7
|
}
|
|
@@ -363,6 +363,12 @@ export declare class Series {
|
|
|
363
363
|
* Convert series to time-value pairs for charting
|
|
364
364
|
* @returns Array of { time, value } objects
|
|
365
365
|
*/
|
|
366
|
+
/**
|
|
367
|
+
* A Series holds the values of all the bars, so JavaScript operators cannot use it: without this guard
|
|
368
|
+
* `close - open` is NaN, `close > open` false and `` `${rsi}` `` "[object Object]", with no error. The
|
|
369
|
+
* conversion throws instead, with the Series method or bar-loop read to use.
|
|
370
|
+
*/
|
|
371
|
+
[Symbol.toPrimitive](hint: 'number' | 'string' | 'default'): never;
|
|
366
372
|
toTimeValuePairs(): Array<{
|
|
367
373
|
time: any;
|
|
368
374
|
value: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"series.d.ts","sourceRoot":"","sources":["../../../src/runtime/series.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"series.d.ts","sourceRoot":"","sources":["../../../src/runtime/series.ts"],"names":[],"mappings":"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"}
|
|
@@ -562,6 +562,21 @@ class Series {
|
|
|
562
562
|
* Convert series to time-value pairs for charting
|
|
563
563
|
* @returns Array of { time, value } objects
|
|
564
564
|
*/
|
|
565
|
+
/**
|
|
566
|
+
* A Series holds the values of all the bars, so JavaScript operators cannot use it: without this guard
|
|
567
|
+
* `close - open` is NaN, `close > open` false and `` `${rsi}` `` "[object Object]", with no error. The
|
|
568
|
+
* conversion throws instead, with the Series method or bar-loop read to use.
|
|
569
|
+
*/
|
|
570
|
+
[Symbol.toPrimitive](hint) {
|
|
571
|
+
if (hint === "string") {
|
|
572
|
+
throw new TypeError(
|
|
573
|
+
"A Series is not a text: read the value of one bar inside eachBar(), e.g. str.tostring(c.get(rsi)), or pass the Series itself to plot() / plotshape()."
|
|
574
|
+
);
|
|
575
|
+
}
|
|
576
|
+
throw new TypeError(
|
|
577
|
+
"JavaScript operators (+ - * / % ** < > <= >= ==) do not work on a Series: use its methods, a.add(b) a.sub(b) a.mul(b) a.div(b) a.mod(b) a.pow(b) a.neg(), a.gt(b) a.gte(b) a.lt(b) a.lte(b) a.eq(b) a.neq(b), a.and(b) a.or(b) a.not(), cond.iff(x, y), a.offset(1) for a[1]; or read numbers inside eachBar() with c.get(a)."
|
|
578
|
+
);
|
|
579
|
+
}
|
|
565
580
|
toTimeValuePairs() {
|
|
566
581
|
const values = this.toArray();
|
|
567
582
|
const bars = this.dataSource.bars;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/runtime/series.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Simplified Series class for lazy time-series computation\n * Represents a time-series of values with lazy evaluation\n * @module runtime/series\n */\n\nimport * as compare from '../compare/index.js';\nimport type { Bar } from '../types/index.js';\n\n/**\n * Function that computes a value for each bar\n */\nexport type SeriesExtractor = (bar: Bar, index: number, data: Bar[]) => number;\n\n/**\n * BarData - Versioned wrapper around Bar[] array for cache invalidation\n * \n * This class wraps a Bar[] array and tracks a version number that increments\n * whenever the data is mutated. Series objects reference this to detect when\n * their cached values need to be recomputed.\n * \n * @example\n * ```typescript\n * const barData = new BarData(bars);\n * const close = Series.fromBars(barData, 'close');\n * const values1 = close.toArray(); // Computes and caches\n * \n * barData.push(newBar); // Increments version\n * const values2 = close.toArray(); // Detects stale cache, recomputes\n * ```\n */\nexport class BarData {\n private _bars: Bar[];\n private _version: number = 0;\n\n /**\n * Create a new BarData wrapper\n * @param bars - Initial bar data (defaults to empty array)\n */\n constructor(bars: Bar[] = []) {\n this._bars = bars;\n }\n\n /**\n * Get the current version number\n * Version increments whenever data is mutated\n */\n get version(): number {\n return this._version;\n }\n\n /**\n * Get the underlying bar array\n * Note: Direct mutations to this array will NOT increment version\n * Use the provided mutation methods instead\n */\n get bars(): Bar[] {\n return this._bars;\n }\n\n /**\n * Get the number of bars\n */\n get length(): number {\n return this._bars.length;\n }\n\n /**\n * Add a new bar to the end\n * @param bar - Bar to add\n */\n push(bar: Bar): void {\n this._bars.push(bar);\n this._version++;\n }\n\n /**\n * Remove and return the last bar\n * @returns The removed bar, or undefined if empty\n */\n pop(): Bar | undefined {\n const bar = this._bars.pop();\n if (bar !== undefined) {\n this._version++;\n }\n return bar;\n }\n\n /**\n * Replace a bar at a specific index\n * @param index - Index to update\n * @param bar - New bar data\n */\n set(index: number, bar: Bar): void {\n if (index >= 0 && index < this._bars.length) {\n this._bars[index] = bar;\n this._version++;\n }\n }\n\n /**\n * Update the last bar (useful for real-time/streaming updates)\n * @param bar - New bar data\n */\n updateLast(bar: Bar): void {\n if (this._bars.length > 0) {\n this._bars[this._bars.length - 1] = bar;\n this._version++;\n }\n }\n\n /**\n * Replace all bars with new data\n * @param bars - New bar array\n */\n setAll(bars: Bar[]): void {\n this._bars = bars;\n this._version++;\n }\n\n /**\n * Manually increment version (for advanced use cases)\n * Call this after direct mutations to the bars array\n */\n invalidate(): void {\n this._version++;\n }\n\n /**\n * Get a bar at a specific index\n * @param index - Bar index\n * @returns Bar at that index, or undefined\n */\n at(index: number): Bar | undefined {\n return this._bars[index];\n }\n\n /**\n * Create a BarData from an existing Bar array\n * @param bars - Bar array\n * @returns New BarData instance\n */\n static from(bars: Bar[]): BarData {\n return new BarData(bars);\n }\n}\n\n/**\n * Series - represents a time-series of values with lazy evaluation\n *\n * Series are lazy - they don't compute values until needed.\n * Operations on Series return new Series with composed extractors.\n *\n * Now supports automatic cache invalidation via BarData versioning\n * and memory-efficient closure chain breaking via materialize().\n *\n * @example\n * ```typescript\n * // Basic usage (backward compatible)\n * const close = Series.fromBars(bars, 'close');\n * const open = Series.fromBars(bars, 'open');\n * const range = close.sub(open); // Creates new Series, doesn't compute yet\n * const values = range.toArray(); // Now computes for all bars\n * \n * // With automatic cache invalidation\n * const barData = new BarData(bars);\n * const close = Series.fromBars(barData, 'close');\n * const values1 = close.toArray(); // Computes and caches\n * barData.push(newBar); // Version increments\n * const values2 = close.toArray(); // Detects stale cache, recomputes\n * \n * // Breaking closure chains for memory efficiency\n * const complex = a.add(b).mul(c).div(d).sub(e);\n * const materialized = complex.materialize(); // Breaks closure chain\n * ```\n */\n/** Largest history reference of a script series (PineScript max_bars_back limit). */\nexport const MAX_BARS_BACK = 5000;\n\n/** PineScript's runtime error RE10008 text. */\nexport function historyError(bar: number, barsBack: number): string {\n return (\n `Error on bar ${bar}: The script attempts to reference historical data that is too far from the current bar ` +\n `(${barsBack} bars back). The history-referencing length for the expression must be a value between 0 and ${MAX_BARS_BACK}.`\n );\n}\n\nexport class Series {\n private extractor: SeriesExtractor;\n private dataSource: BarData;\n private cached: number[] | null = null;\n private cachedVersion: number = -1;\n\n /**\n * Create a new Series\n *\n * @param data - Bar data (Bar[] or BarData)\n * @param extractor - Function to extract/compute value for each bar\n */\n /**\n * True for PineScript's built-in price variables (open, high, low, close, volume, hl2...): their history covers\n * every bar, so references further than 5000 bars back are allowed (measured: close[bar_index] runs).\n */\n fullHistory = false;\n\n constructor(data: Bar[] | BarData, extractor: SeriesExtractor) {\n // Support both Bar[] and BarData for backward compatibility\n this.dataSource = data instanceof BarData ? data : new BarData(data);\n this.extractor = extractor;\n }\n\n /**\n * Get the underlying bar data\n * @returns Bar array\n */\n get bars(): Bar[] {\n return this.dataSource.bars;\n }\n\n /**\n * Get the underlying BarData source\n * @returns BarData instance\n */\n get barData(): BarData {\n return this.dataSource;\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n /**\n * Create Series from bar data by extracting a specific field\n * @param bars - Bar data (Bar[] or BarData)\n * @param field - Field to extract ('open', 'high', 'low', 'close', 'volume')\n * @returns Series with extracted field values\n */\n static fromBars(bars: Bar[] | BarData, field: 'open' | 'high' | 'low' | 'close' | 'volume'): Series {\n const series = new Series(bars, (bar) => bar[field] ?? NaN);\n series.fullHistory = true;\n return series;\n }\n\n /**\n * Create a constant series (same value for all bars)\n * @param bars - Bar data (Bar[] or BarData)\n * @param value - Constant value\n * @returns Series with constant value\n */\n static constant(bars: Bar[] | BarData, value: number): Series {\n return new Series(bars, () => value);\n }\n\n /**\n * Create series from array of values\n * @param bars - Bar data (Bar[] or BarData) for time alignment\n * @param values - Array of values\n * @returns Series\n * @throws When read on other bars with a different length than `values` (e.g. a series computed on the\n * chart bars and read inside a `request.security` expression, which runs on the higher-timeframe bars)\n */\n static fromArray(bars: Bar[] | BarData, values: number[]): Series {\n const origin = bars instanceof BarData ? bars.bars : bars;\n return new Series(bars, (_bar, i, data) => {\n if (data !== origin && data.length !== values.length) {\n throw new Error(\n `Series values were computed on other bars (${values.length} values, ${data.length} bars). ` +\n 'Inside request.security(), compute the series inside the expression, e.g. () => ta.ema(close, 10).'\n );\n }\n return values[i] ?? NaN;\n });\n }\n\n // ============================================\n // Arithmetic Operations\n // ============================================\n\n /**\n * Add two series or a series and a number\n * @param other - Series or number to add\n * @returns New Series representing the sum\n */\n add(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a + b;\n });\n }\n\n /**\n * Subtract two series or subtract a number from a series\n * @param other - Series or number to subtract\n * @returns New Series representing the difference\n */\n sub(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a - b;\n });\n }\n\n /**\n * Multiply two series or a series by a number\n * @param other - Series or number to multiply\n * @returns New Series representing the product\n */\n mul(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a * b;\n });\n }\n\n /**\n * Raise the series to a power (PineScript math.pow on a series)\n * @param exponent - Series or number exponent\n * @returns New Series representing base ** exponent\n */\n pow(exponent: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof exponent === 'number' ? exponent : exponent.extractor(bar, i, data);\n return Math.pow(a, b);\n });\n }\n\n /**\n * Divide two series or a series by a number\n * @param other - Series or number to divide by\n * @returns New Series representing the quotient\n */\n div(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a / b; // PineScript: x / 0 is +/-Infinity (na() is true for it), 0 / 0 is na\n });\n }\n\n /**\n * Modulo operation\n * @param other - Series or number for modulo\n * @returns New Series representing the remainder\n */\n mod(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return b !== 0 ? a % b : NaN;\n });\n }\n\n /**\n * Negation\n * @returns New Series with negated values\n */\n neg(): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n return -this.extractor(bar, i, data);\n });\n }\n\n // ============================================\n // Comparison Operations (PineScript operators: tolerance 1e-10, false with na; see src/compare)\n // ============================================\n\n /**\n * Greater than comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n gt(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.gt(a, b) ? 1 : 0;\n });\n }\n\n /**\n * Greater than or equal comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n gte(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.ge(a, b) ? 1 : 0;\n });\n }\n\n /**\n * Less than comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n lt(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.lt(a, b) ? 1 : 0;\n });\n }\n\n /**\n * Less than or equal comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n lte(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.le(a, b) ? 1 : 0;\n });\n }\n\n /**\n * Equality comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n eq(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.eq(a, b) ? 1 : 0;\n });\n }\n\n /**\n * Not equal comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n neq(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.ne(a, b) ? 1 : 0;\n });\n }\n\n // ============================================\n // Logical Operations (for boolean series)\n // ============================================\n\n /**\n * Logical AND\n * @param other - Series or number (truthy/falsy)\n * @returns New Series with 1 where both true, 0 otherwise\n */\n and(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a && b ? 1 : 0;\n });\n }\n\n /**\n * Logical OR\n * @param other - Series or number (truthy/falsy)\n * @returns New Series with 1 where either true, 0 otherwise\n */\n or(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a || b ? 1 : 0;\n });\n }\n\n /**\n * Logical NOT\n * @returns New Series with inverted boolean values\n */\n not(): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n return !a ? 1 : 0;\n });\n }\n\n // ============================================\n // Conditional Selection\n // ============================================\n\n /**\n * Bar-by-bar conditional selection (ternary operator for Series)\n * Uses this Series as the condition (truthy = nonzero, falsy = zero/NaN)\n *\n * @param trueValue - Value or Series to use when condition is truthy\n * @param falseValue - Value or Series to use when condition is falsy\n * @returns New Series with bar-by-bar selected values\n *\n * @example\n * ```typescript\n * // PineScript: result = condition ? trueVal : falseVal\n * const result = condition.iff(trueVal, falseVal);\n *\n * // Example: RSI formula uses ternary for edge cases\n * // rsi = down == 0 ? 100 : up == 0 ? 0 : formula\n * const rsi = down.eq(0).iff(100, up.eq(0).iff(0, formula));\n * ```\n */\n iff(trueValue: Series | number, falseValue: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const condition = this.extractor(bar, i, data);\n // Truthy: nonzero and not NaN\n const isTruthy = condition !== 0 && !Number.isNaN(condition);\n\n if (isTruthy) {\n return typeof trueValue === 'number' ? trueValue : trueValue.extractor(bar, i, data);\n } else {\n return typeof falseValue === 'number' ? falseValue : falseValue.extractor(bar, i, data);\n }\n });\n }\n\n // ============================================\n // Offset/History\n // ============================================\n\n /**\n * Access previous bars (like close[1] in PineScript)\n * @param offset - Number of bars back (0 or more)\n * @returns New Series with offset values\n * @throws RangeError when `offset` is negative\n */\n offset(offset: number): Series {\n if (offset < 0) throw new RangeError(`Series.offset(${offset}): the offset cannot be negative (it would read a future bar).`);\n // PineScript runtime error RE10008: a script series keeps at most 5000 bars of history\n if (offset > MAX_BARS_BACK && !this.fullHistory) throw new Error(historyError(0, Math.floor(offset)));\n return new Series(this.dataSource, (_bar, i, data) => {\n const targetIndex = i - offset;\n if (targetIndex < 0 || targetIndex >= data.length) {\n return NaN;\n }\n return this.extractor(data[targetIndex]!, targetIndex, data);\n });\n }\n\n // ============================================\n // Computation & Access\n // ============================================\n\n /**\n * Compute all values for the series\n * \n * Now includes automatic cache invalidation:\n * - Checks if dataSource version has changed since cache was computed\n * - Recomputes if version mismatch detected\n * - Stores version when cache is created\n * \n * @returns Array of computed values\n */\n toArray(): number[] {\n // Check if cache is valid by comparing versions\n if (this.cached !== null && this.cachedVersion === this.dataSource.version) {\n return this.cached;\n }\n\n // Recompute and update cache\n const bars = this.dataSource.bars;\n this.cached = bars.map((bar, i) => this.extractor(bar, i, bars));\n this.cachedVersion = this.dataSource.version;\n return this.cached;\n }\n\n /**\n * Materialize this Series by eagerly computing values and breaking closure chain\n * \n * This method addresses the closure chain memory leak issue:\n * - Computes all values immediately\n * - Creates a new Series that stores values directly\n * - Breaks references to parent Series objects\n * - Useful for complex expressions to free intermediate Series memory\n * \n * @example\n * ```typescript\n * // Without materialize: keeps a, b, c, d in memory via closures\n * const result = a.add(b).mul(c).div(d).sub(e);\n * \n * // With materialize: breaks chain, frees a, b, c memory\n * const result = a.add(b).mul(c).materialize().div(d).sub(e);\n * ```\n * \n * @returns New Series with computed values and no closure dependencies\n */\n materialize(): Series {\n const values = this.toArray();\n // Create a copy of values to ensure no shared references\n const valuesCopy = [...values];\n return Series.fromArray(this.dataSource, valuesCopy);\n }\n\n /**\n * Invalidate cache (when data changes)\n * \n * Note: With BarData versioning, manual invalidation is rarely needed.\n * The cache is automatically invalidated when the underlying BarData changes.\n * This method is kept for backward compatibility and advanced use cases.\n * \n * @internal\n */\n _invalidate(): void {\n this.cached = null;\n this.cachedVersion = -1;\n }\n\n /**\n * Compute all values (alias for toArray)\n * @returns Array of computed values\n * @internal\n */\n _compute(): number[] {\n return this.toArray();\n }\n\n /**\n * Get value at specific index\n * @param index - Bar index\n * @returns Value at that index\n */\n get(index: number): number {\n const values = this.toArray();\n return values[index] ?? NaN;\n }\n\n /**\n * Get the last value (most recent bar)\n * @returns Most recent value\n */\n last(): number {\n const values = this.toArray();\n return values[values.length - 1] ?? NaN;\n }\n\n /**\n * Get number of values\n * @returns Length of series\n */\n length(): number {\n return this.dataSource.length;\n }\n\n /**\n * Convert series to time-value pairs for charting\n * @returns Array of { time, value } objects\n */\n toTimeValuePairs(): Array<{ time: any; value: number }> {\n const values = this.toArray();\n const bars = this.dataSource.bars;\n return bars.map((bar, i) => ({\n time: bar.time,\n value: values[i]!\n })).filter(point => !Number.isNaN(point.value));\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * @fileoverview Simplified Series class for lazy time-series computation\n * Represents a time-series of values with lazy evaluation\n * @module runtime/series\n */\n\nimport * as compare from '../compare/index.js';\nimport type { Bar } from '../types/index.js';\n\n/**\n * Function that computes a value for each bar\n */\nexport type SeriesExtractor = (bar: Bar, index: number, data: Bar[]) => number;\n\n/**\n * BarData - Versioned wrapper around Bar[] array for cache invalidation\n * \n * This class wraps a Bar[] array and tracks a version number that increments\n * whenever the data is mutated. Series objects reference this to detect when\n * their cached values need to be recomputed.\n * \n * @example\n * ```typescript\n * const barData = new BarData(bars);\n * const close = Series.fromBars(barData, 'close');\n * const values1 = close.toArray(); // Computes and caches\n * \n * barData.push(newBar); // Increments version\n * const values2 = close.toArray(); // Detects stale cache, recomputes\n * ```\n */\nexport class BarData {\n private _bars: Bar[];\n private _version: number = 0;\n\n /**\n * Create a new BarData wrapper\n * @param bars - Initial bar data (defaults to empty array)\n */\n constructor(bars: Bar[] = []) {\n this._bars = bars;\n }\n\n /**\n * Get the current version number\n * Version increments whenever data is mutated\n */\n get version(): number {\n return this._version;\n }\n\n /**\n * Get the underlying bar array\n * Note: Direct mutations to this array will NOT increment version\n * Use the provided mutation methods instead\n */\n get bars(): Bar[] {\n return this._bars;\n }\n\n /**\n * Get the number of bars\n */\n get length(): number {\n return this._bars.length;\n }\n\n /**\n * Add a new bar to the end\n * @param bar - Bar to add\n */\n push(bar: Bar): void {\n this._bars.push(bar);\n this._version++;\n }\n\n /**\n * Remove and return the last bar\n * @returns The removed bar, or undefined if empty\n */\n pop(): Bar | undefined {\n const bar = this._bars.pop();\n if (bar !== undefined) {\n this._version++;\n }\n return bar;\n }\n\n /**\n * Replace a bar at a specific index\n * @param index - Index to update\n * @param bar - New bar data\n */\n set(index: number, bar: Bar): void {\n if (index >= 0 && index < this._bars.length) {\n this._bars[index] = bar;\n this._version++;\n }\n }\n\n /**\n * Update the last bar (useful for real-time/streaming updates)\n * @param bar - New bar data\n */\n updateLast(bar: Bar): void {\n if (this._bars.length > 0) {\n this._bars[this._bars.length - 1] = bar;\n this._version++;\n }\n }\n\n /**\n * Replace all bars with new data\n * @param bars - New bar array\n */\n setAll(bars: Bar[]): void {\n this._bars = bars;\n this._version++;\n }\n\n /**\n * Manually increment version (for advanced use cases)\n * Call this after direct mutations to the bars array\n */\n invalidate(): void {\n this._version++;\n }\n\n /**\n * Get a bar at a specific index\n * @param index - Bar index\n * @returns Bar at that index, or undefined\n */\n at(index: number): Bar | undefined {\n return this._bars[index];\n }\n\n /**\n * Create a BarData from an existing Bar array\n * @param bars - Bar array\n * @returns New BarData instance\n */\n static from(bars: Bar[]): BarData {\n return new BarData(bars);\n }\n}\n\n/**\n * Series - represents a time-series of values with lazy evaluation\n *\n * Series are lazy - they don't compute values until needed.\n * Operations on Series return new Series with composed extractors.\n *\n * Now supports automatic cache invalidation via BarData versioning\n * and memory-efficient closure chain breaking via materialize().\n *\n * @example\n * ```typescript\n * // Basic usage (backward compatible)\n * const close = Series.fromBars(bars, 'close');\n * const open = Series.fromBars(bars, 'open');\n * const range = close.sub(open); // Creates new Series, doesn't compute yet\n * const values = range.toArray(); // Now computes for all bars\n * \n * // With automatic cache invalidation\n * const barData = new BarData(bars);\n * const close = Series.fromBars(barData, 'close');\n * const values1 = close.toArray(); // Computes and caches\n * barData.push(newBar); // Version increments\n * const values2 = close.toArray(); // Detects stale cache, recomputes\n * \n * // Breaking closure chains for memory efficiency\n * const complex = a.add(b).mul(c).div(d).sub(e);\n * const materialized = complex.materialize(); // Breaks closure chain\n * ```\n */\n/** Largest history reference of a script series (PineScript max_bars_back limit). */\nexport const MAX_BARS_BACK = 5000;\n\n/** PineScript's runtime error RE10008 text. */\nexport function historyError(bar: number, barsBack: number): string {\n return (\n `Error on bar ${bar}: The script attempts to reference historical data that is too far from the current bar ` +\n `(${barsBack} bars back). The history-referencing length for the expression must be a value between 0 and ${MAX_BARS_BACK}.`\n );\n}\n\nexport class Series {\n private extractor: SeriesExtractor;\n private dataSource: BarData;\n private cached: number[] | null = null;\n private cachedVersion: number = -1;\n\n /**\n * Create a new Series\n *\n * @param data - Bar data (Bar[] or BarData)\n * @param extractor - Function to extract/compute value for each bar\n */\n /**\n * True for PineScript's built-in price variables (open, high, low, close, volume, hl2...): their history covers\n * every bar, so references further than 5000 bars back are allowed (measured: close[bar_index] runs).\n */\n fullHistory = false;\n\n constructor(data: Bar[] | BarData, extractor: SeriesExtractor) {\n // Support both Bar[] and BarData for backward compatibility\n this.dataSource = data instanceof BarData ? data : new BarData(data);\n this.extractor = extractor;\n }\n\n /**\n * Get the underlying bar data\n * @returns Bar array\n */\n get bars(): Bar[] {\n return this.dataSource.bars;\n }\n\n /**\n * Get the underlying BarData source\n * @returns BarData instance\n */\n get barData(): BarData {\n return this.dataSource;\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n /**\n * Create Series from bar data by extracting a specific field\n * @param bars - Bar data (Bar[] or BarData)\n * @param field - Field to extract ('open', 'high', 'low', 'close', 'volume')\n * @returns Series with extracted field values\n */\n static fromBars(bars: Bar[] | BarData, field: 'open' | 'high' | 'low' | 'close' | 'volume'): Series {\n const series = new Series(bars, (bar) => bar[field] ?? NaN);\n series.fullHistory = true;\n return series;\n }\n\n /**\n * Create a constant series (same value for all bars)\n * @param bars - Bar data (Bar[] or BarData)\n * @param value - Constant value\n * @returns Series with constant value\n */\n static constant(bars: Bar[] | BarData, value: number): Series {\n return new Series(bars, () => value);\n }\n\n /**\n * Create series from array of values\n * @param bars - Bar data (Bar[] or BarData) for time alignment\n * @param values - Array of values\n * @returns Series\n * @throws When read on other bars with a different length than `values` (e.g. a series computed on the\n * chart bars and read inside a `request.security` expression, which runs on the higher-timeframe bars)\n */\n static fromArray(bars: Bar[] | BarData, values: number[]): Series {\n const origin = bars instanceof BarData ? bars.bars : bars;\n return new Series(bars, (_bar, i, data) => {\n if (data !== origin && data.length !== values.length) {\n throw new Error(\n `Series values were computed on other bars (${values.length} values, ${data.length} bars). ` +\n 'Inside request.security(), compute the series inside the expression, e.g. () => ta.ema(close, 10).'\n );\n }\n return values[i] ?? NaN;\n });\n }\n\n // ============================================\n // Arithmetic Operations\n // ============================================\n\n /**\n * Add two series or a series and a number\n * @param other - Series or number to add\n * @returns New Series representing the sum\n */\n add(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a + b;\n });\n }\n\n /**\n * Subtract two series or subtract a number from a series\n * @param other - Series or number to subtract\n * @returns New Series representing the difference\n */\n sub(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a - b;\n });\n }\n\n /**\n * Multiply two series or a series by a number\n * @param other - Series or number to multiply\n * @returns New Series representing the product\n */\n mul(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a * b;\n });\n }\n\n /**\n * Raise the series to a power (PineScript math.pow on a series)\n * @param exponent - Series or number exponent\n * @returns New Series representing base ** exponent\n */\n pow(exponent: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof exponent === 'number' ? exponent : exponent.extractor(bar, i, data);\n return Math.pow(a, b);\n });\n }\n\n /**\n * Divide two series or a series by a number\n * @param other - Series or number to divide by\n * @returns New Series representing the quotient\n */\n div(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a / b; // PineScript: x / 0 is +/-Infinity (na() is true for it), 0 / 0 is na\n });\n }\n\n /**\n * Modulo operation\n * @param other - Series or number for modulo\n * @returns New Series representing the remainder\n */\n mod(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return b !== 0 ? a % b : NaN;\n });\n }\n\n /**\n * Negation\n * @returns New Series with negated values\n */\n neg(): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n return -this.extractor(bar, i, data);\n });\n }\n\n // ============================================\n // Comparison Operations (PineScript operators: tolerance 1e-10, false with na; see src/compare)\n // ============================================\n\n /**\n * Greater than comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n gt(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.gt(a, b) ? 1 : 0;\n });\n }\n\n /**\n * Greater than or equal comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n gte(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.ge(a, b) ? 1 : 0;\n });\n }\n\n /**\n * Less than comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n lt(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.lt(a, b) ? 1 : 0;\n });\n }\n\n /**\n * Less than or equal comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n lte(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.le(a, b) ? 1 : 0;\n });\n }\n\n /**\n * Equality comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n eq(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.eq(a, b) ? 1 : 0;\n });\n }\n\n /**\n * Not equal comparison\n * @param other - Series or number to compare\n * @returns New Series with 1 where true, 0 where false\n */\n neq(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return compare.ne(a, b) ? 1 : 0;\n });\n }\n\n // ============================================\n // Logical Operations (for boolean series)\n // ============================================\n\n /**\n * Logical AND\n * @param other - Series or number (truthy/falsy)\n * @returns New Series with 1 where both true, 0 otherwise\n */\n and(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a && b ? 1 : 0;\n });\n }\n\n /**\n * Logical OR\n * @param other - Series or number (truthy/falsy)\n * @returns New Series with 1 where either true, 0 otherwise\n */\n or(other: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n const b = typeof other === 'number' ? other : other.extractor(bar, i, data);\n return a || b ? 1 : 0;\n });\n }\n\n /**\n * Logical NOT\n * @returns New Series with inverted boolean values\n */\n not(): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const a = this.extractor(bar, i, data);\n return !a ? 1 : 0;\n });\n }\n\n // ============================================\n // Conditional Selection\n // ============================================\n\n /**\n * Bar-by-bar conditional selection (ternary operator for Series)\n * Uses this Series as the condition (truthy = nonzero, falsy = zero/NaN)\n *\n * @param trueValue - Value or Series to use when condition is truthy\n * @param falseValue - Value or Series to use when condition is falsy\n * @returns New Series with bar-by-bar selected values\n *\n * @example\n * ```typescript\n * // PineScript: result = condition ? trueVal : falseVal\n * const result = condition.iff(trueVal, falseVal);\n *\n * // Example: RSI formula uses ternary for edge cases\n * // rsi = down == 0 ? 100 : up == 0 ? 0 : formula\n * const rsi = down.eq(0).iff(100, up.eq(0).iff(0, formula));\n * ```\n */\n iff(trueValue: Series | number, falseValue: Series | number): Series {\n return new Series(this.dataSource, (bar, i, data) => {\n const condition = this.extractor(bar, i, data);\n // Truthy: nonzero and not NaN\n const isTruthy = condition !== 0 && !Number.isNaN(condition);\n\n if (isTruthy) {\n return typeof trueValue === 'number' ? trueValue : trueValue.extractor(bar, i, data);\n } else {\n return typeof falseValue === 'number' ? falseValue : falseValue.extractor(bar, i, data);\n }\n });\n }\n\n // ============================================\n // Offset/History\n // ============================================\n\n /**\n * Access previous bars (like close[1] in PineScript)\n * @param offset - Number of bars back (0 or more)\n * @returns New Series with offset values\n * @throws RangeError when `offset` is negative\n */\n offset(offset: number): Series {\n if (offset < 0) throw new RangeError(`Series.offset(${offset}): the offset cannot be negative (it would read a future bar).`);\n // PineScript runtime error RE10008: a script series keeps at most 5000 bars of history\n if (offset > MAX_BARS_BACK && !this.fullHistory) throw new Error(historyError(0, Math.floor(offset)));\n return new Series(this.dataSource, (_bar, i, data) => {\n const targetIndex = i - offset;\n if (targetIndex < 0 || targetIndex >= data.length) {\n return NaN;\n }\n return this.extractor(data[targetIndex]!, targetIndex, data);\n });\n }\n\n // ============================================\n // Computation & Access\n // ============================================\n\n /**\n * Compute all values for the series\n * \n * Now includes automatic cache invalidation:\n * - Checks if dataSource version has changed since cache was computed\n * - Recomputes if version mismatch detected\n * - Stores version when cache is created\n * \n * @returns Array of computed values\n */\n toArray(): number[] {\n // Check if cache is valid by comparing versions\n if (this.cached !== null && this.cachedVersion === this.dataSource.version) {\n return this.cached;\n }\n\n // Recompute and update cache\n const bars = this.dataSource.bars;\n this.cached = bars.map((bar, i) => this.extractor(bar, i, bars));\n this.cachedVersion = this.dataSource.version;\n return this.cached;\n }\n\n /**\n * Materialize this Series by eagerly computing values and breaking closure chain\n * \n * This method addresses the closure chain memory leak issue:\n * - Computes all values immediately\n * - Creates a new Series that stores values directly\n * - Breaks references to parent Series objects\n * - Useful for complex expressions to free intermediate Series memory\n * \n * @example\n * ```typescript\n * // Without materialize: keeps a, b, c, d in memory via closures\n * const result = a.add(b).mul(c).div(d).sub(e);\n * \n * // With materialize: breaks chain, frees a, b, c memory\n * const result = a.add(b).mul(c).materialize().div(d).sub(e);\n * ```\n * \n * @returns New Series with computed values and no closure dependencies\n */\n materialize(): Series {\n const values = this.toArray();\n // Create a copy of values to ensure no shared references\n const valuesCopy = [...values];\n return Series.fromArray(this.dataSource, valuesCopy);\n }\n\n /**\n * Invalidate cache (when data changes)\n * \n * Note: With BarData versioning, manual invalidation is rarely needed.\n * The cache is automatically invalidated when the underlying BarData changes.\n * This method is kept for backward compatibility and advanced use cases.\n * \n * @internal\n */\n _invalidate(): void {\n this.cached = null;\n this.cachedVersion = -1;\n }\n\n /**\n * Compute all values (alias for toArray)\n * @returns Array of computed values\n * @internal\n */\n _compute(): number[] {\n return this.toArray();\n }\n\n /**\n * Get value at specific index\n * @param index - Bar index\n * @returns Value at that index\n */\n get(index: number): number {\n const values = this.toArray();\n return values[index] ?? NaN;\n }\n\n /**\n * Get the last value (most recent bar)\n * @returns Most recent value\n */\n last(): number {\n const values = this.toArray();\n return values[values.length - 1] ?? NaN;\n }\n\n /**\n * Get number of values\n * @returns Length of series\n */\n length(): number {\n return this.dataSource.length;\n }\n\n /**\n * Convert series to time-value pairs for charting\n * @returns Array of { time, value } objects\n */\n /**\n * A Series holds the values of all the bars, so JavaScript operators cannot use it: without this guard\n * `close - open` is NaN, `close > open` false and `` `${rsi}` `` \"[object Object]\", with no error. The\n * conversion throws instead, with the Series method or bar-loop read to use.\n */\n [Symbol.toPrimitive](hint: 'number' | 'string' | 'default'): never {\n if (hint === 'string') {\n throw new TypeError(\n 'A Series is not a text: read the value of one bar inside eachBar(), e.g. str.tostring(c.get(rsi)), ' +\n 'or pass the Series itself to plot() / plotshape().'\n );\n }\n throw new TypeError(\n 'JavaScript operators (+ - * / % ** < > <= >= ==) do not work on a Series: use its methods, ' +\n 'a.add(b) a.sub(b) a.mul(b) a.div(b) a.mod(b) a.pow(b) a.neg(), a.gt(b) a.gte(b) a.lt(b) a.lte(b) a.eq(b) a.neq(b), ' +\n 'a.and(b) a.or(b) a.not(), cond.iff(x, y), a.offset(1) for a[1]; or read numbers inside eachBar() with c.get(a).'\n );\n }\n\n toTimeValuePairs(): Array<{ time: any; value: number }> {\n const values = this.toArray();\n const bars = this.dataSource.bars;\n return bars.map((bar, i) => ({\n time: bar.time,\n value: values[i]!\n })).filter(point => !Number.isNaN(point.value));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview PineScript constant namespaces of the script API: `shape.*`, `location.*`, `size.*`, `xloc.*`,
|
|
3
|
+
* `yloc.*`, `extend.*`, `display.*`, `format.*`, `font.*`, `scale.*`, `order.*`, `currency.*`, `adjustment.*`, and the
|
|
4
|
+
* `label.style_*`, `line.style_*`, `dayofweek.*` members. Each constant is the string (or number) the functions take,
|
|
5
|
+
* so `plotshape(cond, "Buy", { style: shape.triangleup })` and `{ style: "triangleup" }` are the same.
|
|
6
|
+
*
|
|
7
|
+
* @module script/constants
|
|
8
|
+
*/
|
|
9
|
+
/** PineScript `shape.*`: the shapes of plotshape(). */
|
|
10
|
+
export declare const shape: {
|
|
11
|
+
readonly xcross: "xcross";
|
|
12
|
+
readonly cross: "cross";
|
|
13
|
+
readonly triangleup: "triangleup";
|
|
14
|
+
readonly triangledown: "triangledown";
|
|
15
|
+
readonly flag: "flag";
|
|
16
|
+
readonly circle: "circle";
|
|
17
|
+
readonly arrowup: "arrowup";
|
|
18
|
+
readonly arrowdown: "arrowdown";
|
|
19
|
+
readonly labelup: "labelup";
|
|
20
|
+
readonly labeldown: "labeldown";
|
|
21
|
+
readonly square: "square";
|
|
22
|
+
readonly diamond: "diamond";
|
|
23
|
+
};
|
|
24
|
+
/** PineScript `location.*`: where plotshape() / plotchar() draw. */
|
|
25
|
+
export declare const location: {
|
|
26
|
+
readonly abovebar: "abovebar";
|
|
27
|
+
readonly belowbar: "belowbar";
|
|
28
|
+
readonly top: "top";
|
|
29
|
+
readonly bottom: "bottom";
|
|
30
|
+
readonly absolute: "absolute";
|
|
31
|
+
};
|
|
32
|
+
/** PineScript `size.*`: sizes of shapes, characters, labels and table texts. */
|
|
33
|
+
export declare const size: {
|
|
34
|
+
readonly auto: "auto";
|
|
35
|
+
readonly tiny: "tiny";
|
|
36
|
+
readonly small: "small";
|
|
37
|
+
readonly normal: "normal";
|
|
38
|
+
readonly large: "large";
|
|
39
|
+
readonly huge: "huge";
|
|
40
|
+
};
|
|
41
|
+
/** PineScript `xloc.*`: the x coordinate of drawings (bar index or UNIX time in ms). */
|
|
42
|
+
export declare const xloc: {
|
|
43
|
+
readonly bar_index: "bar_index";
|
|
44
|
+
readonly bar_time: "bar_time";
|
|
45
|
+
};
|
|
46
|
+
/** PineScript `yloc.*`: the y position of labels. */
|
|
47
|
+
export declare const yloc: {
|
|
48
|
+
readonly price: "price";
|
|
49
|
+
readonly abovebar: "abovebar";
|
|
50
|
+
readonly belowbar: "belowbar";
|
|
51
|
+
};
|
|
52
|
+
/** PineScript `extend.*`: line extension. */
|
|
53
|
+
export declare const extend: {
|
|
54
|
+
readonly none: "none";
|
|
55
|
+
readonly left: "left";
|
|
56
|
+
readonly right: "right";
|
|
57
|
+
readonly both: "both";
|
|
58
|
+
};
|
|
59
|
+
/** PineScript `display.*`: where a plot or input is shown. */
|
|
60
|
+
export declare const display: {
|
|
61
|
+
readonly none: "none";
|
|
62
|
+
readonly all: "all";
|
|
63
|
+
readonly data_window: "data_window";
|
|
64
|
+
readonly status_line: "status_line";
|
|
65
|
+
readonly pane: "pane";
|
|
66
|
+
};
|
|
67
|
+
/** PineScript `format.*`: the number format of indicator() and str.tostring(). */
|
|
68
|
+
export declare const format: {
|
|
69
|
+
readonly inherit: "inherit";
|
|
70
|
+
readonly price: "price";
|
|
71
|
+
readonly volume: "volume";
|
|
72
|
+
readonly percent: "percent";
|
|
73
|
+
readonly mintick: "mintick";
|
|
74
|
+
};
|
|
75
|
+
/** PineScript `font.*`: font families of labels, boxes and table cells. */
|
|
76
|
+
export declare const font: {
|
|
77
|
+
readonly family_default: "default";
|
|
78
|
+
readonly family_monospace: "monospace";
|
|
79
|
+
};
|
|
80
|
+
/** PineScript `scale.*`: the price scale of indicator() (`scale` option). */
|
|
81
|
+
export declare const scale: {
|
|
82
|
+
readonly right: "right";
|
|
83
|
+
readonly left: "left";
|
|
84
|
+
readonly none: "none";
|
|
85
|
+
};
|
|
86
|
+
/** PineScript `order.*`: sort order of array.sort() / array.sort_indices() / matrix.sort(). */
|
|
87
|
+
export declare const order: {
|
|
88
|
+
readonly ascending: "ascending";
|
|
89
|
+
readonly descending: "descending";
|
|
90
|
+
};
|
|
91
|
+
/** PineScript `adjustment.*`: price adjustment of a ticker. */
|
|
92
|
+
export declare const adjustment: {
|
|
93
|
+
readonly none: "none";
|
|
94
|
+
readonly splits: "splits";
|
|
95
|
+
readonly dividends: "dividends";
|
|
96
|
+
};
|
|
97
|
+
/** PineScript `currency.*`: currency codes (`strategy(..., { currency })`, `syminfo.currency`); `currency.NONE` is na. */
|
|
98
|
+
export declare const currency: {
|
|
99
|
+
readonly NONE: "NONE";
|
|
100
|
+
readonly AED: "AED";
|
|
101
|
+
readonly ARS: "ARS";
|
|
102
|
+
readonly AUD: "AUD";
|
|
103
|
+
readonly BDT: "BDT";
|
|
104
|
+
readonly BHD: "BHD";
|
|
105
|
+
readonly BRL: "BRL";
|
|
106
|
+
readonly BTC: "BTC";
|
|
107
|
+
readonly CAD: "CAD";
|
|
108
|
+
readonly CHF: "CHF";
|
|
109
|
+
readonly CLP: "CLP";
|
|
110
|
+
readonly CNY: "CNY";
|
|
111
|
+
readonly COP: "COP";
|
|
112
|
+
readonly CZK: "CZK";
|
|
113
|
+
readonly DKK: "DKK";
|
|
114
|
+
readonly EGP: "EGP";
|
|
115
|
+
readonly ETH: "ETH";
|
|
116
|
+
readonly EUR: "EUR";
|
|
117
|
+
readonly GBP: "GBP";
|
|
118
|
+
readonly GEL: "GEL";
|
|
119
|
+
readonly HKD: "HKD";
|
|
120
|
+
readonly HUF: "HUF";
|
|
121
|
+
readonly IDR: "IDR";
|
|
122
|
+
readonly ILS: "ILS";
|
|
123
|
+
readonly INR: "INR";
|
|
124
|
+
readonly ISK: "ISK";
|
|
125
|
+
readonly JPY: "JPY";
|
|
126
|
+
readonly KES: "KES";
|
|
127
|
+
readonly KRW: "KRW";
|
|
128
|
+
readonly KWD: "KWD";
|
|
129
|
+
readonly LKR: "LKR";
|
|
130
|
+
readonly MAD: "MAD";
|
|
131
|
+
readonly MXN: "MXN";
|
|
132
|
+
readonly MYR: "MYR";
|
|
133
|
+
readonly NGN: "NGN";
|
|
134
|
+
readonly NOK: "NOK";
|
|
135
|
+
readonly NZD: "NZD";
|
|
136
|
+
readonly PEN: "PEN";
|
|
137
|
+
readonly PHP: "PHP";
|
|
138
|
+
readonly PKR: "PKR";
|
|
139
|
+
readonly PLN: "PLN";
|
|
140
|
+
readonly QAR: "QAR";
|
|
141
|
+
readonly RON: "RON";
|
|
142
|
+
readonly RSD: "RSD";
|
|
143
|
+
readonly RUB: "RUB";
|
|
144
|
+
readonly SAR: "SAR";
|
|
145
|
+
readonly SEK: "SEK";
|
|
146
|
+
readonly SGD: "SGD";
|
|
147
|
+
readonly THB: "THB";
|
|
148
|
+
readonly TND: "TND";
|
|
149
|
+
readonly TRY: "TRY";
|
|
150
|
+
readonly TWD: "TWD";
|
|
151
|
+
readonly USD: "USD";
|
|
152
|
+
readonly USDT: "USDT";
|
|
153
|
+
readonly VES: "VES";
|
|
154
|
+
readonly VND: "VND";
|
|
155
|
+
readonly ZAR: "ZAR";
|
|
156
|
+
};
|
|
157
|
+
/** PineScript `label.style_*`. */
|
|
158
|
+
export declare const labelStyles: {
|
|
159
|
+
readonly style_none: "none";
|
|
160
|
+
readonly style_xcross: "xcross";
|
|
161
|
+
readonly style_cross: "cross";
|
|
162
|
+
readonly style_triangleup: "triangleup";
|
|
163
|
+
readonly style_triangledown: "triangledown";
|
|
164
|
+
readonly style_flag: "flag";
|
|
165
|
+
readonly style_circle: "circle";
|
|
166
|
+
readonly style_arrowup: "arrowup";
|
|
167
|
+
readonly style_arrowdown: "arrowdown";
|
|
168
|
+
readonly style_label_up: "label_up";
|
|
169
|
+
readonly style_label_down: "label_down";
|
|
170
|
+
readonly style_label_left: "label_left";
|
|
171
|
+
readonly style_label_right: "label_right";
|
|
172
|
+
readonly style_label_lower_left: "label_lower_left";
|
|
173
|
+
readonly style_label_lower_right: "label_lower_right";
|
|
174
|
+
readonly style_label_upper_left: "label_upper_left";
|
|
175
|
+
readonly style_label_upper_right: "label_upper_right";
|
|
176
|
+
readonly style_label_center: "label_center";
|
|
177
|
+
readonly style_square: "square";
|
|
178
|
+
readonly style_diamond: "diamond";
|
|
179
|
+
readonly style_text_outline: "text_outline";
|
|
180
|
+
};
|
|
181
|
+
/** PineScript `line.style_*` (lines, boxes, polylines). */
|
|
182
|
+
export declare const lineStyles: {
|
|
183
|
+
readonly style_solid: "solid";
|
|
184
|
+
readonly style_dotted: "dotted";
|
|
185
|
+
readonly style_dashed: "dashed";
|
|
186
|
+
readonly style_arrow_left: "arrow_left";
|
|
187
|
+
readonly style_arrow_right: "arrow_right";
|
|
188
|
+
readonly style_arrow_both: "arrow_both";
|
|
189
|
+
};
|
|
190
|
+
/** PineScript `dayofweek.*`: the values of `dayofweek` (1 = Sunday ... 7 = Saturday). */
|
|
191
|
+
export declare const daysOfWeek: {
|
|
192
|
+
readonly sunday: 1;
|
|
193
|
+
readonly monday: 2;
|
|
194
|
+
readonly tuesday: 3;
|
|
195
|
+
readonly wednesday: 4;
|
|
196
|
+
readonly thursday: 5;
|
|
197
|
+
readonly friday: 6;
|
|
198
|
+
readonly saturday: 7;
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/script/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,uDAAuD;AACvD,eAAO,MAAM,KAAK;;;;;;;;;;;;;CAaR,CAAC;AAEX,oEAAoE;AACpE,eAAO,MAAM,QAAQ;;;;;;CAMX,CAAC;AAEX,gFAAgF;AAChF,eAAO,MAAM,IAAI;;;;;;;CAOP,CAAC;AAEX,wFAAwF;AACxF,eAAO,MAAM,IAAI;;;CAGP,CAAC;AAEX,qDAAqD;AACrD,eAAO,MAAM,IAAI;;;;CAIP,CAAC;AAEX,6CAA6C;AAC7C,eAAO,MAAM,MAAM;;;;;CAKT,CAAC;AAEX,8DAA8D;AAC9D,eAAO,MAAM,OAAO;;;;;;CAMV,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC;AAEX,2EAA2E;AAC3E,eAAO,MAAM,IAAI;;;CAGP,CAAC;AAEX,6EAA6E;AAC7E,eAAO,MAAM,KAAK;;;;CAIR,CAAC;AAEX,+FAA+F;AAC/F,eAAO,MAAM,KAAK;;;CAGR,CAAC;AAEX,+DAA+D;AAC/D,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAWX,0HAA0H;AAC1H,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGX,CAAC;AAEX,kCAAkC;AAClC,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;CAsBd,CAAC;AAEX,2DAA2D;AAC3D,eAAO,MAAM,UAAU;;;;;;;CAOb,CAAC;AAEX,yFAAyF;AACzF,eAAO,MAAM,UAAU;;;;;;;;CAQb,CAAC"}
|