UNPKG

inquirer-file-selector

Version:
2 lines (1 loc) 3.25 kB
import e from"node:path";import{createPrompt as t,useState as i,makeTheme as r,usePrefix as s,useMemo as n,useKeypress as l,isEnterKey as a,isSpaceKey as o,isUpKey as c,isDownKey as d,isBackspaceKey as y,usePagination as f}from"@inquirer/core";import p from"@inquirer/figures";import m from"chalk";import $ from"node:fs";import{stripVTControlCharacters as u}from"node:util";function D(t){return t.endsWith(e.sep)?t:`${t}${e.sep}`}const h={prefix:{idle:m.cyan("?"),done:m.green(p.tick),canceled:m.red(p.cross)},icon:{linePrefix:e=>e?`${p.lineUpRight}${p.line.repeat(2)} `:`${p.lineUpDownRight}${p.line.repeat(2)} `},style:{disabled:e=>m.dim(e),active:e=>m.cyan(e),cancelText:e=>m.red(e),emptyText:e=>m.red(e),directory:e=>m.yellow(e),file:e=>m.white(e),currentDir:e=>m.magenta(e),message:(e,t)=>m.bold(e),help:e=>m.white(e),key:e=>m.cyan(e)}};var b=t(((t,m)=>{const{type:b="file",pageSize:g=10,loop:x=!1,showExcluded:w=!1,disabledLabel:k=" (not allowed)",allowCancel:v=!1,cancelText:T="Canceled.",emptyText:P="Directory is empty."}=t,[S,j]=i("idle"),C=r(h,t.theme),I=s({status:S,theme:C}),[L,U]=i(e.resolve(process.cwd(),t.basePath||".")),q=n((()=>{const i=function(t,i){const r=$.readdirSync(t);return"directory"!==i&&"file+directory"!==i||r.unshift("."),r.map((i=>{const r=e.join(t,i),s=$.statSync(r);return Object.assign(s,{name:i,path:r,isDisabled:!1})}))}(L,b);for(const e of i)e.isDisabled=!!t.filter&&!t.filter(e);return function(e,t){return e.sort(((e,t)=>e.isDisabled&&!t.isDisabled?1:!e.isDisabled&&t.isDisabled||e.isDirectory()&&!t.isDirectory()?-1:!e.isDirectory()&&t.isDirectory()?1:e.name.localeCompare(t.name))).filter((e=>t||!e.isDisabled))}(i,w)}),[L]),z=n((()=>{const e=q.findIndex((e=>!e.isDisabled)),t=q.findLastIndex((e=>!e.isDisabled));return-1===e?{first:0,last:0}:{first:e,last:t}}),[q]),[R,A]=i(z.first),B=q[R];l(((t,i)=>{if(a(t)){if(B.isDisabled||"file"===b&&B.isDirectory()||"directory"===b&&!B.isDirectory())return;j("done"),m(B.path)}else if(o(t)&&B.isDirectory())U(B.path),A(z.first);else if(c(t)||d(t)){if(i.clearLine(0),x||c(t)&&R!==z.first||d(t)&&R!==z.last){const e=c(t)?-1:1;let i=R;do{i=(i+e+q.length)%q.length}while(q[i].isDisabled);A(i)}}else y(t)?(U(e.resolve(L,"..")),A(z.first)):function(e){return"escape"===e.name}(t)&&v&&(j("canceled"),m("canceled"))}));const E=f({items:q,active:R,renderItem({item:e,index:t,isActive:i}){const r=t===q.length-1,s=x?C.icon.linePrefix(!1):C.icon.linePrefix(r),n=e.isDirectory()?`${s}${D(e.name)}`:`${s}${e.name}`;if(e.isDisabled)return C.style.disabled(`${n}${k}`);const l=e.isDirectory()?C.style.directory:C.style.file;return(i?C.style.active:l)(n)},pageSize:g,loop:x}),M=C.style.message(t.message,S);if("canceled"===S)return`${I} ${M} ${C.style.cancelText(T)}`;if("done"===S)return`${I} ${M} ${C.style.answer(B.path)}`;const O=C.style.currentDir(D(L)),W=n((()=>{const e=[`${C.style.key(p.arrowUp+p.arrowDown)} navigate, ${C.style.key("<enter>")} select${v?`, ${C.style.key("<esc>")} cancel`:""}`,`${C.style.key("<space>")} open directory, ${C.style.key("<backspace>")} go back`],t=e.reduce(((e,t)=>Math.max(e,u(t).length)),0);return`${p.lineBold.repeat(t)}\n${e.join("\n")}`}),[]);return`${I} ${M}\n${O}\n${E.length?E:C.style.emptyText(P)}\n${W}[?25l`}));export{b as default};