diffhub 0.1.0 → 0.1.2

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.
Files changed (189) hide show
  1. package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  2. package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
  3. package/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/apps/web/.next/required-server-files.json +4 -4
  5. package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
  6. package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/standalone/apps/web/.next/server/app/_not-found/page.js +1 -1
  13. package/.next/standalone/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  16. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +17 -16
  17. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +17 -16
  18. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  19. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +6 -5
  20. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  21. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  22. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/standalone/apps/web/.next/server/app/api/comments/route.js +1 -1
  24. package/.next/standalone/apps/web/.next/server/app/api/comments/route.js.nft.json +1 -1
  25. package/.next/standalone/apps/web/.next/server/app/api/diff/route.js +2 -2
  26. package/.next/standalone/apps/web/.next/server/app/api/diff/route.js.nft.json +1 -1
  27. package/.next/standalone/apps/web/.next/server/app/api/discard/route.js +2 -2
  28. package/.next/standalone/apps/web/.next/server/app/api/discard/route.js.nft.json +1 -1
  29. package/.next/standalone/apps/web/.next/server/app/api/file/route.js +2 -2
  30. package/.next/standalone/apps/web/.next/server/app/api/file/route.js.nft.json +1 -1
  31. package/.next/standalone/apps/web/.next/server/app/api/files/route.js +2 -2
  32. package/.next/standalone/apps/web/.next/server/app/api/files/route.js.nft.json +1 -1
  33. package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
  34. package/.next/standalone/apps/web/.next/server/app/index.rsc +16 -15
  35. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  36. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +16 -15
  37. package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +4 -4
  38. package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +6 -5
  39. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  40. package/.next/standalone/apps/web/.next/server/app/page/react-loadable-manifest.json +2 -2
  41. package/.next/standalone/apps/web/.next/server/app/page.js +2 -2
  42. package/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -1
  43. package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__05ejtyr._.js +3 -0
  45. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0e2dp4h._.js +3 -0
  46. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0egk6ui._.js +3 -0
  47. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0i6i-~n._.js +3 -0
  48. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0sv4hr9._.js +3 -0
  49. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0t.tl18._.js +3 -0
  50. package/.next/standalone/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__06b81~v._.js → [root-of-the-server]__0giwc4b._.js} +2 -2
  51. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0jit913._.js +3 -0
  52. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0v19a7g._.js +3 -0
  53. package/.next/standalone/apps/web/.next/server/chunks/ssr/_0f40lcw._.js +3 -0
  54. package/.next/standalone/apps/web/.next/server/chunks/ssr/_0oc3qg_._.js +3 -3
  55. package/.next/standalone/apps/web/.next/server/chunks/ssr/{apps_web_0b_ykcu._.js → _0qo42r0._.js} +2 -2
  56. package/.next/standalone/apps/web/.next/server/chunks/ssr/{apps_web_08kf15u._.js → apps_web_0758ax4._.js} +2 -2
  57. package/.next/standalone/apps/web/.next/server/chunks/ssr/node_modules_0v8w2j~._.js +70 -0
  58. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
  59. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  60. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  61. package/.next/standalone/apps/web/.next/server/server-reference-manifest.js +1 -1
  62. package/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
  63. package/.next/standalone/apps/web/.next/static/chunks/00zp83w4g1v1r.js +16 -0
  64. package/.next/standalone/apps/web/.next/static/chunks/042ip11u2i2z6.js +138 -0
  65. package/.next/standalone/apps/web/.next/static/chunks/07ndp5x2cvqo..css +3 -0
  66. package/.next/standalone/apps/web/.next/static/chunks/085s9eg867ha-.js +1 -0
  67. package/.next/standalone/apps/web/.next/static/chunks/0_vmme_k_ff_u.js +67 -0
  68. package/.next/standalone/apps/web/.next/static/chunks/0ap~_hc7r17_6.js +1 -0
  69. package/.next/standalone/apps/web/.next/static/chunks/0nt5-rwas5thn.js +67 -0
  70. package/.next/standalone/apps/web/.next/static/chunks/0p~3-4_.v0cft.js +1 -0
  71. package/.next/standalone/apps/web/.next/static/chunks/0wx-2dr44ql-g.js +1 -0
  72. package/.next/standalone/apps/web/.next/static/chunks/{0syypqto3~pe_.js → 0y0o261rjun_2.js} +8 -8
  73. package/.next/standalone/apps/web/.next/static/chunks/0y5z3t-z1c8ks.js.map +5 -0
  74. package/.next/standalone/apps/web/.next/static/chunks/17b.xoi.b6rcl.js +1 -0
  75. package/.next/standalone/apps/web/.next/static/chunks/turbopack-0_n_4n~_4no2a.js +1 -0
  76. package/.next/standalone/apps/web/.next/static/chunks/turbopack-worker-0sjn--fhq~1cg.js +1 -0
  77. package/.next/standalone/apps/web/.next/static/media/diffs.worker.09unk0quktc_5.ts +1 -0
  78. package/.next/standalone/apps/web/package.json +12 -2
  79. package/.next/standalone/apps/web/server.js +1 -1
  80. package/README.md +10 -3
  81. package/bin/diffhub.mjs +1 -1
  82. package/package.json +12 -2
  83. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__05vwx85._.js +0 -3
  84. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__09vmjc2._.js +0 -3
  85. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0etmu4u._.js +0 -3
  86. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0g-_a7n._.js +0 -3
  87. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0mshgfw._.js +0 -3
  88. package/.next/standalone/apps/web/.next/server/chunks/[root-of-the-server]__0qixima._.js +0 -3
  89. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0khyzju._.js +0 -3
  90. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0l2mjim._.js +0 -70
  91. package/.next/standalone/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0q2lon0._.js +0 -3
  92. package/.next/standalone/apps/web/.next/server/chunks/ssr/_059a1m-._.js +0 -3
  93. package/.next/standalone/apps/web/.next/static/chunks/0.ae0sud8tm7k.js +0 -204
  94. package/.next/standalone/apps/web/.next/static/chunks/0di~ntk7iivm4.js +0 -1
  95. package/.next/standalone/apps/web/.next/static/chunks/0pklg0nmdvay8.js +0 -1
  96. package/.next/standalone/apps/web/.next/static/chunks/0up9_7hiwl_dt.js +0 -1
  97. package/.next/standalone/apps/web/.next/static/chunks/0~984a88e4rp9.js +0 -204
  98. package/.next/standalone/apps/web/.next/static/chunks/13y8355z8m13w.js +0 -1
  99. package/.next/standalone/apps/web/.next/static/chunks/14gfmthe5zcf..js +0 -16
  100. package/.next/standalone/apps/web/.next/static/chunks/15--1d_raviej.css +0 -3
  101. package/.next/standalone/apps/web/AGENTS.md +0 -60
  102. package/.next/standalone/apps/web/CLAUDE.md +0 -1
  103. package/.next/standalone/apps/web/README.md +0 -78
  104. package/.next/standalone/apps/web/app/api/comments/route.ts +0 -20
  105. package/.next/standalone/apps/web/app/api/diff/route.ts +0 -15
  106. package/.next/standalone/apps/web/app/api/discard/route.ts +0 -15
  107. package/.next/standalone/apps/web/app/api/file/route.ts +0 -17
  108. package/.next/standalone/apps/web/app/api/files/route.ts +0 -14
  109. package/.next/standalone/apps/web/app/api/open/route.ts +0 -64
  110. package/.next/standalone/apps/web/app/favicon.ico +0 -0
  111. package/.next/standalone/apps/web/app/globals.css +0 -214
  112. package/.next/standalone/apps/web/app/layout.tsx +0 -52
  113. package/.next/standalone/apps/web/app/page.tsx +0 -6
  114. package/.next/standalone/apps/web/bin/diffhub.mjs +0 -147
  115. package/.next/standalone/apps/web/components/ContextMenu.tsx +0 -161
  116. package/.next/standalone/apps/web/components/DiffApp.tsx +0 -363
  117. package/.next/standalone/apps/web/components/DiffViewer.tsx +0 -565
  118. package/.next/standalone/apps/web/components/FileDiffHeader.tsx +0 -119
  119. package/.next/standalone/apps/web/components/FileList.tsx +0 -438
  120. package/.next/standalone/apps/web/components/KeyboardShortcutsDialog.tsx +0 -79
  121. package/.next/standalone/apps/web/components/SidebarHelpMenu.tsx +0 -86
  122. package/.next/standalone/apps/web/components/StatusBar.tsx +0 -212
  123. package/.next/standalone/apps/web/components/icons/file-status-icons.tsx +0 -48
  124. package/.next/standalone/apps/web/components/theme-provider.tsx +0 -12
  125. package/.next/standalone/apps/web/components/ui/button.tsx +0 -90
  126. package/.next/standalone/apps/web/components/ui/empty.tsx +0 -82
  127. package/.next/standalone/apps/web/components/ui/input.tsx +0 -18
  128. package/.next/standalone/apps/web/components/ui/kbd.tsx +0 -14
  129. package/.next/standalone/apps/web/components/ui/separator.tsx +0 -23
  130. package/.next/standalone/apps/web/components/ui/sheet.tsx +0 -109
  131. package/.next/standalone/apps/web/components/ui/sidebar.tsx +0 -700
  132. package/.next/standalone/apps/web/components/ui/skeleton.tsx +0 -9
  133. package/.next/standalone/apps/web/components/ui/toggle.tsx +0 -35
  134. package/.next/standalone/apps/web/components/ui/tooltip.tsx +0 -52
  135. package/.next/standalone/apps/web/components.json +0 -27
  136. package/.next/standalone/apps/web/lib/comments.ts +0 -52
  137. package/.next/standalone/apps/web/lib/export-comments.ts +0 -13
  138. package/.next/standalone/apps/web/lib/git.ts +0 -201
  139. package/.next/standalone/apps/web/lib/use-mobile.ts +0 -19
  140. package/.next/standalone/apps/web/lib/utils.ts +0 -5
  141. package/.next/standalone/apps/web/next.config.ts +0 -19
  142. package/.next/standalone/apps/web/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
  143. package/.next/standalone/apps/web/node_modules/@img/sharp-darwin-arm64/package.json +0 -40
  144. package/.next/standalone/apps/web/node_modules/@img/sharp-libvips-darwin-arm64/README.md +0 -46
  145. package/.next/standalone/apps/web/node_modules/@img/sharp-libvips-darwin-arm64/lib/glib-2.0/include/glibconfig.h +0 -220
  146. package/.next/standalone/apps/web/node_modules/@img/sharp-libvips-darwin-arm64/lib/index.js +0 -1
  147. package/.next/standalone/apps/web/node_modules/@img/sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib +0 -0
  148. package/.next/standalone/apps/web/node_modules/@img/sharp-libvips-darwin-arm64/package.json +0 -36
  149. package/.next/standalone/apps/web/node_modules/@img/sharp-libvips-darwin-arm64/versions.json +0 -30
  150. package/.next/standalone/apps/web/oxfmt.config.ts +0 -6
  151. package/.next/standalone/apps/web/oxlint.config.ts +0 -13
  152. package/.next/standalone/apps/web/postcss.config.mjs +0 -7
  153. package/.next/standalone/apps/web/public/file.svg +0 -1
  154. package/.next/standalone/apps/web/public/glide-variable-italic.woff2 +0 -0
  155. package/.next/standalone/apps/web/public/glide-variable.woff2 +0 -0
  156. package/.next/standalone/apps/web/public/globe.svg +0 -1
  157. package/.next/standalone/apps/web/public/next.svg +0 -1
  158. package/.next/standalone/apps/web/public/operator-mono-book-italic.woff2 +0 -0
  159. package/.next/standalone/apps/web/public/operator-mono-book.woff2 +0 -0
  160. package/.next/standalone/apps/web/public/operator-mono-medium-italic.woff2 +0 -0
  161. package/.next/standalone/apps/web/public/operator-mono-medium.woff2 +0 -0
  162. package/.next/standalone/apps/web/public/vercel.svg +0 -1
  163. package/.next/standalone/apps/web/public/window.svg +0 -1
  164. package/.next/standalone/apps/web/tsconfig.json +0 -34
  165. package/.next/standalone/apps/web/tsconfig.tsbuildinfo +0 -1
  166. /package/.next/standalone/apps/web/.next/static/{x0qhb6ReQoZ53hlmgg2-_ → mAVCL4HCmtJwT35feBPdK}/_buildManifest.js +0 -0
  167. /package/.next/standalone/apps/web/.next/static/{x0qhb6ReQoZ53hlmgg2-_ → mAVCL4HCmtJwT35feBPdK}/_clientMiddlewareManifest.js +0 -0
  168. /package/.next/standalone/apps/web/.next/static/{x0qhb6ReQoZ53hlmgg2-_ → mAVCL4HCmtJwT35feBPdK}/_ssgManifest.js +0 -0
  169. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/classes/comparator.js +0 -0
  170. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/classes/range.js +0 -0
  171. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/classes/semver.js +0 -0
  172. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/cmp.js +0 -0
  173. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/coerce.js +0 -0
  174. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/compare.js +0 -0
  175. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/eq.js +0 -0
  176. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/gt.js +0 -0
  177. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/gte.js +0 -0
  178. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/lt.js +0 -0
  179. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/lte.js +0 -0
  180. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/neq.js +0 -0
  181. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/parse.js +0 -0
  182. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/functions/satisfies.js +0 -0
  183. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/internal/constants.js +0 -0
  184. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/internal/debug.js +0 -0
  185. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/internal/identifiers.js +0 -0
  186. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/internal/lrucache.js +0 -0
  187. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/internal/parse-options.js +0 -0
  188. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/internal/re.js +0 -0
  189. /package/.next/standalone/{apps/web/node_modules → node_modules}/semver/package.json +0 -0
@@ -1,35 +0,0 @@
1
- import { Toggle as BaseToggle } from "@base-ui/react/toggle";
2
- import { cva } from "class-variance-authority";
3
- import type { VariantProps } from "class-variance-authority";
4
- import type * as React from "react";
5
- import { cn } from "@/lib/utils";
6
-
7
- const toggleVariants = cva(
8
- "inline-flex shrink-0 select-none items-center justify-center rounded-lg border border-transparent outline-none transition-[color,background-color,border-color,box-shadow,opacity] duration-150 ease-out focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-45 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
9
- {
10
- defaultVariants: {
11
- size: "icon-xs",
12
- variant: "ghost",
13
- },
14
- variants: {
15
- size: {
16
- "icon-sm": "size-9 rounded-[min(var(--radius-md),12px)]",
17
- "icon-xs":
18
- "size-8 rounded-[min(var(--radius-md),10px)] [&_svg:not([class*='size-'])]:size-3",
19
- },
20
- variant: {
21
- ghost:
22
- "hover:bg-muted hover:text-foreground data-[pressed]:bg-muted data-[pressed]:text-foreground",
23
- },
24
- },
25
- },
26
- );
27
-
28
- export const Toggle = ({
29
- className,
30
- variant,
31
- size,
32
- ...props
33
- }: React.ComponentProps<typeof BaseToggle> & VariantProps<typeof toggleVariants>) => (
34
- <BaseToggle className={cn(toggleVariants({ className, size, variant }))} {...props} />
35
- );
@@ -1,52 +0,0 @@
1
- "use client";
2
-
3
- import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
4
-
5
- import { cn } from "@/lib/utils";
6
-
7
- const TooltipProvider = ({ delay = 0, ...props }: TooltipPrimitive.Provider.Props) => (
8
- <TooltipPrimitive.Provider data-slot="tooltip-provider" delay={delay} {...props} />
9
- );
10
-
11
- const Tooltip = ({ ...props }: TooltipPrimitive.Root.Props) => (
12
- <TooltipPrimitive.Root data-slot="tooltip" {...props} />
13
- );
14
-
15
- const TooltipTrigger = ({ ...props }: TooltipPrimitive.Trigger.Props) => (
16
- <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
17
- );
18
-
19
- const TooltipContent = ({
20
- className,
21
- side = "top",
22
- sideOffset = 4,
23
- align = "center",
24
- alignOffset = 0,
25
- children,
26
- ...props
27
- }: TooltipPrimitive.Popup.Props &
28
- Pick<TooltipPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset">) => (
29
- <TooltipPrimitive.Portal>
30
- <TooltipPrimitive.Positioner
31
- align={align}
32
- alignOffset={alignOffset}
33
- side={side}
34
- sideOffset={sideOffset}
35
- className="isolate z-50"
36
- >
37
- <TooltipPrimitive.Popup
38
- data-slot="tooltip-content"
39
- className={cn(
40
- "z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
41
- className,
42
- )}
43
- {...props}
44
- >
45
- {children}
46
- <TooltipPrimitive.Arrow className="z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" />
47
- </TooltipPrimitive.Popup>
48
- </TooltipPrimitive.Positioner>
49
- </TooltipPrimitive.Portal>
50
- );
51
-
52
- export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
@@ -1,27 +0,0 @@
1
- {
2
- "$schema": "https://ui.shadcn.com/schema.json",
3
- "style": "base-nova",
4
- "rsc": true,
5
- "tsx": true,
6
- "tailwind": {
7
- "config": "",
8
- "css": "app/globals.css",
9
- "baseColor": "neutral",
10
- "cssVariables": true,
11
- "prefix": ""
12
- },
13
- "iconLibrary": "lucide",
14
- "rtl": false,
15
- "aliases": {
16
- "components": "@/components",
17
- "utils": "@/lib/utils",
18
- "ui": "@/components/ui",
19
- "lib": "@/lib",
20
- "hooks": "@/hooks"
21
- },
22
- "menuColor": "default",
23
- "menuAccent": "subtle",
24
- "registries": {
25
- "@blode": "https://ui.blode.co/r/{name}.json"
26
- }
27
- }
@@ -1,52 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
3
-
4
- const getCommentsPath = (): string => {
5
- const repoPath = process.env.DIFFHUB_REPO ?? process.cwd();
6
- return join(repoPath, ".git", "diffhub-comments.json");
7
- };
8
-
9
- export type CommentTag = "[must-fix]" | "[suggestion]" | "[nit]" | "[question]" | "";
10
-
11
- export interface Comment {
12
- id: string;
13
- file: string;
14
- lineNumber: number;
15
- side: "left" | "right";
16
- body: string;
17
- tag: CommentTag;
18
- createdAt: string;
19
- }
20
-
21
- export const readComments = (): Comment[] => {
22
- const path = getCommentsPath();
23
- if (!existsSync(path)) {
24
- return [];
25
- }
26
- try {
27
- return JSON.parse(readFileSync(path, "utf-8")) as Comment[];
28
- } catch {
29
- // empty
30
- return [];
31
- }
32
- };
33
-
34
- const saveComments = (comments: Comment[]): void => {
35
- writeFileSync(getCommentsPath(), JSON.stringify(comments, null, 2));
36
- };
37
-
38
- export const addComment = (data: Omit<Comment, "id" | "createdAt">): Comment => {
39
- const comments = readComments();
40
- const comment: Comment = {
41
- ...data,
42
- createdAt: new Date().toISOString(),
43
- id: crypto.randomUUID(),
44
- };
45
- comments.push(comment);
46
- saveComments(comments);
47
- return comment;
48
- };
49
-
50
- export const deleteComment = (id: string): void => {
51
- saveComments(readComments().filter((c) => c.id !== id));
52
- };
@@ -1,13 +0,0 @@
1
- import type { Comment } from "./comments";
2
-
3
- export const exportCommentsAsPrompt = (comments: Comment[]): string => {
4
- if (comments.length === 0) {
5
- return "No comments.";
6
- }
7
- const lines = comments.map((c) => {
8
- const tag = c.tag ? `${c.tag} ` : "";
9
- const loc = c.lineNumber > 0 ? `:${c.lineNumber}` : "";
10
- return `- ${tag}**${c.file}${loc}**: ${c.body}`;
11
- });
12
- return `## Code Review Comments\n\nPlease address the following:\n\n${lines.join("\n")}`;
13
- };
@@ -1,201 +0,0 @@
1
- import { simpleGit } from "simple-git";
2
- import type { SimpleGit } from "simple-git";
3
- import { readFileSync, statSync } from "node:fs";
4
- import { join } from "node:path";
5
-
6
- const REPO_POINTER = "/tmp/diffhub-active-repo";
7
-
8
- // TTL cache — avoids spawning git subprocesses on every poll
9
- const cache = new Map<string, { value: unknown; expires: number }>();
10
- let lastPointerMtime = 0;
11
-
12
- const bustCacheIfRepoChanged = () => {
13
- try {
14
- const mtime = statSync(REPO_POINTER).mtimeMs;
15
- if (mtime !== lastPointerMtime) {
16
- lastPointerMtime = mtime;
17
- cache.clear();
18
- }
19
- } catch {
20
- // empty
21
- }
22
- };
23
-
24
- const cached = async <T>(key: string, ttlMs: number, fn: () => Promise<T>): Promise<T> => {
25
- bustCacheIfRepoChanged();
26
- const hit = cache.get(key);
27
- if (hit && hit.expires > Date.now()) {
28
- return hit.value as T;
29
- }
30
- const value = await fn();
31
- cache.set(key, { expires: Date.now() + ttlMs, value });
32
- return value;
33
- };
34
-
35
- const getRepoPath = (): string => {
36
- // Temp file from diffhub-point takes priority (dev workflow)
37
- try {
38
- const p = readFileSync(REPO_POINTER, "utf-8").trim();
39
- if (p) {
40
- return p;
41
- }
42
- } catch {
43
- // empty
44
- }
45
- // Fallback: env var (set by CLI in production, or .env.local)
46
- return process.env.DIFFHUB_REPO ?? process.cwd();
47
- };
48
-
49
- const git = (): SimpleGit => simpleGit(getRepoPath());
50
-
51
- export const getBaseBranch = (): Promise<string> => {
52
- const repoPath = getRepoPath();
53
- return cached(`baseBranch:${repoPath}`, 30_000, async () => {
54
- const g = git();
55
- const remotes = await g.branch(["-r"]);
56
- for (const name of ["main", "master", "develop", "dev"]) {
57
- if (remotes.all.includes(`origin/${name}`)) {
58
- return `origin/${name}`;
59
- }
60
- }
61
- const local = await g.branchLocal();
62
- for (const name of ["main", "master", "develop", "dev"]) {
63
- if (local.all.includes(name)) {
64
- return name;
65
- }
66
- }
67
- return "origin/main";
68
- });
69
- };
70
-
71
- export const getMergeBase = (baseBranch: string): Promise<string> => {
72
- const repoPath = getRepoPath();
73
- return cached(`mergeBase:${repoPath}:${baseBranch}`, 30_000, async () => {
74
- const g = git();
75
- const mb = await g.raw(["merge-base", "HEAD", baseBranch]);
76
- return mb.trim();
77
- });
78
- };
79
-
80
- export interface DiffResult {
81
- patch: string;
82
- baseBranch: string;
83
- mergeBase: string;
84
- branch: string;
85
- }
86
-
87
- export const getDiff = (base?: string, mode?: "uncommitted"): Promise<DiffResult> => {
88
- const repoPath = getRepoPath();
89
- return cached(`diff:${repoPath}:${base ?? ""}:${mode ?? ""}`, 2000, async () => {
90
- const g = git();
91
- const raw = await g.revparse(["--abbrev-ref", "HEAD"]);
92
- const branch = raw.trim();
93
- if (mode === "uncommitted") {
94
- const patch = await g.diff(["HEAD"]);
95
- return { baseBranch: "HEAD", branch, mergeBase: "HEAD", patch };
96
- }
97
- const baseBranch = base ?? (await getBaseBranch());
98
- const mergeBase = await getMergeBase(baseBranch);
99
- const patch = await g.diff([mergeBase]);
100
- return { baseBranch, branch, mergeBase, patch };
101
- });
102
- };
103
-
104
- export const getDiffForFile = (
105
- file: string,
106
- base?: string,
107
- mode?: "uncommitted",
108
- ): Promise<DiffResult> => {
109
- const repoPath = getRepoPath();
110
- return cached(`diff:${repoPath}:${base ?? ""}:${mode ?? ""}:${file}`, 2000, async () => {
111
- const g = git();
112
- const raw = await g.revparse(["--abbrev-ref", "HEAD"]);
113
- const branch = raw.trim();
114
- if (mode === "uncommitted") {
115
- const patch = await g.diff(["HEAD", "--", file]);
116
- return { baseBranch: "HEAD", branch, mergeBase: "HEAD", patch };
117
- }
118
- const baseBranch = base ?? (await getBaseBranch());
119
- const mergeBase = await getMergeBase(baseBranch);
120
- const patch = await g.diff([mergeBase, "--", file]);
121
- return { baseBranch, branch, mergeBase, patch };
122
- });
123
- };
124
-
125
- export interface DiffFileStat {
126
- file: string;
127
- changes: number;
128
- insertions: number;
129
- deletions: number;
130
- binary: boolean;
131
- }
132
-
133
- export interface DiffStatsResult {
134
- files: DiffFileStat[];
135
- insertions: number;
136
- deletions: number;
137
- branch: string;
138
- baseBranch: string;
139
- }
140
-
141
- export const getDiffStats = (base?: string, mode?: "uncommitted"): Promise<DiffStatsResult> => {
142
- const repoPath = getRepoPath();
143
- return cached(`stats:${repoPath}:${base ?? ""}:${mode ?? ""}`, 2000, async () => {
144
- const g = git();
145
- const raw = await g.revparse(["--abbrev-ref", "HEAD"]);
146
- const branch = raw.trim();
147
- if (mode === "uncommitted") {
148
- const baseBranch = "HEAD";
149
- const summary = await g.diffSummary(["HEAD"]);
150
- return {
151
- baseBranch,
152
- branch,
153
- deletions: summary.deletions,
154
- files: summary.files as DiffFileStat[],
155
- insertions: summary.insertions,
156
- };
157
- }
158
- const baseBranch = base ?? (await getBaseBranch());
159
- const mergeBase = await getMergeBase(baseBranch);
160
- const summary = await g.diffSummary([mergeBase]);
161
- return {
162
- baseBranch,
163
- branch,
164
- deletions: summary.deletions,
165
- files: summary.files as DiffFileStat[],
166
- insertions: summary.insertions,
167
- };
168
- });
169
- };
170
-
171
- /**
172
- * Return the content of a file at a specific git ref.
173
- * Pass "WORKING_TREE" to read the current working-tree copy.
174
- * Returns an empty string if the file doesn't exist at that ref (new/deleted files).
175
- */
176
- export const getFileAtRef = (filePath: string, ref: string): Promise<string> => {
177
- const repoPath = getRepoPath();
178
- if (ref === "WORKING_TREE") {
179
- try {
180
- return Promise.resolve(readFileSync(join(repoPath, filePath), "utf-8"));
181
- } catch {
182
- // empty
183
- return Promise.resolve("");
184
- }
185
- }
186
- return cached(`file:${repoPath}:${ref}:${filePath}`, 30_000, async () => {
187
- try {
188
- return await git().show([`${ref}:${filePath}`]);
189
- } catch {
190
- // empty
191
- return "";
192
- }
193
- });
194
- };
195
-
196
- /** Discard all uncommitted changes to a file (staged + working tree). */
197
- export const discardFile = async (file: string): Promise<void> => {
198
- const g = git();
199
- // restore --staged --worktree handles both staged and unstaged changes
200
- await g.raw(["restore", "--staged", "--worktree", "--", file]);
201
- };
@@ -1,19 +0,0 @@
1
- import { useEffect, useState } from "react";
2
-
3
- const MOBILE_BREAKPOINT = 768;
4
-
5
- export const useIsMobile = () => {
6
- const [isMobile, setIsMobile] = useState<boolean | undefined>();
7
-
8
- useEffect(() => {
9
- const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
10
- const onChange = () => {
11
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
12
- };
13
- mql.addEventListener("change", onChange);
14
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
15
- return () => mql.removeEventListener("change", onChange);
16
- }, []);
17
-
18
- return !!isMobile;
19
- };
@@ -1,5 +0,0 @@
1
- import { clsx } from "clsx";
2
- import type { ClassValue } from "clsx";
3
- import { twMerge } from "tailwind-merge";
4
-
5
- export const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));
@@ -1,19 +0,0 @@
1
- import type { NextConfig } from "next";
2
- import { join } from "node:path";
3
-
4
- const nextConfig: NextConfig = {
5
- allowedDevOrigins: ["diffhub.localhost", "*.diffhub.localhost"],
6
- logging: {
7
- browserToTerminal: true,
8
- },
9
- // Standalone output: produces .next/standalone/server.js — a self-contained server
10
- // that works without a full Next.js install. Shipped in the npm package.
11
- output: "standalone",
12
- // Monorepo: point tracing root at the repo root so Next.js can resolve packages
13
- // hoisted to the root node_modules. The standalone output lands at
14
- // .next/standalone/apps/web/server.js (mirroring the workspace path).
15
- outputFileTracingRoot: join(import.meta.dirname, "../.."),
16
- reactCompiler: true,
17
- };
18
-
19
- export default nextConfig;
@@ -1,40 +0,0 @@
1
- {
2
- "name": "@img/sharp-darwin-arm64",
3
- "version": "0.34.5",
4
- "description": "Prebuilt sharp for use with macOS 64-bit ARM",
5
- "author": "Lovell Fuller <npm@lovell.info>",
6
- "homepage": "https://sharp.pixelplumbing.com",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/lovell/sharp.git",
10
- "directory": "npm/darwin-arm64"
11
- },
12
- "license": "Apache-2.0",
13
- "funding": {
14
- "url": "https://opencollective.com/libvips"
15
- },
16
- "preferUnplugged": true,
17
- "optionalDependencies": {
18
- "@img/sharp-libvips-darwin-arm64": "1.2.4"
19
- },
20
- "files": [
21
- "lib"
22
- ],
23
- "publishConfig": {
24
- "access": "public"
25
- },
26
- "type": "commonjs",
27
- "exports": {
28
- "./sharp.node": "./lib/sharp-darwin-arm64.node",
29
- "./package": "./package.json"
30
- },
31
- "engines": {
32
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
33
- },
34
- "os": [
35
- "darwin"
36
- ],
37
- "cpu": [
38
- "arm64"
39
- ]
40
- }
@@ -1,46 +0,0 @@
1
- # `@img/sharp-libvips-darwin-arm64`
2
-
3
- Prebuilt libvips and dependencies for use with sharp on macOS 64-bit ARM.
4
-
5
- ## Licensing
6
-
7
- This software contains third-party libraries
8
- used under the terms of the following licences:
9
-
10
- | Library | Used under the terms of |
11
- |---------------|-----------------------------------------------------------------------------------------------------------|
12
- | aom | BSD 2-Clause + [Alliance for Open Media Patent License 1.0](https://aomedia.org/license/patent-license/) |
13
- | cairo | Mozilla Public License 2.0 |
14
- | cgif | MIT Licence |
15
- | expat | MIT Licence |
16
- | fontconfig | [fontconfig Licence](https://gitlab.freedesktop.org/fontconfig/fontconfig/blob/main/COPYING) (BSD-like) |
17
- | freetype | [freetype Licence](https://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/FTL.TXT) (BSD-like) |
18
- | fribidi | LGPLv3 |
19
- | glib | LGPLv3 |
20
- | harfbuzz | MIT Licence |
21
- | highway | Apache-2.0 License, BSD 3-Clause |
22
- | lcms | MIT Licence |
23
- | libarchive | BSD 2-Clause |
24
- | libexif | LGPLv3 |
25
- | libffi | MIT Licence |
26
- | libheif | LGPLv3 |
27
- | libimagequant | [BSD 2-Clause](https://github.com/lovell/libimagequant/blob/main/COPYRIGHT) |
28
- | libnsgif | MIT Licence |
29
- | libpng | [libpng License](https://github.com/pnggroup/libpng/blob/master/LICENSE) |
30
- | librsvg | LGPLv3 |
31
- | libspng | [BSD 2-Clause, libpng License](https://github.com/randy408/libspng/blob/master/LICENSE) |
32
- | libtiff | [libtiff License](https://gitlab.com/libtiff/libtiff/blob/master/LICENSE.md) (BSD-like) |
33
- | libvips | LGPLv3 |
34
- | libwebp | New BSD License |
35
- | libxml2 | MIT Licence |
36
- | mozjpeg | [zlib License, IJG License, BSD-3-Clause](https://github.com/mozilla/mozjpeg/blob/master/LICENSE.md) |
37
- | pango | LGPLv3 |
38
- | pixman | MIT Licence |
39
- | proxy-libintl | LGPLv3 |
40
- | zlib-ng | [zlib Licence](https://github.com/zlib-ng/zlib-ng/blob/develop/LICENSE.md) |
41
-
42
- Use of libraries under the terms of the LGPLv3 is via the
43
- "any later version" clause of the LGPLv2 or LGPLv2.1.
44
-
45
- Please report any errors or omissions via
46
- https://github.com/lovell/sharp-libvips/issues/new