1- import fs , { promises as fsPromises } from 'node:fs' ;
1+ import process from 'node:process' ;
2+ import fs from 'node:fs' ;
3+ import fsPromises from 'node:fs/promises' ;
24import chalk from 'chalk' ;
35import Jimp from 'jimp' ;
46import termImg from 'term-img' ;
57import renderGif from 'render-gif' ;
68import logUpdate from 'log-update' ;
9+ import { imageDimensionsFromData } from 'image-dimensions' ;
710
811// `log-update` adds an extra newline so the generated frames need to be 2 pixels shorter.
912const ROW_OFFSET = 2 ;
@@ -68,7 +71,7 @@ function calculateWidthHeight(imageWidth, imageHeight, inputWidth, inputHeight,
6871}
6972
7073async function render ( buffer , { width : inputWidth , height : inputHeight , preserveAspectRatio} ) {
71- const image = await Jimp . read ( buffer ) ;
74+ const image = await Jimp . read ( Buffer . from ( buffer ) ) ;
7275 const { bitmap} = image ;
7376
7477 const { width, height} = calculateWidthHeight ( bitmap . width , bitmap . height , inputWidth , inputHeight , preserveAspectRatio ) ;
@@ -91,13 +94,11 @@ async function render(buffer, {width: inputWidth, height: inputHeight, preserveA
9194
9295const terminalImage = { } ;
9396
94- terminalImage . buffer = async ( buffer , { width = '100%' , height = '100%' , preserveAspectRatio = true } = { } ) => {
95- return termImg ( buffer , {
96- width,
97- height,
98- fallback : ( ) => render ( buffer , { height, width, preserveAspectRatio} )
99- } ) ;
100- } ;
97+ terminalImage . buffer = async ( buffer , { width = '100%' , height = '100%' , preserveAspectRatio = true } = { } ) => termImg ( buffer , {
98+ width,
99+ height,
100+ fallback : ( ) => render ( buffer , { height, width, preserveAspectRatio} ) ,
101+ } ) ;
101102
102103terminalImage . file = async ( filePath , options = { } ) =>
103104 terminalImage . buffer ( await fsPromises . readFile ( filePath ) , options ) ;
@@ -106,19 +107,22 @@ terminalImage.gifBuffer = (buffer, options = {}) => {
106107 options = {
107108 renderFrame : logUpdate ,
108109 maximumFrameRate : 30 ,
109- ...options
110+ ...options ,
110111 } ;
111112
112113 const finalize = ( ) => {
113- if ( options . renderFrame . done ) {
114- options . renderFrame . done ( ) ;
115- }
114+ options . renderFrame . done ?. ( ) ;
116115 } ;
117116
117+ const dimensions = imageDimensionsFromData ( buffer ) ;
118+ if ( dimensions ?. width < 2 || dimensions ?. width < 2 ) {
119+ throw new Error ( 'The image is too small to be rendered.' ) ;
120+ }
121+
118122 const result = termImg ( buffer , {
119123 width : options . width ,
120124 height : options . height ,
121- fallback : ( ) => false
125+ fallback : ( ) => false ,
122126 } ) ;
123127
124128 if ( result ) {
@@ -127,7 +131,7 @@ terminalImage.gifBuffer = (buffer, options = {}) => {
127131 }
128132
129133 const animation = renderGif ( buffer , async frameData => {
130- options . renderFrame ( await terminalImage . buffer ( Buffer . from ( frameData ) , options ) ) ;
134+ options . renderFrame ( await terminalImage . buffer ( frameData , options ) ) ;
131135 } , options ) ;
132136
133137 return ( ) => {
0 commit comments