ccommand 1.0.90 → 1.0.92
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/README.md +26 -3
- package/dist/cli.cjs +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/src-B5b3opWX.cjs +28 -0
- package/dist/src-BPcIgFY_.mjs +28 -0
- package/package.json +1 -1
- package/dist/src-CyfkX82P.mjs +0 -23
- package/dist/src-Hds9Ed78.cjs +0 -23
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<span><div align="center"></div></span>
|
|
2
2
|
|
|
3
3
|
- 高效的执行命令行工具 | Efficient execution of command-line tools
|
|
4
|
-
-
|
|
4
|
+
- 内置模糊搜索 Picker | Built-in fuzzy-search picker
|
|
5
5
|
|
|
6
6
|
## 介绍 | Introduction
|
|
7
7
|
|
|
@@ -19,9 +19,32 @@ npm install -g ccommand # 安装ccommand install ccommand
|
|
|
19
19
|
ccommand -v # 查看版本 view version
|
|
20
20
|
ccommand find # 查找workspace find workspace
|
|
21
21
|
ccommand # 执行当前script Execute the current script
|
|
22
|
+
ccommand --init # 自动检测当前shell并输出集成脚本 Auto-detect shell and output init script
|
|
23
|
+
ccommand --init zsh # 输出shell集成脚本 eval "$(ccommand --init zsh)"
|
|
24
|
+
CCOMMAND_BIN="node ./cli.mjs" ccommand --init zsh # 本地调试时指定二进制
|
|
22
25
|
ccommand -help # 查看帮助 view help
|
|
23
26
|
```
|
|
24
27
|
|
|
28
|
+
## Shell 集成
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
# 临时生效(当前终端)
|
|
32
|
+
eval "$(ccommand --init zsh)"
|
|
33
|
+
|
|
34
|
+
# 本地调试:未全局安装时,指定可执行命令
|
|
35
|
+
eval "$(node ./cli.mjs --init zsh 'node ./cli.mjs')"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
# bash
|
|
40
|
+
eval "$(ccommand --init bash)"
|
|
41
|
+
|
|
42
|
+
# fish
|
|
43
|
+
eval (ccommand --init fish)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
> 说明:由于子进程无法直接修改父 shell 的内存状态,必须通过 `eval`(或写入 shell 配置文件)让函数在当前 shell 生效。
|
|
47
|
+
|
|
25
48
|
## 语言 | Language
|
|
26
49
|
|
|
27
50
|
```
|
|
@@ -36,8 +59,8 @@ export PI_LANG=en
|
|
|
36
59
|
## 配置 | Config
|
|
37
60
|
|
|
38
61
|
```
|
|
39
|
-
#
|
|
40
|
-
export
|
|
62
|
+
# 禁用交互选择 (支持 CCOMMAND_NO_PICKER / NO_PICKER,兼容旧的 CCOMMAND_NO_GUM / NO_GUM)
|
|
63
|
+
export CCOMMAND_NO_PICKER=1
|
|
41
64
|
|
|
42
65
|
# 禁用写入 shell history (也支持 NO_HISTORY)
|
|
43
66
|
export CCOMMAND_NO_HISTORY=1
|
package/dist/cli.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`./src-
|
|
1
|
+
require(`./src-B5b3opWX.cjs`).t();
|
package/dist/cli.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./src-
|
|
1
|
+
import{t as e}from"./src-BPcIgFY_.mjs";e();export{};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./src-
|
|
1
|
+
const e=require(`./src-B5b3opWX.cjs`);exports.ccommand=e.t;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./src-
|
|
1
|
+
import{t as e}from"./src-BPcIgFY_.mjs";export{e as ccommand};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs/promises`);c=s(c);let l=require(`node:path`);l=s(l);let u=require(`node:process`);u=s(u);let d=require(`@simon_he/colorize`);d=s(d);let f=require(`lazy-js-utils`),p=require(`lazy-js-utils/node`),m=require(`fast-glob`);m=s(m);let h=require(`node:child_process`),g=require(`node:util`),_=require(`node:buffer`),v=require(`node:os`);v=s(v);let y=require(`node:readline`);y=s(y);var b=`1.0.92`;const x=console.log,S=(u.default.env.PI_LANG||u.default.env.LANG||``).startsWith(`zh`),C=S?`已取消...`:`Cancelled...`,w=S?`当前目录并未找到 package.json 文件`:`package.json file not found in current directory`,T=S?`正在为您执行...`:`is running for you...`;function E(){return x(`[33m${C}[0m`),u.default.exit(130)}const D=/^[\w./:@%+=,-]+$/;function ee(e){let t=[],n=``,r=null,i=!1,a=()=>{i&&=(t.push(n),n=``,!1)};for(let t=0;t<e.length;t++){let o=e[t];if(r){if(o===r){r=null,i=!0;continue}if(r===`"`&&o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0;continue}if(o===`"`||o===`'`){r=o,i=!0;continue}if(/\s/.test(o)){for(a();t+1<e.length&&/\s/.test(e[t+1]);)t++;continue}if(o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0}return a(),t}function te(e){if(!e)return[];if(Array.isArray(e))return e;let t=e.trim();return t?ee(t):[]}function O(e){return e===``?`''`:D.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function k(e){return e.filter(e=>typeof e==`string`).map(O).join(` `)}function A(e){return D.test(e)}function ne(e){let t=e[0];if(!t)return[``,``,[]];let n=e.indexOf(`--`);if(n!==-1){let t=e.slice(0,n),r=e.slice(n+1),i=t[0]||``,a=t[1]||``,o=t.slice(2);return i.startsWith(`-`)?[``,``,e.slice()]:[i,a,[...o,...r]]}return t.startsWith(`-`)?[``,``,e.slice()]:e[1]&&e[1].startsWith(`-`)?[t,``,e.slice(1)]:[t,e[1]||``,e.slice(2)]}function re(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function j(e,t){let n=Object.keys(e),r=n.find(e=>e.startsWith(t));if(r)return r;try{if(!t)return;let e=t.split(``).map(e=>re(e)).join(`[_-\\w$.:]*`),r=new RegExp(e);return n.find(e=>r.test(e))}catch(e){x(`${S?`正则错误`:`RegExp error`}: ${e}`),u.default.exit(1)}}async function ie(e){let{termStart:t,params:n,dirname:r,argv:i,val:a,isZh:o,pushHistory:s,jsShell:c,isNeedPrefix:l,fuzzyWorkspace:u}=e,d=[...n||[]],f=``;t!==`npm`&&d.length&&!d[0].startsWith(`--`)&&(f=d[0],d=d.slice(1));let p=f||a||u||``;a=`${p}`;let m=l(d)&&d.length>0&&d[0]!==`--`,h=[];if(t===`npm`){h.push(`run`),r&&h.push(`--prefix`,r),p&&h.push(p);let e=[...d];e[0]===`--`&&e.shift(),e.length&&h.push(`--`,...e)}else t===`pnpm`?(h.push(`run`),r&&h.push(`--filter`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`yarn`?(r&&h.push(`workspace`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`bun`?(h.push(`run`),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`make`&&(p&&h.push(p),m&&h.push(`--`),h.push(...d));let g=k([t,...h]),_=[];i[0]===`find`?(_.push(`pfind`),r&&_.push(r)):_.push(`prun`),p&&_.push(p),_.push(...d);let v=k(_);return e.recordHistory!==!1&&await s(v),{command:g,text:_.map((e,t)=>t===_.length-1&&A(e)?e:O(e)).join(` `),val:a,historyText:v}}let M=null,N=[],P=null,F=null;function I(){return N}async function ae(e){let t=e===`pnpm`?l.default.resolve(u.default.cwd(),`pnpm-workspace.yaml`):l.default.resolve(u.default.cwd(),`package.json`);try{try{F=(await c.default.stat(t)).mtimeMs}catch{}return await c.default.readFile(t,`utf-8`)}catch{return``}}async function oe(e,t){if(!t)return[];if(e===`pnpm`)try{if(!M){let e=await import(`yamljs`);M=e&&e.default||e}let e=M.parse(t)?.packages;return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}try{let e=JSON.parse(t)?.workspaces;return(0,f.isPlainObject)(e)?e?.packages||[]:Array.isArray(e)?e:[]}catch{return[]}}async function se(e){if(!e.length)return{};let t=await(0,m.default)(e.map(e=>`${e}/package.json`),{dot:!0,ignore:[`**/node_modules/**`]});return(await Promise.all(t.map(async e=>{try{let t=await(0,p.getPkg)(e);if(!t)return null;let{name:n,scripts:r}=t;return{name:n,scripts:r}}catch{return null}}))).reduce((e,t)=>(!t||!t.name||!t.scripts||(e[t.name]=Object.keys(t.scripts).reduce((e,n)=>(n.startsWith(`//`)||(e[n]=t.scripts[n]),e),{})),e),{})}async function ce(e){if(P)try{let t=e===`pnpm`?l.default.resolve(u.default.cwd(),`pnpm-workspace.yaml`):l.default.resolve(u.default.cwd(),`package.json`),n=await c.default.stat(t);if(F&&n.mtimeMs<=F)return P}catch{return P}return P=await se(await oe(e,await ae(e)))||{},N=Object.keys(P).filter(e=>P&&P[e]&&Object.keys(P[e]).length),P}async function L(e){return ce(e)}const R=(0,f.memorizeFn)(p.getPkg),z={};async function le(e,t){try{let n=e||`root`;if(z[n])return z[n];let r;return!e||t===`bun`||t===`npm`?r=(await R(`./package.json`))?.scripts:(t===`pnpm`||t===`yarn`)&&(r=(await L(t))[e]||(await R(`${e}/package.json`))?.scripts),r&&(z[n]=r),r}catch{return null}}async function ue(e,t,n,r,i,a,o,s,c,l){let u,d=``,f=r[0]?.trim(),p=k([t,...n]),m=k([t||r[0]||``,...n]);t&&f&&f!==t?console.log(o({text:`🤔 ${o({text:`'${r[0]}'`,color:`cyan`})} ${s?`自动的为您匹配成`:`automatically match for you`} ${o({text:`'${p}'`,color:`cyan`})} `,color:`yellow`})):t&&console.log(o({text:`🤔 is running for you... ${p}`,color:`magenta`}));let h=()=>{switch(e){case`npm`:{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),k([`npm`,...e])}case`pnpm`:return k([`pnpm`,`run`,t,...n]);case`yarn`:return k([`yarn`,t,...n]);case`bun`:return k([`bun`,`run`,t,...n]);case`make`:return k([`make`,t,...n]);default:return k([t,...n])}},g=()=>{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),k([`npm`,...e])};switch(e){case`npm`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`pnpm`:{let{status:e,result:t=``}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});if(d=t,u=e,d.includes(`pnpm versions with respective Node.js version support`)){console.log(o({text:s?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let{status:e,result:t}=await a(g(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t}break}case`yarn`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`bun`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`make`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}}if(u===0){let e=k([`prun`,t,...n]);return await i(e),console.log(o({color:`green`,text:`\n${e} ${c} 🎉`}))}return console.log(o({color:`red`,text:`\ncommand ${o({bold:!0,color:`cyan`,text:`'${m}'`})} ${l} ❌`}))}let B=null;async function de(){return B||(B=(await import(`@simon_he/colorize`)).default,B)}const V=new Map;function fe(){let e=(u.default.env.CCOMMAND_NO_HISTORY||u.default.env.NO_HISTORY||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}function pe(){let e=u.default.env.CCOMMAND_HISTORY_HINT||``;if(e)return e;let t=u.default.env.HOME||v.default.homedir(),n=u.default.env.XDG_CACHE_HOME||l.default.join(t,`.cache`);return l.default.join(n,`ccommand`,`last-history`)}async function me(e){let t=pe();try{await c.default.mkdir(l.default.dirname(t),{recursive:!0});let n=Date.now();await c.default.writeFile(t,`${n}\t${e}\n`,`utf8`)}catch{}}async function H(e){if(fe())return;let t=await de();x(t({text:`${S?`快捷指令`:`shortcut command`}: ${e}`,color:`blue`,bold:!0}));let n=(u.default.env.SHELL||`/bin/bash`).split(`/`).pop()||`bash`,r=``,i=`bash`,a=u.default.env.HOME||v.default.homedir();switch(n){case`zsh`:r=l.default.join(a,`.zsh_history`),i=`zsh`;break;case`bash`:r=u.default.env.HISTFILE||l.default.join(a,`.bash_history`),i=`bash`;break;case`fish`:r=l.default.join(a,`.local`,`share`,`fish`,`fish_history`),i=`fish`;break;default:r=u.default.env.HISTFILE||l.default.join(a,`.bash_history`),i=`bash`}try{await me(e);try{await c.default.access(r)}catch{x(t({text:`${S?`未找到 ${n} 历史文件`:`${n} history file not found`}`,color:`yellow`}));return}let a=await c.default.stat(r).catch(()=>null),o=Math.floor(Date.now()/1e3),s=``;s=i===`zsh`?`: ${o}:0;${e}`:i===`fish`?`- cmd: ${e}\n when: ${o}`:u.default.env.HISTTIMEFORMAT?`#${o}\n${e}`:e;function l(e){if(i===`fish`){let t=e.split(/\r?\n/),n=[],r=[];for(let e of t)e.startsWith(`- cmd: `)?(r.length&&(n.push(r.join(`
|
|
2
|
+
`)),r=[]),r.push(e)):r.length?r.push(e):e.trim()!==``&&n.push(e);return r.length&&n.push(r.join(`
|
|
3
|
+
`)),n.filter(Boolean)}else if(i===`zsh`)return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);else{let t=e.split(/\r?\n/),n=[];for(let e=0;e<t.length;e++){let r=t[e];if(r.startsWith(`#`)){let i=t[e+1]??``;n.push(`${r}\n${i}`),e++}else r.trim()!==``&&n.push(r)}return n}}let d=[],f=V.get(r);d=f&&a&&f.mtimeMs===a.mtimeMs&&f.size===a.size&&f.format===i?f.entries.slice():l(await c.default.readFile(r,`utf8`));function p(e){if(i===`fish`){let t=e.split(`
|
|
4
|
+
`)[0].match(/^- cmd: (.*)$/);return(t?t[1]:e).trim()}else if(i===`zsh`){let t=e.match(/^[^;]*;(.+)$/);return(t?t[1]:e).trim()}else{if(e.startsWith(`#`)){let t=e.split(/\r?\n/);return(t[1]??t[0]).trim()}return e.trim()}}let m=[],h=p(s),g=null;for(let e of d){if(p(e)===h){if(i===`fish`){g=e;continue}continue}m.push(e)}if(i===`fish`&&g){let e=g.split(`
|
|
5
|
+
`),t=!1,n=e.map(e=>e.trim().startsWith(`when:`)||e.startsWith(` when:`)?(t=!0,` when: ${o}`):e);t||n.splice(1,0,` when: ${o}`),m.push(n.join(`
|
|
6
|
+
`))}else m.push(s);let v=``;v=i===`fish`?`${m.map(e=>e.trimEnd()).join(`
|
|
7
|
+
`)}\n`:`${m.join(`
|
|
8
|
+
`)}\n`;let y=`${r}.ccommand.tmp`;await c.default.writeFile(y,v,`utf8`),await c.default.rename(y,r);try{let e=await c.default.stat(r);V.set(r,{mtimeMs:e.mtimeMs,size:e.size,entries:m,format:i})}catch{V.set(r,{mtimeMs:Date.now(),size:_.Buffer.byteLength(v),entries:m,format:i})}}catch(e){x(t({text:`${S?`❌ 添加到 ${n} 历史记录失败`:`❌ Failed to add to ${n} history`}${e?`: ${String(e)}`:``}`,color:`red`}))}}const he=(0,g.promisify)(h.exec),U={};async function W(e){if(U[e]!==void 0)return U[e];try{return await he(`command -v ${e}`),U[e]=!0,!0}catch{return U[e]=!1,!1}}let G=null;async function ge(){return G===null&&(G=await W(`bun`)?`bun`:await W(`esno`)?`esno`:await W(`tsx`)?`tsx`:null),G}async function K(e,t,n,r){let i=k([`prun`,e]);await H(i);let{status:a}=await(0,p.jsShell)(t,{errorExit:!1,isLog:!1,stdio:`inherit`}),o=a===0;return o||(u.default.exitCode=a??1),x((0,d.default)({color:o?`green`:`red`,text:`\n"${i}" ${o?n:r} ${o?`🎉`:`❌`}`})),o}async function q(e,t,n){let r=l.default.extname(e),i=`node`;if(r===`.ts`)if(G===null&&await ge(),G)i=G;else return x((0,d.default)({text:S?`没有找到可以直接执行TypeScript的工具,推荐安装下列工具之一:
|
|
9
|
+
- npm install -g bun
|
|
10
|
+
- npm install -g esno
|
|
11
|
+
- npm install -g tsx`:`No TypeScript executor found. Recommend installing one of:
|
|
12
|
+
- npm install -g bun
|
|
13
|
+
- npm install -g esno
|
|
14
|
+
- npm install -g tsx`,color:`yellow`})),u.default.exitCode=1,!1;return K(e,k([i,e]),t,n)}async function _e(e,t,n){let r=[`.js`,`.ts`,`.mjs`,`.cjs`],i=l.default.extname(e);if(i&&r.includes(i)&&await c.default.stat(e).then(e=>e.isFile()).catch(()=>!1))return await q(e,t,n),!0;if(!i)for(let i of r){let r=`${e}${i}`;if(await c.default.stat(r).then(e=>e.isFile()).catch(()=>!1))return await q(r,t,n),!0}let a=await c.default.stat(e).catch(()=>null);if(a&&a.isDirectory())for(let i of r){let r=l.default.join(e,`index${i}`);if(await c.default.stat(r).then(e=>e.isFile()).catch(()=>!1))return await q(r,t,n),!0}return!1}async function ve(e,t,n){e.endsWith(`.py`)?await K(e,`python ${e}`,t,n):e.endsWith(`.rs`)&&((await(0,p.jsShell)(`rustc ${e}`)).status===0&&(await(0,p.jsShell)(`./${l.default.basename(e,`.rs`)}`,{stdio:`inherit`})).status===0?(await H(`prun ${e}`),x((0,d.default)({color:`green`,text:`\n"prun --${e}" ${t} 🎉`}))):x((0,d.default)({color:`red`,text:`\ncommand "prun ${e}" ${n} ❌`})))}async function ye(e){try{let t=(await c.default.readFile(e,`utf-8`)).split(/\r?\n/),n=new Set;for(let e=0;e<t.length;e++){let r=t[e].trim();if(r.startsWith(`.PHONY:`)){let e=r.substring(7).replace(/\\\\$/g,``).trim();for(let t of e.split(/\s+/))t&&n.add(t)}}let r=[];for(let e of n){let n=``;for(let r=0;r<t.length;r++){let i=t[r];if(!i)continue;let a=i.trimStart();if(a.startsWith(`${e}:`)||a.startsWith(`${e} :`)){let e=a.split(`:`,2)[1]||``,i=e.indexOf(`;`);if(i!==-1&&(n=e.slice(i+1).trim()),!n&&r+1<t.length){let e=t[r+1];e.startsWith(` `)&&(n=e.trim())}if(!n){let t=e.trim();n=t?t.replace(/\s+/g,` `).slice(0,120):``}break}}r.push({name:e,detail:n?`${n}...`:``})}return r}catch{return[]}}const be=new Set([`-`,`_`,` `,`.`,`/`,`\\`,`:`]);function xe(e){return e>=`a`&&e<=`z`}function Se(e){return e>=`A`&&e<=`Z`}function Ce(e,t){if(t<=0)return!0;let n=e[t-1]||``,r=e[t]||``;return be.has(n)?!0:xe(n)&&Se(r)}function we(e,t){let n=[],r=0;for(let i=0;i<t.length&&r<e.length;i++)t[i]===e[r]&&(n.push(i),r++);return r===e.length?n:null}function Te(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(!n)return{score:0,positions:[]};if(r===n)return{score:1e5,positions:[...t].map((e,t)=>t)};if(r.startsWith(n))return{score:9e4-(t.length-e.length),positions:[...e].map((e,t)=>t)};let i=r.indexOf(n);if(i!==-1)return{score:7e4-i,positions:[...e].map((e,t)=>i+t)};let a=we(n,r);if(!a)return null;let o=1e3,s=-1;for(let e of a)o+=10,e===s+1&&(o+=15),e===0&&(o+=12),Ce(t,e)&&(o+=8),s!==-1&&(o-=e-s-1),s=e;return o+=Math.max(0,30-(t.length-e.length)),{score:o,positions:a}}function Ee(e,t){let n=e.trim().split(/\s+/).filter(Boolean);if(!n.length)return{score:0,positions:[]};let r=0,i=[];for(let e of n){let n=Te(e,t);if(!n)return null;r+=n.score,i.push(...n.positions)}return{score:r,positions:i}}function J(e,t){if(!t.trim())return e.map((e,t)=>({item:e,score:0,index:t,positions:[]}));let n=e.map((e,n)=>{let r=Ee(t,e);return r?{item:e,score:r.score,index:n,positions:r.positions}:null}).filter(Boolean);return n.sort((e,t)=>t.score===e.score?e.index-t.index:t.score-e.score),n}function Y(e,t){return!t||t<=0||e.length<=t?e:t<=3?e.slice(0,t):`${e.slice(0,t-3)}...`}function De(e,t){if(!t||t<=0||e.length<=t)return{text:e,visibleLength:e.length};if(t<=3)return{text:e.slice(0,t),visibleLength:t};let n=t-3;return{text:`${e.slice(0,n)}...`,visibleLength:n}}function Oe(e,t,n,r){if(!n||!t.length)return e;let i=new Set(t),a=``;for(let t=0;t<e.length;t++){let o=e[t]||``;i.has(t)?a+=`${n}${o}${r}`:a+=o}return a}function X(e,t){return t?`\u001B[2m${e}\u001B[0m`:e}function ke(){return!!(u.default.stdin.isTTY&&u.default.stdout.isTTY)}function Ae(){let e=(u.default.env.CCOMMAND_NO_PICKER||u.default.env.NO_PICKER||u.default.env.CCOMMAND_NO_GUM||u.default.env.NO_GUM||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}async function Z(e){return!(Ae()||!ke()||u.default.env.CI)}async function Q(e,{placeholder:t,maxItems:n}={}){if(!ke())return{status:130,result:``};let r=u.default.stdin,i=u.default.stdout,a=!!(i.isTTY&&!u.default.env.NO_COLOR),o=(t||(S?`请选择一个选项`:`Select`)).trim(),s=S?`上/下选择 左/右移动 Enter确认 Esc取消`:`Up/Down Move Left/Right Cursor Enter select Esc cancel`,c=``,l=0,d=0,f=0,p=0,m=Math.max(4,Math.min(n||10,(i.rows||24)-5)),h=J(e,c),g=()=>{a&&i.write(`\x1B[?25l`)},_=()=>{a&&i.write(`\x1B[?25h`)},v=()=>{if(p){for(let e=0;e<p;e++)y.default.clearLine(i,0),e<p-1&&y.default.moveCursor(i,0,-1);y.default.cursorTo(i,0),p=0}},b=()=>{l<d?d=l:l>=d+m&&(d=l-m+1),d<0&&(d=0)},x=()=>{v();let e=[],t=`? ${o}`;e.push(X(Y(t,i.columns),a));let n=` > ${c.slice(0,f)}|${c.slice(f)}`;e.push(Y(n,i.columns)),h.length?(b(),h.slice(d,d+m).forEach((t,n)=>{let r=d+n===l,o=r?`> `:` `,s=i.columns?Math.max(0,i.columns-o.length):void 0,c=De(t.item,s),u=t.positions.filter(e=>e>=0&&e<c.visibleLength),f=a&&r?`\x1B[44m`:``,p=a?`${f}\u001B[1m\u001B[35m`:``,m=a?`\x1B[0m`:``,h=f?`${m}${f}`:m,g=``;f&&(g+=f),g+=o,g+=Oe(c.text,u,p,h),f&&(g+=m),e.push(g)})):e.push(S?` (无匹配)`:` (no matches)`),e.push(``);let r=h.length?`(${l+1}/${h.length})`:``;e.push(X(` ${s} ${r}`.trimEnd(),a)),i.write(e.join(`
|
|
15
|
+
`)),p=e.length},C=()=>{h=J(e,c),l=0,l>=h.length&&(l=h.length-1),l<0&&(l=0),f>c.length&&(f=c.length),f<0&&(f=0),b()};return new Promise(e=>{let t=!1;function n(n,r){t||(t=!0,a(),e({status:n,result:r}))}function a(){r.removeListener(`data`,o),r.isTTY&&r.setRawMode(!1),r.pause(),v(),_()}function o(e){let t=e.toString(`utf8`);if(t===``||t===``)return n(130,``);if(t===`\r`||t===`
|
|
16
|
+
`){if(!h.length){i.write(`\x07`);return}return n(0,h[l]?.item||``)}if(t.startsWith(`\x1B`)){if(t===`\x1B`)return n(130,``);if(t===`\x1B[A`){h.length&&(l=l>0?l-1:h.length-1),x();return}if(t===`\x1B[B`){h.length&&(l=l<h.length-1?l+1:0),x();return}if(t===`\x1B[D`){f>0&&f--,x();return}if(t===`\x1B[C`){f<c.length&&f++,x();return}if(t===`\x1B[5~`){l=Math.max(0,l-m),x();return}if(t===`\x1B[6~`){l=Math.min(h.length-1,l+m),x();return}if(t===`\x1B[3~`){f<c.length&&(c=`${c.slice(0,f)}${c.slice(f+1)}`,C(),x());return}return}if(t===``||t===`\b`||t===`\b`){c.length&&f>0&&(c=`${c.slice(0,f-1)}${c.slice(f)}`,f=Math.max(0,f-1),C(),x());return}let r=``;for(let e of t)e>=` `&&e!==``&&(r+=e);r&&(c=`${c.slice(0,f)}${r}${c.slice(f)}`,f+=r.length,C(),x())}r.isTTY&&r.setRawMode(!0),r.resume(),r.on(`data`,o),g(),x()})}const je=(0,f.memorizeFn)(p.getPkg),Me=le,Ne=ie,$=ue;function Pe(e,t,n){return!!(n[1]&&t.length)}async function Fe(e=u.default.argv.slice(2)){let t=S?`当前目录不存在任何子目录`:`The current directory does not have any subdirectories`,n=S?`运行成功`:`run successfully`,r=S?`运行失败`:`run error`,i=te(e);if(i[0]===`init`||i[0]===`--init`){let e=i[1],t=i[2],n=u.default.env.CCOMMAND_BIN,r=O(t||n||`ccommand`),a=u.default.env.SHELL||``,o=u.default.env.FISH_VERSION&&`fish`||u.default.env.ZSH_VERSION&&`zsh`||u.default.env.BASH_VERSION&&`bash`||a&&a.split(`/`).pop()||``,s=e||o||`zsh`,c=``;if(s===`zsh`)c=[`ccommand() {`,` local bin=${r}`,` local -a cmd`," cmd=(${=bin})",' command "${cmd[@]}" "$@"',`}`,``,`__ccommand_sync_history() {`,' local history_disable=${CCOMMAND_NO_HISTORY:-${NO_HISTORY:-""}}'," local history_disable_lower=${history_disable:l}",` if [[ $history_disable_lower == "1" || $history_disable_lower == "true" || $history_disable_lower == "yes" ]]; then`,` return`,` fi`," local history_hint=${CCOMMAND_HISTORY_HINT:-${XDG_CACHE_HOME:-$HOME/.cache}/ccommand/last-history}",` if [[ ! -f $history_hint ]]; then`,` return`,` fi`,` local line`,` line=$(<"$history_hint")`," local hint_ts=${line%%$'\\t'*}"," local hint_cmd=${line#*$'\\t'}",` if [[ -z $hint_ts || $hint_ts == $line ]]; then`,` hint_cmd=$line`,` hint_ts=""`,` fi`,' if [[ -n $hint_ts && $hint_ts == ${__CCOMMAND_HISTORY_HINT_TS:-""} ]]; then',` return`,` fi`,` __CCOMMAND_HISTORY_HINT_TS=$hint_ts`,` fc -R`,` if [[ $hint_cmd != pfind* ]]; then`,` return`,` fi`,` local last_line`,` last_line=$(fc -l -1 2>/dev/null)`,` local last_cmd`,` last_cmd=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*[0-9]+[[:space:]]*//")`,` if [[ $last_cmd == "$hint_cmd" ]]; then`,` return`,` fi`,` if [[ $last_cmd == ccommand || $last_cmd == ccommand\\ * ]]; then`,` local last_num`,` last_num=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*([0-9]+).*/\\1/")`,` if [[ -n $last_num ]]; then`,` history -d $last_num 2>/dev/null`,` fi`,` fi`,` print -s -- "$hint_cmd"`,`}`,``,`if ! typeset -f __ccommand_precmd >/dev/null; then`,` __ccommand_precmd() { __ccommand_sync_history }`,` autoload -Uz add-zsh-hook`,` add-zsh-hook precmd __ccommand_precmd`,`fi`].join(`
|
|
17
|
+
`);else if(s===`bash`)c=[`ccommand() {`,` local bin=${r}`,` local -a cmd`,` read -r -a cmd <<< "$bin"`,' command "${cmd[@]}" "$@"',`}`,``,`__ccommand_sync_history() {`,' local history_disable=${CCOMMAND_NO_HISTORY:-${NO_HISTORY:-""}}',` local history_disable_lower`,` history_disable_lower=$(printf '%s' "$history_disable" | tr '[:upper:]' '[:lower:]')`,` if [[ $history_disable_lower == "1" || $history_disable_lower == "true" || $history_disable_lower == "yes" ]]; then`,` return`,` fi`," local history_hint=${CCOMMAND_HISTORY_HINT:-${XDG_CACHE_HOME:-$HOME/.cache}/ccommand/last-history}",` if [[ ! -f $history_hint ]]; then`,` return`,` fi`,` local line`,` line=$(<"$history_hint")`,` local hint_ts="\${line%%$'\\t'*}"`,` local hint_cmd="\${line#*$'\\t'}"`,` if [[ -z $hint_ts || $hint_ts == "$line" ]]; then`,` hint_cmd="$line"`,` hint_ts=""`,` fi`,' if [[ -n $hint_ts && $hint_ts == "${__CCOMMAND_HISTORY_HINT_TS:-}" ]]; then',` return`,` fi`,` __CCOMMAND_HISTORY_HINT_TS=$hint_ts`,` if [[ $hint_cmd != pfind* ]]; then`,` return`,` fi`,` history -n`,` local last_line`,` last_line=$(history 1)`,` local last_cmd`,` last_cmd=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*[0-9]+[[:space:]]*//")`,` if [[ $last_cmd == "$hint_cmd" ]]; then`,` return`,` fi`,` if [[ $last_cmd == ccommand || $last_cmd == ccommand\\ * ]]; then`,` local last_num`,` last_num=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*([0-9]+).*/\\1/")`,` if [[ -n $last_num ]]; then`,` history -d "$last_num" 2>/dev/null`,` fi`,` fi`,` history -s -- "$hint_cmd"`,`}`,``,'if [[ -z "${__CCOMMAND_PROMPT_INSTALLED:-}" ]]; then',` __CCOMMAND_PROMPT_INSTALLED=1`,' if [[ -n "${PROMPT_COMMAND:-}" ]]; then',' PROMPT_COMMAND="__ccommand_sync_history;${PROMPT_COMMAND}"',` else`,` PROMPT_COMMAND="__ccommand_sync_history"`,` fi`,`fi`].join(`
|
|
18
|
+
`);else if(s===`fish`)c=[`function ccommand`,` set -l bin ${r}`,` set -l cmd (string split -- " " $bin)`,` command $cmd $argv`,` set -l history_disable $CCOMMAND_NO_HISTORY`,` if test -z "$history_disable"`,` set history_disable $NO_HISTORY`,` end`,` set history_disable (string lower -- (string trim -- "$history_disable"))`,` if test "$history_disable" != "1" -a "$history_disable" != "true" -a "$history_disable" != "yes"`,` history --merge`,` set -l history_hint $CCOMMAND_HISTORY_HINT`,` if test -z "$history_hint"`,` set -l cache_home $XDG_CACHE_HOME`,` if test -z "$cache_home"`,` set cache_home "$HOME/.cache"`,` end`,` set history_hint "$cache_home/ccommand/last-history"`,` end`,` if test -f "$history_hint"`,` set -l last_cmd (string trim -- (cat "$history_hint"))`,` set -l last_cmd (string replace -r "^[0-9]+\\t" "" -- "$last_cmd")`,` if string match -q "pfind*" -- "$last_cmd"`,` set -l last_hist (history --max=1)`,` if test "$last_hist" != "$last_cmd"`,` history add -- "$last_cmd"`,` end`,` end`,` end`,` end`,`end`].join(`
|
|
19
|
+
`);else return x((0,d.default)({color:`red`,text:S?`不支持的 shell: ${s}`:`Unsupported shell: ${s}`}));return console.log(c)}if(i[0]===`-v`||i[0]===`--version`)return x((0,d.default)({text:S?`ccommand 当前版本: ${b}`:`ccommand Version: ${b}`,color:`green`}));if(i[0]===`-h`||i[0]===`--help`){let e=(await import(`terminal-link`)).default,t=e(S?`打开一个新的问题`:`open an issue`,`https://github.com/Simon-He95/ccommand/issues`),n=e(S?`✨帮助点一个星星`:`✨star it`,`https://github.com/Simon-He95/ccommand`);return x((0,d.default)({color:`white`,text:`
|
|
20
|
+
${(0,d.default)({bold:!0,text:`Common Commands:`,bgColor:`blue`})}
|
|
21
|
+
${(0,d.default)({text:`- ccommand -v 查看当前版本
|
|
22
|
+
- ccommand -help 查看帮助
|
|
23
|
+
- ccommand 执行当前package.json
|
|
24
|
+
- ccommand find 查找当前workspace的所有目录
|
|
25
|
+
- ccommand --init [zsh|bash|fish] [bin] 输出 shell 集成脚本(未传则自动检测)
|
|
26
|
+
`,color:`cyan`})}
|
|
27
|
+
If you encounter any problems, you can ${(0,d.default)({color:`magenta`,text:t})}.
|
|
28
|
+
If you like it, please ${(0,d.default)({text:n,bold:!0,color:`cyan`})} `}))}else if(i[0]?.endsWith(`.py`)||i[0]?.endsWith(`.rs`)){await ve(i[0],n,r);return}let a;try{a=await(0,p.getPkgTool)()}catch{try{if(await c.default.readFile(l.default.resolve(u.default.cwd(),`./Makefile`),`utf-8`)){a=`make`;let e=await ye(`./Makefile`),t=e.reduce((e,t)=>{let{name:n,detail:r}=t;return e[n]=r,e},{}),o=``,s=[];if(i.length){let e=i[0];if(s=i.slice(1),o=j(t,e)||``,!o)return x((0,d.default)({color:`red`,text:w}))}else{if(!await Z(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 make 目标名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a make target explicitly.`}));let{result:t,status:n}=await Q(e.map(e=>e.name),{placeholder:S?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(n===130)return E();o=t}await $(a,o.trim(),s,i,H,p.jsShell,d.default,S,n,r);return}else return x((0,d.default)({color:`red`,text:w}))}catch{if(i[0]!==`find`)return x((0,d.default)({color:`red`,text:w}))}}let[o,s,f]=ne(i),m=o,h;if(i[0]===`find`){if(s)await L(a),m=I().filter(e=>e.includes(s))[0];else if(a===`yarn`){if(await L(a),!I().length)return x((0,d.default)({color:`yellow`,text:t}));if(!await Z(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:n}=await Q(I(),{placeholder:S?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(m=e,n===130)return E()}else if(a===`pnpm`){if(await L(a),!I().length)return x((0,d.default)({color:`yellow`,text:t}));if(!await Z(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:n}=await Q(I(),{placeholder:S?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(n===130)return E();m=e.trim()}else return x((0,d.default)({color:`red`,text:S?`find指令只能支持在yarn或pnpm的monorepo模式下使用`:`find command only support yarn or pnpm`}));h=await Me(m,a)||void 0}else{h=await Me(m,a)||void 0;try{let e=(await je(`./package.json`)||{})?.scripts;if(e&&e[i[0]]){await $(a,i[0],i.slice(1),i,H,p.jsShell,d.default,S,n,r);return}else if(e&&o){let t=j(e,i[0]);if(t){let e=i.slice(1);await $(a,t,e,i,H,p.jsShell,d.default,S,n,r);return}else{if(await _e(i[0],n,r))return;let e=`${o}.py`;if(await c.default.stat(e).then(e=>e.isFile()).catch(()=>!1)){x((0,d.default)({text:`🤔 ${S?`找到Python文件`:`Found Python file`}: ${e}`,color:`yellow`}));return}let t=`${o}.rs`;if(await c.default.stat(t).then(e=>e.isFile()).catch(()=>!1))return;x((0,d.default)({color:`red`,text:`"${i[0]}" ${S?`在工作区、当前目录中找不到任何可执行的脚本或文件,请检查`:`is not found in workspace, current directory or current scripts, please check`}`})),u.default.exit(1)}}}catch{}}let g=``;if(!s||i[0]===`find`&&(!i[2]||i[2].startsWith(`--`))){if(!h||Object.keys(h).length===0)return x((0,d.default)({color:`red`,text:S?`找不到任何可执行脚本`:`No scripts found`}));let e=Object.keys(h).map(e=>`${e}: ${(h?.[e]??``).replace(/[\r\n]+/g,` `)}`);if(!await Z(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入脚本名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a script name explicitly.`}));let{result:t,status:n}=await Q(e,{placeholder:S?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(n===130)return E();g=t.substring(0,t.indexOf(`: `))}if(!s&&!g)return E();x((0,d.default)({text:`🤔 ${T} ${g}`,color:`magenta`}));let{command:_,text:v,val:y,historyText:C}=await Ne({termStart:a,params:f,dirname:m,argv:i,val:g,runMsg:T,isZh:S,pushHistory:H,jsShell:p.jsShell,isNeedPrefix:e=>Pe(i[0],e,i),fuzzyWorkspace:s,recordHistory:i[0]!==`find`}),D=_;g=y;let{status:ee,result:A=``}=await(0,p.jsShell)(D,{errorExit:!1,stdio:`inherit`});if(i[0]===`find`&&await H(C),ee===0)return x((0,d.default)({color:`green`,text:`\n${v} 🎉`}));if(A.includes(`pnpm versions with respective Node.js version support`)){x((0,d.default)({text:S?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let e=[...f];e[0]===`--`&&e.shift();let{status:t}=await(0,p.jsShell)(k([`npm`,`run`,g,...e.length?[`--`,...e]:[]]),`inherit`);if(t===0)return x((0,d.default)({color:`green`,text:`\n${v} 🎉`}))}x((0,d.default)({color:`red`,text:`\ncommand ${g} ${r} ❌`}))}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Fe}});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import e from"node:fs/promises";import t from"node:path";import n from"node:process";import r from"@simon_he/colorize";import{isPlainObject as i,memorizeFn as a}from"lazy-js-utils";import{getPkg as o,getPkgTool as s,jsShell as c}from"lazy-js-utils/node";import l from"fast-glob";import{exec as u}from"node:child_process";import{promisify as d}from"node:util";import{Buffer as f}from"node:buffer";import p from"node:os";import m from"node:readline";var h=`1.0.92`;const g=console.log,_=(n.env.PI_LANG||n.env.LANG||``).startsWith(`zh`),v=_?`已取消...`:`Cancelled...`,y=_?`当前目录并未找到 package.json 文件`:`package.json file not found in current directory`,b=_?`正在为您执行...`:`is running for you...`;function x(){return g(`[33m${v}[0m`),n.exit(130)}const S=/^[\w./:@%+=,-]+$/;function C(e){let t=[],n=``,r=null,i=!1,a=()=>{i&&=(t.push(n),n=``,!1)};for(let t=0;t<e.length;t++){let o=e[t];if(r){if(o===r){r=null,i=!0;continue}if(r===`"`&&o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0;continue}if(o===`"`||o===`'`){r=o,i=!0;continue}if(/\s/.test(o)){for(a();t+1<e.length&&/\s/.test(e[t+1]);)t++;continue}if(o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0}return a(),t}function ee(e){if(!e)return[];if(Array.isArray(e))return e;let t=e.trim();return t?C(t):[]}function w(e){return e===``?`''`:S.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function T(e){return e.filter(e=>typeof e==`string`).map(w).join(` `)}function E(e){return S.test(e)}function te(e){let t=e[0];if(!t)return[``,``,[]];let n=e.indexOf(`--`);if(n!==-1){let t=e.slice(0,n),r=e.slice(n+1),i=t[0]||``,a=t[1]||``,o=t.slice(2);return i.startsWith(`-`)?[``,``,e.slice()]:[i,a,[...o,...r]]}return t.startsWith(`-`)?[``,``,e.slice()]:e[1]&&e[1].startsWith(`-`)?[t,``,e.slice(1)]:[t,e[1]||``,e.slice(2)]}function D(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function O(e,t){let r=Object.keys(e),i=r.find(e=>e.startsWith(t));if(i)return i;try{if(!t)return;let e=t.split(``).map(e=>D(e)).join(`[_-\\w$.:]*`),n=new RegExp(e);return r.find(e=>n.test(e))}catch(e){g(`${_?`正则错误`:`RegExp error`}: ${e}`),n.exit(1)}}async function k(e){let{termStart:t,params:n,dirname:r,argv:i,val:a,isZh:o,pushHistory:s,jsShell:c,isNeedPrefix:l,fuzzyWorkspace:u}=e,d=[...n||[]],f=``;t!==`npm`&&d.length&&!d[0].startsWith(`--`)&&(f=d[0],d=d.slice(1));let p=f||a||u||``;a=`${p}`;let m=l(d)&&d.length>0&&d[0]!==`--`,h=[];if(t===`npm`){h.push(`run`),r&&h.push(`--prefix`,r),p&&h.push(p);let e=[...d];e[0]===`--`&&e.shift(),e.length&&h.push(`--`,...e)}else t===`pnpm`?(h.push(`run`),r&&h.push(`--filter`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`yarn`?(r&&h.push(`workspace`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`bun`?(h.push(`run`),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`make`&&(p&&h.push(p),m&&h.push(`--`),h.push(...d));let g=T([t,...h]),_=[];i[0]===`find`?(_.push(`pfind`),r&&_.push(r)):_.push(`prun`),p&&_.push(p),_.push(...d);let v=T(_);return e.recordHistory!==!1&&await s(v),{command:g,text:_.map((e,t)=>t===_.length-1&&E(e)?e:w(e)).join(` `),val:a,historyText:v}}let A=null,j=[],M=null,N=null;function P(){return j}async function ne(r){let i=r===`pnpm`?t.resolve(n.cwd(),`pnpm-workspace.yaml`):t.resolve(n.cwd(),`package.json`);try{try{N=(await e.stat(i)).mtimeMs}catch{}return await e.readFile(i,`utf-8`)}catch{return``}}async function re(e,t){if(!t)return[];if(e===`pnpm`)try{if(!A){let e=await import(`yamljs`);A=e&&e.default||e}let e=A.parse(t)?.packages;return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}try{let e=JSON.parse(t)?.workspaces;return i(e)?e?.packages||[]:Array.isArray(e)?e:[]}catch{return[]}}async function ie(e){if(!e.length)return{};let t=await l(e.map(e=>`${e}/package.json`),{dot:!0,ignore:[`**/node_modules/**`]});return(await Promise.all(t.map(async e=>{try{let t=await o(e);if(!t)return null;let{name:n,scripts:r}=t;return{name:n,scripts:r}}catch{return null}}))).reduce((e,t)=>(!t||!t.name||!t.scripts||(e[t.name]=Object.keys(t.scripts).reduce((e,n)=>(n.startsWith(`//`)||(e[n]=t.scripts[n]),e),{})),e),{})}async function ae(r){if(M)try{let i=r===`pnpm`?t.resolve(n.cwd(),`pnpm-workspace.yaml`):t.resolve(n.cwd(),`package.json`),a=await e.stat(i);if(N&&a.mtimeMs<=N)return M}catch{return M}return M=await ie(await re(r,await ne(r)))||{},j=Object.keys(M).filter(e=>M&&M[e]&&Object.keys(M[e]).length),M}async function F(e){return ae(e)}const I=a(o),L={};async function oe(e,t){try{let n=e||`root`;if(L[n])return L[n];let r;return!e||t===`bun`||t===`npm`?r=(await I(`./package.json`))?.scripts:(t===`pnpm`||t===`yarn`)&&(r=(await F(t))[e]||(await I(`${e}/package.json`))?.scripts),r&&(L[n]=r),r}catch{return null}}async function se(e,t,n,r,i,a,o,s,c,l){let u,d=``,f=r[0]?.trim(),p=T([t,...n]),m=T([t||r[0]||``,...n]);t&&f&&f!==t?console.log(o({text:`🤔 ${o({text:`'${r[0]}'`,color:`cyan`})} ${s?`自动的为您匹配成`:`automatically match for you`} ${o({text:`'${p}'`,color:`cyan`})} `,color:`yellow`})):t&&console.log(o({text:`🤔 is running for you... ${p}`,color:`magenta`}));let h=()=>{switch(e){case`npm`:{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),T([`npm`,...e])}case`pnpm`:return T([`pnpm`,`run`,t,...n]);case`yarn`:return T([`yarn`,t,...n]);case`bun`:return T([`bun`,`run`,t,...n]);case`make`:return T([`make`,t,...n]);default:return T([t,...n])}},g=()=>{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),T([`npm`,...e])};switch(e){case`npm`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`pnpm`:{let{status:e,result:t=``}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});if(d=t,u=e,d.includes(`pnpm versions with respective Node.js version support`)){console.log(o({text:s?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let{status:e,result:t}=await a(g(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t}break}case`yarn`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`bun`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`make`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}}if(u===0){let e=T([`prun`,t,...n]);return await i(e),console.log(o({color:`green`,text:`\n${e} ${c} 🎉`}))}return console.log(o({color:`red`,text:`\ncommand ${o({bold:!0,color:`cyan`,text:`'${m}'`})} ${l} ❌`}))}let R=null;async function ce(){return R||(R=(await import(`@simon_he/colorize`)).default,R)}const z=new Map;function le(){let e=(n.env.CCOMMAND_NO_HISTORY||n.env.NO_HISTORY||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}function ue(){let e=n.env.CCOMMAND_HISTORY_HINT||``;if(e)return e;let r=n.env.HOME||p.homedir(),i=n.env.XDG_CACHE_HOME||t.join(r,`.cache`);return t.join(i,`ccommand`,`last-history`)}async function de(n){let r=ue();try{await e.mkdir(t.dirname(r),{recursive:!0});let i=Date.now();await e.writeFile(r,`${i}\t${n}\n`,`utf8`)}catch{}}async function B(r){if(le())return;let i=await ce();g(i({text:`${_?`快捷指令`:`shortcut command`}: ${r}`,color:`blue`,bold:!0}));let a=(n.env.SHELL||`/bin/bash`).split(`/`).pop()||`bash`,o=``,s=`bash`,c=n.env.HOME||p.homedir();switch(a){case`zsh`:o=t.join(c,`.zsh_history`),s=`zsh`;break;case`bash`:o=n.env.HISTFILE||t.join(c,`.bash_history`),s=`bash`;break;case`fish`:o=t.join(c,`.local`,`share`,`fish`,`fish_history`),s=`fish`;break;default:o=n.env.HISTFILE||t.join(c,`.bash_history`),s=`bash`}try{await de(r);try{await e.access(o)}catch{g(i({text:`${_?`未找到 ${a} 历史文件`:`${a} history file not found`}`,color:`yellow`}));return}let t=await e.stat(o).catch(()=>null),c=Math.floor(Date.now()/1e3),l=``;l=s===`zsh`?`: ${c}:0;${r}`:s===`fish`?`- cmd: ${r}\n when: ${c}`:n.env.HISTTIMEFORMAT?`#${c}\n${r}`:r;function u(e){if(s===`fish`){let t=e.split(/\r?\n/),n=[],r=[];for(let e of t)e.startsWith(`- cmd: `)?(r.length&&(n.push(r.join(`
|
|
2
|
+
`)),r=[]),r.push(e)):r.length?r.push(e):e.trim()!==``&&n.push(e);return r.length&&n.push(r.join(`
|
|
3
|
+
`)),n.filter(Boolean)}else if(s===`zsh`)return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);else{let t=e.split(/\r?\n/),n=[];for(let e=0;e<t.length;e++){let r=t[e];if(r.startsWith(`#`)){let i=t[e+1]??``;n.push(`${r}\n${i}`),e++}else r.trim()!==``&&n.push(r)}return n}}let d=[],p=z.get(o);d=p&&t&&p.mtimeMs===t.mtimeMs&&p.size===t.size&&p.format===s?p.entries.slice():u(await e.readFile(o,`utf8`));function m(e){if(s===`fish`){let t=e.split(`
|
|
4
|
+
`)[0].match(/^- cmd: (.*)$/);return(t?t[1]:e).trim()}else if(s===`zsh`){let t=e.match(/^[^;]*;(.+)$/);return(t?t[1]:e).trim()}else{if(e.startsWith(`#`)){let t=e.split(/\r?\n/);return(t[1]??t[0]).trim()}return e.trim()}}let h=[],v=m(l),y=null;for(let e of d){if(m(e)===v){if(s===`fish`){y=e;continue}continue}h.push(e)}if(s===`fish`&&y){let e=y.split(`
|
|
5
|
+
`),t=!1,n=e.map(e=>e.trim().startsWith(`when:`)||e.startsWith(` when:`)?(t=!0,` when: ${c}`):e);t||n.splice(1,0,` when: ${c}`),h.push(n.join(`
|
|
6
|
+
`))}else h.push(l);let b=``;b=s===`fish`?`${h.map(e=>e.trimEnd()).join(`
|
|
7
|
+
`)}\n`:`${h.join(`
|
|
8
|
+
`)}\n`;let x=`${o}.ccommand.tmp`;await e.writeFile(x,b,`utf8`),await e.rename(x,o);try{let t=await e.stat(o);z.set(o,{mtimeMs:t.mtimeMs,size:t.size,entries:h,format:s})}catch{z.set(o,{mtimeMs:Date.now(),size:f.byteLength(b),entries:h,format:s})}}catch(e){g(i({text:`${_?`❌ 添加到 ${a} 历史记录失败`:`❌ Failed to add to ${a} history`}${e?`: ${String(e)}`:``}`,color:`red`}))}}const fe=d(u),V={};async function H(e){if(V[e]!==void 0)return V[e];try{return await fe(`command -v ${e}`),V[e]=!0,!0}catch{return V[e]=!1,!1}}let U=null;async function pe(){return U===null&&(U=await H(`bun`)?`bun`:await H(`esno`)?`esno`:await H(`tsx`)?`tsx`:null),U}async function W(e,t,i,a){let o=T([`prun`,e]);await B(o);let{status:s}=await c(t,{errorExit:!1,isLog:!1,stdio:`inherit`}),l=s===0;return l||(n.exitCode=s??1),g(r({color:l?`green`:`red`,text:`\n"${o}" ${l?i:a} ${l?`🎉`:`❌`}`})),l}async function G(e,i,a){let o=t.extname(e),s=`node`;if(o===`.ts`)if(U===null&&await pe(),U)s=U;else return g(r({text:_?`没有找到可以直接执行TypeScript的工具,推荐安装下列工具之一:
|
|
9
|
+
- npm install -g bun
|
|
10
|
+
- npm install -g esno
|
|
11
|
+
- npm install -g tsx`:`No TypeScript executor found. Recommend installing one of:
|
|
12
|
+
- npm install -g bun
|
|
13
|
+
- npm install -g esno
|
|
14
|
+
- npm install -g tsx`,color:`yellow`})),n.exitCode=1,!1;return W(e,T([s,e]),i,a)}async function me(n,r,i){let a=[`.js`,`.ts`,`.mjs`,`.cjs`],o=t.extname(n);if(o&&a.includes(o)&&await e.stat(n).then(e=>e.isFile()).catch(()=>!1))return await G(n,r,i),!0;if(!o)for(let t of a){let a=`${n}${t}`;if(await e.stat(a).then(e=>e.isFile()).catch(()=>!1))return await G(a,r,i),!0}let s=await e.stat(n).catch(()=>null);if(s&&s.isDirectory())for(let o of a){let a=t.join(n,`index${o}`);if(await e.stat(a).then(e=>e.isFile()).catch(()=>!1))return await G(a,r,i),!0}return!1}async function he(e,n,i){e.endsWith(`.py`)?await W(e,`python ${e}`,n,i):e.endsWith(`.rs`)&&((await c(`rustc ${e}`)).status===0&&(await c(`./${t.basename(e,`.rs`)}`,{stdio:`inherit`})).status===0?(await B(`prun ${e}`),g(r({color:`green`,text:`\n"prun --${e}" ${n} 🎉`}))):g(r({color:`red`,text:`\ncommand "prun ${e}" ${i} ❌`})))}async function ge(t){try{let n=(await e.readFile(t,`utf-8`)).split(/\r?\n/),r=new Set;for(let e=0;e<n.length;e++){let t=n[e].trim();if(t.startsWith(`.PHONY:`)){let e=t.substring(7).replace(/\\\\$/g,``).trim();for(let t of e.split(/\s+/))t&&r.add(t)}}let i=[];for(let e of r){let t=``;for(let r=0;r<n.length;r++){let i=n[r];if(!i)continue;let a=i.trimStart();if(a.startsWith(`${e}:`)||a.startsWith(`${e} :`)){let e=a.split(`:`,2)[1]||``,i=e.indexOf(`;`);if(i!==-1&&(t=e.slice(i+1).trim()),!t&&r+1<n.length){let e=n[r+1];e.startsWith(` `)&&(t=e.trim())}if(!t){let n=e.trim();t=n?n.replace(/\s+/g,` `).slice(0,120):``}break}}i.push({name:e,detail:t?`${t}...`:``})}return i}catch{return[]}}const _e=new Set([`-`,`_`,` `,`.`,`/`,`\\`,`:`]);function ve(e){return e>=`a`&&e<=`z`}function ye(e){return e>=`A`&&e<=`Z`}function be(e,t){if(t<=0)return!0;let n=e[t-1]||``,r=e[t]||``;return _e.has(n)?!0:ve(n)&&ye(r)}function xe(e,t){let n=[],r=0;for(let i=0;i<t.length&&r<e.length;i++)t[i]===e[r]&&(n.push(i),r++);return r===e.length?n:null}function Se(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(!n)return{score:0,positions:[]};if(r===n)return{score:1e5,positions:[...t].map((e,t)=>t)};if(r.startsWith(n))return{score:9e4-(t.length-e.length),positions:[...e].map((e,t)=>t)};let i=r.indexOf(n);if(i!==-1)return{score:7e4-i,positions:[...e].map((e,t)=>i+t)};let a=xe(n,r);if(!a)return null;let o=1e3,s=-1;for(let e of a)o+=10,e===s+1&&(o+=15),e===0&&(o+=12),be(t,e)&&(o+=8),s!==-1&&(o-=e-s-1),s=e;return o+=Math.max(0,30-(t.length-e.length)),{score:o,positions:a}}function Ce(e,t){let n=e.trim().split(/\s+/).filter(Boolean);if(!n.length)return{score:0,positions:[]};let r=0,i=[];for(let e of n){let n=Se(e,t);if(!n)return null;r+=n.score,i.push(...n.positions)}return{score:r,positions:i}}function K(e,t){if(!t.trim())return e.map((e,t)=>({item:e,score:0,index:t,positions:[]}));let n=e.map((e,n)=>{let r=Ce(t,e);return r?{item:e,score:r.score,index:n,positions:r.positions}:null}).filter(Boolean);return n.sort((e,t)=>t.score===e.score?e.index-t.index:t.score-e.score),n}function q(e,t){return!t||t<=0||e.length<=t?e:t<=3?e.slice(0,t):`${e.slice(0,t-3)}...`}function we(e,t){if(!t||t<=0||e.length<=t)return{text:e,visibleLength:e.length};if(t<=3)return{text:e.slice(0,t),visibleLength:t};let n=t-3;return{text:`${e.slice(0,n)}...`,visibleLength:n}}function Te(e,t,n,r){if(!n||!t.length)return e;let i=new Set(t),a=``;for(let t=0;t<e.length;t++){let o=e[t]||``;i.has(t)?a+=`${n}${o}${r}`:a+=o}return a}function J(e,t){return t?`\u001B[2m${e}\u001B[0m`:e}function Y(){return!!(n.stdin.isTTY&&n.stdout.isTTY)}function Ee(){let e=(n.env.CCOMMAND_NO_PICKER||n.env.NO_PICKER||n.env.CCOMMAND_NO_GUM||n.env.NO_GUM||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}async function X(e){return!(Ee()||!Y()||n.env.CI)}async function Z(e,{placeholder:t,maxItems:r}={}){if(!Y())return{status:130,result:``};let i=n.stdin,a=n.stdout,o=!!(a.isTTY&&!n.env.NO_COLOR),s=(t||(_?`请选择一个选项`:`Select`)).trim(),c=_?`上/下选择 左/右移动 Enter确认 Esc取消`:`Up/Down Move Left/Right Cursor Enter select Esc cancel`,l=``,u=0,d=0,f=0,p=0,h=Math.max(4,Math.min(r||10,(a.rows||24)-5)),g=K(e,l),v=()=>{o&&a.write(`\x1B[?25l`)},y=()=>{o&&a.write(`\x1B[?25h`)},b=()=>{if(p){for(let e=0;e<p;e++)m.clearLine(a,0),e<p-1&&m.moveCursor(a,0,-1);m.cursorTo(a,0),p=0}},x=()=>{u<d?d=u:u>=d+h&&(d=u-h+1),d<0&&(d=0)},S=()=>{b();let e=[],t=`? ${s}`;e.push(J(q(t,a.columns),o));let n=` > ${l.slice(0,f)}|${l.slice(f)}`;e.push(q(n,a.columns)),g.length?(x(),g.slice(d,d+h).forEach((t,n)=>{let r=d+n===u,i=r?`> `:` `,s=a.columns?Math.max(0,a.columns-i.length):void 0,c=we(t.item,s),l=t.positions.filter(e=>e>=0&&e<c.visibleLength),f=o&&r?`\x1B[44m`:``,p=o?`${f}\u001B[1m\u001B[35m`:``,m=o?`\x1B[0m`:``,h=f?`${m}${f}`:m,g=``;f&&(g+=f),g+=i,g+=Te(c.text,l,p,h),f&&(g+=m),e.push(g)})):e.push(_?` (无匹配)`:` (no matches)`),e.push(``);let r=g.length?`(${u+1}/${g.length})`:``;e.push(J(` ${c} ${r}`.trimEnd(),o)),a.write(e.join(`
|
|
15
|
+
`)),p=e.length},C=()=>{g=K(e,l),u=0,u>=g.length&&(u=g.length-1),u<0&&(u=0),f>l.length&&(f=l.length),f<0&&(f=0),x()};return new Promise(e=>{let t=!1;function n(n,i){t||(t=!0,r(),e({status:n,result:i}))}function r(){i.removeListener(`data`,o),i.isTTY&&i.setRawMode(!1),i.pause(),b(),y()}function o(e){let t=e.toString(`utf8`);if(t===``||t===``)return n(130,``);if(t===`\r`||t===`
|
|
16
|
+
`){if(!g.length){a.write(`\x07`);return}return n(0,g[u]?.item||``)}if(t.startsWith(`\x1B`)){if(t===`\x1B`)return n(130,``);if(t===`\x1B[A`){g.length&&(u=u>0?u-1:g.length-1),S();return}if(t===`\x1B[B`){g.length&&(u=u<g.length-1?u+1:0),S();return}if(t===`\x1B[D`){f>0&&f--,S();return}if(t===`\x1B[C`){f<l.length&&f++,S();return}if(t===`\x1B[5~`){u=Math.max(0,u-h),S();return}if(t===`\x1B[6~`){u=Math.min(g.length-1,u+h),S();return}if(t===`\x1B[3~`){f<l.length&&(l=`${l.slice(0,f)}${l.slice(f+1)}`,C(),S());return}return}if(t===``||t===`\b`||t===`\b`){l.length&&f>0&&(l=`${l.slice(0,f-1)}${l.slice(f)}`,f=Math.max(0,f-1),C(),S());return}let r=``;for(let e of t)e>=` `&&e!==``&&(r+=e);r&&(l=`${l.slice(0,f)}${r}${l.slice(f)}`,f+=r.length,C(),S())}i.isTTY&&i.setRawMode(!0),i.resume(),i.on(`data`,o),v(),S()})}const De=a(o),Q=oe,Oe=k,$=se;function ke(e,t,n){return!!(n[1]&&t.length)}async function Ae(i=n.argv.slice(2)){let a=_?`当前目录不存在任何子目录`:`The current directory does not have any subdirectories`,o=_?`运行成功`:`run successfully`,l=_?`运行失败`:`run error`,u=ee(i);if(u[0]===`init`||u[0]===`--init`){let e=u[1],t=u[2],i=n.env.CCOMMAND_BIN,a=w(t||i||`ccommand`),o=n.env.SHELL||``,s=n.env.FISH_VERSION&&`fish`||n.env.ZSH_VERSION&&`zsh`||n.env.BASH_VERSION&&`bash`||o&&o.split(`/`).pop()||``,c=e||s||`zsh`,l=``;if(c===`zsh`)l=[`ccommand() {`,` local bin=${a}`,` local -a cmd`," cmd=(${=bin})",' command "${cmd[@]}" "$@"',`}`,``,`__ccommand_sync_history() {`,' local history_disable=${CCOMMAND_NO_HISTORY:-${NO_HISTORY:-""}}'," local history_disable_lower=${history_disable:l}",` if [[ $history_disable_lower == "1" || $history_disable_lower == "true" || $history_disable_lower == "yes" ]]; then`,` return`,` fi`," local history_hint=${CCOMMAND_HISTORY_HINT:-${XDG_CACHE_HOME:-$HOME/.cache}/ccommand/last-history}",` if [[ ! -f $history_hint ]]; then`,` return`,` fi`,` local line`,` line=$(<"$history_hint")`," local hint_ts=${line%%$'\\t'*}"," local hint_cmd=${line#*$'\\t'}",` if [[ -z $hint_ts || $hint_ts == $line ]]; then`,` hint_cmd=$line`,` hint_ts=""`,` fi`,' if [[ -n $hint_ts && $hint_ts == ${__CCOMMAND_HISTORY_HINT_TS:-""} ]]; then',` return`,` fi`,` __CCOMMAND_HISTORY_HINT_TS=$hint_ts`,` fc -R`,` if [[ $hint_cmd != pfind* ]]; then`,` return`,` fi`,` local last_line`,` last_line=$(fc -l -1 2>/dev/null)`,` local last_cmd`,` last_cmd=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*[0-9]+[[:space:]]*//")`,` if [[ $last_cmd == "$hint_cmd" ]]; then`,` return`,` fi`,` if [[ $last_cmd == ccommand || $last_cmd == ccommand\\ * ]]; then`,` local last_num`,` last_num=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*([0-9]+).*/\\1/")`,` if [[ -n $last_num ]]; then`,` history -d $last_num 2>/dev/null`,` fi`,` fi`,` print -s -- "$hint_cmd"`,`}`,``,`if ! typeset -f __ccommand_precmd >/dev/null; then`,` __ccommand_precmd() { __ccommand_sync_history }`,` autoload -Uz add-zsh-hook`,` add-zsh-hook precmd __ccommand_precmd`,`fi`].join(`
|
|
17
|
+
`);else if(c===`bash`)l=[`ccommand() {`,` local bin=${a}`,` local -a cmd`,` read -r -a cmd <<< "$bin"`,' command "${cmd[@]}" "$@"',`}`,``,`__ccommand_sync_history() {`,' local history_disable=${CCOMMAND_NO_HISTORY:-${NO_HISTORY:-""}}',` local history_disable_lower`,` history_disable_lower=$(printf '%s' "$history_disable" | tr '[:upper:]' '[:lower:]')`,` if [[ $history_disable_lower == "1" || $history_disable_lower == "true" || $history_disable_lower == "yes" ]]; then`,` return`,` fi`," local history_hint=${CCOMMAND_HISTORY_HINT:-${XDG_CACHE_HOME:-$HOME/.cache}/ccommand/last-history}",` if [[ ! -f $history_hint ]]; then`,` return`,` fi`,` local line`,` line=$(<"$history_hint")`,` local hint_ts="\${line%%$'\\t'*}"`,` local hint_cmd="\${line#*$'\\t'}"`,` if [[ -z $hint_ts || $hint_ts == "$line" ]]; then`,` hint_cmd="$line"`,` hint_ts=""`,` fi`,' if [[ -n $hint_ts && $hint_ts == "${__CCOMMAND_HISTORY_HINT_TS:-}" ]]; then',` return`,` fi`,` __CCOMMAND_HISTORY_HINT_TS=$hint_ts`,` if [[ $hint_cmd != pfind* ]]; then`,` return`,` fi`,` history -n`,` local last_line`,` last_line=$(history 1)`,` local last_cmd`,` last_cmd=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*[0-9]+[[:space:]]*//")`,` if [[ $last_cmd == "$hint_cmd" ]]; then`,` return`,` fi`,` if [[ $last_cmd == ccommand || $last_cmd == ccommand\\ * ]]; then`,` local last_num`,` last_num=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*([0-9]+).*/\\1/")`,` if [[ -n $last_num ]]; then`,` history -d "$last_num" 2>/dev/null`,` fi`,` fi`,` history -s -- "$hint_cmd"`,`}`,``,'if [[ -z "${__CCOMMAND_PROMPT_INSTALLED:-}" ]]; then',` __CCOMMAND_PROMPT_INSTALLED=1`,' if [[ -n "${PROMPT_COMMAND:-}" ]]; then',' PROMPT_COMMAND="__ccommand_sync_history;${PROMPT_COMMAND}"',` else`,` PROMPT_COMMAND="__ccommand_sync_history"`,` fi`,`fi`].join(`
|
|
18
|
+
`);else if(c===`fish`)l=[`function ccommand`,` set -l bin ${a}`,` set -l cmd (string split -- " " $bin)`,` command $cmd $argv`,` set -l history_disable $CCOMMAND_NO_HISTORY`,` if test -z "$history_disable"`,` set history_disable $NO_HISTORY`,` end`,` set history_disable (string lower -- (string trim -- "$history_disable"))`,` if test "$history_disable" != "1" -a "$history_disable" != "true" -a "$history_disable" != "yes"`,` history --merge`,` set -l history_hint $CCOMMAND_HISTORY_HINT`,` if test -z "$history_hint"`,` set -l cache_home $XDG_CACHE_HOME`,` if test -z "$cache_home"`,` set cache_home "$HOME/.cache"`,` end`,` set history_hint "$cache_home/ccommand/last-history"`,` end`,` if test -f "$history_hint"`,` set -l last_cmd (string trim -- (cat "$history_hint"))`,` set -l last_cmd (string replace -r "^[0-9]+\\t" "" -- "$last_cmd")`,` if string match -q "pfind*" -- "$last_cmd"`,` set -l last_hist (history --max=1)`,` if test "$last_hist" != "$last_cmd"`,` history add -- "$last_cmd"`,` end`,` end`,` end`,` end`,`end`].join(`
|
|
19
|
+
`);else return g(r({color:`red`,text:_?`不支持的 shell: ${c}`:`Unsupported shell: ${c}`}));return console.log(l)}if(u[0]===`-v`||u[0]===`--version`)return g(r({text:_?`ccommand 当前版本: ${h}`:`ccommand Version: ${h}`,color:`green`}));if(u[0]===`-h`||u[0]===`--help`){let e=(await import(`terminal-link`)).default,t=e(_?`打开一个新的问题`:`open an issue`,`https://github.com/Simon-He95/ccommand/issues`),n=e(_?`✨帮助点一个星星`:`✨star it`,`https://github.com/Simon-He95/ccommand`);return g(r({color:`white`,text:`
|
|
20
|
+
${r({bold:!0,text:`Common Commands:`,bgColor:`blue`})}
|
|
21
|
+
${r({text:`- ccommand -v 查看当前版本
|
|
22
|
+
- ccommand -help 查看帮助
|
|
23
|
+
- ccommand 执行当前package.json
|
|
24
|
+
- ccommand find 查找当前workspace的所有目录
|
|
25
|
+
- ccommand --init [zsh|bash|fish] [bin] 输出 shell 集成脚本(未传则自动检测)
|
|
26
|
+
`,color:`cyan`})}
|
|
27
|
+
If you encounter any problems, you can ${r({color:`magenta`,text:t})}.
|
|
28
|
+
If you like it, please ${r({text:n,bold:!0,color:`cyan`})} `}))}else if(u[0]?.endsWith(`.py`)||u[0]?.endsWith(`.rs`)){await he(u[0],o,l);return}let d;try{d=await s()}catch{try{if(await e.readFile(t.resolve(n.cwd(),`./Makefile`),`utf-8`)){d=`make`;let e=await ge(`./Makefile`),t=e.reduce((e,t)=>{let{name:n,detail:r}=t;return e[n]=r,e},{}),n=``,i=[];if(u.length){let e=u[0];if(i=u.slice(1),n=O(t,e)||``,!n)return g(r({color:`red`,text:y}))}else{if(!await X(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 make 目标名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a make target explicitly.`}));let{result:t,status:i}=await Z(e.map(e=>e.name),{placeholder:_?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(i===130)return x();n=t}await $(d,n.trim(),i,u,B,c,r,_,o,l);return}else return g(r({color:`red`,text:y}))}catch{if(u[0]!==`find`)return g(r({color:`red`,text:y}))}}let[f,p,m]=te(u),v=f,S;if(u[0]===`find`){if(p)await F(d),v=P().filter(e=>e.includes(p))[0];else if(d===`yarn`){if(await F(d),!P().length)return g(r({color:`yellow`,text:a}));if(!await X(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:t}=await Z(P(),{placeholder:_?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(v=e,t===130)return x()}else if(d===`pnpm`){if(await F(d),!P().length)return g(r({color:`yellow`,text:a}));if(!await X(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:t}=await Z(P(),{placeholder:_?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(t===130)return x();v=e.trim()}else return g(r({color:`red`,text:_?`find指令只能支持在yarn或pnpm的monorepo模式下使用`:`find command only support yarn or pnpm`}));S=await Q(v,d)||void 0}else{S=await Q(v,d)||void 0;try{let t=(await De(`./package.json`)||{})?.scripts;if(t&&t[u[0]]){await $(d,u[0],u.slice(1),u,B,c,r,_,o,l);return}else if(t&&f){let i=O(t,u[0]);if(i){let e=u.slice(1);await $(d,i,e,u,B,c,r,_,o,l);return}else{if(await me(u[0],o,l))return;let t=`${f}.py`;if(await e.stat(t).then(e=>e.isFile()).catch(()=>!1)){g(r({text:`🤔 ${_?`找到Python文件`:`Found Python file`}: ${t}`,color:`yellow`}));return}let i=`${f}.rs`;if(await e.stat(i).then(e=>e.isFile()).catch(()=>!1))return;g(r({color:`red`,text:`"${u[0]}" ${_?`在工作区、当前目录中找不到任何可执行的脚本或文件,请检查`:`is not found in workspace, current directory or current scripts, please check`}`})),n.exit(1)}}}catch{}}let C=``;if(!p||u[0]===`find`&&(!u[2]||u[2].startsWith(`--`))){if(!S||Object.keys(S).length===0)return g(r({color:`red`,text:_?`找不到任何可执行脚本`:`No scripts found`}));let e=Object.keys(S).map(e=>`${e}: ${(S?.[e]??``).replace(/[\r\n]+/g,` `)}`);if(!await X(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入脚本名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a script name explicitly.`}));let{result:t,status:n}=await Z(e,{placeholder:_?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(n===130)return x();C=t.substring(0,t.indexOf(`: `))}if(!p&&!C)return x();g(r({text:`🤔 ${b} ${C}`,color:`magenta`}));let{command:E,text:D,val:k,historyText:A}=await Oe({termStart:d,params:m,dirname:v,argv:u,val:C,runMsg:b,isZh:_,pushHistory:B,jsShell:c,isNeedPrefix:e=>ke(u[0],e,u),fuzzyWorkspace:p,recordHistory:u[0]!==`find`}),j=E;C=k;let{status:M,result:N=``}=await c(j,{errorExit:!1,stdio:`inherit`});if(u[0]===`find`&&await B(A),M===0)return g(r({color:`green`,text:`\n${D} 🎉`}));if(N.includes(`pnpm versions with respective Node.js version support`)){g(r({text:_?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let e=[...m];e[0]===`--`&&e.shift();let{status:t}=await c(T([`npm`,`run`,C,...e.length?[`--`,...e]:[]]),`inherit`);if(t===0)return g(r({color:`green`,text:`\n${D} 🎉`}))}g(r({color:`red`,text:`\ncommand ${C} ${l} ❌`}))}export{Ae as t};
|
package/package.json
CHANGED
package/dist/src-CyfkX82P.mjs
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import e from"node:fs/promises";import t from"node:path";import n from"node:process";import r from"@simon_he/colorize";import{isPlainObject as i,memorizeFn as a}from"lazy-js-utils";import{getPkg as o,getPkgTool as s,jsShell as c}from"lazy-js-utils/node";import l from"fast-glob";import{exec as u}from"node:child_process";import{promisify as d}from"node:util";import{Buffer as f}from"node:buffer";import p from"node:os";var m=`1.0.90`;const h=console.log,g=`__ccommand__split`,_=(n.env.PI_LANG||n.env.LANG||``).startsWith(`zh`),v=_?`已取消...`:`Cancelled...`,y=_?`当前目录并未找到 package.json 文件`:`package.json file not found in current directory`,b=_?`正在为您执行...`:`is running for you...`;function x(){return h(`[33m${v}[0m`),n.exit(130)}const S=/^[\w./:@%+=,-]+$/;function C(e){let t=[],n=``,r=null,i=!1,a=()=>{i&&=(t.push(n),n=``,!1)};for(let t=0;t<e.length;t++){let o=e[t];if(r){if(o===r){r=null,i=!0;continue}if(r===`"`&&o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0;continue}if(o===`"`||o===`'`){r=o,i=!0;continue}if(/\s/.test(o)){for(a();t+1<e.length&&/\s/.test(e[t+1]);)t++;continue}if(o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0}return a(),t}function ee(e){if(!e)return[];if(Array.isArray(e))return e;let t=e.trim();return t?C(t):[]}function w(e){return e===``?`''`:S.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function T(e){return e.filter(e=>typeof e==`string`).map(w).join(` `)}function E(e){return S.test(e)}function te(e){let t=e[0];if(!t)return[``,``,[]];let n=e.indexOf(`--`);if(n!==-1){let t=e.slice(0,n),r=e.slice(n+1),i=t[0]||``,a=t[1]||``,o=t.slice(2);return i.startsWith(`-`)?[``,``,e.slice()]:[i,a,[...o,...r]]}return t.startsWith(`-`)?[``,``,e.slice()]:e[1]&&e[1].startsWith(`-`)?[t,``,e.slice(1)]:[t,e[1]||``,e.slice(2)]}function D(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function O(e,t){let r=Object.keys(e),i=r.find(e=>e.startsWith(t));if(i)return i;try{if(!t)return;let e=t.split(``).map(e=>D(e)).join(`[_-\\w$.:]*`),n=new RegExp(e);return r.find(e=>n.test(e))}catch(e){h(`${_?`正则错误`:`RegExp error`}: ${e}`),n.exit(1)}}async function k(e){let{termStart:t,params:n,dirname:r,argv:i,val:a,isZh:o,pushHistory:s,jsShell:c,isNeedPrefix:l,fuzzyWorkspace:u}=e,d=[...n||[]],f=``;t!==`npm`&&d.length&&!d[0].startsWith(`--`)&&(f=d[0],d=d.slice(1));let p=f||a||u||``;a=`${p}`;let m=l(d)&&d.length>0&&d[0]!==`--`,h=[];if(t===`npm`){h.push(`run`),r&&h.push(`--prefix`,r),p&&h.push(p);let e=[...d];e[0]===`--`&&e.shift(),e.length&&h.push(`--`,...e)}else t===`pnpm`?(h.push(`run`),r&&h.push(`--filter`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`yarn`?(r&&h.push(`workspace`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`bun`?(h.push(`run`),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`make`&&(p&&h.push(p),m&&h.push(`--`),h.push(...d));let g=T([t,...h]),_=[];return i[0]===`find`?(_.push(`pfind`),r&&_.push(r)):_.push(`prun`),p&&_.push(p),_.push(...d),await s(T(_)),{command:g,text:_.map((e,t)=>t===_.length-1&&E(e)?e:w(e)).join(` `),val:a}}let A=null,j=[],M=null,N=null;function P(){return j}async function F(r){let i=r===`pnpm`?t.resolve(n.cwd(),`pnpm-workspace.yaml`):t.resolve(n.cwd(),`package.json`);try{try{N=(await e.stat(i)).mtimeMs}catch{}return await e.readFile(i,`utf-8`)}catch{return``}}async function ne(e,t){if(!t)return[];if(e===`pnpm`)try{if(!A){let e=await import(`yamljs`);A=e&&e.default||e}let e=A.parse(t)?.packages;return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}try{let e=JSON.parse(t)?.workspaces;return i(e)?e?.packages||[]:Array.isArray(e)?e:[]}catch{return[]}}async function I(e){if(!e.length)return{};let t=await l(e.map(e=>`${e}/package.json`),{dot:!0,ignore:[`**/node_modules/**`]});return(await Promise.all(t.map(async e=>{try{let t=await o(e);if(!t)return null;let{name:n,scripts:r}=t;return{name:n,scripts:r}}catch{return null}}))).reduce((e,t)=>(!t||!t.name||!t.scripts||(e[t.name]=Object.keys(t.scripts).reduce((e,n)=>(n.startsWith(`//`)||(e[n]=t.scripts[n]),e),{})),e),{})}async function re(r){if(M)try{let i=r===`pnpm`?t.resolve(n.cwd(),`pnpm-workspace.yaml`):t.resolve(n.cwd(),`package.json`),a=await e.stat(i);if(N&&a.mtimeMs<=N)return M}catch{return M}return M=await I(await ne(r,await F(r)))||{},j=Object.keys(M).filter(e=>M&&M[e]&&Object.keys(M[e]).length),M}async function L(e){return re(e)}const R=a(o),z={};async function ie(e,t){try{let n=e||`root`;if(z[n])return z[n];let r;return!e||t===`bun`||t===`npm`?r=(await R(`./package.json`))?.scripts:(t===`pnpm`||t===`yarn`)&&(r=(await L(t))[e]||(await R(`${e}/package.json`))?.scripts),r&&(z[n]=r),r}catch{return null}}async function ae(e,t,n,r,i,a,o,s,c,l){let u,d=``,f=r[0]?.trim(),p=T([t,...n]),m=T([t||r[0]||``,...n]);t&&f&&f!==t?console.log(o({text:`🤔 ${o({text:`'${r[0]}'`,color:`cyan`})} ${s?`自动的为您匹配成`:`automatically match for you`} ${o({text:`'${p}'`,color:`cyan`})} `,color:`yellow`})):t&&console.log(o({text:`🤔 is running for you... ${p}`,color:`magenta`}));let h=()=>{switch(e){case`npm`:{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),T([`npm`,...e])}case`pnpm`:return T([`pnpm`,`run`,t,...n]);case`yarn`:return T([`yarn`,t,...n]);case`bun`:return T([`bun`,`run`,t,...n]);case`make`:return T([`make`,t,...n]);default:return T([t,...n])}},g=()=>{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),T([`npm`,...e])};switch(e){case`npm`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`pnpm`:{let{status:e,result:t=``}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});if(d=t,u=e,d.includes(`pnpm versions with respective Node.js version support`)){console.log(o({text:s?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let{status:e,result:t}=await a(g(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t}break}case`yarn`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`bun`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`make`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}}if(u===0){let e=T([`prun`,t,...n]);return await i(e),console.log(o({color:`green`,text:`\n${e} ${c} 🎉`}))}return console.log(o({color:`red`,text:`\ncommand ${o({bold:!0,color:`cyan`,text:`'${m}'`})} ${l} ❌`}))}let B=null;async function oe(){return B||(B=(await import(`@simon_he/colorize`)).default,B)}const V=new Map;function se(){let e=(n.env.CCOMMAND_NO_HISTORY||n.env.NO_HISTORY||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}async function H(r){if(se())return;let i=await oe();h(i({text:`${_?`快捷指令`:`shortcut command`}: ${r}`,color:`blue`,bold:!0}));let a=(n.env.SHELL||`/bin/bash`).split(`/`).pop()||`bash`,o=``,s=`bash`,c=n.env.HOME||p.homedir();switch(a){case`zsh`:o=t.join(c,`.zsh_history`),s=`zsh`;break;case`bash`:o=n.env.HISTFILE||t.join(c,`.bash_history`),s=`bash`;break;case`fish`:o=t.join(c,`.local`,`share`,`fish`,`fish_history`),s=`fish`;break;default:o=n.env.HISTFILE||t.join(c,`.bash_history`),s=`bash`}try{try{await e.access(o)}catch{h(i({text:`${_?`未找到 ${a} 历史文件`:`${a} history file not found`}`,color:`yellow`}));return}let t=await e.stat(o).catch(()=>null),c=Math.floor(Date.now()/1e3),l=``;l=s===`zsh`?`: ${c}:0;${r}`:s===`fish`?`- cmd: ${r}\n when: ${c}`:n.env.HISTTIMEFORMAT?`#${c}\n${r}`:r;function u(e){if(s===`fish`){let t=e.split(/\r?\n/),n=[],r=[];for(let e of t)e.startsWith(`- cmd: `)?(r.length&&(n.push(r.join(`
|
|
2
|
-
`)),r=[]),r.push(e)):r.length?r.push(e):e.trim()!==``&&n.push(e);return r.length&&n.push(r.join(`
|
|
3
|
-
`)),n.filter(Boolean)}else if(s===`zsh`)return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);else{let t=e.split(/\r?\n/),n=[];for(let e=0;e<t.length;e++){let r=t[e];if(r.startsWith(`#`)){let i=t[e+1]??``;n.push(`${r}\n${i}`),e++}else r.trim()!==``&&n.push(r)}return n}}let d=[],p=V.get(o);d=p&&t&&p.mtimeMs===t.mtimeMs&&p.size===t.size&&p.format===s?p.entries.slice():u(await e.readFile(o,`utf8`));function m(e){if(s===`fish`){let t=e.split(`
|
|
4
|
-
`)[0].match(/^- cmd: (.*)$/);return(t?t[1]:e).trim()}else if(s===`zsh`){let t=e.match(/^[^;]*;(.+)$/);return(t?t[1]:e).trim()}else{if(e.startsWith(`#`)){let t=e.split(/\r?\n/);return(t[1]??t[0]).trim()}return e.trim()}}let g=[],v=m(l),y=null;for(let e of d){if(m(e)===v){if(s===`fish`){y=e;continue}continue}g.push(e)}if(s===`fish`&&y){let e=y.split(`
|
|
5
|
-
`),t=!1,n=e.map(e=>e.trim().startsWith(`when:`)||e.startsWith(` when:`)?(t=!0,` when: ${c}`):e);t||n.splice(1,0,` when: ${c}`),g.push(n.join(`
|
|
6
|
-
`))}else g.push(l);let b=``;b=s===`fish`?`${g.map(e=>e.trimEnd()).join(`
|
|
7
|
-
`)}\n`:`${g.join(`
|
|
8
|
-
`)}\n`;let x=`${o}.ccommand.tmp`;await e.writeFile(x,b,`utf8`),await e.rename(x,o);try{let t=await e.stat(o);V.set(o,{mtimeMs:t.mtimeMs,size:t.size,entries:g,format:s})}catch{V.set(o,{mtimeMs:Date.now(),size:f.byteLength(b),entries:g,format:s})}}catch(e){h(i({text:`${_?`❌ 添加到 ${a} 历史记录失败`:`❌ Failed to add to ${a} history`}${e?`: ${String(e)}`:``}`,color:`red`}))}}const ce=d(u),U={};async function W(e){if(U[e]!==void 0)return U[e];try{return await ce(`command -v ${e}`),U[e]=!0,!0}catch{return U[e]=!1,!1}}let G=null;async function le(){return G===null&&(G=await W(`bun`)?`bun`:await W(`esno`)?`esno`:await W(`tsx`)?`tsx`:null),G}async function K(e,t,i,a){let o=T([`prun`,e]);await H(o);let{status:s}=await c(t,{errorExit:!1,isLog:!1,stdio:`inherit`}),l=s===0;return l||(n.exitCode=s??1),h(r({color:l?`green`:`red`,text:`\n"${o}" ${l?i:a} ${l?`🎉`:`❌`}`})),l}async function q(e,i,a){let o=t.extname(e),s=`node`;if(o===`.ts`)if(G===null&&await le(),G)s=G;else return h(r({text:_?`没有找到可以直接执行TypeScript的工具,推荐安装下列工具之一:
|
|
9
|
-
- npm install -g bun
|
|
10
|
-
- npm install -g esno
|
|
11
|
-
- npm install -g tsx`:`No TypeScript executor found. Recommend installing one of:
|
|
12
|
-
- npm install -g bun
|
|
13
|
-
- npm install -g esno
|
|
14
|
-
- npm install -g tsx`,color:`yellow`})),n.exitCode=1,!1;return K(e,T([s,e]),i,a)}async function ue(n,r,i){let a=[`.js`,`.ts`,`.mjs`,`.cjs`],o=t.extname(n);if(o&&a.includes(o)&&await e.stat(n).then(e=>e.isFile()).catch(()=>!1))return await q(n,r,i),!0;if(!o)for(let t of a){let a=`${n}${t}`;if(await e.stat(a).then(e=>e.isFile()).catch(()=>!1))return await q(a,r,i),!0}let s=await e.stat(n).catch(()=>null);if(s&&s.isDirectory())for(let o of a){let a=t.join(n,`index${o}`);if(await e.stat(a).then(e=>e.isFile()).catch(()=>!1))return await q(a,r,i),!0}return!1}async function de(e,n,i){e.endsWith(`.py`)?await K(e,`python ${e}`,n,i):e.endsWith(`.rs`)&&((await c(`rustc ${e}`)).status===0&&(await c(`./${t.basename(e,`.rs`)}`,{stdio:`inherit`})).status===0?(await H(`prun ${e}`),h(r({color:`green`,text:`\n"prun --${e}" ${n} 🎉`}))):h(r({color:`red`,text:`\ncommand "prun ${e}" ${i} ❌`})))}const J=console.log;let Y=null;async function X(){return Y||(Y=(await import(`@simon_he/colorize`)).default,Y)}function fe(){let e=(n.env.CCOMMAND_NO_GUM||n.env.NO_GUM||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}function pe(){return!!(n.stdin.isTTY&&n.stdout.isTTY)}async function me(e){if(fe()||!pe()||n.env.CI)return!1;try{if((await c(`gum -v`,{stdio:`pipe`,errorExit:!1})).status===0)return!0;if(J((await X())({color:`blue`,text:e?`正在为您安装gum...`:`install gum...`})),(await c(`brew install gum`,{errorExit:!1})).status===0||(await c(`sudo mkdir -p /etc/apt/keyrings && curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg && echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list && sudo apt update && sudo apt install -y gum`,{errorExit:!1})).status===0)return J((await X())({color:`green`,text:e?`gum安装成功 🎉`:`gum install successfully 🎉`})),!0;let t=(await import(`terminal-link`)).default,n=t(e?`gum官网链接`:`the official website of gum`,`https://github.com/charmbracelet/gum#installation`),r=await X();return J(r({color:`red`,text:`${e?`gum安装失败,你可以自行从以下链接安装`:`gum install error, you can install it yourself through`} ${r({color:`yellow`,text:n,bold:!0})}`})),!1}catch(e){return J((await X())({color:`red`,text:`gum install check failed: ${String(e)}`})),!1}}async function Z(e){return me(e)}async function he(t){try{let n=(await e.readFile(t,`utf-8`)).split(/\r?\n/),r=new Set;for(let e=0;e<n.length;e++){let t=n[e].trim();if(t.startsWith(`.PHONY:`)){let e=t.substring(7).replace(/\\\\$/g,``).trim();for(let t of e.split(/\s+/))t&&r.add(t)}}let i=[];for(let e of r){let t=``;for(let r=0;r<n.length;r++){let i=n[r];if(!i)continue;let a=i.trimStart();if(a.startsWith(`${e}:`)||a.startsWith(`${e} :`)){let e=a.split(`:`,2)[1]||``,i=e.indexOf(`;`);if(i!==-1&&(t=e.slice(i+1).trim()),!t&&r+1<n.length){let e=n[r+1];e.startsWith(` `)&&(t=e.trim())}if(!t){let n=e.trim();t=n?n.replace(/\s+/g,` `).slice(0,120):``}break}}i.push({name:e,detail:t?`${t}...`:``})}return i}catch{return[]}}const ge=a(o),Q=ie,_e=k,$=ae;function ve(e,t,n){return!!(n[1]&&t.length)}async function ye(i=n.argv.slice(2)){let a=_?`当前目录不存在任何子目录`:`The current directory does not have any subdirectories`,o=_?`运行成功`:`run successfully`,l=_?`运行失败`:`run error`,u=ee(i);if(u[0]===`-v`||u[0]===`--version`)return h(r({text:_?`ccommand 当前版本: ${m}`:`ccommand Version: ${m}`,color:`green`}));if(u[0]===`-h`||u[0]===`--help`){let e=(await import(`terminal-link`)).default,t=e(_?`打开一个新的问题`:`open an issue`,`https://github.com/Simon-He95/ccommand/issues`),n=e(_?`✨帮助点一个星星`:`✨star it`,`https://github.com/Simon-He95/ccommand`);return h(r({color:`white`,text:`
|
|
15
|
-
${r({bold:!0,text:`Common Commands:`,bgColor:`blue`})}
|
|
16
|
-
${r({text:`- ccommand -v 查看当前版本
|
|
17
|
-
- ccommand -help 查看帮助
|
|
18
|
-
- ccommand 执行当前package.json
|
|
19
|
-
- ccommand find 查找当前workspace的所有目录
|
|
20
|
-
`,color:`cyan`})}
|
|
21
|
-
If you encounter any problems, you can ${r({color:`magenta`,text:t})}.
|
|
22
|
-
If you like it, please ${r({text:n,bold:!0,color:`cyan`})} `}))}else if(u[0]?.endsWith(`.py`)||u[0]?.endsWith(`.rs`)){await de(u[0],o,l);return}let d;try{d=await s()}catch{try{if(await e.readFile(t.resolve(n.cwd(),`./Makefile`),`utf-8`)){d=`make`;let e=await he(`./Makefile`),t=e.reduce((e,t)=>{let{name:n,detail:r}=t;return e[n]=r,e},{}),n=``,i=[];if(u.length){let e=u[0];if(i=u.slice(1),n=O(t,e)||``,!n)return h(r({color:`red`,text:y}))}else{if(!await Z(_))return h(r({color:`yellow`,text:_?`未检测到可用的交互环境或 gum 已被禁用,请直接传入 make 目标名称`:`Gum is unavailable (non-interactive or disabled). Please pass a make target explicitly.`}));let{result:t,status:i}=await c(`echo "${e.map(e=>e.name).join(`
|
|
23
|
-
`)}" | gum filter --placeholder=" 🤔请选择一个要执行的指令"`,`pipe`);if(i===130)return x();n=t}await $(d,n.trim(),i,u,H,c,r,_,o,l);return}else return h(r({color:`red`,text:y}))}catch{if(u[0]!==`find`)return h(r({color:`red`,text:y}))}}let[f,p,v]=te(u),S=f,C;if(u[0]===`find`){if(p)await L(d),S=P().filter(e=>e.includes(p))[0];else if(d===`yarn`){if(await L(d),!P().length)return h(r({color:`yellow`,text:a}));if(!await Z(_))return h(r({color:`yellow`,text:_?`未检测到可用的交互环境或 gum 已被禁用,请直接传入 workspace 名称`:`Gum is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:t}=await c(`echo ${P().join(`,`)} | sed "s/,/\\n/g" | gum filter --placeholder=" 🤔${_?`请选择一个要执行的目录`:`Please select a directory to execute`}"`,[`inherit`,`pipe`,`inherit`]);if(S=e,t===130)return x()}else if(d===`pnpm`){if(await L(d),!P().length)return h(r({color:`yellow`,text:a}));if(!await Z(_))return h(r({color:`yellow`,text:_?`未检测到可用的交互环境或 gum 已被禁用,请直接传入 workspace 名称`:`Gum is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:t}=await c(`echo ${P().join(`,`)} | sed "s/,/\\n/g" | gum filter --placeholder=" 🤔${_?`请选择一个要执行的目录`:`Please select a directory to execute`}"`,[`inherit`,`pipe`,`inherit`]);if(t===130)return x();S=e.trim()}else return h(r({color:`red`,text:_?`find指令只能支持在yarn或pnpm的monorepo模式下使用`:`find command only support yarn or pnpm`}));C=await Q(S,d)||void 0}else{C=await Q(S,d)||void 0;try{let t=(await ge(`./package.json`)||{})?.scripts;if(t&&t[u[0]]){await $(d,u[0],u.slice(1),u,H,c,r,_,o,l);return}else if(t&&f){let i=O(t,u[0]);if(i){let e=u.slice(1);await $(d,i,e,u,H,c,r,_,o,l);return}else{if(await ue(u[0],o,l))return;let t=`${f}.py`;if(await e.stat(t).then(e=>e.isFile()).catch(()=>!1)){h(r({text:`🤔 ${_?`找到Python文件`:`Found Python file`}: ${t}`,color:`yellow`}));return}let i=`${f}.rs`;if(await e.stat(i).then(e=>e.isFile()).catch(()=>!1))return;h(r({color:`red`,text:`"${u[0]}" ${_?`在工作区、当前目录中找不到任何可执行的脚本或文件,请检查`:`is not found in workspace, current directory or current scripts, please check`}`})),n.exit(1)}}}catch{}}let w=[],E=``;if(!p||u[0]===`find`&&(!u[2]||u[2].startsWith(`--`))){if(!C||Object.keys(C).length===0)return h(r({color:`red`,text:_?`找不到任何可执行脚本`:`No scripts found`}));let e=Object.keys(C).reduce((e,t)=>{let n=C?.[t]??``;return w.push(t),e+=`"${t}: ${n.replace(/\\/g,`\\\\`).replace(/(["`])/g,`\\$1`)}"${g}`,e},``);if(!await Z(_))return h(r({color:`yellow`,text:_?`未检测到可用的交互环境或 gum 已被禁用,请直接传入脚本名称`:`Gum is unavailable (non-interactive or disabled). Please pass a script name explicitly.`}));let{result:t,status:n}=await c(`echo ${e} | sed "s/${g}/\\n/g" | gum filter --placeholder=" 🤔请选择一个要执行的指令"`,{stdio:[`inherit`,`pipe`,`inherit`],isLog:!1});if(n===130)return x();E=t.substring(0,t.indexOf(`: `))}if(!p&&!E)return x();h(r({text:`🤔 ${b} ${E}`,color:`magenta`}));let{command:D,text:k,val:A}=await _e({termStart:d,params:v,dirname:S,argv:u,val:E,runMsg:b,isZh:_,pushHistory:H,jsShell:c,isNeedPrefix:e=>ve(u[0],e,u),fuzzyWorkspace:p}),j=D;E=A;let{status:M,result:N=``}=await c(j,{errorExit:!1,stdio:`inherit`});if(M===0)return h(r({color:`green`,text:`\n${k} 🎉`}));if(N.includes(`pnpm versions with respective Node.js version support`)){h(r({text:_?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let e=[...v];e[0]===`--`&&e.shift();let{status:t}=await c(T([`npm`,`run`,E,...e.length?[`--`,...e]:[]]),`inherit`);if(t===0)return h(r({color:`green`,text:`\n${k} 🎉`}))}h(r({color:`red`,text:`\ncommand ${E} ${l} ❌`}))}export{ye as t};
|
package/dist/src-Hds9Ed78.cjs
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs/promises`);c=s(c);let l=require(`node:path`);l=s(l);let u=require(`node:process`);u=s(u);let d=require(`@simon_he/colorize`);d=s(d);let f=require(`lazy-js-utils`),p=require(`lazy-js-utils/node`),m=require(`fast-glob`);m=s(m);let h=require(`node:child_process`),g=require(`node:util`),_=require(`node:buffer`),v=require(`node:os`);v=s(v);var y=`1.0.90`;const b=console.log,x=`__ccommand__split`,S=(u.default.env.PI_LANG||u.default.env.LANG||``).startsWith(`zh`),C=S?`已取消...`:`Cancelled...`,w=S?`当前目录并未找到 package.json 文件`:`package.json file not found in current directory`,T=S?`正在为您执行...`:`is running for you...`;function E(){return b(`[33m${C}[0m`),u.default.exit(130)}const D=/^[\w./:@%+=,-]+$/;function O(e){let t=[],n=``,r=null,i=!1,a=()=>{i&&=(t.push(n),n=``,!1)};for(let t=0;t<e.length;t++){let o=e[t];if(r){if(o===r){r=null,i=!0;continue}if(r===`"`&&o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0;continue}if(o===`"`||o===`'`){r=o,i=!0;continue}if(/\s/.test(o)){for(a();t+1<e.length&&/\s/.test(e[t+1]);)t++;continue}if(o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0}return a(),t}function ee(e){if(!e)return[];if(Array.isArray(e))return e;let t=e.trim();return t?O(t):[]}function k(e){return e===``?`''`:D.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function A(e){return e.filter(e=>typeof e==`string`).map(k).join(` `)}function j(e){return D.test(e)}function te(e){let t=e[0];if(!t)return[``,``,[]];let n=e.indexOf(`--`);if(n!==-1){let t=e.slice(0,n),r=e.slice(n+1),i=t[0]||``,a=t[1]||``,o=t.slice(2);return i.startsWith(`-`)?[``,``,e.slice()]:[i,a,[...o,...r]]}return t.startsWith(`-`)?[``,``,e.slice()]:e[1]&&e[1].startsWith(`-`)?[t,``,e.slice(1)]:[t,e[1]||``,e.slice(2)]}function ne(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function M(e,t){let n=Object.keys(e),r=n.find(e=>e.startsWith(t));if(r)return r;try{if(!t)return;let e=t.split(``).map(e=>ne(e)).join(`[_-\\w$.:]*`),r=new RegExp(e);return n.find(e=>r.test(e))}catch(e){b(`${S?`正则错误`:`RegExp error`}: ${e}`),u.default.exit(1)}}async function re(e){let{termStart:t,params:n,dirname:r,argv:i,val:a,isZh:o,pushHistory:s,jsShell:c,isNeedPrefix:l,fuzzyWorkspace:u}=e,d=[...n||[]],f=``;t!==`npm`&&d.length&&!d[0].startsWith(`--`)&&(f=d[0],d=d.slice(1));let p=f||a||u||``;a=`${p}`;let m=l(d)&&d.length>0&&d[0]!==`--`,h=[];if(t===`npm`){h.push(`run`),r&&h.push(`--prefix`,r),p&&h.push(p);let e=[...d];e[0]===`--`&&e.shift(),e.length&&h.push(`--`,...e)}else t===`pnpm`?(h.push(`run`),r&&h.push(`--filter`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`yarn`?(r&&h.push(`workspace`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`bun`?(h.push(`run`),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`make`&&(p&&h.push(p),m&&h.push(`--`),h.push(...d));let g=A([t,...h]),_=[];return i[0]===`find`?(_.push(`pfind`),r&&_.push(r)):_.push(`prun`),p&&_.push(p),_.push(...d),await s(A(_)),{command:g,text:_.map((e,t)=>t===_.length-1&&j(e)?e:k(e)).join(` `),val:a}}let N=null,P=[],F=null,I=null;function L(){return P}async function ie(e){let t=e===`pnpm`?l.default.resolve(u.default.cwd(),`pnpm-workspace.yaml`):l.default.resolve(u.default.cwd(),`package.json`);try{try{I=(await c.default.stat(t)).mtimeMs}catch{}return await c.default.readFile(t,`utf-8`)}catch{return``}}async function ae(e,t){if(!t)return[];if(e===`pnpm`)try{if(!N){let e=await import(`yamljs`);N=e&&e.default||e}let e=N.parse(t)?.packages;return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}try{let e=JSON.parse(t)?.workspaces;return(0,f.isPlainObject)(e)?e?.packages||[]:Array.isArray(e)?e:[]}catch{return[]}}async function oe(e){if(!e.length)return{};let t=await(0,m.default)(e.map(e=>`${e}/package.json`),{dot:!0,ignore:[`**/node_modules/**`]});return(await Promise.all(t.map(async e=>{try{let t=await(0,p.getPkg)(e);if(!t)return null;let{name:n,scripts:r}=t;return{name:n,scripts:r}}catch{return null}}))).reduce((e,t)=>(!t||!t.name||!t.scripts||(e[t.name]=Object.keys(t.scripts).reduce((e,n)=>(n.startsWith(`//`)||(e[n]=t.scripts[n]),e),{})),e),{})}async function se(e){if(F)try{let t=e===`pnpm`?l.default.resolve(u.default.cwd(),`pnpm-workspace.yaml`):l.default.resolve(u.default.cwd(),`package.json`),n=await c.default.stat(t);if(I&&n.mtimeMs<=I)return F}catch{return F}return F=await oe(await ae(e,await ie(e)))||{},P=Object.keys(F).filter(e=>F&&F[e]&&Object.keys(F[e]).length),F}async function R(e){return se(e)}const z=(0,f.memorizeFn)(p.getPkg),B={};async function ce(e,t){try{let n=e||`root`;if(B[n])return B[n];let r;return!e||t===`bun`||t===`npm`?r=(await z(`./package.json`))?.scripts:(t===`pnpm`||t===`yarn`)&&(r=(await R(t))[e]||(await z(`${e}/package.json`))?.scripts),r&&(B[n]=r),r}catch{return null}}async function le(e,t,n,r,i,a,o,s,c,l){let u,d=``,f=r[0]?.trim(),p=A([t,...n]),m=A([t||r[0]||``,...n]);t&&f&&f!==t?console.log(o({text:`🤔 ${o({text:`'${r[0]}'`,color:`cyan`})} ${s?`自动的为您匹配成`:`automatically match for you`} ${o({text:`'${p}'`,color:`cyan`})} `,color:`yellow`})):t&&console.log(o({text:`🤔 is running for you... ${p}`,color:`magenta`}));let h=()=>{switch(e){case`npm`:{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),A([`npm`,...e])}case`pnpm`:return A([`pnpm`,`run`,t,...n]);case`yarn`:return A([`yarn`,t,...n]);case`bun`:return A([`bun`,`run`,t,...n]);case`make`:return A([`make`,t,...n]);default:return A([t,...n])}},g=()=>{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),A([`npm`,...e])};switch(e){case`npm`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`pnpm`:{let{status:e,result:t=``}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});if(d=t,u=e,d.includes(`pnpm versions with respective Node.js version support`)){console.log(o({text:s?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let{status:e,result:t}=await a(g(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t}break}case`yarn`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`bun`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`make`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}}if(u===0){let e=A([`prun`,t,...n]);return await i(e),console.log(o({color:`green`,text:`\n${e} ${c} 🎉`}))}return console.log(o({color:`red`,text:`\ncommand ${o({bold:!0,color:`cyan`,text:`'${m}'`})} ${l} ❌`}))}let V=null;async function ue(){return V||(V=(await import(`@simon_he/colorize`)).default,V)}const H=new Map;function de(){let e=(u.default.env.CCOMMAND_NO_HISTORY||u.default.env.NO_HISTORY||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}async function U(e){if(de())return;let t=await ue();b(t({text:`${S?`快捷指令`:`shortcut command`}: ${e}`,color:`blue`,bold:!0}));let n=(u.default.env.SHELL||`/bin/bash`).split(`/`).pop()||`bash`,r=``,i=`bash`,a=u.default.env.HOME||v.default.homedir();switch(n){case`zsh`:r=l.default.join(a,`.zsh_history`),i=`zsh`;break;case`bash`:r=u.default.env.HISTFILE||l.default.join(a,`.bash_history`),i=`bash`;break;case`fish`:r=l.default.join(a,`.local`,`share`,`fish`,`fish_history`),i=`fish`;break;default:r=u.default.env.HISTFILE||l.default.join(a,`.bash_history`),i=`bash`}try{try{await c.default.access(r)}catch{b(t({text:`${S?`未找到 ${n} 历史文件`:`${n} history file not found`}`,color:`yellow`}));return}let a=await c.default.stat(r).catch(()=>null),o=Math.floor(Date.now()/1e3),s=``;s=i===`zsh`?`: ${o}:0;${e}`:i===`fish`?`- cmd: ${e}\n when: ${o}`:u.default.env.HISTTIMEFORMAT?`#${o}\n${e}`:e;function l(e){if(i===`fish`){let t=e.split(/\r?\n/),n=[],r=[];for(let e of t)e.startsWith(`- cmd: `)?(r.length&&(n.push(r.join(`
|
|
2
|
-
`)),r=[]),r.push(e)):r.length?r.push(e):e.trim()!==``&&n.push(e);return r.length&&n.push(r.join(`
|
|
3
|
-
`)),n.filter(Boolean)}else if(i===`zsh`)return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);else{let t=e.split(/\r?\n/),n=[];for(let e=0;e<t.length;e++){let r=t[e];if(r.startsWith(`#`)){let i=t[e+1]??``;n.push(`${r}\n${i}`),e++}else r.trim()!==``&&n.push(r)}return n}}let d=[],f=H.get(r);d=f&&a&&f.mtimeMs===a.mtimeMs&&f.size===a.size&&f.format===i?f.entries.slice():l(await c.default.readFile(r,`utf8`));function p(e){if(i===`fish`){let t=e.split(`
|
|
4
|
-
`)[0].match(/^- cmd: (.*)$/);return(t?t[1]:e).trim()}else if(i===`zsh`){let t=e.match(/^[^;]*;(.+)$/);return(t?t[1]:e).trim()}else{if(e.startsWith(`#`)){let t=e.split(/\r?\n/);return(t[1]??t[0]).trim()}return e.trim()}}let m=[],h=p(s),g=null;for(let e of d){if(p(e)===h){if(i===`fish`){g=e;continue}continue}m.push(e)}if(i===`fish`&&g){let e=g.split(`
|
|
5
|
-
`),t=!1,n=e.map(e=>e.trim().startsWith(`when:`)||e.startsWith(` when:`)?(t=!0,` when: ${o}`):e);t||n.splice(1,0,` when: ${o}`),m.push(n.join(`
|
|
6
|
-
`))}else m.push(s);let v=``;v=i===`fish`?`${m.map(e=>e.trimEnd()).join(`
|
|
7
|
-
`)}\n`:`${m.join(`
|
|
8
|
-
`)}\n`;let y=`${r}.ccommand.tmp`;await c.default.writeFile(y,v,`utf8`),await c.default.rename(y,r);try{let e=await c.default.stat(r);H.set(r,{mtimeMs:e.mtimeMs,size:e.size,entries:m,format:i})}catch{H.set(r,{mtimeMs:Date.now(),size:_.Buffer.byteLength(v),entries:m,format:i})}}catch(e){b(t({text:`${S?`❌ 添加到 ${n} 历史记录失败`:`❌ Failed to add to ${n} history`}${e?`: ${String(e)}`:``}`,color:`red`}))}}const fe=(0,g.promisify)(h.exec),W={};async function G(e){if(W[e]!==void 0)return W[e];try{return await fe(`command -v ${e}`),W[e]=!0,!0}catch{return W[e]=!1,!1}}let K=null;async function pe(){return K===null&&(K=await G(`bun`)?`bun`:await G(`esno`)?`esno`:await G(`tsx`)?`tsx`:null),K}async function q(e,t,n,r){let i=A([`prun`,e]);await U(i);let{status:a}=await(0,p.jsShell)(t,{errorExit:!1,isLog:!1,stdio:`inherit`}),o=a===0;return o||(u.default.exitCode=a??1),b((0,d.default)({color:o?`green`:`red`,text:`\n"${i}" ${o?n:r} ${o?`🎉`:`❌`}`})),o}async function J(e,t,n){let r=l.default.extname(e),i=`node`;if(r===`.ts`)if(K===null&&await pe(),K)i=K;else return b((0,d.default)({text:S?`没有找到可以直接执行TypeScript的工具,推荐安装下列工具之一:
|
|
9
|
-
- npm install -g bun
|
|
10
|
-
- npm install -g esno
|
|
11
|
-
- npm install -g tsx`:`No TypeScript executor found. Recommend installing one of:
|
|
12
|
-
- npm install -g bun
|
|
13
|
-
- npm install -g esno
|
|
14
|
-
- npm install -g tsx`,color:`yellow`})),u.default.exitCode=1,!1;return q(e,A([i,e]),t,n)}async function me(e,t,n){let r=[`.js`,`.ts`,`.mjs`,`.cjs`],i=l.default.extname(e);if(i&&r.includes(i)&&await c.default.stat(e).then(e=>e.isFile()).catch(()=>!1))return await J(e,t,n),!0;if(!i)for(let i of r){let r=`${e}${i}`;if(await c.default.stat(r).then(e=>e.isFile()).catch(()=>!1))return await J(r,t,n),!0}let a=await c.default.stat(e).catch(()=>null);if(a&&a.isDirectory())for(let i of r){let r=l.default.join(e,`index${i}`);if(await c.default.stat(r).then(e=>e.isFile()).catch(()=>!1))return await J(r,t,n),!0}return!1}async function he(e,t,n){e.endsWith(`.py`)?await q(e,`python ${e}`,t,n):e.endsWith(`.rs`)&&((await(0,p.jsShell)(`rustc ${e}`)).status===0&&(await(0,p.jsShell)(`./${l.default.basename(e,`.rs`)}`,{stdio:`inherit`})).status===0?(await U(`prun ${e}`),b((0,d.default)({color:`green`,text:`\n"prun --${e}" ${t} 🎉`}))):b((0,d.default)({color:`red`,text:`\ncommand "prun ${e}" ${n} ❌`})))}const Y=console.log;let X=null;async function Z(){return X||(X=(await import(`@simon_he/colorize`)).default,X)}function ge(){let e=(u.default.env.CCOMMAND_NO_GUM||u.default.env.NO_GUM||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}function _e(){return!!(u.default.stdin.isTTY&&u.default.stdout.isTTY)}async function ve(e){if(ge()||!_e()||u.default.env.CI)return!1;try{if((await(0,p.jsShell)(`gum -v`,{stdio:`pipe`,errorExit:!1})).status===0)return!0;if(Y((await Z())({color:`blue`,text:e?`正在为您安装gum...`:`install gum...`})),(await(0,p.jsShell)(`brew install gum`,{errorExit:!1})).status===0||(await(0,p.jsShell)(`sudo mkdir -p /etc/apt/keyrings && curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg && echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list && sudo apt update && sudo apt install -y gum`,{errorExit:!1})).status===0)return Y((await Z())({color:`green`,text:e?`gum安装成功 🎉`:`gum install successfully 🎉`})),!0;let t=(await import(`terminal-link`)).default,n=t(e?`gum官网链接`:`the official website of gum`,`https://github.com/charmbracelet/gum#installation`),r=await Z();return Y(r({color:`red`,text:`${e?`gum安装失败,你可以自行从以下链接安装`:`gum install error, you can install it yourself through`} ${r({color:`yellow`,text:n,bold:!0})}`})),!1}catch(e){return Y((await Z())({color:`red`,text:`gum install check failed: ${String(e)}`})),!1}}async function Q(e){return ve(e)}async function ye(e){try{let t=(await c.default.readFile(e,`utf-8`)).split(/\r?\n/),n=new Set;for(let e=0;e<t.length;e++){let r=t[e].trim();if(r.startsWith(`.PHONY:`)){let e=r.substring(7).replace(/\\\\$/g,``).trim();for(let t of e.split(/\s+/))t&&n.add(t)}}let r=[];for(let e of n){let n=``;for(let r=0;r<t.length;r++){let i=t[r];if(!i)continue;let a=i.trimStart();if(a.startsWith(`${e}:`)||a.startsWith(`${e} :`)){let e=a.split(`:`,2)[1]||``,i=e.indexOf(`;`);if(i!==-1&&(n=e.slice(i+1).trim()),!n&&r+1<t.length){let e=t[r+1];e.startsWith(` `)&&(n=e.trim())}if(!n){let t=e.trim();n=t?t.replace(/\s+/g,` `).slice(0,120):``}break}}r.push({name:e,detail:n?`${n}...`:``})}return r}catch{return[]}}const be=(0,f.memorizeFn)(p.getPkg),xe=ce,Se=re,$=le;function Ce(e,t,n){return!!(n[1]&&t.length)}async function we(e=u.default.argv.slice(2)){let t=S?`当前目录不存在任何子目录`:`The current directory does not have any subdirectories`,n=S?`运行成功`:`run successfully`,r=S?`运行失败`:`run error`,i=ee(e);if(i[0]===`-v`||i[0]===`--version`)return b((0,d.default)({text:S?`ccommand 当前版本: ${y}`:`ccommand Version: ${y}`,color:`green`}));if(i[0]===`-h`||i[0]===`--help`){let e=(await import(`terminal-link`)).default,t=e(S?`打开一个新的问题`:`open an issue`,`https://github.com/Simon-He95/ccommand/issues`),n=e(S?`✨帮助点一个星星`:`✨star it`,`https://github.com/Simon-He95/ccommand`);return b((0,d.default)({color:`white`,text:`
|
|
15
|
-
${(0,d.default)({bold:!0,text:`Common Commands:`,bgColor:`blue`})}
|
|
16
|
-
${(0,d.default)({text:`- ccommand -v 查看当前版本
|
|
17
|
-
- ccommand -help 查看帮助
|
|
18
|
-
- ccommand 执行当前package.json
|
|
19
|
-
- ccommand find 查找当前workspace的所有目录
|
|
20
|
-
`,color:`cyan`})}
|
|
21
|
-
If you encounter any problems, you can ${(0,d.default)({color:`magenta`,text:t})}.
|
|
22
|
-
If you like it, please ${(0,d.default)({text:n,bold:!0,color:`cyan`})} `}))}else if(i[0]?.endsWith(`.py`)||i[0]?.endsWith(`.rs`)){await he(i[0],n,r);return}let a;try{a=await(0,p.getPkgTool)()}catch{try{if(await c.default.readFile(l.default.resolve(u.default.cwd(),`./Makefile`),`utf-8`)){a=`make`;let e=await ye(`./Makefile`),t=e.reduce((e,t)=>{let{name:n,detail:r}=t;return e[n]=r,e},{}),o=``,s=[];if(i.length){let e=i[0];if(s=i.slice(1),o=M(t,e)||``,!o)return b((0,d.default)({color:`red`,text:w}))}else{if(!await Q(S))return b((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或 gum 已被禁用,请直接传入 make 目标名称`:`Gum is unavailable (non-interactive or disabled). Please pass a make target explicitly.`}));let{result:t,status:n}=await(0,p.jsShell)(`echo "${e.map(e=>e.name).join(`
|
|
23
|
-
`)}" | gum filter --placeholder=" 🤔请选择一个要执行的指令"`,`pipe`);if(n===130)return E();o=t}await $(a,o.trim(),s,i,U,p.jsShell,d.default,S,n,r);return}else return b((0,d.default)({color:`red`,text:w}))}catch{if(i[0]!==`find`)return b((0,d.default)({color:`red`,text:w}))}}let[o,s,f]=te(i),m=o,h;if(i[0]===`find`){if(s)await R(a),m=L().filter(e=>e.includes(s))[0];else if(a===`yarn`){if(await R(a),!L().length)return b((0,d.default)({color:`yellow`,text:t}));if(!await Q(S))return b((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或 gum 已被禁用,请直接传入 workspace 名称`:`Gum is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:n}=await(0,p.jsShell)(`echo ${L().join(`,`)} | sed "s/,/\\n/g" | gum filter --placeholder=" 🤔${S?`请选择一个要执行的目录`:`Please select a directory to execute`}"`,[`inherit`,`pipe`,`inherit`]);if(m=e,n===130)return E()}else if(a===`pnpm`){if(await R(a),!L().length)return b((0,d.default)({color:`yellow`,text:t}));if(!await Q(S))return b((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或 gum 已被禁用,请直接传入 workspace 名称`:`Gum is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:n}=await(0,p.jsShell)(`echo ${L().join(`,`)} | sed "s/,/\\n/g" | gum filter --placeholder=" 🤔${S?`请选择一个要执行的目录`:`Please select a directory to execute`}"`,[`inherit`,`pipe`,`inherit`]);if(n===130)return E();m=e.trim()}else return b((0,d.default)({color:`red`,text:S?`find指令只能支持在yarn或pnpm的monorepo模式下使用`:`find command only support yarn or pnpm`}));h=await xe(m,a)||void 0}else{h=await xe(m,a)||void 0;try{let e=(await be(`./package.json`)||{})?.scripts;if(e&&e[i[0]]){await $(a,i[0],i.slice(1),i,U,p.jsShell,d.default,S,n,r);return}else if(e&&o){let t=M(e,i[0]);if(t){let e=i.slice(1);await $(a,t,e,i,U,p.jsShell,d.default,S,n,r);return}else{if(await me(i[0],n,r))return;let e=`${o}.py`;if(await c.default.stat(e).then(e=>e.isFile()).catch(()=>!1)){b((0,d.default)({text:`🤔 ${S?`找到Python文件`:`Found Python file`}: ${e}`,color:`yellow`}));return}let t=`${o}.rs`;if(await c.default.stat(t).then(e=>e.isFile()).catch(()=>!1))return;b((0,d.default)({color:`red`,text:`"${i[0]}" ${S?`在工作区、当前目录中找不到任何可执行的脚本或文件,请检查`:`is not found in workspace, current directory or current scripts, please check`}`})),u.default.exit(1)}}}catch{}}let g=[],_=``;if(!s||i[0]===`find`&&(!i[2]||i[2].startsWith(`--`))){if(!h||Object.keys(h).length===0)return b((0,d.default)({color:`red`,text:S?`找不到任何可执行脚本`:`No scripts found`}));let e=Object.keys(h).reduce((e,t)=>{let n=h?.[t]??``;return g.push(t),e+=`"${t}: ${n.replace(/\\/g,`\\\\`).replace(/(["`])/g,`\\$1`)}"${x}`,e},``);if(!await Q(S))return b((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或 gum 已被禁用,请直接传入脚本名称`:`Gum is unavailable (non-interactive or disabled). Please pass a script name explicitly.`}));let{result:t,status:n}=await(0,p.jsShell)(`echo ${e} | sed "s/${x}/\\n/g" | gum filter --placeholder=" 🤔请选择一个要执行的指令"`,{stdio:[`inherit`,`pipe`,`inherit`],isLog:!1});if(n===130)return E();_=t.substring(0,t.indexOf(`: `))}if(!s&&!_)return E();b((0,d.default)({text:`🤔 ${T} ${_}`,color:`magenta`}));let{command:v,text:C,val:D}=await Se({termStart:a,params:f,dirname:m,argv:i,val:_,runMsg:T,isZh:S,pushHistory:U,jsShell:p.jsShell,isNeedPrefix:e=>Ce(i[0],e,i),fuzzyWorkspace:s}),O=v;_=D;let{status:k,result:j=``}=await(0,p.jsShell)(O,{errorExit:!1,stdio:`inherit`});if(k===0)return b((0,d.default)({color:`green`,text:`\n${C} 🎉`}));if(j.includes(`pnpm versions with respective Node.js version support`)){b((0,d.default)({text:S?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let e=[...f];e[0]===`--`&&e.shift();let{status:t}=await(0,p.jsShell)(A([`npm`,`run`,_,...e.length?[`--`,...e]:[]]),`inherit`);if(t===0)return b((0,d.default)({color:`green`,text:`\n${C} 🎉`}))}b((0,d.default)({color:`red`,text:`\ncommand ${_} ${r} ❌`}))}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return we}});
|