@invinite-org/chartlang-adapter-kit 1.1.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/CHANGELOG.md +1380 -0
- package/LICENSE +21 -0
- package/README.md +69 -0
- package/dist/base/bufferingAdapter.d.ts +52 -0
- package/dist/base/bufferingAdapter.d.ts.map +1 -0
- package/dist/base/bufferingAdapter.js +68 -0
- package/dist/base/bufferingAdapter.js.map +1 -0
- package/dist/base/index.d.ts +3 -0
- package/dist/base/index.d.ts.map +1 -0
- package/dist/base/index.js +5 -0
- package/dist/base/index.js.map +1 -0
- package/dist/base/passThroughAdapter.d.ts +49 -0
- package/dist/base/passThroughAdapter.d.ts.map +1 -0
- package/dist/base/passThroughAdapter.js +61 -0
- package/dist/base/passThroughAdapter.js.map +1 -0
- package/dist/capabilities/capabilities.d.ts +336 -0
- package/dist/capabilities/capabilities.d.ts.map +1 -0
- package/dist/capabilities/capabilities.js +616 -0
- package/dist/capabilities/capabilities.js.map +1 -0
- package/dist/capabilities/index.d.ts +2 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +4 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/defineAdapter.d.ts +74 -0
- package/dist/defineAdapter.d.ts.map +1 -0
- package/dist/defineAdapter.js +55 -0
- package/dist/defineAdapter.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mocks/index.d.ts +3 -0
- package/dist/mocks/index.d.ts.map +1 -0
- package/dist/mocks/index.js +4 -0
- package/dist/mocks/index.js.map +1 -0
- package/dist/mocks/mockCandleSource.d.ts +68 -0
- package/dist/mocks/mockCandleSource.d.ts.map +1 -0
- package/dist/mocks/mockCandleSource.js +61 -0
- package/dist/mocks/mockCandleSource.js.map +1 -0
- package/dist/types.d.ts +655 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/validation/decodeDrawing.d.ts +29 -0
- package/dist/validation/decodeDrawing.d.ts.map +1 -0
- package/dist/validation/decodeDrawing.js +35 -0
- package/dist/validation/decodeDrawing.js.map +1 -0
- package/dist/validation/index.d.ts +4 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +5 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/validateEmission.d.ts +70 -0
- package/dist/validation/validateEmission.d.ts.map +1 -0
- package/dist/validation/validateEmission.js +1481 -0
- package/dist/validation/validateEmission.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Adapter } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Options accepted by {@link defineAdapter}. `dispose` is optional —
|
|
4
|
+
* `defineAdapter` substitutes a no-op when omitted.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1
|
|
7
|
+
* @stable
|
|
8
|
+
* @example
|
|
9
|
+
* const opts: DefineAdapterOpts = {
|
|
10
|
+
* id: "demo",
|
|
11
|
+
* name: "Demo",
|
|
12
|
+
* capabilities: {
|
|
13
|
+
* plots: new Set(),
|
|
14
|
+
* drawings: new Set(),
|
|
15
|
+
* alerts: new Set(),
|
|
16
|
+
* alertConditions: false,
|
|
17
|
+
* logs: false,
|
|
18
|
+
* inputs: new Set(),
|
|
19
|
+
* intervals: [],
|
|
20
|
+
* multiTimeframe: false,
|
|
21
|
+
* subPanes: 0,
|
|
22
|
+
* symInfoFields: new Set(),
|
|
23
|
+
* maxDrawingsPerScript: {
|
|
24
|
+
* lines: 0, labels: 0, boxes: 0, polylines: 0, other: 0,
|
|
25
|
+
* },
|
|
26
|
+
* maxLookback: 0,
|
|
27
|
+
* maxTickHz: 0,
|
|
28
|
+
* },
|
|
29
|
+
* candles: () => ({ async *[Symbol.asyncIterator]() {} }),
|
|
30
|
+
* onEmissions: () => {},
|
|
31
|
+
* };
|
|
32
|
+
*/
|
|
33
|
+
export type DefineAdapterOpts = Omit<Adapter, "dispose"> & {
|
|
34
|
+
readonly dispose?: () => void;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Wrap an adapter description in a stable factory so consumer-repo
|
|
38
|
+
* adapters get a single entry point + a default no-op `dispose`. The
|
|
39
|
+
* returned object aliases the supplied callbacks by reference — no
|
|
40
|
+
* normalisation, no cloning.
|
|
41
|
+
*
|
|
42
|
+
* @since 0.1
|
|
43
|
+
* @stable
|
|
44
|
+
* @example
|
|
45
|
+
* import { defineAdapter, capabilities, mockCandleSource }
|
|
46
|
+
* from "@invinite-org/chartlang-adapter-kit";
|
|
47
|
+
*
|
|
48
|
+
* const adapter = defineAdapter({
|
|
49
|
+
* id: "demo",
|
|
50
|
+
* name: "Demo",
|
|
51
|
+
* capabilities: {
|
|
52
|
+
* plots: capabilities.allLines(),
|
|
53
|
+
* drawings: new Set(),
|
|
54
|
+
* alerts: new Set(),
|
|
55
|
+
* alertConditions: false,
|
|
56
|
+
* logs: false,
|
|
57
|
+
* inputs: new Set(),
|
|
58
|
+
* intervals: [],
|
|
59
|
+
* multiTimeframe: false,
|
|
60
|
+
* subPanes: 0,
|
|
61
|
+
* symInfoFields: new Set(),
|
|
62
|
+
* maxDrawingsPerScript: {
|
|
63
|
+
* lines: 0, labels: 0, boxes: 0, polylines: 0, other: 0,
|
|
64
|
+
* },
|
|
65
|
+
* maxLookback: 5000,
|
|
66
|
+
* maxTickHz: 10,
|
|
67
|
+
* },
|
|
68
|
+
* candles: () => mockCandleSource([]),
|
|
69
|
+
* onEmissions: () => {},
|
|
70
|
+
* });
|
|
71
|
+
* void adapter;
|
|
72
|
+
*/
|
|
73
|
+
export declare function defineAdapter(opts: DefineAdapterOpts): Adapter;
|
|
74
|
+
//# sourceMappingURL=defineAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineAdapter.d.ts","sourceRoot":"","sources":["../src/defineAdapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG;IACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAW9D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Copyright (c) 2026 Invinite. Licensed under the MIT License.
|
|
2
|
+
// See the LICENSE file in the repo root for full license text.
|
|
3
|
+
/**
|
|
4
|
+
* Wrap an adapter description in a stable factory so consumer-repo
|
|
5
|
+
* adapters get a single entry point + a default no-op `dispose`. The
|
|
6
|
+
* returned object aliases the supplied callbacks by reference — no
|
|
7
|
+
* normalisation, no cloning.
|
|
8
|
+
*
|
|
9
|
+
* @since 0.1
|
|
10
|
+
* @stable
|
|
11
|
+
* @example
|
|
12
|
+
* import { defineAdapter, capabilities, mockCandleSource }
|
|
13
|
+
* from "@invinite-org/chartlang-adapter-kit";
|
|
14
|
+
*
|
|
15
|
+
* const adapter = defineAdapter({
|
|
16
|
+
* id: "demo",
|
|
17
|
+
* name: "Demo",
|
|
18
|
+
* capabilities: {
|
|
19
|
+
* plots: capabilities.allLines(),
|
|
20
|
+
* drawings: new Set(),
|
|
21
|
+
* alerts: new Set(),
|
|
22
|
+
* alertConditions: false,
|
|
23
|
+
* logs: false,
|
|
24
|
+
* inputs: new Set(),
|
|
25
|
+
* intervals: [],
|
|
26
|
+
* multiTimeframe: false,
|
|
27
|
+
* subPanes: 0,
|
|
28
|
+
* symInfoFields: new Set(),
|
|
29
|
+
* maxDrawingsPerScript: {
|
|
30
|
+
* lines: 0, labels: 0, boxes: 0, polylines: 0, other: 0,
|
|
31
|
+
* },
|
|
32
|
+
* maxLookback: 5000,
|
|
33
|
+
* maxTickHz: 10,
|
|
34
|
+
* },
|
|
35
|
+
* candles: () => mockCandleSource([]),
|
|
36
|
+
* onEmissions: () => {},
|
|
37
|
+
* });
|
|
38
|
+
* void adapter;
|
|
39
|
+
*/
|
|
40
|
+
export function defineAdapter(opts) {
|
|
41
|
+
return {
|
|
42
|
+
id: opts.id,
|
|
43
|
+
name: opts.name,
|
|
44
|
+
capabilities: opts.capabilities,
|
|
45
|
+
...(opts.resolveInputs !== undefined ? { resolveInputs: opts.resolveInputs } : {}),
|
|
46
|
+
...(opts.symInfo !== undefined ? { symInfo: opts.symInfo } : {}),
|
|
47
|
+
candles: opts.candles,
|
|
48
|
+
onEmissions: opts.onEmissions,
|
|
49
|
+
dispose: opts.dispose ?? noopDispose,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function noopDispose() {
|
|
53
|
+
// intentional no-op
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=defineAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineAdapter.js","sourceRoot":"","sources":["../src/defineAdapter.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAuC/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,UAAU,aAAa,CAAC,IAAuB;IACjD,OAAO;QACH,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,WAAW;KACvC,CAAC;AACN,CAAC;AAED,SAAS,WAAW;IAChB,oBAAoB;AACxB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { KIND_BUCKET, bucketFor } from "@invinite-org/chartlang-core";
|
|
2
|
+
export type { DrawingBucket, DrawingState } from "@invinite-org/chartlang-core";
|
|
3
|
+
export { defineAdapter } from "./defineAdapter.js";
|
|
4
|
+
export type { DefineAdapterOpts } from "./defineAdapter.js";
|
|
5
|
+
export { PHASE_5_PLOT_KINDS, capabilities } from "./capabilities/index.js";
|
|
6
|
+
export { decodeDrawing, validateEmission } from "./validation/index.js";
|
|
7
|
+
export type { ValidationFail, ValidationOk, ValidationResult } from "./validation/index.js";
|
|
8
|
+
export { mockCandleSource } from "./mocks/index.js";
|
|
9
|
+
export type { MockCandleSourceMode, MockCandleSourceOpts } from "./mocks/index.js";
|
|
10
|
+
export { BufferingAdapter, PassThroughAdapter } from "./base/index.js";
|
|
11
|
+
export type { Adapter, AdapterSymInfo, AlertChannel, AlertConditionEmission, AlertEmission, Capabilities, CandleEvent, DiagnosticCode, DrawingCounts, DrawingEmission, DrawingKind, InputKind, LogEmission, PlotEmission, PlotKind, PlotStyle, RunnerEmissions, RuntimeDiagnostic, SymInfoField, } from "./types.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACtE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACxE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvE,YAAY,EACR,OAAO,EACP,cAAc,EACd,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,WAAW,EACX,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,YAAY,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Copyright (c) 2026 Invinite. Licensed under the MIT License.
|
|
2
|
+
// See the LICENSE file in the repo root for full license text.
|
|
3
|
+
export { KIND_BUCKET, bucketFor } from "@invinite-org/chartlang-core";
|
|
4
|
+
export { defineAdapter } from "./defineAdapter.js";
|
|
5
|
+
export { PHASE_5_PLOT_KINDS, capabilities } from "./capabilities/index.js";
|
|
6
|
+
export { decodeDrawing, validateEmission } from "./validation/index.js";
|
|
7
|
+
export { mockCandleSource } from "./mocks/index.js";
|
|
8
|
+
export { BufferingAdapter, PassThroughAdapter } from "./base/index.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mocks/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { Bar } from "@invinite-org/chartlang-core";
|
|
2
|
+
import type { CandleEvent } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* How a {@link mockCandleSource} surfaces the supplied bars:
|
|
5
|
+
*
|
|
6
|
+
* - `history` — yields one warm-up batch with every bar.
|
|
7
|
+
* - `stream` — yields one `close` event per bar in array order.
|
|
8
|
+
* - `history-then-stream` — yields one history batch containing all
|
|
9
|
+
* but the last `streamTail` bars, then a `close` event per
|
|
10
|
+
* remaining bar. Lets a consumer paint a chart instantly from
|
|
11
|
+
* the warm-up batch and still receive per-bar ticks afterwards.
|
|
12
|
+
*
|
|
13
|
+
* @since 0.5
|
|
14
|
+
* @stable
|
|
15
|
+
* @example
|
|
16
|
+
* const m: MockCandleSourceMode = "history-then-stream";
|
|
17
|
+
*/
|
|
18
|
+
export type MockCandleSourceMode = "history" | "stream" | "history-then-stream";
|
|
19
|
+
/**
|
|
20
|
+
* Options accepted by {@link mockCandleSource}. `interval` mirrors the
|
|
21
|
+
* `Bar.interval` field; `mode` defaults to `"history"`. `streamTail`
|
|
22
|
+
* applies only when `mode === "history-then-stream"` and defaults to
|
|
23
|
+
* `1` — the smallest non-zero value, leaving a single tail bar to
|
|
24
|
+
* stream after the warm-up batch. `streamTail` is clamped to
|
|
25
|
+
* `[0, bars.length]`.
|
|
26
|
+
*
|
|
27
|
+
* @since 0.5
|
|
28
|
+
* @stable
|
|
29
|
+
* @example
|
|
30
|
+
* const o: MockCandleSourceOpts = {
|
|
31
|
+
* interval: "1D",
|
|
32
|
+
* mode: "history-then-stream",
|
|
33
|
+
* streamTail: 20,
|
|
34
|
+
* };
|
|
35
|
+
*/
|
|
36
|
+
export type MockCandleSourceOpts = {
|
|
37
|
+
readonly interval: string;
|
|
38
|
+
readonly mode?: MockCandleSourceMode;
|
|
39
|
+
readonly streamTail?: number;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Wrap a static `Bar[]` array in an `AsyncIterable<CandleEvent>` the
|
|
43
|
+
* runtime + conformance tests can drive directly.
|
|
44
|
+
*
|
|
45
|
+
* - `"history"` (default) — yields exactly one
|
|
46
|
+
* `{ kind: "history", bars }` event.
|
|
47
|
+
* - `"stream"` — yields one `{ kind: "close", bar }` per bar in array
|
|
48
|
+
* order.
|
|
49
|
+
* - `"history-then-stream"` — yields a single
|
|
50
|
+
* `{ kind: "history", bars }` event for all but the trailing
|
|
51
|
+
* `streamTail` bars (default `1`), then one `{ kind: "close", bar }`
|
|
52
|
+
* per remaining bar. With `streamTail` clamped to `[0, bars.length]`,
|
|
53
|
+
* `streamTail === 0` degenerates to a pure history batch and
|
|
54
|
+
* `streamTail >= bars.length` yields an empty history batch followed
|
|
55
|
+
* by a close-per-bar.
|
|
56
|
+
*
|
|
57
|
+
* @since 0.1
|
|
58
|
+
* @stable
|
|
59
|
+
* @example
|
|
60
|
+
* import { mockCandleSource } from "@invinite-org/chartlang-adapter-kit";
|
|
61
|
+
*
|
|
62
|
+
* const source = mockCandleSource([], { interval: "1D" });
|
|
63
|
+
* for await (const e of source) {
|
|
64
|
+
* void e;
|
|
65
|
+
* }
|
|
66
|
+
*/
|
|
67
|
+
export declare function mockCandleSource(bars: ReadonlyArray<Bar>, opts?: MockCandleSourceOpts): AsyncIterable<CandleEvent>;
|
|
68
|
+
//# sourceMappingURL=mockCandleSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockCandleSource.d.ts","sourceRoot":"","sources":["../../src/mocks/mockCandleSource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,qBAAqB,CAAC;AAEhF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAIF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,EACxB,IAAI,GAAE,oBAAyC,GAChD,aAAa,CAAC,WAAW,CAAC,CAuB5B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Copyright (c) 2026 Invinite. Licensed under the MIT License.
|
|
2
|
+
// See the LICENSE file in the repo root for full license text.
|
|
3
|
+
const DEFAULT_STREAM_TAIL = 1;
|
|
4
|
+
/**
|
|
5
|
+
* Wrap a static `Bar[]` array in an `AsyncIterable<CandleEvent>` the
|
|
6
|
+
* runtime + conformance tests can drive directly.
|
|
7
|
+
*
|
|
8
|
+
* - `"history"` (default) — yields exactly one
|
|
9
|
+
* `{ kind: "history", bars }` event.
|
|
10
|
+
* - `"stream"` — yields one `{ kind: "close", bar }` per bar in array
|
|
11
|
+
* order.
|
|
12
|
+
* - `"history-then-stream"` — yields a single
|
|
13
|
+
* `{ kind: "history", bars }` event for all but the trailing
|
|
14
|
+
* `streamTail` bars (default `1`), then one `{ kind: "close", bar }`
|
|
15
|
+
* per remaining bar. With `streamTail` clamped to `[0, bars.length]`,
|
|
16
|
+
* `streamTail === 0` degenerates to a pure history batch and
|
|
17
|
+
* `streamTail >= bars.length` yields an empty history batch followed
|
|
18
|
+
* by a close-per-bar.
|
|
19
|
+
*
|
|
20
|
+
* @since 0.1
|
|
21
|
+
* @stable
|
|
22
|
+
* @example
|
|
23
|
+
* import { mockCandleSource } from "@invinite-org/chartlang-adapter-kit";
|
|
24
|
+
*
|
|
25
|
+
* const source = mockCandleSource([], { interval: "1D" });
|
|
26
|
+
* for await (const e of source) {
|
|
27
|
+
* void e;
|
|
28
|
+
* }
|
|
29
|
+
*/
|
|
30
|
+
export function mockCandleSource(bars, opts = { interval: "1D" }) {
|
|
31
|
+
const mode = opts.mode ?? "history";
|
|
32
|
+
const streamTail = clampTail(opts.streamTail ?? DEFAULT_STREAM_TAIL, bars.length);
|
|
33
|
+
return {
|
|
34
|
+
async *[Symbol.asyncIterator]() {
|
|
35
|
+
if (mode === "history") {
|
|
36
|
+
yield { kind: "history", bars };
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (mode === "stream") {
|
|
40
|
+
for (const bar of bars) {
|
|
41
|
+
yield { kind: "close", bar };
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// history-then-stream
|
|
46
|
+
const splitAt = bars.length - streamTail;
|
|
47
|
+
yield { kind: "history", bars: bars.slice(0, splitAt) };
|
|
48
|
+
for (let i = splitAt; i < bars.length; i += 1) {
|
|
49
|
+
yield { kind: "close", bar: bars[i] };
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function clampTail(value, total) {
|
|
55
|
+
if (!Number.isFinite(value) || value < 0)
|
|
56
|
+
return 0;
|
|
57
|
+
if (value > total)
|
|
58
|
+
return total;
|
|
59
|
+
return Math.floor(value);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=mockCandleSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockCandleSource.js","sourceRoot":"","sources":["../../src/mocks/mockCandleSource.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AA6C/D,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,gBAAgB,CAC5B,IAAwB,EACxB,OAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE;IAE/C,MAAM,IAAI,GAAyB,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;IAC1D,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,OAAO;QACH,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;YACzB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACrB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAChC,OAAO;YACX,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACrB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;gBACjC,CAAC;gBACD,OAAO;YACX,CAAC;YACD,sBAAsB;YACtB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;YACzC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;YACxD,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,CAAC;QACL,CAAC;KACJ,CAAC;AACN,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,KAAa;IAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACnD,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,KAAK,CAAC;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC"}
|