toon-formatter 2.0.1 → 2.1.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.
@@ -0,0 +1,525 @@
1
+ /**
2
+ * JsonConverter Class
3
+ */
4
+
5
+ import { toonToJson, toonToJsonSync, jsonToToon, jsonToToonSync } from '../json.js';
6
+ import { yamlToJson, yamlToJsonSync, jsonToYaml, jsonToYamlSync } from './yaml.js';
7
+ import { xmlToJson, xmlToJsonSync, jsonToXml, jsonToXmlSync } from './xml.js';
8
+ import { csvToJson, csvToJsonSync, jsonToCsv, jsonToCsvSync } from './csv.js';
9
+ import { validateJsonString, validateJsonStringSync } from './validator.js';
10
+
11
+ export class JsonConverter {
12
+ /**
13
+ * Creates a JsonConverter instance
14
+ * @param {Object} [encryptor=null] - Optional Encryptor instance for encryption support
15
+ */
16
+ constructor(encryptor = null) {
17
+ this.encryptor = encryptor;
18
+ }
19
+
20
+ // --- Helper Methods for Encryption ---
21
+
22
+ _convertWithEncryption(fn, data, mode) {
23
+ if (!this.encryptor || mode === 'no_encryption') {
24
+ return fn(data);
25
+ }
26
+
27
+ switch (mode) {
28
+ case 'middleware': // Decrypt -> Convert -> Encrypt
29
+ // Input is encrypted
30
+ const decrypted = this.encryptor.decrypt(data);
31
+ const result = fn(decrypted);
32
+ return this.encryptor.encrypt(result);
33
+ case 'ingestion': // Decrypt -> Convert
34
+ // Input is encrypted
35
+ const dec = this.encryptor.decrypt(data);
36
+ return fn(dec);
37
+ case 'export': // Convert -> Encrypt
38
+ // Input is plain
39
+ const res = fn(data);
40
+ return this.encryptor.encrypt(res);
41
+ default:
42
+ return fn(data);
43
+ }
44
+ }
45
+
46
+ async _convertWithEncryptionAsync(fn, data, mode) {
47
+ if (!this.encryptor || mode === 'no_encryption') {
48
+ return await fn(data);
49
+ }
50
+
51
+ switch (mode) {
52
+ case 'middleware':
53
+ const decrypted = this.encryptor.decrypt(data);
54
+ const result = await fn(decrypted);
55
+ return this.encryptor.encrypt(result);
56
+ case 'ingestion':
57
+ const dec = this.encryptor.decrypt(data);
58
+ return await fn(dec);
59
+ case 'export':
60
+ const res = await fn(data);
61
+ return this.encryptor.encrypt(res);
62
+ default:
63
+ return await fn(data);
64
+ }
65
+ }
66
+
67
+
68
+ // --- TOON Conversions ---
69
+
70
+ /**
71
+ * Convert TOON string to JSON (Sync)
72
+ * @param {string} toonString - TOON formatted string
73
+ * @param {Object} [options={}] - Conversion options
74
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode: 'no_encryption', 'middleware', 'ingestion', 'export'
75
+ * @param {boolean} [options.returnJson=false] - If true, returns JSON string; if false, returns object
76
+ * @returns {Object|string} JSON object or string
77
+ */
78
+ fromToon(toonString, options = {}) {
79
+ const { conversionMode = 'no_encryption', returnJson = false } = options;
80
+ return this._convertWithEncryption(
81
+ (data) => toonToJsonSync(data, returnJson),
82
+ toonString,
83
+ conversionMode
84
+ );
85
+ }
86
+
87
+ /**
88
+ * Convert TOON string to JSON (Async)
89
+ * @param {string} toonString - TOON formatted string
90
+ * @param {Object} [options={}] - Conversion options
91
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
92
+ * @param {boolean} [options.returnJson=false] - If true, returns JSON string; if false, returns object
93
+ * @returns {Promise<Object|string>} JSON object or string
94
+ */
95
+ async fromToonAsync(toonString, options = {}) {
96
+ const { conversionMode = 'no_encryption', returnJson = false } = options;
97
+ return this._convertWithEncryptionAsync(
98
+ async (data) => toonToJson(data, returnJson),
99
+ toonString,
100
+ conversionMode
101
+ );
102
+ }
103
+
104
+ /**
105
+ * Convert JSON to TOON string (Sync)
106
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
107
+ * @param {Object} [options={}] - Conversion options
108
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
109
+ * @returns {string} TOON formatted string
110
+ */
111
+ toToon(jsonData, options = {}) {
112
+ const { conversionMode = 'no_encryption' } = options;
113
+ return this._convertWithEncryption(
114
+ (data) => jsonToToonSync(data),
115
+ jsonData,
116
+ conversionMode
117
+ );
118
+ }
119
+
120
+ /**
121
+ * Convert JSON to TOON string (Async)
122
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
123
+ * @param {Object} [options={}] - Conversion options
124
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
125
+ * @returns {Promise<string>} TOON formatted string
126
+ */
127
+ async toToonAsync(jsonData, options = {}) {
128
+ const { conversionMode = 'no_encryption' } = options;
129
+ return this._convertWithEncryptionAsync(
130
+ async (data) => jsonToToon(data),
131
+ jsonData,
132
+ conversionMode
133
+ );
134
+ }
135
+
136
+ // --- YAML Conversions ---
137
+
138
+ /**
139
+ * Convert YAML string to JSON (Sync)
140
+ * @param {string} yamlString - YAML formatted string
141
+ * @param {Object} [options={}] - Conversion options
142
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
143
+ * @param {boolean} [options.returnJson=false] - If true, returns JSON string; if false, returns object
144
+ * @returns {Object|string} JSON result
145
+ */
146
+ fromYaml(yamlString, options = {}) {
147
+ const { conversionMode = 'no_encryption', returnJson = false } = options;
148
+ return this._convertWithEncryption(
149
+ (data) => yamlToJsonSync(data, returnJson),
150
+ yamlString,
151
+ conversionMode
152
+ );
153
+ }
154
+
155
+ /**
156
+ * Convert YAML string to JSON (Async)
157
+ * @param {string} yamlString - YAML formatted string
158
+ * @param {Object} [options={}] - Conversion options
159
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
160
+ * @param {boolean} [options.returnJson=false] - If true, returns JSON string; if false, returns object
161
+ * @returns {Promise<Object|string>} JSON result
162
+ */
163
+ async fromYamlAsync(yamlString, options = {}) {
164
+ const { conversionMode = 'no_encryption', returnJson = false } = options;
165
+ return this._convertWithEncryptionAsync(
166
+ async (data) => yamlToJson(data, returnJson),
167
+ yamlString,
168
+ conversionMode
169
+ );
170
+ }
171
+
172
+ /**
173
+ * Convert JSON to YAML string (Sync)
174
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
175
+ * @param {Object} [options={}] - Conversion options
176
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
177
+ * @returns {string} YAML formatted string
178
+ */
179
+ toYaml(jsonData, options = {}) {
180
+ const { conversionMode = 'no_encryption' } = options;
181
+ return this._convertWithEncryption(
182
+ (data) => jsonToYamlSync(data),
183
+ jsonData,
184
+ conversionMode
185
+ );
186
+ }
187
+
188
+ /**
189
+ * Convert JSON to YAML string (Async)
190
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
191
+ * @param {Object} [options={}] - Conversion options
192
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
193
+ * @returns {Promise<string>} YAML formatted string
194
+ */
195
+ async toYamlAsync(jsonData, options = {}) {
196
+ const { conversionMode = 'no_encryption' } = options;
197
+ return this._convertWithEncryptionAsync(
198
+ async (data) => jsonToYaml(data),
199
+ jsonData,
200
+ conversionMode
201
+ );
202
+ }
203
+
204
+ // --- XML Conversions ---
205
+
206
+ /**
207
+ * Convert XML string to JSON (Sync)
208
+ * @param {string} xmlString - XML formatted string (supports mixed text)
209
+ * @param {Object} [options={}] - Conversion options
210
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
211
+ * @returns {Object|string} JSON result
212
+ */
213
+ fromXml(xmlString, options = {}) {
214
+ const { conversionMode = 'no_encryption' } = options;
215
+ return this._convertWithEncryption(
216
+ (data) => xmlToJsonSync(data),
217
+ xmlString,
218
+ conversionMode
219
+ );
220
+ }
221
+
222
+ /**
223
+ * Convert XML string to JSON (Async)
224
+ * @param {string} xmlString - XML formatted string (supports mixed text)
225
+ * @param {Object} [options={}] - Conversion options
226
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
227
+ * @returns {Promise<Object|string>} JSON result
228
+ */
229
+ async fromXmlAsync(xmlString, options = {}) {
230
+ const { conversionMode = 'no_encryption' } = options;
231
+ return this._convertWithEncryptionAsync(
232
+ async (data) => xmlToJson(data),
233
+ xmlString,
234
+ conversionMode
235
+ );
236
+ }
237
+
238
+ /**
239
+ * Convert JSON to XML string (Sync)
240
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
241
+ * @param {Object} [options={}] - Conversion options
242
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
243
+ * @returns {string} XML formatted string
244
+ */
245
+ toXml(jsonData, options = {}) {
246
+ const { conversionMode = 'no_encryption' } = options;
247
+ return this._convertWithEncryption(
248
+ (data) => jsonToXmlSync(data),
249
+ jsonData,
250
+ conversionMode
251
+ );
252
+ }
253
+
254
+ /**
255
+ * Convert JSON to XML string (Async)
256
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
257
+ * @param {Object} [options={}] - Conversion options
258
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
259
+ * @returns {Promise<string>} XML formatted string
260
+ */
261
+ async toXmlAsync(jsonData, options = {}) {
262
+ const { conversionMode = 'no_encryption' } = options;
263
+ return this._convertWithEncryptionAsync(
264
+ async (data) => jsonToXml(data),
265
+ jsonData,
266
+ conversionMode
267
+ );
268
+ }
269
+
270
+ // --- CSV Conversions ---
271
+
272
+ /**
273
+ * Convert CSV string to JSON (Sync)
274
+ * @param {string} csvString - CSV formatted string (supports mixed text)
275
+ * @param {Object} [options={}] - Conversion options
276
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
277
+ * @returns {Array<Object>|string} JSON result
278
+ */
279
+ fromCsv(csvString, options = {}) {
280
+ const { conversionMode = 'no_encryption' } = options;
281
+ return this._convertWithEncryption(
282
+ (data) => csvToJsonSync(data),
283
+ csvString,
284
+ conversionMode
285
+ );
286
+ }
287
+
288
+ /**
289
+ * Convert CSV string to JSON (Async)
290
+ * @param {string} csvString - CSV formatted string (supports mixed text)
291
+ * @param {Object} [options={}] - Conversion options
292
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
293
+ * @returns {Promise<Array<Object>|string>} JSON result
294
+ */
295
+ async fromCsvAsync(csvString, options = {}) {
296
+ const { conversionMode = 'no_encryption' } = options;
297
+ return this._convertWithEncryptionAsync(
298
+ async (data) => csvToJson(data),
299
+ csvString,
300
+ conversionMode
301
+ );
302
+ }
303
+
304
+ /**
305
+ * Convert JSON to CSV string (Sync)
306
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
307
+ * @param {Object} [options={}] - Conversion options
308
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
309
+ * @returns {string} CSV formatted string
310
+ */
311
+ toCsv(jsonData, options = {}) {
312
+ const { conversionMode = 'no_encryption' } = options;
313
+ return this._convertWithEncryption(
314
+ (data) => jsonToCsvSync(data),
315
+ jsonData,
316
+ conversionMode
317
+ );
318
+ }
319
+
320
+ /**
321
+ * Convert JSON to CSV string (Async)
322
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
323
+ * @param {Object} [options={}] - Conversion options
324
+ * @param {string} [options.conversionMode='no_encryption'] - Encryption mode
325
+ * @returns {Promise<string>} CSV formatted string
326
+ */
327
+ async toCsvAsync(jsonData, options = {}) {
328
+ const { conversionMode = 'no_encryption' } = options;
329
+ return this._convertWithEncryptionAsync(
330
+ async (data) => jsonToCsv(data),
331
+ jsonData,
332
+ conversionMode
333
+ );
334
+ }
335
+
336
+ // --- Validation ---
337
+
338
+ /**
339
+ * Validate JSON string (Sync)
340
+ * @param {string} jsonString - JSON string to validate
341
+ * @returns {boolean} True if valid
342
+ */
343
+ validate(jsonString) {
344
+ return validateJsonStringSync(jsonString);
345
+ }
346
+
347
+ /**
348
+ * Validate JSON string (Async)
349
+ * @param {string} jsonString - JSON string to validate
350
+ * @returns {Promise<boolean>} True if valid
351
+ */
352
+ async validateAsync(jsonString) {
353
+ return validateJsonString(jsonString);
354
+ }
355
+
356
+ // ========================================
357
+ // Static Methods (Backward Compatibility)
358
+ // ========================================
359
+
360
+ /**
361
+ * Convert TOON string to JSON (Sync)
362
+ * @param {string} toonString - TOON formatted string
363
+ * @param {boolean} [returnJson=false] - If true, returns JSON string; if false, returns object
364
+ * @returns {Object|string} JSON object or string
365
+ */
366
+ static fromToon(toonString, returnJson = false) {
367
+ return toonToJsonSync(toonString, returnJson);
368
+ }
369
+
370
+ /**
371
+ * Convert TOON string to JSON (Async)
372
+ * @param {string} toonString - TOON formatted string
373
+ * @param {boolean} [returnJson=false] - If true, returns JSON string; if false, returns object
374
+ * @returns {Promise<Object|string>} JSON object or string
375
+ */
376
+ static async fromToonAsync(toonString, returnJson = false) {
377
+ return toonToJson(toonString, returnJson);
378
+ }
379
+
380
+ /**
381
+ * Convert JSON to TOON string (Sync)
382
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
383
+ * @returns {string} TOON formatted string
384
+ */
385
+ static toToon(jsonData) {
386
+ return jsonToToonSync(jsonData);
387
+ }
388
+
389
+ /**
390
+ * Convert JSON to TOON string (Async)
391
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
392
+ * @returns {Promise<string>} TOON formatted string
393
+ */
394
+ static async toToonAsync(jsonData) {
395
+ return jsonToToon(jsonData);
396
+ }
397
+
398
+ /**
399
+ * Convert YAML string to JSON (Sync)
400
+ * @param {string} yamlString - YAML formatted string
401
+ * @param {boolean} [returnJson=false] - If true, returns JSON string; if false, returns object
402
+ * @returns {Object|string} JSON object or string
403
+ */
404
+ static fromYaml(yamlString, returnJson = false) {
405
+ return yamlToJsonSync(yamlString, returnJson);
406
+ }
407
+
408
+ /**
409
+ * Convert YAML string to JSON (Async)
410
+ * @param {string} yamlString - YAML formatted string
411
+ * @param {boolean} [returnJson=false] - If true, returns JSON string; if false, returns object
412
+ * @returns {Promise<Object|string>} JSON object or string
413
+ */
414
+ static async fromYamlAsync(yamlString, returnJson = false) {
415
+ return yamlToJson(yamlString, returnJson);
416
+ }
417
+
418
+ /**
419
+ * Convert JSON to YAML string (Sync)
420
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
421
+ * @returns {string} YAML formatted string
422
+ */
423
+ static toYaml(jsonData) {
424
+ return jsonToYamlSync(jsonData);
425
+ }
426
+
427
+ /**
428
+ * Convert JSON to YAML string (Async)
429
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
430
+ * @returns {Promise<string>} YAML formatted string
431
+ */
432
+ static async toYamlAsync(jsonData) {
433
+ return jsonToYaml(jsonData);
434
+ }
435
+
436
+ /**
437
+ * Convert XML string to JSON (Sync)
438
+ * @param {string} xmlString - XML formatted string
439
+ * @returns {Object|string} JSON object or string
440
+ */
441
+ static fromXml(xmlString) {
442
+ return xmlToJsonSync(xmlString);
443
+ }
444
+
445
+ /**
446
+ * Convert XML string to JSON (Async)
447
+ * @param {string} xmlString - XML formatted string
448
+ * @returns {Promise<Object|string>} JSON object or string
449
+ */
450
+ static async fromXmlAsync(xmlString) {
451
+ return xmlToJson(xmlString);
452
+ }
453
+
454
+ /**
455
+ * Convert JSON to XML string (Sync)
456
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
457
+ * @returns {string} XML formatted string
458
+ */
459
+ static toXml(jsonData) {
460
+ return jsonToXmlSync(jsonData);
461
+ }
462
+
463
+ /**
464
+ * Convert JSON to XML string (Async)
465
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
466
+ * @returns {Promise<string>} XML formatted string
467
+ */
468
+ static async toXmlAsync(jsonData) {
469
+ return jsonToXml(jsonData);
470
+ }
471
+
472
+ /**
473
+ * Convert CSV string to JSON (Sync)
474
+ * @param {string} csvString - CSV formatted string
475
+ * @returns {Array<Object>|string} JSON object or string
476
+ */
477
+ static fromCsv(csvString) {
478
+ return csvToJsonSync(csvString);
479
+ }
480
+
481
+ /**
482
+ * Convert CSV string to JSON (Async)
483
+ * @param {string} csvString - CSV formatted string
484
+ * @returns {Promise<Array<Object>|string>} JSON object or string
485
+ */
486
+ static async fromCsvAsync(csvString) {
487
+ return csvToJson(csvString);
488
+ }
489
+
490
+ /**
491
+ * Convert JSON to CSV string (Sync)
492
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
493
+ * @returns {string} CSV formatted string
494
+ */
495
+ static toCsv(jsonData) {
496
+ return jsonToCsvSync(jsonData);
497
+ }
498
+
499
+ /**
500
+ * Convert JSON to CSV string (Async)
501
+ * @param {Object|string} jsonData - JSON data or string with embedded JSON
502
+ * @returns {Promise<string>} CSV formatted string
503
+ */
504
+ static async toCsvAsync(jsonData) {
505
+ return jsonToCsv(jsonData);
506
+ }
507
+
508
+ /**
509
+ * Validate JSON string
510
+ * @param {string} jsonString - JSON string to validate
511
+ * @returns {boolean} True if valid
512
+ */
513
+ static validate(jsonString) {
514
+ return validateJsonStringSync(jsonString);
515
+ }
516
+
517
+ /**
518
+ * Validate JSON string (Async)
519
+ * @param {string} jsonString - JSON string to validate
520
+ * @returns {Promise<boolean>} True if valid
521
+ */
522
+ static async validateAsync(jsonString) {
523
+ return validateJsonString(jsonString);
524
+ }
525
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * JSON Validator (for JsonConverter)
3
+ */
4
+
5
+ /**
6
+ * Validate JSON string (Sync)
7
+ * @param {string} jsonString
8
+ * @returns {boolean} True if valid, throws error otherwise
9
+ */
10
+ export function validateJsonStringSync(jsonString) {
11
+ if (typeof jsonString !== 'string') {
12
+ throw new Error("Input must be a string.");
13
+ }
14
+ try {
15
+ JSON.parse(jsonString);
16
+ return true;
17
+ } catch (e) {
18
+ throw new Error(`Invalid JSON: ${e.message}`);
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Validate JSON string (Async)
24
+ * @param {string} jsonString
25
+ * @returns {Promise<boolean>} True if valid
26
+ */
27
+ export async function validateJsonString(jsonString) {
28
+ return validateJsonStringSync(jsonString);
29
+ }