toon-parser 2.2.1 → 3.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/dist/core.cjs +630 -0
- package/dist/core.d.ts +73 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +625 -0
- package/dist/core.js.map +1 -0
- package/dist/csv.cjs +16 -24
- package/dist/csv.d.ts +2 -1
- package/dist/csv.d.ts.map +1 -1
- package/dist/csv.js +8 -21
- package/dist/csv.js.map +1 -1
- package/dist/html.cjs +9 -7
- package/dist/html.d.ts +4 -2
- package/dist/html.d.ts.map +1 -1
- package/dist/html.js +7 -5
- package/dist/html.js.map +1 -1
- package/dist/index.cjs +5 -816
- package/dist/index.d.ts +2 -51
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -875
- package/dist/index.js.map +1 -1
- package/dist/inferType.cjs +39 -0
- package/dist/inferType.d.ts +10 -0
- package/dist/inferType.d.ts.map +1 -0
- package/dist/inferType.js +21 -0
- package/dist/inferType.js.map +1 -0
- package/dist/internal/constants.cjs +52 -0
- package/dist/internal/constants.d.ts +9 -0
- package/dist/internal/constants.d.ts.map +1 -0
- package/dist/internal/constants.js +15 -0
- package/dist/internal/constants.js.map +1 -0
- package/dist/internal/errors.cjs +34 -0
- package/dist/internal/errors.d.ts +5 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +8 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/primitives.cjs +304 -0
- package/dist/internal/primitives.d.ts +23 -0
- package/dist/internal/primitives.d.ts.map +1 -0
- package/dist/internal/primitives.js +289 -0
- package/dist/internal/primitives.js.map +1 -0
- package/dist/internal/security.cjs +118 -0
- package/dist/internal/security.d.ts +31 -0
- package/dist/internal/security.d.ts.map +1 -0
- package/dist/internal/security.js +87 -0
- package/dist/internal/security.js.map +1 -0
- package/dist/internal/types.cjs +16 -0
- package/dist/internal/types.d.ts +37 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/internal/types.js +2 -0
- package/dist/internal/types.js.map +1 -0
- package/dist/log.cjs +43 -17
- package/dist/log.d.ts +4 -3
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +47 -19
- package/dist/log.js.map +1 -1
- package/dist/url.cjs +22 -21
- package/dist/url.d.ts +1 -1
- package/dist/url.d.ts.map +1 -1
- package/dist/url.js +23 -29
- package/dist/url.js.map +1 -1
- package/dist/xml.cjs +7 -5
- package/dist/xml.d.ts +1 -1
- package/dist/xml.d.ts.map +1 -1
- package/dist/xml.js +5 -3
- package/dist/xml.js.map +1 -1
- package/package.json +40 -10
package/dist/log.cjs
CHANGED
|
@@ -21,9 +21,39 @@ __export(log_exports, {
|
|
|
21
21
|
logToToon: () => logToToon
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(log_exports);
|
|
24
|
-
var
|
|
25
|
-
const
|
|
24
|
+
var import_core = require("./core.cjs");
|
|
25
|
+
const COMMON_RE = /^(\S+) (\S+) (\S+) \[([^\]]*)\] "([^"]*)" (\d+) (\d+|-)$/;
|
|
26
|
+
const COMBINED_RE = /^(\S+) (\S+) (\S+) \[([^\]]*)\] "([^"]*)" (\d+) (\d+|-) "([^"]*)" "([^"]*)"$/;
|
|
27
|
+
function parseCommon(line) {
|
|
28
|
+
const m = line.match(COMMON_RE);
|
|
29
|
+
if (!m) return null;
|
|
30
|
+
return {
|
|
31
|
+
host: m[1] ?? "",
|
|
32
|
+
ident: m[2] ?? "-",
|
|
33
|
+
authuser: m[3] ?? "-",
|
|
34
|
+
date: m[4] ?? "",
|
|
35
|
+
request: m[5] ?? "",
|
|
36
|
+
status: parseInt(m[6] ?? "0", 10),
|
|
37
|
+
size: m[7] === "-" ? null : parseInt(m[7] ?? "0", 10)
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function parseCombined(line) {
|
|
41
|
+
const m = line.match(COMBINED_RE);
|
|
42
|
+
if (!m) return null;
|
|
43
|
+
return {
|
|
44
|
+
host: m[1] ?? "",
|
|
45
|
+
ident: m[2] ?? "-",
|
|
46
|
+
authuser: m[3] ?? "-",
|
|
47
|
+
date: m[4] ?? "",
|
|
48
|
+
request: m[5] ?? "",
|
|
49
|
+
status: parseInt(m[6] ?? "0", 10),
|
|
50
|
+
size: m[7] === "-" ? null : parseInt(m[7] ?? "0", 10),
|
|
51
|
+
referer: m[8] ?? "",
|
|
52
|
+
userAgent: m[9] ?? ""
|
|
53
|
+
};
|
|
54
|
+
}
|
|
26
55
|
function logToToon(logData, options = {}) {
|
|
56
|
+
(0, import_core.enforceInputLength)(logData, options);
|
|
27
57
|
const lines = logData.split(/\r?\n/).filter((line) => line.trim() !== "");
|
|
28
58
|
const format = options.format ?? "auto";
|
|
29
59
|
if (format === "json" || format === "auto" && lines[0]?.trim().startsWith("{")) {
|
|
@@ -34,22 +64,18 @@ function logToToon(logData, options = {}) {
|
|
|
34
64
|
return { raw: line };
|
|
35
65
|
}
|
|
36
66
|
});
|
|
37
|
-
return (0,
|
|
67
|
+
return (0, import_core.jsonToToon)(logs, options);
|
|
68
|
+
}
|
|
69
|
+
if (format === "combined") {
|
|
70
|
+
const parsed2 = lines.map((line) => parseCombined(line) ?? { raw: line });
|
|
71
|
+
return (0, import_core.jsonToToon)(parsed2, options);
|
|
72
|
+
}
|
|
73
|
+
if (format === "clf") {
|
|
74
|
+
const parsed2 = lines.map((line) => parseCombined(line) ?? parseCommon(line) ?? { raw: line });
|
|
75
|
+
return (0, import_core.jsonToToon)(parsed2, options);
|
|
38
76
|
}
|
|
39
|
-
const parsed = lines.map((line) => {
|
|
40
|
-
|
|
41
|
-
if (match) {
|
|
42
|
-
return {
|
|
43
|
-
host: match[1] || "",
|
|
44
|
-
date: match[2] || "",
|
|
45
|
-
request: match[3] || "",
|
|
46
|
-
status: parseInt(match[4] || "0", 10),
|
|
47
|
-
size: parseInt(match[5] || "0", 10)
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
return { raw: line };
|
|
51
|
-
});
|
|
52
|
-
return (0, import_index.jsonToToon)(parsed, options);
|
|
77
|
+
const parsed = lines.map((line) => parseCombined(line) ?? parseCommon(line) ?? { raw: line });
|
|
78
|
+
return (0, import_core.jsonToToon)(parsed, options);
|
|
53
79
|
}
|
|
54
80
|
// Annotate the CommonJS export names for ESM import in node:
|
|
55
81
|
0 && (module.exports = {
|
package/dist/log.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { JsonToToonOptions } from './
|
|
1
|
+
import { JsonToToonOptions } from './core.js';
|
|
2
2
|
export interface LogToToonOptions extends JsonToToonOptions {
|
|
3
3
|
/**
|
|
4
|
-
* Log format. Defaults to 'auto' which tries to detect
|
|
4
|
+
* Log format. Defaults to 'auto' which tries to detect Common/Combined Log
|
|
5
|
+
* Format or NDJSON. `'clf'` accepts both Common and Combined variants.
|
|
5
6
|
*/
|
|
6
|
-
format?: 'auto' | 'clf' | 'json';
|
|
7
|
+
format?: 'auto' | 'clf' | 'combined' | 'json';
|
|
7
8
|
}
|
|
8
9
|
export declare function logToToon(logData: string, options?: LogToToonOptions): string;
|
|
9
10
|
//# sourceMappingURL=log.d.ts.map
|
package/dist/log.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,iBAAiB,
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,iBAAiB,EAAsB,MAAM,WAAW,CAAC;AAE9E,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC;CAC/C;AAoDD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAyBjF"}
|
package/dist/log.js
CHANGED
|
@@ -1,10 +1,43 @@
|
|
|
1
|
-
import { jsonToToon } from './
|
|
2
|
-
//
|
|
3
|
-
|
|
1
|
+
import { jsonToToon, enforceInputLength } from './core.js';
|
|
2
|
+
// Common Log Format: host identd authuser [date] "request" status size
|
|
3
|
+
// Combined Log Format: host identd authuser [date] "request" status size "referer" "user-agent"
|
|
4
|
+
// Negated character classes keep the regex linear (ReDoS-safe).
|
|
5
|
+
const COMMON_RE = /^(\S+) (\S+) (\S+) \[([^\]]*)\] "([^"]*)" (\d+) (\d+|-)$/;
|
|
6
|
+
const COMBINED_RE = /^(\S+) (\S+) (\S+) \[([^\]]*)\] "([^"]*)" (\d+) (\d+|-) "([^"]*)" "([^"]*)"$/;
|
|
7
|
+
function parseCommon(line) {
|
|
8
|
+
const m = line.match(COMMON_RE);
|
|
9
|
+
if (!m)
|
|
10
|
+
return null;
|
|
11
|
+
return {
|
|
12
|
+
host: m[1] ?? '',
|
|
13
|
+
ident: m[2] ?? '-',
|
|
14
|
+
authuser: m[3] ?? '-',
|
|
15
|
+
date: m[4] ?? '',
|
|
16
|
+
request: m[5] ?? '',
|
|
17
|
+
status: parseInt(m[6] ?? '0', 10),
|
|
18
|
+
size: m[7] === '-' ? null : parseInt(m[7] ?? '0', 10)
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function parseCombined(line) {
|
|
22
|
+
const m = line.match(COMBINED_RE);
|
|
23
|
+
if (!m)
|
|
24
|
+
return null;
|
|
25
|
+
return {
|
|
26
|
+
host: m[1] ?? '',
|
|
27
|
+
ident: m[2] ?? '-',
|
|
28
|
+
authuser: m[3] ?? '-',
|
|
29
|
+
date: m[4] ?? '',
|
|
30
|
+
request: m[5] ?? '',
|
|
31
|
+
status: parseInt(m[6] ?? '0', 10),
|
|
32
|
+
size: m[7] === '-' ? null : parseInt(m[7] ?? '0', 10),
|
|
33
|
+
referer: m[8] ?? '',
|
|
34
|
+
userAgent: m[9] ?? ''
|
|
35
|
+
};
|
|
36
|
+
}
|
|
4
37
|
export function logToToon(logData, options = {}) {
|
|
38
|
+
enforceInputLength(logData, options);
|
|
5
39
|
const lines = logData.split(/\r?\n/).filter(line => line.trim() !== '');
|
|
6
40
|
const format = options.format ?? 'auto';
|
|
7
|
-
// Attempt JSON detection on first line
|
|
8
41
|
if (format === 'json' || (format === 'auto' && lines[0]?.trim().startsWith('{'))) {
|
|
9
42
|
const logs = lines.map(line => {
|
|
10
43
|
try {
|
|
@@ -16,21 +49,16 @@ export function logToToon(logData, options = {}) {
|
|
|
16
49
|
});
|
|
17
50
|
return jsonToToon(logs, options);
|
|
18
51
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
size: parseInt(match[5] || '0', 10)
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
return { raw: line };
|
|
33
|
-
});
|
|
52
|
+
if (format === 'combined') {
|
|
53
|
+
const parsed = lines.map(line => parseCombined(line) ?? { raw: line });
|
|
54
|
+
return jsonToToon(parsed, options);
|
|
55
|
+
}
|
|
56
|
+
if (format === 'clf') {
|
|
57
|
+
const parsed = lines.map(line => parseCombined(line) ?? parseCommon(line) ?? { raw: line });
|
|
58
|
+
return jsonToToon(parsed, options);
|
|
59
|
+
}
|
|
60
|
+
// 'auto': try Combined, then Common, fall back to raw line.
|
|
61
|
+
const parsed = lines.map(line => parseCombined(line) ?? parseCommon(line) ?? { raw: line });
|
|
34
62
|
return jsonToToon(parsed, options);
|
|
35
63
|
}
|
|
36
64
|
//# sourceMappingURL=log.js.map
|
package/dist/log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAqB,MAAM,
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"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"}
|
package/dist/url.cjs
CHANGED
|
@@ -21,8 +21,11 @@ __export(url_exports, {
|
|
|
21
21
|
urlToToon: () => urlToToon
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(url_exports);
|
|
24
|
-
var
|
|
24
|
+
var import_core = require("./core.cjs");
|
|
25
|
+
var import_inferType = require("./inferType.cjs");
|
|
26
|
+
const DEFAULT_DISALLOWED = ["__proto__", "constructor", "prototype"];
|
|
25
27
|
function urlToToon(urlString, options = {}) {
|
|
28
|
+
(0, import_core.enforceInputLength)(urlString, options);
|
|
26
29
|
let search = urlString;
|
|
27
30
|
try {
|
|
28
31
|
const u = new URL(urlString);
|
|
@@ -34,37 +37,35 @@ function urlToToon(urlString, options = {}) {
|
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
39
|
const params = new URLSearchParams(search);
|
|
37
|
-
const obj =
|
|
40
|
+
const obj = /* @__PURE__ */ Object.create(null);
|
|
41
|
+
const disallowed = new Set(options.disallowedKeys ?? DEFAULT_DISALLOWED);
|
|
38
42
|
for (const [key, value] of params.entries()) {
|
|
39
|
-
assignDeep(obj, key, value);
|
|
43
|
+
assignDeep(obj, key, value, disallowed);
|
|
40
44
|
}
|
|
41
|
-
return (0,
|
|
45
|
+
return (0, import_core.jsonToToon)(obj, options);
|
|
42
46
|
}
|
|
43
|
-
function assignDeep(obj, key, value) {
|
|
47
|
+
function assignDeep(obj, key, value, disallowed) {
|
|
44
48
|
const parts = key.split(/\[|\]\[|\]|\./).filter(Boolean);
|
|
45
49
|
if (parts.length === 0) return;
|
|
50
|
+
for (const part of parts) {
|
|
51
|
+
if (disallowed.has(part)) {
|
|
52
|
+
throw new import_core.ToonError(`Disallowed key "${part}" in URL parameter.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
46
55
|
let current = obj;
|
|
47
56
|
for (let i = 0; i < parts.length - 1; i++) {
|
|
48
57
|
const part = parts[i];
|
|
49
|
-
|
|
50
|
-
if (
|
|
51
|
-
|
|
58
|
+
const existing = Object.prototype.hasOwnProperty.call(current, part) ? current[part] : void 0;
|
|
59
|
+
if (existing === void 0 || existing === null || typeof existing !== "object") {
|
|
60
|
+
const next = /* @__PURE__ */ Object.create(null);
|
|
61
|
+
current[part] = next;
|
|
62
|
+
current = next;
|
|
63
|
+
} else {
|
|
64
|
+
current = existing;
|
|
52
65
|
}
|
|
53
|
-
current = current[part];
|
|
54
66
|
}
|
|
55
67
|
const last = parts[parts.length - 1];
|
|
56
|
-
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
const typed = inferType(value);
|
|
60
|
-
current[last] = typed;
|
|
61
|
-
}
|
|
62
|
-
function inferType(val) {
|
|
63
|
-
if (val === "true") return true;
|
|
64
|
-
if (val === "false") return false;
|
|
65
|
-
const num = Number(val);
|
|
66
|
-
if (!isNaN(num) && val.trim() !== "") return num;
|
|
67
|
-
return val;
|
|
68
|
+
current[last] = (0, import_inferType.inferType)(value);
|
|
68
69
|
}
|
|
69
70
|
// Annotate the CommonJS export names for ESM import in node:
|
|
70
71
|
0 && (module.exports = {
|
package/dist/url.d.ts
CHANGED
package/dist/url.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,iBAAiB,
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,iBAAiB,EAAiC,MAAM,WAAW,CAAC;AAKzF,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CAsBpF"}
|
package/dist/url.js
CHANGED
|
@@ -1,57 +1,51 @@
|
|
|
1
|
-
import { jsonToToon } from './
|
|
1
|
+
import { jsonToToon, ToonError, enforceInputLength } from './core.js';
|
|
2
|
+
import { inferType } from './inferType.js';
|
|
3
|
+
const DEFAULT_DISALLOWED = ['__proto__', 'constructor', 'prototype'];
|
|
2
4
|
export function urlToToon(urlString, options = {}) {
|
|
3
|
-
|
|
5
|
+
enforceInputLength(urlString, options);
|
|
4
6
|
let search = urlString;
|
|
5
7
|
try {
|
|
6
8
|
const u = new URL(urlString);
|
|
7
9
|
search = u.search;
|
|
8
10
|
}
|
|
9
11
|
catch {
|
|
10
|
-
// likely just a query string part or relative path
|
|
11
12
|
const qIndex = urlString.indexOf('?');
|
|
12
13
|
if (qIndex !== -1) {
|
|
13
14
|
search = urlString.slice(qIndex);
|
|
14
15
|
}
|
|
15
16
|
}
|
|
16
17
|
const params = new URLSearchParams(search);
|
|
17
|
-
const obj =
|
|
18
|
+
const obj = Object.create(null);
|
|
19
|
+
const disallowed = new Set(options.disallowedKeys ?? DEFAULT_DISALLOWED);
|
|
18
20
|
for (const [key, value] of params.entries()) {
|
|
19
|
-
assignDeep(obj, key, value);
|
|
21
|
+
assignDeep(obj, key, value, disallowed);
|
|
20
22
|
}
|
|
21
23
|
return jsonToToon(obj, options);
|
|
22
24
|
}
|
|
23
|
-
function assignDeep(obj, key, value) {
|
|
24
|
-
//
|
|
25
|
-
// For safety and simplicity, we'll try to support basic bracket notation commonly used in QS
|
|
26
|
-
// e.g. "filters[date][start]" -> filters: { date: { start: value } }
|
|
25
|
+
function assignDeep(obj, key, value, disallowed) {
|
|
26
|
+
// Split on `[`, `][`, `]`, or `.` — supports `a.b`, `a[b]`, `a[b][c]`.
|
|
27
27
|
const parts = key.split(/\[|\]\[|\]|\./).filter(Boolean);
|
|
28
28
|
if (parts.length === 0)
|
|
29
29
|
return;
|
|
30
|
+
for (const part of parts) {
|
|
31
|
+
if (disallowed.has(part)) {
|
|
32
|
+
throw new ToonError(`Disallowed key "${part}" in URL parameter.`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
30
35
|
let current = obj;
|
|
31
36
|
for (let i = 0; i < parts.length - 1; i++) {
|
|
32
37
|
const part = parts[i];
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
current[part] =
|
|
38
|
+
const existing = Object.prototype.hasOwnProperty.call(current, part) ? current[part] : undefined;
|
|
39
|
+
if (existing === undefined || existing === null || typeof existing !== 'object') {
|
|
40
|
+
const next = Object.create(null);
|
|
41
|
+
current[part] = next;
|
|
42
|
+
current = next;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
current = existing;
|
|
37
46
|
}
|
|
38
|
-
current = current[part];
|
|
39
47
|
}
|
|
40
48
|
const last = parts[parts.length - 1];
|
|
41
|
-
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
const typed = inferType(value);
|
|
45
|
-
current[last] = typed;
|
|
46
|
-
}
|
|
47
|
-
function inferType(val) {
|
|
48
|
-
if (val === 'true')
|
|
49
|
-
return true;
|
|
50
|
-
if (val === 'false')
|
|
51
|
-
return false;
|
|
52
|
-
const num = Number(val);
|
|
53
|
-
if (!isNaN(num) && val.trim() !== '')
|
|
54
|
-
return num;
|
|
55
|
-
return val;
|
|
49
|
+
current[last] = inferType(value);
|
|
56
50
|
}
|
|
57
51
|
//# sourceMappingURL=url.js.map
|
package/dist/url.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAqB,MAAM,
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"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"}
|
package/dist/xml.cjs
CHANGED
|
@@ -23,7 +23,7 @@ __export(xml_exports, {
|
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(xml_exports);
|
|
25
25
|
var import_fast_xml_parser = require("fast-xml-parser");
|
|
26
|
-
var
|
|
26
|
+
var import_core = require("./core.cjs");
|
|
27
27
|
const DEFAULT_XML_OPTIONS = {
|
|
28
28
|
ignoreAttributes: false,
|
|
29
29
|
attributeNamePrefix: "@_",
|
|
@@ -35,26 +35,28 @@ const DEFAULT_XML_OPTIONS = {
|
|
|
35
35
|
// but users can override this via xmlOptions.
|
|
36
36
|
};
|
|
37
37
|
function xmlToToon(xml, options = {}) {
|
|
38
|
+
(0, import_core.enforceInputLength)(xml, options);
|
|
38
39
|
const trimmed = xml.trim();
|
|
39
40
|
if (!trimmed) {
|
|
40
|
-
return (0,
|
|
41
|
+
return (0, import_core.jsonToToon)({}, options);
|
|
41
42
|
}
|
|
42
43
|
const validation = import_fast_xml_parser.XMLValidator.validate(xml);
|
|
43
44
|
if (validation !== true) {
|
|
44
|
-
throw new
|
|
45
|
+
throw new import_core.ToonError("Malformed XML");
|
|
45
46
|
}
|
|
46
47
|
const parser = new import_fast_xml_parser.XMLParser({
|
|
47
48
|
...DEFAULT_XML_OPTIONS,
|
|
48
49
|
...options.xmlOptions
|
|
49
50
|
});
|
|
50
51
|
const jsonObj = parser.parse(xml);
|
|
51
|
-
return (0,
|
|
52
|
+
return (0, import_core.jsonToToon)(jsonObj, options);
|
|
52
53
|
}
|
|
53
54
|
function xmlToJson(xml, options = {}) {
|
|
55
|
+
(0, import_core.enforceInputLength)(xml, options);
|
|
54
56
|
if (!xml.trim()) return {};
|
|
55
57
|
const validation = import_fast_xml_parser.XMLValidator.validate(xml);
|
|
56
58
|
if (validation !== true) {
|
|
57
|
-
throw new
|
|
59
|
+
throw new import_core.ToonError("Malformed XML");
|
|
58
60
|
}
|
|
59
61
|
const parser = new import_fast_xml_parser.XMLParser({
|
|
60
62
|
...DEFAULT_XML_OPTIONS,
|
package/dist/xml.d.ts
CHANGED
package/dist/xml.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAc,iBAAiB,
|
|
1
|
+
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAc,iBAAiB,EAAiC,MAAM,WAAW,CAAC;AAEzF,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CAClC;AAaD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAmB7E;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAe9E"}
|
package/dist/xml.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { XMLParser, XMLValidator } from 'fast-xml-parser';
|
|
2
|
-
import { jsonToToon } from './
|
|
2
|
+
import { jsonToToon, ToonError, enforceInputLength } from './core.js';
|
|
3
3
|
const DEFAULT_XML_OPTIONS = {
|
|
4
4
|
ignoreAttributes: false,
|
|
5
5
|
attributeNamePrefix: '@_',
|
|
@@ -18,13 +18,14 @@ const DEFAULT_XML_OPTIONS = {
|
|
|
18
18
|
* @returns The resulting TOON string.
|
|
19
19
|
*/
|
|
20
20
|
export function xmlToToon(xml, options = {}) {
|
|
21
|
+
enforceInputLength(xml, options);
|
|
21
22
|
const trimmed = xml.trim();
|
|
22
23
|
if (!trimmed) {
|
|
23
24
|
return jsonToToon({}, options);
|
|
24
25
|
}
|
|
25
26
|
const validation = XMLValidator.validate(xml);
|
|
26
27
|
if (validation !== true) {
|
|
27
|
-
throw new
|
|
28
|
+
throw new ToonError('Malformed XML');
|
|
28
29
|
}
|
|
29
30
|
const parser = new XMLParser({
|
|
30
31
|
...DEFAULT_XML_OPTIONS,
|
|
@@ -34,11 +35,12 @@ export function xmlToToon(xml, options = {}) {
|
|
|
34
35
|
return jsonToToon(jsonObj, options);
|
|
35
36
|
}
|
|
36
37
|
export function xmlToJson(xml, options = {}) {
|
|
38
|
+
enforceInputLength(xml, options);
|
|
37
39
|
if (!xml.trim())
|
|
38
40
|
return {};
|
|
39
41
|
const validation = XMLValidator.validate(xml);
|
|
40
42
|
if (validation !== true) {
|
|
41
|
-
throw new
|
|
43
|
+
throw new ToonError('Malformed XML');
|
|
42
44
|
}
|
|
43
45
|
const parser = new XMLParser({
|
|
44
46
|
...DEFAULT_XML_OPTIONS,
|
package/dist/xml.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAc,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAqB,MAAM,
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAc,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAqB,SAAS,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAgBzF,MAAM,mBAAmB,GAAwB;IAC/C,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;IACzB,iBAAiB,EAAE,IAAI;IACvB,gEAAgE;IAChE,4CAA4C;IAC5C,iFAAiF;IACjF,8CAA8C;CAC/C,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,UAA4B,EAAE;IACnE,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,GAAG,mBAAmB;QACtB,GAAG,OAAO,CAAC,UAAU;KACtB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,UAA4B,EAAE;IACnE,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAE3B,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,GAAG,mBAAmB;QACtB,GAAG,OAAO,CAAC,UAAU;KACtB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "toon-parser",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Safe JSON <-> TOON encoder/decoder with strict validation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -11,22 +11,52 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"import": "./dist/index.js",
|
|
13
13
|
"require": "./dist/index.cjs"
|
|
14
|
-
}
|
|
14
|
+
},
|
|
15
|
+
"./csv": {
|
|
16
|
+
"types": "./dist/csv.d.ts",
|
|
17
|
+
"import": "./dist/csv.js",
|
|
18
|
+
"require": "./dist/csv.cjs"
|
|
19
|
+
},
|
|
20
|
+
"./xml": {
|
|
21
|
+
"types": "./dist/xml.d.ts",
|
|
22
|
+
"import": "./dist/xml.js",
|
|
23
|
+
"require": "./dist/xml.cjs"
|
|
24
|
+
},
|
|
25
|
+
"./html": {
|
|
26
|
+
"types": "./dist/html.d.ts",
|
|
27
|
+
"import": "./dist/html.js",
|
|
28
|
+
"require": "./dist/html.cjs"
|
|
29
|
+
},
|
|
30
|
+
"./log": {
|
|
31
|
+
"types": "./dist/log.d.ts",
|
|
32
|
+
"import": "./dist/log.js",
|
|
33
|
+
"require": "./dist/log.cjs"
|
|
34
|
+
},
|
|
35
|
+
"./url": {
|
|
36
|
+
"types": "./dist/url.d.ts",
|
|
37
|
+
"import": "./dist/url.js",
|
|
38
|
+
"require": "./dist/url.cjs"
|
|
39
|
+
},
|
|
40
|
+
"./package.json": "./package.json"
|
|
15
41
|
},
|
|
16
42
|
"files": [
|
|
17
43
|
"dist",
|
|
18
|
-
"!dist/**/*.test.*"
|
|
44
|
+
"!dist/**/*.test.*",
|
|
45
|
+
"!dist/**/*.bench.*",
|
|
46
|
+
"!dist/bench/**",
|
|
47
|
+
"!dist/cjs/**/*.test.*",
|
|
48
|
+
"!dist/cjs/**/*.bench.*"
|
|
19
49
|
],
|
|
20
50
|
"scripts": {
|
|
21
51
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
22
52
|
"build:types": "tsc -p tsconfig.json --emitDeclarationOnly",
|
|
23
53
|
"build:js": "tsc -p tsconfig.json",
|
|
24
|
-
"build:cjs": "
|
|
54
|
+
"build:cjs": "node ./scripts/build-cjs.mjs && node ./scripts/build-copy-cjs-output.js",
|
|
25
55
|
"build": "npm run typecheck && npm run build:types && npm run build:js && npm run build:cjs",
|
|
26
56
|
"clean": "rimraf dist",
|
|
27
57
|
"clean:node": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
28
58
|
"prepare": "npm run build",
|
|
29
|
-
"lint": "eslint
|
|
59
|
+
"lint": "eslint src",
|
|
30
60
|
"verify-docs": "node scripts/verify-docs.js",
|
|
31
61
|
"test": "vitest --run",
|
|
32
62
|
"coverage": "vitest --run --coverage"
|
|
@@ -51,18 +81,18 @@
|
|
|
51
81
|
"license": "MIT",
|
|
52
82
|
"sideEffects": false,
|
|
53
83
|
"devDependencies": {
|
|
54
|
-
"esbuild": "^0.27.
|
|
55
|
-
"fast-check": "^4.
|
|
84
|
+
"esbuild": "^0.27.7",
|
|
85
|
+
"fast-check": "^4.7.0",
|
|
56
86
|
"rimraf": "^6.1.3",
|
|
57
87
|
"eslint": "^9.39.4",
|
|
58
|
-
"@typescript-eslint/parser": "^8.
|
|
59
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
88
|
+
"@typescript-eslint/parser": "^8.59.1",
|
|
89
|
+
"@typescript-eslint/eslint-plugin": "^8.59.1"
|
|
60
90
|
},
|
|
61
91
|
"engines": {
|
|
62
92
|
"node": ">=20"
|
|
63
93
|
},
|
|
64
94
|
"dependencies": {
|
|
65
|
-
"fast-xml-parser": "^5.
|
|
95
|
+
"fast-xml-parser": "^5.7.2",
|
|
66
96
|
"node-html-parser": "^7.1.0"
|
|
67
97
|
}
|
|
68
98
|
}
|