jsonh-ts 1.0.0
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/build/index.d.ts +22 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +22 -0
- package/build/index.js.map +1 -0
- package/build/json-token-type.d.ts +77 -0
- package/build/json-token-type.d.ts.map +1 -0
- package/build/json-token-type.js +79 -0
- package/build/json-token-type.js.map +1 -0
- package/build/jsonh-number-parser.d.ts +21 -0
- package/build/jsonh-number-parser.d.ts.map +1 -0
- package/build/jsonh-number-parser.js +174 -0
- package/build/jsonh-number-parser.js.map +1 -0
- package/build/jsonh-reader-options.d.ts +25 -0
- package/build/jsonh-reader-options.d.ts.map +1 -0
- package/build/jsonh-reader-options.js +26 -0
- package/build/jsonh-reader-options.js.map +1 -0
- package/build/jsonh-reader.d.ts +68 -0
- package/build/jsonh-reader.d.ts.map +1 -0
- package/build/jsonh-reader.js +1218 -0
- package/build/jsonh-reader.js.map +1 -0
- package/build/jsonh-token.d.ts +21 -0
- package/build/jsonh-token.d.ts.map +1 -0
- package/build/jsonh-token.js +36 -0
- package/build/jsonh-token.js.map +1 -0
- package/build/jsonh-version.d.ts +15 -0
- package/build/jsonh-version.d.ts.map +1 -0
- package/build/jsonh-version.js +17 -0
- package/build/jsonh-version.js.map +1 -0
- package/build/result-helpers.d.ts +6 -0
- package/build/result-helpers.d.ts.map +1 -0
- package/build/result-helpers.js +11 -0
- package/build/result-helpers.js.map +1 -0
- package/build/result.d.ts +48 -0
- package/build/result.d.ts.map +1 -0
- package/build/result.js +95 -0
- package/build/result.js.map +1 -0
- package/build/string-text-reader.d.ts +11 -0
- package/build/string-text-reader.d.ts.map +1 -0
- package/build/string-text-reader.js +33 -0
- package/build/string-text-reader.js.map +1 -0
- package/build/text-reader.d.ts +20 -0
- package/build/text-reader.d.ts.map +1 -0
- package/build/text-reader.js +19 -0
- package/build/text-reader.js.map +1 -0
- package/index.ts +21 -0
- package/json-token-type.ts +77 -0
- package/jsonh-number-parser.ts +191 -0
- package/jsonh-reader-options.ts +26 -0
- package/jsonh-reader.ts +1317 -0
- package/jsonh-token.ts +37 -0
- package/jsonh-version.ts +15 -0
- package/package.json +30 -0
- package/result.ts +97 -0
- package/string-text-reader.ts +35 -0
- package/text-reader.ts +30 -0
- package/tsconfig.json +38 -0
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import JsonhReader = require("./jsonh-reader.js");
|
|
2
|
+
import JsonhReaderOptions = require("./jsonh-reader-options.js");
|
|
3
|
+
import JsonhVersion = require("./jsonh-version.js");
|
|
4
|
+
import JsonhToken = require("./jsonh-token.js");
|
|
5
|
+
import JsonTokenType = require("./json-token-type.js");
|
|
6
|
+
import JsonhNumberParser = require("./jsonh-number-parser.js");
|
|
7
|
+
import TextReader = require("./text-reader.js");
|
|
8
|
+
import StringTextReader = require("./string-text-reader.js");
|
|
9
|
+
import Result = require("./result.js");
|
|
10
|
+
declare const _default: {
|
|
11
|
+
JsonhReader: typeof JsonhReader;
|
|
12
|
+
JsonhReaderOptions: typeof JsonhReaderOptions;
|
|
13
|
+
JsonhVersion: typeof JsonhVersion;
|
|
14
|
+
JsonhToken: typeof JsonhToken;
|
|
15
|
+
JsonTokenType: typeof JsonTokenType;
|
|
16
|
+
JsonhNumberParser: typeof JsonhNumberParser;
|
|
17
|
+
TextReader: typeof TextReader;
|
|
18
|
+
StringTextReader: typeof StringTextReader;
|
|
19
|
+
Result: typeof Result;
|
|
20
|
+
};
|
|
21
|
+
export = _default;
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,GAAG,QAAQ,mBAAmB,CAAC,CAAC;AAClD,OAAO,kBAAkB,GAAG,QAAQ,2BAA2B,CAAC,CAAC;AACjE,OAAO,YAAY,GAAG,QAAQ,oBAAoB,CAAC,CAAC;AACpD,OAAO,UAAU,GAAG,QAAQ,kBAAkB,CAAC,CAAC;AAChD,OAAO,aAAa,GAAG,QAAQ,sBAAsB,CAAC,CAAC;AACvD,OAAO,iBAAiB,GAAG,QAAQ,0BAA0B,CAAC,CAAC;AAC/D,OAAO,UAAU,GAAG,QAAQ,kBAAkB,CAAC,CAAC;AAChD,OAAO,gBAAgB,GAAG,QAAQ,yBAAyB,CAAC,CAAC;AAC7D,OAAO,MAAM,GAAG,QAAQ,aAAa,CAAC,CAAC;;;;;;;;;;;;AAEvC,kBAUE"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const JsonhReader = require("./jsonh-reader.js");
|
|
3
|
+
const JsonhReaderOptions = require("./jsonh-reader-options.js");
|
|
4
|
+
const JsonhVersion = require("./jsonh-version.js");
|
|
5
|
+
const JsonhToken = require("./jsonh-token.js");
|
|
6
|
+
const JsonTokenType = require("./json-token-type.js");
|
|
7
|
+
const JsonhNumberParser = require("./jsonh-number-parser.js");
|
|
8
|
+
const TextReader = require("./text-reader.js");
|
|
9
|
+
const StringTextReader = require("./string-text-reader.js");
|
|
10
|
+
const Result = require("./result.js");
|
|
11
|
+
module.exports = {
|
|
12
|
+
JsonhReader,
|
|
13
|
+
JsonhReaderOptions,
|
|
14
|
+
JsonhVersion,
|
|
15
|
+
JsonhToken,
|
|
16
|
+
JsonTokenType,
|
|
17
|
+
JsonhNumberParser,
|
|
18
|
+
TextReader,
|
|
19
|
+
StringTextReader,
|
|
20
|
+
Result,
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAAA,iDAAkD;AAClD,gEAAiE;AACjE,mDAAoD;AACpD,+CAAgD;AAChD,sDAAuD;AACvD,8DAA+D;AAC/D,+CAAgD;AAChD,4DAA6D;AAC7D,sCAAuC;AAEvC,iBAAS;IACL,WAAW;IACX,kBAAkB;IAClB,YAAY;IACZ,UAAU;IACV,aAAa;IACb,iBAAiB;IACjB,UAAU;IACV,gBAAgB;IAChB,MAAM;CACT,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The types of tokens that make up a JSON document.
|
|
3
|
+
*/
|
|
4
|
+
declare enum JsonTokenType {
|
|
5
|
+
/**
|
|
6
|
+
* Indicates that there is no value (not to be confused with {@link Null}).
|
|
7
|
+
*/
|
|
8
|
+
None = 0,
|
|
9
|
+
/**
|
|
10
|
+
* The start of an object.
|
|
11
|
+
*
|
|
12
|
+
* Example: `{`
|
|
13
|
+
*/
|
|
14
|
+
StartObject = 1,
|
|
15
|
+
/**
|
|
16
|
+
* The end of an object.
|
|
17
|
+
*
|
|
18
|
+
* Example: `}`
|
|
19
|
+
*/
|
|
20
|
+
EndObject = 2,
|
|
21
|
+
/**
|
|
22
|
+
* The start of an array.
|
|
23
|
+
*
|
|
24
|
+
* Example: `[`
|
|
25
|
+
*/
|
|
26
|
+
StartArray = 3,
|
|
27
|
+
/**
|
|
28
|
+
* The end of an array.
|
|
29
|
+
*
|
|
30
|
+
* Example: `]`
|
|
31
|
+
*/
|
|
32
|
+
EndArray = 4,
|
|
33
|
+
/**
|
|
34
|
+
* A property name in an object.
|
|
35
|
+
*
|
|
36
|
+
* Example: `"key":`
|
|
37
|
+
*/
|
|
38
|
+
PropertyName = 5,
|
|
39
|
+
/**
|
|
40
|
+
* A comment.
|
|
41
|
+
*
|
|
42
|
+
* Example: `// comment`
|
|
43
|
+
*/
|
|
44
|
+
Comment = 6,
|
|
45
|
+
/**
|
|
46
|
+
* A string.
|
|
47
|
+
*
|
|
48
|
+
* Example: `"value"`
|
|
49
|
+
*/
|
|
50
|
+
String = 7,
|
|
51
|
+
/**
|
|
52
|
+
* A number.
|
|
53
|
+
*
|
|
54
|
+
* Example: `10`
|
|
55
|
+
*/
|
|
56
|
+
Number = 8,
|
|
57
|
+
/**
|
|
58
|
+
* A true boolean.
|
|
59
|
+
*
|
|
60
|
+
* Example: `true`
|
|
61
|
+
*/
|
|
62
|
+
True = 9,
|
|
63
|
+
/**
|
|
64
|
+
* A false boolean.
|
|
65
|
+
*
|
|
66
|
+
* Example: `false`
|
|
67
|
+
*/
|
|
68
|
+
False = 10,
|
|
69
|
+
/**
|
|
70
|
+
* A null value.
|
|
71
|
+
*
|
|
72
|
+
* Example: `null`
|
|
73
|
+
*/
|
|
74
|
+
Null = 11
|
|
75
|
+
}
|
|
76
|
+
export = JsonTokenType;
|
|
77
|
+
//# sourceMappingURL=json-token-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-token-type.d.ts","sourceRoot":"","sources":["../json-token-type.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,aAAK,aAAa;IACd;;OAEG;IACH,IAAI,IAAI;IACR;;;;OAIG;IACH,WAAW,IAAI;IACf;;;;OAIG;IACH,SAAS,IAAI;IACb;;;;OAIG;IACH,UAAU,IAAI;IACd;;;;OAIG;IACH,QAAQ,IAAI;IACZ;;;;OAIG;IACH,YAAY,IAAI;IAChB;;;;OAIG;IACH,OAAO,IAAI;IACX;;;;OAIG;IACH,MAAM,IAAI;IACV;;;;OAIG;IACH,MAAM,IAAI;IACV;;;;OAIG;IACH,IAAI,IAAI;IACR;;;;OAIG;IACH,KAAK,KAAK;IACV;;;;OAIG;IACH,IAAI,KAAK;CACZ;AAED,SAAS,aAAa,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The types of tokens that make up a JSON document.
|
|
4
|
+
*/
|
|
5
|
+
var JsonTokenType;
|
|
6
|
+
(function (JsonTokenType) {
|
|
7
|
+
/**
|
|
8
|
+
* Indicates that there is no value (not to be confused with {@link Null}).
|
|
9
|
+
*/
|
|
10
|
+
JsonTokenType[JsonTokenType["None"] = 0] = "None";
|
|
11
|
+
/**
|
|
12
|
+
* The start of an object.
|
|
13
|
+
*
|
|
14
|
+
* Example: `{`
|
|
15
|
+
*/
|
|
16
|
+
JsonTokenType[JsonTokenType["StartObject"] = 1] = "StartObject";
|
|
17
|
+
/**
|
|
18
|
+
* The end of an object.
|
|
19
|
+
*
|
|
20
|
+
* Example: `}`
|
|
21
|
+
*/
|
|
22
|
+
JsonTokenType[JsonTokenType["EndObject"] = 2] = "EndObject";
|
|
23
|
+
/**
|
|
24
|
+
* The start of an array.
|
|
25
|
+
*
|
|
26
|
+
* Example: `[`
|
|
27
|
+
*/
|
|
28
|
+
JsonTokenType[JsonTokenType["StartArray"] = 3] = "StartArray";
|
|
29
|
+
/**
|
|
30
|
+
* The end of an array.
|
|
31
|
+
*
|
|
32
|
+
* Example: `]`
|
|
33
|
+
*/
|
|
34
|
+
JsonTokenType[JsonTokenType["EndArray"] = 4] = "EndArray";
|
|
35
|
+
/**
|
|
36
|
+
* A property name in an object.
|
|
37
|
+
*
|
|
38
|
+
* Example: `"key":`
|
|
39
|
+
*/
|
|
40
|
+
JsonTokenType[JsonTokenType["PropertyName"] = 5] = "PropertyName";
|
|
41
|
+
/**
|
|
42
|
+
* A comment.
|
|
43
|
+
*
|
|
44
|
+
* Example: `// comment`
|
|
45
|
+
*/
|
|
46
|
+
JsonTokenType[JsonTokenType["Comment"] = 6] = "Comment";
|
|
47
|
+
/**
|
|
48
|
+
* A string.
|
|
49
|
+
*
|
|
50
|
+
* Example: `"value"`
|
|
51
|
+
*/
|
|
52
|
+
JsonTokenType[JsonTokenType["String"] = 7] = "String";
|
|
53
|
+
/**
|
|
54
|
+
* A number.
|
|
55
|
+
*
|
|
56
|
+
* Example: `10`
|
|
57
|
+
*/
|
|
58
|
+
JsonTokenType[JsonTokenType["Number"] = 8] = "Number";
|
|
59
|
+
/**
|
|
60
|
+
* A true boolean.
|
|
61
|
+
*
|
|
62
|
+
* Example: `true`
|
|
63
|
+
*/
|
|
64
|
+
JsonTokenType[JsonTokenType["True"] = 9] = "True";
|
|
65
|
+
/**
|
|
66
|
+
* A false boolean.
|
|
67
|
+
*
|
|
68
|
+
* Example: `false`
|
|
69
|
+
*/
|
|
70
|
+
JsonTokenType[JsonTokenType["False"] = 10] = "False";
|
|
71
|
+
/**
|
|
72
|
+
* A null value.
|
|
73
|
+
*
|
|
74
|
+
* Example: `null`
|
|
75
|
+
*/
|
|
76
|
+
JsonTokenType[JsonTokenType["Null"] = 11] = "Null";
|
|
77
|
+
})(JsonTokenType || (JsonTokenType = {}));
|
|
78
|
+
module.exports = JsonTokenType;
|
|
79
|
+
//# sourceMappingURL=json-token-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-token-type.js","sourceRoot":"","sources":["../json-token-type.ts"],"names":[],"mappings":";AAAA;;GAEG;AACH,IAAK,aAuEJ;AAvED,WAAK,aAAa;IACd;;OAEG;IACH,iDAAQ,CAAA;IACR;;;;OAIG;IACH,+DAAe,CAAA;IACf;;;;OAIG;IACH,2DAAa,CAAA;IACb;;;;OAIG;IACH,6DAAc,CAAA;IACd;;;;OAIG;IACH,yDAAY,CAAA;IACZ;;;;OAIG;IACH,iEAAgB,CAAA;IAChB;;;;OAIG;IACH,uDAAW,CAAA;IACX;;;;OAIG;IACH,qDAAU,CAAA;IACV;;;;OAIG;IACH,qDAAU,CAAA;IACV;;;;OAIG;IACH,iDAAQ,CAAA;IACR;;;;OAIG;IACH,oDAAU,CAAA;IACV;;;;OAIG;IACH,kDAAS,CAAA;AACb,CAAC,EAvEI,aAAa,KAAb,aAAa,QAuEjB;AAED,iBAAS,aAAa,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import Result = require("./result.js");
|
|
2
|
+
/**
|
|
3
|
+
* Methods for parsing JSONH numbers.
|
|
4
|
+
*
|
|
5
|
+
* Unlike `JsonhReader.readElement()`, minimal validation is done here. Ensure the input is valid.
|
|
6
|
+
*/
|
|
7
|
+
declare class JsonhNumberParser {
|
|
8
|
+
#private;
|
|
9
|
+
/**
|
|
10
|
+
* Converts a JSONH number to a base-10 real.
|
|
11
|
+
* For example:
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* Input: +5.2e3.0
|
|
15
|
+
* Output: 5200
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
static parse(jsonhNumber: string): Result<number>;
|
|
19
|
+
}
|
|
20
|
+
export = JsonhNumberParser;
|
|
21
|
+
//# sourceMappingURL=jsonh-number-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonh-number-parser.d.ts","sourceRoot":"","sources":["../jsonh-number-parser.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,GAAG,QAAQ,aAAa,CAAC,CAAC;AAEvC;;;;GAIG;AACH,cAAM,iBAAiB;;IACnB;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;CA2KpD;AAED,SAAS,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const Result = require("./result.js");
|
|
3
|
+
/**
|
|
4
|
+
* Methods for parsing JSONH numbers.
|
|
5
|
+
*
|
|
6
|
+
* Unlike `JsonhReader.readElement()`, minimal validation is done here. Ensure the input is valid.
|
|
7
|
+
*/
|
|
8
|
+
class JsonhNumberParser {
|
|
9
|
+
/**
|
|
10
|
+
* Converts a JSONH number to a base-10 real.
|
|
11
|
+
* For example:
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* Input: +5.2e3.0
|
|
15
|
+
* Output: 5200
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
static parse(jsonhNumber) {
|
|
19
|
+
// Remove underscores
|
|
20
|
+
jsonhNumber = jsonhNumber.replaceAll("_", "");
|
|
21
|
+
let digits = jsonhNumber;
|
|
22
|
+
// Get sign
|
|
23
|
+
let sign = 1;
|
|
24
|
+
if (digits.startsWith('-')) {
|
|
25
|
+
sign = -1;
|
|
26
|
+
digits = digits.slice(1);
|
|
27
|
+
}
|
|
28
|
+
else if (digits.startsWith('+')) {
|
|
29
|
+
sign = 1;
|
|
30
|
+
digits = digits.slice(1);
|
|
31
|
+
}
|
|
32
|
+
// Decimal
|
|
33
|
+
let baseDigits = "0123456789";
|
|
34
|
+
// Hexadecimal
|
|
35
|
+
if (digits.startsWith("0x") || digits.startsWith("0X")) {
|
|
36
|
+
baseDigits = "0123456789abcdef";
|
|
37
|
+
digits = digits.slice(2);
|
|
38
|
+
}
|
|
39
|
+
// Binary
|
|
40
|
+
else if (digits.startsWith("0b") || digits.startsWith("0B")) {
|
|
41
|
+
baseDigits = "01";
|
|
42
|
+
digits = digits.slice(2);
|
|
43
|
+
}
|
|
44
|
+
// Octal
|
|
45
|
+
else if (digits.startsWith("0o") || digits.startsWith("0O")) {
|
|
46
|
+
baseDigits = "01234567";
|
|
47
|
+
digits = digits.slice(2);
|
|
48
|
+
}
|
|
49
|
+
// Parse number with base digits
|
|
50
|
+
let number = this.#parseFractionalNumberWithExponent(digits, baseDigits);
|
|
51
|
+
if (number.isError) {
|
|
52
|
+
return number;
|
|
53
|
+
}
|
|
54
|
+
// Apply sign
|
|
55
|
+
if (sign !== 1) {
|
|
56
|
+
number.value *= sign;
|
|
57
|
+
}
|
|
58
|
+
return number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Converts a fractional number with an exponent (e.g. `12.3e4.5`) from the given base (e.g. `01234567`) to a base-10 real.
|
|
62
|
+
*/
|
|
63
|
+
static #parseFractionalNumberWithExponent(digits, baseDigits) {
|
|
64
|
+
// Find exponent
|
|
65
|
+
let exponentIndex = -1;
|
|
66
|
+
// Hexadecimal exponent
|
|
67
|
+
if (baseDigits.includes('e')) {
|
|
68
|
+
for (let index = 0; index < digits.length; index++) {
|
|
69
|
+
if (digits.at(index) !== 'e' && digits.at(index) !== 'E') {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (index + 1 >= digits.length || (digits.at(index + 1) !== '+' && digits.at(index + 1) !== '-')) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
exponentIndex = index;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Exponent
|
|
80
|
+
else {
|
|
81
|
+
exponentIndex = this.#indexOfAny(digits, ['e', 'E']);
|
|
82
|
+
}
|
|
83
|
+
// If no exponent then parse real
|
|
84
|
+
if (exponentIndex < 0) {
|
|
85
|
+
return this.#parseFractionalNumber(digits, baseDigits);
|
|
86
|
+
}
|
|
87
|
+
// Get mantissa and exponent
|
|
88
|
+
let mantissaPart = digits.slice(0, exponentIndex);
|
|
89
|
+
let exponentPart = digits.slice(exponentIndex + 1);
|
|
90
|
+
// Parse mantissa and exponent
|
|
91
|
+
let mantissa = this.#parseFractionalNumber(mantissaPart, baseDigits);
|
|
92
|
+
if (mantissa.isError) {
|
|
93
|
+
return mantissa;
|
|
94
|
+
}
|
|
95
|
+
let exponent = this.#parseFractionalNumber(exponentPart, baseDigits);
|
|
96
|
+
if (exponent.isError) {
|
|
97
|
+
return exponent;
|
|
98
|
+
}
|
|
99
|
+
// Multiply mantissa by 10 ^ exponent
|
|
100
|
+
return Result.fromValue(mantissa.value * (10 ** exponent.value));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Converts a fractional number (e.g. `123.45`) from the given base (e.g. `01234567`) to a base-10 real.
|
|
104
|
+
*/
|
|
105
|
+
static #parseFractionalNumber(digits, baseDigits) {
|
|
106
|
+
// Find dot
|
|
107
|
+
let dotIndex = digits.indexOf('.');
|
|
108
|
+
// If no dot then normalize integer
|
|
109
|
+
if (dotIndex < 0) {
|
|
110
|
+
return this.#parseWholeNumber(digits, baseDigits);
|
|
111
|
+
}
|
|
112
|
+
// Get parts of number
|
|
113
|
+
let wholePart = digits.slice(0, dotIndex);
|
|
114
|
+
let fractionalPart = digits.slice(dotIndex + 1);
|
|
115
|
+
// Parse parts of number
|
|
116
|
+
let whole = this.#parseWholeNumber(wholePart, baseDigits);
|
|
117
|
+
if (whole.isError) {
|
|
118
|
+
return whole;
|
|
119
|
+
}
|
|
120
|
+
let fraction = this.#parseWholeNumber(fractionalPart, baseDigits);
|
|
121
|
+
if (fraction.isError) {
|
|
122
|
+
return fraction;
|
|
123
|
+
}
|
|
124
|
+
// Combine whole and fraction
|
|
125
|
+
return Result.fromValue(Number.parseFloat(whole.value + '.' + fraction.value));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Converts a whole number (e.g. `12345`) from the given base (e.g. `01234567`) to a base-10 integer.
|
|
129
|
+
*/
|
|
130
|
+
static #parseWholeNumber(digits, baseDigits) {
|
|
131
|
+
// Get sign
|
|
132
|
+
let sign = 1;
|
|
133
|
+
if (digits.startsWith('-')) {
|
|
134
|
+
sign = -1;
|
|
135
|
+
digits = digits.slice(1);
|
|
136
|
+
}
|
|
137
|
+
else if (digits.startsWith('+')) {
|
|
138
|
+
sign = 1;
|
|
139
|
+
digits = digits.slice(1);
|
|
140
|
+
}
|
|
141
|
+
// Add each column of digits
|
|
142
|
+
let integer = 0;
|
|
143
|
+
for (let index = 0; index < digits.length; index++) {
|
|
144
|
+
// Get current digit
|
|
145
|
+
let digitChar = digits.at(index);
|
|
146
|
+
let digitInt = baseDigits.indexOf(digitChar.toLowerCase());
|
|
147
|
+
// Ensure digit is valid
|
|
148
|
+
if (digitInt < 0) {
|
|
149
|
+
return Result.fromError(new Error(`Invalid digit: '${digitChar}'`));
|
|
150
|
+
}
|
|
151
|
+
// Get magnitude of current digit column
|
|
152
|
+
let columnNumber = digits.length - 1 - index;
|
|
153
|
+
let columnMagnitude = baseDigits.length ** columnNumber;
|
|
154
|
+
// Add value of column
|
|
155
|
+
integer += digitInt * columnMagnitude;
|
|
156
|
+
}
|
|
157
|
+
// Apply sign
|
|
158
|
+
if (sign !== 1) {
|
|
159
|
+
integer *= sign;
|
|
160
|
+
}
|
|
161
|
+
return Result.fromValue(integer);
|
|
162
|
+
}
|
|
163
|
+
static #indexOfAny(input, chars) {
|
|
164
|
+
for (let i = 0; i < input.length; i++) {
|
|
165
|
+
let char = input.at(i);
|
|
166
|
+
if (chars.includes(char)) {
|
|
167
|
+
return i;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return -1;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
module.exports = JsonhNumberParser;
|
|
174
|
+
//# sourceMappingURL=jsonh-number-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonh-number-parser.js","sourceRoot":"","sources":["../jsonh-number-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import JsonhVersion = require("./jsonh-version.js");
|
|
2
|
+
/**
|
|
3
|
+
* Options for a JsonhReader.
|
|
4
|
+
*/
|
|
5
|
+
declare class JsonhReaderOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Specifies the major version of the JSONH specification to use.
|
|
8
|
+
*/
|
|
9
|
+
version: JsonhVersion;
|
|
10
|
+
/**
|
|
11
|
+
* Enables/disables parsing unclosed inputs.
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* {
|
|
15
|
+
"key": "val
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* This is potentially useful for large language models that stream responses.
|
|
19
|
+
*
|
|
20
|
+
* Only some tokens can be incomplete in this mode, so it should not be relied upon.
|
|
21
|
+
*/
|
|
22
|
+
incompleteInputs: boolean;
|
|
23
|
+
}
|
|
24
|
+
export = JsonhReaderOptions;
|
|
25
|
+
//# sourceMappingURL=jsonh-reader-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonh-reader-options.d.ts","sourceRoot":"","sources":["../jsonh-reader-options.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,GAAG,QAAQ,oBAAoB,CAAC,CAAC;AAEpD;;GAEG;AACH,cAAM,kBAAkB;IACpB;;OAEG;IACH,OAAO,EAAE,YAAY,CAAuB;IAC5C;;;;;;;;;;;OAWG;IACH,gBAAgB,EAAE,OAAO,CAAS;CACrC;AAED,SAAS,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const JsonhVersion = require("./jsonh-version.js");
|
|
3
|
+
/**
|
|
4
|
+
* Options for a JsonhReader.
|
|
5
|
+
*/
|
|
6
|
+
class JsonhReaderOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Specifies the major version of the JSONH specification to use.
|
|
9
|
+
*/
|
|
10
|
+
version = JsonhVersion.Latest;
|
|
11
|
+
/**
|
|
12
|
+
* Enables/disables parsing unclosed inputs.
|
|
13
|
+
*
|
|
14
|
+
* ```
|
|
15
|
+
* {
|
|
16
|
+
"key": "val
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* This is potentially useful for large language models that stream responses.
|
|
20
|
+
*
|
|
21
|
+
* Only some tokens can be incomplete in this mode, so it should not be relied upon.
|
|
22
|
+
*/
|
|
23
|
+
incompleteInputs = false;
|
|
24
|
+
}
|
|
25
|
+
module.exports = JsonhReaderOptions;
|
|
26
|
+
//# sourceMappingURL=jsonh-reader-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonh-reader-options.js","sourceRoot":"","sources":["../jsonh-reader-options.ts"],"names":[],"mappings":";AAAA,mDAAoD;AAEpD;;GAEG;AACH,MAAM,kBAAkB;IACpB;;OAEG;IACH,OAAO,GAAiB,YAAY,CAAC,MAAM,CAAC;IAC5C;;;;;;;;;;;OAWG;IACH,gBAAgB,GAAY,KAAK,CAAC;CACrC;AAED,iBAAS,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import JsonhReaderOptions = require("./jsonh-reader-options.js");
|
|
2
|
+
import TextReader = require("./text-reader.js");
|
|
3
|
+
import JsonhToken = require("./jsonh-token.js");
|
|
4
|
+
import Result = require("./result.js");
|
|
5
|
+
/**
|
|
6
|
+
* A reader that reads JSONH tokens from a string.
|
|
7
|
+
*/
|
|
8
|
+
declare class JsonhReader {
|
|
9
|
+
#private;
|
|
10
|
+
/**
|
|
11
|
+
* The text reader to read characters from.
|
|
12
|
+
*/
|
|
13
|
+
get textReader(): TextReader;
|
|
14
|
+
/**
|
|
15
|
+
* The options to use when reading JSONH.
|
|
16
|
+
*/
|
|
17
|
+
get options(): JsonhReaderOptions;
|
|
18
|
+
/**
|
|
19
|
+
* The number of characters read from {@link string}.
|
|
20
|
+
*/
|
|
21
|
+
get charCounter(): number;
|
|
22
|
+
/**
|
|
23
|
+
* Constructs a reader that reads JSONH from a text reader.
|
|
24
|
+
*/
|
|
25
|
+
private constructor();
|
|
26
|
+
/**
|
|
27
|
+
* Constructs a reader that reads JSONH from a text reader.
|
|
28
|
+
*/
|
|
29
|
+
static fromTextReader(textReader: TextReader, options?: JsonhReaderOptions): JsonhReader;
|
|
30
|
+
/**
|
|
31
|
+
* Constructs a reader that reads JSONH from a string.
|
|
32
|
+
*/
|
|
33
|
+
static fromString(string: string, options?: JsonhReaderOptions): JsonhReader;
|
|
34
|
+
/**
|
|
35
|
+
* Parses a single element from a text reader.
|
|
36
|
+
*/
|
|
37
|
+
static parseElementfromTextReader<T = unknown>(textReader: TextReader): Result<T>;
|
|
38
|
+
/**
|
|
39
|
+
* Parses a single element from a string.
|
|
40
|
+
*/
|
|
41
|
+
static parseElementFromString<T = unknown>(string: string): Result<T>;
|
|
42
|
+
/**
|
|
43
|
+
* Parses a single element from the reader.
|
|
44
|
+
*/
|
|
45
|
+
parseElement<T = unknown>(): Result<T>;
|
|
46
|
+
/**
|
|
47
|
+
* Tries to find the given property name in the reader.
|
|
48
|
+
* For example, to find `c`:
|
|
49
|
+
* ```
|
|
50
|
+
* // Original position
|
|
51
|
+
* {
|
|
52
|
+
* "a": "1",
|
|
53
|
+
* "b": {
|
|
54
|
+
* "c": "2"
|
|
55
|
+
* },
|
|
56
|
+
* "c": // Final position
|
|
57
|
+
* "3"
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
findPropertyValue(propertyName: string): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Reads a single element from the reader.
|
|
64
|
+
*/
|
|
65
|
+
readElement(): Generator<Result<JsonhToken>>;
|
|
66
|
+
}
|
|
67
|
+
export = JsonhReader;
|
|
68
|
+
//# sourceMappingURL=jsonh-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonh-reader.d.ts","sourceRoot":"","sources":["../jsonh-reader.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,GAAG,QAAQ,2BAA2B,CAAC,CAAC;AACjE,OAAO,UAAU,GAAG,QAAQ,kBAAkB,CAAC,CAAC;AAEhD,OAAO,UAAU,GAAG,QAAQ,kBAAkB,CAAC,CAAC;AAGhD,OAAO,MAAM,GAAG,QAAQ,aAAa,CAAC,CAAC;AAEvC;;GAEG;AACH,cAAM,WAAW;;IAKb;;OAEG;IACH,IAAI,UAAU,IAAI,UAAU,CAE3B;IAKD;;OAEG;IACH,IAAI,OAAO,IAAI,kBAAkB,CAEhC;IAKD;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;IAmBD;;OAEG;IACH,OAAO;IASP;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,kBAA6C,GAAG,WAAW;IAGlH;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAA6C,GAAG,WAAW;IAItG;;OAEG;IACH,MAAM,CAAC,0BAA0B,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC;IAGjF;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IAIrE;;OAEG;IACH,YAAY,CAAC,CAAC,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC;IA0HtC;;;;;;;;;;;;;;OAcG;IACH,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAoChD;;OAEG;IACF,WAAW,IAAI,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;CA6gChD;AAED,SAAS,WAAW,CAAC"}
|