Skip to content

Commit 3209923

Browse files
committed
add attributes.ts
1 parent 4de3e7b commit 3209923

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed

packages/core/src/attributes.ts

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
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+
}

0 commit comments

Comments
 (0)