@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 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
- return text.substring(start, end + 1);
7
+ text = text.substring(start, end + 1);
8
+ return text.replace(/\\n/g, "");
8
9
  }
9
- //TODO LAX parse JSON
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
- return JSON.parse(extractJsonFromText(text));
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
@@ -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,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,qBAAqB;AACrB,SAAgB,SAAS,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC;AAFD,8BAEC"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":"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"}
@@ -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.parseJSON)(data);
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,uCAAsC;AAGtC,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,mBAAS,EAAC,IAAI,CAAC,CAAC;QAC3B,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"}
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
- return text.substring(start, end + 1);
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
- return JSON.parse(extractJsonFromText(text));
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
@@ -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,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,SAAS,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { validate } from "json-schema";
2
- import { parseJSON } from "./json.js";
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 = parseJSON(data);
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,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,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,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3B,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"}
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"}
@@ -1,4 +1,4 @@
1
- export declare function parseJSON(text: string): Json;
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
@@ -1 +1 @@
1
- {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":"AAQA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llumiverse/core",
3
- "version": "0.8.2",
3
+ "version": "0.8.4",
4
4
  "type": "module",
5
5
  "description": "Provide an universal API to LLMs. Support for existing LLMs can be added by writing a driver.",
6
6
  "files": [
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
- return text.substring(start, end + 1);
5
+ text = text.substring(start, end + 1);
6
+ return text.replace(/\\n/g, "");
6
7
  }
7
8
 
8
- //TODO LAX parse JSON
9
- export function parseJSON(text: string): Json {
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 { parseJSON } from "./json.js";
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 = parseJSON(data);
19
+ json = extractAndParseJSON(data);
20
20
  } catch (error: any) {
21
21
  throw new ValidationError("json_error", error.message)
22
22
  }