@bomb.sh/tab 0.0.8 → 0.0.9
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 +22 -0
- package/dist/bin/cli.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,6 +14,28 @@ tab solves this complexity by providing autocompletions that work consistently a
|
|
|
14
14
|
|
|
15
15
|
## Installation
|
|
16
16
|
|
|
17
|
+
### For Package Manager Completions (Global install is recommended)
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g @bomb.sh/tab
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Then enable completions permanently:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# For zsh
|
|
27
|
+
echo 'source <(tab pnpm zsh)' >> ~/.zshrc
|
|
28
|
+
source ~/.zshrc
|
|
29
|
+
|
|
30
|
+
# For bash
|
|
31
|
+
echo 'source <(tab pnpm bash)' >> ~/.bashrc
|
|
32
|
+
source ~/.bashrc
|
|
33
|
+
|
|
34
|
+
# The same can be done for other shells!
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### For CLI Library (Adding Completions to Your CLI)
|
|
38
|
+
|
|
17
39
|
```bash
|
|
18
40
|
npm install @bomb.sh/tab
|
|
19
41
|
# or
|
package/dist/bin/cli.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
import{i as e,o as t}from"../t-HnUrbNwE.js";import{readFileSync as n}from"node:fs";import{promisify as r}from"node:util";import i from"node:child_process";import{readFileSync as a}from"fs";import{execSync as o}from"child_process";function s(){try{let e;try{e=n(`pnpm-workspace.yaml`,`utf8`)}catch{e=n(`pnpm-workspace.yml`,`utf8`)}let t=e.match(/packages:\s*\n((?:\s*-\s*.+\n?)*)/);return t?t[1].split(`
|
|
3
3
|
`).map(e=>e.trim()).filter(e=>e.startsWith(`-`)).map(e=>e.substring(1).trim()).filter(e=>e&&!e.startsWith(`#`)):[]}catch{return[]}}function c(){try{let e=JSON.parse(a(`package.json`,`utf8`));return Object.keys(e.scripts||{})}catch{return[]}}function l(){try{let e=JSON.parse(a(`package.json`,`utf8`)),t={...e.dependencies,...e.devDependencies,...e.peerDependencies,...e.optionalDependencies};return Object.keys(t)}catch{return[]}}const ee=async e=>{c().forEach(t=>{e(t.replace(/:/g,`\\:`),` `)})},te=async e=>{l().forEach(t=>e(t,``))},ne=r(i.exec),{execSync:re}=i,u={workspace(e){s().forEach(t=>e(t,`Workspace pattern: ${t}`))}};function d(e,t,n,r){e._lazyCommand=t,e._optionsLoaded=!1;let i=e.options;e.optionsRaw=i,Object.defineProperty(e,`options`,{get(){return this._optionsLoaded||(this._optionsLoaded=!0,r(this,this._lazyCommand)),i},configurable:!0})}function f(e,t,n){[`remove`,`rm`,`uninstall`,`un`,`update`,`up`].includes(t)&&e.argument(`package`,te),[`run`,`run-script`].includes(t)&&e.argument(`script`,ee,!0)}async function p(e,t={}){try{let{stdout:n}=await ne(e,{encoding:`utf8`,timeout:500,maxBuffer:4*1024*1024,...t});return n}catch(e){return e instanceof Error&&`stdout`in e?e.stdout:``}}function m(e,t={}){try{return re(e,{encoding:`utf8`,timeout:500,...t})}catch(e){return e?.stdout?e.stdout:``}}function h(e){return t=>e.forEach(e=>t(e,` `))}const ie=/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,g=/^\s+([a-z][a-z\s,-]*?)\s{2,}(\S.*)$/i,_=/^\s*(?:-(?<short>[A-Za-z]),\s*)?--(?<long>[a-z0-9-]+)(?<val>\s+(?:<[^>]+>|\[[^\]]+\]))?\s{2,}(?<desc>\S.*)$/i,ae=/^\s*(?:-[A-Za-z],\s*)?--[a-z0-9-]+/i,v=e=>e.replace(ie,``),y=e=>(e.match(/^\s*/)||[``])[0].length,oe=e=>e.split(`,`).map(e=>e.trim()).filter(Boolean),b=/^\s*Options:/i,x=/(?:levels?|options?|values?)[^:]*:\s*([^.]+)/i,S=/\r?\n/,se=/[,\s]+/,C=/^\s*(?:-\w,?\s*)?--(\w+(?:-\w+)*)\s+(\w+(?:-\w+)*)\s+(.+)$/,w=/^\s*-\w,?\s*--\w+(?:,\s*--(\w+(?:-\w+)*)\s+(\w+(?:-\w+)*))?\s+(.+)$/,T=/^\s{20,}/,E=/^\s*[A-Z][^:]*:\s*$/;function D(e){return v(e).split(S)}function ce(e){let t=1/0;for(let n of e){let e=n.match(g);if(!e)continue;let r=n.indexOf(e[2]);r>=0&&r<t&&(t=r)}return t}function le(e,t){let n=1/0;for(let r of e){let e=r.match(_);if(!e||t&&e.groups?.val)continue;let i=r.indexOf(e.groups.desc);i>=0&&i<n&&(n=i)}return n}function O(e,t){let n=D(e),r=[];for(let e=0;e<n.length;e++){let i=n[e],a=i.match(C);if(a){let[,i,o,s]=a;if(i===t){let t=s.trim(),i=e+1;for(;i<n.length;){let e=n[i],r=T.test(e),a=C.test(e)||w.test(e),o=!e.trim()||E.test(e);if(r&&!a&&!o)t+=` `+e.trim(),i++;else break}r.push({value:o,desc:t})}}let o=i.match(w);if(o){let[,i,a,s]=o;if(i===t&&a){let t=s.trim(),i=e+1;for(;i<n.length;){let e=n[i],r=T.test(e),a=C.test(e)||w.test(e),o=!e.trim()||E.test(e);if(r&&!a&&!o)t+=` `+e.trim(),i++;else break}r.push({value:a,desc:t})}}}if(r.length)return r;for(let e=0;e<n.length;e++){let r=n[e];if(r.includes(`--${t}`)||r.includes(`${t}:`))for(let t=e;t<Math.min(e+3,n.length);t++){let e=n[t].match(x);if(e)return e[1].split(se).map(e=>e.trim()).filter(e=>e&&!e.includes(`(`)&&!e.includes(`)`)).map(e=>({value:e,desc:`Log level: ${e}`}))}}return[]}const k={...u,loglevel(e){let t=O(m(`pnpm install --help`),`loglevel`);t.length?t.forEach(({value:t,desc:n})=>e(t,n)):h([`debug`,`info`,`warn`,`error`,`silent`])(e)},reporter(e){let t=O(m(`pnpm install --help`),`reporter`);t.length?t.forEach(({value:t,desc:n})=>e(t,n)):h([`default`,`append-only`,`ndjson`,`silent`])(e)},filter(e){e(`.`,`Current working directory`),e(`!<selector>`,`Exclude packages matching selector`),s().forEach(t=>{e(t,`Workspace pattern: ${t}`),e(`${t}...`,`Include dependencies of ${t}`)}),e(`@*/*`,`All scoped packages`),e(`...<pattern>`,`Include dependencies of pattern`),e(`<pattern>...`,`Include dependents of pattern`)}};function ue(e){let t=D(e),n=ce(t);if(!Number.isFinite(n))return{};let r=null,i=new Map,a=()=>{if(!r)return;let e=r.desc.trim();for(let t of r.names)i.set(t,e);r=null};for(let e of t){if(b.test(e))break;let t=e.match(g);if(t){a(),r={names:oe(t[1]),desc:t[2].trim()};continue}r&&y(e)>=n&&e.trim()&&(r.desc+=` `+e.trim())}return a(),Object.fromEntries(i)}async function de(){let e=await p(`pnpm --help`);return e?ue(e):{}}function A(e,{flagsOnly:t=!0}={}){let n=D(e),r=le(n,t);if(!Number.isFinite(r))return[];let i=[],a=null,o=()=>{a&&=(a.desc=a.desc.trim(),i.push(a),null)};for(let e of n){let n=e.match(_);if(n){if(t&&n.groups?.val)continue;o(),a={short:n.groups?.short||void 0,long:n.groups.long,desc:n.groups.desc.trim()};continue}if(a){let t=y(e),n=ae.test(e);t>=r&&e.trim()&&!n&&(a.desc+=` `+e.trim())}}return o(),i}function j(e,t){let n=m(`pnpm ${t} --help`);if(!n)return;let r=A(n,{flagsOnly:!1});for(let{long:t,short:n,desc:i}of r){if(e.optionsRaw?.get?.(t))continue;let r=k[t];r?e.option(t,i,r,n):e.option(t,i,n)}for(let[t,r]of Object.entries(k))e.optionsRaw?.get?.(t)||O(n,t).length>0&&e.option(t,` `,r)}async function M(e){try{let t=await de();for(let[n,r]of Object.entries(t)){let t=e.command(n,r);f(t,n,`pnpm`),d(t,n,`pnpm`,j)}}catch{}}const N=/^All commands:\s*$/i,P=/^Options:\s*$/i,F=/^(aliases|run|more)/i,I=/^[a-z][a-z0-9-]*$/,L=/(?:\[)?(?:-([a-z])\|)?--([a-z][a-z0-9-]+)(?:\s+<[^>]+>)?(?:\])?/gi,R=/<[^>]+>/,z=/^\s/;function B(e){return v(e).split(/\r?\n/)}function V(e,t){let n=e.findIndex(e=>t.test(e.trim()));if(n===-1)return``;let r=``;for(let t=n+1;t<e.length;t++){let n=e[t];if(!z.test(n)&&n.trim()&&!n.includes(`,`))break;z.test(n)&&(r+=` `+n.trim())}return r}const H=(e,t=()=>` `)=>n=>e.forEach(e=>n(e,t(e))),fe={...u,loglevel:h([`silent`,`error`,`warn`,`notice`,`http`,`info`,`verbose`,`silly`]),"install-strategy":H([`hoisted`,`nested`,`shallow`,`linked`],()=>` `),omit:H([`dev`,`optional`,`peer`],()=>` `),include:H([`prod`,`dev`,`optional`,`peer`],()=>` `)};function pe(e){let t=V(B(e),N);if(!t)return{};let n={};return t.split(`,`).map(e=>e.trim()).filter(e=>e&&I.test(e)).forEach(e=>{n[e]=` `}),n.run=` `,n}async function me(){let e=await p(`npm --help`);return e?pe(e):{}}function he(e,{flagsOnly:t=!0}={}){let n=B(e),r=n.findIndex(e=>P.test(e.trim()));if(r===-1)return[];let i=[];for(let e of n.slice(r+1)){let n=e.trim();if(F.test(n))break;let r=e.matchAll(L);for(let e of r){let n=e[1]||void 0,r=e[2],a=R.test(e[0]);t&&a||i.push({short:n,long:r,desc:` `})}}return i}function ge(e,t){let n=m(`npm ${t} --help`);if(!n)return;let r=he(n,{flagsOnly:!1});for(let{long:t,short:n,desc:i}of r){if(e.optionsRaw?.get?.(t))continue;let r=fe[t];r?e.option(t,i,r,n):e.option(t,i,n)}}async function _e(e){try{let t=await me();for(let[n,r]of Object.entries(t)){let t=e.command(n,r);f(t,n,`npm`),d(t,n,`npm`,ge)}}catch{}}const ve=/^\s*Options:\s*$/i,ye=/^\s*Commands:\s*$/i,U=/^(Run `yarn help|Visit https:\/\/)/i,be=/\r?\n/,xe=/^\s*(?:-([a-zA-Z]),?\s*)?--([a-z][a-z0-9-]*)(?:\s+<[^>]+>|\s+\[[^\]]+\])?\s+(.+)$/,Se=/^\s*-\s+([a-z][a-z0-9-]*(?:\s*\/\s*[a-z][a-zA-Z]*)*)/;function W(e){return v(e).split(be)}function G(e,t){for(let n=0;n<e.length;n++)if(t.test(e[n].trim()))return n+1;return-1}const Ce={...u,emoji(e){e(`true`,` `),e(`false`,` `)},production(e){e(`true`,` `),e(`false`,` `)},"scripts-prepend-node-path"(e){e(`true`,` `),e(`false`,` `)}};function we(e){let t=W(e),n={},r=G(t,ye);if(r===-1)return n;for(let e=r;e<t.length;e++){let r=t[e];if(U.test(r))break;if(!r.trim())continue;let i=r.match(Se);if(i){let[,e]=i,t=e.split(/\s*\/\s*/),r=t[0].trim();if(r){n[r]=``;for(let e=1;e<t.length;e++){let r=t[e].trim();r&&(n[r]=``)}}}}return n}async function Te(){let e=await p(`yarn --help`);return e?we(e):{}}function Ee(e,{flagsOnly:t=!0}={}){let n=W(e),r=[],i=G(n,ve);if(i===-1)return r;for(let e=i;e<n.length;e++){let i=n[e];if(U.test(i.trim()))break;let a=i.match(xe);if(!a)continue;let[,o,s,c]=a,l=i.includes(`<`)||i.includes(`[`);t&&l||r.push({short:o||void 0,long:s,desc:c.trim()})}return r}function De(e,t){let n=m(`yarn ${t} --help`);if(!n)return;let r=Ee(n,{flagsOnly:!1});for(let{long:t,short:n,desc:i}of r){if(e.optionsRaw?.get?.(t))continue;let r=Ce[t];r?e.option(t,i,r,n):e.option(t,i,n)}}async function Oe(e){try{let t=await Te();for(let[n,r]of Object.entries(t)){let t=e.command(n,r);f(t,n,`yarn`),d(t,n,`yarn`,De)}}catch{}}const ke=/^Commands:\s*$/i,K=/^Flags:\s*$/i,Ae=/^(Examples|Full documentation|Learn more)/i,q=/^[a-z][a-z0-9-]*$/,je=/^\s*(?:-([a-zA-Z]),?\s*)?--([a-z][a-z0-9-]*)(?:=<[^>]+>)?\s+(.+)$/,Me=/^ ([a-z][a-z0-9-]*)\s+(.+)$/,Ne=/^\s{12,}([a-z][a-z0-9-]*)\s+(.+)$/,Pe=/^\s+[a-z]/,Fe=/\s{2,}/,J=/^[A-Z]/,Ie=/\r?\n/;function Y(e){return v(e).split(Ie)}function X(e,t){for(let n=0;n<e.length;n++)if(t.test(e[n].trim()))return n+1;return-1}const Le={...u,backend(e){e(`clonefile`,` `),e(`hardlink`,` `),e(`symlink`,` `),e(`copyfile`,` `)},linker(e){e(`isolated`,` `),e(`hoisted`,` `)},omit(e){e(`dev`,` `),e(`optional`,` `),e(`peer`,` `)},shell(e){e(`bun`,` `),e(`system`,` `)},"unhandled-rejections"(e){e(`strict`,` `),e(`throw`,` `),e(`warn`,` `),e(`none`,` `),e(`warn-with-error-code`,` `)}};function Re(e){let t=Y(e),n=X(t,ke);if(n===-1)return{};let r={};for(let e=n;e<t.length;e++){let n=t[e];if(K.test(n.trim())||n.trim()===``&&e+1<t.length&&!t[e+1].match(Pe))break;if(!n.trim())continue;let i=n.match(Me);if(i){let[,e,t]=i;if(q.test(e)){let n=t.split(Fe),i=n[n.length-1];if(i&&J.test(i))r[e]=i.trim();else if(n.length>1){for(let t of n)if(J.test(t)){r[e]=t.trim();break}}}}let a=n.match(Ne);if(a){let[,e,t]=a;q.test(e)&&(r[e]=t.trim())}}return r}async function ze(){let e=await p(`bun --help`);return e?Re(e):{}}function Z(e,{flagsOnly:t=!0}={}){let n=Y(e),r=[],i=X(n,K);if(i===-1)return r;for(let e=i;e<n.length;e++){let i=n[e];if(Ae.test(i.trim()))break;let a=i.match(je);if(!a)continue;let[,o,s,c]=a,l=i.includes(`=<`);t&&l||r.push({short:o||void 0,long:s,desc:c.trim()})}return r}function Be(e,t){let n=m(`bun ${t} --help`);if(!n)return;let r=Z(n,{flagsOnly:!1});for(let{long:t,short:n,desc:i}of r){if(e.optionsRaw?.get?.(t))continue;let r=Le[t];r?e.option(t,i,r,n):e.option(t,i,n)}}async function Ve(e){try{let t=await ze();for(let[n,r]of Object.entries(t)){let t=e.command(n,r);f(t,n,`bun`),d(t,n,`bun`,Be)}}catch{}}async function He(e,t){switch(e){case`pnpm`:await M(t);break;case`npm`:await _e(t);break;case`yarn`:await Oe(t);break;case`bun`:await Ve(t);break;default:break}}function Ue(...e){process.env.DEBUG&&console.error(`[DEBUG]`,...e)}async function We(e,t){try{if(o(`${e} complete --`,{encoding:`utf8`,stdio:[`pipe`,`pipe`,`ignore`],timeout:1e3}).trim())return!0}catch{}try{return!!o(`${t} ${e} complete --`,{encoding:`utf8`,stdio:[`pipe`,`pipe`,`ignore`],timeout:1e3}).trim()}catch{return!1}}async function Ge(e,t,n){let r=n.map(e=>e.includes(` `)?`"${e}"`:e);try{let t=o(`${e} complete -- ${r.join(` `)}`,{encoding:`utf8`,stdio:[`pipe`,`pipe`,`ignore`],timeout:1e3});if(t.trim())return t.trim().split(`
|
|
4
4
|
`).filter(Boolean)}catch{}try{return o(`${t} ${e} complete -- ${r.join(` `)}`,{encoding:`utf8`,stdio:[`pipe`,`pipe`,`ignore`],timeout:1e3}).trim().split(`
|
|
5
|
-
`).filter(Boolean)}catch{return[]}}var Ke=class extends e{packageManager;constructor(e){super(),this.packageManager=e}stripPackageManagerCommands(e){return e.length===0?e:[`exec`,`x`,`run`,`dlx`].includes(e[0])?e.slice(1):e}async parse(e){let t=this.stripPackageManagerCommands(e);if(t.length>=1&&t[0].trim()!==``){let e=t[0];if(![...this.commands.keys()].includes(e)&&await We(e,this.packageManager)){let n=t.slice(1),r=await Ge(e,this.packageManager,n);if(r.length>0){Ue(`Returning ${r.length} completions for ${e}`);for(let e of r)if(!e.startsWith(`:`))if(e.includes(` `)){let[t,n]=e.split(` `);console.log(`${t}\t${n}`)}else console.log(e);console.log(`:4`);return}}}return super.parse(e)}};const Q=[`npm`,`pnpm`,`yarn`,`bun`],$=[`zsh`,`bash`,`fish`,`powershell`];async function qe(){let e=process.argv.slice(2);if(e.length>=2&&e[1]===`complete`){let t=e[0];Q.includes(t)||(console.error(`Error: Unsupported package manager "${t}"`),console.error(`Supported package managers: ${Q.join(`, `)}`),process.exit(1));let n=process.argv.indexOf(`--`);if(n!==-1){let e=new Ke(t);await He(t,e);let r=process.argv.slice(n+1);await e.parse(r),process.exit(0)}else console.error(`Error: Expected '--' followed by command to complete`),process.exit(1)}if(e.length===2){let[t,n]=e;Q.includes(t)||(console.error(`Error: Unsupported package manager "${t}"`),console.error(`Supported package managers: ${Q.join(`, `)}`),process.exit(1)),$.includes(n)||(console.error(`Error: Unsupported shell "${n}"`),console.error(`Supported shells: ${$.join(`, `)}`),process.exit(1)),Je(t,n),process.exit(0)}console.error(`Usage: tab <packageManager> <shell>`),console.error(` tab <packageManager> complete -- <args>`),process.exit(1)}function Je(e,n){t(n,e,process.
|
|
5
|
+
`).filter(Boolean)}catch{return[]}}var Ke=class extends e{packageManager;constructor(e){super(),this.packageManager=e}stripPackageManagerCommands(e){return e.length===0?e:[`exec`,`x`,`run`,`dlx`].includes(e[0])?e.slice(1):e}async parse(e){let t=this.stripPackageManagerCommands(e);if(t.length>=1&&t[0].trim()!==``){let e=t[0];if(![...this.commands.keys()].includes(e)&&await We(e,this.packageManager)){let n=t.slice(1),r=await Ge(e,this.packageManager,n);if(r.length>0){Ue(`Returning ${r.length} completions for ${e}`);for(let e of r)if(!e.startsWith(`:`))if(e.includes(` `)){let[t,n]=e.split(` `);console.log(`${t}\t${n}`)}else console.log(e);console.log(`:4`);return}}}return super.parse(e)}};const Q=[`npm`,`pnpm`,`yarn`,`bun`],$=[`zsh`,`bash`,`fish`,`powershell`];async function qe(){let e=process.argv.slice(2);if(e.length>=2&&e[1]===`complete`){let t=e[0];Q.includes(t)||(console.error(`Error: Unsupported package manager "${t}"`),console.error(`Supported package managers: ${Q.join(`, `)}`),process.exit(1));let n=process.argv.indexOf(`--`);if(n!==-1){let e=new Ke(t);await He(t,e);let r=process.argv.slice(n+1);await e.parse(r),process.exit(0)}else console.error(`Error: Expected '--' followed by command to complete`),process.exit(1)}if(e.length===2){let[t,n]=e;Q.includes(t)||(console.error(`Error: Unsupported package manager "${t}"`),console.error(`Supported package managers: ${Q.join(`, `)}`),process.exit(1)),$.includes(n)||(console.error(`Error: Unsupported shell "${n}"`),console.error(`Supported shells: ${$.join(`, `)}`),process.exit(1)),Je(t,n),process.exit(0)}console.error(`Usage: tab <packageManager> <shell>`),console.error(` tab <packageManager> complete -- <args>`),process.exit(1)}function Je(e,n){t(n,e,process.argv[1].endsWith(`dist/bin/cli.js`)?`node ${process.argv[1]} ${e}`:`tab ${e}`)}qe().catch(console.error);export{};
|