@orbcharts/core 3.0.0-beta.7 → 3.0.0-beta.8
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 +200 -200
- package/dist/orbcharts-core.es.js +402 -399
- package/dist/orbcharts-core.umd.js +3 -3
- package/lib/core-types.ts +7 -7
- package/package.json +42 -42
- package/src/AbstractChart.ts +57 -57
- package/src/GridChart.ts +24 -24
- package/src/MultiGridChart.ts +24 -24
- package/src/MultiValueChart.ts +24 -24
- package/src/RelationshipChart.ts +24 -24
- package/src/SeriesChart.ts +24 -24
- package/src/TreeChart.ts +24 -24
- package/src/base/createBaseChart.ts +505 -505
- package/src/base/createBasePlugin.ts +153 -153
- package/src/base/validators/chartOptionsValidator.ts +23 -23
- package/src/base/validators/chartParamsValidator.ts +133 -133
- package/src/base/validators/elementValidator.ts +13 -13
- package/src/base/validators/pluginsValidator.ts +14 -14
- package/src/defaults.ts +238 -235
- package/src/defineGridPlugin.ts +3 -3
- package/src/defineMultiGridPlugin.ts +3 -3
- package/src/defineMultiValuePlugin.ts +3 -3
- package/src/defineNoneDataPlugin.ts +4 -4
- package/src/defineRelationshipPlugin.ts +3 -3
- package/src/defineSeriesPlugin.ts +3 -3
- package/src/defineTreePlugin.ts +3 -3
- package/src/grid/computedDataFn.ts +129 -129
- package/src/grid/contextObserverCallback.ts +176 -176
- package/src/grid/dataFormatterValidator.ts +101 -101
- package/src/grid/dataValidator.ts +12 -12
- package/src/index.ts +20 -20
- package/src/multiGrid/computedDataFn.ts +123 -123
- package/src/multiGrid/contextObserverCallback.ts +41 -41
- package/src/multiGrid/dataFormatterValidator.ts +115 -115
- package/src/multiGrid/dataValidator.ts +12 -12
- package/src/multiValue/computedDataFn.ts +110 -110
- package/src/multiValue/contextObserverCallback.ts +160 -160
- package/src/multiValue/dataFormatterValidator.ts +9 -9
- package/src/multiValue/dataValidator.ts +9 -9
- package/src/relationship/computedDataFn.ts +144 -144
- package/src/relationship/contextObserverCallback.ts +80 -80
- package/src/relationship/dataFormatterValidator.ts +9 -9
- package/src/relationship/dataValidator.ts +9 -9
- package/src/series/computedDataFn.ts +88 -88
- package/src/series/contextObserverCallback.ts +100 -100
- package/src/series/dataFormatterValidator.ts +41 -41
- package/src/series/dataValidator.ts +12 -12
- package/src/tree/computedDataFn.ts +129 -129
- package/src/tree/contextObserverCallback.ts +58 -58
- package/src/tree/dataFormatterValidator.ts +13 -13
- package/src/tree/dataValidator.ts +13 -13
- package/src/utils/commonUtils.ts +55 -55
- package/src/utils/d3Scale.ts +198 -198
- package/src/utils/errorMessage.ts +42 -42
- package/src/utils/gridObservables.ts +683 -683
- package/src/utils/index.ts +9 -9
- package/src/utils/multiGridObservables.ts +392 -392
- package/src/utils/multiValueObservables.ts +661 -661
- package/src/utils/observables.ts +219 -219
- package/src/utils/orbchartsUtils.ts +377 -377
- package/src/utils/relationshipObservables.ts +84 -84
- package/src/utils/seriesObservables.ts +175 -175
- package/src/utils/treeObservables.ts +105 -105
- package/src/utils/validator.ts +126 -126
- package/tsconfig.base.json +13 -13
- package/tsconfig.json +2 -2
- package/vite-env.d.ts +6 -6
- package/vite.config.js +22 -22
@@ -1,106 +1,106 @@
|
|
1
|
-
import {
|
2
|
-
combineLatest,
|
3
|
-
distinctUntilChanged,
|
4
|
-
filter,
|
5
|
-
map,
|
6
|
-
merge,
|
7
|
-
takeUntil,
|
8
|
-
shareReplay,
|
9
|
-
switchMap,
|
10
|
-
Subject,
|
11
|
-
Observable } from 'rxjs'
|
12
|
-
import type {
|
13
|
-
ChartParams,
|
14
|
-
ComputedDataTree,
|
15
|
-
ComputedDataTypeMap,
|
16
|
-
DataFormatterTree } from '../../lib/core-types'
|
17
|
-
|
18
|
-
|
19
|
-
// 所有節點list結構
|
20
|
-
export const nodeListObservable = ({ computedData$ }: { computedData$: Observable<ComputedDataTree> }) => {
|
21
|
-
return computedData$.pipe(
|
22
|
-
map(data => {
|
23
|
-
function setNodeList (accNodeList: ComputedDataTree[], branch: ComputedDataTree) {
|
24
|
-
accNodeList.push(branch)
|
25
|
-
if (branch.children) {
|
26
|
-
branch.children.forEach(childBranch => {
|
27
|
-
accNodeList = setNodeList(accNodeList, childBranch) // 遞迴子節點
|
28
|
-
})
|
29
|
-
}
|
30
|
-
return accNodeList
|
31
|
-
}
|
32
|
-
return setNodeList([], data)
|
33
|
-
})
|
34
|
-
)
|
35
|
-
}
|
36
|
-
|
37
|
-
// export const categoryLabelsObservable = ({ nodeList$, fullDataFormatter$ }: {
|
38
|
-
// nodeList$: Observable<ComputedDataTree[]>
|
39
|
-
// fullDataFormatter$: Observable<DataFormatterTree>
|
40
|
-
// }) => {
|
41
|
-
|
42
|
-
// const categoryLabels$ = fullDataFormatter$.pipe(
|
43
|
-
// map(d => d.categoryLabels),
|
44
|
-
// distinctUntilChanged((a, b) => {
|
45
|
-
// return JSON.stringify(a).length === JSON.stringify(b).length
|
46
|
-
// }),
|
47
|
-
// )
|
48
|
-
|
49
|
-
// return combineLatest({
|
50
|
-
// nodeList: nodeList$,
|
51
|
-
// categoryLabels: categoryLabels$
|
52
|
-
// }).pipe(
|
53
|
-
// switchMap(async d => d),
|
54
|
-
// map(data => {
|
55
|
-
// const CurrentLabelSet = new Set(data.categoryLabels)
|
56
|
-
// const ExistLabelSet = new Set(
|
57
|
-
// data.nodeList.filter(node => node.visible).map(node => node.categoryLabel)
|
58
|
-
// )
|
59
|
-
// // 加入已存在的label(data.nodeList有,但是dataFormatter.categoryLabels沒有)
|
60
|
-
// Array.from(ExistLabelSet).forEach(label => {
|
61
|
-
// if (!CurrentLabelSet.has(label)) {
|
62
|
-
// CurrentLabelSet.add(label)
|
63
|
-
// }
|
64
|
-
// })
|
65
|
-
// // 移除不存在的label(dataFormatter.categoryLabels有,但是data.nodeList沒有)
|
66
|
-
// Array.from(CurrentLabelSet).forEach(label => {
|
67
|
-
// if (!ExistLabelSet.has(label)) {
|
68
|
-
// ExistLabelSet.delete(label)
|
69
|
-
// }
|
70
|
-
// })
|
71
|
-
|
72
|
-
// return Array.from(CurrentLabelSet)
|
73
|
-
// }),
|
74
|
-
// distinctUntilChanged((a, b) => {
|
75
|
-
// return JSON.stringify(a).length === JSON.stringify(b).length
|
76
|
-
// }),
|
77
|
-
// )
|
78
|
-
// }
|
79
|
-
|
80
|
-
export const categoryLabelsObservable = (CategoryDataMap$: Observable<Map<string, ComputedDataTree[]>>) => {
|
81
|
-
return CategoryDataMap$.pipe(
|
82
|
-
map(data => {
|
83
|
-
return Array.from(data.keys())
|
84
|
-
}),
|
85
|
-
distinctUntilChanged((a, b) => {
|
86
|
-
return JSON.stringify(a).length === JSON.stringify(b).length
|
87
|
-
}),
|
88
|
-
)
|
89
|
-
}
|
90
|
-
|
91
|
-
// 所有可見的節點
|
92
|
-
export const treeVisibleComputedDataObservable = ({ computedData$ }: { computedData$: Observable<ComputedDataTree> }) => {
|
93
|
-
return computedData$.pipe(
|
94
|
-
map(data => {
|
95
|
-
function filterChildren (accTree: ComputedDataTree) {
|
96
|
-
if (accTree.children) {
|
97
|
-
accTree.children = accTree.children
|
98
|
-
.filter(child => child.visible) // 篩選visible
|
99
|
-
.map(child => filterChildren(child)) // 遞迴子節點
|
100
|
-
}
|
101
|
-
return accTree
|
102
|
-
}
|
103
|
-
return filterChildren(data)
|
104
|
-
})
|
105
|
-
)
|
1
|
+
import {
|
2
|
+
combineLatest,
|
3
|
+
distinctUntilChanged,
|
4
|
+
filter,
|
5
|
+
map,
|
6
|
+
merge,
|
7
|
+
takeUntil,
|
8
|
+
shareReplay,
|
9
|
+
switchMap,
|
10
|
+
Subject,
|
11
|
+
Observable } from 'rxjs'
|
12
|
+
import type {
|
13
|
+
ChartParams,
|
14
|
+
ComputedDataTree,
|
15
|
+
ComputedDataTypeMap,
|
16
|
+
DataFormatterTree } from '../../lib/core-types'
|
17
|
+
|
18
|
+
|
19
|
+
// 所有節點list結構
|
20
|
+
export const nodeListObservable = ({ computedData$ }: { computedData$: Observable<ComputedDataTree> }) => {
|
21
|
+
return computedData$.pipe(
|
22
|
+
map(data => {
|
23
|
+
function setNodeList (accNodeList: ComputedDataTree[], branch: ComputedDataTree) {
|
24
|
+
accNodeList.push(branch)
|
25
|
+
if (branch.children) {
|
26
|
+
branch.children.forEach(childBranch => {
|
27
|
+
accNodeList = setNodeList(accNodeList, childBranch) // 遞迴子節點
|
28
|
+
})
|
29
|
+
}
|
30
|
+
return accNodeList
|
31
|
+
}
|
32
|
+
return setNodeList([], data)
|
33
|
+
})
|
34
|
+
)
|
35
|
+
}
|
36
|
+
|
37
|
+
// export const categoryLabelsObservable = ({ nodeList$, fullDataFormatter$ }: {
|
38
|
+
// nodeList$: Observable<ComputedDataTree[]>
|
39
|
+
// fullDataFormatter$: Observable<DataFormatterTree>
|
40
|
+
// }) => {
|
41
|
+
|
42
|
+
// const categoryLabels$ = fullDataFormatter$.pipe(
|
43
|
+
// map(d => d.categoryLabels),
|
44
|
+
// distinctUntilChanged((a, b) => {
|
45
|
+
// return JSON.stringify(a).length === JSON.stringify(b).length
|
46
|
+
// }),
|
47
|
+
// )
|
48
|
+
|
49
|
+
// return combineLatest({
|
50
|
+
// nodeList: nodeList$,
|
51
|
+
// categoryLabels: categoryLabels$
|
52
|
+
// }).pipe(
|
53
|
+
// switchMap(async d => d),
|
54
|
+
// map(data => {
|
55
|
+
// const CurrentLabelSet = new Set(data.categoryLabels)
|
56
|
+
// const ExistLabelSet = new Set(
|
57
|
+
// data.nodeList.filter(node => node.visible).map(node => node.categoryLabel)
|
58
|
+
// )
|
59
|
+
// // 加入已存在的label(data.nodeList有,但是dataFormatter.categoryLabels沒有)
|
60
|
+
// Array.from(ExistLabelSet).forEach(label => {
|
61
|
+
// if (!CurrentLabelSet.has(label)) {
|
62
|
+
// CurrentLabelSet.add(label)
|
63
|
+
// }
|
64
|
+
// })
|
65
|
+
// // 移除不存在的label(dataFormatter.categoryLabels有,但是data.nodeList沒有)
|
66
|
+
// Array.from(CurrentLabelSet).forEach(label => {
|
67
|
+
// if (!ExistLabelSet.has(label)) {
|
68
|
+
// ExistLabelSet.delete(label)
|
69
|
+
// }
|
70
|
+
// })
|
71
|
+
|
72
|
+
// return Array.from(CurrentLabelSet)
|
73
|
+
// }),
|
74
|
+
// distinctUntilChanged((a, b) => {
|
75
|
+
// return JSON.stringify(a).length === JSON.stringify(b).length
|
76
|
+
// }),
|
77
|
+
// )
|
78
|
+
// }
|
79
|
+
|
80
|
+
export const categoryLabelsObservable = (CategoryDataMap$: Observable<Map<string, ComputedDataTree[]>>) => {
|
81
|
+
return CategoryDataMap$.pipe(
|
82
|
+
map(data => {
|
83
|
+
return Array.from(data.keys())
|
84
|
+
}),
|
85
|
+
distinctUntilChanged((a, b) => {
|
86
|
+
return JSON.stringify(a).length === JSON.stringify(b).length
|
87
|
+
}),
|
88
|
+
)
|
89
|
+
}
|
90
|
+
|
91
|
+
// 所有可見的節點
|
92
|
+
export const treeVisibleComputedDataObservable = ({ computedData$ }: { computedData$: Observable<ComputedDataTree> }) => {
|
93
|
+
return computedData$.pipe(
|
94
|
+
map(data => {
|
95
|
+
function filterChildren (accTree: ComputedDataTree) {
|
96
|
+
if (accTree.children) {
|
97
|
+
accTree.children = accTree.children
|
98
|
+
.filter(child => child.visible) // 篩選visible
|
99
|
+
.map(child => filterChildren(child)) // 遞迴子節點
|
100
|
+
}
|
101
|
+
return accTree
|
102
|
+
}
|
103
|
+
return filterChildren(data)
|
104
|
+
})
|
105
|
+
)
|
106
106
|
}
|
package/src/utils/validator.ts
CHANGED
@@ -1,127 +1,127 @@
|
|
1
|
-
import type {
|
2
|
-
ColorType,
|
3
|
-
ValidatorResult,
|
4
|
-
ToBeTypes,
|
5
|
-
ToBeOption,
|
6
|
-
ValidatorRuleToBeTypes,
|
7
|
-
ValidatorRuleToBe,
|
8
|
-
ValidatorRuleToBeOption,
|
9
|
-
ValidatorRule
|
10
|
-
} from '../../lib/core-types'
|
11
|
-
import { isFunction, isPlainObject } from './commonUtils'
|
12
|
-
import { createValidatorErrorMessage } from './errorMessage'
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
// let test: ValidatorRule = {
|
17
|
-
// name: {
|
18
|
-
// toBeTypes: ['string']
|
19
|
-
// },
|
20
|
-
// labels: {
|
21
|
-
// toBe: 'string | "auto"',
|
22
|
-
// test: (value: any) => {
|
23
|
-
// return value === 'auto' || typeof value === 'string'
|
24
|
-
// }
|
25
|
-
// }
|
26
|
-
// }
|
27
|
-
|
28
|
-
function getInvalidColumn<T> (data: T, rules: Partial<ValidatorRule<T>>) {
|
29
|
-
// "toBeTypes" 的測試
|
30
|
-
const testType: {[key in ToBeTypes]: (value: any) => boolean} = {
|
31
|
-
string: (value: any) => typeof value === 'string',
|
32
|
-
number: (value: any) => typeof value === 'number',
|
33
|
-
boolean: (value: any) => typeof value === 'boolean',
|
34
|
-
object: (value: any) => isPlainObject(value), // 嚴格判斷是否為純物件
|
35
|
-
'object[]': (value: any) => Array.isArray(value) && value.every((v: any) => isPlainObject(v)),
|
36
|
-
'string[]': (value: any) => Array.isArray(value) && value.every((v: any) => typeof v === 'string'),
|
37
|
-
'number[]': (value: any) => Array.isArray(value) && value.every((v: any) => typeof v === 'number'),
|
38
|
-
Function: (value: any) => isFunction(value),
|
39
|
-
null: (value: any) => value === null,
|
40
|
-
undefined: (value: any) => value === undefined
|
41
|
-
}
|
42
|
-
// "toBeOption" 的測試
|
43
|
-
const testOption: {[key in ToBeOption]: (value: any) => boolean} = {
|
44
|
-
ColorType: (value: ColorType) => {
|
45
|
-
return value === 'none'
|
46
|
-
|| value === 'label'
|
47
|
-
|| value === 'primary'
|
48
|
-
|| value === 'secondary'
|
49
|
-
|| value === 'white'
|
50
|
-
|| value === 'background'
|
51
|
-
},
|
52
|
-
}
|
53
|
-
|
54
|
-
const failColumn = Object.keys(data).find((columnName: string) => {
|
55
|
-
// 有定義規則
|
56
|
-
if (rules[columnName as keyof T]) {
|
57
|
-
const rule: ValidatorRuleToBeTypes | ValidatorRuleToBe | ValidatorRuleToBeOption = rules[columnName as keyof T]
|
58
|
-
const value = data[columnName as keyof T]
|
59
|
-
// 測試 "toBeTypes"
|
60
|
-
if ((rule as ValidatorRuleToBeTypes).toBeTypes) {
|
61
|
-
const toBeTypes = (rule as ValidatorRuleToBeTypes).toBeTypes
|
62
|
-
const isCorrect = toBeTypes.some((toBeType) => testType[toBeType](value))
|
63
|
-
if (isCorrect === false) {
|
64
|
-
return true
|
65
|
-
}
|
66
|
-
}
|
67
|
-
// 測試 "toBe"
|
68
|
-
else if ((rule as ValidatorRuleToBe).toBe) {
|
69
|
-
const { toBe, test } = rule as ValidatorRuleToBe
|
70
|
-
const isCorrect = test(value)
|
71
|
-
if (isCorrect === false) {
|
72
|
-
return true
|
73
|
-
}
|
74
|
-
}
|
75
|
-
// 測試 "toBeOption"
|
76
|
-
else if ((rule as ValidatorRuleToBeOption).toBeOption) {
|
77
|
-
const toBeOption = (rule as ValidatorRuleToBeOption).toBeOption
|
78
|
-
const isCorrect = testOption[toBeOption](value)
|
79
|
-
if (isCorrect === false) {
|
80
|
-
return true
|
81
|
-
}
|
82
|
-
}
|
83
|
-
}
|
84
|
-
return false
|
85
|
-
})
|
86
|
-
|
87
|
-
return failColumn
|
88
|
-
}
|
89
|
-
|
90
|
-
export function validateColumns<T> (data: T, rules: Partial<ValidatorRule<T>>): ValidatorResult {
|
91
|
-
// if (data === undefined || data === null) {
|
92
|
-
// // orbcharts所有的options都是允許空值的
|
93
|
-
// return {
|
94
|
-
// status: 'success',
|
95
|
-
// columnName: '',
|
96
|
-
// expectToBe: '',
|
97
|
-
// }
|
98
|
-
// }
|
99
|
-
const invalidColumn = getInvalidColumn(data, rules)
|
100
|
-
if (invalidColumn) {
|
101
|
-
const rule = rules[invalidColumn as keyof T]
|
102
|
-
const expectToBe = (rule as ValidatorRuleToBeTypes).toBeTypes
|
103
|
-
? (rule as ValidatorRuleToBeTypes).toBeTypes.join(' | ')
|
104
|
-
: (rule as ValidatorRuleToBe).toBe
|
105
|
-
? (rule as ValidatorRuleToBe).toBe
|
106
|
-
: (rule as ValidatorRuleToBeOption).toBeOption
|
107
|
-
? (rule as ValidatorRuleToBeOption).toBeOption
|
108
|
-
: ''
|
109
|
-
|
110
|
-
return {
|
111
|
-
status: 'error',
|
112
|
-
// message: createValidatorErrorMessage({
|
113
|
-
// columnName: failColumn,
|
114
|
-
// expect,
|
115
|
-
// from
|
116
|
-
// })
|
117
|
-
columnName: invalidColumn as string,
|
118
|
-
expectToBe: expectToBe,
|
119
|
-
}
|
120
|
-
} else {
|
121
|
-
return {
|
122
|
-
status: 'success',
|
123
|
-
columnName: '',
|
124
|
-
expectToBe: '',
|
125
|
-
}
|
126
|
-
}
|
1
|
+
import type {
|
2
|
+
ColorType,
|
3
|
+
ValidatorResult,
|
4
|
+
ToBeTypes,
|
5
|
+
ToBeOption,
|
6
|
+
ValidatorRuleToBeTypes,
|
7
|
+
ValidatorRuleToBe,
|
8
|
+
ValidatorRuleToBeOption,
|
9
|
+
ValidatorRule
|
10
|
+
} from '../../lib/core-types'
|
11
|
+
import { isFunction, isPlainObject } from './commonUtils'
|
12
|
+
import { createValidatorErrorMessage } from './errorMessage'
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
// let test: ValidatorRule = {
|
17
|
+
// name: {
|
18
|
+
// toBeTypes: ['string']
|
19
|
+
// },
|
20
|
+
// labels: {
|
21
|
+
// toBe: 'string | "auto"',
|
22
|
+
// test: (value: any) => {
|
23
|
+
// return value === 'auto' || typeof value === 'string'
|
24
|
+
// }
|
25
|
+
// }
|
26
|
+
// }
|
27
|
+
|
28
|
+
function getInvalidColumn<T> (data: T, rules: Partial<ValidatorRule<T>>) {
|
29
|
+
// "toBeTypes" 的測試
|
30
|
+
const testType: {[key in ToBeTypes]: (value: any) => boolean} = {
|
31
|
+
string: (value: any) => typeof value === 'string',
|
32
|
+
number: (value: any) => typeof value === 'number',
|
33
|
+
boolean: (value: any) => typeof value === 'boolean',
|
34
|
+
object: (value: any) => isPlainObject(value), // 嚴格判斷是否為純物件
|
35
|
+
'object[]': (value: any) => Array.isArray(value) && value.every((v: any) => isPlainObject(v)),
|
36
|
+
'string[]': (value: any) => Array.isArray(value) && value.every((v: any) => typeof v === 'string'),
|
37
|
+
'number[]': (value: any) => Array.isArray(value) && value.every((v: any) => typeof v === 'number'),
|
38
|
+
Function: (value: any) => isFunction(value),
|
39
|
+
null: (value: any) => value === null,
|
40
|
+
undefined: (value: any) => value === undefined
|
41
|
+
}
|
42
|
+
// "toBeOption" 的測試
|
43
|
+
const testOption: {[key in ToBeOption]: (value: any) => boolean} = {
|
44
|
+
ColorType: (value: ColorType) => {
|
45
|
+
return value === 'none'
|
46
|
+
|| value === 'label'
|
47
|
+
|| value === 'primary'
|
48
|
+
|| value === 'secondary'
|
49
|
+
|| value === 'white'
|
50
|
+
|| value === 'background'
|
51
|
+
},
|
52
|
+
}
|
53
|
+
|
54
|
+
const failColumn = Object.keys(data).find((columnName: string) => {
|
55
|
+
// 有定義規則
|
56
|
+
if (rules[columnName as keyof T]) {
|
57
|
+
const rule: ValidatorRuleToBeTypes | ValidatorRuleToBe | ValidatorRuleToBeOption = rules[columnName as keyof T]
|
58
|
+
const value = data[columnName as keyof T]
|
59
|
+
// 測試 "toBeTypes"
|
60
|
+
if ((rule as ValidatorRuleToBeTypes).toBeTypes) {
|
61
|
+
const toBeTypes = (rule as ValidatorRuleToBeTypes).toBeTypes
|
62
|
+
const isCorrect = toBeTypes.some((toBeType) => testType[toBeType](value))
|
63
|
+
if (isCorrect === false) {
|
64
|
+
return true
|
65
|
+
}
|
66
|
+
}
|
67
|
+
// 測試 "toBe"
|
68
|
+
else if ((rule as ValidatorRuleToBe).toBe) {
|
69
|
+
const { toBe, test } = rule as ValidatorRuleToBe
|
70
|
+
const isCorrect = test(value)
|
71
|
+
if (isCorrect === false) {
|
72
|
+
return true
|
73
|
+
}
|
74
|
+
}
|
75
|
+
// 測試 "toBeOption"
|
76
|
+
else if ((rule as ValidatorRuleToBeOption).toBeOption) {
|
77
|
+
const toBeOption = (rule as ValidatorRuleToBeOption).toBeOption
|
78
|
+
const isCorrect = testOption[toBeOption](value)
|
79
|
+
if (isCorrect === false) {
|
80
|
+
return true
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
return false
|
85
|
+
})
|
86
|
+
|
87
|
+
return failColumn
|
88
|
+
}
|
89
|
+
|
90
|
+
export function validateColumns<T> (data: T, rules: Partial<ValidatorRule<T>>): ValidatorResult {
|
91
|
+
// if (data === undefined || data === null) {
|
92
|
+
// // orbcharts所有的options都是允許空值的
|
93
|
+
// return {
|
94
|
+
// status: 'success',
|
95
|
+
// columnName: '',
|
96
|
+
// expectToBe: '',
|
97
|
+
// }
|
98
|
+
// }
|
99
|
+
const invalidColumn = getInvalidColumn(data, rules)
|
100
|
+
if (invalidColumn) {
|
101
|
+
const rule = rules[invalidColumn as keyof T]
|
102
|
+
const expectToBe = (rule as ValidatorRuleToBeTypes).toBeTypes
|
103
|
+
? (rule as ValidatorRuleToBeTypes).toBeTypes.join(' | ')
|
104
|
+
: (rule as ValidatorRuleToBe).toBe
|
105
|
+
? (rule as ValidatorRuleToBe).toBe
|
106
|
+
: (rule as ValidatorRuleToBeOption).toBeOption
|
107
|
+
? (rule as ValidatorRuleToBeOption).toBeOption
|
108
|
+
: ''
|
109
|
+
|
110
|
+
return {
|
111
|
+
status: 'error',
|
112
|
+
// message: createValidatorErrorMessage({
|
113
|
+
// columnName: failColumn,
|
114
|
+
// expect,
|
115
|
+
// from
|
116
|
+
// })
|
117
|
+
columnName: invalidColumn as string,
|
118
|
+
expectToBe: expectToBe,
|
119
|
+
}
|
120
|
+
} else {
|
121
|
+
return {
|
122
|
+
status: 'success',
|
123
|
+
columnName: '',
|
124
|
+
expectToBe: '',
|
125
|
+
}
|
126
|
+
}
|
127
127
|
}
|
package/tsconfig.base.json
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
{
|
2
|
-
"compilerOptions": {
|
3
|
-
"outDir": "./dist/",
|
4
|
-
"sourceMap": true,
|
5
|
-
"noImplicitAny": true,
|
6
|
-
"module": "esnext",
|
7
|
-
"target": "es5",
|
8
|
-
"jsx": "react",
|
9
|
-
"allowJs": true,
|
10
|
-
"moduleResolution": "node",
|
11
|
-
"allowSyntheticDefaultImports" : true,
|
12
|
-
"esModuleInterop" : true
|
13
|
-
}
|
1
|
+
{
|
2
|
+
"compilerOptions": {
|
3
|
+
"outDir": "./dist/",
|
4
|
+
"sourceMap": true,
|
5
|
+
"noImplicitAny": true,
|
6
|
+
"module": "esnext",
|
7
|
+
"target": "es5",
|
8
|
+
"jsx": "react",
|
9
|
+
"allowJs": true,
|
10
|
+
"moduleResolution": "node",
|
11
|
+
"allowSyntheticDefaultImports" : true,
|
12
|
+
"esModuleInterop" : true
|
13
|
+
}
|
14
14
|
}
|
package/tsconfig.json
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
{
|
2
|
-
"extends": "./tsconfig.base.json"
|
1
|
+
{
|
2
|
+
"extends": "./tsconfig.base.json"
|
3
3
|
}
|
package/vite-env.d.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
interface ImportMetaEnv {
|
2
|
-
readonly MODE: 'development' | 'production'
|
3
|
-
}
|
4
|
-
|
5
|
-
interface ImportMeta {
|
6
|
-
readonly env: ImportMetaEnv;
|
1
|
+
interface ImportMetaEnv {
|
2
|
+
readonly MODE: 'development' | 'production'
|
3
|
+
}
|
4
|
+
|
5
|
+
interface ImportMeta {
|
6
|
+
readonly env: ImportMetaEnv;
|
7
7
|
}
|
package/vite.config.js
CHANGED
@@ -1,23 +1,23 @@
|
|
1
|
-
import { defineConfig } from 'vite'
|
2
|
-
import dts from 'vite-plugin-dts'
|
3
|
-
|
4
|
-
export default defineConfig(({ command, mode }) => {
|
5
|
-
return {
|
6
|
-
plugins: [
|
7
|
-
dts({
|
8
|
-
insertTypesEntry: true
|
9
|
-
})
|
10
|
-
],
|
11
|
-
compilerOptions: {
|
12
|
-
composite: true
|
13
|
-
},
|
14
|
-
build: {
|
15
|
-
lib: {
|
16
|
-
entry: "src/index.ts",
|
17
|
-
name: 'orbcharts-core',
|
18
|
-
formats: ["es", "umd"],
|
19
|
-
fileName: format => `orbcharts-core.${format}.js`
|
20
|
-
},
|
21
|
-
}
|
22
|
-
}
|
1
|
+
import { defineConfig } from 'vite'
|
2
|
+
import dts from 'vite-plugin-dts'
|
3
|
+
|
4
|
+
export default defineConfig(({ command, mode }) => {
|
5
|
+
return {
|
6
|
+
plugins: [
|
7
|
+
dts({
|
8
|
+
insertTypesEntry: true
|
9
|
+
})
|
10
|
+
],
|
11
|
+
compilerOptions: {
|
12
|
+
composite: true
|
13
|
+
},
|
14
|
+
build: {
|
15
|
+
lib: {
|
16
|
+
entry: "src/index.ts",
|
17
|
+
name: 'orbcharts-core',
|
18
|
+
formats: ["es", "umd"],
|
19
|
+
fileName: format => `orbcharts-core.${format}.js`
|
20
|
+
},
|
21
|
+
}
|
22
|
+
}
|
23
23
|
})
|