11// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
2- // Also based on https://github.com/bitinn/node-fetch/blob/v2.5.0/src/blob.js
32// (MIT licensed)
43
54const Stream = require ( 'stream' ) ;
6- const Readable = Stream . Readable ;
5+
6+ // Fix for "Readable" isn't a named export issue
7+ const { Readable} = Stream ;
78
89const BUFFER = Symbol ( 'buffer' ) ;
910const TYPE = Symbol ( 'type' ) ;
1011
1112class Blob {
12- constructor ( ) {
13+ constructor ( ... args ) {
1314 this [ TYPE ] = '' ;
1415
15- const blobParts = arguments [ 0 ] ;
16- const options = arguments [ 1 ] ;
16+ const blobParts = args [ 0 ] ;
17+ const options = args [ 1 ] ;
1718
1819 const buffers = [ ] ;
20+ /* eslint-disable-next-line no-unused-vars */
1921 let size = 0 ;
2022
2123 if ( blobParts ) {
22- const a = blobParts ;
23- const length = Number ( a . length ) ;
24- for ( let i = 0 ; i < length ; i ++ ) {
25- const element = a [ i ] ;
24+ blobParts . forEach ( element => {
2625 let buffer ;
2726 if ( element instanceof Buffer ) {
2827 buffer = element ;
@@ -35,81 +34,95 @@ class Blob {
3534 } else {
3635 buffer = Buffer . from ( typeof element === 'string' ? element : String ( element ) ) ;
3736 }
37+
3838 size += buffer . length ;
3939 buffers . push ( buffer ) ;
40- }
40+ } ) ;
4141 }
4242
4343 this [ BUFFER ] = Buffer . concat ( buffers ) ;
4444
45- let type = options &&
46- options . type !== undefined &&
47- String ( options . type ) . toLowerCase ( ) ;
45+ const type = options && options . type !== undefined && String ( options . type ) . toLowerCase ( ) ;
4846 if ( type && ! / [ ^ \u0020 - \u007E ] / . test ( type ) ) {
4947 this [ TYPE ] = type ;
5048 }
49+
50+ if ( options && Buffer . isBuffer ( options . buffer ) ) {
51+ this [ BUFFER ] = options . buffer ;
52+ }
5153 }
54+
5255 get size ( ) {
5356 return this [ BUFFER ] . length ;
5457 }
58+
5559 get type ( ) {
5660 return this [ TYPE ] ;
5761 }
62+
5863 text ( ) {
59- return Promise . resolve ( this [ BUFFER ] . toString ( ) )
64+ return Promise . resolve ( this [ BUFFER ] . toString ( ) ) ;
6065 }
66+
6167 arrayBuffer ( ) {
6268 const buf = this [ BUFFER ] ;
6369 const ab = buf . buffer . slice ( buf . byteOffset , buf . byteOffset + buf . byteLength ) ;
6470 return Promise . resolve ( ab ) ;
6571 }
72+
6673 stream ( ) {
6774 const readable = new Readable ( ) ;
68- readable . _read = ( ) => { } ;
75+ readable . _read = ( ) => { } ;
6976 readable . push ( this [ BUFFER ] ) ;
7077 readable . push ( null ) ;
7178 return readable ;
7279 }
80+
7381 toString ( ) {
74- return '[object Blob]'
82+ return '[object Blob]' ;
7583 }
76- slice ( ) {
77- const size = this . size ;
7884
79- const start = arguments [ 0 ] ;
80- const end = arguments [ 1 ] ;
81- let relativeStart , relativeEnd ;
85+ slice ( ...args ) {
86+ const { size} = this ;
87+
88+ const start = args [ 0 ] ;
89+ const end = args [ 1 ] ;
90+ let relativeStart ;
91+ let relativeEnd ;
92+
8293 if ( start === undefined ) {
8394 relativeStart = 0 ;
8495 } else if ( start < 0 ) {
8596 relativeStart = Math . max ( size + start , 0 ) ;
8697 } else {
8798 relativeStart = Math . min ( start , size ) ;
8899 }
100+
89101 if ( end === undefined ) {
90102 relativeEnd = size ;
91103 } else if ( end < 0 ) {
92104 relativeEnd = Math . max ( size + end , 0 ) ;
93105 } else {
94106 relativeEnd = Math . min ( end , size ) ;
95107 }
108+
96109 const span = Math . max ( relativeEnd - relativeStart , 0 ) ;
97110
98111 const buffer = this [ BUFFER ] ;
99112 const slicedBuffer = buffer . slice (
100113 relativeStart ,
101114 relativeStart + span
102115 ) ;
103- const blob = new Blob ( [ ] , { type : arguments [ 2 ] } ) ;
116+ const blob = new Blob ( [ ] , { type : args [ 2 ] } ) ;
104117 blob [ BUFFER ] = slicedBuffer ;
105118 return blob ;
106119 }
107120}
108121
109122Object . defineProperties ( Blob . prototype , {
110- size : { enumerable : true } ,
111- type : { enumerable : true } ,
112- slice : { enumerable : true }
123+ size : { enumerable : true } ,
124+ type : { enumerable : true } ,
125+ slice : { enumerable : true }
113126} ) ;
114127
115128Object . defineProperty ( Blob . prototype , Symbol . toStringTag , {
0 commit comments