toon-parser 1.0.0 → 1.0.1

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/README.md ADDED
@@ -0,0 +1,149 @@
1
+ # toon-parser
2
+
3
+ Safe JSON ⇆ TOON encoder/decoder with strict validation and prototype-pollution guards.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install toon-parser
9
+ ```
10
+
11
+ ## Why this library?
12
+
13
+ - Implements the TOON v2.1 spec features most useful for JSON round-trips: tabular arrays, inline primitive arrays, nested objects/arrays, deterministic quoting.
14
+ - Hardened for untrusted input: prototype-pollution guards, max depth/length/node caps, strict length/width enforcement, and finite-number checks.
15
+ - No dynamic code execution; parsing uses explicit token scanning and bounded state to resist resource exhaustion.
16
+
17
+ ## Quick start
18
+
19
+ ```ts
20
+ import { jsonToToon, toonToJson } from 'toon-parser';
21
+
22
+ const data = {
23
+ context: { task: 'hike planning', year: 2025 },
24
+ friends: ['ana', 'luis', 'sam'],
25
+ hikes: [
26
+ { id: 1, name: 'Blue Lake', distanceKm: 7.5, wasSunny: true },
27
+ { id: 2, name: 'Ridge Overlook', distanceKm: 9.2, wasSunny: false }
28
+ ]
29
+ };
30
+
31
+ const toon = jsonToToon(data);
32
+ // TOON text with tabular hikes array and inline primitive friends array
33
+ console.log(toon);
34
+
35
+ const roundTrip = toonToJson(toon);
36
+ console.log(roundTrip); // back to the original JSON object
37
+ ```
38
+
39
+ ## API
40
+
41
+ ### `jsonToToon(value, options?) => string`
42
+
43
+ Encodes a JSON-compatible value into TOON text.
44
+
45
+ Options:
46
+ - `indent` (number, default `2`): spaces per indentation level.
47
+ - `delimiter` (`,` | `|` | `\t`, default `,`): delimiter for inline arrays and tabular rows.
48
+ - `sortKeys` (boolean, default `false`): sort object keys alphabetically instead of preserving encounter order.
49
+ - `maxDepth` (number, default `64`): maximum nesting depth (objects + arrays).
50
+ - `maxArrayLength` (number, default `50_000`): maximum allowed array length.
51
+ - `maxTotalNodes` (number, default `250_000`): cap on processed fields/items to limit resource use.
52
+ - `disallowedKeys` (string[], default `["__proto__", "constructor", "prototype"]`): keys rejected to prevent prototype pollution.
53
+
54
+ Throws `ToonError` if limits are hit or input is not encodable.
55
+
56
+ ### `toonToJson(text, options?) => unknown`
57
+
58
+ Decodes TOON text back to JSON data.
59
+
60
+ Options:
61
+ - `strict` (boolean, default `true`): enforce declared array lengths, tabular row widths, and indentation consistency.
62
+ - Same security options as `jsonToToon`: `maxDepth`, `maxArrayLength`, `maxTotalNodes`, `disallowedKeys`.
63
+
64
+ Throws `ToonError` with line numbers when parsing fails or security limits are exceeded.
65
+
66
+ ## Usage examples
67
+
68
+ ### Control indentation and delimiter
69
+
70
+ ```ts
71
+ const toon = jsonToToon(data, { indent: 4, delimiter: '|' });
72
+ ```
73
+
74
+ ### Detect and emit tabular arrays
75
+
76
+ Uniform arrays of objects with primitive values are emitted in TOON’s table form automatically:
77
+
78
+ ```ts
79
+ const toon = jsonToToon({ rows: [{ a: 1, b: 'x' }, { a: 2, b: 'y' }] });
80
+ /*
81
+ rows[2]{a,b}:
82
+ 1,x
83
+ 2,y
84
+ */
85
+ ```
86
+
87
+ Non-uniform arrays fall back to list form with `-` entries.
88
+
89
+ ### Handling unsafe keys
90
+
91
+ Prototype-polluting keys are rejected:
92
+
93
+ ```ts
94
+ toonToJson('__proto__: 1'); // throws ToonError: Disallowed key "__proto__"
95
+ ```
96
+
97
+ You can extend the blocklist:
98
+
99
+ ```ts
100
+ toonToJson('danger: 1', { disallowedKeys: ['danger'] }); // throws
101
+ ```
102
+
103
+ ### Enforcing strictness
104
+
105
+ Strict mode (default) ensures array lengths match headers and tabular rows match declared widths:
106
+
107
+ ```ts
108
+ toonToJson('nums[2]: 1'); // throws ToonError: length mismatch
109
+ ```
110
+
111
+ Disable strictness if you need best-effort parsing:
112
+
113
+ ```ts
114
+ const result = toonToJson('nums[2]: 1', { strict: false });
115
+ // result: { nums: [1] }
116
+ ```
117
+
118
+ ### Security limits
119
+
120
+ ```ts
121
+ const opts = { maxDepth: 10, maxArrayLength: 1000, maxTotalNodes: 10_000 };
122
+ jsonToToon(bigValue, opts); // throws if exceeded
123
+ toonToJson(bigToonText, opts); // throws if exceeded
124
+ ```
125
+
126
+ ## Error handling
127
+
128
+ All validation/parsing errors throw `ToonError`. When applicable, the error message includes a line number:
129
+
130
+ ```ts
131
+ try {
132
+ toonToJson('nums[2]: 1');
133
+ } catch (err) {
134
+ if (err instanceof ToonError) {
135
+ console.error(err.message); // "Line 1: Inline array length mismatch..."
136
+ }
137
+ }
138
+ ```
139
+
140
+ ## Design choices
141
+
142
+ - **Tabular detection** follows the spec: all elements must be objects, share identical keys, and contain only primitives.
143
+ - **String quoting** follows deterministic rules (quote numeric-looking strings, leading/trailing space, colon, delimiter, backslash, brackets, control chars, or leading hyphen).
144
+ - **Finite numbers only**: `NaN`, `Infinity`, and `-Infinity` are rejected.
145
+ - **No implicit path expansion**: dotted keys stay literal (e.g., `a.b` remains a single key).
146
+
147
+ ## Project status
148
+
149
+ This library targets TOON spec v2.1 core behaviors commonly needed for JSON round-trips. It prioritizes correctness and safety over permissiveness; loosen validation via `strict: false` only when you fully trust the input source.***
@@ -0,0 +1,51 @@
1
+ export type JsonPrimitive = string | number | boolean | null;
2
+ export interface SecurityOptions {
3
+ /**
4
+ * Maximum nesting depth (objects + arrays). Defaults to 64.
5
+ */
6
+ maxDepth?: number;
7
+ /**
8
+ * Maximum allowed array length. Defaults to 50_000.
9
+ */
10
+ maxArrayLength?: number;
11
+ /**
12
+ * Maximum total nodes (object fields + array items) processed.
13
+ * Defaults to 250_000 to limit resource exhaustion.
14
+ */
15
+ maxTotalNodes?: number;
16
+ /**
17
+ * Keys that are rejected to avoid prototype pollution.
18
+ * Defaults to ["__proto__", "constructor", "prototype"].
19
+ */
20
+ disallowedKeys?: string[];
21
+ }
22
+ export interface JsonToToonOptions extends SecurityOptions {
23
+ /**
24
+ * Number of spaces per indentation level. Defaults to 2.
25
+ */
26
+ indent?: number;
27
+ /**
28
+ * Delimiter to use for inline arrays and tabular rows.
29
+ * Defaults to comma.
30
+ */
31
+ delimiter?: ',' | '|' | '\t';
32
+ /**
33
+ * When true, object keys are sorted alphabetically to keep output deterministic.
34
+ * Defaults to false (preserve encounter order).
35
+ */
36
+ sortKeys?: boolean;
37
+ }
38
+ export interface ToonToJsonOptions extends SecurityOptions {
39
+ /**
40
+ * Enforce declared array lengths, field counts, and indentation consistency.
41
+ * Defaults to true.
42
+ */
43
+ strict?: boolean;
44
+ }
45
+ export declare class ToonError extends Error {
46
+ readonly line?: number;
47
+ constructor(message: string, line?: number);
48
+ }
49
+ export declare function jsonToToon(value: unknown, options?: JsonToToonOptions): string;
50
+ export declare function toonToJson(text: string, options?: ToonToJsonOptions): unknown;
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAgDD,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAK3C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CAuIlF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAsSjF"}
package/dist/index.js ADDED
@@ -0,0 +1,829 @@
1
+ const DEFAULT_LIMITS = Object.freeze({
2
+ maxDepth: 64,
3
+ maxArrayLength: 50000,
4
+ maxTotalNodes: 250000,
5
+ disallowedKeys: ['__proto__', 'constructor', 'prototype']
6
+ });
7
+ const DEFAULT_DELIMITER = ',';
8
+ const NUMERIC_RE = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
9
+ const NUMERIC_LIKE_RE = /^-?\d+(?:\.\d+)?(?:e[+-]?\d+)?$/i;
10
+ const LEADING_ZERO_RE = /^0\d+$/;
11
+ const SAFE_KEY_RE = /^[A-Za-z_][A-Za-z0-9_.]*$/;
12
+ export class ToonError extends Error {
13
+ constructor(message, line) {
14
+ super(line ? `Line ${line}: ${message}` : message);
15
+ this.name = 'ToonError';
16
+ this.line = line;
17
+ }
18
+ }
19
+ export function jsonToToon(value, options = {}) {
20
+ const indentSize = options.indent ?? 2;
21
+ if (!Number.isInteger(indentSize) || indentSize <= 0) {
22
+ throw new ToonError('Indent must be a positive integer.');
23
+ }
24
+ const delimiter = options.delimiter ?? DEFAULT_DELIMITER;
25
+ const limits = applyLimits(options);
26
+ const state = { nodes: 0 };
27
+ const lines = [];
28
+ const indentUnit = ' '.repeat(indentSize);
29
+ const encodeValue = (input, depth, key, activeDelimiter) => {
30
+ enforceLimits(depth, limits, state);
31
+ if (isPrimitive(input)) {
32
+ const line = primitiveLine(key, input, indentUnit.repeat(depth), activeDelimiter, limits);
33
+ lines.push(line);
34
+ return;
35
+ }
36
+ if (Array.isArray(input)) {
37
+ encodeArray(key, input, depth, activeDelimiter);
38
+ return;
39
+ }
40
+ if (isPlainObject(input)) {
41
+ encodeObject(key, input, depth, activeDelimiter);
42
+ return;
43
+ }
44
+ throw new ToonError(`Unsupported value type: ${typeof input}`);
45
+ };
46
+ const encodeObject = (key, obj, depth, activeDelimiter) => {
47
+ enforceLimits(depth, limits, state);
48
+ const entries = Object.entries(obj);
49
+ const sortedEntries = options.sortKeys ? [...entries].sort(([a], [b]) => a.localeCompare(b)) : entries;
50
+ const prefix = indentUnit.repeat(depth);
51
+ if (key !== null) {
52
+ validateKeySafety(key, limits);
53
+ if (sortedEntries.length === 0) {
54
+ lines.push(`${prefix}${encodeKey(key, activeDelimiter)}:`);
55
+ return;
56
+ }
57
+ lines.push(`${prefix}${encodeKey(key, activeDelimiter)}:`);
58
+ }
59
+ else if (depth > 0 && sortedEntries.length === 0) {
60
+ // empty anonymous object
61
+ return;
62
+ }
63
+ for (const [childKey, childValue] of sortedEntries) {
64
+ const nextDepth = key === null ? depth : depth + 1;
65
+ enforceLimits(nextDepth, limits, state);
66
+ encodeValue(childValue, nextDepth, childKey, activeDelimiter);
67
+ }
68
+ };
69
+ const encodeArray = (key, arr, depth, activeDelimiter) => {
70
+ enforceLimits(depth, limits, state);
71
+ if (key !== null) {
72
+ validateKeySafety(key, limits);
73
+ }
74
+ if (arr.length > limits.maxArrayLength) {
75
+ throw new ToonError(`Array length ${arr.length} exceeds limit ${limits.maxArrayLength}.`);
76
+ }
77
+ const prefix = indentUnit.repeat(depth);
78
+ const headerKey = key === null ? '' : encodeKey(key, activeDelimiter);
79
+ if (arr.every(isPrimitive)) {
80
+ const encoded = arr.map(v => encodePrimitive(v, activeDelimiter, activeDelimiter)).join(activeDelimiter);
81
+ const spacing = arr.length > 0 ? ' ' : '';
82
+ lines.push(`${prefix}${headerKey}[${arr.length}]:${spacing}${encoded}`);
83
+ bumpNodes(state, limits, arr.length);
84
+ return;
85
+ }
86
+ const tabular = detectTabular(arr);
87
+ if (tabular) {
88
+ const { fields, rows } = tabular;
89
+ const encodedFields = fields.map(f => encodeKey(f, activeDelimiter)).join(activeDelimiter);
90
+ lines.push(`${prefix}${headerKey}[${arr.length}]{${encodedFields}}:`);
91
+ for (const row of rows) {
92
+ const rowValues = fields
93
+ .map(f => encodePrimitive(row[f], activeDelimiter, activeDelimiter))
94
+ .join(activeDelimiter);
95
+ lines.push(`${indentUnit.repeat(depth + 1)}${rowValues}`);
96
+ }
97
+ bumpNodes(state, limits, arr.length * fields.length);
98
+ return;
99
+ }
100
+ // expanded list
101
+ lines.push(`${prefix}${headerKey}[${arr.length}]:`);
102
+ const itemIndent = depth + 1;
103
+ const itemPrefix = indentUnit.repeat(itemIndent);
104
+ for (const item of arr) {
105
+ enforceLimits(itemIndent, limits, state);
106
+ if (isPrimitive(item)) {
107
+ lines.push(`${itemPrefix}- ${encodePrimitive(item, activeDelimiter, activeDelimiter)}`);
108
+ bumpNodes(state, limits, 1);
109
+ }
110
+ else if (Array.isArray(item)) {
111
+ const inline = item.every(isPrimitive);
112
+ if (inline) {
113
+ const encoded = item.map(v => encodePrimitive(v, activeDelimiter, activeDelimiter)).join(activeDelimiter);
114
+ const spacing = item.length > 0 ? ' ' : '';
115
+ lines.push(`${itemPrefix}- [${item.length}]:${spacing}${encoded}`);
116
+ bumpNodes(state, limits, item.length);
117
+ }
118
+ else {
119
+ lines.push(`${itemPrefix}-`);
120
+ encodeArray(null, item, itemIndent + 1, activeDelimiter);
121
+ }
122
+ }
123
+ else if (isPlainObject(item)) {
124
+ const objEntries = Object.entries(item);
125
+ if (objEntries.length === 0) {
126
+ lines.push(`${itemPrefix}-`);
127
+ continue;
128
+ }
129
+ lines.push(`${itemPrefix}-`);
130
+ for (const [childKey, childValue] of objEntries) {
131
+ encodeValue(childValue, itemIndent + 1, childKey, activeDelimiter);
132
+ }
133
+ }
134
+ else {
135
+ throw new ToonError(`Unsupported array item type: ${typeof item}`);
136
+ }
137
+ }
138
+ };
139
+ encodeValue(value, 0, null, delimiter);
140
+ return lines.join('\n');
141
+ }
142
+ export function toonToJson(text, options = {}) {
143
+ const limits = applyLimits(options);
144
+ const strict = options.strict ?? true;
145
+ const delimiterFallback = DEFAULT_DELIMITER;
146
+ const lines = text.split(/\r?\n/);
147
+ const contexts = [];
148
+ let rootContainer = null;
149
+ let indentStep = null;
150
+ let root = null;
151
+ const state = { nodes: 0 };
152
+ const finalizeContainer = (container, lineNo) => {
153
+ if (container.type === 'tabular') {
154
+ if (strict && container.value.length !== container.expectedLength) {
155
+ throw new ToonError(`Tabular array length mismatch: expected ${container.expectedLength}, got ${container.value.length}.`, lineNo);
156
+ }
157
+ }
158
+ else if (container.type === 'list') {
159
+ if (strict && container.expectedLength !== null && container.value.length !== container.expectedLength) {
160
+ throw new ToonError(`List length mismatch: expected ${container.expectedLength}, got ${container.value.length}.`, lineNo);
161
+ }
162
+ }
163
+ else if (container.type === 'placeholder') {
164
+ if (strict && !container.filled) {
165
+ throw new ToonError('List item is empty where a value was expected.', lineNo);
166
+ }
167
+ }
168
+ };
169
+ const attachValue = (value, parent, key, lineNo) => {
170
+ const ensureRootObject = () => {
171
+ if (rootContainer) {
172
+ return rootContainer;
173
+ }
174
+ const obj = { type: 'object', value: createSafeObject(), indent: 0 };
175
+ rootContainer = obj;
176
+ root = obj.value;
177
+ contexts.push(obj);
178
+ return obj;
179
+ };
180
+ if (!parent) {
181
+ if (key !== null) {
182
+ const target = ensureRootObject();
183
+ target.value[key] = value;
184
+ return;
185
+ }
186
+ if (root !== null) {
187
+ throw new ToonError('Multiple root values detected.', lineNo);
188
+ }
189
+ root = value;
190
+ return;
191
+ }
192
+ if (parent.type === 'object') {
193
+ if (key === null) {
194
+ throw new ToonError('Missing key for object assignment.');
195
+ }
196
+ parent.value[key] = value;
197
+ return;
198
+ }
199
+ if (parent.type === 'list') {
200
+ parent.value.push(value);
201
+ return;
202
+ }
203
+ if (parent.type === 'placeholder') {
204
+ if (parent.filled) {
205
+ throw new ToonError('List item already filled.', lineNo);
206
+ }
207
+ parent.assign(value);
208
+ parent.filled = true;
209
+ return;
210
+ }
211
+ throw new ToonError('Invalid parent container.');
212
+ };
213
+ const parseArrayHeader = (token, lineNo) => {
214
+ const match = token.match(/^\[(\d+)([,\|\t])?\](\{(.+)\})?$/);
215
+ if (!match) {
216
+ throw new ToonError(`Invalid array header "${token}".`, lineNo);
217
+ }
218
+ const length = parseInt(match[1], 10);
219
+ if (!Number.isFinite(length)) {
220
+ throw new ToonError('Invalid array length.', lineNo);
221
+ }
222
+ const delimiter = match[2] ?? delimiterFallback;
223
+ const fieldsRaw = match[4];
224
+ if (fieldsRaw === undefined) {
225
+ return { length, delimiter };
226
+ }
227
+ const fields = splitDelimited(fieldsRaw, delimiter, lineNo).map(f => decodeKey(f, delimiter, lineNo));
228
+ if (fields.length === 0 && strict) {
229
+ throw new ToonError('Tabular arrays require at least one field.', lineNo);
230
+ }
231
+ return { length, delimiter, fields };
232
+ };
233
+ const processKeyValueLine = (indentLevel, keyToken, valueToken, lineNo, parent) => {
234
+ const { rawKey, header } = splitKeyHeader(keyToken);
235
+ const key = rawKey === '' ? null : decodeKey(rawKey, delimiterFallback, lineNo);
236
+ if (key !== null) {
237
+ validateKeySafety(key, limits, lineNo);
238
+ }
239
+ if (header) {
240
+ const { length, delimiter, fields } = parseArrayHeader(header, lineNo);
241
+ if (length > limits.maxArrayLength) {
242
+ throw new ToonError(`Array length ${length} exceeds limit ${limits.maxArrayLength}.`, lineNo);
243
+ }
244
+ if (fields) {
245
+ if (valueToken !== '') {
246
+ throw new ToonError('Tabular array header must not have inline values.', lineNo);
247
+ }
248
+ const arr = [];
249
+ bumpNodes(state, limits, 1, lineNo);
250
+ attachValue(arr, parent, key, lineNo);
251
+ contexts.push({
252
+ type: 'tabular',
253
+ value: arr,
254
+ indent: indentLevel + 1,
255
+ expectedLength: length,
256
+ delimiter,
257
+ fields
258
+ });
259
+ return;
260
+ }
261
+ if (valueToken === '') {
262
+ const arr = [];
263
+ bumpNodes(state, limits, 1, lineNo);
264
+ attachValue(arr, parent, key, lineNo);
265
+ contexts.push({
266
+ type: 'list',
267
+ value: arr,
268
+ indent: indentLevel + 1,
269
+ expectedLength: length,
270
+ delimiter
271
+ });
272
+ return;
273
+ }
274
+ const values = splitDelimited(valueToken, delimiter, lineNo).map(t => parsePrimitiveToken(t, delimiter, lineNo, strict));
275
+ if (strict && values.length !== length) {
276
+ throw new ToonError(`Inline array length mismatch: expected ${length}, got ${values.length}.`, lineNo);
277
+ }
278
+ attachValue(values, parent, key, lineNo);
279
+ bumpNodes(state, limits, values.length, lineNo);
280
+ return;
281
+ }
282
+ if (valueToken === '') {
283
+ const obj = createSafeObject();
284
+ attachValue(obj, parent, key, lineNo);
285
+ contexts.push({ type: 'object', value: obj, indent: indentLevel + 1 });
286
+ return;
287
+ }
288
+ const value = parsePrimitiveToken(valueToken, delimiterFallback, lineNo, strict);
289
+ attachValue(value, parent, key, lineNo);
290
+ bumpNodes(state, limits, 1, lineNo);
291
+ };
292
+ lines.forEach((rawLine, index) => {
293
+ const lineNo = index + 1;
294
+ const trimmedEnd = rawLine.replace(/[ \t]+$/, '');
295
+ if (trimmedEnd.trim() === '') {
296
+ return; // skip blank lines
297
+ }
298
+ const indentSpaces = countLeadingSpaces(trimmedEnd, lineNo);
299
+ if (indentStep === null) {
300
+ indentStep = indentSpaces === 0 ? 2 : indentSpaces;
301
+ }
302
+ if (indentSpaces % indentStep !== 0) {
303
+ throw new ToonError(`Inconsistent indentation: expected multiples of ${indentStep} spaces.`, lineNo);
304
+ }
305
+ const indentLevel = indentSpaces / indentStep;
306
+ if (indentLevel > limits.maxDepth) {
307
+ throw new ToonError(`Maximum depth ${limits.maxDepth} exceeded.`, lineNo);
308
+ }
309
+ const line = trimmedEnd.slice(indentSpaces);
310
+ while (true) {
311
+ const top = contexts[contexts.length - 1];
312
+ if (!top || indentLevel >= top.indent) {
313
+ break;
314
+ }
315
+ contexts.pop();
316
+ finalizeContainer(top, lineNo);
317
+ }
318
+ // tabular row disambiguation
319
+ let handled = false;
320
+ let consumed = false;
321
+ while (!handled) {
322
+ const top = contexts[contexts.length - 1];
323
+ if (top && top.type === 'tabular' && indentLevel === top.indent) {
324
+ const classification = classifyTabularLine(line, top.delimiter);
325
+ if (classification === 'row') {
326
+ const cells = splitDelimited(line, top.delimiter, lineNo);
327
+ if (strict && cells.length !== top.fields.length) {
328
+ throw new ToonError(`Tabular row width mismatch: expected ${top.fields.length}, got ${cells.length}.`, lineNo);
329
+ }
330
+ const obj = createSafeObject();
331
+ top.fields.forEach((field, idx) => {
332
+ validateKeySafety(field, limits, lineNo);
333
+ const token = cells[idx] ?? '';
334
+ obj[field] = parsePrimitiveToken(token, top.delimiter, lineNo, strict);
335
+ bumpNodes(state, limits, 1, lineNo);
336
+ });
337
+ top.value.push(obj);
338
+ if (top.value.length > limits.maxArrayLength) {
339
+ throw new ToonError(`Tabular array length exceeds limit ${limits.maxArrayLength}.`, lineNo);
340
+ }
341
+ handled = true;
342
+ consumed = true;
343
+ break;
344
+ }
345
+ finalizeContainer(top, lineNo);
346
+ contexts.pop();
347
+ continue;
348
+ }
349
+ handled = true;
350
+ }
351
+ if (consumed) {
352
+ return;
353
+ }
354
+ const parent = contexts[contexts.length - 1];
355
+ if (parent && parent.type === 'list') {
356
+ if (indentLevel !== parent.indent) {
357
+ throw new ToonError('List items must align under their header.', lineNo);
358
+ }
359
+ parseListItem(line, parent, indentLevel, lineNo, processKeyValueLine, contexts, state, limits, strict);
360
+ return;
361
+ }
362
+ if (parent && parent.type === 'placeholder') {
363
+ if (indentLevel !== parent.indent) {
364
+ throw new ToonError('List item body must indent one level below "-".', lineNo);
365
+ }
366
+ // allow body to be parsed as if parent were absent; attachValue will route through placeholder.
367
+ }
368
+ if (indentLevel !== (parent ? parent.indent : 0)) {
369
+ throw new ToonError('Unexpected indentation level.', lineNo);
370
+ }
371
+ const colonIndex = findUnquotedColon(line);
372
+ if (colonIndex === -1) {
373
+ // possible root primitive
374
+ if (root === null && !parent) {
375
+ const value = parsePrimitiveToken(line.trim(), delimiterFallback, lineNo, strict);
376
+ root = value;
377
+ bumpNodes(state, limits, 1, lineNo);
378
+ return;
379
+ }
380
+ throw new ToonError('Expected key-value pair.', lineNo);
381
+ }
382
+ const keyToken = line.slice(0, colonIndex).trim();
383
+ const valueToken = line.slice(colonIndex + 1).trim();
384
+ processKeyValueLine(indentLevel, keyToken, valueToken, lineNo, parent);
385
+ });
386
+ while (contexts.length > 0) {
387
+ const container = contexts.pop();
388
+ finalizeContainer(container, lines.length);
389
+ }
390
+ if (root === null) {
391
+ return createSafeObject();
392
+ }
393
+ return root;
394
+ }
395
+ function classifyTabularLine(line, delimiter) {
396
+ let inQuote = false;
397
+ let escape = false;
398
+ let firstColon = -1;
399
+ let firstDelim = -1;
400
+ for (let i = 0; i < line.length; i++) {
401
+ const ch = line[i];
402
+ if (escape) {
403
+ escape = false;
404
+ continue;
405
+ }
406
+ if (ch === '\\') {
407
+ escape = true;
408
+ continue;
409
+ }
410
+ if (ch === '"') {
411
+ inQuote = !inQuote;
412
+ continue;
413
+ }
414
+ if (inQuote)
415
+ continue;
416
+ if (ch === ':' && firstColon === -1)
417
+ firstColon = i;
418
+ if (ch === delimiter && firstDelim === -1)
419
+ firstDelim = i;
420
+ }
421
+ if (firstColon === -1)
422
+ return 'row';
423
+ if (firstDelim === -1)
424
+ return 'field';
425
+ return firstDelim < firstColon ? 'row' : 'field';
426
+ }
427
+ function parseListItem(line, list, indentLevel, lineNo, processKeyValueLine, contexts, state, limits, strict) {
428
+ const trimmed = line.trim();
429
+ if (!trimmed.startsWith('-')) {
430
+ throw new ToonError('List items must start with "-".', lineNo);
431
+ }
432
+ const content = trimmed.slice(1).trim();
433
+ if (content === '') {
434
+ const placeholder = {
435
+ type: 'placeholder',
436
+ indent: indentLevel + 1,
437
+ filled: false,
438
+ assign: value => {
439
+ list.value.push(value);
440
+ }
441
+ };
442
+ contexts.push(placeholder);
443
+ return;
444
+ }
445
+ // Array list item (header on the same line)
446
+ if (content.startsWith('[')) {
447
+ const colonIndex = findUnquotedColon(content);
448
+ const headerToken = colonIndex === -1 ? content : content.slice(0, colonIndex).trim();
449
+ const valueToken = colonIndex === -1 ? '' : content.slice(colonIndex + 1).trim();
450
+ const { length, delimiter, fields } = parseArrayHeaderFromList(headerToken, lineNo);
451
+ if (length > limits.maxArrayLength) {
452
+ throw new ToonError(`Array length ${length} exceeds limit ${limits.maxArrayLength}.`, lineNo);
453
+ }
454
+ if (fields) {
455
+ if (valueToken !== '') {
456
+ throw new ToonError('Tabular header in list item cannot have inline values.', lineNo);
457
+ }
458
+ const arr = [];
459
+ bumpNodes(state, limits, 1, lineNo);
460
+ list.value.push(arr);
461
+ contexts.push({
462
+ type: 'tabular',
463
+ value: arr,
464
+ indent: indentLevel + 1,
465
+ expectedLength: length,
466
+ delimiter,
467
+ fields
468
+ });
469
+ return;
470
+ }
471
+ if (valueToken === '') {
472
+ const arr = [];
473
+ bumpNodes(state, limits, 1, lineNo);
474
+ list.value.push(arr);
475
+ contexts.push({
476
+ type: 'list',
477
+ value: arr,
478
+ indent: indentLevel + 1,
479
+ expectedLength: length,
480
+ delimiter
481
+ });
482
+ return;
483
+ }
484
+ const values = splitDelimited(valueToken, delimiter, lineNo).map(t => parsePrimitiveToken(t, delimiter, lineNo, strict));
485
+ if (strict && values.length !== length) {
486
+ throw new ToonError(`Inline array length mismatch: expected ${length}, got ${values.length}.`, lineNo);
487
+ }
488
+ bumpNodes(state, limits, values.length, lineNo);
489
+ list.value.push(values);
490
+ return;
491
+ }
492
+ // Inline object field or array header
493
+ const colonIndex = findUnquotedColon(content);
494
+ if (colonIndex !== -1) {
495
+ const keyToken = content.slice(0, colonIndex).trim();
496
+ const valueToken = content.slice(colonIndex + 1).trim();
497
+ const obj = createSafeObject();
498
+ bumpNodes(state, limits, 1, lineNo);
499
+ list.value.push(obj);
500
+ const objContext = { type: 'object', value: obj, indent: indentLevel + 1 };
501
+ contexts.push(objContext);
502
+ processKeyValueLine(indentLevel + 1, keyToken, valueToken, lineNo, objContext);
503
+ return;
504
+ }
505
+ // Primitive value
506
+ const value = parsePrimitiveToken(content, list.delimiter, lineNo, strict);
507
+ bumpNodes(state, limits, 1, lineNo);
508
+ list.value.push(value);
509
+ }
510
+ function splitKeyHeader(token) {
511
+ let inQuote = false;
512
+ let escape = false;
513
+ for (let i = 0; i < token.length; i++) {
514
+ const ch = token[i];
515
+ if (escape) {
516
+ escape = false;
517
+ continue;
518
+ }
519
+ if (ch === '\\') {
520
+ escape = true;
521
+ continue;
522
+ }
523
+ if (ch === '"') {
524
+ inQuote = !inQuote;
525
+ continue;
526
+ }
527
+ if (!inQuote && ch === '[') {
528
+ return {
529
+ rawKey: token.slice(0, i).trim(),
530
+ header: token.slice(i).trim()
531
+ };
532
+ }
533
+ }
534
+ return { rawKey: token.trim() };
535
+ }
536
+ function parseArrayHeaderFromList(token, lineNo) {
537
+ const match = token.match(/^\[(\d+)([,\|\t])?\](\{(.+)\})?$/);
538
+ if (!match) {
539
+ throw new ToonError(`Invalid array header "${token}".`, lineNo);
540
+ }
541
+ const length = parseInt(match[1], 10);
542
+ const delimiter = match[2] ?? DEFAULT_DELIMITER;
543
+ const fieldsRaw = match[4];
544
+ const fields = fieldsRaw ? splitDelimited(fieldsRaw, delimiter, lineNo).map(f => decodeKey(f, delimiter, lineNo)) : undefined;
545
+ return { length, delimiter, fields };
546
+ }
547
+ function findUnquotedColon(text) {
548
+ let inQuote = false;
549
+ let escape = false;
550
+ for (let i = 0; i < text.length; i++) {
551
+ const ch = text[i];
552
+ if (escape) {
553
+ escape = false;
554
+ continue;
555
+ }
556
+ if (ch === '\\') {
557
+ escape = true;
558
+ continue;
559
+ }
560
+ if (ch === '"') {
561
+ inQuote = !inQuote;
562
+ continue;
563
+ }
564
+ if (!inQuote && ch === ':') {
565
+ return i;
566
+ }
567
+ }
568
+ return -1;
569
+ }
570
+ function countLeadingSpaces(text, lineNo) {
571
+ let count = 0;
572
+ for (const ch of text) {
573
+ if (ch === ' ') {
574
+ count++;
575
+ }
576
+ else if (ch === '\t') {
577
+ throw new ToonError('Tabs are not allowed for indentation.', lineNo);
578
+ }
579
+ else {
580
+ break;
581
+ }
582
+ }
583
+ return count;
584
+ }
585
+ function parsePrimitiveToken(token, delimiter, lineNo, strict) {
586
+ if (token === '') {
587
+ return '';
588
+ }
589
+ const trimmed = token.trim();
590
+ if (trimmed !== token && strict) {
591
+ throw new ToonError('Unquoted values may not contain leading or trailing whitespace.', lineNo);
592
+ }
593
+ if (trimmed.startsWith('"')) {
594
+ return decodeQuotedString(trimmed, lineNo);
595
+ }
596
+ if (trimmed === 'true')
597
+ return true;
598
+ if (trimmed === 'false')
599
+ return false;
600
+ if (trimmed === 'null')
601
+ return null;
602
+ if (/^-?0\d+/.test(trimmed)) {
603
+ throw new ToonError('Numbers with leading zeros must be quoted.', lineNo);
604
+ }
605
+ if (NUMERIC_RE.test(trimmed)) {
606
+ const num = Number(trimmed);
607
+ if (!Number.isFinite(num)) {
608
+ throw new ToonError('Invalid numeric value.', lineNo);
609
+ }
610
+ return num;
611
+ }
612
+ if (strict && trimmed.includes(delimiter)) {
613
+ throw new ToonError('Unquoted value contains the active delimiter.', lineNo);
614
+ }
615
+ return trimmed;
616
+ }
617
+ function decodeQuotedString(token, lineNo) {
618
+ if (!token.endsWith('"')) {
619
+ throw new ToonError('Unterminated string.', lineNo);
620
+ }
621
+ let result = '';
622
+ let escape = false;
623
+ for (let i = 1; i < token.length - 1; i++) {
624
+ const ch = token[i];
625
+ if (escape) {
626
+ if (ch === '"' || ch === '\\') {
627
+ result += ch;
628
+ }
629
+ else if (ch === 'n') {
630
+ result += '\n';
631
+ }
632
+ else if (ch === 'r') {
633
+ result += '\r';
634
+ }
635
+ else if (ch === 't') {
636
+ result += '\t';
637
+ }
638
+ else {
639
+ throw new ToonError(`Invalid escape sequence \\${ch}.`, lineNo);
640
+ }
641
+ escape = false;
642
+ continue;
643
+ }
644
+ if (ch === '\\') {
645
+ escape = true;
646
+ continue;
647
+ }
648
+ result += ch;
649
+ }
650
+ if (escape) {
651
+ throw new ToonError('Unterminated escape sequence.', lineNo);
652
+ }
653
+ return result;
654
+ }
655
+ function splitDelimited(text, delimiter, lineNo) {
656
+ const tokens = [];
657
+ let current = '';
658
+ let inQuote = false;
659
+ let escape = false;
660
+ for (let i = 0; i < text.length; i++) {
661
+ const ch = text[i];
662
+ if (escape) {
663
+ current += ch;
664
+ escape = false;
665
+ continue;
666
+ }
667
+ if (ch === '\\') {
668
+ current += ch;
669
+ escape = true;
670
+ continue;
671
+ }
672
+ if (ch === '"') {
673
+ current += ch;
674
+ inQuote = !inQuote;
675
+ continue;
676
+ }
677
+ if (!inQuote && ch === delimiter) {
678
+ tokens.push(current);
679
+ current = '';
680
+ continue;
681
+ }
682
+ current += ch;
683
+ }
684
+ if (inQuote) {
685
+ throw new ToonError('Unterminated quoted value.', lineNo);
686
+ }
687
+ tokens.push(current);
688
+ return tokens;
689
+ }
690
+ function encodePrimitive(value, activeDelimiter, documentDelimiter) {
691
+ if (value === null)
692
+ return 'null';
693
+ if (typeof value === 'boolean')
694
+ return value ? 'true' : 'false';
695
+ if (typeof value === 'number') {
696
+ if (!Number.isFinite(value)) {
697
+ throw new ToonError('Numeric values must be finite.');
698
+ }
699
+ if (Object.is(value, -0))
700
+ return '-0';
701
+ return String(value);
702
+ }
703
+ return encodeString(value, activeDelimiter, documentDelimiter);
704
+ }
705
+ function encodeString(value, activeDelimiter, documentDelimiter) {
706
+ const needsQuote = value.length === 0 ||
707
+ /^\s|\s$/.test(value) ||
708
+ value === 'true' ||
709
+ value === 'false' ||
710
+ value === 'null' ||
711
+ NUMERIC_LIKE_RE.test(value) ||
712
+ LEADING_ZERO_RE.test(value) ||
713
+ value.includes(':') ||
714
+ value.includes('"') ||
715
+ value.includes('\\') ||
716
+ /[\[\]{}]/.test(value) ||
717
+ /[\n\r\t]/.test(value) ||
718
+ value.includes(activeDelimiter) ||
719
+ value.includes(documentDelimiter) ||
720
+ value === '-' ||
721
+ value.startsWith('-');
722
+ if (!needsQuote) {
723
+ return value;
724
+ }
725
+ return `"${escapeString(value)}"`;
726
+ }
727
+ function escapeString(value) {
728
+ return value
729
+ .replace(/\\/g, '\\\\')
730
+ .replace(/"/g, '\\"')
731
+ .replace(/\n/g, '\\n')
732
+ .replace(/\r/g, '\\r')
733
+ .replace(/\t/g, '\\t');
734
+ }
735
+ function primitiveLine(key, value, indent, activeDelimiter, limits = DEFAULT_LIMITS) {
736
+ const encodedValue = encodePrimitive(value, activeDelimiter, activeDelimiter);
737
+ if (key === null) {
738
+ return `${indent}${encodedValue}`;
739
+ }
740
+ validateKeySafety(key, limits);
741
+ return `${indent}${encodeKey(key, activeDelimiter)}: ${encodedValue}`;
742
+ }
743
+ function encodeKey(key, activeDelimiter) {
744
+ if (SAFE_KEY_RE.test(key) && !key.includes(activeDelimiter)) {
745
+ return key;
746
+ }
747
+ return `"${escapeString(key)}"`;
748
+ }
749
+ function decodeKey(token, delimiter, lineNo) {
750
+ const trimmed = token.trim();
751
+ if (trimmed.startsWith('"')) {
752
+ return decodeQuotedString(trimmed, lineNo);
753
+ }
754
+ if (!SAFE_KEY_RE.test(trimmed)) {
755
+ throw new ToonError('Invalid key token.', lineNo);
756
+ }
757
+ if (trimmed.includes(delimiter)) {
758
+ throw new ToonError('Key contains active delimiter and must be quoted.', lineNo);
759
+ }
760
+ return trimmed;
761
+ }
762
+ function bumpNodes(state, limits, count, lineNo) {
763
+ state.nodes += count;
764
+ if (state.nodes > limits.maxTotalNodes) {
765
+ throw new ToonError(`Node count ${state.nodes} exceeds limit ${limits.maxTotalNodes}.`, lineNo);
766
+ }
767
+ }
768
+ function enforceLimits(depth, limits, state) {
769
+ if (depth > limits.maxDepth) {
770
+ throw new ToonError(`Maximum depth ${limits.maxDepth} exceeded.`);
771
+ }
772
+ bumpNodes(state, limits, 1);
773
+ }
774
+ function applyLimits(options) {
775
+ return {
776
+ maxDepth: options.maxDepth ?? DEFAULT_LIMITS.maxDepth,
777
+ maxArrayLength: options.maxArrayLength ?? DEFAULT_LIMITS.maxArrayLength,
778
+ maxTotalNodes: options.maxTotalNodes ?? DEFAULT_LIMITS.maxTotalNodes,
779
+ disallowedKeys: options.disallowedKeys ?? DEFAULT_LIMITS.disallowedKeys
780
+ };
781
+ }
782
+ function isPrimitive(value) {
783
+ return (value === null ||
784
+ typeof value === 'string' ||
785
+ typeof value === 'number' ||
786
+ typeof value === 'boolean');
787
+ }
788
+ function isPlainObject(value) {
789
+ if (value === null || typeof value !== 'object')
790
+ return false;
791
+ const proto = Object.getPrototypeOf(value);
792
+ return proto === Object.prototype || proto === null;
793
+ }
794
+ function detectTabular(arr) {
795
+ if (arr.length === 0)
796
+ return null;
797
+ if (!arr.every(item => isPlainObject(item))) {
798
+ return null;
799
+ }
800
+ const first = arr[0];
801
+ const fields = Object.keys(first);
802
+ if (fields.length === 0) {
803
+ return null;
804
+ }
805
+ const rows = [];
806
+ for (const item of arr) {
807
+ const obj = item;
808
+ const objKeys = Object.keys(obj);
809
+ if (objKeys.length !== fields.length)
810
+ return null;
811
+ for (const field of fields) {
812
+ if (!Object.prototype.hasOwnProperty.call(obj, field))
813
+ return null;
814
+ if (!isPrimitive(obj[field]))
815
+ return null;
816
+ }
817
+ rows.push(obj);
818
+ }
819
+ return { fields, rows };
820
+ }
821
+ function validateKeySafety(key, limits = DEFAULT_LIMITS, lineNo) {
822
+ if (limits.disallowedKeys.includes(key)) {
823
+ throw new ToonError(`Disallowed key "${key}" to prevent prototype pollution.`, lineNo);
824
+ }
825
+ }
826
+ function createSafeObject() {
827
+ return Object.create(null);
828
+ }
829
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,35 @@
1
1
  {
2
2
  "name": "toon-parser",
3
- "version": "1.0.0",
4
- "main": "index.js",
3
+ "version": "1.0.1",
4
+ "description": "Safe JSON <-> TOON encoder/decoder with strict validation.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
5
17
  "scripts": {
6
- "test": "echo \"Error: no test specified\" && exit 1"
18
+ "build": "tsc -p tsconfig.json",
19
+ "clean": "rm -rf dist"
7
20
  },
8
- "keywords": [],
21
+ "keywords": [
22
+ "json",
23
+ "toon",
24
+ "parser",
25
+ "encoder",
26
+ "decoder",
27
+ "secure"
28
+ ],
9
29
  "author": "",
10
- "license": "ISC",
11
- "description": ""
30
+ "license": "MIT",
31
+ "sideEffects": false,
32
+ "engines": {
33
+ "node": ">=18"
34
+ }
12
35
  }
package/index.js DELETED
@@ -1 +0,0 @@
1
- module.exports = {};