@llumiverse/core 0.8.2 → 0.8.4
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/lib/cjs/json.js +190 -4
- package/lib/cjs/json.js.map +1 -1
- package/lib/cjs/validation.js +1 -1
- package/lib/cjs/validation.js.map +1 -1
- package/lib/esm/json.js +187 -3
- package/lib/esm/json.js.map +1 -1
- package/lib/esm/validation.js +2 -2
- package/lib/esm/validation.js.map +1 -1
- package/lib/types/json.d.ts +15 -1
- package/lib/types/json.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/json.ts +186 -4
- package/src/validation.ts +2 -2
package/lib/cjs/json.js
CHANGED
|
@@ -1,14 +1,200 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseJSON = void 0;
|
|
3
|
+
exports.parseJSON = exports.JsonParser = exports.extractAndParseJSON = void 0;
|
|
4
4
|
function extractJsonFromText(text) {
|
|
5
5
|
const start = text.indexOf("{");
|
|
6
6
|
const end = text.lastIndexOf("}");
|
|
7
|
-
|
|
7
|
+
text = text.substring(start, end + 1);
|
|
8
|
+
return text.replace(/\\n/g, "");
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
+
function extractAndParseJSON(text) {
|
|
11
|
+
return parseJSON(extractJsonFromText(text));
|
|
12
|
+
}
|
|
13
|
+
exports.extractAndParseJSON = extractAndParseJSON;
|
|
14
|
+
const RX_DQUOTE = /^"([^"\\]|\\.)*"/us;
|
|
15
|
+
const RX_SQUOTE = /^'([^'\\]|\\.)*'/us;
|
|
16
|
+
const RX_NUMBER = /^-?\d+(\.\d+)?/;
|
|
17
|
+
const RX_BOOLEAN = /^true|false/;
|
|
18
|
+
const RX_NULL = /^null/;
|
|
19
|
+
const RX_KEY = /^[$_a-zA-Z][$_a-zA-Z0-9]*/;
|
|
20
|
+
const RX_PUNCTUATION = /^\s*([\[\]{}:,])\s*/;
|
|
21
|
+
function fixText(value) {
|
|
22
|
+
return value.replaceAll('\n', '\\n').replaceAll('\r', '\\r');
|
|
23
|
+
}
|
|
24
|
+
function decodeSingleQuotedString(value) {
|
|
25
|
+
return JSON.parse('"' + value.slice(1, -1).replaceAll(/(?<!\\)"/g, '\\"') + '"');
|
|
26
|
+
}
|
|
27
|
+
class JsonParser {
|
|
28
|
+
text;
|
|
29
|
+
pos = 0;
|
|
30
|
+
constructor(text) {
|
|
31
|
+
this.text = text;
|
|
32
|
+
}
|
|
33
|
+
skip(n) {
|
|
34
|
+
this.text = this.text.substring(n);
|
|
35
|
+
this.pos += n;
|
|
36
|
+
}
|
|
37
|
+
tryReadPunctuation() {
|
|
38
|
+
const m = RX_PUNCTUATION.exec(this.text);
|
|
39
|
+
if (m) {
|
|
40
|
+
this.skip(m[0].length);
|
|
41
|
+
return m[1];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
readKey() {
|
|
45
|
+
const first = this.text.charCodeAt(0);
|
|
46
|
+
if (first === 34) { // "
|
|
47
|
+
const m = RX_DQUOTE.exec(this.text);
|
|
48
|
+
if (m) {
|
|
49
|
+
this.skip(m[0].length);
|
|
50
|
+
return JSON.parse(m[0]);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else if (first === 39) { // '
|
|
54
|
+
const m = RX_SQUOTE.exec(this.text);
|
|
55
|
+
if (m) {
|
|
56
|
+
this.skip(m[0].length);
|
|
57
|
+
return decodeSingleQuotedString(m[0]);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const m = RX_KEY.exec(this.text);
|
|
62
|
+
if (m) {
|
|
63
|
+
this.skip(m[0].length);
|
|
64
|
+
return m[0];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
throw new Error('Expected a key at position ' + this.pos + ' but found ' + this.text);
|
|
68
|
+
}
|
|
69
|
+
readScalar() {
|
|
70
|
+
const first = this.text.charCodeAt(0);
|
|
71
|
+
if (first === 34) { // "
|
|
72
|
+
const m = RX_DQUOTE.exec(this.text);
|
|
73
|
+
if (m) {
|
|
74
|
+
this.skip(m[0].length);
|
|
75
|
+
return JSON.parse(fixText(m[0]));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else if (first === 39) { // '
|
|
79
|
+
const m = RX_SQUOTE.exec(this.text);
|
|
80
|
+
if (m) {
|
|
81
|
+
this.skip(m[0].length);
|
|
82
|
+
return decodeSingleQuotedString(fixText(m[0]));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
let m = RX_NUMBER.exec(this.text);
|
|
87
|
+
if (m) {
|
|
88
|
+
this.skip(m[0].length);
|
|
89
|
+
return parseFloat(m[0]);
|
|
90
|
+
}
|
|
91
|
+
m = RX_BOOLEAN.exec(this.text);
|
|
92
|
+
if (m) {
|
|
93
|
+
this.skip(m[0].length);
|
|
94
|
+
return m[0] === 'true';
|
|
95
|
+
}
|
|
96
|
+
m = RX_NULL.exec(this.text);
|
|
97
|
+
if (m) {
|
|
98
|
+
this.skip(m[0].length);
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
throw new Error('Expected a value at position ' + this.pos + ' but found ' + this.text);
|
|
103
|
+
}
|
|
104
|
+
readObject() {
|
|
105
|
+
let key;
|
|
106
|
+
const obj = {};
|
|
107
|
+
while (true) {
|
|
108
|
+
if (!key) { // read key
|
|
109
|
+
const p = this.tryReadPunctuation();
|
|
110
|
+
if (p === '}') {
|
|
111
|
+
return obj;
|
|
112
|
+
}
|
|
113
|
+
else if (p === ',') {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
else if (p) {
|
|
117
|
+
throw new Error('Expected a key at position ' + this.pos + ' but found ' + this.text);
|
|
118
|
+
}
|
|
119
|
+
key = this.readKey();
|
|
120
|
+
if (!key) {
|
|
121
|
+
throw new Error('Expected a key at position ' + this.pos + ' but found ' + this.text);
|
|
122
|
+
}
|
|
123
|
+
if (this.tryReadPunctuation() !== ':') {
|
|
124
|
+
throw new Error('Expected a colon at position ' + this.pos + ' but found ' + this.text);
|
|
125
|
+
}
|
|
126
|
+
;
|
|
127
|
+
}
|
|
128
|
+
else { // read value
|
|
129
|
+
const value = this.readValue();
|
|
130
|
+
if (value === undefined) {
|
|
131
|
+
throw new Error('Expected a value at position ' + this.pos + ' but found ' + this.text);
|
|
132
|
+
}
|
|
133
|
+
obj[key] = value;
|
|
134
|
+
key = undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
readArray() {
|
|
139
|
+
const ar = [];
|
|
140
|
+
while (true) {
|
|
141
|
+
const p = this.tryReadPunctuation();
|
|
142
|
+
if (p === ',') {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
else if (p === ']') {
|
|
146
|
+
return ar;
|
|
147
|
+
}
|
|
148
|
+
else if (p === '[') {
|
|
149
|
+
ar.push(this.readArray());
|
|
150
|
+
}
|
|
151
|
+
else if (p === '{') {
|
|
152
|
+
ar.push(this.readObject());
|
|
153
|
+
}
|
|
154
|
+
else if (!p) {
|
|
155
|
+
ar.push(this.readScalar());
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
throw new Error('Expected a value at position ' + this.pos + ' but found ' + this.text);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
readValue() {
|
|
163
|
+
const p = this.tryReadPunctuation();
|
|
164
|
+
if (p === '{') {
|
|
165
|
+
return this.readObject();
|
|
166
|
+
}
|
|
167
|
+
else if (p === '[') {
|
|
168
|
+
return this.readArray();
|
|
169
|
+
}
|
|
170
|
+
else if (!p) {
|
|
171
|
+
return this.readScalar();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
static parse(text) {
|
|
175
|
+
const parser = new JsonParser(text);
|
|
176
|
+
const r = parser.readValue();
|
|
177
|
+
if (r === undefined) {
|
|
178
|
+
throw new Error('Not a valid JSON');
|
|
179
|
+
}
|
|
180
|
+
return r;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
exports.JsonParser = JsonParser;
|
|
10
184
|
function parseJSON(text) {
|
|
11
|
-
|
|
185
|
+
text = text.trim();
|
|
186
|
+
try {
|
|
187
|
+
return JSON.parse(text);
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
// use a relaxed parser
|
|
191
|
+
try {
|
|
192
|
+
return JsonParser.parse(text);
|
|
193
|
+
}
|
|
194
|
+
catch (err2) { // throw the original error
|
|
195
|
+
throw err;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
12
198
|
}
|
|
13
199
|
exports.parseJSON = parseJSON;
|
|
14
200
|
//# sourceMappingURL=json.js.map
|
package/lib/cjs/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":";;;AACA,SAAS,mBAAmB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/validation.js
CHANGED
|
@@ -16,7 +16,7 @@ function validateResult(data, schema) {
|
|
|
16
16
|
let json;
|
|
17
17
|
if (typeof data === "string") {
|
|
18
18
|
try {
|
|
19
|
-
json = (0, json_js_1.
|
|
19
|
+
json = (0, json_js_1.extractAndParseJSON)(data);
|
|
20
20
|
}
|
|
21
21
|
catch (error) {
|
|
22
22
|
throw new ValidationError("json_error", error.message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":";;;AAAA,6CAAoD;AACpD,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":";;;AAAA,6CAAoD;AACpD,uCAAgD;AAGhD,MAAa,eAAgB,SAAQ,KAAK;IAE3B;IADX,YACW,IAAuC,EAC9C,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHP,SAAI,GAAJ,IAAI,CAAmC;QAI9C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IACjC,CAAC;CACJ;AARD,0CAQC;AAED,SAAgB,cAAc,CAAC,IAAS,EAAE,MAAmB;IACzD,IAAI,IAAI,CAAC;IACT,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC;YACD,IAAI,GAAG,IAAA,6BAAmB,EAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QAC1D,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,IAAI,GAAG,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,UAAU,GAAG,IAAA,sBAAQ,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CACrB,kBAAkB,EAClB,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAnBD,wCAmBC"}
|
package/lib/esm/json.js
CHANGED
|
@@ -1,10 +1,194 @@
|
|
|
1
1
|
function extractJsonFromText(text) {
|
|
2
2
|
const start = text.indexOf("{");
|
|
3
3
|
const end = text.lastIndexOf("}");
|
|
4
|
-
|
|
4
|
+
text = text.substring(start, end + 1);
|
|
5
|
+
return text.replace(/\\n/g, "");
|
|
6
|
+
}
|
|
7
|
+
export function extractAndParseJSON(text) {
|
|
8
|
+
return parseJSON(extractJsonFromText(text));
|
|
9
|
+
}
|
|
10
|
+
const RX_DQUOTE = /^"([^"\\]|\\.)*"/us;
|
|
11
|
+
const RX_SQUOTE = /^'([^'\\]|\\.)*'/us;
|
|
12
|
+
const RX_NUMBER = /^-?\d+(\.\d+)?/;
|
|
13
|
+
const RX_BOOLEAN = /^true|false/;
|
|
14
|
+
const RX_NULL = /^null/;
|
|
15
|
+
const RX_KEY = /^[$_a-zA-Z][$_a-zA-Z0-9]*/;
|
|
16
|
+
const RX_PUNCTUATION = /^\s*([\[\]{}:,])\s*/;
|
|
17
|
+
function fixText(value) {
|
|
18
|
+
return value.replaceAll('\n', '\\n').replaceAll('\r', '\\r');
|
|
19
|
+
}
|
|
20
|
+
function decodeSingleQuotedString(value) {
|
|
21
|
+
return JSON.parse('"' + value.slice(1, -1).replaceAll(/(?<!\\)"/g, '\\"') + '"');
|
|
22
|
+
}
|
|
23
|
+
export class JsonParser {
|
|
24
|
+
text;
|
|
25
|
+
pos = 0;
|
|
26
|
+
constructor(text) {
|
|
27
|
+
this.text = text;
|
|
28
|
+
}
|
|
29
|
+
skip(n) {
|
|
30
|
+
this.text = this.text.substring(n);
|
|
31
|
+
this.pos += n;
|
|
32
|
+
}
|
|
33
|
+
tryReadPunctuation() {
|
|
34
|
+
const m = RX_PUNCTUATION.exec(this.text);
|
|
35
|
+
if (m) {
|
|
36
|
+
this.skip(m[0].length);
|
|
37
|
+
return m[1];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
readKey() {
|
|
41
|
+
const first = this.text.charCodeAt(0);
|
|
42
|
+
if (first === 34) { // "
|
|
43
|
+
const m = RX_DQUOTE.exec(this.text);
|
|
44
|
+
if (m) {
|
|
45
|
+
this.skip(m[0].length);
|
|
46
|
+
return JSON.parse(m[0]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (first === 39) { // '
|
|
50
|
+
const m = RX_SQUOTE.exec(this.text);
|
|
51
|
+
if (m) {
|
|
52
|
+
this.skip(m[0].length);
|
|
53
|
+
return decodeSingleQuotedString(m[0]);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const m = RX_KEY.exec(this.text);
|
|
58
|
+
if (m) {
|
|
59
|
+
this.skip(m[0].length);
|
|
60
|
+
return m[0];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
throw new Error('Expected a key at position ' + this.pos + ' but found ' + this.text);
|
|
64
|
+
}
|
|
65
|
+
readScalar() {
|
|
66
|
+
const first = this.text.charCodeAt(0);
|
|
67
|
+
if (first === 34) { // "
|
|
68
|
+
const m = RX_DQUOTE.exec(this.text);
|
|
69
|
+
if (m) {
|
|
70
|
+
this.skip(m[0].length);
|
|
71
|
+
return JSON.parse(fixText(m[0]));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (first === 39) { // '
|
|
75
|
+
const m = RX_SQUOTE.exec(this.text);
|
|
76
|
+
if (m) {
|
|
77
|
+
this.skip(m[0].length);
|
|
78
|
+
return decodeSingleQuotedString(fixText(m[0]));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
let m = RX_NUMBER.exec(this.text);
|
|
83
|
+
if (m) {
|
|
84
|
+
this.skip(m[0].length);
|
|
85
|
+
return parseFloat(m[0]);
|
|
86
|
+
}
|
|
87
|
+
m = RX_BOOLEAN.exec(this.text);
|
|
88
|
+
if (m) {
|
|
89
|
+
this.skip(m[0].length);
|
|
90
|
+
return m[0] === 'true';
|
|
91
|
+
}
|
|
92
|
+
m = RX_NULL.exec(this.text);
|
|
93
|
+
if (m) {
|
|
94
|
+
this.skip(m[0].length);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
throw new Error('Expected a value at position ' + this.pos + ' but found ' + this.text);
|
|
99
|
+
}
|
|
100
|
+
readObject() {
|
|
101
|
+
let key;
|
|
102
|
+
const obj = {};
|
|
103
|
+
while (true) {
|
|
104
|
+
if (!key) { // read key
|
|
105
|
+
const p = this.tryReadPunctuation();
|
|
106
|
+
if (p === '}') {
|
|
107
|
+
return obj;
|
|
108
|
+
}
|
|
109
|
+
else if (p === ',') {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
else if (p) {
|
|
113
|
+
throw new Error('Expected a key at position ' + this.pos + ' but found ' + this.text);
|
|
114
|
+
}
|
|
115
|
+
key = this.readKey();
|
|
116
|
+
if (!key) {
|
|
117
|
+
throw new Error('Expected a key at position ' + this.pos + ' but found ' + this.text);
|
|
118
|
+
}
|
|
119
|
+
if (this.tryReadPunctuation() !== ':') {
|
|
120
|
+
throw new Error('Expected a colon at position ' + this.pos + ' but found ' + this.text);
|
|
121
|
+
}
|
|
122
|
+
;
|
|
123
|
+
}
|
|
124
|
+
else { // read value
|
|
125
|
+
const value = this.readValue();
|
|
126
|
+
if (value === undefined) {
|
|
127
|
+
throw new Error('Expected a value at position ' + this.pos + ' but found ' + this.text);
|
|
128
|
+
}
|
|
129
|
+
obj[key] = value;
|
|
130
|
+
key = undefined;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
readArray() {
|
|
135
|
+
const ar = [];
|
|
136
|
+
while (true) {
|
|
137
|
+
const p = this.tryReadPunctuation();
|
|
138
|
+
if (p === ',') {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
else if (p === ']') {
|
|
142
|
+
return ar;
|
|
143
|
+
}
|
|
144
|
+
else if (p === '[') {
|
|
145
|
+
ar.push(this.readArray());
|
|
146
|
+
}
|
|
147
|
+
else if (p === '{') {
|
|
148
|
+
ar.push(this.readObject());
|
|
149
|
+
}
|
|
150
|
+
else if (!p) {
|
|
151
|
+
ar.push(this.readScalar());
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
throw new Error('Expected a value at position ' + this.pos + ' but found ' + this.text);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
readValue() {
|
|
159
|
+
const p = this.tryReadPunctuation();
|
|
160
|
+
if (p === '{') {
|
|
161
|
+
return this.readObject();
|
|
162
|
+
}
|
|
163
|
+
else if (p === '[') {
|
|
164
|
+
return this.readArray();
|
|
165
|
+
}
|
|
166
|
+
else if (!p) {
|
|
167
|
+
return this.readScalar();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
static parse(text) {
|
|
171
|
+
const parser = new JsonParser(text);
|
|
172
|
+
const r = parser.readValue();
|
|
173
|
+
if (r === undefined) {
|
|
174
|
+
throw new Error('Not a valid JSON');
|
|
175
|
+
}
|
|
176
|
+
return r;
|
|
177
|
+
}
|
|
5
178
|
}
|
|
6
|
-
//TODO LAX parse JSON
|
|
7
179
|
export function parseJSON(text) {
|
|
8
|
-
|
|
180
|
+
text = text.trim();
|
|
181
|
+
try {
|
|
182
|
+
return JSON.parse(text);
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
// use a relaxed parser
|
|
186
|
+
try {
|
|
187
|
+
return JsonParser.parse(text);
|
|
188
|
+
}
|
|
189
|
+
catch (err2) { // throw the original error
|
|
190
|
+
throw err;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
9
193
|
}
|
|
10
194
|
//# sourceMappingURL=json.js.map
|
package/lib/esm/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":"AACA,SAAS,mBAAmB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/validation.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { validate } from "json-schema";
|
|
2
|
-
import {
|
|
2
|
+
import { extractAndParseJSON } from "./json.js";
|
|
3
3
|
export class ValidationError extends Error {
|
|
4
4
|
code;
|
|
5
5
|
constructor(code, message) {
|
|
@@ -12,7 +12,7 @@ export function validateResult(data, schema) {
|
|
|
12
12
|
let json;
|
|
13
13
|
if (typeof data === "string") {
|
|
14
14
|
try {
|
|
15
|
-
json =
|
|
15
|
+
json = extractAndParseJSON(data);
|
|
16
16
|
}
|
|
17
17
|
catch (error) {
|
|
18
18
|
throw new ValidationError("json_error", error.message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGhD,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAE3B;IADX,YACW,IAAuC,EAC9C,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHP,SAAI,GAAJ,IAAI,CAAmC;QAI9C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IACjC,CAAC;CACJ;AAED,MAAM,UAAU,cAAc,CAAC,IAAS,EAAE,MAAmB;IACzD,IAAI,IAAI,CAAC;IACT,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC;YACD,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QAC1D,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,IAAI,GAAG,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CACrB,kBAAkB,EAClB,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
package/lib/types/json.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare function
|
|
1
|
+
export declare function extractAndParseJSON(text: string): Json;
|
|
2
2
|
export type JsonPrimative = string | number | boolean | null;
|
|
3
3
|
export type JsonArray = Json[];
|
|
4
4
|
export type JsonObject = {
|
|
@@ -6,4 +6,18 @@ export type JsonObject = {
|
|
|
6
6
|
};
|
|
7
7
|
export type JsonComposite = JsonArray | JsonObject;
|
|
8
8
|
export type Json = JsonPrimative | JsonComposite;
|
|
9
|
+
export declare class JsonParser {
|
|
10
|
+
text: string;
|
|
11
|
+
pos: number;
|
|
12
|
+
constructor(text: string);
|
|
13
|
+
skip(n: number): void;
|
|
14
|
+
tryReadPunctuation(): string | undefined;
|
|
15
|
+
readKey(): any;
|
|
16
|
+
readScalar(): any;
|
|
17
|
+
readObject(): any;
|
|
18
|
+
readArray(): any[];
|
|
19
|
+
readValue(): any;
|
|
20
|
+
static parse(text: string): any;
|
|
21
|
+
}
|
|
22
|
+
export declare function parseJSON(text: string): Json;
|
|
9
23
|
//# sourceMappingURL=json.d.ts.map
|
package/lib/types/json.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":"AAQA,wBAAgB,
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":"AAQA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC7D,MAAM,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC;AAC/B,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AACjD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC;AACnD,MAAM,MAAM,IAAI,GAAG,aAAa,GAAG,aAAa,CAAC;AAqBjD,qBAAa,UAAU;IAGA,IAAI,EAAE,MAAM;IAF/B,GAAG,EAAE,MAAM,CAAK;gBAEG,IAAI,EAAE,MAAM;IAE/B,IAAI,CAAC,CAAC,EAAE,MAAM;IAKd,kBAAkB;IAQlB,OAAO;IAwBP,UAAU;IAkCV,UAAU;IA+BV,SAAS;IAoBT,SAAS;IAWT,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM;CAQ5B;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAY5C"}
|
package/package.json
CHANGED
package/src/json.ts
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
function extractJsonFromText(text: string): string {
|
|
3
3
|
const start = text.indexOf("{");
|
|
4
4
|
const end = text.lastIndexOf("}");
|
|
5
|
-
|
|
5
|
+
text = text.substring(start, end + 1);
|
|
6
|
+
return text.replace(/\\n/g, "");
|
|
6
7
|
}
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return JSON.parse(extractJsonFromText(text));
|
|
9
|
+
export function extractAndParseJSON(text: string): Json {
|
|
10
|
+
return parseJSON(extractJsonFromText(text));
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export type JsonPrimative = string | number | boolean | null;
|
|
@@ -15,3 +15,185 @@ export type JsonArray = Json[];
|
|
|
15
15
|
export type JsonObject = { [key: string]: Json };
|
|
16
16
|
export type JsonComposite = JsonArray | JsonObject;
|
|
17
17
|
export type Json = JsonPrimative | JsonComposite;
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
const RX_DQUOTE = /^"([^"\\]|\\.)*"/us;
|
|
23
|
+
const RX_SQUOTE = /^'([^'\\]|\\.)*'/us;
|
|
24
|
+
const RX_NUMBER = /^-?\d+(\.\d+)?/;
|
|
25
|
+
const RX_BOOLEAN = /^true|false/;
|
|
26
|
+
const RX_NULL = /^null/;
|
|
27
|
+
const RX_KEY = /^[$_a-zA-Z][$_a-zA-Z0-9]*/;
|
|
28
|
+
const RX_PUNCTUATION = /^\s*([\[\]{}:,])\s*/;
|
|
29
|
+
|
|
30
|
+
function fixText(value: string) {
|
|
31
|
+
return value.replaceAll('\n', '\\n').replaceAll('\r', '\\r');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function decodeSingleQuotedString(value: string) {
|
|
35
|
+
return JSON.parse('"' + value.slice(1, -1).replaceAll(/(?<!\\)"/g, '\\"') + '"');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export class JsonParser {
|
|
39
|
+
pos: number = 0;
|
|
40
|
+
|
|
41
|
+
constructor(public text: string) { }
|
|
42
|
+
|
|
43
|
+
skip(n: number) {
|
|
44
|
+
this.text = this.text.substring(n);
|
|
45
|
+
this.pos += n;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
tryReadPunctuation() {
|
|
49
|
+
const m = RX_PUNCTUATION.exec(this.text);
|
|
50
|
+
if (m) {
|
|
51
|
+
this.skip(m[0].length);
|
|
52
|
+
return m[1];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
readKey() {
|
|
57
|
+
const first = this.text.charCodeAt(0);
|
|
58
|
+
if (first === 34) { // "
|
|
59
|
+
const m = RX_DQUOTE.exec(this.text);
|
|
60
|
+
if (m) {
|
|
61
|
+
this.skip(m[0].length);
|
|
62
|
+
return JSON.parse(m[0]);
|
|
63
|
+
}
|
|
64
|
+
} else if (first === 39) { // '
|
|
65
|
+
const m = RX_SQUOTE.exec(this.text);
|
|
66
|
+
if (m) {
|
|
67
|
+
this.skip(m[0].length);
|
|
68
|
+
return decodeSingleQuotedString(m[0]);
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
const m = RX_KEY.exec(this.text);
|
|
72
|
+
if (m) {
|
|
73
|
+
this.skip(m[0].length);
|
|
74
|
+
return m[0];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
throw new Error('Expected a key at position ' + this.pos + ' but found ' + this.text);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
readScalar() {
|
|
81
|
+
const first = this.text.charCodeAt(0);
|
|
82
|
+
if (first === 34) { // "
|
|
83
|
+
const m = RX_DQUOTE.exec(this.text);
|
|
84
|
+
if (m) {
|
|
85
|
+
this.skip(m[0].length);
|
|
86
|
+
return JSON.parse(fixText(m[0]));
|
|
87
|
+
}
|
|
88
|
+
} else if (first === 39) { // '
|
|
89
|
+
const m = RX_SQUOTE.exec(this.text);
|
|
90
|
+
if (m) {
|
|
91
|
+
this.skip(m[0].length);
|
|
92
|
+
return decodeSingleQuotedString(fixText(m[0]));
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
let m = RX_NUMBER.exec(this.text);
|
|
96
|
+
if (m) {
|
|
97
|
+
this.skip(m[0].length);
|
|
98
|
+
return parseFloat(m[0]);
|
|
99
|
+
}
|
|
100
|
+
m = RX_BOOLEAN.exec(this.text);
|
|
101
|
+
if (m) {
|
|
102
|
+
this.skip(m[0].length);
|
|
103
|
+
return m[0] === 'true';
|
|
104
|
+
}
|
|
105
|
+
m = RX_NULL.exec(this.text);
|
|
106
|
+
if (m) {
|
|
107
|
+
this.skip(m[0].length);
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
throw new Error('Expected a value at position ' + this.pos + ' but found ' + this.text);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
readObject() {
|
|
115
|
+
let key: string | undefined;
|
|
116
|
+
const obj: any = {};
|
|
117
|
+
while (true) {
|
|
118
|
+
if (!key) { // read key
|
|
119
|
+
const p = this.tryReadPunctuation();
|
|
120
|
+
if (p === '}') {
|
|
121
|
+
return obj;
|
|
122
|
+
} else if (p === ',') {
|
|
123
|
+
continue;
|
|
124
|
+
} else if (p) {
|
|
125
|
+
throw new Error('Expected a key at position ' + this.pos + ' but found ' + this.text);
|
|
126
|
+
}
|
|
127
|
+
key = this.readKey();
|
|
128
|
+
if (!key) {
|
|
129
|
+
throw new Error('Expected a key at position ' + this.pos + ' but found ' + this.text);
|
|
130
|
+
}
|
|
131
|
+
if (this.tryReadPunctuation() !== ':') {
|
|
132
|
+
throw new Error('Expected a colon at position ' + this.pos + ' but found ' + this.text);
|
|
133
|
+
};
|
|
134
|
+
} else { // read value
|
|
135
|
+
const value = this.readValue();
|
|
136
|
+
if (value === undefined) {
|
|
137
|
+
throw new Error('Expected a value at position ' + this.pos + ' but found ' + this.text);
|
|
138
|
+
}
|
|
139
|
+
obj[key] = value;
|
|
140
|
+
key = undefined;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
readArray() {
|
|
146
|
+
const ar: any[] = [];
|
|
147
|
+
while (true) {
|
|
148
|
+
const p = this.tryReadPunctuation();
|
|
149
|
+
if (p === ',') {
|
|
150
|
+
continue;
|
|
151
|
+
} else if (p === ']') {
|
|
152
|
+
return ar;
|
|
153
|
+
} else if (p === '[') {
|
|
154
|
+
ar.push(this.readArray());
|
|
155
|
+
} else if (p === '{') {
|
|
156
|
+
ar.push(this.readObject());
|
|
157
|
+
} else if (!p) {
|
|
158
|
+
ar.push(this.readScalar());
|
|
159
|
+
} else {
|
|
160
|
+
throw new Error('Expected a value at position ' + this.pos + ' but found ' + this.text);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
readValue() {
|
|
166
|
+
const p = this.tryReadPunctuation();
|
|
167
|
+
if (p === '{') {
|
|
168
|
+
return this.readObject();
|
|
169
|
+
} else if (p === '[') {
|
|
170
|
+
return this.readArray();
|
|
171
|
+
} else if (!p) {
|
|
172
|
+
return this.readScalar();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
static parse(text: string) {
|
|
177
|
+
const parser = new JsonParser(text);
|
|
178
|
+
const r = parser.readValue();
|
|
179
|
+
if (r === undefined) {
|
|
180
|
+
throw new Error('Not a valid JSON');
|
|
181
|
+
}
|
|
182
|
+
return r;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
export function parseJSON(text: string): Json {
|
|
188
|
+
text = text.trim();
|
|
189
|
+
try {
|
|
190
|
+
return JSON.parse(text);
|
|
191
|
+
} catch (err: any) {
|
|
192
|
+
// use a relaxed parser
|
|
193
|
+
try {
|
|
194
|
+
return JsonParser.parse(text);
|
|
195
|
+
} catch (err2: any) { // throw the original error
|
|
196
|
+
throw err;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
package/src/validation.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { JSONSchema4, validate } from "json-schema";
|
|
2
|
-
import {
|
|
2
|
+
import { extractAndParseJSON } from "./json.js";
|
|
3
3
|
import { ResultValidationError } from "./types.js";
|
|
4
4
|
|
|
5
5
|
export class ValidationError extends Error implements ResultValidationError {
|
|
@@ -16,7 +16,7 @@ export function validateResult(data: any, schema: JSONSchema4) {
|
|
|
16
16
|
let json;
|
|
17
17
|
if (typeof data === "string") {
|
|
18
18
|
try {
|
|
19
|
-
json =
|
|
19
|
+
json = extractAndParseJSON(data);
|
|
20
20
|
} catch (error: any) {
|
|
21
21
|
throw new ValidationError("json_error", error.message)
|
|
22
22
|
}
|