rdfjs-resource 2.0.0 → 2.0.2
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/dist/LiteralDecoder.js
CHANGED
|
@@ -7,27 +7,40 @@ import { literalDatatypeDefinitions } from "./literalDatatypeDefinitions.js";
|
|
|
7
7
|
*/
|
|
8
8
|
export var LiteralDecoder;
|
|
9
9
|
(function (LiteralDecoder) {
|
|
10
|
+
const BIGINT_NUMBER_MAX_SAFE_INTEGER = BigInt(Number.MAX_SAFE_INTEGER);
|
|
11
|
+
const BIGINT_NUMBER_MIN_SAFE_INTEGER = BigInt(Number.MIN_SAFE_INTEGER);
|
|
12
|
+
function convertBigintToNumber(literal, value) {
|
|
13
|
+
if (value >= BIGINT_NUMBER_MIN_SAFE_INTEGER &&
|
|
14
|
+
value <= BIGINT_NUMBER_MAX_SAFE_INTEGER) {
|
|
15
|
+
return Either.of(Number(value));
|
|
16
|
+
}
|
|
17
|
+
return Left(new LiteralValueError(literal, `bigint ${value} is outside number's safe integer range [${Number.MIN_SAFE_INTEGER}, ${Number.MAX_SAFE_INTEGER}]`));
|
|
18
|
+
}
|
|
19
|
+
function convertNumberToBigint(literal, value) {
|
|
20
|
+
if (Number.isInteger(value)) {
|
|
21
|
+
return Either.of(BigInt(value));
|
|
22
|
+
}
|
|
23
|
+
return Left(new LiteralValueError(literal, `number ${value} is not an integer`));
|
|
24
|
+
}
|
|
10
25
|
function decodeBigIntLiteral(literal) {
|
|
11
|
-
|
|
12
|
-
|
|
26
|
+
const literalDatatypeDefinition = literalDatatypeDefinitions[literal.datatype.value];
|
|
27
|
+
if (!literalDatatypeDefinition) {
|
|
28
|
+
return Left(new LiteralDatatypeError(literal));
|
|
29
|
+
}
|
|
30
|
+
switch (literalDatatypeDefinition.kind) {
|
|
31
|
+
case "bigint":
|
|
32
|
+
return decodeBigIntLiteralValue(literal);
|
|
33
|
+
case "float":
|
|
34
|
+
return decodeFloatLiteralValue(literal).chain((value) => convertNumberToBigint(literal, value));
|
|
35
|
+
case "int":
|
|
36
|
+
return decodeIntLiteralValue(literal).chain((value) => convertNumberToBigint(literal, value));
|
|
37
|
+
default:
|
|
38
|
+
return Left(new LiteralDatatypeError(literal));
|
|
13
39
|
}
|
|
14
|
-
return Left(new LiteralDatatypeError(literal));
|
|
15
40
|
}
|
|
16
41
|
LiteralDecoder.decodeBigIntLiteral = decodeBigIntLiteral;
|
|
17
42
|
function decodeBigIntLiteralValue(literal) {
|
|
18
|
-
return Either.encase(() =>
|
|
19
|
-
const value = BigInt(literal.value);
|
|
20
|
-
const literalDatatypeDefinition = literalDatatypeDefinitions[literal.datatype.value];
|
|
21
|
-
if (literalDatatypeDefinition?.kind !== "bigint") {
|
|
22
|
-
throw new LiteralDatatypeError(literal);
|
|
23
|
-
}
|
|
24
|
-
const [min, max] = literalDatatypeDefinition.range;
|
|
25
|
-
if ((min !== undefined && value < min) ||
|
|
26
|
-
(max !== undefined && value > max)) {
|
|
27
|
-
throw new LiteralValueError(literal, `value (${value}) outside range [${min}, ${max}] of ${literal.datatype.value}`);
|
|
28
|
-
}
|
|
29
|
-
return value;
|
|
30
|
-
});
|
|
43
|
+
return Either.encase(() => BigInt(literal.value));
|
|
31
44
|
}
|
|
32
45
|
function decodeBooleanLiteral(literal) {
|
|
33
46
|
if (literalDatatypeDefinitions[literal.datatype.value]?.kind === "boolean") {
|
|
@@ -75,45 +88,78 @@ export var LiteralDecoder;
|
|
|
75
88
|
return Either.of(new Date(literal.value));
|
|
76
89
|
}
|
|
77
90
|
function decodeFloatLiteral(literal) {
|
|
78
|
-
|
|
79
|
-
|
|
91
|
+
const literalDatatypeDefinition = literalDatatypeDefinitions[literal.datatype.value];
|
|
92
|
+
if (!literalDatatypeDefinition) {
|
|
93
|
+
return Left(new LiteralDatatypeError(literal));
|
|
94
|
+
}
|
|
95
|
+
switch (literalDatatypeDefinition.kind) {
|
|
96
|
+
case "bigint":
|
|
97
|
+
return decodeBigIntLiteral(literal).chain((value) => convertBigintToNumber(literal, value));
|
|
98
|
+
case "float":
|
|
99
|
+
case "int":
|
|
100
|
+
return decodeFloatLiteralValue(literal);
|
|
101
|
+
default:
|
|
102
|
+
return Left(new LiteralDatatypeError(literal));
|
|
80
103
|
}
|
|
81
|
-
return Left(new LiteralDatatypeError(literal));
|
|
82
104
|
}
|
|
83
105
|
LiteralDecoder.decodeFloatLiteral = decodeFloatLiteral;
|
|
84
106
|
function decodeFloatLiteralValue(literal) {
|
|
85
|
-
return Either.encase(() =>
|
|
107
|
+
return Either.encase(() => {
|
|
108
|
+
switch (literal.value.toUpperCase()) {
|
|
109
|
+
case "NAN":
|
|
110
|
+
return NaN;
|
|
111
|
+
case "INF":
|
|
112
|
+
case "+INF":
|
|
113
|
+
return Infinity;
|
|
114
|
+
case "-INF":
|
|
115
|
+
return -Infinity;
|
|
116
|
+
}
|
|
117
|
+
const value = Number.parseFloat(literal.value);
|
|
118
|
+
if (Number.isNaN(value)) {
|
|
119
|
+
throw new LiteralValueError(literal, "not a number");
|
|
120
|
+
}
|
|
121
|
+
return value;
|
|
122
|
+
});
|
|
86
123
|
}
|
|
87
124
|
function decodeIntLiteral(literal) {
|
|
88
|
-
|
|
89
|
-
|
|
125
|
+
const literalDatatypeDefinition = literalDatatypeDefinitions[literal.datatype.value];
|
|
126
|
+
if (!literalDatatypeDefinition) {
|
|
127
|
+
return Left(new LiteralDatatypeError(literal));
|
|
128
|
+
}
|
|
129
|
+
switch (literalDatatypeDefinition.kind) {
|
|
130
|
+
case "bigint":
|
|
131
|
+
return decodeBigIntLiteral(literal).chain((value) => convertBigintToNumber(literal, value));
|
|
132
|
+
case "float":
|
|
133
|
+
case "int":
|
|
134
|
+
return decodeIntLiteralValue(literal);
|
|
135
|
+
default:
|
|
136
|
+
return Left(new LiteralDatatypeError(literal));
|
|
90
137
|
}
|
|
91
|
-
return Left(new LiteralDatatypeError(literal));
|
|
92
138
|
}
|
|
93
139
|
LiteralDecoder.decodeIntLiteral = decodeIntLiteral;
|
|
94
140
|
function decodeIntLiteralValue(literal) {
|
|
95
|
-
return
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (literalDatatypeDefinition?.kind !== "int") {
|
|
99
|
-
throw new LiteralDatatypeError(literal);
|
|
141
|
+
return decodeFloatLiteralValue(literal).chain((value) => {
|
|
142
|
+
if (Number.isInteger(value)) {
|
|
143
|
+
return Either.of(value);
|
|
100
144
|
}
|
|
101
|
-
|
|
102
|
-
if ((min !== undefined && value < min) ||
|
|
103
|
-
(max !== undefined && value > max)) {
|
|
104
|
-
throw new LiteralValueError(literal, `value (${value}) outside range [${min}, ${max}] of ${literal.datatype.value}`);
|
|
105
|
-
}
|
|
106
|
-
return value;
|
|
145
|
+
return Left(new LiteralValueError(literal, `${value} is not an integer`));
|
|
107
146
|
});
|
|
108
147
|
}
|
|
109
148
|
function decodeNumberLiteral(literal) {
|
|
110
|
-
|
|
111
|
-
|
|
149
|
+
const literalDatatypeDefinition = literalDatatypeDefinitions[literal.datatype.value];
|
|
150
|
+
if (!literalDatatypeDefinition) {
|
|
151
|
+
return Left(new LiteralDatatypeError(literal));
|
|
112
152
|
}
|
|
113
|
-
|
|
114
|
-
|
|
153
|
+
switch (literalDatatypeDefinition.kind) {
|
|
154
|
+
case "bigint":
|
|
155
|
+
return decodeBigIntLiteralValue(literal).chain((value) => convertBigintToNumber(literal, value));
|
|
156
|
+
case "float":
|
|
157
|
+
return decodeFloatLiteralValue(literal);
|
|
158
|
+
case "int":
|
|
159
|
+
return decodeIntLiteralValue(literal);
|
|
160
|
+
default:
|
|
161
|
+
return Left(new LiteralDatatypeError(literal));
|
|
115
162
|
}
|
|
116
|
-
return Left(new LiteralDatatypeError(literal));
|
|
117
163
|
}
|
|
118
164
|
LiteralDecoder.decodeNumberLiteral = decodeNumberLiteral;
|
|
119
165
|
function decodePrimitiveLiteral(literal) {
|
|
@@ -23,7 +23,8 @@ export const literalDatatypeDefinitions = {
|
|
|
23
23
|
// 64-bit
|
|
24
24
|
"http://www.w3.org/2001/XMLSchema#double": {
|
|
25
25
|
kind: "float",
|
|
26
|
-
|
|
26
|
+
// Number.MIN_VALUE is the smallest positive number greater than 0
|
|
27
|
+
range: [-Number.MAX_VALUE, Number.MAX_VALUE],
|
|
27
28
|
},
|
|
28
29
|
// Arbitrary precision decimal
|
|
29
30
|
"http://www.w3.org/2001/XMLSchema#decimal": {
|
package/package.json
CHANGED