UNPKG

inquirer-file-selector

Version:
2 lines (1 loc) 5.54 kB
import e,{join as t,basename as i,sep as s}from"node:path";import{createPrompt as r,useState as n,useMemo as l,makeTheme as a,usePrefix as o,useRef as c,useKeypress as d,usePagination as p}from"@inquirer/core";import f from"@inquirer/figures";import h from"chalk";import{readdirSync as u,statSync as m}from"node:fs";const y={Idle:"idle",Done:"done",Canceled:"canceled"},g={File:"file",Directory:"directory"},b={up:["up","w"],down:["down","s"],back:["left","a"],forward:["right","d"],toggle:["space"],confirm:["enter","return"],cancel:["escape"]};function w(e){return e.endsWith(s)?e:`${e}${s}`}function D(e){const t=m(e),s=i(e),r=t.isDirectory();return{displayName:r?w(s):s,name:s,path:e,size:t.size,createdMs:t.birthtimeMs,lastModifiedMs:t.mtimeMs,isDisabled:!1,isDirectory:r,isCwd:!1,isSelected:!1}}function $(e){const{displayName:t,isDisabled:i,isCwd:s,isSelected:r,...n}=e;return n}function k(e,t){return!t||t===g.File&&!e.isDirectory||t===g.Directory&&e.isDirectory}const C={prefix:{idle:h.cyan("?"),done:h.green(f.tick),canceled:h.red(f.cross)},style:{disabled:(e,t)=>h.gray(`${e} ${h.strikethrough(t)}`),active:e=>h.cyan(e),directory:e=>h.yellowBright(e),file:e=>e,currentDir:e=>h.magentaBright(e),message:(e,t)=>h.bold(e),help:e=>h.gray(e),key:e=>h.bgGray.white(` ${e} `),messages:{cancel:e=>h.red(e),empty:e=>h.red(e)}},hierarchySymbols:{branch:f.lineUpDownRight+f.line,leaf:f.lineUpRight+f.line},labels:{keys:{up:`${f.arrowUp}/w`,down:`${f.arrowDown}/s`,back:`${f.arrowLeft}/a`,forward:`${f.arrowRight}/d`,toggle:"␣",confirm:"↵",cancel:"Esc"},hints:{navigate:"{{up}} or {{down}} to navigate",goBack:"{{back}} to go back",goForward:"{{forward}} to open",toggle:"{{toggle}} to select",confirm:"{{confirm}} to confirm",cancel:"{{cancel}} to cancel"},messages:{cancel:"Canceled.",empty:"Directory is empty."}},renderHelp(e,t,i){const s=[];if("header"===e){const e=t;s.push(this.labels.hints.navigate),s.push(this.labels.hints.goBack),e.multiple&&s.push(this.labels.hints.confirm),e.allowCancel&&s.push(this.labels.hints.cancel)}else if("inline"===e){const e=t,r=i;!e.isCwd&&e.isDirectory&&s.push(this.labels.hints.goForward),k(e,r.type)&&(r.multiple?s.push(this.labels.hints.toggle):s.push(this.labels.hints.confirm))}return s.length?this.style.help(`(Press ${s.join(", ")})`):""},renderItem(e,t){const i=t.index===t.items.length-1&&!t.loop?this.hierarchySymbols.leaf:this.hierarchySymbols.branch;if(e.isDisabled)return this.style.disabled(i,e.displayName);const s=e.isDirectory?this.style.directory:this.style.file;let r=(t.isActive?this.style.active:s)(`${i} ${e.displayName}`);if(t.multiple&&(e.isSelected?r+=` ${f.radioOn}`:t.isActive&&k(e,t.type)&&(r+=` ${f.radioOff}`)),t.isActive){r+=` ${this.renderHelp("inline",e,{type:t.type,multiple:t.multiple})}`}return r}};function v(i){return r(((i,s)=>{const{multiple:r=!1,pageSize:f=10,loop:h=!1,filter:m=()=>!0,showExcluded:v=!1,allowCancel:S=!1}=i,[x,I]=n(y.Idle),O=l((()=>function(e,t){const i={...e,...t},s={};for(const[e,t]of Object.entries(i))s[`is${r=e,r.charAt(0).toUpperCase()+r.slice(1)}`]=e=>t.includes(e.name);var r;return s}(b,i.keybinds)),[]),U=l((()=>{const e=a(C,i.theme);return function(e){const t=e.style,i=e.labels.keys,s=e.labels.hints,r=e.labels.messages;for(const[e,s]of Object.entries(i))i[e]=t.key(s);for(const[e,t]of Object.entries(s))s[e]=t.replace(/\{\{(\w+)\}\}/g,((e,t)=>Object.hasOwn(i,t)?i[t]:e));r.cancel=t.messages.cancel(r.cancel),r.empty=t.messages.empty(r.empty)}(e),e}),[]),A=o({status:x,theme:U}),F=c([]),[j,B]=n(e.resolve(process.cwd(),i.basePath||".")),M=l((()=>{const e=function(e){return u(e).map((i=>{const s=t(e,i);try{return D(s)}catch{return null}})).filter((e=>null!==e))}(j).map((e=>{const t=$(e);return{...e,isDisabled:!m(t)}})).filter((e=>v||!e.isDisabled));if(function(e){e.sort(((e,t)=>{const i=(e.isDisabled?2:0)+(e.isDirectory?-1:0),s=(t.isDisabled?2:0)+(t.isDirectory?-1:0);return i!==s?i-s:e.name.localeCompare(t.name)}))}(e),i.type!==g.File){const t=D(j);t.displayName=w("."),t.isCwd=t.path===j,e.unshift(t)}if(r)for(const t of e){const e=F.current.findIndex((e=>e.path===t.path));t.isSelected=-1!==e}return e}),[j]),N=l((()=>{const e=M.findIndex((e=>!e.isDisabled)),t=M.findLastIndex((e=>!e.isDisabled));return-1===e?{first:0,last:0}:{first:e,last:t}}),[M]),[z,H]=n(N.first),R=M[z];d((t=>{if(O.isUp(t)||O.isDown(t)){if(!h&&O.isUp(t)&&z===N.first)return;if(!h&&O.isDown(t)&&z===N.last)return;const e=O.isUp(t)?-1:1;let i=z;do{i=(i+e+M.length)%M.length}while(M[i].isDisabled);H(i)}else if(O.isBack(t))B(e.resolve(j,"..")),H(N.first);else if(O.isForward(t)){if(!R.isDirectory)return;B(R.path),H(N.first)}else if(O.isToggle(t)){if(!r)return;if(!k(R,i.type))return;const e=F.current.findIndex((e=>e.path===R.path));-1===e?(R.isSelected=!0,F.current.push(R)):(R.isSelected=!1,F.current.splice(e,1)),H(z-1),H(z)}else if(O.isConfirm(t)){if(!R)return;let e=null;if(r)e=F.current.map((e=>$(e)));else{if(!k(R,i.type))return;e=$(R)}I(y.Done),s(e)}else if(O.isCancel(t)){if(!S)return;I(y.Canceled),s(null)}}));const q=p({items:M,active:z,renderItem:({item:e,index:t,isActive:s})=>U.renderItem(e,{items:M,type:i.type,multiple:r,loop:h,index:t,isActive:s}),pageSize:f,loop:h}),E=U.style.message(i.message,x);if(x===y.Canceled)return`${A} ${E} ${U.labels.messages.cancel}`;if(x===y.Done)return`${A} ${E} ${U.style.answer(R.path)}`;return`${A} ${E} ${U.renderHelp("header",{allowCancel:S,multiple:r})}\n${U.style.currentDir(w(j))}\n${q.length?q:U.labels.messages.empty}[?25l`}))(i)}export{g as ItemType,y as Status,v as fileSelector};