gitlocal 0.2.0
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/LICENSE +21 -0
- package/README.md +212 -0
- package/dist/cli.js +3959 -0
- package/package.json +53 -0
- package/ui/dist/assets/CodeViewer-MbmaOF5c.js +1 -0
- package/ui/dist/assets/MarkdownRenderer-C8U6GQtV.js +1 -0
- package/ui/dist/assets/github-CDab0zVI.css +1 -0
- package/ui/dist/assets/index-3VOSzXZh.css +1 -0
- package/ui/dist/assets/index-DXpsP5DT.js +9 -0
- package/ui/dist/assets/markdown-cUHnBqtS.js +35 -0
- package/ui/dist/index.html +15 -0
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gitlocal",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Browse any local git repository in your browser",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"gitlocal": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=22.0.0"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"ui/dist"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build:ui": "npm --prefix ui run build",
|
|
18
|
+
"build:server": "tsc --noEmit && esbuild src/cli.ts --bundle --platform=node --format=esm --outfile=dist/cli.js --banner:js='#!/usr/bin/env node'",
|
|
19
|
+
"build": "npm run build:ui && npm run build:server && chmod +x dist/cli.js",
|
|
20
|
+
"dev:ui": "npm --prefix ui run dev",
|
|
21
|
+
"dev:server": "node --watch --experimental-strip-types src/cli.ts .",
|
|
22
|
+
"test:server": "vitest run --coverage",
|
|
23
|
+
"test:ui": "npm --prefix ui run test:ci",
|
|
24
|
+
"test": "npm run test:server && npm run test:ui",
|
|
25
|
+
"lint": "tsc --noEmit",
|
|
26
|
+
"audit": "npm audit --audit-level=moderate",
|
|
27
|
+
"audit:ui": "npm --prefix ui audit --audit-level=moderate",
|
|
28
|
+
"verify": "npm test && npm run build && npm run audit && npm run audit:ui",
|
|
29
|
+
"prepublishOnly": "npm run verify"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@hono/node-server": "^1.13.7",
|
|
33
|
+
"hono": "^4.7.5",
|
|
34
|
+
"open": "^10.1.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@emnapi/core": "^1.9.1",
|
|
38
|
+
"@emnapi/runtime": "^1.9.1",
|
|
39
|
+
"@types/node": "^22.0.0",
|
|
40
|
+
"@vitest/coverage-v8": "^4.1.2",
|
|
41
|
+
"esbuild": "^0.27.4",
|
|
42
|
+
"typescript": "^5.8.3",
|
|
43
|
+
"vitest": "^4.1.2"
|
|
44
|
+
},
|
|
45
|
+
"license": "MIT",
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "https://github.com/ehud-am/gitlocal"
|
|
49
|
+
},
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as t,H as e,j as g,e as n,f as u,h as c,i as o,k as l,l as p,x as i,m as h,n as L,o as m,p as f,q as d,s as x,t as j,u as y,v as w,y as k}from"./markdown-cUHnBqtS.js";/* empty css */e.registerLanguage("bash",n);e.registerLanguage("c",u);e.registerLanguage("cpp",c);e.registerLanguage("css",o);e.registerLanguage("go",l);e.registerLanguage("graphql",p);e.registerLanguage("html",i);e.registerLanguage("javascript",h);e.registerLanguage("json",L);e.registerLanguage("kotlin",m);e.registerLanguage("markdown",f);e.registerLanguage("python",d);e.registerLanguage("rust",x);e.registerLanguage("sql",j);e.registerLanguage("swift",y);e.registerLanguage("typescript",w);e.registerLanguage("xml",i);e.registerLanguage("yaml",k);function E({content:s,language:r}){const a=t.useRef(null);return t.useEffect(()=>{if(a.current){a.current.removeAttribute("data-highlighted"),a.current.className=r?`language-${r}`:"",a.current.textContent=s;try{e.highlightElement(a.current)}catch{a.current.textContent=s}}},[s,r]),g.jsx("pre",{className:"code-viewer",children:g.jsx("code",{ref:a,className:r?`language-${r}`:"",children:s})})}export{E as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as r,M as d,c as l,d as m}from"./markdown-cUHnBqtS.js";/* empty css */function p({content:a,onNavigate:o}){return r.jsx("div",{className:"markdown-body",children:r.jsx(d,{remarkPlugins:[m],rehypePlugins:[l],components:{a:({href:e,children:n,...t})=>e&&!e.includes("://")&&!e.startsWith("#")&&!e.startsWith("mailto:")?r.jsx("a",{...t,href:"#",onClick:s=>{s.preventDefault();const i=decodeURIComponent(e).replace(/^\.\//,"");o(i)},children:n}):r.jsx("a",{href:e,target:"_blank",rel:"noopener noreferrer",...t,children:n})},children:a})})}export{p as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#005cc5}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-comment,.hljs-code,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*{box-sizing:border-box;margin:0;padding:0}:root{--color-bg: #ffffff;--color-border: #d0d7de;--color-text: #24292f;--color-text-muted: #57606a;--color-link: #0969da;--color-sidebar-bg: #f6f8fa;--color-header-bg: #24292f;--color-header-text: #ffffff;--color-code-bg: #f6f8fa;--color-hover: #f3f4f6;--color-error-bg: #fff8c5;--color-error-border: #d29922;--sidebar-width: 280px;--header-height: 48px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif;font-size:14px;color:var(--color-text)}body{background:var(--color-bg);height:100vh;overflow:hidden}#root{height:100vh;display:flex;flex-direction:column}.app-header{height:var(--header-height);background:var(--color-header-bg);color:var(--color-header-text);display:flex;align-items:center;padding:0 16px;gap:12px;flex-shrink:0;border-bottom:1px solid #444c56}.app-header .logo{font-weight:600;font-size:15px;color:var(--color-header-text);white-space:nowrap}.app-header .repo-name{font-size:14px;color:#8b949e;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-header-actions{margin-left:auto;display:flex;align-items:center}.app-header-button{border:1px solid #57606a;background:transparent;color:#f6f8fa;border-radius:8px;padding:8px 12px;font:inherit;cursor:pointer;white-space:nowrap}.app-header-button:disabled{opacity:.6;cursor:not-allowed}.app-header-button:hover:not(:disabled),.app-header-button:focus-visible{background:#f6f8fa14}.app-body{display:flex;flex:1;overflow:hidden}.sidebar{width:var(--sidebar-width);min-width:var(--sidebar-width);border-right:1px solid var(--color-border);background:var(--color-sidebar-bg);display:flex;flex-direction:column;overflow:hidden}.content-area{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.breadcrumb{padding:8px 16px;border-bottom:1px solid var(--color-border);background:var(--color-bg);display:flex;align-items:center;gap:4px;flex-wrap:wrap;font-size:13px;flex-shrink:0}.breadcrumb-sep{color:var(--color-text-muted)}.breadcrumb-link{color:var(--color-link);cursor:pointer;text-decoration:none}.breadcrumb-link:hover{text-decoration:underline}.breadcrumb-current{color:var(--color-text);font-weight:500}.file-tree{flex:1;overflow-y:auto;padding:8px 0}.file-tree-node{display:flex;align-items:center;gap:6px;padding:3px 8px;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;overflow:hidden}.file-tree-node:hover{background:var(--color-hover)}.file-tree-node.selected{background:#dbeafe}.file-tree-node svg{flex-shrink:0}.file-tree-node span{overflow:hidden;text-overflow:ellipsis;font-size:13px}.file-tree-children{padding-left:16px}.file-tree-skeleton{padding:4px 8px;display:flex;flex-direction:column;gap:6px}.skeleton-row{height:18px;background:linear-gradient(90deg,#e0e0e0 25%,#f0f0f0,#e0e0e0 75%);background-size:200% 100%;animation:shimmer 1.5s infinite;border-radius:4px}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.git-info{border-top:1px solid var(--color-border);background:var(--color-sidebar-bg);flex-shrink:0;max-height:220px;overflow-y:auto}.git-info-header{padding:8px 12px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);border-bottom:1px solid var(--color-border);display:flex;align-items:center;gap:8px;background:var(--color-sidebar-bg);position:sticky;top:0}.branch-select{font-size:12px;padding:2px 4px;border:1px solid var(--color-border);border-radius:4px;background:var(--color-bg);color:var(--color-text);cursor:pointer;flex:1;min-width:0}.commit-list{list-style:none}.commit-item{padding:6px 12px;border-bottom:1px solid var(--color-border);font-size:12px}.commit-hash{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;color:var(--color-link);font-size:11px}.commit-author{color:var(--color-text-muted);font-size:11px}.commit-message{color:var(--color-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-shell{min-height:100vh;background:radial-gradient(circle at top right,rgba(9,105,218,.08),transparent 24rem),linear-gradient(180deg,#f6f8fa,#fff 40%);color:var(--color-text)}.picker-layout{display:flex;min-height:calc(100vh - var(--header-height))}.picker-sidebar{width:240px;border-right:1px solid var(--color-border);background:#f6f8faeb;padding:24px 16px}.picker-sidebar-section{display:flex;flex-direction:column;gap:8px}.picker-sidebar-label{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--color-text-muted);font-weight:600}.picker-main{flex:1;min-width:0;padding:32px;display:flex;flex-direction:column;gap:24px}.picker-hero{max-width:760px;display:flex;flex-direction:column;gap:10px}.picker-eyebrow{font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--color-link)}.picker-hero h1{font-size:clamp(1.8rem,3vw,2.6rem);line-height:1.1}.picker-hero p{color:var(--color-text-muted);max-width:64ch;line-height:1.6}.picker-browser{border:1px solid var(--color-border);border-radius:16px;background:#fffffff2;box-shadow:0 20px 40px #1f232814;overflow:hidden}.picker-browser-toolbar{display:flex;align-items:center;gap:12px;padding:14px 16px;border-bottom:1px solid var(--color-border);background:#f6f8fa}.picker-current-path{min-width:0;flex:1;padding:10px 12px;border-radius:10px;background:#fff;border:1px solid var(--color-border);color:var(--color-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-browser-list{display:grid;gap:10px;padding:16px;max-height:420px;overflow-y:auto}.picker-entry{width:100%;display:flex;align-items:center;justify-content:space-between;gap:16px;text-align:left;padding:14px 16px;border:1px solid var(--color-border);border-radius:12px;background:#fff;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease}.picker-entry:hover,.picker-entry.selected{border-color:#0969da73;box-shadow:0 10px 24px #0969da1f;transform:translateY(-1px)}.picker-entry-main{min-width:0;flex:1;display:flex;align-items:center;justify-content:space-between;gap:16px;border:none;background:transparent;padding:0;text-align:left;font:inherit;cursor:pointer}.picker-entry-main:focus-visible{outline:2px solid rgba(9,105,218,.45);outline-offset:4px;border-radius:8px}.picker-entry-copy{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:16px;width:100%}.picker-entry-name{font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-entry-badge{flex-shrink:0;font-size:12px;padding:4px 10px;border-radius:999px;background:#f6f8fa;color:var(--color-text-muted);border:1px solid var(--color-border)}.picker-entry-badge.is-repo{background:#0969da14;color:var(--color-link);border-color:#0969da2e}.picker-entry-action{flex-shrink:0;border-radius:10px;padding:10px 14px;border:1px solid var(--color-border);background:#f6f8fa;color:var(--color-text);font:inherit;font-weight:600;cursor:pointer}.picker-entry-action.is-primary{background:var(--color-link);color:#fff;border-color:var(--color-link)}.picker-entry-action:focus-visible{outline:2px solid rgba(9,105,218,.45);outline-offset:2px}.picker-form{display:flex;flex-direction:column;gap:10px}.picker-input-label{font-weight:600}.picker-input{width:100%;border:1px solid var(--color-border);border-radius:10px;padding:12px 14px;font:inherit}.picker-form-actions{display:flex;flex-wrap:wrap;gap:12px}.picker-nav-button,.picker-submit{border-radius:10px;padding:10px 14px;border:1px solid var(--color-border);background:#fff;font:inherit;cursor:pointer}.picker-nav-button:disabled,.picker-submit:disabled{cursor:not-allowed;opacity:.6}.picker-submit{background:var(--color-link);color:#fff;border-color:var(--color-link);font-weight:600}.picker-helper{color:var(--color-text-muted)}.picker-error{color:#cf222e;font-weight:500}@media(max-width:860px){.picker-layout{flex-direction:column}.picker-sidebar{width:100%;border-right:none;border-bottom:1px solid var(--color-border)}.picker-main{padding:20px}.picker-browser-toolbar,.picker-entry{flex-direction:column;align-items:stretch}.picker-entry-copy{flex-direction:column;align-items:flex-start}.picker-entry-action{width:100%}}.content-panel{flex:1;overflow-y:auto;padding:24px}.content-panel.empty{display:flex;align-items:center;justify-content:center;color:var(--color-text-muted);font-size:14px}.content-toolbar{display:flex;justify-content:flex-end;margin-bottom:12px}.btn-raw{font-size:12px;padding:4px 10px;border:1px solid var(--color-border);border-radius:6px;background:var(--color-bg);cursor:pointer;color:var(--color-text)}.btn-raw:hover{background:var(--color-hover)}.binary-placeholder{color:var(--color-text-muted);font-style:italic;padding:24px 0}.content-image{max-width:100%;border:1px solid var(--color-border);border-radius:6px}.content-skeleton{height:300px;background:linear-gradient(90deg,#e0e0e0 25%,#f0f0f0,#e0e0e0 75%);background-size:200% 100%;animation:shimmer 1.5s infinite;border-radius:6px}.markdown-body{max-width:860px;line-height:1.6}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin:24px 0 8px;font-weight:600;line-height:1.25}.markdown-body h1{font-size:2em;border-bottom:1px solid var(--color-border);padding-bottom:8px}.markdown-body h2{font-size:1.5em;border-bottom:1px solid var(--color-border);padding-bottom:6px}.markdown-body p{margin:0 0 16px}.markdown-body code{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:85%;background:var(--color-code-bg);padding:2px 4px;border-radius:4px;border:1px solid var(--color-border)}.markdown-body pre{background:var(--color-code-bg);border:1px solid var(--color-border);border-radius:6px;padding:16px;overflow-x:auto;margin:0 0 16px}.markdown-body pre code{background:transparent;border:none;padding:0;font-size:90%}.markdown-body table{border-collapse:collapse;width:100%;margin-bottom:16px}.markdown-body th,.markdown-body td{border:1px solid var(--color-border);padding:6px 13px;text-align:left}.markdown-body th{background:var(--color-sidebar-bg);font-weight:600}.markdown-body tr:nth-child(2n){background:var(--color-sidebar-bg)}.markdown-body blockquote{border-left:4px solid var(--color-border);padding:0 16px;color:var(--color-text-muted);margin:0 0 16px}.markdown-body ul,.markdown-body ol{padding-left:2em;margin-bottom:16px}.markdown-body li{margin:2px 0}.markdown-body a{color:var(--color-link)}.markdown-body a:hover{text-decoration:underline}.markdown-body img{max-width:100%;border-radius:4px}.code-viewer{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:13px;background:var(--color-code-bg);border:1px solid var(--color-border);border-radius:6px;padding:16px;overflow-x:auto;white-space:pre;line-height:1.5}.error-screen{display:flex;align-items:center;justify-content:center;height:100%;padding:32px}.error-card{max-width:480px;padding:24px;border:1px solid var(--color-error-border);border-radius:8px;background:var(--color-error-bg);text-align:center}.error-card h2{margin-bottom:12px;color:#9a6700}.error-card p{color:var(--color-text-muted);line-height:1.5}.error-card code{font-family:ui-monospace,SFMono-Regular,monospace;font-size:13px;background:#0000000d;padding:2px 5px;border-radius:3px}
|