imapflow 1.0.172 → 1.0.173

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.0.173](https://github.com/postalsys/imapflow/compare/v1.0.172...v1.0.173) (2025-01-08)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **bodystructure:** Handle invalid BODYSTRUCTURE from Bluemind mail server ([b63f861](https://github.com/postalsys/imapflow/commit/b63f861f2894d0a34583ad9ff512ef5071f63228))
9
+
3
10
  ## [1.0.172](https://github.com/postalsys/imapflow/compare/v1.0.171...v1.0.172) (2025-01-03)
4
11
 
5
12
 
package/lib/tools.js CHANGED
@@ -10,7 +10,7 @@ const iconv = require('iconv-lite');
10
10
 
11
11
  const FLAG_COLORS = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'grey'];
12
12
 
13
- module.exports = {
13
+ const tools = {
14
14
  encodePath(connection, path) {
15
15
  path = (path || '').toString();
16
16
  if (!connection.enabled.has('UTF8=ACCEPT') && /[&\x00-\x08\x0b-\x0c\x0e-\x1f\u0080-\uffff]/.test(path)) {
@@ -57,7 +57,7 @@ module.exports = {
57
57
  if (!a || !b) {
58
58
  return false;
59
59
  }
60
- return module.exports.normalizePath(connection, a) === module.exports.normalizePath(connection, b);
60
+ return tools.normalizePath(connection, a) === tools.normalizePath(connection, b);
61
61
  },
62
62
 
63
63
  updateCapabilities(list) {
@@ -336,11 +336,11 @@ module.exports = {
336
336
  break;
337
337
 
338
338
  case 'envelope':
339
- map.envelope = module.exports.parseEnvelope(attribute);
339
+ map.envelope = tools.parseEnvelope(attribute);
340
340
  break;
341
341
 
342
342
  case 'bodystructure':
343
- map.bodyStructure = module.exports.parseBodystructure(attribute);
343
+ map.bodyStructure = tools.parseBodystructure(attribute);
344
344
  break;
345
345
 
346
346
  case 'internaldate': {
@@ -398,7 +398,7 @@ module.exports = {
398
398
  }
399
399
 
400
400
  if (map.flags) {
401
- let flagColor = module.exports.getFlagColor(map.flags);
401
+ let flagColor = tools.getFlagColor(map.flags);
402
402
  if (flagColor) {
403
403
  map.flagColor = flagColor;
404
404
  }
@@ -438,7 +438,7 @@ module.exports = {
438
438
  address = '';
439
439
  }
440
440
  return {
441
- name: module.exports.processName(libmime.decodeWords(getStrValue(addr[0]))),
441
+ name: tools.processName(libmime.decodeWords(getStrValue(addr[0]))),
442
442
  address
443
443
  };
444
444
  })
@@ -609,7 +609,7 @@ module.exports = {
609
609
  // body parameter parenthesized list
610
610
  if (i < node.length - 1) {
611
611
  if (node[i]) {
612
- curNode.parameters = this.getStructuredParams(node[i]);
612
+ curNode.parameters = tools.getStructuredParams(node[i]);
613
613
  }
614
614
  i++;
615
615
  }
@@ -619,7 +619,7 @@ module.exports = {
619
619
 
620
620
  // body parameter parenthesized list
621
621
  if (node[i]) {
622
- curNode.parameters = this.getStructuredParams(node[i]);
622
+ curNode.parameters = tools.getStructuredParams(node[i]);
623
623
  }
624
624
  i++;
625
625
 
@@ -652,7 +652,7 @@ module.exports = {
652
652
 
653
653
  // envelope
654
654
  if (node[i]) {
655
- curNode.envelope = module.exports.parseEnvelope([].concat(node[i] || []));
655
+ curNode.envelope = tools.parseEnvelope([].concat(node[i] || []));
656
656
  }
657
657
  i++;
658
658
 
@@ -671,14 +671,23 @@ module.exports = {
671
671
  curNode.lineCount = Number((node[i] || {}).value || 0) || 0;
672
672
  }
673
673
  i++;
674
- } else if (/^text\//.test(curNode.type)) {
675
- // text/* adds additional line count values
674
+ }
676
675
 
677
- // line count
678
- if (node[i]) {
679
- curNode.lineCount = Number((node[i] || {}).value || 0) || 0;
676
+ if (/^text\//.test(curNode.type)) {
677
+ // text/* adds additional line count value
678
+
679
+ // NB! some less known servers do not include the line count value
680
+ // length should be 12+
681
+ if (node.length === 11 && Array.isArray(node[i + 1]) && !Array.isArray(node[i + 2])) {
682
+ // invalid structure, disposition params are shifted
683
+ } else {
684
+ // correct structure, line count number is provided
685
+ if (node[i]) {
686
+ // line count
687
+ curNode.lineCount = Number((node[i] || {}).value || 0) || 0;
688
+ }
689
+ i++;
680
690
  }
681
- i++;
682
691
  }
683
692
 
684
693
  // extension data (not available for BODY requests)
@@ -700,7 +709,7 @@ module.exports = {
700
709
  if (Array.isArray(node[i]) && node[i].length) {
701
710
  curNode.disposition = ((node[i][0] || {}).value || '').toString().toLowerCase();
702
711
  if (Array.isArray(node[i][1])) {
703
- curNode.dispositionParameters = this.getStructuredParams(node[i][1]);
712
+ curNode.dispositionParameters = tools.getStructuredParams(node[i][1]);
704
713
  }
705
714
  }
706
715
  i++;
@@ -762,7 +771,7 @@ module.exports = {
762
771
  return;
763
772
  }
764
773
 
765
- let dateStr = module.exports.formatDate(value).replace(/^0/, ''); //starts with date-day-fixed with leading 0 replaced by SP
774
+ let dateStr = tools.formatDate(value).replace(/^0/, ''); //starts with date-day-fixed with leading 0 replaced by SP
766
775
  let timeStr = value.toISOString().substr(11, 8);
767
776
 
768
777
  return `${dateStr} ${timeStr} +0000`;
@@ -856,3 +865,5 @@ module.exports = {
856
865
  return result.join(',');
857
866
  }
858
867
  };
868
+
869
+ module.exports = tools;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "imapflow",
3
- "version": "1.0.172",
3
+ "version": "1.0.173",
4
4
  "description": "IMAP Client for Node",
5
5
  "main": "./lib/imap-flow.js",
6
6
  "scripts": {
@@ -0,0 +1,994 @@
1
+ 'use strict';
2
+
3
+ const { parseBodystructure } = require('../lib/tools');
4
+
5
+ module.exports['Process correct TEXT with line count'] = test => {
6
+ let attribute = [
7
+ [
8
+ [
9
+ {
10
+ type: 'STRING',
11
+ value: 'text'
12
+ },
13
+ {
14
+ type: 'STRING',
15
+ value: 'plain'
16
+ },
17
+ [
18
+ {
19
+ type: 'STRING',
20
+ value: 'charset'
21
+ },
22
+ {
23
+ type: 'STRING',
24
+ value: 'UTF-8'
25
+ }
26
+ ],
27
+ null,
28
+ null,
29
+ {
30
+ type: 'STRING',
31
+ value: '7bit'
32
+ },
33
+ {
34
+ type: 'ATOM',
35
+ value: '23'
36
+ },
37
+ {
38
+ type: 'ATOM',
39
+ value: '1'
40
+ },
41
+ null,
42
+ null,
43
+ null,
44
+ null
45
+ ],
46
+ [
47
+ {
48
+ type: 'STRING',
49
+ value: 'text'
50
+ },
51
+ {
52
+ type: 'STRING',
53
+ value: 'html'
54
+ },
55
+ [
56
+ {
57
+ type: 'STRING',
58
+ value: 'charset'
59
+ },
60
+ {
61
+ type: 'STRING',
62
+ value: 'UTF-8'
63
+ }
64
+ ],
65
+ null,
66
+ null,
67
+ {
68
+ type: 'STRING',
69
+ value: '7bit'
70
+ },
71
+ {
72
+ type: 'ATOM',
73
+ value: '49'
74
+ },
75
+ {
76
+ type: 'ATOM',
77
+ value: '1'
78
+ },
79
+ null,
80
+ null,
81
+ null,
82
+ null
83
+ ],
84
+ {
85
+ type: 'STRING',
86
+ value: 'alternative'
87
+ },
88
+ [
89
+ {
90
+ type: 'STRING',
91
+ value: 'boundary'
92
+ },
93
+ {
94
+ type: 'STRING',
95
+ value: '000000000000b56402062b1fba83'
96
+ }
97
+ ],
98
+ null,
99
+ null,
100
+ null
101
+ ],
102
+ [
103
+ {
104
+ type: 'STRING',
105
+ value: 'text'
106
+ },
107
+ {
108
+ type: 'STRING',
109
+ value: 'plain'
110
+ },
111
+ [
112
+ {
113
+ type: 'STRING',
114
+ value: 'charset'
115
+ },
116
+ {
117
+ type: 'STRING',
118
+ value: 'US-ASCII'
119
+ },
120
+ {
121
+ type: 'STRING',
122
+ value: 'name'
123
+ },
124
+ {
125
+ type: 'STRING',
126
+ value: 'log_imap_missing_attachments.txt'
127
+ }
128
+ ],
129
+ {
130
+ type: 'STRING',
131
+ value: '<f_m5mnf91y1>'
132
+ },
133
+ null,
134
+ {
135
+ type: 'STRING',
136
+ value: 'base64'
137
+ },
138
+ {
139
+ type: 'ATOM',
140
+ value: '33954'
141
+ },
142
+ {
143
+ type: 'ATOM',
144
+ value: '435'
145
+ },
146
+ null,
147
+ [
148
+ {
149
+ type: 'STRING',
150
+ value: 'attachment'
151
+ },
152
+ [
153
+ {
154
+ type: 'STRING',
155
+ value: 'filename'
156
+ },
157
+ {
158
+ type: 'STRING',
159
+ value: 'log_imap_missing_attachments.txt'
160
+ }
161
+ ]
162
+ ],
163
+ null,
164
+ null
165
+ ],
166
+ [
167
+ {
168
+ type: 'STRING',
169
+ value: 'image'
170
+ },
171
+ {
172
+ type: 'STRING',
173
+ value: 'jpeg'
174
+ },
175
+ [
176
+ {
177
+ type: 'STRING',
178
+ value: 'name'
179
+ },
180
+ {
181
+ type: 'STRING',
182
+ value: 'img2.jpeg'
183
+ }
184
+ ],
185
+ {
186
+ type: 'STRING',
187
+ value: '<f_m5mnf4c70>'
188
+ },
189
+ null,
190
+ {
191
+ type: 'STRING',
192
+ value: 'base64'
193
+ },
194
+ {
195
+ type: 'ATOM',
196
+ value: '3776960'
197
+ },
198
+ null,
199
+ [
200
+ {
201
+ type: 'STRING',
202
+ value: 'attachment'
203
+ },
204
+ [
205
+ {
206
+ type: 'STRING',
207
+ value: 'filename'
208
+ },
209
+ {
210
+ type: 'STRING',
211
+ value: 'img2.jpeg'
212
+ }
213
+ ]
214
+ ],
215
+ null,
216
+ null
217
+ ],
218
+ {
219
+ type: 'STRING',
220
+ value: 'mixed'
221
+ },
222
+ [
223
+ {
224
+ type: 'STRING',
225
+ value: 'boundary'
226
+ },
227
+ {
228
+ type: 'STRING',
229
+ value: '000000000000b56402062b1fba85'
230
+ }
231
+ ],
232
+ null,
233
+ null,
234
+ null
235
+ ];
236
+
237
+ attribute = [
238
+ [
239
+ [
240
+ {
241
+ type: 'STRING',
242
+ value: 'text'
243
+ },
244
+ {
245
+ type: 'STRING',
246
+ value: 'plain'
247
+ },
248
+ [
249
+ {
250
+ type: 'STRING',
251
+ value: 'charset'
252
+ },
253
+ {
254
+ type: 'STRING',
255
+ value: 'UTF-8'
256
+ }
257
+ ],
258
+ null,
259
+ null,
260
+ {
261
+ type: 'STRING',
262
+ value: '7bit'
263
+ },
264
+ {
265
+ type: 'ATOM',
266
+ value: '23'
267
+ },
268
+ {
269
+ type: 'ATOM',
270
+ value: '1'
271
+ },
272
+ null,
273
+ null,
274
+ null,
275
+ null
276
+ ],
277
+ [
278
+ {
279
+ type: 'STRING',
280
+ value: 'text'
281
+ },
282
+ {
283
+ type: 'STRING',
284
+ value: 'html'
285
+ },
286
+ [
287
+ {
288
+ type: 'STRING',
289
+ value: 'charset'
290
+ },
291
+ {
292
+ type: 'STRING',
293
+ value: 'UTF-8'
294
+ }
295
+ ],
296
+ null,
297
+ null,
298
+ {
299
+ type: 'STRING',
300
+ value: '7bit'
301
+ },
302
+ {
303
+ type: 'ATOM',
304
+ value: '49'
305
+ },
306
+ {
307
+ type: 'ATOM',
308
+ value: '1'
309
+ },
310
+ null,
311
+ null,
312
+ null,
313
+ null
314
+ ],
315
+ {
316
+ type: 'STRING',
317
+ value: 'alternative'
318
+ },
319
+ [
320
+ {
321
+ type: 'STRING',
322
+ value: 'boundary'
323
+ },
324
+ {
325
+ type: 'STRING',
326
+ value: '000000000000b56402062b1fba83'
327
+ }
328
+ ],
329
+ null,
330
+ null,
331
+ null
332
+ ],
333
+ [
334
+ {
335
+ type: 'STRING',
336
+ value: 'text'
337
+ },
338
+ {
339
+ type: 'STRING',
340
+ value: 'plain'
341
+ },
342
+ [
343
+ {
344
+ type: 'STRING',
345
+ value: 'charset'
346
+ },
347
+ {
348
+ type: 'STRING',
349
+ value: 'US-ASCII'
350
+ },
351
+ {
352
+ type: 'STRING',
353
+ value: 'name'
354
+ },
355
+ {
356
+ type: 'STRING',
357
+ value: 'log_imap_missing_attachments.txt'
358
+ }
359
+ ],
360
+ {
361
+ type: 'STRING',
362
+ value: '<f_m5mnf91y1>'
363
+ },
364
+ null,
365
+ {
366
+ type: 'STRING',
367
+ value: 'base64'
368
+ },
369
+ {
370
+ type: 'ATOM',
371
+ value: '33954'
372
+ },
373
+ {
374
+ type: 'ATOM',
375
+ value: '435'
376
+ },
377
+ null,
378
+ [
379
+ {
380
+ type: 'STRING',
381
+ value: 'attachment'
382
+ },
383
+ [
384
+ {
385
+ type: 'STRING',
386
+ value: 'filename'
387
+ },
388
+ {
389
+ type: 'STRING',
390
+ value: 'log_imap_missing_attachments.txt'
391
+ }
392
+ ]
393
+ ],
394
+ null,
395
+ null
396
+ ],
397
+ [
398
+ {
399
+ type: 'STRING',
400
+ value: 'image'
401
+ },
402
+ {
403
+ type: 'STRING',
404
+ value: 'jpeg'
405
+ },
406
+ [
407
+ {
408
+ type: 'STRING',
409
+ value: 'name'
410
+ },
411
+ {
412
+ type: 'STRING',
413
+ value: 'img2.jpeg'
414
+ }
415
+ ],
416
+ {
417
+ type: 'STRING',
418
+ value: '<f_m5mnf4c70>'
419
+ },
420
+ null,
421
+ {
422
+ type: 'STRING',
423
+ value: 'base64'
424
+ },
425
+ {
426
+ type: 'ATOM',
427
+ value: '3776960'
428
+ },
429
+ null,
430
+ [
431
+ {
432
+ type: 'STRING',
433
+ value: 'attachment'
434
+ },
435
+ [
436
+ {
437
+ type: 'STRING',
438
+ value: 'filename'
439
+ },
440
+ {
441
+ type: 'STRING',
442
+ value: 'img2.jpeg'
443
+ }
444
+ ]
445
+ ],
446
+ null,
447
+ null
448
+ ],
449
+ {
450
+ type: 'STRING',
451
+ value: 'mixed'
452
+ },
453
+ [
454
+ {
455
+ type: 'STRING',
456
+ value: 'boundary'
457
+ },
458
+ {
459
+ type: 'STRING',
460
+ value: '000000000000b56402062b1fba85'
461
+ }
462
+ ],
463
+ null,
464
+ null,
465
+ null
466
+ ];
467
+
468
+ let bodyStruct = parseBodystructure(attribute);
469
+
470
+ test.deepEqual(bodyStruct, {
471
+ childNodes: [
472
+ {
473
+ part: '1',
474
+ childNodes: [
475
+ {
476
+ part: '1.1',
477
+ type: 'text/plain',
478
+ parameters: {
479
+ charset: 'UTF-8'
480
+ },
481
+ encoding: '7bit',
482
+ size: 23,
483
+ lineCount: 1
484
+ },
485
+ {
486
+ part: '1.2',
487
+ type: 'text/html',
488
+ parameters: {
489
+ charset: 'UTF-8'
490
+ },
491
+ encoding: '7bit',
492
+ size: 49,
493
+ lineCount: 1
494
+ }
495
+ ],
496
+ type: 'multipart/alternative',
497
+ parameters: {
498
+ boundary: '000000000000b56402062b1fba83'
499
+ }
500
+ },
501
+ {
502
+ part: '2',
503
+ type: 'text/plain',
504
+ parameters: {
505
+ charset: 'US-ASCII',
506
+ name: 'log_imap_missing_attachments.txt'
507
+ },
508
+ id: '<f_m5mnf91y1>',
509
+ encoding: 'base64',
510
+ size: 33954,
511
+ lineCount: 435,
512
+ disposition: 'attachment',
513
+ dispositionParameters: {
514
+ filename: 'log_imap_missing_attachments.txt'
515
+ }
516
+ },
517
+ {
518
+ part: '3',
519
+ type: 'image/jpeg',
520
+ parameters: {
521
+ name: 'img2.jpeg'
522
+ },
523
+ id: '<f_m5mnf4c70>',
524
+ encoding: 'base64',
525
+ size: 3776960,
526
+ disposition: 'attachment',
527
+ dispositionParameters: {
528
+ filename: 'img2.jpeg'
529
+ }
530
+ }
531
+ ],
532
+ type: 'multipart/mixed',
533
+ parameters: {
534
+ boundary: '000000000000b56402062b1fba85'
535
+ }
536
+ });
537
+ test.done();
538
+ };
539
+
540
+ module.exports['Process invalid TEXT without line count'] = test => {
541
+ let attribute = [
542
+ [
543
+ [
544
+ {
545
+ type: 'STRING',
546
+ value: 'TEXT'
547
+ },
548
+ {
549
+ type: 'STRING',
550
+ value: 'PLAIN'
551
+ },
552
+ [
553
+ {
554
+ type: 'STRING',
555
+ value: 'CHARSET'
556
+ },
557
+ {
558
+ type: 'STRING',
559
+ value: 'UTF-8'
560
+ }
561
+ ],
562
+ null,
563
+ null,
564
+ {
565
+ type: 'STRING',
566
+ value: '7bit'
567
+ },
568
+ {
569
+ type: 'ATOM',
570
+ value: '2'
571
+ },
572
+ null,
573
+ null,
574
+ null,
575
+ null,
576
+ null
577
+ ],
578
+ [
579
+ {
580
+ type: 'STRING',
581
+ value: 'TEXT'
582
+ },
583
+ {
584
+ type: 'STRING',
585
+ value: 'HTML'
586
+ },
587
+ [
588
+ {
589
+ type: 'STRING',
590
+ value: 'CHARSET'
591
+ },
592
+ {
593
+ type: 'STRING',
594
+ value: 'UTF-8'
595
+ }
596
+ ],
597
+ null,
598
+ null,
599
+ {
600
+ type: 'STRING',
601
+ value: '7bit'
602
+ },
603
+ {
604
+ type: 'ATOM',
605
+ value: '27'
606
+ },
607
+ null,
608
+ null,
609
+ null,
610
+ null,
611
+ null
612
+ ],
613
+ {
614
+ type: 'STRING',
615
+ value: 'ALTERNATIVE'
616
+ },
617
+ [
618
+ {
619
+ type: 'ATOM',
620
+ value: 'BOUNDARY'
621
+ },
622
+ {
623
+ type: 'STRING',
624
+ value: '-=Part.1=-'
625
+ }
626
+ ],
627
+ null,
628
+ null,
629
+ null
630
+ ],
631
+ [
632
+ {
633
+ type: 'STRING',
634
+ value: 'TEXT'
635
+ },
636
+ {
637
+ type: 'STRING',
638
+ value: 'PLAIN'
639
+ },
640
+ [
641
+ {
642
+ type: 'STRING',
643
+ value: 'CHARSET'
644
+ },
645
+ {
646
+ type: 'STRING',
647
+ value: 'US-ASCII'
648
+ }
649
+ ],
650
+ {
651
+ type: 'STRING',
652
+ value: '<f_m5mjjzj32>'
653
+ },
654
+ null,
655
+ {
656
+ type: 'STRING',
657
+ value: 'base64'
658
+ },
659
+ {
660
+ type: 'ATOM',
661
+ value: '49'
662
+ },
663
+ null,
664
+ [
665
+ {
666
+ type: 'STRING',
667
+ value: 'ATTACHMENT'
668
+ },
669
+ [
670
+ {
671
+ type: 'STRING',
672
+ value: 'FILENAME'
673
+ },
674
+ {
675
+ type: 'STRING',
676
+ value: 'logs.txt'
677
+ }
678
+ ]
679
+ ],
680
+ null,
681
+ null
682
+ ],
683
+ [
684
+ {
685
+ type: 'STRING',
686
+ value: 'TEXT'
687
+ },
688
+ {
689
+ type: 'STRING',
690
+ value: 'HTML'
691
+ },
692
+ [
693
+ {
694
+ type: 'STRING',
695
+ value: 'CHARSET'
696
+ },
697
+ {
698
+ type: 'STRING',
699
+ value: 'US-ASCII'
700
+ }
701
+ ],
702
+ {
703
+ type: 'STRING',
704
+ value: '<f_m5mjjziw1>'
705
+ },
706
+ null,
707
+ {
708
+ type: 'STRING',
709
+ value: 'base64'
710
+ },
711
+ {
712
+ type: 'ATOM',
713
+ value: '4437'
714
+ },
715
+ null,
716
+ [
717
+ {
718
+ type: 'STRING',
719
+ value: 'ATTACHMENT'
720
+ },
721
+ [
722
+ {
723
+ type: 'STRING',
724
+ value: 'FILENAME'
725
+ },
726
+ {
727
+ type: 'STRING',
728
+ value: 'TITI.html'
729
+ }
730
+ ]
731
+ ],
732
+ null,
733
+ null
734
+ ],
735
+ [
736
+ {
737
+ type: 'STRING',
738
+ value: 'IMAGE'
739
+ },
740
+ {
741
+ type: 'STRING',
742
+ value: 'PNG'
743
+ },
744
+ null,
745
+ {
746
+ type: 'STRING',
747
+ value: '<f_m5mjjzih0>'
748
+ },
749
+ null,
750
+ {
751
+ type: 'STRING',
752
+ value: 'base64'
753
+ },
754
+ {
755
+ type: 'ATOM',
756
+ value: '32085'
757
+ },
758
+ null,
759
+ [
760
+ {
761
+ type: 'STRING',
762
+ value: 'ATTACHMENT'
763
+ },
764
+ [
765
+ {
766
+ type: 'STRING',
767
+ value: 'FILENAME'
768
+ },
769
+ {
770
+ type: 'STRING',
771
+ value: 'Logo-google-icon-PNG.png'
772
+ }
773
+ ]
774
+ ],
775
+ null,
776
+ null
777
+ ],
778
+ [
779
+ {
780
+ type: 'STRING',
781
+ value: 'APPLICATION'
782
+ },
783
+ {
784
+ type: 'STRING',
785
+ value: 'OCTET-STREAM'
786
+ },
787
+ null,
788
+ {
789
+ type: 'STRING',
790
+ value: '<f_m5mjjzjb3>'
791
+ },
792
+ null,
793
+ {
794
+ type: 'STRING',
795
+ value: 'base64'
796
+ },
797
+ {
798
+ type: 'ATOM',
799
+ value: '354150'
800
+ },
801
+ null,
802
+ [
803
+ {
804
+ type: 'STRING',
805
+ value: 'ATTACHMENT'
806
+ },
807
+ [
808
+ {
809
+ type: 'STRING',
810
+ value: 'FILENAME'
811
+ },
812
+ {
813
+ type: 'STRING',
814
+ value: 'logs_not_txt'
815
+ }
816
+ ]
817
+ ],
818
+ null,
819
+ null
820
+ ],
821
+ [
822
+ {
823
+ type: 'STRING',
824
+ value: 'TEXT'
825
+ },
826
+ {
827
+ type: 'STRING',
828
+ value: 'MARKDOWN'
829
+ },
830
+ [
831
+ {
832
+ type: 'STRING',
833
+ value: 'CHARSET'
834
+ },
835
+ {
836
+ type: 'STRING',
837
+ value: 'UTF-8'
838
+ }
839
+ ],
840
+ {
841
+ type: 'STRING',
842
+ value: '<f_m5mjk5le4>'
843
+ },
844
+ null,
845
+ {
846
+ type: 'STRING',
847
+ value: 'base64'
848
+ },
849
+ {
850
+ type: 'ATOM',
851
+ value: '21064'
852
+ },
853
+ null,
854
+ [
855
+ {
856
+ type: 'STRING',
857
+ value: 'ATTACHMENT'
858
+ },
859
+ [
860
+ {
861
+ type: 'STRING',
862
+ value: 'FILENAME'
863
+ },
864
+ {
865
+ type: 'STRING',
866
+ value: 'README.md'
867
+ }
868
+ ]
869
+ ],
870
+ null,
871
+ null
872
+ ],
873
+ {
874
+ type: 'STRING',
875
+ value: 'MIXED'
876
+ },
877
+ [
878
+ {
879
+ type: 'ATOM',
880
+ value: 'BOUNDARY'
881
+ },
882
+ {
883
+ type: 'STRING',
884
+ value: '-=Part.TEXT=-'
885
+ }
886
+ ],
887
+ null,
888
+ null,
889
+ null
890
+ ];
891
+
892
+ let bodyStruct = parseBodystructure(attribute);
893
+
894
+ test.deepEqual(bodyStruct, {
895
+ childNodes: [
896
+ {
897
+ part: '1',
898
+ childNodes: [
899
+ {
900
+ part: '1.1',
901
+ type: 'text/plain',
902
+ parameters: {
903
+ charset: 'UTF-8'
904
+ },
905
+ encoding: '7bit',
906
+ size: 2
907
+ },
908
+ {
909
+ part: '1.2',
910
+ type: 'text/html',
911
+ parameters: {
912
+ charset: 'UTF-8'
913
+ },
914
+ encoding: '7bit',
915
+ size: 27
916
+ }
917
+ ],
918
+ type: 'multipart/alternative',
919
+ parameters: {
920
+ boundary: '-=Part.1=-'
921
+ }
922
+ },
923
+ {
924
+ part: '2',
925
+ type: 'text/plain',
926
+ parameters: {
927
+ charset: 'US-ASCII'
928
+ },
929
+ id: '<f_m5mjjzj32>',
930
+ encoding: 'base64',
931
+ size: 49,
932
+ disposition: 'attachment',
933
+ dispositionParameters: {
934
+ filename: 'logs.txt'
935
+ }
936
+ },
937
+ {
938
+ part: '3',
939
+ type: 'text/html',
940
+ parameters: {
941
+ charset: 'US-ASCII'
942
+ },
943
+ id: '<f_m5mjjziw1>',
944
+ encoding: 'base64',
945
+ size: 4437,
946
+ disposition: 'attachment',
947
+ dispositionParameters: {
948
+ filename: 'TITI.html'
949
+ }
950
+ },
951
+ {
952
+ part: '4',
953
+ type: 'image/png',
954
+ id: '<f_m5mjjzih0>',
955
+ encoding: 'base64',
956
+ size: 32085,
957
+ disposition: 'attachment',
958
+ dispositionParameters: {
959
+ filename: 'Logo-google-icon-PNG.png'
960
+ }
961
+ },
962
+ {
963
+ part: '5',
964
+ type: 'application/octet-stream',
965
+ id: '<f_m5mjjzjb3>',
966
+ encoding: 'base64',
967
+ size: 354150,
968
+ disposition: 'attachment',
969
+ dispositionParameters: {
970
+ filename: 'logs_not_txt'
971
+ }
972
+ },
973
+ {
974
+ part: '6',
975
+ type: 'text/markdown',
976
+ parameters: {
977
+ charset: 'UTF-8'
978
+ },
979
+ id: '<f_m5mjk5le4>',
980
+ encoding: 'base64',
981
+ size: 21064,
982
+ disposition: 'attachment',
983
+ dispositionParameters: {
984
+ filename: 'README.md'
985
+ }
986
+ }
987
+ ],
988
+ type: 'multipart/mixed',
989
+ parameters: {
990
+ boundary: '-=Part.TEXT=-'
991
+ }
992
+ });
993
+ test.done();
994
+ };