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/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}