oakscriptjs 0.13.2 → 0.14.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 (119) hide show
  1. package/AGENTS.md +6 -1
  2. package/README.md +1 -1
  3. package/bin/oakscript.mjs +5 -0
  4. package/dist/cjs/check/checks.d.ts +78 -0
  5. package/dist/cjs/check/checks.d.ts.map +1 -0
  6. package/dist/cjs/check/checks.js +109 -0
  7. package/dist/cjs/check/checks.js.map +7 -0
  8. package/dist/cjs/check/format.d.ts +26 -0
  9. package/dist/cjs/check/format.d.ts.map +1 -0
  10. package/dist/cjs/check/format.js +106 -0
  11. package/dist/cjs/check/format.js.map +7 -0
  12. package/dist/cjs/check/harness.d.ts +94 -0
  13. package/dist/cjs/check/harness.d.ts.map +1 -0
  14. package/dist/cjs/check/harness.js +302 -0
  15. package/dist/cjs/check/harness.js.map +7 -0
  16. package/dist/cjs/check/index.d.ts +253 -0
  17. package/dist/cjs/check/index.d.ts.map +1 -0
  18. package/dist/cjs/check/index.js +466 -0
  19. package/dist/cjs/check/index.js.map +7 -0
  20. package/dist/cjs/check/node.d.ts +53 -0
  21. package/dist/cjs/check/node.d.ts.map +1 -0
  22. package/dist/cjs/check/node.js +318 -0
  23. package/dist/cjs/check/node.js.map +7 -0
  24. package/dist/cjs/check/spec.d.ts +44 -0
  25. package/dist/cjs/check/spec.d.ts.map +1 -0
  26. package/dist/cjs/check/spec.js +199 -0
  27. package/dist/cjs/check/spec.js.map +7 -0
  28. package/dist/cjs/index.d.ts +1 -1
  29. package/dist/cjs/index.js +1 -1
  30. package/dist/cjs/index.js.map +1 -1
  31. package/dist/cjs/runtime/series.d.ts +6 -0
  32. package/dist/cjs/runtime/series.d.ts.map +1 -1
  33. package/dist/cjs/runtime/series.js +15 -0
  34. package/dist/cjs/runtime/series.js.map +2 -2
  35. package/dist/cjs/script/constants.d.ts +200 -0
  36. package/dist/cjs/script/constants.d.ts.map +1 -0
  37. package/dist/cjs/script/constants.js +217 -0
  38. package/dist/cjs/script/constants.js.map +7 -0
  39. package/dist/cjs/script/drawing-args.d.ts +25 -0
  40. package/dist/cjs/script/drawing-args.d.ts.map +1 -0
  41. package/dist/cjs/script/drawing-args.js +203 -0
  42. package/dist/cjs/script/drawing-args.js.map +7 -0
  43. package/dist/cjs/script/globals.d.ts +127 -0
  44. package/dist/cjs/script/globals.d.ts.map +1 -0
  45. package/dist/cjs/script/globals.js +17 -0
  46. package/dist/cjs/script/globals.js.map +7 -0
  47. package/dist/cjs/script/index.d.ts +504 -166
  48. package/dist/cjs/script/index.d.ts.map +1 -1
  49. package/dist/cjs/script/index.js +236 -96
  50. package/dist/cjs/script/index.js.map +3 -3
  51. package/dist/esm/check/checks.d.ts +78 -0
  52. package/dist/esm/check/checks.d.ts.map +1 -0
  53. package/dist/esm/check/checks.js +95 -0
  54. package/dist/esm/check/checks.js.map +1 -0
  55. package/dist/esm/check/format.d.ts +26 -0
  56. package/dist/esm/check/format.d.ts.map +1 -0
  57. package/dist/esm/check/format.js +105 -0
  58. package/dist/esm/check/format.js.map +1 -0
  59. package/dist/esm/check/harness.d.ts +94 -0
  60. package/dist/esm/check/harness.d.ts.map +1 -0
  61. package/dist/esm/check/harness.js +317 -0
  62. package/dist/esm/check/harness.js.map +1 -0
  63. package/dist/esm/check/index.d.ts +253 -0
  64. package/dist/esm/check/index.d.ts.map +1 -0
  65. package/dist/esm/check/index.js +470 -0
  66. package/dist/esm/check/index.js.map +1 -0
  67. package/dist/esm/check/node.d.ts +53 -0
  68. package/dist/esm/check/node.d.ts.map +1 -0
  69. package/dist/esm/check/node.js +347 -0
  70. package/dist/esm/check/node.js.map +1 -0
  71. package/dist/esm/check/spec.d.ts +44 -0
  72. package/dist/esm/check/spec.d.ts.map +1 -0
  73. package/dist/esm/check/spec.js +198 -0
  74. package/dist/esm/check/spec.js.map +1 -0
  75. package/dist/esm/index.d.ts +1 -1
  76. package/dist/esm/index.js +1 -1
  77. package/dist/esm/runtime/series.d.ts +6 -0
  78. package/dist/esm/runtime/series.d.ts.map +1 -1
  79. package/dist/esm/runtime/series.js +14 -0
  80. package/dist/esm/runtime/series.js.map +1 -1
  81. package/dist/esm/script/constants.d.ts +200 -0
  82. package/dist/esm/script/constants.d.ts.map +1 -0
  83. package/dist/esm/script/constants.js +151 -0
  84. package/dist/esm/script/constants.js.map +1 -0
  85. package/dist/esm/script/drawing-args.d.ts +25 -0
  86. package/dist/esm/script/drawing-args.d.ts.map +1 -0
  87. package/dist/esm/script/drawing-args.js +171 -0
  88. package/dist/esm/script/drawing-args.js.map +1 -0
  89. package/dist/esm/script/globals.d.ts +127 -0
  90. package/dist/esm/script/globals.d.ts.map +1 -0
  91. package/dist/esm/script/globals.js +28 -0
  92. package/dist/esm/script/globals.js.map +1 -0
  93. package/dist/esm/script/index.d.ts +504 -166
  94. package/dist/esm/script/index.d.ts.map +1 -1
  95. package/dist/esm/script/index.js +256 -83
  96. package/dist/esm/script/index.js.map +1 -1
  97. package/package.json +31 -1
  98. package/skills/oakscript/SKILL.md +62 -26
  99. package/skills/oakscript/examples/ma-cross.js +2 -2
  100. package/skills/oakscript/examples/mtf-trend-filter.js +3 -3
  101. package/skills/oakscript/reference/check.md +150 -0
  102. package/skills/oakscript/reference/errors.md +31 -7
  103. package/skills/oakscript/reference/pine-differences.md +17 -16
  104. package/skills/oakscript/reference/plotting.md +25 -19
  105. package/skills/oakscript/reference/script-structure.md +34 -17
  106. package/skills/oakscript/reference/timeframes-symbols.md +5 -1
  107. package/skills/oakscript/spec.schema.json +199 -0
  108. package/src/check/checks.ts +175 -0
  109. package/src/check/format.ts +117 -0
  110. package/src/check/harness.ts +372 -0
  111. package/src/check/index.ts +708 -0
  112. package/src/check/node.ts +368 -0
  113. package/src/check/spec.ts +200 -0
  114. package/src/index.ts +1 -1
  115. package/src/runtime/series.ts +19 -0
  116. package/src/script/constants.ts +169 -0
  117. package/src/script/drawing-args.ts +179 -0
  118. package/src/script/globals.ts +129 -0
  119. package/src/script/index.ts +462 -81
@@ -0,0 +1,347 @@
1
+ /**
2
+ * @fileoverview The `oakscript check` command (Node.js): checks a script file with {@link checkScript}, adding what
3
+ * needs Node: the error lines of the file (the script is compiled with its file name), a time limit per run, a type
4
+ * check with the TypeScript compiler of the project (when it is installed), bars, specs and references read from files,
5
+ * and a text or JSON output. The exit code is 0 when the check is clean, 2 with warnings only, 1 with an error or a
6
+ * failed spec / reference check.
7
+ *
8
+ * @module check/node
9
+ */
10
+ import { existsSync, readFileSync } from 'node:fs';
11
+ import { createRequire } from 'node:module';
12
+ import * as path from 'node:path';
13
+ import * as vm from 'node:vm';
14
+ import { formatReport } from './format.js';
15
+ import { CHECK_BARS, checkScript, errorLocation, validateSpec, LIBRARY_PARAMETER, SCRIPT_GLOBALS, SCRIPT_PREFIX, scriptArguments, syntheticBars, timeframeSeconds, wrapSource, } from './index.js';
16
+ const USAGE = `Usage: oakscript check <script.js> [options]
17
+
18
+ Runs an OakScript script like a host (declarations, then a run on bars) and reports its inputs, outputs, values,
19
+ signals, trades, errors with their line, and warnings for the mistakes that give no error.
20
+
21
+ Options:
22
+ --spec <file.json> expected kind, title, overlay, inputs, outputs, plots, signals, trades (see the guide);
23
+ an unknown key is an error
24
+ --checks <file.js> behaviour checks: the body of a function of \`t\` (t.plot, t.signal, t.expect, t.everyBar)
25
+ --scenarios also run on edge-case bars (short history, daily, 1-minute, flat prices, no volume, a gap)
26
+ --reference <file.csv> expected values per bar: a time column and one column per plot title
27
+ --export <file.csv> a chart export: its bars (time, open, high, low, close, volume) are the bars of the run and
28
+ its other columns the expected plot values (columns without a plot are ignored)
29
+ --tolerance <x> relative tolerance of the reference values (default 1e-10)
30
+ --bars <file.csv|json> bars of the run (time, open, high, low, close, volume); default: synthetic bars
31
+ --count <n> number of synthetic bars (default ${CHECK_BARS})
32
+ --timeframe <tf> chart timeframe ("1", "60", "D"...; default: from the bars, else "60")
33
+ --inputs <json> input values by id, e.g. '{"length": 50}'
34
+ --timeout <ms> time limit of each run (default 10000)
35
+ --no-types skip the type check
36
+ --no-sweep skip the runs that look for unused inputs
37
+ --json print the report as JSON
38
+
39
+ Exit code: 0 clean, 2 warnings only, 1 errors or failed checks.`;
40
+ /** Compiles a script with its file name: the stack frames and syntax errors give `<file>:line:column`. */
41
+ export function compileFile(filename) {
42
+ return (source) => {
43
+ const fn = vm.compileFunction(wrapSource(source), [...SCRIPT_GLOBALS, LIBRARY_PARAMETER], {
44
+ filename,
45
+ });
46
+ const values = scriptArguments();
47
+ return () => fn(...values);
48
+ };
49
+ }
50
+ /** Runs `fn` with a time limit (the run is stopped, even inside the library). */
51
+ export function withTimeLimit(ms) {
52
+ // the context only calls `fn`: the script and the library run in their own realm, under the context's time limit
53
+ const context = vm.createContext({ run: undefined });
54
+ const call = new vm.Script('run()');
55
+ return (fn) => {
56
+ context.run = fn;
57
+ try {
58
+ return call.runInContext(context, { timeout: ms });
59
+ }
60
+ finally {
61
+ context.run = undefined;
62
+ }
63
+ };
64
+ }
65
+ /** Type-checks a script file with the globals of oakscriptjs/script; `skipped` when TypeScript or the types are missing. */
66
+ export function typecheckFile(file, cwd) {
67
+ const req = createRequire(path.join(cwd, 'oakscript-check.js'));
68
+ let ts;
69
+ try {
70
+ ts = req('typescript');
71
+ }
72
+ catch {
73
+ return { skipped: 'typescript is not installed in the project (npm i -D typescript)' };
74
+ }
75
+ let globals;
76
+ try {
77
+ globals = req.resolve('oakscriptjs/script/globals').replace(/\.js$/, '.d.ts');
78
+ if (!existsSync(globals))
79
+ throw new Error(globals);
80
+ }
81
+ catch {
82
+ return { skipped: 'oakscriptjs/script/globals is not found from the script folder (npm i oakscriptjs)' };
83
+ }
84
+ const program = ts.createProgram([file, globals], {
85
+ allowJs: true,
86
+ checkJs: true,
87
+ noEmit: true,
88
+ strict: true,
89
+ noImplicitAny: false,
90
+ target: ts.ScriptTarget.ES2022,
91
+ module: ts.ModuleKind.ESNext,
92
+ moduleResolution: ts.ModuleResolutionKind.Bundler,
93
+ moduleDetection: ts.ModuleDetectionKind.Force,
94
+ lib: ['lib.es2022.d.ts'],
95
+ types: [],
96
+ skipLibCheck: true,
97
+ });
98
+ const target = path.resolve(file);
99
+ const errors = ts
100
+ .getPreEmitDiagnostics(program)
101
+ .filter((d) => d.file && path.resolve(d.file.fileName) === target && d.start !== undefined)
102
+ .map((d) => {
103
+ const { line, character } = d.file.getLineAndCharacterOfPosition(d.start);
104
+ return {
105
+ stage: 'types',
106
+ message: ts.flattenDiagnosticMessageText(d.messageText, ' '),
107
+ line: line + 1,
108
+ column: character + 1,
109
+ code: `TS${d.code}`,
110
+ };
111
+ });
112
+ return { errors };
113
+ }
114
+ function parseTime(v) {
115
+ const s = v.trim();
116
+ if (/^-?\d+(\.\d+)?$/.test(s)) {
117
+ const n = Number(s);
118
+ return n > 1e12 ? Math.round(n / 1000) : n;
119
+ }
120
+ const t = Date.parse(s);
121
+ if (Number.isNaN(t))
122
+ throw new Error(`Invalid time "${v}"`);
123
+ return Math.round(t / 1000);
124
+ }
125
+ function parseCsv(text) {
126
+ const lines = text.split(/\r?\n/).filter((l) => l.trim() !== '');
127
+ const split = (l) => l.split(/[,;\t]/).map((c) => c.trim().replace(/^"(.*)"$/, '$1'));
128
+ return { header: split(lines[0] ?? ''), rows: lines.slice(1).map(split) };
129
+ }
130
+ const TIME_COLUMNS = ['time', 'timestamp', 'date', 'datetime'];
131
+ const BAR_COLUMNS = ['open', 'high', 'low', 'close', 'volume'];
132
+ /** Bars from a CSV (time, open, high, low, close[, volume]) or a JSON array of bars, oldest first. */
133
+ export function readBars(file) {
134
+ const text = readFileSync(file, 'utf8');
135
+ let bars;
136
+ if (/\.json$/i.test(file)) {
137
+ const raw = JSON.parse(text);
138
+ const list = Array.isArray(raw) ? raw : raw.bars;
139
+ bars = list.map((b) => ({
140
+ time: parseTime(String(b.time)),
141
+ open: Number(b.open),
142
+ high: Number(b.high),
143
+ low: Number(b.low),
144
+ close: Number(b.close),
145
+ volume: b.volume === undefined ? NaN : Number(b.volume),
146
+ }));
147
+ }
148
+ else {
149
+ const { header, rows } = parseCsv(text);
150
+ const col = (names) => header.findIndex((h) => names.includes(h.toLowerCase()));
151
+ const [t, o, h, l, c, v] = [col(TIME_COLUMNS), col(['open']), col(['high']), col(['low']), col(['close']), col(['volume'])];
152
+ if ([t, o, h, l, c].some((k) => k < 0))
153
+ throw new Error(`${file}: the columns time, open, high, low, close are needed (found ${header.join(', ')})`);
154
+ bars = rows.map((r) => ({
155
+ time: parseTime(r[t]),
156
+ open: Number(r[o]),
157
+ high: Number(r[h]),
158
+ low: Number(r[l]),
159
+ close: Number(r[c]),
160
+ volume: v >= 0 ? Number(r[v]) : NaN,
161
+ }));
162
+ }
163
+ return bars.sort((a, b) => a.time - b.time);
164
+ }
165
+ /** A reference CSV: a time column and one column per plot (id or title); empty, "na" or "NaN": na. The bar columns
166
+ * (open, high, low, close, volume) are skipped. */
167
+ export function readReference(file, tolerance) {
168
+ const { header, rows } = parseCsv(readFileSync(file, 'utf8'));
169
+ const t = header.findIndex((h) => TIME_COLUMNS.includes(h.toLowerCase()));
170
+ if (t < 0)
171
+ throw new Error(`${file}: a time column is needed (found ${header.join(', ')})`);
172
+ const columns = {};
173
+ header.forEach((name, k) => {
174
+ // the bar columns of a chart export are the bars, not expected values
175
+ if (k === t || BAR_COLUMNS.includes(name.toLowerCase()))
176
+ return;
177
+ columns[name] = rows.map((r) => {
178
+ const s = (r[k] ?? '').trim();
179
+ return s === '' || /^(na|nan|null)$/i.test(s) ? null : Number(s);
180
+ });
181
+ });
182
+ return { times: rows.map((r) => parseTime(r[t])), columns, ...(tolerance !== undefined ? { tolerance } : {}) };
183
+ }
184
+ /**
185
+ * Behaviour checks from a file: its source is the body of a function of `t` (no import or export), e.g.
186
+ * `t.everyBar("RSI in 0..100", (i) => t.plot("RSI").at(i) <= 100);`. An error in the file names its line.
187
+ */
188
+ export function readChecks(file) {
189
+ const filename = path.resolve(file);
190
+ const fn = vm.compileFunction(readFileSync(filename, 'utf8'), ['t'], { filename });
191
+ return (t) => {
192
+ try {
193
+ fn(t);
194
+ }
195
+ catch (e) {
196
+ const { line, column } = errorLocation(e, filename);
197
+ const m = e && typeof e === 'object' && 'message' in e ? String(e.message) : String(e);
198
+ throw new Error(line ? `${m} (${file}:${line}${column ? `:${column}` : ''})` : m, { cause: e });
199
+ }
200
+ };
201
+ }
202
+ /** Checks a script file: type check, then {@link checkScript} with file lines and a time limit. */
203
+ export function checkFile(file, options = {}) {
204
+ const filename = path.resolve(file);
205
+ const source = readFileSync(filename, 'utf8');
206
+ const timeframe = options.timeframe;
207
+ const bars = options.bars ??
208
+ (options.count !== undefined ? syntheticBars(options.count, timeframeSeconds(timeframe ?? '60') || 3600) : undefined);
209
+ const report = checkScript(source, {
210
+ ...(bars ? { bars } : {}),
211
+ ...(timeframe ? { timeframe } : {}),
212
+ ...(options.inputs ? { inputs: options.inputs } : {}),
213
+ ...(options.spec ? { spec: options.spec } : {}),
214
+ ...(options.reference ? { reference: options.reference } : {}),
215
+ ...(options.checks ? { checks: options.checks } : {}),
216
+ ...(options.scenarios ? { scenarios: true } : {}),
217
+ compile: compileFile(filename),
218
+ run: withTimeLimit(options.timeout ?? 10000),
219
+ filename,
220
+ inputSweep: options.sweep !== false,
221
+ });
222
+ report.file = file;
223
+ for (const e of report.errors)
224
+ if (e.line === 1 && e.column !== undefined)
225
+ e.column = Math.max(1, e.column - SCRIPT_PREFIX.length);
226
+ if (options.types !== false) {
227
+ const types = typecheckFile(filename, options.cwd ?? path.dirname(filename));
228
+ if ('skipped' in types)
229
+ report.typesSkipped = types.skipped;
230
+ else if (types.errors.length) {
231
+ report.errors.unshift(...types.errors);
232
+ report.ok = false;
233
+ }
234
+ }
235
+ return report;
236
+ }
237
+ /** Exit code of a report: 0 clean, 2 warnings only, 1 errors or failed checks. */
238
+ export function exitCode(r) {
239
+ return !r.ok ? 1 : r.warnings.length ? 2 : 0;
240
+ }
241
+ /** Command line entry: `oakscript check <file> [options]`; prints the report and returns the exit code. */
242
+ export function main(argv, print = (t) => process.stdout.write(t + '\n')) {
243
+ const args = [...argv];
244
+ if (args[0] === 'check')
245
+ args.shift();
246
+ if (!args.length || args.includes('--help') || args.includes('-h')) {
247
+ print(USAGE);
248
+ return args.length ? 0 : 1;
249
+ }
250
+ let file;
251
+ const o = {};
252
+ let json = false;
253
+ let referenceFile;
254
+ let exportFile;
255
+ let checksFile;
256
+ let tolerance;
257
+ const specErrors = [];
258
+ try {
259
+ for (let k = 0; k < args.length; k++) {
260
+ const a = args[k];
261
+ const next = () => {
262
+ const v = args[++k];
263
+ if (v === undefined)
264
+ throw new Error(`${a} needs a value`);
265
+ return v;
266
+ };
267
+ if (a === '--spec') {
268
+ const specFile = next();
269
+ const spec = JSON.parse(readFileSync(specFile, 'utf8'));
270
+ specErrors.push(...validateSpec(spec, { file: true }).map((m) => `${specFile}: ${m}`));
271
+ const rel = (f) => path.resolve(path.dirname(specFile), f);
272
+ if (typeof spec.reference === 'string')
273
+ referenceFile ??= rel(spec.reference);
274
+ if (typeof spec.export === 'string')
275
+ exportFile ??= rel(spec.export);
276
+ if (typeof spec.checks === 'string')
277
+ checksFile ??= rel(spec.checks);
278
+ if (typeof spec.tolerance === 'number')
279
+ tolerance ??= spec.tolerance;
280
+ if (spec.scenarios === true)
281
+ o.scenarios = true;
282
+ for (const k of ['$schema', 'reference', 'export', 'tolerance', 'checks', 'scenarios'])
283
+ delete spec[k];
284
+ o.spec = spec;
285
+ }
286
+ else if (a === '--reference')
287
+ referenceFile = next();
288
+ else if (a === '--export')
289
+ exportFile = next();
290
+ else if (a === '--checks')
291
+ checksFile = next();
292
+ else if (a === '--scenarios')
293
+ o.scenarios = true;
294
+ else if (a === '--tolerance')
295
+ tolerance = Number(next());
296
+ else if (a === '--bars')
297
+ o.bars = readBars(next());
298
+ else if (a === '--count')
299
+ o.count = Number(next());
300
+ else if (a === '--timeframe')
301
+ o.timeframe = next();
302
+ else if (a === '--inputs')
303
+ o.inputs = JSON.parse(next());
304
+ else if (a === '--timeout')
305
+ o.timeout = Number(next());
306
+ else if (a === '--no-types')
307
+ o.types = false;
308
+ else if (a === '--no-sweep')
309
+ o.sweep = false;
310
+ else if (a === '--json')
311
+ json = true;
312
+ else if (a.startsWith('--'))
313
+ throw new Error(`Unknown option ${a}`);
314
+ else if (file === undefined)
315
+ file = a;
316
+ else
317
+ throw new Error(`One script file only (got ${file} and ${a})`);
318
+ }
319
+ if (!file)
320
+ throw new Error('No script file');
321
+ if (!existsSync(file))
322
+ throw new Error(`No file ${file}`);
323
+ if (referenceFile)
324
+ o.reference = readReference(referenceFile, tolerance);
325
+ if (exportFile) {
326
+ o.bars ??= readBars(exportFile);
327
+ o.reference ??= { ...readReference(exportFile, tolerance), ignoreUnknown: true };
328
+ }
329
+ if (checksFile)
330
+ o.checks = readChecks(checksFile);
331
+ }
332
+ catch (e) {
333
+ print(`oakscript check: ${e.message}\n\n${USAGE}`);
334
+ return 1;
335
+ }
336
+ const report = checkFile(file, o);
337
+ if (specErrors.length) {
338
+ // the keys of a spec file are checked here (checkScript sees the spec without them)
339
+ report.errors = report.errors.filter((e) => e.stage !== 'spec');
340
+ report.errors.push(...specErrors.map((message) => ({ stage: 'spec', message })));
341
+ report.ok = false;
342
+ }
343
+ print(json ? JSON.stringify(report, null, 2) : formatReport(report));
344
+ return exitCode(report);
345
+ }
346
+ export { formatReport };
347
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/check/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @fileoverview The spec of a check (what the user asked for), described once: {@link validateSpec} rejects unknown
3
+ * keys and wrong values (a misspelt key would otherwise be skipped and the check would pass without checking it), and
4
+ * {@link specJsonSchema} gives the JSON Schema of a spec file (`skills/oakscript/spec.schema.json`).
5
+ *
6
+ * @module check/spec
7
+ */
8
+ type Field = {
9
+ kind: 'string' | 'number' | 'boolean' | 'any' | 'string[]';
10
+ doc: string;
11
+ } | {
12
+ kind: 'enum';
13
+ values: readonly string[];
14
+ doc: string;
15
+ } | {
16
+ kind: 'object';
17
+ fields: Record<string, Field>;
18
+ doc: string;
19
+ required?: readonly string[];
20
+ } | {
21
+ kind: 'map';
22
+ of: Field;
23
+ doc: string;
24
+ } | {
25
+ kind: 'outputs';
26
+ doc: string;
27
+ };
28
+ export declare const INPUT_TYPES: readonly ["int", "float", "bool", "string", "text_area", "source", "color", "timeframe", "session", "time", "symbol"];
29
+ export declare const OUTPUT_KINDS: readonly ["plot", "shape", "char", "arrow", "candle", "bar", "hline", "bgcolor", "barcolor", "alertcondition"];
30
+ /** The keys of a spec checked by checkScript. */
31
+ export declare const SPEC_FIELDS: Record<string, Field>;
32
+ /** The keys of a spec file read by the `oakscript check` command (paths relative to the spec file). */
33
+ export declare const SPEC_FILE_FIELDS: Record<string, Field>;
34
+ /**
35
+ * The problems of a spec: unknown keys (with the closest key) and wrong values, one message per problem; empty when the
36
+ * spec is valid. `file`: also accept the keys of a spec file (reference, export, tolerance, checks, scenarios).
37
+ */
38
+ export declare function validateSpec(spec: unknown, options?: {
39
+ file?: boolean;
40
+ }): string[];
41
+ /** JSON Schema (draft 2020-12) of a spec file of `oakscript check`. */
42
+ export declare function specJsonSchema(): Record<string, unknown>;
43
+ export {};
44
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../src/check/spec.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,KAAK,KAAK,GACN;IAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC5F;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAIrC,eAAO,MAAM,WAAW,uHAAwH,CAAC;AACjJ,eAAO,MAAM,YAAY,gHAAiH,CAAC;AAE3I,iDAAiD;AACjD,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CA6C7C,CAAC;AAEF,uGAAuG;AACvG,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAOlD,CAAC;AAmEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,EAAE,CAKtF;AAuCD,uEAAuE;AACvE,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOxD"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * @fileoverview The spec of a check (what the user asked for), described once: {@link validateSpec} rejects unknown
3
+ * keys and wrong values (a misspelt key would otherwise be skipped and the check would pass without checking it), and
4
+ * {@link specJsonSchema} gives the JSON Schema of a spec file (`skills/oakscript/spec.schema.json`).
5
+ *
6
+ * @module check/spec
7
+ */
8
+ const num = (doc) => ({ kind: 'number', doc });
9
+ export const INPUT_TYPES = ['int', 'float', 'bool', 'string', 'text_area', 'source', 'color', 'timeframe', 'session', 'time', 'symbol'];
10
+ export const OUTPUT_KINDS = ['plot', 'shape', 'char', 'arrow', 'candle', 'bar', 'hline', 'bgcolor', 'barcolor', 'alertcondition'];
11
+ /** The keys of a spec checked by checkScript. */
12
+ export const SPEC_FIELDS = {
13
+ kind: { kind: 'enum', values: ['indicator', 'strategy'], doc: 'indicator() or strategy()' },
14
+ title: { kind: 'string', doc: 'the title of the declaration' },
15
+ overlay: { kind: 'boolean', doc: 'true: price pane, false: own pane' },
16
+ inputs: {
17
+ kind: 'map',
18
+ doc: 'inputs that must exist, by id or title',
19
+ of: {
20
+ kind: 'object',
21
+ doc: 'the expected input',
22
+ fields: {
23
+ type: { kind: 'enum', values: INPUT_TYPES, doc: 'input type' },
24
+ defval: { kind: 'any', doc: 'default value' },
25
+ title: { kind: 'string', doc: 'title' },
26
+ min: num('minval'),
27
+ max: num('maxval'),
28
+ options: { kind: 'string[]', doc: 'the choices of a string input' },
29
+ },
30
+ },
31
+ },
32
+ outputs: { kind: 'outputs', doc: 'outputs that must exist: a title, or { title, kind }' },
33
+ plots: {
34
+ kind: 'map',
35
+ doc: 'value checks per plot, by id or title',
36
+ of: {
37
+ kind: 'object',
38
+ doc: 'the expected values',
39
+ 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') },
40
+ },
41
+ },
42
+ signals: {
43
+ kind: 'map',
44
+ doc: 'count checks per signal (shape, char, arrow, alertcondition, bgcolor, barcolor), by id or title',
45
+ of: {
46
+ kind: 'object',
47
+ doc: 'the expected count',
48
+ fields: {
49
+ min: num('at least this many bars'),
50
+ max: num('at most this many bars'),
51
+ minShare: num('at least this share of the bars (0 to 1)'),
52
+ maxShare: num('at most this share of the bars (0 to 1)'),
53
+ },
54
+ },
55
+ },
56
+ trades: { kind: 'object', doc: 'closed trades of a strategy', fields: { min: num('at least'), max: num('at most') } },
57
+ };
58
+ /** The keys of a spec file read by the `oakscript check` command (paths relative to the spec file). */
59
+ export const SPEC_FILE_FIELDS = {
60
+ $schema: { kind: 'string', doc: 'the JSON Schema of the spec (oakscriptjs/skills/oakscript/spec.schema.json)' },
61
+ reference: { kind: 'string', doc: 'CSV of expected values per bar (a time column, one column per plot)' },
62
+ export: { kind: 'string', doc: 'chart export CSV: the bars (time, open, high, low, close, volume) and the expected plot values' },
63
+ tolerance: num('relative tolerance of the reference values (default 1e-10)'),
64
+ checks: { kind: 'string', doc: 'JavaScript file of behaviour checks (the body of a function of `t`)' },
65
+ scenarios: { kind: 'boolean', doc: 'also run on the built-in edge-case bars' },
66
+ };
67
+ function closest(name, names) {
68
+ const dist = (a, b) => {
69
+ const row = Array.from({ length: b.length + 1 }, (_, j) => j);
70
+ for (let i = 1; i <= a.length; i++) {
71
+ let diag = row[0];
72
+ row[0] = i;
73
+ for (let j = 1; j <= b.length; j++) {
74
+ const up = row[j];
75
+ row[j] = Math.min(up + 1, row[j - 1] + 1, diag + (a[i - 1] === b[j - 1] ? 0 : 1));
76
+ diag = up;
77
+ }
78
+ }
79
+ return row[b.length];
80
+ };
81
+ const n = name.toLowerCase();
82
+ const best = names.map((k) => ({ k, d: dist(n, k.toLowerCase()) })).sort((a, b) => a.d - b.d)[0];
83
+ if (!best)
84
+ return undefined;
85
+ return best.d <= Math.max(2, Math.floor(name.length / 2)) || best.k.toLowerCase().startsWith(n.slice(0, 3)) ? best.k : undefined;
86
+ }
87
+ function check(value, field, path, errors) {
88
+ const fail = (what) => {
89
+ errors.push(`${path}: ${what}`);
90
+ };
91
+ switch (field.kind) {
92
+ case 'any':
93
+ return;
94
+ case 'string':
95
+ case 'number':
96
+ case 'boolean':
97
+ if (typeof value !== field.kind || (field.kind === 'number' && !Number.isFinite(value)))
98
+ fail(`expected a ${field.kind}, got ${JSON.stringify(value)}`);
99
+ return;
100
+ case 'string[]':
101
+ if (!Array.isArray(value) || value.some((v) => typeof v !== 'string'))
102
+ fail(`expected an array of strings, got ${JSON.stringify(value)}`);
103
+ return;
104
+ case 'enum':
105
+ if (typeof value !== 'string' || !field.values.includes(value))
106
+ fail(`expected one of ${field.values.join(', ')}, got ${JSON.stringify(value)}`);
107
+ return;
108
+ case 'outputs':
109
+ if (!Array.isArray(value))
110
+ return fail('expected an array of titles or { title, kind }');
111
+ value.forEach((o, k) => {
112
+ if (typeof o === 'string')
113
+ return;
114
+ check(o, { kind: 'object', doc: '', required: ['title'], fields: { title: { kind: 'string', doc: '' }, kind: { kind: 'enum', values: OUTPUT_KINDS, doc: '' } } }, `${path}[${k}]`, errors);
115
+ });
116
+ return;
117
+ case 'map':
118
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
119
+ return fail('expected an object (name -> checks)');
120
+ for (const [k, v] of Object.entries(value))
121
+ check(v, field.of, `${path}.${k}`, errors);
122
+ return;
123
+ case 'object': {
124
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
125
+ return fail('expected an object');
126
+ const keys = Object.keys(field.fields);
127
+ for (const [k, v] of Object.entries(value)) {
128
+ const f = field.fields[k];
129
+ if (!f) {
130
+ const near = closest(k, keys);
131
+ fail(`unknown key "${k}"${near ? ` (did you mean "${near}"?)` : ''}; the keys are ${keys.join(', ')}`);
132
+ }
133
+ else
134
+ check(v, f, `${path}.${k}`, errors);
135
+ }
136
+ for (const r of field.required ?? [])
137
+ if (!(r in value))
138
+ fail(`"${r}" is required`);
139
+ return;
140
+ }
141
+ }
142
+ }
143
+ /**
144
+ * The problems of a spec: unknown keys (with the closest key) and wrong values, one message per problem; empty when the
145
+ * spec is valid. `file`: also accept the keys of a spec file (reference, export, tolerance, checks, scenarios).
146
+ */
147
+ export function validateSpec(spec, options = {}) {
148
+ const errors = [];
149
+ const fields = options.file ? { ...SPEC_FIELDS, ...SPEC_FILE_FIELDS } : SPEC_FIELDS;
150
+ check(spec, { kind: 'object', doc: '', fields }, 'spec', errors);
151
+ return errors;
152
+ }
153
+ function schemaOf(field) {
154
+ const description = field.doc ? { description: field.doc } : {};
155
+ switch (field.kind) {
156
+ case 'any':
157
+ return { ...description };
158
+ case 'string':
159
+ case 'number':
160
+ case 'boolean':
161
+ return { type: field.kind, ...description };
162
+ case 'string[]':
163
+ return { type: 'array', items: { type: 'string' }, ...description };
164
+ case 'enum':
165
+ return { enum: [...field.values], ...description };
166
+ case 'outputs':
167
+ return {
168
+ type: 'array',
169
+ ...description,
170
+ items: {
171
+ oneOf: [
172
+ { type: 'string' },
173
+ { type: 'object', additionalProperties: false, required: ['title'], properties: { title: { type: 'string' }, kind: { enum: [...OUTPUT_KINDS] } } },
174
+ ],
175
+ },
176
+ };
177
+ case 'map':
178
+ return { type: 'object', ...description, additionalProperties: schemaOf(field.of) };
179
+ case 'object':
180
+ return {
181
+ type: 'object',
182
+ ...description,
183
+ additionalProperties: false,
184
+ ...(field.required ? { required: [...field.required] } : {}),
185
+ properties: Object.fromEntries(Object.entries(field.fields).map(([k, f]) => [k, schemaOf(f)])),
186
+ };
187
+ }
188
+ }
189
+ /** JSON Schema (draft 2020-12) of a spec file of `oakscript check`. */
190
+ export function specJsonSchema() {
191
+ return {
192
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
193
+ title: 'oakscript check spec',
194
+ description: 'What the user asked for, checked by `oakscript check --spec`: every given entry is checked, an unknown key is an error.',
195
+ ...schemaOf({ kind: 'object', doc: '', fields: { ...SPEC_FIELDS, ...SPEC_FILE_FIELDS } }),
196
+ };
197
+ }
198
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/check/spec.ts"],"names":[],"mappings":"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"}
@@ -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.13.2";
68
+ export declare const VERSION = "0.14.1";
69
69
  /**
70
70
  * Library information
71
71
  */