full-json-extractor 1.0.0 → 1.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.
@@ -0,0 +1,21 @@
1
+ {
2
+ // Use IntelliSense to learn about possible attributes.
3
+ // Hover to view descriptions of existing attributes.
4
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
+ "version": "0.2.0",
6
+ "configurations": [
7
+
8
+ {
9
+ "type": "node",
10
+ "request": "launch",
11
+ "name": "Launch Program",
12
+ "skipFiles": [
13
+ "<node_internals>/**"
14
+ ],
15
+ "program": "${workspaceFolder}\\dist\\index.js",
16
+ "outFiles": [
17
+ "${workspaceFolder}/**/*.js"
18
+ ]
19
+ }
20
+ ]
21
+ }
package/README.md CHANGED
@@ -12,7 +12,7 @@ This package is meant to be used with payloads under 1MB with somewhat reasonabl
12
12
 
13
13
  - Extracts multiple valid top-level JSON objects from a single string.
14
14
  - Ignores unmatched braces, extra characters, or malformed sections.
15
- - Works with escaped quotes inside JSON strings.
15
+ - Works with escaped characters quotes (e.g. "{") inside JSON strings.
16
16
  - Returns list of jsons derived from original input.
17
17
 
18
18
  ---
@@ -42,7 +42,26 @@ console.log(jsonObjects);
42
42
  ## API
43
43
 
44
44
  ```
45
- extractJsons(input: string, limit: Limit = "none"): object[]
45
+ extractJsons<T = unknown>(input: string, limit: Limit = "none"): T[]
46
46
  ```
47
47
 
48
48
  Wrapper for Internal BFS/memoization routine to find all valid JSON intervals.
49
+
50
+ ---
51
+
52
+ ## Benchmarks
53
+
54
+ Node Version: v22.14.0
55
+ CPU: AMD Ryzen 7 5700X
56
+
57
+ - Depth=3, Size=10000, Count=10 | Time=5.775 ms | MemΔ=0.390 MB | OutputLen=100631
58
+ - Depth=3, Size=500000, Count=20 | Time=804.766 ms | MemΔ=9.650 MB | OutputLen=10001261
59
+ - Depth=10, Size=50000, Count=10 | Time=53.828 ms | MemΔ=2.080 MB | OutputLen=501401
60
+ - Depth=10, Size=500000, Count=10 | Time=528.220 ms | MemΔ=1.260 MB | OutputLen=5001401
61
+ - Depth=20, Size=10000, Count=20 | Time=118.182 ms | MemΔ=7.090 MB | OutputLen=205001
62
+ - Depth=20, Size=500000, Count=10 | Time=972.444 ms | MemΔ=10.190 MB | OutputLen=5002501
63
+
64
+ Depth = Level of nesting per json object
65
+ Size = Padding size per json object
66
+ Count = # of actual json objects
67
+
@@ -1 +1 @@
1
- {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":";;;;;AAAA,qDAA8C;AAC9C,gEAAmC;AACnC,iDAA8C;AAE9C,SAAS,kBAAkB,CAAC,KAAa;IACvC,IAAI,GAAG,GAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACxB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAa,EACb,KAAa,EACb,UAAkB;IAElB,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACtC,IAAY,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAG,sBAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB;IACxD,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,6BAA6B;IAE5D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAEpD,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,6BAAW,CAAC,GAAG,EAAE,CAAC;gBAEhC,MAAM,MAAM,GAAG,IAAA,2BAAY,EAAC,KAAK,CAAC,CAAC;gBAEnC,MAAM,GAAG,GAAG,6BAAW,CAAC,GAAG,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;gBAEpC,OAAO,CAAC,GAAG,CACT,SAAS,KAAK,UAAU,IAAI,WAAW,KAAK,WAAW,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;oBACrF,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAC9F,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":";;;;;AAAA,qDAA8C;AAC9C,gEAAmC;AAEnC,iDAA8C;AAE9C,SAAS,kBAAkB,CAAC,KAAa;IACrC,IAAI,GAAG,GAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CACtB,KAAa,EACb,KAAa,EACb,UAAkB;IAElB,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACtC,IAAY,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,gBAAgB;IACrB,MAAM,IAAI,GAAG,sBAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,YAAY;IACvB,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB;IACxD,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,6BAA6B;IAE5D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAEpD,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,6BAAW,CAAC,GAAG,EAAE,CAAC;gBAEhC,MAAM,MAAM,GAAG,IAAA,2BAAY,EAAC,KAAK,CAAC,CAAC;gBAEnC,MAAM,GAAG,GAAG,6BAAW,CAAC,GAAG,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;gBAEpC,OAAO,CAAC,GAAG,CACP,SAAS,KAAK,UAAU,IAAI,WAAW,KAAK,WAAW,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;oBACnF,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAClG,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,YAAY,EAAE,CAAC"}
@@ -2,9 +2,9 @@ import { Limit } from "./interfaces";
2
2
  /**
3
3
  * Extracts json objects from a given input string
4
4
  * @param input input string
5
- * @param limit Sets pre-check behavior. If set to 'log2', method will terminate pre-check after reaching log2(n) characters. Useful for malformed data i.e. many {}
6
- * Else, will do a O(n) scan to coarsely validate brace matches. Useful for many json objects (i.e. early termination)
7
- * @returns
5
+ * @param limit Sets pre-check behavior. If set to 'log2', method will terminate pre-check after reaching log2(n) characters. Useful for extremely large malformed data i.e. many {} + non-json text
6
+ * Else, will do a O(n) pre-check scan to coarsely validate brace matches. Useful for many json objects (i.e. early termination)
7
+ * @returns array of JSON objects
8
8
  */
9
- export declare function extractJsons(input: string, limit?: Limit): object[];
9
+ export declare function extractJsons<T = unknown>(input: string, limit?: Limit): T[];
10
10
  //# sourceMappingURL=extractor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,EAEN,MAAM,cAAc,CAAC;AAgMtB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,KAAc,GAAG,MAAM,EAAE,CAW3E"}
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AAEA,OAAO,EAGH,KAAK,EAER,MAAM,cAAc,CAAC;AAQtB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAG,OAAO,EACpC,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,KAAc,GACtB,CAAC,EAAE,CAWL"}
package/dist/extractor.js CHANGED
@@ -4,27 +4,93 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.extractJsons = extractJsons;
7
- const queue_1 = require("./queue");
8
7
  const interval_tree_1d_1 = __importDefault(require("interval-tree-1d"));
8
+ const denque_1 = __importDefault(require("denque"));
9
9
  const LBRACE = "{";
10
10
  const RBRACE = "}";
11
- class JsonParseError extends Error {
11
+ class JsonExtractError extends Error {
12
12
  }
13
- function convertMemoPositionToKey(memoPosition) {
14
- return `${memoPosition.left}-${memoPosition.right}`;
13
+ /**
14
+ * Extracts json objects from a given input string
15
+ * @param input input string
16
+ * @param limit Sets pre-check behavior. If set to 'log2', method will terminate pre-check after reaching log2(n) characters. Useful for extremely large malformed data i.e. many {} + non-json text
17
+ * Else, will do a O(n) pre-check scan to coarsely validate brace matches. Useful for many json objects (i.e. early termination)
18
+ * @returns array of JSON objects
19
+ */
20
+ function extractJsons(input, limit = "none") {
21
+ if (!input.length) {
22
+ return [];
23
+ }
24
+ const locations = generateBracesPrefixAndSufix(input);
25
+ if (!locations.prefix.length || !locations.suffix.length) {
26
+ return [];
27
+ }
28
+ return findValidJsons(locations, input, limit);
29
+ }
30
+ function setMapValue(memo, leftIndex, rightIndex) {
31
+ let set = memo.get(leftIndex);
32
+ if (!set) {
33
+ set = new Set();
34
+ memo.set(leftIndex, set);
35
+ }
36
+ if (set.has(rightIndex)) {
37
+ return false;
38
+ }
39
+ set.add(rightIndex);
40
+ return true;
41
+ }
42
+ function findValidJsons({ prefix, suffix }, input, limit) {
43
+ const tree = (0, interval_tree_1d_1.default)();
44
+ const queue = new denque_1.default([[0, suffix.length - 1]]);
45
+ const memo = new Map([
46
+ [0, new Set([suffix.length - 1])],
47
+ ]);
48
+ const jsons = [];
49
+ while (!queue.isEmpty()) {
50
+ const [leftIndex, rightIndex] = queue.shift();
51
+ const leftPosition = prefix[leftIndex];
52
+ const rightPosition = suffix[rightIndex];
53
+ if (rightPosition < leftPosition ||
54
+ queryIntervalSync(tree, leftPosition, rightPosition)) {
55
+ continue;
56
+ }
57
+ const set = memo.get(leftIndex);
58
+ set.delete(rightIndex);
59
+ try {
60
+ if (isBalancedWithOneJson(input, leftPosition, rightPosition, limit)) {
61
+ jsons.push(JSON.parse(input.slice(leftPosition, rightPosition + 1)));
62
+ tree.insert([leftPosition, rightPosition]);
63
+ continue;
64
+ }
65
+ }
66
+ catch (error) {
67
+ if (!(error instanceof SyntaxError)) {
68
+ throw error;
69
+ }
70
+ }
71
+ if (rightIndex - 1 >= 0 &&
72
+ setMapValue(memo, leftIndex, rightIndex - 1)) {
73
+ queue.push([leftIndex, rightIndex - 1]);
74
+ }
75
+ if (leftIndex + 1 < prefix.length &&
76
+ setMapValue(memo, leftIndex + 1, rightIndex)) {
77
+ queue.push([leftIndex + 1, rightIndex]);
78
+ }
79
+ if (!set.size) {
80
+ memo.delete(leftIndex);
81
+ }
82
+ }
83
+ return jsons;
15
84
  }
16
85
  function generateBracesPrefixAndSufix(input) {
17
86
  const prefix = [];
18
87
  const suffix = [];
19
- const braceCounter = new Map();
20
88
  for (let i = 0; i < input.length; i++) {
21
89
  if (input[i] == LBRACE) {
22
90
  prefix.push(i);
23
- braceCounter.set(i, prefix.length - suffix.length);
24
91
  }
25
92
  else if (input[i] == RBRACE) {
26
93
  suffix.push(i);
27
- braceCounter.set(i, prefix.length - suffix.length);
28
94
  }
29
95
  }
30
96
  return {
@@ -32,20 +98,19 @@ function generateBracesPrefixAndSufix(input) {
32
98
  suffix,
33
99
  };
34
100
  }
35
- function queryIntervalSync(tree, low, high) {
36
- let intervalExists = false;
37
- tree.queryInterval(low, high, (interval) => {
38
- const [left, right] = interval;
39
- if (left < low && high < right) {
40
- intervalExists = true;
41
- return;
42
- }
43
- });
44
- return intervalExists;
101
+ function generateLimit(input, left, limit) {
102
+ switch (limit) {
103
+ case "log2":
104
+ return (left +
105
+ Math.min(input.length, Math.ceil(Math.log2(input.length))));
106
+ case "none":
107
+ return input.length;
108
+ default:
109
+ throw new JsonExtractError("unknown limit type provided");
110
+ }
45
111
  }
46
112
  /**
47
113
  * Coarse pre-check to filter out invalid json candidates. Short circuits if >1 json candidates exist in slice
48
- *
49
114
  * @param input
50
115
  * @param left
51
116
  * @param right
@@ -94,87 +159,14 @@ function isBalancedWithOneJson(input, left, right, limit) {
94
159
  }
95
160
  return braceCount === 0;
96
161
  }
97
- /**
98
- * Uses a Set to memoize brace locations, a Queue to process candidates top-down and uses an interval tree
99
- * to detect already validated json ranges. Attempts
100
- * @param braceLocations
101
- * @param input
102
- * @returns
103
- */
104
- function findValidJsons({ prefix, suffix }, input, limit) {
105
- const tree = (0, interval_tree_1d_1.default)();
106
- const startingPosition = {
107
- left: 0,
108
- right: suffix.length - 1,
109
- };
110
- const queue = new queue_1.Queue(startingPosition);
111
- const memo = new Set([convertMemoPositionToKey(startingPosition)]);
112
- const jsons = [];
113
- while (queue.length()) {
114
- const { left: leftIndex, right: rightIndex } = queue.dequeue();
115
- const leftPosition = prefix[leftIndex];
116
- const rightPosition = suffix[rightIndex];
117
- if (rightPosition < leftPosition ||
118
- queryIntervalSync(tree, leftPosition, rightPosition)) {
119
- continue;
120
- }
121
- try {
122
- if (isBalancedWithOneJson(input, leftPosition, rightPosition, limit)) {
123
- jsons.push(JSON.parse(input.slice(leftPosition, rightPosition + 1)));
124
- tree.insert([leftPosition, rightPosition]);
125
- continue;
126
- }
127
- }
128
- catch (error) {
129
- if (!(error instanceof SyntaxError)) {
130
- throw error;
131
- }
132
- }
133
- const positions = [
134
- {
135
- left: leftIndex,
136
- right: rightIndex - 1 >= 0 ? rightIndex - 1 : rightIndex,
137
- },
138
- {
139
- left: leftIndex + 1 < prefix.length ? leftIndex + 1 : leftIndex,
140
- right: rightIndex,
141
- },
142
- ];
143
- for (const position of positions) {
144
- const key = convertMemoPositionToKey(position);
145
- if (!memo.has(key)) {
146
- queue.enqueue(position);
147
- memo.add(key);
148
- }
162
+ function queryIntervalSync(tree, low, high) {
163
+ let intervalExists = false;
164
+ tree.queryInterval(low, high, ([left, right]) => {
165
+ if (left < low && high < right) {
166
+ intervalExists = true;
167
+ return;
149
168
  }
150
- }
151
- return jsons;
152
- }
153
- function generateLimit(input, left, limit) {
154
- switch (limit) {
155
- case "log2":
156
- return left + Math.ceil(Math.log2(input.length));
157
- case "none":
158
- return input.length;
159
- default:
160
- throw new JsonParseError("unknown limit type provided");
161
- }
162
- }
163
- /**
164
- * Extracts json objects from a given input string
165
- * @param input input string
166
- * @param limit Sets pre-check behavior. If set to 'log2', method will terminate pre-check after reaching log2(n) characters. Useful for malformed data i.e. many {}
167
- * Else, will do a O(n) scan to coarsely validate brace matches. Useful for many json objects (i.e. early termination)
168
- * @returns
169
- */
170
- function extractJsons(input, limit = "none") {
171
- if (!input?.length) {
172
- return [];
173
- }
174
- const locations = generateBracesPrefixAndSufix(input);
175
- if (!locations.prefix.length || !locations.suffix.length) {
176
- return [];
177
- }
178
- return findValidJsons(locations, input, limit);
169
+ });
170
+ return intervalExists;
179
171
  }
180
172
  //# sourceMappingURL=extractor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":";;;;;AA4MA,oCAWC;AAjND,mCAAgC;AAChC,wEAA4C;AAE5C,MAAM,MAAM,GAAG,GAAG,CAAC;AACnB,MAAM,MAAM,GAAG,GAAG,CAAC;AAEnB,MAAM,cAAe,SAAQ,KAAK;CAAG;AAErC,SAAS,wBAAwB,CAAC,YAA0B;IAC1D,OAAO,GAAG,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAa;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,YAAY,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAsB,EACtB,GAAW,EACX,IAAY;IAEZ,IAAI,cAAc,GAAY,KAAK,CAAC;IACpC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,QAA0B,EAAE,EAAE;QAC3D,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC;QAC/B,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YAC/B,cAAc,GAAG,IAAI,CAAC;YACtB,OAAO;QACT,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,qBAAqB,CAC5B,KAAa,EACb,IAAY,EACZ,KAAa,EACb,KAAY;IAEZ,MAAM,oBAAoB,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/D,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,YAAY,GAAG,IAAI,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,oBAAoB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,GAAG,KAAK,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,UAAU,GAAG,IAAI,CAAC;YAClB,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,QAAQ,GAAG,CAAC,QAAQ,CAAC;YACrB,SAAS;QACX,CAAC;QAED,IAAI,QAAQ;YAAE,SAAS;QAEvB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,UAAU,EAAE,CAAC;QACf,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,UAAU,EAAE,CAAC;QACf,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,YAAY,GAAG,CAAC,YAAY,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,UAAU,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CACrB,EAAE,MAAM,EAAE,MAAM,EAAqB,EACrC,KAAa,EACb,KAAY;IAEZ,MAAM,IAAI,GAAG,IAAA,0BAAY,GAAE,CAAC;IAC5B,MAAM,gBAAgB,GAAiB;QACrC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;KACzB,CAAC;IACF,MAAM,KAAK,GAAwB,IAAI,aAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC,wBAAwB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,OAAO,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACtB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,OAAO,EAAG,CAAC;QAChE,MAAM,YAAY,GAAW,MAAM,CAAC,SAAS,CAAE,CAAC;QAChD,MAAM,aAAa,GAAW,MAAM,CAAC,UAAU,CAAE,CAAC;QAElD,IACE,aAAa,GAAG,YAAY;YAC5B,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,EACpD,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,IAAI,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;gBACrE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;gBAC3C,SAAS;YACX,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC,EAAE,CAAC;gBACpC,MAAM,KAAuB,CAAC;YAChC,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAmB;YAChC;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU;aACzD;YACD;gBACE,IAAI,EAAE,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC/D,KAAK,EAAE,UAAU;aAClB;SACF,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,IAAY,EAAE,KAAY;IAC9D,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,MAAM,CAAC;QACtB;YACE,MAAM,IAAI,cAAc,CAAC,6BAA6B,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,KAAa,EAAE,QAAe,MAAM;IAC/D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACzD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,34 @@
1
+ export interface BraceLocationInfo {
2
+ readonly prefix: number[];
3
+ readonly suffix: number[];
4
+ }
1
5
  export type Interval = [number, number];
2
- interface IntervalTreeNode {
3
- mid: number;
4
- left: IntervalTreeNode | null;
5
- right: IntervalTreeNode | null;
6
- leftPoints: Interval[];
7
- rightPoints: Interval[];
8
- count: number;
9
- intervals(result?: Interval[]): Interval[];
6
+ export interface IntervalTreeType {
7
+ readonly count: number;
10
8
  insert(interval: Interval): void;
11
- remove(interval: Interval): number;
12
- queryPoint(x: number, cb: (interval: Interval) => any): any;
9
+ readonly intervals: Interval[];
13
10
  queryInterval(lo: number, hi: number, cb: (interval: Interval) => any): any;
14
- }
15
- export interface IntervalTreeType {
11
+ queryPoint(x: number, cb: (interval: Interval) => any): any;
12
+ remove(interval: Interval): boolean;
16
13
  root: IntervalTreeNode | null;
14
+ }
15
+ export type Limit = "log2" | "none";
16
+ /**
17
+ * [left, right]: [number, number]
18
+ */
19
+ export type MemoPosition = [number, number];
20
+ interface IntervalTreeNode {
21
+ count: number;
17
22
  insert(interval: Interval): void;
18
- remove(interval: Interval): boolean;
19
- queryPoint(x: number, cb: (interval: Interval) => any): any;
23
+ intervals(result?: Interval[]): Interval[];
24
+ left: IntervalTreeNode | null;
25
+ leftPoints: Interval[];
26
+ mid: number;
20
27
  queryInterval(lo: number, hi: number, cb: (interval: Interval) => any): any;
21
- readonly count: number;
22
- readonly intervals: Interval[];
23
- }
24
- export interface MemoPosition {
25
- readonly left: number;
26
- readonly right: number;
27
- }
28
- export interface BraceLocationInfo {
29
- readonly prefix: number[];
30
- readonly suffix: number[];
28
+ queryPoint(x: number, cb: (interval: Interval) => any): any;
29
+ remove(interval: Interval): number;
30
+ right: IntervalTreeNode | null;
31
+ rightPoints: Interval[];
31
32
  }
32
- export type Limit = "log2" | "none";
33
33
  export {};
34
34
  //# sourceMappingURL=interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAExC,UAAU,gBAAgB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC3C,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC;IACnC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,GAAG,GAAG,GAAG,CAAC;IAC5D,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,GAAG,GAAG,GAAG,CAAC;CAC7E;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IACpC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,GAAG,GAAG,GAAG,CAAC;IAC5D,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,GAAG,GAAG,GAAG,CAAC;IAC5E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAExC,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,GAAG,GAAG,GAAG,CAAC;IAC5E,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,GAAG,GAAG,GAAG,CAAC;IAC5D,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IACpC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C,UAAU,gBAAgB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC3C,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,GAAG,GAAG,GAAG,CAAC;IAC5E,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,GAAG,GAAG,GAAG,CAAC;IAC5D,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC;IACnC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,QAAQ,EAAE,CAAC;CAC3B"}
@@ -0,0 +1,39 @@
1
+ // eslint.config.mjs
2
+ import js from "@eslint/js";
3
+ import tseslint from "typescript-eslint";
4
+ import tsParser from "@typescript-eslint/parser";
5
+ import prettier from "eslint-plugin-prettier";
6
+ import { fileURLToPath } from "node:url";
7
+ import { dirname } from "node:path";
8
+ import prettierConfig from "eslint-config-prettier";
9
+ import { defineConfig } from "eslint/config";
10
+
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+
13
+ export default defineConfig([
14
+ { ignores: ["node_modules", "dist", "eslint.config.*", "jest.config.*"] },
15
+
16
+ {
17
+ files: ["**/*.{js,cjs,mjs}"],
18
+ extends: [js.configs.recommended],
19
+ },
20
+ {
21
+ files: ["**/*.{ts,tsx}"],
22
+ languageOptions: {
23
+ parser: tsParser,
24
+ parserOptions: {
25
+ projectService: true,
26
+ tsconfigRootDir: __dirname,
27
+ },
28
+ },
29
+ plugins: {
30
+ "@typescript-eslint": tseslint.plugin,
31
+ prettier,
32
+ },
33
+ rules: {
34
+ "prettier/prettier": ["error", { tabWidth: 4}],
35
+ }
36
+ },
37
+ prettierConfig,
38
+ tseslint.configs.stylisticTypeChecked,
39
+ ]);
package/package.json CHANGED
@@ -1,37 +1,49 @@
1
- {
2
- "name": "full-json-extractor",
3
- "version": "1.0.0",
4
- "main": "dist/index.js",
5
- "scripts": {
6
- "clean": "rimraf dist build .cache",
7
- "format": "prettier --check \"src/**/*.{js,ts,tsx,jsx,json,css,md}",
8
- "format:fix": "prettier --write \"src/**/*.{js,ts,tsx,jsx,json,css,md}",
9
- "build": "tsc",
10
- "test": "jest",
11
- "release": "npm run format && npm run test && npm run build"
12
- },
13
- "keywords": [
14
- "json",
15
- "json parse",
16
- "json extract"
17
- ],
18
- "author": "Jonzdan",
19
- "license": "ISC",
20
- "description": "Brute-forces all possible highest-level json candidates with pruning to keep performance fast with reasonable payload < 1MB",
21
- "devDependencies": {
22
- "@types/jest": "^30.0.0",
23
- "@types/node": "^24.2.1",
24
- "jest": "^30.0.5",
25
- "prettier": "^3.6.2",
26
- "rimraf": "^6.0.1",
27
- "ts-jest": "^29.4.1",
28
- "ts-node": "^10.9.2",
29
- "typescript": "^5.9.2"
30
- },
31
- "dependencies": {
32
- "interval-tree-1d": "^1.0.4"
33
- },
34
- "publishConfig": {
35
- "registry": "https://registry.npmjs.org/"
36
- }
37
- }
1
+ {
2
+ "name": "full-json-extractor",
3
+ "version": "1.0.2",
4
+ "main": "dist/index.js",
5
+ "scripts": {
6
+ "clean": "rimraf dist build .cache",
7
+ "format": "eslint .",
8
+ "format:fix": "eslint . --fix",
9
+ "build": "tsc",
10
+ "test": "jest",
11
+ "release": "npm run test && npm run build"
12
+ },
13
+ "keywords": [
14
+ "json",
15
+ "extract-json",
16
+ "json-extractor",
17
+ "parse-json",
18
+ "top-level-json",
19
+ "malformed-json",
20
+ "data",
21
+ "object"
22
+ ],
23
+ "author": "Jonzdan",
24
+ "license": "ISC",
25
+ "description": "Brute-forces all possible highest-level json candidates with pruning to keep performance fast with reasonable payload < 1MB",
26
+ "devDependencies": {
27
+ "@eslint/js": "^9.34.0",
28
+ "@types/eslint": "^9.6.1",
29
+ "@types/jest": "^30.0.0",
30
+ "@types/node": "^24.2.1",
31
+ "eslint": "^9.39.2",
32
+ "eslint-config-prettier": "^10.1.8",
33
+ "eslint-plugin-prettier": "^5.5.5",
34
+ "jest": "^30.0.5",
35
+ "prettier": "^3.6.2",
36
+ "rimraf": "^6.0.1",
37
+ "ts-jest": "^29.4.1",
38
+ "ts-node": "^10.9.2",
39
+ "typescript": "^5.9.2",
40
+ "typescript-eslint": "^8.54.0"
41
+ },
42
+ "dependencies": {
43
+ "denque": "^2.1.0",
44
+ "interval-tree-1d": "^1.0.4"
45
+ },
46
+ "publishConfig": {
47
+ "registry": "https://registry.npmjs.org/"
48
+ }
49
+ }