@tradingaction/scales 2.0.13
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/LICENSE +24 -0
- package/README.md +5 -0
- package/lib/discontinuousTimeScaleProvider.d.ts +25 -0
- package/lib/discontinuousTimeScaleProvider.js +195 -0
- package/lib/discontinuousTimeScaleProvider.js.map +1 -0
- package/lib/financeDiscontinuousScale.d.ts +16 -0
- package/lib/financeDiscontinuousScale.js +127 -0
- package/lib/financeDiscontinuousScale.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.js +12 -0
- package/lib/index.js.map +1 -0
- package/lib/levels.d.ts +13 -0
- package/lib/levels.js +38 -0
- package/lib/levels.js.map +1 -0
- package/lib/timeFormat.d.ts +1 -0
- package/lib/timeFormat.js +28 -0
- package/lib/timeFormat.js.map +1 -0
- package/package.json +51 -0
- package/src/discontinuousTimeScaleProvider.ts +259 -0
- package/src/financeDiscontinuousScale.ts +149 -0
- package/src/index.ts +18 -0
- package/src/levels.ts +51 -0
- package/src/timeFormat.ts +31 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
https://github.com/reactivemarkets/react-financial-charts
|
|
3
|
+
|
|
4
|
+
Copyright (c) 2015-2018 Ragu Ramaswamy
|
|
5
|
+
Copyright (c) 2016 Julien Renaux
|
|
6
|
+
Copyright (c) 2019 Reactive Markets
|
|
7
|
+
|
|
8
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
in the Software without restriction, including without limitation the rights
|
|
11
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
furnished to do so, subject to the following conditions:
|
|
14
|
+
|
|
15
|
+
The above copyright notice and this permission notice shall be included in
|
|
16
|
+
all copies or substantial portions of the Software.
|
|
17
|
+
|
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
24
|
+
THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IFormatters } from "./levels";
|
|
2
|
+
export interface DiscontinuousTimeScaleProviderBuilder {
|
|
3
|
+
(data: any[]): {
|
|
4
|
+
data: any[];
|
|
5
|
+
xScale: any;
|
|
6
|
+
xAccessor: (data: any) => number;
|
|
7
|
+
displayXAccessor: (data: any) => number;
|
|
8
|
+
};
|
|
9
|
+
initialIndex(): any;
|
|
10
|
+
initialIndex(x: any): DiscontinuousTimeScaleProviderBuilder;
|
|
11
|
+
inputDateAccessor(): any;
|
|
12
|
+
inputDateAccessor(accessor: (data: any) => Date): DiscontinuousTimeScaleProviderBuilder;
|
|
13
|
+
indexAccessor(): any;
|
|
14
|
+
indexAccessor(x: any): DiscontinuousTimeScaleProviderBuilder;
|
|
15
|
+
indexMutator(): any;
|
|
16
|
+
indexMutator(x: any): DiscontinuousTimeScaleProviderBuilder;
|
|
17
|
+
withIndex(): any;
|
|
18
|
+
withIndex(x: any): DiscontinuousTimeScaleProviderBuilder;
|
|
19
|
+
utc(): DiscontinuousTimeScaleProviderBuilder;
|
|
20
|
+
setLocale(locale?: any, formatters?: IFormatters): DiscontinuousTimeScaleProviderBuilder;
|
|
21
|
+
indexCalculator(): any;
|
|
22
|
+
}
|
|
23
|
+
export declare function discontinuousTimeScaleProviderBuilder(): DiscontinuousTimeScaleProviderBuilder;
|
|
24
|
+
declare const _default: DiscontinuousTimeScaleProviderBuilder;
|
|
25
|
+
export default _default;
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { slidingWindow, zipper } from "@tradingaction/core";
|
|
2
|
+
import { timeFormat, timeFormatDefaultLocale } from "d3-time-format";
|
|
3
|
+
import financeDiscontinuousScale from "./financeDiscontinuousScale";
|
|
4
|
+
import { defaultFormatters, levelDefinition } from "./levels";
|
|
5
|
+
const evaluateLevel = (row, date, i, formatters) => {
|
|
6
|
+
return levelDefinition
|
|
7
|
+
.map((eachLevel, idx) => {
|
|
8
|
+
return {
|
|
9
|
+
level: levelDefinition.length - idx - 1,
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
format: formatters[eachLevel(row, date, i)],
|
|
12
|
+
};
|
|
13
|
+
})
|
|
14
|
+
.find((level) => !!level.format);
|
|
15
|
+
};
|
|
16
|
+
const discontinuousIndexCalculator = slidingWindow()
|
|
17
|
+
.windowSize(2)
|
|
18
|
+
.undefinedValue((d, idx, { initialIndex, formatters }) => {
|
|
19
|
+
const i = initialIndex;
|
|
20
|
+
const row = {
|
|
21
|
+
date: d.getTime(),
|
|
22
|
+
startOfSecond: false,
|
|
23
|
+
startOf5Seconds: false,
|
|
24
|
+
startOf15Seconds: false,
|
|
25
|
+
startOf30Seconds: false,
|
|
26
|
+
startOfMinute: false,
|
|
27
|
+
startOf5Minutes: false,
|
|
28
|
+
startOf15Minutes: false,
|
|
29
|
+
startOf30Minutes: false,
|
|
30
|
+
startOfHour: false,
|
|
31
|
+
startOfEighthOfADay: false,
|
|
32
|
+
startOfQuarterDay: false,
|
|
33
|
+
startOfHalfDay: false,
|
|
34
|
+
startOfDay: true,
|
|
35
|
+
startOfWeek: false,
|
|
36
|
+
startOfMonth: false,
|
|
37
|
+
startOfQuarter: false,
|
|
38
|
+
startOfYear: false,
|
|
39
|
+
};
|
|
40
|
+
const level = evaluateLevel(row, d, i, formatters);
|
|
41
|
+
return Object.assign(Object.assign(Object.assign({}, row), { index: i }), level);
|
|
42
|
+
});
|
|
43
|
+
const discontinuousIndexCalculatorLocalTime = discontinuousIndexCalculator.accumulator(([prevDate, nowDate], i, idx, { initialIndex, formatters }) => {
|
|
44
|
+
const nowSeconds = nowDate.getSeconds();
|
|
45
|
+
const nowMinutes = nowDate.getMinutes();
|
|
46
|
+
const nowHours = nowDate.getHours();
|
|
47
|
+
const nowDay = nowDate.getDay();
|
|
48
|
+
const nowMonth = nowDate.getMonth();
|
|
49
|
+
const startOfSecond = nowSeconds !== prevDate.getSeconds();
|
|
50
|
+
const startOf5Seconds = startOfSecond && nowSeconds % 5 === 0;
|
|
51
|
+
const startOf15Seconds = startOfSecond && nowSeconds % 15 === 0;
|
|
52
|
+
const startOf30Seconds = startOfSecond && nowSeconds % 30 === 0;
|
|
53
|
+
const startOfMinute = nowMinutes !== prevDate.getMinutes();
|
|
54
|
+
const startOf5Minutes = startOfMinute && nowMinutes % 5 <= prevDate.getMinutes() % 5;
|
|
55
|
+
const startOf15Minutes = startOfMinute && nowMinutes % 15 <= prevDate.getMinutes() % 15;
|
|
56
|
+
const startOf30Minutes = startOfMinute && nowMinutes % 30 <= prevDate.getMinutes() % 30;
|
|
57
|
+
const startOfHour = nowHours !== prevDate.getHours();
|
|
58
|
+
const startOfEighthOfADay = startOfHour && nowHours % 3 === 0;
|
|
59
|
+
const startOfQuarterDay = startOfHour && nowHours % 6 === 0;
|
|
60
|
+
const startOfHalfDay = startOfHour && nowHours % 12 === 0;
|
|
61
|
+
const startOfDay = nowDay !== prevDate.getDay();
|
|
62
|
+
// According to ISO calendar
|
|
63
|
+
// Sunday = 0, Monday = 1, ... Saturday = 6
|
|
64
|
+
// day of week of today < day of week of yesterday then today is start of week
|
|
65
|
+
const startOfWeek = nowDay < prevDate.getDay();
|
|
66
|
+
// month of today != month of yesterday then today is start of month
|
|
67
|
+
const startOfMonth = nowMonth !== prevDate.getMonth();
|
|
68
|
+
// if start of month and month % 3 === 0 then it is start of quarter
|
|
69
|
+
const startOfQuarter = startOfMonth && nowMonth % 3 <= prevDate.getMonth() % 3;
|
|
70
|
+
// year of today != year of yesterday then today is start of year
|
|
71
|
+
const startOfYear = nowDate.getFullYear() !== prevDate.getFullYear();
|
|
72
|
+
const row = {
|
|
73
|
+
date: nowDate.getTime(),
|
|
74
|
+
startOfSecond,
|
|
75
|
+
startOf5Seconds,
|
|
76
|
+
startOf15Seconds,
|
|
77
|
+
startOf30Seconds,
|
|
78
|
+
startOfMinute,
|
|
79
|
+
startOf5Minutes,
|
|
80
|
+
startOf15Minutes,
|
|
81
|
+
startOf30Minutes,
|
|
82
|
+
startOfHour,
|
|
83
|
+
startOfEighthOfADay,
|
|
84
|
+
startOfQuarterDay,
|
|
85
|
+
startOfHalfDay,
|
|
86
|
+
startOfDay,
|
|
87
|
+
startOfWeek,
|
|
88
|
+
startOfMonth,
|
|
89
|
+
startOfQuarter,
|
|
90
|
+
startOfYear,
|
|
91
|
+
};
|
|
92
|
+
const level = evaluateLevel(row, nowDate, i, formatters);
|
|
93
|
+
return Object.assign(Object.assign(Object.assign({}, row), { index: i + initialIndex }), level);
|
|
94
|
+
});
|
|
95
|
+
function createIndex(realDateAccessor, inputDateAccessor, initialIndex, formatters) {
|
|
96
|
+
return function (data) {
|
|
97
|
+
const dateAccessor = realDateAccessor(inputDateAccessor);
|
|
98
|
+
const calculate = discontinuousIndexCalculatorLocalTime.source(dateAccessor).misc({ initialIndex, formatters });
|
|
99
|
+
const index = calculate(data).map((each) => {
|
|
100
|
+
const { format } = each;
|
|
101
|
+
return {
|
|
102
|
+
index: each.index,
|
|
103
|
+
level: each.level,
|
|
104
|
+
date: new Date(each.date),
|
|
105
|
+
format: timeFormat(format),
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
return { index };
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
export function discontinuousTimeScaleProviderBuilder() {
|
|
112
|
+
let initialIndex = 0;
|
|
113
|
+
let realDateAccessor = (d) => d;
|
|
114
|
+
let inputDateAccessor = (d) => d.date;
|
|
115
|
+
let indexAccessor = (d) => d.idx;
|
|
116
|
+
let indexMutator = (d, idx) => (Object.assign(Object.assign({}, d), { idx }));
|
|
117
|
+
let withIndex;
|
|
118
|
+
let currentFormatters = defaultFormatters;
|
|
119
|
+
const discontinuousTimeScaleProvider = function (data) {
|
|
120
|
+
let index = withIndex;
|
|
121
|
+
if (index === undefined) {
|
|
122
|
+
const response = createIndex(realDateAccessor, inputDateAccessor, initialIndex, currentFormatters)(data);
|
|
123
|
+
index = response.index;
|
|
124
|
+
}
|
|
125
|
+
const inputIndex = index;
|
|
126
|
+
const xScale = financeDiscontinuousScale(inputIndex);
|
|
127
|
+
const mergedData = zipper().combine(indexMutator);
|
|
128
|
+
const finalData = mergedData(data, inputIndex);
|
|
129
|
+
return {
|
|
130
|
+
data: finalData,
|
|
131
|
+
xScale,
|
|
132
|
+
xAccessor: (d) => { var _a; return d && ((_a = indexAccessor(d)) === null || _a === void 0 ? void 0 : _a.index); },
|
|
133
|
+
displayXAccessor: realDateAccessor(inputDateAccessor),
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
discontinuousTimeScaleProvider.initialIndex = function (x) {
|
|
137
|
+
if (!arguments.length) {
|
|
138
|
+
return initialIndex;
|
|
139
|
+
}
|
|
140
|
+
initialIndex = x;
|
|
141
|
+
return discontinuousTimeScaleProvider;
|
|
142
|
+
};
|
|
143
|
+
discontinuousTimeScaleProvider.inputDateAccessor = function (x) {
|
|
144
|
+
if (!arguments.length) {
|
|
145
|
+
return inputDateAccessor;
|
|
146
|
+
}
|
|
147
|
+
inputDateAccessor = x;
|
|
148
|
+
return discontinuousTimeScaleProvider;
|
|
149
|
+
};
|
|
150
|
+
discontinuousTimeScaleProvider.indexAccessor = function (x) {
|
|
151
|
+
if (!arguments.length) {
|
|
152
|
+
return indexAccessor;
|
|
153
|
+
}
|
|
154
|
+
indexAccessor = x;
|
|
155
|
+
return discontinuousTimeScaleProvider;
|
|
156
|
+
};
|
|
157
|
+
discontinuousTimeScaleProvider.indexMutator = function (x) {
|
|
158
|
+
if (!arguments.length) {
|
|
159
|
+
return indexMutator;
|
|
160
|
+
}
|
|
161
|
+
indexMutator = x;
|
|
162
|
+
return discontinuousTimeScaleProvider;
|
|
163
|
+
};
|
|
164
|
+
discontinuousTimeScaleProvider.withIndex = function (x) {
|
|
165
|
+
if (!arguments.length) {
|
|
166
|
+
return withIndex;
|
|
167
|
+
}
|
|
168
|
+
withIndex = x;
|
|
169
|
+
return discontinuousTimeScaleProvider;
|
|
170
|
+
};
|
|
171
|
+
discontinuousTimeScaleProvider.utc = () => {
|
|
172
|
+
realDateAccessor = (dateAccessor) => (d) => {
|
|
173
|
+
const date = dateAccessor(d);
|
|
174
|
+
// The getTimezoneOffset() method returns the time-zone offset from UTC, in minutes, for the current locale.
|
|
175
|
+
const offsetInMillis = date.getTimezoneOffset() * 60 * 1000;
|
|
176
|
+
return new Date(date.getTime() + offsetInMillis);
|
|
177
|
+
};
|
|
178
|
+
return discontinuousTimeScaleProvider;
|
|
179
|
+
};
|
|
180
|
+
discontinuousTimeScaleProvider.setLocale = (locale, formatters) => {
|
|
181
|
+
if (locale !== undefined) {
|
|
182
|
+
timeFormatDefaultLocale(locale);
|
|
183
|
+
}
|
|
184
|
+
if (formatters !== undefined) {
|
|
185
|
+
currentFormatters = formatters;
|
|
186
|
+
}
|
|
187
|
+
return discontinuousTimeScaleProvider;
|
|
188
|
+
};
|
|
189
|
+
discontinuousTimeScaleProvider.indexCalculator = function () {
|
|
190
|
+
return createIndex(realDateAccessor, inputDateAccessor, initialIndex, currentFormatters);
|
|
191
|
+
};
|
|
192
|
+
return discontinuousTimeScaleProvider;
|
|
193
|
+
}
|
|
194
|
+
export default discontinuousTimeScaleProviderBuilder();
|
|
195
|
+
//# sourceMappingURL=discontinuousTimeScaleProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discontinuousTimeScaleProvider.js","sourceRoot":"","sources":["../src/discontinuousTimeScaleProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { InterpolatorFactory } from "d3-scale";
|
|
2
|
+
export default function financeDiscontinuousScale(index: any[], backingLinearScale?: import("d3-scale").ScaleLinear<number, number, never>): {
|
|
3
|
+
(newScale: number): number;
|
|
4
|
+
invert(value: number): number;
|
|
5
|
+
domain(newDomain?: number[]): number[] | any;
|
|
6
|
+
range(range?: number[]): number[] | any;
|
|
7
|
+
rangeRound(range: number[]): import("d3-scale").ScaleLinear<number, number, never>;
|
|
8
|
+
clamp(clamp?: boolean): boolean | any;
|
|
9
|
+
interpolate(interpolate?: InterpolatorFactory<number, number>): InterpolatorFactory<any, any> | any;
|
|
10
|
+
ticks(m?: number): number[];
|
|
11
|
+
tickFormat(): (x: any) => any;
|
|
12
|
+
value(x: any): any;
|
|
13
|
+
nice(count?: number): any;
|
|
14
|
+
index(x?: any[]): any[] | any;
|
|
15
|
+
copy(): any;
|
|
16
|
+
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { ascending } from "d3-array";
|
|
2
|
+
import { scaleLinear } from "d3-scale";
|
|
3
|
+
import { levelDefinition } from "./levels";
|
|
4
|
+
const MAX_LEVEL = levelDefinition.length - 1;
|
|
5
|
+
export default function financeDiscontinuousScale(index, backingLinearScale = scaleLinear()) {
|
|
6
|
+
if (index === undefined) {
|
|
7
|
+
throw new Error("Use the discontinuousTimeScaleProvider to create financeDiscontinuousScale");
|
|
8
|
+
}
|
|
9
|
+
function scale(newScale) {
|
|
10
|
+
return backingLinearScale(newScale);
|
|
11
|
+
}
|
|
12
|
+
scale.invert = (value) => {
|
|
13
|
+
const inverted = backingLinearScale.invert(value);
|
|
14
|
+
return Math.round(inverted * 10000) / 10000;
|
|
15
|
+
};
|
|
16
|
+
scale.domain = (newDomain) => {
|
|
17
|
+
if (newDomain === undefined) {
|
|
18
|
+
return backingLinearScale.domain();
|
|
19
|
+
}
|
|
20
|
+
backingLinearScale.domain(newDomain);
|
|
21
|
+
return scale;
|
|
22
|
+
};
|
|
23
|
+
scale.range = (range) => {
|
|
24
|
+
if (range === undefined) {
|
|
25
|
+
return backingLinearScale.range();
|
|
26
|
+
}
|
|
27
|
+
backingLinearScale.range(range);
|
|
28
|
+
return scale;
|
|
29
|
+
};
|
|
30
|
+
scale.rangeRound = (range) => {
|
|
31
|
+
return backingLinearScale.rangeRound(range);
|
|
32
|
+
};
|
|
33
|
+
scale.clamp = (clamp) => {
|
|
34
|
+
if (clamp === undefined) {
|
|
35
|
+
return backingLinearScale.clamp();
|
|
36
|
+
}
|
|
37
|
+
backingLinearScale.clamp(clamp);
|
|
38
|
+
return scale;
|
|
39
|
+
};
|
|
40
|
+
scale.interpolate = (interpolate) => {
|
|
41
|
+
if (interpolate === undefined) {
|
|
42
|
+
return backingLinearScale.interpolate();
|
|
43
|
+
}
|
|
44
|
+
backingLinearScale.interpolate(interpolate);
|
|
45
|
+
return scale;
|
|
46
|
+
};
|
|
47
|
+
scale.ticks = (m) => {
|
|
48
|
+
var _a, _b, _c;
|
|
49
|
+
const backingTicks = backingLinearScale.ticks(m);
|
|
50
|
+
const ticksMap = new Map();
|
|
51
|
+
const [domainStart, domainEnd] = backingLinearScale.domain();
|
|
52
|
+
const dStart = Math.ceil(domainStart);
|
|
53
|
+
const dHead = (_a = index[0]) === null || _a === void 0 ? void 0 : _a.index;
|
|
54
|
+
const start = Math.max(dStart, dHead) + Math.abs(dHead);
|
|
55
|
+
const end = Math.min(Math.floor(domainEnd), (_b = index[index.length - 1]) === null || _b === void 0 ? void 0 : _b.index) + Math.abs(dHead);
|
|
56
|
+
const desiredTickCount = Math.ceil(((end - start) / (domainEnd - domainStart)) * backingTicks.length);
|
|
57
|
+
for (let i = MAX_LEVEL; i >= 0; i--) {
|
|
58
|
+
const ticksAtLevel = ticksMap.get(i);
|
|
59
|
+
const temp = ticksAtLevel === undefined ? [] : ticksAtLevel.slice();
|
|
60
|
+
for (let j = start; j <= end; j++) {
|
|
61
|
+
if (index[j].level === i) {
|
|
62
|
+
temp.push(index[j]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
ticksMap.set(i, temp);
|
|
66
|
+
}
|
|
67
|
+
let unsortedTicks = [];
|
|
68
|
+
for (let k = MAX_LEVEL; k >= 0; k--) {
|
|
69
|
+
const selectedTicks = (_c = ticksMap.get(k)) !== null && _c !== void 0 ? _c : [];
|
|
70
|
+
if (selectedTicks.length + unsortedTicks.length > desiredTickCount * 1.5) {
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
unsortedTicks = unsortedTicks.concat(selectedTicks.map((d) => d.index));
|
|
74
|
+
}
|
|
75
|
+
const ticks = unsortedTicks.sort(ascending);
|
|
76
|
+
if (end - start > ticks.length) {
|
|
77
|
+
const ticksSet = new Set(ticks);
|
|
78
|
+
const d = Math.abs(index[0].index);
|
|
79
|
+
// ignore ticks within this distance
|
|
80
|
+
const distance = Math.ceil((backingTicks.length > 0
|
|
81
|
+
? (backingTicks[backingTicks.length - 1] - backingTicks[0]) / backingTicks.length / 4
|
|
82
|
+
: 1) * 1.5);
|
|
83
|
+
for (let i = 0; i < ticks.length - 1; i++) {
|
|
84
|
+
for (let j = i + 1; j < ticks.length; j++) {
|
|
85
|
+
if (ticks[j] - ticks[i] <= distance) {
|
|
86
|
+
ticksSet.delete(index[ticks[i] + d].level >= index[ticks[j] + d].level ? ticks[j] : ticks[i]);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// @ts-ignore
|
|
91
|
+
const tickValues = [...ticksSet.values()].map((i) => parseInt(i, 10));
|
|
92
|
+
return tickValues;
|
|
93
|
+
}
|
|
94
|
+
return ticks;
|
|
95
|
+
};
|
|
96
|
+
scale.tickFormat = () => {
|
|
97
|
+
return function (x) {
|
|
98
|
+
const d = Math.abs(index[0].index);
|
|
99
|
+
const { format, date } = index[Math.floor(x + d)];
|
|
100
|
+
return format(date);
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
scale.value = (x) => {
|
|
104
|
+
const d = Math.abs(index[0].index);
|
|
105
|
+
const row = index[Math.floor(x + d)];
|
|
106
|
+
if (row !== undefined) {
|
|
107
|
+
const { date } = row;
|
|
108
|
+
return date;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
scale.nice = (count) => {
|
|
112
|
+
backingLinearScale.nice(count);
|
|
113
|
+
return scale;
|
|
114
|
+
};
|
|
115
|
+
scale.index = (x) => {
|
|
116
|
+
if (x === undefined) {
|
|
117
|
+
return index;
|
|
118
|
+
}
|
|
119
|
+
index = x;
|
|
120
|
+
return scale;
|
|
121
|
+
};
|
|
122
|
+
scale.copy = () => {
|
|
123
|
+
return financeDiscontinuousScale(index, backingLinearScale.copy());
|
|
124
|
+
};
|
|
125
|
+
return scale;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=financeDiscontinuousScale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"financeDiscontinuousScale.js","sourceRoot":"","sources":["../src/financeDiscontinuousScale.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ScaleContinuousNumeric, ScaleTime } from "d3-scale";
|
|
2
|
+
export { default as discontinuousTimeScaleProvider, discontinuousTimeScaleProviderBuilder, } from "./discontinuousTimeScaleProvider";
|
|
3
|
+
export { default as financeDiscontinuousScale } from "./financeDiscontinuousScale";
|
|
4
|
+
export * from "./timeFormat";
|
|
5
|
+
export declare const defaultScaleProvider: <TData, TXAxis extends number | Date>(xScale: ScaleContinuousNumeric<number, number> | ScaleTime<number, number>) => (data: TData[], xAccessor: (data: TData) => TXAxis) => {
|
|
6
|
+
data: TData[];
|
|
7
|
+
xScale: ScaleContinuousNumeric<number, number, never> | ScaleTime<number, number, never>;
|
|
8
|
+
xAccessor: (data: TData) => TXAxis;
|
|
9
|
+
displayXAccessor: (data: TData) => TXAxis;
|
|
10
|
+
};
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { default as discontinuousTimeScaleProvider, discontinuousTimeScaleProviderBuilder, } from "./discontinuousTimeScaleProvider";
|
|
2
|
+
export { default as financeDiscontinuousScale } from "./financeDiscontinuousScale";
|
|
3
|
+
export * from "./timeFormat";
|
|
4
|
+
export const defaultScaleProvider = (xScale) => {
|
|
5
|
+
return (data, xAccessor) => ({
|
|
6
|
+
data,
|
|
7
|
+
xScale,
|
|
8
|
+
xAccessor,
|
|
9
|
+
displayXAccessor: xAccessor,
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACH,OAAO,IAAI,8BAA8B,EACzC,qCAAqC,GACxC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACnF,cAAc,cAAc,CAAC;AAE7B,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAChC,MAA0E,EAC5E,EAAE;IACA,OAAO,CAAC,IAAa,EAAE,SAAkC,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI;QACJ,MAAM;QACN,SAAS;QACT,gBAAgB,EAAE,SAAS;KAC9B,CAAC,CAAC;AACP,CAAC,CAAC"}
|
package/lib/levels.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface IFormatters {
|
|
2
|
+
readonly yearFormat: string;
|
|
3
|
+
readonly quarterFormat: string;
|
|
4
|
+
readonly monthFormat: string;
|
|
5
|
+
readonly weekFormat: string;
|
|
6
|
+
readonly dayFormat: string;
|
|
7
|
+
readonly hourFormat: string;
|
|
8
|
+
readonly minuteFormat: string;
|
|
9
|
+
readonly secondFormat: string;
|
|
10
|
+
readonly milliSecondFormat: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const defaultFormatters: IFormatters;
|
|
13
|
+
export declare const levelDefinition: ((d: any, date: Date, i: number) => any)[];
|
package/lib/levels.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
export const defaultFormatters = {
|
|
3
|
+
yearFormat: "%Y",
|
|
4
|
+
quarterFormat: "%b",
|
|
5
|
+
monthFormat: "%b",
|
|
6
|
+
weekFormat: "%e",
|
|
7
|
+
dayFormat: "%e",
|
|
8
|
+
hourFormat: "%H:%M",
|
|
9
|
+
minuteFormat: "%H:%M",
|
|
10
|
+
secondFormat: "%H:%M:%S",
|
|
11
|
+
milliSecondFormat: ".%L",
|
|
12
|
+
};
|
|
13
|
+
export const levelDefinition = [
|
|
14
|
+
/* 22 */ (d, date, i) => d.startOfYear && date.getFullYear() % 12 === 0 && "yearFormat",
|
|
15
|
+
/* 21 */ (d, date, i) => d.startOfYear && date.getFullYear() % 4 === 0 && "yearFormat",
|
|
16
|
+
/* 20 */ (d, date, i) => d.startOfYear && date.getFullYear() % 2 === 0 && "yearFormat",
|
|
17
|
+
/* 19 */ (d, date, i) => d.startOfYear && "yearFormat",
|
|
18
|
+
/* 18 */ (d, date, i) => d.startOfQuarter && "quarterFormat",
|
|
19
|
+
/* 17 */ (d, date, i) => d.startOfMonth && "monthFormat",
|
|
20
|
+
/* 16 */ (d, date, i) => d.startOfWeek && "weekFormat",
|
|
21
|
+
/* 15 */ (d, date, i) => d.startOfDay && i % 2 === 0 && "dayFormat",
|
|
22
|
+
/* 14 */ (d, date, i) => d.startOfDay && "dayFormat",
|
|
23
|
+
/* 13 */ (d, date, i) => d.startOfHalfDay && "hourFormat",
|
|
24
|
+
/* 12 */ (d, date, i) => d.startOfQuarterDay && "hourFormat",
|
|
25
|
+
/* 11 */ (d, date, i) => d.startOfEighthOfADay && "hourFormat",
|
|
26
|
+
/* 10 */ (d, date, i) => d.startOfHour && date.getHours() % 2 === 0 && "hourFormat",
|
|
27
|
+
/* 9 */ (d, date, i) => d.startOfHour && "hourFormat",
|
|
28
|
+
/* 8 */ (d, date, i) => d.startOf30Minutes && "minuteFormat",
|
|
29
|
+
/* 7 */ (d, date, i) => d.startOf15Minutes && "minuteFormat",
|
|
30
|
+
/* 6 */ (d, date, i) => d.startOf5Minutes && "minuteFormat",
|
|
31
|
+
/* 5 */ (d, date, i) => d.startOfMinute && "minuteFormat",
|
|
32
|
+
/* 4 */ (d, date, i) => d.startOf30Seconds && "secondFormat",
|
|
33
|
+
/* 3 */ (d, date, i) => d.startOf15Seconds && "secondFormat",
|
|
34
|
+
/* 2 */ (d, date, i) => d.startOf5Seconds && "secondFormat",
|
|
35
|
+
/* 1 */ (d, date, i) => d.startOfSecond && "secondFormat",
|
|
36
|
+
/* 0 */ (d, date, i) => "milliSecondFormat",
|
|
37
|
+
];
|
|
38
|
+
//# sourceMappingURL=levels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levels.js","sourceRoot":"","sources":["../src/levels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const timeFormat: (date: Date) => string;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { timeSecond, timeMinute, timeHour, timeDay, timeWeek, timeMonth, timeYear } from "d3-time";
|
|
2
|
+
import { timeFormat as d3TimeFormat } from "d3-time-format";
|
|
3
|
+
const formatMillisecond = d3TimeFormat(".%L");
|
|
4
|
+
const formatSecond = d3TimeFormat(":%S");
|
|
5
|
+
const formatMinute = d3TimeFormat("%H:%M");
|
|
6
|
+
const formatHour = d3TimeFormat("%H:%M");
|
|
7
|
+
const formatDay = d3TimeFormat("%e");
|
|
8
|
+
const formatWeek = d3TimeFormat("%e");
|
|
9
|
+
const formatMonth = d3TimeFormat("%b");
|
|
10
|
+
const formatYear = d3TimeFormat("%Y");
|
|
11
|
+
export const timeFormat = (date) => {
|
|
12
|
+
return (timeSecond(date) < date
|
|
13
|
+
? formatMillisecond
|
|
14
|
+
: timeMinute(date) < date
|
|
15
|
+
? formatSecond
|
|
16
|
+
: timeHour(date) < date
|
|
17
|
+
? formatMinute
|
|
18
|
+
: timeDay(date) < date
|
|
19
|
+
? formatHour
|
|
20
|
+
: timeMonth(date) < date
|
|
21
|
+
? timeWeek(date) < date
|
|
22
|
+
? formatDay
|
|
23
|
+
: formatWeek
|
|
24
|
+
: timeYear(date) < date
|
|
25
|
+
? formatMonth
|
|
26
|
+
: formatYear)(date);
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=timeFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeFormat.js","sourceRoot":"","sources":["../src/timeFormat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,UAAU,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,iBAAiB,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AAC9C,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AACzC,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AACzC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;AACrC,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;AACvC,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAE;IACrC,OAAO,CACH,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI;QACnB,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI;YACzB,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI;gBACvB,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;oBACtB,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI;wBACxB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI;4BACnB,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,UAAU;wBAChB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI;4BACvB,CAAC,CAAC,WAAW;4BACb,CAAC,CAAC,UAAU,CACnB,CAAC,IAAI,CAAC,CAAC;AACZ,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tradingaction/scales",
|
|
3
|
+
"version": "2.0.13",
|
|
4
|
+
"description": "Scales for react-financial-charts",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"main": "./lib/index.js",
|
|
9
|
+
"typings": "./lib/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"lib",
|
|
12
|
+
"src"
|
|
13
|
+
],
|
|
14
|
+
"sideEffects": false,
|
|
15
|
+
"author": "Reactive Markets",
|
|
16
|
+
"keywords": [
|
|
17
|
+
"charts",
|
|
18
|
+
"charting",
|
|
19
|
+
"stockcharts",
|
|
20
|
+
"finance",
|
|
21
|
+
"financial",
|
|
22
|
+
"finance-chart",
|
|
23
|
+
"react",
|
|
24
|
+
"d3"
|
|
25
|
+
],
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/reactivemarkets/react-financial-charts.git"
|
|
30
|
+
},
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/reactivemarkets/react-financial-charts/issues"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "npm run clean && npm run compile",
|
|
36
|
+
"clean": "rimraf lib",
|
|
37
|
+
"compile": "tsc -p tsconfig.json",
|
|
38
|
+
"watch": "tsc -p tsconfig.json --watch --preserveWatchOutput"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@tradingaction/core": "^2.0.13",
|
|
42
|
+
"d3-array": "^2.9.1",
|
|
43
|
+
"d3-scale": "^3.2.3",
|
|
44
|
+
"d3-time-format": "^3.0.0"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"react": "^16.0.0 || ^17.0.0 || ^18.0.0",
|
|
48
|
+
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
|
|
49
|
+
},
|
|
50
|
+
"gitHead": "9c9bc635a2291c8da0e1dd5befa4000e96d83119"
|
|
51
|
+
}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { slidingWindow, zipper } from "@tradingaction/core";
|
|
2
|
+
import { timeFormat, timeFormatDefaultLocale } from "d3-time-format";
|
|
3
|
+
import financeDiscontinuousScale from "./financeDiscontinuousScale";
|
|
4
|
+
import { defaultFormatters, levelDefinition, IFormatters } from "./levels";
|
|
5
|
+
|
|
6
|
+
const evaluateLevel = (row: any, date: Date, i: number, formatters: IFormatters) => {
|
|
7
|
+
return levelDefinition
|
|
8
|
+
.map((eachLevel, idx) => {
|
|
9
|
+
return {
|
|
10
|
+
level: levelDefinition.length - idx - 1,
|
|
11
|
+
|
|
12
|
+
// @ts-ignore
|
|
13
|
+
format: formatters[eachLevel(row, date, i)],
|
|
14
|
+
};
|
|
15
|
+
})
|
|
16
|
+
.find((level) => !!level.format);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const discontinuousIndexCalculator = slidingWindow()
|
|
20
|
+
.windowSize(2)
|
|
21
|
+
.undefinedValue(
|
|
22
|
+
(d: Date, idx: number, { initialIndex, formatters }: { initialIndex: number; formatters: IFormatters }) => {
|
|
23
|
+
const i = initialIndex;
|
|
24
|
+
const row = {
|
|
25
|
+
date: d.getTime(),
|
|
26
|
+
startOfSecond: false,
|
|
27
|
+
startOf5Seconds: false,
|
|
28
|
+
startOf15Seconds: false,
|
|
29
|
+
startOf30Seconds: false,
|
|
30
|
+
startOfMinute: false,
|
|
31
|
+
startOf5Minutes: false,
|
|
32
|
+
startOf15Minutes: false,
|
|
33
|
+
startOf30Minutes: false,
|
|
34
|
+
startOfHour: false,
|
|
35
|
+
startOfEighthOfADay: false,
|
|
36
|
+
startOfQuarterDay: false,
|
|
37
|
+
startOfHalfDay: false,
|
|
38
|
+
startOfDay: true,
|
|
39
|
+
startOfWeek: false,
|
|
40
|
+
startOfMonth: false,
|
|
41
|
+
startOfQuarter: false,
|
|
42
|
+
startOfYear: false,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const level = evaluateLevel(row, d, i, formatters);
|
|
46
|
+
|
|
47
|
+
return { ...row, index: i, ...level };
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const discontinuousIndexCalculatorLocalTime = discontinuousIndexCalculator.accumulator(
|
|
52
|
+
(
|
|
53
|
+
[prevDate, nowDate]: [Date, Date],
|
|
54
|
+
i: number,
|
|
55
|
+
idx: number,
|
|
56
|
+
{ initialIndex, formatters }: { initialIndex: number; formatters: IFormatters },
|
|
57
|
+
) => {
|
|
58
|
+
const nowSeconds = nowDate.getSeconds();
|
|
59
|
+
const nowMinutes = nowDate.getMinutes();
|
|
60
|
+
const nowHours = nowDate.getHours();
|
|
61
|
+
const nowDay = nowDate.getDay();
|
|
62
|
+
const nowMonth = nowDate.getMonth();
|
|
63
|
+
|
|
64
|
+
const startOfSecond = nowSeconds !== prevDate.getSeconds();
|
|
65
|
+
const startOf5Seconds = startOfSecond && nowSeconds % 5 === 0;
|
|
66
|
+
const startOf15Seconds = startOfSecond && nowSeconds % 15 === 0;
|
|
67
|
+
const startOf30Seconds = startOfSecond && nowSeconds % 30 === 0;
|
|
68
|
+
|
|
69
|
+
const startOfMinute = nowMinutes !== prevDate.getMinutes();
|
|
70
|
+
const startOf5Minutes = startOfMinute && nowMinutes % 5 <= prevDate.getMinutes() % 5;
|
|
71
|
+
const startOf15Minutes = startOfMinute && nowMinutes % 15 <= prevDate.getMinutes() % 15;
|
|
72
|
+
const startOf30Minutes = startOfMinute && nowMinutes % 30 <= prevDate.getMinutes() % 30;
|
|
73
|
+
|
|
74
|
+
const startOfHour = nowHours !== prevDate.getHours();
|
|
75
|
+
|
|
76
|
+
const startOfEighthOfADay = startOfHour && nowHours % 3 === 0;
|
|
77
|
+
const startOfQuarterDay = startOfHour && nowHours % 6 === 0;
|
|
78
|
+
const startOfHalfDay = startOfHour && nowHours % 12 === 0;
|
|
79
|
+
|
|
80
|
+
const startOfDay = nowDay !== prevDate.getDay();
|
|
81
|
+
// According to ISO calendar
|
|
82
|
+
// Sunday = 0, Monday = 1, ... Saturday = 6
|
|
83
|
+
// day of week of today < day of week of yesterday then today is start of week
|
|
84
|
+
const startOfWeek = nowDay < prevDate.getDay();
|
|
85
|
+
// month of today != month of yesterday then today is start of month
|
|
86
|
+
const startOfMonth = nowMonth !== prevDate.getMonth();
|
|
87
|
+
// if start of month and month % 3 === 0 then it is start of quarter
|
|
88
|
+
const startOfQuarter = startOfMonth && nowMonth % 3 <= prevDate.getMonth() % 3;
|
|
89
|
+
// year of today != year of yesterday then today is start of year
|
|
90
|
+
const startOfYear = nowDate.getFullYear() !== prevDate.getFullYear();
|
|
91
|
+
|
|
92
|
+
const row = {
|
|
93
|
+
date: nowDate.getTime(),
|
|
94
|
+
startOfSecond,
|
|
95
|
+
startOf5Seconds,
|
|
96
|
+
startOf15Seconds,
|
|
97
|
+
startOf30Seconds,
|
|
98
|
+
startOfMinute,
|
|
99
|
+
startOf5Minutes,
|
|
100
|
+
startOf15Minutes,
|
|
101
|
+
startOf30Minutes,
|
|
102
|
+
startOfHour,
|
|
103
|
+
startOfEighthOfADay,
|
|
104
|
+
startOfQuarterDay,
|
|
105
|
+
startOfHalfDay,
|
|
106
|
+
startOfDay,
|
|
107
|
+
startOfWeek,
|
|
108
|
+
startOfMonth,
|
|
109
|
+
startOfQuarter,
|
|
110
|
+
startOfYear,
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const level = evaluateLevel(row, nowDate, i, formatters);
|
|
114
|
+
|
|
115
|
+
return { ...row, index: i + initialIndex, ...level };
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
function createIndex(realDateAccessor: any, inputDateAccessor: any, initialIndex: number, formatters: IFormatters) {
|
|
120
|
+
return function (data: any[]) {
|
|
121
|
+
const dateAccessor = realDateAccessor(inputDateAccessor);
|
|
122
|
+
|
|
123
|
+
const calculate = discontinuousIndexCalculatorLocalTime.source(dateAccessor).misc({ initialIndex, formatters });
|
|
124
|
+
|
|
125
|
+
const index = calculate(data).map((each) => {
|
|
126
|
+
const { format } = each;
|
|
127
|
+
return {
|
|
128
|
+
index: each.index,
|
|
129
|
+
level: each.level,
|
|
130
|
+
date: new Date(each.date),
|
|
131
|
+
format: timeFormat(format),
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
return { index };
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export interface DiscontinuousTimeScaleProviderBuilder {
|
|
140
|
+
(data: any[]): {
|
|
141
|
+
data: any[];
|
|
142
|
+
xScale: any;
|
|
143
|
+
xAccessor: (data: any) => number;
|
|
144
|
+
displayXAccessor: (data: any) => number;
|
|
145
|
+
};
|
|
146
|
+
initialIndex(): any;
|
|
147
|
+
initialIndex(x: any): DiscontinuousTimeScaleProviderBuilder;
|
|
148
|
+
inputDateAccessor(): any;
|
|
149
|
+
inputDateAccessor(accessor: (data: any) => Date): DiscontinuousTimeScaleProviderBuilder;
|
|
150
|
+
indexAccessor(): any;
|
|
151
|
+
indexAccessor(x: any): DiscontinuousTimeScaleProviderBuilder;
|
|
152
|
+
indexMutator(): any;
|
|
153
|
+
indexMutator(x: any): DiscontinuousTimeScaleProviderBuilder;
|
|
154
|
+
withIndex(): any;
|
|
155
|
+
withIndex(x: any): DiscontinuousTimeScaleProviderBuilder;
|
|
156
|
+
utc(): DiscontinuousTimeScaleProviderBuilder;
|
|
157
|
+
setLocale(locale?: any, formatters?: IFormatters): DiscontinuousTimeScaleProviderBuilder;
|
|
158
|
+
indexCalculator(): any;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function discontinuousTimeScaleProviderBuilder() {
|
|
162
|
+
let initialIndex = 0;
|
|
163
|
+
let realDateAccessor = (d: any) => d;
|
|
164
|
+
let inputDateAccessor = (d: any) => d.date;
|
|
165
|
+
let indexAccessor = (d: any) => d.idx;
|
|
166
|
+
let indexMutator = (d: any, idx: any) => ({ ...d, idx });
|
|
167
|
+
let withIndex: any;
|
|
168
|
+
|
|
169
|
+
let currentFormatters = defaultFormatters;
|
|
170
|
+
|
|
171
|
+
const discontinuousTimeScaleProvider = function (data: any[]) {
|
|
172
|
+
let index = withIndex;
|
|
173
|
+
|
|
174
|
+
if (index === undefined) {
|
|
175
|
+
const response = createIndex(realDateAccessor, inputDateAccessor, initialIndex, currentFormatters)(data);
|
|
176
|
+
|
|
177
|
+
index = response.index;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const inputIndex = index;
|
|
181
|
+
|
|
182
|
+
const xScale = financeDiscontinuousScale(inputIndex);
|
|
183
|
+
|
|
184
|
+
const mergedData = zipper().combine(indexMutator);
|
|
185
|
+
|
|
186
|
+
const finalData = mergedData(data, inputIndex);
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
data: finalData,
|
|
190
|
+
xScale,
|
|
191
|
+
xAccessor: (d: any) => d && indexAccessor(d)?.index,
|
|
192
|
+
displayXAccessor: realDateAccessor(inputDateAccessor),
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
discontinuousTimeScaleProvider.initialIndex = function (x: any) {
|
|
197
|
+
if (!arguments.length) {
|
|
198
|
+
return initialIndex;
|
|
199
|
+
}
|
|
200
|
+
initialIndex = x;
|
|
201
|
+
return discontinuousTimeScaleProvider;
|
|
202
|
+
};
|
|
203
|
+
discontinuousTimeScaleProvider.inputDateAccessor = function (x: any) {
|
|
204
|
+
if (!arguments.length) {
|
|
205
|
+
return inputDateAccessor;
|
|
206
|
+
}
|
|
207
|
+
inputDateAccessor = x;
|
|
208
|
+
return discontinuousTimeScaleProvider;
|
|
209
|
+
};
|
|
210
|
+
discontinuousTimeScaleProvider.indexAccessor = function (x: any) {
|
|
211
|
+
if (!arguments.length) {
|
|
212
|
+
return indexAccessor;
|
|
213
|
+
}
|
|
214
|
+
indexAccessor = x;
|
|
215
|
+
return discontinuousTimeScaleProvider;
|
|
216
|
+
};
|
|
217
|
+
discontinuousTimeScaleProvider.indexMutator = function (x: any) {
|
|
218
|
+
if (!arguments.length) {
|
|
219
|
+
return indexMutator;
|
|
220
|
+
}
|
|
221
|
+
indexMutator = x;
|
|
222
|
+
return discontinuousTimeScaleProvider;
|
|
223
|
+
};
|
|
224
|
+
discontinuousTimeScaleProvider.withIndex = function (x: any) {
|
|
225
|
+
if (!arguments.length) {
|
|
226
|
+
return withIndex;
|
|
227
|
+
}
|
|
228
|
+
withIndex = x;
|
|
229
|
+
return discontinuousTimeScaleProvider;
|
|
230
|
+
};
|
|
231
|
+
discontinuousTimeScaleProvider.utc = () => {
|
|
232
|
+
realDateAccessor = (dateAccessor) => (d: any) => {
|
|
233
|
+
const date = dateAccessor(d);
|
|
234
|
+
// The getTimezoneOffset() method returns the time-zone offset from UTC, in minutes, for the current locale.
|
|
235
|
+
const offsetInMillis = date.getTimezoneOffset() * 60 * 1000;
|
|
236
|
+
return new Date(date.getTime() + offsetInMillis);
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
return discontinuousTimeScaleProvider;
|
|
240
|
+
};
|
|
241
|
+
discontinuousTimeScaleProvider.setLocale = (locale?: any, formatters?: IFormatters) => {
|
|
242
|
+
if (locale !== undefined) {
|
|
243
|
+
timeFormatDefaultLocale(locale);
|
|
244
|
+
}
|
|
245
|
+
if (formatters !== undefined) {
|
|
246
|
+
currentFormatters = formatters;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return discontinuousTimeScaleProvider;
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
discontinuousTimeScaleProvider.indexCalculator = function () {
|
|
253
|
+
return createIndex(realDateAccessor, inputDateAccessor, initialIndex, currentFormatters);
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
return discontinuousTimeScaleProvider as DiscontinuousTimeScaleProviderBuilder;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export default discontinuousTimeScaleProviderBuilder();
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { ascending } from "d3-array";
|
|
2
|
+
import { scaleLinear, InterpolatorFactory } from "d3-scale";
|
|
3
|
+
import { levelDefinition } from "./levels";
|
|
4
|
+
|
|
5
|
+
const MAX_LEVEL = levelDefinition.length - 1;
|
|
6
|
+
|
|
7
|
+
export default function financeDiscontinuousScale(index: any[], backingLinearScale = scaleLinear()) {
|
|
8
|
+
if (index === undefined) {
|
|
9
|
+
throw new Error("Use the discontinuousTimeScaleProvider to create financeDiscontinuousScale");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function scale(newScale: number) {
|
|
13
|
+
return backingLinearScale(newScale);
|
|
14
|
+
}
|
|
15
|
+
scale.invert = (value: number) => {
|
|
16
|
+
const inverted = backingLinearScale.invert(value);
|
|
17
|
+
return Math.round(inverted * 10000) / 10000;
|
|
18
|
+
};
|
|
19
|
+
scale.domain = (newDomain?: number[]) => {
|
|
20
|
+
if (newDomain === undefined) {
|
|
21
|
+
return backingLinearScale.domain();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
backingLinearScale.domain(newDomain);
|
|
25
|
+
return scale;
|
|
26
|
+
};
|
|
27
|
+
scale.range = (range?: number[]) => {
|
|
28
|
+
if (range === undefined) {
|
|
29
|
+
return backingLinearScale.range();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
backingLinearScale.range(range);
|
|
33
|
+
return scale;
|
|
34
|
+
};
|
|
35
|
+
scale.rangeRound = (range: number[]) => {
|
|
36
|
+
return backingLinearScale.rangeRound(range);
|
|
37
|
+
};
|
|
38
|
+
scale.clamp = (clamp?: boolean) => {
|
|
39
|
+
if (clamp === undefined) {
|
|
40
|
+
return backingLinearScale.clamp();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
backingLinearScale.clamp(clamp);
|
|
44
|
+
return scale;
|
|
45
|
+
};
|
|
46
|
+
scale.interpolate = (interpolate?: InterpolatorFactory<number, number>) => {
|
|
47
|
+
if (interpolate === undefined) {
|
|
48
|
+
return backingLinearScale.interpolate();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
backingLinearScale.interpolate(interpolate);
|
|
52
|
+
return scale;
|
|
53
|
+
};
|
|
54
|
+
scale.ticks = (m?: number) => {
|
|
55
|
+
const backingTicks = backingLinearScale.ticks(m);
|
|
56
|
+
const ticksMap = new Map<number, any[]>();
|
|
57
|
+
|
|
58
|
+
const [domainStart, domainEnd] = backingLinearScale.domain();
|
|
59
|
+
|
|
60
|
+
const dStart = Math.ceil(domainStart);
|
|
61
|
+
const dHead = index[0]?.index;
|
|
62
|
+
const start = Math.max(dStart, dHead) + Math.abs(dHead);
|
|
63
|
+
const end = Math.min(Math.floor(domainEnd), index[index.length - 1]?.index) + Math.abs(dHead);
|
|
64
|
+
|
|
65
|
+
const desiredTickCount = Math.ceil(((end - start) / (domainEnd - domainStart)) * backingTicks.length);
|
|
66
|
+
|
|
67
|
+
for (let i = MAX_LEVEL; i >= 0; i--) {
|
|
68
|
+
const ticksAtLevel = ticksMap.get(i);
|
|
69
|
+
const temp = ticksAtLevel === undefined ? [] : ticksAtLevel.slice();
|
|
70
|
+
|
|
71
|
+
for (let j = start; j <= end; j++) {
|
|
72
|
+
if (index[j].level === i) {
|
|
73
|
+
temp.push(index[j]);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
ticksMap.set(i, temp);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
let unsortedTicks: number[] = [];
|
|
81
|
+
for (let k = MAX_LEVEL; k >= 0; k--) {
|
|
82
|
+
const selectedTicks = ticksMap.get(k) ?? [];
|
|
83
|
+
if (selectedTicks.length + unsortedTicks.length > desiredTickCount * 1.5) {
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
unsortedTicks = unsortedTicks.concat(selectedTicks.map((d) => d.index));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const ticks = unsortedTicks.sort(ascending);
|
|
90
|
+
|
|
91
|
+
if (end - start > ticks.length) {
|
|
92
|
+
const ticksSet = new Set(ticks);
|
|
93
|
+
|
|
94
|
+
const d = Math.abs(index[0].index);
|
|
95
|
+
|
|
96
|
+
// ignore ticks within this distance
|
|
97
|
+
const distance = Math.ceil(
|
|
98
|
+
(backingTicks.length > 0
|
|
99
|
+
? (backingTicks[backingTicks.length - 1] - backingTicks[0]) / backingTicks.length / 4
|
|
100
|
+
: 1) * 1.5,
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
for (let i = 0; i < ticks.length - 1; i++) {
|
|
104
|
+
for (let j = i + 1; j < ticks.length; j++) {
|
|
105
|
+
if (ticks[j] - ticks[i] <= distance) {
|
|
106
|
+
ticksSet.delete(index[ticks[i] + d].level >= index[ticks[j] + d].level ? ticks[j] : ticks[i]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// @ts-ignore
|
|
112
|
+
const tickValues = [...ticksSet.values()].map((i) => parseInt(i, 10));
|
|
113
|
+
|
|
114
|
+
return tickValues;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return ticks;
|
|
118
|
+
};
|
|
119
|
+
scale.tickFormat = () => {
|
|
120
|
+
return function (x: any) {
|
|
121
|
+
const d = Math.abs(index[0].index);
|
|
122
|
+
const { format, date } = index[Math.floor(x + d)];
|
|
123
|
+
return format(date);
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
scale.value = (x: any) => {
|
|
127
|
+
const d = Math.abs(index[0].index);
|
|
128
|
+
const row = index[Math.floor(x + d)];
|
|
129
|
+
if (row !== undefined) {
|
|
130
|
+
const { date } = row;
|
|
131
|
+
return date;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
scale.nice = (count?: number) => {
|
|
135
|
+
backingLinearScale.nice(count);
|
|
136
|
+
return scale;
|
|
137
|
+
};
|
|
138
|
+
scale.index = (x?: any[]) => {
|
|
139
|
+
if (x === undefined) {
|
|
140
|
+
return index;
|
|
141
|
+
}
|
|
142
|
+
index = x;
|
|
143
|
+
return scale;
|
|
144
|
+
};
|
|
145
|
+
scale.copy = () => {
|
|
146
|
+
return financeDiscontinuousScale(index, backingLinearScale.copy());
|
|
147
|
+
};
|
|
148
|
+
return scale;
|
|
149
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ScaleContinuousNumeric, ScaleTime } from "d3-scale";
|
|
2
|
+
export {
|
|
3
|
+
default as discontinuousTimeScaleProvider,
|
|
4
|
+
discontinuousTimeScaleProviderBuilder,
|
|
5
|
+
} from "./discontinuousTimeScaleProvider";
|
|
6
|
+
export { default as financeDiscontinuousScale } from "./financeDiscontinuousScale";
|
|
7
|
+
export * from "./timeFormat";
|
|
8
|
+
|
|
9
|
+
export const defaultScaleProvider = <TData, TXAxis extends number | Date>(
|
|
10
|
+
xScale: ScaleContinuousNumeric<number, number> | ScaleTime<number, number>,
|
|
11
|
+
) => {
|
|
12
|
+
return (data: TData[], xAccessor: (data: TData) => TXAxis) => ({
|
|
13
|
+
data,
|
|
14
|
+
xScale,
|
|
15
|
+
xAccessor,
|
|
16
|
+
displayXAccessor: xAccessor,
|
|
17
|
+
});
|
|
18
|
+
};
|
package/src/levels.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
|
|
3
|
+
export interface IFormatters {
|
|
4
|
+
readonly yearFormat: string;
|
|
5
|
+
readonly quarterFormat: string;
|
|
6
|
+
readonly monthFormat: string;
|
|
7
|
+
readonly weekFormat: string;
|
|
8
|
+
readonly dayFormat: string;
|
|
9
|
+
readonly hourFormat: string;
|
|
10
|
+
readonly minuteFormat: string;
|
|
11
|
+
readonly secondFormat: string;
|
|
12
|
+
readonly milliSecondFormat: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const defaultFormatters: IFormatters = {
|
|
16
|
+
yearFormat: "%Y",
|
|
17
|
+
quarterFormat: "%b",
|
|
18
|
+
monthFormat: "%b",
|
|
19
|
+
weekFormat: "%e",
|
|
20
|
+
dayFormat: "%e",
|
|
21
|
+
hourFormat: "%H:%M",
|
|
22
|
+
minuteFormat: "%H:%M",
|
|
23
|
+
secondFormat: "%H:%M:%S",
|
|
24
|
+
milliSecondFormat: ".%L",
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const levelDefinition = [
|
|
28
|
+
/* 22 */ (d: any, date: Date, i: number) => d.startOfYear && date.getFullYear() % 12 === 0 && "yearFormat",
|
|
29
|
+
/* 21 */ (d: any, date: Date, i: number) => d.startOfYear && date.getFullYear() % 4 === 0 && "yearFormat",
|
|
30
|
+
/* 20 */ (d: any, date: Date, i: number) => d.startOfYear && date.getFullYear() % 2 === 0 && "yearFormat",
|
|
31
|
+
/* 19 */ (d: any, date: Date, i: number) => d.startOfYear && "yearFormat",
|
|
32
|
+
/* 18 */ (d: any, date: Date, i: number) => d.startOfQuarter && "quarterFormat",
|
|
33
|
+
/* 17 */ (d: any, date: Date, i: number) => d.startOfMonth && "monthFormat",
|
|
34
|
+
/* 16 */ (d: any, date: Date, i: number) => d.startOfWeek && "weekFormat",
|
|
35
|
+
/* 15 */ (d: any, date: Date, i: number) => d.startOfDay && i % 2 === 0 && "dayFormat",
|
|
36
|
+
/* 14 */ (d: any, date: Date, i: number) => d.startOfDay && "dayFormat",
|
|
37
|
+
/* 13 */ (d: any, date: Date, i: number) => d.startOfHalfDay && "hourFormat", // 12h
|
|
38
|
+
/* 12 */ (d: any, date: Date, i: number) => d.startOfQuarterDay && "hourFormat", // 6h
|
|
39
|
+
/* 11 */ (d: any, date: Date, i: number) => d.startOfEighthOfADay && "hourFormat", // 3h
|
|
40
|
+
/* 10 */ (d: any, date: Date, i: number) => d.startOfHour && date.getHours() % 2 === 0 && "hourFormat", // 2h -- REMOVE THIS
|
|
41
|
+
/* 9 */ (d: any, date: Date, i: number) => d.startOfHour && "hourFormat", // 1h
|
|
42
|
+
/* 8 */ (d: any, date: Date, i: number) => d.startOf30Minutes && "minuteFormat",
|
|
43
|
+
/* 7 */ (d: any, date: Date, i: number) => d.startOf15Minutes && "minuteFormat",
|
|
44
|
+
/* 6 */ (d: any, date: Date, i: number) => d.startOf5Minutes && "minuteFormat",
|
|
45
|
+
/* 5 */ (d: any, date: Date, i: number) => d.startOfMinute && "minuteFormat",
|
|
46
|
+
/* 4 */ (d: any, date: Date, i: number) => d.startOf30Seconds && "secondFormat",
|
|
47
|
+
/* 3 */ (d: any, date: Date, i: number) => d.startOf15Seconds && "secondFormat",
|
|
48
|
+
/* 2 */ (d: any, date: Date, i: number) => d.startOf5Seconds && "secondFormat",
|
|
49
|
+
/* 1 */ (d: any, date: Date, i: number) => d.startOfSecond && "secondFormat",
|
|
50
|
+
/* 0 */ (d: any, date: Date, i: number) => "milliSecondFormat",
|
|
51
|
+
];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { timeSecond, timeMinute, timeHour, timeDay, timeWeek, timeMonth, timeYear } from "d3-time";
|
|
2
|
+
import { timeFormat as d3TimeFormat } from "d3-time-format";
|
|
3
|
+
|
|
4
|
+
const formatMillisecond = d3TimeFormat(".%L");
|
|
5
|
+
const formatSecond = d3TimeFormat(":%S");
|
|
6
|
+
const formatMinute = d3TimeFormat("%H:%M");
|
|
7
|
+
const formatHour = d3TimeFormat("%H:%M");
|
|
8
|
+
const formatDay = d3TimeFormat("%e");
|
|
9
|
+
const formatWeek = d3TimeFormat("%e");
|
|
10
|
+
const formatMonth = d3TimeFormat("%b");
|
|
11
|
+
const formatYear = d3TimeFormat("%Y");
|
|
12
|
+
|
|
13
|
+
export const timeFormat = (date: Date) => {
|
|
14
|
+
return (
|
|
15
|
+
timeSecond(date) < date
|
|
16
|
+
? formatMillisecond
|
|
17
|
+
: timeMinute(date) < date
|
|
18
|
+
? formatSecond
|
|
19
|
+
: timeHour(date) < date
|
|
20
|
+
? formatMinute
|
|
21
|
+
: timeDay(date) < date
|
|
22
|
+
? formatHour
|
|
23
|
+
: timeMonth(date) < date
|
|
24
|
+
? timeWeek(date) < date
|
|
25
|
+
? formatDay
|
|
26
|
+
: formatWeek
|
|
27
|
+
: timeYear(date) < date
|
|
28
|
+
? formatMonth
|
|
29
|
+
: formatYear
|
|
30
|
+
)(date);
|
|
31
|
+
};
|