git-thing 1.0.1 → 1.0.3

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/dist/app.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ name: string | undefined;
4
+ };
5
+ export default function App({ name }: Props): React.JSX.Element;
6
+ export {};
package/dist/app.js ADDED
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { Text, useApp, useInput } from 'ink';
3
+ export default function App({ name = 'Stranger' }) {
4
+ const { exit } = useApp();
5
+ useInput((input, key) => {
6
+ if (key.escape || (key.ctrl && input === 'c')) {
7
+ exit();
8
+ }
9
+ });
10
+ return (React.createElement(Text, null,
11
+ "Hello, ",
12
+ React.createElement(Text, { color: "green" }, name),
13
+ '\n',
14
+ React.createElement(Text, { dimColor: true }, "Press ESC or Ctrl+C to exit")));
15
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js CHANGED
@@ -1,3 +1,24 @@
1
1
  #!/usr/bin/env node
2
- import ie from"react";import{render as ae}from"ink";import T,{useState as H,useEffect as re}from"react";import{Box as N,Text as P,useApp as se,useInput as ne}from"ink";import c,{useState as D,useEffect as W}from"react";import{Box as I,Text as B,useInput as $}from"ink";import{useState as O,useEffect as V,useCallback as G}from"react";import{execFile as y}from"child_process";function X(){let[u,d]=O([]),[C,a]=O(!0),[x,o]=O(null),r=G(()=>{y("git",["branch"],(n,h,i)=>{if(a(!1),n){i.includes("not a git repository")?o("Not a git repository"):o(i||n.message);return}let l=h.split(`
3
- `).filter(b=>b.trim()).map(b=>{let t=b.startsWith("*");return{name:b.replace(/^\*?\s+/,""),isCurrent:t}});d(l)})},[]),v=G(n=>new Promise((h,i)=>{y("git",["checkout",n],(l,b,t)=>{if(l){i(new Error(t||l.message));return}r(),h()})}),[r]),s=G(({baseBranch:n,autoStash:h})=>new Promise((i,l)=>{u.find(t=>t.isCurrent)?.name==="master"?y("git",["pull","--rebase","origin","master"],(t,m,S)=>{if(t){l(new Error(S||t.message));return}r(),i(m||"Successfully pulled and rebased master")}):y("git",["fetch","origin","master:master"],(t,m,S)=>{if(t){l(new Error(S||t.message));return}let f=["rebase"];h&&f.push("--autostash"),f.push(n),y("git",f,(E,g,A)=>{if(E){l(new Error(A||E.message));return}r(),i(g||`Successfully rebased onto ${n}`)})})}),[r,u]);return V(()=>{r()},[r]),{branches:u,loading:C,error:x,refresh:r,checkout:v,rebaseMaster:s}}var e={heading:{text:"BRANCHES",color:"blue",bold:!0,borderStyle:"double",borderColor:"blue",paddingX:2,paddingY:0,marginBottom:0},branch:{currentColor:"green",selectedColor:"blue",selectedBold:!0},help:{dimmed:!0},error:{color:"red"},modes:{selection:{label:"Selection",color:"blue"},rebase:{label:"Rebase Master",color:"magenta"},settings:{label:"Settings",color:"cyan"}},status:{successColor:"green",errorColor:"red"},tabs:{activeColor:"cyan",inactiveColor:"gray"}};function Y({baseBranch:u,autoStash:d,isActive:C,onStatusChange:a}){let{branches:x,loading:o,error:r,checkout:v,rebaseMaster:s}=X(),[n,h]=D(0),[i,l]=D("selection"),[b,t]=D(null);W(()=>{if(!b)return;let f=setTimeout(()=>{t(null)},3e3);return()=>clearTimeout(f)},[b]);let m=()=>{l(f=>f==="selection"?"rebase":"selection")};if($((f,E)=>{if(E.shift&&E.tab){m();return}if(E.upArrow)h(g=>g>0?g-1:x.length-1);else if(E.downArrow)h(g=>g<x.length-1?g+1:0);else if(E.return){let g=x[n];if(g&&!g.isCurrent){if(i==="selection")v(g.name).catch(A=>{a(A.message,"error")});else if(i==="rebase"){let A=g.name;s({baseBranch:u,autoStash:d}).then(()=>{t(A)}).catch(J=>{a(J.message,"error")})}}}},{isActive:C}),o)return c.createElement(B,{dimColor:!0},"Loading branches...");if(r)return c.createElement(B,{color:e.error.color},"Error: ",r);if(x.length===0)return c.createElement(B,{dimColor:!0},"No branches found");let S=e.modes[i];return c.createElement(I,{flexDirection:"column"},c.createElement(I,{alignSelf:"flex-start",borderStyle:e.heading.borderStyle,borderColor:e.heading.borderColor,paddingX:e.heading.paddingX,paddingY:e.heading.paddingY,marginBottom:e.heading.marginBottom},c.createElement(B,{bold:e.heading.bold,color:e.heading.color},e.heading.text)),c.createElement(I,{marginBottom:1},c.createElement(B,null,"MODE: "),c.createElement(B,{bold:!0,color:S.color},S.label),i==="rebase"&&c.createElement(B,{dimColor:!0}," (base: ",u,")")),x.map((f,E)=>{let g=E===n,A=f.name===b;return c.createElement(I,{key:f.name},c.createElement(B,{color:f.isCurrent?e.branch.currentColor:void 0},f.isCurrent?"* ":" "),c.createElement(B,{color:g?S.color:void 0,bold:g&&e.branch.selectedBold},f.name),A&&c.createElement(B,{bold:!0,color:e.modes.rebase.color}," ","REBASED"))}),c.createElement(I,{marginTop:1},c.createElement(B,{dimColor:e.help.dimmed},"\u2191\u2193 navigate Enter ",i==="selection"?"checkout":"rebase"," Shift+Tab switch mode Tab switch tab q quit")))}import p,{useState as L}from"react";import{Box as M,Text as w,useInput as j}from"ink";function _({baseBranch:u,autoStash:d,onBaseBranchChange:C,onAutoStashChange:a,isActive:x}){let[o,r]=L("baseBranch"),[v,s]=L(u),[n,h]=L(!1),i=["baseBranch","autoStash"];j((b,t)=>{if(n){t.return?(v.trim()&&C(v.trim()),h(!1)):t.escape?(s(u),h(!1)):t.backspace||t.delete?s(m=>m.slice(0,-1)):b&&!t.ctrl&&!t.meta&&!t.tab&&s(m=>m+b);return}if(t.upArrow){let m=i.indexOf(o),S=m>0?m-1:i.length-1;r(i[S])}else if(t.downArrow){let m=i.indexOf(o),S=m<i.length-1?m+1:0;r(i[S])}else(t.return||b===" ")&&(o==="baseBranch"?(h(!0),s(u)):o==="autoStash"&&a(!d))},{isActive:x});let l=e.modes.settings;return p.createElement(M,{flexDirection:"column"},p.createElement(M,{alignSelf:"flex-start",borderStyle:e.heading.borderStyle,borderColor:l.color,paddingX:e.heading.paddingX,paddingY:e.heading.paddingY,marginBottom:1},p.createElement(w,{bold:!0,color:l.color},"SETTINGS")),p.createElement(M,null,p.createElement(w,{color:o==="baseBranch"?l.color:void 0},o==="baseBranch"?"\u25B8 ":" "),p.createElement(w,null,"Base Branch: "),n?p.createElement(w,{color:"yellow"},v,"\u2588"):p.createElement(w,{bold:o==="baseBranch",color:l.color},u)),p.createElement(M,null,p.createElement(w,{color:o==="autoStash"?l.color:void 0},o==="autoStash"?"\u25B8 ":" "),p.createElement(w,null,"Auto Stash: "),p.createElement(w,{bold:o==="autoStash",color:d?"green":"red"},d?"ON":"OFF")),p.createElement(M,{marginTop:1},p.createElement(w,{dimColor:e.help.dimmed},n?"Enter save Esc cancel":"\u2191\u2193 navigate Enter/Space toggle Tab switch tab q quit")))}import{useState as z,useEffect as Q,useCallback as Z}from"react";import{readFileSync as k,writeFileSync as R,existsSync as ee}from"fs";import{homedir as te}from"os";import{join as oe}from"path";var q=oe(te(),".git-thing-settings.json"),K={baseBranch:"main",autoStash:!0};function U(){let[u,d]=z(K);Q(()=>{if(ee(q))try{let a=JSON.parse(k(q,"utf-8"));d({...K,...a})}catch{}},[]);let C=Z((a,x)=>{d(o=>{let r={...o,[a]:x};return R(q,JSON.stringify(r,null,2)),r})},[]);return{settings:u,updateSetting:C}}function F(){let{exit:u}=se(),{settings:d,updateSetting:C}=U(),[a,x]=H("branches"),[o,r]=H(null);re(()=>{if(!o)return;let s=setTimeout(()=>{r(null)},3e3);return()=>clearTimeout(s)},[o]),ne((s,n)=>{(s==="q"||n.ctrl&&s==="c")&&u(),n.tab&&!n.shift&&x(h=>h==="branches"?"settings":"branches")});let v=(s,n)=>{r(s?{text:s,type:n}:null)};return T.createElement(N,{flexDirection:"column"},T.createElement(N,{marginBottom:1},T.createElement(P,{bold:a==="branches",color:a==="branches"?e.tabs.activeColor:e.tabs.inactiveColor},"[Branches]"),T.createElement(P,null," "),T.createElement(P,{bold:a==="settings",color:a==="settings"?e.tabs.activeColor:e.tabs.inactiveColor},"[Settings]")),T.createElement(N,{flexDirection:"column",flexGrow:1},a==="branches"?T.createElement(Y,{baseBranch:d.baseBranch,autoStash:d.autoStash,isActive:a==="branches",onStatusChange:v}):T.createElement(_,{baseBranch:d.baseBranch,autoStash:d.autoStash,onBaseBranchChange:s=>C("baseBranch",s),onAutoStashChange:s=>C("autoStash",s),isActive:a==="settings"})),T.createElement(N,{marginTop:1,height:1},o?T.createElement(P,{color:o.type==="success"?e.status.successColor:e.status.errorColor},o.text):T.createElement(P,{dimColor:!0},"Press q to exit")))}ae(ie.createElement(F,null));
2
+ import React from 'react';
3
+ import { render } from 'ink';
4
+ import meow from 'meow';
5
+ import App from './app.js';
6
+ const cli = meow(`
7
+ Usage
8
+ $ Git-thing
9
+
10
+ Options
11
+ --name Your name
12
+
13
+ Examples
14
+ $ Git-thing --name=Jane
15
+ Hello, Jane
16
+ `, {
17
+ importMeta: import.meta,
18
+ flags: {
19
+ name: {
20
+ type: 'string',
21
+ },
22
+ },
23
+ });
24
+ render(React.createElement(App, { name: cli.flags.name }));
package/package.json CHANGED
@@ -1,26 +1,20 @@
1
1
  {
2
2
  "name": "git-thing",
3
- "version": "1.0.1",
4
- "description": "A TUI for managing git branches and rebasing",
3
+ "version": "1.0.3",
5
4
  "license": "MIT",
6
5
  "repository": {
7
6
  "type": "git",
8
- "url": "git+https://github.com/nilsbuilds/git-thingy.git"
9
- },
10
- "homepage": "https://github.com/nilsbuilds/git-thingy#readme",
11
- "bugs": {
12
- "url": "https://github.com/nilsbuilds/git-thingy/issues"
13
- },
14
- "bin": {
15
- "git-thing": "dist/cli.js"
7
+ "url": "https://github.com/nilsbuilds/git-thing"
16
8
  },
9
+ "bin": "dist/cli.js",
17
10
  "type": "module",
18
11
  "engines": {
19
12
  "node": ">=16"
20
13
  },
21
14
  "scripts": {
22
- "build": "tsup",
23
- "start": "tsup && node dist/cli.js",
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "dev:watch": "tsx watch source/cli.tsx",
24
18
  "test": "prettier --check . && xo && ava"
25
19
  },
26
20
  "files": [
@@ -28,6 +22,7 @@
28
22
  ],
29
23
  "dependencies": {
30
24
  "ink": "^4.1.0",
25
+ "meow": "^11.0.0",
31
26
  "react": "^18.2.0"
32
27
  },
33
28
  "devDependencies": {
@@ -42,7 +37,6 @@
42
37
  "ink-testing-library": "^3.0.0",
43
38
  "prettier": "^2.8.7",
44
39
  "ts-node": "^10.9.1",
45
- "tsup": "^8.5.1",
46
40
  "tsx": "^4.21.0",
47
41
  "typescript": "^5.0.3",
48
42
  "xo": "^0.53.1"
@@ -63,10 +57,5 @@
63
57
  "react/prop-types": "off"
64
58
  }
65
59
  },
66
- "prettier": {
67
- "semi": false,
68
- "singleQuote": true,
69
- "bracketSpacing": false,
70
- "useTabs": true
71
- }
60
+ "prettier": "@vdemedes/prettier-config"
72
61
  }
package/readme.md CHANGED
@@ -1,15 +1,25 @@
1
- # git-thing
1
+ # Git-thing
2
2
 
3
- A TUI for managing git branches and rebasing.
3
+ > This readme is automatically generated by [create-ink-app](https://github.com/vadimdemedes/create-ink-app)
4
4
 
5
- ## Usage
5
+ ## Install
6
6
 
7
7
  ```bash
8
- npx git-thing
8
+ $ npm install --global Git-thing
9
9
  ```
10
10
 
11
- Or install globally:
11
+ ## CLI
12
12
 
13
- ```bash
14
- npm install -g git-thing
13
+ ```
14
+ $ Git-thing --help
15
+
16
+ Usage
17
+ $ Git-thing
18
+
19
+ Options
20
+ --name Your name
21
+
22
+ Examples
23
+ $ Git-thing --name=Jane
24
+ Hello, Jane
15
25
  ```