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.
Files changed (66) hide show
  1. package/dist/core.cjs +630 -0
  2. package/dist/core.d.ts +73 -0
  3. package/dist/core.d.ts.map +1 -0
  4. package/dist/core.js +625 -0
  5. package/dist/core.js.map +1 -0
  6. package/dist/csv.cjs +16 -24
  7. package/dist/csv.d.ts +2 -1
  8. package/dist/csv.d.ts.map +1 -1
  9. package/dist/csv.js +8 -21
  10. package/dist/csv.js.map +1 -1
  11. package/dist/html.cjs +9 -7
  12. package/dist/html.d.ts +4 -2
  13. package/dist/html.d.ts.map +1 -1
  14. package/dist/html.js +7 -5
  15. package/dist/html.js.map +1 -1
  16. package/dist/index.cjs +5 -816
  17. package/dist/index.d.ts +2 -51
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +5 -875
  20. package/dist/index.js.map +1 -1
  21. package/dist/inferType.cjs +39 -0
  22. package/dist/inferType.d.ts +10 -0
  23. package/dist/inferType.d.ts.map +1 -0
  24. package/dist/inferType.js +21 -0
  25. package/dist/inferType.js.map +1 -0
  26. package/dist/internal/constants.cjs +52 -0
  27. package/dist/internal/constants.d.ts +9 -0
  28. package/dist/internal/constants.d.ts.map +1 -0
  29. package/dist/internal/constants.js +15 -0
  30. package/dist/internal/constants.js.map +1 -0
  31. package/dist/internal/errors.cjs +34 -0
  32. package/dist/internal/errors.d.ts +5 -0
  33. package/dist/internal/errors.d.ts.map +1 -0
  34. package/dist/internal/errors.js +8 -0
  35. package/dist/internal/errors.js.map +1 -0
  36. package/dist/internal/primitives.cjs +304 -0
  37. package/dist/internal/primitives.d.ts +23 -0
  38. package/dist/internal/primitives.d.ts.map +1 -0
  39. package/dist/internal/primitives.js +289 -0
  40. package/dist/internal/primitives.js.map +1 -0
  41. package/dist/internal/security.cjs +118 -0
  42. package/dist/internal/security.d.ts +31 -0
  43. package/dist/internal/security.d.ts.map +1 -0
  44. package/dist/internal/security.js +87 -0
  45. package/dist/internal/security.js.map +1 -0
  46. package/dist/internal/types.cjs +16 -0
  47. package/dist/internal/types.d.ts +37 -0
  48. package/dist/internal/types.d.ts.map +1 -0
  49. package/dist/internal/types.js +2 -0
  50. package/dist/internal/types.js.map +1 -0
  51. package/dist/log.cjs +43 -17
  52. package/dist/log.d.ts +4 -3
  53. package/dist/log.d.ts.map +1 -1
  54. package/dist/log.js +47 -19
  55. package/dist/log.js.map +1 -1
  56. package/dist/url.cjs +22 -21
  57. package/dist/url.d.ts +1 -1
  58. package/dist/url.d.ts.map +1 -1
  59. package/dist/url.js +23 -29
  60. package/dist/url.js.map +1 -1
  61. package/dist/xml.cjs +7 -5
  62. package/dist/xml.d.ts +1 -1
  63. package/dist/xml.d.ts.map +1 -1
  64. package/dist/xml.js +5 -3
  65. package/dist/xml.js.map +1 -1
  66. 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 import_index = require("./index.cjs");
25
- const CLF_REGEX = /^(\S+) - - \[([^\]]*)\] "([^"]*)" (\d+) (\d+)$/;
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, import_index.jsonToToon)(logs, options);
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
- const match = line.match(CLF_REGEX);
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 './index.js';
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 CLF or JSON.
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,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CAClC;AAKD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CA6BjF"}
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 './index.js';
2
- // Updated CLF regex to avoid catastrophic backtracking by using negated character classes
3
- const CLF_REGEX = /^(\S+) - - \[([^\]]*)\] "([^"]*)" (\d+) (\d+)$/;
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
- // Attempt CLF (Common Log Format)
20
- // Format: host - - [date] "request" status size
21
- const parsed = lines.map(line => {
22
- const match = line.match(CLF_REGEX);
23
- if (match) {
24
- return {
25
- host: match[1] || '',
26
- date: match[2] || '',
27
- request: match[3] || '',
28
- status: parseInt(match[4] || '0', 10),
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,YAAY,CAAC;AAS3D,0FAA0F;AAC1F,MAAM,SAAS,GAAG,gDAAgD,CAAC;AAEnE,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,UAA4B,EAAE;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IAExC,uCAAuC;IACvC,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC1B,IAAI,CAAC;gBAAC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,kCAAkC;IAClC,gDAAgD;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACR,OAAO;gBACH,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;gBACpB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;gBACpB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;gBACvB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;gBACrC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;aACtC,CAAC;QACN,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC"}
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 import_index = require("./index.cjs");
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, import_index.jsonToToon)(obj, options);
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
- if (part === void 0) continue;
50
- if (!(part in current) || typeof current[part] !== "object" || current[part] === null) {
51
- current[part] = {};
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
- if (last === "" || last === void 0) {
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
@@ -1,3 +1,3 @@
1
- import { JsonToToonOptions } from './index.js';
1
+ import { JsonToToonOptions } from './core.js';
2
2
  export declare function urlToToon(urlString: string, options?: JsonToToonOptions): string;
3
3
  //# sourceMappingURL=url.d.ts.map
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,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CAsBpF"}
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 './index.js';
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
- // If full URL, extract search params. If just params, use as is.
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
- // Handle "key[subkey]" or "key.subkey" notation roughly
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
- if (part === undefined)
34
- continue;
35
- if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {
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
- if (last === '' || last === undefined) {
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,YAAY,CAAC;AAE3D,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,UAA6B,EAAE;IAC1E,iEAAiE;IACjE,IAAI,MAAM,GAAG,SAAS,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7B,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;QACnD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,GAAG,GAA4B,EAAE,CAAC;IAExC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,GAA4B,EAAE,GAAW,EAAE,KAAa;IAC1E,wDAAwD;IACxD,6FAA6F;IAC7F,qEAAqE;IAErE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE/B,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QAEjC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAA4B,CAAC;IACrD,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;IACX,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AACxB,CAAC;AAGD,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC"}
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 import_index = require("./index.cjs");
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, import_index.jsonToToon)({}, options);
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 Error("Malformed XML");
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, import_index.jsonToToon)(jsonObj, options);
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 Error("Malformed XML");
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
@@ -1,5 +1,5 @@
1
1
  import { X2jOptions } from 'fast-xml-parser';
2
- import { JsonToToonOptions } from './index.js';
2
+ import { JsonToToonOptions } from './core.js';
3
3
  export interface XmlToToonOptions extends JsonToToonOptions {
4
4
  /**
5
5
  * Options passed directly to fast-xml-parser.
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,EAAE,MAAM,YAAY,CAAC;AAE3D,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,CAkB7E;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAc9E"}
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 './index.js';
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 Error('Malformed XML');
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 Error('Malformed XML');
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,YAAY,CAAC;AAgB3D,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,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,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,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,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,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,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"}
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": "2.2.1",
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": "esbuild src/**/*.ts --format=cjs --outdir=dist/cjs --platform=node && node ./scripts/build-copy-cjs-output.js",
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 . --ext .ts,.tsx",
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.4",
55
- "fast-check": "^4.6.0",
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.58.0",
59
- "@typescript-eslint/eslint-plugin": "^8.58.0"
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.5.9",
95
+ "fast-xml-parser": "^5.7.2",
66
96
  "node-html-parser": "^7.1.0"
67
97
  }
68
98
  }