File tree Expand file tree Collapse file tree 1 file changed +108
-0
lines changed Expand file tree Collapse file tree 1 file changed +108
-0
lines changed Original file line number Diff line number Diff line change 1+ export type Attributes = Record < string , TypedAttributeValue > ;
2+
3+ export type AttributeValueType = string | number | boolean | Array < string > | Array < number > | Array < boolean > ;
4+
5+ export type TypedAttributeValue = (
6+ | {
7+ value : string ;
8+ type : 'string' ;
9+ }
10+ | {
11+ value : number ;
12+ type : 'integer' ;
13+ }
14+ | {
15+ value : number ;
16+ type : 'double' ;
17+ }
18+ | {
19+ value : boolean ;
20+ type : 'boolean' ;
21+ }
22+ | {
23+ value : Array < string > ;
24+ type : 'string[]' ;
25+ }
26+ | {
27+ value : Array < number > ;
28+ type : 'integer[]' ;
29+ }
30+ | {
31+ value : Array < number > ;
32+ type : 'double[]' ;
33+ }
34+ | {
35+ value : Array < boolean > ;
36+ type : 'boolean[]' ;
37+ }
38+ ) & { unit ?: Units } ;
39+
40+ type Units = 'ms' | 's' | 'bytes' | 'count' | 'percent' ;
41+
42+ /**
43+ * Converts an attribute value to a typed attribute value.
44+ *
45+ * Does not allow mixed arrays. In case of a mixed array, the value is stringified and the type is 'string'.
46+ *
47+ * @param value - The value of the passed attribute.
48+ * @returns The typed attribute.
49+ */
50+ export function attributeValueToTypedAttributeValue ( value : AttributeValueType ) : TypedAttributeValue {
51+ switch ( typeof value ) {
52+ case 'number' :
53+ if ( Number . isInteger ( value ) ) {
54+ return {
55+ value,
56+ type : 'integer' ,
57+ } ;
58+ }
59+ return {
60+ value,
61+ type : 'double' ,
62+ } ;
63+ case 'boolean' :
64+ return {
65+ value,
66+ type : 'boolean' ,
67+ } ;
68+ case 'string' :
69+ return {
70+ value,
71+ type : 'string' ,
72+ } ;
73+ }
74+
75+ if ( Array . isArray ( value ) ) {
76+ if ( value . every ( item => typeof item === 'string' ) ) {
77+ return {
78+ value,
79+ type : 'string[]' ,
80+ } ;
81+ }
82+ if ( value . every ( item => typeof item === 'number' ) ) {
83+ if ( value . every ( item => Number . isInteger ( item ) ) ) {
84+ return {
85+ value,
86+ type : 'integer[]' ,
87+ } ;
88+ } else if ( value . every ( item => ! Number . isInteger ( item ) ) ) {
89+ return {
90+ value,
91+ type : 'double[]' ,
92+ } ;
93+ }
94+ }
95+ if ( value . every ( item => typeof item === 'boolean' ) ) {
96+ return {
97+ value,
98+ type : 'boolean[]' ,
99+ } ;
100+ }
101+ }
102+
103+ // Fallback: stringify the passed value
104+ return {
105+ value : JSON . stringify ( value ) ,
106+ type : 'string' ,
107+ } ;
108+ }
You can’t perform that action at this time.
0 commit comments