koda-format 1.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +104 -0
  3. package/SPEC.md +288 -0
  4. package/binding.gyp +29 -0
  5. package/dist/ast.d.ts +23 -0
  6. package/dist/ast.d.ts.map +1 -0
  7. package/dist/ast.js +24 -0
  8. package/dist/ast.js.map +1 -0
  9. package/dist/decoder.d.ts +17 -0
  10. package/dist/decoder.d.ts.map +1 -0
  11. package/dist/decoder.js +147 -0
  12. package/dist/decoder.js.map +1 -0
  13. package/dist/encoder.d.ts +14 -0
  14. package/dist/encoder.d.ts.map +1 -0
  15. package/dist/encoder.js +168 -0
  16. package/dist/encoder.js.map +1 -0
  17. package/dist/errors.d.ts +32 -0
  18. package/dist/errors.d.ts.map +1 -0
  19. package/dist/errors.js +52 -0
  20. package/dist/errors.js.map +1 -0
  21. package/dist/index.d.ts +60 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +114 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/lexer.d.ts +33 -0
  26. package/dist/lexer.d.ts.map +1 -0
  27. package/dist/lexer.js +340 -0
  28. package/dist/lexer.js.map +1 -0
  29. package/dist/native.d.ts +25 -0
  30. package/dist/native.d.ts.map +1 -0
  31. package/dist/native.js +32 -0
  32. package/dist/native.js.map +1 -0
  33. package/dist/parseFast.d.ts +11 -0
  34. package/dist/parseFast.d.ts.map +1 -0
  35. package/dist/parseFast.js +383 -0
  36. package/dist/parseFast.js.map +1 -0
  37. package/dist/parser.d.ts +13 -0
  38. package/dist/parser.d.ts.map +1 -0
  39. package/dist/parser.js +146 -0
  40. package/dist/parser.js.map +1 -0
  41. package/dist/stringify.d.ts +16 -0
  42. package/dist/stringify.d.ts.map +1 -0
  43. package/dist/stringify.js +88 -0
  44. package/dist/stringify.js.map +1 -0
  45. package/native/binding.cc +174 -0
  46. package/native/koda_binary.cc +256 -0
  47. package/native/koda_binary.h +36 -0
  48. package/native/koda_parse.cc +384 -0
  49. package/native/koda_parse.h +18 -0
  50. package/native/koda_value.h +60 -0
  51. package/package.json +48 -0
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Single-pass KODA parser. No token array; reads on the fly for speed.
3
+ * Same grammar as parser.ts; use for default parse() when speed matters.
4
+ */
5
+ import { KodaParseError } from './errors.js';
6
+ var K;
7
+ (function (K) {
8
+ K[K["Eof"] = 0] = "Eof";
9
+ K[K["LBrace"] = 1] = "LBrace";
10
+ K[K["RBrace"] = 2] = "RBrace";
11
+ K[K["LBracket"] = 3] = "LBracket";
12
+ K[K["RBracket"] = 4] = "RBracket";
13
+ K[K["Colon"] = 5] = "Colon";
14
+ K[K["Comma"] = 6] = "Comma";
15
+ K[K["String"] = 7] = "String";
16
+ K[K["Identifier"] = 8] = "Identifier";
17
+ K[K["Integer"] = 9] = "Integer";
18
+ K[K["Float"] = 10] = "Float";
19
+ K[K["True"] = 11] = "True";
20
+ K[K["False"] = 12] = "False";
21
+ K[K["Null"] = 13] = "Null";
22
+ })(K || (K = {}));
23
+ const DEFAULT_MAX_DEPTH = 256;
24
+ const DEFAULT_MAX_INPUT_LENGTH = 1_000_000;
25
+ export function parseFast(text, options = {}) {
26
+ const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;
27
+ const maxLen = options.maxInputLength ?? DEFAULT_MAX_INPUT_LENGTH;
28
+ if (text.length > maxLen) {
29
+ throw new KodaParseError(`Input exceeds maximum length (${text.length} > ${maxLen})`, {
30
+ position: { line: 1, column: 1, offset: 0 },
31
+ });
32
+ }
33
+ const r = new Reader(text, maxDepth);
34
+ const value = r.parseDocument();
35
+ r.expectEof();
36
+ return value;
37
+ }
38
+ class Reader {
39
+ input;
40
+ maxDepth;
41
+ pos = 0;
42
+ line = 1;
43
+ col = 1;
44
+ kind = K.Eof;
45
+ val = undefined;
46
+ constructor(input, maxDepth) {
47
+ this.input = input;
48
+ this.maxDepth = maxDepth;
49
+ this.skipWs();
50
+ this.readToken();
51
+ }
52
+ get len() {
53
+ return this.input.length;
54
+ }
55
+ peek() {
56
+ return this.pos >= this.len ? -1 : this.input.charCodeAt(this.pos);
57
+ }
58
+ peekAhead(n) {
59
+ return this.pos + n >= this.len ? -1 : this.input.charCodeAt(this.pos + n);
60
+ }
61
+ advance() {
62
+ if (this.pos >= this.len)
63
+ return -1;
64
+ const c = this.input.charCodeAt(this.pos);
65
+ this.pos++;
66
+ if (c === 10) {
67
+ this.line++;
68
+ this.col = 1;
69
+ }
70
+ else {
71
+ this.col++;
72
+ }
73
+ return c;
74
+ }
75
+ fail(msg) {
76
+ throw new KodaParseError(msg, { position: { line: this.line, column: this.col, offset: this.pos } });
77
+ }
78
+ skipWs() {
79
+ while (this.pos < this.len) {
80
+ const c = this.peek();
81
+ if (c === 32 || c === 9 || c === 13 || c === 10) {
82
+ this.advance();
83
+ continue;
84
+ }
85
+ if (c === 47 && this.peekAhead(1) === 47) {
86
+ this.advance();
87
+ this.advance();
88
+ while (this.peek() !== -1 && this.peek() !== 10)
89
+ this.advance();
90
+ continue;
91
+ }
92
+ if (c === 47 && this.peekAhead(1) === 42) {
93
+ this.advance();
94
+ this.advance();
95
+ let depth = 1;
96
+ while (depth > 0 && this.pos + 1 < this.len) {
97
+ const x = this.advance();
98
+ if (x === 42 && this.peek() === 47) {
99
+ this.advance();
100
+ depth--;
101
+ }
102
+ else if (x === 47 && this.peek() === 42) {
103
+ this.advance();
104
+ depth++;
105
+ }
106
+ }
107
+ if (depth !== 0)
108
+ this.fail('Unclosed multi-line comment');
109
+ continue;
110
+ }
111
+ return;
112
+ }
113
+ }
114
+ readToken() {
115
+ this.skipWs();
116
+ if (this.pos >= this.len) {
117
+ this.kind = K.Eof;
118
+ return;
119
+ }
120
+ const c = this.peek();
121
+ if (c === 123) {
122
+ this.advance();
123
+ this.kind = K.LBrace;
124
+ return;
125
+ }
126
+ if (c === 125) {
127
+ this.advance();
128
+ this.kind = K.RBrace;
129
+ return;
130
+ }
131
+ if (c === 91) {
132
+ this.advance();
133
+ this.kind = K.LBracket;
134
+ return;
135
+ }
136
+ if (c === 93) {
137
+ this.advance();
138
+ this.kind = K.RBracket;
139
+ return;
140
+ }
141
+ if (c === 58) {
142
+ this.advance();
143
+ this.kind = K.Colon;
144
+ return;
145
+ }
146
+ if (c === 44) {
147
+ this.advance();
148
+ this.kind = K.Comma;
149
+ return;
150
+ }
151
+ if (c === 34 || c === 39) {
152
+ this.val = this.readQuoted(c);
153
+ this.kind = K.String;
154
+ return;
155
+ }
156
+ if (c === 45 || (c >= 48 && c <= 57)) {
157
+ const { val, isFloat } = this.readNumber();
158
+ this.val = val;
159
+ this.kind = isFloat ? K.Float : K.Integer;
160
+ return;
161
+ }
162
+ if ((c >= 97 && c <= 122) || (c >= 65 && c <= 90) || c === 95) {
163
+ const raw = this.readIdentifier();
164
+ if (raw === 'true') {
165
+ this.kind = K.True;
166
+ this.val = undefined;
167
+ }
168
+ else if (raw === 'false') {
169
+ this.kind = K.False;
170
+ this.val = undefined;
171
+ }
172
+ else if (raw === 'null') {
173
+ this.kind = K.Null;
174
+ this.val = undefined;
175
+ }
176
+ else {
177
+ this.kind = K.Identifier;
178
+ this.val = raw;
179
+ }
180
+ return;
181
+ }
182
+ this.fail('Unexpected character');
183
+ }
184
+ readQuoted(quote) {
185
+ this.advance();
186
+ const buf = [];
187
+ while (this.pos < this.len) {
188
+ const ch = this.advance();
189
+ if (ch === quote)
190
+ return buf.join('');
191
+ if (ch === 92) {
192
+ const next = this.advance();
193
+ if (next === -1)
194
+ this.fail('Unclosed string');
195
+ if (next === quote)
196
+ buf.push(String.fromCharCode(quote));
197
+ else if (next === 92)
198
+ buf.push('\\');
199
+ else if (next === 47)
200
+ buf.push('/');
201
+ else if (next === 98)
202
+ buf.push('\b');
203
+ else if (next === 102)
204
+ buf.push('\f');
205
+ else if (next === 110)
206
+ buf.push('\n');
207
+ else if (next === 114)
208
+ buf.push('\r');
209
+ else if (next === 116)
210
+ buf.push('\t');
211
+ else if (next === 117) {
212
+ let hex = '';
213
+ for (let i = 0; i < 4; i++) {
214
+ const h = this.advance();
215
+ if (h === -1 || !((h >= 48 && h <= 57) || (h >= 97 && h <= 102) || (h >= 65 && h <= 70)))
216
+ this.fail('Invalid \\u escape');
217
+ hex += this.input.charAt(this.pos - 1);
218
+ }
219
+ buf.push(String.fromCodePoint(parseInt(hex, 16)));
220
+ }
221
+ else
222
+ buf.push(String.fromCharCode(next));
223
+ }
224
+ else if (ch >= 0 && ch <= 31) {
225
+ this.fail('Control character in string');
226
+ }
227
+ else {
228
+ buf.push(String.fromCharCode(ch));
229
+ }
230
+ }
231
+ this.fail('Unclosed string');
232
+ }
233
+ readNumber() {
234
+ const start = this.pos;
235
+ if (this.peek() === 45)
236
+ this.advance();
237
+ let isFloat = false;
238
+ if (this.peek() === 48) {
239
+ this.advance();
240
+ const n = this.peek();
241
+ if (n >= 49 && n <= 57)
242
+ this.fail('Invalid number: leading zero');
243
+ if (n === 46 || n === 101 || n === 69)
244
+ isFloat = true;
245
+ }
246
+ else {
247
+ while (this.peek() >= 48 && this.peek() <= 57)
248
+ this.advance();
249
+ }
250
+ if (this.peek() === 46) {
251
+ isFloat = true;
252
+ this.advance();
253
+ while (this.peek() >= 48 && this.peek() <= 57)
254
+ this.advance();
255
+ }
256
+ if (this.peek() === 101 || this.peek() === 69) {
257
+ isFloat = true;
258
+ this.advance();
259
+ if (this.peek() === 43 || this.peek() === 45)
260
+ this.advance();
261
+ while (this.peek() >= 48 && this.peek() <= 57)
262
+ this.advance();
263
+ }
264
+ const raw = this.input.slice(start, this.pos);
265
+ const num = isFloat ? parseFloat(raw) : parseInt(raw, 10);
266
+ if (Number.isNaN(num))
267
+ this.fail('Invalid number');
268
+ if (!isFloat && (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER))
269
+ this.fail('Integer out of range');
270
+ return { val: num, isFloat };
271
+ }
272
+ readIdentifier() {
273
+ const start = this.pos;
274
+ while (this.pos < this.len) {
275
+ const c = this.peek();
276
+ if ((c >= 97 && c <= 122) || (c >= 65 && c <= 90) || (c >= 48 && c <= 57) || c === 95 || c === 45) {
277
+ this.advance();
278
+ }
279
+ else
280
+ break;
281
+ }
282
+ return this.input.slice(start, this.pos);
283
+ }
284
+ expectEof() {
285
+ if (this.kind !== K.Eof)
286
+ this.fail('Expected end of input');
287
+ }
288
+ parseDocument() {
289
+ const canBeKey = this.kind === K.Identifier || this.kind === K.String;
290
+ if (canBeKey) {
291
+ const saved = { pos: this.pos, kind: this.kind, val: this.val, line: this.line, col: this.col };
292
+ this.readToken();
293
+ const hasMore = this.kind !== K.Eof;
294
+ this.pos = saved.pos;
295
+ this.kind = saved.kind;
296
+ this.val = saved.val;
297
+ this.line = saved.line;
298
+ this.col = saved.col;
299
+ if (hasMore)
300
+ return this.parseRootObject(0);
301
+ }
302
+ return this.parseValue(0);
303
+ }
304
+ parseRootObject(depth) {
305
+ const obj = {};
306
+ while (this.kind === K.Identifier || this.kind === K.String) {
307
+ const key = this.val;
308
+ this.readToken();
309
+ if (this.kind === K.Colon)
310
+ this.readToken();
311
+ const value = this.parseValue(depth + 1);
312
+ if (Object.prototype.hasOwnProperty.call(obj, key))
313
+ this.fail(`Duplicate key: ${JSON.stringify(key)}`);
314
+ obj[key] = value;
315
+ }
316
+ return obj;
317
+ }
318
+ parseValue(depth) {
319
+ if (depth > this.maxDepth)
320
+ this.fail(`Maximum nesting depth exceeded (${this.maxDepth})`);
321
+ switch (this.kind) {
322
+ case K.LBrace:
323
+ return this.parseObject(depth);
324
+ case K.LBracket:
325
+ return this.parseArray(depth);
326
+ case K.String:
327
+ case K.Identifier: {
328
+ const v = this.val;
329
+ this.readToken();
330
+ return v;
331
+ }
332
+ case K.Integer:
333
+ case K.Float: {
334
+ const v = this.val;
335
+ this.readToken();
336
+ return v;
337
+ }
338
+ case K.True:
339
+ this.readToken();
340
+ return true;
341
+ case K.False:
342
+ this.readToken();
343
+ return false;
344
+ case K.Null:
345
+ this.readToken();
346
+ return null;
347
+ default:
348
+ this.fail(`Unexpected token`);
349
+ }
350
+ }
351
+ parseObject(depth) {
352
+ this.readToken();
353
+ const obj = {};
354
+ while (this.kind !== K.RBrace) {
355
+ if (this.kind !== K.Identifier && this.kind !== K.String)
356
+ this.fail('Expected key');
357
+ const key = this.val;
358
+ this.readToken();
359
+ if (this.kind === K.Colon)
360
+ this.readToken();
361
+ const value = this.parseValue(depth + 1);
362
+ if (Object.prototype.hasOwnProperty.call(obj, key))
363
+ this.fail(`Duplicate key: ${JSON.stringify(key)}`);
364
+ obj[key] = value;
365
+ if (this.kind === K.Comma)
366
+ this.readToken();
367
+ }
368
+ this.readToken();
369
+ return obj;
370
+ }
371
+ parseArray(depth) {
372
+ this.readToken();
373
+ const arr = [];
374
+ while (this.kind !== K.RBracket) {
375
+ arr.push(this.parseValue(depth + 1));
376
+ if (this.kind === K.Comma)
377
+ this.readToken();
378
+ }
379
+ this.readToken();
380
+ return arr;
381
+ }
382
+ }
383
+ //# sourceMappingURL=parseFast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseFast.js","sourceRoot":"","sources":["../src/parseFast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * KODA text format parser. Builds KodaValue from tokens with depth and size limits.
3
+ * See SPEC §4 (Text Syntax), §8 (Error handling), §9 (Security).
4
+ */
5
+ import type { KodaValue } from './ast.js';
6
+ export interface ParseOptions {
7
+ /** Max nesting depth (default 256). SPEC §9. */
8
+ maxDepth?: number;
9
+ /** Max input length in characters. Passed to lexer. */
10
+ maxInputLength?: number;
11
+ }
12
+ export declare function parse(text: string, options?: ParseOptions): KodaValue;
13
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK1C,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,SAAS,CASzE"}
package/dist/parser.js ADDED
@@ -0,0 +1,146 @@
1
+ /**
2
+ * KODA text format parser. Builds KodaValue from tokens with depth and size limits.
3
+ * See SPEC §4 (Text Syntax), §8 (Error handling), §9 (Security).
4
+ */
5
+ import { KodaParseError } from './errors.js';
6
+ import { TokenKind } from './lexer.js';
7
+ import { tokenize } from './lexer.js';
8
+ const DEFAULT_MAX_DEPTH = 256;
9
+ export function parse(text, options = {}) {
10
+ const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;
11
+ const tokens = tokenize(text, {
12
+ maxInputLength: options.maxInputLength,
13
+ });
14
+ const p = new Parser(tokens, maxDepth);
15
+ const value = p.parseDocument();
16
+ p.expect(TokenKind.Eof);
17
+ return value;
18
+ }
19
+ class Parser {
20
+ tokens;
21
+ maxDepth;
22
+ index = 0;
23
+ constructor(tokens, maxDepth) {
24
+ this.tokens = tokens;
25
+ this.maxDepth = maxDepth;
26
+ }
27
+ get current() {
28
+ return this.tokens[this.index] ?? this.tokens[this.tokens.length - 1];
29
+ }
30
+ at(kind) {
31
+ return this.current.kind === kind;
32
+ }
33
+ advance() {
34
+ const t = this.current;
35
+ if (this.index < this.tokens.length - 1)
36
+ this.index++;
37
+ return t;
38
+ }
39
+ expect(kind) {
40
+ if (this.current.kind !== kind) {
41
+ throw new KodaParseError(`Expected ${kind}, got ${this.current.kind}`, { position: this.current.start });
42
+ }
43
+ return this.advance();
44
+ }
45
+ fail(message) {
46
+ throw new KodaParseError(message, { position: this.current.start });
47
+ }
48
+ /** Root: implicit object (key value ...) or single value. */
49
+ parseDocument() {
50
+ const canBeKey = this.at(TokenKind.Identifier) || this.at(TokenKind.String);
51
+ const hasMore = this.index + 1 < this.tokens.length && this.tokens[this.index + 1].kind !== TokenKind.Eof;
52
+ if (canBeKey && hasMore) {
53
+ return this.parseRootObject(0);
54
+ }
55
+ return this.parseValue(0);
56
+ }
57
+ /** Parse root-level key value key value ... into an object (no surrounding braces). */
58
+ parseRootObject(depth) {
59
+ const obj = {};
60
+ while (this.at(TokenKind.Identifier) || this.at(TokenKind.String)) {
61
+ const keyToken = this.current;
62
+ const key = this.advance().value;
63
+ if (this.at(TokenKind.Colon))
64
+ this.advance();
65
+ const value = this.parseValue(depth + 1);
66
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
67
+ throw new KodaParseError(`Duplicate key: ${JSON.stringify(key)}`, { position: keyToken.start });
68
+ }
69
+ obj[key] = value;
70
+ }
71
+ return obj;
72
+ }
73
+ parseValue(depth) {
74
+ if (depth > this.maxDepth) {
75
+ throw new KodaParseError(`Maximum nesting depth exceeded (${this.maxDepth})`, { position: this.current.start });
76
+ }
77
+ switch (this.current.kind) {
78
+ case TokenKind.LBrace:
79
+ return this.parseObject(depth);
80
+ case TokenKind.LBracket:
81
+ return this.parseArray(depth);
82
+ case TokenKind.String:
83
+ return this.advance().value;
84
+ case TokenKind.Identifier:
85
+ return this.advance().value;
86
+ case TokenKind.Integer:
87
+ return this.advance().value;
88
+ case TokenKind.Float:
89
+ return this.advance().value;
90
+ case TokenKind.True:
91
+ this.advance();
92
+ return true;
93
+ case TokenKind.False:
94
+ this.advance();
95
+ return false;
96
+ case TokenKind.Null:
97
+ this.advance();
98
+ return null;
99
+ default:
100
+ this.fail(`Unexpected token: ${this.current.kind}`);
101
+ }
102
+ }
103
+ parseObject(depth) {
104
+ this.expect(TokenKind.LBrace);
105
+ const obj = {};
106
+ while (!this.at(TokenKind.RBrace)) {
107
+ const keyToken = this.current;
108
+ let key;
109
+ if (keyToken.kind === TokenKind.Identifier) {
110
+ key = this.advance().value;
111
+ }
112
+ else if (keyToken.kind === TokenKind.String) {
113
+ key = this.advance().value;
114
+ }
115
+ else {
116
+ this.fail('Expected key (identifier or string)');
117
+ }
118
+ if (this.at(TokenKind.Colon))
119
+ this.advance();
120
+ const value = this.parseValue(depth + 1);
121
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
122
+ throw new KodaParseError(`Duplicate key: ${JSON.stringify(key)}`, {
123
+ position: keyToken.start,
124
+ });
125
+ }
126
+ obj[key] = value;
127
+ // Optional comma or more key-value pairs
128
+ if (this.at(TokenKind.Comma))
129
+ this.advance();
130
+ }
131
+ this.expect(TokenKind.RBrace);
132
+ return obj;
133
+ }
134
+ parseArray(depth) {
135
+ this.expect(TokenKind.LBracket);
136
+ const arr = [];
137
+ while (!this.at(TokenKind.RBracket)) {
138
+ arr.push(this.parseValue(depth + 1));
139
+ if (this.at(TokenKind.Comma))
140
+ this.advance();
141
+ }
142
+ this.expect(TokenKind.RBracket);
143
+ return arr;
144
+ }
145
+ }
146
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAc,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAStC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,UAAwB,EAAE;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE;QAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,MAAM;IAGS;IACA;IAHX,KAAK,GAAG,CAAC,CAAC;IAClB,YACmB,MAAe,EACf,QAAgB;QADhB,WAAM,GAAN,MAAM,CAAS;QACf,aAAQ,GAAR,QAAQ,CAAQ;IAChC,CAAC;IAEJ,IAAY,OAAO;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACzE,CAAC;IAEO,EAAE,CAAC,IAAe;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC;IACpC,CAAC;IAEO,OAAO;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACvB,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,CAAC,IAAe;QACpB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,IAAI,cAAc,CACtB,YAAY,IAAI,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAC5C,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CACjC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAEO,IAAI,CAAC,OAAe;QAC1B,MAAM,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,6DAA6D;IAC7D,aAAa;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,IAAI,KAAK,SAAS,CAAC,GAAG,CAAC;QAC3G,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,uFAAuF;IAC/E,eAAe,CAAC,KAAa;QACnC,MAAM,GAAG,GAA8B,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAe,CAAC;YAC3C,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,cAAc,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YAClG,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,cAAc,CACtB,mCAAmC,IAAI,CAAC,QAAQ,GAAG,EACnD,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CACjC,CAAC;QACJ,CAAC;QAED,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC1B,KAAK,SAAS,CAAC,MAAM;gBACnB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACjC,KAAK,SAAS,CAAC,QAAQ;gBACrB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,KAAK,SAAS,CAAC,MAAM;gBACnB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,KAAe,CAAC;YACxC,KAAK,SAAS,CAAC,UAAU;gBACvB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,KAAe,CAAC;YACxC,KAAK,SAAS,CAAC,OAAO;gBACpB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,KAAe,CAAC;YACxC,KAAK,SAAS,CAAC,KAAK;gBAClB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,KAAe,CAAC;YACxC,KAAK,SAAS,CAAC,IAAI;gBACjB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,KAAK,SAAS,CAAC,KAAK;gBAClB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO,KAAK,CAAC;YACf,KAAK,SAAS,CAAC,IAAI;gBACjB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC;YACd;gBACE,IAAI,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,GAAG,GAA8B,EAAE,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9B,IAAI,GAAW,CAAC;YAChB,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC3C,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAe,CAAC;YACvC,CAAC;iBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC9C,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAe,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,cAAc,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE;oBAChE,QAAQ,EAAE,QAAQ,CAAC,KAAK;iBACzB,CAAC,CAAC;YACL,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACjB,yCAAyC;YACzC,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,GAAG,GAAgB,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * KODA value to text (.koda). Produces compact, human-readable output.
3
+ * Keys that are valid identifiers are emitted unquoted; strings quoted when necessary.
4
+ */
5
+ import type { KodaValue } from './ast.js';
6
+ export interface StringifyOptions {
7
+ /** Indent string for pretty-print (default: no indent, single line) */
8
+ indent?: string;
9
+ /** Newline (default "\n") */
10
+ newline?: string;
11
+ }
12
+ /**
13
+ * Serialize a KODA value to text format.
14
+ */
15
+ export declare function stringify(value: KodaValue, options?: StringifyOptions): string;
16
+ //# sourceMappingURL=stringify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify.d.ts","sourceRoot":"","sources":["../src/stringify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA2ED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAIlF"}