@orbcharts/core 3.0.0-beta.5 → 3.0.0-beta.7

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 (71) hide show
  1. package/LICENSE +200 -200
  2. package/dist/orbcharts-core.es.js +1481 -1412
  3. package/dist/orbcharts-core.umd.js +4 -4
  4. package/dist/src/defaults.d.ts +22 -22
  5. package/dist/src/utils/orbchartsUtils.d.ts +7 -7
  6. package/dist/src/utils/relationshipObservables.d.ts +13 -0
  7. package/lib/core-types.ts +7 -7
  8. package/package.json +42 -42
  9. package/src/AbstractChart.ts +57 -57
  10. package/src/GridChart.ts +24 -24
  11. package/src/MultiGridChart.ts +24 -24
  12. package/src/MultiValueChart.ts +24 -24
  13. package/src/RelationshipChart.ts +24 -24
  14. package/src/SeriesChart.ts +24 -24
  15. package/src/TreeChart.ts +24 -24
  16. package/src/base/createBaseChart.ts +505 -505
  17. package/src/base/createBasePlugin.ts +153 -153
  18. package/src/base/validators/chartOptionsValidator.ts +23 -23
  19. package/src/base/validators/chartParamsValidator.ts +133 -133
  20. package/src/base/validators/elementValidator.ts +13 -13
  21. package/src/base/validators/pluginsValidator.ts +14 -14
  22. package/src/defaults.ts +235 -235
  23. package/src/defineGridPlugin.ts +3 -3
  24. package/src/defineMultiGridPlugin.ts +3 -3
  25. package/src/defineMultiValuePlugin.ts +3 -3
  26. package/src/defineNoneDataPlugin.ts +4 -4
  27. package/src/defineRelationshipPlugin.ts +3 -3
  28. package/src/defineSeriesPlugin.ts +3 -3
  29. package/src/defineTreePlugin.ts +3 -3
  30. package/src/grid/computedDataFn.ts +129 -129
  31. package/src/grid/contextObserverCallback.ts +176 -176
  32. package/src/grid/dataFormatterValidator.ts +101 -101
  33. package/src/grid/dataValidator.ts +12 -12
  34. package/src/index.ts +20 -20
  35. package/src/multiGrid/computedDataFn.ts +123 -123
  36. package/src/multiGrid/contextObserverCallback.ts +41 -41
  37. package/src/multiGrid/dataFormatterValidator.ts +115 -115
  38. package/src/multiGrid/dataValidator.ts +12 -12
  39. package/src/multiValue/computedDataFn.ts +110 -110
  40. package/src/multiValue/contextObserverCallback.ts +160 -160
  41. package/src/multiValue/dataFormatterValidator.ts +9 -9
  42. package/src/multiValue/dataValidator.ts +9 -9
  43. package/src/relationship/computedDataFn.ts +144 -125
  44. package/src/relationship/contextObserverCallback.ts +80 -12
  45. package/src/relationship/dataFormatterValidator.ts +9 -9
  46. package/src/relationship/dataValidator.ts +9 -9
  47. package/src/series/computedDataFn.ts +88 -88
  48. package/src/series/contextObserverCallback.ts +100 -100
  49. package/src/series/dataFormatterValidator.ts +41 -41
  50. package/src/series/dataValidator.ts +12 -12
  51. package/src/tree/computedDataFn.ts +129 -129
  52. package/src/tree/contextObserverCallback.ts +58 -58
  53. package/src/tree/dataFormatterValidator.ts +13 -13
  54. package/src/tree/dataValidator.ts +13 -13
  55. package/src/utils/commonUtils.ts +55 -55
  56. package/src/utils/d3Scale.ts +198 -198
  57. package/src/utils/errorMessage.ts +42 -42
  58. package/src/utils/gridObservables.ts +683 -683
  59. package/src/utils/index.ts +9 -9
  60. package/src/utils/multiGridObservables.ts +392 -392
  61. package/src/utils/multiValueObservables.ts +661 -661
  62. package/src/utils/observables.ts +219 -219
  63. package/src/utils/orbchartsUtils.ts +377 -377
  64. package/src/utils/relationshipObservables.ts +85 -0
  65. package/src/utils/seriesObservables.ts +175 -175
  66. package/src/utils/treeObservables.ts +105 -105
  67. package/src/utils/validator.ts +126 -126
  68. package/tsconfig.base.json +13 -13
  69. package/tsconfig.json +2 -2
  70. package/vite-env.d.ts +6 -6
  71. package/vite.config.js +22 -22
@@ -1,198 +1,198 @@
1
- import * as d3 from 'd3'
2
- import { DATA_FORMATTER_VALUE_AXIS_DEFAULT } from '../defaults'
3
-
4
- // scaleLinear - 連續資料 -> 座標
5
- export const createValueToAxisScale = ({
6
- maxValue = 1,
7
- minValue = 0,
8
- axisWidth,
9
- scaleDomain = DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleDomain,
10
- scaleRange = DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleRange,
11
- reverse = false
12
- }: {
13
- maxValue: number
14
- minValue: number
15
- axisWidth: number
16
- scaleDomain: [number | 'min' | 'auto', number | 'max' | 'auto']
17
- scaleRange: [number, number] // 0-1
18
- reverse?: boolean
19
- }) => {
20
- // if (minValue === maxValue) {
21
- // maxValue += 1 // 避免最大及最小值相同造成無法計算scale
22
- // minValue -= 1
23
- // }
24
-
25
- // -- 無值補上預設值 --
26
- const domainMin: number | 'min' | 'auto' = scaleDomain[0] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleDomain[0]
27
- const domainMax: number | 'max' | 'auto' = scaleDomain[1] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleDomain[1]
28
- const rangeMin: number = scaleRange[0] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleRange[0]
29
- const rangeMax: number = scaleRange[1] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleRange[1]
30
-
31
- // -- 'auto' | 'max' | 'min' 替換成實際值 --
32
- let domainMinValue: number = (() => {
33
- if (domainMin === 'auto') {
34
- return minValue < 0 ? minValue : 0
35
- } else if (domainMin === 'min') {
36
- return minValue
37
- } else {
38
- return domainMin
39
- }
40
- })()
41
-
42
- let domainMaxValue: number = (() => {
43
- if (domainMax === 'auto') {
44
- return maxValue >= 0 ? maxValue : 0
45
- } else if (domainMax === 'max') {
46
- return maxValue
47
- } else {
48
- return domainMax
49
- }
50
- })()
51
- // let rangeMinValue = axisWidth * rangeMin
52
- // let rangeMaxValue = axisWidth * rangeMax
53
-
54
- // -- 計算padding --
55
- // if (padding > 0) {
56
- // const stepAmount = maxValue - minValue + (padding * 2)
57
- // const eachStepWidth = axisWidth / stepAmount
58
- // const paddingWidth = eachStepWidth * padding
59
- // rangeMinValue += paddingWidth
60
- // rangeMaxValue -= paddingWidth
61
- // }
62
-
63
- // -- 依場景大小換算 --
64
- const axisDomainMinValue = maxValue - (maxValue - domainMinValue) / (1 - rangeMin)
65
- const axisDomainMaxValue = domainMaxValue / rangeMax
66
-
67
- // return d3.scaleLinear()
68
- // .domain([domainMinValue, domainMaxValue])
69
- // .range([rangeMinValue, rangeMaxValue])
70
- if (reverse) {
71
- return d3.scaleLinear()
72
- .domain([axisDomainMinValue, axisDomainMaxValue])
73
- .range([axisWidth, 0])
74
- } else {
75
- return d3.scaleLinear()
76
- .domain([axisDomainMinValue, axisDomainMaxValue])
77
- .range([0, axisWidth])
78
- }
79
- }
80
-
81
- // scaleLinear - 座標 -> 連續資料
82
- export const createAxisToValueScale = ({
83
- maxValue = 1,
84
- minValue = 0,
85
- axisWidth,
86
- scaleDomain = DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleDomain,
87
- scaleRange = DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleRange,
88
- reverse = false
89
- }: {
90
- maxValue: number
91
- minValue: number
92
- axisWidth: number
93
- scaleDomain: [number | 'min' | 'auto', number | 'max' | 'auto']
94
- scaleRange: [number, number] // 0-1
95
- reverse?: boolean
96
- }) => {
97
- if (minValue === maxValue) {
98
- maxValue += 1 // 避免最大及最小值相同造成無法計算scale
99
- minValue -= 1
100
- }
101
-
102
- // -- 無值補上預設值 --
103
- const domainMin: number | 'min' | 'auto' = scaleDomain[0] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleDomain[0]
104
- const domainMax: number | 'max' | 'auto' = scaleDomain[1] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleDomain[1]
105
- const rangeMin: number = scaleRange[0] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleRange[0]
106
- const rangeMax: number = scaleRange[1] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleRange[1]
107
-
108
- // -- 'auto' | 'max' | 'min' 替換成實際值 --
109
- let domainMinValue: number = (() => {
110
- if (domainMin === 'auto') {
111
- return minValue < 0 ? minValue : 0
112
- } else if (domainMin === 'min') {
113
- return minValue
114
- } else {
115
- return domainMin
116
- }
117
- })()
118
-
119
- let domainMaxValue: number = (() => {
120
- if (domainMax === 'auto') {
121
- return maxValue >= 0 ? maxValue : 0
122
- } else if (domainMax === 'max') {
123
- return maxValue
124
- } else {
125
- return domainMax
126
- }
127
- })()
128
- // let rangeMinValue = axisWidth * rangeMin
129
- // let rangeMaxValue = axisWidth * rangeMax
130
-
131
- // -- 計算padding --
132
- // if (padding > 0) {
133
- // const stepAmount = maxValue - minValue + (padding * 2)
134
- // const eachStepWidth = axisWidth / stepAmount
135
- // const paddingWidth = eachStepWidth * padding
136
- // rangeMinValue += paddingWidth
137
- // rangeMaxValue -= paddingWidth
138
- // }
139
-
140
- // -- 依場景大小換算 --
141
- const axisDomainMinValue = maxValue - (maxValue - domainMinValue) / (1 - rangeMin)
142
- const axisDomainMaxValue = domainMaxValue / rangeMax
143
-
144
- // return d3.scaleLinear()
145
- // .domain([domainMinValue, domainMaxValue])
146
- // .range([rangeMinValue, rangeMaxValue])
147
- if (reverse) {
148
- return d3.scaleLinear()
149
- .domain([axisWidth, 0])
150
- .range([axisDomainMinValue, axisDomainMaxValue])
151
- } else {
152
- return d3.scaleLinear()
153
- .domain([0, axisWidth])
154
- .range([axisDomainMinValue, axisDomainMaxValue])
155
- }
156
- }
157
-
158
- // scalePoint - 非連續資料 -> 座標
159
- export const createLabelToAxisScale = ({ axisLabels, axisWidth, padding = 0.5 }: {
160
- axisLabels: string[]
161
- axisWidth: number
162
- padding?: number
163
- // reverse?: boolean
164
- }) => {
165
- let range: [d3.NumberValue, d3.NumberValue] = [0, axisWidth]
166
-
167
- return d3.scalePoint()
168
- .domain(axisLabels)
169
- .range(range)
170
- .padding(padding)
171
- }
172
-
173
- // scaleQuantize - 座標 -> 非連續資料索引
174
- export const createAxisToLabelIndexScale = ({ axisLabels, axisWidth, padding = 0, reverse = false }:{
175
- axisLabels: string[] | Date[],
176
- axisWidth: number
177
- padding?: number
178
- reverse?: boolean
179
- }) => {
180
-
181
- let range: number[] = axisLabels.map((d: string | Date, i: number) => i)
182
- if (reverse) {
183
- range.reverse()
184
- }
185
- // if (reverse) {
186
- // range = axisLabels.map((d: string | Date, i: number) => axisLabels.length - 1 - i)
187
- // } else {
188
- // range = axisLabels.map((d: string | Date, i: number) => i)
189
- // }
190
- const step = range.length - 1 + (padding * 2) // 圖軸刻度分段數量
191
- const stepWidth = axisWidth / step
192
- const rangePadding = stepWidth * padding - (stepWidth * 0.5) // 實際要計算的範圍是圖軸左右那邊增加0.5
193
-
194
- // console.log('rangePadding', rangePadding)
195
- return d3.scaleQuantize<number>()
196
- .domain([rangePadding, axisWidth - rangePadding])
197
- .range(range)
198
- }
1
+ import * as d3 from 'd3'
2
+ import { DEFAULT_DATA_FORMATTER_VALUE_AXIS } from '../defaults'
3
+
4
+ // scaleLinear - 連續資料 -> 座標
5
+ export const createValueToAxisScale = ({
6
+ maxValue = 1,
7
+ minValue = 0,
8
+ axisWidth,
9
+ scaleDomain = DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleDomain,
10
+ scaleRange = DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleRange,
11
+ reverse = false
12
+ }: {
13
+ maxValue: number
14
+ minValue: number
15
+ axisWidth: number
16
+ scaleDomain: [number | 'min' | 'auto', number | 'max' | 'auto']
17
+ scaleRange: [number, number] // 0-1
18
+ reverse?: boolean
19
+ }) => {
20
+ // if (minValue === maxValue) {
21
+ // maxValue += 1 // 避免最大及最小值相同造成無法計算scale
22
+ // minValue -= 1
23
+ // }
24
+
25
+ // -- 無值補上預設值 --
26
+ const domainMin: number | 'min' | 'auto' = scaleDomain[0] ?? DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleDomain[0]
27
+ const domainMax: number | 'max' | 'auto' = scaleDomain[1] ?? DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleDomain[1]
28
+ const rangeMin: number = scaleRange[0] ?? DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleRange[0]
29
+ const rangeMax: number = scaleRange[1] ?? DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleRange[1]
30
+
31
+ // -- 'auto' | 'max' | 'min' 替換成實際值 --
32
+ let domainMinValue: number = (() => {
33
+ if (domainMin === 'auto') {
34
+ return minValue < 0 ? minValue : 0
35
+ } else if (domainMin === 'min') {
36
+ return minValue
37
+ } else {
38
+ return domainMin
39
+ }
40
+ })()
41
+
42
+ let domainMaxValue: number = (() => {
43
+ if (domainMax === 'auto') {
44
+ return maxValue >= 0 ? maxValue : 0
45
+ } else if (domainMax === 'max') {
46
+ return maxValue
47
+ } else {
48
+ return domainMax
49
+ }
50
+ })()
51
+ // let rangeMinValue = axisWidth * rangeMin
52
+ // let rangeMaxValue = axisWidth * rangeMax
53
+
54
+ // -- 計算padding --
55
+ // if (padding > 0) {
56
+ // const stepAmount = maxValue - minValue + (padding * 2)
57
+ // const eachStepWidth = axisWidth / stepAmount
58
+ // const paddingWidth = eachStepWidth * padding
59
+ // rangeMinValue += paddingWidth
60
+ // rangeMaxValue -= paddingWidth
61
+ // }
62
+
63
+ // -- 依場景大小換算 --
64
+ const axisDomainMinValue = maxValue - (maxValue - domainMinValue) / (1 - rangeMin)
65
+ const axisDomainMaxValue = domainMaxValue / rangeMax
66
+
67
+ // return d3.scaleLinear()
68
+ // .domain([domainMinValue, domainMaxValue])
69
+ // .range([rangeMinValue, rangeMaxValue])
70
+ if (reverse) {
71
+ return d3.scaleLinear()
72
+ .domain([axisDomainMinValue, axisDomainMaxValue])
73
+ .range([axisWidth, 0])
74
+ } else {
75
+ return d3.scaleLinear()
76
+ .domain([axisDomainMinValue, axisDomainMaxValue])
77
+ .range([0, axisWidth])
78
+ }
79
+ }
80
+
81
+ // scaleLinear - 座標 -> 連續資料
82
+ export const createAxisToValueScale = ({
83
+ maxValue = 1,
84
+ minValue = 0,
85
+ axisWidth,
86
+ scaleDomain = DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleDomain,
87
+ scaleRange = DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleRange,
88
+ reverse = false
89
+ }: {
90
+ maxValue: number
91
+ minValue: number
92
+ axisWidth: number
93
+ scaleDomain: [number | 'min' | 'auto', number | 'max' | 'auto']
94
+ scaleRange: [number, number] // 0-1
95
+ reverse?: boolean
96
+ }) => {
97
+ if (minValue === maxValue) {
98
+ maxValue += 1 // 避免最大及最小值相同造成無法計算scale
99
+ minValue -= 1
100
+ }
101
+
102
+ // -- 無值補上預設值 --
103
+ const domainMin: number | 'min' | 'auto' = scaleDomain[0] ?? DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleDomain[0]
104
+ const domainMax: number | 'max' | 'auto' = scaleDomain[1] ?? DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleDomain[1]
105
+ const rangeMin: number = scaleRange[0] ?? DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleRange[0]
106
+ const rangeMax: number = scaleRange[1] ?? DEFAULT_DATA_FORMATTER_VALUE_AXIS.scaleRange[1]
107
+
108
+ // -- 'auto' | 'max' | 'min' 替換成實際值 --
109
+ let domainMinValue: number = (() => {
110
+ if (domainMin === 'auto') {
111
+ return minValue < 0 ? minValue : 0
112
+ } else if (domainMin === 'min') {
113
+ return minValue
114
+ } else {
115
+ return domainMin
116
+ }
117
+ })()
118
+
119
+ let domainMaxValue: number = (() => {
120
+ if (domainMax === 'auto') {
121
+ return maxValue >= 0 ? maxValue : 0
122
+ } else if (domainMax === 'max') {
123
+ return maxValue
124
+ } else {
125
+ return domainMax
126
+ }
127
+ })()
128
+ // let rangeMinValue = axisWidth * rangeMin
129
+ // let rangeMaxValue = axisWidth * rangeMax
130
+
131
+ // -- 計算padding --
132
+ // if (padding > 0) {
133
+ // const stepAmount = maxValue - minValue + (padding * 2)
134
+ // const eachStepWidth = axisWidth / stepAmount
135
+ // const paddingWidth = eachStepWidth * padding
136
+ // rangeMinValue += paddingWidth
137
+ // rangeMaxValue -= paddingWidth
138
+ // }
139
+
140
+ // -- 依場景大小換算 --
141
+ const axisDomainMinValue = maxValue - (maxValue - domainMinValue) / (1 - rangeMin)
142
+ const axisDomainMaxValue = domainMaxValue / rangeMax
143
+
144
+ // return d3.scaleLinear()
145
+ // .domain([domainMinValue, domainMaxValue])
146
+ // .range([rangeMinValue, rangeMaxValue])
147
+ if (reverse) {
148
+ return d3.scaleLinear()
149
+ .domain([axisWidth, 0])
150
+ .range([axisDomainMinValue, axisDomainMaxValue])
151
+ } else {
152
+ return d3.scaleLinear()
153
+ .domain([0, axisWidth])
154
+ .range([axisDomainMinValue, axisDomainMaxValue])
155
+ }
156
+ }
157
+
158
+ // scalePoint - 非連續資料 -> 座標
159
+ export const createLabelToAxisScale = ({ axisLabels, axisWidth, padding = 0.5 }: {
160
+ axisLabels: string[]
161
+ axisWidth: number
162
+ padding?: number
163
+ // reverse?: boolean
164
+ }) => {
165
+ let range: [d3.NumberValue, d3.NumberValue] = [0, axisWidth]
166
+
167
+ return d3.scalePoint()
168
+ .domain(axisLabels)
169
+ .range(range)
170
+ .padding(padding)
171
+ }
172
+
173
+ // scaleQuantize - 座標 -> 非連續資料索引
174
+ export const createAxisToLabelIndexScale = ({ axisLabels, axisWidth, padding = 0, reverse = false }:{
175
+ axisLabels: string[] | Date[],
176
+ axisWidth: number
177
+ padding?: number
178
+ reverse?: boolean
179
+ }) => {
180
+
181
+ let range: number[] = axisLabels.map((d: string | Date, i: number) => i)
182
+ if (reverse) {
183
+ range.reverse()
184
+ }
185
+ // if (reverse) {
186
+ // range = axisLabels.map((d: string | Date, i: number) => axisLabels.length - 1 - i)
187
+ // } else {
188
+ // range = axisLabels.map((d: string | Date, i: number) => i)
189
+ // }
190
+ const step = range.length - 1 + (padding * 2) // 圖軸刻度分段數量
191
+ const stepWidth = axisWidth / step
192
+ const rangePadding = stepWidth * padding - (stepWidth * 0.5) // 實際要計算的範圍是圖軸左右那邊增加0.5
193
+
194
+ // console.log('rangePadding', rangePadding)
195
+ return d3.scaleQuantize<number>()
196
+ .domain([rangePadding, axisWidth - rangePadding])
197
+ .range(range)
198
+ }
@@ -1,43 +1,43 @@
1
-
2
- // export function createMessagePrefix (status: 'warning' | 'error'): string {
3
- // return `[OrbCharts ${status}]:`
4
- // }
5
-
6
- export function createOrbChartsErrorMessage (e: {
7
- message: string // e.message
8
- stack: string // e.stack
9
- }): string {
10
- return `[OrbCharts warn]: ${e.message}`
11
- }
12
-
13
-
14
- // // 未預期的錯誤
15
- // export function createUnexpectedErrorMessage ({ from, systemMessage }: {
16
- // from: string //
17
- // systemMessage: string // catch 給的的原生錯誤訊息
18
- // }): string {
19
- // return `${createMessagePrefix('error')} unexpected error from '${from}':
20
- // ${systemMessage}`
21
- // }
22
-
23
- // validator 的 error 訊息
24
- export function createValidatorErrorMessage ({ columnName, expectToBe, from }: {
25
- columnName: string // e.g. 'seriesLabels'
26
- expectToBe: string // e.g. 'string[]'
27
- from: string // e.g. Chart.chartParams$, Pie.params$
28
- }): string {
29
- return `Invalid value: '${columnName}' must be '${expectToBe}'
30
-
31
- ----> find in '${from}'`
32
- }
33
-
34
- // validator 的 warning 訊息
35
- export function createValidatorWarningMessage ({ columnName, expectToBe, from }: {
36
- columnName: string // e.g. 'seriesLabels'
37
- expectToBe: string // e.g. 'string[]'
38
- from: string // e.g. Chart.chartParams$, Pie.params$
39
- }): string {
40
- return `Value is not correct: '${columnName}' suppose to be '${expectToBe}', it may cause unexpected errors.'
41
-
42
- ----> find in '${from}'`
1
+
2
+ // export function createMessagePrefix (status: 'warning' | 'error'): string {
3
+ // return `[OrbCharts ${status}]:`
4
+ // }
5
+
6
+ export function createOrbChartsErrorMessage (e: {
7
+ message: string // e.message
8
+ stack: string // e.stack
9
+ }): string {
10
+ return `[OrbCharts warn]: ${e.message}`
11
+ }
12
+
13
+
14
+ // // 未預期的錯誤
15
+ // export function createUnexpectedErrorMessage ({ from, systemMessage }: {
16
+ // from: string //
17
+ // systemMessage: string // catch 給的的原生錯誤訊息
18
+ // }): string {
19
+ // return `${createMessagePrefix('error')} unexpected error from '${from}':
20
+ // ${systemMessage}`
21
+ // }
22
+
23
+ // validator 的 error 訊息
24
+ export function createValidatorErrorMessage ({ columnName, expectToBe, from }: {
25
+ columnName: string // e.g. 'seriesLabels'
26
+ expectToBe: string // e.g. 'string[]'
27
+ from: string // e.g. Chart.chartParams$, Pie.params$
28
+ }): string {
29
+ return `Invalid value: '${columnName}' must be '${expectToBe}'
30
+
31
+ ----> find in '${from}'`
32
+ }
33
+
34
+ // validator 的 warning 訊息
35
+ export function createValidatorWarningMessage ({ columnName, expectToBe, from }: {
36
+ columnName: string // e.g. 'seriesLabels'
37
+ expectToBe: string // e.g. 'string[]'
38
+ from: string // e.g. Chart.chartParams$, Pie.params$
39
+ }): string {
40
+ return `Value is not correct: '${columnName}' suppose to be '${expectToBe}', it may cause unexpected errors.'
41
+
42
+ ----> find in '${from}'`
43
43
  }